(function($){
var dataArray = new Array();
var sourceArray = new Array();

$.resourceLoadDelay = 500;
$.resourceLoadFailure = 3;

$.fn.cacheResource = function(source) {
var arrayIndex = -1;
var sourceString = source.toLowerCase();
var callbackEventName = (arguments.length > 1 ? arguments[1] : null);

if((arrayIndex = jQuery.inArray(sourceString, sourceArray)) == -1 || !dataArray[arrayIndex].loaded) {
if(arrayIndex == -1) {
arrayIndex = sourceArray.length;
dataArray[arrayIndex] = new Object();
dataArray[arrayIndex].loaded = false;
dataArray[arrayIndex].element = null;
dataArray[arrayIndex].loadTime = 0;
dataArray[arrayIndex].loadFailure = 0;
sourceArray[arrayIndex] = sourceString;
}

if(dataArray[arrayIndex].loadFailure < $.resourceLoadFailure) {
if((new Date().getTime()) - dataArray[arrayIndex].loadTime > $.resourceLoadDelay) {
var image = jQuery("<img />");

$(image).one("load", {index: arrayIndex, callbackEvent: callbackEventName}, function(e) {
if(this.naturalWidth === 0)
$(this).trigger("error");
else {
$(this).unbind("error");
dataArray[e.data.index].loaded = true;
dataArray[e.data.index].element = $(this);
if(e.data.callbackEvent)
$(document).trigger(e.data.callbackEvent);
}
});

$(image).one("error", {index: arrayIndex}, function(e) {
dataArray[arrayIndex].loadTime = 0;
dataArray[arrayIndex].loadFailure++;
});

$(image).attr("src", source + "?param=" + Math.floor(Math.random() * 0xffffff));
dataArray[arrayIndex].loadTime = (new Date().getTime());
}
}
} else {
if(callbackEventName)
$(document).trigger(callbackEventName);
}
};

$.fn.getCachedResource = function(source) {
var arrayIndex = -1;

if((arrayIndex = jQuery.inArray(source.toLowerCase(), sourceArray)) != -1 && dataArray[arrayIndex].loaded)
return dataArray[arrayIndex].element;

setTimeout(function(){ jQuery.fn.cacheResource(source); }, 0);
return null;
};
})(jQuery);


function simpleGallery(settingarg) {
	var slideshow = this;
	var setting = slideshow.setting = settingarg;
	setting.fadeduration = parseInt(setting.fadeduration);
	setting.curimage = setting.slideindex || 0;
	setting.ispaused = !setting.autoplay[0];
	setting.currentstep = 0;
	setting.totalsteps = setting.imagearray.length * setting.autoplay[2];
	setting.fglayer = 0, setting.bglayer = 1;
	setting.oninit = setting.oninit || function(){}
	setting.onslide = setting.onslide || function(){}
	setting.pageready = false;
	setting.imageloaded = false;
	setting.slideshowstarted = false;
	setting.initEvent = "IG" + Math.floor(Math.random() * 0xffffff);
	setting.currwidth = 0;
	setting.currheight = 0;
	setting.isFlashEnable = false;
	
	flashverreqArr = setting.flashverreq.split(",");
	setting.isFlashEnable = DetectFlashVer(flashverreqArr[0],flashverreqArr[1],flashverreqArr[2]);
	
	$(document).bind(setting.initEvent, function(e) {
	    $(document).unbind(setting.initEvent);
        setting.imageloaded = true;
        startSlideShow();
    });
    
    jQuery.each (setting.imagearray, function (e) {
    	jQuery.fn.cacheResource(setting.imagearray[e][0], setting.initEvent);
    });
    
	$(document).ready(function() {
	    setting.currwidth = setting.dimensions[0];
	    setting.currheight = setting.dimensions[1];
		setting.$wrapperdiv = $('#' + setting.wrapperid).css({position:'relative', visibility:'visible', background:'white', overflow:'hidden', width:setting.currwidth, height:setting.currheight}).empty();
		if (setting.$wrapperdiv.length == 0) {
		    alert("Error: DIV with ID \"" + setting.wrapperid + "\" not found");
		    return;
		}
		
		setting.$gallerylayers = $('<div class="gallerylayer"></div><div class="gallerylayer"></div>').css({position:'absolute', left:0, top:0}).appendTo(setting.$wrapperdiv);
	    setting.gallerylayers = setting.$gallerylayers.get();
	    setting.pageready = true;
	    startSlideShow();
	});
	
	function startSlideShow() {
	    if(!setting.slideshowstarted && setting.pageready && setting.imageloaded) {
	        setting.slideshowstarted = true;
            slideshow.showslide(setting.curimage);
            
            try {
                setting.oninit.call(slideshow);
            } catch(e) {
                alert("Error in \"oninit\" event. " + e)
            }
	    }
	}
}

simpleGallery.prototype={
	getHTMLContent:function(imgindex){
		var slideshow = this;
		return (slideshow.setting.imagearray[imgindex][1]).replace(/&amp;/ig,"&").replace(/&lt;/ig,"<").replace(/&gt;/ig,">").replace(/&quot;/ig,"\"");
	},
	
	navigate:function(keyword){
	    var slideshow = this;
	    var setting = slideshow.setting;
	    
	    clearTimeout(setting.timerID);
	    
	    if (!isNaN(parseInt(keyword)))
			slideshow.showslide(parseInt(keyword))
		else if (/(prev)|(next)/i.test(keyword))
			slideshow.showslide(keyword.toLowerCase())
		else if (/(pause)/i.test(keyword))
            setting.ispaused = true;
	},

	showslide:function(keyword) {
	    var slideshow = this;
	    var setting = slideshow.setting;
	    
		var totalimages = setting.imagearray.length;
		var imgindex = (keyword == "next") ? (setting.curimage < totalimages - 1 ? setting.curimage + 1 : 0) 
		             : (keyword == "prev") ? (setting.curimage > 0 ? setting.curimage - 1 : totalimages - 1)
		             : (keyword == "current") ? setting.curimage
		             : Math.min(keyword, totalimages - 1);
		
		var image = null;
		
		if(setting.imagearray[imgindex].length == 3 && setting.isFlashEnable)
		{
			image = setting.imagearray[imgindex][2].replace(/&amp;/ig,"&").replace(/&lt;/ig,"<").replace(/&gt;/ig,">").replace(/&quot;/ig,"\"");
		}
		else
		{
			image = jQuery.fn.getCachedResource(setting.imagearray[imgindex][0]);
		}
		
		if(image == null) {
		    setting.currentstep++;
		    setting.curimage = imgindex;
		    setting.timerID = setTimeout(function(){slideshow.showslide('next')}, 0);
		    return;
		}
		
		$(setting.gallerylayers[setting.bglayer]).empty();
		if(typeof(image) == 'object')
			jQuery(slideshow.getHTMLContent(imgindex)).append($(image).css({border:0, width:setting.currwidth, height:setting.currheight})).appendTo($(setting.gallerylayers[setting.bglayer]));
		else
			$(setting.gallerylayers[setting.bglayer]).html($(image));
		$(setting.gallerylayers[setting.bglayer]).stop().css({zIndex:1}).animate( {border:0},setting.fadeduration, function() {
		    $(setting.gallerylayers[setting.bglayer]).empty();
		    
            try {
                setting.onslide.call(slideshow, setting.gallerylayers[setting.fglayer]);
            } catch(e) {
                alert("Error in \"onslide\" event. " + e)
            }
            
		    setting.currentstep++;
			if (!setting.ispaused) {
				if (setting.currentstep < setting.totalsteps)
				    setting.timerID = setTimeout(function(){slideshow.showslide('next')}, setting.autoplay[1]);
			}
		});
		
		$(setting.gallerylayers[setting.fglayer]).css({zIndex:0});
		setting.fglayer = setting.bglayer;
		setting.bglayer = (setting.bglayer==0) ? 1 : 0;
		setting.curimage = imgindex;
	},
	
	switchtoFullScreen:function(wrapper) {
    	var slideshow = this;
	    var setting = slideshow.setting;
	    
	    var Id = $(wrapper).attr("id").replace("Panel", "");
	    var panelHeight = $(wrapper).height() - setting.$wrapperdiv.height();
	    var dummyDIV = jQuery("<div></div>").css({border:0, width:$(wrapper).width(), height:$(wrapper).height()}).insertBefore($(wrapper));

	    var fullScreenImageHeight = $(window).height() - panelHeight;
	    var fullScreenImageWidth = (setting.currwidth / setting.currheight) * fullScreenImageHeight;
	    
	    if(fullScreenImageWidth > $(window).width()) {
	        fullScreenImageWidth = $(window).width();
	        fullScreenImageHeight = (setting.currheight  / setting.currwidth) * fullScreenImageWidth;
	    }
	    
	    $(wrapper).dialog({
	        autoOpen: true,
	        modal: true,
	        resizable:false,
	        width: fullScreenImageWidth,
            open: function(event, ui) {
                $(this).siblings().eq(0).remove();
                $(this).parent().removeClass();
                $(this).removeClass();
                $(this).dialog({ height: fullScreenImageHeight + panelHeight });
                $(this).dialog("option", "position", [($(window).width() - fullScreenImageWidth)/2, ($(window).height() - fullScreenImageHeight - panelHeight)/2]);
	            setting.currwidth = fullScreenImageWidth;
	            setting.currheight = fullScreenImageHeight;
                $(this).children().eq(0).css({width:setting.currwidth, height:setting.currheight});
                $(this).children().eq(1).css({width:setting.currwidth});
                slideshow.showslide('current');
                $('#' + Id + 'NormalScreen').show();
                $('#' + Id + 'FullScreen').hide();
            },
            close: function (event, ui) {
				$(this).dialog("destroy");
				$(this).insertAfter($(dummyDIV));
				$(this).removeAttr("class");
				$(this).removeAttr("style");
				$(this).css({display:"inline"});
				$(dummyDIV).remove();
	            setting.currwidth = setting.dimensions[0];
	            setting.currheight = setting.dimensions[1];
                $(this).children().eq(0).css({width:setting.currwidth, height:setting.currheight});
                $(this).children().eq(1).css({width:setting.currwidth});
                slideshow.showslide('current');
                $('#' + Id + 'NormalScreen').hide();
                $('#' + Id + 'FullScreen').show();
			}
	    });
	}
}


var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
var reqMajorVersion = 0;
// Minor version of Flash required
var reqMinorVersion = 0;
// Revision of Flash required
var reqRevision = 0;

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}
