// globals
var d;
var leftD = new Date();
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var dateCtrl1;
var dateCtrl2;
var curDateCtrl;
var date1 = new Date();
var date2 = new Date();
var curDate = new Date();

var _date1, _date2, _pick1, _pick2, _srvTime;

function init(date1, date2, pick1, pick2, srvTime){
  _date1=date1;
  _date2=date2;
  _pick1=pick1;
  _pick2=pick2;
  _srvTime=srvTime;
  addEvent(window,'load',_init);
}

function _init(){
  // init current date
  d=new Date();
  if(_srvTime){
    // PHP time is in seconds, jscript uses milliseconds
    d.setTime(_srvTime * 1000);
  }
  dateCtrl1 = el(_date1);
  dateCtrl2 = el(_date2);
  addEvent(el(_pick1),'click',show1);
  addEvent(el(_pick2),'click',show2);
  addEvent(el(_date1),'click',show1);
  addEvent(el(_date2),'click',show2);
  addEvent(el(_date1),'change',function (){checkDates(dateCtrl1)});
  addEvent(el(_date2),'change',function (){checkDates(dateCtrl2)});
  // remove this 2 calls to enable the default behaviour to submit form on enter
  addEvent(el(_date1),'keypress', cancelEvent);
  addEvent(el(_date2),'keypress', cancelEvent);
}

function parseDates(){
  parseDate(date1, dateCtrl1.value);
  parseDate(date2, dateCtrl2.value);
}

function parseDate(dt, val){
  var rg = new RegExp('^\s*([0-9]{1,2})/([0-9]{1,2})/([0-9]{2}|[0-9]{4})\s*$', "i");
  if(rg.exec(val)){
    dt.setTime(Date.parse('1/1/2007'));
    var fullYear=RegExp.$3;
    var month=RegExp.$1;
    var day=RegExp.$2;
    month = month.replace(/^0+/i,'');
    day = day.replace(/^0+/i,'');
    if(fullYear.length==2){
      fullYear= '20'+fullYear;
    }
    //fullYear = fullYear.replace(/^0+/i,'');
    if(fullYear<'1950'){
      dt.setTime(0);
      return;
    }
    dt.setFullYear(fullYear);
    var tmp = dt.getFullYear();
    dt.setMonth(month-1);
    if( tmp != dt.getFullYear() ){
      dt.setTime(0);
      return;
    }
    tmp = dt.getMonth();
    dt.setDate(day);
    if(dt.getMonth() != tmp ){
      dt.setTime(0);
      return;
    }
  } else {
    dt.setTime(0);
  }
}

function show1(){
  // checkDates includes parseDates Call;
  checkDates(dateCtrl1);
  curDateCtrl = dateCtrl1;
  curDate = date1;
  if(date1.getTime()){
    leftD.setTime(date1.getTime());
    if(leftD.getMonth()!=d.getMonth() || leftD.getFullYear() != d.getFullYear()){
      leftD.setDate(0);
    }
    leftD.setDate(1);
  } else if(date2.getTime()) {
    leftD.setTime(date2.getTime());
    if(leftD.getMonth()!=d.getMonth() || leftD.getFullYear() != d.getFullYear()){
      leftD.setDate(0);
    }
  } else {
    leftD.setTime(d.getTime());
  }
  leftD.setDate(1);

  el('calendarbox').style.visibility='hidden';
  show('calendarbox');
  draw();
  el('calendarbox').style.visibility='visible';
}

function show2(){
  // checkDates includes parseDates Call;
  checkDates(dateCtrl2);
  curDateCtrl = dateCtrl2;
  curDate = date2;

  if(date2.getTime()){
    leftD.setTime(date2.getTime());
    if(leftD.getMonth()!=d.getMonth() || leftD.getFullYear() != d.getFullYear()){
      leftD.setDate(0);
    }
    leftD.setDate(1);
  } else if(date1.getTime()) {
    leftD.setTime(date1.getTime());
    if(leftD.getMonth()!=d.getMonth() || leftD.getFullYear() != d.getFullYear()){
      leftD.setDate(0);
    }
  } else {
    leftD.setTime(d.getTime());
  }
  leftD.setDate(1);

  el('calendarbox').style.visibility='hidden';
  show('calendarbox');
  draw();
  el('calendarbox').style.visibility='visible';
}
function close(){
  removeEvent(document.body,'click',bodyclick);
  hide('calendarbox');
}
function next_month(){
  leftD.setDate(32);
  leftD.setDate(1);
  draw();
}
function prev_month(){
  leftD.setDate(0);
  draw();
}

function bodyclick(e){
  var el;
  if(window.event)
    el=window.event.srcElement;
  else
    el=e.target;
  if(!checkClick(el, 'calendarbox')&&!checkClick(el, _date1)&&!checkClick(el, _date2)&&!checkClick(el, _pick1)&&!checkClick(el, _pick2)){
    close();
  }
}

function draw(){
  // draw calendar
  addEvent(document.body,'click', bodyclick);

  el('calendarbox').style.left=getScreenX(curDateCtrl, el('calendarbox').offsetParent)+'px';
  el('calendarbox').style.top=getScreenY(curDateCtrl, el('calendarbox').offsetParent)+curDateCtrl.offsetHeight+2+'px';

  var firstDayIndex;
  var todayIndex;
  var lastDayIndex;
  var showD = new Date(leftD);
  var endMonthD = new Date(showD);


  // left month
  putEl('l_month', months[showD.getMonth()]+' '+showD.getFullYear());
  firstDayIndex = showD.getDay();
  endMonthD.setMonth(endMonthD.getMonth()+1);
  endMonthD.setDate(0);
  lastDayIndex = firstDayIndex + endMonthD.getDate();
  if(d.getYear() < showD.getYear() || (d.getYear() == showD.getYear() && d.getMonth() < showD.getMonth())){
    todayIndex= -1;
  }
  else if(d.getYear() == showD.getYear() && d.getMonth() == showD.getMonth()){
    todayIndex = firstDayIndex+d.getDate()-1;
  } else {
    todayIndex = false;
  }
  if( d.getYear()<showD.getYear() || (d.getYear()==showD.getYear() && d.getMonth() < showD.getMonth())){
    el('prev').style.visibility='visible';
  } else {
    el('prev').style.visibility='hidden';
  }
  for(i=0;i<42;i++){
    var dayNumber = i-firstDayIndex+1;
    var classN = '';
    if(dayNumber>0 && i < lastDayIndex){
      if(i>=todayIndex && todayIndex !== false){
        if(curDate.getYear()==showD.getYear() && curDate.getMonth()==showD.getMonth() && curDate.getDate() == dayNumber){
          classN='selected';
        }
        else if(i==todayIndex){
          classN='today';
        }
        dayNumber='<a href="javascript:writeDate(\''+pad2(showD.getMonth()+1)+'/'+pad2(dayNumber)+'/'+showD.getFullYear()+'\')">'+dayNumber+'</a>';
      }
    } else {
      dayNumber='';
    }
    el('l_'+i).className = classN;
    putEl('l_'+i,dayNumber);
  }

  // right month
  showD.setMonth(showD.getMonth()+1);

  putEl('r_month', months[showD.getMonth()]+' '+showD.getFullYear());
  firstDayIndex = showD.getDay();
  endMonthD.setDate(1);
  endMonthD.setMonth(endMonthD.getMonth()+2);
  endMonthD.setDate(0);
  lastDayIndex = firstDayIndex + endMonthD.getDate();
  if(d.getYear() < showD.getYear() || (d.getYear() == showD.getYear() && d.getMonth() < showD.getMonth())){
    todayIndex= -1;
  } else if(d.getYear() == showD.getYear() && d.getMonth() == showD.getMonth()){
    todayIndex = firstDayIndex+d.getDate()-1;
  } else {
    todayIndex = false;
  }
  for(i=0;i<42;i++){
    var dayNumber = i-firstDayIndex+1;
    var classN = '';
    if(dayNumber>0 && i < lastDayIndex){
      if(i>=todayIndex && todayIndex !== false){
        if(curDate.getYear()==showD.getYear() && curDate.getMonth()==showD.getMonth() && curDate.getDate() == dayNumber){
          classN='selected';
        }
        else if(i==todayIndex){
          classN='today';
        }
        dayNumber='<a href="javascript:writeDate(\''+pad2(showD.getMonth()+1)+'/'+pad2(dayNumber)+'/'+showD.getFullYear()+'\')">'+dayNumber+'</a>';
      }
    } else {
      dayNumber='';
    }
    el('r_'+i).className = classN;
    putEl('r_'+i,dayNumber);
  }
}

function pad2(num){
  if(num<10)
    return '0'+num;
  else
    return ''+num;
}

function writeDate(date){
  curDateCtrl.value=date;
  checkDates(curDateCtrl);
  close();
}

function checkDates(curDateCtrl){
  //validation
  parseDates();
  if(date2.getTime() && date1.getTime()>date2.getTime()){
    if(curDateCtrl==dateCtrl1){
      dateCtrl2.value='';
    } else {
      dateCtrl1.value='';
    }
  }
}

function putEl(id,html){
  var el=document.getElementById(id);
  if(el)
    el.innerHTML=html;
}
function valEl(id){
  return document.getElementById(id).value;
}
function el(id){
  return document.getElementById(id);
}
function show(el){
document.getElementById(el).style.display='block';
}
function hide(el){
document.getElementById(el).style.display='none';
}
function getScreenX(oEl, container){
  var x=0;
  while(oEl && oEl!=container){
    x+= oEl.offsetLeft;
    oEl=oEl.offsetParent;
  }

  if ( jQuery.browser.msie )
  {
  	x += 4;
  }

  return x;
}
function getScreenY(oEl, container){
  var y=0;
  while(oEl && oEl!=container){
    y+= oEl.offsetTop;
    oEl=oEl.offsetParent;
  }

  if ( jQuery.browser.msie )
  {
  	y += 4;
  }

  return y;
}
function checkClick(el, id){
  var res= false;
  while(el){
    if(el.id == id)
      res= true;
    el= el.parentNode;
  }
  return res;
}
function addEvent(el, evt, fn){
  if (window.addEventListener) {
    el.addEventListener(evt, fn, false);
  } else if (window.attachEvent) {
    el.attachEvent("on" + evt, fn);
  }
}
function removeEvent(el, evt, fn){
  if (window.removeEventListener) {
    el.removeEventListener(evt, fn, false);
  } else if (window.detachEvent) {
    el.detachEvent("on" + evt, fn);
  }
}

function cancelEvent(e) {
  if(window.event){
    e=window.event;
  }
  if( e.keyCode == 13 ){
    if (e.preventDefault) {
        e.preventDefault();
    } else {
      e.returnValue = false;
    }
  }
}