Array.prototype.exists = function(search){
  for (var i=0; i<this.length; i++){
	if (this[i] == search)
		return true;
  }

  return false;
};

Array.prototype.anyReserved = function(sxStartDate, sxEndDate) {
    if (sxStartDate.length == 0 || sxEndDate.length == 0)
        return false;
    var dtBeg = new Date(sxStartDate);
    var dtEnd = new Date(sxEndDate);
    dtEnd.addDays(-1);
    var sxNewEndDate = Calendar.dateToString(dtEnd);

    while (true) {
        var sxThisDate = Calendar.dateToString(dtBeg);        
        for (var i = 0; i < this.length; i++) {            
            if (this[i] == sxThisDate) {
                return true;
            }
        }
        if (sxThisDate == sxNewEndDate)
            break;

        dtBeg.addDays(1);
    }
    return false;
};

Array.prototype.findEndDate = function(sxBegDate) {
    var dt = new Date(sxBegDate);
    var sxDt;
    for (var iDays = 0; iDays < 2; iDays++) {
        sxDt = Calendar.dateToString(dt);
        for (var i = 0; i < this.length; i++) {
            if (this[i] == sxDt) {                
                break;
            }
        }        
        dt.addDays(1);
    }
    return dt;
};

Date.prototype.addDays = function(days) {
    this.setDate(this.getDate() + days);
} 

  var Validations = {
	setup: function(){

		jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
		    phone_number = phone_number.replace(/\s+/g, ""); 
			return this.optional(element) || phone_number.length > 9 &&
				phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
		}, "Please specify a valid phone number");

		jQuery('#CustomerInfoForm').validate({
			rules: {			
		      "reservation[email]": {
		        required: true,
		        email: true
		      },		      			  		      
		      "reservation[charge]": {
		        required: true,
		        number: true
		      },
		      "reservation[phone]": {
				required: true,
				phoneUS: true
			  },
			  "reservation[name]": {
				required: true,
				minlength: 1
			  }			  
		    },
		    messages: {			  
	     	  "reservation[email]": {
		        required: 'An email is required to reserve a cabin.',
		        email: 'Please enter a valid email in the format: you@example.com'
		      },		      			  		      
		      "reservation[charge]": {
		        required: 'An amount must be present to checkout.',
		        number: 'The amount must be a valid dollar amount'
		      },
		      "reservation[phone]": {
				required: 'A phone number is required to reserve a cabin.',
				phoneUS: 'Please enter a valid phone number'
			  },
			  "reservation[name]": {
				required: 'A name is required to reserve a cabin.',
				minlength: 'Please enter a name'
			  }			  
		   },
		   errorClass: "invalid",
		   validClass: "valid",
			submitHandler: function(form) {
			   	form.submit();
			},
			errorContainer: "div.field-with-errors",
			errorLabelContainer: "div.errorExplanation ul",
			wrapper: "li", debug:true
		});

		jQuery('#new_reservation').validate({
			rules: {
			  "reservation[start_date]": {
		        required: true,
		        date: true
		      },
			  "reservation[end_date]": {
		        required: true,
		        date: true
		      }		    
		    },
		    messages: {			  
			  "reservation[start_date]": {
		        required: 'A start date must be chosen.',
		        date: 'The start date is not a valid date'
		      },
			  "reservation[end_date]": {
		        required: 'An end date must be chosen.',
		        date: 'The end date is not a valid date'
		      }		      
		   },
		   errorClass: "invalid",
		   validClass: "valid",
			submitHandler: function(form) {
			   	form.submit();
			},
			errorContainer: "div.field-with-errors",
			errorLabelContainer: "div.errorExplanation ul",
			wrapper: "li", debug:true
		});
	}
  };

  var JSON = {
      request: function() {			
		var iNumBedrooms=jQuery('#Bedrooms option:selected').val();   
		/*
        jQuery.ajax({
              type: "POST",
              url: "/wa/ctrl/WebData.asmx/GetDefaultPrice",
              data: "{}",
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function(result) {
                  dDefaultPrice=(typeof result.d) == 'string' ? eval('(' + result.d + ')') : result.d;                  
                  dDefaultPrice=parseFloat(dDefaultPrice);                  
                  jQuery('#default_price').html('$'+dDefaultPrice.toFixed(2).toString());
              }
          });
          
          jQuery.ajax({
              type: "POST",
              url: "/wa/ctrl/WebData.asmx/GetDefaultWeekendPrice",
              data: "{}",
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function(result) {
                  dDefaultWeekendPrice=(typeof result.d) == 'string' ? eval('(' + result.d + ')') : result.d;                  
                  dDefaultWeekendPrice=parseFloat(dDefaultWeekendPrice);                  
                  jQuery('#default_weekendprice').html('$'+dDefaultWeekendPrice.toFixed(2).toString());
              }
          });
          
          jQuery.ajax({
              type: "POST",
              url: "/wa/ctrl/WebData.asmx/GetSpecialPriceMode",
              data: "{}",
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function(result) {
                  iSpecialPriceMode=(typeof result.d) == 'string' ? eval('(' + result.d + ')') : result.d;                  
                  iSpecialPriceMode=parseInt(iSpecialPriceMode);                  
                  //jQuery('#default_price').html(iSpecialPriceMode.toString()); //0=full price, 1=1/2 off, 2=free
              }
          });
          */
          
          jQuery.ajax({
              type: "POST",
              url: "/wa/ctrl/WebData.asmx/GetReservedDates",
              data: "{iNumBedrooms: '"+iNumBedrooms+"'}",
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function(result) {   				  
                  var xaDates = (typeof result.d) == 'string' ? eval('(' + result.d + ')') : result.d;                  
                  Reservation.initialize(xaDates);
              }
          });         
          
      }
  };

  var Reservation = {

      initialize: function(reservedDates) {
          
          var currentTime = new Date();
          var month = currentTime.getMonth() + 1;
          var day = currentTime.getDate();
          var end_day = currentTime.getDate() + 2;
          var year = currentTime.getFullYear();
          var currentDate = (month + "/" + day + "/" + year).toString();
          var default_end_date = (month + "/" + end_day + "/" + year).toString();
          window.DISABLED = false;

          getDates.initialize(reservedDates);
          Calendar.initStart(currentDate);
          Calendar.initEnd(default_end_date);
          Calculations.initialize(currentDate, default_end_date);
          Calendar.initListeners();
      } 
  };

  var getDates = {
      initialize: function(reservedDates) {
          window.jsonDates = [];
          if (reservedDates.length > 0) {
              for (var i = 0; i < reservedDates.length; i++) {                  
                  jsonDates[i] = reservedDates[i];              
              }
          }
      }
  };

  var Calendar = {
      initStart: function(currentDate) {
          jQuery('#datepicker-start').datepicker({ beforeShowDay: Calendar.disableDatesBeg });          
          jQuery('#datepicker-start').datepicker('option', 'minDate', new Date(currentDate));
      },

      initEnd: function(endDate) {
          jQuery('#datepicker-end').datepicker({ beforeShowDay: Calendar.disableDatesEnd });          
          jQuery('#datepicker-end').datepicker('option', 'minDate', new Date(endDate));
      },

      initListeners: function() {
          jQuery('#datepicker-start').datepicker('option', 'onSelect', function(dateText, inst) {              
              dateText=Calendar.formatDate(dateText);
              
              var dp = jQuery('#datepicker-end');
              var old_start_date = new Date(jQuery('#start_date').val());
              var start_date = new Date(dateText);

              var end_date=jsonDates.findEndDate(dateText);
              
              if(start_date>end_date){
                
              }
              else{
                dp.datepicker('setDate', end_date);              
              }
              
              jQuery('#start_date').val(dateText);
              jQuery('#end_date').val((end_date.getMonth() + 1) + '/' + end_date.getDate() + '/' + end_date.getFullYear());              
              Calculations.updateTotals(dateText,jQuery('#end_date').val());
          });

          jQuery('#datepicker-end').datepicker('option', 'onSelect', function(dateText, inst) {
              dateText=Calendar.formatDate(dateText);
              
              var old_start_date = new Date(jQuery('#start_date').val());
              var old_end_date = new Date(jQuery('#end_date').val());
              
              var dtBeg=new Date(old_start_date);
              var dtEnd=new Date(dateText);
              var iDaysApart=Math.abs(Math.round((dtEnd-dtBeg)/86400000));
                            
              if(isNaN(iDaysApart)==true){
                alert('Please pick a starting date before picking an ending date.');
                jQuery('#datepicker-end').datepicker('setDate', old_end_date);
                jQuery("#end_date").val(Calendar.dateToString(old_end_date));              
                return false;              
              }
              /*
              else if(iDaysApart<3&&jsonDates.anySpecial(Calendar.dateToString(old_start_date), dateText) == true){
                alert('There is a three night minimum during special rate periods. Please choose another end date.');
                jQuery('#datepicker-end').datepicker('setDate', old_end_date);
                jQuery("#end_date").val(Calendar.dateToString(old_end_date));              
                return false;              
              }
              */
              else if(iDaysApart<2){
                alert('There is a two night minimum. Please choose another end date.');
                jQuery('#datepicker-end').datepicker('setDate', old_end_date);
                jQuery("#end_date").val(Calendar.dateToString(old_end_date));              
                return false;
              }
              
              if (jsonDates.anyReserved(Calendar.dateToString(old_start_date), dateText) == true) {
                  alert('All cabins are reserved between your selected date range. Please choose another end date.');
                  jQuery('#datepicker-end').datepicker('setDate', old_end_date);
                  jQuery("#end_date").val(Calendar.dateToString(old_end_date));
                  return false;
              }

              jQuery("#end_date").val(dateText);              
              Calculations.updateTotals(Calendar.dateToString(old_start_date),dateText);
          });
      },

      disableDatesBeg: function(date) {
          var dtOneLess = new Date(date);
          dtOneLess.addDays(-1);
          if (jsonDates.exists(Calendar.dateToString(date)))
              return [false, 'reserved-date ' + Calendar.dateToString(date)];
          else
              return [true, Calendar.dateToString(date)];
      },

      disableDatesEnd: function(date) {
          var dtOneLess = new Date(date);
          dtOneLess.addDays(-1);
          if (jsonDates.exists(Calendar.dateToString(date)) && jsonDates.exists(Calendar.dateToString(dtOneLess)))
              return [false, 'reserved-date ' + Calendar.dateToString(date)];
          else if (jsonDates.exists(Calendar.dateToString(date)))
              return [true, 'reserved-date ' + Calendar.dateToString(date)];
          else
              return [true, Calendar.dateToString(date)];
      },
      
      dateToString: function(date) {
          var stringdate = ((date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear()).toString();
          return stringdate;
      },
      
      formatDate: function(dateText){
        return this.dateToString(new Date(dateText));        
      }
      
      
  };

  var Calculations = {

      initialize: function(currentDate, endDate) {
	    
	  },

	  updateTotals: function(sxStartDate,sxEndDate){		
		var total_days = Calculations.calcDays(sxStartDate,sxEndDate);
		jQuery('#check-in-preview').html('Check in: ' + "&nbsp;<strong> " + sxStartDate + " </strong>");
		jQuery('#check-out-preview').html('Check out: ' + "<strong> " + sxEndDate + "</strong>");
		jQuery('#total-nights-preview').html('Nights: ' + "<strong> " + total_days + "</strong>");
	  },

	  calcDays: function(start, end){
		var date1, date2;
		if(start && end){
			date1 = start;
			date2 = end;
		}
		else{
			date1 = jQuery('#start_date').val();
			date2 = jQuery('#end_date').val();
		}
	    date1 = date1.split("/");
	    date2 = date2.split("/");
	    var sDate = new Date(date1[0]+"/"+date1[1]+"/"+date1[2]);
	    var eDate = new Date(date2[0]+"/"+date2[1]+"/"+date2[2]);
	    var daysApart = Math.abs(Math.round((sDate-eDate)/86400000));
	    return daysApart;
	  }
      
  };

