﻿function install()
{
	var uid = function (){return  "yhDatePicker" + Math.ceil(Math.random()*100000);};
	var gID = function (id){return document.getElementById(id);};
	var id = uid();
	while(gID(id))	{	 id = uid()};
	document.write("<noscript id='"+id+"'></noscript>");
	var obj = gID(id).parentNode;
	obj.removeChild(gID(id));
	
	if(obj && obj.getAttribute("name")=="yh_datepicker")
	{
		if(obj .id == ""){obj.id = id;};
		write_yhDatePicker(obj);
	}
	
}


function write_yhDatePicker(span)
{

	span.className = "yh_datepicker " + span.className;
	var gTags= function (n){return  span.getElementsByTagName(n);};
	var cNode = function (n){return  document.createElement(n);};
	var dayName = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
	var titles = ["Previous Year","Previous Month","Next Month","Next Year"];
	var lang = (navigator.language || navigator.browserLanguage).toLowerCase();
	if(lang=="zh-tw")
	{ 
		dayName = ("日,一,二,三,四,五,六").split(",");
		titles = ["上一年","上一月","下一月","下一年"];
	};

	write_yhDatePicker.moveYear =function(i,el)
	{
		
		while(el.getElementsByTagName("input").length==0)
		{el = el.parentNode;};
		var input = el.getElementsByTagName("input")[0];
		var ny = new Date(input.value);
		ny.setYear(ny.getFullYear()+i);
		input.value =  showDate(ny);
		showDateMenu(null,el);
	}

	write_yhDatePicker.moveMonth =function(i,el)
	{
		while(el.getElementsByTagName("input").length==0)
		{el = el.parentNode;};
		var input = el.getElementsByTagName("input")[0];
		var ny = new Date(input.value);
		
		ny.setMonth(ny.getMonth()+i);
		input.value =  showDate(ny);
		showDateMenu(null,el);
	}





	
	var input = gTags("input")[0];
	var button = cNode("button");
	button.innerHTML = "&#9660;";
	span.appendChild(button);
	span.style.zIndex = 1000;
	

	input.onkeydown = function(e)
	{
		e = e || window.event;
		var c = e.keyCode;
		
		if(	
			(c>=48 && c<=57)||
			(c>=96 && c<=105) ||
			(c==191) ||
			(c==8)||
			(c==37)||
			(c==46)||
			(c==86 && e.ctrlKey)||
			(c==67 && e.ctrlKey)||
			(c==39)||
			(c==9)
		)
		{
			return true;
		}
		return false;
	}

	var div = span.appendChild(cNode("div"));
	div.className="yh_datepicker_div"

	if(window.addEventListener)
	{
		document.addEventListener("click",hideDateMenu,false);
		document.addEventListener("keydown",hideDateMenu,false);
	}
	else if(window.attachEvent)
	{
		document.attachEvent("onclick",hideDateMenu);
		document.attachEvent("onkeydown",hideDateMenu);
	}

	
	var width = "";
	if(document.defaultView && document.defaultView.getComputedStyle)
	{  width = document.defaultView.getComputedStyle( input, '').getPropertyValue("width");}
	else if(input.currentStyle)
	{ width = input.currentStyle.width;}
	width = width.toLowerCase();
	if(	width.indexOf("px")>0	||	width=="auto"){input.style.width =( input.offsetWidth - button.offsetWidth )+ "px";}

	function showDate(d)
	{		
		var m = 100 + d.getMonth()+1 + "";
		var t =  100 + d.getDate()+ "";
		m = m.substr(1,10);
		t = t.substr(1,10);
		return  d.getFullYear() + "/" +  m + "/" + t; 
	}

	function hideDateMenu(e,el)
	{
		
		e = e || window.event;
	
		var el = e.target || e.srcElement;	
		
		while( el.parentNode )
		{			
			if(el.className=="yh_datepicker_div"){  return true;};
			if(el == button){ return true;};
			if(el == input){  return true;};	
			if(el.className.indexOf("yh_datepicker")==0)
			{break;};
			el = el.parentNode;
		}
		if(el.style){el.style.zIndex = 1000;};
		
	
		div.style.display="none";;
		return true;
	}
	
	function showDateMenu(e,el)
	{
		el = el || this.parentNode;
		
		var div = el.getElementsByTagName("div")[0];
		
		el.style.zIndex = 2000;
		
		var input = el.getElementsByTagName("input")[0];
		div.style.display="block";

		validateDate(input);
		var d =  new Date(input.value );
		var nd = new Date(showDate(d));
		nd.setDate(1);		
		var t = "";		
		var mDays = 0;
		var sDays = nd.getDay();
		var m = 100 + d.getMonth()+1 + "";
		m = m.substr(1,10);
		t+="<thead><tr valign=middle align=center><td><a title="+titles[0]+" href=# onclick='write_yhDatePicker.moveYear(-1,this);return false;'	>&laquo;</a></td><td><a href=#  onclick='write_yhDatePicker.moveMonth(-1,this);return false;'	title="+titles[1]+" >&lt;</a></td><td colspan=3>"+(nd.getFullYear()) +"/" +m+"</td><td><a href=#		title="+titles[2]+" onclick='write_yhDatePicker.moveMonth(1,this);return false;'>&gt;</a></td><td><a href=# 		title="+titles[3]+"	  onclick='write_yhDatePicker.moveYear(1,this);return false;'>&raquo;</a></td></tr></thead>"
		t+="<tbody><tr>";
		for(var i=0;i<dayName.length;i++)
		{
			t+="<th align=center valign=middle>" + dayName[i] + "</th>";	
		}
		
		t+="</tr></tbody>";
		t += "<tbody>\n<tr>";
		while(sDays > 0)
		{
			 sDays--;			 
			 t+="<td>&nbsp;</td>";
		}		
	
		while(mDays<31)
		{
			mDays++;
			nd.setDate(mDays);
			if(nd.getMonth() > d.getMonth()){break;}
			else
			{
				var c = "";
				if(nd.getDate()==d.getDate())
				{
					 c="	class=today";
				}
				
				var weekend = ((nd.getDay()==0)||(nd.getDay()==6))?"	class=weekend	":"";	 
				if(nd.getDay()==0){t+="<tr>";};

				t+="<td align=center valign=middle "+ weekend+" onclick='var o = document.getElementById(\""+el.id+"\");o.getElementsByTagName(\"input\")[0].value=\""+showDate(nd)+"\";o.getElementsByTagName(\"div\")[0].style.display=\"none\";return false;'><a href=#"+c+"  onclick='return false'>"+mDays+ "</a></td>";
				if(nd.getDay()==6){t+="</tr>\n";};
			};			
		}

		sDays = nd.getDay();
		if(sDays!=0)
		{
			while(sDays < 6)
			{
				 sDays++;			 
				 t+="<td>&nbsp;</td>";
				 if(	sDays==6){t+="</tr>" };
			}
		}

		t += "</tbody>";
		div.innerHTML = "<div><table onselectstart='return false;'	 onmousedown='return false;'>" + t + "</table></div>";
		return false;
	}

	function validateDate(input)
	{
		input = input || this;
		
		var d = new Date(input.value );
		if(isNaN(d))
		{
			input.value = showDate(new Date());
		}
		else
		{
			input.value = showDate(new Date(input.value) );
		}
	}

	function release_closure()
	{
			window.detachEvent("onbeforeunload",release_closure);
			document.detachEvent("onclick",hideDateMenu);
			document.detachEvent("onkeydown",hideDateMenu);
			button.onclick=null;
			input.onchange = null;
			showDateMenu=null;
			input.onchange = null;
			input.onkeydown = null;
			div = null;
			button=null;
			release_closure = null;
			hideDateMenu = null;		
	}

	if(window.attachEvent){window.attachEvent("onbeforeunload",release_closure);};
	
	if(	isNaN(new Date(input.value))){input.value = new Date()};
	input.value = showDate(new Date(input.value));

	input.onchange =  validateDate;
	button.onclick = showDateMenu;
}

