
		 
// -----------------------------------------------------------------------
// eros@recoding.it
// gallery 1.0
//
// 27/07/2009 - Added asynchronous loading of images
// 26/06/2009 - some new implementations
// 19/06/2009 - standardization
// 08/06/2009 - Initial sketch
//
// requires jQuery 1.3.x
//------------------------------------------------------------------------
(function($) {
var debug=function(obj,l){l=(l!=undefined)?l:1;var str=""; if(typeof(obj)=="string")return obj; for(var i in obj) {str+="\t"+i+": "+((l>1)?debug(obj[i],l-1):obj[i])+",\n ";};return "{\n\t"+str+"\n}";}

    $.fn.gallery = function (options) {
		var defaults = {
			images: [],
			currentImage: 0,
			width: "",
			height: "",
			animation: {
				auto: false,
				 stopOnHover: true,
				 interval: 4000,
				 speed: 500,
				 easefunction: "swing",
				 type: "horizontal-slider"
			 },
			border: "solid 0px #dedede",
			navigator: {
				itemsSel: "",
				css: {
					 border: "none",
					 padding: "0px"
				},
				item: {
					cssClass: null,
					 selectedCssClass: null,
					 borderRounded: true,
					 selectedBGColor: "#ffffff",
					 css : {
						 color: "#000000",
						 textDecoration: "none",
						 width: "12px",
						 height: "12px",
						 lineHeight: "12px",
						 verticalAlign: "middle",
						 backgroundColor: "#cdcdcd",
						 padding: "3px",
						 margin: "0px 3px 0px 0px",
						 border: "solid 1px #acacac"
					 }
				}
			},

			popup : {
				width: 450,
				height: 350,
				css : {
					"background-color" : "#ffffff",
					border: "3px solid black"
				}
			}
		};
		
        var $container = this;

        // Retrieve options
        var opt = $.extend(true, defaults, options);
		
        $container.css({position: "relative", overflow: "hidden",  border: opt.border, padding:0, margin: 0,width: opt.width, height: opt.height})

        if (options && options.animation) {  
            if (!/horizontal-slider|vertical-slider|fade/.test(opt.animation.type)) {
                opt.animation.type = "horizontal-slider";
            }
        }
		
        
		if (opt.navigator.itemsSel != "")
		{
			$(opt.navigator.itemsSel).each(function()
			{
				var $elem = $(this)
				if(this.tagName=="A" && $elem.attr("original") != undefined)
				{
					var i = opt.images.push({
						href:  $elem.attr("href"),
						original: $elem.attr("original")
					});

					$elem.removeAttr("original")
					$elem.attr("href", "javascript:void(0);");

					$elem.bind("click",function(){
						$.fn.gallery.showImage(i-1, $container, opt)
						return false;
					})

				}
			})
		}		

		
        if (opt.images.length != 0)
		{
            for (var i in opt.images)
			{
                var img = new Image();
                img.src = opt.images[i].href;
                img.alt = opt.images[i].alt || "";
                var $link = $("<a />").attr({"href": opt.images[i].original || "#", "target": "_blank"});
                $link.append(img);

				if(opt.popup!==false)
				{
					$link.bind("click",function(){
						$.fn.gallery.popup(i-1, $container, opt)
						return false;
					})
				}
				else
				{
					  $container.find("a").css({cursor:"default"})
				}

                $container.append($link);
            }
        }
		

//         Check loading state of #1 image
        if ($container.find("img:first").complete) {
            $.fn.gallery.start($container, opt);
        }
        else {
            $container.find("img:first").load( function() {
					$.fn.gallery.start($container, opt);
            });
        }
    }
    
    $.fn.gallery.start = function($container, opt) {
        // Define local vars
        var index = 0;                             
        var nImages = $container.find("img").length;
        var $fi = $container.find("img:first");
        var imagesize = { width: $fi.removeAttr("width").width(), height: $fi.removeAttr("height").height() };

        $container
			.find("a").css({position: "absolute", top: "0", left: "0", width: "100%", height:"100%","text-align":"center", "vertical-align":"middle" })
			.find("img").css({border: "0px"});
    
        var $slider = $("<div id='slider' />").css({ position:"absolute", display: "block", padding:0, margin: 0, left: 0, top: 0, width: opt.width, height: opt.height});
                
        $container.find("a").wrapAll($slider).each( function(i) {
            switch (opt.animation.type)
            { 
                case "horizontal-slider":
                    $(this).css("left", i*imagesize.width);
                    break;
                case "vertical-slider":
                    $(this).css("top", i*imagesize.height);
                    break;
                case "fade":
                    $(this).css({"z-index": nImages-i});
                    break;
            }                        
        });
                        
        if (opt.animation.auto) {
            setInterval( function() { 
                if (!$container.data("isMouseHover") || !opt.animation.stopOnHover) 
                    $.fn.gallery.showImage(++index % nImages, $container, opt);
            }, opt.animation.interval);
        }
    }
    
    $.fn.gallery.showImage = function(i, $container, opt) {
        var $a = $container.find("a");
        switch (opt.animation.type)
        { 
            case "horizontal-slider": $container.find("#slider").animate({ left: - (i*imagesize.width) }, opt.animation.speed, opt.animation.easefunction);
                break;
            case "vertical-slider": $container.find("#slider").animate({ top: - (i*imagesize.height) }, opt.animation.speed, opt.animation.easefunction);
                break;
            case "fade":
				$a.each(function(){$(this).fadeOut(opt.animation.speed, opt.animation.easefunction)});
				$a.eq(i).fadeIn(opt.animation.speed, opt.animation.easefunction);
				break;
        }		
	};

	$.fn.gallery.popup = function(i, $container, opt){
		var dims = ___getPageSize()
		var scrolls = ___getPageScroll()
		var $popup = $("<div id='popup' />").css({
			position:"absolute",
			display: "block",
			margin: 0,
			top: Math.round((dims[3]-opt.popup.height)/2) + scrolls[1] + "px",
			left: Math.round((dims[2]-opt.popup.width)/2) + scrolls[0] + "px",
			width: opt.popup.width,
			height: opt.popup.height,
			"z-index": 1000,
			padding: "5px"
		})
		$popup.css(opt.popup.css)

		//thumbs
		$thumbs = $('<div class="gallery-popup-thumbs">thumbs</div>')
		$large = $('<div class="gallery-popup-image">large</div>')

		$popup.append($thumbs, $large)
		$(".gallery-popup-thumbs", $popup).css({border: "1px solid red", height: "60px", width: "100%", "overflow-y":"hidden", "overflow-x":"auto"})
		$(".gallery-popup-image", $popup).css({border: "1px solid green"})


		$("body").append($popup)

		
		$popup.draggable();

		
	}

	/**
	 / THIRD FUNCTION
	 * getPageSize() by quirksmode.com
	 *
	 * @return Array Return an array with page width, height and window width, height
	 */
	function ___getPageSize() {
		var xScroll, yScroll;
		if (window.innerHeight && window.scrollMaxY) {
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		var windowWidth, windowHeight;
		if (self.innerHeight) {	// all except Explorer
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth;
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else {
			pageHeight = yScroll;
		}
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){
			pageWidth = xScroll;
		} else {
			pageWidth = windowWidth;
		}
		arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
		return arrayPageSize;
	};
	/**
	 / THIRD FUNCTION
	 * getPageScroll() by quirksmode.com
	 *
	 * @return Array Return an array with x,y page scroll values.
	 */
	function ___getPageScroll() {
		var xScroll, yScroll;
		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {// all other Explorers
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
		}
		arrayPageScroll = new Array(xScroll,yScroll);
		return arrayPageScroll;
	};
})(jQuery);
