<?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>

<!--- User Profile edit panel in the useradmin leftblock. Private class only for useradmin -->
<class name="userAdminValueForm" extends="baseContentSaveView">

	<!--- recordContent-id -->
	<attribute name="user_id" value="0" type="number" />
	
	<!--handlers -->

	<handler name="onsavecompleted" >
		//this.getUserById.doCall();
	</handler>
	
	<handler name="onreload" >
		if (this.user_id!=0) this.getUserById.doCall();
	</handler>	

	<handler name="onnew">
		<![CDATA[
    		this.user_id=0;
    		this.level.selectItemAt(0);
            this.username.setAttribute('text','');
            this.firstname.setAttribute('text','');
            this.lastname.setAttribute('text','');
            this.email.setAttribute('text','');
            this.phone.setAttribute('text','');
            this.age.setAttribute('text','');
            this.street.setAttribute('text','');
            this.house.setAttribute('text','');
            this.zip.setAttribute('text','');
            this.town.setAttribute('text','');
    		this.userpass1.setAttribute('text','');
            var defaultstate = canvas.getCountryRecord(1);
            this.state.addAndSelectItem(defaultstate.name,defaultstate.state_id);
            this.adress_comment.setAttribute('text','');
            this.status.selectItem(String('1'));
            this.forceTimeZoneCheck.setValue(false);
            
            var t = this;
            
            function getTimeZoneOffsetCallback(returnValue) {
                            
                if ($debug) Debug.write("getTimeZoneOffsetCallback ",returnValue);
                
                var std_time_offset = Number(returnValue);
                
                t.setOffset(std_time_offset);
                
            }
            
            getTimeZoneOffset(this);
            
            this._organisationslist.clearList();
            this.generateSipUserData.setValue(false);
            this.sip_user.setAttribute('text','');
            this.sip_pass.setAttribute('text','');
            this.sip_auth.setAttribute('text','');
            
			this.userOffers.setAttribute('text',"");
			this.userSearchs.setAttribute('text',"");
			this.showContactData.selectItem("3");
            this.languages.selectItem(String('1'));
			
        ]]>
	</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[
		var timeZoneJavaFormat = "Etc/GMT";
        if (std_time_offset > 0) {
            timeZoneJavaFormat += "+"+std_time_offset;
        } else {
            timeZoneJavaFormat += "-"+std_time_offset;
        }
        
        if ($debug) Debug.write("timeZoneJavaFormat :: ",timeZoneJavaFormat);
        
        this._timeZone.selectItem(timeZoneJavaFormat);
        ]]>
	</method>
	
    <handler name="ondelete" >
		if (this.user_id!=0){
			this.deleteUserAdmin.doCall();
		}
    </handler>
	
	<!-- methods -->

    <method name="initValueFieldsByObject" args="obj">
		this.user_id = obj.user_id;
		if (this.user_id!=0){
			if ($debug) Debug.write("this.getUserById this.user_id",this.user_id);
			this.getUserById.doCall();
		}
    </method>
    
    <method name="initFields" args="obj">
    	<![CDATA[
            if (obj == null) {
                return;
            }
        
			this.level.selectItem(String(obj.level_id));
			this.username.setAttribute('text',obj.login);
			this.firstname.setAttribute('text',obj.firstname);
			this.lastname.setAttribute('text',obj.lastname);
			this.userpass1.setAttribute('text','');
			this.email.setAttribute('text',obj.adresses.email);
			this.phone.setAttribute('text',obj.adresses.phone);
			this.age.setAttribute('text',parseDateToString(obj.age));
			this.street.setAttribute('text',obj.adresses.street);
			this.house.setAttribute('text',obj.adresses.additionalname);
			this.zip.setAttribute('text',obj.adresses.zip);
			this.town.setAttribute('text',obj.adresses.town);
            this.state.addAndSelectItem(obj.adresses.states.name,String(obj.adresses.states.state_id));
			this.adress_comment.setAttribute('text',obj.adresses.comment);
			this.status.selectItem(String(obj.status));
			this.salutation.selectItem(String(obj.title_id));
			this._timeZone.selectItem(String(obj.omTimeZone.jname));
            this.languages.selectItem(String(obj.language_id));
			
			if (obj["forceTimeZoneCheck"] && obj.forceTimeZoneCheck!= null) {
				if (obj.forceTimeZoneCheck) {
					this.forceTimeZoneCheck.setValue(true);
				} else {
					this.forceTimeZoneCheck.setValue(false);
				}
			} else {
				this.forceTimeZoneCheck.setValue(false);
			}
			
			
			this._organisationslist.clearList();
			for (var i=0;i<obj.organisation_users.length;i++){
				this._organisationslist.addItem(obj.organisation_users[i].organisation.name,obj.organisation_users[i].organisation.organisation_id);
			}
			
			this.generateSipUserData.setValue(false);
			
			if (obj.userSipData != null) {
				this.sip_user.setAttribute('text',obj.userSipData.username);
		        this.sip_pass.setAttribute('text',obj.userSipData.userpass);
		        this.sip_auth.setAttribute('text',obj.userSipData.authId);
			} else {
				this.sip_user.setAttribute('text','');
		        this.sip_pass.setAttribute('text','');
		        this.sip_auth.setAttribute('text','');
			}
			
			if (obj.userOffers != null) {
				this.userOffers.setAttribute('text',obj.userOffers);
			} else {
				this.userOffers.setAttribute('text',"");
			}
			
			if (obj.userSearchs != null) {
				this.userSearchs.setAttribute('text',obj.userSearchs);
			} else {
				this.userSearchs.setAttribute('text',"");
			}
			
			if (obj.showContactData != null && obj.showContactDataToContacts != null) {
				
				if (obj.showContactData) {
					this.showContactData.selectItem("1");
				} else if (obj.showContactDataToContacts) {
					this.showContactData.selectItem("2");
				} else {
					this.showContactData.selectItem("3");
				}
				
			}
			
        ]]>
    </method>
	
	<!-- remotecalls -->
	
  	<netRemoteCallHib name="getUserById" funcname="userservice.getUserById" 
  		remotecontext="$once{ canvas.thishib }" > 
  		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
    	<netparam><method name="getValue">return parent.parent.user_id;</method></netparam>
    	<handler name="ondata" args="value">
			if($debug) Debug.write("[admin]userValueForm/getUserById: ",value);
    		parent.initFields(value);
    	</handler>
  	</netRemoteCallHib>
	
	<netRemoteCallHib name="deleteUserAdmin" funcname="userservice.deleteUserAdmin" 
					  remotecontext="$once{ canvas.thishib }" activeErrorHandler="true">      
		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
		<netparam><method name="getValue"> return parent.parent.user_id; </method></netparam>
		<handler name="ondata" args="value">
			//Debug.write("deleteUserAdmin ",value);
			//this.parent.destroy();
			if (value>0){
				this.parent.parent._turnoverlist.oncallnext.sendEvent();
				this.parent.onnew.sendEvent();
			}
		</handler>
	</netRemoteCallHib>		

  	<netRemoteCallHib name="saveOrUpdateUser" funcname="userservice.saveOrUpdateUser" 
  		remotecontext="$once{ canvas.thishib }" registerObject="true" activeErrorHandler="false" >   
		<attribute name="sendObject" value="null" />
		<!-- gets called by Observer -->
  		<method name="prepareCall">
  			this.sendObject=new Array();
  			this.sendObject["user_idClient"] = this.parent.user_id;
  			this.sendObject["login"] = this.parent.username.getText();
  			this.sendObject["password"] = this.parent.userpass1.getText();
  			this.sendObject["firstname"] = this.parent.firstname.getText();
  			this.sendObject["lastname"] = this.parent.lastname.getText();
  			this.sendObject["email"] = this.parent.email.getText();
  			this.sendObject["phone"] = this.parent.phone.getText();
  			this.sendObject["street"] = this.parent.street.getText();
  			this.sendObject["additionalname"] = this.parent.house.getText();
  			this.sendObject["zip"] = this.parent.zip.getText();
  			this.sendObject["town"] = this.parent.town.getText();
  			this.sendObject["states_id"] = this.parent.state.getValue();
  			this.sendObject["comment"] = this.parent.adress_comment.getText();
  			this.sendObject["telefon"] = '';
  			this.sendObject["fax"] = '';
			var date = this.parent.age.getText();
			if (date.length>0) date = parseStringToDate(date);
  			this.sendObject["userage"] = date;
  			this.sendObject["mobil"] = '';
  			this.sendObject["availible"] = 0;
  			this.sendObject["status"] = Number(this.parent.status.getValue());
  			this.sendObject["level_id"] = Number(this.parent.level.getValue());
			this.sendObject["title_id"] = Number(this.parent.salutation.getValue());
			this.sendObject["jNameTimeZone"] = parent._timeZone.getValue();
            this.sendObject["language_id"] = parent.languages.getValue();
			this.sendObject["forceTimeZoneCheck"] = parent.forceTimeZoneCheck.getValue();
  			this.sendObject["organisations"] = this.parent._organisationslist.getAllItems();
  			
  			this.sendObject["generateSipUserData"] = this.parent.generateSipUserData.getValue();
  			this.sendObject["sip_user"] = this.parent.sip_user.getText();
  			this.sendObject["sip_pass"] = this.parent.sip_pass.getText();
  			this.sendObject["sip_auth"] = this.parent.sip_auth.getText();
  			
  			
			this.sendObject["userOffers"] = parent.userOffers.getText();
			this.sendObject["userSearchs"] = parent.userSearchs.getText();
			
			var showContactData = Number(parent.showContactData.getValue());
			
			if (showContactData == 1) {
				this.sendObject["showContactData"] = true;
				this.sendObject["showContactDataToContacts"] = true;
			} else if (showContactData == 2) {
				this.sendObject["showContactData"] = false;
				this.sendObject["showContactDataToContacts"] = true;
			} else if (showContactData == 3) {
				this.sendObject["showContactData"] = false;
				this.sendObject["showContactDataToContacts"] = false;
			}

  			if ($debug) Debug.write("prepareCall: ",this.sendObject);
  		</method>
  		<netparam><method name="getValue"> return canvas.sessionId; </method></netparam>
    	<netparam><method name="getValue">return parent.sendObject;</method></netparam>	  		
    	<handler name="ondata" args="val">
			<![CDATA[
				if ($debug) Debug.write("saveOrUpdateUser ondata: ",val);
				if (val>0){
					var obj = new Array();
					obj["user_id"] = val;
					this.parent.initValueFieldsByObject(obj);
					
					if (this.parent._organisationslist.getAllItems().length < 1)
					{
						new lz.rpcErrorDialog(canvas.main_content._content.inner,{errorid:-23});
					}
					
					this.parent.parent._turnoverlist.oncallnext.sendEvent();
				}
			]]>
    	</handler>
  	</netRemoteCallHib>	
	
	<!-- content -->
    
    <labelText labelid="143" width="200" y="40" resize="false" fontstyle="bold" />
    
    <labelText labelid="132" width="200" y="70" resize="false" x="2"/>
        <customEdittext name="username" y="70" x="120" width="270" />

    <labelText labelid="133" width="200" y="100" resize="false" x="2"/>
        <customEdittext name="userpass1" y="100" password="true" x="120" width="270" />

    <labelText labelid="135" width="200" y="130" resize="false" x="2"/>
        <resetCombobox name="salutation" width="100" y="130" x="120" editable="false" fontsize="11">
	        <handler name="oninit" >
	            <![CDATA[
		            for (var i=0;i<canvas.salutationsInitValues.length;i++){
		                this.addItem(canvas.salutationsInitValues[i].label.value,canvas.salutationsInitValues[i].salutations_id);
		            }
		            this.selectItem(String(canvas.salutationsInitValues[0].salutations_id));
	            ]]>
	        </handler> 
        </resetCombobox> 
        <customEdittext name="firstname" y="130" x="230" width="160" />
        
    <labelText labelid="136" width="200" y="160" resize="false" x="2"/>
        <customEdittext name="lastname" y="160" x="120" width="270" />   
        
    <labelText labelid="1143" width="200" y="190" resize="false" x="2"/>
         <resetCombobox name="_timeZone" editable="false" y="190" width="270" x="120"
                       fontsize="11" style="componentStyle">
            <labeldTextListItem datapath="timeZoneSet:/item" text="$path{ 'frontEndLabel/text()' }" 
                value="$path{ 'jname/text()' }" />
         </resetCombobox>   
             
	<labelText labelid="111" width="300" y="220" resize="false" x="2"/>

        <resetCombobox name="languages" width="270" y="220" x="120" editable="false">
            <labeldTextListItem datapath="languagesSet:/item" text="$path{ 'name/text()' }"
                value="$path{ 'language_id/text()' }" />
            <handler name="oninit">
                var g = canvas.getUserData();
                if($debug) Debug.write("checkLoginData/g: ",g);
                if (g["userlang"]!=null) {
                    this.selectItem(g["userlang"]);
                } else {
                    this.selectItem(String(canvas.thishib.userlang));
                }
            </handler>
        </resetCombobox>

    <view resource="messagebox_info_rsc" x="0" y="250" />
    
    <labelText labelid="1149" x="24" y="250"  fontstyle="italic"
               multiline="true" width="364" />
               
	<labelText labelid="1148" width="200" y="280" resize="false" x="2"/>  
        <labelCheckbox name="forceTimeZoneCheck" width="270" y="280" x="130" fontsize="11" />
	
    <labelText labelid="137" width="200" y="310" resize="false" x="2"/>
        <customEdittext name="email" y="310" x="120" width="270" regexpType="email" />
        				
    <labelText labelid="607" width="200" y="340" resize="false" x="2"/>
        <customEdittext name="phone" y="340" x="120" width="270" />
        
    <labelText labelid="138" width="200" y="370" resize="false" x="2"/>
        <dateField name="age" y="370" x="120" width="270" />
        
    <labelText labelid="139" width="200" y="400" resize="false" x="2"/>
        <customEdittext name="street" y="400" x="120" width="220" />
        <customEdittext name="house" y="400" x="350" width="40" />
        
    <labelText labelid="140" width="200" y="430" resize="false" x="2"/>
        <customEdittext name="zip" y="430" x="120" width="70" />   
        <customEdittext name="town" y="430" x="200" width="190" />                        
         
    <labelText labelid="141" width="200" y="460" resize="false" x="2"/>  
		<dynamicCombobox name="state" width="270" y="460" x="120"
						 text="Switzerland" value="204" />
    
    <labelText labelid="158" width="200" y="490" resize="false" x="2"/>  
        <resetCombobox name="status" width="270" y="490" x="120" editable="false" fontsize="11">
	        <handler name="oninit" >
	            <![CDATA[
	            this.addItem(canvas.getLabelName(159),'0');
	            this.addItem(canvas.getLabelName(160),'1');
	            this.selectItem('0');
	            ]]>
	        </handler> 
        </resetCombobox> 


    <labelText labelid="169" width="200" y="520" resize="false" x="2"/>  
        <resetCombobox name="level" width="270" y="520" x="120" editable="false" fontsize="11">
	        <handler name="oninit" >
	            <![CDATA[
	            this.addItem(canvas.getLabelName(166),'1');
	            this.addItem(canvas.getLabelName(167),'2');
				this.addItem(canvas.getLabelName(168),'3');
				this.addItem(canvas.getLabelName(1311),'4');
	            this.selectItem('1');
	            ]]>
	        </handler> 
        </resetCombobox> 
	
    <labelText labelid="142" width="200" y="550" resize="false" x="2"/>
        <customScrollEdittext name="adress_comment" y="550" x="120" width="270" 
                        height="70" />
       
    <labelText labelid="161" width="200" y="630" resize="false" x="2"/>     
    <simpleValueList name="_organisationslist" y="630" x="120" width="270" height="100" 
		multiselect="true" />
	
	<blueButton width="20" height="20" resourceItem="edit_add_rsc"
        			x_insetResource="2" y_insetResource="2" y="632" x="396"
        			width_insetResource="16" height_insetResource="16">
		<handler name="onclick">
			this.parent.addOrganisationToUser();
		</handler>
		<labelTooltip labelid="172" />
	</blueButton>
	
	<method name="addOrganisationToUser">
		//if (this.user_id!=0)
			new lz.chooseOrganisationWindow(parent,{refObj:this,item_id:this.user_id});
	</method>	
	
	<blueButton width="20" height="20" resourceItem="button_cancel_rsc"
        			x_insetResource="2" y_insetResource="2" y="632" x="416"
        			width_insetResource="16" height_insetResource="16">
		<handler name="onclick">
			new lz.confirmDeleteWindow(canvas.main_content._content.inner,{refObj:this});
		</handler>
		<method name="confirmDelete">
			if (this.parent._organisationslist._selected!=null)
				for (var i in this.parent._organisationslist._selected)	this.parent._organisationslist.removeItem(this.parent._organisationslist._selected[i].value);
		</method>
		<labelTooltip labelid="176" />
	</blueButton>
	
    <!-- SIP Account Data -->
    <labelText labelid="893" width="200" y="740" resize="false" 
               x="0" fontstyle="bold" />   
    
    <view resource="messagebox_info_rsc" x="0" y="760" />
    
    <labelText labelid="894" x="24" y="760"  fontstyle="italic"
               multiline="true" width="364" />

    <labelText labelid="921" width="200" y="830" resize="false" x="2"/>  
        <labelCheckbox name="generateSipUserData" width="270" y="830" x="140" fontsize="11" />

    <labelText labelid="895" width="200" y="860" resize="false" x="2"/>
        <customEdittext name="sip_user" y="860" x="120" width="270"  
        				text="" />
        				
	<labelText labelid="896" width="200" y="890" resize="false" x="2"/>
        <customEdittext name="sip_pass" y="890" x="120" width="270"  
        				text="" />
        				
    <labelText labelid="897" width="200" y="920" resize="false" x="2"/>
        <customEdittext name="sip_auth" y="920" x="120" width="270"  
        				text="" />
        				
    <!-- Community Settings -->
    <labelText labelid="1159" width="200" y="950" resize="false" 
               x="0" fontstyle="bold" />      				
        				
   	<radiogroup name="showContactData" layout="class:simplelayout;axis:y;spacing:2" y="980" x="10">
        <labelRadioButton labelid="1160" value="1" />
        <labelRadioButton labelid="1168" value="2" />
        <labelRadioButton labelid="1169" value="3" />
    </radiogroup> 
    
	<labelText labelid="1162" width="200" y="1040" resize="false" x="2"/>
        <customScrollEdittext name="userOffers" y="1040" x="120" width="270" 
           			 height="100" />	

	<labelText labelid="1163" width="200" y="1150" resize="false" x="2"/>
        <customScrollEdittext name="userSearchs" y="1150" x="120" width="270" 
           			 height="100" />	
		     				
	<view y="1440" />        				
        				        				
</class>

</library>
