var fc_ie=false;
if(document.all) fc_ie=true;

var calendars=Array();
var fc_months=Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var fc_openCal;
var fc_calCount=0;

function getCalendar(fieldId)
{
	return calendars[fieldId];
}

function displayCalendarFor(fieldId)
{
	var formElement=fc_getObj(fieldId);
	displayCalendar(formElement);
}

function displayCalendar(formElement,isOnTop)
{
	if(!formElement.id) formElement.id=fc_calCount++;
	var cal=calendars[formElement.id];
	if(typeof(cal) == 'undefined' || cal.topCal != isOnTop)
	{
		cal=new floobleCalendar(isOnTop);
		cal.setElement(formElement);
		calendars[formElement.id]=cal;
	}
	(cal.shown) ? cal.hide() : cal.show();
}

function display3FieldCalendar(me,de,ye)
{
	if(!me.id) me.id=fc_calCount++;
	if(!de.id) de.id=fc_calCount++;
	if(!ye.id) ye.id=fc_calCount++;
	var id=me.id+'-'+de.id+'-'+ye.id;
	var cal=calendars[id];
	if(typeof(cal) == 'undefined')
	{
		cal=new floobleCalendar();
		cal.setElements(me,de,ye);
		calendars[id]=cal;
	}
	(cal.shown) ? cal.hide() : cal.show();
}

function floobleCalendar(isOnTop)
{
	this.setElement=fc_setElement;
	this.setElements=fc_setElements;
	this.parseDate=fc_parseDate;
	this.generateHTML=fc_generateHTML;
	this.show=fc_show;
	this.hide=fc_hide;
	this.moveMonth=fc_moveMonth;
	this.setDate=fc_setDate;
	this.formatDate=fc_formatDate;
	this.setDateFields=fc_setDateFields;
	this.parseDateFields=fc_parseDateFields;
	this.shown=false;
	this.topCal=isOnTop;
}

function fc_setElement(formElement)
{
	this.element=formElement;
	this.format=this.element.title;
	this.value=this.element.value;
	this.id=this.element.id;
	this.mode=1;
}

function fc_setElements(monthElement,dayElement,yearElement)
{
	this.mElement=monthElement;
	this.dElement=dayElement;
	this.yElement=yearElement;
	this.id=this.mElement.id+'-'+this.dElement.id+'-'+this.yElement.id;
	this.element=this.mElement;
	if(fc_absoluteOffsetLeft(this.dElement) < fc_absoluteOffsetLeft(this.element)) this.element=this.dElement;
	if(fc_absoluteOffsetLeft(this.yElement) < fc_absoluteOffsetLeft(this.element)) this.element=this.yElement;
	if(fc_absoluteOffsetTop(this.mElement)  > fc_absoluteOffsetTop(this.element))  this.element=this.mElement;
	if(fc_absoluteOffsetTop(this.dElement)  > fc_absoluteOffsetTop(this.element))  this.element=this.dElement;
	if(fc_absoluteOffsetTop(this.yElement)  > fc_absoluteOffsetTop(this.element))  this.element=this.yElement;
	this.mode=2;
}

function fc_parseDate()
{
	if(this.element.value)
	{
		this.date=new Date();
		var out='';
		var token='';
		var lastCh, ch;
		var start=0;
		lastCh=this.format.substring(0,1);
		for(i=0;i<this.format.length;i++)
		{
			ch=this.format.substring(i,i+1);
			if(ch == lastCh)
			{ 
				token+=ch;
			} else {
				fc_parseToken(this.date,token,this.element.value,start);
				start+=token.length;
				token=ch;
			}
			lastCh=ch;
		}
		fc_parseToken(this.date,token,this.element.value,start);
	} else {
		this.date=new Date();
	}
	if(''+this.date.getMonth() == 'NaN') this.date=new Date();
}	

function fc_parseDateFields()
{
	this.date=new Date();
	if(this.mElement.value) this.date.setMonth(fc_getFieldValue(this.mElement)-1);
	if(this.dElement.value) this.date.setDate(fc_getFieldValue(this.dElement));
	if(this.yElement.value) this.date.setFullYear(fc_getFieldValue(this.yElement));
	if('' + this.date.getMonth() == 'NaN') this.date=new Date();
}

function fc_setDate(d,m,y)
{
	this.date.setYear(y);
	this.date.setMonth(m);
	this.date.setDate(d);
	(this.mode == 1) ? this.element.value = this.formatDate() : this.setDateFields();
	this.hide();
}

function fc_setDateFields()
{
	fc_setFieldValue(this.mElement,fc_zeroPad(this.date.getMonth()+1));
	fc_setFieldValue(this.dElement,fc_zeroPad(this.date.getDate()));
	fc_setFieldValue(this.yElement,this.date.getFullYear());
}

function fc_formatDate()
{
	var out='';
	var token='';
	var lastCh, ch;
	lastCh=this.format.substring(0,1);
	for(i=0;i<this.format.length;i++)
	{
		ch=this.format.substring(i,i+1);
		if(ch == lastCh)
		{ 
			token+=ch;
		} else {
			out+=fc_formatToken(this.date,token);
			token=ch;
		}
		lastCh=ch;
	}
	out+=fc_formatToken(this.date,token);
	return out;
}

function fc_show()
{
	if(typeof(fc_openCal) != 'undefined') fc_openCal.hide();

	(this.mode == 1) ? this.parseDate() : this.parseDateFields();
	this.showDate=new Date(this.date.getTime());
	
	if(typeof(this.div) == 'undefined')
	{
		this.div=document.createElement('div');
		this.div.style.position='absolute';
		this.div.style.display='none';
		if(fc_ie)
		{
			(this.topCal) ? this.div.className='fc_main-ie' : this.div.className='fc_main-2-ie';
		} else {
			(this.topCal) ? this.div.className='fc_main' : this.div.className='fc_main-2';
		}
		
		this.div.style.left=fc_absoluteOffsetLeft(this.element);
		this.div.style.top=fc_absoluteOffsetTop(this.element)+this.element.offsetHeight+1;
		document.body.appendChild(this.div);
	}
	this.div.innerHTML=this.generateHTML();
	this.div.style.display='block';
	this.shown=true;
	fc_openCal=this;
}

function fc_generateHTML()
{
	var html='<table class="cal">';
	html+='<tr>';
	html+='<td class="fc_head" colspan="6">CALENDAR:</td>';
	html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').hide();"><b>X</b></td>';
	html+='</tr>';
	
	html+='<tr>';
	html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').moveMonth(-12);"><b>&laquo;</b></td>';
	html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').moveMonth(-1);"><b>&#8249;</b></td>';
	html+='<td class="fc_wk" colspan="3" style="width:120px;">'+fc_months[this.showDate.getMonth()]+' '+fc_getYear(this.showDate)+'</td>';
	html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').moveMonth(1);"><b>&#8250;</b></td>';
	html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').moveMonth(12);"><b>&raquo;</b></td>';
	html+='</tr>';
	
	html+='<tr>';
	html+='<td class="fc_wk">Mo</td>';
	html+='<td class="fc_wk">Tu</td>';
	html+='<td class="fc_wk">We</td>';
	html+='<td class="fc_wk">Th</td>';
	html+='<td class="fc_wk">Fr</td>';
	html+='<td class="fc_wknd">Sa</td>';
	html+='<td class="fc_wknd">Su</td>';
	html+='</tr>';
	
	html+='<tr>';
	var dow=0;
	var i, style;
	var totald=fc_monthLength(this.showDate);
	for(i=0;i<fc_firstDOW(this.showDate);i++)
	{
		dow++;
		html+='<td> </td>';
	}
	for(i=1;i<=totald;i++)
	{
		if(dow == 0) html+='<tr>';
		if(this.showDate.getMonth() == this.date.getMonth() && this.showDate.getYear() == this.date.getYear() && this.date.getDate() == i)
		{ 
			style=' style="font-weight:bold;color:#C80000;"';
		} else {
			style='';
		}
		html+='<td class="fc_date" onMouseover="this.className=\'fc_dateHover\';" onMouseout="this.className=\'fc_date\';" onClick="getCalendar(\''+this.id+'\').setDate('+i+', '+this.showDate.getMonth()+', '+this.showDate.getFullYear()+');" '+style+'>'+i+'</td>';
		dow++;
		if(dow == 7)
		{
			html+='</tr>';
			dow=0;
		}
	}
	if(dow!=0) for(i=dow;i<7;i++) html+='<td> </td>';
	html+='</tr>';
	html+='</table>';
	return html;
}

function fc_hide()
{
	if(this.div != false) this.div.style.display='none';
	this.shown=false;
	fc_openCal=undefined;
}

function fc_moveMonth(amount)
{
	var m=this.showDate.getMonth();
	var y=fc_getYear(this.showDate);
	if(amount == 1)
	{
		if(m == 11)
		{
			this.showDate.setMonth(0);
			this.showDate.setYear(y+1);
		} else {
			this.showDate.setMonth(m+1);
		}
	} else if(amount == -1) {
		if(m == 0)
		{
			this.showDate.setMonth(11);
			this.showDate.setYear(y-1);
		} else {
			this.showDate.setMonth(m-1);
		}
	} else if(amount == 12) {
		this.showDate.setYear(y+1);
	} else if(amount == -12) {
		this.showDate.setYear(y-1);
	}
	this.div.innerHTML=this.generateHTML();
}

function fc_absoluteOffsetTop(obj)
{
	if(!fc_ie)
	{
		var top=obj.offsetTop;
		var parent=obj.offsetParent;
		while(parent != document.body)
		{
			top+=parent.offsetTop;
			parent=parent.offsetParent;
		}
		return top;
	} else {
		return obj.offsetTop;
	}
}

function fc_absoluteOffsetLeft(obj)
{
	if(!fc_ie)
	{
		var left=obj.offsetLeft;
		var parent=obj.offsetParent;
		while(parent != document.body)
		{
			left+=parent.offsetLeft;
			parent=parent.offsetParent;
		}
		return left;
	} else {
		return obj.offsetLeft;
	}
}

function fc_firstDOW(date)
{
	var dow=date.getDay();
	var day=date.getDate();
	if(day%7 == 0) return dow;
	return(7+dow-(day%7))%7; 
}
 
function fc_getYear(date)
{
	var y=date.getYear();
	if(y > 1900) return y;
	return 1900+y;
}

function fc_monthLength(date)
{
	var month=date.getMonth();
	var totald=30;
	if(month == 0 || month == 2	|| month == 4 || month == 6 || month == 7 || month == 9 || month == 11) totald=31;
	if(month == 1)
	{
		var year=date.getYear();
		(year%4 == 0 && (year%400 == 0 || year%100 != 0)) ? totald = 29 : totald = 28;
	}
	return totald;
}

function fc_formatToken(date,token)
{
	var command=token.substring(0,1);
	if(command == 'y' || command == 'Y')
	{
		if(token.length == 2) return fc_zeroPad(date.getFullYear()%100);
		if(token.length == 4) return date.getFullYear();
	}
	if(command == 'd' || command == 'D') if(token.length == 2) return fc_zeroPad(date.getDate());
	if(command == 'm' || command == 'M')
	{
		if(token.length == 2) return fc_zeroPad(date.getMonth()+1);
		if(token.length == 3) return fc_months[date.getMonth()];
	}
	return token;
}
 
function fc_parseToken(date,token,value,start)
{
	var command=token.substring(0,1);
	var v;
	if(command == 'y' || command == 'Y')
	{
		if(token.length == 2)
		{ 
			v=value.substring(start,start+2);
			(v < 70) ? date.setFullYear(2000+parseInt(v)) : date.setFullYear(1900+parseInt(v)); 
		}
		if(token.length == 4)
		{
			v=value.substring(start,start+4);
			date.setFullYear(v);
		} 
	}
	if(command == 'd' || command == 'D')
	{
		if(token.length == 2)
		{
			v=value.substring(start,start+2);
			date.setDate(v);
		}
	}

	if(command == 'm' || command == 'M')
	{
		if(token.length == 2)
		{
			v=value.substring(start,start+2);
			date.setMonth(v-1);
		}
		if(token.length == 3)
		{ 
			v=value.substring(start,start+3);
			var i;
			for(i=0;i<fc_months.length;i++) if(fc_months[i].toUpperCase() == v.toUpperCase()) date.setMonth(i);
		} 
	}
}
 
function fc_zeroPad(num)
{
	if(num < 10) return '0'+num;
	return num;
}

function fc_getObj(id)
{
	if(fc_ie)
	{
		var ret=document.all[id]; 
	} else {
		return document.getElementById(id);
	}
}

function fc_setFieldValue(field,value)
{
	if(field.type.substring(0,6) == 'select')
	{
		var i;
		for(i=0;i<field.options.length;i++) if(fc_equals(field.options[i].value,value)) field.selectedIndex=i;
	} else {
		field.value=value;
	}
}

function fc_getFieldValue(field)
{
	if(field.type.substring(0,6) == 'select')
	{
		return field.options[field.selectedIndex].value;
	} else {
		return field.value;
	}
}
  
function fc_equals(val1,val2)
{
	if(val1 == val2) return true;      		
	if(1*val1 == 1*val2) return true;
	return false;
}