var dDefaultPrice=0.0;
var dDefaultWeekendPrice=0.0;
var iSpecialPriceMode=1;

Array.prototype.exists = function(search){
  for (var i=0; i<this.length; i++)
    if (this[i] == search) return true;

  return false;
};

Array.prototype.existsReserved = function(search) {
    for (var i = 0; i < this.length; i++) {        
        if (this[i].Date == search && this[i].Reserved == true)
            return true;
    }

    return false;
};

Array.prototype.isEnabledBeg = function(search) {
    var dt = new Date(search);
    var sxDt;
    var bHadSpecial = false;
    for (var iDays = 0; iDays < 3; iDays++) {
        sxDt = Calendar.dateToString(dt);
        for (var i = 0; i < this.length; i++) {
            if (this[i].Date == sxDt) {
                if (this[i].Special == true)
                    bHadSpecial = true;
                if (iDays == 2 && bHadSpecial == false)
                    break; //By the third day it isn't special so break out.
                if(this[i].Reserved==true)
                    return false;
            }
        }
        dt.addDays(1);
    }
    return true;
};

Array.prototype.isEnabledEnd = function(search) {
var dt = new Date(search);
var sxDt;
var bHadSpecial = false;
for (var iDays = 0; iDays < 4; iDays++) {
    sxDt = Calendar.dateToString(dt);
    for (var i = 0; i < this.length; i++) {
        if (this[i].Date == sxDt) {
            if (this[i].Special == true)
                bHadSpecial = true;
            if (iDays == 3 && bHadSpecial == false)
                break; //By the third day it isn't special so break out.
            if (this[i].Reserved == true)
                return false;
        }
    }
    dt.addDays(-1);
}
return true;
};

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].Date == sxThisDate && this[i].Reserved == true) {
                return true;
            }
        }
        if (sxThisDate == sxNewEndDate)
            break;

        dtBeg.addDays(1);
    }
    return false;
};

Array.prototype.anySpecial = 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].Date == sxThisDate && this[i].Special == true) {
                return true;
            }
        }
        if (sxThisDate == sxNewEndDate)
            break;

        dtBeg.addDays(1);
    }
    return false;
};

Array.prototype.calcPrice = function(sxStartDate, sxEndDate, dDefaultPrice, dDefaultWeekendPrice) {
    if (sxStartDate.length == 0 || sxEndDate.length == 0)
        return 0.0;
    var dtBeg = new Date(sxStartDate);
    var dtEnd = new Date(sxEndDate);
    dtEnd.addDays(-1);
    var sxNewEndDate = Calendar.dateToString(dtEnd);

    var dTotal = 0.0;
    var dTotalDisc=0.0;
    var iDayNum=1;
    var bHasSpecial=false;    
    //var iSPMFromDate=1;
    while (true) {
        var bFoundDate = false;
        var sxThisDate = Calendar.dateToString(dtBeg);
        for (var i = 0; i < this.length; i++) {
            if (this[i].Date == sxThisDate) {
                dTotal += this[i].Price;
                if(iDayNum%3==0){
                    if(iSpecialPriceMode==0)
                        dTotalDisc+=this[i].Price; //Full price
                    else if(iSpecialPriceMode==1)
                        dTotalDisc+=this[i].Price/2.0; //1/2 price
                    else
                        dTotalDisc+=0.0; //Free
                }
                else
                    dTotalDisc += this[i].Price;
                
                bFoundDate = true;
                if(this[i].Special==true)
                    bHasSpecial=true;
                break;
            }
        }
        if (bFoundDate == false){
            dTotal += dDefaultPrice;
            if(iDayNum%3==0){                
                if(iSpecialPriceMode==0){
			if(dtBeg.getDay()==0||dtBeg.getDay()==6)
				dTotalDisc+=dDefaultWeekendPrice; //Weekend full price
			else
				dTotalDisc+=dDefaultPrice; //Full price
                }
                else if(iSpecialPriceMode==1){
			if(dtBeg.getDay()==0||dtBeg.getDay()==6)
				dTotalDisc+=dDefaultWeekendPrice/2.0;
			else
				dTotalDisc+=dDefaultPrice/2.0;
		}
                else
                    dTotalDisc+=0.0; //Free
            }
            else{
		if(dtBeg.getDay()==0||dtBeg.getDay()==6)
			dTotalDisc+=dDefaultWeekendPrice; //Weekend full price
		else
			dTotalDisc+=dDefaultPrice; //Full price                
            }
        }
        if (sxThisDate == sxNewEndDate)
            break;
        iDayNum++;
        dtBeg.addDays(1);
    }
    if(bHasSpecial==false)
        return dTotalDisc;
    return dTotal;
};

Array.prototype.findEndDate = function(sxBegDate) {
    var dt = new Date(sxBegDate);
    var sxDt;
    var bHadSpecial = false;
    for (var iDays = 0; iDays < 3; iDays++) {
        sxDt = Calendar.dateToString(dt);
        for (var i = 0; i < this.length; i++) {
            if (this[i].Date == sxDt) {
                if (this[i].Special == true)
                    bHadSpecial = true;                
                break;
            }
        }        
        dt.addDays(1);
        if(iDays==1&&bHadSpecial==false)
            break;
    }
    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('#new_reservation').validate({
			rules: {
		      "reservation[email]": {
		        required: true,
		        email: true
		      },
			  "reservation[start_date]": {
		        required: true,
		        date: true
		      },
			  "reservation[end_date]": {
		        required: true,
		        date: 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[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'
		      },
		      "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	
		});
	}
  };

  var JSON = {
      request: function() {
        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: "{}",
              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];
                  //alert('ReservedDate=' + reservedDates[i].Date + ', JSONDate=' + jsonDates[i].Date + ', ReservedIs=' + reservedDates[i].Reserved + ', JSONDateReservedIs=' + jsonDates[i].Reserved);
              }
          }
      }
  };

  var Calendar = {
      initStart: function(currentDate) {
          jQuery('#datepicker-start').datepicker({ beforeShowDay: Calendar.disableDatesBeg });
          //jQuery('#datepicker-start').datepicker({ onChangeMonthYear: 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({ onChangeMonthYear: 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());
              var dTotal = jsonDates.calcPrice(dateText, jQuery('#end_date').val(), dDefaultPrice,dDefaultWeekendPrice);
              Calculations.updateTotals(dateText,jQuery('#end_date').val(),dTotal);


          });

          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));
              
              //alert('dtBeg='+Calendar.dateToString(dtBeg)+', dtEnd='+Calendar.dateToString(dtEnd)+', Days='+iDaysApart);
              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;
              }
              //else{
              //  alert('Dates are ok?');
              //}

              if (jsonDates.anyReserved(Calendar.dateToString(old_start_date), dateText) == true) {
                  alert('There is another reservation between that 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);
              var dTotal = jsonDates.calcPrice(Calendar.dateToString(old_start_date), dateText, dDefaultPrice,dDefaultWeekendPrice);
              Calculations.updateTotals(Calendar.dateToString(old_start_date),dateText,dTotal);
          });
      },

      disableDatesBeg: function(date) {
          var dtOneLess = new Date(date);
          dtOneLess.addDays(-1);
          if (jsonDates.existsReserved(Calendar.dateToString(date)))
              return [false, 'reserved-date ' + Calendar.dateToString(date)];
          else if (jsonDates.isEnabledBeg(Calendar.dateToString(date)) == false)
              return [false, Calendar.dateToString(date)];
          else
              return [true, Calendar.dateToString(date)];
      },

      disableDatesEnd: function(date) {
          var dtOneLess = new Date(date);
          dtOneLess.addDays(-1);
          //isEnabledEnd  
          if (jsonDates.existsReserved(Calendar.dateToString(date)) && jsonDates.existsReserved(Calendar.dateToString(dtOneLess)))
              return [false, 'reserved-date ' + Calendar.dateToString(date)];
          else if (jsonDates.existsReserved(Calendar.dateToString(date)))
              return [true, 'reserved-date ' + Calendar.dateToString(date)];
          else if (jsonDates.isEnabledEnd(Calendar.dateToString(date)) == false)
              return [false, 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 iZero=dateText.indexOf('0');
         if(iZero==0){
            //Trim leading 0's for the date
            dateText=dateText.substring(1);              
         }
         return dateText;
         */
      }
      
      
  };

  var Calculations = {

      initialize: function(currentDate, endDate) {
	    /*
		if(Calendar.checkDatesDisabled(currentDate)){ 
			jQuery('#date-preview').html('from ' + currentDate + ' to ');
			DISABLED = true;
		}
		else {
			jQuery('#start_date').val(currentDate);
			jQuery('#end_date').val(endDate);
			Calculations.updateTotals();
			DISABLED = false;
		}
		*/
	  },

	  updateTotals: function(sxStartDate,sxEndDate,dTotal){
		//var start_string = jQuery('#start_date').val();
		//var end_string = jQuery('#end_date').val();
		var total_days = Calculations.calcDays(sxStartDate,sxEndDate);
	
		//var total = Calculations.calcTotal(total_days);
	
		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>");		
		jQuery('#amount-preview').html('$' + dTotal.toFixed(2).toString());
		jQuery('#reservation_charge').val(dTotal);
	  },

	  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;
	  }
      
  };
