// fcp.Calendar - simple Calendar control for Javascript
// Copyright (C) 2006 Felix Plesoianu
// This file is distributed under the MIT license.
// http://www.opensource.org/licenses/mit-license.php

if (!fcp)
	var fcp = new Object();
if (!fcp.msg)
	fcp.msg = new Object();

fcp.week_days = week_days();	
fcp.months = months();
fcp.cal_title = cal_title();
fcp.msg.prev_year = pre_year();
fcp.msg.prev_month = pre_month();
fcp.msg.next_month = nxt_month();
fcp.msg.next_year = nxt_year();


//GC removed show_clock variable as it does not seem to be used
fcp.Calendar = function(element) {
  
	if( document.getElementById("calendar") == null ) {
	}else{
	this.element = element;
	
	var currDate = $("#currDate").val();
	if (currDate == undefined) {
			this.selection = new Date();	//sets to today's date
	}else{
		var i1 = currDate.indexOf('/');
		var i2 = currDate.lastIndexOf('/');
	
		var yr_num = currDate.slice(i2+1);
		var mo_num = currDate.slice(i1+1,i2);
		var day_num = currDate.slice(0,i1);
		
		this.lastprice = new Date(yr_num, mo_num-1, day_num);
		
		if (getQuerystring('year') == "") {
			this.selection = new Date(yr_num, mo_num-1, day_num);			
		}else{
						
			var yr_num = Number(getQuerystring('year'));
			var mo_num = Number(getQuerystring('month'));
			var day_num = Number(getQuerystring('days'));
			
			this.selection = new Date(yr_num, mo_num, day_num);
		}
	}
	
	//GC do not think this gets used
	//this.show_clock = show_clock;
	this.selected_cell = undefined;
	this.generate_month();
	this.render_calendar();
	}
}

fcp.Calendar.prototype.set_date_time = function (date_time) {
	if (date_time.constructor == Date) {
		this.selection = date_time;
		this.generate_month();
		this.render_calendar();
	} else {
		throw "Date object expected (in fcp.Calendar.set_date_time)";
	}
}

fcp.Calendar.prototype.next_month = function () {
	var month = this.selection.getMonth();
	if (month == 11) {
		this.selection.setMonth(0);
		this.selection.setYear(this.selection.getFullYear() + 1);
	} else {
		this.selection.setMonth(month + 1);
	}
	this.generate_month();
	this.render_calendar();
}

fcp.Calendar.prototype.prev_month = function () {
	var month = this.selection.getMonth();
	if (month == 0) {
		this.selection.setMonth(11);
		this.selection.setYear(this.selection.getFullYear() - 1);
	} else {
		this.selection.setMonth(month - 1);
	}
	this.generate_month();
	this.render_calendar();
}

fcp.Calendar.prototype.next_year = function () {
	var is_feb29 = (this.selection.getMonth() == 1)
		&& (this.selection.getDate() == 29);
	if (is_feb29) {
		this.selection.setDate(1);
		this.selection.setMonth(2); // March
	}
	this.selection.setFullYear(this.selection.getFullYear() + 1);
	this.generate_month();
	this.render_calendar();
}

fcp.Calendar.prototype.prev_year = function () {
	var is_feb29 = (this.selection.getMonth() == 1)
		&& (this.selection.getDate() == 29);
	if (is_feb29) {
		this.selection.setDate(1);
		this.selection.setMonth(2); // March
	}
	this.selection.setFullYear(this.selection.getFullYear() - 1);
	this.generate_month();
	this.render_calendar();
}

//Updated By GC to include latestPriceDate
fcp.Calendar.prototype.generate_month = function () {
	this.raw_data = new Array();
	var week = 0;
	this.raw_data[week] = new Array(7);

	var first_of_month = fcp.Calendar.clone_date(this.selection);
	first_of_month.setDate(1);
	var first_weekday = first_of_month.getDay();
	
	// Move Sunday last
	first_weekday = (first_weekday == 0) ? 6 : first_weekday - 1;
	
	// Add blank spaces for the days from the previous month
	for (var i = 0; i < first_weekday; i++) {
		this.raw_data[week][i] = 0;
	}

		var last_of_month = fcp.Calendar.days_in_month(
			this.selection.getYear(),
			this.selection.getMonth());

		var weekday = first_weekday;
		for (var i = 1; i <= last_of_month; i++) {
			this.raw_data[week][weekday] = i;
			weekday++;
			if (weekday > 6) {
				weekday = 0;
				week++;
				this.raw_data[week] = new Array(7);
			}
		}
	
		// Fill in the first days from the next month.
		for (var i = weekday; i < 7; i++) {
			this.raw_data[week][i] = 0;
		}
}

fcp.Calendar.prototype.render_calendar = function () {		//amendded by TvL
	this.element.selected_cell = undefined;	
	this.element.innerHTML = "";
	
	var html_top = document.createElement("div");
	html_top.className = "calendarTop";
	var html_mid = document.createElement("div");
	html_mid.className = "calendarMid";
	var html_bottom = document.createElement("div");
	html_bottom.className = "calendarBottom";
	var title = document.createElement("h2");
	title.className = "heading center";
	title.innerHTML = fcp.cal_title;
	
	html_mid.appendChild(title);
	html_mid.appendChild(this.render_heading());
	html_mid.appendChild(this.render_month());
	
	this.element.appendChild(html_top);
	this.element.appendChild(html_mid);
	this.element.appendChild(html_bottom);
	
}

fcp.Calendar.prototype.render_heading = function () {	//amendded by TvL
	var heading = document.createElement("div");
	heading.className = "calendarlNav";

	var prev_month = document.createElement("a");
	prev_month.className = "vidSmallPrev";
	prev_month.href = "#";
	prev_month.calendar = this;
	prev_month.onclick = function() {
		this.calendar.prev_month();
		return false;
	};
	prev_month.innerHTML = "<";
	prev_month.title = fcp.msg.prev_month;
	
	var month_year = document.createElement("a");
	month_year.href = "#";
	if ( month_title() == "MY" ) {
		month_year.innerHTML = "\u00a0\u00a0" + fcp.months[this.selection.getMonth()]
		+ " " + this_year(this.selection.getFullYear()) + "\u00a0\u00a0";
	} else {
		month_year.innerHTML = "\u00a0\u00a0" + this_year(this.selection.getFullYear())
		+ " " + fcp.months[this.selection.getMonth()] + "\u00a0\u00a0";
	}	
	
	var next_month = document.createElement("a");
	next_month.className = "vidSmallNext";
	next_month.href = "#";
	next_month.calendar = this;
	next_month.onclick = function() {
		this.calendar.next_month();
		return false;
	};
	
	
	if(fcp.months[this.selection.getMonth()] + this.selection.getFullYear() != fcp.months[this.lastprice.getMonth()] + this.lastprice.getFullYear()){
		next_month.innerHTML = ">";
		next_month.title = fcp.msg.next_month;
		heading.appendChild(prev_month);	
		heading.appendChild(next_month);
		heading.appendChild(month_year);
	}else{
		next_month.title = "";
		heading.appendChild(prev_month);	
		heading.appendChild(month_year);
	}
	
	
	
	
	return heading;
}

fcp.Calendar.prototype.render_month = function() {	//amendded by TvL
	
	var html_month = document.createElement("table");
	html_month.width = "161";
	html_month.cellspacing = "2";
	html_month.cellpadding = "2";
	html_month.border = "0";

	var tbody = document.createElement("tbody");
	var tr = document.createElement("tr");
	for (var i = 0; i < fcp.week_days.length; i++) {
		var th = document.createElement("th");
		th.innerHTML =  fcp.week_days[i];
		tr.appendChild(th);
	}
	tbody.appendChild(tr);
	
	for (var i = 0; i < this.raw_data.length; i++) {
	
		tbody.appendChild(this.render_week(this.raw_data[i]));
	}
	html_month.appendChild(tbody);
	return html_month;
}

fcp.Calendar.prototype.render_week = function (day_numbers) {
	var html_week = document.createElement("tr");
	html_week.align = "right";
	
	var tmpDate;	
		
	for (var i = 0; i < 7; i++) {
	
	 isLink = true;
	 
	 tmpDate = new Date(this.selection.getFullYear(), this.selection.getMonth(), day_numbers[i] );
  
  	 if ( this.lastprice < tmpDate ) {
    	isLink =	false;
  	 }
	 
	 /*	 
	 if ( ( this.selection.getFullYear() == this.lastprice.getFullYear() ) && ( this.selection.getMonth() == this.lastprice.getMonth() )  && ( this.lastprice.getDate() < day_numbers[i] ) ) {
	   	isLink =	false;
   	 }
	*/	
		html_week.appendChild(this.render_day(day_numbers[i], isLink ));
		
	}
	return html_week;
}

fcp.Calendar.prototype.render_day = function (day_number, isLink ) {
	var td = document.createElement("td");
	
	// default class name
	td.className = "off";	
	
	if (day_number >= 1 && day_number <= 31) {
	
		if (day_number == this.selection.getDate()) {
			this.selected_cell = td;
			td.className = "on";
		} else {
			td.className = "in_month";
		}
	 
		if(isLink) {	
	  		var anchor = document.createElement("a");
	  		anchor.href = "#";
	  		anchor.innerHTML = day_number;
	  		anchor.calendar = this;
	  		anchor.date = day_number;
	  		anchor.onclick = fcp.Calendar.handle_select;
	  		td.appendChild(anchor);
   		}else {
      		td.innerHTML = day_number;
      		td.className = "off";      		
   		}   	
	}
	
	return td;
}

// Do nothing by default.
fcp.Calendar.prototype.onselect = function () {}

fcp.Calendar.clone_date = function (date_obj) {
	if (date_obj.constructor != Date)
		throw "Date object expected (in fcp.Calendar.clone_date)";
	else
		return new Date(
			date_obj.getFullYear(),
			date_obj.getMonth(),
			date_obj.getDate(),
			date_obj.getHours(),
			date_obj.getMinutes(),
			date_obj.getSeconds());
}

fcp.Calendar.days_in_month = function (year, month) {
	if (month < 0 || month > 11)
		throw "Month must be between 0 and 11";
	var day_count = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (month != 1) {
		return day_count[month];
	} else if ((year % 4) != 0) {
		return 28;
	} else if ((year % 400) == 0) {
		return 29;
	} else if ((year % 100) == 0) {
		return 28;
	} else {
		return 29;
	}
}

fcp.Calendar.handle_select = function () {
	if (this.calendar.selected_cell)
		this.calendar.selected_cell.className = "in_month";
	this.calendar.selected_cell = this.parentNode;
	this.parentNode.className = "on";

	this.calendar.selection.setDate(this.date);
	this.calendar.onselect(this.calendar.selection);
	
	return false;
}

//added by TvL
function getQuerystring(key, default_)
{
  if (default_==null) default_="";
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_;
  else
    return qs[1];
}


// Created by: Simon Willison
// http://simonwillison.net/2004/May/26/addLoadEvent/
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

addLoadEvent(function() {
	if( document.getElementById("calendar") == null ) {
	}else{
		cal = new fcp.Calendar(document.getElementById("calendar"));
		
		// amended by TvL to check if selected date = last price date
		cal.onselect = function(date) {
			
			if (date.toString() == this.lastprice.toString()) {
				window.open(location.pathname, "_self",'','true');
			} else {
				var y = date.getFullYear();
				var m = date.getMonth(); // integer, 0..11
				var d = date.getDate(); // integer, 1..31
				window.location = "?opendocument&year=" + y + "&month=" + m + "&days=" + d; 
			}		
		}; 
	}
} )

