﻿
var  slideShows=[],Dom;
Dom= YAHOO.util.Dom;
YAHOO.util.Event.onDOMReady(function(){
    var instances,i;
    instances = Dom.getElementsByClassName("slideShow","div",document.body);
    for(i=0;i<instances.length;i++){
        slideShows.push(new YAHOO.USANA.SlideShow(instances[i],{}));
    }
}
);

(function() {

    function clickSlide(ev, obj) {
        obj.clickSlide(ev,this);
        Event.preventDefault(ev);
    }
    function pauseSlide(ev, obj) {
        obj.pause(ev,this);
        Event.preventDefault(ev);
    }
    function resumeSlide(ev, obj) {
        obj.resumeAutoChange(ev,this);
        Event.preventDefault(ev);
    }
    function clickThumb(ev, obj) {
        obj.clickThumb(ev,this);
        Event.preventDefault(ev);
    }
    function getStyle(el, style, type) {
        var value;

        if (!el) {
            return 0;
        }

        function getStyleIntVal(el, style) {
            var val;

            /*
             * XXX: Safari calculates incorrect marginRight for an element
             * which has its parent element style set to overflow: hidden
             * https://bugs.webkit.org/show_bug.cgi?id=13343
             * Let us assume marginLeft == marginRight
             */
            if (style == "marginRight" && YAHOO.env.ua.webkit) {
                val = parseInt(Dom.getStyle(el, "marginLeft"), 10);
            } else {
                val = parseInt(Dom.getStyle(el, style), 10);
            }

            return JS.isNumber(val) ? val : 0;
        }

        function getStyleFloatVal(el, style) {
            var val;

            /*
             * XXX: Safari calculates incorrect marginRight for an element
             * which has its parent element style set to overflow: hidden
             * https://bugs.webkit.org/show_bug.cgi?id=13343
             * Let us assume marginLeft == marginRight
             */
            if (style == "marginRight" && YAHOO.env.ua.webkit) {
                val = parseFloat(Dom.getStyle(el, "marginLeft"));
            } else {
                val = parseFloat(Dom.getStyle(el, style));
            }

            return JS.isNumber(val) ? val : 0;
        }

        if (typeof type == "undefined") {
            type = "int";
        }

        switch (style) {
            case "height":
                value = el.offsetHeight;
                if (value > 0) {
                    value += getStyleIntVal(el, "marginTop") +
                             getStyleIntVal(el, "marginBottom");
                } else {
                    value = getStyleFloatVal(el, "height") +
                            getStyleIntVal(el, "marginTop") +
                            getStyleIntVal(el, "marginBottom") +
                            getStyleIntVal(el, "borderTopWidth") +
                            getStyleIntVal(el, "borderBottomWidth") +
                            getStyleIntVal(el, "paddingTop") +
                            getStyleIntVal(el, "paddingBottom");
                }
                break;
            case "width":
                value = el.offsetWidth;
                if (value > 0) {
                    value += getStyleIntVal(el, "marginLeft") +
                             getStyleIntVal(el, "marginRight");
                } else {
                    value = getStyleFloatVal(el, "width") +
                            getStyleIntVal(el, "marginLeft") +
                            getStyleIntVal(el, "marginRight") +
                            getStyleIntVal(el, "borderLeftWidth") +
                            getStyleIntVal(el, "borderRightWidth") +
                            getStyleIntVal(el, "paddingLeft") +
                            getStyleIntVal(el, "paddingRight");
                }
                break;
            default:
                if (type == "int") {
                    value = getStyleIntVal(el, style);
                } else if (type == "float") {
                    value = getStyleFloatVal(el, style);
                } else {
                    value = Dom.getStyle(el, style);
                }
                break;
        }

        return value;
    }


    YAHOO.namespace('USANA.SlideShow');
    YAHOO.USANA.SlideShow = function(el, userConfig) {
        /*YAHOO.log("in constructor", "info", WidgetName);*/
        YAHOO.USANA.SlideShow.superclass.constructor.call(this, el, userConfig);
    };

    var SlideShow = YAHOO.USANA.SlideShow,
            Dom = YAHOO.util.Dom,
            Event = YAHOO.util.Event,
            JS = YAHOO.lang;
            /*,
            WidgetName = "SlideShow";*/
    YAHOO.extend(SlideShow, YAHOO.util.Element, {
        _object:null,
        _itemsTable:null,
        _currentIndex:0,
        _waitSwitch:false,
        _longWaitInterval:60000,
        _waitInterval:5000,
        _timeout:null,
        addSlide: function (slide, index) {
            var slideShow = this,
                    className,
                    content,
                    elId;

            if (!slide) {
                return false;
            }

            if (JS.isString(slide) || slide.nodeName) {
                content = slide.nodeName ? slide.innerHTML : slide;
            } else if (JS.isObject(item)) {
                content = slide.content;
            } else {
               /* YAHOO.log("Invalid argument to addItem", "error", WidgetName);*/
                return false;
            }

            className = slide.className || "";
            elId = slide.id ? slide.id : Dom.generateId();

            if (!JS.isUndefined(index)) {
                Event.on(slide, "mouseover", pauseSlide, slideShow);
                Event.on(slide, "mouseout", resumeSlide, slideShow);
                slideShow._itemsTable.items.push({
                    item      : {'slide':slide, 'thumb':null},
                    className : className,
                    id        : elId
                });
            }
            slideShow._itemsTable.numItems++;


            return true;
        },
        addThumb: function (item, index) {
            var slideShow = this;

            if (!item) {
                return false;
            }

            Event.on(item, "click", clickThumb, slideShow);
            if (!JS.isUndefined(index)) {
                slideShow._itemsTable.items[index].item.thumb = item;
            }

            return true;
        },
        autoChangeSlide:function(){
            var slideShow=this, waitSwitch,curIdx,numSlides,index;
            waitSwitch=slideShow._waitSwitch;
            /*YAHOO.log("wasclicked="+wasclicked,"info",WidgetName);*/
            if(! waitSwitch){
                curIdx = slideShow._currentIndex;
                numSlides = slideShow._itemsTable.items.length;
                index = (curIdx+1 >= numSlides)? 0 :curIdx+1;
                /*YAHOO.log("In else switch slide\n"+
                        "CurrentIndex:"+curIdx+
                        "\nindex:"+index+
                        "\nnumslides:"+numSlides,"info",WidgetName);*/

                slideShow.showSlide(index);
                slideShow._currentIndex = index;
            }
            slideShow._timeout = setTimeout(function(){slideShow.autoChangeSlide()},slideShow._waitInterval);
        },
        startAutoPlay:function (){
            var slideShow=this;
            slideShow._timeout = setTimeout(function(){slideShow.autoChangeSlide()},slideShow._waitInterval);

        },
        resumeAutoChange:function(){
            var slideShow=this;
            slideShow._waitSwitch=false;
        },
        init:function (el, attrs) {
            var slideShow = this;

            slideShow._itemsTable = { loading: {}, numItems: 0,
                items: [], size: 0 };
            if (JS.isString(el)) {
                el = Dom.get(el);
            } else if (!el.nodeName) {
                /*YAHOO.log(el + " is neither an HTML element, nor a string",
                        "error", WidgetName);*/
                return;
            }
            
            SlideShow.superclass.init.call(slideShow, el, attrs);


            if (el) {
                if (!el.id) {   // in case the HTML element is passed
                    el.setAttribute("id", Dom.generateId());
                }
                parse = slideShow._parseSlideShow(el);
            }
            slideShow.startAutoPlay();

        },
        clickThumb: function (ev, element){
            var slideShow = this,
                slide,items,i,resume;
            items= slideShow._itemsTable.items;
            for(i=0;i<items.length;i++){
                slide = items[i].item.slide;
                if(element.id == items[i].item.thumb.id){
                    slideShow.showSlide(i);
                    slideShow._waitSwitch=true;
                    /*YAHOO.log("thumb clicked","info",WidgetName);*/
                    break;
                }
            }
            resume = setTimeout(function(){slideShow.resumeAutoChange()},slideShow._longWaitInterval);

        },
        clickSlide: function (ev, element){
            var slideShow = this;
            slideShow.pause(ev,element);
        },
        pause: function (ev, element){
            var slideShow = this;
            slideShow._waitSwitch=true;
        },
        showSlide: function (index){
            var slideShow = this,
                slide,items,thumb,i;
            items= slideShow._itemsTable.items;
            for(i=0;i<items.length;i++){
                slide = items[i].item.slide;
                thumb = items[i].item.thumb;
                if(index == i){
                    Dom.addClass(slide, "slideshow-selected");
                    Dom.addClass(thumb, "slideshow-selected");
                    slideShow._currentIndex = index;
                }else{
                    Dom.removeClass(slide, "slideshow-selected");
                    Dom.removeClass(thumb, "slideshow-selected");
                }
            }

        },
        stopAutoPlay:function(){
            var slideShow = this;
            clearTimeout(slideShow._timeout);
            delete slideShow._timeout;
        },
        _parseSlideShow: function (parent) {
            var slideShow = this;
            slideShow._parseSlides(parent);
            slideShow._parseThumbs(parent);
        },
        _parseSlides: function (parent) {
            var slideShow = this,
                    child,
                    itemClass,
                    elId,
                    node, slides,domItemEl,index;
            itemClass = "slideshow-slide";
            domItemEl = "LI";
            slides = Dom.getElementsByClassName(itemClass, "*", parent)[0];
             index = 0;
            for (child = slides.firstChild; child; child = child.nextSibling) {
                if (child.nodeType == 1) {
                    node = child.nodeName;
                    if (node.toUpperCase() == domItemEl) {
                        if (child.id) {
                            elId = child.id;
                        } else {
                            elId = Dom.generateId();
                            child.setAttribute("id", elId);
                        }
                      //carousel.addItem(child);
                        slideShow.addSlide(child, index);
                        index ++;
                    }
                }
            }
        },
        _parseThumbs: function (parent) {
            var slideShow = this,
                    child,
                    itemClass,
                    elId,
                    node, domItemEl,containerWidth,browser,thumbs,parentDiv,bigwidth,smallwidth,finalwidth,index;
            browser = YAHOO.env.ua;
            itemClass = "slideshow-thumbs";
            domItemEl = "LI";
            thumbs = Dom.getElementsByClassName(itemClass, "*", parent)[0];
            parentDiv = thumbs.parentNode;
            index = 0;
            containerWidth = 0;
            for (child = thumbs.firstChild; child; child = child.nextSibling) {
                if (child.nodeType == 1) {
                    node = child.nodeName;
                    if (node.toUpperCase() == domItemEl) {
                        if (child.id) {
                            elId = child.id;
                        } else {
                            elId = Dom.generateId();
                            child.setAttribute("id", elId);
                        }
                      //carousel.addItem(child);
                        slideShow.addThumb(child, index);
                        containerWidth += getStyle(child,"width");
                        index ++;
                    }
                }
            }
            if(index >= 2){
                Dom.addClass(parentDiv,"show-thumbs")
            }
            bigwidth = getStyle(parentDiv,"width");
//            containerWidth = (browser.ie)? (containerWidth ) : (containerWidth );
            smallwidth = containerWidth;
            if(browser.ie){
                finalwidth= (bigwidth-smallwidth);
                finalwidth = (finalwidth/2);
                Dom.setStyle(thumbs, 'margin-left', ( finalwidth)+'px');
            }
            /*YAHOO.log("the thumbs width is:"+containerWidth,"info",WidgetName);*/
            Dom.setStyle(thumbs, 'width', (containerWidth+1) + "px");

        }
    });

})();
YAHOO.register("SlideShow", YAHOO.USANA.SlideShow, {version: "2.7.0", build: "1"});