MWF.require("MWF.widget.Calendar", null, false); MWF.xApplication.Meeting.WeekView = new Class({ Extends: MWF.widget.Common, Implements: [Options, Events], options: { "style": "default", "date" : "" }, initialize: function(node, app, options){ this.setOptions(options); this.path = "../x_component_Meeting/$WeekView/"; this.cssPath = "../x_component_Meeting/$WeekView/"+this.options.style+"/css.wcss"; this._loadCss(); this.app = app; this.container = $(node); this.weekBegin = this.app.meetingConfig.weekBegin || "0"; this.load(); }, load: function(){ this.node = new Element("div", {"styles": this.css.node}).inject(this.container); //this.loadSideBar(); this.resetNodeSize(); this.app.addEvent("resize", this.resetNodeSize.bind(this)); this.loadCalendar(); }, resetNodeSize: function(){ var size = this.container.getSize(); var y = size.y-60; this.node.setStyle("height", ""+y+"px"); if( !this.app.inContainer ){ this.node.setStyle("margin-top", "60px"); } var sideBarSize = this.app.sideBar ? this.app.sideBar.getSize() : { x : 0, y:0 }; this.node.setStyle("width", ""+(size.x - sideBarSize.x)+"px"); this.node.setStyle("margin-right", ""+sideBarSize.x+"px"); //var size = this.container.getSize(); // //this.scrollNode.setStyle("height", ""+(size.y-60)+"px"); //this.scrollNode.setStyle("margin-top", "60px"); // //if (this.contentWarpNode){ // this.contentWarpNode.setStyles({ // "width": (size.x - 50) +"px" // }); //} }, loadCalendar: function(){ var date = ""; if( this.options.date ){ date = Date.parse( this.options.date ) }else{ date = new Date(); } this.currentWeek = this.getWeekNumber( date ); this.calendar = new MWF.xApplication.Meeting.WeekView.Calendar(this, date ); }, hide: function(){ var fx = new Fx.Morph(this.node, { "duration": "300", "transition": Fx.Transitions.Expo.easeOut }); fx.start({ "opacity": 0 }).chain(function(){ this.node.setStyle("display", "none"); }.bind(this)); }, show: function(){ this.node.setStyles(this.css.node); if( this.app.inContainer ){ this.node.setStyles({ "opacity": 1, "position": "static", "width": "auto" }); }else{ var fx = new Fx.Morph(this.node, { "duration": "800", "transition": Fx.Transitions.Expo.easeOut }); this.app.fireAppEvent("resize"); fx.start({ "opacity": 1, "left": "0px" }).chain(function(){ this.node.setStyles({ "position": "static", "width": "auto" }); }.bind(this)); } }, reload: function(){ if (this.calendar) this.calendar.reLoadCalendar(); }, recordStatus : function(){ return { date : (this.calendar && this.calendar.baseDate) ? this.calendar.baseDate.format("db") : "" }; }, destroy: function(){ if (this.calendar){ this.calendar.destroy(); } this.node.destroy(); //MWF.release( this ); }, getWeekNumber: function(d){ // Create a copy of this date object var target = d.clone(); // ISO week date weeks start on monday // so correct the day number //var dayNr = (d.getDay() + 6) % 7; var dayNr = ( 7 + d.getDay() - parseInt( this.weekBegin ) ) % 7; // ISO 8601 states that week 1 is the week // with the first thursday of that year. // Set the target date to the thursday in the target week target.setDate(target.getDate() - dayNr + 3); // Store the millisecond value of the target date var firstThursday = target.valueOf(); // Set the target to the first thursday of the year // First set the target to january first target.setMonth(0, 1); // Not a thursday? Correct the date to the next thursday if (target.getDay() != 4) { target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7); } // The weeknumber is the number of weeks between the // first thursday of the year and the thursday in the target week return 1 + Math.ceil((firstThursday - target) / 604800000); // 604800000 = 7 * 24 * 3600 * 1000 } }); MWF.xApplication.Meeting.WeekView.Calendar = new Class({ Implements: [Events], initialize: function(view, date){ this.view = view; this.css = this.view.css; this.container = this.view.node; this.app = this.view.app; this.weekBegin = this.app.meetingConfig.weekBegin || "0"; this.baseDate = date || new Date(); this.today = new Date(); this.days = {}; this.load(); }, load: function(){ this.date = this.getWeekBeginDate( this.baseDate ); this.titleNode = new Element("div", {"styles": this.css.calendarTitleNode}).inject(this.container); this.scrollNode = new Element("div", { "styles": this.app.inContainer ? this.css.scrollNode_inContainer : this.css.scrollNode }).inject(this.container); this.contentWarpNode = new Element("div", { "styles": this.css.contentWarpNode }).inject(this.scrollNode); this.contentContainerNode = new Element("div",{ "styles" : this.css.contentContainerNode }).inject(this.contentWarpNode); this.bodyNode = new Element("div", { "styles": this.css.contentNode }).inject(this.contentContainerNode); //this.bodyNode = new Element("div", {"styles": this.css.calendarBodyNode}).inject(this.container); this.setTitleNode(); this.listRoom( function(){ this.setBodyNode(); }.bind(this) ); this.resetBodySize(); this.app.addEvent("resize", this.resetBodySize.bind(this)); }, getWeekBeginDate: function( d ){ var date = d.clone(); //var week = date.getDay(); //if( this.weekBegin == "1" ){ // var decrementDay = ((week-1)<0) ? 6 : week-1; //}else{ // var decrementDay = week; //} var decrementDay = ( 7 + d.getDay() - parseInt( this.weekBegin ) ) % 7; return date.decrement("day", decrementDay); }, resetBodySize: function(){ //if( this.app.inContainer )return; var size = this.container.getSize(); var titleSize = this.titleNode.getSize(); var y = size.y-titleSize.y; //this.bodyNode.setStyle("height", ""+y+"px"); //var size = this.container.getSize(); this.scrollNode.setStyle("height", ""+y+"px"); //this.scrollNode.setStyle("margin-top", "60px"); if (this.contentWarpNode){ this.contentWarpNode.setStyles({ "width": (size.x - 40) +"px" }); } //var tdy = (y-30)/6; //tdy = tdy-34; //var tds = this.calendarTable.getElements("td"); //tds.each(function(td){ // var yy = tdy; // var node = td.getLast("div"); // if (node.childNodes.length>=4){ // if (yy<92) yy = 69; // } // node.setStyle("height", ""+yy+"px"); //}.bind(this)); }, setTitleNode: function(){ this.prevWeekNode = new Element("div.o2icon-triangle_left", {"styles": this.css.calendarPrevWeekNode}).inject(this.titleNode); // var text = this.baseDate.format(this.app.lp.dateFormatMonth) // + ",第" + this.view.getWeekNumber( this.baseDate ) + "周"; var month = this.baseDate.format(this.app.lp.dateFormatMonth); var week = this.view.getWeekNumber( this.baseDate ); var text = this.app.lp.weeklyViewTitle.replace("{month}", month ).replace("{week}",week); this.titleTextNode = new Element("div", {"styles": this.css.calendarTitleTextNode, "text": text}).inject(this.titleNode); this.nextWeekNode = new Element("div.o2icon-triangle_right", {"styles": this.css.calendarNextWeekNode}).inject(this.titleNode); this.prevWeekNode.addEvents({ "mouseover": function(){ this.prevWeekNode.setStyles(this.css.calendarPrevWeekNode_over); this.prevWeekNode.addClass("mainColor_color"); }.bind(this), "mouseout": function(){ this.prevWeekNode.setStyles(this.css.calendarPrevWeekNode); this.prevWeekNode.removeClass("mainColor_color"); }.bind(this), "mousedown": function(){this.prevWeekNode.setStyles(this.css.calendarPrevWeekNode_down);}.bind(this), "mouseup": function(){this.prevWeekNode.setStyles(this.css.calendarPrevWeekNode_over);}.bind(this), "click": function(){this.changeWeekPrev();}.bind(this) }); this.nextWeekNode.addEvents({ "mouseover": function(){ this.nextWeekNode.setStyles(this.css.calendarNextWeekNode_over); this.nextWeekNode.addClass("mainColor_color"); }.bind(this), "mouseout": function(){ this.nextWeekNode.setStyles(this.css.calendarNextWeekNode); this.nextWeekNode.removeClass("mainColor_color"); }.bind(this), "mousedown": function(){this.nextWeekNode.setStyles(this.css.calendarNextWeekNode_down);}.bind(this), "mouseup": function(){this.nextWeekNode.setStyles(this.css.calendarNextWeekNode_over);}.bind(this), "click": function(){this.changeWeekNext();}.bind(this) }); this.titleTextNode.addEvents({ "mouseover": function(){ this.titleTextNode.setStyles(this.css.calendarTitleTextNode_over); this.titleTextNode.addClass("mainColor_color"); }.bind(this), "mouseout": function(){ this.titleTextNode.setStyles(this.css.calendarTitleTextNode); this.titleTextNode.removeClass("mainColor_color"); }.bind(this), "mousedown": function(){this.titleTextNode.setStyles(this.css.calendarTitleTextNode_down);}.bind(this), "mouseup": function(){this.titleTextNode.setStyles(this.css.calendarTitleTextNode_over);}.bind(this) //"click": function(){this.changeWeekSelect();}.bind(this) }); this.createWeekSelector(); }, changeWeekPrev: function(){ this.date.decrement("week", 1); this.baseDate = this.date; // var text = this.baseDate.format(this.app.lp.dateFormatMonth) + ",第" + this.view.getWeekNumber( this.baseDate ) + "周"; var month = this.baseDate.format(this.app.lp.dateFormatMonth); var week = this.view.getWeekNumber( this.baseDate ); var text = this.app.lp.weeklyViewTitle.replace("{month}", month ).replace("{week}",week); this.titleTextNode.set("text", text); this.reLoadCalendar(); }, changeWeekNext: function(){ this.date.increment("week", 1); this.baseDate = this.date; var month = this.baseDate.format(this.app.lp.dateFormatMonth); var week = this.view.getWeekNumber( this.baseDate ); var text = this.app.lp.weeklyViewTitle.replace("{month}", month ).replace("{week}",week); // var text = this.baseDate.format(this.app.lp.dateFormatMonth) + ",第" + this.view.getWeekNumber( this.baseDate ) + "周"; this.titleTextNode.set("text", text); this.reLoadCalendar(); }, changeWeekSelect: function(){ if (!this.monthSelector) this.createWeekSelector(); //this.monthSelector.show(); }, createWeekSelector: function(){ //this.monthSelector = new MWF.xApplication.Meeting.WeekView.Calendar.WeekSelector(this.date, this); this.weekCalendar = new MWF.xApplication.Meeting.WeekView.WeekCalendar(this.titleTextNode, { "style":"meeting_blue", "weekBegin" : this.weekBegin, "target": this.node, "baseDate" : this.baseDate, "onInit" : function(){ this.options.dayPath = this.options.path+this.options.style+"/day_week.html"; }, "onQueryComplate": function(e, dv, date){ var selectedDate = new Date.parse(dv); this.changeWeekTo(selectedDate); }.bind(this) }); //this.weekCalendar.app = this.app; }, changeWeekTo: function(d){ this.baseDate = d; this.date = this.getWeekBeginDate( d ); //var text = this.date.format(this.app.lp.dateFormatWeek); //this.titleTextNode.set("text", text); var month = this.baseDate.format(this.app.lp.dateFormatMonth); var week = this.view.getWeekNumber( this.baseDate ); var text = this.app.lp.weeklyViewTitle.replace("{month}", month ).replace("{week}",week); // var text = this.baseDate.format(this.app.lp.dateFormatMonth) + ",第" + this.view.getWeekNumber( this.baseDate ) + "周"; this.titleTextNode.set("text", text); this.reLoadCalendar(); }, listRoom : function( callback ){ this.app.actions.listBuilding( function( json ){ json.data.push({ id: "noRoom", name: "noRoom", roomList: [{ id: "noRoom", name: "noRoom", available: true }] }); this.bulidingData = json.data; if(callback)callback(); }.bind(this) ) }, setBodyNode: function(){ this.roomTooltips = []; this.roomTrMap = {}; //var html = ""+this.app.lp.room+""+this.app.lp.weeks.Mon+""+this.app.lp.weeks.Tues+""+this.app.lp.weeks.Wed+"" + // ""+this.app.lp.weeks.Thur+""+this.app.lp.weeks.Fri+""+this.app.lp.weeks.Sat+""+this.app.lp.weeks.Sun+""; //html += ""; //html += ""; //html += ""; //html += ""; //html += ""; //html += ""; this.calendarTable = new Element("table", { "styles": this.css.calendarTable, "height": "100%", "border": "0", "cellPadding": "0", "cellSpacing": "0" }).inject(this.bodyNode); this.loadTableHead(); this.bulidingData.each( function( buliding ){ buliding.roomList.each( function( room ){ var tr = new Element( "tr").inject( this.calendarTable ); if( buliding.id === "noRoom" ){ tr.set("noRoom", "yes") this.noRoomTr = tr; } var td = new Element( "td", { "tdType" : "room" } ).inject( tr ); var node = new Element("div",{ //text : room.name, styles : this.css.calendarTableCell_room }).inject( td ); td.store("room",room ); for( var i=0; i<7; i++ ){ new Element( "td" , { "tdType" : "meeting", "room" : room.id, "index" : i+1 }).inject( tr ); } this.roomTrMap[ room.id ] = tr; this.rooms = this.rooms || {}; this.rooms[ room.id ] = new MWF.xApplication.Meeting.WeekView.Room(this, node, room, buliding.name); if( buliding.id !== "noRoom" ){ this.roomTooltips.push( new MWF.xApplication.Meeting.RoomTooltip(this.app.content, node, this.app, room, { axis : "x", hiddenDelay : 300, displayDelay : 300 }) ); } }.bind(this)) }.bind(this)); this.loadCalendar(); }, loadTableHead: function(){ var d = this.date.clone(); var today = new Date(); if( !this.tableHead ){ var head = this.tableHead = new Element("tr", { "styles" : this.css.calendarTableTitleTr }).inject( this.calendarTable ); new Element("th", { "styles" : this.css.calendarTableTh, text : this.app.lp.room }).inject(head); for( var i=0; i<7; i++ ) { //if( this.weekBegin == "0" ){ // var index = i //}else{ // var index = i == 6 ? 0 : i+1 //} var index = ( i + parseInt( this.weekBegin ) ) % 7; var th = new Element("th", { "styles": (d < today) ? this.css.calendarTableTh_pre : this.css.calendarTableTh, text: this.app.lp.weeks.arr[index] + "(" + d.format("%m.%d") + ")" }).inject(head); d.increment("day", 1); } }else{ this.tableHead.getElements("th").each( function( th, i ){ if( i == 0 )return; //if( this.weekBegin == "0" ){ // var index = i-1 //}else{ // var index = i == 7 ? 0 : i //} th.setStyles( (d < today) ? this.css.calendarTableTh_pre : this.css.calendarTableTh); var index = ( i - 1 + parseInt( this.weekBegin ) ) % 7; th.set("text", this.app.lp.weeks.arr[index] + "(" + d.format("%m.%d") + ")"); d.increment("day", 1); }.bind(this)) } }, reLoadCalendar: function(){ for( var key in this.days ){ this.days[key].destroy(); delete this.days[key]; } this.calendarTable.getElements("td[tdType='meeting']").each( function(td){ td.empty(); }.bind(this)); this.loadTableHead(); this.loadCalendar(); }, loadCalendar: function(){ this.noRoomTr.setStyle("display","none"); var date = this.date.clone(); for( var i = 1; i<8; i++ ){ this.loadDay(i, date); date.increment(); } //var tds = this.calendarTable.getElements("td"); //tds.each(function(td){ // this.loadDay(td, date); // date.increment(); //}.bind(this)); }, loadDay: function(index, date){ var type = "thisWeek"; var m = date.get("month"); var y = date.get("year"); var d = date.get("date"); var mm = this.date.get("month"); var yy = this.date.get("year"); var mmm = this.today.get("month"); var yyy = this.today.get("year"); var ddd = this.today.get("date"); if ((m==mmm) && (y==yyy) && (d==ddd)) { type = "today"; }else{ type = "thisWeek"; } //}else if ( this.view.getWeekNumber( date ) == this.view.currentWeek ){ // type = "thisWeek"; //}else{ // type = "otherWeek"; //} var key = date.format("%Y%m%d"); this.days[key] = new MWF.xApplication.Meeting.WeekView.Calendar.Day(index, date, this, type); }, reload : function(){ this.view.reload(); }, destroy: function(){ for( var key in this.days ){ this.days[key].destroy(); delete this.days[key]; } for( var key in this.rooms ){ this.rooms[key].destroy(); } this.roomTooltips.each( function(tooltip){ tooltip.destroy(); }.bind(this)); this.calendarTable.getElements("td[tdType='meeting']").each( function(td){ td.empty(); }.bind(this)); this.container.empty(); } }); MWF.xApplication.Meeting.WeekView.Room = new Class({ Implements: [Events], initialize: function(view, node, data, buildingName ){ this.data = data; this.view = view; this.css = this.view.css; this.container = node; this.app = this.view.app; this.meetings = []; this.buildingName = buildingName; this.enable = this.data.available; this.load(); }, load : function(){ this.node = new Element("div.roomItemNode", {"styles": this.css.roomItemNode}).inject(this.container); this.node.setStyle("min-height",""+this.view.roomNodeHeight+"px"); this.node.addEvents( { mouseover : function(){ this.node.setStyles( this.css.roomItemNode_over ); }.bind(this), mouseout : function(){ this.node.setStyles( this.css.roomItemNode ); }.bind(this) }); this.titleNode = new Element("div.titleNode", { "styles": this.css.roomItemTitleNode }).inject(this.node); if( this.data.id !== "noRoom" ){ this.titleNode.addEvents({ click : function(){ this.openRoom() }.bind(this) }); } if( this.enable ){ this.titleNode.addEvents({ mouseenter : function(){ this.titleTextNode.setStyles( this.css.roomItemTitleTextNode_over ); }.bind(this), mouseleave : function(){ this.titleTextNode.setStyles( this.css.roomItemTitleTextNode ); }.bind(this) }); } this.topNode = new Element("div.topNode", { styles : this.css.roomItemTitleTopNode }).inject( this.titleNode ); // this.descriptNode = new Element("div.roomItemDescriptNode",{ // styles : this.css.roomItemDescriptNode // }).inject(this.titleNode); // // if( this.data.capacity ){ // this.titleCountNode = new Element("div.titleCountNode", { // "styles": this.enable ? this.css.roomItemTitleCountNode : this.css.roomItemTitleCountNode_disable, // "text" : this.data.capacity+ this.app.lp.person // }).inject(this.descriptNode); // } // if( this.data.roomNumber ){ // new Element("div.titleCountNode", { // "styles": this.enable ? this.css.roomItemTitleCountNode : this.css.roomItemTitleCountNode_disable, // "text" : this.data.roomNumber // }).inject(this.descriptNode); // } if( this.buildingName && this.buildingName !== "noRoom" ){ this.buildingTextNode = new Element("div.buildingTextNode", { "styles": this.enable ? this.css.roomItemBuildingTextNode : this.css.roomItemBuildingTextNode_disable, "text" : this.buildingName }).inject(this.titleNode); } this.titleTextNode = new Element("div.roomItemTitleTextNode", { "styles": this.enable ? this.css.roomItemTitleTextNode : this.css.roomItemTitleTextNode_disable , "text" : this.data.name === "noRoom" ? this.app.lp.noRoomBuilding : this.data.name }).inject(this.topNode); if( this.data.name === "noRoom" ){ this.topNode.setStyles({ "height": "auto", "padding-top": "30px" }) this.titleTextNode.setStyles({ "white-space": "pre-wrap", "line-height": "28px" }) } //this.middleNode = new Element("div.middleNode", { // "styles": this.css.roomItemTitleMiddleNode //}).inject(this.titleNode); // //this.iconsNode = new Element("div.iconsNode", { // "styles": this.css.roomItemTitleIconsNode //}).inject(this.middleNode); // //var deviceList = this.data.device.split("#"); //deviceList.each(function(name){ // var node = new Element("div", {"styles": this.css.roomItemIconNode, "title": this.app.lp.device[name]}).inject(this.iconsNode); // node.setStyle("background-image", "url(../x_component_Meeting/$RoomView/default/icon/device/"+ name + ( this.enable ? "" : "_disable" ) +".png)"); //}.bind(this)); // //this.actionsNode = new Element("div.actionsNode", { // "styles": this.css.roomItemTitleActionsNode //}).inject(this.middleNode); // //this.loadActions(); }, loadActions: function(){ if( MWF.AC.isMeetingAdministrator() ){ this.editAction = new Element("div.o2icon-edit2", { styles: this.css.roomAction_edit, events : { mouseover : function(){ this.editAction.setStyles( this.css.roomAction_edit_over ); this.editAction.addClass("mainColor_color"); }.bind(this), mouseout : function(){ this.editAction.setStyles( this.css.roomAction_edit ); this.editAction.removeClass("mainColor_color"); }.bind(this), click : function(e){ this.editRoom(); e.stopPropagation(); }.bind(this) } }).inject(this.actionsNode); this.removeAction = new Element("div.o2icon-delete", { styles: this.css.roomAction_remove, events : { mouseover : function(){ this.removeAction.setStyles( this.css.roomAction_remove_over ); this.removeAction.addClass("mainColor_color"); }.bind(this), mouseout : function(){ this.removeAction.setStyles( this.css.roomAction_remove ); this.removeAction.removeClass("mainColor_color"); }.bind(this), click : function( e ){ this.removeRoom(e); e.stopPropagation(); }.bind(this) } }).inject(this.actionsNode); } if( this.enable ){ this.createMeetingAction = new Element("div.o2icon-create", { tltile : this.app.lp.addMeeting, styles: this.css.createMeetingAction, events : { mouseover : function(){ this.createMeetingAction.setStyles( this.css.createMeetingAction_over ); this.createMeetingAction.addClass("mainColor_color"); }.bind(this), mouseout : function(){ this.createMeetingAction.setStyles( this.css.createMeetingAction ); this.removeAction.addClass("mainColor_color"); }.bind(this), click : function(e){ this.app.addMeeting( this.view.date, this.view.hours, this.view.minutes, this.data.id); e.stopPropagation(); }.bind(this) } }).inject(this.actionsNode); } }, editRoom : function(){ var form = new MWF.xApplication.Meeting.RoomForm(this.app,this.data, {}, {app:this.app}); form.view = this; form.edit(); }, openRoom : function(){ var form = new MWF.xApplication.Meeting.RoomForm(this.app,this.data, {}, {app:this.app}); form.view = this; form.open(); }, reload : function(){ this.view.reload( this.view.date, this.view.hours, this.view.minutes ); }, removeRoom: function(e) { var info = this.app.lp.delete_room; info = info.replace(/{name}/g, this.data.name); var _self = this; this.app.confirm("warn", e, this.app.lp.delete_building_title, info, 300, 120, function(){ _self.remove(); this.close(); }, function(){ this.close(); }); }, remove: function(){ var view = this.view; this.app.actions.deleteRoom(this.data.id, function(){ view.reload(); }.bind(this)); }, resetHeight: function(){ this.node.setStyle("min-height",""+this.view.roomNodeHeight+"px"); if( this.noMeetingNode ){ this.noMeetingNode.setStyle("min-height",""+(this.view.roomNodeHeight - 170)+"px"); this.noMeetingNode.setStyle("line-height",""+(this.view.roomNodeHeight - 170)+"px"); } }, destroy: function(){ if( this.calendar ){ this.calendar.container.destroy(); } if( this.tooltip ){ this.tooltip.destroy(); } this.meetings.each( function(m){ m.destroy(); }); this.node.destroy(); MWF.release(this); } }); MWF.xApplication.Meeting.WeekView.Calendar.Day = new Class({ Implements: [Events], initialize: function(index, date, calendar, type){ this.index = index; this.calendar = calendar; this.view = this.calendar.view; this.css = this.calendar.css; this.app = this.calendar.app; this.date = date.clone(); this.key = this.date.format(this.app.lp.dateFormat); this.type = type; //today, otherMonth, thisMonth this.meetings = []; this.load(); }, load: function(){ this.color = "#666"; //if( this.type == "thisWeek" ){ //}else if( this.type == "otherWeek" ){ // //this.color = "#ccc"; //} this.day = this.date.getDate(); this.month = this.date.getMonth(); this.year = this.date.getYear(); this.loadMeetings(); this.roomMeetingObject = {}; this.containerObject = {}; this.calendar.calendarTable.getElements("td[index='"+ this.index +"']").each( function(td){ this.containerObject[ td.get("room") ] = td; }.bind(this)); }, loadEmpty: function(){ for( var key in this.containerObject ){ var td = this.containerObject[key]; if( !this.roomMeetingObject[ key ] ){ var node = new Element("div", { "styles" : this.css["calendarTableCell_"+this.type] }).inject( td ); //var titleNode = new Element("div", {"styles": this.css["dayTitle_" + this.type]}).inject(node); //var titleDayNode = new Element("div", { // "styles": this.css["dayTitleDay_" + this.type], // "text": this.day //}).inject(titleNode); // //if ((new Date()).diff(this.date) >= 0) { // titleNode.set("title", this.app.lp.titleNode); // titleNode.addEvent("click", function () { // this.app.addMeeting(this.date); // }.bind(this)); //} var contentNode = new Element("div", {"styles": this.css.dayContentNode}).inject(node); var textNode = new Element("div", { "styles": { "line-height": "60px", "font-size": "14px", "text-align" : "center", "color" : this.color, "padding": "20px 10px" } }).inject( contentNode); textNode.set("text", this.app.lp.noMeeting); } } }, loadMeetings: function(){ this.app.isMeetingViewer( function( isAll ){ this._loadMeetings( isAll ); }.bind(this)) }, _loadMeetings: function( isAll ){ var y = this.date.getFullYear(); var m = this.date.getMonth()+1; var d = this.date.getDate(); this.app.actions[ isAll ? "listMeetingDayAll" : "listMeetingDay" ](y, m, d, function(json){ var length = json.data.length; json.data.each(function(meeting, i){ if( !meeting.room ){ meeting.room = "noRoom"; this.calendar.noRoomTr.setStyle("display", ""); } if( !this.roomMeetingObject[ meeting.room ] ){ this.roomMeetingObject[ meeting.room ] = []; } this.roomMeetingObject[ meeting.room].push( meeting ); }.bind(this)); this.loadEmpty(); this.loadRoomMeeting(); }.bind(this)); }, loadRoomMeeting : function(){ var meetingCount = 0; var firstStatus = ""; var lastStatus = ""; for( var key in this.roomMeetingObject ) { var td = this.containerObject[key]; var node = new Element("div", { "styles": this.css["calendarTableCell_" + this.type] }).inject(td); var titleNode = new Element("div", {"styles": this.css["dayTitle_" + this.type]}).inject(node); var titleDayNode = new Element("div", { "styles": this.css["dayTitleDay_" + this.type], "text": this.day }).inject(titleNode); if( this.type === "today" )titleDayNode.addClass("mainColor_bg"); if ((new Date()).diff(this.date) >= 0) { titleNode.set("title", this.app.lp.titleNode); titleNode.addEvent("click", function () { this.app.addMeeting(this.date); }.bind(this)); } var contentNode = new Element("div", {"styles": this.css.dayContentNode}).inject(node); var meetingCount = 0; var myRejectCount = 0; var length = this.roomMeetingObject[key].length; this.roomMeetingObject[key].each(function (meeting, idx) { if (!meeting.myReject) { meetingCount++; if (meetingCount == 3) { //this.contentNode.setStyle("height", "100px"); } if (meetingCount == 1) { firstStatus = meeting.status; if (meeting.myWaitAccept)firstStatus = "myWaitAccept" } if (meetingCount + myRejectCount == length ) { lastStatus = meeting.status; if (meeting.myWaitAccept)lastStatus = "myWaitAccept" } //if (meetingCount<4) var m = new MWF.xApplication.Meeting.WeekView.Calendar.Day.Meeting(this, contentNode, meeting, meetingCount); m.parentNode = node; m.parentTd = td; this.meetings.push( m ); }else{ myRejectCount++; } }.bind(this)); if (meetingCount == 0) { //var node = new Element("div", { // "styles": { // "line-height": "40px", // "font-size": "14px", // "text-align" : "center", // "color" : this.color, // "padding": "0px 10px" // } //}).inject(this.contentNode); //node.set("text", this.app.lp.noMeeting); } else { var titleInforNode = new Element("div", {"styles": this.css["dayTitleInfor_" + this.type]}).inject(titleNode); if( this.app.isViewAvailable( "toDay" ) ){ titleInforNode.addEvent("click", function (e) { this.app.toDay(this.date); e.stopPropagation(); }.bind(this)); }else{ titleInforNode.setStyle("cursor","default"); } titleInforNode.set("text", "" + meetingCount + this.app.lp.countMeetings + ""); if (meetingCount > 3) { node.addEvents({ "mouseenter": function () { this.obj.expend( this.td, this.node ); }.bind({ obj : this, td : td, node : node }), "mouseleave": function (){ this.obj.collapseReady = true; this.obj.collapse( this.td, this.node ); }.bind({ obj : this, td : td, node : node }) }) } else { titleInforNode.setStyle("color", this.type == "otherMonth" ? "#ccc" : "#999"); } if (firstStatus) { switch (firstStatus) { case "wait": titleNode.setStyles({"border-left": "6px solid #51B749"}); break; case "processing": titleNode.setStyles({"border-left": "6px solid #5484ED"}); break; case "completed": titleNode.setStyles({"border-left": "6px solid #FBD75B"}); break; case "applying": titleNode.setStyles({"border-left": "6px solid #F9905A"}); break; case "myWaitAccept": titleNode.setStyles({"border-left": "6px solid #F6A623"}); break } } if (lastStatus) { var heigth = 0; if (meetingCount >= 3) { heigth = 10; } else { heigth = 100 - meetingCount * 30; } var bottomEmptyNode = new Element("div", { styles: { "height": "" + heigth + "px" } }).inject(node); switch (lastStatus) { case "wait": bottomEmptyNode.setStyles({"border-left": "6px solid #51B749"}); break; case "processing": bottomEmptyNode.setStyles({"border-left": "6px solid #5484ED"}); break; case "completed": bottomEmptyNode.setStyles({"border-left": "6px solid #FBD75B"}); break; case "applying": bottomEmptyNode.setStyles({"border-left": "6px solid #F9905A"}); break; case "myWaitAccept": bottomEmptyNode.setStyles({"border-left": "6px solid #F6A623"}); break } } } } }, expend : function( container, node ){ this.oSize = node.getSize(); container.setStyles({ "position" : "relative" }); this.tempNode = new Element("div",{ styles : { width : (node.getSize().x ) + "px", height : "1px", margin : "7px" } }).inject(container); node.setStyles({ "height" : node.getScrollSize().y + "px", "width" : (node.getSize().x ) + "px", "position" : "absolute", "top" : "0px", "left" : "0px", "box-shadow": "0 0 8px 0 rgba(0,0,0,0.25)" }); var nodeCoordinate = node.getCoordinates(); var contentNode = this.calendar.contentWarpNode; var contentCoordinate = contentNode.getCoordinates(); if( nodeCoordinate.bottom > contentCoordinate.bottom ){ this.contentHeight = contentCoordinate.height; contentNode.setStyle("height", ( nodeCoordinate.bottom - contentCoordinate.top )+"px" ); } this.isCollapse = false; }, collapse : function(container, node){ if( !this.collapseDisable && this.collapseReady){ container.setStyles({ "position" : "static" }); if( this.tempNode )this.tempNode.destroy(); node.setStyles({ "height" : "140px", "width" : "auto", "position" : "static", "box-shadow": "none" }); if( this.contentHeight ){ var contentNode = this.calendar.contentWarpNode; contentNode .setStyle("height", ( this.contentHeight )+"px" ); this.contentHeight = null; } this.isCollapse = true; } }, destroy: function(){ this.meetings.each(function(meeting){ meeting.destroy(); }.bind(this)); this.meetings = []; if(this.titleNode){ this.titleNode.destroy(); this.titleNode = null; } this.titleDayNode = null; this.titleInforNode = null; delete this.calendar.days[this.key]; //this.container.empty(); MWF.release(this); }, reload: function(){ this.view.reload(); } }); MWF.xApplication.Meeting.WeekView.Calendar.Day.Meeting = new Class({ initialize: function(day, node, data, index){ this.day = day; this.css = this.day.css; this.view = this.day.view; this.app = this.day.app; this.container = node; this.data = data; this.index = index; this.load(); }, load: function(){ this.nodeStyles = (this.day.type == "today") ? this.css.meetingNode_today : this.css.meetingNode; this.node = new Element("div", { "styles": this.nodeStyles }).inject(this.container); this.iconNode = new Element("div", {"styles": this.css.meetingIconNode}).inject(this.node); this.timeNode = new Element("div", {"styles": this.css.meetingTimeNode}).inject(this.node); this.textNode = new Element("div", {"styles": this.css.meetingTextNode}).inject(this.node); var timeStr = Date.parse(this.data.startTime).format("%H:%M"); this.timeNode.set("text", timeStr); this.textNode.set("text", this.data.subject); //this.node.set("title", this.data.subject); // //if (this.data.myWaitAccept){ // this.iconNode.setStyle("background", "url(../x_component_Meeting/$WeekView/"+this.app.options.style+"/icon/invite.png) no-repeat center center"); //} switch (this.data.status){ case "wait": this.node.setStyles({ "border-left": "6px solid #51B749" }); break; case "processing": this.node.setStyles({ "border-left": "6px solid #5484ED" }); break; case "completed": //add attachment this.node.setStyles({ "border-left": "6px solid #FBD75B" }); //this.textNode.setStyle("color", "#666"); break; case "applying": //add attachment this.node.setStyles({ "border-left": "6px solid #F9905A" }); //this.textNode.setStyle("color", "#666"); break; } if (this.data.myWaitAccept){ this.node.setStyles({ "border-left": "6px solid #F6A623" }); } this.node.addEvents({ mouseenter : function(){ this.day.collapseReady = false; this.node.setStyles( this.css.meetingNode_over ); this.textNode.addClass("mainColor_color"); //this.showTooltip(); }.bind(this), mouseleave : function(){ this.node.setStyles( this.nodeStyles ); this.textNode.removeClass("mainColor_color"); }.bind(this), "click": function(){this.openMeeting();}.bind(this) }); this.loadTooltip(); }, loadTooltip : function(){ this.tooltip = new MWF.xApplication.Meeting.MeetingTooltip(this.app.content, this.node, this.app, this.data, { axis : "x", hiddenDelay : 300, displayDelay : 300, onShow : function(){ this.day.collapseDisable = true; }.bind(this), onQueryCreate : function(){ this.day.collapseDisable = true; }.bind(this), onHide : function(){ this.day.collapseDisable = false; this.day.collapse(this.parentTd, this.parentNode); }.bind(this) }); }, showTooltip: function( ){ //if( this.index > 3 && this.day.isCollapse ){ //}else{ if( this.tooltip ){ this.tooltip.load(); }else{ this.tooltip = new MWF.xApplication.Meeting.MeetingTooltip(this.app.content, this.node, this.app, this.data, { axis : "x", "delay" : 150 //onShow : function(){ // this.day.collapseDisable = true; //}.bind(this), //onQueryCreate : function(){ // this.day.collapseDisable = true; //}.bind(this), //onHide : function(){ // this.day.collapseDisable = false; //}.bind(this) }); this.tooltip.load(); } //} }, openMeeting: function(){ this.form = new MWF.xApplication.Meeting.MeetingForm(this,this.data, {}, {app:this.app}); this.form.view = this; this.form.open(); }, destroy: function(){ if(this.tooltip)this.tooltip.destroy(); this.node.destroy(); MWF.release(this); }, reload: function(){ this.view.reload(); } }); MWF.xApplication.Meeting.WeekView.WeekCalendar = new Class({ Extends : MWF.widget.Calendar, initialize: function(node, options){ this.options.weekBegin = "0"; Locale.use("zh-CHS"); this.options.defaultTime = ""+this.options.baseDate.getHours()+":"+this.options.baseDate.getMinutes()+":"+this.options.baseDate.getSeconds(); this.setOptions(options); this.path = MWF.defaultPath+"/widget/$Calendar/"; this.cssPath = MWF.defaultPath+"/widget/$Calendar/"+this.options.style+"/css.wcss"; this._loadCss(); // this.options.containerPath = this.path+this.style+"/container.html"; // this.options.dayPath = this.path+this.style+"/day.html"; // this.options.monthPath = this.path+this.style+"/month.html"; // this.options.yearPath = this.path+this.style+"/year.html"; // this.options.timePath = this.path+this.style+"/time.html"; if (!this.options.format){ if (this.options.isTime){ //this.options.format = Locale.get("Date").shortDate + " " + Locale.get("Date").shortTime; if(this.options.timeOnly){ this.options.format="%H:%M"; } else{ this.options.format = Locale.get("Date").shortDate + " " + "%H:%M"; } }else{ this.options.format = Locale.get("Date").shortDate; } } this.options.containerPath = this.options.path+this.options.style+"/container.html"; this.options.dayPath = this.options.path+this.options.style+"/day_week.html"; this.options.monthPath = this.options.path+this.options.style+"/month.html"; this.options.yearPath = this.options.path+this.options.style+"/year.html"; this.options.timePath = this.options.path+this.options.style+"/time.html"; this.today = new Date(); this.currentView = this.options.defaultView; this.node = $(node); this.visible = false; this.container = this.createContainer(); this.container.inject((this.options.target) || $(document.body)); this.contentTable = this.createContentTable(); this.contentTable.inject(this.contentDateNode); this.addEvents(); this.container.set({ styles: { "display": "none", "opacity": 1 } }); this.fireEvent("init"); //this.move = true; //this.containerDrag = new Drag.Move(this.container); }, showDay: function(year, month){ this._setDayTitle(null, year, month); this._setDayWeekTitleTh(); this._setDayDate(null, year, month); // if (!this.move){ // this.move = true; // this.containerDrag = new Drag.Move(this.container); // } }, _setDayTitle: function(node, year, month){ var thisYear = (year!=undefined) ? year : this.options.baseDate.getFullYear(); var thisMonth = (month!=undefined) ? month : this.options.baseDate.getMonth(); thisMonth++; var text = thisYear+ o2.LP.widget.year +thisMonth+ o2.LP.widget.month; var thisNode = node || this.currentTextNode; thisNode.set("text", text); thisNode.store("year", thisYear); thisNode.store("month", thisMonth); }, _setDayWeekTitleTh: function(table){ var dayTable = table || this.contentTable; var thead = dayTable.getElement("thead"); var cells = thead.getElements("th"); if (this.css.calendarDaysContentTh) cells.setStyles(this.css.calendarDaysContentTh); //var days_abbr = Locale.get("Date").days_abbr; var days_abbr = MWF.LP.widget.days_abbr; cells.each(function(item, idx){ if( idx == 0 ){ item.set("text", o2.LP.widget.week); }else{ //var index; //if( this.options.weekBegin == "0" ){ // index = idx-1; //}else{ // index = idx == 7 ? 0 : idx; //} var index = ( idx - 1 + parseInt( this.options.weekBegin ) ) % 7; item.set("text", days_abbr[index]); } }.bind(this)); return cells; }, _setDayDate: function(table, year, month){ var dayTable = table || this.contentTable; var baseDate = this.options.baseDate; if ((year!=undefined) && (month!=undefined)){ baseDate = new Date(); baseDate.setDate(1); baseDate.setFullYear(year); baseDate.setMonth(month); } var tbody = dayTable.getElement("tbody"); var tds = tbody.getElements("td"); var firstDate = baseDate.clone(); firstDate.setDate(1); //if( this.options.weekBegin == "0" ){ // var day = firstDate.getDay()+1; //}else{ // //} var day = ( 7 + firstDate.getDay() - parseInt( this.options.weekBegin ) ) % 7 + 1; var tmpDate = firstDate.clone(); for (var i=day-1; i>=0; i--){ if( i % 8 == 0 ){ //设置周数 var week = this.getWeekNumber( tmpDate ); tds[i].set("text", week); tds[i].setStyles(this.css.week); tds[i].store("weekValue", week.toString()); tds[i].store("dateValue", tmpDate.toString()); i--; if( i<0 )break; } tmpDate.increment("day", -1); tds[i].set("text", tmpDate.getDate()); tds[i].addClass("gray_"+this.options.style); tds[i].setStyles(this.css["gray_"+this.options.style]); tds[i].store("dateValue", tmpDate.toString()) } for (var i=day; i=tds.length )break; } tds[i].set("text", firstDate.getDate()); if (firstDate.toString() == this.options.baseDate.toString()){ tds[i].addClass("current_"+this.options.style); tds[i].setStyles(this.css["current_"+this.options.style]); tds[i].removeClass("gray_"+this.options.style); tds[i].setStyle("border", "1px solid #FFF"); }else if (firstDate.getMonth()!=baseDate.getMonth()){ tds[i].addClass("gray_"+this.options.style); tds[i].setStyles(this.css["gray_"+this.options.style]); tds[i].removeClass("current_"+this.options.style); tds[i].setStyle("border", "1px solid #FFF"); }else{ tds[i].setStyles(this.css["normal_"+this.options.style]); tds[i].removeClass("current_"+this.options.style); tds[i].removeClass("gray_"+this.options.style); tds[i].setStyle("border", "1px solid #FFF"); } var tmp = firstDate.clone(); if (tmp.clearTime().toString() == this.today.clearTime().toString()){ //tds[i].addClass("today_"+this.options.style); tds[i].setStyles(this.css["today_"+this.options.style]); tds[i].setStyle("border", "0px solid #AAA"); tds[i].addClass("mainColor_bg"); } tds[i].store("dateValue", firstDate.toString()); firstDate.increment("day", 1); } }, getWeekNumber: function( d ){ // Create a copy of this date object var target = d.clone(); // ISO week date weeks start on monday // so correct the day number //if( this.options.weekBegin == "1" ){ // var dayNr = (d.getDay() + 6) % 7; //}else{ // var dayNr = (d.getDay() + 7) % 7; //} var dayNr = ( 7 + d.getDay() - parseInt( this.options.weekBegin ) ) % 7; // ISO 8601 states that week 1 is the week // with the first thursday of that year. // Set the target date to the thursday in the target week target.setDate(target.getDate() - dayNr + 3); // Store the millisecond value of the target date var firstThursday = target.valueOf(); // Set the target to the first thursday of the year // First set the target to january first target.setMonth(0, 1); // Not a thursday? Correct the date to the next thursday if (target.getDay() != 4) { target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7); } // The weeknumber is the number of weeks between the // first thursday of the year and the thursday in the target week return 1 + Math.ceil((firstThursday - target) / 604800000); // 604800000 = 7 * 24 * 3600 * 1000 } });