function sb_slideshow_effect(id, time) 
{
    this.interval  = null;
    this.id = id;
    this.time = time;
    this.count = 0;
    this.position = 0;
    this.effect = false;
    this.images = new Array();
    this.loadedImages = 0;
    this.imageObjects = new Array();
    this.ids = new Array();
    this.titles = new Array();
    this.texts  = new Array();
    this.urls    = new Array();
    this.targets = new Array();
    this.rss_feed = null; //'http://api.flickr.com/services/feeds/photos_public.gne?id=51035630381@N01&lang=en-us&format=rss_200';
    this.absolute = '';
    this.frames = 10;
    this.speed  = 30;
    this.maxWidth = null;
    this.loaded = false;
    this.transition = null;
    this.tallestImage = 0;
    this.forceHeight = true;

    this.load = function(play) 
    {
        if (this.loaded == true) {
            return;
        }
        this.loaded = true;
        
        var image1 = document.getElementById(this.id+'_image1');
        if (this.maxWidth) {
            image1.style.maxWidth = this.maxWidth + 'px';
        }

        if (this.rss_feed) {
            this.get_feed();
        }

        var div1 = document.getElementById(this.id+'_div1');
        div1.style.opacity = 1;
        
        if (typeof(div1.style.webkitTransition) == 'string') {
            this.transition = 'webkitTransition';
        }

        for (var i = 0; i < this.images.length; i++) {
            this.loadImage(i);
        }

        for (var p = div1; p.nodeType == 1; p = p.parentNode) {
            if (p.className.match(/^sb_window( |$)/)) {
                this.absolute = p;
                window[this.absolute.id].ss = this;
                break;
            }
        }

        if (play) {
            this.resume();
        }
    }

    this.loadImage = function(i) 
    {
        if (this.images[i] && !this.imageObjects[i]) {

            var img = new Image();
            var obj = this;
            var div1 = document.getElementById(obj.id+'_div1');
            var text1 = document.getElementById(this.id+'_text1');
            var title1 = document.getElementById(this.id+'_title1');

            img.onload = function() 
            {
                obj.loadedImages ++;
                var width = img.naturalWidth ? img.naturalWidth : img.width;
                var height = img.naturalHeight ? img.naturalHeight : img.height;
                img.maxWidth = (obj.maxWidth && width > obj.maxWidth) ? obj.maxWidth : width;
                var ratio = img.maxWidth / width;
                img.maxHeight = Math.round(height * ratio);

                if (obj.tallestImage < img.maxHeight) {
                    obj.tallestImage = img.maxHeight;
                }

                if (
                    obj.images.length == obj.loadedImages 
                    && !obj.transition
                    && !obj.absolute
                    && this.forceHeight == true
                ) {
                    div1.style.height = obj.tallestImage + 'px';
                }

                if (i == 0 && obj.transition) {
                    div1.style.width = img.maxWidth + 'px';
                    div1.style.height = img.maxHeight + 'px';
                    div1.addEventListener('webkitTransitionEnd', function(evt){obj.cssSwap(obj, evt)});
                }

            }
            img.src = this.images[i];
            this.imageObjects[i] = img;
        }
        return this.imageObjects[i];
    }

    this.enableTransition = function() 
    {
        if (!this.transition) {
            return;
        }
        var div1 = document.getElementById(this.id+'_div1');
        var text1 = document.getElementById(this.id+'_text1');
        var title1 = document.getElementById(this.id+'_title1');

        div1.style[this.transition] = 'all .6s 0s linear';

        if (this.absolute) {
            this.absolute.style[this.transition] = 'all .6s linear';
        }

        if (title1) {
            title1.style.opacity = 1;
            title1.style[this.transition] = 'all .6s linear';
        }
        if (text1) {
            text1.style.opacity = 1;
            text1.style[this.transition] = 'all .6s linear';
        }

    }

    this.disableTransition = function() 
    {
        if (!this.transition) {
            return;
        }
        var div1 = document.getElementById(this.id+'_div1');
        var text1 = document.getElementById(this.id+'_text1');
        var title1 = document.getElementById(this.id+'_title1');

        div1.style[this.transition] = '';

        if (this.absolute) {
            this.absolute.style[this.transition] = '';
        }

        if (title1) {
            title1.style.opacity = 1;
            title1.style[this.transition] = '';
        }
        if (text1) {
            text1.style.opacity = 1;
            text1.style[this.transition] = '';
        }

    }

    this.centerWindow = function() {
        var div1 = document.getElementById(this.id+'_div1');
        var image1 = document.getElementById(this.id+'_image1');
        var img = this.loadImage(this.position);

        if (this.absolute) {
            var width  = this.absolute.offsetWidth - image1.offsetWidth + img.maxWidth;
            var height = this.absolute.offsetHeight - image1.offsetHeight + img.maxHeight;
            sbCenter(this.absolute, width, height);
        }

        div1.style.width  = img.maxWidth + 'px';
        div1.style.height = img.maxHeight + 'px';
    
    }

    this.cssEffect = function() 
    {
        var image1 = document.getElementById(this.id+'_image1');
        var div1 = document.getElementById(this.id+'_div1');
        var text1 = document.getElementById(this.id+'_text1');
        var title1 = document.getElementById(this.id+'_title1');

        /* Step 1: Initiate fade 
        */
        if (div1.style.opacity == 1) {
            this.enableTransition();
           

            div1.style.opacity = 0;
            if (title1) {
                title1.style.opacity = 0;
            }
            if (text1) {
                text1.style.opacity = 0;
            }
        }
    }

    this.cssSwap = function(obj, evt) 
    {
        var image1 = document.getElementById(obj.id+'_image1');
        var div1 = evt.target;
        var text1 = document.getElementById(this.id+'_text1');
        var title1 = document.getElementById(this.id+'_title1');
        var img = obj.loadImage(obj.position);

        /* Step 2: fade out complete
        */
        if (evt.propertyName == 'opacity' && div1.style.opacity == 0) {
            /* Step 3: Initiate change of dimension
            */
            if (parseInt(div1.style.width) != img.maxWidth || parseInt(div1.style.height) != img.maxHeight) { 
                obj.centerWindow();
            } else {
                this.changeContent();
                div1.style.opacity = 1;
                if (title1) {
                    title1.style.opacity = 1;
                }
                if (text1) {
                    text1.style.opacity = 1;
                }
            }
        /* Step 4: Initiate fade in
        */
        } else if (image1.src != img.src && (evt.propertyName == 'width' || evt.propertyName == 'height')) {
            this.changeContent();
            if (this.absolute && this.effect && this.transition) {
                this.absolute.style[this.transition] = '';
            } 
            div1.style.opacity = 1;
            if (title1) {
                title1.style.opacity = 1;
            }
            if (text1) {
                text1.style.opacity = 1;
            }
        } else if (evt.propertyName == 'opacity' && div1.style.opacity == 1 && this.interval) {
            this.disableTransition();
            this.resume();
        }
    }

    this.sizeContainer = function()
    {
        var diffX, diffY;
        this.count ++;
        var image1 = document.getElementById(this.id+'_image1');
        var div1 = document.getElementById(this.id+'_div1');

        var img = this.loadImage(this.position);

        var same = (image1.offsetWidth == img.maxWidth && image1.offsetHeight == img.maxHeight);

        if (!same && this.absolute) {
            var win = this.absolute;

            diffX = img.maxWidth - image1.offsetWidth;
            diffY = img.maxHeight - image1.offsetHeight;


            if (diffX) {
            //    image1.style.marginLeft = (diffX * this.count * (1 / this.frames)) + 'px';
                div1.style.width = image1.offsetWidth + (diffX * this.count * (1 / this.frames)) + 'px';
             //   win.style.left = ((document.body.offsetWidth - win.offsetWidth) / 2) + 'px'
            }
            if (diffY) {
            //    image1.style.marginTop = (diffY * this.count * (1 / this.frames)) + 'px';
                div1.style.height = image1.offsetHeight + (diffY * this.count * (1 / this.frames)) + 'px';
                var scrollY = window.scrollY ? window.scrollY : document.body.parentNode.scrollTop;
            //    var top = (scrollY + (document.body.offsetHeight - win.offsetHeight) / 2)
            //    win.style.top = (top > scrollY ? top : scrollY) + 'px'; 
            }
            
            if (diffX || diffY) {
                sbCenter(win);
            }
        }

        if (same || !this.absolute || this.count >= this.frames) {
            //  image1.style.marginLeft = image1.style.marginTop = '';
            this.count = 0;
            this.fade();
        } else {
            var obj = this;
            setTimeout(function() {obj.sizeContainer()}, this.speed);
        }
    }

    this.startFade = function()
    {
        var opacity = 0;
        this.count++;
        var div1 = document.getElementById(this.id+'_div1');
        var title1 = document.getElementById(this.id+'_title1');

        if (typeof(div1.style.opacity) == "string") {
            opacity = 1 - (this.count * (1 / this.frames));
            div1.style.opacity = opacity;
            if (title1) {
                title1.style.opacity = opacity;
            }
        } else if (typeof(div1.style.filter) == "string") {
            opacity = 100 - (this.count * (100 / this.frames));
            div1.style.filter = 'alpha(opacity='+ opacity +')';
            if (title1) {
                title1.style.filter = 'alpha(opacity='+ opacity +')';
            }
        }

        if (this.count >= this.frames) {
            this.count = 0;
            if (this.absolute) {
                this.sizeContainer();
            } else {
                this.fade();
            }
        } else {
            var obj = this;
            setTimeout(function() {obj.startFade()}, this.speed);
        } 
    }


    this.changeContent = function() 
    {
        var image1 = document.getElementById(this.id+'_image1');
        var title1 = document.getElementById(this.id+'_title1');
        var text1 = document.getElementById(this.id+'_text1');

        image1.src = this.images[this.position];
        this.imageLink(image1);

        if (text1) {
            text1.innerHTML = this.texts[this.position] ? this.texts[this.position] : '';
        }
        if (title1) {
            title1.innerHTML = this.titles[this.position] ? this.titles[this.position] : '';
            this.attachLink(title1);
        }
    }

    this.fade = function()
    {
        var opacity = 0;
        this.count++;
        var div1 = document.getElementById(this.id+'_div1');
        var title1 = document.getElementById(this.id+'_title1');
        var text1 = document.getElementById(this.id+'_text1');

        if (this.count == 1) {
            this.changeContent();
        }

        if (typeof(div1.style.opacity) == "string") {
            opacity = this.count * (1 / this.frames);
            div1.style.opacity = opacity;
            if (title1) {
                title1.style.opacity = opacity;
            }
        } else if (typeof(div1.style.filter) == "string") {
            opacity = this.count * (100 / this.frames);
            div1.style.filter = 'alpha(opacity='+ opacity +')';
            if (title1) {
                title1.style.filter = 'alpha(opacity='+ opacity +')';
            }
        }

        if (this.count >= this.frames) {
            this.count = 0;
            if (this.interval) {
                this.resume();
            }
        } else {
            var obj = this;
            setTimeout(function() {obj.fade()}, this.speed);
        } 
    }

    this.attachLink = function(node)
    {
        var a = null;
        var parent = node.parentNode;

        if (this.urls[this.position]) {
            var a = node;
            if (node.nodeName == 'DIV') {
                a = document.createElement('a');
                a.innerHTML = node.innerHTML;
                a.className = node.className;
                a.id = node.id;
                parent.replaceChild(a, node);
            }
            a.href = this.urls[this.position];
            a.target = this.targets[this.position];
        } else if (node.nodeName == 'A') {
            var div = document.createElement('div');
            div.innerHTML = node.innerHTML;
            div.className = node.className;
            div.id = node.id;
            parent.replaceChild(div, node);
        }
    }

    this.imageLink = function(node)
    { 
        var a = null;
        var parent = node.parentNode;
        var url = this.urls[this.position];
        var target = this.targets[this.position];

        if (parent.nodeName == 'A') {
            a = parent;    
            parent = a.parentNode;
        }

        if (!url) {
            if (a) {
                parent.appendChild(a.firstChild);
                parent.removeChild(a);
            }
            return;
        }

        if (!a) {
            a = document.createElement('a');
            a.appendChild(node);
            parent.appendChild(a);
        }

        a.setAttribute('href', url);
        a.setAttribute('target', target || '');
    }

    this.swap = function(position)
    {
        var image1 = document.getElementById(this.id+'_image1');
        var div1 = document.getElementById(this.id+'_div1');
        var text1 = document.getElementById(this.id+'_text1');
        var title1 = document.getElementById(this.id+'_title1');
        var thumbnails = document.getElementById(this.id+'_thumbnails');

        if (this.count) {
            return;
        }

        if (this.effect && this.transition && getStyle(div1, 'opacity') != 1) {
            return;
        }

        if (position < 0) {
            this.position = this.images.length - 1;
        } else if (position >= this.images.length) {
            this.position = 0;
        } else {
            this.position = position;
        }

        if (thumbnails) {
            for (var i = 0; i < thumbnails.childNodes.length; i++) {
                var li = thumbnails.childNodes[i];
                li.className = this.position == i ? 'on' : '';
            }
        }

        if (image1.src == this.images[this.position]) {
            if (this.interval) {
                this.resume();
            }
            return;
        }

        if (div1.offsetHeight == 0) {
            this.changeContent();
            if (this.interval) {
                this.resume();
            }
            return;
        }
    
        if (this.effect) {
            if (this.transition) {
                this.cssEffect();
            } else {
                this.startFade();
            }
        } else {
            this.changeContent();
            if (this.interval) {
                this.resume();
            }
        }
    }

    this.previous = function(pause)
    {
        if (this.count > 0) {
            return;
        }
        if (pause) {
            this.pause();
        }
        this.swap(this.position - 1);
    }

    this.next = function(pause)
    {
        if (this.count > 0) {
            return;
        }
        if (pause) {
            this.pause();
        }
        this.swap(this.position + 1);
    }

    this.set_by_id = function(id)
    {
        if (typeof(this.ids[id]) == 'undefined') {
            return false;
        }
        this.set(this.ids[id]);
    }

    this.set = function(position)
    {
        position = parseInt(position);

        this.pause();
        
        /* Fixes webkit issue where sb_window is closed during transition
        */
        var div1 = document.getElementById(this.id+'_div1');
        if (this.transition && getStyle(div1, 'opacity') == 0) {
            div1.style.opacity = 1;
            this.disableTransition();
        }
        
        this.swap(position);
    }

    this.play = function(next) {
        var play  = document.getElementById(this.id+'_play');
        var pause = document.getElementById(this.id+'_pause');
        if (play && pause) {
            play.style.display = 'none';
            pause.style.display = '';
        }

        if (next) {
            this.next();
        }

        this.resume();
    }

    this.resume = function()
    {
        if (this.interval) {
            clearTimeout(this.interval);
        }

        var obj = this;
        this.interval = setTimeout(function() {obj.next();}, this.time);  
    }

    this.pause = function() 
    {
        var play  = document.getElementById(this.id+'_play');
        var pause = document.getElementById(this.id+'_pause');
        if (play && pause) {
            pause.style.display = 'none';
            play.style.display = '';
        }

        if (this.interval) {
            clearTimeout(this.interval);
            this.interval = null;
        }
    }

    this.buttonOver = function(node, name)
    {
        var button = document.getElementById(this.id+'_'+name);
        node.style.cursor = 'pointer';
        if (button) {
            button.style.display = 'block';
        }
    }

    this.buttonOut = function(node, name)
    {
        var button = document.getElementById(this.id+'_'+name);
        node.style.cursor = 'auto';
        if (button) {
            button.style.display = 'none';
        }
    }


    this.get_feed = function()
    {
        this.rss_feed = "http://www.smallboxsoftware.net/"+SB_FILES+"/enews.php";
        this.images = this.titles = this.urls = this.texts = new Array();
        var xml = sb_get_xml(SB_FILES+'/rss.php');

        var items = xml.getElementsByTagName('item');

        var item = items.item(0);
        for (var i = 0; i < items.length; i++) {
            var item = items.item(i);
            var content = item.getElementsByTagName('media:content');
            if (content.length) {
                var media = content.item(0);
                this.images[this.images.length] = media.attributes[0].value.replace(/_m\./, ".");
            }
        }
    }
}

var ssPreviewImg;
function ss_preview(node, src, width, height)
{
    if (ssPreviewImg) {
        document.body.removeChild(ssPreviewImg);
        ssPreviewImg = null;
    }

    var pos = getPos(node);
    var img = document.createElement('img');
    ssPreviewImg = img;
    img.classname = 'slideshow_preview';
    img.style.position = 'absolute';
    img.width = width;
    img.height = height;
    img.src = src;
    img.style.top = pos.top - height - 10 + 'px';
    img.style.left = pos.left + (node.offsetWidth / 2) - (width / 2) + 'px';
    document.body.appendChild(img); 

}



