
Reservation = {
  calculateDateRange:function(date1, date2) {
    // The number of milliseconds in one day
    var ONE_DAY = 1000 * 60 * 60 * 24
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()
    var difference_ms = Math.abs(date1_ms - date2_ms)
    return Math.round(difference_ms/ONE_DAY)
  },
  
  
  clearValidation:function() {
      Element.setStyle($('errorField'), {'display':'none'});
      
      if ($('reqLabel_selectHotel')) {
        Element.setStyle($('reqLabel_selectHotel'), {'display':'none'});
      }
      
      if ($('reqLabel_CheckInDate')) {
        Element.setStyle($('reqLabel_CheckInDate'), {'display':'none'});
        Element.setStyle($('reqLabel_CheckOutDate'), {'display':'none'});
      }
      
      if ($('reqLabel_CardNumber')) {
        Element.setStyle($('reqLabel_CardNumber'), {'display':'none'});
      }
  },
  
  // need to pass in date from server ie if the user is across the sea
  validate:function(frm, date) {
    var error = false;
    var error_stack = new Array();
    var today = new Date();
    
    
    this.clearValidation();
    
    
    // package check
    
    
    if (typeof packageData != 'undefined') {
      // find package
      var packageError = false;  
      var packageErrorStr = '';
      
      packageData.Packages.each(function(item) {
          if (item.code == $('package').value) {
     
            
            var dateString1 = new Date(frm.CheckInDate.value.substring(4, 6) + '/' + frm.CheckInDate.value.substring(6, 8) + '/' + frm.CheckInDate.value.substring(0, 4));
            var dateString2 = new Date(frm.CheckOutDate.value.substring(4, 6) + '/' + frm.CheckOutDate.value.substring(6, 8) + '/' + frm.CheckOutDate.value.substring(0, 4));
            
            var nights = Reservation.calculateDateRange(dateString1, dateString2);
            
            if (nights != item.nights) {
              packageErrorStr = '* This package requires a ' + item.nights + ' night(s) stay, please update the Check-in Date, and Check-out Date.';
              packageError = true;
              return;
            }
            
          }
      });
      if (packageError == true) {
        
        error_stack.push(packageErrorStr);
        
        Element.setStyle($('reqLabel_CheckInDate'), {'display':''});
        Element.setStyle($('reqLabel_CheckOutDate'), {'display':''});
        Element.setStyle($('errorField'), {'display':''});
                
        
        error = true; 
      }
     
    }
    

  
    
    
    if (frm.CheckInDate.value >= frm.CheckOutDate.value) {
      Element.setStyle($('reqLabel_CheckInDate'), {'display':''});
      Element.setStyle($('reqLabel_CheckOutDate'), {'display':''});
      Element.setStyle($('errorField'), {'display':''});
      
      error_stack.push('* Please select a Check-Out Date after the Check-In Date.');
      error = true;  
    }
    
    
    if (frm.CheckInDate.value < date) {
      Element.setStyle($('reqLabel_CheckInDate'), {'display':''});
      Element.setStyle($('reqLabel_CheckOutDate'), {'display':''});
      Element.setStyle($('errorField'), {'display':''});
      error_stack.push('* Please select a Check-In Date starting from today.');
      error = true;      
    }
    
    
    
    
    //frm.CheckInDate.value
    //frm.CheckOutDate.value
    
    var ci_y = frm.CheckInDate.value.substring(0, 4);
    var ci_m = frm.CheckInDate.value.substring(4, 6);
    var ci_d = frm.CheckInDate.value.substring(6, 8);
  
    if (dayExceedsMonth(ci_y, ci_m, ci_d) == true) {
      Element.setStyle($('reqLabel_CheckInDate'), {'display':''});
      Element.setStyle($('reqLabel_CheckOutDate'), {'display':''});
      Element.setStyle($('errorField'), {'display':''});
      error_stack.push('* Start day exceeds number of days for selected month.');
      error_stack.push('* Please select a different start day.');
      error = true; 
    }
    
    var co_y = frm.CheckOutDate.value.substring(0, 4);
    var co_m = frm.CheckOutDate.value.substring(4, 6);
    var co_d = frm.CheckOutDate.value.substring(6, 8);
    
    if (dayExceedsMonth(co_y, co_m, co_d) == true) {
      Element.setStyle($('reqLabel_CheckInDate'), {'display':''});
      Element.setStyle($('reqLabel_CheckOutDate'), {'display':''});
      Element.setStyle($('errorField'), {'display':''});
      error_stack.push('* End day exceeds number of days for selected month.');
      error_stack.push('* Please select a different end day.');
      error = true; 
    }  
    
    
    if (frm.Username) {
      if (frm.Username.value.length > 0) {
        
        if (frm.Password.value == '') {
            error_stack.push('* Please enter a password.');
            error = true;
        }
        
        if (frm.Password.value != frm.Confirm.value) {
          error_stack.push('* Your password does not match the confirmation password.');
          error = true; 
        }
        
        
      }
    }
    
    
    if (SiteVars.this_url.indexOf('/urs') > -1) {
      if ($('selectHotel') && $('selectHotel').value == '') {
        Element.setStyle($('reqLabel_selectHotel'), {'display':''});
        error_stack.push('* Please select a Hotel.');
        error = true; 
      }
    }
    
    
    
    // either have to be selected
    if ($('selectHotel') && $('selectHotel').value == '' &&
        $('selectCity') && $('selectCity').value == '') {
    
        // set error handler here
        Element.setStyle($('reqLabel_selectCity'), {'display':''});
        error_stack.push('* Please select a city or a hotel.');
        error = true; 
          
    }
    

    
    if (error == true) {  
      $('errorField').innerHTML = error_stack.join('<br/>');
      return false;
    }
    
    // check dates
    return true;
    
    
  },
  
  resetPersonalInfoError:function(fields) {
    Element.setStyle($('PersonalInfoErrors'), {'display':'none'});
    Element.setStyle($('reqLabel_Agree'), {'display':'none'});
    
    fields.each(function(item) {
        var label = $('reqLabel_' + item);
        Element.setStyle(label, {'display':'none'});
    });
    
    // reset credit card stuff
    
    
    
   // Element.setStyle($('label_ExpirationDate'), {'display':'none'});
    Element.setStyle($('paymentError'), {'display':'none'});
    
    Element.setStyle($('reqLabel_NameOnCard'), {'display':'none'});
    
    Element.setStyle($('reqLabel_CardNumber'), {'display':'none'});
    
    Element.setStyle($('reqLabel_ExpirationDate'), {'display':'none'});
    
    
  },
  
  // this validates personal information on step 3
  validatePersonalInfo:function(frm, fields) {
    var status = true;
    
    fields.each(function(item) {
      var field_value = new String(eval('frm.' + item + '.value')); 
      if (field_value.trim() == '') {
        var label = $('reqLabel_' + item);
        
        Element.setStyle(label, {'display':'block'});
        status = false;
      }
    });
    
    return (status);
  
  },
  
  validateReservation:function(frm) {
    var errors = new Array();
    var result = true;
    var status = true;
    
    var fields = new Array(
      'Title',
      'FirstName',
      'LastName', 
      'Address1',
      'City', 
      'State', 
      'Country',
      'Phone',
      'Email'
    );
    
    this.resetPersonalInfoError(fields);
   
    var card_errors = new Array();
    
    if (frm.CardNumber.value != '' && CheckCardNumber(frm.CardNumber.value) == false) {
     
      
      card_errors.push('* Please enter a valid credit card number.');
      Element.setStyle($('reqLabel_CardNumber'), {'display':''});
      status = false;
    }
    

    if (parseFloat(frm.yearExpirationDate.options[frm.yearExpirationDate.selectedIndex].text + '' + frm.monthExpirationDate.options[frm.monthExpirationDate.selectedIndex].value) < parseFloat(SiteVars.CMS_DATE_YEAR + '' + SiteVars.CMS_DATE_MONTH)) {
       card_errors.push('* Please enter a valid expiry date.');
       status = false;
       Element.setStyle($('reqLabel_ExpirationDate'), {'display':''});
    }
    
    
     if ($('NameOnCard').value == '') {
      
       card_errors.push('* Please enter name on credit card.');
       status = false;
       Element.setStyle($('reqLabel_NameOnCard'), {'display':''});
     }
     
     
     
     if ($('CardNumber').value == '') {
      
       card_errors.push('* Please enter a card number.');
       status = false;
       Element.setStyle($('reqLabel_CardNumber'), {'display':''});
     }
     
     if (!$(frm.CBAgree.checked)) {
        card_errors.push('* Please agree to the terms and conditions to continue.');
        Element.setStyle($('reqLabel_Agree'), {'display':''});
        status = false;
     }
     
     if (card_errors.length > 0) {
        Element.setStyle($('paymentError'), {'display':''});
        $('paymentError').innerHTML = card_errors.join('<br/>');
     }
     
    
    
    
    result = this.validatePersonalInfo(frm, fields);
    if (result == false) {
      errors.push('* Please fill out all required fields.');
      status = false;
      
    }
    
    
     if ($('Username') && $('Password')) {
       var pstatus = true;
       var perrors = Array();
       
       
       if ($('Username').value.trim() != '') {
         
         
         if ($('Password').value != $('Confirm').value) {
           perrors.push('* Your passwords do not match, please try again.');
           pstatus = false;
         }
         if ($('Password').value == '' || $('Confirm').value == '') {
            perrors.push('* Please enter a password.');
            pstatus = false;
         }
       }
       
       if (pstatus == false) {
         $('PersonalInfoBoxExtraErrors').innerHTML = perrors.join('<br/>');
         Element.setStyle($('PersonalInfoBoxExtraErrors'), {'display':''});
         status = false;
       }
     }
    
    
    
    if (status == false) {
      $('PersonalInfoErrors').innerHTML = errors.join('<br/>');
      Element.setStyle($('PersonalInfoErrors'), {'display':''});
      
    }

    return (result == false || status == false ? false : true);
      
  },
  
  // CN:2007-06-11 - tweaked from poponloadX() on old site
  showWhatsThisWindow:function(url) {
    testwindow = window.open(url,"whatsThisWindow","resizable,width=300,height=20");
    return false;
    //testwindow.moveTo(300,300);
  },
  
  // AF: RT-12838
  chooseAction:function(frm, pageHint) {
    
    // if package, then we need to load packageData
    
    
    if ($('selectHotel') && $('selectHotel').value == '' &&
        $('selectCity') && $('selectCity').value != '') {
      if(pageHint.indexOf('unlimited') > -1){
        frm.setAttribute('action', SiteVars.path_to_top + '/urs/rates/resultsByCity');
      }
      else{
        frm.setAttribute('action', SiteVars.path_to_top + '/rates/resultsByCity');
      }
    } 
    else if ($('selectHotel') && $('selectHotel').value != '' &&
               $('selectCity') && $('selectCity').value == '') {
      if(pageHint.indexOf('unlimited') > -1){
        frm.setAttribute('action', SiteVars.path_to_top + '/urs/rates/results');
      }
      else{
        frm.setAttribute('action', SiteVars.path_to_top + '/rates/results');
      }
    }
  }
}



/* hack */

  
  Event.observe(window, 'load', function() {
      
      if (SiteVars.this_pagerule_hints.indexOf('step1') > -1 ||
          SiteVars.this_pagerule_hints.indexOf('step2') > -1) {
        /*
        document.getElementsByName('RateType')[0].onchange = function() {
          var packageCode =  document.getElementsByName('package')[0];
          if (packageCode.value.length > 0) {
            packageCode.value = '';
          }
        }
        */
        
      }
      
      
    // we need this to switch between provinces.
    if ($('State')) {
      Event.observe($('State'), 'change', function() {
          var province = $('State').options[$('State').selectedIndex].value.trim();
          
          switch(province) {
             case 'BC':
             case 'AB':
             case 'MB':
             case 'NB':
             case 'NL':
             case 'ON':
             case 'NS':
             case 'NT':
             case 'NU':
             case 'PE':
             case 'QC':
             case 'SK':
             case 'YT':
               for(var i = 0; i < $('Country').length; i++) {
                 if ($('Country').options[i].value.trim() == 'CANADA') {
                   $('Country').selectedIndex = i;
                   break;
                 }
               }
               
              break;
             case 'ZZ':
                 $('Country').selectedIndex = 0;
                 break; 
             default:
               for(var i = 0; i < $('Country').length; i++) {
                 if ($('Country').options[i].value.trim() == 'UNITED STATES') {
                   $('Country').selectedIndex = i;
                   break;
                 }
               }
               
          }
      });
    }
  });

