// Calendar Object
// (c) 2008 Barry Wickett, Dark Green Media
// www.darkgreenmedia.co.uk

function DGCalendar(id, textId, clickId) {
	this.fieldID = id;
	this.textId = textId;
	this.clickId = clickId;
	this.selectedDate = new Date(document.getElementById(this.fieldID).value * 1000);
	
	
	this.setText = setText;
	this.populate = populate;
	this.changeMonth = changeMonth;
	this.selectDate = selectDate;
	this.attach = attach;
	this.setVisible = setVisible;
	
	this.setText();
	
	DGCalendar.prototype.changeMonth = this.changeMonth;
	
	// create table elements
	
	this.myTable = document.createElement('table');
	this.myTBody = document.createElement('tbody');
	this.monthNames = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
	var row, cell, content, day, a;
	
	//top row - left control, month and year, right control
	
	row = document.createElement('tr');
	cell = createTd(null);
	cell.setAttribute('className', 'left_arrow');
	cell.className = 'left_arrow';
	var self = this;
	a = linkElement('#', createImg('images/cal_left.gif', 20, 20));
	addEvent(a, 'mouseup',function(event) { self.changeMonth(-1); });
	cell.appendChild(a);
	row.appendChild(cell);
	
	this.monthCell = createTd('Jan 2008');
	this.monthCell.setAttribute('colspan', '5');
	this.monthCell.colSpan = '5';
	setClass(this.monthCell, 'month_title');
	row.appendChild(this.monthCell);
	
	cell = createTd(null);
	a = linkElement('#', createImg('images/cal_right.gif', 20, 20));
	cell.appendChild(a);
	addEvent(a, 'mouseup', function(event) { self.changeMonth(1); });
	setClass(cell, 'right_arrow');
	row.appendChild(cell);
	
	this.myTBody.appendChild(row);
	
	// days of the week row
	
	var dayList = 'MTWTFSS';
	row = document.createElement('tr');
	for(var i = 0; i < dayList.length; i++) {
		day = createTd(dayList.charAt(i));
		setClass(day, 'days');
		row.appendChild(day);
	}
	this.myTBody.appendChild(row);
	
	// create six rows of seven columns to cope with maximum size possible
	
	for(var r = 0; r < 6; r++) {
		row = document.createElement('tr');
		for(var c = 0; c < 7; c++) {
			cell = createTd(null);
			var days = c + r * 7;
			a = linkElement('#' + days, document.createTextNode('x'));
			var rr = r;
			var cc = c;
			a.setAttribute('id', 'day' + days);
			addEvent(a, 'mouseup',function(event) { self.selectDate(event); });
			setClass(cell, 'dates');
			cell.appendChild(a);
			row.appendChild(cell);
		}
		this.myTBody.appendChild(row);
	}
	
	// set class names of elements
	
	setClass(this.myTable, 'dg_cal_table');
	this.mySpan = document.createElement('span');
	setClass(this.mySpan, 'dg_cal_back');
	this.myTable.appendChild(this.myTBody);
	this.mySpan.appendChild(this.myTable);
	this.workingDate = this.selectedDate;
		
	//document.body.appendChild(this.mySpan);
	//document.body.appendChild(this.myTable);
	//this.populate();
	
	function setText() {
		var el = document.getElementById(this.textId);
		if (el != null) el.innerHTML = this.selectedDate.getDate() + '.' + (this.selectedDate.getMonth() + 1) + '.' + this.selectedDate.getFullYear();
	}
	
	function attach(id) {
		var self = this;
		var img = createImg("../admin/images/cal_popup.gif", 20,20);
		img.setAttribute('border', '0');
		var p = linkElement('#', img);
		addEvent(p, 'mouseup', function(event) { self.setVisible(true); });
		self.setVisible(false);
		document.getElementById(clickId).appendChild(p);
		document.getElementById(id).appendChild(this.mySpan);
	}
	function setVisible(vis) {
		if (vis) {
			this.mySpan.style.display = 'block';
			this.populate();
		} else {
			this.mySpan.style.display = 'none';
		}
	}
	function changeMonth(inc) {
		var m = this.workingDate.getMonth();
		m += inc;
		var y = this.workingDate.getFullYear();
		if (m < 0) {
			m = m + 12;
			y -= 1;
		}
		if (m > 11) {
			m = m - 12;
			y += 1;
		}
		this.workingDate = new Date(y, m , 1);
		this.populate();
	}
	function populate() {
		this.monthCell.firstChild.nodeValue = this.monthNames[this.workingDate.getMonth()] + ' ' + this.workingDate.getFullYear();
		var first = new Date(this.workingDate.getFullYear(), this.workingDate.getMonth(), 1);
		//first.setTime(this.selectedDate.getTime());
		//first.setDate(1);
		var oneDay = 24 * 60 * 60 * 1000;
		first.setTime(first.getTime() - ((first.getDay() +6) % 7) * oneDay);
		for(var r = 0; r < 6; r++) {
			for(var c = 0; c < 7; c++) {
				var cell = this.myTable.rows[r+2].cells[c];
				cell.firstChild.firstChild.nodeValue = first.getDate();
			
				var cn = (first.getMonth() == this.workingDate.getMonth()) ? 'dates' : 'dates_shade';
				if ((first <= this.selectedDate.getTime()) & (first > this.selectedDate.getTime() - oneDay)) cn = 'dates_selected';
				setClass(cell, cn);		
				first.setTime(first.getTime() + 24 * 60 * 60 * 1000);
			}
		}
	}	
	function selectDate(e) {
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		var first = new Date(this.workingDate.getFullYear(), this.workingDate.getMonth(), 1);
		first.setTime(first.getTime() - ((first.getDay() +6) % 7) * 24 * 60 * 60 * 1000);
		var days = targ.id.substr(3);
		var time = first.getTime() + 24 * 60 * 60 * 1000 * days;
		this.selectedDate = new Date(time);
		this.setVisible(false);
		document.getElementById(this.fieldID).value = Math.floor(time / 1000);
		this.setText();
		return false;
	}
	//this.populate = populate;
	//this.changeMonth = changeMonth;
}
function createTd(tdText) {
	var cell = document.createElement('td');
	if (tdText != null) cell.appendChild(document.createTextNode(tdText));
	return cell;
}
function createImg(url, width, height) {
	var img = document.createElement('img');
	img.setAttribute('src', url);
	if (width) img.setAttribute('width', width);
	if (height) img.setAttribute('height', height);
	return img;
}
function linkElement(url, element) {
	var cell = document.createElement('a');
	cell.setAttribute('href', url);
	cell.appendChild(element);
	return cell;
}
function addEvent(el, type, handler) {
	if (el.addEventListener) {
    	el.addEventListener(type, handler, false);
	} else if (el.attachEvent) {
    	el.attachEvent("on" + type, handler);
    } else {
    	el.onclick = handler;
    }
}
function setClass(el, cn) {
	el.setAttribute('className', cn);
	el.className = cn;
}
function ajaxLoad(id, url, callback, tmpHTML) {
	var a = new AjaxLoader(id, url, null, callback, tmpHTML, 'GET');
	a.doLoad();
}
function ajaxLoadPOST(id, form_id, url, callback, tmpHTML) {
	var a = new AjaxLoader(id, url, form_id, callback, tmpHTML, 'POST');	
	a.doLoad();
}
function AjaxLoader(id, url, form_id, callback, tmpHTML, type) {
	this.id = id;
	var r = Math.random();
	if (url.indexOf("?") == -1) {
		url += "?";
	} else {
		url += "&";
	}
	url += "r=" + r;
	this.url = url;
	this.doLoad = doLoad;
	this.callback = callback;
	this.tmpHTML = tmpHTML;
	this.type = type;
	
	function doLoad() {
		
		var e = document.getElementById(this.id);
		if (this.tmpHTML) {
			e.innerHTML = this.tmpHTML;
		} else {
			e.innerHTML = '<p>Loading...</p>';
		}
		
		if (window.ActiveXObject) {
        	xhr = new ActiveXObject("Microsoft.XMLHTTP");
		} else if (window.XMLHttpRequest) {
        	xhr = new XMLHttpRequest();
		} else {
        	alert("your browser does not support AJAX");
		}
		xhr.open("GET",url,true);
		xhr.setRequestHeader("Cache-Control", "no-cache");
    	xhr.setRequestHeader("Pragma", "no-cache");
		var self = this;
		
		xhr.onreadystatechange = function() {
        	if (xhr.readyState == 4) {
           		if (xhr.status == 200) {
               		if (xhr.responseText != null) {
						document.getElementById(self.id).innerHTML = xhr.responseText;
						if (self.callback) self.callback();
						
					} else {
                    	return false;
                	}
            	} else {
                	alert("Error code " + xhr.status + " received: " + xhr.statusText);
				}
			}
		}
		if (this.type == 'GET') {
			xhr.send(null);
		} else {
			// not implemented yet!
			var parameters = "mytextarea1=" + encodeURI( document.getElementById("mytextarea1").value ) +
                    "&mytextarea2=" + encodeURI( document.getElementById("mytextarea2").value );
			xhr.open('POST', url, true);
      		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      		xhr.setRequestHeader("Content-length", parameters.length);
      		xhr.setRequestHeader("Connection", "close");
      		xhr.send(parameters);			
		}
    }
}
function $(id) {
	return document.getElementById(id);
}
