<?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>
	<!---
		This class shows a invitation window with clicking button which is located in video and audio panel.
	-->
	<!-- placeholder
		label: send invitation
	-->
	<class name="inviteMainWindow" extends="labelExplorerBox" labelid="214" 
			docking="true" closable="true" width="464" x="200" y="100" height="440">
		
		<attribute name="roomType" value="conference" type="string" />
		<attribute name="baseUrl" value="http://www.denic.de" type="string" />
    	
    	<handler name="oninit">
            <![CDATA[
            
                lz.ModeManager.makeModal(this);
                var pressEnter = new LzDelegate(this, "register");
                lz.Keys.callOnKeyCombo(pressEnter, ["enter"]);
                
                getTimeZoneOffset(this);
                
            ]]>
        </handler>
        
        <method name="callback" args="returnValue">
            if ($debug) Debug.write("getTimeZoneOffset callback ",returnValue);
                    
            var std_time_offset = Number(returnValue);
            
            this.setOffset(std_time_offset);
        </method>
        
        <method name="setOffset" args="std_time_offset">
            <![CDATA[
            std_time_offset = Math.round(std_time_offset);
            var timeZoneJavaFormat = "Etc/GMT";
            if (std_time_offset > 0) {
                timeZoneJavaFormat += "+"+std_time_offset;
            } else {
                timeZoneJavaFormat += "-"+std_time_offset;
            }
            
            if ($debug) Debug.write("timeZoneJavaFormat :: ",timeZoneJavaFormat);
            
            var tItem =  this._timeZone.getItem(timeZoneJavaFormat);
            
            if (tItem != null) {
            	this._timeZone.selectItem(timeZoneJavaFormat);
            } else {
            	this._timeZone.selectItemAt(0);
            }
            
            ]]>
        </method> 
        
    	<handler name="onclose">
    		lz.ModeManager.release(this);
    	</handler>	
		
		<!-- label: recipient -->
		<labelText labelid="216" y="24" width="120" />
		<customEdittext name="_recipient" width="340" regexpType="email" x="120" y="22" />
		
		<!-- label: subject -->
		<labelText labelid="215" y="52" width="120" />
		<customEdittext name="_subject" labelid="532" width="340" enabled="false" x="120" y="52" />	
		
		<!-- label: message -->
		<labelText labelid="217" y="82" width="120" />
		<!--
		<customEdittext name="_message" width="340" x="120" y="82" height="100" 
						multiline="true" />
		 -->
		<customScrollEdittext name="_message" width="340" x="120" y="82" height="100" />	
		
							  
		<!-- label: password protected -->
		<labelCheckbox name="_ispasswordProtected" y="192" fontsize="11" x="4" labelid="524"  />
			
		<!-- label: password -->
		<labelText labelid="525" y="220" x="4" fgcolor="${ ((!parent._ispasswordProtected.value) ? 0xCCCCCC : 0x000000 ) }" />
		<customEdittext name="_password" enabled="${ parent._ispasswordProtected.value }" password="true"
						width="340" x="120" y="218" />
		
		<!-- label: validity period -->
		<labelText labelid="526" y="252" width="120" />
	
		<radiogroup name="_valid" x="120" y="256" layout="class:simplelayout; axis:x">
			<!-- label: endless -->
	            <labelRadioButton value="1" labelid="527" fontsize="11" />
			<!-- label: period -->
	            <labelRadioButton value="2" labelid="528" fontsize="11" />
			<!-- label: one-time -->
	        	<labelRadioButton value="3" labelid="529" fontsize="11" />
		</radiogroup>

		<!-- label: valid from -->		
		<labelText x="4" labelid="530" y="284" fgcolor="${ ((parent._valid.value==2) ? 0x000000 : 0xCCCCCC ) }" />
		<dateField x="120" y="282" name="_valid_from" setDefaultToday="true" enabled="${ ((parent._valid.value==2) ? true : false ) }" />
		<customEdittext name="_timeFrom" enabled="${ ((parent._valid.value==2) ? true : false ) }"
					width="50" x="232" y="282" text="$once{ getStringTime() }" regexpType="time" />	   
		
		<!-- label: valid to -->			
		<labelText x="4" labelid="531" y="314" fgcolor="${ ((parent._valid.value==2) ? 0x000000 : 0xCCCCCC ) }" />
		<dateField x="120" y="314" name="_valid_to" setDefaultToday="true" additionalDay="1" enabled="${ ((parent._valid.value==2) ? true : false ) }" />		
		<customEdittext name="_timeTo" enabled="${ ((parent._valid.value==2) ? true : false ) }"
						width="50" x="232" y="314" text="$once{ getStringTime() }" regexpType="time" />				   

        <labelText labelid="1143" width="200" y="344" fgcolor="${ ((parent._valid.value==2) ? 0x000000 : 0xCCCCCC ) }"  x="4" />
        <resetCombobox name="_timeZone" editable="false" y="344" width="270" x="120"
         			   enabled="${ ((parent._valid.value==2) ? true : false ) }"
         			   fontsize="11" style="componentStyle">
            <labeldTextListItem datapath="timeZoneSet:/item" text="$path{ 'frontEndLabel/text()' }" 
                value="$path{ 'jname/text()' }" />
        </resetCombobox>
         
		<labelText labelid="59" width="200" y="374" x="4" />
        <resetCombobox name="_languages" editable="false" y="374" width="270" x="120"
         			   fontsize="11" style="componentStyle">
            <netRemoteCallHib name="getLanguages" funcname="languageservice.getLanguages" remotecontext="$once{ canvas.thishib }" >
                <handler name="oninit">
                    this.doCall();
                </handler>

                <handler name="ondata" args="value">
                    //The onResult-Handler will be called be the rtmpconnection
                    <![CDATA[
                        for (var i=0; i<value.length; i++) {
                            parent.addItem(value[i].name,value[i].language_id);
                        }
                        parent.selectItem(canvas.language_id);
                    ]]>
                </handler>
            </netRemoteCallHib>
        </resetCombobox>

        <!-- label: send -->
		<simpleLabelButton labelid="218" x="$once{ parent.width-260 }" width="120" y="$once{ parent.height-26 }">
			<handler name="onclick">
				<![CDATA[
					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) {
							parent.baseUrl = urlObject.protocol+"://"+urlObject.host+":"+port+urlObject.path;
						} else {
							parent.baseUrl = urlObject.protocol+"://"+urlObject.host+urlObject.path;
						}
					} else {
						parent.baseUrl = urlObject.protocol+"://"+urlObject.host+urlObject.path;
					}
					
					if( $debug ) Debug.write("parent.baseUrl: ",parent.baseUrl);
					if (!canvas.isConference){
						parent.roomType = "audience";
					}
					
					parent.sendInvitationHash.doCall();
				]]>
			</handler>
		</simpleLabelButton>
	
		<!-- label: cancel -->
		<simpleLabelButton labelid="219" x="$once{ parent.width-130 }" width="120" y="$once{ parent.height-26 }">
			<handler name="onclick">
				parent.close();
			</handler>
		</simpleLabelButton>
	   
	      <netRemoteCallHib name="sendInvitationHash" funcname="invitationservice.sendInvitationHash" remotecontext="$once{ canvas.thishib }" >    
        		
        		<netparam name="sid"><method name="getValue">return canvas.sessionId;</method></netparam>
			    <netparam name="username"><method name="getValue">return hib.userobject.firstname+' '+hib.userobject.lastname</method></netparam>
	            <netparam name="message"><method name="getValue">return this.parent.parent._message.getText();</method></netparam>
	            <netparam name="baseurl"><method name="getValue">return parent.parent.baseUrl;</method></netparam>
	            <netparam name="email"><method name="getValue">return this.parent.parent._recipient.getText();</method></netparam>
	            <netparam name="subject"><method name="getValue">return this.parent.parent._subject.getText();</method></netparam>
	            <netparam name="roomid"><method name="getValue">return hib.currentroomid;</method></netparam>
	            <netparam name="conferencedomain"><method name="getValue">return hib.conferencedomain;</method></netparam>
	            <netparam name="ispasswordProtected"><method name="getValue">return parent.parent._ispasswordProtected.value;</method></netparam>
	            <netparam name="password"><method name="getValue">return parent.parent._password.getText();</method></netparam>
	            <netparam name="valid"><method name="getValue">return parent.parent._valid.value;</method></netparam>
	            <netparam name="validFromDate"><method name="getValue">return parent.parent._valid_from.getDate();</method></netparam>
	            <netparam name="validFromTime"><method name="getValue">return parent.parent._timeFrom.getText();</method></netparam>
	            <netparam name="validToDate"><method name="getValue">return parent.parent._valid_to.getDate();</method></netparam>
	            <netparam name="validToTime"><method name="getValue">return parent.parent._timeTo.getText();</method></netparam>
                <netparam name="language_id"><method name="getValue">return parent.parent._languages.getValue();</method></netparam>
                <netparam name="jNameTimeZone"><method name="getValue">return parent.parent._timeZone.getValue();</method></netparam>
                
	            <handler name="ondata" args="value">
	            	<![CDATA[
	                	//The onResult-Handler will be called be the rtmpconnection
				if ($debug) Debug.write("sendInvitationHash : ",value);
				if (value=="success"){
					parent.close();
				} else {
					new lz.errorPopup(canvas.main_content._content.inner,{error:value});
				}
               ]]>
			</handler>   
		</netRemoteCallHib>
	</class>
</library>
