/*
 * $RCSfile: rating.js,v $
 *
 * Gallery - a web based photo album viewer and editor
 * Copyright (C) 2000-2006 Bharat Mediratta
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA.
 */


function GetXmlHttp() {
    var xmlHttp = null;
    try {
		xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    	try {
    		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    	} catch (e) {
    		try {
    			xmlHttp = new XMLHttpRequest();
    		} catch (e) {
    			xmlHttp = false;
    		}
    	}
    }
    if (!xmlHttp && typeof XMLHttpRequest!='undefined') {
    	xmlHttp = new XMLHttpRequest();
    }
    return xmlHttp;
}

function SendHttpPost(xmlHttp, url, args, callback) {
	if(myalbumBaseUrl) url = myalbumBaseUrl+url;
    xmlHttp.open("POST", url, /* async */ true);
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlHttp.onreadystatechange = function() { callback(xmlHttp); }
    xmlHttp.send(args);
}

function SendHttpGet(xmlHttp, url, callback) {
	if(myalbumBaseUrl) url = myalbumBaseUrl+url;
    xmlHttp.open("GET", url, /* async */ true);
    xmlHttp.onreadystatechange = function() { callback(xmlHttp); }
    xmlHttp.send("FOO");
}



/* Get teh ajax */
var http = GetXmlHttp();

/* status-zeug */
function myAlbumChangeStat(itemId, stat, url) {
	SendHttpGet(http, url, handleStatusResponse);
}

function handleStatusResponse() {
    if (http.readyState != 4) {
		return;
    } else {
		if (http.status == 200) {
	    	/* Success */
	    	var results = http.responseText.split("\n");
	    	/* Update display */
	    	updateStatusDisplay(results);
		} else {
	    	/* Not so much success */
	    	alert('Bad status of ' + http.status + ' returned.');
		}
    }
}
function updateStatusDisplay(results){
	itemId = results[0];
	status = results[1];
	text   = results[2];
	// update Text
	updateElementDisplay('myalbum.status.'+itemId+'.txt', text);
	for(var i=1;i<=3;i++){
		var st = (i==status ? 'myAlbumStatusAktiv' : 'myAlbumStatusInaktiv');
		document.getElementById('myalbum.status.'+itemId+'.'+i).className = st;
	}
}





/* rating zeug */
function rateItem(itemId, rating, url) {
    SendHttpGet(http, url, handleRatingResponse);
}

function handleRatingResponse() {
    if (http.readyState != 4) {
		return;
    } else {
		if (http.status == 200) {
	    	/* Success */
	    	var results = http.responseText.split("\n");
	    	/* Update display */
	    	updateItemRating(results);
		} else {
	    	/* Not so much success */
	    	alert('Bad status of ' + http.status + ' returned.');
		}
    }
}

function updateItemRating(results) {
    var itemId = results[0];
    var rating = results[1];
    var votes = results[2];
    var userRating = results[3];
	if( itemId ) {
    updateElementDisplay('rating.rating.' + itemId, rating);
    updateElementDisplay('rating.votes.' + itemId, votes);
    updateElementDisplay('rating.userRating.' + itemId, userRating);
    /* updateAveragePercent(itemId, rating * 100 / 5); */

    resetStarDisplay(itemId);
	}
}

function resetStarDisplay(itemId) {
    var userRating = document.getElementById('rating.userRating.' + itemId).innerHTML;
    updateStarDisplay(itemId, userRating);
}

function updateAveragePercent(itemId, averagePercent) {
    var e = document.getElementById('rating.averagePercent.' + itemId);
    e.style.width = averagePercent + "%";
}

function updateStarDisplay(itemId, userRating) {
    var rating = document.getElementById('rating.rating.' + itemId).innerHTML;
    for (i=1; i<=5; i++) {
	var star = document.getElementById('rating.star.' + itemId + '.' + i);
	if (userRating != 'N/A') {
	    if ((rating >= i) && (userRating >= i)) {
		star.className='myAlbumRatingFullUserYes';
	    } else if ((rating >= i) && (userRating < i)) {
		star.className='myAlbumRatingFullUserNo';
	    } else if ((rating < i) && (userRating >= i)) {
		if (i - rating < 1) {
		    star.className='myAlbumRatingHalfUserYes';
		} else {
		    star.className='myAlbumRatingEmptyUserYes';
		}
	    } else if ((rating < i) && (userRating < i)) {
		if (i - rating < 1) {
		    star.className='myAlbumRatingHalfUserNo';
		} else {
		    star.className='myAlbumRatingEmpty';
		}
	    }
	} else {
	    if (rating >= i) {
		star.className='myAlbumRatingFullUserNo';
	    } else if (i - rating < 1) {
		star.className='myAlbumRatingHalfUserNo';
	    } else {
		star.className='myAlbumRatingEmpty';
	    }
	}
    }
}

function updateElementDisplay(id, str) {
    document.getElementById(id).replaceChild(
	    document.createTextNode(str),
	    document.getElementById(id).childNodes[0]);
}


/*
	Lightbox JS: Fullsize Image Overlays
	by Lokesh Dhakar - http://www.huddletogether.com
	For more information on this script, visit:
	http://huddletogether.com/projects/lightbox/
	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
	(basically, do anything you want, just leave my name and link)
*/

function addLightboxHit(itemId,url) {
	/*
	var itemId = elmId.split('.');
	var url = 'jshelper_lighboxhit.php?lid='.itemId[0];
	*/
    SendHttpGet(http, url, handleLightboxResponse);
}

function handleLightboxResponse() {
    if (http.readyState != 4) {
		return;
    } else {
		if (http.status == 200) {
	    	/* Success */
	    	var results = http.responseText.split("\n");
	    	/* Update display */
	    	updateElementDisplay('lightboxcaption.hits.'+results[0], results[1]);
		}
    }
}


window.onload=function(e) { initLightbox() }
// Configuration
// If you would like to use a custom loading image or close button reference them in the next two lines.
var loadingImage = '/images/loading2.gif';
var closeButton = '/images/close.gif';
//
// getPageScroll()
// Returns array with x,y page scroll values.
// Core code from - quirksmode.org
//
function getPageScroll(){
	var yScroll;
	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
	}
	arrayPageScroll = new Array('',yScroll)
	return arrayPageScroll;
}
//
// getPageSize()
// Returns array with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize(){
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY) {
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}
	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}
	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
	return arrayPageSize;
}
//
// pause(numberMillis)
// Pauses code execution for specified time. Uses busy code, not good.
// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
//
function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}
//
// getKey(key)
// Gets keycode. If 'x' is pressed then it hides the lightbox.
//
function getKey(e){
	if (e == null) { // ie
		keycode = event.keyCode;
	} else { // mozilla
		keycode = e.which;
	}
	key = String.fromCharCode(keycode).toLowerCase();
	if(key == 'x'){ hideLightbox(); }
}
//
// listenKey()
//
function listenKey () {	document.onkeypress = getKey; }
//
// showLightbox()
// Preloads images. Pleaces new image in lightbox then centers and displays.
//
function showLightbox(objLink) {
	// prep objects
	var objOverlay = document.getElementById('overlay');
	var objLightbox = document.getElementById('lightbox');
	var objCaption = document.getElementById('lightboxCaption');
	var objImage = document.getElementById('lightboxImage');
	var objLoadingImage = document.getElementById('loadingImage');
	var objLightboxDetails = document.getElementById('lightboxDetails');
	var arrayPageSize = getPageSize();
	var arrayPageScroll = getPageScroll();
	// center loadingImage if it exists
	if (objLoadingImage) {
		objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');
		objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px');
		objLoadingImage.style.display = 'block';
	}
	// set height of Overlay to take up whole page and show
	objOverlay.style.height = (arrayPageSize[1] + 'px');
	objOverlay.style.display = 'block';
	// preload image
	imgPreload = new Image();
	imgPreload.onload=function(){
		objImage.src = objLink.href;
		// center lightbox and make sure that the top and left values are not negative
		// and the image placed outside the viewport
		var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);
		var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);
		objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";
		objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";
		objLightboxDetails.style.width = imgPreload.width + 'px';
		if(objLink.getAttribute('title')){
			objCaption.style.display = 'block';
			if(objLink.getAttribute('name')) {
				objCaption.innerHTML = '<span>'+objLink.getAttribute('name')+'</span> : '+objLink.getAttribute('title');
			} else {
				objCaption.innerHTML = objLink.getAttribute('title');
			}
		} else {
			objCaption.style.display = 'none';
		}
		var objLinkID = objLink.getAttribute('id');
		var idName = objLinkID.split('.');
		addLightboxHit( idName[1], 'jshelper_lighboxhit.php?lid='+idName[1] );
		// A small pause between the image loading and displaying is required with IE,
		// this prevents the previous image displaying for a short burst causing flicker.
		if (navigator.appVersion.indexOf("MSIE")!=-1){
			pause(250);
		}
		if (objLoadingImage) {	objLoadingImage.style.display = 'none'; }
		// Hide select boxes as they will 'peek' through the image in IE
		selects = document.getElementsByTagName("select");
        for (i = 0; i != selects.length; i++) {
                selects[i].style.visibility = "hidden";
        }
		objLightbox.style.display = 'block';
		// After image is loaded, update the overlay height as the new image might have
		// increased the overall page height.
		arrayPageSize = getPageSize();
		objOverlay.style.height = (arrayPageSize[1] + 'px');
		// Check for 'x' keypress
		listenKey();
		return false;
	}
	imgPreload.src = objLink.href;
}
//
// hideLightbox()
//
function hideLightbox() {
	// get objects
	objOverlay = document.getElementById('overlay');
	objLightbox = document.getElementById('lightbox');
	// hide lightbox and overlay
	objOverlay.style.display = 'none';
	objLightbox.style.display = 'none';
	// make select boxes visible
	selects = document.getElementsByTagName("select");
    for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}
	// disable keypress listener
	document.onkeypress = '';
}
//
// initLightbox()
// Function runs on window load, going through link tags looking for rel="lightbox".
// These links receive onclick events that enable the lightbox display for their targets.
// The function also inserts html markup at the top of the page which will be used as a
// container for the overlay pattern and the inline image.
//
function initLightbox() {
	if (!document.getElementsByTagName){ return; }
	var anchors = document.getElementsByTagName("a");
	// loop through all anchor tags
	for (var i=0; i<anchors.length; i++){
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
			anchor.onclick = function () {showLightbox(this); return false;}
		}
	}
	var objBody = document.getElementsByTagName("body").item(0);
	// create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
	var objOverlay = document.createElement("div");
	objOverlay.setAttribute('id','overlay');
	objOverlay.onclick = function () {hideLightbox(); return false;}
	objOverlay.style.display = 'none';
	objOverlay.style.position = 'absolute';
	objOverlay.style.top = '0';
	objOverlay.style.left = '0';
	objOverlay.style.zIndex = '90';
 	objOverlay.style.width = '100%';
	objBody.insertBefore(objOverlay, objBody.firstChild);
	var arrayPageSize = getPageSize();
	var arrayPageScroll = getPageScroll();
	// preload and create loader image
	var imgPreloader = new Image();
	// if loader image found, create link to hide lightbox and create loadingimage
	imgPreloader.onload=function(){
		var objLoadingImageLink = document.createElement("a");
		objLoadingImageLink.setAttribute('href','#');
		objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
		objOverlay.appendChild(objLoadingImageLink);
		var objLoadingImage = document.createElement("img");
		objLoadingImage.src = loadingImage;
		objLoadingImage.setAttribute('id','loadingImage');
		objLoadingImage.style.position = 'absolute';
		objLoadingImage.style.zIndex = '150';
		objLoadingImageLink.appendChild(objLoadingImage);
		imgPreloader.onload=function(){};	//	clear onLoad, as IE will flip out w/animated gifs
		return false;
	}
	imgPreloader.src = loadingImage;
	// create lightbox div, same note about styles as above
	var objLightbox = document.createElement("div");
	objLightbox.setAttribute('id','lightbox');
	objLightbox.style.display = 'none';
	objLightbox.style.position = 'absolute';
	objLightbox.style.zIndex = '100';
	objBody.insertBefore(objLightbox, objOverlay.nextSibling);
	// create link
	var objLink = document.createElement("a");
	objLink.setAttribute('href','#');
	objLink.setAttribute('title','Click to close');
	objLink.onclick = function () {hideLightbox(); return false;}
	objLightbox.appendChild(objLink);
	// preload and create close button image
	var imgPreloadCloseButton = new Image();
	// if close button image found,
	imgPreloadCloseButton.onload=function(){
		var objCloseButton = document.createElement("img");
		objCloseButton.src = closeButton;
		objCloseButton.setAttribute('id','closeButton');
		objCloseButton.style.position = 'absolute';
		objCloseButton.style.zIndex = '200';
		objLink.appendChild(objCloseButton);
		return false;
	}
	imgPreloadCloseButton.src = closeButton;
	// create image
	var objImage = document.createElement("img");
	objImage.setAttribute('id','lightboxImage');
	objLink.appendChild(objImage);
	// create details div, a container for the caption and keyboard message
	var objLightboxDetails = document.createElement("div");
	objLightboxDetails.setAttribute('id','lightboxDetails');
	objLightbox.appendChild(objLightboxDetails);
	// create caption
	var objCaption = document.createElement("div");
	objCaption.setAttribute('id','lightboxCaption');
	objCaption.style.display = 'none';
	objLightboxDetails.appendChild(objCaption);
	// create keyboard message
	var objKeyboardMsg = document.createElement("div");
	objKeyboardMsg.setAttribute('id','keyboardMsg');
	objKeyboardMsg.innerHTML = 'Klicke auf <a href="#" onclick="hideLightbox(); return false;"><kbd>x</kbd></a> um das Fenster zu schließen';
	objLightboxDetails.appendChild(objKeyboardMsg);
}

