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.';

/*** Validadores ***/ 


Validador = {
	noVacio : isNotEmpty,
	entero : isValidInt,
	sqlDate : isValidSqlDate,
	spanishDate : isValidSpanishDate,
	dateBefore : isValidDateBefore,
	dateAfter : isValidDateAfter,
	dateFuture : isValidFutureDate,
	datePast : isValidPastDate,
	sqlDatetime : isValidDateTime,
	color : isValidColor,
	double : isValidDouble,
	image : isValidImageExtension,
	email : isValidEmail
}

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 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 (!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 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;
}
/*******************************************************/


/* 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 = x[i].id + "_falso";
		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;
					// Uncheck all radio
					$(document.getElementsByName($toCheck.attr('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],input[type=radio]').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 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();
}