var Gallery = function(){
	var imgsLength = arguments.length -1;
	var refName = arguments[0];
	var myObj = this;
	this.ref = refName 
	var imgsLength = arguments.length -1;
	this.imgs = new Array(imgsLength)
	//this.onInitImgs = function(){return;}
	for(var i=0;i<imgsLength;i++){
		this.imgs[i] = new Image();
		this.imgs[i].src = arguments[i + 1];
		this.imgs[i].label = this.imgs[i].src.substring(this.imgs[i].src.lastIndexOf("/")+1,this.imgs[i].src.lastIndexOf("."));		
		this.imgs[i].indexNum = i;
		//this.onInitImgs(i);
	}
	this.imgEnd = this.imgs.length - 1;
	this.imgStart = 0;
	this.imgIndex = this.imgStart;
	this.imgWinRef = null;
	this.imgPop = false;
	this.onImgPrev = function(){return;}
	this.onImgNext = function(){return;}
	this.onMakeGallery = function(){return;}
	this.onMakePrevious = function(){return;}
	this.onMakeNext = function(){return;}
	this.onMakeImgFrame = function(){return;}
	this.onLaunchWin = function(){return;}
	
	this.refImgByFile = function(strRef){
		var i, imgIndex;
		var strFound = false
		for(var i=0;i<myObj.imgs.length;i++){
			if(myObj.imgs[i].src == strRef || myObj.imgs[i].label == strRef){return myObj.imgs[i]; break;}
		}
	}
	this.addImgs = function(){
		var newImgsMax = myObj.imgs.length + arguments.length;
		var j; //to loop through arguments
		for(var i=myObj.imgs.length,j=0;i<newImgsMax;i++,j++){
			myObj.imgs[i] = new Image();
			myObj.imgs[i].src = arguments[j];
			myObj.imgs[i].label = myObj.imgs[i].src.substring(myObj.imgs[i].src.lastIndexOf("/")+1,myObj.imgs[i].src.indexOf("."));
			myObj.imgs[i].indexNum = i;
		}
		myObj.imgEnd = myObj.imgs.length - 1;
	}
	this.imgPrev = function(){
		myObj.imgIndex = (myObj.imgIndex <= myObj.imgStart) ? myObj.imgEnd : myObj.imgIndex - 1;
		document.images['g'+this.ref].src = myObj.imgs[myObj.imgIndex].src;
		this.onImgPrev();
	}
	this.imgNext = function(){
		myObj.imgIndex = (myObj.imgIndex >= myObj.imgEnd) ? myObj.imgStart : myObj.imgIndex + 1;
		document.images['g'+this.ref].src = myObj.imgs[myObj.imgIndex].src;
		this.onImgNext();
	}
	
	//obj.makeGallery([popup],[p text],[p image],[p class],[p id],[n text],[n image],[n class],[n id],[write str])
	this.makeGallery = function(){
		var param = arguments;
		var lStart = param.length;
		var lEnd = 9 - lStart;
		var j; //to loop through param
		for(var i = lStart,j=0;j< lEnd ;i++,j++){
			param[i] = "";
			//alert(param[i] +" count:"+ j+" index:" + i);
		}
		strGallery = myObj.makeImgFrame(param[0],false);
		strGallery += "<br>"
		strGallery += myObj.makePrevious(param[1],param[2],param[3],param[4],false);
		strGallery += " &nbsp;"
		strGallery += myObj.makeNext(param[5],param[6],param[7],param[8],false);
		if(param.length >=  10 && param[9] == false){this.onMakeGallery(); return strGallery;}else{document.write(strGallery); this.onMakeGallery();}		
	}
	
	this.makePrevious = function (){ //obj.makePrevious([text],[image],[class],[id],[write tag]) ****note all parameters are optional*****
		var blur = (document.layers) ? "" : "this.blur()\;"
		if(arguments.length > 0 && arguments[0] != ""){myObj.prevTxt = arguments[0];}else{myObj.prevTxt = "Previous";}
		if(arguments.length>=2 && arguments[1]!= ""){
		var prevImage = new Image(); prevImage.src = arguments[1];	//PreLoad Image
		myObj.prevImg = "<img src=\""+prevImage.src+"\" alt=\""+myObj.prevTxt+"\" border=\"0\" >"
		}else{myObj.prevImg = ""};
		if(arguments.length > 2 && arguments[2] != ""){myObj.prevClass = "class=\""+arguments[2]+"\"";}else{myObj.prevClass = "";}
		if(arguments.length > 3 && arguments[3] != ""){myObj.prevId = "id=\""+arguments[3]+"\"";}else{myObj.prevId="";}
		if(myObj.prevImg != ""){var imgContent = myObj.prevImg}else{var imgContent = myObj.prevTxt};
		var strPrev="<a href=\"back\" "+myObj.prevClass+" "+myObj.prevId+" onClick=\""+myObj.ref+".imgPrev()\; "+blur+" return false\;\">"+imgContent+"</a>"
		if(arguments.length >=5 && arguments[4] == false){return strPrev}else{document.write(strPrev)};
		this.onMakePrevious();
	}

	this.makeNext = function (){ //obj.makeNext([text],[image],[class],[id],[write tag]) ****note all parameters are optional*****
		var blur = (document.layers) ? "" : "this.blur()\;"
		if(arguments.length>=1 && arguments[0] != ""){myObj.nextTxt = arguments[0]}else{myObj.nextTxt="Next";};
		if(arguments.length>=2 && arguments[1]!= ""){
		var nextImage = new Image(); nextImage.src = arguments[1];	//PreLoad Image
		myObj.nextImg = "<img src=\""+nextImage.src+"\" alt=\""+myObj.nextTxt+"\" border=\"0\" >"
		}else{myObj.nextImg = ""};
		if(arguments.length>=3 && arguments[2]!= ""){myObj.nextClass = "class=\""+arguments[2]+"\""}else{myObj.nextClass=""};
		if(arguments.length>=4 && arguments[3]!= ""){myObj.nextId = "id=\""+arguments[3]+"\""}else{myObj.nextId=""};
		if(myObj.nextImg != ""){var imgContent = myObj.nextImg}else{var imgContent = myObj.nextTxt};
		var strNext="<a href=\"back\" "+myObj.nextClass+" "+myObj.nextId+" onClick=\""+myObj.ref+".imgNext()\; "+blur+" return false\;\">"+imgContent+"</a>"
		if(arguments.length >=5 && arguments[4] == false){return strNext}else{document.write(strNext)};
		this.onMakeNext();
	}

	this.makeImgFrame = function (){ //obj.makeImgFrame([popup],[write tag]) ****note all parameters are optional*****
		var blur = (document.layers) ? "" : "this.blur()\;"
		var strImgFrame ="<img src=\""+myObj.imgs[myObj.imgIndex].src+"\" name=\"g"+myObj.ref+"\" border=\"0\" \/>"
		if(arguments[0] == true){
			strImgFrame = "<a href=\"javascript:"+myObj.ref+".launchWin()\;\" onClick=\""+blur+"\">"+strImgFrame+"</a>"
		}
		myObj.imgFrame = strImgFrame;
		if(arguments.length >= 2 && arguments[1] == false){return strImgFrame}else{document.write(strImgFrame)};
		this.onMakeImgFrame();
	}

	this.launchWin = function(){
		myObj.imgWinRef = window.open("",myObj.ref+myObj.imgIndex,"width="+(myObj.imgs[myObj.imgIndex].width+50)+",height="+(myObj.imgs[myObj.imgIndex].height+50));
		var strCode = "<html><head><title></title></head><body><table align=\"center\" border=\"0\"><tr><td align=\"center\">";
		strCode += "<img src=\""+myObj.imgs[myObj.imgIndex].src+"\" border=\"\" \/>";
		strCode += "</td></tr><tr><td align=\"center\"><a href=\"javascript:this.close();\">close</a></td></tr><table></body></html>";
		myObj.imgWinRef.document.write(strCode);
		myObj.imgWinRef.focus();
		this.onLaunchWin();
	}
	if(Gallery.prototype.onConstruct){
		this.onConstruct();
	}
}

/******************************************************************************************************************/
/****************** PLUGINS *********************/
/***********************************************/


Gallery.prototype.labelId = "";
Gallery.prototype.labelTxt = "";
Gallery.prototype.captionId = "";
Gallery.prototype.captionTxt = "";

//Gallery.prototype.addLabel = function(){}


/******* Label Methods ***********************************************************************/
Gallery.prototype.addLabel = function(refStr, strCaption){
	var imgIndex = this.getIndex(refStr)
	this.imgs[imgIndex].label = strCaption
}

Gallery.prototype.makeLabel = function(){
	var strWrite = "<div id=\""+this.labelId+"\"></div>"
	if(arguments.length >= 1 && arguments[0] == false){return strWrite;}else{document.write(strWrite); this.updateTxt();}
	
}

Gallery.prototype.writeText = function(){
if(document.getElementById){
	if(document.getElementById(this.labelId)){document.getElementById(this.labelId).innerHTML = this.labelTxt;}
}
}

Gallery.prototype.updateTxt = function(){
	this.labelTxt = this.imgs[this.imgIndex].label;
	this.writeText();
}

/******** Captions Methods ***************************************************************/
Gallery.prototype.addImgCaption = function (refStr, strCaption){
	var imgIndex = this.getIndex(refStr)
	this.imgs[imgIndex].caption = strCaption
}


Gallery.prototype.makeImgCaption = function(){
	var strWrite = "<div id=\""+this.captionId+"\"></div>"
	if(arguments.length >= 1 && arguments[0] == false){return strWrite;}else{document.write(strWrite); this.updateCaption();}
}

Gallery.prototype.writeCaption = function(){
if(document.getElementById){
	if(document.getElementById(this.captionId)){document.getElementById(this.captionId).innerHTML = this.captionTxt;}
}
}

Gallery.prototype.updateCaption = function(){
	this.captionTxt = this.imgs[this.imgIndex].caption;
	this.writeCaption();
}

/******* onConstruct Event Function **** on new Gallery construction *************************/
Gallery.prototype.onConstruct = function(){
	if(!document.layers){
		//this.onImgPrev = this.updateTxt;
		//this.onImgNext = this.updateTxt;
		this.onImgPrev = this.updateInfo;
		this.onImgNext = this.updateInfo;
		this.onMakeGallery = function(){
			this.writeLabel();
			this.updateTxt();
			this.updateCaption();
		}
		this.labelId = this.ref + "lb";
		this.captionId = this.ref + "cap";
		for(var i=0;i<this.imgs.length;i++){
			this.imgs[i].caption = "";
		}
		this.imgLinkId = this.ref + "imgLink";
	}
	this.popSkin = "";
	this.launchWin = linkAction;
}

Gallery.prototype.updateInfo = function(){this.updateTxt(); this.updateCaption(); this.imgLinkVisibility();}


/******* Pop Win Functions ***************************************************************/
Gallery.prototype.getIndex = function(refStr){
	var imgIndex = this.refImgByFile(refStr).indexNum;
	return imgIndex;
}

Gallery.prototype.linkImg = function(){ 
	if(!Gallery.prototype.linkedImgs){
		Gallery.prototype.linkedImgs = true;
		this.addLinkProperties();
	}
	var imgIndex = this.getIndex(arguments[0])
	this.imgs[imgIndex].linkTo = arguments[1];
	this.imgs[imgIndex].isLinked = true;
	if(arguments.length >= 4){
		this.imgs[imgIndex].isImage = true;
		this.imgs[imgIndex].imgLargeWidth = arguments[2];
		this.imgs[imgIndex].imgLargeHeight = arguments[3];
	}
}

Gallery.prototype.addLinkProperties = function(){
	var imgsSize = this.imgs.length
	for(var i=0;i<imgsSize;i++){
		this.imgs[i].linkTo = "";
		this.isLinked = false;
		this.imgs[i].isImage = false;
	}
}


var linkAction = function (){
	var linked = this.imgs[this.imgIndex].isLinked
	var linkIs;
	if(linked){
		this.actionPopUp(this.imgs[this.imgIndex].linkTo);
	}
	else{
		//void(0);
	}
}


Gallery.prototype.actionPopUp = function(myImg){
	var strDim = "", strImgDim = "";
	var posSlash = myImg.lastIndexOf("/")
	var pageTitle = myImg.substring(posSlash+1, myImg.length)
	if(this.imgs[this.imgIndex].isImage){
		strDim = ",width="+(eval(this.imgs[this.imgIndex].imgLargeWidth) + 50)
		strDim += ",height="+(eval(this.imgs[this.imgIndex].imgLargeHeight) + 100)
		strImgDim = "width=\""+this.imgs[this.imgIndex].imgLargeWidth+"\" height=\""+this.imgs[this.imgIndex].imgLargeHeight+"\"";
	}
	var popProps = new Array(pageTitle,myImg,this.imgs[this.imgIndex].caption,this.imgs[this.imgIndex].imgLargeWidth,this.imgs[this.imgIndex].imgLargeHeight)
	this.imgWinRef = window.open("",this.ref+this.imgIndex,"toolbar=no,scrollbars=yes,resizable=yes"+strDim)
	//var strCode = "<html>\n<head><title>"+pageTitle+"</title></head>\n"
	//strCode += "<body>\n<table align=\"center\">\n<tr><td align=\"center\">"
	//strCode += "<img src=\""+myImg+"\" "+strImgDim+">";
	//strCode += "</td></tr>\n<tr><td align=\"left\">"+this.imgs[this.imgIndex].caption+"</td></tr>"
	//strCode += "\n<tr><td align=\"center\"><a href=\"javascript:this.close();\">close</a></td></tr>\n<table>\n</body>\n</html>";
	var strCode = (this.popSkin == "")?PopUp_skin(popProps):PopUp_skin(popProps,this.popSkin);
	this.imgWinRef.document.open();
	this.imgWinRef.document.write(strCode);
	this.imgWinRef.document.close();
	this.imgWinRef.focus();
	this.onLaunchWin();
}

Gallery.prototype.makeImgLink = function(){//makeImgLink([STRING text],[STRING style id],[BOOL writeTag])
	if(arguments.length > 0 && arguments[0]!=""){var imgLinkText = arguments[0];}else{imgLinkText = "view link";} 
	if(arguments.length > 1 && arguments[1]!=""){this.imgLinkId = arguments[1];}
	var strImgLink = "<a href=\"javascript:"+this.ref+".launchWin()\;\" id=\""+this.imgLinkId+"\">"+imgLinkText+"</a>"
	if(document.getElementById){
	if(arguments.length > 2 && arguments[2] == false){return strImgLink;}else{document.write(strImgLink); this.imgLinkVisibility();}	
	}else{return ""}
}

Gallery.prototype.imgLinkVisibility = function(){
	if(this.imgs[this.imgIndex].isLinked){
		if(document.getElementById(this.imgLinkId)){document.getElementById(this.imgLinkId).style.visibility = "visible";}
	}
	else{
		if(document.getElementById(this.imgLinkId)){document.getElementById(this.imgLinkId).style.visibility = "hidden";}
	}	
}


Gallery.prototype.imgLinkId = "";

/************************ INTERFACE FOR SKINS ************************************/
function titleProp(tiImg,tiText,tiFont,tiSize,tiColor,tiStyleClass,tiStyleId){
	
	/* Title Properties */
	tiText = (!tiText)?'':tiText;
	tiImg = (!tiImg||tiImg=='')?'':'<img src="'+tiImg+'" alt="'+tiText+'">';
	tiCont = (!tiImg||tiImg=='')?tiText:tiImg;
	tiFont = (!tiFont||tiFont=='')?'':'font-family:'+tiFont+';';
	tiSize = (!tiSize||tiSize=='')?'':'font-size:'+tiSize+';';
	tiColor = (!tiColor||tiColor=='')?'':'color:'+tiColor+';';
	tiStyleClass = (!tiStyleClass||tiStyleClass=='')?'':'class="'+tiStyleClass+'"';
	tiStyleId = (!tiStyleId||tiStyleId=='')?'':'id="'+tiStyleId+'"';
	tiProperties = (tiCont == tiImg)?tiCont:'<span style="'+tiFont+tiSize+tiColor+'"'+tiStyleClass+' '+tiStyleId+'>'+tiCont+'</span>'; 
	return tiProperties;
}

function defineProp(obj,prvImg,prvStyleClass,prvStyleId,prvText,nxtImg,nxtStyleClass,nxtStyleId,nxtText,lnkText,lnkStyleId,capStyleId,labStyleId,linkOnImg,tiStr){
	var props = new Array();

	/* Previous Control Properties */
	prvImg = (!prvImg||prvImg=='')?'':prvImg;
	prvStyleClass = (!prvStyleClass||prvStyleClass=='')?'':prvStyleClass;
	prvStyleId = (!prvStyleId||prvStyleId=='')?'':prvStyleId;
	prvText = (!prvText||prvText=='')?'':prvText;
	var prvStr = obj.makePrevious(prvText,prvImg,prvStyleClass,prvStyleId,false);
	props[0] = prvStr;

	/* Next Control Properties */
	nxtImg = (!nxtImg||nxtImg=='')?'':nxtImg;
	nxtStyleClass = (!nxtStyleClass||nxtStyleClass=='')?'':nxtStyleClass;
	nxtStyleId = (!nxtStyleId||nxtStyleId=='')?'':nxtStyleId;
	nxtText = (!nxtText||nxtText=='')?'':nxtText;
	var nxtStr = obj.makeNext(nxtText,nxtImg,nxtStyleClass,nxtStyleId,false); 	
	props[1] = nxtStr;

	/* Image Link Properties */
	lnkStyleId = (!lnkStyleId||lnkStyleId=='')?'':lnkStyleId;
	lnkText = (!lnkText||lnkText=='')?'':lnkText;
	var lnkStr = obj.makeImgLink(lnkText,lnkStyleId,false);
	props[2] = lnkStr;

	/* Caption Properties */
	obj.captionId = (!capStyleId||capStyleId=='')?obj.captionId:capStyleId;
	var capStr = obj.makeImgCaption(false);
	props[3] = capStr;

	/* Label Properties */
	obj.labelId = (!labStyleId||labStyleId=='')?obj.labelId:labStyleId;
	var labStr = obj.makeLabel(false);
	props[4] = labStr;

	/* Image Frame Properties */
	linkOnImg = (linkOnImg == true || linkOnImg == 'true')? true :false;
	var imgFrameStr = obj.makeImgFrame(linkOnImg,false);
	props[5] = imgFrameStr;
	
	/* Title Properties */
	props[6] = tiStr;
	
	return props;
}

function createGallery(obj,skin,props){
	var reSearch = new Array();
	reSearch[0] = /\*\*makePrevious\*\*/g;
	reSearch[1] = /\*\*makeNext\*\*/g;
	reSearch[2] = /\*\*makeImgLink\*\*/g;
	reSearch[3] = /\*\*makeCaption\*\*/g;
	reSearch[4] = /\*\*makeLabel\*\*/g;
	reSearch[5] = /\*\*makeImgFrame\*\*/g;
	reSearch[6] = /\*\*makeTitle\*\*/g;		
		
	for(var i=0;i<props.length;i++){
		skin = searchReplace(skin,reSearch[i],props[i]);
	}
	document.write(skin);
	//alert(skin)
	obj.updateCaption();
	obj.updateTxt();
}

function searchReplace(strValue,reSearch,strReplace){
	if(reSearch.test(strValue)){strValue = strValue.replace(reSearch,strReplace);}
	return strValue;
}

/******************************************************************************/
function PopUp_skin(props,skin){
var formatSkin = ""
var popup_skinDefault = ''+
'<html>\n'+
'<head>\n'+
'<title>**Title**</title>\n'+
'</head>\n'+
'<body>\n'+
'<table align="center">\n'+
'<tr><td align="center"><img src="**ImageSource**" width="**ImageWidth**" height="**ImageHeight**"></td>\n'+
'</tr>\n'+
'<tr>\n'+
'<td align="left">**Caption**</td>\n'+
'</tr>\n'+
'<tr>\n'+
'<td align="center"><a href="javascript:this.close();">close</a></td>\n'+
'</tr>\n'+
'<table>\n'+
'</body>\n'+
'</html>';

var rePopStrFind = new Array();
rePopStrFind[0] = /\*\*Title\*\*/;
rePopStrFind[1] = /\*\*ImageSource\*\*/;
rePopStrFind[2] = /\*\*Caption\*\*/;
rePopStrFind[3] = /\*\*ImageWidth\*\*/;
rePopStrFind[4] = /\*\*ImageHeight\*\*/;

formatSkin = (skin == "" || skin == null || skin == undefined) ? popup_skinDefault : skin;

for(var i=0;i<props.length;i++){
	formatSkin = searchReplace(formatSkin,rePopStrFind[i],props[i])
}

return formatSkin;
}