/**
 * Coin Slider - Unique jQuery Image Slider
 * @version: 1.0 - (2010/04/04)
 * @requires jQuery v1.2.2 or later 
 * @author Ivan Lazarevic
 * Examples and documentation at: http://workshop.rs/projects/coin-slider/
 
 * Licensed under MIT licence:
 *   http://www.opensource.org/licenses/mit-license.php
**/

(function ($) {

    //required defaults
    var ss_timing;
    var ss_animtime;
    var ss_imageFolder;
    var ss_imageColumn;
    var ss_textColumn;
    var ss_data;
    var ss_dataType;
    var ss_cssPrefix;
    var ss_navigation;
    var ss_boxes;
    var ss_stopOnHover
    var ss_node;
    var ss_redirectUrl = "";

    //other variables used in processing required throughout the plugin
    var ss_pageId;
    var ss_currentIndex = 0;
    var ss_maxIndex = 0;
    var ss_currentImage = "";
    var ss_newImage = "";
    var ss_loadIndex = 0;
    var ss_showOn = true;
    var ss_timeoutID;
    var ss_height;
    var ss_width;
    var ss_showOnPageId = 'show-imgHolder';
    var ss_boxOnPageId = 'show-linkBoxes';
    var ss_ControlIndex;
    var ss_btnBarOnPageId = 'show-btnBar';
    var ss_btnNextOnPageId = 'show-btnNext';
    var ss_btnPrevOnPageId = 'show-btnPrev';
    var ss_loaderOnPageId = 'show-loader';

    var settings = {
        timing: 6000,
        animTime: 500 * 3,
        navigation: true,
        boxes: true,
        stopOnHover: true,
        imageFolder: 'Images/',
        imageColumn: 'image',
        textColumn: 'text',
        xmlNode: 'image',
        data: [],
        dataType: 'json',
        cssPrefix: 'show',
        RedirectAfterFinish: ""
    };

    $.fn.boxslideshow = $.fn.boxSlideShow = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.BoxSlideShow');
        }

    };

    var methods = {
        init: function (options) {
            return this.each(function () {
                ss_pageId = $(this).attr('id');
                ss_ControlIndex = $(this).index();
                ss_showOnPageId += "_" + ss_ControlIndex.toString();
                ss_boxOnPageId += "_" + ss_ControlIndex.toString();
                ss_btnBarOnPageId += "_" + ss_ControlIndex.toString();
                ss_btnNextOnPageId += "_" + ss_ControlIndex.toString();
                ss_btnPrevOnPageId += "_" + ss_ControlIndex.toString();
                ss_loaderOnPageId += "_" + ss_ControlIndex.toString();

                // If options exist, lets merge them with our default settings
                if (options) {
                    $.extend(settings, options);
                }

                setVars();

                setupHtml();

                switch (ss_dataType) {
                    case 'json':
                        jsonParser(ss_data);
                        break;
                    case 'xml':
                        xmlParser(ss_data);
                        break;

                }

                setupEvents();

            });
        },
        reset: function (options) {
            return this.each(function () {
                if (options) {
                    $.extend(settings, options);
                }

                setVars();

                setupHtml();

                switch (ss_dataType) {
                    case 'json':
                        jsonParser(ss_data);
                        break;
                    case 'xml':
                        xmlParser(ss_data);
                        break;
                }

                setupEvents();
            });
        }
    };

    var setVars = function () {
        ss_timing = settings.timing;
        ss_animtime = settings.animTime;
        ss_imageFolder = settings.imageFolder;
        ss_imageColumn = settings.imageColumn;
        ss_textColumn = settings.textColumn;
        ss_data = settings.data;
        ss_dataType = settings.dataType;
        ss_cssPrefix = settings.cssPrefix;
        ss_navigation = settings.navigation;
        ss_node = settings.xmlNode;
        ss_boxes = settings.boxes;
        ss_stopOnHover = settings.stopOnHover;
        ss_redirectUrl = settings.RedirectAfterFinish;
    };

    var setupHtml = function () {
        // imgOnPageId will have to be compiled
        // boxes on page id will have to be compiled with index
        //these will have to be saved for use later for slideshow.
        strHtml = ' <div id="' + ss_showOnPageId + '" +  class="' + ss_cssPrefix + '-container">';
        strHtml += '</div>';
        strHtml += '<div id="' + ss_boxOnPageId + '" class="' + ss_cssPrefix + '-boxes">';
        strHtml += '</div>';
        strHtml += '<div id="' + ss_loaderOnPageId + '" class="' + ss_cssPrefix + '-loader">&nbsp;</div>';
        strHtml += '<div id="' + ss_btnBarOnPageId + '" class="' + ss_cssPrefix + '-btns">';
        strHtml += '<div id="' + ss_btnPrevOnPageId + '" class="' + ss_cssPrefix + '-btn-prev displaynone">Back</div>';
        strHtml += '<div id="' + ss_btnNextOnPageId + '" class="' + ss_cssPrefix + '-btn-next displaynone">Next</div>';
        strHtml += '</div>';

        $('#' + ss_pageId).addClass(ss_cssPrefix + '-main');
        $('#' + ss_pageId).html(strHtml);
    };

    var setupEvents = function () {

        if (ss_boxes) {
            $('#' + ss_boxOnPageId + ' a').live("click", function () {
                if (!$(this).hasClass('.' + ss_cssPrefix + '-boxes-active')) {
                    ss_currentIndex = $(this).index();
                    loadItem();
                }
            });
        } else {
            $('#' + ss_boxOnPageId).hide();
        }

        if (ss_stopOnHover) {
            $('.' + ss_cssPrefix + '-main').hover(
                function () {
                    stopShow();
                    if (ss_navigation)
                        displayBtns(true);
                },
                function () {
                    startShow();
                    if (ss_navigation)
                        displayBtns(false);
                }
            );
        }

        if (ss_navigation) {
            $('#' + ss_btnNextOnPageId).click(function () {
                if (ss_currentIndex > 0)
                    ss_currentIndex--;
                else
                    ss_currentIndex = ss_maxIndex - 1;

                loadItem();

            });

            $('#' + ss_btnNextOnPageId).click(function () {
                if (ss_currentIndex < (ss_maxIndex - 1))
                    ss_currentIndex++;
                else
                    ss_currentIndex = 0;

                loadItem();
            });
        }


    };

    var displayBtns = function (state) {
        switch (state) {
            case true:
                $('.show-btn-next').fadeIn('fast');
                $('.show-btn-prev').fadeIn('fast');
                break;
            case false:
                $('.show-btn-next').fadeOut('fast');
                $('.show-btn-prev').fadeOut('fast');
                break;
        }
    };

    var jsonParser = function () {

        $('#' + ss_boxOnPageId).html('');
        ss_currentImage = '';
        ss_currentIndex = 0;
        ss_maxIndex = ss_data.length;
        $(ss_data).each(function () {
            strA = '<a href="#"/>';
            $('#' + ss_boxOnPageId).append(strA);
        });

        loadItem();
    };

    var xmlParser = function () {

        $('#' + ss_boxOnPageId).html('');
        ss_currentImage = '';
        ss_currentIndex = 0;
        ss_maxIndex = $(ss_data).find(ss_node).length;
        $(ss_data).find(ss_node).each(function () {
            strA = '<a href="#"/>';
            $('#' + ss_boxOnPageId).append(strA);
        });

        loadItem();
    };

    var loadItem = function () {
        ss_index = ss_currentIndex
        t_newImage = "image_" + ss_currentIndex;

        if ($('#' + t_newImage).length > 0) {
            ss_newImage = t_newImage;
            showNewImage();
        } else {
            var folder = ss_imageFolder;
            var img = '';
            var txt = ''
            ss_newImage = t_newImage;

            switch (ss_dataType) {
                case 'json':
                    img = folder + ss_data[ss_index][ss_imageColumn];
                    txt = ss_data[ss_index][ss_textColumn];
                    break;
                case 'xml':
                    img = folder + $(ss_data).find(ss_node).eq(ss_index).attr(ss_imageColumn);
                    if ($.trim(ss_textColumn).length > 0)
                        txt = $(ss_data).find(ss_node).eq(ss_index).attr(ss_textColumn);

                    break;
            }

            ss_loadIndex++;
            strImg = '<div class="' + ss_cssPrefix + '-image-frame" id="div_' + ss_newImage + '" style="display:none" ><img src="' + img + '" id="' + ss_newImage + '" alt = "' + txt + '" /></div>';
            $('#' + ss_showOnPageId).append(strImg);
            $('#' + ss_newImage).bind('load', showNewImage);
        }
    };

    var setHighLight = function () {

        $('#' + ss_boxOnPageId + ' a').removeClass(ss_cssPrefix + '-boxes-active');
        $('#' + ss_boxOnPageId + ' a').eq(ss_currentIndex).addClass(ss_cssPrefix + '-boxes-active');
    };

    var showNewImage = function () {

        setHighLight();
        //checkButtons();
        getCenter(ss_newImage);
        if (ss_currentImage != "") {
            $('#div_' + ss_currentImage).fadeOut(ss_animtime);
            $('#div_' + ss_newImage).fadeIn(ss_animtime, function () {
                ss_currentImage = ss_newImage;
            });
        } else {
            $('#div_' + ss_newImage).fadeIn(ss_animtime, function () {
                $('#' + ss_loaderOnPageId).fadeOut('fast');
                ss_currentImage = ss_newImage;
            });
        }

        if (ss_showOn)
            ss_timeoutID = window.setTimeout(nextImage, ss_timing);
    };

    var getCenter = function (id) {
        /*var img = new Image();
        img.src = $('#' + id).attr('src');
        mysize = img.width;
        offset = baseLeft + ((maxsize - mysize) / 2);*/
        $('#div_' + id).attr('style', 'display:none; z-index:' + ss_loadIndex + '; left:0px;');
    };


    var nextImage = function () {

        window.clearTimeout(ss_timeoutID);
        if (ss_currentIndex < (ss_maxIndex - 1)) {
            ss_currentIndex++;
        } else {
            if ($.trim(ss_redirectUrl).length > 0) {
                stopShow();
                window.location = ss_redirectUrl;
            } else {
                ss_currentIndex = 0;
            }
        }
        loadItem();
    };

    var stopShow = function () {
        window.clearTimeout(ss_timeoutID);
        ss_showOn = false;
    };

    var startShow = function () {

        ss_showOn = true;
        nextImage();
    };

    var startSlideShow = function () {

        loadItem();
    };

})(jQuery);
	
