(function($){
	var calendarDiv,inputObj,
		d = new Date,
		selectedMonth = d.getMonth(), // 0-11
		selectedYear = d.getFullYear(), // 4-digit year
		selectedDay = d.getDate(),
		pre,
		afterFn,
		formatDate = function (Day, Month, Year) {
			Month++; // adjust javascript month
			if (Month <10) Month = '0'+Month; // add a zero if less than 10
			if (Day < 10) Day = '0'+Day; // add a zero if less than 10
			var dateString = Year+'-'+Month+'-'+Day;
			return dateString;
		},
		setupLinks = function () {
        // set up link events on calendar table
			$('#calendar').bind("mouseover mouseout click",function(e){
				var o = e.srcElement || e.target;
				if(o.tagName == 'A'){
					if(e.type=='click'){
						$('#calendarDiv').hide();
						$(document).unbind('click',docClick);
						selectedDay = o.innerHTML;
						if(pre){
							var pVal = pre.split('-');
								cDate = new Date(selectedYear,selectedMonth,selectedDay).getTime(),
								pDate = new Date(pVal[0],pVal[1]-1,pVal[2]).getTime();
							if(pDate>cDate){
								alert('您选择的时间小于'+pre+',请重新选择！');
								return false;
							}
						}
						inputObj.val(formatDate(selectedDay,selectedMonth,selectedYear));
						afterFn&&afterFn.call(inputObj);
					}else{
						o.parentNode.className = e.type=="mouseover"?'weekDaysCellOver':'weekDaysCell';	
					}
					
					return false;
				}
				
			})
			
		},
		creCont = function(){
			var	daysInMonth = 32 - new Date(selectedYear, selectedMonth, 32).getDate(),
				startDay = new Date(selectedYear, selectedMonth, 0).getDay(),
				html = '<div id="top_calendar"><a id="clearCalendar" onclick="$.calendar.clear()" >清除</a><a id="closeCalendar" onclick=\'$("#calendarDiv").css("display","none")\' >关闭</a></div>'
					 + '<div id="linksTable" >'
					 + '<a id="prevMonth" onclick="$.calendar.pre();return false;" >上月</a>'
					 + '<a id="nextMonth" onclick="$.calendar.next();return false;">下月</a>'
					 + '</div>'
					 + '<table id="calendar" cellpadding="0" cellspacing="0"><tr>'
					 + '<th colspan="7" class="calendarHeader"><select onchange="$.calendar.changeMonth(this)">';
			for(var i=0;i<12;i++){
				var months = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'];
				html += '<option value='+i+' '+(selectedMonth==i?'selected':'')+'>'+months[i]+'</option>'
			}
			html += '</select><select onchange="$.calendar.changeYear(this)">';
			for(var i=0;i<65;i++){
				html += '<option '+(selectedYear==1950+i?'selected':'')+' value="'+(1950+i)+'" >'+(1950+i)+'</option>';
			}
			html +='</select></th></tr><tr class="weekDaysTitleRow">';
			for (var j=0,weekDays=['日','一','二','三','四','五','六'],ci;ci=weekDays[j++];) {
				html += '<td>'+ci+'</td>';
			};
			var numRows = 0,printDate = 1;
			if (startDay != 7) {
				numRows = Math.ceil(((startDay+1)+(daysInMonth))/7); // calculate the number of rows to generate
			}
			// calculate number of days before calendar starts
			 var noPrintDays = startDay != 7?startDay + 1:0,
				 today = d.getDate(),
				 thisMonth = d.getMonth(),
				 thisYear = d.getFullYear();
			// create calendar rows
			for (var e=0; e<numRows; e++) {
				html += '<tr class="weekDaysRow">';
				// create calendar days
				for (var f=0; f<7; f++) {
					if ( (printDate == today) 
						 && (selectedYear == thisYear) 
						 && (selectedMonth == thisMonth) 
						 && (noPrintDays == 0)) {
						html += '<td id="today" class="weekDaysCell">';
					} else {
						html += '<td class="weekDaysCell">';
					}
					if (noPrintDays == 0) {
						if (printDate <= daysInMonth) {
							html += '<a>'+printDate+'</a>';
						}
						printDate++;
					}
					html += '</td>';
					if(noPrintDays > 0) noPrintDays--;
				}
				html += '</tr>';
			}
			html += '</table>';
			html += '<!--[if lte IE 6.5]><iframe src="javascript:false;" id="calendar_cover"></iframe><![endif]-->';
			return html;
		},
		docClick = function(e,src){
			var t = $('#calendarDiv')[0];
			if(e.target!=src[0]&&(t.contains&&!t.contains(e.target)||t.compareDocumentPosition&&!(t.compareDocumentPosition(e.target)==20))){
				$('#calendarDiv').hide();
				$(document).unbind('click',docClick)
				
			}
		};
	$.calendar = function(evt,des,src,comp,fn){//跟comp比较
		//if(calendarDiv&&calendarDiv.css('display') == 'block')return;
		if(comp)pre = $('#'+comp).val();
		inputObj = $(typeof des == 'string'?'#'+des:des);
		src =  $(typeof src == 'string'?'#'+src:src);
		if(!calendarDiv){
			$(document.body).append('<div id="calendarDiv" style="width:180px;">'+creCont()+'</div>');
			calendarDiv = $('#calendarDiv');
			inputObj.bind('keydown',function(){return false});
			setupLinks();
			$(document).click(function(e){docClick(e,src)});
		};
		afterFn = fn;
		var p = src.offset();
		calendarDiv.css({top:p.top+src.height()+5+'px',left:p.left+'px',display:'block'});
		this.Event(evt).stopPropagation();
	};
    // setup next and previous links
	$.calendar.pre = function(){
		selectedMonth--;
		if (selectedMonth < 0) {
			selectedMonth = 11;
			selectedYear--;
		}
		$('#calendarDiv')[0].innerHTML = creCont();
		setupLinks();
	};
	$.calendar.next = function(){
		selectedMonth++;
		if (selectedMonth > 11) {
			selectedMonth = 0;
			selectedYear++;
		}
		$('#calendarDiv')[0].innerHTML = creCont();
		setupLinks();
	}
	$.calendar.changeYear = function(o){
		selectedYear = o.value*1;
		$('#calendarDiv')[0].innerHTML = creCont();
		setupLinks();
	}
	$.calendar.changeMonth = function(o){
		selectedMonth = o.value*1;
		$('#calendarDiv')[0].innerHTML = creCont();
		setupLinks();
	}
	$.calendar.clear = function(){
		inputObj.val('');
	}
	
})(jQuery)