<?xml version="1.0" encoding="UTF-8" ?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->
<library>

<style name="calendarButtonStyle" basecolor="0xFF3300" textcolor="0xFFFFFF" />

<class name="lzCalendar" extends="baseContentView" 
				height="${ canvas.height-canvas.naviHeight }" width="${ canvas.width }">
				
	<attribute name="currentDate" value="null" />
	
	<attribute name="lzViewCalendarEvent" value="null" />
	
	<attribute name="tStartDate" value="null" />
	<attribute name="tEndDate" value="null" />
	
	<!---
		The user id the calendar will load the events for
	 -->
	<attribute name="requestUserId" value="$once{ canvas.user_id }" type="number" />
	
	<handler name="oninit">
		<![CDATA[
			_mainScrollBar.setAttribute("visibility","hidden");
			
			var downloadurl = canvas.protocol + '://'+canvas.rtmphostlocal+':'+canvas.red5httpport
	                               +canvas.httpRootKey+'services/CalendarService/getAppointmentReminderTypList?'
	                               +'SID='+canvas.sessionId;
	               
            this.getAppointmentReminderTypList.setAttribute("src",downloadurl);
            this.getAppointmentReminderTypList.doRequest();
			
			canvas.monthnames = [canvas.getLabelName(469),canvas.getLabelName(470),
								canvas.getLabelName(471),canvas.getLabelName(472),
								canvas.getLabelName(473),canvas.getLabelName(474),
								canvas.getLabelName(475),canvas.getLabelName(476),
								canvas.getLabelName(477),canvas.getLabelName(478),
								canvas.getLabelName(479),canvas.getLabelName(480)];
								
			canvas.dayShortNames = [canvas.getLabelName(459),
								canvas.getLabelName(453),
								canvas.getLabelName(454),
								canvas.getLabelName(455),
								canvas.getLabelName(456),
								canvas.getLabelName(457),
								canvas.getLabelName(458)];
		]]>
	</handler>
	
	<handler name="ontabcontentleave" args="tRef">
		//Make sure any cursor status is reset
		lz.Cursor.restoreCursor();
		lz.Cursor.showHandCursor(true);
        _mainScrollBar.setAttribute("visibility","visible");
    </handler>
    
    <method name="clearWindows">
    	if (this.lzViewCalendarEvent != null) {
    		this.lzViewCalendarEvent.close();
    	}
    </method>

	<method name="loadAppointments" args="tDate, dayIndex, weekIndex">
		<![CDATA[
			var tRelaodDataSet = false;
			var tDateNow = new Date();
			tDate.setHours(tDateNow.getHours());
			tDate.setMinutes(tDateNow.getMinutes());
			
			if (this.currentDate == null) {
				tRelaodDataSet = true;
			}
			if ($debug) Debug.write("loadAppointments ",dayIndex, weekIndex, tDate);
			this.currentDate = tDate;
			this.statusInfo.currentDate.setAttribute("text",parseDateToStringTime(this.currentDate));
			this._lzCalendarGrid.checkAndShow(tDate,dayIndex,weekIndex);
			
			if (tRelaodDataSet) {
				this.loadCalendarData();
	        }
		]]>
	</method>
	
	<method name="loadCalendarData">
		<![CDATA[
			var tDay = this.currentDate.getDate();
			if (tDay < 10) tDay = "0"+tDay;
			
			var tMonth = this.currentDate.getMonth() + 1;
			if (tMonth < 10) tMonth = "0"+tMonth;
		
			var downloadurl = canvas.protocol + '://'+canvas.rtmphostlocal+':'+canvas.red5httpport
	                       +canvas.httpRootKey+'services/CalendarService/getAppointmentsByWeekCalendar?'
	                       +'SID='+canvas.sessionId
	                       +'&firstDayInWeek='+canvas.firstdayinweek
	                       +'&startDate='+this.currentDate.getFullYear()+"-"+tMonth+"-"+tDay
	                       +'&requestUserId=' + this.requestUserId
	                       +'&omTimeZoneId=' + canvas.timeZoneId
	                       +'&javaTimeZoneName=';
	       
	        this.getAppointmentsByWeekCalendar.setAttribute("src",downloadurl);
	        if ($debug) Debug.write("getAppointmentsByWeekCalendar doRequest 1 ",downloadurl);
	        this.getAppointmentsByWeekCalendar.doRequest();
        ]]>
	</method>
	
	<method name="editCalendarEvent" args="appointment">
		<![CDATA[
			var dataElement = null;
			if (appointment == null) {
				if (this.requestUserId != canvas.user_id) {
					new lz.labelerrorPopup(canvas,{errorlabelid:1278});
					return;
				}
				appointment = this.generateBlankEvent();
				dataElement = LzDataElement.valueToElement(appointment);
			} else {
				dataElement = appointment;
			}
			
			new lz.lzEditCalendarEvent(canvas,{
								dataElement:dataElement,
								remindertypes:getAppointmentReminderTypList,
								lzCalendarRef:this
							});
		]]>
	</method>
	
	<method name="viewCalendarEvent" args="appointment,refCalendarEventView">
		this.lzViewCalendarEvent = new lz.lzViewCalendarEvent(canvas,{
					dataElement:appointment,
					lzCalendarRef:this,
					refCalendarEventView:refCalendarEventView
				});
	</method>
	
	<method name="generateBlankEvent">
		<![CDATA[
		
			var newAppointment = new Object();
			newAppointment.appointmentId = 0;
			newAppointment.categoryId = 1;
			newAppointment.title = canvas.getLabelName(1444);
			
			var tDate = new Date();
			
			//There seems to be a difference in the way OpenLaszlo makes a Date to a XML string:
			//OpenLaszlo generates a time in UTC instead of the local time when converted to an XML String
			var timeZoneOffSetInMilliSeconds = tDate.getTimezoneOffset()*60*1000;
			
			if (this.tStartDate == null) {
				tDate.setTime(this.currentDate.getTime()-timeZoneOffSetInMilliSeconds);
				tDate.setMinutes(0);
				tDate.setSeconds(0);
				if (tDate.getHours() == 23) {
					tDate.setHours(22);
				}
			} else {
				tDate.setTime(this.tStartDate.getTime()-timeZoneOffSetInMilliSeconds);
				tDate.setSeconds(0);
				this.tStartDate = null;
			}
			newAppointment.start = tDate;
			
			var tDate2 = new Date();
			if (this.tEndDate == null) {
				tDate2.setTime(tDate.getTime());
				tDate2.setHours(tDate.getHours()+1);
			} else {
				tDate2.setTime(this.tEndDate.getTime()-timeZoneOffSetInMilliSeconds);
				tDate2.setSeconds(0);
				this.tEndDate = null;
			}
			newAppointment.end = tDate2;
			
			newAppointment.comment = "";
			newAppointment.reminderId = 3;
			newAppointment.roomsId = 0;
			newAppointment.location = "";
			newAppointment.isPasswordProtected = false;
			newAppointment.roomTypeId = 1;
			
			return newAppointment;
		]]>
	</method>
	
	<method name="reload">
		this.getAppointmentsByWeekCalendar.doRequest();
	</method>
	
	<dataset name="getAppointmentsByWeekCalendar" type="http">
		<handler name="ondata" args="d">
			//Make sure any cursor status is reset
			lz.Cursor.restoreCursor();
			lz.Cursor.showHandCursor(true);
			if ($debug) Debug.write("ondata",d);
		</handler>
	</dataset>
	
	<dataset name="getAppointmentReminderTypList" type="http" />
	
	<view name="statusInfo" width="204" y="4">
		<labelText name="currentDate" align="center"
			fontsize="12" resize="true" fontstyle="bold" />
	</view>
	
	<!-- 176 pixels is the width of the mini calendar -->
	<simpleLabelButton labelid="1444" height="24" 
			width="176" x="12" y="26" style="calendarButtonStyle">
        <handler name="onclick">
            parent.editCalendarEvent(null);
        </handler>
    </simpleLabelButton>
	
	<dateSelector name="_calendar" y="54" x="12">
		<handler name="onmonthSel" args="tMonth">
			parent.currentDate = null;
		</handler>
		<handler name="onyearSel" args="tYear">
			parent.currentDate = null;
		</handler>
		<handler name="onselect" args="sel">
			if ($debug) Debug.write("onselect ",sel);
			// check for saving
			if (true) {
 				parent.loadAppointments(sel, this.dayIndexNumber, this.weekIndexNumber);
			} else {
				//Check Warning
    			if ($debug) Debug.warn("Unsaved Item - Show warning");
    			new lz.labelerrorPopup(canvas,{errorlabelid:794,makeModal:true});
			}
		</handler> 
	</dateSelector> 
	
	<view resource="messagebox_info_rsc" x="4" y="198" />
	
	<labelText labelid="807" x="24" y="196" fontstyle="bold" />
	
	<labelText labelid="806" x="4" y="218" multiline="true" width="190" />
	
	<labelText labelid="1276" x="4" y="280" fontstyle="bold" />
	
	<view resource="messagebox_info_rsc" x="6" y="300" 
		  width="16" height="16" stretches="both" />
	
	<labelText labelid="1277" x="24" y="296" multiline="true" width="166" />
	
    <miniIcons x="172" y="336" resource="calendar_revert_to_own_undo_rsc" width="16" height="16" 
               showhandcursor="true">
        <handler name="onclick">
            parent.requestUserId = canvas.user_id;
            parent.loadCalendarData();
        </handler>
        <labelTooltip labelid="1279" />
    </miniIcons>
	
	<userContactsCalendar name="_userContacts" y="354" x="4" height="${ parent.height - 358 }" width="186">
		<handler name="onselectedItem" args="sel">
			if ($debug) Debug.write("onselectedItem ",sel.tUserId,sel);
            parent.requestUserId = sel.tUserId;
            parent.loadCalendarData();
        </handler>
        <handler name="onSaveNewMessage" args="roomBooked">
        	if ($debug) Debug.write("onSaveNewMessage ",roomBooked);
        	parent.reload();
        </handler>
	</userContactsCalendar>
	
	<view name="_lzCalendarTobBar" width="${ parent.width - 204 }" x="204" height="40">
	
		<view name="buttons" align="left" y="2">
		
			<method name="getCurrentViewState">
				if (!this._showDay.enabled) {
					return "day";
				} else if (!this._showWeek.enabled) {
					return "week";
				} else if (!this._showMonth.enabled) {
					return "month";
				}
			</method>
		
			<simpleLabelButton name="_showDay" labelid="799" height="22" >
		        <handler name="onclick">
		        	parent._showWeek.setAttribute("enabled",true);
		        	parent._showMonth.setAttribute("enabled",true);
		        	this.setAttribute("enabled",false);
		            parent.parent.parent._lzCalendarGrid.showDay();
		        </handler>
		    </simpleLabelButton>
		    
		    <simpleLabelButton name="_showWeek" labelid="800" height="22" >
		        <handler name="onclick">
		        	parent._showDay.setAttribute("enabled",true);
		        	parent._showMonth.setAttribute("enabled",true);
		        	this.setAttribute("enabled",false);
		            parent.parent.parent._lzCalendarGrid.showWeek();
		        </handler>
		    </simpleLabelButton>
		    
		    <simpleLabelButton name="_showMonth" labelid="801" height="22" enabled="false">
		        <handler name="onclick">
		        	parent._showDay.setAttribute("enabled",true);
		        	parent._showWeek.setAttribute("enabled",true);
		        	this.setAttribute("enabled",false);
		            parent.parent.parent._lzCalendarGrid.showMonth();
		        </handler>
		    </simpleLabelButton>
		    
		    <labelText fgcolor="0x0000FF" y="2">
		    	<handler name="oninit">
		    		<![CDATA[
		    			this.setAttribute("text","<u>"+canvas.jNameTimeZone+"</u>");
		    		]]>
		    	</handler>
		    	<handler name="onclick">
		    		canvas.userSettingsModuleOpt = "editUserProfile";
            		quicklinkAct("userSettingsModule");
		    	</handler>
		    </labelText>
		    
		    
		
			<simplelayout axis="x" spacing="0" />
		</view>
		
		<view align="right" y="2">
		
			<simpleLabelButton name="_nextBtn" height="22" width="20">
				<view resource="calendar_resultset_previous_rsc" x="2" y="3" />
		        <handler name="onclick">
		        	var tDate = parent.parent.parent.currentDate;
		        	if (parent.parent.buttons.getCurrentViewState() == "day") {
		        		tDate.setTime(tDate.getTime() - 86400000);
		        	} else if (parent.parent.buttons.getCurrentViewState() == "month") {
		        		if (tDate.getMonth() == 0) {
		        			tDate.setMonth(11);
		        			tDate.setFullYear(tDate.getFullYear()-1);
		        		} else {
		        			tDate.setMonth(tDate.getMonth()-1);
		        		}
		        	} else if (parent.parent.buttons.getCurrentViewState() == "week") {
		        		tDate.setTime(tDate.getTime() - (86400000*7));
		        	}
		        	parent.parent.parent.currentDate = null;
		        	if ($debug) Debug.write("loadDate :: ",tDate);
		        	parent.parent.parent._calendar.loadDate(tDate);
		        </handler>
		    </simpleLabelButton>
		    
		    <simpleLabelButton name="_preBtn" height="22" width="20">
				<view resource="calendar_resultset_next_rsc" x="2" y="3" />
		        <handler name="onclick">
		            var tDate = parent.parent.parent.currentDate;
		        	if (parent.parent.buttons.getCurrentViewState() == "day") {
		        		tDate.setTime(tDate.getTime() + 86400000);
		        	} else if (parent.parent.buttons.getCurrentViewState() == "month") {
		        		if (tDate.getMonth() == 11) {
		        			tDate.setMonth(0);
		        			tDate.setFullYear(tDate.getFullYear()+1);
		        		} else {
		        			tDate.setMonth(tDate.getMonth()+1);
		        		}
		        	} else if (parent.parent.buttons.getCurrentViewState() == "week") {
		        		tDate.setTime(tDate.getTime() + (86400000*7));
		        	}
		        	parent.parent.parent.currentDate = null;
		        	if ($debug) Debug.write("loadDate :: ",tDate);
		        	parent.parent.parent._calendar.loadDate(tDate);
		        </handler>
		    </simpleLabelButton>
			
			<simplelayout axis="x" spacing="0" />
		</view>
		
	</view>
	
	<lzCalendarGrid name="_lzCalendarGrid" 
		datapath="local:classroot.getAppointmentsByWeekCalendar:/">
		<handler name="oncalendarEvent" args="sel">
			parent.viewCalendarEvent(sel.datapath.data.cloneNode(true),sel);
		</handler>	
		<handler name="onScollContent" args="tRef">
			parent.clearWindows();
		</handler>
		<handler name="onSelectDate" args="tDate">
			parent._calendar.showDate(tDate);
			parent._lzCalendarTobBar.buttons._showDay.onclick.sendEvent(null);
		</handler>
		<handler name="onNewEventDate" args="tDate">
			parent.tStartDate = tDate;
			//only use the date part here
			parent.tStartDate.setHours(this.currentDate.getHours());
			parent.tStartDate.setMinutes(0);
			parent.tEndDate = null;
			parent.editCalendarEvent();
		</handler>
		<handler name="onStartEndDate" args="tEmptyRef">
			parent.tStartDate = this.tStartDate;
			parent.tEndDate = this.tEndDate;
			parent.editCalendarEvent();
		</handler>
	</lzCalendarGrid>
	
</class>

</library>
