/*  justaView - a JavaScript-based Album Viewer, version 1.4a
 *  (c) 2007-2012 Rahul Basu, Amit Basu
 *
 *  justaView is freely distributable under the terms of an MIT-style license.
 *--------------------------------------------------------------------------*/

var PHOTO_NAMES = new Array();
var THUMB_PATHS = new Array();
var PHOTO_PATHS = new Array();
var HEIGHTS = new Array();
var WIDTHS  = new Array();
var CAPTIONS  = new Array();
var NUM_PHOTOS = 0;
var CURRENT_PHOTO_INDEX = 0;
var TIMEOUT_HANDLE;
var CURRENT_THUMBNAIL_PAGE = 0;
var SLIDESHOW_TIMEOUT = 4000;

function doDrawPage( pageTitle, nThumbRows, nThumbCols, nPhotos, startFrom ) {
 	document.title = ALBUM_NAME;
 	NUM_PHOTOS = nPhotos;
 	doDrawThumbnails( pageTitle, nThumbRows, nThumbCols, nPhotos, startFrom );
	if (location.hash != "") {
	 	handleHash();
	} else {
		doDrawPhotoByIndex( startFrom );
	}
	document.getElementById('d_thumbnails').style.width = (90 * nThumbCols);
}

function doDrawThumbnails( pageTitle, nThumbRows, nThumbCols, nPhotos, startFrom ) {
 	var index = 0;
 	document.getElementById("d_title").innerHTML = pageTitle;
	str = "<table id='thumbTable'>";
	for (var i=0; i<nThumbRows; i++) {
	 	str += "<tr>";
		for (var j=0; j<nThumbCols; j++) {
		 	index = i*nThumbCols + j + startFrom;
		 	if (index < nPhotos) {
				str += "<td class='thumbnails' id='thumbs' style='background-image:url("+THUMB_PATHS[index]+");' onclick='doDrawPhotoByIndex(" + index + ");' onmouseover='Tip(\""+CAPTIONS[index]+"\");'><span style='position:relative;height:100%;width:100%;' ></span><img style='display:none;' id='thumb"+index+"' width='60' height='60' src='";
				str += THUMB_PATHS[index];
				str += "' /></td>";
			}
		}
		str += "</tr>";
	}
	str += "<tr><td colspan='2'>";
	if (startFrom > 0) {
	 	var temp = startFrom - (nThumbRows * nThumbCols);
	 	str += "<span class='previous' onclick='CURRENT_THUMBNAIL_PAGE--;doDrawThumbnails( \"" + pageTitle + "\", " + nThumbRows + ", " + nThumbCols + ", " + nPhotos + ", " + temp + ", THUMB_PATHS)'><img src='left.png' onmouseover='Tip(\"Previous Page\");' ></span>";
	}
	if (index < (nPhotos-1)) {
		var temp = startFrom + (nThumbRows * nThumbCols);
		str += "<span class='next' onclick='CURRENT_THUMBNAIL_PAGE++;doDrawThumbnails( \"" + pageTitle + "\", " + nThumbRows + ", " + nThumbCols + ", " + nPhotos + ", " + temp + ", THUMB_PATHS)'><img src='right.png' onmouseover='Tip(\"Next Page\");' ></span>";
	}
	str += "</td></tr></table>";
	document.getElementById("d_thumbnails").innerHTML = str;
}

function doDrawPhotoByIndex( photoIndex ) {
 	CURRENT_PHOTO_INDEX = photoIndex;
 	var newWidth  = parseInt( WIDTHS[photoIndex] );
 	var newHeight = parseInt( HEIGHTS[photoIndex] );
 	var thumbsPerPage =  THUMB_ROWS * THUMB_COLS;
	if (CURRENT_THUMBNAIL_PAGE != Math.floor(CURRENT_PHOTO_INDEX / thumbsPerPage)) {
	 	CURRENT_THUMBNAIL_PAGE = Math.floor(CURRENT_PHOTO_INDEX / thumbsPerPage);
		doDrawThumbnails(ALBUM_NAME, THUMB_ROWS, THUMB_COLS, NUM_PHOTOS, CURRENT_THUMBNAIL_PAGE*thumbsPerPage);
	} 
 	var wh = new Array();
	wh[0] = newWidth;
	wh[1] = newHeight;
 	wh = resize( wh );
 	
	 prefetch();
 	
 	var str = "<img id='photo' width='";
	str += wh[0];
	str += "' height='";
	str += wh[1];
	str += "' src='";
 	str += PHOTO_PATHS[photoIndex];
 	str += "'  onmouseover='Tip(\""+CAPTIONS[photoIndex]+"\");'/> ";
	document.getElementById("d_photos").innerHTML = str;
	document.getElementById("imagefilename").innerHTML = "<table style='float:right;'><tr><td>" + CAPTIONS[photoIndex] + "</td></tr><tr><td><span onclick='permalink();' class='linktothis'><table><tr><td><img src='link.png' /></td><td>Link to this picture</td></tr></table></span></table>";
}

function permalink () {
	location.hash = "#" + CURRENT_PHOTO_INDEX;
}
function prefetch() {
	var str = "<img id='prefetched_1' width='1' height='1' src='";
	str += PHOTO_PATHS[CURRENT_PHOTO_INDEX + 1];
	str += "' />";
	document.getElementById("prefetch_photo_1").innerHTML = str;
	
	str = "<img id='prefetched_2' width='1' height='1' src='";
	str += PHOTO_PATHS[CURRENT_PHOTO_INDEX + 2];
	str += "' />";
	document.getElementById("prefetch_photo_2").innerHTML = str;
}
function doStartSlideShow() {
 	document.getElementById("d_slideshow").innerHTML = "<span onclick='prevImage();'><img src='rewind.png' onmouseover='Tip(\"Previous Image\");' /></span><span onclick='doStopSlideShow()'><img src='pause.png' onmouseover='Tip(\"Pause Slideshow\");'/ onmouseout='Tip(\"\");'></span><span onclick='nextImage();'><img src='ff.png' onmouseover='Tip(\"Next Image\");'/></span>";
 	if (CURRENT_PHOTO_INDEX >= NUM_PHOTOS) {
	  	doStopSlideShow();
		return;
	}
 	prefetch();
 	doDrawPhotoByIndex( CURRENT_PHOTO_INDEX );
 	CURRENT_PHOTO_INDEX++;
	TIMEOUT_HANDLE = setTimeout( "doStartSlideShow()", SLIDESHOW_TIMEOUT );
}

function doStopSlideShow() {
	clearTimeout( TIMEOUT_HANDLE );
 	document.getElementById("d_slideshow").innerHTML = "<span onclick='prevImage();'><img src='rewind.png' onmouseover='Tip(\"Previous Image\");' /></span><span onclick='doStartSlideShow()'><img src='play.png' onmouseover='Tip(\"Play Slideshow\");'/></span><span onclick='nextImage();'><img src='ff.png' onmouseover='Tip(\"Next Image\");'/></span>";
}

function nextImage() {
	doStopSlideShow();
	if (CURRENT_PHOTO_INDEX < (NUM_PHOTOS - 1)) {
		doDrawPhotoByIndex(CURRENT_PHOTO_INDEX + 1);
	}
}
function prevImage() {
	doStopSlideShow();
	if (CURRENT_PHOTO_INDEX > 0) {
		doDrawPhotoByIndex(CURRENT_PHOTO_INDEX - 1);
	}
}

function handleHash() {
	var currentHashIDString = location.hash;
	var currentHashID = parseFloat(currentHashIDString.substring(1));
	doDrawPhotoByIndex(currentHashID);
}
////////////////////////////////////////////////////////////////////////////////////

function resize( wh ) {
 	var newWidth = wh[0];
 	var newHeight = wh[1];
	var aspectRatio = newWidth / newHeight;
	var maxHeight = document.documentElement.clientHeight - 30;
	var maxWidth  = document.documentElement.clientWidth - 230; // take care of thumbnails area
	if (newWidth > maxWidth) {
	 	newWidth  = maxWidth;
	 	newHeight = newWidth / aspectRatio;
	} 
	if (newHeight > maxHeight) {
		newHeight = maxHeight;
		newWidth  = newHeight * aspectRatio;
	}
	wh[0] = newWidth;
	wh[1] = newHeight;
	return wh;
}

function handleResize ( photoIndex ) {
 	if (photoIndex == 0)   photoIndex = CURRENT_PHOTO_INDEX;
 	var newWidth  = parseInt( WIDTHS[photoIndex] );
 	var newHeight = parseInt( HEIGHTS[photoIndex] );
 	var wh = new Array();
	wh[0] = newWidth;
	wh[1] = newHeight;
 	wh = resize( wh );
	document.getElementById("photo").width  = wh[0];
	document.getElementById("photo").height = wh[1];
}

///////////////////////////////////////////////////////////////////////////////////

function doXMLHttpRequest(url, handlerFunction) {
   var xmlHttpObject;
  	try
    {
    // Firefox, Opera 8.0+, Safari
    xmlHttpObject=new XMLHttpRequest();
    }
  catch (e)
    {
    // Internet Explorer
    try
      {
      xmlHttpObject=new ActiveXObject("Msxml2.XMLHTTP");
      }
    catch (e)
      {
      try
        {
        xmlHttpObject=new ActiveXObject("Microsoft.XMLHTTP");
        }
      catch (e)
        {
        alert("Your browser does not support AJAX!");
        return false;
        }
      }
    }
	/*if (XMLHttpRequest) {
            var xmlHttpObject = new XMLHttpRequest();
    }
	else {
            var xmlHttpObject = new ActiveXObject("MSXML2.XMLHTTP.3.0");
    }*/
    xmlHttpObject.open("get", url, true);
    xmlHttpObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    xmlHttpObject.onreadystatechange = function(){  	
            if (xmlHttpObject.readyState == 4 && xmlHttpObject.status == 200) {
                    if (xmlHttpObject.responseText){
                            handlerFunction(xmlHttpObject.responseText);
                    }
            }
    }
    xmlHttpObject.send(null);
}

function doParseXMLAndDraw(responseText) {
	if (window.ActiveXObject)
	{
	  var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
	  xmldoc.async="false";
	  xmldoc.loadXML(responseText);
	}
	// code for Mozilla, Firefox, Opera, etc.
	else
	{
	  var parser=new DOMParser();
	  var xmldoc=parser.parseFromString(responseText,"text/xml");
	}
	
	var imgName = xmldoc.getElementsByTagName("itemName");
	
	var p = xmldoc.getElementsByTagName("itemLargeImage");
	var t = xmldoc.getElementsByTagName("itemThumbnailImage");
	
	var w = xmldoc.getElementsByTagName("itemWidth");
	var h = xmldoc.getElementsByTagName("itemHeight");
	
	var c = xmldoc.getElementsByTagName("caption");
	
	var numpics = xmldoc.getElementsByTagName("albumItemCount")[0].childNodes[0].nodeValue;
	
	for (var x=0; x<numpics; x++){
	 	PHOTO_NAMES[x] = imgName[x].childNodes[0].nodeValue.trim(); 
		THUMB_PATHS[x] = t[x].childNodes[0].nodeValue.trim(); 
		PHOTO_PATHS[x] = p[x].childNodes[0].nodeValue.trim();
		WIDTHS[x]  = w[x].childNodes[0].nodeValue.trim();
		HEIGHTS[x] = h[x].childNodes[0].nodeValue.trim();
		CAPTIONS[x] = c[x].childNodes[0].nodeValue.trim();
	}
	
	doDrawPage( ALBUM_NAME, THUMB_ROWS, THUMB_COLS, numpics, 0 );
}

String.prototype.trim = function() {
	a = this.replace(/^\s+/, '');
	return a.replace(/\s+$/, '');
};