
//alert('tf_calendar.js');
/*----------------------- calender (cdr) (+) -----------------------*/
function calendar(thisObj, e, tgtObj, st, ed){	
 e.cancelBubble = true;	// cancel the event when mouse click on cdr icon, prevent from hidden cdr (div).

	var cdr = new Object();		
	var cdrId = 'cId';
	var cdrName = 'cName';	
	var cdrClass = 'calendar';
	var hdrClass = 'header';
	var btnClass = 'buttonSet';	
	var cellClass = 'cell';	
	var weekTxt = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
	var fullWeekTxt = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];	
	var monthTxt = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];	
	var fullMonthTxt = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];		
	var _yearOffset = 10;
	var _gDateFormat = 'dd mmm yyyy';
	var _a = '<';
	var _b = '>';
	var err1 = 'Invalid date format!';
	var selectedDate = '';
	var selectedMonth = '';
	var selectedFullYear = '';
	
	var cdrW = 188;	
	var cdrH = 135;
	var docW = window.document.body.clientWidth;
	var docH = window.document.body.clientHeight;

	_bodyOnClick = function(){
		cdr._hide();	
	}
	_getIconX = function(){
		return getRealPos(thisObj, 'x');
	}
	_getIconY = function(){
		return getRealPos(thisObj, 'y');
	}
	_getTxtPos = function(txtAry, txt){
		for(var i=0; i<txtAry.length; i++){
			if(txtAry[i].toLowerCase() == txt){
				return parseInt(eval(i+1));
			}
		}
	}
/* ------------------------------ format date object (+) ------------------------------ */
	_C = function(txt){
			return _a + txt + _b;
	}
	_NC = function(txt, num){
		res = '';
		for(var i=0; i<num; i++){
			res = res + txt;
		}
		return res;
	}
	_dumDateFormat = function(dateFormat){
		var dmy = ['d', 'm' , 'y'];
		for(var i=0; i<dmy.length; i++){
			var _tdmy = '';
			for(var j=4; j>=1; j--){
				_tdmy = _NC(dmy[i], j);
				if(dateFormat.indexOf(_tdmy) != -1)
					dateFormat = dateFormat.replace(_tdmy, _C(_tdmy.toUpperCase()));
			}
		}
		return dateFormat.toLowerCase();
	}
	_validFormat = function(dateFormat){
		var valid = false;
		dateFormat = dateFormat.toLowerCase();				
		re = /[-/]/g;
		dateFormat = dateFormat.replace(re, '/');
		var validFormat = [
			'd/m/yyyy', 'd/m/yy', 'dd/mm/yy', 'dd/mm/yyyy', 'yy/m/d', 'yy/mm/dd', 'yyyy/m/d', 'yyyy/mm/dd',
			'yyyy/mmm/dd', 'dd/mmm/yyyy', 'dd/mmmm/yyyy', 'dddd, d mmmm, yyyy', 'd mmmm, yyyy', 'dd mmmm, yyyy', 
			'dddd yyyy mm dd', 'ddd yyyy mm dd', 'yyyy mm dd', 'dd mmm yyyy', 'dd mmmm yyyy', 'd dd ddd dddd m mm mmm mmmm yy yyyy', 'mmm. dd, yyyy'
		];
		for(var i=0; i<validFormat.length; i++){
			if(validFormat[i] == dateFormat)
				valid = true;
		}
		return valid;
	}	
	_strToAry = function(oStr){
		var _f = oStr.toLowerCase().toString();
		var _sA = new Array();				
		var re = /[A-Za-z0-9]/;
		var _c = 0;
		var _lst = 0;		
		for(var i=0; i<_f.length; i++){
			if(re.exec(_f.substr(i,1)) == null){
				if(_c == 0)
					_sA[_c] = _f.substr(0, i);
				else
					_sA[_c] = _f.substr(_lst+1, i-_lst-1);
				_c++;
				_lst = i;
			}
		}
					_sA[_c] = _f.substr(_lst+1, _f.length);
		return _sA; 
	}
	_formatDateToObject = function(dateStr, dateFormat){
		__yy = _curYear();
		__mm = _curMonth();
		__dd = _curDate();
		//dd, mm, yyyy, yy, m, d -------------------------- 
		if(dateStr != '' && dateStr != err1 && dateStr != 'today' ){
			var sAry = new Array();
			sAry = _strToAry(dateStr);		
			var fAry = new Array();
			fAry = _strToAry(dateFormat);
			for(var i=0; i<sAry.length; i++){			
				if(fAry[i] == 'yyyy')
					__yy = eval(sAry[i]);
				else if(fAry[i] == 'yy')
					__yy = eval('20' + sAry[i]);
				if(fAry[i] == 'mmmm')
					__mm = _getTxtPos(fullMonthTxt, sAry[i]);
				else if(fAry[i] == 'mmm')
					__mm = _getTxtPos(monthTxt, sAry[i]);
				else if(fAry[i] == 'mm')
					__mm = eval(sAry[i]);
				else if(fAry[i] == 'm')
					__mm = eval(sAry[i]);
				if(fAry[i] == 'dddd')
					__dd = _getTxtPos(fullWeekTxt, sAry[i]);
				else if(fAry[i] == 'ddd')
					__dd = _getTxtPos(weekTxt, sAry[i]);
				else if(fAry[i] == 'dd')
					__dd = eval(sAry[i]);
				else if(fAry[i] == 'd')
					__dd = eval(sAry[i]);
			}
		}
		__yy = (typeof __yy == 'string' || __yy == undefined) ? _curYear() : __yy;
		__mm = (typeof __mm == 'string' || __mm == undefined) ? _curMonth() : __mm;
		__dd = (typeof __dd == 'string' || __dd == undefined) ? _curDate() : __dd;			
		var _tmpDateObj = new Date();
		_tmpDateObj.setDate(__dd);
		_tmpDateObj.setMonth(__mm - 1);
		_tmpDateObj.setFullYear(__yy);
		_tmpDateObj.setHours(1);
		_tmpDateObj.setMinutes(1);
		_tmpDateObj.setSeconds(1);
		_tmpDateObj.setMilliseconds(1);
		return _tmpDateObj;		
	}
	_formatDate = function(dateObj, dateFormat){
		if(!_validFormat(dateFormat))
			return err1;
		var resultStr = _dumDateFormat(dateFormat);			
		var _day = dateObj.getDay().toString();		
		if(resultStr.indexOf(_C('dddd')) != -1 ){
			resultStr = resultStr.replace(_C('dddd'), fullWeekTxt[_day]);
		}
		if(resultStr.indexOf(_C('ddd')) != -1 ){
			resultStr = resultStr.replace(_C('ddd'), weekTxt[_day]);
		}
		var _dd = dateObj.getDate().toString();		
		if(resultStr.indexOf(_C('dd')) != -1 ){
			if(_dd.length == 1)
				resultStr = resultStr.replace(_C('dd'), '0' + _dd);
			resultStr = resultStr.replace(_C('dd'), _dd);
		}
		if(resultStr.indexOf(_C('d')) != -1 ){
			resultStr = resultStr.replace(_C('d'), _dd);			
		}		
		var _mm = (parseInt(dateObj.getMonth()) + 1).toString();
		if(resultStr.indexOf(_C('mmmm')) != -1 ){
			resultStr = resultStr.replace(_C('mmmm'), fullMonthTxt[eval(parseInt(_mm-1))]);
		}
		if(resultStr.indexOf(_C('mmm')) != -1 ){
			resultStr = resultStr.replace(_C('mmm'), monthTxt[eval(parseInt(_mm-1))]);
		}
		if(resultStr.indexOf(_C('mm')) != -1 ){
			if(_mm.length == 1)
				_mm = '0' + _mm;
			resultStr = resultStr.replace(_C('mm'), _mm);
		}
		if(resultStr.indexOf(_C('m')) != -1 ){
			resultStr = resultStr.replace(_C('m'), _mm);			
		}
		var _yy = dateObj.getFullYear().toString();
		if(resultStr.indexOf(_C('yyyy')) != -1 ){
			resultStr = resultStr.replace(_C('yyyy'), _yy);
		}
		if(resultStr.indexOf(_C('yy')) != -1 ){
			resultStr = resultStr.replace(_C('yy'), dateObj.getFullYear().toString().substr(2, 2));	
		}
		return resultStr;
	}
/* ------------------------------ format date object (-) ------------------------------ */		
	
	_getSelectedDateObj = function(){
		var tmpDate = new Date();
		tmpDate.setDate(1);
		tmpDate.setMonth(selectedValue(document.getElementById('selMonth'))-1);
		tmpDate.setFullYear(selectedValue(document.getElementById('selYear')));
		return tmpDate;
	}	
	_getSelectedOffSetDateObj = function(offSet){
		var tmpDate = _getSelectedDateObj();
		var newYear = 0;
		var newMonth = 0;
		tmpDate.setHours(1);
		tmpDate.setMinutes(1);
		tmpDate.setSeconds(1);
		tmpDate.setMilliseconds(1);		
		if(eval(tmpDate.getMonth() + offSet) < 0){
			newMonth = 12 + eval(tmpDate.getMonth() + offSet);
			newYear = eval(tmpDate.getFullYear() - 1);
		}else if(eval(tmpDate.getMonth() + offSet) > 11){
			newMonth = eval(tmpDate.getMonth() + offSet) - 12;
			newYear = eval(tmpDate.getFullYear() + 1);
		}else{
			newMonth = eval(tmpDate.getMonth() + offSet);
			newYear = tmpDate.getFullYear();			
		}
		tmpDate.setMonth(newMonth);
		tmpDate.setFullYear(newYear);		
		return tmpDate;
	}
	_cellOnClick = function(selectedDate){
		var dateObj = _getSelectedDateObj();
		dateObj.setDate(selectedDate);
		tgtObj.value = _formatDate(dateObj, _gDateFormat);
		_bodyOnClick();
	}
/* ------------------------------ update_month (+) ------------------------------ */	
	_construct_month = function(dateObj){
		var tmpDate = dateObj;
		var curDate = 1;
		var curMonth = tmpDate.getMonth();		
		var tableObj = document.getElementById('cdrTable');
		_monthSelectValue(dateObj, dateObj.getMonth()+1);
		_yearSelectUpdateOption(dateObj);
		_yearSelectValue(dateObj, dateObj.getFullYear());
		/* ------------------------------ date range restriction (+) ------------------------------ */			
		var stDateObj = '';
		var edDateObj = '';
		var todayDateObj = _today();
		_todayBtnUpdate('enabled');
		_eraserBtnUpdate(tgtObj);
		if(st != undefined && st != ''){
			if(st.indexOf(':') != -1)
				st = st.split(':')[0];
			if(st != ''){
				stDateObj = _formatDateToObject(st, _gDateFormat);				
				if(stDateObj.getTime() > todayDateObj.getTime()){
					_todayBtnUpdate('disabled');
				}
			}
		}

		if(ed != undefined && ed != ''){
			if(ed.indexOf(':') != -1)
				ed = ed.split(':')[0];
			if(ed != ''){
				edDateObj = _formatDateToObject(ed, _gDateFormat);
				if(edDateObj.getTime() < todayDateObj.getTime()){
					_todayBtnUpdate('disabled');
				}
			}
		}
		/* ------------------------------ date range restriction (-) ------------------------------ */		

		for(var i=2; i<=7; i++){
			for(var j=0; j<=6; j++){
				tmpDate.setDate(curDate);
				_curCellObj = tableObj.rows[i].cells[j];
				if(tmpDate.getDay() == j && curMonth == tmpDate.getMonth()){
					_curCellObj.childNodes[0].innerHTML = curDate;
					_curCellObj.className = cellClass;
					if(tmpDate.getDate() == _curDate()){
						if(eval(tmpDate.getMonth()+1) == _curMonth()){
							if(eval(tmpDate.getFullYear()) == _curYear())
								_curCellObj.className = 'today'; 
						}
					}
					if(tmpDate.getDate() == selectedDate){
						if(eval(tmpDate.getMonth()+1) == selectedMonth){
							if(eval(tmpDate.getFullYear()) == selectedFullYear)
								_curCellObj.className = 'selected'; 
						}						
					}
					_curCellObj.childNodes[0].href = 'javascript:_cellOnClick("'+curDate+'");void(0);';
					_curCellObj.childNodes[0].title = _formatDate(tmpDate, 'd mmmm, yyyy');
					/* ------------------------------ date range restriction (+) ------------------------------ */			
					if(stDateObj != ''){
						if(stDateObj.getTime() > tmpDate.getTime()){
							_curCellObj.className = 'disabled'; 
							_curCellObj.childNodes[0].href = 'javascript:void(0);';
						}
					}
					if(edDateObj != ''){
						if(edDateObj.getTime() < tmpDate.getTime()){
							_curCellObj.className = 'disabled'; 
							_curCellObj.childNodes[0].href = 'javascript:void(0);';
						}
					}
					/* ------------------------------ date range restriction (-) ------------------------------ */			
					curDate++;					
				}else{
					//not in current month.
					_curCellObj.childNodes[0].innerHTML = '&nbsp;';
					_curCellObj.childNodes[0].href = 'javascript:void(0);';
					_curCellObj.className = 'nullCell';
				}
			}
		}
	}
/* ------------------------------ update_month (-) ------------------------------ */	
/* ------------------------------ Buttons (+) ------------------------------ */			
	_todayBtnUpdate = function(sFlag){
		var todayBtnObj = document.getElementById('todayBtn');
		if(sFlag == 'enabled'){
			todayBtnObj.className = 'todayBtn'; 
			todayBtnObj.onclick = function(){
				_construct_month(_today());
				_cellOnClick(_curDate());
				void(0);
			}	
		}else{
			todayBtnObj.className = 'todayBtn_disabled'; 
			todayBtnObj.onclick = function(){
				void(0);
			}
		}
	}
	_eraserBtnUpdate = function(_tgtObj){
		var eraserBtnObj = document.getElementById('eraserBtn');
		eraserBtnObj.onclick = function(){
			_tgtObj.value = '';
			_bodyOnClick();
		}
	}	
	_eraserBtn = function(){
		var _btn = document.createElement('img');
		_btn.id = 'eraserBtn'
		_btn.className = 'eraserBtn';
		_btn.src = 'images/calendar/blank.png';
		_btn.title = 'Erase'
		_btn.onclick = function(){
			_tgtObj.value = '';
			_bodyOnClick();
		}
		return _btn;	
	}	
	_todayBtn = function(){
		var _btn = document.createElement('img');
		_btn.id = 'todayBtn'
		_btn.className = 'todayBtn';
		_btn.src = 'images/calendar/blank.png';
		_btn.title = 'Today'
		_btn.onclick = function(){
			_construct_month(_today());
			_cellOnClick(_curDate());
			void(0);
		}
		return _btn;	
	}
	_leftBtn = function(){
		var _btn = document.createElement('img');
		_btn.id = 'leftBtn'		
		_btn.className = 'leftBtn';
		_btn.src = 'images/calendar/blank.png';
		_btn.title = 'Previous'		
		_btn.onclick = function(){
			_construct_month(_getSelectedOffSetDateObj(-1));
		}
		return _btn;	
	}
	_rightBtn = function(){
		var _btn = document.createElement('img');
		_btn.id = 'rightBtn'				
		_btn.className = 'rightBtn';
		_btn.src = 'images/calendar/blank.png';
		_btn.title = 'Next'				
		_btn.onclick = function(){
			_construct_month(_getSelectedOffSetDateObj(1));
		}		
		return _btn;
	}
/* ------------------------------ Buttons (-) ------------------------------ */			

/* ------------------------------ Select (+) ------------------------------ */			
	_monthSelectCreate = function(dateObj){
		var _select = document.createElement('select');
		_select.className = 'monthSelect';
		_select.name = 'selMonth';
		_select.id = 'selMonth';		
		for(var i=0; i<=11; i++){
			var _option = document.createElement('option');
			_option.innerHTML = monthTxt[i];
			_option.value = eval(i+1);
			if(dateObj.getMonth() == i){	
				_option.selected = true; // highlight selected month
			}
			_select.appendChild(_option);			
		}
		_select.onchange = function(){
			_construct_month(_getSelectedDateObj());
		}				
		return _select;	
	}
	_monthSelectValue = function(dateObj, selectValue){
		var _select = document.getElementById('selMonth');
		for(var i=0; i<_select.options.length; i++){
			if(_select.options[i].value == selectValue){	
				_select.options[i].selected = true;
			}			
		}
	}	
	_yearSelectUpdateOption = function(dateObj){
		var _select = document.getElementById('selYear');
		var count = 0;
		for(var i=-_yearOffset; i<=_yearOffset; i++){			
			_select.options[count].innerHTML = eval(dateObj.getFullYear() + i);
			_select.options[count].value = eval(dateObj.getFullYear() + i);
			if(dateObj.getFullYear() == eval(dateObj.getFullYear() + i)){	
				_select.options[count].selected = true; // highlight selected year
			}
			count++;
		}
	}
	_yearSelectCreate = function(dateObj){
		var _select = document.createElement('select');
		_select.className = 'yearSelect';
		_select.name = 'selYear'; 
		_select.id = 'selYear';	
		for(var i=-_yearOffset; i<=_yearOffset; i++){			
			var _option = document.createElement('option');			
			_option.innerHTML = eval(_curYear() + i);
			_option.value = eval(_curYear() + i);
			if(dateObj.getFullYear() == eval(_curYear() + i)){	
				_option.selected = true; // highlight selected year
			}
			_select.appendChild(_option);
		}		
		_select.onchange = function(){
			_construct_month(_getSelectedDateObj());
		}			
		return _select;	
	}
	_yearSelectValue = function(dateObj, selectValue){
		var _select = document.getElementById('selYear');		
		for(var i=0; i<_select.options.length; i++){
			if(_select.options[i].value == selectValue){	
				_select.options[i].selected = true;
			}			
		}
	}
/* ------------------------------ Select (-) ------------------------------ */			

/* ------------------------------ Get Today (+) ------------------------------ */			
	_today = function(){
		var today = new Date();
		today.setHours(1);
		today.setMinutes(1);
		today.setSeconds(1);
		today.setMilliseconds(1);		
		return today; 	
	}
	_curYear = function(){
		var today = new Date();
		return today.getFullYear(); 	
	}
	_curMonth = function(){
		var today = new Date();
		return eval(today.getMonth() + 1); 	
	}	
	_curDate = function(){
		var today = new Date();
		return today.getDate(); 	
	}
/* ------------------------------ Get Today (-) ------------------------------ */			

	if(document.getElementById('cId') == undefined){ // create a div (cdr) at first time
		var newP = document.createElement('div');
		cdr = newP;		
		cdr.name = cdrName;
		cdr.id = cdrId;
		cdr.className = cdrClass;
		/* ------------------------------ build the dummy frame (+) ------------------------------ */				
		var cdrFrame = document.createElement('table');		
		var cdrUrl = document.createElement('a');
		cdrFrame.className = '';
		cdrFrame.id = 'cdrTable';
		cdrFrame.cellSpacing = 1;
		cdrFrame.cellPadding = 0;		
		for(var i=0; i<8; i++){
			cdrFrame.insertRow(-1);		
			for(var j=0; j<7; j++){
				if(i==0){
					cdrFrame.rows[i].insertCell(-1);					
					cdrFrame.rows[i].cells[j].colSpan = 7;
					cdrFrame.rows[i].cells[j].className = btnClass;					
					cdrFrame.rows[i].cells[j].appendChild(_leftBtn());
					cdrFrame.rows[i].cells[j].appendChild(_monthSelectCreate(_today()));
					cdrFrame.rows[i].cells[j].appendChild(_todayBtn());
					cdrFrame.rows[i].cells[j].appendChild(_eraserBtn());
					cdrFrame.rows[i].cells[j].appendChild(_yearSelectCreate(_today()));
					cdrFrame.rows[i].cells[j].appendChild(_rightBtn());					
					break;
				}
				cdrFrame.rows[i].insertCell(-1);				
				if(i==1){
					cdrFrame.rows[i].cells[j].className = hdrClass;
					cdrFrame.rows[i].cells[j].innerHTML = weekTxt[j];
				}else{
					var newCdrUrl = cdrUrl.cloneNode(true);
					newCdrUrl.href = 'javascript:void(0);';
					cdrFrame.rows[i].cells[j].appendChild(newCdrUrl);
//			cdrFrame.rows[i].cells[j].className = cellClass;
				}
			}
		}
		if(_browser('IE')){
			cdr.attachEvent('onclick', function(e){e.cancelBubble = true;});
		}else{
			cdr.addEventListener('click', function(e){e.cancelBubble = true;}, false);		
		}		
		cdr.appendChild(cdrFrame);
		window.document.onclick = _bodyOnClick;
		window.document.body.appendChild(cdr);
		/* ------------------------------ build the dummy frame (-) ------------------------------ */				
	}else{	// get div (cdr) if cdr has already created.
		cdr = document.getElementById('cId');
		cdr._show();	
	}
	cdr._resize = function(){
		this.style.width = cdrW + 'px';
		this.style.height = cdrH + 'px';
	}
	cdr._position = function(){
		if(docW < getRealPos(thisObj, 'x') + cdrW){
			this.style.left = parseInt(_getIconX()) + parseInt(thisObj.clientWidth) - cdrW + 'px';
		}else{
			this.style.left = parseInt(_getIconX()) + 'px';	
		}	
		if(docH < getRealPos(thisObj, 'y') + cdrH){
			this.style.top = parseInt(_getIconY()) - cdrH + 'px';
		}else{
			this.style.top = parseInt(_getIconY()) - cdrH + 'px';	
		}
	}	
	cdr._show = function(){
		this.style.display = '';
	}
	cdr._hide = function(){
		this.style.display = 'none';
	}
	cdr._build = function(){
		if(tgtObj.value != ''){		// have already selected a date
			var selDateObj = _formatDateToObject(tgtObj.value, _gDateFormat);
			selectedDate = selDateObj.getDate();
			selectedMonth = eval(selDateObj.getMonth()+1);
			selectedFullYear = eval(selDateObj.getFullYear());
			_construct_month(selDateObj);
		}else{ // haven't selected any date
			selectedDate = '';
			selectedMonth = '';
			selectedFullYear = '';
			_construct_month(_today());
		}
	}
	cdr._resize();
	cdr._position();
	cdr._build();
}
/*----------------------- calender (cdr) (-) -----------------------*/

































/*----------------------- check browser -----------------------*/
	function _browser(sType){
		// sType = IE, IE4, IE5, IE6, FF, Mac, Opera, NS, NS4, DOM	
		var _ub = navigator.userAgent.toUpperCase();
		switch(sType){
			case 'DOM':
				return (document.getElementById) ? true : false;
				break;
			case 'IE':
				return (_ub.indexOf('MSIE') != -1) ? true : false;
				break;
			case 'FF':
				return (_ub.indexOf('FIREFOX') != -1) ? true : false;
				break;				
			case 'NS':
				return (_ub.indexOf('NETSCAPE') != -1) ? true : false;
				break;		
			case 'SAFARI':
				return (_ub.indexOf('SAFARI') != -1) ? true : false;
				break;		
			case 'OPERA':
				return (_ub.indexOf('OPERA') != -1) ? true : false;
				break;
			default:
				return false;			
			 break;
		}
	}	
/*----------------------- check browser -----------------------*/
/*----------------------- get Object Position -----------------*/
function getRealPos(ELEMENT, DIR){
	var pos;
	(DIR=='x') ? pos=ELEMENT.offsetLeft : pos=ELEMENT.offsetTop;
	tempELEMENT=ELEMENT.offsetParent;
	while(tempELEMENT!=null)	{
		pos+=(DIR=='x')?tempELEMENT.offsetLeft:tempELEMENT.offsetTop;
		tempELEMENT=tempELEMENT.offsetParent;
	}
//	pos = (DIR=='x') ? pos : pos - document.body.scrollTop;    //for scrolling iframe
	return pos;
}
/*----------------------- get Object Position -----------------*/



















