YAHOO.namespace ("entropico"); 

/* 
	Objeto AJAX.
	Encapsula las funciones globales que se ejecutan cada que hay algun llamado por ajax.
*/
//Constructor. Efectúa el llamado al servidor
YAHOO.entropico.ajax = function(url, onSuccess, idUpdaterNode, form, args, forceCallback, postData) 
{	
	//parametros para el success global
	this.idUpdaterNode = idUpdaterNode;
  	this.onSuccess = onSuccess;
	this.forceCallback = forceCallback;  	

	//Prepare el objeto callback
	this.callback = {success: this.load, failure: this.error, timeout: 30000, scope: this, argument: [] };

	if(typeof args != 'undefined' && args != null)
	{
		this.callback.argument = args;
	}

	//si se va a mandar un form.
	if(typeof form != 'undefined')
	{
		//this.form = form;
		this.callback.argument.push(form);
		YAHOO.util.Connect.setForm(form);
	}
	
	//Envíe el request
	if(typeof form != 'undefined' || typeof postData != 'undefined')
		var method = 'POST';
	else
		var method = 'GET';
	YAHOO.util.Connect.asyncRequest(method, url, this.callback, postData);
};

//onSuccess global, el servidor debe devolver un objeto JSON con un campo 'type'
YAHOO.entropico.ajax.prototype.load = function(o) 
{
	//fijese qué devolvio el servidor
	try
	{
		var response = eval('(' + o.responseText + ')');	
	}
	catch(err)
	{
		this.muestreError();
		return;
	}
	switch(response.type)
	{
		case 'HTML':
			//ponga el html devuelto dentro de un nodo
			if (typeof this.idUpdaterNode != 'undefined')
				document.getElementById(this.idUpdaterNode).innerHTML = response.html;
			if(this.onSuccess != undefined)
				this.onSuccess(response, o.argument);
		break;

		case 'JSON':
			if(this.onSuccess != undefined)
				this.onSuccess(response, o.argument);
		break;

		case 'REDIRECT':
			if(this.onSuccess != undefined)
				this.onSuccess(response, o.argument);
			//redireccione
			window.location = response.path;
		break;

		case 'SUCCESS':
			if(typeof response.msg != 'undefined')
				this.muestreSuccess(response.msg);
			if(this.onSuccess != undefined)
				this.onSuccess(response, o.argument);
		break;
		
		case 'ERR_VALID':
			//el id del form que fué enviado viene en el último argumento (si es que fué enviado)
			var form = o.argument[o.argument.length - 1];
			this.muestreValidacion(response.errores, form);
							
			//callback
			if(this.onSuccess != undefined && this.forceCallback === true)
				this.onSuccess(response, o.argument);
		break;

		case 'ERR_SERVER':
		default: 
			if(this.onSuccess != undefined && this.forceCallback === true)
				this.onSuccess(response, o.argument);
				
			this.muestreError(response.msg);
		break;
	}
};

//failure global, muestre un error generico y llore, está paila!
YAHOO.entropico.ajax.prototype.error = function(o)
{
	YAHOO.entropico.muestreError();
};

// muestre mensaje de success
YAHOO.entropico.ajax.prototype.muestreSuccess = function(msg)
{
	YAHOO.entropico.muestreSuccess(msg);
}

// muestre mensaje de error
YAHOO.entropico.ajax.prototype.muestreError = function(msg)
{
	YAHOO.entropico.muestreError(msg);
}


// muestre mensaje cuando hay errores de validacion. 
// OJO esto se utiliza cuando el objeto YAHOO.entropico.ajax no se utiliza con el objeto YAHOO.entropico.submitForm
YAHOO.entropico.ajax.prototype.muestreValidacion = function(errores, form)
{
	//si vienen mensajes de error
	if(typeof errores != 'undefined')
	{
		//Crée el mensaje de error:
		var msg = '<span>Corrija los siguientes errores e intente de nuevo:</span><ul>';
		var msg2 = 'Corrija los siguientes errores e intente de nuevo:\n';
		var len = errores.length;
		for(var i=0; i<len; i++)
		{
			msg += '<li>'+errores[i]+'</li>';
			msg2 += '* '+errores[i]+'\n';
		}
		msg += '</ul>'

		//si el form existe
		if(typeof form != 'undefined' && document.getElementById(form) && document.getElementById(form).tagName=='FORM')
		{
			//muestre el mensaje dentro de un div dentro del form.
			//primero verifique si el div existe, sino, créelo.
			var errDiv = document.getElementById(form+'Errores')
			if(! errDiv )
			{
				var newDiv = document.createElement('div');
				newDiv.id = form+'Errores';
				newDiv.className="errsValidacion";
				document.getElementById(form).appendChild(newDiv);
				errDiv = newDiv;
				newDiv=null;
			}
			errDiv.innerHTML = msg;					
		}
		//else no hay form
		else
		{
			alert(msg2);
		}		
	}
	//else no vienen errores
	else
	{
		alert('Error de validación, intente de nuevo');
	}
}


/*
	AJAX Form Submition, hereda del objeto AJAX y le sobreescribe el metodo muestreValidacion para 
	hacer form submision sencillita con AJAX y con validacion en el servidor. Algo asi:

	<form id="formContact">
		<p>
			<span class="error" id="email_name_error">Please, </span><label for="name">Tell us your name</label><br/>
			<input type="text" class="text" name="data[Email][name]" id="name" /> 	
		</p>
		<p class="error" id="formContactError">Oops! read the red messages and try again.</p>
		<p class="success" id="formContactSuccess">Blah</p>
		<p>
			<input id="formContactSubmit" type="submit" class="submit" value="Send" />
			<span id="formContactSending" id="sending" class="error">Sending...</span>
		</p>
	</form>
	
	<script>
		//on load
		YAHOO.util.Event.addListener(window, 'load', init);
		function init(e)
		{
			//assign submit event handler to form
			var smtr = new YAHOO.entropico.formSubmitter('formContact','/contact/email');
		}
	</script>	
*/
YAHOO.entropico.formSubmitter = function(formId, url)
{	
	this.formId = formId;
	this.url = url;
	YAHOO.util.Event.addListener(formId, 'submit', this.submit, null, this);
}

//formSubmitter extiende a (hereda de) ajax
YAHOO.lang.extend(YAHOO.entropico.formSubmitter, YAHOO.entropico.ajax); 

YAHOO.entropico.formSubmitter.prototype.submit = function(e)
{
	//stop submit propagation
	YAHOO.util.Event.stopEvent(e);

	// haga el llamado al servidor
	// equivalente a hacer esto:
	// var submitAjax = new YAHOO.entropico.ajax(this.url, this.onSuccess2, null, this.formId);
	YAHOO.entropico.formSubmitter.superclass.constructor.call(this, this.url, this.onSuccess2, null, this.formId, undefined); 

	//esconda boton
	var btn = YAHOO.util.Dom.get(this.formId+'Submit').style.display='none';
	
	//muestre "cargando"
	var btn = YAHOO.util.Dom.get(this.formId+'Sending').style.display='block';
}

//aqui llega la respuesta del servidor cuando todo bien.
YAHOO.entropico.formSubmitter.prototype.onSuccess2 = function(o,params)
{
	//esconda los errores de validacion
	var errors = YAHOO.util.Dom.getElementsByClassName('validError', null, params[0]);
	YAHOO.util.Dom.setStyle(errors, 'display', 'none');
	
	//muestre boton
	YAHOO.util.Dom.setStyle(params[0]+'Submit', 'display', 'block');
	
	//reset form
	YAHOO.util.Dom.get(params[0]).reset();
}

//si el servidor devolvio mensaje de succes, aqui cae pa mostrarlo
YAHOO.entropico.formSubmitter.prototype.muestreSuccess = function(msg)
{
	//muestre success
	YAHOO.util.Dom.get(this.formId+'Success').innerHTML=msg;
	YAHOO.util.Dom.setStyle(this.formId+'Success', 'display', 'block');
}

//si el servidor devolvio mensaje de error, aqui cae pa mostrarlo
YAHOO.entropico.formSubmitter.prototype.muestreError = function(msg)
{
	//muestre error
	alert(msg);

	//muestre boton
	YAHOO.util.Dom.setStyle(this.formId+'Submit', 'display', 'block');
	
	//esconda los errores de validacion
	var errors = YAHOO.util.Dom.getElementsByClassName('error', null, this.formId);
	YAHOO.util.Dom.setStyle(errors, 'display', 'none');
}



YAHOO.entropico.formSubmitter.prototype.muestreValidacion = function(errores, form)
{
	//esconda los errores de validacion anteriores
	var erroresViejos = YAHOO.util.Dom.getElementsByClassName('validError', null, form);
	YAHOO.util.Dom.setStyle(erroresViejos, 'display', 'none');
	
	//muestre los errores que llegaron del servidor
	YAHOO.util.Dom.setStyle(errores, 'display', 'block');
	
	//muestre error gral del form
	YAHOO.util.Dom.setStyle(form+'Error', 'display', 'block');
	
	//muestre el boton
	YAHOO.util.Dom.setStyle(form+'Submit', 'display', 'block');
}

/*
	Funciones generales
*/
YAHOO.entropico.muestreError = function(msg)
{
	//muestre error	
	if(typeof msg != 'undefined')
		alert(msg);
	else
		alert('Oops! There seems to be an error with our server. Please try again in a minute.');
}

YAHOO.entropico.muestreSuccess = function(msg)
{
	//muestre success (es un div con id="success")
	document.getElementById('success').style.display='block';
	document.getElementById('success').innerHTML = msg;
	setTimeout('document.getElementById(\'success\').style.display=\'none\';',2000);
}

//agarra value y texto del option seleccionado de un select
YAHOO.entropico.getSelectedValue = function(idSelect)
{
	var dd = document.getElementById(idSelect); 
	for(var j=0; j<dd.options.length; j++)
	{
		if(dd.options[j].selected)
		{
			var value = dd.options[j].value;
			var text = dd.options[j].text;
		}
	}
	return {value:value, text:text};
}


/*
function preloadImage(src)
{
	var img = new Image();
	img.src=src;
}










// recorre los elementos que haya dentro del container con class=remplaceme y 
// les mete los valores que haya en data.
// Para asociar los elementos de la página con los elementos del array, el id de
// los elem de la página deben terminar en _nomElemArray. Por ejemplo: id="unaCosa_nombre" 
// y en el array: {nombre: 'elNombre'}
GENERAL_populate = function(idContainer, data)
{
	var elementos = YAHOO.util.Dom.getElementsByClassName('remplaceme', null, idContainer);
	var len = elementos.length;
	for(var i=0; i<len; i++)
	{
		//saque la ultima parte del id (despues del "_")
		var id = elementos[i].id.substr( elementos[i].id.indexOf('_')+1 );
		
		if(elementos[i].tagName == 'DIV' || elementos[i].tagName == 'SPAN')
		{
			elementos[i].innerHTML = data[id];
		}
		else if(elementos[i].tagName == 'INPUT')
		{
			var type=elementos[i].type;
	        if (type == "hidden" || type == "text" || type == "textarea" || type == "password") 
			{
				elementos[i].value = data[id];
			}
		}
	}
}



//selecciona opcion del select con value
GENERAL_setSelectValue = function(idSelect, selectedValue)
{
	var dd = document.getElementById(idSelect); 
	for(var j=0; j<dd.options.length; j++)
	{
		if(dd.options[j].value == selectedValue)
			dd.options[j].selected='selected';
		else
			dd.options[j].selected='';
	}
}

//Llena un select con puros options
//data debe ser un array asi: [{valueField:valor1, textField:texto1}, {valueField:valor2, textField:texto2}]
GENERAL_populateSelect = function(idSelect, data, valueField, textField, selectedValue)
{
	var options = '';
	var len = data.length
	//si len es undefined no mandamos un array sino un solo valor para el select
	if(len != undefined)
	{
		for(var i=0;i<len;i++)
		{
			var selected ='';
			if(typeof selectedValue != 'undefined' && eval('data[i].'+valueField)==selectedValue)
			{
				selected = 'selected="selected"';
			}
				options += '<option value="' + eval('data[i].'+valueField) + '" '+selected+'>' + eval('data[i].'+textField) + '</option>';
		}
	}
	else
	{
		//comoes un solo valor que quede seleccionado de una vez
		selected = 'selected="selected"';
		options += '<option value="' + eval('data.'+valueField) + '" '+selected+'>' + eval('data.'+textField) + '</option>';
	}
	document.getElementById(idSelect).innerHTML = options; 
}

//Pone class="impar" a las filas impares y class="par" a las filas pares de una tabla.
function GENERAL_alternarRows(idTabla)
{
	var filas = document.getElementById(idTabla).getElementsByTagName('tr'); 
	var len = filas.length;
	for(var i=0; i<len; i++)
	{
		var fila = new YAHOO.ext.Element(filas[i]);
		if(i%2 == 0)
		{
			fila.removeClass('impar');
			fila.addClass('par');
		}
		else
		{
			fila.removeClass('par');
			fila.addClass('impar');
		}
	}
}

function GENERAL_formatTime(d)
{
	var a_p = "";

	var curr_hour = d.getHours();
	if (curr_hour < 12)
	{
		a_p = "am";
	}
	else
	{
		a_p = "pm";
	}
	if (curr_hour == 0)
	{
		curr_hour = 12;
	}
	if (curr_hour > 12)
	{
		curr_hour = curr_hour - 12;
	}
	
	var curr_min = d.getMinutes();
	if(curr_min < 10)
		curr_min = '0'+curr_min;

	return(curr_hour + ":" + curr_min + " " + a_p);
}

function GENERAL_isNumeric(strString)
//  check for valid numeric strings	
{
	var strValidChars = "0123456789";
	var strChar;
	var blnResult = true;

	if (strString.length == 0) return false;

	//  test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++)
	{
		strChar = strString.charAt(i);
		if (strValidChars.indexOf(strChar) == -1)
		{
			blnResult = false;
		}
	}
	return blnResult;
}

//limpia todos los inputs de un form
GENERAL_clearForm = function(idForm)
{
	var form = getEl(idForm); 
	var inputs = form.getChildrenByTagName('input');
	var len = inputs.length;
	for (var i=0; i < len; i++) 
	{
		var type=inputs[i].dom.type;
		if (type == "hidden" || type == "text" || type == "textarea" || type == "password") 
		{
			inputs[i].dom.value = '';
		}
		else if(type == 'checkbox' || type == 'radio')
		{
			if(!inputs[i].dom.disabled)
				inputs[i].dom.checked = false;
		}
		//SUBMIT | RESET |  FILE |  | IMAGE | BUTTON
	}
	
	var selects = form.getChildrenByTagName('select');
	var len = selects.length;
	for (var i=0; i < len; i++) 
	{
		//selecciona la primera opcion del select
		selects[i].dom.firstChild.selected = true;
		var len2 = selects[i].dom.childNodes.length;
		for (var j=1; j < len2; j++) 
			selects[i].dom.childNodes[j].selected=false;
	}
	
	var textareas = form.getChildrenByTagName('textarea');
	var len = textareas.length;
	for (var i=0; i < len; i++) 
	{
		//limpia los textareas
		textareas[i].dom.innerHTML = '';
		textareas[i].dom.value = '';
	}
	
}*/