
function MCalendar (varname , initdate) {
	
	if(typeof(initdate) == 'undefined')initdate = '';

	this.varname			= varname ;
	this.initdate			= initdate;
	this.lang				= ['Su','Mo','Tu','We','Th','Fr','Sa','Now','Time'];
	this.post               = true ;
	this.time				= false ;
	this.timestamp			= false ;
	this.readonly			= false ;

	

	var warp = document.createElement('div');
	warp.id = this.varname;
	warp.className = 'cal';
	
	this._make_btn = function(text , onclickhandler )
	{
		var e = document.createElement('input');
		e.type = 'button';
		e.value = text;
		e.onclick = onclickhandler;
		return e;
	}
	this.formatNumber = function (num)
	{
		if(num >= 10 ) return new Number(num).toString();
		else return '0'+new Number(num).toString();
	}
	this.formater = function (d)
	{
		if(this.timestamp)
		{
			return  Math.ceil(d.getTime()/1000);
		}

		if(this.time)
			return d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" " + this.formatNumber(d.getHours())+":"+this.formatNumber(d.getMinutes())+":"+this.formatNumber(d.getSeconds());
		else
			return d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate();
	}

	this.displayer = function (d)
	{
		if(this.time || this.timestamp)	
			return d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" " + this.formatNumber(d.getHours())+":"+this.formatNumber(d.getMinutes())+":"+this.formatNumber(d.getSeconds());
		else
			return d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate();
	}
	
	warp.setup = function(dspvar){
		this._layout.style.display = dspvar;
	};

	warp.closed = function ()
	{
		return this._layout.style.display.toLowerCase() == 'none' ;
	}

	warp.change = function(field,value)
	{
		var date = this.sdate.cloneDate();
			var year = parseInt(this._input_year.value,10);
			var month = parseInt(this._input_month.value,10);
			if(isNaN(year) || isNaN(month)) return 0;			
			
			if(value == '+1')
			{
				if(field == 'year') year ++ ;
				if(field == 'month') 
				{
					if(month + 1 >12)month = 1;
					else month++;
				}
			}
			else if(value == '-1')
			{
				if(field == 'year') year -- ;
				if(field == 'month')
				{
					if(month - 1 < 1) month = 12;
					else month -- ;
				}
			}
			

			if(year>0)date.setFullYear(year);
			date.setMonth(month -1 );
			this.draw(date);
	}

	warp.getValue = function()
	{
		return this.formater(this.sdate);
	}

	warp.getDateObject = function()
	{
		return this.sdate;
	}

	warp.draw = function (mydate)
	{
		if(typeof(mydate) == 'string') mydate = new Date.parserString(mydate);
		
		var year = mydate.getFullYear();
		var month = mydate.getMonth();

		var seldate = this.sdate;

		var min = new Date( year,month,1).getDay() + 1;//week
		var max = 30, currday = 1 ;
		if(new Date( year,month,31).getDate() == 31) max = 31;
		else if(new Date(year,month,30).getDate() == 30)max = 30;
		else if(new Date(year,month,29).getDate()== 29)max = 29;
		else max=28;

		var table = document.createElement('table');

		var tab = document.createElement('tbody');

		var tr,td,wk;
		tr = document.createElement('tr');
		for(i=0;i<7;i++)
		{
			td = document.createElement('th');
			td.innerHTML = this._langs[i];
			tr.appendChild(td);
		}

		tab.appendChild(tr);

		var tdOnClickFunc = function()
		{
			//this.calref.draw(this.d); 
			var tds = this.calref._screen.getElementsByTagName('td');
			for(i=0,j=tds.length;i<j;i++)
			{
				if(tds[i].className.length > 5)tds[i].className = tds[i].className.replace(/selected\b/,'');
			}//not draw
			this.className = 'selected '+this.className;
			this.calref.selectDate(this.d);
			
			this.calref.setup('None');
		}

		this._screen.innerHTML = '';
		var today = new Date();
		var ty = today.getFullYear() , tm = today.getMonth() , tday = today.getDate();
		

		for(var i = 1;i <= 42 ;i++)
		{
			if( i == 1 ) {tr = document.createElement('tr');}		
			if(i == min) {currday = 1;}
			if(i >= min && currday <= max )
			{
				td = document.createElement('td');
				td.innerHTML = '<a href="#;">'+currday+'</a>';
				
				td.calref = this;
				
				td.d = new Date(
					mydate.getFullYear(),mydate.getMonth(),currday,
					mydate.getHours(),mydate.getMinutes(),mydate.getSeconds() ,
					mydate.getMilliseconds()
				);			
				td.title = td.alt = mydate.getFullYear()+"-"+(mydate.getMonth()+1)+"-"+currday;
				td.onclick = tdOnClickFunc ;
				if(
					seldate.getFullYear() == td.d.getFullYear() &&
					seldate.getMonth() == td.d.getMonth()&&
					seldate.getDate() == td.d.getDate()
				)
                {
                    td.className = 'selected ';
                }
                
                if(
					ty == td.d.getFullYear() &&
					tm == td.d.getMonth()&&
					tday == td.d.getDate()
				)
                {
					td.title = td.alt = this._langs[7]+":"+td.alt;
                    td.className += 'today ';
                }
				
			}
			else
			{
				td = document.createElement('td');
				td.innerHTML = '&nbsp;';
			}

			wk = i%7;
			td.className += ' week'+wk;

			tr.appendChild(td);

			currday ++ ;
			if( wk == 0){
				tab.appendChild(tr);
				tr = document.createElement('tr');	
			}
		}
		table.appendChild(tab);
		this._screen.appendChild(table);
		this._input_year.value =year;
		this._input_month.value = month+1;
		//console.log('draw date :'+ mydate.toString());

	}
	
	warp.selectDate = function(date)
	{
		
	   if(typeof(date) == 'object')
	   {
	       this.sdate = date.cloneDate() ;
	   }
	   this._form.value = this.displayer(this.sdate);
	   this._post_form.value = this.formater(this.sdate);
	   this._input_year.value =this.sdate.getFullYear();
		this._input_month.value = this.sdate.getMonth()+1;
		this._form_hours.selectedIndex = this.sdate.getHours() ;
		this._form_minutes.selectedIndex = this.sdate.getMinutes() ;
		this._form_seconds.selectedIndex = this.sdate.getSeconds();
		//console.log('selected date :'+ this.sdate.toString());
	}



	
	this.dispose = function ()
	{
		//warp initlizine
		warp.formater	= this.formater ;
		warp.displayer	= this.displayer ;
		warp.formatNumber = this.formatNumber;
		warp._langs		= this.lang ;//apply lang str
		warp.time		= this.time;
		warp.timestamp	= this.timestamp;
		

		if(typeof(this.initdate) == 'object')
		{
			warp.sdate	= this.initdate;
		}
		else
		{
			warp.sdate	= new Date().parseString(this.initdate); 
		}

		//alert(warp.sdate);

		var sh = function()
		{
			if(this.parentNode.parentNode.closed())
				this.parentNode.parentNode.setup('inline');
			else
				this.parentNode.parentNode.setup('none');
		}
		
		//value post form
		warp._post_form = document.createElement('input');
		warp._post_form.type = 'hidden';
		if(this.post) warp._post_form.name = this.varname ;
		warp._post_form.value = warp.formater(warp.sdate);
		
		//form input		
		warp._form = document.createElement('input');
		warp._form.type = 'text';
		warp._form.size = '20';
		if(this.readonly) warp._form.readOnly= true;
		warp._form.value = this.displayer(warp.sdate);		
		warp._form.onchange = function()
		{
			var cal = this.parentNode.parentNode ;
			var date = new Date().parseString(this.value);			
			cal.selectDate(date);
			cal.draw(date);
		}
		warp._form.onclick = sh ;

		var p,e;

		
		//form button
		e = document.createElement('input');
		e.type = 'button';
		e.value = '...';
		
		e.onclick = sh;
		p = document.createElement('div');
		p.style.display = 'inline';
		p.appendChild(warp._post_form);
		p.appendChild(warp._form);
		p.appendChild(e);
		warp.appendChild(p);



		warp._layout = document.createElement('div');
		warp._layout.id			= this.varname+'_layout' ;
		warp._layout.className	= 'layout'
		warp._layout.style.position	= 'absolute';
		warp._layout.style.zIndex		= 1000 ;
		warp._layout.style.display	= 'inline' ;
		
		//year
		warp._input_year = document.createElement('input');
		warp._input_year.size= 5;
		warp._input_year.value = warp.sdate.getFullYear();
		warp._input_year.onchange = function(){this.parentNode.parentNode.change('','');};

		warp._layout.appendChild(this._make_btn('<',function(){this.parentNode.parentNode.change('year','-1');}));//year selector		
		warp._layout.appendChild(warp._input_year);
		warp._layout.appendChild(this._make_btn('>',function(){this.parentNode.parentNode.change('year','+1');}));
		//month
		warp._input_month = document.createElement('input');
		warp._input_month.size= 3;
		warp._input_month.value = warp.sdate.getMonth() +1 ;
		warp._input_month.onchange = function(){this.parentNode.parentNode.change('','');};
		warp._layout.appendChild(this._make_btn('<',function(){this.parentNode.parentNode.change('month','-1');}));//month selecter
		warp._layout.appendChild(warp._input_month);

		warp._layout.appendChild(this._make_btn('>',function(){this.parentNode.parentNode.change('month','+1');}));
		warp._layout.appendChild(this._make_btn(warp._langs[7],function(){
			var d = new Date();
			this.parentNode.parentNode.draw(d);
			}));
		
		//screen
		warp._screen = document.createElement('div');
		warp._screen.className = 'screen';
		warp._screen.style.display	= 'inline' ;	
		warp._layout.appendChild(warp._screen);

		//warp._status = document.createElement('div');		
		//warp._layout.appendChild(warp._status);
		warp._form_hours = document.createElement('select');
		warp._form_minutes = document.createElement('select');
		warp._form_seconds = document.createElement('select');

		//select update time
		var onselectfunc = function()
		{
			var cal = this.parentNode.parentNode.parentNode ;
			//for(prop in cal) console.log(prop + ' = '+cal[prop]);
			var d = cal.sdate.cloneDate();
			d.setHours(cal._form_hours.options[cal._form_hours.selectedIndex].value);
			d.setMinutes(cal._form_minutes.options[cal._form_minutes.selectedIndex].value);
			d.setSeconds(cal._form_seconds.options[cal._form_seconds.selectedIndex].value);
			cal.selectDate(d);
		}
		
		var i = 0
		for(; i<24;i++)
		{
			e = document.createElement('option');
			e.value = i;
			e.innerHTML = warp.formatNumber(i);
						if(i == warp.sdate.getHours()) e.selected = true;
			warp._form_hours.appendChild(e);
		}

		for(i=0 ; i<59;i++)
		{
			e = document.createElement('option');
			e.value = i;
			e.onchange = onselectfunc;
			e.innerHTML = warp.formatNumber(i);
			if(i == warp.sdate.getMinutes()) e.selected = true;
			warp._form_minutes.appendChild(e);
		}

		for(i=0 ; i<59;i++)
		{
			e = document.createElement('option');
			e.value = i;
			e.onchange = onselectfunc;
			e.innerHTML = warp.formatNumber(i);
			if(i == warp.sdate.getSeconds()) e.selected = true;
			warp._form_seconds.appendChild(e);
		}

		warp._form_hours.onchange = onselectfunc;
		warp._form_minutes.onchange = onselectfunc;
		warp._form_seconds.onchange = onselectfunc;

		p = document.createElement('div');
		if(!warp.time)p.style.display = 'None';

		p.appendChild(document.createTextNode(warp._langs[8]));
		p.appendChild(warp._form_hours);
		p.appendChild(document.createTextNode(':'));
		p.appendChild(warp._form_minutes);
		p.appendChild(document.createTextNode(':'));
		p.appendChild(warp._form_seconds);
		warp._layout.appendChild(p);

		warp.appendChild(warp._layout);

		//event handler
		var formClickHandler = function()
		{
			var cal = this.parentNode.parentNode;	
			var dateObj = new Date().parseString(cal._form.value);
			cal.change(dateObj.getFullYear() , dateObj.getMonth() , dateObj.getDate());
			cal.display();    
		}
		
		warp.draw(warp.sdate);
		warp.selectDate(warp.sdate);
		warp._layout.style.display	= 'None' ;
		//warp.style.width = '200px';

		if(arguments.length == 0 )
		{
			document.write('<div id="'+this.varname+'_warp" class="cal"></div>');
			document.getElementById(this.varname+'_warp').appendChild(warp);
		}
		else if(arguments.length == 1)
		{
			document.getElementById(arguments[0]).appendChild(warp);
		}
	}

}

