
var day_info = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var day_initial = ["S","M","T","W","T","F","S"];
var month_info = ["January","February","March","April","May","June","July","August","September","October","November","December"];

function js2date(mydate){
	if(null == mydate) return "";
//	if(mydate == null) return "0000-00-00";
	return sprintf("%04d-%02d-%02d", mydate.getFullYear(),(mydate.getMonth()+1),mydate.getDate());
}

function null_datetime(myid){
	if(null == myid) return true;
	myid = myid.replace(/\D/g,"");
	return (myid*1 == 0);
}

function date2js(myid){
	if(null_datetime(myid)) return null;
	var temp = myid.split("-");
	var mymonth = ((temp[1]*1)-1);
	var mydate = new Date(temp[0],mymonth,temp[2]);
//	mydate.setFullYear(temp[0]);
	if(isNaN(mydate)) mydate = new Date();
	return mydate;
}

function ozdate2js(myid){
	if(null_datetime(myid)) return null;
	var temp = myid.split("/");
	if(temp[2]<30) temp[2] = 2000 + 1*temp[2];
	var mydate = new Date(temp[2],temp[1]*1-1,temp[0]);
//	mydate.setFullYear(temp[2]);
	if(isNaN(mydate)){
		alert("Invalid date format: Please use DD/MM/YYYY");
		return false;
	}
	return mydate;
}

function js2ozdate(mydate){
	if(null == mydate) return "";
	return sprintf("%02d/%02d/%04d", mydate.getDate(), (mydate.getMonth()+1), mydate.getFullYear());
}

function oztime2js(myid){
	if(null_datetime(myid)) return null;
	var myhours = 0;
	myid = myid.toLowerCase();
	var mypos = myid.indexOf("am");
	if(mypos>0) myid = myid.slice(0,mypos);
	mypos = myid.indexOf("pm");
	if(mypos>0){
		myid = myid.slice(0,mypos);
		myhours = 12;
	}
		
	var temp = myid.split(":");
	for(var i=0; i<3; i++){
		temp[i] = (isNaN(temp[i])) ? 0 : temp[i]*1;
	}
	if(temp[0]<12 && myhours>0) temp[0] += myhours;
	var mydate = new Date(0,0,0,temp[0],temp[1],temp[2]);
	if(isNaN(mydate)){
		alert("Invalid date format: Please use HH:MM:SS AM/PM");
		return false;
	}
	return mydate;
}

function js2oztime(mydate){
	if(null == mydate) return "";
	var myhours = mydate.getHours();
	var ampm = (myhours >= 12) ? " PM" : " AM";
	if(myhours>12) myhours = myhours - 12;
	if(myhours == 0) myhours = 12;
	return sprintf("%d:%02d:%02d", myhours, mydate.getMinutes(), mydate.getSeconds()) + ampm;
}

function js2time(mydate){
	if(null == mydate) return "";
	return sprintf("%d:%02d:%02d", mydate.getHours(), mydate.getMinutes(), mydate.getSeconds());
}

function time2js(myid){
	if(null_datetime(myid)) return null;
	var temp = myid.split(":");
	var mydate = new Date(1970,0,1,temp[0],temp[1],temp[2]);
	if(isNaN(mydate)) mydate = new Date();
	return mydate;
}

function date_add(a,b){
	alert(a.getTime());
	alert(b.getTime());
	return new Date(a.getTime() + b.getTime());
}

function datetime2js(myid){
	if(null_datetime(myid)) return null;
	myid = myid.replace(/[: ]/g,"-");
	var temp = myid.split("-");
	var mydate = new Date(temp[0],temp[1]*1-1,temp[2],temp[3],temp[4],temp[5]);
	if(isNaN(mydate)) mydate = new Date();
	return mydate;
}

function js2datetime(mydate){
	if(null == mydate) return "";
	return js2date(mydate) + " " + js2time(mydate);
}

function init_datetime(myname,value,datatype,compact){
	document[fc][myname] = new datetime_input(myname,value,datatype,compact);
	document[fc][myname].init_inputs();
}

function datetime_input(myname,value,datatype,compact){
	document.write("<input type='hidden' name='" + myname + "' id='" + myname + "'>\n");

	this.obj_name = fc + '[\"' + myname + '\"]';
	this.input = new getObj(myname);
	this.datatype = datatype;
	this.id = myname;
	this.compact = compact;
	this.orig_date = value;
	
	this.reset = datetime_reset;
	this.now = datetime_now;
	this.set_null = datetime_set_null;
	this.init_inputs = datetime_init_inputs;
	this.update = datetime_update;
	this.set = datetime_set;
}

function datetime_set(value){
//	set value in text format..
	if(this.datatype == "date") myval = date2js(value);
	if(this.datatype == "datetime" || this.datatype == "timestamp") myval = datetime2js(value);
	if(this.datatype == "time") myval = time2js(value);
	if(this.cal) this.cal.update(myval);
	if(this.time) this.time.update(myval);
	this.update();	
}

function datetime_init_inputs(){
	if(this.datatype == "date" || this.datatype == "datetime" || this.datatype == "timestamp" ) this.cal = new cal_obj(this.id,this.mydate,this);
	if(this.datatype == "time" || this.datatype == "datetime" || this.datatype == "timestamp" ) this.time = new time_obj(this.id,this.mytime,this)
	this.set(this.orig_date);
	if(!this.compact){
		temp = "<input tabindex='-1' type='button' value='Now'  onclick='" + this.obj_name + ".now(event)'>";
		temp += "<input tabindex='-1' type='button' value='Null'  onclick='" + this.obj_name + ".set_null(event)'>";
		temp += "<input tabindex='-1' type='button' value='Reset' onclick='" + this.obj_name + ".reset(event)'>";
		document.write(temp);
	}
}

// datetime_input update functions

function datetime_update(){
	var temp = new Array();
	if(this.cal) temp.push(this.cal.curr_id);
	if(this.time) temp.push(this.time.curr_id);
	temp = temp.join(" ");
	this.input.obj.value = null_datetime(temp) ? "NULL" : temp;
}

// datetime_input set functions
function datetime_reset(e){
	this.set(this.orig_date);
}

function datetime_now(e){
	var mydate = new Date();
	if(this.cal) this.cal.update(mydate);
	if(this.time) this.time.update(mydate);
	this.update();
}

function datetime_set_null(e){
	if(this.cal) this.cal.update(null);
	if(this.time) this.time.update(null);
	this.update();
}

function time_obj(myname,value,myparent){
	this.id = myname+".time";
	this.type="time";
	this.parent = myparent;
	this.obj_name = fc + '[\"' + myname + '\"].time';

	var temp = "<input type='text' maxlength='11' size='11' value='unset' onChange='" + this.obj_name + ".input_update(this)' id='" + display_ext + this.id + "' class='text_input'>\n";
	document.write(temp);

	this.display = new getObj(display_ext + this.id);
	this.input_update = time_input_update;
	this.update = time_update;
}

function time_update(mytime){
	this.curr_id = js2time(mytime);
	this.display.obj.value = js2oztime(mytime);
}

function time_input_update(x){
	this.update(oztime2js(x.value));
	this.parent.update();
}


function cal_obj(myname,value,myparent){
	this.id = myname+".cal";
	this.type="calendar";
	this.parent = myparent;
	this.obj_name = fc + '[\"' + myname + '\"].cal';

	this.today = js2date(new Date());
	var temp = "";
	temp += "<input type='text' maxlength='11' size='11' onChange='" + this.obj_name + ".input_update(this)' id='" + display_ext + this.id + "' class='text_input'>\n";
	temp += "<div id='" + drop_ext + this.id + "' class='drop'  onclick='" + this.obj_name + ".toggle_menu(event);'><img align='absmiddle' src='drop.gif'></div>\n";
	temp += "<div id='" + menu_ext + this.id + "' class='submenu' style='display:none' onclick='cancel_bubble(event);'></div>\n";
	document.write(temp);

	this.move_month = move_month;
	this.update = update_cal;
	this.update_id = update_id;
	this.toggle_menu = toggle_menu;
	this.input_update = cal_input_update;
	this.onkeydown = cal_keydown;

	this.display = new getObj(display_ext + this.id);
	this.menu = new getObj(menu_ext + this.id);
	this.drop = new getObj(drop_ext + this.id);

}


/*
// Functions for setting date & updating display
*/

function update_cal(newdate){
//	update from js date object
	var curr_my = this.year + "-" + this.month;

	mydate = (newdate == null) ? new Date() : newdate;
	this.year = mydate.getFullYear();
	this.month = mydate.getMonth();
	this.day = mydate.getDate();

	if(curr_my != this.year + "-" + this.month){
		this.menu.obj.innerHTML = print_calendar(this);
		colour_border(this.id + "-" + this.today, "darkred");
	} else {
		var myelt = new getObj(this.id + "-" + this.curr_id);
		if(myelt) myelt.obj.className = "cell_d";
	}
	this.curr_id = js2date(newdate);

	var myelt = new getObj(this.id + "-" + this.curr_id);
	if(myelt) myelt.obj.className = "cell_h";

	this.display.obj.value = js2ozdate(newdate);

	this.parent.update();
}

function update_id(myid){
//	update from mysql style date id
	var mydate = date2js(myid);
	this.update(mydate);
}

/*
// User Action Functions
*/

function move_month(e,offset){
	var mymonth = this.month+offset;

//	handle months with fewer days than the day selected...
	var end_date = new Date(this.year,mymonth+1,0);
	var myday = (this.day>end_date.getDate())?end_date.getDate():this.day;

	this.update_id(this.year+"-"+(mymonth+1)+"-"+myday);
	cancel_bubble(e);
}

function cal_keydown(e){
	if (!e) var e = window.event;
	var mykey = getEventKey(e);
//	alert(mykey);
	if(mykey >= 37 && mykey <= 40){
        move_cell(this,mykey);
		return false;
    }
	if(mykey == 13){
		this.toggle_menu();
		return false;
	}
/*
//	reset if hit cancel
//	currently disabled as this.orig_id no longer exists...
	if(mykey == 27){
		this.update_day(this.orig_id);
		this.toggle_menu();
		return false;
	}
*/
	return true;
}

function move_cell(mycal,mykey){
	var myday = mycal.day;
    switch(mykey){
        case 37: myday--; break;
        case 38: myday-=7; break;
        case 39: myday++; break;
        case 40: myday+=7; break;
    }
	var mydate=ozdate2js(myday+"/"+(mycal.month+1)+"/"+mycal.year);
	mycal.update_id(js2date(mydate));
}

function cal_input_update(x){
	var mydate = ozdate2js(x.value);
	this.update(mydate);
}

/*
// Calendar Drawing Functions
*/

function print_cell(mycal,id,cell_type){
	var myinfo = id.split("-");
	var myday = myinfo[2]*1;
	var text = (myday) ? myday : "&nbsp;";
	var click = (myday) ? " onclick='" + mycal.obj_name + ".update_id(\"" + id + "\");'" : "";
	return "<div class='cell_" + cell_type + "' id='" + mycal.id + "-" + id + "'" + click + ">" + text + "</div>\n";
}

function print_calendar(mycal,start_day){
	if(!arguments[1]) var start_day = 1;
	var blank_cell = "<div class='cell_b'>&nbsp;</div>\n";

	var start_date = new Date(mycal.year,mycal.month,1);
//	var end_date = new Date(mycal.year,mycal.month+1,0);

//	mycal.year = start_date.getFullYear();
//	mycal.month = start_date.getMonth();
//	mycal.day = (mycal.day>end_date.getDate())?end_date.getDate():mycal.day;

	var temp = "<div class='table_body'>\n";
	temp += "<div class='date_header'>\n";
	temp += "<div class='cell_d' onclick='" + mycal.obj_name + ".move_month(event,-1);'><img src='left.gif' border=0></div>\n";
	temp += "<div style='float:left;width:84pt'>\n" + month_info[mycal.month] + " " + mycal.year + "</div>\n";
	temp += "<div class='cell_d' onclick='" + mycal.obj_name + ".move_month(event,1);'><img src='right.gif' border=0></div>\n";
	temp += "</div>\n";

	temp += "<div class='table_row'>\n";
	temp += blank_cell;
	for(var i = 0; i<7; i++){
		var wday = (i + start_day) % 7;
		temp += "<div class='cell_ul'>" + day_initial[wday] + "</div>\n"; 
	}
	temp += blank_cell;
	temp += "</div>\n";

	var offset = (7+ start_date.getDay() - start_day) % 7;
	temp += "<div class='table_row'>\n";
	temp += blank_cell;

	for(var mday = 1; mday <= 42; mday++){
		var mydate = new Date(mycal.year,mycal.month,mday-offset);
		var myid = js2date(mydate);
		var cell_type = (mydate.getMonth()==mycal.month) ? "d" : "f";
		temp += print_cell(mycal,myid, cell_type);
		if(mday % 7 == 0){
			temp += blank_cell + "</div>\n<div class='table_row'>\n" + blank_cell;
		} 
	}

	temp += blank_cell + "</div>\n";
	return temp;
}


