﻿var tablerosPorPedido = 10; 
/*
 * inicia el proceso de actualizacion de los tableros de todo tipo que esten en
 * la lista de tableros.
 */
function iniciarTableros() {

	try {
		var _cadena = new Array();
		for (var i = 0;i < tableros.length; i++) {
			
				_cadena.push(tableros[i]._value.cc.id + "-"
						+ tableros[i]._value.cc.valor);
			
		}
		
		//actualizarTablero(_cadena.toString());GAB
		actualizarTablero(_cadena);
				
		setInterval(actualizarTiempo, 1000);

	} catch (err) {
		if (isDebugging) {
			showError('iniciarTableros', err)
		};
	}
}

function activarTablero(arr) {
	for (var i = 0;i < arr.length; i++) {
		var oTablero = buscarTablero(arr[i].id);
		oTablero.cambiarActivo(true);
	}
	// recibo una lista de objetos tableros a activar
}

function desactivarTablero(arr) {
	for (var i = 0;i < arr.length; i++) {
		var oTablero = buscarTablero(arr[i].id);
		oTablero.cambiarActivo(false);
	}
	// recibo una lista de objetos tableros a desactivar
}

/* actualiza el tiempo de los tableros */
function actualizarTiempo() {
	try {
	    for (var i = 0; i < tableros.length; i++) {
	        if (tableros[i].tieneTiempo()) {
	            tableros[i].actualizarReloj();
	         }			
		}
	} catch (err) {
		if (isDebugging) {
			showError('actualizarTiempo', err)
		};
	}
}

/*
 * recibe una cadena con el codigo de encuentro y el codigo de solicitud ej:
 * 2375-111,,,
 */
function actualizarTablero(value) {

	try {
		/*
		 * tiene que haber una llamada al ws verificando si existen cambios para
		 * que se actualice
		 */		
		var tempPedidos = new Array();
		var numeroPedido;
		var j = 0;
		
		var cantPedidos = Math.ceil(value.length / tablerosPorPedido);
		
		for (var i = 0; i < cantPedidos; i++) {
			
			numeroPedido = i * tablerosPorPedido;
			tempPedidos = new Array();
			
			while( (j < numeroPedido + tablerosPorPedido) && (j < value.length) )
			{				
				tempPedidos.push(value[j]);
				j++;
			}
			
			var obj = new Object();
			obj.url = this.urlWS + "/obtenerTableros/procesarTablero/";
			obj.pars = tempPedidos.toString(); // recibe un cadena de ids
			var ajaxConexion = new ajaxData(obj);
			ajaxConexion.conectar();
			
			tempPedidos = null;			
		}

	} catch (err) {
		if (isDebugging) {
			showError('actualizarTablero', err)
		};
	}
};

/* asocio la f() al evento onload */
function addEvent(obj, evType, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on" + evType, fn);
		return r;
	} else {
		return false;
	}
};

/* CodigoControl */
var codigoControl = function(encuentroId, codigoControl) {

	this._encuentroId = encuentroId, 
	this._codigo = parseInt("0x"+ codigoControl, 16),
	this._encuentro = (0x0000000F & this._codigo), 
	this._incidencias = (0x0000FFF0 & this._codigo) >> 4, 
	this._formaciones = (0x000F0000 & this._codigo) >> 16, 
	this._imagenes = (0x0FF00000 & this._codigo) >> 20, 
	this._extras = (0xF0000000 & this._codigo) >> 28, // marquee

	this.encuentroId = function() {
		return this._encuentroId;
	}, this.incidencias = function() {
		return this._incidencias;
	}, this.encuentro = function() {
		return this._encuentro;
	}, this.formaciones = function() {
		return this._formaciones;
	}, this.imagenes = function() {
		return this._imagenes;
	}, this.extras = function() { // cambiar por extras
		return this._extras;
	}, this.isTypeOf = function(value) {
		var _isTypeCodigoControl = false;
		if (value == "codigoControl")
			_isTypeCodigoControl = !_isTypeCodigoControl;
		return _isTypeCodigoControl;
	}
	return false;
};

/*
 * metodo que recibe un array en notacion json ej:
 * {"cc":[{"id":000,"valor":001},{..},{..}]}
 */
/* lo convierte en array de objetos tipo CodigoControl */
function factoryCodigoControl(arr) {
	var list = new Array();
	try {
		for (var x = 0;x <= arr.length - 1; x++) {

			var codControl = new codigoControl(arr[x].id, arr[x].valor);
			list.push(codControl);
		}
	} catch (err) {
		if (isDebugging) {
			showError('factoryCodigoControl', err)
		};
	}
	return list;
};

/* recibe una lista de objetos de tipo ComparadorCodigoControl */
/* devuelve una lista de objetos CodigoSolicitud concatenados */
function generarUrlParamCodigoSolicitud(arr) {

	try {
		var list = new Array();

		for (var x = 0;x <= arr.length - 1; x++) {

			var cs = new codigoSolicitud(arr[x].cambiosEncuentro(), arr[x]
					.cambiosIncidencias(), arr[x].cambiosFormaciones(), arr[x]
					.cambiosExtras() // marquee
			);
			// verifico si hay cambios.
			if (!cs.allFalse()) {
				list.push(arr[x].encuentroId() + "-" + cs.toString());
			};
		}
		// / agregar la validacion de todos, que hago si ninguno va?
		//return list.toString();GAB
		return list;
	} catch (err) {
		if (isDebugging) {
			showError('generarUrlParamCodigoSolicitud', err)
		};
		return "";
	}

};

/* recibe dos objetos de tipo CodigoControl y permite comparlos */
var comparadorCodigoControl = function(old, newslast) {

	this.encuentroId = function() {
		return old.encuentroId();
	}, this.cambiosIncidencias = function() {
		var _hayCambios = false;
		if (old.incidencias() != newslast.incidencias()) {
			_hayCambios = !_hayCambios
		}
		return _hayCambios;
	}, this.cambiosFormaciones = function() {
		var _hayCambios = false;
		if (old.formaciones() != newslast.formaciones()) {
			_hayCambios = !_hayCambios
		}
		return _hayCambios;
	}, this.cambiosEncuentro = function() {
		var _hayCambios = false;
		if (old.encuentro() != newslast.encuentro()) {
			_hayCambios = !_hayCambios
		}
		return _hayCambios;
	}, this.cambiosExtras = function() {// marquee
		var _hayCambios = false;
		if (old.extras() != newslast.extras()) {
			_hayCambios = !_hayCambios
		}
		return _hayCambios;
	}
};

/*
 * recibe los parametros (booleans) relacionados con los cambios en el nuevo
 * codigo de control
 */
/* devuelve la concatenacion */
var codigoSolicitud = function(e, i, f, m) {
	// marquee
	this.allFalse = function() {
		var _allFalse = false;
		if ((!e) && (!i) && (!f) && (!m)) {
			_allFalse = !_allFalse;
		}
		return _allFalse;
	};

	var convert = function(value) {
		var _hasValue = '0';
		if (value) {
			_hasValue = '1';
		}
		return _hasValue;
	};

	this.toString = function() {
		return (convert(e) + convert(i) + convert(f) + convert(m));
	}
};

var procesarTablero = function(json) {
	/* este metodo tiene que recibir un json que actualice los tableros */

	var _arr = new Array();
	try {
		_arr = json;

		for (var i = 0;i < _arr.length; i++) {

			if (_arr[i].hasOwnProperty('cc')) {
				
				var oTablero = buscarTableros(_arr[i].cc.id);
				if (oTablero == null) {
					throw err;
				} else {
					for (var x = 0;x < oTablero.length; x++)
						{
							var o = oTablero[x];
							o.setValue(_arr[i]);
							o.execute();
						}					
				}
			}
		};

	} catch (err) {
		if (isDebugging) {
			showError('procesarTablero', err)
		};
	}

};

/* array de objetos de tipo tablero */
var tableros = [];

/* agrega un objeto de tipo tablero a el array tableros */
function agregarTablero(value) {
	tableros.push(value);
};

/* procesa el codigo de control verificando que tipo de cambios hubo */
/* solicitando la actualizacion de los tableros */
function procesarCC(json) {
	try {
		// array de objetos comparador //
		var _arrComparador = new Array();

		// creo los codigo de control //
		var _arr = factoryCodigoControl(json);

		// comparo los codigos de control //
		for (var i = 0;i < _arr.length; i++) {
			var oTablero = buscarTablero(_arr[i].encuentroId());
			oTablero.actualizarReloj();
			var oCCOld = new codigoControl(oTablero._value.cc.id,
					oTablero._value.cc.valor);
			// comparo los codigo de control, el que tengo y el actualizado //
			var oComparador = new comparadorCodigoControl(oCCOld, _arr[i]);
			_arrComparador.push(oComparador);
		}

		//var _param = generarUrlParamCodigoSolicitud(_arrComparador);GAB
		var _param = new Array();
		_param = generarUrlParamCodigoSolicitud(_arrComparador);
		/* solicito la actualizacion de los tableros */
		/* siempre y cuando existan tableros para actualizar */
		if (_param.length > 0) {
			actualizarTablero(_param); //GAB
		}

	} catch (err) {
		if (isDebugging) {
			showError('procesarCC', err)
		};
	}
};

function verificarCambiosCodigoControl() {

	// tomo todos los objeto de tipo tablero de tableros[] //
	var _arr = new Array();

	try {
		// obtengo los codigo de control y defino que voy a pedir //
		for (var i = 0;i < tableros.length; i++) {

			// armo la url con el encuentroId - cc //
			
			var _cadena = tableros[i]._value.cc.id;
			if (tableros[i].estaActivo()){
			    	_arr.push(_cadena);
			}			
		}
        if(_arr.length > 0)
        {        	
        	var tempPedidos = new Array();
			var numeroPedido;
			var j = 0;
			
			var cantPedidos = Math.ceil(_arr.length / tablerosPorPedido);
			
			for (var i = 0; i < cantPedidos; i++) 
			{			
				numeroPedido = i * tablerosPorPedido;
				tempPedidos = new Array();
				
				while( (j < numeroPedido + tablerosPorPedido) && (j < _arr.length) )
				{				
					tempPedidos.push(_arr[j]);
					j++;
				}
				
	        	var obj = new Object();
				obj.url = this.urlWS + "/obtenerCC/procesarCC/";
				obj.pars = tempPedidos.toString();
				//obj.pars = _arr.toString(); // recibe un cadena de ids o un objeto
											// tablero??
				var ajaxConexion = new ajaxData(obj);
				ajaxConexion.conectar();  
				
				tempPedidos = null;
			}
        }	

	} catch (err) {
		if (isDebugging) {
			showError('verificarCambiosCodigoControl', err)
		};
	}

};

/* busca un objeto de tipo tablero dentro del array tableros */
function buscarTablero(value) {

	var oTablero = null;
	try {
		for (var i = 0;i < tableros.length; i++) {
			if (tableros[i]._value.cc.id == value) {
				oTablero = tableros[i];
			}
		}

	} catch (err) {
		if (isDebugging) {
			showError('buscarTablero', err)
		};
	}

	return oTablero;

};


function buscarTableros(value) {

	var lista = new Array();
	
	var oTablero = null;
	try {
		for (var i = 0;i < tableros.length; i++) {
			if (tableros[i]._value.cc.id == value) {
				lista.push(tableros[i]);
			}
		}

	} catch (err) {
		if (isDebugging) {
			showError('buscarTablero', err)
		};
	}

	return lista;

};


var isDebugging = false;
function showError(m, e) {

	alert("metodo: " + m + ", error = " + e);
}


