
var agent=navigator.userAgent.toLowerCase();
var IE=(agent.indexOf("msie")!=-1&&agent.indexOf("opera")==-1);
var IE7=(agent.indexOf("msie 7")!=-1);
var OPERA=(agent.indexOf("opera")!=-1);
var STRICT_MODE=(document.compatMode=="CSS1Compat");
var IMG_ROOT="../images/comunes";
var _DOMAIN=undefined;


function setOpacity(elt,opacity){
	if(IE){
		elt.style.filter="alpha(opacity="+parseInt(opacity*100)+")";
	}
	elt.style.KhtmlOpacity=opacity;
	elt.style.opacity=opacity;
}

function getWindowSize(win){
	var availW=win.innerWidth;
	if(availW==undefined||availW===0||isNaN(availW))
		availW=win.document.documentElement.clientWidth;
	if(availW==undefined||availW===0||isNaN(availW))
		availW=win.document.body.clientWidth;var availH=win.innerHeight;
	if(availH==undefined||availH===0||isNaN(availH))
		availH=win.document.documentElement.clientHeight;
	if(availH==undefined||availH===0||isNaN(availH))
		availH=win.document.body.clientHeight;
	
	return {w:availW,h:availH};
}

function getDocumentSize(win){
	var winSize=getWindowSize(win);
	var scrollPos=getScrollPos(win);
	var w=winSize.w+scrollPos.left;
	var h=winSize.h+scrollPos.top;
	w=Math.max(w,win.document.body.offsetWidth);
	h=Math.max(h,win.document.body.offsetHeight);
	w=Math.max(w,win.document.body.scrollWidth);
	h=Math.max(h,win.document.body.scrollHeight);
	return{w:w,h:h};
}


function getScrollPos(win){
	var scrollTop=win.pageYOffset;
	if(scrollTop==undefined||scrollTop===0)
		scrollTop=win.document.documentElement.scrollTop;
	if(scrollTop==undefined||scrollTop===0)
		scrollTop=win.document.body.scrollTop;
	
	var scrollLeft=win.pageXOffset;
	if(scrollLeft==undefined||scrollLeft===0)
		scrollLeft=win.document.documentElement.scrollLeft;
	if(scrollLeft==undefined||scrollLeft===0)
		scrollLeft=win.document.body.scrollLeft;
	return{
		top:scrollTop,left:scrollLeft};
}

var VIEWER_INDEX=0;
var SLIDE_OFFSET=50;
var SLIDE_PHOTOS=true;
var FADE_BORDER=false;
var FADE_STEPS=10;
var MOVE_STEP=1;
var BORDER_WIDTH=5;
var FONT_SIZE=12;
var OFFSET_LEFT=0;
var OFFSET_TOP=0;
	
var TOOLBAR_IMG="/toolbar.gif";

var TOOLBAR_W=550;    // espacio para todo el menu de abajo
var TOOLBAR_H=50;     // espacio para todo el menu de abajo
var TOOLBAR_IMG_W=198;// tamano w imagen botones
var TOOLBAR_IMG_H=32; // tamano h imagen botones

var VIEWER_ID_PREFIX="PhotoViewer";
var VIEWER_ID_BACK=VIEWER_ID_PREFIX+"Back";
var VIEWER_ID_TOOLBAR=VIEWER_ID_PREFIX+"Toolbar";
var VIEWER_ID_TOOLBAR_MAP=VIEWER_ID_PREFIX+"ToolbarMap";
var VIEWER_ID_TOOLBAR_IMG=VIEWER_ID_PREFIX+"ToolbarImg";
var VIEWER_ID_LOADING=VIEWER_ID_PREFIX+"Loading";
var VIEWER_ID_TITLE=VIEWER_ID_PREFIX+"Title";
var VIEWER_ID_TIME=VIEWER_ID_PREFIX+"Time";
	
function PhotoViewer(win,handleKeys){
	this.add=addPhoto;
	this.show=showPhoto;
	this.close=closePhoto;
	this.setShowToolbar=setShowToolbar;
	this.setToolbarImage=setToolbarImage;
	this.setShowCallback=setShowCallback;
	this.setCloseCallback=setCloseCallback;
	this.setLoading=setPhotoLoading;
	this.addBackShade=addBackShade;
	this.addToolbar=addToolbar;
	this.addCaptions=addCaptions;
	this.next=nextPhoto;
	this.prev=prevPhoto;
	this.slideShow=slideShow;
	this.slideShowStop=slideShowStop;
	this.setBackgroundColor=setBackgroundColor;
	this.setBorderWidth=setBorderWidth;
	this.setSlideDuration=setSlideDuration;
	this.disablePanning=disablePanning;
	this.enablePanning=enablePanning;
	this.disableFading=disableFading;
	this.enableFading=enableFading;
	this.disableShade=disableShade;
	this.enableShade=enableShade;
	this.setFontSize=setFontSize;
	this.hideOverlappingElements=hideOverlappingElements;
	this.showOverlappingElements=showOverlappingElements;
	VIEWER_INDEX++;this.photos=[];
	this.index=0;
	this.win=(win!=undefined?win:window);
	this.shown=false;this.showToolbar=true;
	this.backgroundColor="#000000";
	this.borderColor="#000000";
	this.borderWidth=BORDER_WIDTH;
	this.backgroundShade=true;
	this.fadePhotos=true;
	this.panPhotos=SLIDE_PHOTOS;
	this.fontSize=FONT_SIZE;
	this.win.document.viewer=this;
}

function PhotoImg(id,src,w,h,time,title){
	this.id=id;
	this.src=src;
	this.w=parseInt(w);
	this.h=parseInt(h);
	this.time=time;
	this.title=title;
}

function getViewer(){
	var viewer=undefined;
	var win=window;
	while(viewer==undefined){
		try{
			viewer=win.document.viewer;
		}catch(e){
			break;
		}
		if(win===win.parent){
			break;
		}
		win=win.parent;
	}
	return viewer;
}

function addPhoto(photo,title,time){
	var type=typeof photo;
	if(typeof photo=="string"){
		photo=new PhotoImg(undefined,photo,undefined,undefined,time,title);
	}
	this.photos.push(photo);
}

function setPhotoLoading(isLoading){
	this.isLoading=isLoading;
	var elt=this.win.document.getElementById(VIEWER_ID_LOADING);
	if(elt==undefined)
		return;elt.style.display=isLoading?"":"none";
}

function setBackgroundColor(color){
	this.backgroundColor=color;
	this.borderColor=color;
}

function setBorderWidth(width){
	this.borderWidth=width;
}

function setSlideDuration(duration){
	this.slideDuration=duration;
}

function disableShade(){
	this.backgroundShade=false;
}

function enableShade(){
	this.backgroundShade=true;
}

function disableFading(){
	this.fadePhotos=false;
}

function enableFading(){
	this.fadePhotos=true;
}

function disablePanning(){
	this.panPhotos=false;
}

function enablePanning(){
	this.panPhotos=true;
}

function setFontSize(size){
	this.fontSize=size;
}

function showPhoto(index,cropWidth,opacity){
	if(this.photos.length===0){
		return true;
	}
	if(index!=undefined)
		this.index=index;
	if(this.index<0||this.index>=this.photos.length){
		log.error("Fuera de rango");
		return true;
	}
	var doc=this.win.document;
	if(!this.shown){
		doc.viewer=this;
		try{
			this.hideOverlappingElements();
		}
		catch(e){
		}
	}
	this.shown=true;
	var zIndex=16384;
	var winSize=getWindowSize(this.win);
	var availW=winSize.w-20;
	var availH=winSize.h-20;
	var scrollPos=getScrollPos(this.win);
	var scrollLeft=scrollPos.left;
	var scrollTop=scrollPos.top;
	this.addBackShade(zIndex);
	if(this.showToolbar){
		this.addToolbar(availW,zIndex);
		this.addCaptions();
	}
	var photo=this.photos[this.index];
	if(isNaN(photo.w)||isNaN(photo.h)){
		if(photo.preloadImage!=undefined){
			if(isNaN(photo.w)&&photo.preloadImage.width>0)
				photo.w=photo.preloadImage.width;
				if(isNaN(photo.h)&&photo.preloadImage.height>0)
					photo.h=photo.preloadImage.height;
			}
			else{
				this.index--;this.next();
				return false;
			}
		}
	var offset=20;
	var pw=-1;
	var ph=-1;
	if(parseInt(photo.w)>availW||parseInt(photo.h)>availH){
		if(parseInt(photo.w)/availW>parseInt(photo.h)/availH){
			pw=availW-offset;
			ph=parseInt(pw*photo.h/photo.w);
		}
		else{
			ph=availH-offset;
			pw=parseInt(ph*photo.w/photo.h);
		}
	}
	else{
		pw=parseInt(photo.w);
		ph=parseInt(photo.h);
	}
	if(pw<=0||ph<=0){
		if(!this.showToolbar)
			throw "Dimension de foto desconocida";
	}
	if(cropWidth==undefined)
		cropWidth=0;
		var photoDiv=doc.createElement("div");
		photoDiv.style.visibility="hidden";
		photoDiv.style.position="absolute";
		photoDiv.style.zIndex=zIndex;
		photoDiv.style.overflow="hidden";
		photoDiv.style.border=this.borderWidth+"px solid "+this.borderColor;
		photoDiv.style.textAlign="center";
		photoDiv.style.backgroundColor=this.backgroundColor;
		var photoElt=doc.createElement("img");
		photoElt.style.visibility="hidden";
		photoElt.style.position="relative";
		photoElt.style.backgroundColor=this.backgroundColor;
		photoElt.style.cursor="pointer";
		photoElt.style.zIndex=(parseInt(photoDiv.style.zIndex)+1)+"";
		photoElt.onclick=closeViewer;
		if(opacity!=undefined&&this.fadePhotos){
			var fadeElt=(FADE_BORDER?photoDiv:photoElt);
			setOpacity(fadeElt,opacity);
		}
		var left=parseInt((availW-pw)/2)+OFFSET_LEFT;
		photoDiv.style.left=(left+scrollLeft+cropWidth/2)+"px";
		var top=parseInt((availH-ph)/2)+OFFSET_TOP;
		photoDiv.style.top=(top+scrollTop)+"px";
		photoElt.style.visibility="hidden";
		photoDiv.style.width=(pw-cropWidth)+"px";photoDiv.style.height=ph+"px";
		photoElt.style.width=pw+"px";photoElt.style.height=ph+"px";
		photoElt.src=photo.src;
		photoDiv.style.visibility="visible";
		photoElt.style.visibility="visible";
		photoDiv.appendChild(photoElt);
		doc.body.appendChild(photoDiv);
		if(this.photoDiv!=undefined){
			try{
				doc.body.removeChild(this.photoDiv);
			}
			catch(e){}
		}
		this.photoDiv=photoDiv;
		this.photoImg=photoElt;
		this.setLoading(false);
		if(this.showCallback!=undefined)
			this.showCallback(this.index);
		return false;
}


function closeViewer(){
	getViewer().close();
}

function onPhotoLoad(event){
	var viewer=getViewer();
	if(viewer!=undefined){
		viewer.show();
	}
}

function closePhoto(){
	var win=this.win;
	if(win==undefined)
		win=window;
	var doc=win.document;
	var elt=this.photoDiv;
	if(elt!=undefined)
		doc.body.removeChild(elt);
	elt=doc.getElementById(VIEWER_ID_BACK);
	if(elt!=undefined)
		doc.body.removeChild(elt);
	elt=doc.getElementById(VIEWER_ID_TOOLBAR);
	if(elt!=undefined)
		doc.body.removeChild(elt);
	this.shown=false;
	this.slideShowRunning=false;
	this.slideShowPaused=false;
	try{
		this.showOverlappingElements();
	}
	catch(e){}
	if(this.closeCallback!=undefined)
		this.closeCallback(this.index);
}

function nextPhoto(n){
	if(this.isLoading)
		return;
	if(n==undefined)
		n=1;
	var oldIndex=this.index;
	if(this.index+n>=this.photos.length){
		if(n>1)
			this.index=this.photos.length-1;
		else
		return;
	}
	else if(this.index+n<0){
		if(n<-1)
			this.index=0;
		else
			return;
	}
	else{
		this.index+=n;
	}
	if(this.index==oldIndex)
		return;
	this.slideShowStop();
	var img=new Image();
	this.photos[this.index].preloadImage=img;
	this.setLoading(true);
	img.onload=onPhotoLoad;
	img.onerror=onPhotoLoad;
	img.src=this.photos[this.index].src;
}

function prevPhoto(n){
	if(n==undefined)
		n=1;
		this.next(-n);
}


var slideTimeout;
var slidePreloadImageLoaded=false;
var slidePreloadTime=undefined;

function slideShow(start){
	var doc=this.win.document;
	var viewer=this;
	var photoElt=this.photoImg;
	if(photoElt==undefined)
		return;
		
	var photoDiv=this.photoDiv;
	var fadeElt=(FADE_BORDER?photoDiv:photoElt);
	
	
	var left=0;
	if(photoElt.leftOffset!=undefined){
		left=parseFloat(photoElt.leftOffset);
	}
	if(left===0){
		if(this.index<this.photos.length-1){
			slidePreloadImageLoaded=false;
			var slidePreloadImage=new Image();
			this.photos[this.index+1].preloadImage=slidePreloadImage;
			slidePreloadTime=getTimeMillis();
			slidePreloadImage.onload=onSlideLoad;
			slidePreloadImage.onerror=onSlideLoad;
			slidePreloadImage.src=this.photos[this.index+1].src;
		}
	}
	if(left>-Slide_Offset){
		left-=MOVE_STEP;
		if(-left<=FADE_STEPS){
			if(fadeElt.style.opacity!=undefined&&parseFloat(fadeElt.style.opacity)<1){
				if(this.fadePhotos&&this.photos[this.index].src!=undefined)
					setOpacity(fadeElt,-left/FADE_STEPS);
				}
			}
			else if(left+SLIDE_OFFSET<FADE_STEPS){
				if(this.index<this.photos.length-1&&!slidePreloadImageLoaded){
					if(slidePreloadTime!=undefined&&getTimeMillis()-slidePreloadTime>PRELOAD_TIMEOUT)
						slidePreloadImageLoaded=true;
					left++;
					this.setLoading(true);
				}
				else{
					if(this.fadePhotos&&this.photos[this.index].src!=undefined)
						setOpacity(fadeElt,(left+SLIDE_OFFSET)/FADE_STEPS);
				}
			}
			photoElt.leftOffset=left;
			if(this.panPhotos&&!this.slideFirstPhoto){
				photoElt.style.left=left+"px";
			}
		}
		else{
			if(this.index>=this.photos.length-1){
				this.slideShowStop();
				this.close();
				return;
			}
			this.index++;
			this.slideFirstPhoto=false;
			this.show(undefined,(this.panPhotos?SLIDE_OFFSET:0),0);
			fadeElt=(FADE_BORDER?this.photoDiv:this.photoImg);
			if(this.fadePhotos)
				setOpacity(fadeElt,0);
			this.photoImg.leftOffset=0;
			if(this.panPhotos)
				this.photoImg.style.left="0px";
		}
		var pause=this.slideDuration/SLIDE_OFFSET;
		if(this.slideFirstPhoto){
			pause/=2;
		}
		slideTimeout=window.setTimeout(function(){
			viewer.slideShow(false);
		},pause);
}

function onSlideLoad(event){
	var viewer=getViewer();
	if(viewer!=undefined){
		slidePreloadImageLoaded=true;
		viewer.setLoading(false);
	}
}

function slideShowStop(){
	this.slideShowRunning=false;
	this.slideShowPaused=false;
	var doc=this.win.document;
	var photoElt=this.photoImg;
	if(photoElt!=undefined){
		if(this.fadePhotos){
			var fadeElt=(FADE_BORDER?this.photoDiv:photoElt);
			setOpacity(fadeElt,1);
		}
	photoElt.style.left="0px";
	}
}

function addBackShade(zIndex){
	var doc=this.win.document;
	if(doc.getElementById(VIEWER_ID_BACK)!=undefined){
		return;
	}
	var photoBack=doc.createElement("div");
	photoBack.id=VIEWER_ID_BACK;
	photoBack.style.top="0px";
	photoBack.style.left="0px";
	photoBack.style.bottom="0px";
	photoBack.style.right="0px";
	photoBack.style.margin="0";
	photoBack.style.padding="0";
	photoBack.style.border="none";
	if(IE&&!(IE7&&STRICT_MODE)){
		photoBack.style.position="absolute";
		var docSize=getDocumentSize(this.win);
		photoBack.style.width=(docSize.w-21)+"px";
		photoBack.style.height=(docSize.h-4)+"px";
	}
	else{
		photoBack.style.position="fixed";
		photoBack.style.width="100%";
		photoBack.style.height="100%";
	}
	photoBack.style.zIndex=zIndex-1;
	photoBack.style.backgroundColor="#000000";
	if(this.backgroundShade)
		setOpacity(photoBack,0.7);else
	setOpacity(photoBack,0.0);
	photoBack.onclick=closeViewer;
	doc.body.appendChild(photoBack);
}

function addToolbar(availW,zIndex){
	var doc=this.win.document;
	var i;
	if(doc.getElementById(VIEWER_ID_TOOLBAR)!=undefined)
		return;
	var photoToolbar=doc.createElement("div");
	photoToolbar.id=VIEWER_ID_TOOLBAR;
	var bottom=22; // Distancia del toolbar hasta abajo
	if(IE&&!(IE7&&STRICT_MODE)){
		photoToolbar.style.position="absolute";
		if(IE7)
			bottom-=getScrollPos(this.win).top;
	}
	else{
		photoToolbar.style.position="fixed";
	}
	// Capa principal en la que se insertan los objetos
	photoToolbar.style.bottom=bottom+"px";
	photoToolbar.style.left=(availW-TOOLBAR_W+10)/2+"px";
	photoToolbar.style.width=TOOLBAR_W+"px";
	photoToolbar.style.height=TOOLBAR_H+"px";
	photoToolbar.style.textAlign = "left"; // Alinea el texto
	setOpacity(photoToolbar,0.7);
	photoToolbar.style.zIndex=zIndex+1;
	/////////////photoToolbar.style.backgroundColor="red";
	photoToolbar.style.backgroundPosition="50% 100%";
	photoToolbar.style.backgroundRepeat="no-repeat";
	if(STRICT_MODE){
		photoToolbar.style.lineHeight="0.8em";
	}
	var imgMap=doc.createElement("map");
	imgMap.name=VIEWER_ID_TOOLBAR_MAP;
	imgMap.id=VIEWER_ID_TOOLBAR_MAP;
	//var areas=[["document.viewer.prev()","68","<<"],["document.viewer.next()","175",">>"],["document.viewer.close()","402","X"]];
	var areas=[["document.viewer.prev()","22","<<"],["document.viewer.next()","92",">>"],["document.viewer.close()","178","X"]];
	for(i=0;i<areas.length;i++){
		var area=doc.createElement("area");
		area.href="javascript:void("+areas[i][0]+")";
		area.alt=areas[i][2];
		area.title=area.alt;
		area.shape="circle";area.coords=areas[i][1]+", 21, 22";
		imgMap.appendChild(area);
	}
	
	// El mensaje, caption:
	var photoTitle=doc.createElement("span");
	photoTitle.id=VIEWER_ID_TITLE;
	photoTitle.position="absolute";
	photoTitle.width=TOOLBAR_IMG_W;
	photoTitle.bottom="0px";
	photoTitle.style.color="#c0c0c0";
	photoTitle.style.fontFamily="tahoma, verdana, arial, helvetica, sans-serif";
	photoTitle.style.fontSize=this.fontSize+"px"; //tamano de la fuente
	photoTitle.style.fontWeight="bold";						//en negrita
	photoTitle.style.textAlign="left";
	photoTitle.style.marginRight="0px";
	photoTitle.style.marginTop="0px";
	///////photoTitle.style.background="red";
	photoTitle.appendChild(doc.createTextNode(""));
	photoToolbar.appendChild(photoTitle);
	
	// Imagen de botones:
	var img=doc.createElement("img");
	img.id=VIEWER_ID_TOOLBAR_IMG;
	img.src=IMG_ROOT+TOOLBAR_IMG;
	img.width=TOOLBAR_IMG_W;
	img.height=TOOLBAR_IMG_H;
	img.style.position="absolute"; //
	img.style.bottom="4px";  // Posisicion para los botones
	img.style.right="0px";   // Posisicion para los botones
	img.style.border="none";
	//img.style.margin="20px";
	img.useMap="#"+VIEWER_ID_TOOLBAR_MAP;
	photoToolbar.appendChild(imgMap);
	photoToolbar.appendChild(img);

	var photoTime=doc.createElement("span");
	photoTime.id=VIEWER_ID_TIME;
	photoTime.position="relative";
	photoTime.style.color="#c0c0c0";
	photoTime.style.fontFamily="tahoma, verdana, arial, helvetica, sans-serif";
	photoTime.style.fontSize=(this.fontSize+1)+"px";photoTime.style.textAlign="left";
	photoTime.appendChild(doc.createTextNode(""));
	photoToolbar.appendChild(photoTime);
	doc.body.appendChild(photoToolbar);
}

function setToolbarImage(img){
	var doc=this.win.document;
	var elt=doc.getElementById(VIEWER_ID_TOOLBAR_IMG);
	if(elt!=undefined)
		Elt.src=img;
}

function setShowToolbar(doShow){
	this.showToolbar=doShow;
}

function addCaptions(){
	var photo=this.photos[this.index];
	var doc=this.win.document;
	var photoTime=doc.getElementById(VIEWER_ID_TIME);
	var photoTitle=doc.getElementById(VIEWER_ID_TITLE);
	var time=(photo.time!=undefined?photo.time:"");
	photoTime.firstChild.nodeValue=time;
	var title="("+(this.index+1)+"/"+this.photos.length+")";
	if(photo.title!=undefined){
		title+=" - "+photo.title;
	}
	photoTitle.firstChild.nodeValue=title;
}

function setCloseCallback(callback){
	this.closeCallback=callback;
}

function setShowCallback(callback){
	this.showCallback=callback;
}

function hideOverlappingElements(node){
	if(node==undefined){
		node=this.win.document.body;
		this.hideOverlappingElements(node);
		return;
	}
	var i;
	if(node.className!=undefined&&node.className.indexOf("SlideshowDoHide")!=-1&&node.style.visibility!="hidden"){
		node.style.visibility="hidden";
		if(this.hiddenElements==undefined)
			this.hiddenElements=[];this.hiddenElements.push(node);
	}
	if(node.childNodes!=undefined){
		for(i=0;i<node.childNodes.length;i++){
			this.hideOverlappingElements(node.childNodes[i]);
		}
	}
}

function showOverlappingElements(){
	var i;
	if(this.hiddenElements!=undefined){
		for(i=0;i<this.hiddenElements.length;i++){
			this.hiddenElements[i].style.visibility="visible";
		}
		this.hiddenElements=[];
	}
}

