/*
Copyright (c) 2007, Ricardo Rosario. All rights reserved.
Code licensed under the BSD License:
http://yviewer.com/license.txt
version: 0.3
*/
function yviewer(options)
{
	this.thumbsPerPage=5;
	for(var i in options)
	{
		this[i]=options[i];
	}
	this.thumbImages=new Array;
	this.screenImages=new Array;
	this.isSliding=false;
	this.currentPage=1;
	this.totalThumbs=0;
	this.inited=false;
	YAHOO.util.Event.onDOMReady(this.init,this,true);
}

yviewer.prototype.init=function()
{
	var img=new Image;
	img.src=this.images[0].screen;
	this.loadThumbs();
	this.preloadScreens(this.currentPage*this.thumbsPerPage);
	if(this.currentPage*this.thumbsPerPage<this.totalThumbs)
	{
		YAHOO.util.Dom.setStyle("slideDown",'visibility','visible');
	}
	YAHOO.util.Event.on("thumbContainer","click",this.thumbClickHandler,this,true);
	YAHOO.util.Event.on("thumbContainer","mouseover",this.mouseOverHandler,this,true);
	YAHOO.util.Event.on("slideDown","click",this.slideDown,this,true);
	YAHOO.util.Event.on("slideUp","click",this.slideUp,this,true);this.inited=true;
	YAHOO.util.Event.on("yView", "click", this.viewerClickHandler, this, true);
};

yviewer.prototype.viewerClickHandler=function()
{
	var elYView=YAHOO.util.Dom.get("yView");
//	YAHOO.util.Dom.setStyle(elYView,'opacity',0);
//	elYView.innerHTML=this.selectedElement.innerHTML;
	var img=this.selectedElement.getElementsByTagName("img")[0];
	var index=img.id.replace("rryv","");
	this.galleryPopup(this.images[index].screen);
}

yviewer.prototype.galleryPopup=function(imageSRC)
{
     var xpos = 25;
		 var ypos = 25;
		 
		 var winWidth;
		 var winHeight;
		 
		 var img = new Image();
		 img.src = imageSRC;
		 
		 var imgWidth = img.width;
		 var imgHeight = img.height;
		 
     if (window.innerWidth) //if browser supports window.innerWidth
		 {
		 		 winWidth = window.innerWidth;
				 winHeight = window.innerHeight;
		 }
		 else if (document.all) //else if browser supports document.all (IE 4+)
		 {
		 		 winHeight = document.body.clientHeight;
				 winWidth = document.body.clientWidth;
		 }

		var myPanel = new YAHOO.widget.Panel("myPanel", {close:true,visible:false,draggable:true,constraintoviewport:true,x:xpos,y:ypos,effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.25}});
		if ((winWidth - imgWidth) < (winHeight - imgHeight))
		{
		    winWidth = winWidth - 60;
		    myPanel.setBody('<img id=\"blah\" width=\"' + winWidth + '\" src="' + imageSRC + '" alt="">');
		} else 
		{
		    winHeight = winHeight - 60;
		    myPanel.setBody('<img id=\"blah\" height=\"' + winHeight + '\" src="' + imageSRC + '" alt="">');
		}
		myPanel.render(document.body);
		myPanel.show();
}

yviewer.prototype.loadThumbs=function()
{
	var html="";
	for(var i=this.totalThumbs;i<this.images.length;i++)
	{
		html+='<span style="';
		if(i<this.thumbsPerPage)
			html+='visibility:hidden;';
//		html+='"><a href="'+this.images[i].url+'"><img id="rryv'+i+'" alt="'+this.images[i].title+'" title="'+this.images[i].title+'" src="'+this.images[i].thumb+'" /></a></span>';
		html+='"><a><img id="rryv'+i+'" alt="Click to enlarge" title="Click to enlarge" src="'+this.images[i].thumb+'" /></a></span>';
	}
	if(!this.inited)
	{
		html+='<div id="thumbOver"><div id="thumbOverIn"></div></div><div id="thumbSelected"></div>';
		getThumbUL().innerHTML=html;
		YAHOO.util.Event.on("thumbOver","click",this.thumbClickHandler,this,true);
		YAHOO.util.Event.on("thumbOver","mouseout",this.mouseOutHandler,this,true);
		this.origXYThumbUL=YAHOO.util.Dom.getXY(getThumbUL());
	}
	else
	{
		append(getThumbUL(),html);
	}
	for(var i=this.totalThumbs;i<Math.min(this.totalThumbs+this.thumbsPerPage,this.images.length);i++)
	{
		var img=new Image;
		this.thumbImages.push(img);
		img.index=i;
		img.onload=this.thumbLoaded;
		img.src=this.images[i].thumb;
	}
	this.totalThumbs=this.images.length;
};

yviewer.prototype.preloadScreens=function(maxTotal)
{
	var thumbLIs=YAHOO.util.Dom.get("thumbContainer").getElementsByTagName('span');
	var numThumbs=thumbLIs.length;
	for(var i=this.screenImages.length;i<numThumbs&&i<=maxTotal;i++)
	{
		var img=new Image;
		this.screenImages.push(img);
		if(i==0)
			img.onload=this.getMethodWithContext(this.showFirstScreen);
		img.index=i;
		img.src=this.images[i].screen;
	}
};


yviewer.prototype.showFirstScreen=function()
{
	this.selectedElement=getFirstThumbLI();
	var tO=YAHOO.util.Dom.get("thumbSelected");
	YAHOO.util.Dom.setXY(tO,[YAHOO.util.Dom.getX(this.selectedElement)-2,YAHOO.util.Dom.getY(this.selectedElement)-1]);
	YAHOO.util.Dom.setStyle(tO,'visibility','visible');
	this.showScreen();
};

yviewer.prototype.thumbClickHandler=function(e)
{
	YAHOO.util.Event.preventDefault(e);
	if(!this.isInited)
	{
		return;
	}
	if(this.selectedElement==this.overElement)
	{
		return;
	}
	this.selectedElement=this.overElement;
	YAHOO.util.Dom.setStyle("thumbOver",'visibility','hidden');
	YAHOO.util.Dom.setXY("thumbSelected",[YAHOO.util.Dom.getX(this.selectedElement)-2,YAHOO.util.Dom.getY(this.selectedElement)-1]);
	this.showScreen();YAHOO.util.Event.getTarget(e).blur();
};

yviewer.prototype.mouseOverHandler=function(e)
{
	var elTarget=YAHOO.util.Event.getTarget(e);
	if(elTarget.nodeName.toUpperCase()=="IMG"&&elTarget.parentNode.parentNode!=this.selectedElement)
	{
		elTarget=elTarget.parentNode.parentNode;
		YAHOO.util.Dom.setXY("thumbOver",[YAHOO.util.Dom.getX(elTarget)-1,YAHOO.util.Dom.getY(elTarget)+1]);
		YAHOO.util.Dom.setStyle("thumbOver",'visibility','visible');
		this.overElement=elTarget;
	}
};

yviewer.prototype.showScreen=function()
{
	var elYView=YAHOO.util.Dom.get("yView");
	YAHOO.util.Dom.setStyle(elYView,'opacity',0);
	elYView.innerHTML=this.selectedElement.innerHTML;
	var img=elYView.getElementsByTagName("img")[0];
	var index=img.id.replace("rryv","");
	img.id='rryvScreenImage';
	img.src=this.images[index].screen;
	var anim=new YAHOO.util.Anim('yView',{opacity:{to:1}},1,YAHOO.util.Easing.easeOut);
	anim.animate();
	var elYDesc=YAHOO.util.Dom.get("yDesc");
	elYDesc.innerHTML=this.images[index].desc;
};

yviewer.prototype.mouseOutHandler=function(e)
{
	YAHOO.util.Dom.setStyle("thumbOver",'visibility','hidden');
};

yviewer.prototype.slideDown=function()
{
	if(!this.isSliding && !(this.currentPage*this.thumbsPerPage>=this.totalThumbs))
	{
		this.isSliding=true;
		this.currentPage++;
		var thumbUL=getThumbUL();
		var xy=YAHOO.util.Dom.getXY(thumbUL);
		var h=parseInt(YAHOO.util.Dom.getStyle("thumbContainer","width"));
		var anim=new YAHOO.util.Motion(thumbUL,{points:{to:[xy[0]-h,xy[1]]}},1,YAHOO.util.Easing.easeBothStrong);
		anim.onComplete.subscribe(this.doneSliding,this,true);
		anim.animate();
	}
};

yviewer.prototype.slideUp=function()
{
	if(!this.isSliding && !(this.currentPage<=1))
	{
		this.isSliding=true;
		this.currentPage--;
		var thumbUL=getThumbUL();
		var xy=YAHOO.util.Dom.getXY(thumbUL);
		var h=parseInt(YAHOO.util.Dom.getStyle("thumbContainer","width"));
		var anim=new YAHOO.util.Motion(thumbUL,{points:{to:[xy[0]+h,xy[1]]}},1,YAHOO.util.Easing.easeBothStrong);
		anim.onComplete.subscribe(this.doneSliding,this,true);
		anim.animate();
	}
};

yviewer.prototype.doneSliding=function()
{
	if(this.currentPage<=1)
	{
		YAHOO.util.Dom.setStyle("slideUp",'visibility','hidden');
	}
	else
	{
		YAHOO.util.Dom.setStyle("slideUp",'visibility','visible');
	}
	if(this.currentPage*this.thumbsPerPage>=this.totalThumbs)
	{
		YAHOO.util.Dom.setStyle("slideDown",'visibility','hidden');
	}
	else
	{
		YAHOO.util.Dom.setStyle("slideDown",'visibility','visible');
	}
	this.isSliding=false;
	if(this.screenImages&&this.currentPage*this.thumbsPerPage>this.screenImages.length)
	{
		this.preloadScreens(this.currentPage*this.thumbsPerPage);
	}
};

yviewer.prototype.thumbLoaded=function(){var thumbLIs=YAHOO.util.Dom.get("thumbContainer").getElementsByTagName('span');YAHOO.util.Dom.setStyle(thumbLIs[this.index],'opacity',0);YAHOO.util.Dom.setStyle(thumbLIs[this.index],'visibility','visible');var anim=new YAHOO.util.Anim(thumbLIs[this.index],{opacity:{to:1}},1,YAHOO.util.Easing.easeOut);anim.animate();};
yviewer.prototype.reset=function(){empty(getThumbUL());empty(YAHOO.util.Dom.get("yView"));YAHOO.util.Dom.setStyle("slideDown",'visibility','hidden');YAHOO.util.Dom.setStyle("slideUp",'visibility','hidden');YAHOO.util.Dom.setXY(getThumbUL(),this.origXYThumbUL);this.images=new Array;this.thumbImages=new Array;this.screenImages=new Array;this.isSliding=false;this.currentPage=1;this.totalThumbs=0;this.inited=false;};
yviewer.prototype.addMore=function(images){if(isString(images)){alert('Not implemented yet!');}else if(isArray(images)){for(var i=0;i<images.length;i++){this.images.push(images[i]);}this.init();}};
yviewer.prototype.isInited=function(){return(this.inited&&screenImages[0].complete);};
yviewer.prototype.getMethodWithContext=function(func){var scope=this;return function(){func.call(scope);};};

function getThumbUL()
{
	var thumbUL=YAHOO.util.Dom.get("thumbContainer").firstChild;
	while(thumbUL&&thumbUL.nodeName.toUpperCase()!="UL")
	{
		thumbUL=thumbUL.nextSibling;
	}
thumbUL = YAHOO.util.Dom.get("yThumbsInner");
	return thumbUL;
}


function getFirstThumbLI()
{
	var thumbLI;
	var thumbUL=getThumbUL();
	if(thumbUL)
	{
		thumbLI=thumbUL.firstChild;
		while(thumbLI&&thumbLI.nodeName.toUpperCase()!="LI")
		{
			thumbLI=thumbLI.nextSibling;
		}
	}

thumbUL = getThumbUL();
thumbLI = thumbUL.firstChild;
	return thumbLI;
}


function isString(){if(typeof arguments[0]=='string'){return true;}if(typeof arguments[0]=='object'){var criterion=arguments[0].constructor.toString().match(/string/i);return(criterion!=null);}return false;}
function isArray(){if(typeof arguments[0]=='object'){var criterion=arguments[0].constructor.toString().match(/array/i);return(criterion!=null);}return false;}
function checkElem(a){var r=[];if(a.constructor!=Array){a=[a];}for(var i=0;i<a.length;i++){if(a[i].constructor==String){var div=document.createElement("div");div.innerHTML=a[i];for(var j=0;j<div.childNodes.length;j++){r[r.length]=div.childNodes[j];}}else if(a[i].length){for(var j=0;j<a[i].length;j++){r[r.length]=a[i][j];}}else{r[r.length]=a[i];}}return r;}
function append(parent,elem){var elems=checkElem(elem);for(var i=0;i<=elems.length;i++){parent.appendChild(elems[i]);}}
function remove(elem){if(elem)elem.parentNode.removeChild(elem);}
function empty(elem){while(elem.firstChild)remove(elem.firstChild);}
function sortByTitle(a, b)
{
  var x = a.title.toLowerCase();
	var y = b.title.toLowerCase();
	return ((x < y) ? -1: ((x > y) ? 1 : 0));
}

