/*
	Fonctions AJAX simplifiées (sans tâche de fond ni éléments graphiques).
	
	Le contenu de ce fichier n'est pas libre de droits.
	
	Julien Laurent - nStyle Consulting / Network Studio / FVS
*/

if(window.ActiveXObject)
	var IE = true;
else
	var IE = false;

// Un peu de config
timeout_seconds = 45;

// A ne pas modifier
ajax_calls = new Array();
ajaxlock = 0;
lastAJAX = 0;
ajaxing = 0;
AJAX_timeout = 0;
// Merci IE qui croit qu'on quitte alors qu'on envoie un formulaire, même AJAX...
preajaxing = 0;

config_appname = 'FVS';

function $(id)
{
	return document.getElementById(id);
}

xmlHttpReq = false;
// Mozilla/Safari/IE7
if (window.XMLHttpRequest)
{
	xmlHttpReq = new XMLHttpRequest();
}
// IE<7
else if (window.ActiveXObject)
{
	xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
	// alert('Votre navigateur ne supporte pas la technologie employée par ce site.\n\nImpossible de continuer.');
	
}

function xmlHttpPost()
{
	if(ajax_calls.length == 0)
		return;
	
	if(!xmlHttpReq)
	{
		showError('Incompatibilité navigateur');
		return;
	}
	
	if(AJAX_timeout)
	{
		clearTimeout(AJAX_timeout);
		AJAX_timeout = 0;
	}
	
	var ajaxfuncname = ajax_calls[0][0];
	var values = ajax_calls[0][1];
	
	var values = values || '';

	ajaxing = 1;

	xmlHttpReq.open('POST', '/includes/nsajax/index.php?ajax='+ajaxfuncname, true);
	xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlHttpReq.onreadystatechange = function()
	{
		if (xmlHttpReq.readyState == 4)
		{
			ajaxing = 0;
			if(xmlHttpReq.responseText != '')
			{
				if(AJAX_timeout)
				{
					clearTimeout(AJAX_timeout);
					AJAX_timeout = 0;
				}
				ajax_calls.shift();
				str = xmlHttpReq.responseText;
				tab = str.split(String.fromCharCode(27));
				var dotab = 1;
				if(tab[0] != '')
				{
					if(!confirm("Données inattendues dans la réponse AJAX. Continuer ?"))
						dotab = 0;
					alert(tab[0]);
				}
				
				if(dotab)
				{
					
					if(tab[6] == '')
						tab[6] = '&nbsp;';
					if(tab[1] != '')
						eval(tab[1]);
					if(tab[4] != '')
					{
						var o = document.getElementById(tab[4]);
						if(o)
							o.innerHTML = tab[3];
					}
					else if(tab[8] != '')
					{
						var o = document.getElementById(tab[8]);
						if(o)
							o.innerHTML = o.innerHTML + tab[3];
					}
					
					// tab[5] (title) & tab[6] (subtitle) inutilisés ici (version light)
					for(i=0;i<4;i++)
					{
						if(tab[9+(i*3)+1] != '')
						{
							var o = document.getElementById(tab[9+(i*3)+1]);
							if(o)
								o.innerHTML = tab[9+(i*3)];
						}
						else if(tab[9+(i*3)+2] != '')
						{
							var o = document.getElementById(tab[9+(i*3)+2]);
							if(o)
								o.innerHTML = o.innerHTML + tab[9+(i*3)+0];
						}
					}
					if(tab[7] != '')
						submittable(tab[7],1);
					if(tab[2] != '')
						eval(tab[2]);
					if(tab[21] != '')
						// Style et durée de notification (tab[22] et tab[23]) non applicables ici (version light)
						showNotification(tab[21]);
				}
				// Version light
				setTimeout('watchAJAX()',100);
			}
			else
			{
				showNotification('Problème de communication avec le serveur.');
			}
		}
	}
	xmlHttpReq.send(values);
	AJAX_timeout = setTimeout('timedOut()',timeout_seconds*1000);
}

function timedOut()
{
	clearTimeout(AJAX_timeout);
	AJAX_timeout = 0;
	if(ajax_calls.length > 0)
	{
		xmlHttpReq.abort();
	}
}

function AJAX(funcname,values,opt)
{
	var values = values || '';
	var opt = opt || '';
	var formname = '';
	
	preajaxing = 1;

	if(values == 'form' && opt != '')
	{
		formname = opt;
		var f = document.getElementById(formname);
		submittable(formname,0);
		if(f)
		{
			values = '';
			for(i=0;f.elements[i];i++)
			{
				e = f.elements[i];
				if(e.type == 'select-multiple')
				{
					j = 0;
					for(k = 0; k < e.length ; k++)
					{
						if(e.options[k].selected)
						{
							if(values != '')
								values += '&';
							values += e.name+'['+j+']='+escape(e.options[k].value);
							j++;
						}
					}
				}
				else
				{
					switch(e.type)
					{
					case 'checkbox':
					case 'radio':
						if(e.checked)
							v = e.value;
						else
							continue;
						break;
					case 'select-one':
						v = getSelectValue(e);
						break;
					default:
						// text,password,button,hidden
						v = e.value;
						break;
					}
					if(values != '')
						values += '&';
					values += e.name+'='+escape(v);
				}
			}
		}
	}
	
	enqueueAJAX(funcname,values,formname);
	preajaxing = 0;
	
	// Version light
	xmlHttpPost();
}

function enqueueAJAX(funcname,values,formname)
{
	var formname = formname || '';
	while(ajaxlock)
	{ }
	ajaxlock = 1;
	ajax_calls.push(new Array(funcname,values,formname));
	ajaxlock = 0;
}

function dequeueAJAX()
{
	while(ajaxlock)
	{ }
	ajaxlock = 1;
	if(ajax_calls.length == 0)
	{
		ajaxlock = 0;
		return 0;
	}
	v = ajax_calls[0];
	ajax_calls.shift();
	ajaxlock = 0;
	return v;
}

function watchAJAX()
{
	if(!ajaxing && !ajaxlock && ajax_calls.length > 0)
		xmlHttpPost();
}

function clickOn(btn)
{
	var b = document.getElementById(btn);
	if(b)
		b.click();
}

function getRadioValue(o)
{
	if(!o)
		return '';
	if(!o.length)
		return '';
	for(var i=0; i<o.length; i++)
		if(o[i].checked)
			return o[i].value;
	return '';
}

function setRadioValue(o,v)
{
	if(!o)
		return;
	if(!o.length)
		return;
	for(var i=0; i<o.length; i++)
	{
		if(o[i].value == v)
			o[i].checked = true;
		else
			o[i].checked = false;
	}
}

function getSelectValue(o)
{
	if(!o)
		return '';
	if(!o.options)
		return '';
	if(o.selectedIndex < 0)
		return '';
	var v = o.options[o.selectedIndex].value;
	if(v == 'none' || v == 'NONE')
		v = '';
	return v;
}

function setSelectValue(o,v)
{
	if(!o)
		return;
	if(!o.options)
		return;
	var idxssv;
	var found = false;
	for(idxssv=0;idxssv<o.options.length;idxssv++)
	{
		o.options[idxssv].selected = false;
		if(o.options[idxssv].value == v)
		{
			o.options[idxssv].selected = true;
			found = true;
		}
	}
}

function setInputValue(o,v)
{
	if(!o)
		return;
	switch(o.type)
	{
	case 'select-one':
		setSelectValue(o,v);
		break;
	case 'checkbox':
		o.checked = (v == o.value ? true : false);
		break;
	case 'radio':
		setRadioValue(o,v);
		break;
	default:
		if(o.length)
			setRadioValue(o,v);
		else
			o.value = v;
	}
}

function submittable(formname,v)
{
	f = document.getElementById(formname);
	if(!f)
		return;

	for(i=0;f.elements[i];i++)
	{
		e = f.elements[i];
		if(e.type == 'submit' || e.type == 'button')
			e.disabled = v ? false : true;
	}	
}

function showError(str,detail)
{
	var detail = detail || '';
	alert(str);
}

function showNotification(msg,typ,dur)
{
	var msg = msg || '';
	alert(msg);
}

function retryLastAJAX()
{
	xmlHttpPost();
}

// This code is in the public domain. Feel free to link back to http://jan.moesen.nu/
function sprintf()
{
	if (!arguments || arguments.length < 1 || !RegExp)
		return;

	var str = arguments[0];
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	while (a = re.exec(str))
	{
		var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
		var pPrecision = a[5], pType = a[6], rightPart = a[7];

		//alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);

		numMatches++;
		if (pType == '%')
		{
			subst = '%';
		}
		else
		{
			numSubstitutions++;
			if (numSubstitutions >= arguments.length)
			{
				alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).');
			}
			var param = arguments[numSubstitutions];
			var pad = '';
			if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
			else if (pPad) pad = pPad;
			var justifyRight = true;
			if (pJustify && pJustify === "-") justifyRight = false;
			var minLength = -1;
			if (pMinLength) minLength = parseInt(pMinLength);
				var precision = -1;
			if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1));
				var subst = param;
			if (pType == 'b') subst = parseInt(param).toString(2);
			else if (pType == 'c') subst = String.fromCharCode(parseInt(param));
			else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0;
			else if (pType == 'u') subst = Math.abs(param);
			else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
			else if (pType == 'o') subst = parseInt(param).toString(8);
			else if (pType == 's') subst = param;
			else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase();
			else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase();
		}
		str = leftpart + subst + rightPart;
	}

	return str;
}

hideContextTimer = 0;

function showContext(attachto)
{
	var f = document.getElementById(attachto);
	var c = document.getElementById('context');
	if(IE)
	{
		c.style.top = (calculateOffsetTop(f)-5)+'px';
		c.style.width = f.offsetWidth+'px';
		c.style.height = '100px';
		c.style.left = calculateOffsetLeft(f)+'px';
	}
	else
	{
		c.style.top = calculateOffsetTop(f)+f.offsetHeight-1+'px';
		c.style.left = (calculateOffsetLeft(f)+1)+'px';
		c.style.width = (f.offsetWidth-2*1)+'px';
	}
	if(c.scrollTo)
		c.scrollTo(0,0);
	if(c.scrollTop)
		c.scrollTop = 0;
	c.style.display = '';
	c.style.visibility = 'visible';
	if(c.scrollTo)
		c.scrollTo(0,0);
	if(c.scrollTop)
		c.scrollTop = 0;
	if(hideContextTimer)
		clearTimeout(hideContextTimer);
	hideContextTimer = setTimeout('hideContext()',3000);
}

function hideContext()
{
	var c = document.getElementById('context');
	c.style.display = 'none';
	c.style.visibility = 'hidden';
}

function contextMouseOver()
{
	if(hideContextTimer)
	{
		clearTimeout(hideContextTimer);
		hideContextTimer = 0;
	}
}

function contextMouseOut()
{
	hideContextTimer = setTimeout('hideContext()',2000);
}

// calcule le décalage à gauche
function calculateOffsetLeft(r){
  return calculateOffset(r,"offsetLeft")
}

// calcule le décalage vertical
function calculateOffsetTop(r){
  return calculateOffset(r,"offsetTop")
}

function calculateOffset(r,attr){
  var kb=0;
  while(r){
    kb+=r[attr];
    r=r.offsetParent
  }
  return kb
}

function forceUpperCase(o)
{
	var v = o.value;
	var nv = v.toUpperCase();
	if(v != nv)
		o.value = nv;
	return true;
}

function forceLowerCase(o)
{
	var v = o.value;
	var nv = v.toLowerCase();
	if(v != nv)
		o.value = nv;
	return true;
}

function forceNumber(o,allowfloat)
{
	var allowfloat = allowfloat || 0;
	var v = o.value;
	if(allowfloat)
	{
		var nv = v.replace(/,/g,'.');
		nv = nv.replace(/[^0-9.]/g,'');
	}
	else
		var nv = v.replace(/[^0-9]/g,'');
	if(v != nv)
		o.value = nv;
	return true;
}

// Browser Window Size and Position
// copyright Stephen Chapman, 3rd Jan 2005, 8th Dec 2005
// you may copy these functions but please keep the copyright notice as well
function pageWidth() {return window.innerWidth != null? window.innerWidth: document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth:document.body != null? document.body.clientWidth:null;}
function pageHeight() {return window.innerHeight != null? window.innerHeight: document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight:document.body != null? document.body.clientHeight:null;}
function posLeft() {return typeof window.pageXOffset != 'undefined' ? window.pageXOffset:document.documentElement && document.documentElement.scrollLeft? document.documentElement.scrollLeft:document.body.scrollLeft? document.body.scrollLeft:0;}
function posTop() {return typeof window.pageYOffset != 'undefined' ? window.pageYOffset:document.documentElement && document.documentElement.scrollTop? document.documentElement.scrollTop: document.body.scrollTop?document.body.scrollTop:0;}
function posRight() {return posLeft()+pageWidth();}
function posBottom() {return posTop()+pageHeight();}

function showPopUp(w)
{
	var p = $('popup');
	var pm = $('popupmain');
	var ph = $('popuphider');
	var w = w || '';
	var bst = $('body').scrollTop;
	if(w == '')
		p.style.width = '80%';
	else
		p.style.width = w;
	var mh = pm.style.maxHeight || 0;
	if(IE || !mh)
	{
		pm.style.height = '80%';
	}
	else
	{
		pm.style.height = '';
		pm.style.maxHeight = '80%';
	}
	$('body').scrollTop = bst;
	p.style.visibility = 'hidden';
	ph.style.visibility = 'hidden';
	ph.style.display = 'block';
	p.style.display = 'block';
	$('body').scrollTop = bst;
	var calcleft = parseInt((pageWidth() - p.offsetWidth) / 2);
	p.style.left = calcleft+'px';
	$('body').scrollTop = bst;
	var calctop = parseInt((pageHeight() - p.offsetHeight) / 2);
	p.style.top = (posTop()+calctop)+'px';
	ph.style.top = posTop()+'px';
	$('body').scrollTop = bst;
	if(pm.scrollTo)
		pm.scrollTo(0,0);
	if(pm.scrollTop)
		pm.scrollTop = 0;
	$('body').scrollTop = bst;
	hideOscMenu();
	$('body').scrollTop = bst;
	ph.style.top = posTop()+'px';
	p.style.visibility = '';
	ph.style.visibility = '';
	$('body').scrollTop = bst;
}

function hidePopUp()
{
	$('popup').style.display='none';
	$('popupmain').innerHTML = '';
	$('popuphider').style.display = 'none';
	showOscMenu();
}

function doubleClickPopupTop()
{
	if($('popupmain').offsetHeight == 0)
	{
		new Effect.SlideDown('popupmaincnt',{duration:0.4});
	}
	else
	{
		new Effect.SlideUp('popupmaincnt',{duration:0.4});
	}
}

popupmoving = 0;

popupmovingx = 0;
popupmovingy = 0;

function startMovingPopUp(e)
{
	var e = (e) ? e : ((event) ? event : null);
	if(e)
	{
		popupmoving = 1;
		popupmovingx = e.clientX-$('popup').offsetLeft;
		popupmovingy = e.clientY-$('popup').offsetTop;
		//showError('StartMove:'+popupmovingx+','+popupmovingy+'('+$('popup').offsetLeft+','+$('popup').offsetTop+')');
		document.onmousemove = movePopUp;
		$('popup').className = 'popupmoving';
	}
}

function stopMovingPopUp()
{
	popupmoving = 0;
	//showError('StopMove');
	$('popup').className = 'popupnotmoving';
}

function movePopUp(e)
{
	var e = (e) ? e : ((event) ? event : null);
	if(popupmoving == 1 && e)
	{
		$('popup').style.left = e.clientX - popupmovingx;
		$('popup').style.top  = e.clientY - popupmovingy;
/*
		$('popup').style.left = e.clientX;
		$('popup').style.top  = e.clientY;
		popupmovingx = e.clientX;
		popupmovingy = e.clientY;
		showError('Moving:'+popupmovingx+','+popupmovingy);
	}
	else
	{
		showError('(not moving)');
*/
	}
}

function tryNewWindow(addr,name,params)
{
	var addr = addr || '';
	var name = name || '';
	var params = params || '';
	if(addr == '')
		return;
	var truc = window.open(addr,name,params);
	if(truc==null)
		showNotification("Votre navigateur a empêché l'ouverture<br />d'une nouvelle fenêtre.<br /><br />Désactivez le blocage des fenêtres &quot;popup&quot;<br />pour ce site.","error",5);
	else
		if(window.focus)
			truc.focus();
}

function tryDownloadFile(addr)
{
	var addr = addr || '';
	
	$('xloadframe').src = addr;
	
	showNotification("Si le téléchargement du fichier ne se lance pas,<br />vérifiez la configuration de votre navigateur.","info");
}

function tryPrint(addr)
{
	var addr = addr || '';
	
	$('xloadframe').src = addr;
	
	showNotification("Si l'impression ne se lance pas, vérifiez<br />la configuration de votre navigateur.","info");
}

function submitUploadForm(fname)
{
	var f = $(fname);
	if(!f)
		return;
	showNotification('Envoi en cours. Si rien ne se passe,<br />vérifiez la configuration de votre<br />navigateur.');
	f.submit();
	submittable(fname,0);
}


