// JavaScript Document
/* keycodes:
<-| 13
<- 37
/\ 38
-> 39
\/ 40

Abbr.    
dow = day of the week
wk = week
mo = month
yr = year
nav = navigation
*/

document.onkeydown = navigate;

var current_view = 'month';
var top_hour = 9;

var x_index = 0;
var max_x = 7; //only relevant when y_index == max_y
var last_x = 0;
var y_index = 0;
var max_y = 8;
var last_y = 0;
var current_cam = 1;

var aDOM = 0;
var stdDOM = document.getElementById;
if (stdDOM){
	aDOM = 1;
}else {
	alert('Error - browser does not support getElementById');
}

//////////////////////////////////////
//////////////////////OBJECT FUNCTIONS
//////////////////////////////////////



function xDOM(objectId, isStyle) {
	//currentHTML = document.getElementById('detail').innerHTML; 
	//document.getElementById('detail').innerHTML = currentHTML + '<br>' + objectId;
	return isStyle ? document.getElementById(objectId).style : document.getElementById(objectId);
}

//style functions
function setVis (object, show_hide) {
	var obj = xDOM(object, 1);
	obj.visibility = show_hide;
}

function setBg (object, color) {
	var obj = xDOM(object, 1);
	obj.backgroundColor = color;
}

function setBrdr (object, color) {
	var obj = xDOM(object, 1);
	obj.borderColor = color;
}

function setColor (object, color) {
	var obj = xDOM(object, 1);
	obj.color = color;
}

function setAlign (object, align) {
	var obj = xDOM(object, 1);
	obj.textAlign = align;
}

function setTop (object, px) {
	var obj = xDOM(object, 1);
	obj.top = px;
}

//property functions
function setSrc (object, source) {
	var obj = xDOM(object, 0);
	obj.src = source;
}

function setInner (object, text) {
	var obj = xDOM(object, 0);
	obj.innerHTML = text;
}

function readInner (object){
	var obj = xDOM(object, 0);
	return ( obj.innerHTML );
}

//////////////////////////////////////
////////////////////////DATE FUNCTIONS
//////////////////////////////////////


//uncomment the dates to force calendar to start on specific day
var today = new Date(/*2006, 1, 19*/);
var use_date = new Date(/*2006, 1, 19*/);
var selected_date = new Date(/*2006, 1, 19*/);
var last_selected_date = null;
var last_selected_day = null;
var offset = 0;
days_of_week = Array ( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
months_of_year = Array ( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" );
days_in_month = Array ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var target_today;
var num_days;
var current_wk;
var current_mo;
var current_yr;
var first_day_of_month;
var first_day_of_week;
var real_wk;
var real_mo;
var real_yr;
var first_day_real_month;
var real_offset;

function ordinal(num){
	return ( [ "th","st","nd","rd" ] [ (! ( (( m=num%10 ) >3 ) || ( Math.floor ( num%100/10 ) == 1 )) ) *m ] );
}

function is_leap_year(year) {
     return year%4===0&&year%100!==0||year%400===0;
}

function getWeek(year,month,day) {
    var newYear = new Date( year, 0, 1 ); 
    // Calculate the offset  of the day of the week
    var wk_offset  = 7 + 1 - newYear.getDay();
	if ( wk_offset  == 8 ){
		wk_offset  = 1;
	}
    // Calculate the day of the year (daynum)
    var daynum = ((Date.UTC(year,month,day,0,0,0) - Date.UTC(year,0,1,0,0,0)) /1000/60/60/24) + 1;
    // Use daynum and offset  to work out the week number 
    var weeknum = Math.floor( ( daynum - wk_offset + 7 ) / 7 );
    // If the weeknum is zero, then date is within last week of last year
    if (weeknum === 0) {
        // decrease year by 1
        year--;
        // Create a date object for 1st January last year:
        var prevNewYear = new Date(year,0,1);
        // Calculate the offset for last year:
        var prevOffset = 7 + 1 - prevNewYear.getDay();
        // Check for 53rd week
        if (prevOffset == 2 || prevOffset == 8){
			weeknum = 53;
		}else {
			weeknum = 52;
		}
    }
	return weeknum;
}

function set_max_x(){
	max_x = ( days_in_month[use_date.getMonth()] + offset ) - ( ( max_y - 4 ) * 7) - 1; 
}
                                
function reference_dates(use_date){
	num_days = days_in_month[use_date.getMonth()];
	if ( use_date.getMonth() == 1 && is_leap_year(use_date.getFullYear()) ){
		num_days = 29;
	} 
	
	current_mo = use_date.getMonth();
	current_yr = use_date.getFullYear();
	current_wk = getWeek(current_yr,current_mo,use_date.getDate());
	current_dow = use_date.getDay();
	first_day_of_month = new Date(current_yr, current_mo, 1);
	first_day_of_week = new Date(current_yr, current_mo, use_date.getDate() - current_dow);
	offset = first_day_of_month.getDay() + 1;
	
	real_mo = today.getMonth();
	real_yr = today.getFullYear();
	real_wk = getWeek(real_yr,real_mo,today.getDate());
	real_dow = today.getDay();
	first_day_real_month = new Date(real_yr, real_mo, 1);
	real_offset = first_day_real_month.getDay() + 1;
}

function initialize_by_view(){
	if ( current_view == 'month' ){
		initialize_month_view(use_date);
	}else if ( current_view == 'week' ){
		initialize_week_view(use_date);
	}else if ( current_view == 'day' ){
		initialize_day_view(use_date);
	}
}

function initialize_date_nav (use_date) {
	//set week day and month view text
	setInner('select_month_view', months_of_year[current_mo]  + ' ' + current_yr);
	setInner('select_week_view', 'Week ' + getWeek(current_yr, current_mo, use_date.getDate()));
	setInner('select_day_view', days_of_week[use_date.getDay()] + ' ' + use_date.getDate() + '<sup>' + ordinal(use_date.getDate()) + '</sup>');
}
                                
function initialize_month_view (use_date) {
	
	reference_dates(use_date);

	initialize_date_nav(use_date);
	
	setVis('month_view', 'visible');
	setVis('week_view', 'hidden');
	setVis('wv_day0', 'hidden');
	setVis('wv_detail0', 'hidden');
	setVis('day_view', 'hidden');
	for ( i = 0; i < 24; i++){
		setVis('dv_hour' + i, 'hidden');
		setVis('dv_detail' + i, 'hidden');
	}

	//show week 6
	if ( offset + num_days > 36 ){
		max_y = 9;
		for ( i = 36; i < 43; i++ ){
			if ( i == 36 ){
				setBg( 'day' + i, '#CCCCCC');
				setColor( 'day' + i, '#000000');
				setAlign( 'day' + i, 'left');
			}else if ( ( i == 37 ) && ( offset + num_days > 37 ) ){
				setBg( 'day' + i, '#FFFFFF');
				setColor( 'day' + i, '#000000');
				setAlign( 'day' + i, 'left');
			}else {
				setBg( 'day' + i, '#000000');
			}
			
		}
	}else{
		max_y = 8;
		for (i = 36; i < 38; i++){
			setColor( 'day' + i, '#FFFFFF');
			setAlign( 'day' + i, 'center');
			setInner( 'day' + i, days_of_week[i-36].substr(0,3));
			setBg( 'day' + i, '#000000');
		}
	}
	set_max_x();
	
	//insert blank days
	if ( offset > 0 ){
		for (i = 1; i < offset +1; i++){
			setInner( 'day' + i, '' );
		}
	}
	for (i = num_days + offset; i < 36; i++){
		setInner( 'day' + i, '' );
	}
	
	//insert dates
	for (i = offset; i < num_days + offset; i++){
		setInner( 'day' + i, i - offset + 1 );
	}
   
	//highlight today
	target_today = ( today.getDate() + real_offset -1 );
	if ( current_mo == real_mo && current_yr == real_yr ){	
		setBg('day' + target_today, '#339900');
	}else{
		if (document.getElementById('day' + target_today).style.backgroundColor == 'rgb(51, 153, 0)'){
			dow = today.getDay();
			if (dow === 0 || dow == 6 ){
 				setBg('day' + target_today, '#CCCCCC');
			}else{
				setBg('day' + target_today, '#FFFFFF');
			}
		}
	}
	//AJAX:get event data
	//alert('getevent.php?start=' + current_yr + '-' + (current_mo + 1) + '-1&end=' + current_yr + '-' + (current_mo + 1) + '-' + num_days);
	loadXMLDoc('getevent.php?start=' + current_yr + '-' + (current_mo + 1) + '-1&end=' + current_yr + '-' + (current_mo + 2) + '-1');
	
	//end AJAX:get event data
}
   
function initialize_week_view (use_date) {
	
	reference_dates(use_date);
	
	initialize_date_nav(use_date);	
	
	setVis('month_view', 'hidden');
	setVis('week_view', 'visible');
	setVis('day_view', 'hidden');
	for ( i = 0; i < 24; i++){
		setVis('dv_hour' + i, 'hidden');
		setVis('dv_detail' + i, 'hidden');
	}
	
	//insert dates
	var this_weeks_dates = Array(7);
	this_date = new Date(use_date);
	this_date.setDate(this_date.getDate() - current_dow - 1);
	for (i = 0, date = use_date.getDate() - current_dow; i < 7; i++, date++){
		this_date.setDate(this_date.getDate() + 1);
		this_weeks_dates[i] = this_date.getDate();
		setInner( 'wv_day' + i, days_of_week[i].substr(0,3) + '<br>' + this_weeks_dates[i]);
		setInner( 'wv_detail' + i, '');
	}	
	
	//show or hide saturday dependant on current day
	if ( current_dow != 6 ){
		setVis('wv_day6', 'hidden');
		setVis('wv_detail6', 'hidden');
		setVis('wv_day0', 'visible');
		setVis('wv_detail0', 'visible');
		for ( i = 0; i < 7; i++){
			setTop( 'wv_day' + i, ( i * 39 ) + 'px');
			setTop( 'wv_detail' + i, ( i * 39 ) + 'px');
		}
	} else {	
		setVis('wv_day6', 'visible');
		setVis('wv_detail6', 'visible');
		setVis('wv_day0', 'hidden');
		setVis('wv_detail0', 'hidden');
		for ( i = 0 ; i < 7 ; i++){
			new_top = ( ( i - 1 ) * 39 ) + 'px';
		 	setTop('wv_day' + i, new_top);
		 	setTop('wv_detail' + i, new_top);
		}
	}
  
	//highlight today
	if ( current_wk == real_wk && current_mo == real_mo && current_yr == real_yr ){	
		setBg('wv_day' + today.getDay(), '#339900');
	}else{
		if (document.getElementById( 'wv_day' + today.getDay() ).style.backgroundColor != 'rgb(0, 0, 0)'){
			setBg('wv_day' + today.getDay(), '#000000');
		}
	}
	
	//AJAX:get event data
	var start_week = new Date();
	var end_week = new Date();
	start_week.setFullYear(use_date.getFullYear(), use_date.getMonth(), use_date.getDate());
	end_week.setFullYear(use_date.getFullYear(), use_date.getMonth(), use_date.getDate());
	start_week.setDate( use_date.getDate() - use_date.getDay() );
	end_week.setDate( start_week.getDate() + 8 );
	//alert('getevent.php?start=' + current_yr + '-' + ( start_week.getMonth() + 1 ) + '-' + this_weeks_dates[0] + '&end=' + current_yr + '-' + ( end_week.getMonth() + 1 ) + '-' + this_weeks_dates[6]);
	loadXMLDoc('getevent.php?start=' + current_yr + '-' + ( start_week.getMonth() + 1 ) + '-' + start_week.getDate() + '&end=' + current_yr + '-' + ( end_week.getMonth() + 1 ) + '-' + start_week.getDate() );
	
	//end AJAX:get event data
}   

function initialize_day_view (use_date) {
	
	reference_dates(use_date);
	
	initialize_date_nav(use_date);
	
	setVis('month_view', 'hidden');
	setVis('week_view', 'hidden');
	setVis('wv_day0', 'hidden');
	setVis('wv_detail0', 'hidden');
	setVis('day_view', 'visible');	

	//reset positions to start at 9am
	for ( i = 0; i < 24; i++){
		setTop( 'dv_hour' + i, ( ( i * 21 ) - 83 ) + 'px');
		setTop( 'dv_detail' + i, ( ( i * 21 ) - 83 ) + 'px');
	}
	
	//hide before 9am
	for ( i = 0; i < 9; i++){
		setVis('dv_hour' + i, 'hidden');
		setVis('dv_detail' + i, 'hidden');
	}
	
	//display from 9am
	for ( i = 9; i < 20; i++){
		setVis('dv_hour' + ( i - 5 ), 'visible');
		setVis('dv_detail' + ( i - 5 ), 'visible');
	}
	top_hour = 9;
}


 
//////////////////////////////////////
/////////////////////////NAV FUNCTIONS
//////////////////////////////////////

function find_target( x , y , view ){
	if ( y > 3 ){
		if ( view == 'month' ){
			var base = ( y - 4 ) * 7;
			return ( 'day' + ( base + x ) );
		}else if ( view == 'week' ){
			return ( 'wv_detail' + ( y - 4) );
		}else if ( view == 'day' ){
			return ( 'dv_detail' + ( y - 4) );
		}
	}else {
	
		var row = '';
		var column = '';
		
		if ( x == 1 ){
			column = '_prev';
		}else if ( x == 3){
			column = '_next';
		}
		
		if ( y == 1 ){
			row = 'mo';
		}else if ( y == 2 ){
			row = 'wk';
		}else{
			row = 'day';
		}
		if ( x == 2 ){
		 	if( y == 1 ){
		 		return ( 'select_month_view' );
		 	}else if ( y == 2 ){
		 		return ( 'select_week_view' );
		 	}else if (y == 3 ){
		 		return ( 'select_day_view' );
		 	}
		} 
		return ( row + column );
	}
}

function highlight( x, y, last_x, last_y, color, view ){
	if (last_x !== 0){
		setBrdr(find_target(last_x, last_y, view), '#66CCFF');
	}
	setBrdr(find_target(x, y, view), color);
}

function navigate(e){
	
	var keycode;
	
	if (window.event) {
		keycode = window.event.keyCode;
	}else if (e) {
		keycode = e.which;
	}
	
	//left cursor press
	if (keycode == 37){
		left();
	}
	
	//right cursor press
	if ( keycode == 39 ){
		right();
	}
	
	//down cursor press
	if (keycode == 40){
		down();
	}
	
	//up cursor press
	if (keycode == 38){
		up();
	}

	//enter key press
	if (keycode == 13){
		enter();	
	}
}

function left(){
	if ( y_index < 4 ){
		if ( x_index == 1 ){
			x_index = 3;
		}else {
			x_index = x_index - 1;
		}
	}else	if ( current_view == 'month' ){
	
		if ( ( x_index === 0 ) || ( x_index == offset && y_index == 4 ) || ( x_index == 1 && y_index == 1 ) ){
			x_index = max_x;
			y_index = max_y;
		}else if ( x_index == 1 ){
			if ( y_index < 4 ){
				x_index = 3;
			}else{
				y_index = y_index - 1;
				x_index = 7;
			}
		}else {
			x_index = x_index - 1;
		}
	
	}else if ( current_view == 'day' ){
	
	}
	highlight ( x_index, y_index, last_x, last_y, '#FF0000', current_view );
	last_x = x_index;
	last_y = y_index;
}

function right(){
	if ( y_index < 4 ){
		if ( x_index == 3){
			x_index = 1;
		}else{
			x_index = x_index + 1;
		}
	}else if ( current_view == 'month' ){
		
		if ( x_index === 0 ){
			x_index = 1;
			y_index = 1;
		}else if ( y_index < 4 ){
			if ( x_index < 3 ){
				x_index = x_index + 1;
			}else {
				x_index = 1;
			}
		}else if ( y_index == max_y && x_index == max_x ){
			x_index = offset;
			y_index = 4;
		}else if ( x_index == 7 ){
			x_index = 1;
			y_index = y_index + 1;
		}else {
			x_index = x_index + 1;
		}
		
	}else if ( current_view == 'day' ){
	
	}
	highlight ( x_index, y_index, last_x, last_y, '#FF0000', current_view );
	last_x = x_index;
	last_y = y_index;
}

function up(){
	if ( current_view == 'month' ){

		if ( x_index === 0 || y_index == 1){
			x_index = max_x;
			y_index = max_y;
		}else if ( y_index == 4 ){
			x_index = 2;
			y_index = 3;
		}else if ( y_index == 5 ){
			if ( x_index < offset ){
				x_index = offset;
			}
			y_index = 4;
		}else{
			y_index = y_index - 1;
		}

	}else if ( current_view == 'week' ){
	
		if ( y_index == 5 ){
			y_index = 4;
			setVis('wv_day6', 'hidden');
			setVis('wv_detail6', 'hidden');
			setVis('wv_day0', 'visible');
			setVis('wv_detail0', 'visible');
			for ( i = 1 ; i < 6 ; i++){
				new_top = ( i * 39 ) + 'px';
			 	setTop('wv_day' + i, new_top);
			 	setTop('wv_detail' + i, new_top);
			}
		}else if (y_index > 1){
			y_index = y_index - 1;
		}
		if ( y_index > 3){
		 	x_index = 2;
		}
	
	}else if ( current_view == 'day' ){
		if ( y_index > 1 ){
			y_index = y_index - 1;
		}
		if ( y_index == top_hour - 2 && y_index > 3){
			top_hour = top_hour - 1;
	 		//move everything down
			for ( i = 0; i < 24; i++){
				var obj = xDOM('dv_hour' + i, 1);
				current_top = new Number(obj.top.substr( 0, obj.top.length - 2 ) );
				new_top = current_top + 21;
				new_top =  new_top + 'px';
				setTop( 'dv_hour' + i, new_top );
				setTop( 'dv_detail' + i, new_top );
			}
			//show earlier hour
			setVis('dv_hour' + ( top_hour - 5 ), 'visible');
			setVis('dv_detail' + ( top_hour - 5 ), 'visible');
			//hide later hour
			setVis('dv_hour' + ( top_hour + 6 ), 'hidden');
			setVis('dv_detail' + ( top_hour + 6  ), 'hidden');
		}
	}
	highlight ( x_index, y_index, last_x, last_y, '#FF0000', current_view );
	last_x = x_index;
	last_y = y_index;
}

function down(){
	if ( current_view == 'month' ){
	
		if ( x_index === 0 ){
			x_index = 2;
			y_index = 1;
		}else if ( y_index < 3 ){
			y_index = y_index + 1;
		}else if ( y_index == 3 ){
			x_index = offset;
			y_index = 4;
		}else if ( y_index == max_y - 1 ){
			if ( x_index > max_x ){
				x_index = max_x;
			}
			y_index = max_y;
		}else if ( y_index == max_y ){
			if (x_index < offset ){
				x_index = offset;
			}
			y_index = 4;
		}else{
			y_index = y_index + 1;
		}
		
	}else if ( current_view == 'week' ){
		
		if ( y_index < 9 ){
			y_index = y_index + 1;
		}else {
			if ( y_index == 9 ){
				y_index = 10;
				setVis('wv_day6', 'visible');
				setVis('wv_detail6', 'visible');
				setVis('wv_day0', 'hidden');
				setVis('wv_detail0', 'hidden');
				for ( i = 1 ; i < 7 ; i++){
					new_top = ( ( i - 1 ) * 39 ) + 'px';
				 	setTop('wv_day' + i, new_top);
				 	setTop('wv_detail' + i, new_top);
				}
			}
		}
	
	}else if ( current_view == 'day' ){
		 if ( y_index < 27 ){
		 	if ( y_index == 3 ){
		 		x_index = 2;
		 	 	y_index = top_hour - 1;
		 	}else if ( y_index == top_hour + 9 ){
		 		top_hour = top_hour + 1;
		 		y_index = y_index + 1;
		 		//move everything up
				for ( i = 0; i < 24; i++){
					var obj = xDOM('dv_hour' + i, 1);
					new_top = ( obj.top.substr( 0, obj.top.length - 2 ) - 21 ) + 'px';
					setTop( 'dv_hour' + i, new_top );
					setTop( 'dv_detail' + i, new_top );
				}
				//hide earlier hour
				setVis('dv_hour' + ( top_hour - 6 ), 'hidden');
				setVis('dv_detail' + ( top_hour - 6 ), 'hidden');
				//show later hour
				setVis('dv_hour' + ( top_hour + 5 ), 'visible');
				setVis('dv_detail' + ( top_hour + 5  ), 'visible');
				
		 	}else{
				y_index = y_index + 1;
			}
		}
	}
	highlight ( x_index, y_index, last_x, last_y, '#FF0000', current_view );
	last_x = x_index;
	last_y = y_index;
}
    
function enter(){
   if ( y_index == 3){

		if ( x_index == 1 ){
			use_date.setDate(use_date.getDate()-1);
		}else if ( x_index == 3 ){
			use_date.setDate(use_date.getDate()+1);
		}else  if ( x_index == 2 ){
			current_view = 'day';
		}
		initialize_by_view();

	}else if ( y_index == 2 ){

		if ( x_index == 1 ){
			use_date.setDate(use_date.getDate()-7);
		}else if ( x_index == 3 ){
			use_date.setDate(use_date.getDate()+7);
		}else  if ( x_index == 2 ){
			current_view = 'week';
		}
		initialize_by_view();

	}else if ( y_index == 1 ){

		if ( x_index == 1 ){
			use_date.setMonth(use_date.getMonth()-1);
		}else if ( x_index == 3 ){
			use_date.setMonth(use_date.getMonth()+1);
		}else  if ( x_index == 2 ){
			current_view = 'month';
			setVis( 'wv_day6', 'hidden');
			setVis( 'wv_detail6', 'hidden');
		}
		initialize_by_view();

	} else if ( current_view == 'month' ){
		
		use_date.setDate(x_index + ( ( y_index - 5 ) * 7 ) + offset);
		initialize_date_nav (use_date);
		var next_day = new Date;
		next_day.setFullYear(use_date.getFullYear(), use_date.getMonth(), use_date.getDate() + 1);
		//alert('getevent.php?start=' + current_yr + '-' + ( current_mo + 1 ) + '-' + use_date.getDate() + '&end=' + current_yr + '-' + ( next_day.getMonth() + 1 ) + '-' + ( next_day.getDate() ));
		loadXMLDoc( 'getevent.php?start=' + current_yr + '-' + ( current_mo + 1 ) + '-' + use_date.getDate() + '&end=' + current_yr + '-' + ( next_day.getMonth() + 1 ) + '-' + ( next_day.getDate() ) );

	}else if ( current_view == 'week' ){
		
		reference_dates(use_date);
		use_date = first_day_of_week;
		use_date.setDate( first_day_of_week.getDate() + ( y_index - 4 ) );
		initialize_date_nav (use_date);
		var next_day = new Date;
		next_day.setFullYear(use_date.getFullYear(), use_date.getMonth(), use_date.getDate() + 1);
		loadXMLDoc( 'getevent.php?start=' + current_yr + '-' + ( current_mo + 1 ) + '-' + use_date.getDate() + '&end=' + current_yr + '-' + ( next_day.getMonth() + 1 ) + '-' + ( next_day.getDate() ) );
		
	}else if ( current_view == 'day' ){
		
	}
}    

    
//////////////////////////////////////
///////////////////////CALENDAR LAYOUT
//////////////////////////////////////

function layout_day_view(){
	for ( i = 0, h = 5; i < 24; i++, h++){
		if ( h > 23 ){
			h = 0;
		}
		display_hour = h + '.00';
		if ( h < 10 ){
			display_hour = '0' + display_hour;
		}
		setInner ( 'dv_hour' + i, display_hour); 
	}
}
