/**
 * Chinago Team Calander Library
 *
 * Chinago Copyright 2008 (R)
 * @author: miky.liang
 * @modified: 2008/11/23
 */
 
/**
 * 日历对象构造:工厂方法
 *
 */
function calInit() {
	/**
	 * Calander object
	 */
	$c = new Object;
	
	/**
	 * init all prototype
	 */
	$c.year 		= '';		//年
	$c.month 		= '';		//月
	$c.day 			= '';		//日
	$c.week 		= '';		//星期几
	$c.solar_cal	= '';		//阳历
	$c.day_offset	= '';		//周位置(1号从周几开始显示)
	$c.day_list		= '';		//整个月日期列表
	$c.curr_day		= '';		//今天：2008-11-23
	$c.today		= '';		//今天
	$c.day_total	= '';		//当前月共有几天
	$c.link_arr		= '';		//有链接的日期数组, array(2,5,18,23)
	$c.tid			= '';		//Team ID

	/**
	 * Const variables
	 */
	$c.min_year = 2007;			//最小年
	$c.max_year = 2038;			//最大年
	$c.link_url = "./memo.php?";		//链接URL
	$c.week_map = new Array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
	
	/**
	 * Page Id & Style List
	 */
	$c.id_day		= '_cal_day';
	$c.id_week  	= '_cal_week';
	$c.id_month 	= '_cal_month';
	$c.id_year  	= '_cal_year';
	$c.id_solar 	= '_cal_solar';
	$c.id_day_list 	= '_cal_day_list';

	$c.sty_today	= 'dangTan';
	//$c.sty_default	= 'blue';
	$c.sty_default	= '';
	$c.sty_invalid	= 'grey';
	$c.sty_link		= 'green';


	
	//------------------------
	//      外部方法
	//------------------------	

	/**
	 * 初始化函数
	 *
	 * @param string day 传递访问的哪天，例如：2008-11-18，如果不传入则默认为今天
	 * @param array link_arr 当月有备忘录的日期，array(2,5,18,23)
	 */
	$c.init = function (day, link_arr, tid) {
		var sDate, aDate;
		if (typeof(day) == 'undefined' || day == '' || arguments.length <= 0) {
			sDate = $c._getDate();
		} else if ($c._isDate(day)) {
			sDate = day;
		}
		if (sDate == '') {
			my_alert("Calendar init failed");
			return;
		}
		aDate = sDate.split('-');
		$c.year = aDate[0];
		$c.month = aDate[1];
		$c.day = aDate[2];
		
		$c.today = $c._getDate();
		$c.curr_day = sDate;
		$c.link_arr = typeof(link_arr)!='undefined'&&link_arr!='' ? link_arr : new Array();
		$c.tid = tid;

		$c.page();
	};


	/**
	 * 年份自增或自减
	 */
	$c.setYear = function (flag, callBack) {
		if (typeof(flag)=='undefined' || flag == '') {
			return;
		}
		if (flag > 0) {
			$c.year < $c.max_year ? $c.year++ : $c.year;
		} else {
			$c.year > $c.min_year ? $c.year-- : $c.year;
		}
		//调用回调函数取得链接数据
		callBack($c.year, $c.month);

		$c.page();
	};

	/**
	 * 月份自增或自减
	 */
	$c.setMonth = function (flag, callBack) {
		if (typeof(flag)=='undefined' || flag == '') {
			return;
		}
		if (flag > 0) {
			if ($c.month == 12) {
				$c.year < $c.max_year ? $c.year++ : $c.year;
				$c.month = 1;
			} else {
				$c.month++;
			}
		} else {
			if ($c.month == 1) {
				$c.year > $c.min_year ? $c.year-- : $c.year;
				$c.month = 12;
			} else {
				$c.month--;
			}
		}
		//调用回调函数取得链接数据
		callBack($c.year, $c.month);

		$c.page();
	};
	
	/**
	 * 设置某个月的链接数据
	 * 
	 * @param array arr 链接数据数组，类 array(1,2,5,19,27)
	 */
	$c.setLinkData = function (arr) {
		if (typeof(arr)=='undefined' || arr=='') {
			$c.link_arr = new Array();
		} else {
			$c.link_arr = arr;
		}
		$c.page();
	};

	//------------------------
	//       内部方法
	//------------------------	

	/**
	 * 更改反映到页面
	 */
	$c.page = function () {
		$c.setData($c.year, $c.month);
		$c.setPageVariable();
	};
	
	/**
	 * 初始化星期几、一个月几天
	 */
	$c.setData = function (year, month) {
		//初始化本月日期偏移
		$c.day_offset = $c._getWeekDay(year, month, 1);
		$c.day_total = $c._getDayTotal(year, month);
		$c.day_list = $c.getDayList($c.day_offset, $c.day_total);

		//初始化当前选定周几
		$c.week = $c.week_map[$c._getWeekDay($c.year, $c.month, $c.day)];
	};

	/**
	 * 设置页面值
	 */
	$c.setPageVariable = function () {
		$c._setHtml($c.id_day, $c.day);
		$c._setHtml($c.id_year, $c.year);
		$c._setHtml($c.id_month, $c.month);
		$c._setHtml($c.id_week, $c.week);
		$c._setHtml($c.id_solar, '');
		$c._setHtml($c.id_day_list, $c.day_list);
	};

	/**
	 * 获取要显示天列表HTML
	 */
	$c.getDayList = function (day_offset, day_total) {
		var s = '', i;
		for (i = 0; i < day_offset; i++) {
			s += '<li>&nbsp;</li>\n';
		}

		var today = $c.today.split('-'), date = '';
		var cls = $c.sty_default;
		for (i = 1; i <= day_total; i++) {
			if (today[0]==$c.year && today[1]==$c.month) {
				cls = today[2]==i ? $c.sty_today	: $c.sty_default;//今天样式
				cls = today[2]<i  ? $c.sty_invalid	: cls;			 //从今天到月底样式
			}
			//是否有链接
			if ($c._inArray(i, $c.link_arr)) {
				cls1 = $c.sty_link;	//链接样式
				date = "tid="+ $c.tid +"&y="+ $c.year +"&m="+ $c.month +"&d="+ i;
				//add
				if(cls==$c.sty_today){
					s += '<li><div class = '+ cls1 + '><a target="_blank" href="'+ $c.link_url + date +'">'+ i +'</a></div></li>\n';	
				}else{
					s += '<li class="'+ cls1 +'"><a target="_blank" href="'+ $c.link_url + date +'">'+ i +'</a></li>\n';
				}
			} else {
				if(cls==$c.sty_today)
				{
					s += '<li><div class="'+ cls +'">'+ i +'</div></li>\n';
				}
				else
				{
					s += '<li class="'+ cls +'">'+ i +'</li>\n';
				}
			}
			//恢复缺省样式
			cls = $c.sty_default;
		}
		return s;
	};
	
		
	//------------------------
	//       通用方法
	//------------------------	

	/**
	 * 计算某年某月共有几天
	 */
	$c._getDayTotal = function (year, month) {
		var is_leap_year = (year%4 == 0 && year%100 != 0) || (year%400 == 0) ? true : false;
		if (month == 2) {
			return is_leap_year ? 29 : 28;
		}
		return (month==2 || month==4 || month==6 || month==9 || month==11) ? 30 : 31;
	};
	
	/**
	 * 获取日期值 (内部方法)
	 * 
	 * @return 类似 2008-11-23 日期值
	 */
	$c._getDate = function (strDate) {
		var oDate;
		if (arguments.length <= 0) {
			oDate = new Date();
		} else if (arguments.length == 1) {
			oDate = new Date(strDate);
		} else {
			var year, month, day;
			for (var i = 0; i<arguments.lenght; i++){
				switch (i) {
					case 0: year = arguments[i]; break;
					case 1: month = arguments[i]; break;
					case 2: day = arguments[i]; break;
					default: ;					
				}							
			}
			oDate = new Date(year, month, day);
		}
		return oDate.getFullYear() +"-"+ (oDate.getMonth()+1) +"-"+ oDate.getDate();
	};

	/**
	 * 获取某一天是星期几 (0-6)
	 */
	$c._getWeekDay = function (year, month, day) {
		var i, j, count=0;
		var Day_Index;
		month = parseInt(month);
		day = parseInt(day);
		var days = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
		var MonthAdd = new Array(0,31,59,90,120,151,181,212,243,273,304,334);

		count = MonthAdd[month-1];
		count = count + day;

		if((year%4 == 0&&year %100 != 0||year % 400 == 0)&& month >= 3) {
		   count += 1;
		}
		count = count + (year - 1901) * 365;

		for(j = 1901; j < year; j++){
		   if(j % 4 == 0 && j % 100 != 0 || j % 400 == 0)
			   count++;
		} 
		return ((count+1) % 7);
	}

	/**
	 * 元素是否在一个数组中
	 */
	$c._inArray = function (mix, arr) {
		if (typeof(arr) == 'undefined' || arr == '') {
			return false;
		}
		for (var i = 0; i < arr.length; i++) {
			if (mix == arr[i]) {
				return true;;
			}
		}
		return false;
	}
	
	/**
	 * 检查是否是一个日期值
	 */
	$c._isDate = function (sDate) {
		return /^\d{4}\-\d{1,2}\-\d{1,2}$/.test(sDate);
	};
	
	/**
	 * 设置一个ID对象HTML值
	 */
	$c._setHtml = function (id, html) {
		document.getElementById(id).innerHTML = html;
	};
	 
	/**
	 * 设置一个ID对象的TEXT值
	 */
	$c._setText = function (id, text) {
		document.getElementById(id).innerText = text;
	};
	 
	
	/**
	 * 返回对象
	 */	
	return $c;
} 
 


/**
 * 自增/自减年份
 *
 */
function calSetYear(oCalendar, flag, callBack) {
	if (typeof(oCalendar) != 'object') {
		return;
	}
	oCalendar.setYear(flag, callBack);
}

/**
 * 自增/自减月份
 *
 */
function calSetMonth(oCalendar, flag, callBack) {
	if (typeof(oCalendar) != 'object') {
		return;
	}
	oCalendar.setMonth(flag, callBack);	
}




