var debut = "http://wcb.linkeo.com:80/wcbFrontal/";
var debutBO = "http://wcb.linkeo.com:8080/extranet/bouton/";
var timerIds = new Array();
var trackIds = new Array();
var DEFAULT_FORM = "lnkWcbForm";
var DEFAULT_EXC_FUNCTION = "handleLnkWcbExc";
var excFct = null;
var DEFAULT_DEBORDEMENT_FUNCTION = "handleDebordement";
var debordementsTest = {};
var debordHandler = null;

function handleDebordement(response,options){
	try{
		var obj = response.responseObj;
		if(obj != null && obj != undefined){
			var type = obj.debordementType;
			var valeur = obj.debordementValue;
			if(type == "URL"){
				if(valeur != null && valeur != undefined){
					document.location = valeur;
					return;
				}
			}
			if(type == "SIMPLE"){
				if(valeur != null && valeur != undefined){
					alert(valeur);
					return;
				}
			}
		}
	}
	catch(exc){
	}
}

function setDebutBO(debutUrlBO){
	debutBO = debutUrlBO;
}

function setDebut(debutUrl){
	debut = debutUrl;
}


function stubEstOuvert(codeBouton){
	retourEstOuvert({"estActif":true,"estOuvert":true});
}

function stubHoraires(codeBouton){
	retourHoraires({"horairesOuverture":[
			{"debut":"-W-1T06:00","fin":"-W-1T23:00"},
			{"debut":"-W-2T06:00","fin":"-W-2T23:00"},
			{"debut":"-W-3T06:00","fin":"-W-3T23:00"},
			{"debut":"-W-4T06:00","fin":"-W-4T23:00"},
			{"debut":"-W-5T06:00","fin":"-W-5T23:00"}
		],"joursFeries":[
			{"date":"--01-01"},
			{"date":"--05-01"},
			{"date":"--05-08"},
			{"date":"--07-14"},
			{"date":"--08-15"},
			{"date":"--11-11"},
			{"date":"--12-25"}
		]});
}


/**
 * Calls the back office to check if the call centers for the given code bouton
 * are open
 *
 * @param codeBouton
 * @return void. retourEstOuvert is the callback function
 */
function estOuvert(codeBouton){
	try{
		if(codeBouton == null || codeBouton == undefined || codeBouton == ""){
			alert("Code canal invalide");
			return;
		}
		sendRequest(debutBO+"estOuvert/"+codeBouton+"?",null);
	}
	catch(exc){
	}
}


/**
 * Calls the back office to get the call centers opening time for the given code
 * bouton
 *
 * @param codeBouton
 * @return void. retourHoraires is the callback function
 */
function horaires(codeBouton, fuseauHoraire){
	try{
		if(codeBouton == null || codeBouton == undefined || codeBouton == ""){
			alert("Code canal invalide");
			return;
		}
		var tzParam = (fuseauHoraire != null && fuseauHoraire != undefined ? 'tz=' + encodeURIComponent(fuseauHoraire) : '');
		sendRequest(debutBO + "horaires/" + codeBouton + "?" + tzParam, null);
	}
	catch(exc){
	}
}



function generateRandom(length){
	var res = "";
	for(ir = 0; ir < length;ir++){
		res += Math.floor(Math.random()*10);
	}
	return res;
}

function getUserUrls(){
	try{
		var os = new Array();
		os.push(window.location);
		var o = window.opener;
		while(o != null){
			os.push(o.location);
			o = o.opener;
		}
		var us = "[";
		var nb = os.length;
		for(io = nb - 1; io >= 0; io--){
			us += "\""+os[io]+"\"";
			if(io > 0){
				us += ",";
			}
		}
		us += "]";
		return "userUrls="+encodeURIComponent(us);
	}
	catch(exc){
	}
	return null;
}

function completeUrl(url,fId){
	var userUrls = getUserUrls();
	userUrls = (userUrls == null ? "" : "&"+userUrls);
	try{

		var arr = getAllParameters(fId);
		if(arr == null || arr.length == 0){
			return url+userUrls;
		}
		for(nb=0; nb < arr.length; nb++){
			e = arr[nb];
			if(e == null || e == undefined){
				continue;
			}
			url += "&"+e.name+"="+e.value;
		}

		return url+userUrls;
	}
	catch(exc){
		// alert(exc);
	}
	return url+userUrls;
}

function getAllParameters(fId){
	var res = new Array();
	try{

		var fs = document.getElementsByName(fId);
		if(fs == null || fs == undefined || fs.length == 0){
			fs = document.getElementById(fId);
		}
		else{
			fs = fs[0];
		}
		if(fs == null || fs == undefined){
			return null;
		}
		var elts = fs.elements;
		if(elts == null || elts == undefined || elts.length == 0){
			return null;
		}

		for(nb = 0; nb < elts.length; nb++){
			var elt = elts[nb];
			if(elt == null || elt == undefined){
				continue;
			}
			if(elt.name == null || elt.name == undefined || elt.value == null || elt.value == undefined){
				continue;
			}
			res.push({name: elt.name, value: encodeURIComponent(elt.value)});
		}
		return res;
	}
	catch(exc){
		// alert(exc);
	}
}

function processException(e,excObj){
	try{
		if(excFct == null || excFct == undefined || excFct == ""){
			excFct = eval(DEFAULT_EXC_FUNCTION);
		}
	}
	catch(exc){

	}
	try{
		if(excFct != null && excFct != undefined){
			excFct(e,excObj);
		}
	}
	catch(exc){
		try{
			if(excFct != null && excFct != undefined){
				excFct(e);
			}
		}
		catch(exc2){
		}
	}
}

function callMeBack(cbCodeBouton,cbPhone,statusComponentId,statusHandler,scenario,formId,debordementHandler){
	
        try{
		debordementsTest = {};
		if(statusComponentId == null || statusComponentId == undefined){
			processException("Veuillez renseigner le parametre 'statusComponentId' !");
			return;
		}
		if(cbCodeBouton == null || cbCodeBouton == undefined || cbCodeBouton == ""){
			processException("Veuillez renseigner le code bouton !");
			return;
		}
		if(cbPhone == null || cbPhone == undefined || cbPhone == ""){
			processException("Veuillez renseigner le numero de telephone a rappeler !");
			return;
		}
		var cId = statusComponentId;
		var tIds = timerIds[cId];
		if(tIds == null || tIds == undefined){
			tIds = new Array();
			timerIds[cId] = tIds;
		}
		for(it = 0; tIds && it < tIds.length; it++){
			try{
				clearTimeout(tIds[it]);
			}
			catch(exc){
			}
		}
		if(trackIds[cId] == null || trackIds[cId] == undefined){
			trackIds[cId] = new Array();
		}
		tIds.splice(0,tIds.length);

		if(formId == null || formId == undefined || formId == ""){
			formId = DEFAULT_FORM;
		}
		if(debordementHandler == null || debordementHandler == undefined || debordementHandler == ""){
			debordementHandler = DEFAULT_DEBORDEMENT_FUNCTION;
		}
		debordHandler = debordementHandler;
		var url = (debut + 'services.do?t=call&codeBouton=' + cbCodeBouton
						+ '&callee=' + encodeURIComponent(cbPhone)
						+ '&cId=' + cId
						+ '&voice=fr1&debordementHandler=' + debordementHandler
						+ (!statusHandler ? "" : ('&statusHandler=' + statusHandler))
						+ (!scenario ? "" : ('&scenario=' + scenario))
				);
		url = completeUrl(url,formId);
		sendRequest(url,"resultCallMeBack");
	}
	catch(exc){
	}
}

function delayCallBack(cbCodeBouton, cbPhone, cbDate, statusComponentId, statusHandler, scenario, formId, debordementHandler, timeZone){
	try{
		if(cbCodeBouton == null || cbCodeBouton == undefined || cbCodeBouton == ""){
			processException("Veuillez renseigner le code bouton !");
			return;
		}
		if(cbPhone == null || cbPhone == undefined || cbPhone == ""){
			processException("Veuillez renseigner le numero de telephone a rappeler !");
			return;
		}

		var re = new RegExp("^[0-3][0-9]/[01][0-9]/[0-9]{4} [0-2][0-9]:[0-5][0-9]$","");
		if(cbDate == null || cbDate == undefined || cbDate == "" || cbDate.match(re) == null){

			var d = new Date();
			var d1 = lnkFormatDateTime(d);

			processException("Veuillez saisir une date d'appel valide (exemple: '"+d1+"' ).");
			return;
		}
		cbDate = encodeURIComponent(cbDate);
		if(formId == null || formId == undefined || formId == ""){
			formId = DEFAULT_FORM;
		}
		if(debordementHandler == null || debordementHandler == undefined || debordementHandler == ""){
			debordementHandler = DEFAULT_DEBORDEMENT_FUNCTION;
		}
		if(!timeZone || !/^GMT[+-][0-2][0-9]:[0-5][0-9]$/.test(timeZone)) {
			timeZone = construireFuseauHoraire();
		}
		debordHandler = debordementHandler;
		var url = (debut + 'services.do?t=delay&codeBouton=' + cbCodeBouton
							+ '&callee=' + encodeURIComponent(cbPhone)
							+ '&planedDate=' + cbDate
							+ '&voice=fr1&debordementHandler=' + debordementHandler
							+ (!statusHandler ? "" : '&statusHandler='+statusHandler)
							+ (!scenario ? "" : '&scenario='+scenario)
							+ '&tz=' + encodeURIComponent(timeZone)
					);
		url = completeUrl(url,formId);
		sendRequest(url,"resultDelayCallBack");
	}
	catch(exc){
	}
}

function lnkFormatDateTime(d) {
	try{
		var d1 = "";
		var n = d.getDate();
		if(n < 10){
			d1 += "0";
		}
		d1 += n+"/";
		n =(d.getMonth()+1);
		if(n < 10){
			d1 += "0";
		}
		d1 += n+"/";
		d1 += (d.getFullYear())+" "

		n = d.getHours();
		if(n < 10){
			d1 += "0";
		}
		d1 += n+":";
		n = d.getMinutes();
		if(n < 10){
			d1 += "0";
		}
		d1 += n;
		return d1;
	}
	catch(exc){
	}
}

function toPaddedString(number, length, radix) { // inspired by Prototype library, version 1.6.0, line 969
	try{
		var string = number.toString(radix || 10);
		while (length - string.length > 0) {
			string = '0' + string
		}
		return string;
	}
	catch(exc){
	}
};

function construireFuseauHoraire() {
	try{
		var now  = new Date();
		var offset = now.getTimezoneOffset();
		var hOffset = Math.floor(Math.abs(offset) / 60);
		var mOffset = Math.abs(offset) % 60;
		return 'GMT' + (offset <= 0 ? '+' : '-') + toPaddedString(hOffset, 2) + ':' + toPaddedString(mOffset, 2);
	}
	catch(exc){
	}
}

function resultDelayCallBack(xmlResponse,options){
	try{
		var handler = options.params.statusHandler;
		if(handler != null && handler != undefined){
			eval(handler+"(xmlResponse,options)");
		}
		var tId = xmlResponse.responseObj.callId;
		if(tId != null && tId != undefined){

		}
	}
	catch(exc){
	}

}

function resultCallMeBack(xmlResponse,options){
	try{
		var tId = xmlResponse.responseObj.callId;
		if(tId != null && tId != undefined){
			var cId = options.params.cId;
			trackIds[cId] = tId;
			checkEvents(cId,tId,options.params.statusHandler);
		}
		var err = xmlResponse.responseObj.error;
		if(err != null && err != undefined && err != ""){
			processException(err, xmlResponse.responseObj.excObj);
		}
	}
	catch(exc){
	}

}

function hangup(arg){
	try{
		var ts = trackIds[this.cId];
		var tId = ts[ts.length - 1];
		hangupLine(tId);
	}
	catch(exc){
	}
}

function hangupLine(tId){
	try{
		if(mode == null || mode == undefined){
			Ext.Ajax.request({
				url: 'services.do?t=hangup',
				success: null,
				failure: null,
				params:{callId:tId},
				timeout: 60000
			});
		}
		else{
			sendRequest(debut+'services.do?t=hangup&callId='+tId,null)
		}
	}
	catch(exc){
	}

}

function encodeParam(param){
	if(param == null || param == undefined){
		return param;
	}
	return encodeURIComponent(param);
}

function checkBack(xmlResponse,options){
	try{
		var resp = xmlResponse.responseObj;
		var me = null;
		// var agent = null;
		if(resp.ended == "1"){
			me = "-";
			// agent = "-";
			clearTimeout(options.params.timerId);

		}
		else{
			me = resp.u;
			// agent = resp.a;
		}
		if(options.params.statusHandler == null || options.params.statusHandler == undefined){
			var cId = options.params.cId;
			var myStatus = document.getElementById(cId);

			if(myStatus.value != null && myStatus.value != undefined){
				myStatus.value = me;
			}
			else{
				if(myStatus.innerHTML != null && myStatus.innerHTML != undefined){
					myStatus.innerHTML = me;
				}
			}
		}
		else{
			eval(options.params.statusHandler+"(xmlResponse,options)");
		}
	}
	catch(exc){
	}
}

function checkEvents(pId,T_ID,statusHandler){
	var cTimerId = setTimeout("checkEvents('"+pId+"','"+T_ID+"',"+(statusHandler ? "'"+statusHandler+"'" : null)+")",1000);
	tIds = timerIds[pId];
	tIds.push(cTimerId);
	try{
		sendRequest(debut + 'services.do?t=lastEvent&responseType=script'
						+ '&callId=' + T_ID
						+ '&timerId=' + cTimerId
						+ '&cId=' + pId
						+ '&debordementHandler=' + debordHandler
						+ (statusHandler != null && statusHandler != undefined ? '&statusHandler='+statusHandler : ''),
					'checkBack');
	}
	catch(exc){
	}
}

function removeScript(scriptElemId){
	try{
		var head = document.getElementsByTagName('head')[0];
		head.removeChild(document.getElementById(scriptElemId));
	}
	catch(exc){
	}
}

function sendRequest(url, callb){
	try{
		var scriptElemId = generateRandom(12);
		if(callb != null && callb != undefined){
			url += "&callback=" + callb;
		}
		var head = document.getElementsByTagName('head')[0];
		var sc = document.createElement("script");
		sc["id"] = scriptElemId;
		sc["type"] = 'text/javascript';
		sc["src"] = url + '&scriptId=' + scriptElemId;
		sc.defer = false;
		head.appendChild(sc);

	}
	catch(exc){
		// alert(exc);
	}

}


