

/**************************
* TIPOS BASICOS PERMITIDOS
***************************/
var NUMERIC  = 1;
var DECIMAL  = 2;
var STRING   = 3;
var DATE     = 4;
var TIME     = 5;
var CURRENCY = 6;
var FULLEDIT = 7;
var CCC      = 8;
var COMBO    = 9;


/*******************
* REDONDEO DE FECHA
********************/
var DATE_ROUNDING = 69;
var CENTURY       = 21;

/*******************
* DECIMAL CHARACTER
********************/
var DECIMAL_CHAR = ",";
/************************
* DECIMALS REG_EXPESSION
* Acepta numeros con puntos y comas
*************************/
var DECIMAL_EXPRG = /^[+-]?\d+[,.]?\d*$/;
/************************
* NUMERIC REG_EXPESSION
* Acepta numeros con puntos
*************************/
var NUMERIC_EXPRG = /^[+-]?\d+[.]?\d*$/;

/********************
* MILES CHARACTER
*********************/
var MILES_CHAR = ".";


/************************
* DATE REG_EXPESSION
* Acepta numeros con puntos
*************************/
var DATE_EXPRG = /^[0-9]+[\/_\-]{0,1}[0-9]+[\/_\-]{0,1}[0-9]+$/;

/*******************
* DATE-TIME SEPARATOR
********************/
var DATE_SEPARATOR = "/";
var TIME_SEPARATOR = ":";

/*******************
* ADD TO DATE CONSTANTS
********************/
var DATE_DAY   = 0;
var DATE_MONTH = 1;
var DATE_YEAR  = 2;

function unformat(obj, type, scale, form) {
	switch (type) {
		case NUMERIC : return removeMilesChar(obj.value);
		case DECIMAL : return removeMilesChar(obj.value);
		case STRING  : return obj.value;
		case DATE    : return removeDateSeparatorChar(obj.value);
    		case TIME    : return removeTimeSeparatorChar(obj.value);
		case CURRENCY: return removeMilesChar(obj.value);
		case FULLEDIT: return obj.value;
		case CCC     : return obj.value;
		case COMBO   : return obj.options[obj.selectedIndex].value;
		default      : return obj.value;
	}
}


function capture(obj, type, scale, form) {
	var mandatory = checkMandatory(obj);
	switch (type) {
		case NUMERIC : obj.value=removeMilesChar(obj.value);obj.className="inputsNUMERICFOCUS";break;
		case DECIMAL : obj.value=removeMilesChar(obj.value);obj.className="inputsDECIMALFOCUS";break;
		case STRING  : obj.className="inputsSTRINGFOCUS";break;
		case DATE    : obj.value=removeDateSeparatorChar(obj.value);obj.className="inputsDATEFOCUS";break;
   		case TIME    : obj.value=removeTimeSeparatorChar(obj.value);obj.className="inputsTIMEFOCUS";break;
		case CURRENCY: obj.value=removeMilesChar(obj.value);obj.className="inputsCURRENCYFOCUS";break;
    		case FULLEDIT: obj.className="inputsFULLEDITFOCUS";break;		
    		case CCC     : obj.className="inputsCCCFOCUS";break;    		
		case COMBO   : obj.className="inputsCOMBOFOCUS";break;
		default      : obj.className="inputsFOCUS";break;
	}
	if(mandatory){
		var clase = obj.className;
		obj.className=clase+"MANDATORY";
	}
	
	if (type != COMBO) obj.select();
}

function display(obj, type, scale, form ,errors) {
	var mandatory = checkMandatory(obj);
	switch (type) {
		case NUMERIC : obj.className="inputsNUMERIC";
			break;
		case DECIMAL : obj.className="inputsDECIMAL";
			break;
		case STRING  : obj.className="inputsSTRING";
			break;
		case DATE    : obj.className="inputsDATE";
			break;
    	case TIME    : obj.className="inputsTIME";
    		break;    
		case CURRENCY: obj.className="inputsCURRENCY";
			break;
    	case FULLEDIT: obj.className="inputsFULLEDIT";
    		break; 
    	case CCC     : obj.className="inputsCCC";
    		break;
		case COMBO   : obj.className="inputsCOMBO";
			break;
		default      : obj.className="inputs";
			break;
	}
	if(mandatory){
		var clase = obj.className;
		obj.className=clase+"MANDATORY";
	}
	
	if (checkType(obj, type, scale, form, errors)) toDisplay(obj, type, scale, form);
}

function checkMandatory(obj) {
	var clase = obj.className;
	var mandatory = clase.indexOf("MANDATORY") >= 0;
	return mandatory;
}

function checkType(obj, type, scale, form, errors) {
	switch (type) {
		case NUMERIC : return checkNumeric(obj, errors);
		case DECIMAL : return checkDecimal(obj, scale, errors);
		case STRING  : return true;
		case DATE    : return checkDate(obj, errors);
    		case TIME    : return checkTime(obj, errors);
		case CURRENCY: return checkCurrency(obj, errors);
    		case FULLEDIT: return true;
    		case CCC     : return checkCCC(obj, form, errors);
		case COMBO   : return true;
		default      : return true;
	}

}

function toDisplay(obj, type, scale, form) {
	if (obj.value != "") {
		switch (type) {
			case NUMERIC : obj.value=addMilesChar(obj.value);break;
			case DECIMAL : toDisplayDecimals(obj,scale);break;
			case STRING  : break;
			case DATE    : toDisplayDate(obj);break;
      			case TIME    : toDisplayTime(obj);break;
			case CURRENCY: toDisplayDecimals(obj,2);break;
    			case FULLEDIT: break;
    			case CCC     : toDisplayCCC(obj);break;
			case COMBO   : break;
			default      : break;
		}
	}
}

function toDisplayCCC(obj) {
	var length = obj.maxlength > 0 ? obj.maxlength : obj.size;
	if (length > 0) {
		obj.value = zeroLeftPad(obj.value, obj.size);
	
	}
}

function toDisplayDecimals(obj, decimals) {
  obj.value = formatDecimals(obj.value, decimals);
}

function formatDecimals(value, decimals) {
	var zeroToAdd = 0;
	if (value.indexOf(DECIMAL_CHAR) == -1) {
		zeroToAdd = decimals;
		value += DECIMAL_CHAR;
	}else {
		zeroToAdd = decimals + 1 - (value.length - value.indexOf(DECIMAL_CHAR));
	}

	for (var i = 0; i < zeroToAdd; i++) {
		value += "0";
	}	
	//- Añadimos los puntos de los miles
	return addMilesChar(value);
}

/*************************************************************************************/
/***   MOSTREM LA DATA CORRESPONENT   ************************************************/
/*************************************************************************************/
function toDisplayDate(obj) {
	var str = obj.value;
	
	if (str != "") {
		if (str.indexOf("/") >= 0) //utilitza barres com a separador de camps
			toDisplayDateElem(obj, "/");
		else {
			if (str.indexOf("-") >= 0) //utilitza barres com a separador de camps
				toDisplayDateElem(obj, "-");
			else {
				toDisplayDatePlain(obj);
			}
		}
	}
}

function toDisplayDateElem(obj, elem) {
	var str = obj.value;
	
	pos1 = str.indexOf(elem); //tenim la pos del primer elem
	pos2 = str.lastIndexOf(elem);//tenim la pos del segon elem

	dia = str.substring(0, pos1);
	mes = str.substring(pos1 + 1, pos2);
	any = str.substring(pos2 + 1, str.length);

	toDisplayDate2Screen(obj, dia, mes, any);
}

function toDisplayDatePlain(obj) {
	var str = obj.value;

	dia = str.substring(0, 2);
	mes = str.substring(2, 4);
	any = str.substring(4, str.length);

	toDisplayDate2Screen(obj, dia, mes, any);
}

function toDisplayDate2Screen(obj, dia, mes, any) {
	dia = reformatar_dia_mes(dia);
	mes = reformatar_dia_mes(mes);
	any = reformatar_any(any);

	obj.value = dia + DATE_SEPARATOR + mes + DATE_SEPARATOR + any;
}

function reformatar_dia_mes(value) {
	if (value.length == 1)
		value = "0" + value;
	
	return value;
}

function reformatar_any(any) {
	if (any.length == 2) {
		any = parseInt(any, 10);
		if (any > DATE_ROUNDING) {
			any = any + convertCenturyToYears(CENTURY-1);		
		}else {
			any = any + convertCenturyToYears(CENTURY);
		}
	}
	
	return any;
}

function getDisplayDate(str) {
	switch (str.length) {
		case 6:return getDisplay6DigitDateFormat(str);break;
		case 8:return getDisplay8DigitDateFormat(str);break;
	}
}

function toDisplayTime(obj) {
	switch (obj.value.length) {
		case 4:toDisplay4DigitTimeFormat(obj);break;
		case 6:toDisplay6DigitTimeFormat(obj);break;
	}
}

function getDisplay6DigitDateFormat(str) {	
	var year=parseInt(str.substring(4,6), 10);
	var theDate=str.substring(0,2)+ DATE_SEPARATOR + str.substring(2,4) + DATE_SEPARATOR;		
	if (year>DATE_ROUNDING) {
		year=year+convertCenturyToYears(CENTURY-1);		
	}else {
		year=year+convertCenturyToYears(CENTURY);
	}
	theDate+=year;
	return theDate;
}

function getDisplay8DigitDateFormat(str) {
	return str.substring(0,2)+ DATE_SEPARATOR + str.substring(2,4) + DATE_SEPARATOR + str.substring(4,8); 
}

function toDisplay4DigitTimeFormat(obj) {
	obj.value=obj.value.substring(0,2)+ TIME_SEPARATOR + obj.value.substring(2,4) + TIME_SEPARATOR + '00'; 
}

function toDisplay6DigitTimeFormat(obj) {
	obj.value=obj.value.substring(0,2)+ TIME_SEPARATOR + obj.value.substring(2,4) + TIME_SEPARATOR + obj.value.substring(4,6); 
}

function checkNumeric(obj, errors) {
	if (obj.value!="") {	
	
		if (!isCorrectlyPointed(obj.value)) {
			alert(errors[0]);obj.focus();obj.select();
			return false;
		}else {
			//Eliminamos los puntos de miles en caso de correctos, el toDisplay volvera a colocarlos
			obj.value=removeMilesChar(obj.value);
		}
		
		if ((!NUMERIC_EXPRG.test(obj.value))) {
			alert(errors[1]);obj.focus();obj.select();
			return false;
		}
	}
	return true;
}

function checkDecimal(obj,scale, errors) {
	if (obj.value!="") {
		
		if (!isCorrectlyPointed(obj.value)) {
			alert(errors[0]);obj.focus();obj.select();
			return false;
		}else {
			//Eliminamos los puntos de miles en caso de correctos, el toDisplay volvera a colocarlos
			obj.value=removeMilesChar(obj.value);
		}
		//Validamos que sea un decimal
		strArrays=obj.value.split(DECIMAL_CHAR);		
		if ((!DECIMAL_EXPRG.test(obj.value))||(checkNumberOfDecimals(obj,scale))) {
			alert(errors[1]);obj.focus();obj.select();
			return false;
		}

		/*if (strArrays.length>1){
			if (strArrays[1].indexOf(MILES_CHAR)!=-1) {
				alert("Valor de importe invalido");obj.focus();obj.select();
				return false;
			}
		}*/
	}
	return true;
}

function isCorrectlyPointed(value) {
	var strArrays=null;
	if (value.indexOf(DECIMAL_CHAR)!=-1) {
		strArrays=value.substring(0,value.indexOf(DECIMAL_CHAR)).split(MILES_CHAR);
	}else {
		strArrays=value.split(MILES_CHAR);
	}
	for (var i=strArrays.length-1;i>=0;i--) {
		if ((i!=0)&&(strArrays[i].length!=3)) {
			return false;
		}		
	}
	return true;
}

function getCurrency(theCurrency) {
  theCurrency = Math.round(theCurrency * 100) / 100;
  return formatDecimals(String(theCurrency).replace(/[.]/g, ","), 2);
}

function checkCurrency(obj, errors) {
	if (obj.value!="") {
		if (!isCorrectlyPointed(obj.value)) {
			alert(errors[0]);obj.focus();obj.select();
			return false;
		}else {
			//Eliminamos los puntos de miles en caso de correctos, el toDisplay volvera a colocarlos
			obj.value=removeMilesChar(obj.value);
		}
		//Validamos que sea un decimal
		strArrays=obj.value.split(DECIMAL_CHAR);		
		if ((!DECIMAL_EXPRG.test(obj.value))||(checkNumberOfDecimals(obj,2))) {			
			alert(errors[1]);obj.focus();obj.select();
			return false;
		}
		
		/*if (strArrays.length>1){
			if (strArrays[1].indexOf(MILES_CHAR)!=-1) {
				alert("Valor de importe invalido");obj.focus();obj.select();
				return false;
			}
		}*/
		
		return true;	
	}
}

function checkNumberOfDecimals(obj,decimals) {
	if ((obj.value.indexOf(DECIMAL_CHAR)!=-1)&&(obj.value.length-obj.value.indexOf(DECIMAL_CHAR)>decimals+1)) return true;
	return false;
}

function getCCCControl(value){
  var values = new Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
  control = 0;
  for (var i = 0; i <= 9; i++) {
    control += parseInt(value.charAt(i), 10) * values[i];
  }
  control = 11 - (control % 11);
  if (control == 11) {
    control = 0;
  } else if (control == 10) {
    control = 1;
  }
  return control;
}

function checkCCC(obj, form) {
	if (obj.name != 'cuenta') {
		return true;
	}
	
	form = document.forms[0];
	
	var cc = zeroLeftPad(form.elements["control"].value.toUpperCase(), 2);

	// Control digits XX allowed
	if (cc == 'XX') {
		return true;
	}

	var c0 = getCCCControl('00' + zeroLeftPad(form.elements["entidad"].value, 4) + zeroLeftPad(form.elements["oficina"].value, 4));
	var c1 = getCCCControl(zeroLeftPad(form.elements["cuenta"].value, 10));
	if (cc.substr(0, 1) != c0.toString()) {
		alert("Dígitos de control incorrectos.");
		form.elements["entidad"].focus();
		form.elements["entidad"].select();
		return false;
	}

	if (cc.substr(1, 1) != c1.toString()) {
		alert("Dígitos de control incorrectos.");
		form.elements["entidad"].focus();
		form.elements["entidad"].select();
		return false;
	}
	return parseInt(cc, 10);
}

/*************************************************************************************/
/***   COMPROVEM EL FORMAT DE LA DATA   **********************************************/
/*************************************************************************************/
function checkDate(obj, errors) {
	noerror = 0;

	str = obj.value;
	if (str != "") {
		if ((!DATE_EXPRG.test(obj.value))) {
			alert(errors[2]);
			obj.focus();
			obj.select();
		return false;
		}
	}
	
	if (str != "") {
		len = str.length;
		if ((len >= 6) && (len <= 10)) {
			if (str.indexOf("/") >= 0) //utilitza barres com a separador de camps
				noerror = checkElemDateFormat(obj, "/");
			else {
				if (str.indexOf("-") >= 0) //utilitza guions com a separador de camps
					noerror = checkElemDateFormat(obj, "-");
				else //no utilitza cap caràcter com a separador de camps
					noerror = checkPlainDateFormat(obj);
			}
		} else {
			noerror = -1;
		}
	}
//	alert("bona la data " + dia + "/" + mes + "/" + any);
//	alert("He comprovat el format i el resultat es: " + noerror);
	if (noerror == 0) {
		return true;
	} else {
		if (noerror == -1)
			alert(errors[0]);
		if (noerror == -2)
			alert(errors[1]);
		if (noerror == -3)
			alert(errors[2]);
		obj.focus();
		obj.select();
//		alert("Error en la data " + dia + "/" + mes + "/" + any);

		return false;
	}
}

function checkElemDateFormat(obj, elem) {
	noerror = 0; //correcte mentre no es demostri el contrari
	str = obj.value;
	
	noerror = comprovar2elems(str, elem); //ens assegurem q tenim dos i només dos elems
	
	if (noerror == 0) {
		//guardem les posicions on tenim els elems
		pos1 = str.indexOf(elem); //tenim la pos del primer elem
		pos2 = str.lastIndexOf(elem);//tenim la pos del segon elem

		dia = parseInt(str.substring(0, pos1), 10);
		if (isNaN(dia))
			noerror = -2;
		else {
			mes = parseInt(str.substring(pos1 + 1, pos2), 10);
			if (isNaN(mes))
				noerror = -2;
			else {
				any = parseInt(str.substring(pos2 + 1, str.length), 10);
				if (isNaN(any))
					noerror = -2;
				else { //el format d'entrada és correcte
					any = reformatar_any_check(any);
					//validem q la data introduida sigui valida
					if (!validateDate(dia, mes, any))
						noerror = -3;
				}
			}
		}
	}
	
	return noerror;
}

function comprovar2elems(str, elem) {
	noerror = 0;
	
	pos = str.indexOf(elem); //tenim la pos del primer elem
	pos = str.indexOf(elem, pos + 1); //tenim la pos del segon elem. En el cas q no hi hagi un segon elem, pos serà -1, i el següent if tb petarà.
	last_pos = str.lastIndexOf(elem); //pillem la pos de l'ultim elem
	
	if (pos != last_pos)
		noerror = -1;

	return noerror;
}

function reformatar_any_check(any) {
	if (any < 100) {
		if (any > DATE_ROUNDING) {
			any = any + convertCenturyToYears(CENTURY-1);
		} else {
			any = any + convertCenturyToYears(CENTURY);
		}
	}
	return any;
}

function checkPlainDateFormat(obj) {
	noerror = 0;
	str = obj.value;

	len = str.length;
	if ((len == 6) || (len == 8)) {
		if (!(isNaN(str))) {
			dia = parseInt(str.substring(0,2), 10);
			mes = parseInt(str.substring(2,4), 10);
			any = parseInt(str.substring(4,len), 10);
			any = reformatar_any(any);
			//validem q la data introduida sigui valida
			if (!validateDate(dia, mes, any))
				noerror = -3;
		} else
			noerror = -2;
	} else
		noerror = -1;

	return noerror;
}

function validateDate(day, month, year) {
    var date_ok = true;
    
    if (day < 1)
		date_ok = false;
	if ((month < 1) || (month > 12))
		date_ok = false;
    if (day > getLimitDay(month, year))
        date_ok = false;

    return date_ok;
}

function getLimitDay(month, year) {
    var result = 31;
    
    if (month == 4 || month == 6 || month == 9 || month == 11)
        result = 30;
        
    if (month == 2) {
        if (leapYear(year) == 1) 
            result = 29;
        else 
            result = 28;
    }
    
    return result;
}

function leapYear(year) {

    var result = 0;
    
    if (year % 4 == 0) {
        result = 1;
        if (year % 100 == 0) {
            result = 0;
            if (year % 400 == 0) 
                result = 1;
        }
    }
    
    return result;
}

function checkTime(obj,errors) {
	noerror=true;
	if (obj.value!="") {
		if (!isNaN(obj.value)) {
			switch (obj.value.length) {	
				case 4:noerror=check4DigitTimeFormat(obj,errors);break;
				case 6:noerror=check6DigitTimeFormat(obj,errors);break;
				default:alert(errors[0]);obj.focus();obj.select();return false;break;
			}
		}else {
			alert(errors[0]);obj.focus();obj.select();
			return false;
		}
	}
	return noerror;
}

function check4DigitTimeFormat(obj,errors) {
	hh = parseInt(obj.value.substring(0,2), 10);
	mm = parseInt(obj.value.substring(2,4), 10);
			
	if (!validateTime(hh, mm)) {
		alert(errors[0]);obj.focus();obj.select();	
		return false;
	}
	return true;
}

function check6DigitTimeFormat(obj) {
	hh = parseInt(obj.value.substring(0,2), 10);
	mm = parseInt(obj.value.substring(2,4), 10);
	ss = parseInt(obj.value.substring(4,6), 10);
			
	if (!validateTime(hh, mm, ss)) {
		alert(errors[0]);obj.focus();obj.select();	
		return false;
	}
	return true;
}

function validateTime(hh, mm, ss) {
    var time_ok = true;

    if (hh > 23 || mm > 59)
      time_ok = false;
    if (arguments.length > 2 && ss > 59) 
      time_ok = false;

    return time_ok;
}

function convertCenturyToYears(value) {
	switch (value) {
		case 20:return 1900;
		case 21:return 2000;
		case 22:return 2100;
		case 23:return 2200;
		case 24:return 2300;
		default: return 2000;
	}
}

function addMilesChar (value) {
	
	var valorTmp=null;
	var decimalsTmp=null;
	
	//separem la part entera de la part decimal
	if (value.indexOf(DECIMAL_CHAR)==-1) {
		valorTmp=value;
		decimalsTmp="";
	}else {
		valorTmp=value.substring(0,value.indexOf(DECIMAL_CHAR));
		decimalsTmp=value.substring(valorTmp.length,value.length);
	}
	
	//creem un vector amb tantes posicions com grups de 3 digits es puguin formar
	var tmp=null;
	if (valorTmp.length%3!=0) {
		tmp=new Array(parseInt(valorTmp.length/3, 10)+1);
	}else  {
		tmp=new Array(parseInt(valorTmp.length/3, 10));
	}
	
	//omplim el vector a partir de value
	var nextIndex=0;
	for (var i=0;i<tmp.length;i++) {
		if (i==0) {
			nextIndex=valorTmp.length%3;
			if (nextIndex==0) {
				if (valorTmp.length<3) { //es un num <1000, i el nextind apunta al final
					nextIndex=valorTmp.length;
				}else {
					nextIndex=nextIndex+3;
				}
			}
			tmp[i]=new String(valorTmp.substring(0,nextIndex));						
		}else {			
			tmp[i]=new String(valorTmp.substring(nextIndex,nextIndex+3));
			nextIndex=nextIndex+3;
		}
	}

	value="";
	for (var i=0;i<tmp.length;i++) {
		if ((tmp.length==1)||(tmp.length==i+1)) {			
			value+=tmp[i].toString();
		}else {			
			value+=tmp[i].toString() + MILES_CHAR;
		}
	}
	value=value + decimalsTmp;
	return value;
}

function removeMilesChar (value) {
	if (value!="") {
		var stringArray=null;
		var isDecimal=false;
		if (value.indexOf(DECIMAL_CHAR)!=-1) isDecimal=true;
		
		if (isDecimal) {
			stringArray=value.substring(0,value.indexOf(DECIMAL_CHAR)).split(MILES_CHAR);
		}else {
			stringArray=value.split(MILES_CHAR);
		}
		var result="";
		
		for (var i=0;i<stringArray.length;i++) {
			result+=stringArray[i].toString();
		}
		
		if (isDecimal) {
			result+=value.substring(value.indexOf(DECIMAL_CHAR),value.length);
		}
		return result;
	}else {
		return value;
	}	
}

function removeDateSeparatorChar (value) {
	if (value!="") {
		var stringArray=null;
		var isDecimal=false;
								
		stringArray=value.split(DATE_SEPARATOR);
		
		var result="";
		
		for (var i=0;i<stringArray.length;i++) {
			result+=stringArray[i].toString();
		}
						
		return result;
	}else {
		return value;
	}	
}

function removeTimeSeparatorChar (value) {
	if (value!="") {
		var stringArray=null;
		var isDecimal=false;
								
		stringArray=value.split(TIME_SEPARATOR);
		
		var result="";
		
		for (var i=0;i<stringArray.length;i++) {
			result+=stringArray[i].toString();
		}
						
		return result;
	}else {
		return value;
	}	
}
/*** HELPERS **/
function getJsType(input) {
  if (input.className.toString().indexOf("NUMERIC") > 0) {
    return NUMERIC;
  }
  if (input.className.toString().indexOf("DECIMAL") > 0) {
    return DECIMAL;
  }
  if (input.className.toString().indexOf("STRING") > 0) {
    return STRING;
  }
  if (input.className.toString().indexOf("DATE") > 0) {
    return DATE;
  }
  if (input.className.toString().indexOf("TIME") > 0) {
    return TIME;
  }
  if (input.className.toString().indexOf("CURRENCY") > 0) {
    return CURRENCY;
  }
  if (input.className.toString().indexOf("FULLEDIT") > 0) {
    return FULLEDIT;
  }
  if (input.className.toString().indexOf("COMBO") > 0) {
    return COMBO;
  }  
  return STRING;
}

function getStyleClass(input) {
  switch (getJsType(input)) {
	case NUMERIC : return 'inputsNUMERIC';
	case DECIMAL : return 'inputsDECIMAL';
	case STRING  : return 'inputsSTRING';
	case DATE    : return 'inputsDATE';
	case TIME    : return 'inputsTIME';    
	case CURRENCY: return 'inputsCURRENCY';
	case FULLEDIT: return 'inputsFULLEDIT';
	case CCC     : return 'inputsCCC';
	case COMBO   : return 'inputsCOMBO';
    	default      : return 'inputs';
  }
}

function doInvalidate(input) {
  input.value = '';
}

function doLock(input) {
  /*** DISABLED ***/
  input.disabled = true;
  input.readOnly = false;
  
  /*** READONLY
   * input.disabled = false;
   * input.readOnly = true;
   * 
   * input.className = getStyleClass(input) + 'READONLY';  
   ***/
   
   input.onfocus = function () {
    this.blur;
   }
   input.onblur = function () {
    return true;
   }   
   
}

function doUnLock(input) {
  /*** DISABLED ***/
  input.disabled = false;
  input.readOnly = false;
  
  /*** READONLY
   * input.disabled = false;
   * input.readOnly = false;
   * 
   * input.className = getStyleClass(input);  
   ***/
  
  input.onfocus = function () {
    capture(this, getJsType(input));
  }
  input.onblur = function () {
    display(this, getJsType(input));
  }  
}

function doEnable(input) {
  doUnLock(input);
  doInvalidate(input);
}

function doDisable(input) {
  doInvalidate(input);
  doLock(input);
}

function doFocus(input) {
  if (input.type != "hidden" && !input.disabled && !input.readOnly) {
    input.focus();
  }
}

function setFocus(obj) {
  window.focus();
  obj.focus();
  obj.select();
}

//----------------------------------------------------------------------------- PADDING FUNCTIONS
function leftPad(val, pad, len) {
  var res = val.toString();  
  for (var i = res.length; i < len; i++) {
    res = pad + res;
  }
  return res;
}

function rightPad(val, pad, len) {
  var res = val.toString();
  for (var i = res.length; i < len; i++) {
    res += pad;
  }
  return res;
}

function zeroRightPad(val, len) {
  return rightPad(val, "0", len);
}

function zeroLeftPad(val, len) {
  return leftPad(val, "0", len);
}

function blankRightPad(val, len) {
  return rightPad(val, " ", len);
}

function blankLeftPad(val, len) {
  return leftPad(val, " ", len);
}

//----------------------------------------------------------------------------- CTYPE FUNCTIONS ($)
function isNumeric(value){
  tmp = value.toString();
  for (var i = 0; i < tmp.length; i++) {
    var theChar = tmp.charAt(i);
    if (theChar < "0" || theChar > "9") {
      return false;
    }
  }
  return true;
}

function isEmptyStr(s) {
  if (typeof s == 'undefined' || null == s || 0 >= s.length) {
        return true;
  }
  return false;
}

function toFloat(s) {
  if (isEmptyStr(s)) {
	  return 0.0;  
  }
  var f = removeMilesChar(s);
  f = f.replace(/[,.]/g, '.');
	if (isNaN(f) || isEmptyStr(f)) {
	  return 0.0;  
  }
	return (parseFloat(f));
}

function ftos(f, d) {
  if (isNaN(f)) {
    return "0" + DECIMAL_CHAR + "0";
  }
  var s = f.toString();
  s = s.replace(/[.]/g, DECIMAL_CHAR);
  s = formatDecimals(s, d)
	return s;
}

function getStrFromAry(ary, sep) {
  var results = "";
  if (isAry(ary)) {
    results = ary.join(sep)     
    /*
    for(var i = 0; i < ary.length; i++) {
      if (!isEmptyStr(ary[i])) {
        results += ary[i] + sep;
      }
    } 
    if (results.length > sep.length) {
      results = results.substr(0, (results.length - sep.length));
    }
    */
  } else if (!isEmptyStr(ary)) {
    results += ary;
  }
  return results;
}

//----------------------------------------------------------------------------- CTYPE FUNCTIONS ($)
function isAmount(amount) {
  if (amount && amount.length > 0) {
    var tmp = amount.replace(/[\D]/gi, '');
    if (!isNaN(tmp)) {
      tmp = parseInt(tmp, 10);
      return (tmp > 0);
    }
  }
  return false;
}

//----------------------------------------------------------------------------- CTYPE FUNCTIONS (@)
function isAry(obj) {
  if (typeof obj == 'undefined' || null == obj || obj.constructor.toString().indexOf("Array") == -1) {
    return false;
  } else {
    return true;
  }
}

function isArray(obj) {
  return isAry(obj);
}

function isEmptyAry(obj) {
  if (!isAry(obj) || 0 >= obj.length) {
        return true;
  }
  return false;
}

function isFullAry(obj) {
  if (isEmptyAry(obj)) {
    return false;
  }
  for (var i = 0; i < obj.length; i++) {
    if (isEmptyStr(obj[i])) {
      return false;
    }
  }
  return true;
}

function belongsToAry(ary, val) {
  if (isAry(ary)) {
    for (var i = 0; i < ary.length; i++) {
      if (val == ary[i]) {
        return true;    
      }
    }
  }
  return false;
}

function truncateAry(ary, aryToTruncate) {
  //-- Remove aryToTruncate elements from ary
  var k = 0;
  var aryRes = new Array();
  if (!isAry(aryToTruncate)) {
    if (isEmptyStr(aryToTruncate)) {
      return ary;
    }
    var val = aryToTruncate;
    aryToTruncate = new Array();
    aryToTruncate[0] = val;
  }
  var found;
  for (var i = 0; i < ary.length; i++) {
    found = false;
    for (var j = 0; j < aryToTruncate.length; j++) {
	    if (ary[i] == aryToTruncate[j]) {
	      found = true;
	      break;
			}
	  }
	  if (!found) {
	    aryRes[k++] = ary[i];			
	  }
  }
  return aryRes;
}

function dumpAry(obj, cols) {
  if (arguments.length < 2 || null == cols) {
    cols = 1;
  }
  var col = 0;
  var theDump = "ARRAY:\n\t";
  if (isAry(obj)) {
    for(var i = 0; i < obj.length; i++) {
      theDump = theDump + obj[i] + ", ";
      if (++col == cols) {
        theDump = theDump + "\n\t";
        col = 0;
      }
    }
  } else {
    theDump = "SCALAR: " + obj;
  }
  alert(theDump);
}

function filterAry(ary, regexp) {
  var results = new Array();
  var j = 0;
  for(var i = 0; i < ary.length; i++) {
    if (regexp.test(ary[i])) {
        results[j++] = ary[i];
    }
  }
  return results;
}
function str2array( s, delim ){
  // rebuild an array returned from server as string
  // optional delimiter defaults to ~
  var d = (delim == null)? '~' : delim;
  var a = s.split(d);
  if (!isArray(a)) {
    a = new Array("");
  }
  return a;
}

function getAryFromStr(str, sep) {
  if (isEmptyStr(str)) {
    return new Array();
  }
  if (str.indexOf(sep) < 0) {
    var ary = new Array();
    ary[0] = str;
    return ary;
  }
  return str.split(sep);
}

var ARY_FROM_LABELS = "L";
var ARY_FROM_VALUES = "V";

function getAryFromLst(lst, lv) {
  if (!lst) return new Array();
  lv = (lv == ARY_FROM_LABELS) ? ARY_FROM_LABELS : ARY_FROM_VALUES;
  var res = new Array();
  var j = 0;
  for(var i = 0; i < lst.options.length; i++) {
    if (lv == ARY_FROM_LABELS) {
      res[j++] = lst.options[i].text;
    } else {
      res[j++] = lst.options[i].value;
    }
  }
  return res;
}

//----------------------------------------------------------------------------- NUMBER MANIPULATION
function compareTo(x, y) {
  /**
   * x < y :: -1
   * x = y ::  0
   * x > y :: +1
   */
  var tx = typeof(x);
  if (tx != typeof(y)) {
    return NaN;
  }
  switch (tx) {
		case 'number' :
		  if (isNaN(x) || isNaN(y)) {
		    return NaN;
		  }
		  var fx = parseFloat(x);
		  var fy = parseFloat(y);
      if (fx == fy) {    
        return 0;
      } 
      if (fx > fy) {
        return 1;
      }
      return -1;
    case 'string' :
      //-- TODO
      return 0;
    case 'boolean' : 
      if (x == y) {    
        return 0;
      } 
      if (x) {
        return 1;
      }
      return -1;
    case 'object' :
    case 'function' :
    default :
      return NaN;
  }
}

//----------------------------------------------------------------------------- STRING MANIPULATION
String.prototype.trim = function() {
 // skip leading and trailing whitespace
 // and return everything in between
  var x=this;
  x=x.replace(/^\s*(.*)/, "$1");
  x=x.replace(/(.*?)\s*$/, "$1");
  return x;
}

//----------------------------------------------------------------------------- DATE MANIPULATION
function intValue(val) {
  val = parseInt(val, 10);
  if (isNaN(val) || val == 0) {
    return 0;
  }
  if (val > 0) {
    return Math.floor(val);
  }
  return Math.ceil(val);
}

function doCompareDates(dt1, dt2) {
  var date1 = getDate(dt1);
  var date2 = getDate(dt2);
  var y1 = date1.getFullYear();
  var y2 = date2.getFullYear();
  var m1 = date1.getMonth();
  var m2 = date2.getMonth();
  var d1 = date1.getDate();
  var d2 = date2.getDate();
  if (y1 > y2) {
    return 1;
  }
  if (m1 > m2) {
    return 1;
  }
  if (d1 > d2) {
    return 1;
  }
  if (y1 == y2 && m1 == m2 && d1 == d2) {
    return 0;
  }
  return -1;
}

function doAddToDate(theDate, theInterval, theIntervalType) {
  var tmpDate = getDate(theDate);
  var y = tmpDate.getFullYear();
  var m = tmpDate.getMonth();
  var d = tmpDate.getDate();
  switch (theIntervalType) {
		case DATE_DAY:   
      if (d < getLimitDay(m, y)) {
        tmpDate = new Date(y, m, d + 1)
      }
      if (m < 11) {
        tmpDate = new Date(y, m + 1, 1)
      }
      tmpDate = new Date(y + 1, 0, 1)
      break;
		case DATE_MONTH:
      tmpDate = new Date((m < 11) ? y : (y + 1), (m + 1) % 12, d)
      break;
		case DATE_YEAR:
      tmpDate = new Date(y + 1, m, d)
      break;
    default:
      tmpDate = new Date();
      break;
	 }
  return getEsDate(tmpDate);
}

function getDate(str) {
  if (0 == arguments.length || 0 >= str.length) {
    return new Date();
  }
  var arDate;
  if (str.indexOf("/") >= 0) {
    arDate = str.split("/", 3);
  } else {
    arDate = new Array();
    arDate[0] = str.substr(0, 2);
    arDate[1] = str.substr(2, 2);
    arDate[2] = str.substr(4, 4);
  }
  if (isArray(arDate)) {
    return new Date(parseInt(arDate[2], 10), parseInt(arDate[1], 10), parseInt(arDate[0], 10));
  }
  return new Date();
}

function getEsDate(date) {
  return (zeroLeftPad(date.getDate(), 2) + "/" + zeroLeftPad(date.getMonth(), 2) + "/" + date.getFullYear());
}

function calculateAge(fechaNacimiento) {     
    dateArray=fechaNacimiento.split(DATE_SEPARATOR);
    if (dateArray.length==3) {
      
      var mm1 = parseInt(dateArray[1], 10);      
      var dd1 = parseInt(dateArray[0], 10);            
      var yy1 = parseInt(dateArray[2], 10);
        
      myDate = new Date(yy1,mm1,dd1);
      
      return round((new Date() - myDate) / 24 / 60 / 60 / 1000 / 365.25);
    }
  }

function round(x) { return Math.round (x * 100) / 100; }

//----------------------------------------------------------------------------- DELETE
function f_cancelar() {
  window.location = "CancelarProceso.do";
}

function f_dto_cancelar(dtoForm, dtoAction) {
  window.location = dtoAction;
}

function cbDummy() {
  return true;
}

//----------------------------------------------------------------------------- OBJECTS: DECIMAL
function isGDecimal(obj) {
  if (typeof obj == 'undefined' || null == obj || obj.constructor.toString().indexOf("GDecimal") == -1) {
    return false;
  } else {
    return true;
  }
}

//-- Locale dependent
function stod(s) {
  if (!isEmptyStr(s)) {
    var f = removeMilesChar(s);
    f = f.replace(/[,.]/g, '.');
	  if (!isNaN(f) && !isEmptyStr(f)) {
      return new GDecimal(f);
    }
  }
  return new GDecimal()
}

//-- Locale dependent
function dtos(f) {
  if (isEmptyStr(f)) {
    return "0" + DECIMAL_CHAR + "0";
  }
  return f.toString().replace(/[,.]/g, DECIMAL_CHAR);
}

GDecimal = function(s) {
  if (isGDecimal(s)) {
    this.precision = s.precision;
    this.mantisa = s.mantisa;
  } else if (isNaN(s)) {
	  this.precision = 0;
 	  this.mantisa = 0;  
  } else {
    var f = s.toString();
    var point = f.indexOf('.');
    if (point < 0) {
      this.precision = 0;
      this.mantisa = f;
    } else {
      this.precision = f.length - f.indexOf('.') - 1;
      this.mantisa = f * Math.pow(10, this.precision);
    }
  }
}

GDecimal.prototype.getClass = function() { return this.constructor };

GDecimal.prototype.toString = function(d) { 
  if (isNaN(this.mantisa)) {
    return 0;
  }
  var decimals = d || 0;
  var tens = Math.pow(10, decimals);
  var f = Math.round((this.mantisa / Math.pow(10, this.precision)) * tens) / tens;
  return dtos(f);
}

GDecimal.prototype.compareTo = function(y) {
  var mp = this.normalize(this, y);
  //-- COMPARE
  if (mp[0] == mp[1]) {
    return 0;
  }
  if (mp[0] > mp[1]) {
    return 1;
  }
  return -1; 
}

GDecimal.prototype.add = function(y) {
  var mp = this.normalize(this, y);
  //-- ADD
  this.mantisa = mp[0] + mp[1];
  this.precision = mp[2];
  return this;
}

GDecimal.prototype.substract = function(y) {
  var mp = this.normalize(this, y);
  //-- SUBSTRACT
  if (mp[0] == mp[1]) {
    this.mantisa = 0;
    this.precision = 0;
  } else if (mp[0] > mp[1]) {
    this.mantisa = mp[0] - mp[1];
    this.precision = mp[2];    
  } else {
    this.mantisa = mp[1] - mp[0];
    this.precision = mp[2];    
  }
  return this;
}

GDecimal.prototype.multiply = function(y) {
  var mp = this.normalize(this, y);
  //-- MULTIPLY
  this.mantisa = mp[0] * mp[1];
  this.precision = mp[2] + mp[3];
  return this;
}

GDecimal.prototype.divide = function(y) {
  var mp = this.normalize(this, y);
  //-- DIVIDE
  if (mp[1] == 0) {
    return NaN;
  }
  var f = new GDecimal(mp[0] / mp[1]);
  this.mantisa = f.mantisa;
  this.precision = f.precision + Math.abs(mp[2] - mp[3]);
  return this;
}

GDecimal.prototype.normalize = function(x, y) {
  var objx = new GDecimal(x);
  var objy = new GDecimal(y);
  var mx = 0; var my = 0;
  var px = 0; var py = 0;
  var exponent = Math.pow(10, Math.abs(objx.precision - objy.precision));

  if (objx.precision >= objy.precision) {
    mx = objx.mantisa;
    my = objy.mantisa * exponent;
    px = objx.precision;
    py = objx.precision;
  } else {
    mx = objx.mantisa * exponent;
    my = objy.mantisa;
    px = objy.precision;
    py = objy.precision;
  }
  var ary = new Array(mx, my, px, py);
  return ary
}

function ignorarEnter(tecla) {
	if (tecla == 13) {
		window.event.keyCode = 0;
		window.event.cancelBubble = true;
	}
	
	return false;
}