<?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>
    
<dataset name="myresultnavi" />

<dataset name="languagesSet" />        

<class name="userStatus" extends="view" width="250" height="30">
    <attribute name="statusText" type="string" />
    <attribute name="statusColor" type="number" value="0" />

    <text name="status" width="240" height="20" x="5" y="5" fontstyle="bold" fgcolor="0" text="defaulttext" fontsize="10"/>

    <handler name="oninit">
        this.status.setAttribute("text", this.statusText);
        this.status.setAttribute("fgcolor", this.statusColor);
        this.setAttribute("visibility", "visible");
        lz.Timer.addTimer( new LzDelegate( this, "selfDestroy" ), 3000 );
    </handler>

    <method name="selfDestroy" args="ignore=null">
        this.destroy();
    </method>
</class>

<class name="hibRtmpConnection" extends="rtmpConnection" debug="false"
    src="$once{ this.getUrl() }" >

    <attribute name="counterror" type="number" value="0" />
    
    <attribute name="loaderVar" value="null" />
    
    <attribute name="userScope" value="hibernate" type="string" />
    
    <!-- refreshing the session regulary -->
    <attribute name="refreshDelegate" value="null" />
    
    <!-- UserId-->
    <attribute name="UserID" value="1" type="number" />
    <!-- reconnect after each conferenceView -->
    <attribute name="reconnectAfterRoomleft" type="boolean" value="false" />
    <attribute name="reconnectedRoomInstance" value="null" />
    
    <attribute name="reconnectionAction" value="false" type="boolean" />
    <attribute name="reconnectObjRef" value="null" />
         
     <attribute name="userobject" value="null" />
     
     <!-- default will be loaded on startup -->
     <attribute name="userlang" value="1" type="number" />
     
     <!-- The default Language will be loaded on init  -->
     <attribute name="initlanguageLoaded" value="false" type="boolean" />
     
     <!-- This domain is the orgdomain used in the video-conference -->
     <attribute name="conferencedomain" value="public" type="string" />
     
     <!-- if this connection is used for testing the app
     see test-setup.lzx -->
     <attribute name="testAppLoading" value="false" type="boolean" />
     
     <!-- 
        the real ROOM_ID
     -->
     <attribute name="currentroomid" value="0" type="number" />
     
     <!-- This is the current domain the user has logged-in -->
     <attribute name="currentdomain" value="domain1" type="string" />
     <attribute name="currentdomainObj" value="domain1" type="string" />
     
     <!--- the current Invitation-Object -->
     <attribute name="currentInvitation" value="null" />
    
    <!-- shows what kind of conferenceView it is at the moment
        wether its conferenceView or audienceView -->
    <attribute name="modus" value="" type="string" />
    
    <!-- shows what kind of room the use is public or private -->
    <attribute name="roomtype" value="" type="string" />
        
    <attribute name="showKickMessage" value="false" type="boolean"/>
    <attribute name="showFullMessage" value="false" type="boolean"/>
         
    <attribute name="useRTMPT" value="false" type="boolean" />
    <attribute name="connected" value="false" type="boolean" />
    
    <method name="getProtocol">
    	if (canvas.useSSL) {
    		return "rtmps";
    	}
    	if (this.useRTMPT) {
    		return "rtmpt";
    	}
    	return "rtmp";
    </method>
    
    <method name="getPort">
    	if (canvas.useSSL) {
            return canvas.rtmpsslport;
        }
    	if (this.useRTMPT) {
    		return canvas.red5httpport;
    	}
    	return canvas.rtmpport;
    </method>
    
    <method name="getHost">
    	return canvas.rtmphostlocal;
    </method>
    
    <method name="getWebappRootKey">
    	return canvas.webAppRootKey;
    </method>
         
    <!-- 
    	canvas.getUrl() can not be reused since it has different protocol and port 
    	and potentially in cluster another host, the only thing that stays the same
    	no matter if hosted on slave or on master, is the scope, so
    	userScope always stays the same
     -->
    <method name="getUrl">
        return this.getProtocol() + '://' + this.getHost() + ':' + this.getPort() 
        			+ '/' + this.getWebappRootKey() + '/' + this.userScope;
    </method>
             
     <!--
        The onconnect Method is triggered several times:
             - When you enter a room the NetConnection will close and reconnect to the Scope of the Room
             - When you leave the room again it will be re-connected to the default scope again
      -->
     <handler name="onconnect">
        if($debug) Debug.write("hibRtmpConnection/onconnect");
        if (this.reconnectionAction){
        	if (canvas.wicketsid == null) {
            	this.overwritePublicSID.doCall();
	            this.setUsernameReconnect.doCall();
            } else {
	            canvas.sessionId = canvas.wicketsid;
				canvas.sendViaLocalConnection(canvas.vid_lc_name, "setSessionId", [canvas.sessionId]);
	            this.getPublicSID.doCall();
            }
        } else if (this.reconnectAfterRoomleft) {
            //Return to content after reconnect
            canvas.thishib.reconnectedRoomInstance.destroy();
            this.overwritePublicSID.doCall();
            this.setUsernameReconnect.doCall();
        } else if (canvas.wicketsid != null) {
            canvas.sessionId = canvas.wicketsid;
			canvas.sendViaLocalConnection(canvas.vid_lc_name, "setSessionId", [canvas.sessionId]);
			if (canvas.thishib.loaderVar != null) {
            	canvas.thishib.loaderVar.setProgress();
            }
            this.getPublicSID.doCall();
        } else {
            this.refreshDelegate = new LzDelegate( this, "refreshSessionMeth" );
            //lz.Timer.addTimer( this.refreshDelegate, 60000 );
            lz.Timer.addTimer( this.refreshDelegate, canvas.refreshSession );
            if (canvas.thishib.loaderVar != null) {
            	canvas.thishib.loaderVar.setProgress();
            }
            
            //Load Session Data
            this.getsessiondata.callRPC();    
        }
        connected = true;
    </handler>
    
    <handler name="ondisconnect">
        canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "disconnect", [canvas.thishib.src]);
        connected = false;
    </handler>
    
    <method name="reconnectComplete">
         if (this.reconnectionAction){
            this.reconnectionAction = false;
            this.reconnectObjRef.reconnectSuccess();
        } else if (this.reconnectAfterRoomleft) {
            loadContentByTempActionForNavi();
        }
        canvas.currentContentView.sendInit.sendEvent(this);
    </method>
    
	<handler name="onerror" >
	<![CDATA[
		canvas.remoteLogWrite("error status='" + this.status + "'; src='" + this.src + "'; lastCalled='" + this.lastCalled
			+ "'; showKickMessage='" + this.showKickMessage + "'; showFullMessage='" + this.showFullMessage
			+ "'; reconnectionAction='" + this.reconnectionAction + "'; reconnectAfterRoomleft='" + this.reconnectAfterRoomleft + "'");
		if (this.showFullMessage) {
			new lz.labelerrorPopup(canvas,
				{
					errorlabelid: 99
					, onCloseFunc: function() {
				       if (this.makeModal) {
				           lz.ModeManager.releaseAll();
				       }
				       if ($debug) Debug.write("Error dialog is being closed, calling QUIT");
				       canvas.sendViaLocalConnection(canvas.vid_lc_name, "immediateExitRoom", [true,null]);
					}
				});
			this.showFullMessage = false;
			return;
		} else if (this.showKickMessage) {
			new lz.labelerrorPopup(canvas,{
				errorlabelid:606
				, onCloseFunc: function() {
					canvas.quit();
				}
			});
			canvas._loadingAll.hideContentOnly();
			return;
		} else if (this.reconnectionAction){
			this.connect();
		} else if (this.reconnectAfterRoomleft) {
			if ($debug) Debug.write("this.reconnectAfterRoomleft: ",this.reconnectAfterRoomleft);
			this.counterror=0;
			this.connect();
		} else {
			if (canvas.isRemoteUser() && (this.status == 'NetConnection.Connect.Closed' 
					|| this.status == 'NetConnection.Connect.NetworkChange'))
			{
				if (null != canvas.REDIRECT_URL_FOR_EXTERNAL_USERS) {
					new lz.redirectBox(canvas, {
							redirectURL:canvas.REDIRECT_URL_FOR_EXTERNAL_USERS
							, maxTime: 0
						});
				}
				this.counterror = 6; //NO more reconnects
			}
			this.useRTMPT = true
			var src = getUrl();
			this.setAttribute('src',src);
			//Debug.write("new src ",this.src);
			if (this.counterror<3){
				this.counterror++;
				//Debug.write("try ",this.counterror,"one");
				if (canvas.thishib.loaderVar != null) {
					canvas.thishib.loaderVar.error.setAttribute('text',"try "+this.counterror);
				}
				this.connect();
			} else {
				//Debug.write("connection failed");
				if (canvas.thishib.loaderVar != null) {
					canvas.thishib.loaderVar.error.setAttribute('text',this.status);
				}
				canvas.setAttribute('loadingmessage','connection failed');
				new lz.labelerrorPopup(canvas,{errorlabelid:556});
			}
			if (canvas.thishib.loaderVar != null) {
				canvas.thishib.loaderVar._src.setAttribute('text',src);
			}
		}
	]]>
	</handler>    
    
    <method name="refreshSessionMeth" args="calleeObj">
        this.refreshSession.doCall();
    </method>
    
    <!-- This Function is just for refreshing the Session -->
    <netRemoteCallHib name="refreshSession" funcname="userservice.refreshSession" showLoading="false" >    
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>   
        <handler name="ondata" args="value">
            //if ($debug) Debug.write("hibRtmpConnection/refreshSession [",value,"]");
            lz.Timer.addTimer( parent.refreshDelegate, canvas.refreshSession );
        </handler>
    </netRemoteCallHib>
      
    <netRemoteCallHib name="getsessiondata" funcname="xmlcrm.getsessiondata" >      
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("hibRtmpConnection/getsessiondata [",value,"]");
            canvas.sessionObject = value;
            canvas.sessionId = value.session_id;
			canvas.sendViaLocalConnection(canvas.vid_lc_name, "setSessionId", [canvas.sessionId]);
			if (canvas.thishib.loaderVar != null) {
            	canvas.thishib.loaderVar.setProgress();
            }
            parent.getPublicSID.doCall();
        </handler>  
    </netRemoteCallHib>
     
    <netRemoteCallHib name="getPublicSID" funcname="getPublicSID" >      
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("hibRtmpConnection/getPublicSID [",value,"]");
            canvas.publicSID = value;     
			if (canvas.thishib.loaderVar != null) {
            	canvas.thishib.loaderVar.setProgress();
            }
			parent.getLanguages.doCall();
        </handler>  
    </netRemoteCallHib>
    
    <netRemoteCallHib name="overwritePublicSID" funcname="overwritePublicSID" >     
        <netparam><method name="getValue"> return canvas.publicSID;</method></netparam>
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("overwritePublicSID: ",value);
        </handler>  
    </netRemoteCallHib>    
    
	<netRemoteCallHib name="getLanguages" funcname="languageservice.getLanguages" dataobject="languagesSet" >
		<handler name="ondata" args="value">
			//The onResult-Handler will be called be the rtmpconnection
			//if ($debug) Debug.write("getLanguages: ",value, languagesSet);
			if (canvas.thishib.loaderVar != null) {
				canvas.thishib.loaderVar.setProgress();
			}
			parent.getDefaultLanguage.doCall();
		</handler>
	</netRemoteCallHib>    
    
    <method name="setDefaultUserLanguage">
	    <![CDATA[
	        if (userlang == -1 && canvas.language_id != 0) {
	            userlang = canvas.language_id;
	        } else if (userlang == -1) {
	            var lang_id = canvas.default_lang_id;
	            
	            var browserLang = flash.external.ExternalInterface.call("function(){return window.navigator.systemLanguage || window.navigator.userLanguage || window.navigator.language;}");
	            if (browserLang == null) {
	                browserLang = "" + System.capabilities.language;
	            }
	            if (browserLang != null && browserLang.length > 1) {
	                var lngCode = browserLang.substring(0, 2);
	                
	                //openlaszlo XPath is able to search nothing, so will iterate
	                var xpath = "languagesSet:/item";
	                var list = languagesSet.getPointer().xpathQuery(xpath);
	                
	                var partMatch = -1, fullMatch = -1; 
	                for (var i = 1; list != null && i <= list.length; ++i) {
	                    xpath = "languagesSet:/item[" + i + "]/code/text()";
	                    var val = languagesSet.getPointer().xpathQuery(xpath);
	                    if (val != null && val.length > 1) {
	                        var partCode = ("" + val).substring(0, 2);
	                        
	                        if (browserLang == val) {
	                            fullMatch = i;
	                        } else if (lngCode == val) {
	                            partMatch = i;
	                        } else if (partCode == lngCode) {
	                            partMatch = i;
	                        }
	                    }
	                }
	                if (partMatch != -1 || fullMatch != -1) {
	                    i = (fullMatch != -1) ? fullMatch : partMatch;
	                    xpath = "languagesSet:/item[" + i + "]/language_id/text()";
	                    lang_id = languagesSet.getPointer().xpathQuery(xpath);
	                }
	            }
	            
	            if (canvas.language_id == 0) {
	                userlang = lang_id;
	            } else {
	                userlang = canvas.language_id;
	            }
	        }
	    ]]>
    </method>
    
    <netRemoteCallHib name="logoutUser" funcname="xmlcrm.logoutUser"
        remotecontext="$once{ canvas.thishib }" activeErrorHandler="true" 
        isCallBackHandler="true">
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <handler name="sendCallBack">
        <![CDATA[
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("sendCallBack logoutUser: ");    
            parent.initlanguageLoaded = false;
            
            var g = canvas.getUserData();
            g["username"] = '';
            g["userpass"] = '';
            g["userquality"] = null;
            g["usercolor"] = null;
            g["userlang"] = null;
            g["saveuserdata"]=false;
            g["storedSession"] = "";
            canvas.setUserData(g);
            canvas.setColorStyle(canvas.baseColorScheme);
            
            parent.userlang = -1;
            parent.setDefaultUserLanguage();

            parent.getLanguageByIdAndMax.start = 0;
            parent.getLanguageByIdAndMax.doCall();
        ]]>
        </handler>          
    </netRemoteCallHib>     
    
    <netRemoteCallHib name="setUsernameReconnect" funcname="setUsernameReconnect" remotecontext="$once{ canvas.thishib }" >   
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return canvas.user_id;</method></netparam>
        <netparam><method name="getValue">return canvas.currentuser;</method></netparam>
        <netparam><method name="getValue">return canvas.firstName;</method></netparam>
        <netparam><method name="getValue">return canvas.lastName;</method></netparam>   
        <netparam><method name="getValue">return canvas.picture_uri;</method></netparam>   
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("setUsernameReconnect: ",canvas.user_id,value);   
            parent.reconnectComplete();
        </handler>  
    </netRemoteCallHib>    
        
    <netRemoteCallHib name="getDefaultLanguage" funcname="languageservice.getDefaultLanguage" >      
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            canvas.default_lang_id = value;
            if ($debug) Debug.write("getDefaultLanguage: ",value,"; canvas.lang = ", canvas.language_id);
            if (canvas.language_id==0){
                parent.userlang = canvas.default_lang_id;
            } else {
                parent.userlang = canvas.language_id;
            }
            parent.getLanguageByIdAndMax.doCall();
        </handler>  
    </netRemoteCallHib>      
    
	<netRemoteCallHib name="getInvitationByHash" activeErrorHandler="true" funcname="invitationservice.getInvitationByHash">
		<netparam name="invitationHash"><method name="getValue">return canvas.invitationHash;</method></netparam>
		<handler name="ondata" args="value">
		<![CDATA[
			if (canvas.thishib.loaderVar != null) {
				canvas.thishib.loaderVar.close();
			}
			//The onResult-Handler will be called be the rtmpconnection
			if ($debug) Debug.write("getInvitationByHash: ",value);
			if (value<0){
			} else {
				if (value.allowEntry) {
					parent.currentInvitation = value;
					new lz.invitationQuickLoader(canvas.main_content._content.inner);
				} else {
					var addInfo = "" + value.validFrom +"<br/> - <br/>"+ value.validTo;
					var dlg = new lz.rpcErrorDialog(canvas,{errorid:-50,addInfo:addInfo});
				}
			}
		]]>
		</handler>
	</netRemoteCallHib> 
    
	<netRemoteCallHib name="secureLoginByRemote" activeErrorHandler="true" funcname="xmlcrm.secureLoginByRemote" >
		<netparam><method name="getValue">return canvas.sessionId;</method></netparam>
		<netparam name="remoteSessionId"><method name="getValue">return canvas.secureHash;</method></netparam>
		<handler name="ondata" args="value">
		<![CDATA[
			if (canvas.thishib.loaderVar != null) {
				canvas.thishib.loaderVar.close();
			}
			//The onResult-Handler will be called be the rtmpconnection
			if ($debug) Debug.write("secureLoginByRemote: ",value);
			if (value < 0) {
			} else {
				if (value == null) {
					new lz.errorPopup(canvas,{error:'Invalid Hash'});
					return;
				}
				
				canvas.showNickNameDialog = value.showNickNameDialog;
				if ($debug) Debug.write("markSessionAsLogedIn9 ",canvas.showNickNameDialog);
				
				canvas.initroomid = value.room_id;
				canvas.becomemoderator = value.becomemoderator;
				canvas.showAudioVideoTest = value.showAudioVideoTest;
				canvas.landingZone = value.landingZone;
				
				canvas.roomRecordingId = value.roomRecordingId;
				
				if (canvas.roomRecordingId == null) {
					canvas.roomRecordingId = 0;
				}
				
				if (canvas.showNickNameDialog) {
					new lz.chooseNickName(canvas);
				} else {
					parent.getCurrentRoomClient.doCall();
				}
			}
		]]>
		</handler>
	</netRemoteCallHib>  
    
    <netRemoteCallHib name="loginUserByRemote" activeErrorHandler="true" 
        funcname="xmlcrm.loginUserByRemote" >          
        <netparam name="remoteSessionId"><method name="getValue">return canvas.remoteUserSid;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("loginUserByRemote -1-: ",value);
                if ($debug) Debug.write("loginUserByRemote -2-: ",canvas.remoteUserSid);
                if (value<0){
                    
                } else {
                    parent.getCurrentRoomClient.doCall();
                }
            ]]>
        </handler>   
    </netRemoteCallHib>  
    
	<netRemoteCallHib name="getCurrentRoomClient" funcname="xmlcrm.getCurrentRoomClient" >
		<netparam name="sessionId"><method name="getValue">return canvas.sessionId;</method></netparam>
		<handler name="ondata" args="value">
		<![CDATA[
			//The onResult-Handler will be called be the rtmpconnection
			if ($debug) Debug.write("getCurrentRoomClient: ",value);
			if (value != null) {
				canvas.currentClient = value;
				canvas.setAttribute('currentuser',value.firstname+" "+value.lastname);
				
				//Somehow this leads to a bug in the implementation of the secure User Login
				canvas.setAttribute('user_id',value.user_id);
				
				canvas.setAttribute('allowRecording',value.allowRecording);
				
				var fName = value.firstname == null ? "" : value.firstname;
				var lName = value.lastname == null ? "" : value.lastname;
				canvas.setAttribute('firstName', fName);
				canvas.setAttribute('lastName', lName);
				canvas.setAttribute('mail', value.adresses.email);
				
				if (canvas.isRemoteUser() && fName == '' && lName == '') {
					if ($debug) Debug.write("!!!!!!!!!!! Nickname HIB ", value.adresses.email);
					new lz.chooseNickName(canvas);
				}
				hib.userobject.firstname = fName;
				hib.userobject.lastname = lName;
				
				canvas.setAttribute('lastLogin','');
				canvas.setAttribute('official_code','');
				canvas.setAttribute('picture_uri',value.picture_uri);
				canvas.setAttribute('language','');
				
				if ($debug) Debug.write("canvas.landingZone :: ",canvas.landingZone);
				
				if (canvas.landingZone == "dashboard") {
					canvas.destroyExitButton = false;
					parent.setUsernameAndSession.doCall();
					parent.getRoomTypes.doCall();
				} else if (canvas.roomRecordingId > 0) {
					if (canvas.thishib.loaderVar != null) {
						canvas.thishib.loaderVar.close();
					}
					//parent.getRoomById.doCall();
					var obj = new Array();
					obj["action"] = "recordModule";
					loadContent(obj,null,null);
				} else if (canvas.wicketroomid > 0) {
					canvas.initroomid = canvas.wicketroomid;
					parent.getRoomTypes.doCall();
					parent.getRoomById.doCall();
				} else {
					if (canvas.thishib.loaderVar != null) {
						canvas.thishib.loaderVar.close();
					}
					parent.getRoomById.doCall();
				}
			}
		]]>
		</handler>
	</netRemoteCallHib>
    
	<netRemoteCallHib name="getRoomById" funcname="conferenceservice.getRoomById" >          
		<netparam name="sessionId"><method name="getValue">return canvas.sessionId;</method></netparam>
		<netparam name="roomId"><method name="getValue">return canvas.initroomid;</method></netparam>
		<handler name="ondata" args="value">
		<![CDATA[
			//The onResult-Handler will be called be the rtmpconnection
			if ($debug) Debug.write("getRoomById: ",value);
			if (value!=null){
				if (canvas.wicketsid != null) {
					canvas.thishib.loaderVar.close();
				}
				if (canvas.directUserLogin) {
					canvas.directRoomObj = value;
					canvas.thishib.loaderVar.close();
				} else {
					canvas.setRoomValues(value.roomtype.roomtypes_id,value.rooms_id,value);
					var r = value;
					r.currentusers = ''; //this might be huge list
					canvas.sendViaLocalConnection(canvas.rtmp_lc_name,"setRoomValues",[value.roomtype.roomtypes_id,value.rooms_id,r]);
				}
			} else {
				new lz.labelerrorPopup(canvas,{errorlabelid:1286});
			}
		]]>
		</handler>
	</netRemoteCallHib>
        
    <netRemoteCallHib name="getLanguageByIdAndMax" funcname="languageservice.getLanguageByIdAndMax" >
        <attribute name="start" value="0" type="number" />
        <attribute name="step" value="100" type="number" />
        <attribute name="max" value="1607" type="number" />
        <netparam><method name="getValue">return parent.parent.userlang;</method></netparam> 
        <netparam><method name="getValue">return parent.start;</method></netparam> 
        <netparam><method name="getValue">return parent.step;</method></netparam> 
        <handler name="ondata" args="value">
            <![CDATA[
            if($debug) Debug.write("hibRtmpConnection/userlang:[",parent.userlang,"]");
                //if($debug) Debug.write("hibRtmpConnection/getLanguageByIdAndMax:[",value,"]");
                setLabelObjectByHundred(this.start,value);
                //The onResult-Handler will be called be the rtmpconnection
                if (this.start <= max){
                    this.start += this.step;
                    if (canvas.thishib.loaderVar != null) {
                       canvas.thishib.loaderVar.setProgress();
                    }
                    this.doCall();
                } else {
                	if($debug) Debug.write("loading lang complete");
                    if (parent.initlanguageLoaded){
                        if (canvas.thishib.loaderVar != null) {
                            canvas.thishib.loaderVar.setProgress();
                        }
			            parent.setUsernameAndSession.doCall();
                    } else {
						parent.initlanguageLoaded = true;
						if($debug) Debug.write("getGeneralOptions");
						parent.getGeneralOptions.doCall();
                    }
                    if($debug) Debug.write("getRoomTypes");
                    parent.getRoomTypes.doCall();
                }
            ]]>
        </handler>  
    </netRemoteCallHib>
        
    <!--
        There must be a temporary SIP-Account created at this moment
     -->  
    <netRemoteCallHib name="markSessionAsLogedIn" funcname="xmlcrm.markSessionAsLogedIn" >
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
                        
            if (value == null) {
                new lz.errorPopup(canvas,{error:"Missing User Object, set the Configuration value of the key 'default.rpc.userid' to a valid user Id that has at least one Organization assigned in the OpenMeetings Administrion Configuration Panel "});
            }
            
            if ($debug) Debug.write("markSessionAsLogedIn1 ",value);
             
            hib.userobject = value;
             
            canvas.user_id = hib.userobject.user_id;
            
            if (value.organisation_users.length > 0){
                hib.currentdomain = value.organisation_users[0].organisation.name;
                hib.currentdomainObj = value.organisation_users[0].organisation;
            } else if (!canvas.isRemoteUser()) {
                new lz.errorPopup(canvas,{error:"Missing Organization in User Object, set the Configuration value of the key 'default.rpc.userid' to a valid user Id that has at least one Organization assigned in the OpenMeetings Administrion Configuration Panel "});
            }
            
            if ($debug) Debug.write("markSessionAsLogedIn2 ",canvas.sessionId);
            if ($debug) Debug.write("markSessionAsLogedIn3 ",canvas.initroomid);
            if ($debug) Debug.write("markSessionAsLogedIn4 ",canvas.isinitRoomDirect);
            if ($debug) Debug.write("markSessionAsLogedIn5 ",canvas.remoteUserLogin);
            if ($debug) Debug.write("markSessionAsLogedIn6 ",canvas.directUserLogin);
            if ($debug) Debug.write("markSessionAsLogedIn7 ",canvas.directRoomId);
            if ($debug) Debug.write("markSessionAsLogedIn8 ",canvas.secureRemoteUserLogin);
            
            if (canvas.secureRemoteUserLogin) {
                
                if ($debug) Debug.write("markSessionAsLogedIn == CALL ",canvas.secureHash);
             
                parent.secureLoginByRemote.doCall();
                
            } else if (canvas.isinitRoomDirect){
                parent.getInvitationByHash.doCall();   
            } else if (canvas.remoteUserLogin) {
                parent.loginUserByRemote.doCall();   
            } else if (canvas.directUserLogin) {
                //show Nick Name or Password Protection Dialog
                canvas.initroomid = Number(canvas.directRoomId);
                parent.getRoomById.doCall();
            }
        </handler>  
    </netRemoteCallHib> 
    
	<netRemoteCallHib name="getGeneralOptions" funcname="xmlcrm.getGeneralOptions">
		<handler name="ondata" args="value">
		<![CDATA[
			if (canvas.thishib.loaderVar != null) {
				canvas.thishib.loaderVar.setProgress();
			}
			if ($debug) Debug.write("getGeneralOptions: ", value.length, value);
			if (value != null) {
				if (value.length > 0 && value[0] != null) {
					//if ($debug) Debug.write("Give exclusive audio keycode is: ", value[0].conf_value);
					canvas.setAttribute('GIVE_EXCLUSIVE_AUDIO_KEY', value[0].conf_value);
				}
				if (value.length > 1 && value[1] != null) {
					if ($debug) Debug.write("red5sip.enable is: ", value[1].conf_value);
					canvas.setAttribute('RED5_SIP_ENABLE', value[1].conf_value);
				}
				if (value.length > 2 && value[2] != null) {
					if ($debug) Debug.write("max_upload_size is: ", value[2].conf_value);
					canvas.setAttribute('MAX_UPLOAD_SIZE', value[2].conf_value);
				}
				if (value.length > 3 && value[3] != null) {
					if ($debug) Debug.write("Mute/unmute keycode is: ", value[3].conf_value);
					canvas.setAttribute('MUTE_AUDIO_KEY', value[3].conf_value);
				}
				if (value.length > 4 && value[4] != null) {
					if ($debug) Debug.write("redirect.url.for.external.users is: ", value[4].conf_value);
					canvas.setAttribute('REDIRECT_URL_FOR_EXTERNAL_USERS', value[4].conf_value);
				}
			} else {
				if ($debug) Debug.warn("xmlcrm.getGeneralOptions empty!");
			}
			parent.getUserSalutations.doCall();
		]]>
		</handler>
	</netRemoteCallHib>
    
    <netRemoteCallHib name="setCurrentUserOrganization" funcname="xmlcrm.setCurrentUserOrganization">
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return hib.currentdomainObj.organisation_id;</method></netparam>  
        <handler name="ondata" args="value">
            //Sessionmanagement.getInstance() 
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("setCurrentUserOrganization: ",value);
        </handler>  
    </netRemoteCallHib> 
     
    
    <netRemoteCallHib name="getUserSalutations" funcname="userservice.getUserSalutations" >
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.parent.userlang; </method></netparam> 
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            //Debug.write("getUserSalutations ",value);
            canvas.salutationsInitValues = value;
            //check for password reset
            if (canvas.wicketsid != null) {
            	parent.loginWicket.doCall();
            } else { 
                if (canvas.thishib.loaderVar != null) {
                   canvas.thishib.loaderVar.close();
                }
                //do not show loggin-PopUp for the test-Application
                if (parent.testAppLoading){ 
                    canvas.loadNextStepTestApp();
                } else {
                    if (canvas.isRemoteUser()){
                        if (canvas.thishib.loaderVar != null) {
                          canvas.thishib.loaderVar.setProgress();
                        }
                        if($debug) Debug.write("isinitRoomDirect or remoteUserLogin is true");
                        parent.markSessionAsLogedIn.doCall();
                    }
                }
            }
        </handler>  
    </netRemoteCallHib>
    
	<netRemoteCallHib name="loginWicket" funcname="xmlcrm.loginWicket" >
		<netparam><method name="getValue">return canvas.sessionId;</method></netparam>
		<netparam><method name="getValue">return canvas.wicketsid;</method></netparam>
		<netparam><method name="getValue">return canvas.wicketroomid;</method></netparam>
		<handler name="ondata" args="value">
		<![CDATA[
			if ($debug) Debug.write("!!!!!!!!!!! loginWicket", value);
			if (value != null) {
				canvas.setAttribute('user_id',value.user_id);
				canvas.setAttribute('firstName', value.firstname == null ? "" : value.firstname);
				canvas.setAttribute('lastName', value.lastname == null ? "" : value.lastname);
				canvas.setAttribute('mail','');
				canvas.setAttribute('lastLogin','');
				canvas.setAttribute('official_code','');
				canvas.setAttribute('picture_uri','');
				canvas.setAttribute('language','');
				canvas.setAttribute('currentuser',value.login);
				if (value.timeZoneId != null) {
					canvas.timeZoneId = value.timeZoneId;
				}
				if (value.rights != null) {
					for (var i = 0; i < value.rights.length; ++i) {
						if ('Admin' == value.rights[i]) {
							canvas.becomemoderator = true;
						}
					}
				}
				if ($debug) Debug.write("hibRtmpConnection::loginWicket -> canvas.becomemoderator", canvas.becomemoderator);
				if (value.sessionData == null) {
					if ($debug) Debug.write("No Language Found to assign");
					return;
				}
				hib.userobject = value;
				var found = false;
				for (var i = 0; i < value.organisation_users.length; ++i) {
					if (value.organisation_users[i].organisation.organisation_id == value.sessionData.organization_id) {
						found = true;
						hib.currentdomain = value.organisation_users[i].organisation.name;
						hib.currentdomainObj = value.organisation_users[i].organisation;
						break;
					}
				}
				if (!found && value.organisation_users.length > 0) {
					hib.currentdomain = value.organisation_users[0].organisation.name;
					hib.currentdomainObj = value.organisation_users[0].organisation;
				}
				parent.getCurrentRoomClient.doCall();
			} else {
				new lz.labelerrorPopup(canvas, {errorlabelid: 1599});
			}
		]]>
		</handler>
	</netRemoteCallHib>
	
    <netRemoteCallHib name="getRoomTypes" funcname="conferenceservice.getRoomTypes" >
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <handler name="ondata" args="value">
            //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("getRoomTypes ", value);
            canvas.roomTypesInitValues = value;
            canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "getRoomTypes", [value]);
			if (canvas.thishib.loaderVar != null) {
            	canvas.thishib.loaderVar.setProgress();
            }
        </handler>  
    </netRemoteCallHib>      
    
        <netRemoteCallHib name="setId" funcname="setId">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("################ setId: ",value);
                canvas.setAttribute('streamid',value);   
            </handler>  
        </netRemoteCallHib> 
        
        <netRemoteCallHib name="setUsernameAndSession" funcname="setUsernameAndSession" remotecontext="$once{ canvas.thishib }" >   
            <netparam><method name="getValue"> return canvas.sessionId; </method></netparam> 
            <netparam><method name="getValue">return canvas.user_id;</method></netparam>
            <netparam><method name="getValue">return canvas.currentuser;</method></netparam>
            <netparam><method name="getValue">return canvas.firstName;</method></netparam>
            <netparam><method name="getValue">return canvas.lastName;</method></netparam>      
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("setUsernameAndSession: ",canvas.user_id,value);
                if (canvas.thishib.loaderVar != null) {
	                canvas.thishib.loaderVar.close();
                }
            </handler>  
        </netRemoteCallHib>        
        
        <netRemoteCallHib name="testMethod" funcname="testMethod">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("testMethod ",value);                   
            </handler>  
        </netRemoteCallHib>

        <!--- Notification of new User --> 
		<netRemoteCallHib name="addNewUser" funcname="addNewUser">
			<handler name="ondata" args="value">
				//The onResult-Handler will be called be the rtmpconnection
				if ($debug) Debug.write("addNewUser: ",value);
				if(value.sipTransport) {
					canvas._videocontainer.addItem(value.connectedSince,value.isMod,value.streamid,value.room_id,'',value.formatedDate,value.userpos,value.usercolor,value);
				} else {
					canvas._videocontainer.addClientItem(value.connectedSince,value.isMod,value.streamid,value.room_id,'',value.formatedDate,value.userpos,value.usercolor,value);
				}
				canvas.setAttribute('numberofpartners',canvas.numberofpartners+1);
			</handler>
		</netRemoteCallHib>    
        
        <netRemoteCallHib name="getCurrentModeratorList" funcname="getCurrentModeratorList">
            <handler name="ondata" args="value">
                <![CDATA[
                    if ($debug) Debug.write("############ getCurrentModeratorList: ",value);
                    
                    canvas.analyzeModerationList(value);
                    
                    canvas.currentModeratorList = value;
                    //Update Moderation Flag
                    canvas.updateModerationFlag();
                    
                    var messageAlreadyThrown = false;
                    
                    //if ($debug) Debug.write("throw event to drawarea: ", canvas.moderatorStreamID, canvas.ismoderator);
                    
					if (this.parent.modus == "conference") {
						if ($debug) Debug.write("############## start broadcasting ");
						parent.setBroadCastingFlag.publicSIDOfNewModerator = canvas.publicSID;
						parent.setBroadCastingFlag.canVideo = !canvas.currentRoomObj.isAudioOnly;
						parent.setBroadCastingFlag.isAllowedToBroadCastAV = true;
						parent.setBroadCastingFlag.doCall();
					}
                    canvas._drawarea.onopenWhiteBoard.sendEvent();
                    
                    if ($debug) Debug.write("room ",canvas.currentRoomObject);
                    if ($debug) Debug.write("roomType_id ",canvas.currentRoomObject.roomtype.roomtypes_id);
                    
                    if (canvas.currentRoomObject.roomtype.roomtypes_id != 3) {
                        //We do not show this warning when the roomtype is 3 (restricted)
                        if (canvas.currentRoomObj.isModeratedRoom) {
                            if (value.length == 0 && !messageAlreadyThrown){
                                new lz.labelerrorPopup(canvas,{errorlabelid:641});
                            }
                        } else {
                            if (value.length == 0 && !messageAlreadyThrown){
                                new lz.errorModeratorPopup(canvas,{error:canvas.getLabelName(498)});
                            }
                        }
                    }
                ]]>
            </handler>
        </netRemoteCallHib>
        
        <netRemoteCallHib name="newStream" funcname="newStream">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("newStream: ",value);
                if (value == null || value.isScreenClient) {
                    return;
                }
                canvas._videocontainer.startStream(value.publicSID,value.broadCastID,value.firstname,value.lastname,value.interviewPodId,value.VWidth,value.VHeight); 
            </handler>   
        </netRemoteCallHib> 
           
        <netRemoteCallHib name="closeStream" funcname="closeStream">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("**** closeStream: ",value);
                if (value == null) {
                	return;
                }
                if (value.isScreenClient) {
                    if ($debug) Debug.write(" ondata closeStream: ",value.streamPublishName); 
                    canvas.currentBaseConferenceRoom._screenSharingAdapter.closeScreenSharing(value);
                } else {
                    //free the VideoContainer
                    //canvas._videocontainer.closeStreamClient(value.publicSID);
                    canvas.sendViaLocalConnection(canvas.vid_lc_name, "closeStreamClient", [value.publicSID]);
                    canvas.setAttribute('numberofpartners',canvas.numberofpartners-1);
                }
                //TODO:check first current tab
            </handler>   
        </netRemoteCallHib>  
        
        <!---
            Event is invoked if a red5 stream sharing is closed
         -->
        <netRemoteCallHib name="stopScreenSharingMessage" funcname="stopScreenSharingMessage">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("**** closeStream: ",value);
                if ($debug) Debug.write(" onResult stopScreenSharingMessage : ",value.streamPublishName); 
                canvas.currentBaseConferenceRoom._screenSharingAdapter.closeScreenSharing(value);
            </handler>   
        </netRemoteCallHib> 
             
        <netRemoteCallHib name="clientregisterRoom" funcname="clientregisterRoom">
            <handler name="ondata" args="value">
                if ($debug) Debug.write("**** clientregisterRoom::ondata ", value);
            </handler>   
        </netRemoteCallHib>   

		<method name="roomDisconnectUser" args="value,id">
			if (canvas._videocontainer!=null){
				canvas._videocontainer.disconnectclient(id);
				if (canvas.currentModApply!=null) canvas.currentModApply.rejectUser(value);
				if (value.isRecording) {
					canvas._mymod.recordingUser = null;
				}
				if (value.streamPublishStarted) {
					canvas._mymod.publishingObj = null;
				}
				canvas._mymod.setMessage();
			}
		</method>
		
        <netRemoteCallHib name="roomDisconnect" funcname="roomDisconnect">
            <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("roomDisconnect: ",value);
                if (value == null || value.isScreenClient) {
                    return;
                }
                if (canvas.currentBaseConferenceRoom != null && canvas.currentBaseConferenceRoom._chatPanelStrict != null) {
	                if ($debug) Debug.write("canvas.currentBaseConferenceRoom._chatPanelStrict: ", canvas.currentBaseConferenceRoom._chatPanelStrict);
                	canvas.currentBaseConferenceRoom._chatPanelStrict.closeprivatechat(["close", value.publicSID]);
                }
                if (canvas.currentActivityList != null) {
                    canvas.currentActivityList.addMessageRequest(value, canvas.getLabelName(1367), new Date().getTime());
                }
                parent.roomDisconnectUser(value, value.publicSID);
            ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="stopRecordingMessage" funcname="stopRecordingMessage">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                canvas._mymod.recordingUser = null;
                canvas._mymod.setMessage();                 
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="stopPublishingMessage" funcname="stopPublishingMessage">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
				canvas._mymod.publishingObj = null;
                canvas._mymod.setMessage();                 
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setSyncFlag" funcname="setSyncFlag" >      
            <handler name="ondata" args="value">
                if ($debug) Debug.write("setSyncFlag: ",value);
            </handler>
        </netRemoteCallHib>   
             
        <netRemoteCallHib name="logicalRoomLeaveDis" funcname="logicalRoomLeaveDis" >      
            <handler name="ondata" args="value">
                if ($debug) Debug.write("logicalRoomLeaveDis: ",value);
                parent.roomDisconnectUser(value, value.broadCastID);
            </handler>
        </netRemoteCallHib>             
  
        <method name="setUserStatus" args="ctx,user,o">
            <![CDATA[
				if (!o || !user) return;
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) {
                    Debug.write("setUserStatus: ", user);
                    Debug.write("setUserStatus: ", o.param);
                }
                var aObj = o.param[3];
                var usPoint = null;
                if ($debug) Debug.write("drawObj: ", aObj[0]);
                switch(aObj[0]) {
                    case 'line':
                    case 'uline':
                        usPoint = {x: aObj[aObj.length - 5] + aObj[6], y: aObj[aObj.length - 4] + aObj[7]};
                        break;
                    case 'letter':
                    case 'rectangle':
                    case 'ellipse':
                    case 'clipart':
                        usPoint = {x: aObj[aObj.length - 3] + aObj[aObj.length - 5], y: aObj[aObj.length - 2] + aObj[aObj.length - 4]};
                        break;
                    case 'paint':
                        var points = aObj[1];
                        //points are empty on 'paint' move
                        usPoint = {
                            x: aObj[aObj.length - 5] + (points.length ? points[points.length - 1][3] : aObj[aObj.length - 3])
                            , y: aObj[aObj.length - 4] + (points.length ? points[points.length - 1][4] : aObj[aObj.length - 2])};
                        break;
                    case 'drawarrow':
                        usPoint = {x: aObj[aObj.length - 5] + aObj[9], y: aObj[aObj.length - 4] + aObj[10]};
                        break;
                    case 'clipart':
                        break;
                }
                if (usPoint) {
                    var us = new lz.userStatus(ctx, {
                        width:100
                        , x: usPoint.x
                        , y: usPoint.y - 25 //little above
                        , queueable: false
                        , statusText: user.firstname + " " + user.lastname
                        });
                    if ($debug) Debug.write("us: ", us, "; usPoint: ", usPoint);
                }
            ]]>
        </method>

        <netRemoteCallHib name="sendVarsToWhiteboard" funcname="sendVarsToWhiteboard">
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("sendVarsToWhiteboard : ",value);
            parent.setUserStatus(canvas._drawarea, value[0], value[1]);
            canvas._drawarea.sendWatchObject(canvas._drawarea,value[1][2],value[1][3],false);
                ]]>
            </handler>   
        </netRemoteCallHib>  
        
         <netRemoteCallHib name="sendVarsToWhiteboardById" funcname="sendVarsToWhiteboardById">
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
            if ($debug) Debug.write("sendVarsToWhiteboardById : ",value);
            parent.setUserStatus(canvas._drawarea, value[0], value[1]);
            canvas._drawarea.parent.parent.parent.sendWatchObjectByWhiteboard(value[1]);
                ]]>
            </handler>   
        </netRemoteCallHib> 
        
        <netRemoteCallHib name="loadWmlToWhiteboardById" funcname="loadWmlToWhiteboardById">
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("sendVarsToWhiteboardById : ",value);
                    canvas._drawarea.parent.parent.parent.loadWmlToWhiteboardById(value);
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <!--
            Adds this User to the List of current Moderators
         -->
        <netRemoteCallHib name="addModerator" funcname="addModerator">
            <attribute name="publicSIDOfNewModerator" value="0" type="string" />
            <netparam name="vars"><method name="getValue">return parent.publicSIDOfNewModerator;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write(" addModerator : ",value);                   
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="removeModerator" funcname="removeModerator">
            <attribute name="publicSIDOfNewModerator" value="0" type="string" />
            <netparam name="vars"><method name="getValue">return parent.publicSIDOfNewModerator;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write(" onResult setModerator : ",value);                   
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <!--
        public synchronized Long setBroadCastingFlag(String publicSID, boolean value, boolean canVideo, Integer podId) 
         -->
        <netRemoteCallHib name="setBroadCastingFlag" funcname="setBroadCastingFlag">
            <attribute name="publicSIDOfNewModerator" value="0" type="string" />
            <attribute name="isAllowedToBroadCastAV" value="false" type="boolean" />
            <attribute name="canVideo" value="false" type="boolean" />
            <attribute name="avsettings" value="av" type="string" />
            <attribute name="interviewPodId" value="0" type="number" />
            <netparam><method name="getValue">return parent.publicSIDOfNewModerator;</method></netparam>
            <netparam><method name="getValue">return parent.isAllowedToBroadCastAV;</method></netparam>
            <netparam><method name="getValue">return parent.canVideo;</method></netparam>
            <netparam><method name="getValue">return parent.interviewPodId;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write(" onResult setModerator : ",value);                   
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setNewBroadCastingFlag" funcname="setNewBroadCastingFlag">
            <netparam><method name="getValue">return null;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write(" onResult setNewBroadCastingFlag : ",value);
                    canvas._videocontainer._participants.getUserListItemByPublicSID(value.publicSID).setAttribute("refObj", value);   
                    if (canvas.publicSID == value.publicSID) {
						canvas.sendViaLocalConnection(canvas.vid_lc_name, "toggleVideo", [value.canVideo]);
                        canvas.setAttribute("isBroadCasting", value.isBroadcasting);
                        canvas.setAttribute("canVideo", value.canVideo);
                        
                        if ($debug) Debug.write("Its about You ", value);
                        if (value.isBroadcasting) {
                            if (canvas.thishib.modus == "interview") {
                               canvas._drawarea.newInterviewStarting(value);
                            } else {
                            	canvas._videocontainer._videoviewcontent.showDevicePopUp(false);
                            }
                        }
                    } 
                    canvas.setAttribute("lastBroadCastingUser",value);
                ]]>
            </handler>   
        </netRemoteCallHib>

        <netRemoteCallHib name="giveExclusiveAudio" funcname="giveExclusiveAudio">
            <attribute name="publicSID" value="0" type="string" />
            <netparam><method name="getValue">return parent.publicSID;</method></netparam>
            <method name="setExclusiveAudio" args="tPublicSID">
                this.publicSID = tPublicSID;
                this.doCall();
            </method>
        </netRemoteCallHib>

        <netRemoteCallHib name="receiveExclusiveAudioFlag" funcname="receiveExclusiveAudioFlag">
            <netparam><method name="getValue">return null;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    canvas._videocontainer.receiveExclusiveAudioFlag(value.publicSID)
                ]]>
            </handler>
        </netRemoteCallHib>

        <netRemoteCallHib name="switchMicMuted" funcname="switchMicMuted">
            <attribute name="publicSID" value="" type="string" />
            <attribute name="mute" value="false" type="boolean" />
            <event name="onMute" />
            <method name="setMute" args="tPublicSID,tMute">
                this.publicSID = tPublicSID;
                this.mute = tMute;
                var obj = new Array();
                obj["mute"] = tMute;
                obj["publicSID"] = tPublicSID;
                this.onMute.sendEvent(obj);
                this.doCall();
            </method>
            <netparam><method name="getValue">return parent.publicSID;</method></netparam>
            <netparam><method name="getValue">return parent.mute;</method></netparam>
        </netRemoteCallHib>

        <netRemoteCallHib name="newRed5ScreenCursor" funcname="newRed5ScreenCursor">
            <netparam><method name="getValue">return null;</method></netparam>
			<handler name="ondata" args="value">
			<![CDATA[
				//The onResult-Handler will be called be the rtmpconnection
				//if ($debug) Debug.write(" onResult newRed5ScreenCursor : ",value);
				if (canvas.currentBaseConferenceRoom._screenSharingAdapter != null) {
					canvas.currentBaseConferenceRoom._screenSharingAdapter.updateCursorScreenSharing(value);
				}
			]]>
			</handler>   
        </netRemoteCallHib>
        
        
        <!--
            Red5 Screen Sharing
         -->
        <netRemoteCallHib name="newScreenSharing" funcname="newScreenSharing">
            <netparam><method name="getValue">return null;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                
                    //The onResult-Handler will be called be the rtmpconnection
                    //if ($debug) Debug.write(" onResult newScreenSharing 1 : ",value);  
                    //if ($debug) Debug.write(" onResult newScreenSharing 2 : ",value.streamid); 
                    //if ($debug) Debug.write(" onResult newScreenSharing 3 : ",canvas.streamid); 
                    if ($debug) Debug.write(" onResult newScreenSharing 4 : ",value.streamPublishName); 
                    if ($debug) Debug.write(" onResult newcreenSharing 5 : ",canvas.publicSID); 
                    
                    canvas.currentBaseConferenceRoom._screenSharingAdapter.newScreenSharing(value,canvas.currentBaseConferenceRoom._chatPanelStrict.height);
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="checkScreenSharing" funcname="checkScreenSharing">
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write(" onResult checkScreenSharing : ",value);  
                    if (value != null) {
                    	canvas.currentBaseConferenceRoom._screenSharingAdapter.newScreenSharings(value,canvas.currentBaseConferenceRoom._chatPanelStrict.height);
                    } else {
                        if ($debug) Debug.warn("Self Screen Sharing");
                    }
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <!--
        public synchronized Long applyForModeration(String publicSID)
         -->
        <netRemoteCallHib name="applyForModeration" funcname="applyForModeration"
                       remotecontext="$once{ canvas.thishib }">
            <netparam><method name="getValue">return canvas.publicSID;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("applyForModeration : ",value);
                    if (value == 1) {
                        //Do add direct
                        parent.addModerator.publicSIDOfNewModerator = canvas.publicSID;
                        parent.addModerator.doCall();
                    } else if (value == 2) {
                        //Ask the Moderator
                        var tDate = new Date();
                        parent.sendMessageWithClient.sendMessage("applyForModeration",tDate.getTime());
                    } else if (value == 3) {
                        new lz.labelerrorPopup(canvas,{errorlabelid:696});
                    }
                ]]>
            </handler>
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setCanDraw" funcname="whiteboardservice.setCanDraw"
                       remotecontext="$once{ canvas.thishib }">
            <attribute name="publicSID" value="" type="string" />
            <attribute name="canDraw" value="true" type="boolean" />
            <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
            <netparam><method name="getValue">return parent.publicSID;</method></netparam>
            <netparam><method name="getValue">return parent.canDraw;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("setCanDraw : ",value);
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setCanShare" funcname="whiteboardservice.setCanShare"
                       remotecontext="$once{ canvas.thishib }">
            <attribute name="publicSID" value="" type="string" />
            <attribute name="canShare" value="true" type="boolean" />
            <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
            <netparam><method name="getValue">return parent.publicSID;</method></netparam>
            <netparam><method name="getValue">return parent.canShare;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("setCanShare : ",value);
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setCanRemote" funcname="whiteboardservice.setCanRemote"
                       remotecontext="$once{ canvas.thishib }">
            <attribute name="publicSID" value="" type="string" />
            <attribute name="canRemote" value="true" type="boolean" />
            <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
            <netparam><method name="getValue">return parent.publicSID;</method></netparam>
            <netparam><method name="getValue">return parent.canRemote;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("setCanRemote : ",value);
                ]]>
            </handler>   
        </netRemoteCallHib>
        
        <netRemoteCallHib name="setNewModeratorByList" funcname="setNewModeratorByList">
            <handler name="ondata" args="value">
                <![CDATA[
                    if ($debug) Debug.write("setNewModeratorByList ",value);
                    
                    canvas.analyzeModerationList(value);
                    
                    //The onResult-Handler will be called be the rtmpconnection
                    canvas.currentModeratorList = value;
                    //Update Moderation Flag
                    canvas.updateModerationFlag();
                ]]>
            </handler>   
        </netRemoteCallHib> 
        
        <netRemoteCallHib name="sendMessage" funcname="sendMessage">
            <netparam name="vars"><method name="getValue">return canvas.objMessage;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write("getValue : ",value);
                
                ]]>
            </handler>   
        </netRemoteCallHib> 
        
        <netRemoteCallHib name="sendMessageAll" funcname="sendMessageAll">
            <netparam name="vars"><method name="getValue">return canvas.objMessage;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write("getValue : ",value);
                ]]>
            </handler>   
        </netRemoteCallHib> 
        
        <netRemoteCallHib name="sendVarsToMessage" funcname="sendVarsToMessage">
            <handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    //Debug.write("sendVarsToMessage : ",value);
                    if (value[0]=='audioActivity'){
                        //canvas.currentModApply
                        //if ($debug) Debug.write("audioActivity Client ",value[1],value[2]);
                        canvas._videocontainer.setSpeakingByPos(value[2],value[1]);
                    } else if (value[0]=='typingActivity'){
                        if ($debug) Debug.write("!!!typingActivity ::", value[1], canvas._videocontainer._participants.getUserListItemByPublicSID(value[2]));
                        canvas._videocontainer._participants.getUserListItemByPublicSID(value[2]).userTyping(value[1]);
                    } else if (value[0]=='chat'){
                        // Not Used
                        //Debug.warn("Not Used");
                        canvas.addChatHistory(value);
                    } else if (value[0]=='activateWhiteboard'){
                        // Not Used
                        //Debug.warn("Not Used");
                        canvas._drawarea.parent.parent.parent.activateWhiteboard(value);
                    } else if (value[0]=='newWhiteboard'){
                        // Not Used
                        //Debug.warn("Not Used");
                        canvas._drawarea.parent.parent.parent.newWhiteboard(value);
                    } else if (value[0]=='removeWindow'){
                        // Not Used
                        //Debug.warn("Not Used");
                        canvas._drawarea.parent.parent.parent.removeWindow(value);
                    } else if(value[0]=='fileslist'){
                        canvas.currentImagesListdraw.parent.onvisible.sendEvent(true);
                    } else if(value[0]=='initBrowser'){
                        canvas.startBrowser(value);
                    } else if(value[0]=='newBrowserURL'){
                        canvas.startBrowser(value);
                    } else if(value[0]=='closeBrowserURL'){
                        canvas.closeBrowser(value);
                    }
                    
                ]]>
            </handler>   
        </netRemoteCallHib>   
        <netRemoteCallHib name="sendVarsModeratorGeneral" funcname="sendVarsModeratorGeneral">
            <netparam name="vars"><method name="getValue">return canvas.VarsModeratorGeneral;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write("sendVarsModeratorGeneral : ",value);
                
                ]]>
            </handler>   
        </netRemoteCallHib>  

		<netRemoteCallHib name="sendChatMessageWithClient"
			funcname="chatservice.sendMessageWithClient" remotecontext="$once{ canvas.thishib }">
            <attribute name="messageObj" value="null" />
			<netparam><method name="getValue">return parent.messageObj;</method></netparam>

            <method name="sendMessage" args="messageObject">
                this.messageObj = messageObject;
                this.doCall();
            </method>
			<handler name="ondata" args="value">
                <![CDATA[
                    //The onResult-Handler will be called be the rtmpconnection
                    if ($debug) Debug.write("chatservice.sendMessageWithClient getValue : ",value);
                ]]>
			</handler>
		</netRemoteCallHib>
		
        <netRemoteCallHib name="sendMessageWithClient" funcname="sendMessageWithClient" 
                          remotecontext="$once{ canvas.thishib }" >  
            
            <attribute name="messageObj" value="null" />
            <method name="sendMessage" args="typeName,messageObject">
                this.messageObj = new Object();
                this.messageObj[0] = typeName;
                this.messageObj[1] = messageObject;
                this.doCall();
            </method>
            
            <method name="sendAdvMessage" args="typeName,messageObject,tStamp">
                this.messageObj = new Object();
                this.messageObj[0] = typeName;
                this.messageObj[1] = messageObject;
                this.messageObj[2] = tStamp;
                this.doCall();
            </method>
            
            <netparam name="vars"><method name="getValue">return parent.messageObj;</method></netparam>
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write("sendMessageWithClient : ",value);
            </handler>
        </netRemoteCallHib>
          
        <netRemoteCallHib name="sendVarsToMessageWithClient" funcname="sendVarsToMessageWithClient" 
                          remotecontext="$once{ canvas.thishib }" >  
            <netparam name="vars"><method name="getValue">return parent.parent.applymessage;</method></netparam>
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("sendVarsToMessageWithClient : ",value,value.message,value.message[0]);
                if (value[0]=='kick' || value.message[0]=='kick'){
                    //canvas.currentModApply
                    if ($debug) Debug.write("!!!!!! THIS USER GOING TO BE KICKED");
                    parent.showKickMessage = true;
                    parent.disconnect();
                    canvas.sendViaLocalConnection(canvas.vid_lc_name, "immediateExitRoom", [true,null]);
                } else if (value.message[0]=='copiedText'){
                    //canvas.currentModApply
                    
                    if ($debug) Debug.info("copiedText :: ",value.message[1]);
                    //System.setClipboard(value.message[1]);
                    //lz.Browser.setClipboard(value.message[1]);
                    //LzBrowserKernel.setClipboard (value.message[1]);
                    
                    //import flash.System;
                    //flash.System.setClipboard(value.message[1]);
                    
                    new lz.copiedTextPopup(canvas,{
                                       error:value.message[1]
                                    });
                    
                } else if (value.message[0]=='applyforMod'){
                    //canvas.currentModApply
                    if (canvas.streamid!=value.client.streamid) {
                        new lz.responseForModeration(canvas.main_content._content.inner,{
                                                                userobject:value.client,
                                                                clientId:value.client.streamid
                                                            });
                    }
                } else if (value.message[0]=='applyModAnswer'){
                    canvas.currentModApply.setUserAnswer(value);
                } else if (value.message[0]=='privatechat'){
                    if ($debug) Debug.write("privatechat",value.message,value.client);
                    canvas._currentChatPanel.privatechat(value.message,value.client);
                } else if (value.message[0]=='chat'){
                    if (canvas._chatcontent) canvas._chatcontent.addChatHistory(value.message,value.client);
                } else if (value.message[0]=='avsettings'){
                    canvas._videocontainer.setAVSettingsToClient(value.client);
                } else if (value.message[0]=='whiteboard'){
                    //if (value.message[1]=='wmlloadcomplete'){
                    //    canvas._drawarea.sendCompleteWmlLoadedRClient(value.client);
                    //} else if (value.message[1]=='wmlsynccomplete'){
                    //    canvas._drawarea.sendCompleteWmlSync(value.client);
                    //} else 
                    
                    if (value.message[1]=='imageloadcomplete'){
                        canvas._drawarea.sendCompleteImageLoadedRClient(value.client);
                    } else if (value.message[1]=='imagesynccomplete'){
                        canvas._drawarea.sendCompleteImageSync(value.client);
                    } else if (value.message[1]=='imageloaderror'){
                        canvas._drawarea.sendCompleteImageLoadedRClient(value.client);
                    } else if (value.message[1]=='imageloadtimeout'){
                        canvas._drawarea.sendCompleteImageLoadedRClient(value.client);
                    } else if (value.message[1]=='swfloadcomplete'){
                        canvas._drawarea.sendCompleteSWFLoadedRClient(value.client);
                    } else if (value.message[1]=='swfsynccomplete'){
                        canvas._drawarea.sendCompleteSWFSync(value.client);
                    } else if (value.message[1]=='swfloaderror'){
                        canvas._drawarea.sendCompleteSWFLoadedRClient(value.client);
                    } else if (value.message[1]=='swfloadtimeout'){
                        canvas._drawarea.sendCompleteSWFLoadedRClient(value.client);
                    } else if (value.message[1]=='inituser'){
                        
                        //this message is deprecated and can be removed!
                        //swagner 12.06.2008
                        //canvas._drawarea.sendCompleteImageSync(value.client);
                        if ($debug) Debug.write("inituser loadwmlObjectToStage: ",value.message[2]);
                        if (!canvas.ismoderator) canvas._drawarea.loadwmlObjectToStage(value.message[2],"","","",true,true);
                    } else if (value.message[1]=='initgetVars'){
                        //canvas._drawarea.sendCompleteImageSync(value.client);
                        //Debug.write("initgetVars sendVarsToMessageWithClient: ",value.message[2]);
                        canvas._drawarea.sendWatchObject(value.message[1],value.message[2],false);
                    } else if (value.message[1]=='syncinitLoader'){
                        //canvas._drawarea.sendCompleteImageSync(value.client);
                        //Debug.write("syncinitLoader sendVarsToMessageWithClient: ",value.message[2]);
                        if (value.client.streamid!=canvas.streamid) canvas._drawarea.remoteSyncLoader();
                    } else if (value.message[1][0]=='isSnapToGrid'){
                        canvas._drawarea.setAttribute('isSnapToGrid', value.message[1][1]);
                        //Debug.write("syncinitLoader sendVarsToMessageWithClient: ",value.message[2]);
                        //if (value.client.streamid!=canvas.streamid) canvas._drawarea.remoteSyncLoader();
                    }
                } else if (value.message[0]=='updateMuteStatus'){
                    canvas.setMuteStatus(value.message[1]);
                } else if (value.message[0]=='updateDrawStatus'){
                    canvas.setDrawAllowStatus(value.message[1]);
                    //Notify all Listeners for change of the item
                    canvas.setAttribute("drawAllowStatus",value.message[1]);
                } else if (value.message[0]=='updateGiveAudioStatus') {
                    canvas.setExclusiveAudioAllowStatus(value.message[1]);
                    canvas.setAttribute("exclusiveAudioAllowStatus",value.message[1]);                    
                } else if (value.message[0]=='applyForModeration'){
                    if ($debug) Debug.write("Somebody wants the Moderation ",value.client);
                    canvas.currentActivityList.addModerationRequest(value.client,value.message[1]);
                } else if (value.message[0]=='applyForScreen'){
                   if ($debug) Debug.write("Somebody wants to share/record Screen ",value.client);
                    canvas.currentActivityList.addScreenRequest(value.client,value.message[1]);
                } else if (value.message[0]=='applyForRemote'){
                    if ($debug) Debug.write("Somebody wants to remote control screen ",value.client);
                    canvas.currentActivityList.addRemoteRequest(value.client,value.message[1]);
                } else if (value.message[0]=='applyForWhiteboard'){
                    if ($debug) Debug.write("Somebody wants to draw on Whiteboard ",value.client);
                    canvas.currentActivityList.addWhiteboardRequest(value.client,value.message[1]);
                } else if (value.message[0]=='applyForA'){
                    if ($debug) Debug.write("Somebody wants to share A ",value.client);
                    canvas.currentActivityList.addAudioRequest(value.client,value.message[1]);
                } else if (value.message[0]=='applyForAV'){
                    if ($debug) Debug.write("Somebody wants to share AV ",value.client);
                    canvas.currentActivityList.addAudioAndVideoRequest(value.client,value.message[1]);
                } else if (value.message[0]=='hideActivityObj'){
                    if ($debug) Debug.write("Somebody wants to hideActivityObj ",value.client);
                    canvas.currentActivityList.hideActivityObj(value);
                } else if (value.message[0]=='applyForMuteOn'){
                    canvas.currentActivityList.applyForMuteOn(value.client,value.message[1]);
                } else if (value.message[0]=='applyForMuteOff'){
                    canvas.currentActivityList.applyForMuteOff(value.client,value.message[1]);
                } else if (value.message[0]=='applyForGiveExclusiveAudioOn'){
                    canvas.currentActivityList.applyForGiveExclusiveAudioOn(value.client,value.message[1]);
                } else if (value.message[0] == 'personal') {
                	var pSID = value.client.publicSID;
                    var vo = canvas._videocontainer._participants.getUserListItemByPublicSID(pSID);
                    if (vo != null) {
                    	vo.setAttribute('lastname', value.message[2]);
                    	vo.refObj.lastname = value.message[2];
                    }
					canvas.sendViaLocalConnection(canvas.vid_lc_name, "updateFirstLastName", [pSID, value.message[1], value.message[2]]);
                } else {
                    if ($debug) Debug.warn("sendVarsToMessageWithClient unkown message ",value);
                }
                ]]>
            </handler>   
        </netRemoteCallHib>     
    
        <netRemoteCallHib name="newMessageByRoomAndDomain" funcname="newMessageByRoomAndDomain">
            <handler name="ondata" args="value">
                //The onResult-Handler will be called be the rtmpconnection
                //if ($debug) Debug.write("newMessageByRoomAndDomain: ",value);    
                <![CDATA[
                    if (value[0]=='closeprivatechat'){
                        if ($debug) Debug.write("closeprivatechat",value);
                        canvas._currentChatPanel.closeprivatechat(value);
                    } else if (value[0]=='newprivatechat'){
	                    if ($debug) Debug.write("newprivatechat",value);
	                    canvas._currentChatPanel.newprivatechat(value);
	                } else if (value.message=='desktop'){
                        canvas._drawarea.incomingScreenSharing(value);
                    } else if (value.message=='library'){
                        
                        if (value.action == 'import') {
                            canvas.currentUploadWindow.myFileUpload.onCompleteByRemote(value);
                            return;
                        }
                        
                        var error = false;
                        for (var eg in value.error){
                            if (value.error[eg].exitValue!=0){
	                            if ($debug) Debug.write("eg ",eg," value ",value.error[eg]);
	                            if ($debug) Debug.write("eg ",eg," value ",value.error[eg].exitValue);
                                error = true;
                            }
                        }
                        canvas.currentUploadWindow.myFileUpload.onCompleteByRemote(value);
                        if (value.hasError) {
                            new lz.converterPopup(canvas.main_content._content.inner,{error:value.error});
                        }
                    } else if (value.message=='startStreaming'){
                        canvas._drawarea.startStreaming(value);
                    } else if (value.message=='stopStreaming'){
                        canvas._drawarea.stopStreaming(value);
                    } else if (value.message=='roomClosed'){
                        canvas.roomClosed();
                    } else if (value.message=='inviteToRoom'){
                        if ($debug) Debug.write("Incoming Room Invitation ",value);
                        new lz.chatParticipantsInviteNotification(canvas,{
                                    publicSID:value.publicSID,
                                    usermessage:value.usermessage,
                                    roomId:value.roomId
                                });
                    } else if (value.message=='inviteToRoomAnswer'){
                        if ($debug) Debug.write("Incoming Room inviteToRoomAnswer ",value);
                        new lz.errorPopup(canvas,{
                                    error:value.usermessage
                                });
                    } else {
                        if ($debug) Debug.warn("Unknown Event -newMessageByRoomAndDomain- ",value);
                    }
                    
                    
                ]]>    
            </handler>  
        </netRemoteCallHib>      
               
		<netRemoteCallHib name="newPoll" funcname="newPoll">
			<handler name="ondata" args="value">
			<![CDATA[
				//The onResult-Handler will be called by the rtmpconnection
				if ($debug) Debug.write("newPoll : ", value);
				if (canvas.user_id != value.createdBy.user_id) {
					flash.external.ExternalInterface.call("vote", canvas.publicSID);
				}
			]]>
			</handler>
		</netRemoteCallHib>                    
                                
        <netRemoteCallHib name="sendVarsToModeratorGeneral" funcname="sendVarsToModeratorGeneral">
            <handler name="ondata" args="value">
                <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                //Debug.write("sendVarsToWhiteboard : ",value);
                if (value[0]=='sharewhiteinit'){
                    if (!canvas.htmlframeisloaded){         
                        canvas.ifrm.createIFrame();
                        canvas.setAttribute('htmlframeisloaded',true);
                    }
                } else if (value[0]=='sharewhiteside'){
                    if (canvas.htmlframeisloaded){      
                        _htmlside.setAttribute('text',value[2]);
                        canvas.ifrm.setAttribute('isrc','http://'+value[2]);
                    }
                }
                ]]>
            </handler>   
        </netRemoteCallHib>       
        
   <!-- recordContentings Notifications -->
    <netRemoteCallHib name="stopedRecording" funcname="stopedRecording" >      
        <handler name="ondata" args="value">
            if ($debug) Debug.write("stopedRecording: ",value);
            canvas._mymod.recordingUser = null;
            canvas._mymod.setMessage();
        </handler>
    </netRemoteCallHib>
    
    <netRemoteCallHib name="startedRecording" funcname="startedRecording" >      
        <handler name="ondata" args="value">
            if ($debug) Debug.write("startedRecording: ",value);
            canvas._mymod.recordingUser = value;
            canvas._mymod.setMessage();
        </handler>
    </netRemoteCallHib>
    
    <netRemoteCallHib name="checkLzRecording" funcname="flvrecorderservice.checkLzRecording" >      
        <handler name="ondata" args="value">
            if ($debug) Debug.write("checkLzRecording: ",value);
            if (value != null) {
                canvas._mymod.recordingUser = value;
                canvas._mymod.setMessage();
            }
            parent.checkScreenSharing.doCall();
        </handler>
    </netRemoteCallHib>
    
    <netRemoteCallHib name="startedPublishing" funcname="startedPublishing" >      
        <handler name="ondata" args="value">
            if ($debug) Debug.write("startedPublishing: ", value);
            canvas._mymod.publishingObj = {user: value[0], url: value[1]};
            canvas._mymod.setMessage();
        </handler>
    </netRemoteCallHib>
    
    <netRemoteCallHib name="roomConnect" funcname="roomConnect" >      
        <handler name="ondata" args="value">
            if ($debug) Debug.write("roomConnect: ",value);
            canvas._videocontainer.addItem(value.connectedSince,value.isMod,value.streamid,value.username,
                              '',value.formatedDate,value.userpos,value.usercolor,value);
        </handler>
    </netRemoteCallHib>
    
	<netRemoteCallHib name="nickNameSet" funcname="nickNameSet" >
		<handler name="ondata" args="value">
			if ($debug) Debug.write("nickNameSet: ", value);
			canvas.setAttribute('mail', value.email);
			canvas.setAttribute('firstName', value.firstname);
			canvas.setAttribute('lastName', value.lastname);
			
			var vo = canvas._videocontainer._participants.getUserListItemByPublicSID(value.publicSID);
			if (vo != null) {
				vo.update(value);
			}
		</handler>
	</netRemoteCallHib>
    
    <!-- Whiteboard sync Events -->
    <netRemoteCallHib name="sendSyncFlag" funcname="sendSyncFlag">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("sendSyncFlag: ",value);
                if (canvas.syncWindow == null) {
                    canvas.syncWindow = new lz.syncWin(canvas.main_content._content.inner,{
                            labelid:558,labeliderror:559});
                }
            ]]>
        </handler>   
    </netRemoteCallHib>     
    
    <netRemoteCallHib name="sendSyncCompleteFlag" funcname="sendSyncCompleteFlag">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("sendSyncCompleteFlag: ",value);
                if (canvas.syncWindow != null) {
                    canvas.syncWindow.close();
                    canvas.syncWindow = null;
                }
            ]]>
        </handler>   
    </netRemoteCallHib>  
    
    <!-- Whiteboard Object Sync Process -->
    <netRemoteCallHib name="sendObjectSyncFlag" funcname="sendObjectSyncFlag">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("sendObjectSyncFlag: ",value);
                if (canvas.syncImageWindow == null) {
                    canvas.syncImageWindow = new lz.syncWin(canvas.main_content._content.inner,{labeliderror:591});
                }
            ]]>
        </handler>   
    </netRemoteCallHib>     
    
    <netRemoteCallHib name="sendObjectSyncCompleteFlag" funcname="sendObjectSyncCompleteFlag">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("sendObjectSyncCompleteFlag: ",value);
                if (canvas.syncImageWindow != null) {
                    canvas.syncImageWindow.close();
                    canvas.syncImageWindow = null;
                }
            ]]>
        </handler>   
    </netRemoteCallHib>  
    
    
    <!-- Recording of Meetings -->
    <netRemoteCallHib name="interviewStatus" funcname="interviewStatus">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("interviewStatus: ",value);
                canvas._drawarea.reloadStatus();
            ]]>
        </handler>   
    </netRemoteCallHib>  
    
    <netRemoteCallHib name="closeRoom" funcname="xmlcrm.closeRoom">
        <attribute name="room_id" value="0" type="number" />
        <attribute name="isClosed" value="true" type="boolean" />
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.room_id;</method></netparam>
        <netparam><method name="getValue">return parent.isClosed;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("closeRoom: ",value);
            ]]>
        </handler>   
    </netRemoteCallHib> 
    
    <netRemoteCallHib name="clearChatContent" funcname="clearChatContent">
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                canvas._chatcontent.reload();
            ]]>
        </handler>   
    </netRemoteCallHib> 
    
    <netRemoteCallHib name="setCanGiveAudio" funcname="whiteboardservice.setCanGiveAudio"
                   remotecontext="$once{ canvas.thishib }">
        <attribute name="publicSID" value="" type="string" />
        <attribute name="canGiveAudio" value="true" type="boolean" />
        <method name="sendValue" args="publicSID,giveAudio">
        	this.publicSID = publicSID;
        	this.canGiveAudio = giveAudio;
        	this.doCall();
        </method>
        <netparam><method name="getValue">return canvas.sessionId;</method></netparam>
        <netparam><method name="getValue">return parent.publicSID;</method></netparam>
        <netparam><method name="getValue">return parent.canGiveAudio;</method></netparam>
        <handler name="ondata" args="value">
            <![CDATA[
                //The onResult-Handler will be called be the rtmpconnection
                if ($debug) Debug.write("setCanGiveAudio : ",value);
            ]]>
        </handler>
    </netRemoteCallHib>
    
    
</class>

<hibRtmpConnection name="thishib" id="hib" />

</library>
