// JavaScript Document for custom Validations

var CAR_ONLY = 1
var FLT_DRIV = 2
var AIR_ONLY = 3
var AIR_INC = 4
var ACM_ONLY = 7
var TRF_ONLY = 16
var ACM_CAR = 30
var FLT_ACM_CAR = 31
var INS = 32
var OTHERS = 33

// General
function validDatePrecedence(valWidg, erMsg) {
  // Compares date represented by current widget (valWidg) with its opposite, as long as their names adjust
  // to the pattern XX_From and XX_To (where XX can be anything), so we could we can have the folloging fields: 
  // 1. Valid_From and Valid_To  2. Booking_From and Booking_To
  var currentFinalChar = getFinalCharacter(valWidg.name);
  var currentFieldName = getCurrentFieldName(valWidg.name);
  
  var oppositeFieldName = getOppositeFieldName(valWidg.name);
  var oppositeWidg = document.getElementById(oppositeFieldName);

  if (currentFinalChar.toLowerCase() == 'from') {
    arrFirstDate =  valWidg.value.split("-");
    arrSecondDate = oppositeWidg.value.split("-");
  }   
  else if (currentFinalChar.toLowerCase() == 'to') {
    arrFirstDate = oppositeWidg.value.split("-");
    arrSecondDate = valWidg.value.split("-");
  }
    
  if (!verifyDatePrecedence(arrFirstDate, arrSecondDate)) {
      alert(erMsg);
      return false;
  }
    
  return true;
}

function getFinalCharacter(value) {
   
   var finalCharacters = ['From', 'To']
   for (i = 0; i < finalCharacters.length; i++) {
       // check if field name ends with finalCharacter
       finalCharacter = finalCharacters[i];
       if (value.lastIndexOf(finalCharacter) == value.length - finalCharacter.length) {
          return value.substring(value.lastIndexOf(finalCharacter), value.length);
       }
   }
   return value;
}

function getCurrentFieldName(value) {
  // Replace last 'From' and 'To' substrings for nothing (ignore case)
  currFieldName = value.replace('/From$/i', '').replace('/To$/i', '');
  return currFieldName;

}

function getOppositeFieldName(value) {
  // For instance: Valid_From opposite is Valid_To, bookFrom opposite is bookTo, etc, etc
  oppFieldName = value.replace(/From$/, 'To').replace(/from$/, 'to').
                        replace(/To$/, 'From').replace(/to$/, 'from').
                        replace(/^Depart/, 'Return').replace(/^depart/, 'return').
                        replace(/^Return/, 'Depart').replace(/^return/, 'depart');
  return oppFieldName;

}

function verifyDatePrecedence(arrFirstDate, arrSecondDate){
  // Compares first date with second date and returns true if first is lesser than second
  // Both dates must be arrays in format Year-Month-Day and will be converted to Month-Day-Year
  
  var months = ["January","February","March","April","May","June","July","August","September","October","November","December"];
  
  var strFirstDate = months[Math.abs(arrFirstDate[1])-1] + " " + arrFirstDate[2]+", " + arrFirstDate[0];
  var strSecondDate = months[Math.abs(arrSecondDate[1])-1] + " " + arrSecondDate[2]+", " + arrSecondDate[0];
  
  var objFirstDate = new Date(strFirstDate);
  var objSecondDate = new Date(strSecondDate);
  
  return objFirstDate.getTime() <= objSecondDate.getTime();
}

function validNumberPrecedence(valWidg, erMsg) {
  // Compares numbers represented by current widget (valWidg) with its opposite, as long as their names adjust
  // to the pattern XX_From and XX_To (where XX can be anything), so we could we can have the folloging fields: 
  // 1. Price_From and Price_To  
  var currentFinalChar = getFinalCharacter(valWidg.name);
  var currentFieldName = getCurrentFieldName(valWidg.name);
  
  var oppositeFieldName = getOppositeFieldName(valWidg.name);
  var oppositeWidg = document.getElementById(oppositeFieldName);

  if (currentFinalChar.toLowerCase() == 'from') {
    firstNumber =  valWidg.value * 1;
    secondNumber = oppositeWidg.value * 1;
  }   
  else if (currentFinalChar.toLowerCase() == 'to') {
    firstNumber = oppositeWidg.value * 1;
    secondNumber = valWidg.value * 1;
  }
  
  if (firstNumber >= secondNumber) {
      alert(erMsg);
      return false;
  }
    
  return true;
}

// Valid Credit / Cancel Term Rate
function validAmount(amt, erMsg){
  //R1 == checked => Amount Basis = Fully Stay (must specify the amount) 
  if (document.getElementById('R1')) {
      if (document.getElementById('R1').checked == true){
          if (amt.value == '') { alert(erMsg); return false;}
              if (!validateNumber(amt, "Amount must be a number")) return false;
		  }
	  }
  // basis == 1 or 2 => Amount Basis = Per Booking or Per Person Fully Stay (must specify the amount) 
  if (document.getElementById('Amount_Basis')) {
      basis = document.getElementById('Amount_Basis').value ;
	  if (basis == '1' || basis == '2') {
	      if (amt.value == '') { alert(erMsg); return false; }
		      if (!validateNumber(amt, "Amount must be a number")) return false;
		  }
	  }
  return true;
}
function validFixPercent(fixPerc, erMsg){
  //R1 == checked => Amount Basis = Fully Stay (must specify the Fixed / Percent) 
  if (document.getElementById('R1')) {
	  if (document.getElementById('R1').checked == true){
          if (fixPerc.value == 'None') { alert(erMsg); return false;}
        }
	  }	
  // basis == 1 or 2 => Amount Basis = Per Booking or Per Person Fully Stay (must specify the Fixed / Percent) 
  if (document.getElementById('Amount_Basis')) {
      basis = document.getElementById('Amount_Basis').value
	  if (basis == '1' || basis == '2') {
	      if (fixPerc.value == 'None') { alert(erMsg); return false; }
		}
	  }
  return true;
}
function validNmbrNights(nmbrNigth, erMsg){
  //R2 == checked => Amount Basis = Nights (must specify the number of nigths) 
  if (document.getElementById('R1')) {
      if (document.getElementById('R2').checked == true){
          if (nmbrNigth.value == '') {alert(erMsg); return false;}
          if (!validateNumber(nmbrNigth, "Number of Nigths must be a number")) return false;
          }
      }	  
  // basis == 3 => Amount Basis = Per Booking or Per Person Fully Stay (must specify the number of nigths) 
  if (document.getElementById('Amount_Basis')) {
      basis = document.getElementById('Amount_Basis').value ;
	  if (basis == '3') {
	      if (nmbrNigth.value == '') { alert(erMsg); return false; }
		      if (!validateNumber(nmbrNigth, "Number of Nigths must be a number")) return false;
		  }
	  }  
  return true;
}
function validMealPlan(mp, erMsg){
// basis == 3 => Amount Basis = Per Person Per Night (must specify the meal plan)   
   if (document.getElementById('Amount_Basis')) {
      basis = document.getElementById('Amount_Basis').value ;
	  if (basis == '3') {
	      if (mp.value == '0') { alert(erMsg); return false; }
		  }
	  }  
  return true;
}
function validItemsQty(itq, erMsg){
  type = document.getElementById('Condition').value;
  if (type == '3') {
      if (itq.value == '' ) { alert(erMsg); return false;}
	  else {
	      if (itq.value <= '1' ) {alert('The Items Quantity must be greater than 1'); return false;}
		  if (!validateNumber(itq, "Amount must be a number")) return false;
		  }
  }
  return true;
}

// Validation for Contract Cost	
function validDates(valWidg, erMsg) {
  if (document.getElementById('Cost_Condition')){
    cond = document.getElementById('Cost_Condition').value ;}
  else {
    cond = document.getElementById('Price_Condition').value ;}  
  // Cost Condition == 2 => Special Dates (must specify the Depart From/To and Return From/To quantity) 
  
  if (valWidg.value == 'None') {valWidg.value = '';}
  if (valWidg.value != '') {
  	arrayValWidgOp = (valWidg.name).split("_");
  	
  	if (arrayValWidgOp[1] == 'To') {ValWidgOp = arrayValWidgOp[0] + '_' + 'From' ;}
  	else {ValWidgOp = arrayValWidgOp[0] + '_' + 'To' ;}
  	
  	if (cond == '2') {
  		if (document.getElementById(ValWidgOp).value == 'None') {document.getElementById(ValWidgOp).value = '';}
  		if (document.getElementById(ValWidgOp).value != '') {
  		    return validDatePrecedence(valWidg, erMsg);
		    }
		}
	}
  {return true;}
}
function validRepetitive(rep, erMsg){ 
  repetitive = document.getElementById('Repetitive').value;
  /* if the cost variant group selected has one of its element (cost variant)
     Is_Repetitive == true, then Repeat Every must be specify  */
  if (repetitive == 'True' && rep.value == '') {
      alert(erMsg);
      return false;
  }
  return true;
}
function validDurationRange(durRange, erMsg){
  hasRange = document.getElementById('Has_Ranges').value;
  /* if the cost variant group selected has one of its element (cost variant)
     Has_Duration == true, then Cost_Variant_Range_Group must be specify  */
  if (hasRange == 'True' && durRange.value == '') {
      alert(erMsg);
      return false;
  }
  return true;
}
function validSpecialDates(days, erMsg){
  if (document.getElementById('Cost_Condition')){
    cond = document.getElementById('Cost_Condition').value ;}
  else {
    cond = document.getElementById('Price_Condition').value ;}  
  // Cost Condition == 2 => Special Dates (must specify the Depart From/To and Return From/To quantity) 
  if (cond == '2' && (days.value == '' || days.value == 'None')) { 
    alert(erMsg); 
    return false; 		
  }
  return true;
}

function validEarlyBook(days, erMsg){
  if (document.getElementById('Cost_Condition')){
    cond = document.getElementById('Cost_Condition').value ;}
  else {
    cond = document.getElementById('Price_Condition').value ;}  
  // Cost Condition == 4 => Last Minute (must specify the Last Hours quantity) 
  if (cond == '3'){
      if ( days.value == '' ) { alert(erMsg); return false; }
       if (!validateNumber(days, "Days Prior must be a number")) return false;
  }
  return true;
}
function validLastMin(hours, erMsg){
  if (document.getElementById('Cost_Condition')){
    cond = document.getElementById('Cost_Condition').value ;}
  else {
    cond = document.getElementById('Price_Condition').value ;}  
  // Cost Condition == 4 => Last Minute (must specify the Last Hours quantity) 
  if (cond == '4'){
      if ( hours.value == '' ) { alert(erMsg); return false; }
       if (!validateNumber(hours, "Last Hours must be a number")) return false;
  }
  return true;
}

//Validations for Frequency  
function validDay(day, erMsg){
  //Validations for widgets of frequency type 1
  freqType = document.getElementById('Type').value;
  if (freqType == '1'){
      if (day.value == '') {alert(erMsg); return false;}
      else if (!validateNumber(day, "Day must be a number")) return false;
      }
  return true;
}
function validfreq2(datawidg, erMsg){
  //Validations for widgets of frequency type 2	
  freqType = document.getElementById('Type').value;
  if (freqType == '2'){
      if (datawidg.value == '') {alert(erMsg); return false;}
      if (datawidg.name == 'Week' && (!validateNumber(datawidg, "Week must be a number"))) return false;
      }
  return true;
}
function validfreq3R1(datawidg, erMsg){
  //Validations for widgets of frequency type 3, first radio button
  freqType = document.getElementById('Type').value;
  if (freqType == '3'){
      if (document.getElementById('RM1').checked){
          if (datawidg.value == '') {alert(erMsg); return false;}
          if (datawidg.name == 'IDay3R1' && (!validateNumber(datawidg, "Day must be a number"))) return false;
          if (datawidg.name == 'IMonth3R1' && (!validateNumber(datawidg, "Month must be a number"))) return false;
      }
  }
  return true;
}
function validfreq3R2(datawidg, erMsg){
  //Validations for widgets of frequency type 3, second radio button
  freqType = document.getElementById('Type').value;
  if (freqType == '3'){
      if (document.getElementById('RM2').checked){
          if (datawidg.value == '' || datawidg.value == '0' ) {alert(erMsg); return false;}
          if (datawidg.name == 'IMonth3R2' && (!validateNumber(datawidg, "Month must be a number"))) return false;
      }
  }
  return true;
}
function validfreq4R1(datawidg, erMsg){
  //Validations for widgets of frequency type 4, first radio button
  freqType = document.getElementById('Type').value;
  if (freqType == '4'){
      if (document.getElementById('RY1').checked){
          if (datawidg.value == '' || datawidg.value == '0' ) {alert(erMsg); return false;}
          if (datawidg.name == 'IDay4R1' && (!validateNumber(datawidg, "Day must be a number"))) return false;
      }
  }
  return true;
}
function validfreq4R2(datawidg, erMsg){
  //Validations for widgets of frequency type 4, second radio button
  freqType = document.getElementById('Type').value;
  if (freqType == '4'){
      if (document.getElementById('RY2').checked){
          if (datawidg.value == '' || datawidg.value == '0' ) {alert(erMsg); return false;}
     }
  }
  return true;
}
function CheckTimeFormat(formField,errMessage) {
    //it allows to validate the format of the hour in cases in that its entrance 
    //is not obligatory, delegating in the method validateTime.
    if(formField.value!=""){
        return validateTime(formField,errMessage);
    }
    return true;
}
function validateTime(formField,errMessage) {
  // Checks if time is in HH:MM:SS AM/PM format.
  // The seconds and AM/PM are optional, but are filled for match with DB format time.
  
  var stripFieldArray = formField.name.split("_") ;
  var stripField = "" ;
  for (var cursor = 0; cursor < stripFieldArray.length; cursor++){
    stripField = stripField + " " + stripFieldArray[cursor] ;
    }
  stripField = stripField.substring(1,stripField.length) ; 
  timeStr = formField.value;
  if (timeStr.length == 0) {
    alert(stripField+" can not be empty.") ;
  }
  var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
  var matchArray = timeStr.match(timePat);
  if (matchArray == null) {
    alert(stripField+" is not in a valid format.");
    return false;
  }
  hour = matchArray[1];
  minute = matchArray[2];
  second = matchArray[4];
  ampm = matchArray[6];
  
  if (second=="") {
    second = "00"; 
    objPid = document.getElementById(formField.name);
    objPid.value = hour+":"+minute+":"+second ;
  }
  if (hour < 0  || hour > 23) {
    alert(stripField+": Hour must be between 1 and 12. (or 0 and 23 for military time)");
    objPid = document.getElementById(formField.name);
    objPid.value = "HOUR:"+minute+":"+second;
    return false;
  }
  if(hour.length == 1){
    hour = "0"+hour ;
    objPid = document.getElementById(formField.name);
    objPid.value = hour+":"+minute+":"+second;
  }
  if (minute < 0 || minute > 59) {
    alert(stripField+": minute must be between 0 and 59.");
    objPid = document.getElementById(formField.name);
    objPid.value = hour+":MINUTE:"+second;
    return false;
  }
  if (second < 0 || second > 59) {
    alert(stripField+": second must be between 0 and 59.");
    objPid = document.getElementById(formField.name);
    objPid.value = hour+":"+minute+":SECOND";
    return false;
  }
  if (hour > 12 && ampm != "") {
    alert(stripField+": you can't specify AM or PM for military time.");
    objPid = document.getElementById(formField.name); 
    objPid.value = hour+":"+minute+":"+second ;
    ampm = "";
    return true;
  }
  if (hour <= 12 && hour > 0 && ampm != ""){
    if(ampm == "pm"){
      objPid = document.getElementById(formField.name);
      if(hour.charAt(0)=="0"){hour = (parseInt(hourcharAt(hour.length -1)) + 12).toString(); }
      else{hour = (parseInt(hour)+12).toString();}
      if(hour == "24"){hour = "00";}
      objPid.value = hour+":"+minute+":"+second ;
    }
    return true;
  }
  if (hour <= 12 && hour > 0 && ampm == "") {
    if (confirm(stripField+": Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time")) {
      if(!confirm(stripField+": you must specify OK = AM , CANCEL =  PM.")) {       
         objPid = document.getElementById(formField.name);
         if(hour.charAt(0)=="0"){hour = (parseInt(hour.charAt(hour.length -1)) + 12).toString(); }
         else{hour = (parseInt(hour)+12).toString();}
         if(hour == "24"){hour = "00";}
         objPid.value = hour+":"+minute+":"+second ;
         return true;
      }
    }
    return true;
  }
  return true;
}

// Validations for Contract Price
function validCurrency(currency, erMsg){
  if (currency.value == '0') {alert(erMsg); return false;}
  return true;
}

// Validations for Contract Allocations
function validAllocQty(allocQty, erMsg){
  allocType = document.getElementById('Alloc_Type').value;
  if (allocType == '1' && allocQty.value == '') {alert(erMsg); return false;}
  return true;
}
function validFixPerc(fixPer, erMsg){
  risk = document.getElementById('Risk_Quantity').value;
  if (risk != '0' && risk != '' && fixPer.value == ''){
    alert(erMsg); return false; }
  return true;
}
function validRisk(risk, erMsg){
  allocType = document.getElementById('Alloc_Type').value;
  allocQty = document.getElementById('Alloc_Quantity').value;
  fixPerc = document.getElementById('Fixed_Percent').value;

  // allocType == '1' => Limitado. fixPerc == '1' => Fijo
  // Entonces el riesgo tiene que ser menor que la disponibilidad
  if ((allocType == '1') && (fixPerc == '1') && (risk.value > allocQty)) 
    {alert(erMsg); return false;}
    
  if (risk.value == '' || risk.value == '0') 
    {document.getElementById('Fixed_Percent').value = '' ;}
    
  return true;
}

// Inventory Validations
function validLocation(location, erMsg){
    nature = document.getElementById("Nature").value;
    if (nature == '1'){
        // Nature = 1 => One Location	
        if (document.getElementById("FIL_Location_Id").value == '') { 
          alert(erMsg); 
          return false;}	
    }
    else if (nature == '2'){
        // Nature = 2 => Two Locations
        if (document.getElementById("MIL_ORI_Location_Id").value == '' || document.getElementById("MIL_DEST_Location_Id").value == '') { 
            alert("Origen and Destiny Locations cannot be empty"); 
            return false;}	
    }
    return true;
}
function validStops(stop, erMsg){
    stops = document.getElementById("Trip_Stop_Quantity").value;
    for (i=1; i<=stops; i++){
        stop = document.getElementById("MIL_STOP"+i+"_Location_Id")
        if (stop.value == ''){
            alert("STOP "+i+ " cannot be empty");
            return false;
        }
    }
    return true;
}

// Validations for Package Components
function validCompType(comp, erMsg){
  cond = document.getElementById('Type').value ;
  if (cond == '1' && (comp.value == '' || comp.value == 'None') && comp.name == 'Inventory_Id') { 
    alert(erMsg); 
    return false; 		
  }else if (cond == '2' && (comp.value == '' || comp.value == 'None') && comp.name == 'Subpackage_Id'){ 
    alert(erMsg); 
    return false; 		
  }
  return true;
}
// Location Window
function validAirport(airport, erMsg){
  locCat = document.getElementById("Location_Category_Pid");  
  // If Location Category = Airport => Airport field cannot be empty
  if (locCat.value == '1' && airport == "") {alert(erMsg); return false;}
  return true;
}

// Country Window 
function validPhoneCodes(phoneCodes, erMsg){
  // The phone codes can only be: +##, -##, ...  
  regExp = /^[+,-]*\d{1,3}(,[+,-]*\d{1,3})*$/;
  formField = document.getElementById("Phone_Codes");  
  return validateExpression(formField, erMsg, regExp, true) ;  
}

//Method for validate not empty condition, only for fields which have statuscondition tag with hidden tag as child.
function notEmptyField(fieldName, erMsg){
  cptBlock =  (fieldName.name).concat('_caption');
  if(fieldName.value == '' && document.getElementById(cptBlock).style.display != 'none'){
    alert(erMsg) ;
    return false ;
  }
  return true ;
}

//Search Package Window in ResOperator
function validSearchFields(fieldName, erMsg){
  
  pkgId = document.getElementById('Package_Id').value;
  pkgDesc = document.getElementById('Package_Description').value;
  pkgType = document.getElementById('Package_Type_Pid').value;
  
  if (pkgId == '' && pkgDesc == ''){
    if (fieldName.name == 'LocFrom' && fieldName.value == '' && pkgType != CAR_ONLY && pkgType != ACM_ONLY && pkgType != ACM_CAR && pkgType != INS && pkgType != OTHERS)
	  {alert(erMsg); return false;}
	if (fieldName.name == 'LocTo' && fieldName.value == '' && pkgType != INS && pkgType != OTHERS)
      {alert(erMsg); return false;}
  }
   
  return true;
}

//Reservation Passenger Window in ResOperator
function validChildAges(age, erMsg){
  //Validate childreen's age according to passenger type class in Reservation Passenger
  
  var paxTypePid = document.getElementById('Passenger_Type_Pid').value;
  var toAge = document.getElementById('Pax_Type_To_Age').value;
  
  if (paxTypePid in [4,5] && age.value > toAge)
    {alert(erMsg);	return false;}
	
  return true;
}

//Reservation Passenger Window in ResOperator
function childAgeIsNotEmpty(age, erMsg){
  /*
  Field 'Age' cannot be empty for passenger type 
  'Children' --> Passenger_Type_Pid = 4  or
  'Infant'   --> Passenger_Type_Pid = 5 
  */
  var paxTypePid = document.getElementById('Passenger_Type_Pid').value;
  
  if (paxTypePid in [4,5] && age.value == '') 
    {alert(erMsg);	return false;}
	
  return true;
}

function validCurrency(currency, erMsg){
  if (currency.value == '0') {alert(erMsg); return false;}
  return true;
}

function clearPackageList() {
	document.getElementById('Package_List').value = "";
}

function clearCommissionCategory() {
	document.getElementById('Commission_Category_Pid').value = "";
	document.getElementById('Commission_Category_Id').value = "";
	document.getElementById('Commission_Category_Desc').innerText = "";
}

function validateCommCriteriaType(commCrit, erMsg) {
	if (document.getElementById('Type_PL').checked && document.getElementById('Package_List').value == '') {
		alert(erMsg);
		return false;
	}
	if (document.getElementById('Type_CC').checked && document.getElementById('Commission_Category_Pid').value == '') {
		alert(erMsg);
		return false;
	}
	return true;
}
