/* _____________________________________ SUBMIT ACTIVITY FORM _____________________________________ */
function addActivity(activityId) {
 var activityDate = escape($("#activityDate" + activityId).val());
 var extraNotes = escape($("#extraNotes" + activityId).val());
 var SIW_ID = escape($("#SIW_ID" + activityId).val());
 var routeItemSelectOption = escape($("#routeItemSelectOption" + activityId).val());
 var variables = ""
 + "activityId=" + activityId + "&"
 + "activityDate=" + activityDate + "&"
 + "extraNotes=" + extraNotes + "&"
 + "SIW_ID=" + SIW_ID + "&"
 + "routeItemSelectOption=" + routeItemSelectOption + "&"
 $("#myRouteActivityContent" + activityId).load("a/addActivityToBasket.php?" + variables);
 $("#topCalculateButton").trigger("click");
 return true;
}

/* _____________________________________ SUBMIT BASKET FORM _____________________________________ */
function prepareBasket() {
 var options = {
  target:       '#cld',
  dataType:     'html',
  beforeSubmit: beforeBasketSubmit,
  success:      afterBasketSubmit
 };
 $('#basket').ajaxForm(options);
 $("input.arrdep").focus(function(){$(this).blur();}); //is supposed to disable the arrival date!
 $("#startdate").blur(function(){updateStartDate();}); //is supposed to disable the arrival date!
 return options;
}

// pre-submit callback
function updateStartDate() {
 var newDate = escape($("#startdate").val());
 showLoadingImage("labelforStartDate");
 $("#labelforStartDate").load("a/basketStartDate.php?date=" + newDate);
}

function submitTripForm(toDo, id) {
 if( workoutdays() ) {
  $("#toDo").val(toDo);
  $("#tripItemId").val(id);
  $("#basket").ajaxSubmit(prepareBasket());
 }
 return true;
}
function beforeBasketSubmit(formData, jqForm, options) {
 //alert('About to submit: \n\n' + $.param(options));
 showLoadingImage("cld");
 return true;
}

// post-submit callback
function afterBasketSubmit(responseText, statusText)  {
 //alert('status: ' + statusText + '\n\nresponseText: \n' + responseText + '\n\nThe output div should have already been updated with the responseText.');
 $("#cld").html(responseText);
 workoutdays();
 prepareBasket();
 tb_init('a.thickbox');
}




/* _____________________________________ WORK OUT DAYS _____________________________________ */
function workoutdays(){
  // Setup variables - msg is for debug
 var numNights = 1;
 var gapNights = 0;
 var nField = null;
 var gField = null;
 var digitErr = 'Please enter a whole number between zero and 99';
 /* check starting date */
 var aa = $("#startdate").val().split('-');
 var sd = new Date(aa[2],aa[1]-1,aa[0]);
 var timestamp = mktime( 0, 0, 0, aa[1], aa[0], aa[2] );
 var formattedTime = formatDate("d-m-Y", timestamp);
 $("#startdate").css("border", "1px solid #ccc");
 if( $("#startdate").val() != formattedTime) {
  $("#startdate").focus();
  $("#startdate").css("border", "1px solid red");
  alert("Please check the starting date of your trip.  It should be formatted as dd-mm-yyyy, for example 30-03-2017.");
  return false;
 }
 /* loop through form */
 var f = document.forms["basket"];
 var ele = f.elements;
 for (var i=0; i< ele.length; i++) {
  if (ele[i].name) {
   if (ele[i].name.split('-')[0] == 'v') {
    // Get the element id extension
    var n = ele[i].name.split('-')[1];
    if (ele[i].checked) {
     f.elements['a-' + n].value = formatDate("D d M Y",  mktime( 0, 0, 0, (sd.getMonth() + 1), sd.getDate(), sd.getFullYear() ) );
     nField = f.elements['n-' + n];
     nField.style.border = "1px solid #ccc";
     if (  !(numNights = nField.value) || !checkDigit(numNights, 1) ) {
      alert(digitErr);
      nField.value = '???';
      nField.style.border="1px solid red";
      nField.focus();
      return false;
     }
     sd = sd.addToDate(numNights);
     f.elements['d-' + n].value = formatDate("D d M Y",  mktime( 0, 0, 0, (sd.getMonth() + 1), sd.getDate(), sd.getFullYear() ) );
     // Get gap nights
     gField = f.elements['g-' + n];
     gField.style.border = "1px solid #ccc";
     if ( gField && !(gapNights = gField.value) || !checkDigit(gapNights, 0) ) {
      alert(digitErr);
      gField.value = '???';
      gField.style.border="1px solid red";
      gField.focus();
      return false;
     }
     sd = sd.addToDate(gapNights);
    }
    else {
     if (f.elements['a-' + n]) {
      f.elements['a-' + n].value = '---';
     }
     if (f.elements['n-' + n]) {
      f.elements['n-' + n].value = '1';
     }
     if (f.elements['d-' + n]) {
      f.elements['d-' + n].value = '---';
     }
     if (f.elements['g-' + n]) {
      f.elements['g-' + n].value = '0';
     }
    }
   }
  }
 }
 return true;
}
function checkDigit(x, minimum) {
 if(x == parseInt(x)) {
  if(x >= minimum) {
   if(x < 365) {
    return true;
   }
  }
 }
}

Date.prototype.addToDate = function () {
/*
similar to the DateAdd function in VBS

param1 (qty) <integer> optional, default=1
 the number of days to add to the date

*/

 // default params
 var qty = 1;
 qty = arguments[0];
 //alert(qty);

 // make sure we have a valid qty
 if (parseInt(qty) != qty) {
  alert("Bad quantity parameter: " + qty + ", date unchanged");
 }
 else {
  qty = parseInt(qty);
   // add getTimezoneOffset() minutes to 1:00 to get 1:00 =)
  var dat = new Date(this.getFullYear(), this.getMonth(), this.getDate());
  dt = dat.valueOf() + (qty * 1000 * 60 * 60 * 24);
  // would have been nice to do this part some other how but I couldn't figure it out
  dat = new Date(dt);
  this.getDay(dat.getDay());
  this.getDate(dat.getDate());
  this.getMonth(dat.getMonth());
  this.getFullYear(dat.getFullYear());
  return dat;
 }
}


/* _____________________________________ FORM VALIDATION _____________________________________ */
function mktime() {
// http://kevin.vanzonneveld.net
// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +   improved by: baris ozdil
// +      input by: gabriel paderni
// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// +   improved by: FGFEmperor
// +      input by: Yannoo
// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// *     example 1: mktime( 14, 10, 2, 2, 1, 2008 );
// *     returns 1: 1201871402

 var no, ma = 0, mb = 0, i = 0, d = new Date(), argv = arguments, argc = argv.length;
 d.setHours(0,0,0); d.setDate(1); d.setMonth(1); d.setYear(1972);

 var dateManip = {
  0: function(tt){ return d.setHours(tt); },
  1: function(tt){ return d.setMinutes(tt); },
  2: function(tt){ set = d.setSeconds(tt); mb = d.getDate() - 1; return set; },
  3: function(tt){ set = d.setMonth(parseInt(tt)-1); ma = d.getFullYear() - 1972; return set; },
  4: function(tt){ return d.setDate(tt+mb); },
  5: function(tt){ return d.setYear(tt+ma); }
 };

 for( i = 0; i < argc; i++ ){
  no = parseInt(argv[i]*1);
  if(no && isNaN(no)){
   return false;
  }
  else if(no){
// arg is number, let's manipulate date object
   if(!dateManip[i](no)){
    // failed
    return false;
   }
  }
 }
return Math.floor(d.getTime()/1000);
}

function formatDate ( format, timestamp ) {
 // http://kevin.vanzonneveld.net
 // +   original by: Carlos R. L. Rodrigues
 // +      parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
 // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 // +   improved by: MeEtc (http://yass.meetcweb.com)
 // +   improved by: Brad Touesnard
 // *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
 // *     returns 1: '09:09:40 m is month'
 // *     example 2: date('F j, Y, g:i a', 1062462400);
 // *     returns 2: 'September 2, 2003, 2:26 am'

 var a, jsdate = new Date(timestamp ? timestamp * 1000 : null);
 var pad = function(n, c){
  if( (n = n + "").length < c ) {
   return new Array(++c - n.length).join("0") + n;
  }
  else {
   return n;
  }
 };
 var txt_weekdays = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
 var txt_ordin = {1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};
 var txt_months =  ["", "January", "February", "March", "April","May", "June", "July", "August", "September", "October", "November","December"];
 var f = {
// Day
  d: function(){
   return pad(f.j(), 2);
  },
  D: function(){
   t = f.l(); return t.substr(0,3);
  },
  j: function(){
   return jsdate.getDate();
  },
  l: function(){
   return txt_weekdays[f.w()];
  },
  N: function(){
   return f.w() + 1;
  },
  S: function(){
   return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
  },
  w: function(){
   return jsdate.getDay();
  },
  z: function(){
   return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
  },

// Week
  W: function(){
   var a = f.z(), b = 364 + f.L() - a;
   var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
   if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
    return 1;
   }
   else{
    if(a <= 2 && nd >= 4 && a >= (6 - nd)){
     nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
     return date("W", Math.round(nd2.getTime()/1000));
    }
    else{
     return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
    }
   }
  },

 // Month
  F: function(){
   return txt_months[f.n()];
  },
  m: function(){
   return pad(f.n(), 2);
  },
  M: function(){
   t = f.F(); return t.substr(0,3);
  },
  n: function(){
   return jsdate.getMonth() + 1;
  },
  t: function(){
   var n;
   if( (n = jsdate.getMonth() + 1) == 2 ){
    return 28 + f.L();
   }
   else{
    if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
     return 31;
    }
    else{
     return 30;
    }
   }
  },

 // Year
  L: function(){
   var y = f.Y();
   return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
  },
     //o not supported yet
  Y: function(){
   return jsdate.getFullYear();
  },
  y: function(){
   return (jsdate.getFullYear() + "").slice(2);
  },

 // Time
  a: function(){
   return jsdate.getHours() > 11 ? "pm" : "am";
  },
  A: function(){
   return f.a().toUpperCase();
  },
  B: function(){
   // peter paul koch:
   var off = (jsdate.getTimezoneOffset() + 60)*60;
   var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
   var beat = Math.floor(theSeconds/86.4);
   if (beat > 1000) beat -= 1000;
   if (beat < 0) beat += 1000;
   if ((String(beat)).length == 1) beat = "00"+beat;
   if ((String(beat)).length == 2) beat = "0"+beat;
   return beat;
  },
  g: function(){
   return jsdate.getHours() % 12 || 12;
  },
  G: function(){
   return jsdate.getHours();
  },
  h: function(){
   return pad(f.g(), 2);
  },
  H: function(){
   return pad(jsdate.getHours(), 2);
  },
  i: function(){
   return pad(jsdate.getMinutes(), 2);
  },
  s: function(){
   return pad(jsdate.getSeconds(), 2);
  },
     //u not supported yet

 // Timezone
     //e not supported yet
     //I not supported yet
  O: function(){
   var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
   if (jsdate.getTimezoneOffset() > 0) {
    t = "-" + t;
   }
   else {
    t = "+" + t;
    return t;
   }
  },
  P: function(){
   var O = f.O();
   return (O.substr(0, 3) + ":" + O.substr(3, 2));
  },
     //T not supported yet
     //Z not supported yet

 // Full Date/Time
  c: function(){
   return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
  },
    //r not supported yet
  U: function(){
   return Math.round(jsdate.getTime()/1000);
  }
 };

 return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
  if( t!=s ){
   // escaped
   ret = s;
  }
  else if( f[s] ){
   // a date function exists
   ret = f[s]();
  }
  else{
   // nothing special
   ret = s;
  }
  return ret;
 }
 );
}