/**
 * Javascript functions used by ICDL website
**/

// hidden style for hiding images in book reader
if (!(navigator.appName == 'Microsoft Internet Explorer' && navigator.platform.substr(0,3)=='Mac')) {
	document.write('<style type="text/css">');
	document.write('<!--');
	document.write('.hiddenbook {visibility: hidden}');
	document.write('-->');
	document.write('</style>');
}

<!--
// skip javascript if error
window.onerror = stopError;
function stopError() {
	return true;
}

// global variables
var gOverviewPageCt,gPageWidth,gPageHeight,gTwoPageView,gOverviewCellWidth,gOverviewCellHeight;
var gWindowWidth,gWindowHeight,gCoverWidth,gCoverHeight;
var gPageSize,gMaxPageSize,gPreviousPageSize,gFullscreen,gIncrement,gRotated,gReadingDirection,gZoomedIn,gZoomingIn;
var gPopoutText,gPopoutSubdir,gVisiblePopoutText,gTextBoxCount,gTextBoxTimeout,gTextBoxToFade,gFadingTextBoxOpacity,gStopFading,gAutoPopoutMode;
var gClearText,gTextSize,gBestFitTextSize;
var gResizing=false;

// constants
var SMALL_SCREEN_WIDTH=850;
var NARROW_SCREEN_WIDTH=650;
var NARROW_ASPECT_RATIO=0.9;
var MAX_POPOUT_SIZE=30;
var DHTML = (document.getElementById || document.all || document.layers);
var isIE = (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) ?  true : false;

//-----------------------------------------------------------
// BOOK OVERVIEW
//-----------------------------------------------------------

// resize pages on book overview page to fit on screen
function resizeBookPages(exportedAsHtml) {
	// hide the caterpillar progress bar
	var cater=new getObj("caterpillar");
	if (cater) {
		cater.style.display="none";
		cater.style.visibility="hidden";
	}

	// get the window dimensions
	getWindowDim(); 

	// calculate the new image dimensions
	var leafCt=gOverviewPageCt;
	if (gTwoPageView)
		leafCt=(leafCt+4)/2;

	var spacerHeight=Math.sqrt(leafCt)*12;
	var usableWindowHeight=gWindowHeight-(220+spacerHeight);
 
	var windowAR = gWindowWidth / usableWindowHeight;
	var pageAR = gPageWidth/gPageHeight;
  
	if (gTwoPageView)
		pageAR = 2*pageAR; 

	var factor = windowAR / pageAR;
	var numCols = Math.round(Math.sqrt(leafCt* factor)+0.5);
	var numRows = Math.ceil(leafCt / numCols); 
 
	var gridAR = (numCols * pageAR) / numRows;

	if (gridAR > windowAR) {
		gOverviewCellWidth = gWindowWidth / numCols;
		gOverviewCellHeight = gOverviewCellWidth / pageAR;
	} 
	else {
		gOverviewCellHeight = usableWindowHeight/numRows;
		gOverviewCellWidth = gOverviewCellHeight * pageAR;
	}

	if (gTwoPageView) 
		gOverviewCellWidth/=2;
  
	var i=0;

	// loop over all the images, resize them if necessary, and set them visible
	var doResize=(gOverviewCellWidth<=2*gPageWidth && gOverviewCellHeight<=2*gPageHeight);
	for (i=0; i<gOverviewPageCt; i++) {
		var imgname='page'+i;
		var img=new getObj(imgname);
		if (doResize) {
			img.obj.width=gOverviewCellWidth;
			img.obj.height=gOverviewCellHeight;
		}
		img.style.visibility='visible';
	}

	if (DHTML && exportedAsHtml) {
		gPageSize = getUrlParam('size');
		gFullscreen = (getUrlParam('fullscreen')=="true");
		if (gPageSize!=0) {
			i=1;
			while (isValidObj('page'+i+'link')) {
				var pagelink=document.getElementById('page'+i+'link');
				pagelink.href=updateUrl(pagelink.href);
				i++;
			}
		}

		var pageview=document.getElementById('pageview');
		pageview.href=updateUrl(pageview.href);

		// should also update zoom + href but need id tag
	}

	// delete any cookies set when viewing book pages previously
	deleteNarrowScreenCookies();
}

function resizeBookPages2() {
	resizeBookPages(false);
}

// resize pages on book overview page to fit on screen on reload
function resizeBookPagesOnReload(pct,pw,ph,tp,exportedAsHtml) {
	gOverviewPageCt=pct;
	gPageWidth=pw;
	gPageHeight=ph;
	gOverviewCellWidth=pw;
	gOverviewCellHeight=ph;
	gTwoPageView=tp;
	resizeBookPages(exportedAsHtml);
	window.onresize=resizeBookPages2;
}

// enlarge book page(s) on mouseover on a book overview page
function enlargeImgMouseOver(imgname1,imgname2,size,increment) {
	// get new width/height
	if (gPageWidth>gPageHeight) {
		var newwidth=size*increment;
		var newheight=newwidth*(gPageHeight/gPageWidth);
	}
	else {
		var newheight=size*increment;
		var newwidth=newheight*(gPageWidth/gPageHeight);
	}

	if (DHTML && newwidth>=1.5*gOverviewCellWidth) {

		// get left position of mouseover img
		var newleft=getLeftSideOfEnlargeImg(imgname1,imgname2,newwidth);	

		// get top position of mouseover img
		var img1=new getObj(imgname1);
		var imgtop=findPosY(img1.obj);
		var newtop; 

		if (imgtop+gOverviewCellHeight+newheight+15<gWindowHeight)
			newtop=imgtop+gOverviewCellHeight+5;
		else
			newtop=imgtop-(newheight+15);
   
		// get mouseover img 1
		enlargeImg(img1,'hiddenimg1',newwidth,newheight,size);

		// get mouseover img 2
		if (imgname2!='') {
			var img2=new getObj(imgname2);
			enlargeImg(img2,'hiddenimg2',newwidth,newheight,size);
		}

		// hide mouseover img 2 if none
		else {
			var img2=new getObj('hiddenimg2');
			img2.obj.width=0+'px';
			img2.obj.height=0+'px';
		}
	
		// position mouseover img 
		var hiddenImgDiv=new getObj('hiddenimgdiv');
		hiddenImgDiv.style.top=newtop+'px';
		hiddenImgDiv.style.left=newleft+'px';
		hiddenImgDiv.style.background='black';

		// position shadow img 
		var shadowImgDiv=new getObj('shadowimgdiv');
		shadowImgDiv.style.top=(newtop+8)+'px';
		shadowImgDiv.style.left=(newleft+8)+'px';
		if (imgname2!='') 
			shadowImgDiv.style.width=(2*newwidth+8)+'px';
		else
			shadowImgDiv.style.width=(newwidth+8)+'px';
		shadowImgDiv.style.height=(newheight+8)+'px';

		// make imgs visible
		shadowImgDiv.style.visibility='visible';
		hiddenImgDiv.style.visibility='visible';
	}
}

// find the left side of the mouseover img to display based on window dimensions
function getLeftSideOfEnlargeImg(imgname1,imgname2,newwidth) {
	var img1=new getObj(imgname1);
	var left=findPosX(img1.obj);
	var newleft;

	// two images
	if (imgname2!='') {
		var img2=new getObj(imgname2);
		var img2left=findPosX(img2.obj);

	// rtl book
	if (img2left<left) {
		left=left+gOverviewCellWidth-(2*newwidth+20);
		if (left>20)
			newleft=left;
		else
			newleft=img2left+20;
	}
	// ltr book
	else {
		if (left+(2*newwidth)+40<gWindowWidth)
			newleft=left+20;
		else
			newleft=gWindowWidth-(2*newwidth+50);
		}
	}
	// one image
	else {
		if (left+newwidth+40<gWindowWidth)
			newleft=left+20;
		else
			newleft=gWindowWidth-(newwidth+50);
	}

	return newleft;
}

// actual enlargement of image on book overview page
function enlargeImg(oldimg,hiddenimg,newwidth,newheight,size) {
	var newimg=new Image();
	var oldsrc=oldimg.obj.src;
	var thumbs=oldsrc.indexOf('thumbs2')+7;
	var frag=oldsrc.substring(0,thumbs+22);
	newimg.src=frag+'-thumb'+size+'.jpg';
	var hiddenImg=new getObj(hiddenimg);
	hiddenImg.obj.src=newimg.src;
	hiddenImg.obj.width=newwidth;
	hiddenImg.obj.height=newheight;
}

// hide enlarged images from mouseover on book overview page
function enlargeImgMouseOut(emptyimgname) {
	if (DHTML) {
		// hide images and shadow
		var hiddenImgDiv=new getObj('hiddenimgdiv');
		hiddenImgDiv.style.visibility='hidden';
		var shadowImgDiv=new getObj('shadowimgdiv');
		shadowImgDiv.style.visibility='hidden';
		hideImage('hiddenimg1',emptyimgname);
		hideImage('hiddenimg2',emptyimgname);
	}
}

// set mouseover image back to blank on enlarge image mouseover
function hideImage(hiddenimgname,emptyimgname) {
	var hiddenImg=new getObj(hiddenimgname);
	hiddenImg.style.background='white';
}

//-----------------------------------------------------------
// BOOK PAGE
//-----------------------------------------------------------

// write book pages
function writePages(img1Src,img2Src,cw,ch,size,fullscreen,increment,maxSize,rotated,readingDirection,popoutText,popoutSubdir,clearText,textSize,maxTextSize,exportedAsHtml) {
	// if exported as html, get size and fullscreen from url params
	if (exportedAsHtml) {
		size=getUrlParam('size');
		fullscreen=(getUrlParam('fullscreen')=="true");
	}

	gCoverWidth=cw;
	gCoverHeight=ch;
	gPageSize=size;
	gFullscreen=fullscreen;
	gIncrement=increment;
	gMaxPageSize=maxSize;
	gRotated=rotated;
	gReadingDirection=readingDirection;
	gPopoutText=popoutText;
	gPopoutSubdir=popoutSubdir;
	gClearText=clearText;
	gTextSize=textSize;
	gMaxTextSize=maxTextSize;
	gAutoPopoutMode=true;

	// FIX - FOR TESTING ONLY - used to determine max text size for book
	//gMaxTextSize=10;

	var twoPage = isTwoPage(img2Src);
	if (gPageSize==0) {
		gPageSize=getPageSize(twoPage);
	}
	loadPages(img1Src,img2Src);

	// disable zoom in button if max size
	if ((!gClearText && (gPageSize==gMaxPageSize)) || (gClearText && (gTextSize==gMaxTextSize))) {
		grayOutZoomIn();
	}

	// if exported as html ...
	// control fullscreen via javascript, not servlet
	if (exportedAsHtml) {
		setFullscreen(gFullscreen);
	}

        // if needed, layout for small narrow screen
        arrangeForNarrowScreen();
}

// load book pages for given page size
function loadPages(img1Src,img2Src) {

	// check if image is available for page size
	if (!gAvailableSizes[gPageSize-1]) {
		if (gZoomingIn)
			gPageSize=getNextAvailableSize(gPageSize);
		else
			gPageSize=getPreviousAvailableSize(gPageSize);
	}

	var portrait = isPortrait();
	if (gRotated) {
		portrait = !portrait;
	}

	var maxDimension=gPageSize*gIncrement;
	var imgDimension;
	if (portrait) {
		imgDimension = 'height="'+maxDimension+'"';
	}
	else {
		imgDimension = 'width="'+maxDimension+'"';
	}
		
	var twoPage = isTwoPage(img2Src);
	var rightToLeft = isRightToLeft();

	// image1
	if (img1Src!=null && img1Src!="") {
		newImg1Src=img1Src.replace(/-thumb.*$/,'-thumb'+gPageSize+'.jpg');
		var borderClass = "fullborder";
		var id = "Image1";
		if (twoPage) {
			borderClass = "leftborder";
			if (rightToLeft) id="Image2";
		}
		document.write('<img class="'+borderClass+'" align="top" border="0" id="'+id+'" src="'+newImg1Src+'" alt="" title="" '+imgDimension+'>');
	}

	// image 2
	if (twoPage) {
		var id = "Image2";
		if (rightToLeft) id="Image1";
		newImg2Src=img2Src.replace(/-thumb.*$/,'-thumb'+gPageSize+'.jpg');
		document.write('<img class="rightborder" align="top" border="0" id="'+id+'" src="'+newImg2Src+'" alt="" title="" '+imgDimension+'>');
	}

	gZoomedIn = isZoomedIn();
}

// change size of book pages
function changePageSize() {

	var visiblePopoutAtStart=-1;

	// hide visible popout text box, if any
	if ((typeof(gVisiblePopoutText)!="undefined") && (gVisiblePopoutText!=null)) {
		visiblePopoutAtStart=getTextBoxNumber(gVisiblePopoutText.id);
		hidePopoutText(gVisiblePopoutText);
	}

        // hide cleartext, if any
        if (gClearText) {
                hideAllTextBoxesForClearText();
        }

        if (!gAvailableSizes[gPageSize-1]) {
                if (gZoomingIn)
                        gPageSize=getNextAvailableSize(gPageSize);
                else
                        gPageSize=getPreviousAvailableSize(gPageSize);
        }

        var maxDimension=gPageSize*gIncrement;

        var portrait = isPortrait();
        if (gRotated) {
		portrait = !portrait;
        }

	// Image 1
        var oldImg1Src=document.images['Image1'].src;
        if (portrait) {
                document.images['Image1'].height=maxDimension;
        }
        else {
                document.images['Image1'].width=maxDimension;
        }
        var newImg1Src=oldImg1Src.replace(/-thumb.*$/,'-thumb'+gPageSize+'.jpg');
        document.images['Image1'].src=newImg1Src;

	// Image 2
        if (document.images['Image2']) {
                var oldImg2Src=document.images['Image2'].src;
                if (portrait) {
                        document.images['Image2'].height=maxDimension;
                }
                else {
                        document.images['Image2'].width=maxDimension;
                }
                newImg2Src=oldImg2Src.replace(/-thumb.*$/,'-thumb'+gPageSize+'.jpg');
                document.images['Image2'].src=newImg2Src;
        }

        gZoomedIn = isZoomedIn();

	if (gPopoutText && isLargerPopoutAvailable()) {
		initPopoutText(true);

		// show visible popout text box, if any
		if (!gZoomedIn && visiblePopoutAtStart!=-1) {
			var textbox=document.getElementById("textbox"+visiblePopoutAtStart);
			showPopoutText(textbox);
		}
	}

	if (gClearText) {
		//if (gResizing) gTextSize=0;
		initClearText();
	}
}

// book page done loading
function bookPageLoaded() {

	var bookID=getBookID();

	getWindowDim();
	window.onresize=resizePage;
	window.onorientationchange=resizePage;

	// init popoutText
	if (gPopoutText && isLargerPopoutAvailable()) {
		initPopoutText(true);
		var prevBookID=readCookie("icdlBookID");
		if (prevBookID==null) {
			createCookie("icdlBookID","<none>");
			prevBookID=readCookie("icdlBookID");
		}	

		// check if any textboxes on viewable pages
		if (gTextBoxCount>0) {

			// if so, automatically show first textbox once each time book is viewed
			if (prevBookID!=null && bookID!=prevBookID) {
				var textbox=document.getElementById("textbox1");
				showTextBoxWithMessage(textbox,'Click to enlarge text');
				setOpacity(textbox,100);
				gTextBoxToFade=textbox;
				gFadingTextBoxOpacity=100;
				gTextBoxTimeout=window.setTimeout("fadeTextBox()",2000);
				createCookie("icdlBookID",bookID);
				gStopFading=false;
			}
		}
	}
	else {
		createCookie("icdlBookID",bookID);
	}

	// clearText
	if (gClearText) {
		initClearText();
	}

	// need to update urls after new page images are loaded, but also needs
	// be be after entire page is loaded
	updateUrls();
}

// resize page images to fit window
function resizePage() {

	// IE triggers two resize events

	gResizing=true;

	if (!gZoomedIn || !isZoomedIn()) {
		gPreviousPageSize=gPageSize;
		gPageSize=getPageSize(document.images['Image2']);
		changePageSize();
	}
	gZoomedIn = isZoomedIn();

	updateUrls();

	// disable zoom in button if max size
	if ((!gClearText && (gPageSize==gMaxPageSize)) || (gClearText && (gTextSize==gMaxTextSize))) {
		grayOutZoomIn();
	}
	else {
		unGrayZoomIn();
	}

        // if needed, layout for small narrow screen
        arrangeForNarrowScreen();

	gResizing=false;
}

// get max page size that will fit in window based on cover dimensions
function getPageSize(twoPage) {
	var toptitlebar=document.getElementById('toptitlebar');
	var secondaryheader=document.getElementById('secondaryheader');
	var topHeaderHeight=toptitlebar.offsetHeight;
	var secondaryHeaderHeight=secondaryheader.offsetHeight;
	getWindowDim();

	var maxPageWidth=gWindowWidth;
	if (gFullscreen) {
		var maxPageHeight=gWindowHeight-secondaryHeaderHeight;
	}
	else {
		var maxPageHeight=gWindowHeight-topHeaderHeight-secondaryHeaderHeight;
	}

	if (twoPage) {
		maxPageWidth/=2;
	}

	var minDimension=maxPageWidth;
	var maxDimension=maxPageHeight;
	if (maxPageHeight<maxPageWidth) {
		minDimension=maxPageHeight;
		maxDimension=maxPageWidth;
	}

	var coverWidth = gCoverWidth;
	var coverHeight = gCoverHeight;

	if (gRotated) {
		var w=coverWidth;
		coverWidth=coverHeight;
		coverHeight=w;
	}

	var portrait = isPortrait();

	// available window space - portrait
	if (maxPageWidth<maxPageHeight) {
		// portrait page
		if (portrait) {
			var pageSize=Math.floor(maxPageHeight/gIncrement);
			newPageWidth=Math.floor(coverWidth*((pageSize*gIncrement)/coverHeight));
			if (newPageWidth>maxPageWidth) {
				newPageHeight=Math.floor(coverHeight*(maxPageWidth/coverWidth));
				pageSize=Math.floor(newPageHeight/gIncrement);
			}
		}
		// landscape page
		else {
			var pageSize=Math.floor(maxPageWidth/gIncrement);
		}
	}
	// available window space - landscape
	else {	
		// portrait page
		if (portrait) {
			var pageSize=Math.floor(maxPageHeight/gIncrement);
		}
		// landscape page
		else {
			var pageSize=Math.floor(maxPageWidth/gIncrement);
			newPageHeight=Math.floor(coverHeight*((pageSize*gIncrement)/coverWidth));
			if (newPageHeight>maxPageHeight) {
				newPageWidth=Math.floor(coverWidth*(maxPageHeight/coverHeight));
				pageSize=Math.floor(newPageWidth/gIncrement);
			}
		}
	}

        if (pageSize > gMaxPageSize) {
		pageSize=gMaxPageSize;
	}
	else if (pageSize < 1) {
        	pageSize=1;
        }

	return pageSize;
}

// arrrange window when narrow
function arrangeForNarrowScreen() {

	var book=getUrlParam('bookid');
	var narrowBook=readCookie("icdlNarrowBook");
	var bookDisplayedNarrow = narrowBook!=null && narrowBook==book;
	var forceFullscreen=readBooleanCookie("icdlDisplayForceFullscreen");
	var forceSinglePage=readBooleanCookie("icdlDisplayForceSinglePage");

	var twoPage=(getUrlParam('twoPage')=="true");
	var fullscreen=(getUrlParam('fullscreen')=="true");
	var url=""+document.location;

	getWindowDim();
	var windowAspectRatio=gWindowWidth/gWindowHeight;

	// FOR DEBUGGING ON XO
	//var secondaryHeader=document.getElementById('secondaryheader');
	//secondaryHeader.innerHTML=secondaryHeader.innerHTML+'<br/>---<br/>'+screen.width+'x'+NARROW_SCREEN_WIDTH+','+windowAspectRatio+','+NARROW_ASPECT_RATIO+','+bookDisplayedNarrow+'<br/>';

        if (screen.width<=NARROW_SCREEN_WIDTH && windowAspectRatio<=NARROW_ASPECT_RATIO && !bookDisplayedNarrow) {
		var forceFullscreen=false;
		var forceSinglePage=false;

		if (!fullscreen) {
			url=updateUrlWithValueForUrl(url,'fullscreen','true');
			forceFullscreen=true;
		}

		if (twoPage) {
			var pageView=document.getElementById('pageview');
			var pnum1=getUrlParamFromUrl(pageView.href,'pnum1');
			url=updateUrlWithValueForUrl(url,'twoPage','false');
			url=updateUrlWithValueForUrl(url,'pnum1',pnum1);
			url=updateUrlWithValueForUrl(url,'pnum2','');
			if (pnum2==null || pnum2=="") {
				url=url.replace('&pnum2=','');
				url=url.replace('pnum2=','');
			}
			url=updateUrlWithValueForUrl(url,'size','0');
			forceSinglePage=true;
		}

		if (!fullscreen || twoPage) {
			createCookie("icdlNarrowBook",book);
			createCookie("icdlDisplayForceFullscreen",forceFullscreen);
			createCookie("icdlDisplayForceSinglePage",forceSinglePage);
			document.location=url;
		}
	}

	else if ((screen.width>NARROW_SCREEN_WIDTH || windowAspectRatio>NARROW_ASPECT_RATIO) && bookDisplayedNarrow) {

		if (fullscreen && forceFullscreen) {
			url=updateUrlWithValueForUrl(url,'fullscreen','false');
		}

		if (!twoPage && forceSinglePage) {
			var pageView=document.getElementById('pageview');
			var pnum1=getUrlParamFromUrl(pageView.href,'pnum1');
			var pnum2=getUrlParamFromUrl(pageView.href,'pnum2');
			url=updateUrlWithValueForUrl(url,'twoPage','true');
			url=updateUrlWithValueForUrl(url,'pnum1',pnum1);
			url=updateUrlWithValueForUrl(url,'pnum2',pnum2);
			if (pnum2==null || pnum2=="") {
				url=url.replace('&pnum2=','');
				url=url.replace('pnum2=','');
			}
			url=updateUrlWithValueForUrl(url,'size','0');
		}

		deleteNarrowScreenCookies();

		if ((fullscreen && forceFullscreen) || (!twoPage && forceSinglePage)) {
			document.location=url;
		}
	}
}

function deleteNarrowScreenCookies() {
	deleteCookie("icdlNarrowBook");
	deleteCookie("icdlDisplayForceFullscreen");
	deleteCookie("icdlDisplayForceSinglePage");
}

// zoom in on book page
function zoom_in() {
	gZoomingIn=true;

	if (gPageSize<gMaxPageSize) {
		gPageSize++;
		changePageSize();
		updateUrls();
		if (gPageSize==gMaxPageSize) {
			grayOutZoomIn();
		}
	}
	return false;
}

// zoom out on book page
function zoom_out(ourl) {
	gZoomingIn=false;

	if (gPageSize==gMaxPageSize) {
		unGrayZoomIn();
	}

	if (!gZoomedIn) {
		location.href=ourl;
	}
	else {
		gPageSize--;
		changePageSize();
	}
	updateUrls();

	return false;
}

// capture arrow keys
function prevnextcapture(e) {

	// get previous and next page urls
	//
	var prevPage='';
	var nextPage='';
	if (gFullscreen) {
		if (isValidObj('prev_fs')) var prevPage=document.getElementById('prev_fs');
		if (isValidObj('next_fs')) var nextPage=document.getElementById('next_fs');
	}
	else {
		if (isValidObj('prev')) var prevPage=document.getElementById('prev');
		if (isValidObj('next')) var nextPage=document.getElementById('next');
	}
	var prev=prevPage.href;
	var next=nextPage.href;

 	var pageWidth=0;
  	if (document.images['Image1'])
     		pageWidth=document.images['Image1'].width;
  	if (document.images['Image2'])
     		pageWidth=pageWidth+document.images['Image2'].width;

	// use arrow keys to go to prev/next pages if page images not wider than window
	// otherwise want to use arrow keys to scroll image (default browser behavior)
	if (pageWidth<=gWindowWidth || next.indexOf('reader.html')!=-1 || next=='page-1.html') {
		var k = (e.which) ? e.which : e.keyCode;
		if ((k == 37 || k ==57387) && prev !="") {
			if (gPopoutText && gAutoPopoutMode && gTextBoxCount>0 && isLargerPopoutAvailable()) {
				showPrevPopoutText(prev);
			}
			else {
				window.location=updateUrl(prev);
			}
		}
		else if ((k == 39 || k == 57388) && next != "") {
			if (gPopoutText && gAutoPopoutMode && gTextBoxCount>0 && isLargerPopoutAvailable()) {
				showNextPopoutText(next);
			}
			else {
				window.location=updateUrl(next);
			}
		}
	}
}

// check if pages are zoomed in (larger than area to display them in)
// use cover dimensions since zoomed in might not actually be bigger
// than available window area since cover dimensions might be bigger
function isZoomedIn() {
	var toptitlebar=document.getElementById('toptitlebar');
	var secondaryheader=document.getElementById('secondaryheader');
	var topHeaderHeight=toptitlebar.offsetHeight;
	var secondaryHeaderHeight=secondaryheader.offsetHeight;

	getWindowDim();
	var displayAreaWidth=gWindowWidth;
	if (gFullscreen) {
		displayAreaHeight=gWindowHeight-secondaryHeaderHeight;
	}
	else {
		displayAreaHeight=gWindowHeight-topHeaderHeight-secondaryHeaderHeight;
	}

	var currPageWidth = getPageWidth();
	var currPageHeight = getPageHeight();

	if (document.images['Image2']) {
		currPageWidth*=2;
	}

	if (gRotated) {
		var tmpWidth=currPageWidth;
		currPageWidth=currPageHeight;
		currPageHeight=tmpWidth;
	}

	return (currPageWidth>displayAreaWidth) || (currPageHeight>displayAreaHeight);
}

function isZoomedInSinglePageView() {
	var toptitlebar=document.getElementById('toptitlebar');
	var secondaryheader=document.getElementById('secondaryheader');
	var topHeaderHeight=toptitlebar.offsetHeight;
	var secondaryHeaderHeight=secondaryheader.offsetHeight;

	getWindowDim();
	var displayAreaWidth=gWindowWidth;
	if (gFullscreen) {
		displayAreaHeight=gWindowHeight-secondaryHeaderHeight;
	}
	else {
		displayAreaHeight=gWindowHeight-topHeaderHeight-secondaryHeaderHeight;
	}

	var currPageWidth = getPageWidth();
	var currPageHeight = getPageHeight();

	return (currPageWidth>displayAreaWidth) || (currPageHeight>displayAreaHeight);
}

// show/hide top title bar 
function setFullscreen(fs) {

	var fullscreenCtrls=new getObj('fullscreenctrls');
	//var inFullscreenMode=fullscreenCtrls.style.display=="block";
	//if (fs!=inFullscreenMode) {

		var topTitleBar=new getObj('toptitlebar');
		if (isValidObj('login')) var login=new getObj('login');
		if (isValidObj('prevnextbottom')) var prevnextBottom=new getObj('prevnextbottom');
		if (isValidObj('moreviewerchoices')) var moreViewers=new getObj('moreviewerchoices');

		// check if zoomed in, before entering/exiting fullscreen mode
		gZoomedIn = isZoomedIn();

		if (fs) {
			topTitleBar.style.display="none";
			topTitleBar.style.visibility="hidden";
			if (login!=null) { 
				login.style.display="none";
				login.style.visibility="hidden";
			}
			if (prevnextBottom!=null) { 
				prevnextBottom.style.display="none";
				prevnextBottom.style.visibility="hidden";
			}
			if (moreViewers!=null) { 
				moreViewers.style.display="none";
				moreViewers.style.visibility="hidden";
			}
			fullscreenCtrls.style.display="block";
			fullscreenCtrls.style.visibility="visible";
			gFullscreen=true;
		}
		else {
			topTitleBar.style.visibility="visible";
			if (login!=null) { 
				login.style.display="block";
				login.style.visibility="visible";
			}

			if (prevnextBottom!=null) { 
				prevnextBottom.style.display="block";
				prevnextBottom.style.visibility="visible";
			}
			if (moreViewers!=null) { 
				moreViewers.style.display="block";
				moreViewers.style.visibility="visible";
			}
			fullscreenCtrls.style.display="none";
			fullscreenCtrls.style.visibility="hidden";
			gFullscreen=false;
		}

		if (!gZoomedIn) {
			resizePage();
		}
		updateUrls();
	//}
}

// update url to contain current page size and fullscreen mode
function updateUrl(url) {

	var size=gPageSize;
	if (!isZoomedIn()) {
		size=0;
	}

	// update size (do not mistake for tsize)
	var start=url.indexOf('?size=');
	if (start==-1) start=url.indexOf('&size=');
	if (start!=-1) {
		start+=1;
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currsize=shorturl.substring(0,end);
		var newsize='size='+size;
		url=url.replace(currsize,newsize);
	}

	// update fullscreen
	var start=url.indexOf('fullscreen=');
	if (start!=-1) {
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currfs=shorturl.substring(0,end);
		if (!gFullscreen) {
			var newfs='fullscreen=false';
		}
		else {
			var newfs='fullscreen=true';
		}
		url=url.replace(currfs,newfs);
	}

	return url;
}

// update url with given values
function updateUrlWithValues(url,size,fullscreen,textsize) {
	updateUrlWithValues(url,size,fullscreen,textsize,false);
}

// update url with given values
function updateUrlWithValues(url,size,fullscreen,textsize,force) {
	// update size (do not mistake for tsize)
	var start=url.indexOf('?size=');
	if (start==-1) start=url.indexOf('&size=');
	if (start!=-1) {
		start+=1;
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currsize=shorturl.substring(0,end);
		var newsize='size='+size;
		url=url.replace(currsize,newsize);
	}
	else if (force) {
		var question=url.indexOf('?');
		if (question!=-1) {
			var params=url.substring(question+1);
			if (params.length>0) url+='&';
			else url += '?';
			url+='size='+size;
		}
	}

	// update fullscreen
	var start=url.indexOf('fullscreen=');
	if (start!=-1) {
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currfs=shorturl.substring(0,end);
		var newfs='fullscreen='+fullscreen;
		url=url.replace(currfs,newfs);
	}
	else if (force) {
		var question=url.indexOf('?');
		if (question!=-1) {
			var params=url.substring(question+1);
			if (params.length>0) url+='&';
			else url += '?';
			url+='fullscreen='+fullscreen;
		}
	}

	// update text size
	var start=url.indexOf('tsize=');
	if (start!=-1) {
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currsize=shorturl.substring(0,end);
		var newsize='tsize='+textsize;
		url=url.replace(currsize,newsize);
	}
	else if (force) {
		var question=url.indexOf('?');
		if (question!=-1) {
			var params=url.substring(question+1);
			if (params.length>0) url+='&';
			else url += '?';
			url+='tsize='+textsize;
		}
	}

	return url;
}

function updateUrls() {

	var size=gPageSize;
	if (!isZoomedIn()) {
		size=0;
	}

	var textSize=gTextSize;

	if (gFullscreen) {

		// book overview
		if (isValidObj('book_reader')) {
			var bookOverviewCrumb=document.getElementById('book_reader');
			bookOverviewCrumb.href=updateUrlWithValues(bookOverviewCrumb.href,size,'true',textSize,true);
		}

		// fullscreen
		if (isValidObj('fullscreenexitlink')) {
			var fullscreenLink=document.getElementById('fullscreenexitlink');
			fullscreenLink.href=updateUrlWithValues(fullscreenLink.href,size,'false',textSize);
		}

		// if currently in two page view, check if page would be zoomed
		// in when switched to single page view
		var pageView=document.getElementById('pageview_fs');
		if (document.images['Image2'] && !isZoomedInSinglePageView()) {
			var pageViewUrl=updateUrlWithValues(pageView.href,0,'true',textSize);
		}
		else {
			var pageViewUrl=updateUrlWithValues(pageView.href,size,'true',textSize);
		}
		pageView.href=pageViewUrl;

		// next page
		if (isValidObj('next_fs')) {
			var nextPage=document.getElementById('next_fs');
			var nextPageUrl=updateUrlWithValues(nextPage.href,size,'true',textSize);
			nextPage.href=nextPageUrl;

			var nextPageCover=document.getElementById('next_cover');
			nextPageCover.href=nextPageUrl;
		}

		// previous page
		if (isValidObj('prev_fs')) {
			var prevPage=document.getElementById('prev_fs');
			prevPage.href=updateUrlWithValues(prevPage.href,size,'true',textSize);
		}
	}

	else {
		// book overview
		if (isValidObj('book_reader')) {
			var bookOverviewCrumb=document.getElementById('book_reader');
			bookOverviewCrumb.href=updateUrlWithValues(bookOverviewCrumb.href,size,'false',textSize,true);
		}

		// fullscreen
		var fullscreenLink=document.getElementById('fullscreenenterlink');
		fullscreenLink.href=updateUrlWithValues(fullscreenLink.href,size,'true',textSize);

		// if currently in two page view, check if page would be zoomed
		// in when switched to single page view
		var pageView=document.getElementById('pageview');
		if (document.images['Image2'] && !isZoomedInSinglePageView()) {
			var pageViewUrl=updateUrlWithValues(pageView.href,0,'false',textSize);
		}
		else {
			var pageViewUrl=updateUrlWithValues(pageView.href,size,'false',textSize);
		}
		pageView.href=pageViewUrl;

		// next page
		if (isValidObj('next')) {
			var nextPage=document.getElementById('next');
			var nextPageUrl=updateUrlWithValues(nextPage.href,size,'false',textSize);
			nextPage.href=nextPageUrl;

			var nextPageCover=document.getElementById('next_cover');
			nextPageCover.href=nextPageUrl;
	
			if (isValidObj('next_bottom')) {
				var nextPageBottom=document.getElementById('next_bottom');
				nextPageBottom.href=nextPageUrl;
			}
		}

		// previous page
		if (isValidObj('prev')) {
			var prevPage=document.getElementById('prev');
			var prevPageUrl=updateUrlWithValues(prevPage.href,size,'false',textSize);
			prevPage.href=prevPageUrl;

			if (isValidObj('prev_bottom')) {
				var prevPageBottom=document.getElementById('prev_bottom');
				prevPageBottom.href=prevPageUrl;
			}
		}
	}
}

function getNextAvailableSize(size) {
	var nextSize=size;
	for (i=size-1; i<gAvailableSizeCount; i++) {
		if (gAvailableSizes[i]) {
			nextSize=i+1;
			break;
		}
		
	}
	return nextSize;
}

function getPreviousAvailableSize(size) {
	var previousSize=size;
	for (i=size-1; i>=0; i--) {
		if (gAvailableSizes[i]) {
			previousSize=i+1;
			break;
		}
	}
	return previousSize;
}

function getNextAvailablePopoutSize(size) {
	var nextSize=size;
	for (i=size-1; i<gAvailablePopoutSizeCount; i++) {
		if (gAvailablePopoutSizes[i]) {
			nextSize=i+1;
			break;
		}
		
	}
	return nextSize;
}

function getPreviousAvailablePopoutSize(size) {
	var previousSize=-1;
	for (i=size-1; i>=0; i--) {
		if (gAvailablePopoutSizes[i]) {
			previousSize=i+1;
			break;
		}
	}
	return previousSize;
}

// check if there are popouts available that are larger 
// than current page
function isLargerPopoutAvailable() {
	var available=false;
	for (i=gPageSize+1; i<gAvailablePopoutSizeCount; i++) {
		if (gAvailablePopoutSizes[i]) {
			available=true;
			break;
		}
	}
	return available;
}

//-----------------------------------------------------------
// LOCATION SEARCH
//-----------------------------------------------------------

// mouse over for location search
function mapmouseover(name,label) {
	if (DHTML) {
		var continent=new getObj(name);
		var continentlabel=new getObj(label);
		if (continent && label) {
			continent.style.background="#eebb88";
			continentlabel.style.display="block";
		}
	} 
}

// mouse out for location search
function mapmouseout(name,label){
	if (DHTML) {
		var cont=new getObj(name);
		var contlabel=new getObj(label);
		if (cont && label) {
			cont.style.background="#ccddaa";
			label.style.display="none";
		}
	}
}

//-----------------------------------------------------------
// KEYWORD SEARCH
//-----------------------------------------------------------

// set cursor focus to keyword field
function keywordFocus() {
	if (DHTML) {
		if (isValidObj('searchForm')) {
			var sform=new getObj('searchForm');
			sform.obj.term.focus();
		}
	}
}

//-----------------------------------------------------------
// LOGIN
//-----------------------------------------------------------

// set cursor focus to username field
function userNameFocus() {
	if (DHTML) {
		if (isValidObj('userForm')) {
			var uform=new getObj('userForm');
			uform.obj.username.focus();
		}
	}
}

//-----------------------------------------------------------
// CLEARTEXT 
//-----------------------------------------------------------

var CLEARTEXT_BORDER_THICKNESS=8;
var CLEARTEXT_BACKGROUND_OPACITY=20;
var CLEARTEXT_TEXTBOX_INCREMENT=0.1;

function initClearText() {

	// FIX: Make textsize bigger for smaller pages

	var i=0;

	// delete any existing text boxes
	if (typeof(gTextBoxCount)!="undefined") {
		for (i=0; i<gTextBoxCount; i++) {
			deleteTextBoxForClearText("textbox"+(i+1));
		}
	}

	gTextBoxCount=0;

	var j=1;
	if (typeof(image1Text)!="undefined") {
		for (i=0; i<image1Text.length; i++) {
			createTextBoxForClearText("textbox"+j,image1Text[i],image1TextBoxes[i].color);
			j++;
		}
		gTextBoxCount=image1Text.length;
	}

	if ((typeof(image2Text)!="undefined") && document.images['Image2']) {
		for (i=0; i<image2Text.length; i++) {
			createTextBoxForClearText("textbox"+j,image2Text[i],image2TextBoxes[i].color);
			j++;
		}
		gTextBoxCount+=image2Text.length;
	}
}

function createTextBoxForClearText(id,text,color) {

	var img = document.images['Image1'];
	var imgZIndex = img.style.zIndex;

	var textbox = document.createElement("div");
	textbox.id = id;
	textbox.className = "txtBlock";
	textbox.style.margin = "0px";
	textbox.style.padding = "0px";
	textbox.style.position = "absolute";
	textbox.style.zIndex=imgZIndex+4;
	if (color=='#000000') {
		textbox.style.color='#ffffff';
	}

	// outside border
	var border1 = document.createElement("div");
	border1.id = id+"_border1";
	border1.style.position = "absolute";
	border1.style.background = color;
	setOpacity(border1,CLEARTEXT_BACKGROUND_OPACITY);
	border1.style.zIndex=imgZIndex+1;

	// inside border
	var border2 = document.createElement("div");
	border2.id = id+"_border2";
	border2.style.position = "absolute";
	border2.style.background = color;
	setOpacity(border2,CLEARTEXT_BACKGROUND_OPACITY);
	border2.style.zIndex=imgZIndex+2;

	// FIX - FOR TESTING ONLY - show border around actual textbox
	//var testborder = document.createElement("div");
	//testborder.id = id+"_testborder";
	//testborder.style.position = "absolute";
	//testborder.style.background = "white";
	//setOpacity(testborder,CLEARTEXT_BACKGROUND_OPACITY);
	//testborder.style.zIndex=imgZIndex+3;
	//testborder.style.borderStyle = TEXTBOX_BORDER_STYLE;
	//testborder.style.borderWidth = TEXTBOX_BORDER_WIDTH + "px";
	//testborder.style.borderColor = TEXTBOX_BORDER_COLOR;

	// transparent layer over text to block selection and make text clickable
	//var blocker = document.createElement('div');
	//blocker.id = id+"_selectblock";
	//blocker.style.padding = "0px";
	//blocker.style.margin = "0px";
	//blocker.style.position = "absolute";
	//blocker.style.background="white";
	//setOpacity(blocker,0);
	//blocker.style.cursor="pointer;";
	//blocker.onclick=clickText;
	//blocker.style.zIndex = imgZIndex+5;

	document.body.appendChild(border1);
	document.body.appendChild(border2);
	//document.body.appendChild(testborder);
	document.body.appendChild(textbox);
	//document.body.appendChild(blocker);

	// scale text and position textbox
	resizeClearText(textbox,text,null);
}

function deleteTextBoxForClearText(id) {

	if (isValidObj(id)) {
		var textbox = document.getElementById(id);
		document.body.removeChild(textbox);
	}

	if (isValidObj(id+"_border1")) {
		var border = document.getElementById(id+"_border1");
		document.body.removeChild(border);
	}

	if (isValidObj(id+"_border2")) {
		var border = document.getElementById(id+"_border2");
		document.body.removeChild(border);
	}

	// FIX - FOR TESTING ONLY
	if (isValidObj(id+"_testborder")) {
		var border = document.getElementById(id+"_testborder");
		document.body.removeChild(border);
	}

	if (isValidObj(id+"_selectblock")) {
		var blocker = document.getElementById(id+"_selectblock");
		document.body.removeChild(blocker);
	}
}

// zoom in on text (enlarge)
function zoom_in_text() {
	gZoomingIn=true;

	if (gTextSize<gMaxTextSize) {
		changeTextSize(1);
		updateUrls();
		if (document.booklanguageform) {
			document.booklanguageform.tsize.value=gTextSize;
		}
		if (gTextSize==gMaxTextSize) {
			grayOutZoomIn();
		}
	}

	return false;
}

// zoom out on text (decrease)
function zoom_out_text(ourl) {
	gZoomingIn=false;

	if (gTextSize==gMaxTextSize) {
		unGrayZoomIn();
	}

	if (gTextSize==0) {
		location.href=ourl;
	}
	else {
		changeTextSize(-1);
		updateUrls();
		if (document.booklanguageform) {
			document.booklanguageform.tsize.value=gTextSize;
		}
	}

	return false;
}

function changeTextSize(delta) {

	if (gTextBoxCount>0) {

		var prevTextSize=gTextSize;
		gTextSize+=delta;
	
		// resize text and position textbox
		var i=0;
		for (i=1; i<=gTextBoxCount; i++) {
			var textbox = document.getElementById('textbox'+i);
			var prevTextBoxAttributes=getTextBoxAttributesForID('textbox'+i,prevTextSize);
			var text = getTextBoxText(textbox);
			resizeClearText(textbox,text,prevTextBoxAttributes);
		}
	}
}

function resizeClearText(textbox,text,prevDim) {

	// FIX: Need to determine max font size for book

	var dim = getTextBoxAttributes(textbox);
	var fontSize = getFontSize(dim.fontscale);
	var lineHeight = Math.round(dim.lineheight*fontSize);
	var paragraphSpace = Math.round(dim.paragraphspace*fontSize);
	if (prevDim!=null) {
		//var prevFontSize = getFontSize(prevDim.fontscale);
		var prevFontSize = parseInt(textbox.style.fontSize.replace("px",""));
		var prevParagraphSpace = Math.round(prevDim.paragraphspace*prevFontSize);
	}

	// hide textbox
	hideTextBoxForClearText(textbox);

	// text box
	var align=dim.align;
	if (align.substr(0,1)=="'") align=align.substring(1,align.length-1);
	textbox.style.textAlign=align;
	textbox.style.left=dim.left+"px";
	textbox.style.top=dim.top+"px";
	textbox.style.width=dim.width+"px";
	textbox.style.fontSize=fontSize+"px";
	textbox.style.lineHeight=lineHeight+"px";
	textbox.innerHTML=text;

	// FIX - FOR TESTING ONLY
	if (isValidObj(textbox.id+"_testborder")) {
		var origDim = getTextBoxAttributesForID(textbox.id,0);
		var testborder = document.getElementById(textbox.id+"_testborder");
		testborder.style.left=origDim.left+"px";
		testborder.style.top=origDim.top+"px";
		testborder.style.width=origDim.width+"px";
		testborder.style.height=origDim.height+"px";
	}

	// center text vertically in available space
	var valign=dim.valign;
	if (valign.substr(0,1)=="'") valign=valign.substring(1,valign.length-1);
	if (valign=='center') {
		var adjustTop=Math.round((dim.height-textbox.offsetHeight)/2);
		dim.top+=adjustTop;
	}
	textbox.style.top=dim.top+"px";

	// insert any intersecting divs
	var textboxRect={left:parseInt(textbox.style.left.replace("px","")),top:parseInt(textbox.style.top.replace("px","")),width:parseInt(textbox.style.width.replace("px","")),height:textbox.offsetHeight};
	var intersects=getTextBoxIntersects(textbox,textboxRect);

	// add space after dashes since Firefox doesn't wrap at dashes 
	if (intersects!='') {
		text=text.replace('-','- ');
	}
	if (dim.align=="'right'") {
		textbox.innerHTML=intersects+'<span dir="rtl">'+text+'</span>';
	}
	else {
		textbox.innerHTML=intersects+text;
	}

	// check if text requires too much space
	// and if so, adjust it
	var page=getTextBoxImage(textbox);
	var pageLeft=findPosX(page.obj);
	var pageTop=findPosY(page.obj);
	var pageWidth = page.obj.width;
	var pageHeight = page.obj.height;
	if (dim.top<pageTop) {
		dim.top=pageTop+CLEARTEXT_BORDER_THICKNESS;
		textbox.style.top=dim.top+"px";
	}
	if (dim.left<pageLeft) {
		dim.left=pageLeft+CLEARTEXT_BORDER_THICKNESS;
		textbox.style.left=dim.left+"px";
	}
	if ((dim.left+dim.width)>(pageLeft+pageWidth)) {
		dim.width=pageLeft+pageWidth-dim.left-(2*CLEARTEXT_BORDER_THICKNESS);
		textbox.style.width=dim.width+"px";
	}
	if ((dim.top+textbox.offsetHeight)>(pageTop+pageHeight)) {
		while (lineHeight>fontSize) {
			lineHeight-=1;
			textbox.style.lineHeight=lineHeight+"px";
			if ((dim.top+textbox.offsetHeight)<=(pageTop+pageHeight)) {
				break;
			}
		}
	}

	// outside border
	var border1 = document.getElementById(textbox.id+"_border1");
	border1.style.left=(dim.left-CLEARTEXT_BORDER_THICKNESS)+"px";
	border1.style.top=(dim.top-CLEARTEXT_BORDER_THICKNESS)+"px";
	border1.style.width=(dim.width+(2*CLEARTEXT_BORDER_THICKNESS))+"px";
	border1.style.height=(textbox.offsetHeight+(2*CLEARTEXT_BORDER_THICKNESS))+"px";

	// inside border
	var border2 = document.getElementById(textbox.id+"_border2");
	border2.style.left=dim.left+"px";
	border2.style.top=dim.top+"px";
	border2.style.width=dim.width+"px";
	border2.style.height=textbox.offsetHeight+"px";

	// select blocker
	if (isValidObj(textbox.id+"_selectblock")) {
		var blocker = document.getElementById(textbox.id+"_selectblock");
		blocker.style.left=border1.style.left;	
		blocker.style.top=border1.style.top;	
		blocker.style.width=border1.style.width;	
		blocker.style.height=border1.style.height;	
	}

	// show textbox
	showTextBoxForClearText(textbox);
}

function showTextBoxForClearText(textbox) {

	textbox.style.visibility="visible";

	var border1=document.getElementById(textbox.id+'_border1');
	border1.style.visibility="visible";

	var border2=document.getElementById(textbox.id+'_border2');
	border2.style.visibility="visible";

	if (isValidObj(textbox.id+'_selectblock')) {
		var blocker=document.getElementById(textbox.id+'_selectblock');
		blocker.style.visibility="visible";
	}

	if (isValidObj(textbox.id+'_testborder')) {
		var testborder=document.getElementById(textbox.id+'_testborder');
		testborder.style.visibility="visible";
	}
}

function hideTextBoxForClearText(textbox) {

	textbox.style.visibility="hidden";

	var border1=document.getElementById(textbox.id+'_border1');
	border1.style.visibility="hidden";

	var border2=document.getElementById(textbox.id+'_border2');
	border2.style.visibility="hidden";

	if (isValidObj(textbox.id+'_selectblock')) {
		var blocker=document.getElementById(textbox.id+'_selectblock');
		blocker.style.visibility="hidden";
	}

	if (isValidObj(textbox.id+'_testborder')) {
		var testborder=document.getElementById(textbox.id+'_testborder');
		testborder.style.visibility="hidden";
	}
}

function hideAllTextBoxesForClearText() {
	var i=1;
	for (i=1; i<=gTextBoxCount; i++) {
		var textbox = document.getElementById('textbox'+i);
		hideTextBoxForClearText(textbox);
	}
}

function clickText() {
	var nextPage=document.getElementById('next_cover');
	window.location=nextPage.href;
}

function isZoomInTextEnabled() {

	if (gTextBoxCount>0) {
		if (typeof(image1TextBoxes)!="undefined") {
			var fontScale=image1TextBoxes[0].fontscale;
		}
		else {	
			var fontScale=image2TextBoxes[0].fontscale;
		}

		var defaultTextSize=getFontSize(fontScale);

		return gTextSize<gMaxTextSize;
	}
	else {
		return false;
	}
}

function isZoomOutTextEnabled() {

	if (gTextBoxCount>0) {
		if (typeof(image1TextBoxes)!="undefined") {
			var fontScale=image1TextBoxes[0].fontscale;
		}
		else {	
			var fontScale=image2TextBoxes[0].fontscale;
		}

		var defaultTextSize=getFontSize(fontScale);

		return gTextSize>0;
	}
	else {
		return false;
	}
}

function getTextBoxAttributes(textbox) {
	var textBoxID = textbox.id;
	return getTextBoxAttributesForID(textBoxID,gTextSize);
}

function getTextBoxAttributesForID(id,textsize) {

	var textBoxID = id;
	var textBoxNumber = parseInt(textBoxID.replace("textbox",""));
	var textBoxDelta = textsize*CLEARTEXT_TEXTBOX_INCREMENT;
	var textBoxAttributes;

	var i=0;
	var j=1;
	if (typeof(image1Text)!="undefined") {
		var page=new getObj('Image1');
		var pageLeft=findPosX(page.obj);
		var pageTop=findPosY(page.obj);
		var pageWidth = page.obj.width;
		var pageHeight = page.obj.height;
		for (i=0; i<image1Text.length; i++) {
			if (j==textBoxNumber) {
				textBoxAttributes = {left: pageLeft+(image1TextBoxes[i].left*pageWidth), top:pageTop+(image1TextBoxes[i].top*pageHeight), width:image1TextBoxes[i].width*pageWidth, height:image1TextBoxes[i].height*pageHeight, fontscale:image1TextBoxes[i].fontscale, lineheight:image1TextBoxes[i].lineheight, paragraphspace:image1TextBoxes[i].paragraphspace, align:"'"+image1TextBoxes[i].align+"'", valign:"'"+image1TextBoxes[i].valign+"'"};

				if (textBoxDelta!=0) {
					textBoxAttributes.left -= ((textBoxAttributes.width*textBoxDelta)/2);
					textBoxAttributes.top -= ((textBoxAttributes.height*textBoxDelta)/2);
					textBoxAttributes.width += (textBoxAttributes.width*textBoxDelta);
					textBoxAttributes.height += (textBoxAttributes.height*textBoxDelta);
					textBoxAttributes.fontscale += (textBoxAttributes.fontscale*textBoxDelta);
					textBoxAttributes.lineheight += (textBoxAttributes.lineheight*textBoxDelta);
					textBoxAttributes.paragraphspace += (textBoxAttributes.paragraphspace*textBoxDelta);
				}
			}
			j++;
		}
	}

	if ((typeof(image2Text)!="undefined") && document.images['Image2']) {
		var page=new getObj('Image2');
		var pageLeft=findPosX(page.obj);
		var pageTop=findPosY(page.obj);
		var pageWidth = page.obj.width;
		var pageHeight = page.obj.height;
		for (i=0; i<image2Text.length; i++) {
			if (j==textBoxNumber) {
				textBoxAttributes = {left: pageLeft+(image2TextBoxes[i].left*pageWidth), top:pageTop+(image2TextBoxes[i].top*pageHeight), width:image2TextBoxes[i].width*pageWidth, height:image2TextBoxes[i].height*pageHeight, fontscale:image2TextBoxes[i].fontscale, lineheight:image2TextBoxes[i].lineheight, paragraphspace:image2TextBoxes[i].paragraphspace, align:"'"+image2TextBoxes[i].align+"'", valign:"'"+image2TextBoxes[i].valign+"'"};

				if (textBoxDelta!=0) {
					textBoxAttributes.left -= ((textBoxAttributes.width*textBoxDelta)/2);
					textBoxAttributes.top -= ((textBoxAttributes.height*textBoxDelta)/2);
					textBoxAttributes.width += (textBoxAttributes.width*textBoxDelta);
					textBoxAttributes.height += (textBoxAttributes.height*textBoxDelta);
					textBoxAttributes.fontscale += (textBoxAttributes.fontscale*textBoxDelta);
					textBoxAttributes.lineheight += (textBoxAttributes.lineheight*textBoxDelta);
					textBoxAttributes.paragraphspace += (textBoxAttributes.paragraphspace*textBoxDelta);
				}
			}
			j++;
		}
	}

	if (textBoxAttributes) {
		textBoxAttributes.left = Math.round(textBoxAttributes.left);
		textBoxAttributes.top = Math.round(textBoxAttributes.top);
		textBoxAttributes.width = Math.round(textBoxAttributes.width);
		textBoxAttributes.height = Math.round(textBoxAttributes.height);
	}

	return textBoxAttributes;
}

function getTextBoxText(textbox) {

	var text = "";
	var textBoxID = textbox.id;
	var textBoxNumber = parseInt(textBoxID.replace("textbox",""));

	var i=0;
	var j=1;
	if (typeof(image1Text)!="undefined") {
		for (i=0; i<image1Text.length; i++) {
			if (j==textBoxNumber) {
				text=image1Text[i];
			}
			j++;
		}
	}

	if ((typeof(image2Text)!="undefined") && document.images['Image2']) {
		for (i=0; i<image2Text.length; i++) {
			if (j==textBoxNumber) {
				text=image2Text[i];
			}
			j++;
		}
	}

	return text;
}

function getTextBoxImage(textbox) {

	var image = null;
	var textBoxID = textbox.id;
	var textBoxNumber = parseInt(textBoxID.replace("textbox",""));

	var i=0;
	var j=1;
	if (typeof(image1Text)!="undefined") {
		for (i=0; i<image1Text.length; i++) {
			if (j==textBoxNumber) {
				image=new getObj('Image1');
			}
			j++;
		}
	}

	if ((typeof(image2Text)!="undefined") && document.images['Image2']) {
		for (i=0; i<image2Text.length; i++) {
			if (j==textBoxNumber) {
				image=new getObj('Image2');
			}
			j++;
		}
	}

	return image;
}

function getTextBoxIntersects(textbox,textboxRect) {

	var textBoxID = textbox.id;
	var textBoxNumber = parseInt(textBoxID.replace("textbox",""));

	var i=0;
	var j=1;
	var textBoxIntersects;
	if (typeof(image1Text)!="undefined") {
		for (i=0; i<image1Text.length; i++) {
			if (j==textBoxNumber) {
				textBoxIntersects=image1Intersects[i];
				var page=new getObj('Image1');
				var pageLeft=findPosX(page.obj);
				var pageTop=findPosY(page.obj);
				var pageWidth = page.obj.width;
				var pageHeight = page.obj.height;
			}
			j++;
		}
	}

	if ((typeof(image2Text)!="undefined") && document.images['Image2']) {
		for (i=0; i<image2Text.length; i++) {
			if (j==textBoxNumber) {
				textBoxIntersects=image2Intersects[i];
				var page=new getObj('Image2');
				var pageLeft=findPosX(page.obj);
				var pageTop=findPosY(page.obj);
				var pageWidth = page.obj.width;
				var pageHeight = page.obj.height;
			}
			j++;
		}
	}

	var intersectDivs="";
	if (textBoxIntersects) {
		for (i=0; i<textBoxIntersects.length; i++) {
			var intersectRect = {left: pageLeft+(textBoxIntersects[i].left*pageWidth), top:pageTop+(textBoxIntersects[i].top*pageHeight), width:textBoxIntersects[i].width*pageWidth, height:textBoxIntersects[i].height*pageHeight};

			// FIX - FOR TESTING ONLY
			//var test = document.createElement("div");
			//test.id='test';
			//test.style.position='absolute';
			//test.style.top=intersectRect.top+"px";
			//test.style.left=intersectRect.left+"px";
			//test.style.height=intersectRect.height+"px";
			//test.style.width=intersectRect.width+"px";
			//test.style.background='red';
			//test.style.zIndex=10;
			//document.body.appendChild(test);

			var intersectsTB = intersects(textboxRect,intersectRect);
			if (intersectsTB) {
				var croppedRect=getIntersectRect(textboxRect,intersectRect,textBoxIntersects[i].align);
				var croppedRectWidth=croppedRect.right-croppedRect.left;
				var croppedRectHeight=croppedRect.bottom-croppedRect.top;

				// FIX - FOR TESTING ONLY
				//var test2 = document.createElement("div");
				//test2.id='test2';
				//test2.style.position='absolute';
				//test2.style.top=croppedRect.top+"px";
				//test2.style.left=croppedRect.left+"px";
				//test2.style.height=croppedRectHeight+"px";
				//test2.style.width=croppedRectWidth+"px";
				//test2.style.background='green';
				//test2.style.zIndex=11;
				//document.body.appendChild(test2);

				intersectDivs+='<div style="visibility:hidden;';
				//intersectDivs+='<div style="background:green;';
				intersectDivs+='width:'+croppedRectWidth+'px;';
				intersectDivs+='height:'+croppedRectHeight+'px;';

				// top left
				if (textBoxIntersects[i].align=="topleft") {
					intersectDivs+='float:left">';
				}

				// top right
				else if (textBoxIntersects[i].align=="topright") {
					intersectDivs+='float:right">';
				}

				// bottom left
				// FIX: doesn't work because positioned absolutely
				else if (textBoxIntersects[i].align=="bottomleft") {
					intersectDivs+='position:absolute;bottom:0">';
				}

				//bottom right
				// FIX: doesn't work because positioned absolutely
				else if (textBoxIntersects[i].align=="bottomright") {
					intersectDivs+='position:absolute;bottom:0;right:0">';
				}

				else {
					intersectDivs+='float:left">';
				}

				intersectDivs+='</div>';
			}
		}
	}

	return intersectDivs;
}

function getFontSize(fontScale) {
	var pageHeight=getPageHeight();
	if (fontScale==0) {
		fontScale=0.02;
	}
	var fontSize=Math.round(fontScale*pageHeight);
	return fontSize;
}

//-----------------------------------------------------------
// PopoutText
//-----------------------------------------------------------

var TEXTBOX_BORDER_COLOR = "green";
var TEXTBOX_BORDER_STYLE = "dashed";
var TEXTBOX_BORDER_WIDTH = 2;
var TEXTBOX_MESSAGE_FONT_SIZE = 12;
var TEXTBOX_MESSAGE_FONT_WEIGHT = "normal";
var TEXTBOX_MESSAGE_FONT_COLOR = TEXTBOX_BORDER_COLOR;
var POPOUTTEXT_BORDER_COLOR = "black";
var POPOUTTEXT_BORDER_STYLE = "solid";
var POPOUTTEXT_BORDER_WIDTH = 2;
var POPOUTTEXT_SCALE = 2;
var USE_HEADERAREA = true;

// CHANG: use this global variable to keep current scale, POPOUTTEXT_SCALE is always constant
var gPopoutTextScale = POPOUTTEXT_SCALE;  

if (screen.width<=SMALL_SCREEN_WIDTH) {
        var POPOUTTEXT_SCALE = 2.5;
}

function initPopoutText(createPopouts) {

	var i=0;

	// delete any existing text boxes
	if (typeof(gTextBoxCount)!="undefined") {
		for (i=0; i<gTextBoxCount; i++) {
			deleteTextBox("textbox"+(i+1));
		}
	}

	gTextBoxCount=0;

	// create text boxes if *not* zoomed in
	if (!gZoomedIn) {

		// if page rotated, rotate popout definitions
		if (gRotated && (typeof(image1TextBoxes)!="undefined")) {
			rotatePopoutDefns();
		}

		gPopoutTextScale=getPopoutScale();

		var j=1;
		var image1TextBoxesCount=0;
		if (typeof(image1TextBoxes)!="undefined") {
			var page=new getObj('Image1');
			var pageLeft=findPosX(page.obj);
			var pageTop=findPosY(page.obj);
			var pageWidth = page.obj.width;
			var pageHeight = page.obj.height;
			for (i=0; i<image1TextBoxes.length; i++) {
				var boxLeft = image1TextBoxes[i].left * pageWidth;
				var boxTop = image1TextBoxes[i].top * pageHeight;
				var boxWidth = image1TextBoxes[i].width * pageWidth;
				var boxHeight = image1TextBoxes[i].height * pageHeight;
				var textBoxDim={top:pageTop+boxTop,left:pageLeft+boxLeft,width:boxWidth,height:boxHeight};
				createTextBoxForPopout("textbox"+j,textBoxDim,createPopouts);
				j++;
			}
			image1TextBoxCount=image1TextBoxes.length;
			gTextBoxCount=image1TextBoxCount;
		}

		if ((typeof(image2TextBoxes)!="undefined") && document.images['Image2']) {

			var page=new getObj('Image2');
			var pageLeft=findPosX(page.obj);
			var pageTop=findPosY(page.obj);
			var pageWidth = page.obj.width;
			var pageHeight = page.obj.height;
			for (i=0; i<image2TextBoxes.length; i++) {
				var boxLeft = image2TextBoxes[i].left * pageWidth;
				var boxTop = image2TextBoxes[i].top * pageHeight;
				var boxWidth = image2TextBoxes[i].width * pageWidth;
				var boxHeight = image2TextBoxes[i].height * pageHeight;
				var textBoxDim={top:pageTop+boxTop,left:pageLeft+boxLeft,width:boxWidth,height:boxHeight};
				createTextBoxForPopout("textbox"+j,textBoxDim,createPopouts);
				j++;
			}
			gTextBoxCount+=image2TextBoxes.length;
		}
	}
}

function rotatePopoutDefns() {

	var page=new getObj('Image1');
	var relPageWidth=1;
	var relPageHeight=page.obj.height/page.obj.width;

	for (i=0; i<image1TextBoxes.length; i++) {
		if (image1TextBoxes[i].rotate=='null' || image1TextBoxes[i].rotate=='cw') {
			var rLeft = relPageWidth-(image1TextBoxes[i].top+image1TextBoxes[i].height);
			var rTop = image1TextBoxes[i].left;
			var rWidth = image1TextBoxes[i].height;
			var rHeight = image1TextBoxes[i].width;
		}
		else {
			var rLeft = image1TextBoxes[i].top;
			var rTop = relPageHeight-(image1TextBoxes[i].left+image1TextBoxes[i].width);
			var rWidth = image1TextBoxes[i].height;
			var rHeight = image1TextBoxes[i].width;
		}

		image1TextBoxes[i].left=rLeft;
		image1TextBoxes[i].top=rTop;
		image1TextBoxes[i].width=rWidth;
		image1TextBoxes[i].height=rHeight;
	}
}

function createTextBoxForPopout(id,dim,createPopout) {
	var textboxInside = document.createElement("div");
	textboxInside.id = id+"_inside";
	textboxInside.style.margin = "0px";
	textboxInside.style.padding = "0px";
	textboxInside.style.background = isIE ? "white" : "transparent";
	textboxInside.style.borderWidth = "0px";
	textboxInside.style.borderStyle = "none";
	if (isIE) textboxInside.style.filter = "alpha(opacity=1)";

	var img = document.images['Image1'];
	var imgZIndex = img.style.zIndex;

	var textbox = document.createElement("div");
	textbox.id = id;
	textbox.style.position = "absolute";
	textbox.style.margin = "0px";
	textbox.style.padding = "0px";
	textbox.style.background = "transparent";
	textbox.style.borderStyle = TEXTBOX_BORDER_STYLE;
	textbox.style.borderWidth = TEXTBOX_BORDER_WIDTH + "px";
	textbox.style.borderColor = TEXTBOX_BORDER_COLOR;
	textbox.style.zIndex=imgZIndex+1;

	textbox.style.left=dim.left+"px";
	textbox.style.top=dim.top+"px";
	textboxInside.style.width=dim.width+"px";
	textboxInside.style.height=dim.height+"px";

	textbox.onmouseover = mouseOverTextBox;
	textbox.onmouseout = mouseOutTextBox;
	if (createPopout) textbox.onclick = clickTextBox;

	textbox.appendChild(textboxInside);
	document.body.appendChild(textbox);

	var message = document.createElement("div");
	message.id = textbox.id+'_message';
	message.style.position = "absolute";
	message.style.margin = "0px";
	message.style.padding = "0px";
	message.style.background = "transparent";
	message.style.fontSize = TEXTBOX_MESSAGE_FONT_SIZE + "px";
	message.style.fontWeight = TEXTBOX_MESSAGE_FONT_WEIGHT;
	message.style.color = TEXTBOX_MESSAGE_FONT_COLOR;
	message.style.zIndex=imgZIndex+1;
	message.style.left=textbox.style.left;
	var textboxTop=textbox.style.top.replace("px","");
	message.style.top=textboxTop-(TEXTBOX_MESSAGE_FONT_SIZE*1.5)+"px";
	document.body.appendChild(message);

	hideTextBox(textbox);
	if (createPopout) createPopoutText(textbox);
}

function deleteTextBox(id) {

	if (isValidObj(id)) {
		var textbox = document.getElementById(id);
		document.body.removeChild(textbox);
	}

	if (isValidObj(id+"_message")) {
		var textboxMessage = document.getElementById(id+"_message");
		document.body.removeChild(textboxMessage);
	}

	if (isValidObj(id+"_popout")) {
		var popout = document.getElementById(id+"_popout");
		document.body.removeChild(popout.parentNode);
	}
}

function mouseOverTextBox() {
	var zoomIn=document.images['zoomin'].src;
	var index=zoomIn.lastIndexOf('/');
	var baseUrl=zoomIn.substr(0,index);
	var textbox=document.getElementById(this.id);
	textbox.style.cursor="url("+baseUrl+"/zoomin.cur), pointer;";
	showTextBoxWithMessage(textbox,"Click to enlarge text");
}

function mouseOutTextBox() {
	var textbox=document.getElementById(this.id);
	hideTextBox(textbox);
}

function clickTextBox() {
	var textbox=document.getElementById(this.id);
	showPopoutText(textbox);
}

function showTextBox(textbox) {
	var message = document.getElementById(textbox.id+'_message');
	var msg = message.innerHTML;
	if (msg==null) msg = "";
	showTextBoxWithMessage(textbox,msg);	
}

function showTextBoxWithMessage(textbox,msg) {
	textbox.style.borderStyle = TEXTBOX_BORDER_STYLE;

	var message=document.getElementById(textbox.id+'_message');

	// do not show message if page size too small
	if (gPageSize<=3) {
		msg="";
	}
	message.innerHTML = msg;

	if (gTextBoxToFade!=null) {
		gStopFading=true;
	}
}

function fadeTextBox() {
	window.clearTimeout(gTextBoxTimeout);
	gFadingTextBoxOpacity-=10;
	var message = document.getElementById(gTextBoxToFade.id+"_message");
	setOpacity(gTextBoxToFade,gFadingTextBoxOpacity);
	setOpacity(message,gFadingTextBoxOpacity);

	if (gStopFading) {
		setOpacity(gTextBoxToFade,100);
		setOpacity(message,100);
		gTextBoxToFade=null;
		gStopFading=false;
	}
	else if (gFadingTextBoxOpacity>0) {
		gTextBoxTimeout = window.setTimeout("fadeTextBox()",200);
	}
	else {
		hideTextBox(gTextBoxToFade);
		setOpacity(gTextBoxToFade,100);
		setOpacity(message,100);
		gTextBoxToFade=null;
	}
}

function hideTextBox(textbox) {
	textbox.style.borderStyle = "none";
	var message = document.getElementById(textbox.id+'_message');
	message.innerHTML = "";
}

function createPopoutText(textbox) {
	var textboxWidth=textbox.style.width;
	textboxWidth=textboxWidth.replace("px","");
	var textboxHeight=textbox.style.height;
	textboxHeight=textboxHeight.replace("px","");

	var zoomOut=document.images['zoomout'].src;
	var index=zoomOut.lastIndexOf('/');
	var baseUrl=zoomOut.substr(0,index);

	var div = document.createElement('div');
	div.style.cursor = "url("+baseUrl+"/zoomout.cur), pointer;";
	div.style.position = "absolute";
	div.style.zIndex = textbox.style.zIndex+1;
	div.style.padding = "0px";
	div.style.margin = "0px";
	div.style.top = textbox.offsetTop + "px";
	div.style.left = textbox.offsetLeft + "px";
	div.style.display = "none";
	
	var li = new Image;
	li.id = textbox.id + "_popout"
	li.onclick = clickPopoutText;
		
	var popoutScale = getPopoutScale();
	li.width = Math.round(textboxWidth * popoutScale);    
	li.height = Math.round(textboxHeight * popoutScale);
	li.style.borderStyle = POPOUTTEXT_BORDER_STYLE;
	li.style.borderColor = POPOUTTEXT_BORDER_COLOR;
	li.style.borderWidth = POPOUTTEXT_BORDER_WIDTH + "px";
	div.appendChild(li);
	document.body.appendChild(div);
}

function clickPopoutText(e) {
	var popoutText = document.getElementById(this.id);
	hidePopoutText(popoutText);
}

function showPopoutText(textbox) {
	
	if (gVisiblePopoutText) {
		hidePopoutText(gVisiblePopoutText);
	}

	var popoutText = document.getElementById(textbox.id+"_popout");
	var popoutTextDiv = popoutText.parentNode;
	
	/*
	if (popoutScrolling()) {
		var textboxInside = document.getElementById(textbox.id+"_inside");
		var containerWidth = parseInt(textboxInside.style.width.replace("px", "")) * getPopoutScale();
		// FIX: containerHeight could be larger than pic height
		var containerHeight = containerWidth / ASPECT_RATIO;
		
		popoutContainerSize = { 
			width : containerWidth,
			height :  containerHeight
		};
		popoutTextDiv.removeChild(popoutText); // remove old child
		
		popoutText = createScrollableText(textbox.id, popoutContainerSize);
		popoutText.onclick = clickPopoutText;
		
		popoutText.style.borderStyle = POPOUTTEXT_BORDER_STYLE;
		popoutText.style.borderColor = POPOUTTEXT_BORDER_COLOR;
		popoutText.style.borderWidth = POPOUTTEXT_BORDER_WIDTH + "px";
		popoutTextDiv.appendChild(popoutText);

	}
	*/
	
	popoutTextDiv.style.top = textbox.style.top;
	popoutTextDiv.style.left = textbox.style.left;

	// get available canvas area for popout
	//
	var canvasDim = getCanvasDimensions();
	var canvasRect = getCanvasRect(canvasDim);

	// get center of text box
	//
	var textboxInside = document.getElementById(textbox.id+"_inside");
	var left = parseInt(textbox.style.left.replace("px",""));
	var top = parseInt(textbox.style.top.replace("px",""));
	var width = parseInt(textboxInside.style.width.replace("px",""));
	var height = parseInt(textboxInside.style.height.replace("px",""));
	var center = {x: left+(width/2), y: top+(height/2)};

	// get popout dimensions
	//
	var popoutScale = getPopoutScale();
	var popoutDim = {width: Math.round(width * popoutScale), height: Math.round(height * popoutScale)};
	/*
	if (popoutScrolling()) {
		var container = document.getElementById(textbox.id+"_viewport");
		popoutDim = {
			width: container.style.width.replace("px", ""), 
			height: container.style.height.replace("px", "")
		};
	}
	*/

	// position popout
	//
	var move = false;
	while (true) {
		var popoutRect = {
			top: Math.round(center.y-(popoutDim.height/2)), 
			left: Math.round(center.x-(popoutDim.width/2)),
			bottom: Math.round(center.y+(popoutDim.height/2)), 
			right: Math.round(center.x+(popoutDim.width/2))};

		// check if popout is completely inside available canvas
		if (popoutRect.top>=canvasRect.top && popoutRect.left>=canvasRect.left && popoutRect.bottom<=canvasRect.bottom && popoutRect.right<=canvasRect.right) {
			break;
		} 

		// check if popout is smaller than available canvas
		else if (popoutDim.width<=canvasDim.width && popoutDim.height<=canvasDim.height) {
			move = true;
			break;
		}
		
		else if (popoutDim.width<=canvasDim.width && popoutScrolling()) {
			move = true;
			break;
		}

		else { // scale popoutDim so both its width and height fit into the corrent canvas
			var rw = popoutDim.width/canvasDim.width;
			var rh = popoutDim.height/canvasDim.height;
			if (rw > rh) {
				popoutDim.width = Math.round(popoutDim.width/rw);
				popoutDim.height = Math.round(popoutDim.height/rw);
			} 
			else {
				popoutDim.width = Math.round(popoutDim.width/rh);
				popoutDim.height = Math.round(popoutDim.height/rh);
			}
			popoutText.width = popoutDim.width;
			popoutText.height = popoutDim.height;
			move = true;
		}
	}

	if (move) {
		if (popoutRect.top < canvasRect.top) popoutRect.top = canvasRect.top;
		if (popoutRect.left < canvasRect.left) popoutRect.left = canvasRect.left;
		if (popoutRect.bottom > canvasRect.bottom && !popoutScrolling()) popoutRect.top = popoutRect.top - (popoutRect.bottom - canvasRect.bottom);
		if (popoutRect.right > canvasRect.right) popoutRect.left = popoutRect.left - (popoutRect.right - canvasRect.right);
	}

	var image1TextBoxCount=0;
	var image2TextBoxCount=0;
	if (typeof(image1TextBoxes)!="undefined") {
		image1TextBoxCount = image1TextBoxes.length;
	}
	if (typeof(image2TextBoxes)!="undefined") {
		image2TextBoxCount = image2TextBoxes.length;
	}

	var textBoxCount=image1TextBoxCount;
	var textBoxNumber = getTextBoxNumber(popoutText.id);
	if (textBoxNumber<=textBoxCount) {
		var image=document.images['Image1'];
		if (popoutScrolling()) {
			//setPopoutTextSrc(popoutText, getPopoutUrl(image.src,""+textBoxNumber));
			popoutText.src = getPopoutUrl(image.src,""+textBoxNumber);
		} else {
			popoutText.src = getPopoutUrl(image.src,""+textBoxNumber);
		}
	}
	else if (document.images['Image2']) {
		var image=document.images['Image2'];
		if (popoutScrolling()) {
			popoutText.src = getPopoutUrl(image.src,""+(textBoxNumber-textBoxCount));
			//setPopoutTextSrc(popoutText, getPopoutUrl(image.src,""+(textBoxNumber-textBoxCount)));
		} else {
			popoutText.src = getPopoutUrl(image.src,""+(textBoxNumber-textBoxCount));
		}
	}

	//alert(getPopoutUrl(image.src,""+textBoxNumber)+',width='+popoutDim.width+',height='+popoutDim.height+',popoutScale='+popoutScale);

	popoutTextDiv.style.top = popoutRect.top + "px";
	popoutTextDiv.style.left = popoutRect.left + "px";
	popoutText.style.width = popoutDim.width + "px";
	popoutText.style.height = popoutDim.height + "px";
	popoutTextDiv.style.display = "block";

	gVisiblePopoutText = popoutText;

	// NOT WORKING
	// popout disappears when changing between fullscreen mode
	// need to store a cookie since fullscreen mode handled by servlet - not all js
	// not sure where to read cookie for desired behavior
	//createCookie("icdlVisiblePopoutText",popoutText.id);
}

function hidePopoutText(popoutText) {
	var popoutTextDiv = popoutText.parentNode;
	popoutTextDiv.style.display = "none";
	gVisiblePopoutText = null;
	//deleteCookie("icdlVisiblePopoutText","");
}

function showNextPopoutText(next) { 
	if (gVisiblePopoutText!=null) {
		var index=getVisiblePopoutIndex();
		index++;	
		if (index<=gTextBoxCount) {
			var textbox=document.getElementById("textbox"+index);
			showPopoutText(textbox);
		}
		else {
			window.location=updateUrl(next);
		}
	}
	else {
		var textbox=document.getElementById("textbox1");
		showPopoutText(textbox);
	}
}

function showPrevPopoutText(prev) {
	if (gVisiblePopoutText!=null) {
		var index=getVisiblePopoutIndex();
		index--;	
		if (index>=1) {
			var textbox=document.getElementById("textbox"+index);
			showPopoutText(textbox);
		}
		else {
			window.location=updateUrl(prev);
		}
	}
	else {
		var textbox=document.getElementById("textbox"+gTextBoxCount);
		showPopoutText(textbox);
	}
}

function getPopoutTextSize() {
	var size = Math.floor(gPageSize*gPopoutTextScale);
	if (!gAvailablePopoutSizes[size-1]) {
		var availableSize = getPreviousAvailablePopoutSize(size);
		if (availableSize==-1) {
			availableSize=getNextAvailablePopoutSize(size);
		}
		size=availableSize;
	}
	return size;
}

function getPopoutUrl(url, id) {
	var popoutTextSize = getPopoutTextSize();
	var textBoxNumber = getTextBoxNumber(id);
	var popoutUrl = url.replace("thumbs2",gPopoutSubdir);
	popoutUrl = popoutUrl.replace(/-thumb.*$/g,"-thumb"+popoutTextSize+".jpg");
	popoutUrl = popoutUrl.replace(".jpg","-popout"+textBoxNumber+".jpg");
	return popoutUrl;
}

function getTextBoxNumber(id) {
	var number = id.replace("_popout","");
	number = id.replace("textbox","");
	return parseInt(number);
}

function getPopoutScale() {
	var popoutScale = getNoScrollPopoutScale();
	if (!popoutScrolling()) return popoutScale;
	
	var maxPopoutScale = BIG_INT;

	if ((typeof(image1TextBoxes)!="undefined") && document.images['Image1']) 	
		maxPopoutScale = Math.min(maxPopoutScale, findMaxPopoutScaleByWidth(image1TextBoxes, 'Image1'));

	if ((typeof(image2TextBoxes)!="undefined") && document.images['Image2']) 	
		maxPopoutScale = Math.min(maxPopoutScale, findMaxPopoutScaleByWidth(image2TextBoxes, 'Image2'));
	
	popoutScale = adjustScrollingPopoutScale(popoutScale, maxPopoutScale);
	
	return popoutScale;
}

function adjustScrollingPopoutScale(popoutScale, maxPopoutScale) {
	popoutScale = adjustPopoutScale(popoutScale, maxPopoutScale);
	popoutScale = Math.min(popoutScale, MAX_SCROLL_SIZE / gPageSize);
	return popoutScale;
}

function findMaxPopoutScaleByWidth(textboxArray, pageName) {
	var canvasDim = getCanvasDimensions();
	var maxPopoutScale = BIG_INT;
	if ((typeof(textboxArray) != "undefined") && document.images[pageName]) {
		var page = new getObj(pageName);
		var pageWidth = page.obj.width;
		for (i = 0; i < textboxArray.length; i++) {
			var boxWidth = textboxArray[i].width * pageWidth;
			var maxPopoutScaleForBox = canvasDim.width /  boxWidth;
			maxPopoutScale = Math.min(maxPopoutScale, maxPopoutScaleForBox);
		}
	}
	return maxPopoutScale;
}

function getNoScrollPopoutScale() {

	var popoutScale = POPOUTTEXT_SCALE;
	var maxPopoutScale = BIG_INT;

	if ((typeof(image1TextBoxes)!="undefined") && document.images['Image1']) 	
		maxPopoutScale = Math.min(maxPopoutScale, findMaxPopoutScale(image1TextBoxes, 'Image1'));

	if ((typeof(image2TextBoxes)!="undefined") && document.images['Image2']) 	
		maxPopoutScale = Math.min(maxPopoutScale, findMaxPopoutScale(image2TextBoxes, 'Image2'));

	popoutScale = adjustPopoutScale(popoutScale, maxPopoutScale);

	return popoutScale;
}

function findMaxPopoutScale(textboxArray, pageName) {
	var canvasDim = getCanvasDimensions();
	var maxPopoutScale = BIG_INT;
	if ((typeof(textboxArray)!="undefined") && document.images[pageName]) {
		var page=new getObj(pageName);
		// FIX: chek if pageLeft and pageTop are used
		var pageLeft=findPosX(page.obj);
		var pageTop=findPosY(page.obj);
		// FIX end
		
		var pageWidth = page.obj.width;
		var pageHeight = page.obj.height;
		for (i=0; i<textboxArray.length; i++) {
			var boxWidth = textboxArray[i].width * pageWidth;
			var boxHeight = textboxArray[i].height * pageHeight;
			var maxPopoutScaleForBox = getMaxPopoutScale(canvasDim.width,canvasDim.height,boxWidth,boxHeight);
			maxPopoutScale = Math.min(maxPopoutScale, maxPopoutScaleForBox);
		}
	}
	return maxPopoutScale;
}

function adjustPopoutScale(popoutScale, maxPopoutScale) {
	if (gPageSize<=5) {
		popoutScale = maxPopoutScale;
	}

	// check if default popout size is too big
	else if (popoutScale > maxPopoutScale) {
		popoutScale = maxPopoutScale;
	}

	// check if popoutScale requires larger popout image than is available
	if ((gPageSize*popoutScale) > MAX_POPOUT_SIZE) {
		popoutScale = MAX_POPOUT_SIZE/gPageSize;
	}

	// adjust scale to work with available popout sizes, if needed
	var size=Math.floor(popoutScale*gPageSize);
	if (!gAvailablePopoutSizes[size-1]) {
		var popoutTextSize=getPopoutTextSize();
		var idealPopoutScale=popoutTextSize/gPageSize;
		if (popoutScale>idealPopoutScale) {
			popoutScale=idealPopoutScale;
		}
	}

	return popoutScale;
}

function getMaxPopoutScale(windowWidth,windowHeight,textBoxWidth,textBoxHeight) {

	var maxPopoutScale;
	var maxPopoutDimension = gPageSize*gIncrement;
	var portrait = textBoxWidth<textBoxHeight;

	// available window space - portrait
	if (windowWidth<windowHeight) {
		// portrait text box
		if (portrait) {
			maxPopoutDimension=windowHeight;
			newTextBoxWidth=textBoxWidth*(maxPopoutDimension/textBoxHeight);
			if (newTextBoxWidth>windowWidth) {
				maxPopoutDimension=textBoxHeight*(windowWidth/textBoxWidth);
			}
			maxPopoutScale=maxPopoutDimension/textBoxHeight;
		}
		// landscape textbox
		else {
			maxPopoutDimension=windowWidth;
			maxPopoutScale=maxPopoutDimension/textBoxWidth;
		}
	}
	// available window space - landscape
	else {	
		// portrait textbox
		if (portrait) {
			maxPopoutDimension=windowHeight;
			maxPopoutScale=maxPopoutDimension/textBoxHeight;
		}
		// landscape textbox
		else {
			maxPopoutDimension=windowWidth;
			newTextBoxHeight=textBoxHeight*(maxPopoutDimension/textBoxWidth);
			if (newTextBoxHeight>windowHeight) {
				maxPopoutDimension=textBoxWidth*(windowHeight/textBoxHeight);
			}
			maxPopoutScale=maxPopoutDimension/textBoxWidth;
		}
	}

	var popoutTextSize = maxPopoutScale*gPageSize;
	if (popoutTextSize>MAX_POPOUT_SIZE) {
		popoutTextSize=MAX_POPOUT_SIZE;
		maxPopoutScale=popoutTextSize/gPageSize;
	}
	
	return maxPopoutScale;
}

function getVisiblePopoutIndex() {
	var index=0;
	if (gVisiblePopoutText!=null) {
		var id = gVisiblePopoutText.id;
                id=id.replace('textbox','');
                id=id.replace('_popout','');
		index=parseInt(id);
	}
	return index;
}

//-----------------------------------------------------------
// UTILITIES
//-----------------------------------------------------------

function popup(name, url, width, height) {
    var popupwin = window.open(url,name,"width="+width+",height="+height+",scrollbars=no,resizable=yes,location=no,toolbar=no,menubar=no")
    popupwin.focus()
}

function getBookID() {
	var bookID = null;
	if (isValidObj('Image1')) {
        	bookID=document.images['Image1'].src;
		bookID=bookID.replace(/^.*\//,"");
		bookID=bookID.replace(/-.*$/,"");
	}
	return bookID;
}

// get a named object on the page
// from http://www.quirksmode.org/js/cross_dhtml.html
function getObj(name) {
	if (document.getElementById) {
		this.obj = document.getElementById(name);
		this.style = document.getElementById(name).style;
	}
	else if (document.all) {
		this.obj = document.all[name];
		this.style = document.all[name].style;
	}
	else if (document.layers) {
		this.obj = document.layers[name];
		this.style = document.layers[name];
	}
}

// decide if an element exists on the page
function isValidObj(name) {
	if (document.getElementById) {
	return (document.getElementById(name)!=null); 
	}
	else if (document.all) {
	return (document.all[name]!=null);
	}
	else if (document.layers) {
	return (document.layers[name]!=null);
	}
	return false;
}

// get the absolute page x position of obj
// from http://www.quirksmode.org/js/findpos.html
function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

// get the absolute page y position of obj
// from http://www.quirksmode.org/js/findpos.html
function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
	  while (obj.offsetParent) {
		curtop += obj.offsetTop
	obj = obj.offsetParent;
	  }
	}
	else if (obj.y)
	  curtop += obj.y;
	return curtop;
}

// get window dimensions
function getWindowDim() {
	if (window.innerWidth) {
		// subtract width of vertical scrollbar
		gWindowWidth=window.innerWidth-25;
		gWindowHeight=window.innerHeight;
	}
	else { 
		gWindowWidth = document.body.clientWidth;
		gWindowHeight = document.body.clientHeight;
	}
}

function showObj(name) {
      if (isValidObj(name)) {
              var obj=document.getElementById(name);
              obj.style.display='block';
              obj.style.visibility='visible';
      }
}

function hideObj(name) {
      if (isValidObj(name)) {
              var obj=document.getElementById(name);
              obj.style.display='none';
              obj.style.visibility='hidden';
      }
}

// mouseover image action
function img_act(name,path) {
	if (DHTML) {
		var img=new getObj(name);
		var src=img.obj.src;
		var imgstart=src.indexOf("images")+7;
		var imgend=src.indexOf(".gif");
		if (imgend>-1 && src.indexOf("gray")==-1) {
			var shortSrc=src.substring(imgstart,imgend);
			var imgOn=new Image();
			imgOn.src=path+shortSrc+"_over.gif";
			img.obj.src=imgOn.src;
		}
	}
}

// mouseout image action
function img_inact(name,path) {
	if (DHTML) {
		var img=new getObj(name);
		var src=img.obj.src;
		var imgstart=src.indexOf("images")+7;
		var imgend=src.indexOf("_over.gif");
		if (imgend>-1) {
			var shortSrc=src.substring(imgstart,imgend);
			var imgOff=new Image();
			imgOff.src=path+shortSrc+".gif";
			img.obj.src=imgOff.src;
		}
	}
}

// mouseover image action
function png_act(name,path) {
	if (DHTML) {
		var img=new getObj(name);
		var src=img.obj.src;
		var imgstart=src.indexOf("images")+7;
		var imgend=src.indexOf(".png");
		if (imgend>-1 && src.indexOf("gray")==-1) {
			var shortSrc=src.substring(imgstart,imgend);
			var imgOn=new Image();
			imgOn.src=path+shortSrc+"_over.png";
			img.obj.src=imgOn.src;
		}
	}
}

// mouseout image action
function png_inact(name,path) {
	if (DHTML) {
		var img=new getObj(name);
		var src=img.obj.src;
		var imgstart=src.indexOf("images")+7;
		var imgend=src.indexOf("_over.png");
		if (imgend>-1) {
			var shortSrc=src.substring(imgstart,imgend);
			var imgOff=new Image();
			imgOff.src=path+shortSrc+".png";
			img.obj.src=imgOff.src;
		}
	}
}

// get url parameter 
function getUrlParamFromUrl(url,name) {
	var paramValue="";
	var paramStartIndex=url.indexOf(name+'=');
	if (paramStartIndex!=-1) {
		url=url.substring(paramStartIndex,url.length);
		var paramEndIndex=url.indexOf('&');
		if (paramEndIndex==-1)
			paramEndIndex=url.length;
		paramToken = url.substring(0,paramEndIndex);
		paramValue = paramToken.substring(name.length+1,paramToken.length);
	}
	return paramValue;
}

function getUrlParam(name) {
	var url=""+document.location;
	return getUrlParamFromUrl(url,name);
}

// update url with given value
function updateUrlWithValueForUrl(url,name,value) {
	var start=url.indexOf(name+'=');
	if (start!=-1) {
		var shorturl=url.substring(start);
		var end=shorturl.indexOf('&');
		if (end==-1)
			end=shorturl.length;
		var currvalue=shorturl.substring(0,end);
		var newvalue=name+'='+value;
		if (value!=null && value!="") {
			url=url.replace(currvalue,newvalue);
		}
		else {
			url=url.replace(currvalue,'');
			url=url.replace('&&','&');
		}
	}
	else {
		url+='&'+name+'='+value;
	}
	return url;
}

function updateUrlWithValue(name,value) {
	var url=""+document.location;
	return updateUrlWithValueForUrl(url,name,value);
}

// remove url parameters
function removeUrlParams(url) {
	var index=url.indexOf('?');
	if (index!=-1)
		url=url.substring(0,index);
	return url;
}

function getInterfaceLanguage() {
	var ilang = getUrlParam('ilang');
	if (ilang == "") ilang = 'English';
	return ilang;
}

function isInterfaceLangRightToLeft() {
        var ilang=getInterfaceLanguage();
        return (ilang=="Hebrew" || ilang=="Arabic" || ilang.indexOf("Persian")>-1);
}

// display zoom in button (gray out)
function grayOutZoomIn() {
        if (isValidObj('zoomin')) {
                var zoomIn=document.images['zoomin'].src;
                var grayOut=new Image();
                grayOut.src=zoomIn.replace('zoomin_over','zoomin_gray');
                if (grayOut.src.indexOf('zoomin_gray')==-1)
                        grayOut.src=grayOut.src.replace('zoomin','zoomin_gray');
                document.images['zoomin'].src=grayOut.src;
        }

        if (isValidObj('zoomin_fs')) {
                var zoomInFs=document.images['zoomin_fs'].src;
                var grayOutFs=new Image();
                grayOutFs.src=zoomInFs.replace('zoomin_fs_over','zoomin_fs_gray');
                if (grayOutFs.src.indexOf('zoomin_fs_gray')==-1)
                        grayOutFs.src=grayOutFs.src.replace('zoomin_fs','zoomin_fs_gray');
                document.images['zoomin_fs'].src=grayOutFs.src;
        }
}

// enable zoom in button (ungray)
function unGrayZoomIn() {
        if (isValidObj('zoomin')) {
                var zoomIn=document.images['zoomin'].src;
                var unGray=new Image();
                unGray.src=zoomIn.replace('zoomin_gray','zoomin');
                document.images['zoomin'].src=unGray.src;
        }

        if (isValidObj('zoomin_fs')) {
                var zoomInFs=document.images['zoomin_fs'].src;
                var unGrayFs=new Image();
                unGrayFs.src=zoomInFs.replace('zoomin_fs_gray','zoomin_fs');
                document.images['zoomin_fs'].src=unGrayFs.src;
        }
}

// display zoom out button (gray out)
function grayOutZoomOut() {
	if (isValidObj('zoomout')) {
		var zoomOut=document.images['zoomout'].src;
		var grayOut=new Image();
		grayOut.src=zoomOut.replace('zoomout_over','zoomout_gray');
		if (grayOut.src.indexOf('zoomout_gray')==-1)
			grayOut.src=grayOut.src.replace('zoomout','zoomout_gray');
		document.images['zoomout'].src=grayOut.src;
	}

	if (isValidObj('zoomout_fs')) {
		var zoomOutFs=document.images['zoomout_fs'].src;
		var grayOutFs=new Image();
		grayOutFs.src=zoomOutFs.replace('zoomout_fs_over','zoomout_fs_gray');
		if (grayOutFs.src.indexOf('zoomout_fs_gray')==-1)
			grayOutFs.src=grayOutFs.src.replace('zoomout_fs','zoomout_fs_gray');
		document.images['zoomout_fs'].src=grayOutFs.src;
	}
}

// enable zoom out button (ungray)
function unGrayZoomOut() {
	if (isValidObj('zoomout')) {
		var zoomOut=document.images['zoomout'].src;
		var unGray=new Image();
		unGray.src=zoomOut.replace('zoomout_gray','zoomout');
		document.images['zoomout'].src=unGray.src;
	}

	if (isValidObj('zoomout_fs')) {
		var zoomOutFs=document.images['zoomout_fs'].src;
		var unGrayFs=new Image();
		unGrayFs.src=zoomOutFs.replace('zoomout_fs_gray','zoomout_fs');
		document.images['zoomout_fs'].src=unGrayFs.src;
	}
}

// display button (gray out)
function grayOutButton(name) {
	if (isValidObj(name)) {
		var btn=document.images[name].src;
		var grayOut=new Image();
		grayOut.src=btn.replace(name+'_over',name+'_gray');
		if (grayOut.src.indexOf(name+'_gray')==-1)
			grayOut.src=grayOut.src.replace(name,name+'_gray');
		document.images[name].src=grayOut.src;
	}

	if (isValidObj(name+'_fs')) {
		var btnFs=document.images[name+'_fs'].src;
		var grayOutFs=new Image();
		grayOutFs.src=btnFs.replace(name+'_fs_over',name+'_fs_gray');
		if (grayOutFs.src.indexOf(name+'_fs_gray')==-1)
			grayOutFs.src=grayOutFs.src.replace(name+'_fs',name+'_fs_gray');
		document.images[name+'_fs'].src=grayOutFs.src;
	}
}

// enable button (ungray)
function unGrayButton(name) {
	if (isValidObj(name)) {
		var btn=document.images[name].src;
		var unGray=new Image();
		unGray.src=btn.replace(name+'_gray',name);
		document.images[name].src=unGray.src;
	}

	if (isValidObj(name+'_fs')) {
		var btnFs=document.images[name+'_fs'].src;
		var unGrayFs=new Image();
		unGrayFs.src=btnFs.replace(name+'_fs_gray',name+'_fs');
		document.images[name+'_fs'].src=unGrayFs.src;
	}
}

function pageNotFound() {
	// if zoom+ should look for next largest image that exists
	if (gZoomingIn)
		gPageSize++;
	else
		gPageSize--;
	changePageSize();
}

function isPortrait() {
	return gCoverWidth<=gCoverHeight;
}

function isTwoPage(img2Src) {
	return (img2Src!=null) && (img2Src!="");
}

function isRightToLeft() {
	return gReadingDirection==2;
}

function getPageWidth() {
	var pageWidth;
	if (isPortrait()) {
		pageHeight = gPageSize*gIncrement;
		pageWidth = (gCoverWidth/gCoverHeight)*pageHeight;
	}
	else {
		pageWidth = gPageSize*gIncrement;
	}
	return pageWidth;
}

function getPageHeight() {
	var pageHeight;
	if (isPortrait()) {
		pageHeight = gPageSize*gIncrement;
	}
	else {
		pageWidth = gPageSize*gIncrement;
		pageHeight = (gCoverHeight/gCoverWidth)*pageWidth;
	}
	return pageHeight;
}

function getHeightForSize(size) {
	var pageHeight;
	if (isPortrait()) {
		pageHeight = size*gIncrement;
	}
	else {
		pageWidth = size*gIncrement;
		pageHeight = (gCoverHeight/gCoverWidth)*pageWidth;
	}
	return pageHeight;
}

function getTopLeft(e) {
        var pt = {top: e.offsetTop, left: e.offsetLeft};
        var op = e.offsetParent;
        if (op) {
                var pt2 = getTopLeft(op);
                pt.top += pt2.top;
                pt.left += pt2.left;
        }
        return pt;
}

// get location of available canvas
function getCanvasRect(canvasDim) {
	var top=0;
	var left=0;
	if (!USE_HEADERAREA) {
		var toptitlebar=document.getElementById('toptitlebar');
		var secondaryheader=document.getElementById('secondaryheader');
		var topHeaderHeight=toptitlebar.offsetHeight;
		var secondaryHeaderHeight=secondaryheader.offsetHeight;
		top+=secondaryHeaderHeight;
		if (!gFullscreen) {
			top+=topHeaderHeight;
		}
	}
	top+=5;
	left+=5;
	return {top: top, left: left, bottom: top+canvasDim.height, right: left+canvasDim.width};
}

// get available canvas dimensions
function getCanvasDimensions() {
	getWindowDim();
	var canvasWidth = gWindowWidth;
	var canvasHeight = gWindowHeight;
	if (!USE_HEADERAREA) {
		var toptitlebar=document.getElementById('toptitlebar');
		var secondaryheader=document.getElementById('secondaryheader');
		var topHeaderHeight=toptitlebar.offsetHeight;
		var secondaryHeaderHeight=secondaryheader.offsetHeight;
		canvasHeight-=secondaryHeaderHeight;
		if (!gFullscreen) {
			canvasHeight-=topHeaderHeight;
		}
	}
	canvasHeight-=10;
	canvasWidth-=10;
	return {width:canvasWidth, height:canvasHeight};
}

// set opacity of element
function setOpacity(e,opacity) {

	gFadingTextBoxOpacity = opacity;

	// Opera and Firefox
	// IE handles opacity differently than Opera and Firefox, so we need two cases.
	if (typeof(e.style.opacity)!="undefined" ) { 
		e.style.opacity = opacity / 100;
		e.style.visibility = "visible";
	}

	// IE
	else if (typeof(e.style.filter)!="undefined" ) {
		e.style.filter = "alpha(opacity="+Math.round(opacity)+")";
		e.style.visibility = "visible";
	}
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function readBooleanCookie(name) {
	var cookie=readCookie(name);
	return (cookie!=null && cookie=="true");
}

function deleteCookie(name) {
	createCookie(name,"",-1);
}

function intersects(r1,r2) {
	return (r1.width>0) && (r1.height>0) && (r2.width>0) && (r2.height>0)
		&& (r1.left<r2.left+r2.width) && (r1.left+r1.width>r2.left)
		&& (r1.top<r2.top+r2.height) && (r1.top+r1.height>r2.top);
}

function getIntersectRect(r1,r2,align) {
// assumes r1 is textbox and r2 is intersect rect

	var r3={left:0, top:0, right:0, bottom:0};
	if (align.substr(0,1)=="'") align=align.substring(1,align.length-1);
	if (intersects(r1,r2)) {

		// left
		if (align=="topleft")
			r3.left = r1.left;
		else
			r3.left = Math.round(Math.max(r1.left, r2.left));

		// top
		r3.top = Math.round(Math.max(r1.top, r2.top))
		if (r1.top < r2.top)
			r3.top = r1.top;

		// right
		if (align=="topright") 
			r3.right = r1.left+r1.width;
		else 
			r3.right = Math.round(Math.min(r1.left+r1.width, r2.left+r2.width));

		// bottom
		r3.bottom = Math.round(Math.min(r1.top+r1.height, r2.top+r2.height));
		if (r2.top+r2.height > r1.top+r1.height)
			r3.bottom = r2.top+r2.height;
	}
	return r3;
}

//-----------------------------------------------------------
// CHANG: SCROLLABLE POPOUTTEXT
//-----------------------------------------------------------
var BIG_INT = 100000;
var SCROLL_ON_SIZE = 10;
var MAX_SCROLL_SIZE = 20;
var ASPECT_RATIO = 1.25;

function popoutScrolling() {
	
	var noScrollTextSize = gPageSize * getNoScrollPopoutScale();
	return (noScrollTextSize < SCROLL_ON_SIZE);

	// CHANG: uncomment this to turn scrolling off
	//return false;

	// DEBUG:
	//return true;
}

function getPopoutScrollDim(textboxWidth, textboxHeight) {
	// TODO: implement
	//alert("not implemented");
	return;
}


function setPopoutTextSrc(popoutContainer, urlString) {
	var imgId = popoutContainer.id.replace("_popout", "_image");
	var img = document.getElementById(imgId);
	img.src = urlString;
	img.onload = setPopoutTextSize;
}

function setPopoutTextSize() {
	var viewportId = this.id.replace("_image", "_viewport");
	var viewport = document.getElementById(viewportId);
	
}

function createScrollableText(idStem, containerSize) {
    var popoutContainer = document.createElement("div");
    popoutContainer.id = idStem + "_popout";

    var image = document.createElement("img");
    image.id = idStem + "_image";
    
    var viewport = document.createElement("div");
    viewport.id = idStem + "_viewport";
    viewport.style.overflow = "hidden";
    
    viewport.onmousedown = viewport_onMouseDown;
    viewport.onmousemove = viewport_onMouseMove;
    viewport.onmouseup = viewport_onMouseUp;

    viewport.appendChild(image);
    popoutContainer.appendChild(viewport);
    
    viewport.style.width = containerSize.width + "px";
    viewport.style.height = containerSize.height + "px";
    
    var buttonsDiv = document.createElement("div");
    buttonsDiv.style.align = "center";
    buttonsDiv.style.width = containerSize.width + "px";
    
    var buttonUp = makeButton(idStem + "_btnUp", "^");
    buttonUp.onmousedown =  buttonUp_onMouseDown;
    buttonUp.onmouseup = buttonUp_onMouseUp;
    buttonsDiv.appendChild(buttonUp);
    
    var buttonDown = makeButton(idStem + "_btnDown", "V");
    buttonDown.onmousedown = buttonDown_onMouseDown;
    buttonDown.onmouseup = buttonDown_onMouseUp;
    buttonsDiv.appendChild(buttonDown);
    
    popoutContainer.appendChild(buttonsDiv);
    
    return popoutContainer;
}

function makeButton(buttonID, buttonText) {
    var btn = document.createElement("input");
    btn.id = buttonID; 
    btn.type = "button"; 
    btn.value = buttonText; 
    return btn;
}

// Events
function viewport_onMouseDown(e) {
    cancelEvent(e);
    var py = pointerY(e);
    document["$#%globalVar-startY"] = py + this.scrollTop;
}

function viewport_onMouseUp(e) {
    cancelEvent(e);
    document["$#%globalVar-startY"] = -1;
}

function viewport_onClick(e) {
	cancelEvent(e);
    var popoutText = document.getElementById(this.id.replace("_viewport", "_popout"));
    popoutText.onclick = clickPopoutText;
		this.onclick = {};
		return false;
}

function viewport_onMouseMove(e) {
    if (typeof(document["$#%globalVar-startY"]) == "undefined") return;
    if (document["$#%globalVar-startY"] == -1) return;
    cancelEvent(e);
    
    this.onclick = viewport_onClick;
    
    var py = pointerY(e);
    var dy = document["$#%globalVar-startY"] - py;
    
    this.scrollTop = dy;
    
}

function buttonUp_onMouseDown(e) {
		cancelEvent(e);
    var viewportID = this.id.split("_")[0] + "_viewport";
    document["$#%globalVar-timer"] = setInterval("document.getElementById('"+ viewportID + "').scrollTop += 2", 15);
}

function buttonDown_onMouseDown(e) {
		cancelEvent(e);
    var viewportID = this.id.split("_")[0] + "_viewport";
    document["$#%globalVar-timer"] = setInterval("document.getElementById('"+ viewportID + "').scrollTop -= 2", 15);
}

function buttonUp_onMouseUp(e) {
		cancelEvent(e);
    clearInterval(document["$#%globalVar-timer"]);
}

function buttonDown_onMouseUp(e) {
		cancelEvent(e);
    clearInterval(document["$#%globalVar-timer"]);
}

// Utils
function cancelEvent(e) {
    if (e.preventDefault) e.preventDefault();
    if (typeof(e.returnValue) != "undefined") e.returnValue = false;
    if (typeof(e.cancelBubble) != "undefined") e.cancelBubble = true;
}

function pointerX(event) {
    return event.pageX || (event.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft));
}

function pointerY(event) {
    return event.pageY || (event.clientY +
          (document.documentElement.scrollTop || document.body.scrollTop));
}

function check_text_for_tag(form,json) {
	if (json.tags) {
		var textValue=form.text ? form.text.value: form.term.value;
		for (i=0; i<json.tags.length; i++) {
			if (json.tags[i]==stripQuotes(textValue)) {
				form.user.value=json.userid;	
				break;
			}
		}
	}
	return true;
}

function stripQuotes(str) {
	var newstr=str;
	if (str.charAt(0)=='"' && str.charAt(str.length-1)=='"') {
		newstr=str.substring(1,str.length-1);
	}
	return newstr;
	
}

//-->
