function doCalendar(set)
{
	
	if (! oCal.isOpen)
	{
		set.loadSettings();
		oCal.createCalendar(set);
		oCal.calendarContent();
	} else {
		if (set.parentName != oCal.set.parentName)
		{
			oCal.closeCalendar();
			
			set.loadSettings();
			oCal.createCalendar(set);
			oCal.calendarContent();
		}
	}
}

// Calendars Bind;
function calBind(start, end)
{
	this.start = start;
	this.end = end;
	
	this.checkBind = checkBind;
	
	function checkBind(edited)
	{
		if (this.start.cDate.getTime() > this.end.cDate.getTime())
		{
			if (edited == this.start.parentName)
			{
				this.end.cDate = this.start.cDate;
			} else {
				this.start.cDate = this.end.cDate;
			}
		}
		
		this.start.refreshFromDate();
		this.end.refreshFromDate();
	}
}

// Calendar Settings;
function calSettings(parName, dayName, monthName, startMonth, startYear, endMonth, endYear, offsetClass)
{
	this.parentName = parName;
	this.parent = null;
	this.day = dayName;
	this.month = monthName;
	this.offset = ' ' + offsetClass;
	
	this.cDay = null;
	this.cMonth = null;
	this.cYear = null;
	this.cDate = new Date();
	
	this.sMonth = startMonth;
	this.sYear = startYear;
	this.eMonth = endMonth;
	this.eYear = endYear;
	
	this.retDay = null;
	this.retMonth = null;
	
	this.days = gWeekdays;
	this.months = gMonths;
	this.now = new Date();
	
	this.loadSettings = loadSettings;
	this.returnValues = returnValues;
	this.refreshFromDate = refreshFromDate;
	
	function loadSettings()
	{
		this.parent = document.getElementById(this.parentName);
		
		this.cDay = document.getElementById(this.day).options[document.getElementById(this.day).selectedIndex].value;
		this.cMonth = document.getElementById(this.month).options[document.getElementById(this.month).selectedIndex].value;
		this.cYear = (this.cMonth > this.now.getMonth() ? this.sYear : this.eYear);
		
		this.cDate.setDate(this.cDay);
		this.cDate.setMonth(this.cMonth - 1);
		this.cDate.setFullYear(this.cYear);
		
		this.retDay = this.cDay;
		this.retMonth = this.cMonth;
	}
	
	function returnValues()
	{
		var day = document.getElementById(this.day);
		var month = document.getElementById(this.month);
		
		for (i = 0 ; i < day.options.length ; i++ )
		{
			day.options[i].selected = false;
			if (day.options[i].value == (this.retDay))
			{
				day.options[i].selected = true;
				day.selectedIndex = i;
			}
		}
		for (i = 0 ; i < month.options.length ; i++ )
		{
			month.options[i].selected = false;
			if (month.options[i].value == (this.retMonth))
			{
				month.options[i].selected = true;
				month.selectedIndex = i;
			}
		}
		
		this.loadSettings();
//		oBind.checkBind(this.parentName);
	}
	
	function refreshFromDate()
	{
		this.retMonth = this.cDate.getMonth() + 1;
		this.retDay = this.cDate.getDate();
		
		var day = document.getElementById(this.day);
		var month = document.getElementById(this.month);
		
		for (i = 0 ; i < day.options.length ; i++ )
		{
			day.options[i].selected = false;
			if (day.options[i].value == (this.retDay))
			{
				day.options[i].selected = true;
				day.selectedIndex = i;
			}
		}
		for (i = 0 ; i < month.options.length ; i++ )
		{
			month.options[i].selected = false;
			if (month.options[i].value == (this.retMonth))
			{
				month.options[i].selected = true;
				month.selectedIndex = i;
			}
		}
		
		this.loadSettings();
	}
}

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.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			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"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// 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"
		}
	]

};

BrowserDetect.init();


// CalendarObject
function MyCalendar()
{
//	variables definitions
	this.opener = null;
	this.set = null;
	this.div = null;
	this.isOpen = false;
	this.browser = BrowserDetect;
	this.tbody = null;
	
//	methods definition
	this.createCalendar = createCalendar;
	this.calendarContent = calendarContent;
	this.closeCalendar = closeCalendar;
	this.monthBack = monthBack;
	this.monthForward = monthForward;
	this.parseCalendar = parseCalendar;
	this.refreshCalendar = refreshCalendar;
	this.clearTBody = clearTBody;
	this.selectDay = selectDay;

	
//	methods code
//	createCalendar
	function createCalendar(set)
	{	
		if (calDiv = document.getElementById("calendarBlock"))
		{
			/*if ((IE) && (IEnu<=6.0))
				calDiv.parentNode.removeChild(document.getElementById("calendarFrame"));
				
				
			calDiv.parentNode.removeChild(calDiv);*/
	//		if (calDiv.parentNode.id != opener.id)
	//			doCalendar(opener, set);
		} else {
			this.set = set;
			
			if ((BrowserDetect.browser == "Explorer") && (BrowserDetect.version<=6.0))
			{
				/*var iFrame = document.createElement("iframe");
				iFrame.className = "calendarDivIEIframe";
				iFrame.id = "calendarFrame";
				iFrame.src = 'about:blank';
				this.set.parent.appendChild(iFrame);
				
				iFrame.focus();*/
				
				var calDiv = document.createElement("div");
				calDiv.className = "calendarDivIE" + this.set.offset;
				calDiv.id = "calendarBlock";
			} else {
				var calDiv = document.createElement("div");
				calDiv.className = "calendarDiv"+this.set.offset;
				if (BrowserDetect.browser == "Explorer")
					calDiv.className += " calendarDivIE7"+this.set.offset;
				if (BrowserDetect.browser == "Opera")
					calDiv.className += " calendarDivOpera"+this.set.offset;
				calDiv.id = "calendarBlock";
			}
			
			this.div = calDiv;
			this.isOpen = true;
			
			this.set.parent.appendChild(this.div);
		}
	}
	
//	show content
	function calendarContent()
	{
//		this.div.setAttribute("onblur", "oCal.closeCalendar();");
		
	//	create Table
		var table = document.createElement("table");
		table.setAttribute("width", '100%');
//		table.setAttribute("height", '100%');
		table.setAttribute("border", "0");
		table.setAttribute("cellPadding", "0");
		table.setAttribute("cellSpacing", "0");
		
		this.div.appendChild(table);
		
	//	Table Tbody
		var tbody = document.createElement("tbody");
		table.appendChild(tbody);
		
		this.tbody = tbody;
		
		this.parseCalendar();
			
	}
	
	function parseCalendar()
	{
		var currentDay = 1;
		var currentMonth = this.set.cMonth;
		var currentYear = this.set.cYear;
		
	//////////////////////////////	
	//	TopRow
		var topRow = document.createElement("tr");
		this.tbody.appendChild(topRow);
		
	//	Spacer
		var spacer = document.createElement("td");
		spacer.className = "calendarHeader";
		spacer.setAttribute('colSpan', '6');
		spacer.appendChild(document.createTextNode(" "));
		topRow.appendChild(spacer);
		
	//	Close Link
		var close = document.createElement("td");
		var link = document.createElement("a");
		link.setAttribute("href", "javascript:oCal.closeCalendar();");
//		link.setAttribute("onclick", 'return oCal.closeCalendar();');
		link.appendChild(document.createTextNode("X"));
		close.appendChild(link);
		close.className = 'calendarMonth calendarHeader';
		topRow.appendChild(close);
		
///////////////////////////////////////////////////		
//		Nav row
		var navrow = document.createElement("tr");
		var td1 = document.createElement("td");
		var backLink = document.createElement("a");
		var month = document.createElement("td");		
		var forwardLink = document.createElement("a");
		var td2 = document.createElement("td");
		
		this.tbody.appendChild(navrow);
		
		if (currentMonth == this.set.sMonth)
		{
			backLink = document.createTextNode("<<");
		} else {
			backLink.setAttribute("href", "javascript:oCal.monthBack();");
//			backLink.setAttribute("onclick", 'return oCal.monthBack();');
			backLink.appendChild(document.createTextNode("<<"));
		}
		
		td1.setAttribute("align", "center");
		td1.className = 'calendarMonth calendarHeader';
		td1.appendChild(backLink);
		navrow.appendChild(td1);
		
		month.appendChild(document.createTextNode(this.set.months[this.set.cMonth - 1] + " " + this.set.cYear));
		month.className = 'calendarMonth calendarHeader';
		month.setAttribute('colSpan', '5');
		navrow.appendChild(month);
		
		if (currentMonth == this.set.eMonth)
		{
			forwardLink = document.createTextNode(">>");
		} else {
			forwardLink.setAttribute("href", "javascript:oCal.monthForward();");
//			forwardLink.setAttribute("onclick", 'return oCal.monthForward();');
			forwardLink.appendChild(document.createTextNode(">>"));
		}
		
		td2.setAttribute("align", "center");
		td2.className = 'calendarMonth calendarHeader';
		td2.appendChild(forwardLink);
		navrow.appendChild(td2);
		
///////////////////////////////////////////////////		
//		Days row
		var daysRow = document.createElement("tr");
		this.tbody.appendChild(daysRow);
		
		days = this.set.days;
		var d = Array();
		var l = Array();
		
		for (i = 0 ; i < days.length ; i++)
		{
			d[i] = document.createElement("td");
			d[i].className = 'calendarDays';
			if (i > 4)
				d[i].className = 'calendarDays calendarHeaderWeekend';
			d[i].appendChild(document.createTextNode(days[i]));
			daysRow.appendChild(d[i]);
		}
		
		
///////////////////////////////////////////////////////
// 		Calendar Content Days 
		var dRows = Array();
		var dCols = Array();
		var dLink = Array();
		for (i = 0 ; i < 7 ; i++) { dCols[i] = Array();dLink[i] = Array();}
		var showDone = false;
		
		var cDate = new Date();
		cDate.setDate(1);
		cDate.setMonth(currentMonth - 1);
		cDate.setFullYear(currentYear);
		cDate.setHours(1);
		currentDay = cDate.getDay();
		if (currentDay == 0)
		{
			currentDay = 6;
		} else {
			currentDay--;
		}
		
		var i = 0;
		while (! showDone)
		{
			dRows[i] = document.createElement("tr");
			this.tbody.appendChild(dRows[i]);
			
			for (j = 0 ; j < 7 ; j++)
			{
				dCols[i][j] = document.createElement("td");
				dCols[i][j].className = 'calendarCels';
				if (j > 4)
					dCols[i][j].className += ' calendarCelsWeekend';
				if (((i == 0) && (currentDay > j)) || (cDate.getMonth() != currentMonth - 1))
				{
					dLink[i][j] = document.createTextNode(" ");
					if ((cDate.getMonth() != currentMonth - 1))
						showDone = true;
				} else {
					if ((cDate.getMonth() == this.set.now.getMonth()) &&
						(cDate.getDate() < this.set.now.getDate()))
					{
						dLink[i][j] = document.createTextNode(cDate.getDate());
						dCols[i][j].className += ' calendarNoLink'
						if (j > 4)
							dCols[i][j].className += ' calendarCelsWeekend';
					} else {
						if (j > 4)
							dCols[i][j].className += ' calendarCelsWeekend';
						dLink[i][j] = document.createElement("a");
						dLink[i][j].setAttribute('href', "javascript:oCal.selectDay('"+cDate.getDate()+"', '"+ currentMonth +"');");
						//dLink[i][j].setAttribute('onclick', "return oCal.selectDay('"+cDate.getDate()+"', '"+ currentMonth +"');");
						if ((cDate.getMonth() == this.set.retMonth - 1) &&
							(cDate.getDate() == this.set.retDay))
							{
								dLink[i][j].className += ' calendarActual';
							}
						dLink[i][j].appendChild(document.createTextNode(cDate.getDate()));
					}
					cDate.setDate(cDate.getDate()+1)
				}
				
				dCols[i][j].appendChild(dLink[i][j]);
				dRows[i].appendChild(dCols[i][j]);
			}
			
			i++;
		}
	}
	
	function clearTBody()
	{
		var m = this.tbody.firstChild;
		while(m != null)
		{
			n = m.nextSibling;
			this.tbody.removeChild(m);
			m = n;
		}
	}
	
	function closeCalendar()
	{
		/*if ((BrowserDetect.browser == "Explorer") && (BrowserDetect.version<=6.0))
				this.div.parentNode.removeChild(document.getElementById("calendarFrame"));*/
				
				
		this.div.parentNode.removeChild(this.div);
		this.isOpen = false;
	}
	
	function monthBack()
	{
		if (this.set.cMonth == 1)
		{
			this.set.cMonth = 12;
			this.set.cYear--;
		} else {
			this.set.cMonth--;
		}
		
		this.refreshCalendar();
	}
	
	function monthForward()
	{
		if (this.set.cMonth == 12)
		{
			this.set.cMonth = 1;
			this.set.cYear++;
		} else {
			this.set.cMonth++;
		}
		
		this.refreshCalendar();
	}
	
	function refreshCalendar()
	{
		this.clearTBody();
		this.parseCalendar();
	}
	
	function selectDay(day, month)
	{
		this.set.retDay = day;
		this.set.retMonth = month;
		
		
		this.set.returnValues();
		this.closeCalendar();
		
//		this.set.retYear = this.set.sYear;
//		if (month < this.set.sMonth)
//		this.set.retYear = this.set.eYear;
	}
}