var RESULT = 0;
var FIELD = 1;
var FUNCTION = 2;
var REQUIRED = 3;
var EXTRA = 4;
var dateFormat = "%Y-%m-%d";
//
//	Arrays de caracteres para validación de pulsaciones
//
var specialKeys = new Array(0,8,9,13,37,38,39,40,46,188,190)
var numbersKeys = new Array(48,49,50,51,52,53,54,55,56,57);
var lettersKeys = new Array(65,66,67,68,69,70,71,72,73,74,
						75,76,77,78,79,80,81,82,83,84,
						85,86,87,88,89,90);
//
//	Funcion generica de validación, llamada en el evento submit
//	del formulario "<form onsunmit='return save();'>"
//
function save() {
    var result = 0;
	var funcion = "";
	var primerError = "";
	for (var i=0;i<errores.length;i++)
	{
		funcion = errores[i][FUNCTION].replace(" ","");
		eval("var ok = typeof(error" + funcion + ")");
		
		if(ok == "function" || ok == "object")
		{
			eval('error' + funcion + '(document.getElementById("' + errores[i][FIELD] + '"), ' + i + ',' + errores[i][REQUIRED] + ', "' + errores[i][EXTRA] + '")');
		}
		result += errores[i][RESULT];
		if((errores[i][RESULT]==1)&&(primerError==""))
			{				
				primerError = errores[i][FIELD];
				if (document.getElementById(errores[i][FIELD]) != null)
				{
					document.getElementById(errores[i][FIELD]).focus();
				}
			}
		
	}
	if (result == 0) return true;
	

	return false;
}

function getEvent(event) {
    if (!event) event = window.event;

    if (event.target) {
        if (event.target.nodeType == 3) event.target = event.target.parentNode
    }
    else if (event.srcElement) {
        event.target = event.srcElement
    }

    return event;
}
//
//	Funcion generica de error, establece el resultado individual y 
//	si hay una etiqueta para el error la hace visible
//
function error(field, ind)
{
    var label = document.getElementById("err_" + errores[ind][FIELD]);
    
	errores[ind][RESULT] = 1;
	
	if (label) label.style.display = "block";
}
//
//	Funcion generica de no error, establece el resultado individual y 
//	si hay una etiqueta para el error la hace invisible
//
function noerror(field, ind)
{
	var label = document.getElementById("err_" + errores[ind][FIELD]);
	errores[ind][RESULT] = 0;
	if (label) label.style.display = "none";
}
//
//,	Funcio para validar campos vacios
//
function errorEmpty(field, ind)
{
	if (field.value.length == 0)
	{
		error(field, ind);
		return true;
	}
	noerror(field, ind);
	return false;
}
//
//	Funcion para validar un solo checkbox
//
function errorCheckBox(field, ind)
{
	if (field.checked)
	{
		noerror(field, ind);
		return false;
	}
	error(field, ind);
	return true;	
}
//
//	Valida que de una lista de checkboxes haya un numero minimo y 
//	opcionalmente maximo de elementos checkeados.
//
function errorCheckBoxSelection(field, ind, required)
{
	var extra = arguments[3].split(',');
	var min = extra[0];
	var max = extra[1];
	var checkbox = null;
	var total = 0;
	for (var i = 2 ; i <extra.length ; i++)
	{
		checkbox = document.getElementById(extra[i]);
		if (checkbox)
		{
			if (checkbox.checked) total++;
		}
	}
	if (total >= min && total <= max)
	{
		noerror(field, ind);
		return false;
	}
	error(field, ind);
	return true;	
}
//
//	Funcion para validar controles de selección, combo, checkboxes y radio buttons
//
function errorOption(field, ind, required, emptyvalue)
{
	if (required) 
	{
		if (!emptyvalue) emptyvalue = '00000000-0000-0000-0000-000000000000'; // Guid.Empty.ToString();

		if (field && field.tagName == "SELECT")
		{
			//
			//	Caso 1, es un combo
			//
			if (field.options[field.selectedIndex].value == emptyvalue)
			{
				error(field, ind);
				return true;
			}
		}
		else
		{
			//
			//	Caso 2, es un grupo de checkbox o radiobuttons
			//
			var options = document.getElementsByName(errores[ind][FIELD]);
			var ok = false;
			for (var i=0;i<options.length;i++)
			{
				if (options[i].checked)
				{
					ok = true;
					break;
				}
			}
			if (!ok)
			{
				error(field, ind);
				return true;
			}
		}
	}
	noerror(field, ind);
	return false;
}
//
//	Validacion específica de url
//
function errorUrl(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return true;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
  
	var urlPattern = /^(?:(?:ftp|https?):\/\/)?(?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+(?:com|edu|biz|org|gov|int|info|mil|net|name|museum|coop|aero|[a-z][a-z])\b(?:\d+)?(?:\/[^;"'<>()\[\]{}\s\x7f-\xff]*(?:[.,?]+[^;"'<>()\[\]{}\s\x7f-\xff]+)*)?/;
	if (!urlPattern.test(field.value.toLowerCase()))
	{
		error(field, ind);
		return true;
	}

	noerror(field, ind);
	return false;
}
//
//	Validación específica de Html (Texto)
//
function errorHtml(field, ind, required)
{
	return errorText(field, ind, required);
}
//
//	Validación específica de Email.
//
function errorEmail(field, ind, required)
{	
	if (required)
	{
		if (errorEmpty(field, ind)) return true;
	}
	else
	{
		if ( field.value.length == 0 ) 
		{
			noerror(field, ind);
			return false;
		}
	}

	var emailPattern = /^\w[-.\w]*\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
	if (!emailPattern.test(field.value.toLowerCase()))
	{
		error(field, ind);
		return true;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}

	noerror(field, ind);
	return false;
}
//
//	Error para el tipo de dato ShortText (Texto)
//
function errorShortText(field, ind, required)
{
	return errorText(field, ind, required);
}
//
//	Error general para texto
//
function errorText(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return true;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
	noerror(field, ind);
	return false;
}
//
//	Fecha en formato yyyy-mm-dd
//
function errorDateTime(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
	//
	//	Descomponemos el string y extraemos dia, mes y año por separado
	//
	var strDate = field.value.split("-");
	if (strDate.length != 3)
	{
		error(field, ind);
		return true;
	}
	try
	{
		var oDate = new Date();
		oDate.setFullYear(parseInt(strDate[0], 10));
		oDate.setMonth(parseInt(strDate[1], 10) - 1);
		oDate.setDate(parseInt(strDate[2], 10));
		if (oDate.print(dateFormat) != field.value)
		{
			error(field, ind);
			return true;
		}
	}
	catch (e)
	{
		error(field, ind);
		return true;
	}
	
	noerror(field, ind);
	return false;
}
//
//	Funcion para valores numéricos en general
//
function errorNumeric(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return true;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
	
	if (!errorInt(field, ind, required))
	{
		noerror(field, ind);
		return false;
	}

	if (!errorFloat(field, ind, required))
	{
		noerror(field, ind);
		return false;
	}
	
	error(field, ind);
	return true;

}
//
//	Función para validar valores numéricos enteros
//
function errorInt(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}

	if (isNaN(parseInt(field.value, 10)))
	{
		error(field, ind);
		return true;
	}
	noerror(field, ind);
	return false;
}
//
//	Funcion para validar valores numéricos en coma flotante
//
function errorFloat(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
	valor = moneda2numero(field.value);
	valor = field.value;
	if (isNaN(parseFloat(valor)))
	{
			error(field, ind);
			return true;
	}
	noerror(field, ind);
	return false;
}

//MARC
//nickname
//
function errorNickName(field, ind)
{		

	if (field.value.length == 0)
	{
		error(field, ind);
		return true;
	}
	
	var fieldTrim = FXStreet.totalTrim(field.value);
	
	if (field.value.length != fieldTrim.length)
	{
		error(field, ind);
		return true;
	}
	noerror(field, ind);
	return false;
}

//  JONATHAN
//	Funcion para validar valores numéricos en coma flotante
//
function errorMoneda(field, ind, required)
{
	if (required)
	{
		if (errorEmpty(field, ind)) return;
		if (field.value.indexOf(',')!=-1)
		{			
			error(field, ind);
			return true;	
		}
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}

	}
	valor = moneda2numero2(field.value);
	field.value = valor;
	if (isNaN(parseFloat(valor)))
	{
			error(field, ind);
			return true;
	}
	noerror(field, ind);
	return false;
}
//Validar el Areacode sigui un numero
function errorAreacode(field, ind, required)
{
	var ac = field.value;
	if (ac.length == 0)
	{
		error(field, ind);
		return true;
	}
	if (ac == 'A. Code')
	{
		error(field, ind);
		return true;
	}
	var areaPattern = /(^[0-9]*)+$/;
	if (!areaPattern.test(ac))
	{
		error(field, ind);
		return true;
	}
	noerror(field, ind);
	return false;
}

//validar que el country estigui seleccionat
function errorCountry(field, ind, required)
{	
	var ac = field.value;
	var countPattern = /Null/
	if (countPattern.test(ac))
	{
		error(field,ind);
		return true;
	}
	noerror(field, ind);
	return false;
}
//validar que el telephone sigui un numero
function errorPhone(field, ind, required)
{
	var ac = field.value;
	var areaPattern = /(^[0-9]*)+$/;
	if (!areaPattern.test(ac))
	{
		error(field, ind);
		return true;
	}
	noerror(field, ind)
	return false;
}
//Validar que la URL sigui correcte
function errorHomepage(field, ind, required)
{
	var url = field.value;
	var urlPattern = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
	if (url.length > 0)
	{
		if (!urlPattern.test(url))
		{
			error(field, ind);
			return true;
		}
	}
	noerror(field, ind)
	return false;
}

function errorPassword(field, ind, required, password2)
{	
	var again = document.getElementById(password2);
	
	if (required)
	{
		if (errorEmpty(field, ind)) return;
	}
	else
	{
		if (field.value.length == 0)
		{
			noerror(field, ind);
			return false;
		}
	}
	//
	//	Si no hay un campo "Password again" lo damos por valido
	//
	if (!again)
	{
			noerror(field, ind);
			return false;
	}
	//
	//	Si los campos no coinciden error terrorifico XD
	//
	if (again.value != field.value)
	{
		error(field, ind);
		return true;	
	}
	noerror(field, ind);
	return false;
}

function errorPasswordleng(field, ind)
{
	if((field.value.length<5)||(field.value.length>15))
	{
		error(field, ind);
		return false;
	}
	else{
		noerror(field, ind);
		return false;
	}

}

function numero2moneda(num)
{
	num = num.toString().replace(/\,/g,'.');
	num = num.toString().replace(/\$/g,'');
	if(isNaN(num)) num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10) cents = "0" + cents;

	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	{
		num = num.substring(0,num.length-(4*i+3)) + "." + num.substring(num.length-(4*i+3));
	}		
	
	return (((sign)?'':'-') + num + ',' + cents);
}

function moneda2numero(moneda)
{
//TODO Revisar politica de reemplazos
	moneda = moneda.replace(".","");
	moneda = parseFloat(moneda.replace(",","."));

	if(isNaN(moneda)) moneda = "";
	return moneda;	
}
function moneda2numero2(moneda)
{
	moneda = parseFloat(moneda);

	if(isNaN(moneda)) moneda = "";
	return moneda;	
}

function valid4float(e)
{
	var valid = new Array();
	valid.Merge(numbersKeys);
	valid.Merge(specialKeys);

	return validKey(valid, e);
}

function validKey(keys, e)
{
	e = getEvent(e);
	var c = parseInt((document.all)?e.keyCode:e.which,10);
	return (keys.inArray(c));
}
//
//	Devuelve true si el valor se encuentra en el array
//
Array.prototype.inArray = function (value)
{
	var i;
	for (i=0; i < this.length; i++) {
		// Matches identical (===), not just similar (==).
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};
//
//	Incluye en el array los elementos del array que recibe como parámetro
//
Array.prototype.Merge = function (value)
{
	if (value.constructor.toString().indexOf("Array") == -1) return;
	for (var i=0;i<value.length;i++)
	{
		this.push(value[i]);
	}
}

