/**
 * Variable para manejar el foco de los controles
 */
var controlFocus=null;
var field_names=new Array();
var extra_errors = "";

/**
 * Función que muestra el error cometido por el usuario en un control.
 * Además maneja el foco para ponerlo sobre el control que contiene el error
 * @param error el error que introdujo el usuario
 * @param control el objeto que representa el control en la form
 */
function error_message(error, control)
{
  if(error.length != 0 && control.value!="")
  {
    if(controlFocus!=null)
    {
      if(controlFocus==control)
      {
        alert(error);
      }
      controlFocus.focus();
    }
    else
    {
      controlFocus=control;
      alert(error);
      controlFocus.focus();
    }
  }
  else
  {
    controlFocus=null;
  }
}

// email
function verifyEmail(control)
{
  var error = validateEmail(control);
  error_message(error,control);
}

function validateEmail(control)
{
  var email = control.value;
  var error = "";
  var regEx = new RegExp("^[\\w\.=-][^+]+@([\\w\-]+\\.)+[a-z]{2,4}$");
  if(!regEx.test(email))

    error+=validationErrors['email'].replace('%FIELD%',field_names[control.name]) +".\n";
  return error;
}

// password - 6 o mas caracteres, 2 numericos, por lo menos 4 no numéricos

function verifyPassword(control,minimunLength)
{
  var error = validatePassword(control,minimunLength);
  error_message(error,control);
}    

// password - 6 o mas caracteres, 2 numericos, por lo menos 4 no numéricos
/* Modificado por giovanny para validar el la longitud minima minimo */
function validatePassword(control,minimunLength)
{
  var passwd = control.value;
  var error = "";
  var minimum = 6;
 if(minimunLength){
	 if(minimunLength>6)
		 minimum = minimunLength;
 }
  if ((passwd.length < minimum))
  {

    error += validationErrors['password1'].replace('%FIELD%',field_names[control.name]) +" ";
    error += validationErrors['minimunLength1'].replace('%NUM%',minimum) +".\n";

  }
  var regExpDigits = new RegExp("\.*\\d\.*\\d\.*$");
  var regExpChars = new RegExp("\.*[^\\d ]\.*[^\\d ]\.*[^\\d ]\.*[^\\d ]\.*$");
  if (!regExpDigits.test(passwd))
  {
    error += validationErrors['password2'].replace('%FIELD%',field_names[control.name]) +".\n";

  } 
  if (!regExpChars.test(passwd))
  {
    error += validationErrors['password3'].replace('%FIELD%',field_names[control.name]) +".\n";

  } 
  return error;
}    

function validateEqualFields(control1, control2)
{ 
  var error = "";
  if(control1.value != control2.value)
  {
    error += validationErrors['password4'].replace('%FIELD1%',field_names[control2.name]).replace('%FIELD2%',field_names[control1.name]) +".\n";
  }
  return error;
}

function verifyEqualFields(control1, control2)
{
  var error = validateEqualFields(control1, control2);
  if(error.length != 0)
  {
    control1.value="";
    if(controlFocus!=null)
    {
      if(controlFocus==control1)
      {
        alert(error);
        controlFocus=control2;
      }
      controlFocus.focus();
    }
    else
    {
      controlFocus=control2;
      alert(error);
      controlFocus.focus();
    }
  }
  else
  {
    controlFocus=null;
  }
}

function validateForm(form)
{
  var element;
  var reviewedControl;
  var errors = "";
  var tmp_name = "";
  for(var i=0; i < form.length; i++)
  {
    element = form.elements[i];
    if(isGeneratedControl(element.id))
    {
      if(isObligatory(element.id) && element.name != reviewedControl)
      {
    	reviewedControl = element.name;
        if(element.value=="")
        {
		  tmp_name = element.name;
		  if(tmp_name.substring(tmp_name.length-2) == '[]') {
			tmp_name = tmp_name.substring(tmp_name.length-2,0);
		  }
          errors += validationErrors['obligatory'].replace('%FIELD%',field_names[tmp_name]) +".\n";
        }
        else
        {
          var ctrlType = controlType(element.id);
          switch(ctrlType)
          {
            case  1:  //alert(element.name + " es de tipo email.\n");
                      var temp = validateEmail(element);
                      if(temp!="")
                        errors += temp;
                      break;
            case  2:  //alert(element.name + " es de tipo password.\n");
                      var temp = validatePassword(element);
                      if(temp!="")
                        errors += temp;
                      break;
            case  3:  //alert(element.name + " es de tipo fecha.\n");
                      break;
            case  4:  //alert(element.name + " es de tipo lista.\n");
                      var temp = validateList(form.elements[element.name]);
                      if(temp!="")
                        errors += temp;
                      break;
            case  5:  //alert(element.name + " es de tipo numero real.\n");
                      break;
            case  6:  //alert(element.name + " es de tipo numero entero.\n");
                      break;
            case  7:  //alert(element.name + " es de tipo RadioList.\n");
                      var temp = validateRadioOCheck(form.elements[element.name]);
                      if(temp!="")
                        errors += temp;
                      break;
            case  8:  //alert(element.name + " es de tipo CheckList.\n");
                      var temp = validateRadioOCheck(form.elements[element.name]);
                      if(temp!="")
                        errors += temp;
                      break;
            case  9:  //alert(element.name + " es de tipo texto.\n");
                      break;
            case  10:  //alert(element.name + " es de tipo textarea.\n");
                      break;
            case  11:  //alert(element.name + " es de tipo hidden.\n");
                      break;
            default:
                      break;
          }
        }
      }
    }
  }
  if(extra_errors!="")
  {
  	errors += extra_errors;
	extra_errors = "";
  }
  	
  if(errors!="")
  {
    alert(errors);
    return false;
  }
  else
    return true;
}

function isObligatory(nombreControl)
{
  var regEx = /_O_/;
  return regEx.test(nombreControl);
}

function controlType(idControl)
{
  var regExText = new RegExp("__CText__");
  var regExTextArea = new RegExp("__CTextArea__");
  var regExEmail = new RegExp("__CEmail__");
  var regExPassword = new RegExp("__CPassword__");
  var regExDate = new RegExp("__CDate__");
  var regExList = new RegExp("__CList__");
  var regExNumberReal = new RegExp("__CNumberReal.*__");
  var regExNumberInteger = new RegExp("__CNumberInteger.*__");
  var regExRadio = new RegExp("__CRadioList__");
  var regExCheck = new RegExp("__CCheckList__");
  var regExHidden = new RegExp("__CHidden__");
  
  if(regExEmail.test(idControl))
    return 1;
  if(regExPassword.test(idControl))
    return 2;
  if(regExDate.test(idControl))
    return 3;
  if(regExList.test(idControl))
    return 4;
  if(regExNumberReal.test(idControl))
    return 5;
  if(regExNumberInteger.test(idControl))
    return 6;
  if(regExRadio.test(idControl))
    return 7;
  if(regExCheck.test(idControl))
    return 8;
  if(regExText.test(idControl))
    return 9;
  if(regExTextArea.test(idControl))
    return 10;
  if(regExHidden.test(idControl))
    return 11;
  else
    return 0;
}

function isGeneratedControl(idControl)
{
  var regEx = new RegExp("(_O_|__CTextArea__|__CText__|__CEmail__|__CPassword__|__CDate__|__CList__|__CNumberReal.*__|__CNumberInteger.*__|__CRadioList__|__CCheckList__|__CHidden__)");
  
  if(idControl == null)
    return false;
  return regEx.test(idControl);
}

function validateValueReal(control)
{
  var error = "";
  numberRegExp = new RegExp("^-{0,1}[\\d]+(\\.[\\d]+){0,1}$");
  if(!numberRegExp.test(control.value))
  {
    error += validationErrors['numeric'].replace('%FIELD%',field_names[control.name]) +".\n";
  }
  return error;
}

function validateValueInteger(control)
{
  var error = "";
  numberRegExp = new RegExp("^-{0,1}[\\d]+$");
  if(!numberRegExp.test(control.value))
  {
    error += validationErrors['invalid_numeric'].replace('%FIELD%',field_names[control.name]) +".\n";
  }
  return error;
}

function verifyValueReal(control)
{
  var error = validateValueReal(control);
  if(hasRange(control))
  {
    error += validateRange(control);
  }
  error_message(error,control);
}    

function verifyValueInteger(control)
{
  var error = validateValueInteger(control);
  if(hasRange(control))
  {
    error += validateRange(control);
  }
  error_message(error,control);
}    

function hasRange(control)
{
  var rangorx = new RegExp("\\[\\d+>\\d+\\]");
  var identificador = control.id;
  return rangorx.test(identificador);
}


function validateRange(control)
{
  var error = "";
  var indexFrom, indexTo, indexSign, iden ;  
  
  iden = new String(control.id);
  indexFrom = iden.indexOf("[");
  indexSign = iden.indexOf(">");
  indexTo = iden.indexOf("]");
  
  var rangeFrom = parseFloat(iden.substring(indexFrom+1,indexSign));
  var rangeTo = parseFloat(iden.substring(indexSign+1,indexTo));

  if(!(parseFloat(control.value) >= rangeFrom && parseFloat(control.value) <= rangeTo))
  {
    error += validationErrors['range_value'].replace('%RANGE_FROM%',rangeFrom).replace('%RANGE_TO%',rangeTo) +".\n";
  }
  return error;
}


function validateRadioOCheck(control_array)
{
  var checked = 0;
  var error = "";

  for(var i=0;i<control_array.length;i++) {
	if(control_array[i].checked) {
	  checked = 1;
	}
  }

  if(!checked)
  {
	if(control_array[0].type == "checkbox") {
      var nombre = control_array[0].name;
		nombre = nombre.replace("[]","");
	      error += validationErrors['select1'].replace('%FIELD%',field_names[nombre]) + ".\n";
	} else {
      error += validationErrors['select2'].replace('%FIELD%',field_names[control_array[0].name]) +".\n";
	}
  }
    
  return error;
}

function validateList(control_array)
{
  var selected = true;
  var error = "";

  for(var i=0;i<control_array.length;i++) {

	if(control_array[i].selected && (control_array[i].value == '0' || control_array[i].value == '' || control_array[i].value.substring(0,9) == '__BLANK__')) {
	  selected = false;
	}
  }

  if(!selected)
  {
	if(control_array.type == "select-one") {
      error += validationErrors['select2'].replace('%FIELD%',field_names[control_array.name]) +".\n";
	} else {
      error += validationErrors['select1'].replace('%FIELD%',field_names[control_array.name.substring(0,control_array.name.length-2)]) + ".\n";
	}
  }

  return error;
}


function formatCurrency(number)
{
  var s = new String(number);
  var other = new String();
  var decimals = new String();
  var indexComma = s.indexOf(".");
  
  if(indexComma != -1)
  {
    decimals = s.substring(indexComma,s.length);
    s = s.substring(0,indexComma);
  }

  var i=s.length-1,j=0;
  while(i >= 0)
  {
    if(j==3)
    {
      other = "," + other;
      j=0;
    }
    other =  s.charAt(i)+ other;
    i--;
    j++;
  }
  if(indexComma != -1)
  {
    other += decimals;
  }
  return other;
}

function format(control)
{
  control.value = formatCurrency(remove_characters(control.value));
}

function remove_characters(argument)
{
  var ch, new_value='';
  for (i=0; i<(argument.length); i++)
  {
    ch=(argument.substring(i,i+1));
    if (ch!=' ' && ch!='$'  && ch!=',')
    {
      new_value +=ch;
    }
  }
  return(new_value);
}

function IsValidTime(timeStr) {

	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	var matchArray = timeStr.match(timePat);
	if (matchArray == null) {
		alert("Este no es un formato de hora válido.");
		return false;
	}
	hour = matchArray[1];
	minute = matchArray[2];
	second = matchArray[4];
	ampm = matchArray[6];

	if (second=="") { 
		second = null; 
	}
	if (ampm=="") { 
		ampm = null 
	}
	if (hour < 0  || hour > 23) {
		alert("La hora debe estar entre 0 y 23 ");
		return false;
	}
	if (minute<0 || minute > 59) {
		alert ("Los minutos deben estar entre 0 y 59.");
		return false;
	}
	if (second != null && (second < 0 || second > 59)) {
		alert ("Los segundos deben estar entre 0 y 59.");
		return false;
	}
	return true;
}

function compare_time(time1,time2){
	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	var matchArray1 = time1.match(timePat);
	var matchArray2 = time2.match(timePat);
	hour1 = matchArray1[1];
	minute1 = matchArray1[2];
	second1 = matchArray1[4];
	
	hour2 = matchArray2[1];
	minute2 = matchArray2[2];
	second2 = matchArray2[4];
	if(hour1>hour2 ){
			alert("Rango de horas Inválido");
		return false;
	}else if(hour1==hour2 && minute1>=minute2 ){
			alert("Rango de horas Inválido");
		return false;

	}else if(hour1==hour2 && minute1==minute2 && second1>=second2){
			alert("Rango de horas Inválido");
		return false;
	}
	return true;
}

function CompareDate(date1,date2){
	
	var temp = new Array();
	//fecha inicio
	temp = date1.split('-');
	inicio = new Date();
	inicio.setMonth(temp[1]-1);
	inicio.setDate(temp[2]);
	inicio.setYear(temp[0]);

	//fecha fin
	temp = date2.split('-');
	fin = new Date();
	fin.setMonth(temp[1]-1);
	fin.setDate(temp[2]);
	fin.setYear(temp[0]);
	
	//diferencia
	diff= fin-inicio;

	mtg = new String(diff/86400000); 
	if (mtg<0){
			alert ("Rango de fechas inválido");
			return false;
	}
	return true;
}

function IsValidProgram(form){
	if(CompareDate(form.programation_inic_date.value,form.programation_end_date.value)){
		if(IsValidTime(form.hora_inic.value) && IsValidTime(form.hora_fin.value)){
			compare_time(form.hora_inic.value,form.hora_fin.value);
			return true;
		}
	}
	return false;
	
}
