/**
 * jQuery.ScrollShow - Scrolling Slideshow.
 * Copyright (c) 2007 Ariel Flesler - aflesler(at)gmail(dot)com
 * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
 * Date: 10/30/2007
 * @author Ariel Flesler
 * @version 0.7
 *
 * @id jQuery.fn.scrollShow
 * @param {Object} settings Hash of settings (detailed below).
 * @return {jQuery} Returns the same jQuery object, for chaining.
 **/
(function($) {

    var defaults = {
        elements: 'img', //elements selector (relative to view)
        itemSize: {
            height: 104,
            width: 104
        },
        view: null, //container of the elements, the one to fix the width.
        navigators: null, //selector to the elements to navigate the slideshow.
        navigationMode: 's', //sequential, random, localscroll
        speed: 600, //speed of transition, 1 for no-animation
        wrappers: 'simple', //simple,resize,crop,link
        circular: false, //should the slideshow rewind/advance on the extremes ?.
        easing: 'linear', //easing equation
        axis: 'x', //axis to displace the slideshow
        margin: true, //take margin in account?
        start: null, //force the scroll to start at some position element.
        setWidth: false, //whether to calculate and set, the overall width of the slideshow.
        setPageLimit: 1, //–戈﹚掸计
        getPagePanel: null, //だ戈癟
        getNumPagerPanel: null, //だ计秙
        showNumPagerPanel: true, //陪ボ计秙
        setNumPagerLemit: 6 //计秙计秖
    };

    function wrap($els, type, size) {//wrap the photos with several different wrappers.
        switch (type) {
            case 'crop': $els = $els.wrap('<div class="jq-ss-crop">').parent().css('overflow', 'hidden');
            case 'resize': return $els.css(size);
            case 'simple': return $els.wrap('<div class="jq-ss-simple">').parent();
            case 'link':
                if ($els.is('img'))
                    return $els.wrap('<a target="_blank" class="jq-ss-link">').parent().each(function() {
                        this.href = this.firstChild.src;
                    });
            default: return $els;
        }
    };

    $.fn.scrollShow = function(settings) {
        settings = $.extend({}, defaults, settings);

        return this.each(function() {
            var 
				widget = this,
				$view = settings.view ? $(settings.view, this) : this,
				$elements = $(settings.elements, $view),
				limit = $elements.length-1,
				active = 0;
            $.each(settings.wrappers.split(/\s*,\s*/), function(i, wrapper) {
                $elements = wrap($elements, wrapper, settings.itemSize);
            });
            $elements.css(settings.itemSize); //ensure the outer elements have fixed size.

            if (!settings.navigators) {//this shouldn't get to happen
                settings.navigators = '';
                settings.navigationMode = 'r';
            }

            if (settings.navigators.constructor != Array)
                settings.navigators = [settings.navigators];

            $.each(settings.navigationMode.split(''), function(i, type) {
                switch (type.charAt(0)) {
                    case 's': //sequential navigation
                       
                        $(settings.navigators[i], widget)
                            .eq(0).bind('click', { dir: 0 }, sequential2).end()
							.eq(1).bind('click', { dir: -settings.setPageLimit }, sequential).end()
							.eq(2).bind('click', { dir: +settings.setPageLimit }, sequential).end()
                        	.eq(3).bind('click', { dir: limit }, sequential2).end();
                        break;
                    case 'r': //random navigation
                        var $nav = $(settings.navigators[i] || $elements, widget),
							ratio = $elements.length / $nav.length;

                        if (ratio === Infinity) return; //no navigator found
                        $nav.each(function(pos) {
                            $(this).bind('click', { pos: Math.floor(ratio * pos) }, random);
                        });
                        break;
                }
            });

            (function($e, w) {
                var imgw = ($e.width() + attrs('margin') + attrs('padding') + attr('border'));

                do w -= imgw;
                while (w > 0 && limit--); //find the last element we can scroll To.

                if (!settings.setWidth) return;

                do {
                    $e = $e.parent();
                    if ($e[0] == $view[0])
                        return;
                } while ($e.length > 1);
                $e.width(imgw * $elements.length); //if there's a container for the elements, calculate it's width.

            })($elements, $view.width());

            if (settings.start != null)
                random(settings.start);

            function attrs(name) {
                return attr(name + 'Left') + attr(name + 'Right');
            };
            function attr(name) {
                return parseInt($elements.css(name)) || 0;
            };

            function sequential(event) {
                event.data.pos = active + event.data.dir;
                return random(event);
            };

            function sequential2(event) {
                event.data.pos = event.data.dir;
                return random(event);
            };
            function sequential3(n) {
                alert(n);
                event.data.pos = n;
                return random(n);
            }
            function random(event) {
                var pos = typeof event == 'number' ? event : event.data.pos;
                if (pos < 0)
                    pos = active == 0 && settings.circular ? limit : 0;
                else if (pos > limit)
                    pos = active == limit && settings.circular ? 0 : limit;
                /*********************絏*************************/
                var xpos = pos > 0 ? Math.ceil(pos / settings.setPageLimit) : 0;
                var currentPage = Math.ceil(((xpos + 1) * settings.setPageLimit) / settings.setPageLimit); //ヘ玡计
                var totalImg = limit + 1; //羆掸计
                var totalPage = Math.ceil(parseInt(totalImg) / settings.setPageLimit); //羆计;
                /*玻ネ计秙*/
                var divControl = "";
                //var pMove = ((xpos * settings.setNumPagerLemit) / settings.setNumPagerLemit) / settings.setNumPagerLemit;
                //alert(Math.ceil(pMove));
                //alert(Math.ceil(totalImg / settings.setNumPagerLemit));

                for (var p = currentPage; p <= (settings.setNumPagerLemit * currentPage); p++) {
                    if (p <= totalPage) {
                        var myID = "NumBtn" + p;
                        divControl += "<div id='" + myID + "'>" + p + "</div>";
                    }
                }
                if (settings.showNumPagerPanel)
                    settings.getNumPagerPanel.innerHTML = divControl;
                /*结ぉ秙よ猭*/
                for (var p = currentPage; p <= (settings.setNumPagerLemit * currentPage); p++) {
                    if (p <= totalPage) {

                        $("#NumBtn" + p).bind('click', { dir: ((p * settings.setPageLimit) - settings.setPageLimit) }, sequential2);
                        $("#NumBtn" + p).hover(function() {
                            //$(this).addClass("hilite");
                            $(this).css("background-color", "#ccc");
                        }, function() {
                            //$(this).removeClass("hilite");
                            $(this).css("background-color", "");
                        });
                    }
                }
                /*计戈癟*/
                settings.getPagePanel.innerHTML = currentPage + "/" + totalPage;
                /*************************************************/
                $view.stop().scrollTo($elements[pos], settings);
                active = pos;
                return false;
            };

        });
    };

})(jQuery);