/*
aw:Calendar v1.3.2
http://avoidwork.com

Copyright (c) 2009 avoidwork inc.

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
var awCalendar=(awCalendar)?awCalendar:function()
{
	var private =
	{
		ie:((document.all)&&(navigator.appVersion<8))?true:false, // browser detection
		clear:false,
		date:new Date(),
		dateMonths:new Array("January","February","March","April","May","June","July","August","September","October","November","December"),
		datePattern:new String("yyyy/mm/dd"), // ISO 8601 standard, change to any localized pattern
		
		boolean: function(input)
		{
			var output=new String();
			switch(input)
			{
				case true:
				case false:
					output=input;
					break;
				default:
					output=false;
					break;
			}
			return(output);
		},

		dateDays: function(month,year)
		{
			return(32-new Date(year, month, 32).getDate());
		},
		
		dateOutput: function(date)
		{
			var output=new String(private.datePattern);
			var outputDate=new Date(date);
			
			output=output.replace(/dd/,outputDate.getDate());
			output=output.replace(/mm/,outputDate.getMonth()+1);
			output=output.replace(/yyyy/,outputDate.getFullYear());
			
			return(output);
			
			delete output;
			delete outputDate;
		},

		findPosition: function(obj)
		{
			var curleft=curtop=0;
			
			if (obj.offsetParent)
			{
				curleft=obj.offsetLeft;
				curtop=obj.offsetTop;
				while (obj=obj.offsetParent)
				{
					curleft+=obj.offsetLeft;
					curtop+=obj.offsetTop;
				}
			}
			
			return [curleft,curtop];
			
			delete curleft;
			delete curtop;
		},
		
		renderDay: function(target,date,element)
		{
			var formElement=document.getElementById(element);
			var container=document.createElement("div");
			
			(private.ie)?container.setAttribute("className","day"):container.setAttribute("class","day");
		
			if (!isNaN(new Date(date).getYear()))
			{
				var renderDate = new Date(date);
				var href=document.createElement("a");
				href.setAttribute("onclick",("awCalendar.setValue('"+formElement.id+"','"+private.dateOutput(renderDate.toDateString())+"');awCalendar.destroyElement('awCalendar');"));
				href.innerHTML=renderDate.getDate();
				
				if ((renderDate.getDate()==private.date.getDate())&&(renderDate.getMonth()==private.date.getMonth())&&(renderDate.getFullYear()==private.date.getFullYear()))
				{
					(private.ie)?href.setAttribute("className","current"):href.setAttribute("class","current");
				}
				
				container.appendChild(href);
				
				delete href;
				delete renderDate;
			}
	
			target.appendChild(container);
			
			delete container;
			delete formElement;
		}			
	};

	var public =
	{
		createCalendar: function(icon,obj,clear) {
			var pos="";
			var posX="";
			var posY="";
			var formLoader=document.getElementById(icon);
			var formTarget=document.getElementById(obj);
			var calendarDate=(formTarget.value!="")?new Date(formTarget.value):new Date();
			
			private.date=(calendarDate!="Invalid Date")?calendarDate:new Date();
			private.clear=(clear==undefined)?false:private.boolean(clear); // boolean for displaying optional Clear anchor in calendar header
			
			with (formLoader) {
				pos = private.findPosition(formLoader);
				posX = pos[0];
				posY = pos[1];
				blur();
			}
			
			(document.getElementById("awCalendar"))?public.destroyElement("awCalendar"):void(0);
			(calendarDate=="Invalid Date")?formTarget.value="":void(0);

			var calendar=document.createElement("div");
			calendar.setAttribute("id","awCalendar");
			calendar.style.top=posY+"px";
			calendar.style.left=posX+"px";
			document.body.appendChild(calendar);
			public.renderCalendar(calendar.id,private.date,formTarget.id);
			
			delete calendar;
			delete calendarDate;
			delete formLoader;
			delete formTarget;
			delete pos;
			delete posX;
			delete posY;
		},

		destroyElement: function(obj)
		{
			(document.getElementById(obj))?document.body.removeChild(document.getElementById(obj)):void(0);
		},	
		
		renderCalendar: function(target,date,element)
		{					
			var calendar=document.getElementById(target);
			var calendarClose=document.createElement("a");
			var calendarDate=new Date(date);
			var calendarDatePrev = new Date;
			var calendarDateNext = new Date;
			var calendarTop=document.createElement("div");
			var calendarHeader=document.createElement("div");
			var calendarDays=document.createElement("div");
			var monthName=document.createElement("span");
			var monthPrev=document.createElement("a");
			var monthNext=document.createElement("a");
			
			(calendarDate=="Invalid Date")?calendarDate=private.date:void(0);

			calendar.innerHTML="";
			calendarTop.setAttribute("id","calendarTop");	
			calendarClose.innerHTML="Close";
			calendarClose.setAttribute("id","calendarClose");
			calendarClose.setAttribute("onclick","awCalendar.destroyElement('"+calendar.id+"');")
			calendarHeader.setAttribute("id","calendarHeader");

			switch (calendarDate.getMonth())
			{
				case 0:
					calendarDatePrev.setDate(1);
					calendarDatePrev.setMonth(11);
					calendarDatePrev.setFullYear(calendarDate.getFullYear()-1)
					calendarDateNext.setDate(1);
					calendarDateNext.setMonth(calendarDate.getMonth()+1);
					calendarDateNext.setFullYear(calendarDate.getFullYear());
					break;
				case 10:
					calendarDatePrev.setDate(1);
					calendarDatePrev.setMonth(calendarDate.getMonth()-1);
					calendarDatePrev.setFullYear(calendarDate.getFullYear());
					calendarDateNext.setDate(1);
					calendarDateNext.setMonth(calendarDate.getMonth()+1);
					calendarDateNext.setFullYear(calendarDate.getFullYear());
					break;
				case 11:
				{
					calendarDatePrev.setDate(1);
					calendarDatePrev.setMonth(calendarDate.getMonth()-1);
					calendarDatePrev.setFullYear(calendarDate.getFullYear());
					calendarDateNext.setDate(1);
					calendarDateNext.setMonth(0);
					calendarDateNext.setFullYear(calendarDate.getFullYear()+1)
					break;
				}
				default:
				{
					calendarDatePrev.setDate(1);
					calendarDatePrev.setMonth(calendarDate.getMonth()-1);
					calendarDatePrev.setFullYear(calendarDate.getFullYear());
					calendarDateNext.setDate(1);
					calendarDateNext.setMonth(calendarDate.getMonth()+1);
					calendarDateNext.setFullYear(calendarDate.getFullYear());
					break;
				}
			}

			monthName.setAttribute("id","calendarMonth");
			monthName.innerHTML=" "+private.dateMonths[calendarDate.getMonth()]+" "+calendarDate.getFullYear()+" ";
	
			monthPrev.setAttribute("id","calendarPrev");
			monthPrev.setAttribute("onclick","awCalendar.renderCalendar('"+calendar.id+"','"+calendarDatePrev.toDateString()+"','"+element+"');")
			monthPrev.innerHTML="&lt;";
	
			monthNext.setAttribute("id","calendarNext");
			monthNext.setAttribute("onclick","awCalendar.renderCalendar('"+calendar.id+"','"+calendarDateNext.toDateString()+"','"+element+"');")
			monthNext.innerHTML="&gt;";

			calendarDate.setDate(1)
			for (i=1;i<=calendarDate.getDay();i++)
			{
				private.renderDay(calendarDays,"",element);
			}

			for (i=1;i<=private.dateDays(calendarDate.getMonth(),calendarDate.getFullYear());i++)
			{
				calendarDate.setDate(i)
				private.renderDay(calendarDays,calendarDate,element);
			}
	
			calendarHeader.appendChild(monthPrev);
			calendarHeader.appendChild(monthName);
			calendarHeader.appendChild(monthNext);
			
			if (private.clear)
			{
				var calendarClear=document.createElement("a");
				calendarClear.innerHTML="Clear";
				calendarClear.setAttribute("id","calendarClear");
				calendarClear.setAttribute("onclick","awCalendar.setValue('"+element+"','');awCalendar.destroyElement('"+calendar.id+"');")
				calendarTop.appendChild(calendarClear);
				delete calendarClear;
			}
			
			calendarTop.appendChild(calendarClose);
			calendar.appendChild(calendarTop);
			calendar.appendChild(calendarHeader);
			calendar.appendChild(calendarDays);
			
			delete calendar;
			delete calendarClose;
			delete calendarDatePrev;
			delete calendarDateNext;
			delete calendarTop;
			delete calendarHeader;
			delete calendarDays;
			delete monthName;
			delete monthPrev;
			delete monthNext;
		},
		
		setValue: function(obj,value)
		{
			(document.getElementById(obj))?document.getElementById(obj).value=value:void(0);
		}
	}

	return public;
}();