/**
 * jQuery jqGalScroll Plugin
 * Examples and documentation at: http://benjaminsterling.com/jquery-jqgalscroll-photo-gallery/
 *
 * @author: Benjamin Sterling
 * @version: 2.1
 * @copyright (c) 2007 Benjamin Sterling, KenzoMedia
 * @extendThanks Koesmanto Bong http://www.koesbong.com/
 *		Koes put a fire under my butt to improve this plugin
 *		and when I took too long he took what I had and added
 *		the horizontal scroll and in turn I ripped it from his
 *		hands and made it better :)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *   
 * @requires jQuery v1.2.1 or later
 * @optional jQuery Easing v1.2
 *
 * @name jqGalScroll
 * @example $('ul').jqGalScroll();
 * 
 * @Semantic requirements:
 * 				The structure fairly simple; the structure should consist
 * 				of a ul > li > img structure.
 * 
 * 	<ul>
 *		<li><img src="common/img/dsc_0003.thumbnail.JPG"/></li>
 *		<li><img src="common/img/dsc_0012.thumbnail.JPG"/></li>
 *	</ul>
 *
 * @param String ease
 *					refer to http://gsgd.co.uk/sandbox/jquery.easing.php for values
 * 
 * @example $('#gallery').jqGalScroll({speed:1000});
 
 * @param String speed
 * 					fast, slow, 1000, ext..
 * 
 * @example $('#gallery').jqGalScroll({speed:1000});
 * 
 * @param String height
 * 					the default height of your wrapper
 * 
 * @example $('#gallery').jqGalScroll({height:490});
 * 
 * @param String titleOpacity
 * 					the opacity of your title bar (if present)
 * 
 * @example $('#gallery').jqGalScroll({titleOpacity:.70});
 * 
 * @param String direction 
 *					vertical horizontal diagonal
 * 
 * @example $('#gallery').jqGalScroll({direction:'vertical'});
 * 			
 */
(function($) {
    $.fn.jqGalScroll = function(options) {
        return this.each(function(i) {
            var el = this
            el.curImage = 0;
            el.jqthis = $(this).css({ position: 'relative' });
            el.jqchildren = el.jqthis.children();
            el.opts = $.extend({}, jqGalScroll, options);
            el.index = i;
            el.totalChildren = el.jqchildren.size();
            var width, height;

            switch (el.opts.direction) {
                case 'horizontal':
                    width = el.totalChildren * el.opts.width;
                    height = el.opts.height;
                    break;
                case 'vertical':
                    width = el.opts.width;
                    height = el.totalChildren * el.opts.height;
                    break;
                default:
                    width = el.totalChildren * el.opts.width;
                    height = el.totalChildren * el.opts.height;
                    break;
            };

            el.container = $('<div id="jqGS' + i + '" class="jqGSContainer">').css({ position: 'relative' });
            el.ImgContainer = $('<div class="jqGSImgContainer" style="height:' + el.opts.height + 'px;position:relative;overflow:none">')
								.css({ height: el.opts.height, width: el.opts.width, position: 'relative', overflow: 'hidden' });
            el.jqthis.css({ height: height, width: width });

            el.jqthis.wrap(el.container);
            el.jqthis.wrap(el.ImgContainer);
            el.pagination = $('<div class="jqGSPagination">');
            el.jqthis.parent().parent().append(el.pagination);
            var jqul = $('<ul>').appendTo(el.pagination);
            var pos = { x: 0, y: 0 };

            el.jqchildren
			.each(function(j) {
			    var selected = '';
			    if (j == 0) selected = 'selected';

			    var $a = $('<a href="#' + (j) + '" class="scrollerPageItem ' + selected + '">' + (j + 1) + '</a>').click(function() {
			        var href = this.index; //href.replace(/^.*#/, '');
			        el.pagination.find('.selected').removeClass('selected');
			        $(this).addClass('selected');
			        var params = {};
			        if (el.opts.direction == 'diagonal') {
			            params = { right: (el.opts.width * href), bottom: (el.opts.height * href) }
			        }
			        else if (el.opts.direction == 'vertical') {
			            params = { bottom: (el.opts.height * href) }
			        }
			        else if (el.opts.direction == 'horizontal') {
			            params = { right: (el.opts.width * href) }
			        };

			        el.jqthis.stop().animate(params, el.opts.speed, el.opts.ease);
			        index = href;
			        return false;
			    });

			    var n = $a.get(0);

			    n.index = j;

			    $('<li>').appendTo(jqul).append($a);

			    if (el.opts.direction == 'diagonal') {
			        pos.x = j * el.opts.width;
			        pos.y = j * el.opts.height;
			    }
			    else if (el.opts.direction == 'horizontal') {
			        pos.x = j * el.opts.width;
			    }
			    else if (el.opts.direction == 'vertical') {
			        pos.y = j * el.opts.height;
			    };

			    var jqchild = $(this).css({ height: el.opts.height, width: el.opts.width, position: 'absolute', left: pos.x, top: pos.y });

			    var jqimg = jqchild.find('img').hide()

			    /*
			    // if the image has a <a> around it then this removes that link
			    if (jqimg.parent().is('a')) {
			    var p = jqimg.parent();
			    jqimg.get(0).linkHref = p.attr('href');
			    p.remove();
			    jqimg.appendTo(jqchild);
			    };

                // makes the image have a click handler to move on to the next image
			    jqimg.click(function() {
			    var next = n.index + 1;
			    if ((n.index + 1) == el.totalChildren) {
			    el.pagination.find('[href$=#0]').click();
			    el.curImage = 0;
			    }
			    else {
			    el.pagination.find('[href$=#' + next + ']').click();
			    el.curImage = next;
			    }
			    });
			    */

			    var $loader = $('<div class="jqGSLoader">').appendTo(jqchild);
			    var $titleHolder = $('<div class="jqGSTitle">').appendTo(jqchild).css({ opacity: el.opts.titleOpacity }).hide();
			    var image = new Image();
			    image.onload = function() {
			        image.onload = null;
			        $loader.fadeOut();
			        /*jqimg.css({marginLeft:-image.width*0.9,marginTop:-image.height*1,position:'absolute',left:'100%',top:'100%'}).fadeIn();*/
			        jqimg.css({ marginBottom: 0, marginLeft: 0, marginTop: 0, position: 'relative', left: '0', top: '0' }).fadeIn();
			        var alt = jqimg.attr('alt');
			        if (typeof alt != 'undefined') {
			            $titleHolder.text(alt).fadeIn();
			        }
			    };
			    image.src = jqimg.attr('src');
			});

            /* catch the click event for the pagination buttons */
            $(".scrollerPageItem").click(function() {
                var currentId = $(this).attr("href");
                currentId = currentId.slice(1);
                //use one of the following 2 lines to change behaviour of auto scroll
                //el.curImage = currentId; // This line will stop the auto scroll after a page item is clicked (because this line causes an error)
                el.curImage = parseInt(currentId); // This line makes sure the auto scroll knows if we click on a pager item
            });

            /* Set up the auto scroll */
            setInterval(function() {
                var next = el.curImage + 1;
                if ((el.curImage + 1) == el.totalChildren)
                    el.opts.speed = 1;
                else
                    el.opts.speed = 0;
                if ((el.curImage + 1) == el.totalChildren) {
                    el.pagination.find('[href$=#0]').click();

                    el.curImage = 0;
                }
                else {
                    el.pagination.find('[href$=#' + next + ']').click();
                    el.curImage = next;
                }
            }, el.opts.auto);

        }); // end : this.each(function()
    };  // end : $.fn.jqGalScroll
    jqGalScroll = {
        ease: null,
        speed: 0,
        height: 460,
        width: 482,
        titleOpacity: .60,
        direction: 'horizontal', // vertical horizontal diagonal
        auto: 4000
    };
})(jQuery);