/**
 * Initialization of webinar page, handles date widget, timzeones and
 * appropriate times.
 */
//Start time in GMT (7am MST)
var webinarStartTime = 14;
var webinarEndTime = 25;

function checkTimeZone() {
   var rightNow = new Date();
   var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
   var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
   var temp = date1.toGMTString();
   var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
   var temp = date2.toGMTString();
   var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
   var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
   var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
/*
   if (hoursDiffDaylightTime == hoursDiffStdTime) {
      alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is NOT observed here.");
   } else {
      alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is observed here.");
   }
*/
   //Format a string that represents the time zone info
   var utfStr = "utc";
   if( hoursDiffStdTime == 0 )
     utfStr += "-";
   if( hoursDiffStdTime > 0 )
     utfStr += "+";
   utfStr += hoursDiffStdTime;
   if(hoursDiffDaylightTime != hoursDiffStdTime && isDST()) //If we are in daylight savings and this time zone has DST
     utfStr+="D";
   return utfStr;
}

// Determins if we are in DST by US standards, everybody else, well to bad :|
function isDST() {
  var gmt = new Date;

  var sdm = new Date; //second sunday in march
  sdm.setMonth(2); // March
  sdm.setDate(1); //first day
  var day = sdm.getDay(); //day of week of 1st
  sdm.setDate( 8 + (7-day) ); //second sunday
  
  var fsn = new Date; //First sunday in november
  fsn.setMonth(10); // November
  fsn.setDate(1);
  day = fsn.getDay();
  fsn.setDate( 1 + (7-day) ); //first sunday
  if (gmt < sdm || gmt >= fsn) return 0;
  return 1;
}

function updateTimeList() {
  var tz = $("#time_zone")[0]; //our timezone select object
  var selected = tz.selectedIndex;
  while(!tz.options[selected].id)
    selected--;
  var cur = tz.options[selected];
  var pos = cur.id.lastIndexOf('+') != -1;
  var dst = cur.id.lastIndexOf('D') != -1;
  var offset = parseFloat(cur.id.substr(4,cur.id.length - 4 - (dst ? 1 : 0)));
  //Adjust offset by dst setting
  if(dst && pos)
    offset += 1;
  if(dst && !pos)
    offset -= 1;
  if(!pos) //make offset negative
    offset = 0 - offset ;
  var date = $("#date")[0].value; //our selected data
  var t = $("#time")[0]; //our time select object
  var j=0;
  t.options[j++] = new Option("Select...","notselected");
  var start = webinarStartTime;
  var end = webinarEndTime;
  var mstOffset = 7;
  if(isDST()) { //If we are in DST hours, adjust for Montana being in DST 
    start--;
    end--;
    mstOffset--;
  }
  for(var i=start; i<end; i+= 0.5)
  {
    var hour = (i + offset) % 24;
    var min = (hour % 1 > 0 ? '30' : '00');
    if(hour %1 > 0) hour -= 0.5;
    var tod = 'am';
    if(hour >= 12){
      tod = 'pm';
      hour -= 12;
    }
    if(hour == 0)
      hour = 12;
    var timeStr= hour + ':' + min + ' ' + tod;
    var mstTimeStr = "(" + (i - i%1 - mstOffset) + ':' + (i % 1 > 0 ? '30' : '00') + " MST)";
    t.options[j++] = new Option(timeStr+' on '+date,timeStr+' on '+date + " " + mstTimeStr);
  }
  t.selectedIndex = 0;
}

function leadingZero(nr)
{
	if (nr < 10) nr = "0" + nr;
	return nr;
}

/* Set as customDate function to prevent selection of weekends.
   @param  date  Date - the date to customise
   @return [boolean, string] - is this date selectable?, what is its CSS class? */
function daySelectable(date) {
  var day = date.getDay();
  return [(day > 0 && day < 6), ''];
}

function checkDate() {
  var dateField = document.getElementById('date');
  if(dateField.value.length == 0)
    return true; //will be caught by form validator
  var fields = dateField.value.split('-');
  if(fields.length != 3)
  {
    alert("Invalid date format entered. The correct format is YYYY-MM-DD.");
    return false;
  }
  var d = new Date(fields[1] + "/" + fields[2] + "/" + fields[0]);
  var minDay = new Date();
  minDay.setDate(minDay.getDate()+(minDay.getDay() == 5 ? 3 : 1));

  var sel = daySelectable(d);
  if(!sel[0] || d < minDay)
  {
    alert("Invalid date chosen, please select a date in the future not on weekends.");
    return false;
  }
  return true;
}

$(document).ready(function() {
    var d = new Date();
    d.setDate(d.getDate()+(d.getDay() == 5 ? 3 : 1));
    $("#date")[0].value=d.getFullYear() + "-" + leadingZero(d.getMonth()+1)  + "-" + leadingZero(d.getDate());

    /*
    popUpCal.setDefaults(popUpCal.regional['']);
    // Set calendar global defaults - invoke via focus and image button
    popUpCal.setDefaults({autoPopUp: 'both', buttonImageOnly: true,
          buttonImage: '../images/calendar.gif', buttonText: 'Calendar'});
    $('.datePick').calendar({customDate: daySelectable,dateFormat: 'YMD-',minDate:d, closeAtTop: false});
    */
    $("#date").datepicker({showOn: 'both', dateFormat: 'yy-mm-dd', buttonImage: '../images/calendar.gif', buttonImageOnly: true, beforeShowDay:$.datepicker.noWeekends});

    //Set default time zone
    var tz = checkTimeZone();
    var s = document.getElementById(tz);
    if(!s && tz.lastIndexOf('D') != -1)
    {
      s = document.getElementById(tz.substr(0,tz.length-1));
    }
    if(s)
      s.selected = "true";
    else
      alert("Unable to determine your time zone, please select it manually.");
    $("#time_zone").change( updateTimeList );
    $("#date").change( updateTimeList );    
    updateTimeList();
  });
