var clasesForm = new Array('textbox','textarea','intbox','soloboton','colorbox','datebox','datebox2');
var defaultErrorsMsg = Array();
var errorsMsg = Array();
var traduccion = false;
var minYear = 1900;
var maxYear = 2100;

defaultErrorsMsg[1] = 'Completa todos los campos requeridos.';
defaultErrorsMsg[2] = 'Esto no es un entero v&aacute;lido.';
defaultErrorsMsg[3] = 'Esto no es una fecha v&aacute;lida. El formato debe ser (aaaa-mm-dd).';
defaultErrorsMsg[4] = 'Esto no es una fecha v&aacute;lida. El formato debe ser (dd/mm/aaaa).';
defaultErrorsMsg[5] = 'Esto no es una fecha y hora v&aacute;lida. El formato debe ser (aaaa-mm-dd 00:00:00).';
defaultErrorsMsg[6] = 'Esto no es un n&uacute;mero v&aacute;lido.';
defaultErrorsMsg[7] = 'No es un archivo de imagen valido';
defaultErrorsMsg[8] = 'Esto no es un color v&aacute;lido. El formato debe ser (#xxxxxx).';
defaultErrorsMsg[9] = 'La fecha %p no es anterior a la fecha %p.';
defaultErrorsMsg[10] = 'La fecha %p no es posterior a la fecha %p.';
defaultErrorsMsg[11] = 'La fecha debe ser posterior a la actual.';
defaultErrorsMsg[12] = 'La fecha debe ser anterior a la actual.';
defaultErrorsMsg[13] = 'Este no es una direccion v&aacute;lida.';
defaultErrorsMsg[14] = 'Este no es una nombre de usuario válido. No puede comenzar o terminar con ningún símbolo y debe ser de entre 7 y 23 caracteres.';
defaultErrorsMsg[15] = 'Esta no es una contraseña válida. Debe ser de al menos 8 caracteres.';
defaultErrorsMsg[16] = 'No es un archivo mp3 valido';
defaultErrorsMsg[17] = 'No es un archivo flv valido';

/*** Validadores ***/ 


Validador = {
	noVacio : isNotEmpty,
	fileBoxNoVacio : isNotEmptyFileBox,
	entero : isValidInt,
	sqlDate : isValidSqlDate,
	spanishDate : isValidSpanishDate,
	dateBefore : isValidDateBefore,
	dateAfter : isValidDateAfter,
	dateFuture : isValidFutureDate,
	datePast : isValidPastDate,
	sqlDatetime : isValidDateTime,
	color : isValidColor,
	double : isValidDouble,
	image : isValidImageExtension,
	mp3 : isValidMp3Extension,
	flv : isValidFlvExtension,
	email : isValidEmail,
	username: isValidUsername,
	password: isValidPassword
}

function validar(formulario) {
	var $formElements = $(formulario.elements);
	var retorno = true;
	$formElements.each(function(i, obj) { if (retorno) { retorno = retorno && validarElemento(i, obj); } });
	return retorno;
}
function validarElemento(i, obj) {
	var elemento = obj;
	var arrayClases = elemento.className.split(" ");
	var func;
	for (i = 0; i < arrayClases.length; i++) {
		if (arrayClases[i].substr(0,9) == "validate-") {
			func = arrayClases[i].substr(9);
			if (Validador[func] !== undefined) {
				if (!Validador[func](obj.id)) {
					return false;	
				}
			}
		}
	}
	return true;
}

function getErrorMessage(idError, params) {
	var array;
	if (window.errorsMsg === undefined || window.errorsMsg.length == 0) {
		array = defaultErrorsMsg;
	}
	else {
		array = errorsMsg;
	}
	return mensaje(idError, params, array);
}
function enfocar(elem) {
	elem.focus();
	elem.select();
}
function alertaError(id, texto, tiempo) {
	if (tiempo == null) {
		tiempo = 2000;	
	}
	var verdiv = document.getElementById('veri_'+id);
	if (verdiv != null) {
		mostrarGlobo(verdiv, texto, tiempo);
	}
}
function isNotEmpty(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /.+/;
	if(!str.match(re)) {
		enfocar(elem);
		alertaError(id,getErrorMessage(1));
		return false;
	} 
	return true;
}
function isNotEmptyFileBox(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	if(tieneUUID(elem)) {
		var partes = separarUUID(str);
		var idVal = partes[0]+'_value_'+partes[1];
	}
	else {
		var idVal = id+'_value';
	}
	var elemVal = document.getElementById(idVal);
	var strVal = elemVal.value;
	var re = /.+/;
	if(!str.match(re) && !strVal.match(re)) {
		enfocar(elem);
		alertaError(id,getErrorMessage(1));
		return false;
	} 
	return true;
}
function isValidInt(id) {
	var elem = document.getElementById(id); 
	if (elem.value) {
		var valor = parseInt(elem.value);
		if (isNaN(valor)) { 
			enfocar(elem);
			alertaError(id,getErrorMessage(2));
			return false;
		}
	}
	return true;	
}
function isValidSqlDate(id) {
	var elem = document.getElementById(id);
	var dtStr = elem.value;
	dtStr = dtStr.toString();
	dtCh = "-";
	if (!elem.value) {
		return true;
	}
	if (!isDate(dtStr,'yyyy-M-d')) {
		enfocar(elem);
		alertaError(id,getErrorMessage(3));
		return false;
	}
    return true;
}
function isValidSpanishDate(id) {
	var elem = document.getElementById(id);
	var dtStr = elem.value;
	dtStr = dtStr.toString();
	dtCh = "/"
	if (!isDate(dtStr,'d/M/yyyy')) {
		enfocar(elem);
		alertaError(id,getErrorMessage(4));
		return false;
	}
    return true;
}
function isValidDateBefore(id, date) {
	var elem = document.getElementById(id);
	var dtStr = elem.value;
	dtStr = dtStr.toString();
	var d = Date.parse(dtStr);
	var before = d.compareTo(date) > 0 ? true : false;
	if (before) {
		enfocar(elem);
		idError = 9;
		if (date == Date.today()) {
			idError = 12;
		}
		alertaError(id,getErrorMessage(idError));
		return false;
	}
	return true;
}
function isValidDateAfter(id, date) {
	var elem = document.getElementById(id);
	var dtStr = elem.value;
	dtStr = dtStr.toString();
	var d = Date.parse(dtStr);
	var after = d.compareTo(date) < 0 ? true : false;
	if (after) {
		enfocar(elem);
		idError = 10;
		if (date == Date.today()) {
			idError = 11;
		}
		alertaError(id,getErrorMessage(idError, Array(dtStr, date.toString('yyyy-MM-dd'))));
		return false;
	}
	return true;
}
function isValidFutureDate(id) {
	return isValidDateAfter(id, Date.today());
}
function isValidPastDate(id) {
	return isValidDateBefore(id, Date.today());
}
function isValidDateTime(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /^\d{4}\-\d{1,2}\-\d{1,2}( \d{1,2})?(:\d{1,2})?(:\d{1,2})?$/;
	var str = str.toString();
	if (str) {
		if (!str.match(re)) {
			enfocar(elem);
			alertaError(id,getErrorMessage(5));
			return false;
		}
	}
    return true;
}
function isValidColor(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /^\#[0-9a-fA-F]{6}$/;
	str = str.toString();
	if (str) {
		if (!str.match(re)) {
			enfocar(elem);
			alertaError(id,getErrorMessage(8));
			return false;
		}
	}
    return true;
}
function isValidDouble(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /^[-]?\d*\.?\d*$/;
	str = str.toString();
	if (str) {
		if (!str.match(re)) {
			enfocar(elem);
			alertaError(id,getErrorMessage(6));
			return false;
		}
	}
	return true;
}
function isValidImageExtension(id) {
	var elem = document.getElementById(id);
    var filename = elem.value;
	if (filename != "") {
		var extns = ['gif', 'jpg', 'jpeg', 'png', 'jpe', 'bmp', 'tif'];
		if (!hasExtension(filename, extns)) {
			alertaError(id,getErrorMessage(7),5000);
			return false;
		}
	}
    return true;
}
function isValidMp3Extension(id) {
	var elem = document.getElementById(id);
    var filename = elem.value;
	if (filename != "") {
		var extns = ['mp3'];
		if (!hasExtension(filename, extns)) {
			alertaError(id,getErrorMessage(16),5000);
			return false;
		}
	}
    return true;
}
function isValidFlvExtension(id) {
	var elem = document.getElementById(id);
    var filename = elem.value;
	if (filename != "") {
		var extns = ['flv'];
		if (!hasExtension(filename, extns)) {
			alertaError(id,getErrorMessage(17),5000);
			return false;
		}
	}
    return true;
}
function isValidEmail(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!str.match(emailRegEx)) {
		enfocar(elem);
		alertaError(id,getErrorMessage(13));
		return false;
	}
	return true;
}
function isValidUsername(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /^[a-z][\da-z_]{6,22}[a-z\d]$/;
	if(!str.match(re)) {
		enfocar(elem);
		alertaError(id,getErrorMessage(14));
		return false;
	}
	else {
		return true;
	}
}
function isValidPassword(id) {
	var elem = document.getElementById(id);
	var str = elem.value;
	var re = /^\w{8,}$/;
	if(!str.match(re)) {
		enfocar(elem);
		alertaError(id,getErrorMessage(15));
		return false;
	}
	else {
		return true;
	}
}
/*******************************************************/


/* Estilizar controles  */
function ReplaceFileBox() {
	var W3CDOM = (document.createElement && document.getElementsByTagName);
	if (!W3CDOM) return;
	;
	/* Un input falso por cada input file */
	var divInput = document.createElement('div');
	divInput.className = 'textbox';
	var ieMarginFix = document.createElement('span');
	var inputFalso = document.createElement('input');
	inputFalso.type = 'text';
	inputFalso.className = 'textbox';
	inputFalso.disabled = 'disabled';
	ieMarginFix.appendChild(inputFalso);
	divInput.appendChild(ieMarginFix);
	
	var x = document.getElementsByTagName('input');
	
	for (var i=0;i<x.length;i++) {
		if (x[i].type != 'file') continue;
		var divPadre = x[i].parentNode;
		if (!$(divPadre.parentNode).hasClass('filereplace')) continue;
		if ($(divPadre.parentNode).find('div.textbox').length > 0) continue;
		var clonar = divInput.cloneNode(true);
		divPadre.parentNode.appendChild(clonar);
		x[i].relatedElement = clonar.getElementsByTagName('input')[0];
		x[i].relatedElement.id = getIdSinUUID(x[i]) + "_falso_"+getUUID(x[i]);
		attachDisplay(x[i]);
		if (x[i+2].type == 'hidden') {
			x[i].relatedElement.value = x[i+2].value;
		}
		x[i].onmouseover = function () {
			this.parentNode.className = 'solobotonover';
		}
		x[i].onchange = x[i].onmouseout = function () {
			if (this.value != "") {
				var ar = this.value.split("\\");
				this.relatedElement.value = ar[ar.length-1];
			}
			this.parentNode.className = 'soloboton';
		}
	}
}
function elementFocus(elem) {
	if (elem != null) {
		for (i = 0; i < clasesForm.length; i++) {
			if ($(elem.relatedElement).hasClass(clasesForm[i])) {
				$(elem.relatedElement).removeClass(clasesForm[i]);
				$(elem.relatedElement).addClass(clasesForm[i]+'over');
			}
		}
	}
}
function elementBlur(elem) {
	if (elem != null) {
		for (i = 0; i < clasesForm.length; i++) {
			if ($(elem.relatedElement).hasClass(clasesForm[i]+'over')) {
				$(elem.relatedElement).removeClass(clasesForm[i]+'over');
				$(elem.relatedElement).addClass(clasesForm[i]);
			}
		}
	}
}

function SetearFocus() {
	var W3CDOM = (document.createElement && document.getElementsByTagName);
	if (!W3CDOM) return;
	
	var x = document.getElementsByTagName('input');
	
	for (var i=0;i<x.length;i++) {
		if ((x[i].type != 'text') && (x[i].type != 'password')) continue;
		var divPadre = x[i].parentNode;
		/* Fix para el IE Margin Bug */
		if (divPadre.tagName == 'SPAN') {
			divPadre = divPadre.parentNode;	
		}
		x[i].relatedElement = divPadre;
		x[i].onfocus = function () {
			elementFocus(this);
		}
		x[i].onblur = function () {
			elementBlur(this);
		}
	}
	
	var x = document.getElementsByTagName('textarea');
	for (var i=0;i<x.length;i++) {
		var divPadre = x[i].parentNode;
		/* Fix para el IE Margin Bug */
		if (divPadre.tagName == 'SPAN') {
			divPadre = divPadre.parentNode;	
		}
		x[i].relatedElement = divPadre;
		x[i].onfocus = function () {
			elementFocus(this);
		}
		x[i].onblur = function () {
			elementBlur(this);
		}
	}
}
/* ------------------------------------------------------------------------
	prettyCheckboxes
	
	Developped By: Stephane Caron (http://www.no-margin-for-errors.com)
	Inspired By: All the non user friendly custom checkboxes solutions ;)
	Version: 1.0.1
	
	Copyright: Feel free to redistribute the script/modify it, as
			   long as you leave my infos at the top.
------------------------------------------------------------------------- */
jQuery.fn.prettyCheckboxes = function(settings) {
		settings = jQuery.extend({
					checkboxWidth: 17,
					checkboxHeight: 17,
					className : 'prettyCheckbox',
					display: 'list'
				}, settings);

		$(this).each(function(){
			// Find the label
			$label = $('label[for="'+$(this).attr('id')+'"]');

			// Add the checkbox holder to the label
			$label.prepend("<span class='holderWrap'><span class='holder'></span></span>");

			// If the checkbox is checked, display it as checked
			if($(this).is(':checked')) { $label.addClass('checked'); };

			// Assign the class on the label
			$label.addClass(settings.className).addClass($(this).attr('type')).addClass(settings.display);

			// Assign the dimensions to the checkbox display
			$label.find('span.holderWrap').width(settings.checkboxWidth).height(settings.checkboxHeight);
			$label.find('span.holder').width(settings.checkboxWidth);

			// Hide the checkbox
			$(this).addClass('hiddenCheckbox');

			// Associate the click event
			$label.bind('click',function(){
				var id = $(this).attr('for');
				var $input = $(document.getElementById(id));
				$input.triggerHandler('click');
				if($input.is(':checkbox')){
					$(this).toggleClass('checked');
					if ($(this).hasClass('checked')) {
						$input.checked = true;
					}
					else {
						$input.checked = false;	
					}
				}
				else{
					$toCheck = $input;
					$form = $toCheck.parents('form');
					var name = $toCheck.attr('name');
					// Uncheck all radio
					$form.find("input:radio[name="+name+"]").each(function(i,obj){
						$lab = $(obj).next();
						if ($lab.attr('for') == $(obj).attr('id')) {
							$lab.removeClass('checked');
						}
					}); 
					$(this).addClass('checked');
					$toCheck.checked = true;
				};
			});
			var id = 'input#' + $label.attr('for');
			var $input = $(document.getElementById(id));
			$input.bind('keypress',function(e){
				var $input = $(document.getElementById(id));
				if(e.keyCode == 32){
					if($.browser.msie){
						$input.toggleClass("checked");
					}else{
						$(this).trigger('click');
					}
					return false;
				};
			});
		});
	};
	
	checkAllPrettyCheckboxes = function(caller, container){
		var $input = $(document.getElementById(id));
		if($(caller).is(':checked')){
			// Find the label corresponding to each checkbox and click it
			$(container).find('input[type=checkbox]:not(:checked)').each(function(){
				$input.trigger('click');
				if($.browser.msie){
					$(this).attr('checked','checked');
				}else{
					$(this).trigger('click');
				};
			});
		}else{
			$(container).find('input[type=checkbox]:checked').each(function(){
				$input.trigger('click');
				if($.browser.msie){
					$(this).attr('checked','');
				}else{
					$(this).trigger('click');
				};
			});
		};
	};
function ReplaceCheckbox() {
	$('input[type=checkbox]:not(.hiddenCheckbox):not(.noPretty),input[type=radio]:not(.hiddenCheckbox):not(.noPretty)').prettyCheckboxes();
	$('form.forms').each(function(i,obj) { 
		obj.onreset = function() {
			limpiarCheckBox($(this));
		};
	});
}
function createDisplay(input,img) {
	if ($("#"+img.id).length > 0) {
		$("#"+img.id).parent().remove();	
	}
	var div = document.createElement('div');
	div.className = 'filebox_display';
	div.appendChild(img);
	$(input).after(div);
	return div;
}
function attachDisplay(input) {
	var id = input.id;
	var divPadre = input.parentNode;
	var idImagen = 'display_'+id;
	var imagen = document.getElementById(idImagen);
	if (imagen != null) {
		$(divPadre.parentNode).hover(function() { display(idImagen); }, function() { display_off(idImagen); });	
	}	
}
function display(id) {
	var img = $("#"+id).get(0);
	var valorFile = $(img).parent().prev().prev().find('input.filebox').get(0).value;
	var valorFalso = $(img).parent().prev().prev().find('input.textbox').get(0).value;
	if (valorFile == "" && valorFalso != "") {
		$(img).fadeIn(1000, function() { img.style.display = 'block'; } );
	}
}
function display_off(id) {
	var img = $("#"+id).get(0);
	$(img).fadeOut(1000, function() { img.style.display = 'none'; });
}
function displayImage(options) {
	/*var options = {
		dirPath:ff,
		foto:ff,
		inputName:ff,
		texto:ff,
		uuid:ff
	};*/
	var dirPath = options.dirPath;
	var foto = options.foto;
	var inputName = options.inputName;
	var texto = (options.texto === undefined)? foto : options.texto;
	var UUID = options.uuid;
	if(UUID !== undefined) {		
		if((UUID.length > 0) && (UUID.substr(0,1) != "_")) {
			UUID = "_"+UUID;
		}
	}
	else {
		UUID = "";
	}
	var img = document.createElement('img');
	img.src = dirPath+foto;
	img.id = 'display_id_'+inputName+UUID;
	img.title = texto;
	img.alt = texto;
	img.style.display = 'none';
	img.className = 'filebox';
	var fotoValue = $("input[id^='value_id_"+inputName+UUID+"']");
	fotoValue.val(foto);
	$("input[id^='id_"+inputName+"_falso"+UUID+"']").val(foto);
	createDisplay(fotoValue.get(0),img);
	attachDisplay($("input[id^='id_"+inputName+UUID+"']").get(0));
}
function confirmar(mensaje, callback) {
	if (confirm(mensaje)) { 
		callback(); 
	}
}
function limpiarCheckBox($formulario) {
	$formulario.find('input.hiddenCheckbox').each(function(i, obj) { obj.checked = false; });
	$formulario.find('label.prettyCheckbox').removeClass('checked');
}
function ReplaceDatebox() {
	$('input.datebox').datepicker({ dateFormat: 'yy-mm-dd' });
}
function StyleForms() {
	SetearFocus();
	ReplaceFileBox();
	ReplaceCheckbox();
	ReplaceDatebox();
}
function getUUIDForm(elem) {
	var $elem = $(elem);
	var $form = $elem.parents('form.forms');
	if ($form.length == 0) {
		$form = $elem.next('form.forms');
	}
	return getUUID($form.get(0));
}	
function getUUID(elemento) {
	//alert("ID"+elemento.id);
	var retorno = "";
	if (tieneUUID(elemento)) {
		var array = separarUUID($(elemento).attr("id"));
		retorno = array[2];
	}
	return retorno;
}
function separarUUID(str) {
	var regex = /(.*)_(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$)/;
	return str.match(regex);
}
function tieneUUID(elemento) {
	return esUUID($(elemento).attr("id"));
}
function esUUID(str) {
	//alert("ACA"+str);
	var regex = /(.*)_(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$)/;
	return regex.test(str);
}
function getIdSinUUID(elemento) {
	var retorno = $(elemento).attr("id");
	if (tieneUUID(elemento)) {
		var array = separarUUID($(elemento).attr("id"));
		retorno = array[1];
	}
	return retorno;
}
function miForm(elemento) {
	return buscarAbajo(elemento,'form.forms').get(0);	
}
function miTabla(selectorForm) {
	//alert(selectorForm);
	var $obj = buscarArriba($(selectorForm).get(0),'table.abm');
	return $obj.get(0);
}
/* TODO - TODOS ESTOS DEBERIAN IR CON SELECTORFORM EN VEZ DE IDELEMENTO */
function disable(idElemento) {
	$("label[for="+idElemento+"]").addClass("disabled");
	$("#"+idElemento).get(0).disabled = true;
}
function enable(idElemento) {
	$("label[for="+idElemento+"]").removeClass("disabled");
	$("#"+idElemento).get(0).disabled = false;
}
function setReadonly(idElemento) {
	$("label[for="+idElemento+"]").addClass("disabled");
	$("#"+idElemento).addClass("disabled");
	$("#"+idElemento).get(0).readOnly = true;
}
function unsetReadonly(idElemento) {
	$("label[for="+idElemento+"]").removeClass("disabled");
	$("#"+idElemento).removeClass("disabled");
	$("#"+idElemento).get(0).readOnly = false;
}
function checkPretty(idElemento) {
	$("label[for="+idElemento+"]").click();
	$("#"+idElemento).attr("checked",true);
}