﻿(function(){
/*
* 2010.06.22 补修篇
*  
* 1.$calendar("id").show();
*	
*/

var Calendar = window.$calendar = function( language, startYear, endYear ){
	if( window == this )
		return new Calendar( language, startYear, endYear );
	
		this.Date  	= new Date();
		this.Year  	= this.Date.getFullYear();
		this.Month 	= this.Date.getMonth();
		this.Week	= this.Date.getDay();
		this.Today	= this.Date.getDate();
		
		this.Language	= language 	|| 0;
		this.StartYear	= startYear || this.Year - 5;
		this.EndYear	= endYear 	|| this.Year + 1;
		
		this.popContainer_id =  'popCalendarContainer';
		
		// 存放信息的数组
		this.msgStore = [];
		
		this.caleContainer_id = 'calendarContainer';
		this.caleTop = {
			today_view_id:		'calendarTodayView',
			week_view_id:		'calendarWeekView',
			lq_year_id:			'linkQuickYear',
			lq_month_id:		'linkQuickMonth',
			sq_year_id:			'selectQuickYear',
			sq_month_id:		'selectQuickMonth',
			close_id:			'calendarClose',
			prev_month_id:		'toPrevMonth',
			back_today_id:		'backToday',
			next_month_id:		'toNextMonth'
		}
		this.daysContainer_id = 'calendarDaysContainer';
		this.msgContainer_id = 'calendarTipsContainer';
		
		this.curDayClass = 		'calendarCurrentDay';
		this.tipDayClass =		'calendarTipDay';
		this.oldTipDayClass =	'calendarOldTipDay';
};

var isIE = document.all? true: false;

/* 日历语言包 */
Calendar.lang = {
  weeks:  	[
  				["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
  				["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
  			],        
  weeksMenu:[
	 			["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
	       		["SUN","MON","TUR","WED","THU","FRI","SAT"]
          	]
};
/* 创建日历元素 */
Calendar.prototype._getViewElement = function(){
	var caleElem = "";
		caleElem+= '<div id='+this.caleContainer_id+'>';
		
		// <日历上部 - 显示日期部分>
		caleElem+= '<div id="calendarTopContainer"><table cellpadding="0" cellspacing="0"><tr>';

		// 链接和select 控制部分
		caleElem+= '<td id='+this.caleTop.week_view_id+'></td>';
		caleElem+= '<td id='+this.caleTop.week_view_id+'>';
		caleElem+= '<table id="calendarYearMonthContainer" cellpadding="0" cellspacing="0">';
		caleElem+= '<tr>';
		caleElem+= '<td id="linktopYearandMonth">';
		caleElem+= '<a id='+this.caleTop.lq_year_id+' href="javascript:void(0);"></a>';
		caleElem+= '</td>';
		caleElem+= '<td id="linktopYearandMonth">';
		caleElem+= '<select id='+this.caleTop.sq_year_id+'></select>';
		caleElem+= '</td>';
		caleElem+= '<td id="linktopYearandMonth">';
		caleElem+= '<a id='+this.caleTop.lq_month_id+' href="javascript:void(0);"></a>';
		caleElem+= '<select id='+this.caleTop.sq_month_id+'></select>';
		caleElem+= '</td>';
		caleElem+= '</tr>';
		caleElem+= '</table>';
		caleElem+= '</td>';
		// 上部 日期 部分
		caleElem+= '<td id='+this.caleTop.today_view_id+'></td>';
		
		// 快速切换到上下月或本月
		caleElem+= '<td>';
		//caleElem+= '<div id="calendarCloseContainer">';
		//caleElem+= '<a id='+this.caleTop.close_id+' href="javascript:void(0);" >x</a>';
		//caleElem+= '</div>';
		
		caleElem+= '<div id="calendarQuickContainer">';
		caleElem+= '<a id='+this.caleTop.prev_month_id+' href="javascript:void(0);">上月</a>';
		caleElem+= '<a id='+this.caleTop.back_today_id+' href="#"></a>';
		caleElem+= '<a id='+this.caleTop.next_month_id+' href="javascript:void(0);">下月</a>';
		caleElem+= '</div>';
		caleElem+= '</td>';
		
		caleElem+= '</tr></table cellpadding="0" cellspacing="0"></div>';
		// <上部创建结束>
		
		// <日历视图主体部分>
		caleElem+= '<div id="calendarMainContainer">';
		// 周 菜单
		caleElem+= '<div id="calendarWeeksContainer">';
		for(var i = 0; i < 7; i ++){
		caleElem+= '<span>'+Calendar.lang["weeksMenu"][this.Language][i]+'</span>';
		}
		caleElem+= '</div>';
		
		// 日期 视图
		caleElem+= '<table id='+this.daysContainer_id+' cellpadding="0" cellspacing="0">';
		for(var tr = 0; tr < 6; tr ++){
		caleElem+= '<tr>';
		for(var td = 0; td < 7; td ++){
		caleElem+= '<td><span></span></td>';
		}
		caleElem+= '</tr>';
		}
		caleElem+= '</table>';
		
		caleElem+= '</div>';
		// <日历主体部分创建结束>

		caleElem+= '</div>';
		
		// <日历提示部分 - 提供给 show() 方法>
		caleElem+= '<div id='+this.msgContainer_id+'></div>';
		// <日历提示部分创建结束>
		
	return caleElem;
};
/* 获取 月份 数据 */
Calendar.prototype._getMonthViewArray = function( year, month ){
	var monthArray = [],
		// 一周的开始
		beginDayOfWeek = new Date( year, month, 1).getDay(),
	
		// 该月总天数
		daysOfMonth = new Date( year, month + 1, 0).getDate();
	
	// 创建一个 7*6 的矩阵
	for( var i = 0; i < 42; i ++ )
	  monthArray[i] = "&nbsp;";
	  
	for( var j = 0; j < daysOfMonth; j ++ )
		monthArray[ j + beginDayOfWeek ] = j + 1 ;
		
	return monthArray;
};
/* 查找 某值 是在该select 中的索引值 */
Calendar.prototype._getOptionIndex = function( selectObject, value ){
	for( var j = 0; j < selectObject.options.length; j ++ ){
		if( value == selectObject.options[j].value )
			return j;
	}
};
/* 绑定 年 数据 */
Calendar.prototype._bindYearIntoSelect = function(){
	var oYear = this.find( this.caleTop.sq_year_id );
	var oYearLen = 0;
	for( var i = this.StartYear; i <= this.EndYear; i ++, oYearLen ++ )
		oYear.options[oYearLen] = new Option( i , i );
};
/* 绑定 月 数据 */
Calendar.prototype._bindMonthIntoSelect = function(){
	var oMonth = this.find( this.caleTop.sq_month_id );
	var oMonthLen = 0;
	for( var i = 0; i < 12; i ++, oMonthLen ++ )
		oMonth.options[oMonthLen] = new Option( i + 1 , i + 1 );
};
/* 绑定所有数据 */
Calendar.prototype._bindAllData = function( curYear, curMonth ){
	var cr = this;
 
	this._bindYearIntoSelect();
	
 	this._bindMonthIntoSelect();
 	 
	this.changeSelectValue( curYear, curMonth );
 	
 	// 绑定默认数据到日历面板上部分的 当天 和 周 部分中去
 	this.find( this.caleTop.today_view_id ).innerHTML = this.Today;
	this.find( this.caleTop.week_view_id ).innerHTML  = Calendar.lang['weeks'][this.Language][this.Week];
 	
 	// 获得日期并绑定到 日历主体 部分
 	var daysOfMonthArray = this._getMonthViewArray( curYear, curMonth ),
 	
 		spans 			 = this.find( this.daysContainer_id, "span" ),
 		
	 	curYMD 			 = this.Year + "" + ( this.Month + 1 ) + "" + this.Today,
	 	
		selectYear  	 = this.find( this.caleTop.sq_year_id ).value,
		
		selectMonth 	 = this.find( this.caleTop.sq_month_id ).value;
 	
 	
	
	for( var i = 0; i < spans.length; i ++ ){
		spans[i].innerHTML = daysOfMonthArray[i];
		
		var selectYMD = selectYear + "" + selectMonth + "" + spans[i].innerHTML;
		
		if( curYMD == selectYMD )
			spans[i].className = this.curDayClass;
		else
			spans[i].className = "";
	}
	
	if( this.msgStore != "" ) this._initPopMsg( this.msgStore );
}
/* 绑定所有事件 */
Calendar.prototype._bindAllEvent = function(){
	var cr = this;
	// 上月, 下月, 返回当天, 上部分当日视图 事件
	this.find( this.caleTop.prev_month_id ).onclick = function(){ cr.goPrevOrNextMonth(this); };
	this.find( this.caleTop.next_month_id ).onclick = function(){ cr.goPrevOrNextMonth(this); };
	this.find( this.caleTop.back_today_id ).onclick	= function(){ cr.backToday(); };
	this.find( this.caleTop.today_view_id ).onclick = function(){ cr.backToday(); };
	
	// 年月事件
	this.find( this.caleTop.sq_year_id ).onchange   = function(){ cr.updateSelect(); };
	this.find( this.caleTop.sq_month_id ).onchange	= function(){ cr.updateSelect(); };
	
	this.find( this.caleTop.lq_year_id ).onclick  = function(){ 
		cr.showOrHide( cr.caleTop.lq_year_id, "none" );
		cr.showOrHide( cr.caleTop.sq_year_id, "block" );
	};
	this.find( this.caleTop.lq_month_id ).onclick = function(){ 
		cr.showOrHide( cr.caleTop.lq_month_id, "none" );
		cr.showOrHide( cr.caleTop.sq_month_id, "block" );
	};
	
	var spans = this.find( this.daysContainer_id, "span" );
	for(var i = 0; i < spans.length; i ++){
		spans[i].onmouseover = function(){
			if( this.innerHTML != "&nbsp;" && this.className == "" )
				this.style.backgroundColor = "#f1f1f1";//光标指向的色块
				cr.showOrHide( cr.msgContainer_id, "none" );//移动后，消息框隐藏
		}
		spans[i].onmouseout = function(){
			if( spans[i].innerHTML != "&nbsp;" )
				this.style.backgroundColor = "";
				cr.showOrHide( cr.msgContainer_id, "none" );//移动后，消息框隐藏
		}
	}
	
	// 移除超链接默认虚线
	var oLink = this.find( this.caleContainer_id, "a" )
	for( var i = 0; i < oLink.length; i ++ ) oLink[i].onfocus  = function(){ this.blur(); }
}
Calendar.prototype._initCalendar = function(){
	this._bindAllEvent();
	this._bindAllData( this.Year, this.Month );
};
/* 改变快速选择年, 月的值 */
Calendar.prototype.changeSelectValue = function( year, month ){
	var ymArray = [], selectArray = [], linkArray = [];

	ymArray[0] = year; ymArray[1] = month + 1;
	
	selectArray[0] = this.caleTop.sq_year_id; 
	
	selectArray[1] = this.caleTop.sq_month_id;
	
	linkArray[0] = this.caleTop.lq_year_id; linkArray[1] = this.caleTop.lq_month_id;
	
	for( var i = 0; i < selectArray.length; i ++ ){
		var selectObject = this.find( selectArray[i] );
		
		var index = this._getOptionIndex( selectObject, ymArray[i] );
		// 重置年, 月下拉框的值
		selectObject.options[index].selected = "selected";
		
		// 重置年, 月超链接的值
		this.find( linkArray[i] ).innerHTML = selectObject.value;
	}
	
	this.resetLinkSelect();
};
/* 初始化年, 月下拉框和对应超链接的值 */
Calendar.prototype.resetLinkSelect = function(){
	this.showOrHide( this.caleTop.sq_year_id, "none" );
	this.showOrHide( this.caleTop.sq_month_id, "none" );
	this.showOrHide( this.caleTop.lq_year_id, "block" );
	this.showOrHide( this.caleTop.lq_month_id, "block" );
};
/* 选择上下月 */
Calendar.prototype.goPrevOrNextMonth = function( obj ){
	var curMonthSelect = this.find( this.caleTop.sq_month_id );
	var curMonth = parseInt( curMonthSelect.value );
	var curYear  = this.find( this.caleTop.sq_year_id ).value;

	if( obj.id == this.caleTop.next_month_id )
		curMonthSelect.value = curMonth + 1;
	else
		curMonthSelect.value = curMonth - 1;
		
	var getNowMonth = curMonthSelect.value - 1;

	if( getNowMonth == -1 && curMonth == 1) 	getNowMonth = 0;
	if( getNowMonth == -1 && curMonth == 12 ) 	getNowMonth = 11;
	
	this._bindAllData( curYear, getNowMonth );
};
/* 选择下拉框后更新日历数据 */
Calendar.prototype.updateSelect = function(){
	var yearSelectValue	 = this.find( this.caleTop.sq_year_id ).value;
	var monthSelectValue = this.find( this.caleTop.sq_month_id ).value;
	
	this._bindAllData( yearSelectValue, monthSelectValue - 1 );
	
};
/* 返回当天 */
Calendar.prototype.backToday = function(){
	this._bindAllData( this.Year, this.Month );
};
/* 根据ID 查找实例对象 */
Calendar.prototype.find = function( elemId, childTag ){
	if( !childTag )
		return document.getElementById( elemId );
	else
		return this.find( elemId ).getElementsByTagName( childTag );
};
Calendar.prototype.css = function( obj, options ){
	if( options && typeof options == 'object' ){
		for( var name in options ){
			var nameCase = name.replace(/\-(\w)/g, function($2, $1){
				return $1.toUpperCase();
			});
			obj.style[nameCase] = options[name];
			if( isIE && name == 'opacity' )
				obj.style.filter = 'alpha(opacity='+options["opacity"]*100+')';
		}
	}
}

Calendar.prototype.showOrHide = function( objectId, dis ){
	if(objectId==this.msgContainer_id){
		document.onmouseover = mouseCoords;
		this.css( this.find( this.msgContainer_id ), {position: "absolute", left: x + "px", top: y + "px"});
	}
	return this.find( objectId ).style.display = dis;
};

var exprElemClass = "calendar$focus", timer = null, isOutPanel = false;
var x;
var y;
function setX(xObject){
	x=xObject;
	x=10+x;
}
function setY(yObject){
	y=yObject;
	y=8+y;
}
function mouseCoords(ev){  
	ev = ev || window.event; 
	if(ev.pageX || ev.pageY){
		x=ev.pageX;
		y=ev.pageY;
	}else{
		/*if (self.pageYOffset) //FF
		{
		return self.pageYOffset;
		}*/
		if (document.documentElement && document.documentElement.scrollTop)// Explorer 6 Strict
		{
			x = ev.clientX + document.documentElement.scrollLeft - document.documentElement.clientLeft;           
			y = ev.clientY + document.documentElement.scrollTop  - document.documentElement.clientTop;
		}
		else if (document.body) // all other Explorers
		{
			x = ev.clientX + document.body.scrollLeft - document.body.clientLeft;           
			y = ev.clientY + document.body.scrollTop  - document.body.clientTop;
		}
	}
}
/* 方法一: 将日历插件加入实例元素中 */
Calendar.prototype.show = function( instanceId, msgData ){
	var obj = this.find( instanceId ), cr = this;
	if( obj ){
		obj.innerHTML = this._getViewElement();
		this._initCalendar();
		//cr.find( cr.caleTop.close_id ).onclick = function(){ cr.showOrHide( cr.caleContainer_id, "none" ); };
		if( typeof msgData == 'object'){
			this.msgStore = msgData;
			this._initPopMsg( this.msgStore );
			
			
			
			this.find( this.caleContainer_id ).onmouseover = this.find( this.msgContainer_id ).onmouseover = function(){
				isOutPanel = false;
			}
			this.find( this.caleContainer_id ).onmouseout = this.find( this.msgContainer_id ).onmouseout = function(){
				isOutPanel = true;
				hideMsgContainer( cr.msgContainer_id );
			}
		}
	}
};
/* 方法二: 将日历插件加入实例元素中 */
Calendar.prototype.showDay = function( instanceId, msgData ){
	var obj = this.find( instanceId ), cr = this;
	if( obj ){
		if( typeof msgData == 'object'){
			this.msgStore = msgData;
		
			var msgHtml="";
			for( var key in this.msgStore ){
				var keyMD = key.substring( 4 );//月日
				var keyY  = key.substring( 0, 4 );//年			
				var dateM,dateD;
				if(keyMD.length==4){
					dateM = keyMD.substr(0,2);//获取左边两个字符			
					dateD = keyMD.substr(keyMD.length-2,keyMD.length);//获取右边两个字符
				}else if(keyMD.length==3){
					//var isM = keyMD.substr(1,2);//获取右边二个字符
					//isM = isM.substr(0,1);//获取左边第一个字符

					//if(isM==0){
					//	dateM = keyMD.substr(0,2);//获取左边二个字符
					//	dateD = keyMD.substr(keyMD.length-1,keyMD.length);//获取右边两个字符
					//}else{
					//	dateM = keyMD.substr(0,2);//获取左边二个字符
					//	dateD = keyMD.substr(keyMD.length-1,keyMD.length);//获取右边两个字符
					//}
					dateM = keyMD.substr(0,1);//获取左边二个字符
					dateD = keyMD.substr(keyMD.length-2,keyMD.length);//获取右边两个字符
				}else{
					dateM = keyMD.substr(0,1);//获取左边一个字符
					dateD = keyMD.substr(keyMD.length-1,keyMD.length);//获取右边一个字符
				}
					var date = keyY + dateM+ dateD;
				
				
					var _dateInfo = keyY+"年"+ dateM+"月"+ dateD+"日";
					msgHtml += _dateInfo +"，价格："+this.msgStore[date]+"；";	
					
							
						
			}
			msgHtml=msgHtml.substring(0,msgHtml.length-1);
			cr.find( instanceId ).innerHTML =   '<div><p>开团日期：<span class="blue2">'+msgHtml+'</span></p></div>';
			cr.showOrHide( instanceId, "block" );
		}
	}
};
function hideMsgContainer( mid ){
	clearTimeout( timer );
	timer = setTimeout(function(){ 
			if( isOutPanel ) {
				document.getElementById(mid).style.display = "none"; 
			}
		}, 1000);
}
/* 初始化提示信息 */
Calendar.prototype._initPopMsg = function(){
	var cr = this;
	var selectYear  = this.find( this.caleTop.sq_year_id ).value;
	var selectMonth = this.find( this.caleTop.sq_month_id ).value;
	var daysOfMonthArray = this._getMonthViewArray( selectYear, selectMonth );
	var spans = this.find( this.daysContainer_id, "span" );
	for( var key in this.msgStore ){
		var keyMD = key.substring( 4 );//月日
		
		var keyY  = key.substring( 0, 4 );//年
		for( var i = 0; i < spans.length; i ++){
			var getMD = selectMonth + "" + spans[i].innerHTML;
			
			if( getMD == keyMD ){
				if( selectYear == keyY )
					spans[i].className = this.tipDayClass +" "+ keyY;
				else
					spans[i].className = this.oldTipDayClass +" "+ keyY;	
				
				spans[i].onmouseover = function(){
					var hoverDate = this.className.split(" ")[1] + "" + selectMonth + "" + this.innerHTML;
					var y = this.className.split(" ")[1],
						m = selectMonth,
						d = this.innerHTML;
				
					if( y ){
						cr.find( cr.msgContainer_id ).innerHTML = cr._getMsgHtml( y, m, d );
						cr.showOrHide( cr.msgContainer_id, "block" );
					}
				}
			}
		}
	}
};
/* 得到提示信息HTML 内容 */
Calendar.prototype._getMsgHtml =function( y, m, d ){
	var date = y + m + d;
	var showDate = y + "年" + m + "月" + d+ "日";
	var msgHtml = '<div>'+showDate+'</div><div>'+ this.msgStore[date] +'</div>';
	return msgHtml;
}

})();
