/**************************************************************************************************
**	JavaScript Popup Calandar Script
***************************************************************************************************
**	Version: 1.060513													
**	Author : Steven Miles
**	WWW    : www.srmiles.com
**	Email  : steve@srmiles.com
***************************************************************************************************
**	Files:
**		puc.js
**		puc.css
**	Usage:
**		showPUC(input,'d/m/y');  eg showPUC(document.form.date,'d/m/y');
***************************************************************************************************/

//** Define Variables
var monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var dayHeaders = new Array("S","M","T","W","T","F","S");
var inputField;


//** FUNCTION: Show Popup Calendar
	function showPUC(input,df,url) {
		var puw = new PopUpWindow('puc');
		var icon = document.getElementById('pucLink');
		this.url = url;
		puw.top = findPosY(icon) + icon.offsetHeight;
		puw.left =  findPosX(icon) - 137;
		inputField = input;
		puw.div.innerHTML = Calendar(input.value,'puc',df);
		checkHover('pucBody','td');
		puw.div.style.top = puw.top+'px';
		puw.div.style.left = puw.left+'px';
		puw.div.style.display = 'block';
		
	}
//** FUNCTION: Hide Popup Calendar
	function hidePUC(){document.getElementById('puc').style.display="none";}

//** FUNCTION: Create Popup Calendar Window
	function PopUpWindow(id) {
		this.top = null;
		this.left = null;
		if (!eval(document.getElementById(id))) {
			this.div = document.createElement(id);
			this.div.setAttribute('id',id);
			this.div.style.width=126;
			this.div.style.height=120;
			//this.div.onmouseout = function () {blurCalendar(this,event);}; 
			document.body.appendChild(this.div);
		} else {
			this.div = document.getElementById(id);
		}
	}

//** FUNCTION: Function Called on Selection of Date
	function updateInput(d,m,y) { inputField.value = d+"/"+m+"/"+y;	hidePUC(); location.href=this.url+"&date="+d+"_"+m+"_"+y;}

//** FUNCTION: Function Called on Selection of Date
	function stepMonth(d,m,y,el,df){
		document.getElementById(el).innerHTML = Calendar(d+"/"+m+"/"+y,el,df);
	}

//** FUNCTION: Function Called on Mouse Leave Window Element
	function blurCalendar(el,e) {if (mouseLeaves(el,e)) {hidePUC();}}

//** FUNCTION: Check Mouse Cordinates to see if mouse is outside Popup Window
	function mouseLeaves (el,e) {
		if (typeof e.toElement != 'undefined' && e.toElement && typeof el.contains != 'undefined') {
			return !el.contains(e.toElement);
		} else if (typeof e.relatedTarget != 'undefined' && e.relatedTarget) {
			return !contains(el, e.relatedTarget);
		}
	}
	function contains (container, containee) {
		while (containee) {
			if (container == containee) { return true;}
			containee = containee.parentNode;
		}
		return false;
	}

//** FUNCTION: Create Calendar to Fill Popup Window
	function Calendar(date,el,df){
		var today = new Date();
		if (date == '' || date == null || date ==' ') {date = today.getDate()+"/"+(today.getMonth()+1)+"/"+today.getFullYear();}
		today = new Array (today.getDate(),(today.getMonth()+1), today.getFullYear());
		date_format = df.split('/');
		for (i=0;i<date_format.length; i++){
			switch (date_format[i]) {
				case 'd': var d=i;break;
				case 'm': var m=i;break;
				case 'y': var y=i;break;
				case 'Y': var y=i;break;
			}
		}
		
		inputDate = date.split('/');
		d = inputDate[d];
		m = inputDate[m];
		y = inputDate[y];
		while (m.substring(0,1) == '0') { m = m.substring(1,m.length); }
		while (d.substring(0,1) == '0') { d = d.substring(1,d.length); }
		var today = new Date();
		today = new Array (today.getDate(),(today.getMonth()+1), today.getFullYear());

		var body = new Array();
		var start_day = new Date(y,m-1,1); 
		start_day = start_day.getDay();
		
		var months = new Array(0,m,0);

		var years = new Array ("",y,"");
		
		var month_no_days = new Array("31","28","31","30","31","30","31","31","30","31","30","31");
		
		if (y / 4 == Math.floor(y / 4)) {month_no_days[1] = "29";}
		
		body.push("<table  border=0 align='center' cellspacing='0'><tr>");
		
		if (m==1){
			months[0]=12;
			years[0] = parseInt(y)-1;
			months[2] = 2;
			years[2]=y;
		} else if (m==12){
			months[0]=11;
			years[0]=y;
			months[2]=1;
			years[2]=parseInt(y)+1;
		} else {
			months[0]=parseInt(m)-1;
			years[0]=y;
			months[2]=(parseInt(m)+1);
			years[2]=y;
		}
		body.push("<td class='pucHeaderLink' onClick='stepMonth(1,"+months[0]+","+years[0]+",\""+el+"\",\""+df+"\");' title='1-"+months[0]+"-"+years[0]+"'><</td>");
		body.push("<td class='pucHeader' colspan='5'>");	
		body.push(monthNames[months[1]-1] + " " + years[1]);
		body.push("</td><td class='pucHeaderLink' onClick='stepMonth(1,"+months[2]+","+years[2]+",\""+el+"\",\""+df+"\");' title='1-"+months[2]+"-"+years[2]+"'>></td></tr><tr>");
		for (var i = 0;i < 7;i ++) { body.push("<th>"+ dayHeaders[i] + "</th>");}
		body.push("</tr><tbody id='pucBody'><tr>");
		ctr = 0;
		for (var i = 0;i < 7; i++){
			if (i < start_day) { 
				body.push("<td onClick='hidePUC();' class='inactive'>&nbsp;</td>");
			} else {
				ctr++;

				if (today[0] == ctr && today[1] == m && today[2]==y) {
					body.push("<td class='today' ");
					if (el=='Calendar') { 
						body.push(" onClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' onDblClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' ");
					} else {
						body.push("	onClick='updateInput("+ctr+","+m+","+y+");' ");
					}
					body.push(">"+ctr+"</td>");
				} else {
					body.push("<td class='day'");
					if (el=='Calendar') { 
						body.push(" onClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' onDblClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' ");
					} else {
						body.push("	onClick='updateInput("+ctr+","+m+","+y+");' ");
					}
					body.push(">"+ctr+"</td>");
				}
					
			}
		}
		body.push("</tr><tr>");
		while (ctr < month_no_days[m-1]) {
			for (var i = 0;i < 7; i++){
				ctr++;
				if (ctr > month_no_days[m-1]){ 
					body.push("<td onClick='hidePUC();' class='inactive'>&nbsp;</td>");
				} else {
					if (today[0] == ctr && today[1] == m && today[2]==y) {
						body.push("<td class='today' ");
						if (el=='Calendar') { 
							body.push(" onClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' onDblClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' ");
						} else {
							body.push("	onClick='updateInput("+ctr+","+m+","+y+");' ");
						}
						body.push(">"+ctr+"</td>");
					} else {
						body.push("<td class='day'");
						if (el=='Calendar') { 
							body.push(" onClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' onDblClick='calendarEvent(event.type,"+ctr+","+m+","+y+");' ");
						} else {
							body.push("	onClick='updateInput("+ctr+","+m+","+y+");' ");
						}
						body.push(">"+ctr+"</td>");
					}
				}
			}
			body.push("</tr><tr>");
		}
		body.push("</tr></tbody></table>");
		today= d=y=m=df=date_format=null;
		return body.join('');
	}

	function findPosX(obj,parent) {
		var curleft = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent != parent) { curleft += obj.offsetLeft; obj = obj.offsetParent;}
		} else if (obj.x) curleft += obj.x;
		return curleft;
	}
//** FUNCTION: Find Top Postion of Element -- From QuirksMode
	function findPosY(obj, parent) {
		var curtop = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent != parent) { curtop += obj.offsetTop; obj = obj.offsetParent;}
		} else if (obj.y) curtop += obj.y;
		return curtop;
	}
	function checkHover(el,tag) {
		if (BrowserDetect.browser == 'Explorer') {		
			if (document.getElementById(el)){
				t = document.getElementById(el).getElementsByTagName(tag);
				for(var i=0; i < t.length;i++) {
					t[i].onmouseover = function() { this.className += ' hover'; }
					t[i].onmouseout = function() {
						var classes = this.className.split(' ');
						this.className = '';
						for (i=0;i<classes.length; i++) {
							if (classes[i] != 'hover') { this.className += classes[i]; }
						}
					}
				}
			}
		}
	}

	var BrowserDetect = {
		init: function () {
			this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
			this.version = this.searchVersion(navigator.userAgent)
				|| this.searchVersion(navigator.appVersion)
				|| "an unknown version";
			this.OS = this.searchString(this.dataOS) || "an unknown OS";
		},
		searchString: function (data) {
			for (var i=0;i<data.length;i++)	{
				var dataString = data[i].string;
				var dataProp = data[i].prop;
				this.versionSearchString = data[i].versionSearch || data[i].identity;
				if (dataString) {
					if (dataString.indexOf(data[i].subString) != -1)
						return data[i].identity;
				}
				else if (dataProp)
					return data[i].identity;
			}
		},
		searchVersion: function (dataString) {
			var index = dataString.indexOf(this.versionSearchString);
			if (index == -1) return;
			return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
		},
		dataBrowser: [
			{
				string: navigator.vendor,
				subString: "Apple",
				identity: "Safari"
			},
			{
				prop: window.opera,
				identity: "Opera"
			},
			{
				string: navigator.vendor,
				subString: "iCab",
				identity: "iCab"
			},
			{
				string: navigator.vendor,
				subString: "KDE",
				identity: "Konqueror"
			},
			{
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "Firefox"
			},
			{	// for newer Netscapes (6+)
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "Netscape"
			},
			{
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "Explorer",
				versionSearch: "MSIE"
			},
			{
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "Mozilla",
				versionSearch: "rv"
			},
			{ 	// for older Netscapes (4-)
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "Netscape",
				versionSearch: "Mozilla"
			}
		],
		dataOS : [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "Windows"
			},
			{
				string: navigator.platform,
				subString: "Mac",
				identity: "Mac"
			},
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}
		]
	
	};

