//
function getdate (timestamp) {
    // Get date/time information  
     var _w = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var _m = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
    var d = ((typeof(timestamp) == 'undefined') ? new Date() : // Not provided
    (typeof(timestamp) == 'object') ? new Date(timestamp) :    // Javascript Date()
    new Date(timestamp * 1000)                                 // UNIX timestamp (auto-convert to int)    
    );
    var w = d.getDay();
    var m = d.getMonth();
    var y = d.getFullYear();
    var r = {}; 
    r.seconds = d.getSeconds();
    r.minutes = d.getMinutes();
    r.hours = d.getHours();
    r.mday = d.getDate();    r.wday = w;
    r.mon = m + 1;
    r.year = y;
    r.yday = Math.floor((d - (new Date(y, 0, 1))) / 86400000);
    r.weekday = _w[w];    r.month = _m[m];
    r['0'] = parseInt(d.getTime() / 1000, 10);
 
    return r;
}
function mktime () {
    // Get UNIX timestamp for a date  
    var d = new Date(),
        r = arguments,
        i = 0,
        e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear']; 
    for (i = 0; i < e.length; i++) {
        if (typeof r[i] === 'undefined') {
            r[i] = d['get' + e[i]]();
            r[i] += (i === 3); // +1 to fix JS months.        } else {
            r[i] = parseInt(r[i], 10);
            if (isNaN(r[i])) {
                return false;
            }        
         }

    }
 
    // Map years 0-69 to 2000-2069 and years 70-100 to 1970-2000.
    r[5] += (r[5] >= 0 ? (r[5] <= 69 ? 2e3 : (r[5] <= 100 ? 1900 : 0)) : 0); 
    // Set year, month (-1 to fix JS months), and date.
    // !This must come before the call to setHours!
    d.setFullYear(r[5], r[3] - 1, r[4]);
     // Set hours, minutes, and seconds.
    d.setHours(r[0], r[1], r[2]);
 
    // Divide milliseconds by 1000 to return seconds and drop decimal.
    // Add 1 second if negative or it'll be off from PHP by 1 second.    
    return (d.getTime() / 1e3 >> 0) - (d.getTime() < 0);
}

function time () {
    // Return current UNIX timestamp  
    return Math.floor(new Date().getTime() / 1000);
}
function sqldate( year, month, day )
{
  day='00'+day;
  day=day.match( /..$/);

  month='00'+month;
  month=month.match(/..$/);

  year='0000'+year;
  year=year.match(/....$/);
  return( year+"-"+month+"-"+day );
}

function ts_2_sqldate( ts, dotime )
{
  dotime = typeof(dotime) != 'undefined' ? dotime : 0;
  var dt=getdate(ts);
  var mn=dt.mon;
  var yr=dt.year;
  var dy=dt.mday;
  var tstring="";
  if ( dotime > 0 ){
    var hr = "00"+dt.hours;
    var min = "00"+dt.minutes;
    var sec = "00"+dt.seconds;
    hr=hr.match(/..$/);
    min=min.match(/..$/);
    sec=sec.match(/..$/);
    if ( dotime == 2 ){
      tstring=hr+":"+min+":"+sec;
    }else{
      tstring=hr+":"+min;
    }
  }
  var sqld=sqldate( yr, mn, dy );
  return( sqld+" "+tstring );
}

function sqlalert()
{
  res=ts_2_sqldate( time(), 2 );
  alert( "sqldate is "+res );
}

function render_month( ts, extraclass )
{
  extraclass = typeof(extraclass) != 'undefined' ? extraclass : 1;

  var m_id = document.menuform.__menu.value;

  var now;
  var fnow;
  var dt;
  var dy;
  var mn;
  var yr;
  var nowts;
  var wd;
  var tdclass;
  var onmouseup;

  fnow=mktime();
  dt=getdate(fnow);
  dy=dt.mday;
  mn=dt.mon;
  yr=dt.year;
  nowts=mktime( 6,0,0,mn,dy,yr);

  // align at the begining of a month

  dt=getdate( ts );
  var tmonth=dt.mon;
  yr=dt.year;
  ts=mktime(6,0,0,tmonth,1,yr);

  var prev_m_ts=ts-(6*3600)-1;
  var next_m_ts=ts+2764800;
  var prev_y_ts=ts-(364*24*3600);
  var next_y_ts=ts+(366*24*3600);
  now=time;

  dt=getdate( ts );
  var tmonth=dt.month;
  var gmonth=tmonth;
  var first=1;
  var didendtr=0;
  var divline="<tr><td class=divider></td><td class=divider></td><td class=divider></td><td class=divider></td><td class=divider></td><td class=divider></td><td class=divider></td></tr>\n";

  // increment ts by a day and watch for the change in the month
  var op = [];
  var faction='calendar';
  op.push( "<table class=\""+extraclass+" cal\" >\n");
  op.push( "<tr><td colspan=7 align=center>"+dt.month+" "+dt.year+"</td></tr>\n" );

  //

  op.push("<tr><td>Su</td><td>Mo</td><td>Tu</td><td>We</td><td>Th</td><td>Fr</td><td>Sa</td></tr>\n");
  op.push( divline );
  while( tmonth == gmonth ){
    didendtr=0;
    wd=dt.wday;
    if ( first ) {
      first=0;
      if ( wd != 7 ){
        op.push("<tr>");
        for(i=0;i<wd;i++){
          op.push( "<td align=center></td>");
        }
      }
    }
    if ( wd == 7 ){
      op.push("<tr>");
    }
    faction="'DAY'";
    if ( Math.abs( nowts - ts ) < 80000 ){
      tdclass="class=today";
    }else{
      tdclass="";
    }

    // could consider doing data (dhighlight) here - see ph[p
    // could add on mouse up process here - see php
    onmouseup="";

    op.push( "<td align=center "+tdclass+" "+onmouseup+" ><a class=cal href=\"javascript:do_submit( "+m_id+", "+faction+", "+ts+" ) \">"+dt.mday+"</a></td>" );
    if ( wd == 6 ){
      op.push( "</tr>\n" );
      didendtr=1;
    }
    ts+=86400;
    dt=getdate(ts);
    gmonth=dt.month;
    mn=dt.mon;
    yr=dt.year;
    md=dt.mday;
  }
  if ( didendtr == 0 ){
    op.push( "</tr>\n" );
  }
  op.push( "</table>\n" );
  return( op );
}

function cal_controls( ts, extraclass )
{
  // get the button graphic references
  var graphprev_y=document.menuform.__graphic_calprev_y.value;
  var graphprev_m=document.menuform.__graphic_calprev_m.value;
  var graphtoday =document.menuform.__graphic_caltoday.value;
  var graphnext_m=document.menuform.__graphic_calnext_m.value;
  var graphnext_y=document.menuform.__graphic_calnext_y.value;

  var op = [];
  //align at begining of month
  //
  var dt=getdate( ts );
  var tmonth=dt.mon; 
  var yr=dt.year;
  var ts=mktime(15,0,0,tmonth,15,yr ); 

  var prev_m_ts=ts-(20*86400)-1;
  var next_m_ts=ts+(20*86400);

  var prev_y_ts=ts-(365.25*24*3600);
  var next_y_ts=ts+(365.25*24*3600);

  var now=time();

  var margin="18px";

  // assume curved calendar
  op.push( "<table class=\""+extraclass+" cal\" style=\"margin-left: "+margin+"; position: relative; top: -5px\" >\n");

  op.push( "<tr><td></td>"+
            "<td align=center>"+
                "<a class=cal href=\"javascript:do_calendar( "+prev_y_ts+" )\"><IMG src=\""+graphprev_y+"\"></a>"+
            "</td>"+
                 "<td align=center><a class=cal href=\"javascript:do_calendar( "+prev_m_ts+" )\"><IMG src=\""+graphprev_m+"\"></a></td>"+
            "<td align=center>"+
                 "<a class=cal href=\"javascript:do_calendar( "+now+" )\"><IMG SRC=\""+graphtoday+"\"></a>"+
            "</td>"+ 
              "<td align=center><a class=cal href=\"javascript:do_calendar( "+next_m_ts+" )\"><IMG SRC=\""+graphnext_m+"\"></a></td>"+
            "<td align=center>"+
                 "<a class=cal href=\"javascript:do_calendar( "+next_y_ts+" )\"><IMG SRC=\""+graphnext_y+"\"></a>"+
            "</td>"+
            "<td></td></tr>\n" );

  op.push( "</table>\n" );
  return( op );
}

function do_calendar( ts )
{
  var quick_cal=document.getElementById( '__quick_cal' );
  var dt=getdate( ts );
  var mn=dt.mon;
  var yr=dt.year;
  var ts=mktime(6,0,0,mn,1,yr );

  var ts_m1=ts-(6*3600)-1;
  var ts_m2=ts;
  var ts_m3=ts+2764800;
  
  var controls=cal_controls( ts, 'first' );

  var m1=render_month( ts_m1 );
  var m2=render_month( ts_m2 );
  var m3=render_month( ts_m3 );

  var output = "" ;
  for( var line in controls ){
    output=output+controls[line];
  }
  for( var line in m1 ){
    output=output+m1[line];
  }
  for( var line in m2 ){
    output=output+m2[line];
  }
  for( var line in m3 ){
    output=output+m3[line];
  }

  // now update the display month of the calendar and render the array op as string in innerHTML on the calendar control
  quick_cal.innerHTML=output;
  document.menuform.__sec.value=ts;
}

