<?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>

	<class name="lzEditCalendarEvent" extends="labelExplorerBox" labelid="815" allowDragging="true" 
		    x="$once{ parent.width/2 - 300 }" y="100" docking="false" resizeable="false" 
		    closable="true" width="600" height="550" 
		    showWindowEffect="true" annimationStartStyle="mouse">
		    
		<attribute name="reminderTypeId" value="0" type="number" />
		
		<attribute name="dataElement" value="null" />
		<attribute name="remindertypes" value="null" />
		
		<attribute name="baseUrl" value="" type="string" />
		
		<attribute name="lzCalendarRef" value="null" />
		
		<dataset name="eventDS" />
		
		<attribute name="updateObj" value="null" />
		
		<attribute name="appointmentId" value="0" type="number" />
		
		<attribute name="isConnectedEvent" value="false" type="boolean" />
		
		<handler name="oninit">
			if (this.lzCalendarRef.requestUserId != canvas.user_id) {
				this._saveEvent.setAttribute("visibility","hidden");
				this._deleteEvent.setAttribute("visibility","hidden");
			}
			this.getAppointmentReminderTypList.setData(this.remindertypes.data);
		</handler>
		    
		<handler name="animationInited">
			<![CDATA[
				canvas._loadingAll.hideContentOnly();
				
				//Point URL to actual File
	            var urlObject =  lz.Browser.getBaseURL();
				//If Port is Null or undefinied use port 80
				if (urlObject.port!=null && urlObject.port!=undefined){
					var port = urlObject.port;
					
					if (port != 80) {
						this.baseUrl = urlObject.protocol+"://"+urlObject.host+":"+port+urlObject.path;
					} else {
						this.baseUrl = urlObject.protocol+"://"+urlObject.host+urlObject.path;
					}
				} else {
					this.baseUrl = urlObject.protocol+"://"+urlObject.host+urlObject.path;
				}
						
				if ($debug) Debug.write("urlObject ",urlObject);
	            if ($debug) Debug.write("this.baseUrl ",this.baseUrl);
			
	            if ($debug) Debug.write("this.dataElement ",this.dataElement);
	            
            	this.eventDS.setAttribute("data", this.dataElement.childNodes);
            	
            	this.appointmentId = this.eventDS.getPointer().xpathQuery('appointmentId/text()');
	            
	            if ($debug) Debug.write("this.eventDS ",this.eventDS);
	            if ($debug) Debug.write("this.appointmentId ",this.appointmentId);
	            
	            if (this.appointmentId == 0) {
	            	this._saveEvent.setAttribute("x",this._deleteEvent.x);
	            	this._deleteEvent.setAttribute("visibility","hidden");
	            }
	            
	            lz.Focus.setFocus(this._title, false);
            ]]>
		</handler>
		
		<handler name="onclose">
			canvas._loadingAll.hideLoading();
		</handler>
		
		<method name="saveAndClose">
			<![CDATA[
				this.updateObj = new Object();
			
				updateObj.tMemberArgs = this._participentList.getMemberArrayValue();
				
				if ($debug) Debug.write("tMemberArgs: ",updateObj.tMemberArgs.length,updateObj.tMemberArgs);
				
				updateObj.appointmentId = Number(this.eventDS.getPointer().xpathQuery('appointmentId/text()'));
				updateObj.appointmentstart = this._dateStart.getDate();
				if ($debug) Debug.write("appointmentstart ",updateObj.appointmentstart);
				var tTimeStart = this._timeStart.getText();
				var hours = Number(tTimeStart.substr(0,2));
				var mins = Number(tTimeStart.substr(3,2));
				if ($debug) Debug.write("hours:mins",hours,mins,tTimeStart.substr(4),tTimeStart);
				updateObj.appointmentstart.setHours(hours);
				updateObj.appointmentstart.setMinutes(mins);
				
				var tEnd = new Date();
				tEnd.setTime(this._dateStart.getDate().getTime());
				updateObj.appointmentend = tEnd; //this._dateEnd.getDate(); we currently do not support multi date events
				var tTimeEnd = this._timeEnd.getText();
				var hours = Number(tTimeEnd.substr(0,2));
				var mins = Number(tTimeEnd.substr(3,2));
				updateObj.appointmentend.setHours(hours);
				updateObj.appointmentend.setMinutes(mins);
				
				//if we choose 00:00 we actually mean the next day at noon
				if (hours == 0) {
					tEnd.setTime(tEnd.getTime()+86400000);
				}
				
                updateObj.appointmentName = this._title.getText();
                updateObj.appointmentLocation = this._location.getText();
                updateObj.appointmentDescription = this._descr.getText();
                updateObj.isDaily = false;
                updateObj.isWeekly = false;
                updateObj.isMonthly = false;
                updateObj.isYearly = false;
                updateObj.categoryId = 1;
                updateObj.remind = this._reminderType.getValue();
                updateObj.roomType = this._roomType.getValue();
                updateObj.isPasswordProtected = this._ispasswordProtected.getValue();
                updateObj.password = this._password.getText();
                
                if ($debug) Debug.write("appointmentId: ",updateObj.appointmentId);
                
                if ($debug) Debug.write("appointmentstart: ",updateObj.appointmentstart);
                if ($debug) Debug.write("appointmentstart: ",updateObj.appointmentend);
                
                if ($debug) Debug.write("appointmentstart: ",parseDateToStringTimeSeconds(updateObj.appointmentstart));
                if ($debug) Debug.write("appointmentstart: ",parseDateToStringTimeSeconds(updateObj.appointmentend));
                
				if (updateObj.appointmentId > 0) {
					this.updateAppointment.doCall();
				} else {
					this.saveAppointment.doCall();
				} 
			]]>
		</method>
		
		<dataset name="getAppointmentReminderTypList" />
		
		<netRemoteCallHib name="saveAppointment" funcname="calendarservice.saveAppointment" 
							  remotecontext="$once{ canvas.thishib }" >     
			<netparam><method name="getValue">return canvas.sessionId; </method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentName;</method></netparam>	
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentLocation;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentDescription;</method></netparam>
			<netparam><method name="getValue">return parseDateToStringTimeSeconds(parent.parent.updateObj.appointmentstart);</method></netparam>
			<netparam><method name="getValue">return parseDateToStringTimeSeconds(parent.parent.updateObj.appointmentend);</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isDaily;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isWeekly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isMonthly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isYearly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.categoryId;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.remind;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.tMemberArgs;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.roomType;</method></netparam>
			<netparam><method name="getValue">return parent.parent.baseUrl;</method></netparam>
			<netparam><method name="getValue">return hib.userlang;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isPasswordProtected;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.password;</method></netparam>
	    	<handler name="ondata" args="value">
	    		<![CDATA[
		    		if ($debug) Debug.write("saveAppointment ",value);
		    		parent.lzCalendarRef.reload();
					parent.close();
	    		 ]]>
	    	</handler>
	    </netRemoteCallHib> 
	    
    	<netRemoteCallHib name="updateAppointment" funcname="calendarservice.updateAppointment" 
						  remotecontext="$once{ canvas.thishib }" >  
			<netparam><method name="getValue">return canvas.sessionId; </method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentId;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentName;</method></netparam>	
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentLocation;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.appointmentDescription;</method></netparam>
			<netparam><method name="getValue">return parseDateToStringTimeSeconds(parent.parent.updateObj.appointmentstart);</method></netparam>
			<netparam><method name="getValue">return parseDateToStringTimeSeconds(parent.parent.updateObj.appointmentend);</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isDaily;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isWeekly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isMonthly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isYearly;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.categoryId;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.remind;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.tMemberArgs;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.roomType;</method></netparam>
			<netparam><method name="getValue">return parent.parent.baseUrl;</method></netparam>
			<netparam><method name="getValue">return hib.userlang;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.isPasswordProtected;</method></netparam>
			<netparam><method name="getValue">return parent.parent.updateObj.password;</method></netparam>
	    	<handler name="ondata" args="value">
	    		<![CDATA[
	    			if ($debug) Debug.write("updateAppointment ",value);
	    			parent.lzCalendarRef.reload();
					parent.close();
	    		 ]]>
	    	</handler>
	    </netRemoteCallHib> 
	    
	    <netRemoteCallHib name="deleteAppointment" funcname="calendarservice.deleteAppointment" 
							  remotecontext="$once{ canvas.thishib }" >     
			<netparam><method name="getValue">return canvas.sessionId; </method></netparam>
			<netparam><method name="getValue">return parent.parent.appointmentId;</method></netparam>	
			<netparam><method name="getValue">return hib.userlang;</method></netparam>
	    	<handler name="ondata" args="value">
	    		<![CDATA[
		    		if ($debug) Debug.write("deleteAppointment ",value);
		    		parent.lzCalendarRef.reload();
					parent.close();
	    		 ]]>
	    	</handler>
	    </netRemoteCallHib> 
		
		<labelText name="_titleLabel" x="4" y="24" labelid="572" fontstyle="bold" /> 
			
		<customEdittext name="_title" x="100" y="24" datapath="local:classroot.eventDS:/title"
				text="$path{'text()'}" 
			width="$once{ parent.width-110 }" height="24" />
			
			
		<!-- Start Date / Time -->
		<dateField name="_dateStart" y="50" x="100" width="104" datapath="local:classroot.eventDS:/start">
			<handler name="ondata" args="d">
				this.setAttribute("text",parseDateStringFromXmlString(d.childNodes[0].data));
			</handler>
		</dateField>
		
		<labelText name="_dateTimeStartLabel" x="220" y="50" labelid="570" fontstyle="bold" /> 
			
		<customEdittext name="_timeStart" x="270" 
      					y="50" width="50" regexpType="time" text="08:00" datapath="local:classroot.eventDS:/start">
      		<handler name="ondata" args="d">
				this.setAttribute("text",parseTimeStringFromXmlString(d.childNodes[0].data));
			</handler>
      	</customEdittext>
      					
      	<!-- End Date / Time -->			
		<labelText name="_dateTimeEndLabel" x="326" y="50" labelid="571" fontstyle="bold" />  
			
		<!-- 
		 we currently do not support multi date events
		<dateField name="_dateEnd" y="50" x="372" width="104" datapath="local:classroot.eventDS:/end">
			<handler name="ondata" args="d">
				this.setAttribute("text",parseDateStringFromXmlString(d.childNodes[0].data));
			</handler>
		</dateField>
		 -->
			
		<customEdittext name="_timeEnd" x="376" 
      					y="50" width="50" regexpType="time" text="10:00" datapath="local:classroot.eventDS:/end">
      		<handler name="ondata" args="d">
				this.setAttribute("text",parseTimeStringFromXmlString(d.childNodes[0].data));
			</handler>
      	</customEdittext>
      					
        <!-- Remindertype -->
		<labelText name="_reminderTypeLabel" x="4" y="76" labelid="565" fontstyle="bold" /> 
		
		<resetCombobox name="_reminderType" x="100" width="$once{ parent.width-110 }"
			 			  editable="false" shownitems="5" y="76" datapath="local:classroot.eventDS:/reminderId">
			<handler name="onvalue" args="v">						
				if ($debug) Debug.write("reminderTypeId: ",parent.reminderTypeId);
				if(this.getValue == 0 ) {
					parent.reminderTypeId = null;
				} else{
  					parent.reminderTypeId = this.getValue();												
  					if ($debug) Debug.write("reminderTypeId: ",parent.reminderTypeId);
				}
			</handler> 
			<handler name="ondata" args="remindtypeNode">
				if ($debug) Debug.write("remindtype ondata 1: ", remindtypeNode.childNodes[0].data);
				var remTypeId = Number(remindtypeNode.childNodes[0].data);
				if (remTypeId > 0) {
					parent.reminderTypeId = remTypeId;
				    this.selectItem(remTypeId);
			    }
			</handler>
			<textlistitem datapath="local:classroot.getAppointmentReminderTypList:/getAppointmentReminderTypListResponse/return"
				text="$path{'name/text()'}" value="$path{'typId/text()'}" />
	 	</resetCombobox> 
	 	
	 	<!-- Roomtype -->
		<labelText name="_roomTypeLabel" x="4" y="102" labelid="619" fontstyle="bold" /> 
		
		<resetCombobox name="_roomType" width="$once{ parent.width-110 }" y="102" x="100" editable="false" 
					datapath="local:classroot.eventDS:/roomTypeId">
			<handler name="ondata" args="roomTypeIdNode">
				if ($debug) Debug.write("remindtype ondata 1: ", roomTypeIdNode.childNodes[0].data);
				var remTypeId = Number(roomTypeIdNode.childNodes[0].data);
				if (remTypeId > 0) {
				    this.selectItem(remTypeId);
			    }
			</handler>
	        <handler name="oninit" >
	            <![CDATA[
	            for (var i=0;i<canvas.roomTypesInitValues.length;i++){
	                this.addItem(canvas.roomTypesInitValues[i].name,canvas.roomTypesInitValues[i].roomtypes_id);
	            }
	            //this.selectItem(String(canvas.roomTypesInitValues[0].roomtypes_id));
	            ]]>
	        </handler> 
        </resetCombobox> 
	 	
	 	<!-- password protected -->
		<labelCheckbox name="_ispasswordProtected" y="128" fontsize="11" x="10" labelid="524"
				datapath="local:classroot.eventDS:/isPasswordProtected">
			<handler name="ondata" args="d">
				//if ($debug) Debug.write("ondata _ispasswordProtected ",d.childNodes[0].data);
				if (d.childNodes[0].data == "true") {
					this.setValue(true);
				} else {
					this.setValue(false);
				}
			</handler>
		</labelCheckbox>
			
		<!-- password -->
		<labelText labelid="525" y="154" x="4" fontstyle="bold" 
				fgcolor="${ ((!parent._ispasswordProtected.value) ? 0xCCCCCC : 0x000000 ) }" />
		<customEdittext name="_password" enabled="${ parent._ispasswordProtected.value }" password="true"
						width="$once{ parent.width-110 }" x="100" y="154" />
						
		<view resource="messagebox_info_rsc" x="4" y="180" />
	
		<labelText name="password_info" labelid="1445" x="24" y="180" 
							multiline="true" width="$once{ parent.width-34 }" />
	 	
	 	<!-- participents -->
	 	<view name="_participentsIconBar" layout="axis:x" x="$once{ parent.width-50 }" y="230">
	        <baseChooseIconView labelid="812" height="20" width="19" 
	        		bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }"
	                            resourceN="calendar_add_user_rsc">
	            <handler name="onclick">
	                new lz.addAttendee(canvas,{refObj:parent.parent._participentList});
	            </handler>
	        </baseChooseIconView>
	        <baseChooseIconView labelid="629" height="20" width="19" 
	        			bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }"
	                            resourceN="calendar_add_user_external_rsc" >
	            <handler name="onclick">
	                new lz.addExternalAttendee(canvas,{refObj:parent.parent._participentList});
	            </handler>
	        </baseChooseIconView>
	        <view bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" height="20" width="1" />
	    </view>
	 	
	 	<labelText name="_participentLabel" x="4" y="250" labelid="803" fontstyle="bold" /> 
	 	
	 	<view name="_participentList" x="100" y="250" height="100" 
            		  bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" 
            		  width="$once{ parent.width-110 }">
           
            <method name="addListItem" args="userId,firstName,lastName,email,memberId,jNameTimeZone">
            	<![CDATA[
            		var tObject = new Object();
            		tObject.meetingMember = new Object();
            		tObject.meetingMember.userid = userId;
           			tObject.meetingMember.firstname = firstName;
           			tObject.meetingMember.lastname = lastName;
           			tObject.meetingMember.email = email;
           			tObject.meetingMember.meetingMemberId = memberId;
           			tObject.meetingMember.jNameTimeZone = jNameTimeZone;
           			var tDataElement = LzDataElement.valueToElement(tObject);
           			var tPointer = new lz.datapointer();
           			tPointer.setPointer(tDataElement.childNodes[0]);
           			parent.eventDS.getPointer().addNodeFromPointer(tPointer);
           			//parent.eventDS.getPointer().updateData();
            	]]>
            </method> 	
            
            <method name="getMemberArrayValue">
            	<![CDATA[
            		var tArray = new Array();
            		
            		for (var i=0;i<this._content._inner.subviews.length;i++) {
            		
            			var tViewObj = this._content._inner.subviews[i];
            			
            			if (!tViewObj.isLoaded) {
            				continue;
            			}
            			
            			var tObject = new Object();
            			tObject.meetingMemberId = tViewObj.memberId;
		        		tObject.firstname = tViewObj.firstName;
		        		tObject.lastname = tViewObj.lastName;
		        		tObject.email = tViewObj.email;
		        		tObject.userId = tViewObj.userId;
		        		tObject.jNameTimeZone = tViewObj.jNameTimeZone;
		        		
		        		tArray.push(tObject);
            		}
            		
            		return tArray;
            	]]>
            </method>
              
          	<view name="_content" bgcolor="0xFFFFFF" x="1" y="1" clip="true"
          			width="$once{ parent.width-1 }" height="$once{ parent.height-1 }">
          		<view name="_inner">
          			<attendeeListItem datapath="local:classroot.eventDS:/meetingMember"
           						width="$once{ parent.parent.width-10 }">
           						
           				<attribute name="isLoaded" value="false" type="boolean" />
           				
           				<handler name="ondata" args="d">
           					if ($debug) Debug.write("meetingMember -- ondata ",d);
           					this.isLoaded = true;
           					var tDataPointer = new lz.datapointer();
           					tDataPointer.setPointer(d);
           					this.userId = tDataPointer.xpathQuery( 'userid/text()' );
           					this.firstName = tDataPointer.xpathQuery( 'firstname/text()' );
           					this.lastName = tDataPointer.xpathQuery( 'lastname/text()' );
           					this.email = tDataPointer.xpathQuery( 'email/text()' );
           					this.memberId = tDataPointer.xpathQuery( 'meetingMemberId/text()' );
           					this.jNameTimeZone = tDataPointer.xpathQuery( 'jNameTimeZone/text()' );
           					this.memberText.setAttribute("text",this.firstName+' '+this.lastName+' ['+this.email+']');
           				</handler>
     				</attendeeListItem>
          			<simplelayout axis="y" spacing="1" />
          		</view>
           		<om_vscrollbar />
           	</view>
        </view>
        
        <!-- Location -->
        <labelText name="_locationLabel" x="4" y="354" labelid="569" fontstyle="bold" /> 
        
        <customEdittext name="_location" 
        		datapath="local:classroot.eventDS:/location" text="$path{'text()'}" 
        		width="$once{ parent.width-110 }" x="100" y="354" />
		
		<!-- Comment -->
		<labelText name="_descrLabel" x="4" y="380" labelid="573" fontstyle="bold" /> 
	
		<customScrollEdittext name="_descr" y="380" x="100" 
				datapath="local:classroot.eventDS:/comment" text="$path{'text()'}" 
				width="$once{ parent.width-110 }" height="124" /> 
			
		<simpleLabelButton name="_saveEvent" labelid="813" width="100" 
				x="$once{ parent.width-315 }" y="$once{ parent.height-24 }" >
	        <handler name="onclick">
				this.setAttribute('enabled', false);
                parent.saveAndClose();
	        </handler>
        </simpleLabelButton>
		
		<simpleLabelButton name="_deleteEvent" labelid="814" width="100" 
	           x="$once{ parent.width-210 }" y="$once{ parent.height-24 }" >
	         <handler name="onclick">
         		if (canvas.contactUser != 0) {
           			new lz.labelerrorPopup(canvas,{errorlabelid:1278});
           			return;
           		}
           		
           		if (parent.isConnectedEvent) {
           			new lz.confirmationSingle(canvas,{refObj:this,labelid:1281,
                                   labeliderror:1280,showCheckBox:false});
           		} else {
           			new lz.confirmationSingle(parent.parent,{
			        				refObj:this,labelid:797,
	           						showCheckBox:false,
	           						labeliderror:796
           						});
           		} 
           	</handler>
           	<method name="sendConfirmation" args="refObj,t">
           		parent.deleteAppointment.doCall();
           	</method>
        </simpleLabelButton>
	
	    <simpleLabelButton labelid="1130" width="100" x="$once{ parent.width-105 }" 
	           y="$once{ parent.height-24 }" 
	           onclick="this.parent.close();" />			
		
	</class>

</library>