/* -= Slideshow standard site license agreement =- */
var P_IMG_ROOT=".";
var TOOLBAR_IMG="toolbar.png";
var TOOLBAR_IMG_RUNNING="toolbar2.png";
var TOOLBAR_IMG_BACK="toolbar-back";
var TOOLBAR_IMG_MASK="toolbar-mask.png";
var TOOLBAR_IMG_LOADING="loading-anim.gif";
var TOOLBAR_W=440;
var TOOLBAR_H=75;
var TOOLBAR_IMG_W=420;
var TOOLBAR_IMG_H=44;
var TOOLBAR_LINK="";
var TOOLBAR_OPACITY=0.7;
var TOOLBAR_FONT_COLOR="#c0c0c0";
var TOOLBAR_FONT_STYLE="tahoma, verdana, arial, helvetica, sans-serif";
var VIEWER_INDEX=0;
var SLIDE_DURATION=4000;
var SLIDE_OFFSET=50;
var SLIDE_PHOTOS=true;
var FADE_BORDER=false;
var FADE_STEPS=10;
var MOVE_STEP=1;
var PRELOAD_TIMEOUT=60000;
var BORDER_WIDTH=5;
var FONT_SIZE=10;
var LINE_HEIGHT="0.7em";
var OFFSET_LEFT=0;
var OFFSET_TOP=0;
var REST_URL="/rest/";
var BYLINE_FONT_COLOR=TOOLBAR_FONT_COLOR;
var BYLINE_FONT_STYLE=TOOLBAR_FONT_STYLE;
var BYLINE_POSITION_RIGHT=5;
var BYLINE_POSITION_BOTTOM=5;
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_TIME=VIEWER_ID_PREFIX+"Time";
var VIEWER_ID_TITLE=VIEWER_ID_PREFIX+"Title";
var VIEWER_ID_BYLINE=VIEWER_ID_PREFIX+"Byline";
var VIEWER_ID_PHOTO=VIEWER_ID_PREFIX+"Photo";
var VIEWER_ID_CTXMENU=VIEWER_ID_PREFIX+"CtxMenu";
var TITLE_MAX_LENGTH=140;
var TOOLBAR_IMG_LOADING_LEFT=273;
var TOOLBAR_IMG_LOADING_TOP=24;

var MESSAGES ={
	"format.date": "MM/dd/yyyy",
	"format.time": "h:mm a",
	"photoviewer.toolbar.first": "Go to Start (Home)",
	"photoviewer.toolbar.prev": "Previous Photo (Left arrow)",
	"photoviewer.toolbar.slideShow": "Start/Pause Slide Show (Space)",
	"photoviewer.toolbar.next": "Next Photo (Right arrow)",
	"photoviewer.toolbar.last": "Go to End (End)",
	"photoviewer.toolbar.email": "Email Photo",
	"photoviewer.toolbar.permalink": "Link to Photo",
	"photoviewer.toolbar.close": "Close (Esc)",
	"photoviewer.email.subject.photo": "Photo",
	"gallery.nophotos": "No photos",
	"gallery.thumbs.start": "Start",
	"gallery.thumbs.end": "End",
	"gallery.toolbar.first": "First Photo",
	"gallery.toolbar.prev": "Previous Photo",
	"gallery.toolbar.view": "View Photo",
	"gallery.toolbar.next": "Next Photo",
	"gallery.toolbar.last": "Last Photo",
	"gallery.view.full": "Maximize Window",
	"gallery.view.photo": "Show Photo Only",
	"gallery.view.text": "Show Description Only",
	"gallery.view.close": "Close Window"
};
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 SAFARI=(agent.indexOf("safari")!=-1);
var FIREFOX=(agent.indexOf("gecko")!=-1);
var STRICT_MODE=(document.compatMode=="CSS1Compat");
var _DOMAIN=undefined;
var GALLERY_W=650;
var GALLERY_H=530;
if(USE_GOOGLE_MAPS==undefined)
{
	var USE_GOOGLE_MAPS=true;
}
var USE_OLD_MAPS=!USE_GOOGLE_MAPS;
var TESTING=false;
var log=getLogger();
if(document.location.href.indexOf("#jslog")!=-1)
log.enable();
function Logger()
{
	this.enable=loggerEnable;
	this.clear=loggerClear;
	this.log=loggerLog;
	this.debug=loggerDebug;
	this.info=loggerInfo;
	this.error=loggerError;
	var console=undefined;
	try
	{
		console=document.createElement("textarea");
		console.style.display="none";
		console.style.position="absolute";
		console.style.right="2px";
		console.style.bottom="2px";
		console.style.width="23em";
		console.style.height="40em";
		console.style.fontFamily="monospace";
		console.style.fontSize="9px";
		console.style.color="#000000";
		setOpacity(console,0.7);
		console.border="1px solid #808080";
		console.ondblclick=clearLogger;
	}
	catch(e)
	{
	}
	this.console=console;
	this.enabled=false;
	this.logTimeStart=getTimeMillis();
}
function getLogger()
{
	var log=undefined;
	var win=window;
	while(log==undefined)
	{
		try
		{
			log=win.document.log;
		}
		catch(e)
		{
			break;
		}
		if(win==win.parent)
		break;
		win=win.parent;
	}
	if(log==undefined)
	{
		log=new Logger();
		document.log=log;
	}
	return log;
}
function clearLogger()
{
	getLogger().clear();
}
function loggerEnable()
{
	if(this.enabled||this.console==undefined)
	return;
	if(window.document.body!=undefined)
	{
		window.document.body.appendChild(this.console);
		this.console.style.display="";
		this.enabled=true;
	}
}
function loggerDebug(msg)
{
	this.log("DEBUG",msg);
}
function loggerInfo(msg)
{
	this.log("INFO",msg);
}
function loggerError(msg,e)
{
	this.log("ERROR",msg,e);
}
function loggerLog(level,msg,e)
{
	if(!this.enabled||this.console==undefined)
	return;
	var millis=(getTimeMillis()-this.logTimeStart)+"";
	while(millis.length<6)
	millis+=" ";
	var m=millis+" ";
	if(msg!=undefined)
	m+=msg+" ";
	if(e!=undefined)
	m+=e.name+": "+e.message;
	this.console.value+=m+"\n";
}
function loggerClear()
{
	if(!this.enabled||this.console==undefined)
	return;
	this.console.value="";
}
function getTimeMillis()
{
	var t=new Date();
	return Date.UTC(t.getFullYear(),t.getMonth(),t.getDay(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds());
}
function getEvent(event)
{
	return(event!=undefined?event:window.event);
}
function preventDefault(event)
{
	if(event.stopEvent)
	event.stopEvent();
	if(event.preventDefault)
	{
		event.preventDefault();
		event.stopPropagation();
	}
	else
	{
		event.returnValue=false;
		event.cancelBubble=true;
	}
}
function getEventTarget(event)
{
	if(event==undefined)
	return undefined;
	if(event.srcElement!=undefined)
	return event.srcElement;
	else
	return event.target;
}
function getMousePosition(event)
{
	event=getEvent(event);
	var scrollLeft=window.pageXOffset;
	if(scrollLeft==undefined||scrollLeft===0)
	scrollLeft=window.document.documentElement.scrollLeft;
	if(scrollLeft==undefined||scrollLeft===0)
	scrollLeft=window.document.body.scrollLeft;
	var scrollTop=window.pageYOffset;
	if(scrollTop==undefined||scrollTop===0)
	scrollTop=window.document.documentElement.scrollTop;
	if(scrollTop==undefined||scrollTop===0)
	scrollTop=window.document.body.scrollTop;
	var x=event.clientX+scrollLeft;
	var y=event.clientY+scrollTop;
	return {x:x,y:y};
}
function getResponse(url,async,getXML,callback,data)
{
	var req=undefined;
	try
	{
		req=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e1)
	{
		try
		{
			req=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e2)
		{
			req=new XMLHttpRequest();
		}
	}
	if(req==undefined)
	{
		log.error("Failed to initialize XML/HTTP");
		return undefined;
	}
	req.open("GET",url,async);
	if(!async)
	{
		req.send(undefined);
		if(req.readyState!=4)
		{
			log.error("Request failed: "+req.readyState);
			return undefined;
		}
		if(!getXML)
		return req.responseText;
		else
		return req.responseXML;
	}
	else
	{
		pollResponse(req,callback,data);
		req.send(undefined);
		return undefined;
	}
}
function pollResponse(req,callback,data)
{
	if(req.readyState!=4)
window.setTimeout(function()
{
	pollResponse(req,callback,data);
}
,100);
else
callback(req,data);
}
function getDOMLocation(node)
{
	var x=node.offsetLeft;
	var y=node.offsetTop;
	while(node.offsetParent)
	{
		x=x+node.offsetParent.offsetLeft;
		y=y+node.offsetParent.offsetTop;
		if(node==document.getElementsByTagName('body')[0])
		{
			break;
		}
		else
		{
			node=node.offsetParent;
		}
	}
	return {x:x,y:y};
}
function getElementsByTagName(node,tag)
{
	if(node==undefined)
	return undefined;
	if(IE)
	{
		return node.getElementsByTagName(tag);
	}
	if(tag.indexOf(":")!=-1)
	{
		tag=tag.split(":")[1];
	}
	return node.getElementsByTagNameNS("*",tag);
}
function getFirstElementsValue(node,tag)
{
	if(node==undefined)
	return undefined;
	var nodes=getElementsByTagName(node,tag);
	if(nodes.length===0)
	return undefined;
	else
	return getElementValue(nodes[0]);
}
function findDOMElement(id)
{
	var el=undefined;
	var win=window;
	while(el==undefined)
	{
		try
		{
			el=win.document.getElementById(id);
		}
		catch(e)
		{
			break;
		}
		if(win===win.parent)
		{
			break;
		}
		win=win.parent;
	}
	return el;
}
function getElementValue(node)
{
	var i;
	var val="";
	for(i=0;i<node.childNodes.length;i++)
	{
		if(node.childNodes[i].nodeValue!==null)
		val+=node.childNodes[i].nodeValue;
	}
	return val;
}
function trim(str)
{
	if(str==undefined)
	return undefined;
	return str.replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1');
}
function trimToLen(str,len)
{
	if(str==undefined)
	{
		return undefined;
	}
	if(str.length>len)
	{
		str=str.substring(0,len)+"...";
	}
	return str;
}
function getRootWindow()
{
	var win=window;
	while(win!=undefined)
	{
		try
		{
			if(win===win.parent)
			{
				break;
			}
			else if(win.parent!=undefined&&win.parent.document.location.href.indexOf("/selenium-server/")!=-1)
			{
				break;
			}
			win=win.parent;
		}
		catch(e)
		{
			win.permissionDenied=true;
			break;
		}
	}
	return win;
}
function getURLParams()
{
	var i,params=[];
	var url=window.location.search;
	if(url==undefined||url.length===0)
	return undefined;
	url=url.substring(1);
	var namevals=url.replace(/\+/g," ").split("&");
	for(i=0;i<namevals.length;i++)
	{
		var name,val;
		var pos=namevals[i].indexOf("=");
		if(pos!=-1)
		{
			name=namevals[i].substring(0,pos);
			val=unescape(namevals[i].substring(pos+1));
		}
		else
		{
			name=namevals[i];
			val=undefined;
		}
		params[name]=val;
	}
	return params;
}
function joinLists(list1,list2)
{
	var i;
	var size=0;
	var result=[];
	if(list1!=undefined&&list1.length>0)
	{
		for(i=0;i<list1.length;i++)
		result[i]=list1[i];
		size=list1.length;
	}
	if(list2!=undefined&&list2.length>0)
	{
		for(i=0;i<list2.length;i++)
		result[i+size]=list2[i];
	}
	return result;
}
function setCookie(name,value,expire)
{
	var expiry=(expire==undefined)?"":("; expires="+expire.toGMTString());
	document.cookie=name+"="+value+expiry;
}
function getCookie(name)
{
	if(document.cookie==undefined||document.cookie.length===0)
	return undefined;
	var search=name+"=";
	var index=document.cookie.indexOf(search);
	if(index!=-1)
	{
		index+=search.length;
		var end=document.cookie.indexOf(";",index);
		if(end==-1)
		end=document.cookie.length;
		return unescape(document.cookie.substring(index,end));
	}
}
function removeCookie(name)
{
	var today=new Date();
	var expires=new Date();
	expires.setTime(today.getTime()-1);
	setCookie(name,"",expires);
}
function getMessage(id)
{
	if(MESSAGES[id]==undefined)
	{
		return"("+id+")";
	}
	else
	{
		return MESSAGES[id];
	}
}
function localizeNodeAttribs(node)
{
	var i;
	if(node==undefined)
	return;
	if(node.alt!=undefined&&node.alt.indexOf("#")===0)
	{
		node.alt=getMessage(node.alt.substring(1));
	}
	if(node.title!=undefined&&node.title.indexOf("#")===0)
	{
		node.title=getMessage(node.title.substring(1));
	}
	if(node.childNodes!=undefined)
	{
		for(i=0;i<node.childNodes.length;i++)
		{
			localizeNodeAttribs(node.childNodes[i]);
		}
	}
}
function padNumber(n,pad)
{
	n=n+"";
	while(n.length<pad)
	{
		n="0"+n;
	}
	return n;
}
function isArray(obj)
{
	if(obj instanceof Array)
	return true;
	else
	return false;
}
function simpleDateFormatter(date,pattern)
{
	var d=pattern;
	d=d.replace(/yyyy/g,date.getFullYear());
	d=d.replace(/yy/g,padNumber(date.getFullYear()%100,2));
	d=d.replace(/MM/g,padNumber(date.getMonth()+1,2));
	d=d.replace(/M/g,date.getMonth()+1);
	d=d.replace(/dd/g,padNumber(date.getDate(),2));
	d=d.replace(/d/g,date.getDate());
	d=d.replace(/HH/g,padNumber(date.getHours(),2));
	d=d.replace(/H/g,date.getHours());
	d=d.replace(/hh/g,padNumber(date.getHours()%12,2));
	d=d.replace(/h/g,date.getHours()%12);
	d=d.replace(/mm/g,padNumber(date.getMinutes(),2));
	d=d.replace(/m/g,date.getMinutes());
	d=d.replace(/ss/g,padNumber(date.getSeconds(),2));
	d=d.replace(/s/g,date.getSeconds());
	var am=(date.getHours()<12?"AM":"PM");
	d=d.replace(/a/g,am);
	return d;
}
function formatDateTime(date)
{
	if(date==undefined)
	return undefined;
	return formatDate(date)+" "+formatTime(date);
}
function formatDate(date)
{
	var datePattern=getMessage("format.date");
	return simpleDateFormatter(date,datePattern);
}
function formatTime(date)
{
	var timePattern=getMessage("format.time");
	return simpleDateFormatter(date,timePattern);
}
function parseISOTime(strTime)
{
	if(strTime==undefined)
	return undefined;
	var isoRE=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d{3})?([Z+-])?(\d\d)?:?(\d\d)?$/;
	if(!isoRE.test(strTime))
	{
		return undefined;
	}
	else
	{
		return new Date(RegExp.$1,RegExp.$2-1,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6);
	}
}
function setOpacity(elt,opacity)
{
	if(IE)
	{
		elt.style.filter="alpha(opacity="+parseInt(opacity*100)+")";
	}
	elt.style.KhtmlOpacity=opacity;
	elt.style.opacity=opacity;
}
function validCoordinates(lat,lon)
{
	if(Math.abs(lat)>90||Math.abs(lon)>180)
	{
		return false;
	}
	if(lat===0.0&&lon===0.0)
	{
		return false;
	}
	return true;
}
function isHosted()
{
	var host=document.location.host;
	if(host==undefined)
	host="";
	return false;
	/*
	(
		(
			host.indexOf("triptracker.net")==-1
			||
			host.indexOf("slideshow.triptracker.net")!=-1
		) && host.indexOf("rtvslo.si")==-1 && host != "localhost" && !checkDomain()
	);
	*/
}
function checkDomain()
{
	try
	{
		if(_DOMAIN==undefined)
		return false;
		var protocol=document.location.protocol;
		if(protocol==undefined)
		protocol="http:";
		var host=document.location.host;
		if(host==undefined)
		host="";
		host=host.toLowerCase();
		if(protocol.toLowerCase().indexOf("file")===0)
		{
			return true;
		}
		var pos=host.lastIndexOf(":");
		if(pos!=-1)
		{
			host=host.substring(0,pos);
		}
		if(host.indexOf("www.")===0)
		{
			host=host.substring(4);
		}
		if(host===""||host=="localhost"||host=="127.0.0.1")
		return true;
		var domain=_DOMAIN.toLowerCase();
		pos=domain.indexOf("://");
		if(pos!=-1)
		{
			domain=domain.substring(pos+3);
		}
		pos=domain.indexOf("/");
		if(pos!=-1)
		{
			domain=domain.substring(0,pos);
		}
		if(domain.indexOf("www.")===0)
		{
			domain=domain.substring(4);
		}
		if(host==domain)
		{
			return true;
		}
		else if(new RegExp(domain).test(host))
		{
			return true;
		}
		return false;
	}
	catch(e)
	{
		return true;
	}
}
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 CLEAR_EVENTS=["onclick","ondblclick","onkeydown","onkeypress","onmousedown","onmouseup","onmousemove","onmouseover","onmouseout","onmousewheeldown","oncontextmenu"];
function clearEvents()
{
	var i,j;
	var count=0;
	if(document.all==undefined)
	return;
	for(i=0;i<document.all.length;i++)
	{
		for(j=0;j<CLEAR_EVENTS.length;j++)
		{
			var event=document.all[i][CLEAR_EVENTS[j]];
			if(event!=undefined)
			{
				document.all[i][CLEAR_EVENTS[j]]=null;
				count++;
			}
		}
	}
}
if(window.attachEvent)
window.attachEvent("onunload",clearEvents);
function getGallery()
{
	var gallery=undefined;
	var win=window;
	while(gallery==undefined)
	{
		try
		{
			gallery=win.document.gallery;
		}
		catch(e)
		{
			break;
		}
		var tmpWin=win;
		win=win.parent;
		if(tmpWin===win)
		{
			break;
		}
	}
	return gallery;
}
function getMap()
{
	if(this.map!=undefined)
	return this.map;
	try
	{
		if(document.map!=undefined)
		return document.map;
	}
	catch(e){}
	try
	{
		if(window.parent.document.map!=undefined)
		return window.parent.document.map;
	}
	catch(e){}
	return undefined;
}
function viewerCloseCallback(photoIndex)
{
	var i,j,n=0;
	var gallery=getGallery();
	for(i=0;i<gallery.sets.length;i++)
	{
		for(j=0;j<gallery.sets[i].photos.length;j++)
		{
			var p=gallery.sets[i].photos[j];
			if(p==undefined||p.orig==undefined||p.orig.src==undefined)
			continue;
			if(n==photoIndex)
			{
				gallery.setIndex=i;
				gallery.photoIndex=j;
				gallery.renderPhotos();
				gallery.win.focus();
				return;
			}
			n++;
		}
	}
}

function PhotoViewer(win,handleKeys)
{
	this.setImageRoot=setImageRoot;
	this.add=addPhoto;
	this.show=showPhoto;
	this.close=closePhoto;
	this.randomize=randomize;
	this.isShown=isPhotoShown;
	this.setBackground=setPhotoBackground;
	this.setShowToolbar=setShowToolbar;
	this.setToolbarImage=setToolbarImage;
	this.setShowCallback=setShowCallback;
	this.setCloseCallback=setCloseCallback;
	this.setEndCallback=setEndCallback;
	this.setLoading=setPhotoLoading;
	this.addBackShade=addBackShade;
	this.addToolbar=addToolbar;
	this.addCaptions=addCaptions;
	this.addByLine=addByLine;
	this.addBylineCaption=addBylineCaption;
	this.next=nextPhoto;
	this.prev=prevPhoto;
	this.first=firstPhoto;
	this.last=lastPhoto;
	this.slideShow=slideShow;
	this.slideShowStop=slideShowStop;
	this.startSlideShow=startSlideShow;
	this.handleKey=viewerHandleKey;
	this.checkStartFragmentIdentifier=checkStartFragmentIdentifier;
	this.checkStopFragmentIdentifier=checkStopFragmentIdentifier;
	this.setStartFragmentIdentifier=setStartFragmentIdentifier;
	this.setStopFragmentIdentifier=setStopFragmentIdentifier;
	this.email=emailPhoto;
	this.favorite=favoritePhoto;
	this.permalink=linkPhoto;
	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.setShadeColor=setShadeColor;
	this.setShadeOpacity=setShadeOpacity;
	this.setFontSize=setFontSize;
	this.setFont=setFont;
	this.enableAutoPlay=enableAutoPlay;
	this.disableAutoPlay=disableAutoPlay;
	this.enableEmailLink=enableEmailLink;
	this.disableEmailLink=disableEmailLink;
	this.enablePhotoLink=enablePhotoLink;
	this.disablePhotoLink=disablePhotoLink;
	this.setOnClickEvent=setOnClickEvent;
	this.setOnRightclickEvent=setOnRightclickEvent;
	this.enableLoop=enableLoop;
	this.disableLoop=disableLoop;
	this.enableToolbarAnimator=enableToolbarAnimator;
	this.disableToolbarAnimator=disableToolbarAnimator;
	this.enableToolbar=enableToolbar;
	this.disableToolbar=disableToolbar;
	this.setControlsImageMap=setControlsImageMap;
	this.setOverrideToolbarStyles=setOverrideToolbarStyles;
	this.setNoPadding=setNoPadding;
	this.hideOverlappingElements=hideOverlappingElements;
	this.showOverlappingElements=showOverlappingElements;
	this.addContextMenu=addContextMenu;
	this.id=VIEWER_ID_PREFIX+VIEWER_INDEX;
	VIEWER_INDEX++;
	this.photos=[];
	this.index=0;
	this.win=(win!=undefined?win:window);
	this.shown=false;
	this.showToolbar=true;
	this.backgroundColor="#000000";
	this.shadeColor="#000000";
	this.shadeOpacity=0.7;
	this.borderColor="#000000";
	this.shadeColor="#000000";
	this.shadeOpacity=0.7;
	this.borderWidth=BORDER_WIDTH;
	this.backgroundShade=true;
	this.fadePhotos=true;
	this.autoPlay=false;
	this.enableEmailLink=true;
	this.enablePhotoLink=true;
	this.slideDuration=SLIDE_DURATION;
	this.panPhotos=SLIDE_PHOTOS;
	this.fontSize=FONT_SIZE;
	this.font=undefined;
	if((handleKeys==undefined||handleKeys)&&!VIEWER_KEY_EVENT_ADDED)
	{
		if(this.win.addEventListener)
		{
			this.win.addEventListener("keydown",viewerHandleKey,false);
		}
		else
		{
			this.win.document.attachEvent("onkeydown",viewerHandleKey);
		}
		VIEWER_KEY_EVENT_ADDED=true;
	}
	this.win.document.viewer=this;
	if(OPERA)
	this.disableFading();
}
var VIEWER_KEY_EVENT_ADDED=false;
function PhotoImg(id,src,w,h,time,title,byline)
{
	this.id=id;
	this.src=src;
	this.w=parseInt(w,10);
	this.h=parseInt(h,10);
	this.time=time;
	this.title=title;
	this.byline=byline;
}
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 setImageRoot(root)
{
	P_IMG_ROOT=root;
}
function addPhoto(photo,title,time,byline)
{
	var type=typeof photo;
	if(typeof photo=="string")
	{
		photo=new PhotoImg(undefined,photo,undefined,undefined,time,title,byline);
	}
	this.photos.push(photo);
}
function randomize()
{
	var o=this.photos;
	for(var j,x,i=o.length;i;j=parseInt(Math.random((new Date()).getSeconds())*i,10),x=o[--i],o[i]=o[j],o[j]=x);
}
function setPhotoBackground(color,border,doShade)
{
	if(color!=undefined)
	this.backgroundColor=color;
	if(border!=undefined)
	this.borderColor=border;
	if(doShade!=undefined)
	this.backgroundShade=doShade;
}
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 setShadeColor(color)
{
	this.shadeColor=color;
}
function setShadeOpacity(opacity)
{
	this.shadeOpacity=opacity;
}
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 setFont(font)
{
	this.font=font;
}
function enableAutoPlay()
{
	this.autoPlay=true;
}
function disableAutoPlay()
{
	this.autoPlay=false;
}
function enableEmailLink()
{
	this.enableEmailLink=true;
}
function disableEmailLink()
{
	this.enableEmailLink=false;
}
function enablePhotoLink()
{
	this.enablePhotoLink=true;
}
function disablePhotoLink()
{
	this.enablePhotoLink=false;
}
function setOnClickEvent(newfunc)
{
	this.customOnClickEvent=newfunc;
}
function setOnRightclickEvent(newfunc)
{
	this.customOnRightclickEvent=newfunc;
}
function enableLoop()
{
	this.loop=true;
}
function disableLoop()
{
	this.loop=false;
}
function enableToolbar()
{
	this.showToolbar=true;
}
function disableToolbar()
{
	this.showToolbar=false;
}
function enableToolbarAnimator()
{
	this.toolbarAnimator=new ToolbarAnimator(this);
}
function disableToolbarAnimator()
{
	if(this.toolbarAnimator!=undefined)
	{
		this.toolbarAnimator.reset();
		this.toolbarAnimator=undefined;
	}
}
function setControlsImageMap(imagemap)
{
	this.customImageMap=imagemap;
}
function setOverrideToolbarStyles(overrideToolbarStyles)
{
	this.overrideToolbarStyles=overrideToolbarStyles;
}
function setNoPadding(nopadding)
{
	this.nopadding=nopadding;
}
function showPhoto(index,cropWidth,opacity)
{
	if(this.photos.length===0)
	{
		return true;
	}
	if(getRootWindow().permissionDenied&&this.badgeMode==undefined&&!getRootWindow().livemode)
	{
		this.setStartFragmentIdentifier(index);
		return true;
	}
	if(index!=undefined)
	this.index=index;
	if(this.index<0||this.index>=this.photos.length)
	{
		log.error("Invalid photo index");
		return true;
	}
	var doc=this.win.document;
	var firstShow=false;
	if(!this.shown)
	{
		firstShow=true;
		doc.viewer=this;
		try
		{
			this.hideOverlappingElements();
		}
		catch(e)
		{
		}
	}
	var zIndex=16384;
	var winSize=getWindowSize(this.win);
	var availW=winSize.w-(this.nopadding?this.borderWidth*2:20);
	var availH=winSize.h-(this.nopadding?this.borderWidth*2:20);
	var scrollPos=getScrollPos(this.win);
	var scrollLeft=scrollPos.left;
	var scrollTop=scrollPos.top;
	this.addBackShade(zIndex);
	this.addByLine(zIndex);
	this.addBylineCaption();
	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;
		}
	}
	this.shown=true;
	var offset=(this.nopadding?0: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"Missing photo dimension";
	}
	if(cropWidth==undefined)
	cropWidth=0;
	var photoDiv=doc.createElement("div");
	photoDiv.id=VIEWER_ID_PHOTO;
	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.border="none";
	photoElt.style.cursor="pointer";
	photoElt.style.zIndex=(parseInt(photoDiv.style.zIndex)+1)+"";
	photoElt.onclick=onClickEvent;
	photoElt.oncontextmenu=onContextMenuEvent;
	if(opacity!=undefined&&this.fadePhotos)
	{
		var fadeElt=(FADE_BORDER?photoDiv:photoElt);
		setOpacity(fadeElt,opacity);
	}
	var left=parseInt((availW-pw)/2)+(this.nopadding?0:OFFSET_LEFT);
	photoDiv.style.left=(left+scrollLeft+cropWidth/2)+"px";
	var top=parseInt((availH-ph)/2)+(this.nopadding?0:OFFSET_TOP);
	photoDiv.style.top=(top+scrollTop)+"px";
	photoElt.style.visibility="hidden";
	photoDiv.style.width=(pw-cropWidth>0?pw-cropWidth:pw)+"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);
	if(firstShow&&this.autoPlay)
	{
		this.slideShow(true);
	}
	return false;
}
function isPhotoShown()
{
	return this.shown;
}
function closeViewer()
{
	getViewer().close();
}
function onPhotoLoad(event)
{
	var viewer=getViewer();
	if(viewer!=undefined)
	{
		if(flickrHack(viewer,viewer.index))
		{
			viewer.setLoading(false);
			viewer.index--;
			viewer.next();
			return;
		}
		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);
	elt=doc.getElementById(VIEWER_ID_BYLINE);
	if(elt!=undefined)
	doc.body.removeChild(elt);
	this.shown=false;
	this.slideShowRunning=false;
	this.slideShowPaused=false;
	try
	{
		this.showOverlappingElements();
	}
	catch(e)
	{
		log.error(e);
	}
	if(this.toolbarAnimator!=undefined)
	{
		this.toolbarAnimator.reset();
	}
	if(this.closeCallback!=undefined)
	this.closeCallback(this.index);
	if(this.contextMenu!=undefined)
	this.contextMenu.hide();
}
function nextPhoto(n)
{
	if(this.contextMenu!=undefined&&this.contextMenu.visible)
	this.contextMenu.hide();
	if(this.isLoading)
	return;
	if(n==undefined)
	n=1;
	var oldIndex=this.index;
	if(this.index+n>=this.photos.length)
	{
		if(this.loop&&n!=this.photos.length)
		{
			this.index=0;
		}
		else
		{
			this.index=this.photos.length-1;
		}
	}
	else if(this.index+n<0)
	{
		if(n<-1)
		this.index=0;
		else if(this.loop)
		this.index=this.photos.length-1;
		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;
	if(this.photos[this.index].src!=undefined)
	{
		img.src=this.photos[this.index].src;
	}
	else
	{
		onPhotoLoad();
	}
}
function prevPhoto(n)
{
	if(this.contextMenu!=undefined&&this.contextMenu.visible)
	this.contextMenu.hide();
	if(n==undefined)
	n=1;
	this.next(-n);
}
function firstPhoto()
{
	if(this.contextMenu!=undefined&&this.contextMenu.visible)
	this.contextMenu.hide();
	this.prev(this.photos.length);
}
function lastPhoto()
{
	if(this.contextMenu!=undefined&&this.contextMenu.visible)
	this.contextMenu.hide();
	this.next(this.photos.length);
}
function startSlideShow()
{
	if(this.contextMenu!=undefined&&this.contextMenu.visible)
	this.contextMenu.hide();
	getViewer().slideShow(true);
}
var slideTimeout;
var slidePreloadImageLoaded=false;
var slidePreloadTime=undefined;
function slideShow(start)
{
	if(this.toolbarAnimator!=undefined)
	this.toolbarAnimator.slideshowAction();
	var nextIndex=this.index+1;
	if(nextIndex>=this.photos.length)
	{
		if(this.loop)
		nextIndex=0;
		else if(!this.slideShowPaused&&!this.slideShowRunning)
		{
			this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG);
			return;
		}
	}
	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);
	if(start!=undefined&&start===true)
	{
		if(this.slideShowPaused)
		{
			this.slideShowPaused=false;
			this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG_RUNNING);
			if(this.contextMenu!=undefined&&this.contextMenu.visible)
			this.contextMenu.hide();
			return;
		}
		else if(this.slideShowRunning)
		{
			this.slideShowPaused=true;
			this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG);
			return;
		}
		else
		{
			if(this.contextMenu!=undefined&&this.contextMenu.visible)
			this.contextMenu.hide();
			this.slideShowRunning=true;
			this.slideShowPaused=false;
			this.slideFirstPhoto=true;
			this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG_RUNNING);
		}
		if(this.isLoading||this.index>this.photos.length-1)
		{
			return;
		}
	}
	else if(this.slideShowPaused)
	{
window.setTimeout(function()
{
	viewer.slideShow(false);
}
,200);
return;
}
else if(!this.slideShowRunning)
{
this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG);
return;
}
var left=0;
if(photoElt.leftOffset!=undefined)
{
left=parseFloat(photoElt.leftOffset);
}
if(left===0)
{
if(nextIndex<this.photos.length)
{
	slidePreloadImageLoaded=false;
	var slidePreloadImage=new Image();
	this.photos[nextIndex].preloadImage=slidePreloadImage;
	slidePreloadTime=getTimeMillis();
	slidePreloadImage.onload=onSlideLoad;
	slidePreloadImage.onerror=onSlideLoad;
	slidePreloadImage.src=this.photos[nextIndex].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(nextIndex<this.photos.length&&!slidePreloadImageLoaded)
	{
		if(slidePreloadTime!=undefined&&getTimeMillis()-slidePreloadTime>PRELOAD_TIMEOUT)
		slidePreloadImageLoaded=true;
		left++;
		this.setLoading(true);
	}
	else
	{
		if(nextIndex<this.photos.length&&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(nextIndex>=this.photos.length)
{
	this.slideShowRunning=false;
	this.slideShowPaused=false;
	this.setToolbarImage(P_IMG_ROOT+"/"+TOOLBAR_IMG);
	if(this.toolbarAnimator!=undefined)
	this.toolbarAnimator.reset();
	if(this.endCallback!=undefined)
	this.endCallback();
	return;
}
this.index=nextIndex;
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)
	{
		if(flickrHack(viewer,viewer.index+1))
		{
			var slidePreloadImage=viewer.photos[viewer.index+1].preloadImage;
			slidePreloadImage.src=viewer.photos[viewer.index+1].src;
			slidePreloadTime=getTimeMillis();
			return;
		}
		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";
	photoBack.style.cursor="pointer";
	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=this.shadeColor;
	if(this.backgroundShade)
	setOpacity(photoBack,this.shadeOpacity);
	else
	setOpacity(photoBack,0.0);
	photoBack.onclick=onClickEvent;
	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;
	setOpacity(photoToolbar,TOOLBAR_OPACITY);
	photoToolbar.style.zIndex=zIndex+1;
	var imgBack=TOOLBAR_IMG_BACK;
	if(!isHosted())
	{
		imgBack+="-nologo";
	}
	if(IE&&!IE7)
	{
		imgBack+="-indexed";
	}
	imgBack+=".png";
	if(!this.overrideToolbarStyles)
	{
		var bottom=10;
		if(IE&&!(IE7&&STRICT_MODE))
		{
			photoToolbar.style.position="absolute";
			if(IE7)
			{
				var top=getWindowSize(this.win).h+getScrollPos(this.win).top;
				photoToolbar.style.top=(top-TOOLBAR_H-10)+"px";
			}
			else
			{
				photoToolbar.style.bottom=bottom+"px";
			}
		}
		else
		{
			photoToolbar.style.position="fixed";
			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="center";
		photoToolbar.style.backgroundImage="url('"+P_IMG_ROOT+"/"+imgBack+"')";
		photoToolbar.style.backgroundPosition="50% 0%";
		photoToolbar.style.backgroundRepeat="no-repeat";
		photoToolbar.style.lineHeight=LINE_HEIGHT;
	}
	var toolbarMask=undefined;
	if(!this.enableEmailLink&&TOOLBAR_IMG_MASK!=undefined)
	{
		toolbarMask=doc.createElement("img");
		toolbarMask.style.position="absolute";
		toolbarMask.style.width=44;
		toolbarMask.style.height=44;
		toolbarMask.style.left="289px";
		toolbarMask.style.top="0px";
		toolbarMask.src=P_IMG_ROOT+"/"+TOOLBAR_IMG_MASK;
		photoToolbar.appendChild(toolbarMask);
	}
	if(!this.enablePhotoLink&&TOOLBAR_IMG_MASK!=undefined)
	{
		toolbarMask=doc.createElement("img");
		toolbarMask.style.position="absolute";
		toolbarMask.style.width=44;
		toolbarMask.style.height=44;
		toolbarMask.style.left="339px";
		toolbarMask.style.top="0px";
		toolbarMask.src=P_IMG_ROOT+"/"+TOOLBAR_IMG_MASK;
		photoToolbar.appendChild(toolbarMask);
	}
	var imgMap=this.customImageMap;
	if(imgMap===undefined)
	{
		imgMap=doc.createElement("map");
		var areas=[];
		areas.push(["getViewer().first()","17",getMessage("photoviewer.toolbar.first")]);
		areas.push(["getViewer().prev()","68",getMessage("photoviewer.toolbar.prev")]);
		areas.push(["getViewer().slideShow(true)","122",getMessage("photoviewer.toolbar.slideShow")]);
		areas.push(["getViewer().next()","175",getMessage("photoviewer.toolbar.next")]);
		areas.push(["getViewer().last()","227",getMessage("photoviewer.toolbar.last")]);
		if(this.enableEmailLink)
		areas.push(["getViewer().email()","300",getMessage("photoviewer.toolbar.email")]);
		if(this.enablePhotoLink)
		areas.push(["getViewer().permalink()","350",getMessage("photoviewer.toolbar.permalink")]);
		areas.push(["getViewer().close()","402",getMessage("photoviewer.toolbar.close")]);
		for(i=0;i<areas.length;i++)
		{
			var area=doc.createElement("area");
			area.href="javascript:void(0)";
			area.alt=areas[i][2];
			area.title=area.alt;
			area.shape="circle";
			area.coords=areas[i][1]+", 21, 22";
			area.onclick=buildAreaMapClosure(areas[i][0]);
			imgMap.appendChild(area);
		}
	}
	imgMap.name=VIEWER_ID_TOOLBAR_MAP;
	imgMap.id=VIEWER_ID_TOOLBAR_MAP;
	var img=doc.createElement("img");
	img.id=VIEWER_ID_TOOLBAR_IMG;
	img.src=P_IMG_ROOT+"/"+TOOLBAR_IMG;
	img.width=TOOLBAR_IMG_W;
	img.height=TOOLBAR_IMG_H;
	img.style.border="none";
	img.style.background="none";
	if(STRICT_MODE)
	{
		img.style.margin="4px 0px 0px 0px";
	}
	else
	{
		img.style.margin="4px";
	}
	img.useMap="#"+VIEWER_ID_TOOLBAR_MAP;
	photoToolbar.appendChild(imgMap);
	photoToolbar.appendChild(img);
	if(isHosted())
	{
		var ttLink=doc.createElement("a");
		ttLink.style.position="absolute";
		ttLink.style.bottom="0px";
		ttLink.style.right="0px";
		ttLink.style.width="25px";
		ttLink.style.height="25px";
		ttLink.style.background="none";
		ttLink.alt="TripTracker.net";
		ttLink.title=ttLink.alt;
		ttLink.cursor=ttLink.alt;
		ttLink.href=TOOLBAR_LINK;
		ttLink.target="_new";
		ttLink.alt="TripTracker Slideshow";
		ttLink.title=ttLink.alt;
		photoToolbar.appendChild(ttLink);
	}
	var loadingIcon=doc.createElement("img");
	loadingIcon.id=VIEWER_ID_LOADING;
	loadingIcon.width=16;
	loadingIcon.height=16;
	loadingIcon.style.display="none";
	loadingIcon.style.position="absolute";
	loadingIcon.style.left=(TOOLBAR_IMG_LOADING_LEFT-8)+"px";
	loadingIcon.style.top=(TOOLBAR_IMG_LOADING_TOP-8)+"px";
	loadingIcon.src=P_IMG_ROOT+"/"+TOOLBAR_IMG_LOADING;
	loadingIcon.style.border="none";
	loadingIcon.style.background="none";
	photoToolbar.appendChild(loadingIcon);
	photoToolbar.appendChild(doc.createElement("br"));
	var photoTime=doc.createElement("span");
	photoTime.id=VIEWER_ID_TIME;
	if(!this.overrideToolbarStyles)
	{
		photoTime.position="relative";
		photoTime.style.color=TOOLBAR_FONT_COLOR;
		photoTime.style.fontFamily=TOOLBAR_FONT_STYLE;
		photoTime.style.fontSize=this.fontSize+"px";
		if(STRICT_MODE)
		{
			photoTime.style.lineHeight=this.fontSize+"px";
		}
		if(this.font!=undefined)
		{
			photoTime.style.font=this.font;
		}
		photoTime.style.cssFloat="none";
		photoTime.style.textAlign="right";
		photoTime.style.padding="0px 10px";
	}
	photoTime.appendChild(doc.createTextNode(" "));
	photoToolbar.appendChild(photoTime);
	var photoTitle=doc.createElement("span");
	photoTitle.id=VIEWER_ID_TITLE;
	if(!this.overrideToolbarStyles)
	{
		photoTitle.position="relative";
		photoTitle.style.color=TOOLBAR_FONT_COLOR;
		photoTitle.style.fontFamily=TOOLBAR_FONT_STYLE;
		photoTitle.style.fontSize=this.fontSize+"px";
		if(STRICT_MODE)
		{
			photoTitle.style.lineHeight=this.fontSize+"px";
		}
		if(this.font!=undefined)
		{
			photoTitle.style.font=this.font;
		}
		photoTitle.style.cssFloat="none";
		photoTitle.style.textAlign="left";
		photoTitle.style.paddingRight="20px";
	}
	photoTitle.appendChild(doc.createTextNode(" "));
	photoToolbar.appendChild(photoTitle);
	doc.body.appendChild(photoToolbar);
}
function addByLine(zIndex)
{
	var doc=this.win.document;
	if(doc.getElementById(VIEWER_ID_BYLINE)!=undefined)
	return;
	var photoByline=doc.createElement("div");
	photoByline.appendChild(doc.createTextNode(""));
	photoByline.style.color=BYLINE_FONT_COLOR;
	photoByline.style.fontFamily=BYLINE_FONT_STYLE;
	photoByline.style.fontSize=this.fontSize+"px";
	if(this.font!=undefined)
	{
		photoByline.style.font=this.font;
	}
	photoByline.id=VIEWER_ID_BYLINE;
	photoByline.style.position="absolute";
	photoByline.style.right=BYLINE_POSITION_RIGHT+"px";
	photoByline.style.bottom=BYLINE_POSITION_BOTTOM+"px";
	photoByline.style.zIndex=zIndex+1;
	photoByline.appendChild(doc.createTextNode(" "));
	doc.body.appendChild(photoByline);
}
function buildAreaMapClosure(func)
{
return function(event)
{
	eval(func);
	blurElement(event);
	return false;
};
}
function blurElement(event)
{
	var target=getEventTarget(getEvent(event));
	if(target!=undefined)
	target.blur();
}
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=(this.index+1)+"/"+this.photos.length;
	if(photo.time!=undefined)
	{
		time+=" ["+photo.time+"]";
	}
	photoTime.firstChild.nodeValue=time;
	var title=(photo.title!=undefined?photo.title:"");
	photoTitle.title="";
	photoTitle.alt="";
	if(title.length>TITLE_MAX_LENGTH)
	{
		photoTitle.title=title;
		photoTitle.alt=title;
		title=title.substring(0,TITLE_MAX_LENGTH)+" ...";
	}
	if(title.indexOf("\n")!==0)
	{
		title=title.replace("\n","<br />");
		photoTitle.innerHTML=title;
	}
	else
	{
		photoTitle.nodeValue=title;
	}
}
function addBylineCaption()
{
	var photo=this.photos[this.index];
	var doc=this.win.document;
	var photoByline=doc.getElementById(VIEWER_ID_BYLINE);
	if(photo.byline!=undefined&&photo.byline.length>0)
	{
		photoByline.firstChild.nodeValue=photo.byline;
	}
	else
	{
		photoByline.firstChild.nodeValue="";
	}
}
function setCloseCallback(callback)
{
	this.closeCallback=callback;
}
function setShowCallback(callback)
{
	this.showCallback=callback;
}
function setEndCallback(callback)
{
	this.endCallback=callback;
}
function emailPhoto()
{
	var photo=this.photos[this.index];
	var doc=this.win.document;
	var title=(photo.title!=undefined?photo.title:getMessage("photoviewer.email.subject.photo"));
	var mailtoLink="mailto:?subject="+title+"&body="+
	getPhotoURL(photo.src);
	doc.location.href=mailtoLink;
}
function getPhotoURL(url)
{
	var loc=document.location;
	if(/\w+:\/\/.+/.test(url))
	{
		return url;
	}
	else if(url.indexOf("/")===0)
	{
		return loc.protocol+"//"+loc.host+url;
	}
	else
	{
		var path=loc.pathname;
		var pos=path.lastIndexOf("/");
		if(pos!=-1)
		{
			path=path.substring(0,pos);
		}
		return loc.protocol+"//"+loc.host+path+"/"+url;
	}
}
function linkPhoto()
{
	var photo=this.photos[this.index];
	window.open(photo.src);
}
function favoritePhoto()
{
	var photo=this.photos[this.index];
	var doc=this.win.document;
	var restURL=REST_URL+"markfeatured?id"+photo.id;
	try
	{
		var res=getResponse(restURL,false,true);
	}
	catch(e)
	{
		return;
	}
}
function hideOverlappingElements(node)
{
	if(node==undefined)
	{
		node=this.win.document.body;
		this.hideOverlappingElements(node);
		return;
	}
	if(node.style!=undefined&&node.style.visibility!="hidden")
	{
		var nodeName=node.nodeName.toLowerCase();
		if((node.className!=undefined&&node.className.indexOf("SlideshowDoHide")!=-1)||(IE&&(nodeName=="select"||nodeName=="object"||nodeName=="embed")))
		{
			node.style.visibility="hidden";
			if(this.hiddenElements==undefined)
			this.hiddenElements=[];
			this.hiddenElements.push(node);
		}
	}
	if(node.childNodes!=undefined)
	{
		var i;
		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=[];
	}
}
function viewerHandleKey(event)
{
	if(typeof getViewer=='undefined'||!getViewer)
	return true;
	var viewer=getViewer();
	if(viewer==undefined||!viewer.shown)
	return true;
	event=getEvent(event);
	if(event.ctrlKey||event.altKey)
	return true;
	var keyCode=event.keyCode;
	switch(keyCode)
	{
		case 37:case 38:viewer.prev();
		break;
		case 39:case 40:viewer.next();
		break;
		case 33:viewer.prev(10);
		break;
		case 34:viewer.next(10);
		break;
		case 36:viewer.first();
		break;
		case 35:viewer.last();
		break;
		case 32:case 13:viewer.slideShow(true);
		break;
		case 27:viewer.close();
		break;
		default:return true;
	}
	preventDefault(event);
	return false;
}
function flickrHack(viewer,index)
{
	if(viewer.photos[index]!=undefined)
	{
		var preloadPhoto=viewer.photos[index].preloadImage;
		if(preloadPhoto!=undefined&&preloadPhoto.width==500&&preloadPhoto.height==375)
		{
			var flickrRE=/.+static\.flickr\.com.+_b\.jpg/;
			if(flickrRE.test(preloadPhoto.src))
			{
				viewer.photos[index].src=viewer.photos[index].src.replace(/_b\.jpg/,"_o.jpg");
				return true;
			}
		}
	}
	return false;
}
function findPhotosTT(viewer,node)
{
	var i;
	if(node.nodeName.toLowerCase()=="a")
	{
		var onclick=node.getAttribute("onclick");
		if(onclick==undefined)
		{
			onclick=node.onclick;
		}
		if(onclick!=undefined&&new String(onclick).indexOf("popupImg")!=-1)
		{
			var popupRE=/.*popupImg\((.+?),(.+?),(.+?)\).*/;
			if(popupRE.test(onclick))
			{
				var url,w,h;
				if(node.photoUrl!=undefined)
				{
					url=node.photoUrl;
					w=node.photoW;
					h=node.photoH;
				}
				else
				{
					url=RegExp.$1;
					if(url.charAt(0)=="'"&&url.charAt(url.length-1)=="'")
					url=url.substring(1,url.length-1);
					w=parseInt(RegExp.$2);
					h=parseInt(RegExp.$3);
				}
				var photo=new PhotoImg(undefined,url,w,h);
				var found=false;
				for(i=0;i<viewer.photos.length;i++)
				{
					if(viewer.photos[i].src==photo.src)
					{
						found=true;
						break;
					}
				}
				if(!found)
				viewer.add(photo);
			}
		}
	}
	if(node.childNodes!=undefined)
	{
		for(i=0;i<node.childNodes.length;i++)
		{
			findPhotosTT(viewer,node.childNodes[i]);
		}
	}
}
var defaultViewer=undefined;
function popupImg(url,w,h,backColor,showToolbar)
{
	var i;
	if(defaultViewer==undefined)
	defaultViewer=new PhotoViewer();
	else
	{
		defaultViewer.photos=[];
		defaultViewer.index=0;
	}
	if(backColor!=undefined)
	defaultViewer.setBackground(backColor,backColor,false);
	if(showToolbar==undefined||showToolbar)
	{
		findPhotosTT(defaultViewer,window.document.body);
		for(i=0;i<defaultViewer.photos.length;i++)
		{
			if(defaultViewer.photos[i].src==url)
			{
				defaultViewer.show(i);
			}
		}
	}
	if(defaultViewer.photos===undefined||defaultViewer.photos.length===0)
	{
		defaultViewer.setShowToolbar(false);
		defaultViewer.add(new PhotoImg(undefined,url,w,h));
		defaultViewer.show();
	}
	return false;
}
function onClickEvent()
{
	var v=getViewer();
	if(v.contextMenu!=undefined&&v.contextMenu.visible)
	{
		v.contextMenu.hide();
		return;
	}
	if(v.toolbarAnimator!=undefined)
	v.toolbarAnimator.reset();
	if(v.customOnClickEvent!=undefined)
	v.customOnClickEvent();
	else
	closeViewer();
}
function onContextMenuEvent(e)
{
	var v=getViewer();
	var event=getEvent(e);
	if(v.contextMenu==undefined&&v.customOnRightclickEvent==undefined)
	{
		return true;
	}
	event.cancelBubble=true;
	if(v.customOnRightclickEvent!=undefined)
	v.customOnRightclickEvent(e);
	if(v.contextMenu!=undefined&&(!v.slideShowRunning||v.slideShowPaused))
	v.contextMenu.show(getMousePosition(e));
	return false;
}
function setupFragmentIdentifierModePhotoViewer(iframeLocation,iframename,viewerJSONArray)
{
	var viewer=new PhotoViewer();
	viewer.origRootLocation=document.location.href;
	viewer.origIFrameLocation=iframeLocation;
	viewer.iframename=iframename;
	viewer.setCloseCallback(viewer.setStopFragmentIdentifier);
	for(var i=0;i<viewerJSONArray.length;i++)
	{
		viewer.add(viewerJSONArray[i].url,viewerJSONArray[i].title,viewerJSONArray[i].date,viewerJSONArray[i].byline);
	}
	window.frames[viewer.iframename].location=viewer.origIFrameLocation+"#"+viewer.origRootLocation;
	viewer.checkStartFragmentIdentifier();
}
function checkStartFragmentIdentifier()
{
	var href=document.location.href;
	if(href.indexOf("#startphoto=")==-1)
	{
		window.setTimeout(checkStartFragmentIdentifier,500);
	}
	else
	{
		var startPhoto=parseInt(href.substring(href.lastIndexOf("=")+1));
		var viewer=getViewer();
		if(viewer.origRootLocation.indexOf("#")==-1)
		viewer.origRootLocation+="#";
		if(FIREFOX)
		{
			window.history.back();
		}
		else
		{
			document.location.href=viewer.origRootLocation;
		}
		viewer.show(startPhoto);
	}
}
function setStopFragmentIdentifier(index)
{
	window.frames[getViewer().iframename].location=this.origIFrameLocation+"#stopphoto="+index;
	checkStartFragmentIdentifier();
}
function setStartFragmentIdentifier(index)
{
	var rootWin=getRootWindow();
	if(this.origIFrameLocation==undefined)
	this.origIFrameLocation=rootWin.location.href.substring(0,rootWin.location.href.indexOf("#"));
	if(this.origRootLocation==undefined)
	this.origRootLocation=rootWin.location.href.substring(rootWin.location.href.indexOf("#")+1);
	this.checkStopFragmentIdentifier();
	var frIdentifier="#startphoto="+index;
	rootWin.parent.location=this.origRootLocation+frIdentifier;
}
function checkStopFragmentIdentifier()
{
	var href=getRootWindow().location.href;
	if(href.indexOf("#stopphoto")==-1)
	{
		window.setTimeout(checkStopFragmentIdentifier,500);
	}
	else
	{
		var viewer=getViewer();
		var index=href.substring(href.lastIndexOf("=")+1);
		if(viewer.origIFrameLocation.indexOf("#")==-1)
		viewer.origIFrameLocation+="#";
		if(FIREFOX)
		{
			window.history.back();
		}
		else
		{
			getRootWindow().location.href=viewer.origIFrameLocation;
		}
		viewerCloseCallback(index);
	}
}
function ToolbarAnimator(viewer)
{
	this.viewer=viewer;
}
ToolbarAnimator.prototype.initialize=function()
{
	var _this=this;
	var backDiv=findDOMElement(VIEWER_ID_BACK);
	var frontDiv=findDOMElement(VIEWER_ID_PHOTO);
	var toolbar=findDOMElement(VIEWER_ID_TOOLBAR);
	if(backDiv!=undefined&&frontDiv!=undefined&&toolbar!=undefined)
	{
		var func=function()
		{
			_this.mouseAction();
		};
		backDiv.onmousemove=func;
		frontDiv.onmousemove=func;
		toolbar.onmousemove=func;
		toolbar.onclick=func;
		this.initialized=true;
	}
};
ToolbarAnimator.prototype.reset=function()
{
	this.stop();
	var backDiv=findDOMElement(VIEWER_ID_BACK);
	var frontDiv=findDOMElement(VIEWER_ID_PHOTO);
	var toolbar=findDOMElement(VIEWER_ID_TOOLBAR);
	if(backDiv!=undefined&&frontDiv!=undefined&&toolbar!=undefined)
	{
		backDiv.onmousemove=null;
		frontDiv.onmousemove=null;
		toolbar.onmousemove=null;
		toolbar.onclick=null;
	}
	this.initialized=false;
};
ToolbarAnimator.prototype.stop=function()
{
	var _this=this;
	if(this.hiderID!=undefined)
	{
		window.clearTimeout(this.hiderID);
		this.hiderID=undefined;
	}
	if(this.hidden)
	{
		this.showToolbar();
	}
};
ToolbarAnimator.prototype.mouseAction=function()
{
	this.stop();
};
ToolbarAnimator.prototype.slideshowAction=function()
{
	var _this=this;
	if(this.viewer.slideShowRunning&&!this.viewer.slideShowPaused&&this.hiderID==undefined)
	{
		if(!this.initialized)
		{
			this.initialize();
		}
this.hiderID=window.setTimeout(function()
{
	_this.hideToolbar();
}
,5000);
}
else if(this.viewer.slideShowPaused)
{
this.reset();
}
};
ToolbarAnimator.prototype.hideToolbar=function()
{
var _this=this;
var toolbar=findDOMElement(VIEWER_ID_TOOLBAR);
if(toolbar==undefined)
{
return;
}
var opacity=toolbar.style.KhtmlOpacity;
if(opacity==undefined)
{
opacity=toolbar.style.opacity;
}
if(opacity===0)
{
toolbar.style.display="none";
return;
}
opacity=opacity-0.05;
setOpacity(toolbar,opacity>0?opacity:0);
this.hidden=true;
this.hiderID=window.setTimeout(function()
{
	_this.hideToolbar();
}
,100);
};
ToolbarAnimator.prototype.showToolbar=function()
{
var toolbar=findDOMElement(VIEWER_ID_TOOLBAR);
if(toolbar!=undefined)
{
	toolbar.style.display="block";
	setOpacity(toolbar,TOOLBAR_OPACITY);
}
this.hidden=false;
};
function addContextMenu(contextMenu)
{
	if(isHosted()||getViewer().contextMenu!=undefined)
	{
		return;
	}
	this.contextMenu=contextMenu;
	this.contextMenu.initialize();
}
function PhotoViewerCtxMenuItem(text,callback)
{
	this.text=text;
	this.callback=callback;
}
function PhotoViewerCtxMenu(cssClass)
{
	this.cssClass=cssClass;
	this.items=[];
	this.ctxSubMenus=[];
}
PhotoViewerCtxMenu.prototype.mouseover=function(e)
{
	var viewer=getViewer();
	var ctxMenu=viewer.contextMenu;
	if(!ctxMenu.visible)
	{
		return;
	}
	for(var i=0;i<ctxMenu.ctxSubMenus.length;i++)
	{
		ctxMenu.ctxSubMenus[i].style.visibility="hidden";
	}
	var subMenuId=this.id+"_sub";
	var subMenu=document.getElementById(subMenuId);
	var menuDiv=this.parentNode.parentNode;
	var mouseLoc=getMousePosition(e);
	var itemLoc=getDOMLocation(this);
	var menuLoc=getDOMLocation(menuDiv);
	if(subMenu&&menuDiv)
	{
		subMenu.style.left=(menuLoc.x+menuDiv.clientWidth)+"px";
		subMenu.style.top=itemLoc.y+"px";
		subMenu.style.visibility="visible";
	}
};
PhotoViewerCtxMenu.prototype.mouseclick=function(e)
{
	var viewer=getViewer();
	var menu=viewer.contextMenu;
	var menuItem=undefined;
	for(var i=0;i<menu.items.length;i++)
	{
		if(menu.items[i].DOMElement==this)
		{
			menuItem=menu.items[i];
			break;
		}
		var itemFound=false;
		if(menu.items[i].subitems==undefined)
		{
			continue;
		}
		for(var j=0;j<menu.items[i].subitems.length;j++)
		{
			if(menu.items[i].subitems[j].DOMElement.id===this.id)
			{
				menuItem=menu.items[i].subitems[j];
				itemFound=true;
				break;
			}
		}
		if(itemFound)
		{
			break;
		}
	}
	if(menuItem!=undefined&&menuItem.callback!=undefined)
	{
		viewer.contextMenu.hide();
		menuItem.callback(viewer.photos[viewer.index].src,e);
	}
};
PhotoViewerCtxMenu.prototype.add=function(item,subitems)
{
	item.subitems=subitems;
	this.items.push(item);
};
PhotoViewerCtxMenu.prototype.initialize=function()
{
	var viewer=getViewer();
	var doc=viewer.win.document;
	this.createMenu(doc,viewer);
	this.initialized=true;
};
PhotoViewerCtxMenu.prototype.createMenu=function(doc,viewer)
{
	var ctxMenuDiv=doc.createElement("div");
	ctxMenuDiv.id=VIEWER_ID_CTXMENU;
	ctxMenuDiv.style.visibility="hidden";
	ctxMenuDiv.style.position="absolute";
	ctxMenuDiv.style.zIndex=999999;
	var ctxMenu=doc.createElement("ul");
	for(var i=0;i<this.items.length;i++)
	{
		var ctxMenuItem=doc.createElement("li");
		ctxMenuItem.appendChild(doc.createTextNode(this.items[i].text));
		ctxMenuItem.onclick=this.mouseclick;
		ctxMenuItem.id=VIEWER_ID_CTXMENU+"_"+i;
		ctxMenuItem.onmouseover=this.mouseover;
		this.items[i].DOMElement=ctxMenuItem;
		ctxMenu.appendChild(ctxMenuItem);
		if(this.items[i].subitems!=undefined)
		{
			ctxMenuItem.className="ctxmenu_expanded";
			var submenuid=ctxMenuItem.id+"_sub";
			this.createSubMenu(doc,viewer,this.items[i].subitems,submenuid);
		}
	}
	ctxMenuDiv.appendChild(ctxMenu);
	ctxMenuDiv.className=this.cssClass;
	doc.body.appendChild(ctxMenuDiv);
	this.ctxMenuDOM=ctxMenuDiv;
};
PhotoViewerCtxMenu.prototype.createSubMenu=function(doc,viewer,subitems,id)
{
	var ctxSubMenuDiv=doc.createElement("div");
	ctxSubMenuDiv.id=id;
	ctxSubMenuDiv.style.visibility="hidden";
	ctxSubMenuDiv.style.position="absolute";
	ctxSubMenuDiv.style.zIndex=999999;
	var ctxSubMenu=doc.createElement("ul");
	for(var i=0;i<subitems.length;i++)
	{
		var ctxSubMenuItem=doc.createElement("li");
		ctxSubMenuItem.id=id+"_"+i;
		ctxSubMenuItem.appendChild(doc.createTextNode(subitems[i].text));
		ctxSubMenuItem.onclick=this.mouseclick;
		subitems[i].DOMElement=ctxSubMenuItem;
		ctxSubMenu.appendChild(ctxSubMenuItem);
	}
	ctxSubMenuDiv.appendChild(ctxSubMenu);
	ctxSubMenuDiv.className=this.cssClass;
	doc.body.appendChild(ctxSubMenuDiv);
	this.ctxSubMenus.push(ctxSubMenuDiv);
};
PhotoViewerCtxMenu.prototype.show=function(loc)
{
	if(!this.initialized)
	{
		this.initialize();
	}
	for(var i=0;i<this.ctxSubMenus.length;i++)
	{
		this.ctxSubMenus[i].style.visibility="hidden";
	}
	this.ctxMenuDOM.style.left=loc.x+"px";
	this.ctxMenuDOM.style.top=loc.y+"px";
	this.ctxMenuDOM.style.visibility="visible";
	this.visible=true;
};
PhotoViewerCtxMenu.prototype.hide=function()
{
	this.ctxMenuDOM.style.visibility="hidden";
	for(var i=0;i<this.ctxSubMenus.length;i++)
	{
		this.ctxSubMenus[i].style.visibility="hidden";
	}
	this.visible=false;
};
//_DOMAIN = "thraciancliffs.com/";
