var CalendarData = new function(){
  //已经load过的的日历
  this.loadedClds = new Array();
  //选中的日历
  this.selectedClds = new Array();  
  
  
  this.loadCalendar = function(cid,year,month,fromFile)
  {
    var calendar = this.loadedClds[cid];
    if(!calendar)
      this.loadCalendarData(cid,year,month);
    else
    {
      if(calendar.isPublic)
        this.loadCalendarFile(cid);
      else
        this.loadCalendarData(cid,year,month);
    }
  } 

/*  
  //根据id读取日历
  this.loadCalendar = function(cid,year,month,fromFile)
  {
    var calendar = this.loadedClds[cid];
    
	if (!calendar) {
		$.ajax({
			async: false,
			type: 'GET',
			dataType: 'json',
			url: g_jsURL + cid + '.365',
			complete: function(xmlhttp) {
				calendar = CalendarData.parseJSONCalendar(xmlhttp.responseText);
				CalendarData.loadedClds[cid] = calendar;
				if (!calendar) {
					CalendarData.loadCalendarData(cid,year,month);
				}
			}
		});
	}
  }
  */
  
  //读取日历数据
  //ids: Array
  this.loadCalendarData = function(cid,year,month){
    postData("/loadCalendarDataAction.do","cid="+cid,this.handlerCldResponse,null,false,true);
  }

  //读取日历文件
  //path：路径
  this.loadCalendarFile = function(cid,id,sync){
    getData(g_jsURL+cid+".365","",this.handlerCldResponse,this.getFile404,false,true);//这里传入calendarId是为了失败后的getWtt404可以获取到    
  }
  
  //读取日历数据后处理
  this.handlerCldResponse = function(xmlhttp){
  	var calendar = CalendarData.parseJSONCalendar(xmlhttp.responseText);
    if(calendar)
      CalendarData.loadedClds[calendar.calendarID] = calendar;
    else
      window.alert("系统错误！");
  }
  
	this.parseJSONCalendar = function(s) {
		//json文件格式更改后的处理 by sunshow 2008.05.10
		var jsonText = s.replace(/^(var cld[0-9]+ = )?/, "");
		var calendar = JSON.parse(jsonText);
		return calendar;
	}
  
  //如果获取wtt数据失败，也就是日历被删除的情况
  this.getFile404 = function(xmlhttp,params){
    var id=params;
    //删除最近浏览
    removeRecentCalendar(id);
    //删除已选日历
    removeSelectedCalendar(id);
    //重新display最近浏览
    showRecentTab();
    window.alert("对不起，该日历已经被删除或者被用户设置为非公开！"+ id);
  }
  
  
  this.selectCalendar = function(cid)
  {
    //如果没有load过
    if(!this.loadedClds[cid])
    {
    	
    	this.loadCalendar(cid);
    }
    this.selectedClds[cid] = this.loadedClds[cid];
  }

  this.selectCalendarFromFile = function(cid)
  {
    //如果没有load过
    if(!this.loadedClds[cid])
    {
    	
    	 this.loadCalendarFile(cid);
    }
    this.selectedClds[cid] = this.loadedClds[cid];
  }

 
  
  this.unselectCalendar = function(cid){
    if(this.selectedClds[cid])
      this.selectedClds[cid]=null; 
  }

  //======在日历上显示该月的每日日程
  this.drawCalendarData = function ()
  {
  	log("drawCalendarData");
    closeDetail();
//    window.alert("drawCalendarData");
    var calendars = CalendarData.selectedClds;
    
    
    for(i=0;i<42;i++) 
    {
      var sD = i - g_cld.firstWeek + 1;//sD为日期
      if(sD>0 && sD<=g_cld.length) 
      {
        var day,week;
        sD<10?day="0"+sD:day=sD;//将dayOfMonth转换为两位数
        i%7==0?week=7:week=i%7;//获取日期
        var sObj=document.getElementById('SCHD'+ i);//显示日程信息的div
        sObj.innerHTML = "";//默认设置为无内容
        var dObj=document.getElementById("SD"+i);//显示日期的div
        
        var count=[];//计数器
        for(var j in calendars)
        {
          if(!calendars[j])	continue;
//          var schedules = calendars[j]['s'+g_cldYear+g_cldMonth];//当前年月的日程列表
          var schedules = this.getSchedules(calendars[j].calendarID,g_cldYear,g_cldMonth,day,week);//取当前年月当前年月的日程列表
            
          if(schedules.length>0)
          {
            if(!count[calendars[j].imageName])
            {
                count[calendars[j].imageName] = 1;
            }
            else
            {
              count[calendars[j].imageName]++;
            }
          }
        }
               
        var htmlString = '';
        var maxCount = 5;
        for(key in count)
        {
          if(maxCount == 0)
          {
            htmlString += '<font size="+1">...</font>';
            break;
          }
          htmlString += '<image width="16" height="16" src="/skin/icon/'+key+'">';
          maxCount--;
        }
        
         sObj.innerHTML = htmlString;
      }
    }
  }
  

  //显示日程列表
  this.showDetailData = function(day, week){
	  if (day < 10) 
	  	day = "0" + day;
	  this.dayOfMonth = day;
	  //显示日程					
	  var scheduleDisplays = this.getScheduleDisplays(day, week);
	  var htmlStrings = [];
	  var detailContent = '';
	  if (scheduleDisplays.length > 0) {
	  	var alldayHTML = [];
	  	var datetimeHTML = [];
	  	for (var i = 0; i < scheduleDisplays.length; i++) {
	  		var data = scheduleDisplays[i];
	  		//如果不存在以当前data.calendarID为键的数组数据，则添加日历头
	  		if (!htmlStrings[data.calendarID]) {
	  			var output = '<div class="calendarTitle"><div class="calendarName"><image src="/img/icon/' + data.imageName + '" style="margin-bottom:-3px">&nbsp;&nbsp;' + data.calendarName + '</div><div class="discuss" onclick="gotoBBS(' + data.calendarID + ')"></div>';
	  			if (data.isPublic) {
	  				output += '<div class="edit" onclick="window.open(\'/calendar/' + data.fileName + '.html\')"></div></div>';
	  			}
	  			else {
	  				output += '<div class="edit" onclick="openCld(' + data.calendarID + ')"></div></div>';
	  			}
	  			output += '<div class="scheduleListDiv"><table width="100%" border="0" cellpadding="0" cellspacing="0" class="scheduleListTable">';
	  			htmlStrings[data.calendarID] = output;
	  		}
	  		
	  		var scheduleHTML = '';
			var colspan = 0;
	  		if (data.allday) {
	  			scheduleHTML += '<tr><td width="40" align="center"><b>----</b></td>';
				//colspan = 1;
	  		}
	  		else {
	  			scheduleHTML += '<tr><td width="40" align="center"><b>' + data.hour + ':' + data.minute + '</b></td>';
	  		}
	  		
	  		//如果具有日历编辑权限
	  		if (g_user && g_user.permission && (g_user.permission > 1 || g_user.userId == data.userId)) {
	  			scheduleHTML += '<td colspan="' + (1 + colspan) + '"><span class="scheduleNote" onclick="gotoWeb(' + data.calendarID + ',' + data.schdId + ')">' + $.trim(data.note.replace(/ /g, "&nbsp;").replace(/\n/g, "<br />")) + '</span></td><td width="44"><img src="/img/edit.gif" width="16" height="16" class="imgBtn" onClick="EditScheduleForm.edit(' + data.calendarID + ',' + data.schdId + ')">　<img src="/img/del.gif" width="16" height="16" class="imgBtn" onClick="EditScheduleForm.remove(' + data.calendarID + ',' + data.schdId + ')"></td>';
	  		}
	  		else {
	  			scheduleHTML += '<td colspan="' + (2 + colspan) + '"><span class="scheduleNote" onclick="gotoWeb(' + data.calendarID + ',' + data.schdId + ')">' + $.trim(data.note.replace(/ /g, "&nbsp;").replace(/\n/g, "<br />")) + '</span></td>'
	  		}
	  		scheduleHTML += '</tr>';
	  		
	  		if (data.allday) {
	  			if (!alldayHTML['c' + data.calendarID]) {
	  				alldayHTML['c' + data.calendarID] = '';
	  			}
	  			alldayHTML['c' + data.calendarID] += scheduleHTML;
	  		} else {
				if (!datetimeHTML['c' + data.calendarID]) {
	  				datetimeHTML['c' + data.calendarID] = '';
	  			}
	  			datetimeHTML['c' + data.calendarID] += scheduleHTML;
			}
	  	}
	  	
	  	for (key in htmlStrings) {
			if (alldayHTML['c' + key]) {
				htmlStrings[key] += alldayHTML['c' + key];
			}
			if (datetimeHTML['c' + key]) {
				htmlStrings[key] += datetimeHTML['c' + key];
			}
	  		htmlStrings[key] += '</table></div>';
	  	}
	  	for (key in htmlStrings) {
	  		detailContent += htmlStrings[key];
	  	}
	  }
	  showDetailPane(detailContent);
  }

  
  this.getCalendar = function(cid){
    if(!this.loadedClds[cid]){
      this.loadCalendar(cid);
    }
    return this.loadedClds[cid];
  }
  
  this.loadSchedules = function(cid,year,month)
  {
    var calendar = this.getCalendar(cid);    
    //如果没有schedules则直接load全部schedules
    if(!calendar.schedules){
      this.loadCalendar(cid,year,month);
    }
    //如果没有year和month，则返回
    if(!(year&&month))
      return;
    //有year和month，则对schedules进行处理
    calendar = this.getCalendar(cid);
    var schedules = calendar.schedules;
    var s = new Array();
    var schedule = null;
    if (schedules) {
	    for(var i=0;i<schedules.length;i++){
	      schedule = schedules[i];
	      if((schedule.year == '*' || schedule.year == year) && (schedule.month == '*' || schedule.month == month)){
	        s[s.length] = schedule;
	      }
	    }
    }
    calendar['s'+year+month] = s;
  }


  this.getSchedules = function(cid,year,month,day,week)
  {
    var calendar = this.getCalendar(cid);
    //如果没有year和month，则直接传回全部schedules，并且calendar.schedules不为空
    if(!(year&&month))
    {
      //如果schedules为空，则重新load
      if(!calendar.schedules)
      {
        this.loadSchedules(cid,year,month);
        calendar = this.getCalendar(cid);         
      }
      return calendar.schedules;
    }
    
    //如果年月schedules不存在，则重新loadSchedule
    if(!calendar['s'+year+month])
    {
      this.loadSchedules(cid,year,month);
      calendar = this.getCalendar(cid);
    }
    var schedules = calendar['s'+year+month];
    //如果传入了参数day和week
    if(day&&week)
    {
      var rs = new Array();
      var schedule = null;
      for(var i=0;i<schedules.length;i++)
      {
        schedule = schedules[i];
        if((schedule.dayOfMonth == "*"||schedule.dayOfWeek == "*")||
           (schedule.dayOfMonth !=null&&schedule.dayOfMonth.indexOf(day)>-1)||
           (schedule.dayOfWeek != null&&schedule.dayOfWeek.indexOf(week)>-1)
          )
          rs[rs.length] = schedule;
      }
      schedules = rs;
    }
    return schedules;
  }

  
  this.getScheduleDisplays = function(day,week){
    //将schedules中对象取有用的数据建立schedule对象，并排序显示          
    var schedules = new Array();
    var scheduleDisplays = new Array();
    var calendars = this.selectedClds;
    var calendar = null;
    for(var x in calendars){
      calendar = calendars[x];
      if(!calendar)
        continue;
      schedules = this.getSchedules(calendar.calendarID,g_cldYear,g_cldMonth,day,week);
              
      var schedule;
      for(var i=0;i<schedules.length;i++){
        schedule = schedules[i];
        var hourArray = schedule.hour.split(",");
        for(var j=0;j<hourArray.length;j++){
          var minuteArray = schedule.minute.split(",");
          for(var k=0;k<minuteArray.length;k++){
            scheduleDisplays[scheduleDisplays.length] = new DayScheduleDisplay(schedule.sid,schedule.userId,hourArray[j],minuteArray[k],schedule.note,calendar.calendarID,calendar.imageName,calendar.calendarName,calendar.isPublic,calendar.fileName,schedule.allday);          
          }
        }                
      }      
    }    
     scheduleDisplays.sort(sortDaySchedules);      
    return scheduleDisplays;
  }
  
  this.findSchedule = function(cid,sid){
    var schedules = this.getSchedules(cid);
    var i=0;
    var len = schedules.length;
    for(;i<len;i++){
      if(sid == schedules[i].sid)
        return schedules[i];
    }
    return null;
  }

  
  this.addSchedule = function(schedule){
    var cld = this.getCalendar(schedule.calendarID);
    //如果是高级模式的日程，则需要重新load日历
    if(schedule.year=='*'||schedule.month=='*'){
      this.loadCalendar(schedule.calendarID);
      return;
    }

    var schedules = cld.schedules;
    //如果有load出来的schedules，则加入新的
    if(schedules)
      schedules[schedules.length] = schedule;
    //如果没有，说明没有load，需要重新load,重新load后不用添加
    else{
      this.loadSchedules(schedule.calendarID,schedule.year,schedule.month);
      return;
    }
    //如果有按月排好的scheduls，则加入    
    schedules = cld['s'+schedule.year+schedule.month];
    if(schedules)
      schedules[schedules.length] = schedule;    
  }

  this.updateSchedule = function(schedule){
    var cld = this.getCalendar(schedule.calendarID);
    //如果是高级模式的日程，则需要重新load日历
    if(schedule.year=='*'||schedule.month=='*'){
      this.loadCalendar(schedule.calendarID);
      return;
    }

    var schedules = cld.schedules;
    //如果有load出来的schedules，则更新
    if(schedules){
      var i=0;
      var len = schedules.length;
      for(;i<len;i++){
        if(schedule.sid == schedules[i].sid){
          schedules[i] = schedule;
          break;
        }
      }
    }
    //如果没有，说明没有load，需要重新load,重新load后不用添加
    else{
      this.loadSchedules(schedule.calendarID,schedule.year,schedule.month);
      return;
    }
    //如果有按月排好的scheduls，则加入    
    schedules = cld['s'+schedule.year+schedule.month];
    if(schedules){
      var i=0;
      var len = schedules.length;
      for(;i<len;i++){
        if(schedule.sid == schedules[i].sid){
          schedules[i] = schedule;
          break;
        }
      }
    }
  }

  this.removeSchedule = function(cid,sid){
    var cld = this.getCalendar(cid);
    if(!(cld&&cld.schedules))
      return;

    var schedules = cld.schedules;
    var i=0;
    var len = schedules.length;
    var schedule;
    for(;i<len;i++){
      if(schedules[i].sid == sid){
        schedule = schedules[i];
        for(var j=i;j<len;j++){
          schedules[j]=schedules[j+1];
        }
        schedules.length = schedules.length-1;
        break;
      }
    }
    
    //如果有按月排好的scheduls，则删除
    schedules = cld['s'+schedule.year+schedule.month];
    if(schedules){
      var i=0;
      var len = schedules.length;
      for(;i<len;i++){
        if(schedule.sid == schedules[i].sid){
          for(var j=i;j<len;j++){
            schedules[j]=schedules[j+1];
          }
          schedules.length = schedules.length-1;
          break;
        }
      }
    }
  }


  
}


//start--------------用于存储日程的类---------------*/
function Schedule(sid,year,month,dayOfMonth,dayOfWeek,hour,minute,note,imageName,calendarName){
  this.sid = sid;
  this.year = year;
  this.month = month;
  this.dayOfMonth = dayOfMonth;
  this.dayOfWeek = dayOfWeek;
  this.hour = hour;
  this.minute = minute;
  this.note = note;
  this.imageName = imageName;
  this.calendarName = calendarName;
  
  this.hasDay = function(day,week){
    if(this.dayOfMonth == "*"||this.dayOfWeek == "*") return true;
    if(this.dayOfMonth !=null&&this.dayOfMonth.indexOf(day)>-1) return true;
    if(this.dayOfWeek != null&&this.dayOfWeek.indexOf(week)>-1) return true;
    return false;
  }
}
//end------------------*/


//start----------------用于显示某一天日程的对象，以及排序的方法*/
function DayScheduleDisplay(schdId,userId,hour,minute,note,cId,imageName,calendarName,isPublic,fileName, allday){
  this.schdId = schdId;
  this.userId = userId;
  this.hour = hour;
  this.minute = minute;
  this.note = note;
  this.calendarID = cId;
  this.imageName = imageName;
  this.calendarName = calendarName;
  this.isPublic = isPublic;
  this.fileName = fileName;
  this.allday = allday;
}
function sortDaySchedules(schedule1,schedule2){
  if(schedule1.hour > schedule2.hour)
    return 1;
  else if(schedule1.hour < schedule2.hour)
    return -1;
  else
    if(schedule1.minute >= schedule2.minute)
      return 1;
    else
      return -1;
}
//end-------------------*/
