//REQUIRES OBLONGTECH21.JS

//HIDE CALENDARS ON CLICK DOCUMENT EVENT
addEvent(document,'click',function(event){
 event = ( window.event || event ); var target = ( event.target || event.srcElement );
 var elems = $$('.calendar').items;
 for(var i=0;i<elems.length;i++){
  var e = elems[i].parentNode;
  var a = concatnest([nextSib(e),parseElems(nextSib(e).getElementsByTagName('*'))]);
  if(!inarray(a,target)){ hide(e); }
  }
 });

//INITIAL
function initCalendar(c,input){
 var n = document.createElement('div');
 n.setAttribute('class','calendar-placeholder');
 insertBefore(n,c);
 addEvent(n,'click',function(event){ stopEvent(event); })//KILL ONCLICK PROPAGATION FOR CALENDAR PLACEHOLDER
 var cal = new Calendar(n,input);
 n.innerHTML = cal.html;
 c.onclick = function(event){ showcal(cal.id,cal.input); };
 }


function dateselect(calid,input,d){
 if(typeof input == 'string') input = getElem(input);
 
 if(d!='') d = parseDate(d)
 else d = ['XXXX',13,00];
 
 months_labels = {0:'JAN',1:'FEB',2:'MAR',3:'APR',4:'MAY',5:'JUN',6:'JUL',7:'AUG',8:'SEP',9:'OCT',10:'NOV',11:'DEC',12:'XXX'};
 
 jQuery('.calmonth',jQuery(input).prev().prev().get(0))
 .html(months_labels[d[1]-1]);
 jQuery('.calday',jQuery(input).prev().prev().get(0))
 .html(d[2]);
 jQuery(input).prev()
 .html(d[0]);
 
 input.value = (d.join('-')!='XXXX-13-0' ? d.join('-') : '' );
 jQuery(input).prev().prev().click();
 //hide(calid);
 }
/*END CUSTOMIZABLE FUNCTIONS*/
/*#########################################################################################*/
 
Calendar = function(e,i,date){
 days_mapped = [6,0,1,2,3,4,5];
 days_labels = ['MON','TUE','WED','THU','FRI','SAT','SUN'];
 months_labels = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
 
 if(!e || typeof(e)=='undefined'){ e = false; id = 'cal_'+randstr(8); }
 else if(typeof(e)=='string'){ id = e; }
 else if(typeof(e)=='object'){ id = (!e.id ? 'cal_'+randstr(8) : e.id ); e.id = id; }
 this.id = id;//STORE ID
 
 if(!i || typeof(i)=='undefined'){ i = input = false; }
 else if(typeof(i)=='string'){ input = i; i = getElem(i); }
 else if(typeof(i)=='object'){ input = (!i.id ? 'val_'+randstr(8) : i.id ); i.id = input; }
 this.input = input;
 
//get today
 var today=new Date(); todaysDate = today.getDate(); todaysMonth = today.getMonth()+1; todaysYear = today.getFullYear();
 
 if(typeof(date)=='undefined' && typeof(i)=='object' && i.value!=''){ date = i.value; }
 else if(typeof(date)=='undefined'){ date = todaysYear+"-"+todaysMonth+"-"+todaysDate; }
 date = parseDate(date); this.year = date[0]; this.month = date[1]; this.day = date[2];
  
//get input value date
if(this.input){
 var currval = parseDate(getElem(input).value);
 inputYear = currval[0]; inputMonth = currval[1]; inputDay = currval[2];
 }

//get first day of month
var firstDay = new Date(this.year, this.month-1, 1);
var startingDay = days_mapped[firstDay.getDay()];
  
//find number of days in month
var monthLength = daysInMonth(this.month-1,this.year);
/*
  var MYselect = '';
  for(var m=-6;m<7;m++){
   y = this.year;
   n = this.month-1+m;
   if(n<0){ n+=12; y--; } else if(n>11){ n-=12; y++; }
   var sel = (n==this.month&&y==this.year) ? ' selected' : '' ;
   MYselect += '<option value="'+y+'/'+n+'"'+sel+'>'+months_labels[n]+' '+y+'</option>';
   }
*/
  var Mselect = '';
  for(var m=1;m<=12;m++){
   var sel = (m==this.month) ? ' selected' : '' ;
   Mselect += '<option value="'+m+'"'+sel+'>'+months_labels[m-1]+'</option>';
   }
  var Yselect = '';
  for(var y=this.year-6;y<this.year+6;y++){
   var sel = (y==this.year) ? ' selected' : '' ;
   Yselect += '<option value="'+y+'"'+sel+'>'+y+'</option>';
   }
  
//do the header
var monthName = months_labels[this.month-1];

var html = ''
+ '<div class="calendar"><table class="calendar-table">'
+ '<tr><th class="prevmonth" style="cursor:pointer;cursor:hand;" onclick="monthselect('+printVar(this.id)+','+printVar(this.input)+',['+this.year+','+(this.month-1)+']);">&lt;&lt;</th><th colspan="5">'
+ '<select class="cal-month-select" onchange="monthselect('+printVar(this.id)+','+printVar(this.input)+',nextSib(this).value+\'-\'+this.value)">'+Mselect+'</select>'
+ '<select class="cal-year-select" onchange="monthselect('+printVar(this.id)+','+printVar(this.input)+',this.value+\'-\'+prevSib(this).value)">'+Yselect+'</select>'
+ '</th><th style="cursor:pointer;cursor:hand;" onclick="monthselect('+printVar(this.id)+','+printVar(this.input)+',['+this.year+','+(this.month+1)+']);">&gt;&gt;</th></tr>'
+ '<tr class="calendar-header">';

//fill in weekday labels
for(var i=0;i<=6;i++){
html += '<td class="calendar-header-day"><div class="inner">'+ days_labels[i]+ '</div></td>';
 }
html += '</tr><tr>';

//fill in the days
var day = 1;

//this loop is for is weeks (rows)
for(var i=0;i<9;i++){

//this loop is for weekdays (cells)
 for(var j=0;j<=6;j++){
  html += '<td class="calendar-day';
  if(day<=monthLength && (i>0 || j>=startingDay)){
   if(this.input && inputDay==day && inputMonth==this.month && inputYear==this.year ) html += ' calendar-selected';
   if(todaysDate==day && todaysMonth==this.month && todaysYear==this.year ) html += ' calendar-today';
   html += '"><a href="javascript:;" onclick="dateselect('+printVar(this.id)+','+printVar(this.input)+',['+this.year+","+this.month+","+day+']);">'+ day + '</a>';
   day++;
   }
  else{
   html += '">';
   }
  html += '</td>';
  }

//stop making rows if we've run out of days
 if(day>monthLength){ break; }
 else {
  html += '</tr><tr>';
  }
 }
html += '</tr></table></div>';
 
 this.html = html;
 
 }

/*CALENDAR SUBROUTINES AND MISC FUNCTIONS*/
function monthselect(calid,inputid,date){
 d = parseDate(date);
 y=parseInt(d[0]); m=parseInt(d[1]);
 if(m<1){m=12;y--;}else if(m>12){m=1;y++;}
 var cal = new Calendar(calid,inputid,[y,m,01]);
 getElem(calid).innerHTML = cal.html;
 }
function showcal(calid,inputid){
 var cal = new Calendar(calid,inputid);
 getElem(calid).innerHTML = cal.html;
 show(calid);
 }

function daysInMonth(month,year){
 days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
 var monthLength = days_in_month[month];
 //COMPENSATE FOR LEAP YEAR
 if(month==1){/*FEB ONLY*/
  year=(typeof(year)=='undefined' ? (new Date()).getFullYear() : year );
  if((year%4==0 && year%100!=0) || year%400==0){ monthLength=29; }
  }
 return monthLength;
 }

function parseDate(date){
 if(typeof(date)=='undefined'){ return []; }
 date = (typeof(date)=='string' ? date.split(/\/|\.|\-/g) : date );
 var y = parseInt(date[0]);
 var m = (parseInt(date[1])==0 && date[1].toString().length==2 ? parseInt(date[1].toString().substr(1)) : parseInt(date[1]) );
 var d = (parseInt(date[2])==0 && date[2].toString().length==2 ? parseInt(date[2].toString().substr(1)) : parseInt(date[2]) );
 /*
 y = (isNaN(y) || y == null) ? (new Date()).getFullYear() : y ;
 m = (isNaN(m) || m == null) ? (new Date()).getMonth()+1 : m ;
 d = (isNaN(d) || d == null) ? (new Date()).getDate() : d ;
 */
 return [y,m,d];
 }
/* ²function parseDate(date,limit){ return (typeof(date)=='string' ? date.split(/\/|\.|\-/g,(limit|3)) : date ); } SEE ABOVE*/

function printVar(v){
 var str = '';
 if(typeof(v)=='string'){str = '\''+v+'\'';}
 else if(typeof(v)=='number'){str = v;}
 else if(typeof(v)=='boolean'){str = (v ? 'true' : 'false' );}
 /*
 else if(isarray(v)){
  for(var i in v){str+='\\\''++'\\\'';}
  str = '['+(str)+']';
  }
 else if(typeof(v)=='object'){ }
 else{}
 */
 return str; 
 }

function parseElems(a){ var c = []; var j=0; for(i=0;i<a.length;i++){ if(a[i].nodeType!=3){ c[j++]=a[i]; } } return c; }
/* ²³function getChildren(e){ return parseElems(e.childNodes); } SEE ABOVE*/
function allElems(e){  }

function stopEvent(event){
 if(window.event){/*IE*/ event.cancelBubble = true; event.returnValue = false; }
 else{ event.preventDefault(); event.stopPropagation(); }
 return true;
 } cancelEvent = stopEvent;


