/*
Main JavaScript functions for:
- AJAX requests
- Transitions
- Lightbox
- Various utilities
*/

function getBrowser(){
	var browser = new Object();
	var strName = navigator.appName;
	var strVer = navigator.appVersion;
	if ( strName != 'Microsoft Internet Explorer' )
		browser.name = strName;
	else
		browser.name = 'IE';
	if ( browser.name == 'IE' )
		browser.ver = parseFloat(strVer.split("MSIE")[1]);
	else
		browser.ver = parseFloat(strVer);
	return browser;
}

//if doIt is set to true, redirect will be instant, else it will be a timeout of delay
function redirectToPage(url,delay,doIt){
	if ( !doIt ){
		setTimeout("redirectToPage('"+url+"','"+delay+"',true);",delay*1000);
		return;
	}
	parent.location = url;
}

/*
Function for lightbox: will darken the entire page, 
compatible with most browsers.
*/
function darken(){
	var darkener = document.getElementById("darkener");
	darkener.style.display = "block";
	darkener.style.height = document.body.offsetHeight + "px";
	if ( getBrowser().name == 'IE' && getBrowser().ver <= 6 )
		//IE6 detected, replace png by gif
		darkener.style.background = "url('/img/transparency.gif')";
	return darkener;
}

/* 
AJAX functions
*/
var SALObj = null;
//Browser-compatible XMLHttpRequest object creator.
function createAJAXRequest(){
	if (window.XMLHttpRequest) { // all but IE
		var AJAXrequest = new XMLHttpRequest();
		if (AJAXrequest.overrideMimeType) {
			AJAXrequest.overrideMimeType('text/html');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			AJAXrequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				AJAXrequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				alert("could not create xmlHTTP");
				return false;
			}
		}
	}
	if ( !AJAXrequest )
		return false;
	return AJAXrequest;
}

//timeOutFunc
var timeOutFunc = false;

//SALObjs -- SendAndLoadObject
//Contains:
// success and failure callbacks
// The XMLHTTPRequest Object
// isXML -- in which case the result will already be parsed and sent to the success callback
// callDate -- to check for timeouts (after 2 seconds)
var SALObjs = new Array();

//SendAndLoad
//Easy for AJAX requests
//url is the url to which you want to make the request
//requestObj is a one-dimensional object to send as POST variables
//successCB is the success callback, first parameter being the data retrieved
//failureCV is the failure/timeout callback, first parameter being the XMLHTTPRequest itself
//expectXML -- wether to return to successCB plaintext or a DOMOBject
function sendAndLoad(url,requestObj,successCB,failureCB,expectXML){
	if ( !timeOutFunc ){
		setInterval("checkTimeout()",500);
		timeOutFunc = true;
	}
	var Req = createAJAXRequest();
	Req.onreadystatechange = function(){
		ajaxHandlerFunc(Req);
	};
	var SALObj = new Object();
	SALObj.url = url;
	SALObj.Req = Req;
	SALObj.successCB = successCB;
	SALObj.failureCB = failureCB;
	SALObj.isXML = expectXML;
	SALObj.callDate = new Date();
	SALObjs.push(SALObj);
	
	//build request string
	var requestStr = '';
	for ( var nme in requestObj ){
		if ( requestObj )
			requestStr += nme + '=' + encodeURI(requestObj[nme]) + '&';
	}
	//strip the final &
	requestStr = requestStr.substr(0,requestStr.length-1);

	Req.open("POST",url,true);
	if ( expectXML ){
		Req.setRequestHeader('Accept','text/xml');
	}
	Req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	//Req.setRequestHeader('Content-Length',requestStr.length);
	//Req.setRequestHeader('Connection','close');	
	
	Req.send(requestStr);
}

function checkTimeout(){
	for ( var i = 0; i < SALObjs.length; i++ ){
		if ( (((new Date()).getTime()) - SALObjs[i].callDate.getTime())/1000 > 6 ){
			SALObjs[i].failureCB(SALObjs[i].Req);
			SALObjs.splice(i,1);
			return;
		}
	}
}

function ajaxHandlerFunc(e){
	var result;
	for ( var i = 0; i < SALObjs.length; i++ ){
		if ( SALObjs[i].Req == e ){
			var SALObj = SALObjs[i];
			break;
		}
	}
	if ( SALObj.Req.readyState == 4 ){
		if ( SALObj.Req.status != 200 ){
			SALObj.failureCB(SALObj.Req);
		}else{
			//parse text as XML
			if ( SALObj.isXML ){
				if(window.ActiveXObject){ //IE
					result = new ActiveXObject("Microsoft.XMLDOM");
					result.async = false;
					result.loadXML(SALObj.Req.responseText);
				}else{
					var parser = new DOMParser();
					result = parser.parseFromString(SALObj.Req.responseText,"text/xml");
				}
				SALObj.successCB(result);
			}else{
				SALObj.successCB(SALObj.Req.responseText);
			}
		}
		SALObjs.splice(i,1);
	}
}	

/*
Various functions
*/
function setSelection(domObject, selStart, selEnd){
	if ( getBrowser().name == 'IE' ){
		var rnge = domObject.createTextRange();
		rnge.move("character",selStart);
		rnge.moveEnd("character",selEnd);
		rnge.select();
	}else{
		domObject.selectionStart = selStart;
		domObject.selectionEnd = selEnd;
	}
}

/*
Animation tools
*/
var animations = new Array();

function locateElement(domObject){
	var pX = pY = 0;
	
	if ( domObject.style.position == 'absolute' ){
		return {x:parseInt(domObject.style.left),y:parseInt(domObject.style.top)};
	}
	
	if ( domObject.offsetParent ){
		do {
			pX += domObject.offsetLeft;
			pY += domObject.offsetTop;
		}while( domObject = domObject.offsetParent );
	}
	return {x:pX,y:pY};
}

function measureElement(domObject){
	return {w:domObject.offsetWidth, h:domObject.offsetHeight};
}

function animate(domObject, property, startV, endV, len, smooth, onAnimationFinish, passedObj){

	var anim = new Object();
	var animId = Math.floor(Math.random()*1000);
	anim.animId = animId;
	if ( !domObject ){
		//alert('anim error - no DOMObject specified. Aborting animation'+"\n"+' property='+property+' startV='+startV+' endV='+endV);
		return
	}
	anim.domObject = domObject;
	anim.startV = startV;
	anim.endV = endV;
	anim.len = len/20;
	if ( getBrowser().name == 'IE' ){
		anim.len /= 2;
	}
	anim.smooth = smooth;
	anim.onAnimationFinish = onAnimationFinish;
	anim.passedObj = passedObj;
	if ( property == 'alpha'){
		anim.timerId = setInterval("fade("+animId+")",20);
		var browser = getBrowser();
		if ( anim.domObject.style.MozOpacity ){
			anim.domObject.style.MozOpacity = startV;
		}else if(browser.name == "IE"){
			anim.domObject.filters.alpha.opacity = startV*100;
		}else{
			anim.domObject.style.opacity = startV;
		}
	}else if ( property == 'x' ){
		var pos = locateElement(anim.domObject);
		anim.domObject.style.position = 'fixed';
		anim.domObject.style.left = startV + 'px';
		anim.domObject.style.top = pos.y + 'px';
		anim.timerId = setInterval("displace("+animId+",'x')",20);
	}else if ( property == 'y' ){
		var pos = locateElement(anim.domObject);
		anim.domObject.style.position = 'fixed';
		anim.domObject.style.left = pos.x + 'px';
		anim.domObject.style.top = startV + 'px';
		anim.timerId = setInterval("displace("+animId+",'y')",20);
	}else if ( property == 'xrel' ){
		var pos = locateElement(anim.domObject);
		/*
		anim.domObject.style.position = 'fixed';
		anim.domObject.style.left = pos.x + startV + 'px';
		anim.domObject.style.top = pos.y + 'px';
		anim.endV = pos.x + startV + endV;
		/*/
		anim.domObject.style.position = 'relative';
		anim.domObject.style.left = startV + 'px';
		anim.endV = endV;
		anim.startV = startV;
		//*/
		anim.timerId = setInterval("displace("+animId+",'x')",20);
	}else if ( property == 'yrel' ){
		var pos = locateElement(anim.domObject);
		anim.domObject.style.position = 'fixed';
		anim.domObject.style.left = pos.x + 'px';
		anim.domObject.style.top = pos.y + startV + 'px';
		anim.endV = pos.y + startV + endV;
		anim.timerId = setInterval("displace("+animId+",'y')",20);
	}else if ( property == 'width' ){
		anim.timerId = setInterval("scale("+animId+",'width')",20);
	}else if ( property == 'height' ){
		anim.timerId = setInterval("scale("+animId+",'height')",20);
	}else{
		alert("unkown property for animation");
	}
	animations.push(anim);
}

function stopAllAnims(){
	for ( var i = 0; i < animations.length; i++ ){
		clearInterval(animations[i].timerId);
	}
}

function fade(animId){
	for ( var i = 0; i < animations.length; i++ ){
		if ( animations[i].animId == animId ){
			anim = animations[i];
		}
	}

	var browser = getBrowser();
	
	if ( !anim.domObject ){ //doesn't exist anymore, abandon ship!
		clearInterval(anim.timerId);
	}
	
	if ( anim.domObject.style.MozOpacity ){
		var curAlpha = parseFloat(anim.domObject.style.MozOpacity);
	}else if(browser.name == "IE"){
		var curAlpha = parseFloat(anim.domObject.filters.alpha.opacity)/100;
	}else{
		var curAlpha = parseFloat(anim.domObject.style.opacity);
	}
	
	if ( (anim.startV < anim.endV && curAlpha >= anim.endV) || (anim.startV > anim.endV && curAlpha <= anim.endV) ){
		if ( anim.onAnimationFinish ){
				anim.onAnimationFinish(anim.domObject,anim.passedObj);
		}
		clearInterval(anim.timerId);
		for ( i = 0; i < animations.length; i++ ){
			if ( animations[i].animId == animId ){
				animations.splice(i,1);
			}
		}
		return;
	}
	
	var progress = (curAlpha-anim.startV)/(anim.endV-anim.startV);
	var inc;
	if ( anim.smooth ){
		inc = (anim.endV-curAlpha)/anim.len;
	}else{
		inc = (anim.endV-anim.startV)/anim.len;
	}
	newAlpha = curAlpha+inc;
	
	if ( isNaN(newAlpha) ){
		if ( anim.onAnimationFinish ){
				anim.onAnimationFinish(anim.domObject,anim.passedObj);
		}
		clearInterval(anim.timerId);
		for ( i = 0; i < animations.length; i++ ){
			if ( animations[i].animId == animId ){
				animations.splice(i,1);
			}
		}
		return;
	}
	
	if ( anim.domObject.style.MozOpacity ){
		anim.domObject.style.MozOpacity = newAlpha;
	}else if(browser.name == "IE"){
		if ( !anim.domObject.filters.alpha )
			return;
		anim.domObject.filters.alpha.opacity = newAlpha*100;
	}else{
		anim.domObject.style.opacity = newAlpha;
	}
}

function setAlpha(domObject,alpha){
	var browser = getBrowser();
	if ( domObject.style.MozOpacity ){
		domObject.style.MozOpacity = alpha;
	}else if(browser.name == "IE"){
		if ( !domObject.filters.alpha )
			return;
		domObject.filters.alpha.opacity = alpha*100;
	}else{
		domObject.style.opacity = alpha;
	}
}

function getAlpha(domObject){
	var browser = getBrowser();
	if ( domObject.style.MozOpacity ){
		return parseFloat(domObject.style.MozOpacity);
	}else if(browser.name == "IE"){
		return parseFloat(domObject.filters.alpha.opacity)/100;
	}else{
		return parseFloat(domObject.style.opacity);
	}
}

function displace(animId,coord){
	for ( var i = 0; i < animations.length; i++ ){
		if ( animations[i].animId == animId ){
			anim = animations[i];
		}
	}

	if ( !anim.domObject ){ //doesn't exist anymore, abandon ship!
		clearInterval(anim.timerId);
	}

	if ( coord == 'x' ){
		var curP = parseInt(anim.domObject.style.left);
	}else if ( coord == 'y' ){
		var curP = parseInt(anim.domObject.style.top);
	}
	
	if ( anim.smooth ){
		var inc = (anim.endV-curP)/anim.len;
	}else{
		var inc = (anim.endV-anim.startV)/anim.len;
	}
	
	if ( Math.floor(Math.abs(inc)) == 0 ){
		if ( anim.onAnimationFinish ){
			anim.onAnimationFinish(anim.domObject,anim.passedObj);
		}
		clearInterval(anim.timerId);
		for ( i = 0; i < animations.length; i++ ){
			if ( animations[i].animId == animId ){
				animations.splice(i,1);
				break;
			}
		}
		return;
	}
	
	var newP = curP+inc;
	
	if ( isNaN(newP) ){
		if ( anim.onAnimationFinish ){
				anim.onAnimationFinish(anim.domObject,anim.passedObj);
		}
		clearInterval(anim.timerId);
		for ( i = 0; i < animations.length; i++ ){
			if ( animations[i].animId == animId ){
				animations.splice(i,1);
			}
		}
		return;
	}
	
	if ( coord == 'x' ){
		anim.domObject.style.left = newP + 'px';
	}else if ( coord == 'y' ){
		anim.domObject.style.top = newP + 'px';
	}
}

/* Lightbox functions */
var antiGarbageCollector = new Array();

function MakeLightBox(titleImg,titleText,html){
	var darkener = document.getElementById("darkener");
	if ( document.getElementById("lightboxcontent") ){
		//This bullshit is only because IE has a tendency to dismiss any DOM element which isn't contained anywhere anymore. 
		//To fix this, we have an invisible "swap" DOM element where we temporarly put the previous elements, that way
		//we don't lose anything.
		document.getElementById('swap').appendChild(document.getElementById("lightboxcontent").firstChild);
	}
	darkener.innerHTML = '';
	var boxHTML = '';
	boxHTML += '<div id="lightbox">';
	boxHTML += '<div id="lightboxheader"><img src="' + titleImg + '" alt="' + titleText + '"/><a href="javascript:RemoveLightBox();" id="closebutton">&nbsp;</a></div>';
	boxHTML += '<div class="clearer"></div>';
	boxHTML += '<div id="lightboxcontent">';
	if( typeof(html) == 'string' ){
		boxHTML += html;
	}
	boxHTML += '</div>';
	boxHTML += '<div id="lightboxfooter"></div>';
	boxHTML += '</div>';
	darkener.innerHTML = boxHTML;
	if ( typeof(html) != 'string' ){
		document.getElementById("lightboxcontent").appendChild(html);
	}
	
	if ( getBrowser().name == 'IE' && getBrowser().ver <= 6 ){
		darkener.style.positon = 'absolute';
		darkener.style.marginTop = '-' + document.body.offsetHeight + 'px';
		darkener.style.left = 0;
		darkener.style.height = document.body.offsetHeight + 'px';
		darkener.style.width = document.body.offsetWidth + 'px';
		darkener.style.background = "url('img/Transparencer.gif')";
	}
	darkener.style.display = "block";
	centerStaticDiv(document.getElementById("lightbox"));
	//animate(darkener,"alpha",0,1,50,false);
}

function RecenterLightBox(){
	centerStaticDiv(document.getElementById("lightbox"));
}

function RemoveLightBox(){
	var darkener = document.getElementById("darkener");
	darkener.style.display = "none";
}

function centerStaticDiv(divObj){
	if ( getBrowser().name == 'IE' ){
		if ( getBrowser().ver < 7 ){
			divObj.style.position = 'absolute';
			divObj.style.top = document.documentElement.clientHeight/2  - divObj.offsetHeight/2 + document.documentElement.scrollTop + 'px';
		}else{
			divObj.style.top = document.documentElement.clientHeight/2  - divObj.offsetHeight/2 + 'px';
		}
		divObj.style.left = document.documentElement.clientWidth/2 - divObj.offsetWidth/2 + 'px';
	}else{
		divObj.style.top = window.innerHeight/2 - divObj.offsetHeight/2 + 'px';
		divObj.style.left = window.innerWidth/2 - divObj.offsetWidth/2 + 'px';
	}
}

function NetworkError(){
	MakeLightBox('','Erreur de connexion','<div id="networkerror"><strong>Une erreur s\'est produite pendant la connexion. Vous avez peut-être perdu votre connexion internet, merci d\'essayer ultérieurement.</strong>');
}

function giveAdressSuccess(){
	document.getElementById('option_later').style.display = 'none';
	document.getElementById('option_never').style.display = 'none';
}

function popUpLargeMessage(title,body,buttons){
	var html = '';
	html += '<h2>' + title + '</h2>';
	html += '<p class="message_body">' + body + '</p>';
	html += buttons;
	document.getElementById('large_popup').innerHTML = html;
	document.getElementById('large_popup').style.visibility = 'visible';
}

function closeLargePopUp(){
	document.getElementById('large_popup').style.visibility = 'hidden';
}

function popUpMessage(title,body){
	var html = '';
	html += '<h2>' + title + '</h2>';
	html += '<p class="message_body">' + body + '</p>';
	html += '<input type="button" id="closePopUp" value="OK" onclick="closePopUp()" />';
	document.getElementById('popup').innerHTML = html;
	document.getElementById('popup').style.visibility = 'visible';
}

function closePopUp(){
	document.getElementById('popup').style.visibility = 'hidden';
}

function hideDropDowns(e){	
	if ( document.getElementById("catalog_cat_chooser_list") != null ){
		document.getElementById("catalog_cat_chooser_list").style.visibility = "hidden";
	}

}
