// ----------------------------------------------------
// by Xavier Sarrate (aka ker)
// Company : abilbo
// Last modified : 23/03/2005
// ----------------------------------------------------

// validate creates a new validate object joined to _form form

function validate(_form){
  this.vform = _form;

  this.getCheckedValue = getChckValue;
  this.isAny           = yearField;
  this.isBigger        = biggerField;
  this.isChecked       = checkedRadio;           // Comprueba que haya alguna opción checkeada en un grupo de radios // By Oberkom (30-12-02)
  this.isChecked       = checkedField;
  this.isCP            = cpField;
  this.isDate          = testDate;		    	// Vicens 9/11/2000 . Comprovacion de la fecha.
  this.isDC            = validarCCC;			// Comprovacion del Dígito de Control de una cuenta Bancaria
  this.isDNI           = dniField;
  this.isDia           = diaField;
  this.isEmpty         = emptyField;
  this.isEqual         = equalField;
  this.isFileExtension = fileExtension;
  this.isMail          = mailField;
  this.isMes           = mesField;
  this.isNumber        = numberField;
  this.isPhone         = phoneField;
  this.isSelected      = selectedField;
  this.isSmaller       = smallerField;
  this.isText          = textField;
  this.OberpostalCode  = ObercpNumber;          // idem postalcode pero sin ceuta y melilla
  this.Oberprefix      = OberprefixNumber;	    // idem prefix pero sin ceuta y melilla
  this.optionSelected  = optionSelectedField;
  this.postalCode      = cpNumber;
  this.prefix          = prefixNumber;
  this.showMessages    = showMessage;
  this.size            = sizeField;

  this.errorTB=TextBoxError;
  this.errorSelect=SelectError;
  this.errorCheck=CheckError;

  this.numberMessages=0;
  this.messages=new Array();

  this.getError=vfGetError;
  this.putError=vfPutError;

}
	// flag para la opcion de mostrar o no los mensajes de error
var displayMessage=true;

	// si el valor del parametro es 1, no enseñara los mensajes de error.
	// En caso de no informar el param o poner un valor diferente, si los muestra.
	// Ejemplo de utilizacion : Cuenta Directa y Cuenta Personal Directa
function showMessage(flag){
	displayMessage=(!(flag==1))
}

// emptyField returns true when field _aux is empty
function emptyField(_field){
  tType=eval("document."+this.vform+"."+_field+".type")
  switch(tType){
    case "textarea" :
    case "text" : var myVar;
    		  myVar = eval("document."+this.vform+"."+_field+".value");
    		  myVar = myVar.replace(/\s/g,"");
    		  return (myVar.length==0)?true:false;
    case "password" : var myVar;
    		  myVar = eval("document."+this.vform+"."+_field+".value");
    		  myVar = myVar.replace(/\s/g,"");
    		  return (myVar.length==0)?true:false;
    case "hidden" : var myVar;
    		  myVar = eval("document."+this.vform+"."+_field+".value");
    		  myVar = myVar.replace(/\s/g,"");
    		  return (myVar.length==0)?true:false;
    case "file" : var myVar;
    		  myVar = eval("document."+this.vform+"."+_field+".value");
    		  myVar = myVar.replace(/\s/g,"");
    		  return (myVar.length==0)?true:false;
    case "select": return (eval("document."+this.vform+"."+_field+".selectedIndex==-1"))?true:false;
    case "select-one": return (eval("document."+this.vform+"."+_field+".selectedIndex==-1"))?true:false;
    case "select-multiple": return (eval("document."+this.vform+"."+_field+".selectedIndex==-1"))?true:false;
  }
}

// fileExtension returns true when _field value is a file value and has the correct extension
// else return false

function fileExtension(_field,_extension){
    tType = eval("document."+this.vform+"."+_field+".type");
    if (tType=="file"){
            myVar = eval("document."+this.vform+"."+_field+".value");
            myPos = myVar.lastIndexOf(".")
            myExt = myVar.substring(myPos+1).toUpperCase();
            if (_extension.toUpperCase().indexOf(myExt)!=-1) return true;
    } else return false;
}


// true if some option is selected in radio group, false if not.

function checkedRadio(_field){
some = false;
for (i=0;i<eval("document."+this.vform+"."+_field+".length");i++) eval("if (document."+this.vform+"."+_field+"["+i+"].checked) some=true");

return some;
}

function getChckValue(_field){
numOpt = eval("document."+this.vform+"."+_field+".length");

    rtnValue = null;
    for (i=0;i<numOpt;i++) eval("if (document."+this.vform+"."+_field+"["+i+"].checked) rtnValue=document."+this.vform+"."+_field+"["+i+"].value");

    return rtnValue;
}

// numberField returns true when field _field is a number
// note : when numberField is a negative number it returns false
// last update by Oberkom 23.03.2005

function numberField(_field){
    var er_numero = /^([0-9\s\+\-])+$/
    return er_numero.test(eval("document."+this.vform+"."+_field+".value"));
    //return (isNaN(parseInt(eval("document."+this.vform+"."+_field+".value")))||(parseInt(eval("document."+this.vform+"."+_field+".value"))<0))?false:true;
}

// mailField returns true when field _aux is a well formated email address

function mailField(_field){ return (eval("document."+this.vform+"."+_field+".value.replace(/.+@.+\..+/,'').length!=0"))?false:true; }
// textField returns true when field _aux is a text

function textField(_field){ return (!isNaN(parseInt(eval("document."+this.vform+"."+_field+".value"))))?false:true; }

// selectedField returns true when field _aux has some option selected

function selectedField(_field){ return (eval("document."+this.vform+"."+_field+".selectedIndex==-1"))?true:false; }

// optionSelectedField returns index of selected option
function optionSelectedField(_field){ return (eval("document."+this.vform+"."+_field+".selectedIndex")); }

// sizeField returns _field field size (number of chars)

function sizeField(_field){ return parseInt(eval("document."+this.vform+"."+_field+".value.length")); }

// biggerField returns true if _field value is bigger than _value value

function biggerField(_field,_value){ return (eval("parseInt(document."+this.vform+"."+_field+".value)>parseInt("+_value+")"))?true:false; }

// smallerField returns true if _field value is smaller than _value value

function smallerField(_field,_value){ return (eval("parseInt(document."+this.vform+"."+_field+".value)<parseInt("+_value+")"))?true:false; }

// equalField returns true if _field value is equal to _value value

function equalField(_field,_value){ return (eval("parseInt(document."+this.vform+"."+_field+".value)==parseInt("+_value+")"))?true:false; }

// checkedField returns true if _field _field is checked

function checkedField(_field){
var _return=false;
  if(eval("document."+this.vform+"."+_field+".type==\"checkbox\"")) return eval("document."+this.vform+"."+_field+".checked")
  for(i=0;i<eval("document."+this.vform+"."+_field+".length");i++){
    _return=eval("document."+this.vform+"."+_field+"["+i+"].checked");
    if(_return) return true;
  }
  return false;
};

// dniField returns whether or not a field is a DNI format
function dniField(_field){
var res="";
var letra="";
var letraNIF=new Array('T','R','W','A','G','M','Y','F','P','D','X','B','N','J','Z','S','Q','V','H','L','C','K','E','T');
var numero=new String(eval("document."+this.vform+"."+_field+".value"));
numero=numero.toUpperCase();
for(var i=0;i<numero.length;i++)
  if(!isNaN(numero.charAt(i))) res+=numero.charAt(i);
if(res=="") return false;
for(var i=numero.length-1;i>=0;i--)
  if((numero.charCodeAt(i)>=65)&&(numero.charCodeAt(i)<=90)){
    letra=numero.charAt(i);
    i=-1;
  }
if(letra=="") return false;
var posicion=res-parseInt(res/23)*23;
if (letraNIF[posicion]==letra) return true;
else return false;
}

// cpField return whether of not a field is a postal code format
function cpField(_field){re=/^\d{5}$/;return(eval("document."+this.vform+"."+_field+".value.match(re)"));}

// mesField return whether of not a field is a correct month number
function mesField(_field){
  val=eval("document."+this.vform+"."+_field+".value");
  val=(val.charAt(0)=='0')?parseInt(val.charAt(1)):val=parseInt(val);
  return((val>=1)&&(val<=12));}

// diaField return whether of not a field is a correct day number
function diaField(_field){
  val=eval("document."+this.vform+"."+_field+".value");
  val=(val.charAt(0)=='0')?parseInt(val.charAt(1)):val=parseInt(val);
  return((val>=1)&&(val<=31));}

// phoneField return whether of not a field is a correct phone number
function phoneField(_field){re=/^\d{9}$/;return(eval("document."+this.vform+"."+_field+".value.match(re)"));}

// yearField return whether of not a field is a correct year number
function yearField(_field){re=/^\d{4}$/;return(eval("document."+this.vform+"."+_field+".value.match(re)"));}

// TextBoxError executes actions to show an error in a textbox
function TextBoxError(_message,_field){
  if (displayMessage){
  	  alert(_message);
  	  eval("document."+this.vform+"."+_field+".focus()");
  	  eval("document."+this.vform+"."+_field+".select()");
  }return false;
}

// SelectError executes actions to show an error in a select box
function SelectError(_message,_field){
  if (displayMessage){
	  alert(_message);
	  eval("document."+this.vform+"."+_field+".focus()");
  }return false;
}

// CheckError executes actions to show an error in a CheckBox
function CheckError(_message,_field){
  if (displayMessage){
  		alert(_message);
  }return false;
}

function prefixNumber(_field){
  var prefijos=new Array('981','945','967','96','950','98','920','924','971','93','947','927','956','942','964','956','926','957','969','972','928','958','949','943','959','974','953','941','987','982','973','91','95','952','968','948','988','979','986','923','921','95','975','977','922','978','925','96','983','94','980','976');
  var numero=(eval("document."+this.vform+"."+_field+".selectedIndex"));
  return prefijos[numero-1];
}

function OberprefixNumber(_field){
  var prefijos=new Array('981','945','967','96','950','98','920','924','971','93','947','927','942','964','956','926','957','969','972','928','958','949','943','959','974','953','941','987','982','973','91','95','968','948','988','979','986','923','921','95','975','977','922','978','925','96','983','94','980','976');
  var numero=(eval("document."+this.vform+"."+_field+".selectedIndex"));

  return prefijos[numero-1];
}

function cpNumber(_field){
  //miramos que cual es el valor del array en la posicion señalada por la provincia señalada por el combo
  //var prefijosCP=new Array('01','02','03','04','33','05','06','07','08','09','10','11','39','12','13','14','15','16','17','35','18','19','20','21','22','23','15','26','24','27','25','28','29','30','31','32','34','36','37','40','41','42','43','38','44','45','46','47','48','49','50');
  var prefijosCP=new Array('15','01','02','03','04','33','05','06','07','08','09','10','11','39','12','51','13','14','16','17','18','19','20','21','22','23','26','35','24','25','27','28','29','52','30','31','32','34','36','37','40','41','42','43','38','44','45','46','47','48','49','50');
  var numero=(eval("document."+this.vform+"."+_field+".selectedIndex"));
  return prefijosCP[numero-1];
}

// The same as cpNumber but we select the element by the value of _field

function ObercpNumber(_field){
  var prefijosCP=new Array('15','01','02','03','04','33','05','06','07','08','09','10','11','39','12','13','14','16','17','18','19','20','21','22','23','26','35','24','25','27','28','29','30','31','32','34','36','37','38','40','41','42','43','44','45','46','47','48','49','50');
  var numero=((eval("document."+this.vform+"."+_field+".selectedIndex")));

  return prefijosCP[numero-1];
}


	// Comprovacion de que la fecha es coherente ( dias de febrero segun el año, 30 y 31's correctos segun el mes)
function testDate(_fieldYear,_fieldMonth,_fieldDay){
	var fechaAux=new Date(eval("document."+this.vform+"."+_fieldYear+".value"),eval("document."+this.vform+"."+_fieldMonth+".value")-1,eval("document."+this.vform+"."+_fieldDay+".value"))
	return ((fechaAux.getDate()==parseInt(eval("document."+this.vform+"."+_fieldDay+".value")))||(fechaAux.getMonth()==parseInt(eval("document."+this.vform+"."+_fieldMonth+".value"))-1))
}




function vfPutError(_message){
  this.messages[this.numberMessages]=_message;
  return this.numberMessages++;
}

function vfGetError(_number,_field){
  return this.messages[_number]+" "+_field;
}


//Funciones para la comprovacion del digito de control de las cuentas bancarias.
function esN (c,l) {
   if (c.length != l)
     return false;
   else
     for (i=0; i<l; i++) {
	k=c.charAt(i);
	if((k<"0")||(k>"9")) return false;
     }
   return true;
}
function dg(s,i,w) {
    return (eval(s.charAt(i-1))*w)
}
function ctrl(s) {
   return (d=11-(s%11))==10? 1: d==11? 0: d;
}
function validaCCC(B, S, D, C) {
   if (!esN(B,4)||!esN(S,4)||!esN(D,2)||!esN(C,10)) return -1;
   sA = dg(B,1,4)+dg(B,2,8)+dg(B,3,5)+dg(B,4,10)+dg(S,1,9)+dg(S,2,7)+dg(S,3,3)+dg(S,4,6);
   sB = dg(C,1,1)+dg(C,2,2)+dg(C,3,4)+dg(C,4,8)+dg(C,5,5)+dg(C,6,10)+dg(C,7,9)+dg(C,8,7)+dg(C,9,3)+dg(C,10,6);
   return ctrl(sA)==dg(D,1,1)? (ctrl(sB)==dg(D,2,1)? 0: 2): 1;
}

function validarCCC(_fieldBanco, _fieldSucursal, _fieldDigito, _fieldCuenta) {
	return validaCCC(eval("document."+this.vform+"."+_fieldBanco+".value"),eval("document."+this.vform+"."+_fieldSucursal+".value"),eval("document."+this.vform+"."+_fieldDigito+".value"),eval("document."+this.vform+"."+_fieldCuenta+".value"))==0;
}