/*
 * WFG-TESTSERVER
 * wfgTestServer.js - Version 1.100
 * Copyright (c) 2010 Web Financial Group S.A. All Rights Reserved.
 *
 */
 
/**************************************************************  
 FUNCIONAMIENTO:
 	Se comprueba cuales de los servidores recibidos en la lista estÃ¡n activos, y se elige aleatoriamente uno de ellos (Se almacena en una cookie el ID del servidor).
 
 LLAMADA INICIAL:
 	WFG.testServer.init(objParam); 
 	
 donde 'objParam' es un objeto c que contiene los parÃ¡metros de inicializaciÃ³n. Formato:
	var objParam = {
		'cookieName': 'nombre_cookie',	// nombre de la cookie en la que se almacena el resultado
		'expiration': 24,     			// tiempo de expiraciÃ³n de la cookie (Horas)
		'func': 'comado_js',			// cÃ³digo JS que se ejecutarÃ¡ al finalizar el test
		'urlList': {                    // lista de servidores que se deben chequear
			'id1': 'http://test1.domain.com/...',	// id_servidor : url_servidor	
			'id2': 'http://test2.domain.com/...',
			...
		}
	}; 
**************************************************************/
if (window.WFG == undefined) var WFG = {};
WFG.testServer = {
/**************************************************************
 Objeto que va a almacener los parÃ¡metros de inicializaciÃ³n recibidos
**************************************************************/	
	params: {},
	
/**************************************************************
 Variables auxiliares
**************************************************************/	
	aux: {
		log: false,
		listaId: null,		// lista de los IDs de las urls a testear
		listaUrl: null,		// lista de las urls a testear
		numTests: null,		// nÂº de tests que hay que realizar
		testActual: null,
		listaIdsOk: null	// lista de los IDs que se han chequeado y que estÃ¡n activos
	},

/**************************************************************
 Description:
	InicializaciÃ³n de los tests (modo pruebas)
 Param:
 	- p: objeto json con los parÃ¡metros de inicializaciÃ³n	
**************************************************************/			
	initLog: function(p){
		this.aux.log = true;
		this.init(p);
		return true;
	},

/**************************************************************
 Description:
	InicializaciÃ³n de los tests
	
 Param:
 	- p: objeto json con los parÃ¡metros de inicializaciÃ³n	
**************************************************************/			
	init: function(p){	
		var _arrayId = new Array();
		var _arrayUrl = new Array();
		var _doTests = false;
				
		if (p){
			this.params = p;
			var _list = this.params.urlList;			
						
			for ( var _el in _list ){
				_arrayId.push(_el);
				_arrayUrl.push(_list[_el]);
			}
			var _numTests = _arrayId.length;
				
			if (_numTests == 0) this.updateResult('ERROR','','');
			else {
			    this.aux.listaId = _arrayId;
			    this.aux.listaUrl = _arrayUrl;
			    this.aux.numTests = _numTests;			
			    this.aux.listaIdsOk = new Array();
				this.aux.testActual = 0;
				
				// Comprobar si existe la cookie
				var _contentCookie = this.readCookie(this.params.cookieName);
				if (!_contentCookie){ 	// No hay cookie -> hay que hacer los tests
					_doTests = true;	
				}
				else{	// Existe la cookie -> comprobar si el servidor estÃ¡ activo
					var _url = null;
					
					// Buscar la url correspondiente
					for ( var _el in _list ){
						if (_el == _contentCookie) _url = _list[_el];
					}					
					if (_url != null){	// Si se ha encontrado la url, chequear header de esta url
						this.checkStatusUrl(_url);												
					}
					else  _doTests = true;
				}
				     
				if (_doTests){
					this.aux.testActual = 0;	
					this.checkHeader();
				}
			}
		}		
		return true;    
	},

/**************************************************************
 Description:
	Comprueba si una url devuelve un status 200	 	
**************************************************************/	
	checkStatusUrl: function(url){
		var _myRequest = this.ajaxRequest();		
			    
		_myRequest.open("GET", "http://www.digitallook.com/check_push_server?url="+url, true);
		_myRequest.onreadystatechange = function() {
			if (_myRequest.readyState == 4) {
				if (_myRequest.status == 200){	// OK		
					if (_myRequest.responseText == "200") _result = true;
					else _result = false;            
  				}
  				else {	// ERROR
					_result = false;			  
				}
				if (!_result){	// Iniciar los tests
					WFG.testServer.aux.testActual--;	// Para dejarlo en -1 y que empiece los tests desde 0
					WFG.testServer.nextTest();
				}
				else{	// test OK, servidor referenciado en cookie estÃ¡ activo 
					if (WFG.testServer.params.func) eval(WFG.testServer.params.func);
				}
			}
		};
		_myRequest.send(null);	
	},
		
/**************************************************************
 Description:
	Comprueba si la url del test devuelve 200 o no. Si es 200 continua el test, si no, pasa al siguiente	 	
**************************************************************/	
	checkHeader: function(){
		var _myRequest = this.ajaxRequest();	
		var _time = null;
		var _result = null;
		var _url = this.aux.listaUrl[this.aux.testActual];		
			    
		_myRequest.open("GET", "http://www.digitallook.com/lightstreamer/lightstreamer/proxy.html", true);
		_myRequest.onreadystatechange = function() {
			if (_myRequest.readyState == 4) {
				if (_myRequest.status == 200){	// OK		
					if (_myRequest.responseText == "200") _result = true;
					else _result = false;            
  				}
  				else {	// ERROR
					_result = false;			  
				}
				
				if (_result) WFG.testServer.aux.listaIdsOk.push(WFG.testServer.aux.listaId[WFG.testServer.aux.testActual]);
				WFG.testServer.nextTest();		
			}
		};
		_myRequest.send(null);	
	},

/**************************************************************
 Description:
	Dependiendo del resultado del test, decide o no, generar la cookie correspondiente	
	
 Param:
	- type: tipo de resultado del test (OK, ERROR)
	- content: contenido de la cookie 	
**************************************************************/		
	updateResult: function(type, content){
		switch(type){
			case 'OK':	// Nuevo resultado
				this.createCookie(content);
				this.log('Cookie: ' + content);													
				break;
			case 'ERROR':
			    this.createCookie('ERROR');
				break;
		}
	},
	
/**************************************************************
 Description:
	FunciÃ³n que determina si hay que realizar un nuevo test
**************************************************************/			
	nextTest: function(){
		this.aux.testActual++;				
		if (this.aux.testActual < this.aux.numTests){
			this.checkHeader();
		}
		else{	// Ya se han realizqado todos los tests.
			this.selectRandomId();
		}
	},

/**************************************************************
 Description:
	Selecciona de forma aleatoria uno de los servidores activos
**************************************************************/	
	selectRandomId: function(){
		var _num = this.aux.listaIdsOk.length;	
		if (_num > 0){
			var _pos = Math.floor(Math.random() * _num);	
			this.updateResult('OK', this.aux.listaIdsOk[_pos]);
			if (this.params.func) eval(this.params.func);
		}
		else this.updateResult('ERROR', '');
	},
				
/**************************************************************
 Description:
	Crea un objeto ajax
	
 Return:
 	Objeto XMLHttpRequest
**************************************************************/	
	ajaxRequest: function(){
	    var xmlhttp = false;
		
	    try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	    } catch (e) {
	    	try {
	    		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	    	} catch (E) {
	    		xmlhttp = false;
	    	}
	    }
	
	    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
	    	xmlhttp = new XMLHttpRequest();
	    }
	    return xmlhttp;
	},
			    
/**************************************************************
 Description:
	Muestra mensajes en la consola
**************************************************************/	
	log: function(msj){
		if (this.aux.log) console.log(msj);	
	},	
		
/**************************************************************
 Description:
	Genera una cookie	
	
 Param:
	- value: contenido de la cookie	
**************************************************************/		
	createCookie: function(value){
		var _path = "/";
		var _date = new Date();
		_date.setTime(_date.getTime()+(this.params.expiration*60*60*1000));
		_date = _date.toUTCString();
		document.cookie = this.params.cookieName + "=" + value + "; expires=" + _date + "; path=" + _path;
	},

/**************************************************************
 Description:
	Leer una cookie	
	
 Param:
	- id: nombre de la cookie
	
Return:
	Valor de la cookie o 'false'	
**************************************************************/	
    readCookie: function(id){
		var _cookies = document.cookie; 
		if(!_cookies) return false;
		var _start = _cookies.indexOf(id);
		if(_start == -1) return false;
		_start = _start + id.length+1;
		var _long = _cookies.indexOf("; ", _start) - _start; 
		if (_long<=0) _long = _cookies.length;
		
		return _cookies.substr(_start, _long);
	}	 
};

