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

<!-- methods for main.lzx -->

<library>

	<class name="baseconfmenucommand" extends="command" >
    	<attribute name="enabled" value="true" type="boolean" />
    	<attribute name="tipLabelId" value="0" type="number" />
    </class>
    
    <class name="confmenucommand" extends="baseconfmenucommand" >
    	<attribute name="actionCommand" value="" type="string" />
    	<handler name="onselect" args="sel">
    		if (!this.enabled) {
    			return;
    		}
    		canvas.doActionmenu(this.actionCommand);
    	</handler>
    </class>
        
    <baseconfmenucommand id="cmd_shareDesktop" tipLabelId="1480" >
    	<handler name="onselect" args="sel">
    		if (!this.enabled) {
    			return;
    		}
    		canvas._mymod.checkForApplyScreen("no");
    	</handler>
    </baseconfmenucommand>
    
    <confmenucommand id="cmd_applyforMod" tipLabelId="1481" actionCommand="applyForMod" />
    
    <confmenucommand id="cmd_applyforWhiteBoard" tipLabelId="1492" key="['control','shift','2']">
    	<handler name="onselect" args="tSel">
    		if (!this.enabled) {
    			return;
    		}
    		if ($debug) Debug.write("cmd_applyforWhiteBoard onselect",tSel);
    		//Ask for Right to Draw on Whiteboard
			var tDate = new Date();
			canvas.thishib.sendMessageWithClient.sendMessage("applyForWhiteboard",tDate.getTime());
    	</handler>
    </confmenucommand>
    
    <baseconfmenucommand id="cmd_applyforAV" tipLabelId="1482">
    	<handler name="onselect" args="tSel">
    		if (!this.enabled) {
    			return;
    		}
    		if ($debug) Debug.write("cmd_applyforAV onselect",canvas.ismoderator,tSel);
    		if (canvas.ismoderator) {
				//Do directly send confirmation to share Audio/Video to SELF! so that all users get
				//the notification and the broadcasting Bit is set for this User
				canvas.thishib.setBroadCastingFlag.publicSIDOfNewModerator = canvas.publicSID;
				canvas.thishib.setBroadCastingFlag.isAllowedToBroadCastAV = true;
				canvas.thishib.setBroadCastingFlag.doCall();
			} else {
				//Apply for Right to Share Audio/Video
				var tDate = new Date();
				canvas.thishib.sendMessageWithClient.sendMessage("applyForAV",tDate.getTime());
			}
    	</handler>
    </baseconfmenucommand>
    
    <confmenucommand id="cmd_createPoll" tipLabelId="1483" actionCommand="createPoll" />
    <confmenucommand id="cmd_pollResults" tipLabelId="1484" actionCommand="pollResults" />
    <confmenucommand id="cmd_checkPollVoted" tipLabelId="1485" actionCommand="checkPollVoted" />
    <confmenucommand id="cmd_importFile" tipLabelId="1479" actionCommand="importFile" />
    <confmenucommand id="cmd_editCamMicSettings" actionCommand="editCamMicSettings" tipLabelId="1486" /> 
    <confmenucommand id="cmd_quit" actionCommand="quit" tipLabelId="1487" />
    <confmenucommand id="cmd_showSipDialer" actionCommand="showSipDialer" tipLabelId="1488" />
    
    <confmenucommand id="cmd_invitation" actionCommand="invitation" tipLabelId="1489" /> 
    <confmenucommand id="cmd_editWhiteboardDefault" actionCommand="editWhiteboardDefault" tipLabelId="1490" /> 
    
    <!-- 
    <confmenucommand id="cmd_coBrowser" actionCommand="browser_open" key="['control','b']"/> 
     -->
   
    <confmenucommand id="cmd_exportFilePNG" onselect="canvas.doWhiteboardActionmenu('exportFilePNG')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileJPG" onselect="canvas.doWhiteboardActionmenu('exportFileJPG')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileSVG" onselect="canvas.doWhiteboardActionmenu('exportFileSVG')" tipLabelId="1489" />
    <!-- 
    <confmenucommand id="cmd_exportFilePDF" onselect="canvas.doWhiteboardActionmenu('exportFilePDF')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileTIF" onselect="canvas.doWhiteboardActionmenu('exportFileTIF')" tipLabelId="1489" />
     -->
    
    <attribute name="colorArray" value="null" />
    
    <method name="getColorForUser">
    	<![CDATA[
    	   var colorArray = [0x92E8A4,0xC2F1FF,0xFFFCAE,0xE8C792,0xFF8073,
                            0xE8DB87,0xAFFFB8,0xBED4FF,0xE0BBE8,0xFFBBA5];
    	   return colorArray[Math.round(Math.random()*10)];
    	]]>
    </method>
    
    <method name="remoteLogWrite" args="message">
    	if ($debug) Debug.write(message);
    	var remoteLog = new lz.dataset();
    	remoteLog.setQueryType("POST");
    	remoteLog.setAttribute("src", canvas.getUrl() + "remotelog.upload");
    	remoteLog.setQueryParam("message", message);
    	remoteLog.setQueryParam("sid", canvas.sessionId);
    	remoteLog.doRequest();
    </method>
    
    <method name="getHttpHost">
   	<![CDATA[
    	if (canvas.httphostlocal != null && canvas.httphostlocal.length > 0) {
			return canvas.httphostlocal;
		}
		return canvas.rtmphostlocal;
	]]>
    </method>
        
	<method name="getUrl">
	<![CDATA[
		return canvas.protocol + '://' + getHttpHost()
			+ ':' + canvas.red5httpport + canvas.httpRootKey;
	]]>
	</method>
        
	<method name="getServicesUrl">
	<![CDATA[
		return getUrl() + 'services/';
	]]>
	</method>

	<method name="getTestingUrl">
	<![CDATA[
		return getUrl() + '?swf=networktesting' + ($debug ? 'debug' : '') + '.swf10.swf';
	]]>
	</method>

	<method name="getAppBaseUrlWithoutSwfSuffix">
	<![CDATA[
		var urlObject = lz.Browser.getBaseURL();
		//If Port is Null or undefinied use port 80
		var port = (urlObject.port != null && urlObject.port != undefined) ? urlObject.port : 80;
		//if($debug) Debug.write("getBaseUrl:: [urlObject, port]", urlObject, port);
		var url = "" + urlObject.protocol + "://" + urlObject.host + (port != 80 ? ":" + port : "") + urlObject.path;
		//if($debug) Debug.write("!!!!!!! getBaseUrl:: [urlObject, port, url]", urlObject, port, url);
		url = url + (url.slice(-1) == '/' ? '' : '/');
		//if($debug) Debug.write("!!!!!!! getBaseUrl:: [last, url]", url.slice(-1), url);
		return url.substring(0, url.length - 7); // the length of "public/"
	]]>
	</method>

	<method name="getAppBaseUrl">
	<![CDATA[
		return getAppBaseUrlWithoutSwfSuffix() + "swf"
	]]>
	</method>

	<method name="getScreenSharingUrl">
	<![CDATA[
		var organisation_id = (hib.currentdomainObj != null && hib.currentdomainObj.organisation_id != null)
			? hib.currentdomainObj.organisation_id : 1;
		if ($debug) Debug.write("mainMethods::getScreenSharingUrl ", hib.userobject, hib.currentdomainObj);
		
		var appBase = canvas.getAppBaseUrlWithoutSwfSuffix();
		if ($debug) Debug.write("appBase=" + appBase);
		var downloadurl = appBase + 'screen.upload?'
			+'rtmphostlocal=' + canvas.getHttpHost()
			+'&baseurl=' + escape(appBase)
			+'&domain=' + hib.conferencedomain
			+'&organization_id=' + organisation_id
			+'&sid=' + canvas.sessionId
			+'&connectionType=' + canvas.thishib.getProtocol()
			+'&port=' + canvas.thishib.getPort()
			+'&publicSID=' + canvas.publicSID
			+'&languageAsString=' + hib.userlang;
		if ($debug) Debug.write("mainMethods::getScreenSharingUrl ", downloadurl); 
		return downloadurl;
	]]>
	</method>
	
    <dataset type="http" name="languageData" request="false" 
        src="${ canvas.currentlanguage+'.xml' }" proxied="false">
        <handler name="ondata" args="value">
            parent.parseLanugageObject(value);
        </handler>
    </dataset>

    <method name="myinit">
        <![CDATA[
        canvas.mediaerrortimeout = 30000;
        canvas.medialoadtimeout = 30000;
        
        if($debug) Debug.write("main.lzx/config.xml ondata",this);
        
        //Set Config-values by public/config.xml, see comments on public/config.xml
        this.setAttribute('rtmphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/rtmphostlocal/text()'));   
        this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));  
        this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()'))); 
        
        var userSSLString = canvas.myConfigSet.getPointer().xpathQuery('config/useSSL/text()');
        if ($debug) Debug.write("userSSLString",userSSLString)
        if (userSSLString == "yes") {
            this.setAttribute('useSSL',true);
        }
        
        this.setAttribute('red5httpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/red5httpport/text()')));
        
        this.setAttribute('currentappname',canvas.myConfigSet.getPointer().xpathQuery('config/currentappname/text()'));  
        this.setAttribute('currentappnameurl',canvas.myConfigSet.getPointer().xpathQuery('config/currentappnameurl/text()'));  
        this.setAttribute('currentappnamebugurl',canvas.myConfigSet.getPointer().xpathQuery('config/currentappnamebugurl/text()'));
        this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
        this.setAttribute('webAppRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/webAppRootKey/text()'));
        this.setAttribute('showWindowEffect',canvas.myConfigSet.getPointer().xpathQuery('config/showWindowEffect/text()'));
        this.setAttribute('firstdayinweek',canvas.myConfigSet.getPointer().xpathQuery('config/firstdayinweek/text()'));
        this.setAttribute('showRecording',canvas.myConfigSet.getPointer().xpathQuery('config/showRecording/text()'));
        
        //old menubar is not active anymore
        //this.setAttribute('showmodernWhiteBoard',canvas.myConfigSet.getPointer().xpathQuery('config/showmodernWhiteBoard/text()'));
        
        //Audio-Video-Settings
        this.setAttribute('codecType',canvas.myConfigSet.getPointer().xpathQuery('config/codecType/text()'));
        this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));  
        this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));  
        this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));  
        this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));  
        this.setAttribute('camQualityBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityBest/text()')));  
        
        this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));  
        this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));  
        
        
        this.setAttribute('moderatorModuleUser',canvas.myConfigSet.getPointer().xpathQuery('config/moderatorModuleUser/text()'));  
        this.setAttribute('moderatorModuleRoom',canvas.myConfigSet.getPointer().xpathQuery('config/moderatorModuleRoom/text()'));  
        
        this.setAttribute('dashboardModuleStartScreen',canvas.myConfigSet.getPointer().xpathQuery('config/dashboardModuleStartScreen/text()'));  
        this.setAttribute('dashboardModuleCalendar',canvas.myConfigSet.getPointer().xpathQuery('config/dashboardModuleCalendar/text()'));  
        this.setAttribute('conferenceRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/conferenceRoomModule/text()'));  
        this.setAttribute('restrictedRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/restrictedRoomModule/text()'));  
        this.setAttribute('interviewRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/interviewRoomModule/text()'));  
        this.setAttribute('recordModule',canvas.myConfigSet.getPointer().xpathQuery('config/recordModule/text()'));
          
        this.setAttribute('httpRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/httpRootKey/text()'));
        this.setAttribute('httphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/httphostlocal/text()'));
        this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));  
        this.setAttribute('proxyType',canvas.myConfigSet.getPointer().xpathQuery('config/proxyType/text()'));

		//set user color
		canvas.currentusercolor = canvas.getColorForUser();

        var lc_SID = lz.Browser.getInitArg('lc_SID');
        
        if($debug) Debug.write("lc_SID: ", lc_SID);
        
        if (lc_SID == undefined) {
        	new lz.errorPopup(canvas,{'error':'You are loading the wrong SWF, there is no lz_SID given'});
        	return;
        }
        
        

        this.setAttribute('lc_SID', lc_SID);
        this.setAttribute('vid_lc_name', this.lc_SID + "__videoLC");
        this.setAttribute('rtmp_lc_name', this.lc_SID + "__rtmpLC");
        this.setAttribute('videoComp_lc_name', this.lc_SID + "__streamLC");
        this.setAttribute('videoComp_lc_callback_name', this.lc_SID + "__streamLC_cback");

        var videoComp_lc = new LocalConnection();
        videoComp_lc.connect(this.videoComp_lc_name);
        this.setAttribute('videoComp_lc', videoComp_lc);
        
        var t = this;
    	canvas.videoComp_lc.regExpResult = function(tId,tResult) {
      		t.regExpResult(tId,tResult);
        }
        canvas.videoComp_lc.remoteLogWrite = function(message) {
        	canvas.remoteLogWrite(message);
        }
        canvas.videoComp_lc.exitRoom = function(confirm) {
            if ($debug) Debug.write("confirm exitRoom:", confirm);
            if (confirm) {
            	logicalRoomLeave.doCall();
            }
        }
    
        mainBaseText.setAttribute('text',canvas.currentappname);
        var cleanUrl = _url;
        
        var hasParams = _url.indexOf("?");
        if (hasParams != -1) {
            cleanUrl = _url.substr(0, hasParams);
        }
        
        if ($debug) Debug.write("_url ",_url,cleanUrl);
        var doubleSlash = cleanUrl.indexOf("//");
        var isNotPort80 = cleanUrl.indexOf(":", doubleSlash+2);
        if ($debug) Debug.write("isNotPort80: ",isNotPort80,doubleSlash);
        if (isNotPort80!=-1){
            //Debug.write("isNotPort80: ",doubleSlash+2, _url.indexOf(":", doubleSlash+2)-doubleSlash-2);
            var server = cleanUrl.substr(doubleSlash+2, _url.indexOf(":", doubleSlash+2)-doubleSlash-2); 
        } else {
            var server = cleanUrl.substr(doubleSlash+2, _url.indexOf("/", doubleSlash+2)-doubleSlash-2); 
        }
        
        if ($debug) Debug.write("this zielnr: ",this,server);
        
        this.setAttribute('rtmphost',server);
    
        if (this.rtmphostlocal.length==0){
            this.setAttribute('rtmphostlocal',server);
        }
        
        //Check for Invitation
        var invitationHash = lz.Browser.getInitArg('invitationHash');
        
        if ($debug) Debug.info("###################### -1 ");
        if ($debug) Debug.info("invitationHash :: ",invitationHash);
        
        if (invitationHash != undefined){
            canvas.isinitRoomDirect = true;
            canvas.invitationHash = invitationHash;
        }
        
        var secureHash = lz.Browser.getInitArg('secureHash');
        if (secureHash != undefined){
            canvas.secureRemoteUserLogin = true;
            canvas.secureHash = secureHash;
        }
        
        if ($debug) Debug.info("###################### -2 ");
        
        //sid=fe9ea55284e0b23991b1c1089b2c8f64&roomid=1
        var sid = lz.Browser.getInitArg('sid');
        var initroomid = lz.Browser.getInitArg('roomid');
        if (sid != undefined && initroomid != undefined){
            canvas.remoteUserLogin = true;
            canvas.initroomid = initroomid;
            canvas.remoteUserSid = sid;
        }
        
        var directRoomId = lz.Browser.getInitArg('directRoomId');
        if (directRoomId != undefined) {
            canvas.directUserLogin = true;
            canvas.directRoomId = directRoomId;
        }
        
        var language = lz.Browser.getInitArg('language');
        if (language != undefined) {
            canvas.language_id = Number(language);
        }
    
        //check for reset password
        var hash = lz.Browser.getInitArg('hash');
        if (hash!=undefined){
            canvas.isResetUsername = true;
            canvas.resetHash = hash;        
        }
        
        var cuserItem = lz.Browser.getInitArg('cuser');
        if (cuserItem!=undefined){
            canvas.cuser = cuserItem;  
            
            //Lookup additional actions
            var tAccept = lz.Browser.getInitArg('tAccept');
            if (tAccept != undefined) {
                canvas.cuserStatus = tAccept;
            } else {
                canvas.cuserStatus = "none";
            }
            
        }
        
        var moodleRoom = lz.Browser.getInitArg('moodleRoom');
        var becomemoderator = lz.Browser.getInitArg('becomemoderator');
        
        if (becomemoderator != undefined) {
            if (becomemoderator == "2"){
                canvas.becomemoderator = true;
            } else {
                canvas.becomemoderator = false;
            }
        }
        
        if (moodleRoom != undefined){
            canvas.isMoodleRoom = true;
            
            var moodleWwwRoot = lz.Browser.getInitArg('wwwroot');
            var moodleUserId = lz.Browser.getInitArg('user_id');
            var moodlePicture = lz.Browser.getInitArg('picture');
            
            if (moodleWwwRoot != undefined) {
                canvas.moodleWwwRoot = moodleWwwRoot;
            }
            if (moodleUserId != undefined) {
                canvas.moodleUserId = Number(moodleUserId);
            }
            if (moodlePicture != undefined) {
                canvas.moodlePicture = moodlePicture;
            }
        }
        
        var scopeRoomId = lz.Browser.getInitArg('scopeRoomId');
        if (scopeRoomId != undefined){
            hib.userScope = scopeRoomId;
        }
        
       	canvas.setAttribute('wicketsid', null);
        var wicketsid = lz.Browser.getInitArg('wicketsid');
        var wicketroomid = lz.Browser.getInitArg('wicketroomid');
        if (wicketsid != undefined && wicketroomid != undefined && !isNaN(wicketroomid)) {
        	canvas.setAttribute('wicketsid', wicketsid);
        	canvas.setAttribute('wicketroomid', Number(wicketroomid));
        	hib.userScope = wicketroomid;
        }
        this.setBaseColors();
    
        //Debug.write("rtmphostlocal,rtmphost: ",canvas.rtmphostlocal,canvas.rtmphost); 
        var src = hib.getUrl();
        
        canvas.thishib.setAttribute('src',src);
        canvas.thishib.loaderVar = new lz.autoLoader(canvas);
        canvas.thishib.loaderVar._src.setAttribute('text',src);
        canvas.thishib.connect();
        ]]>
    </method>
    
	<netRemoteCallHib name="logicalRoomLeave" funcname="logicalRoomLeave" remotecontext="$once{ canvas.thishib }" >
		<handler name="ondata" args="value">
			if ($debug) Debug.write("############# logicalRoomLeave: ",value);
			canvas.currentBaseConferenceRoom._screenSharingAdapter.closeAllScreenSharings();
			if (canvas.appointmentNotificationPopUp != null) {
				canvas.appointmentNotificationPopUp.destroy();
			}
			canvas.doActionmenu('quit');
		</handler>
	</netRemoteCallHib>
	
    <method name="getLabelName" args="id">
        //if($debug) Debug.write("main.lzx/getLabelName()",id);
        return getLabelTag(id);
    </method>
    
    <!--
        exportFilePNG exportFileJPG exportFilePDF exportFileSVG exportFileTIF
     -->
     
    <method name="doWhiteboardActionmenu" args="action">
        if (action == "exportFilePNG") {
            canvas._drawarea.confirmSaveAsImageTypeExport("image","png");
        } else if (action == "exportFileJPG") {
            canvas._drawarea.confirmSaveAsImageTypeExport("image","jpg");
        } else if (action == "exportFilePDF") {
            canvas._drawarea.confirmSaveAsImageTypeExport("image","pdf");
        } else if (action == "exportFileSVG") {
            canvas._drawarea.confirmSaveAsImageExport("image");
        } else if (action == "exportFileTIF") {
            canvas._drawarea.confirmSaveAsImageTypeExport("image","tif");
        }
    </method>

	<method name="quit">
		canvas.videoComp_lc.exitRoom = null;
		canvas.thishib.src = null;
		canvas.thishib.reconnectionAction = false;
		canvas.thishib.reconnectAfterRoomleft = false;
		canvas.thishib.counterror = 100;
		canvas.thishib.disconnect();
		canvas.thishib._nc.close();
		flash.external.ExternalInterface.call("roomExit");
	</method>
	
	<!---
		Actions connected to the shortcuts
	 -->
    <method name="doActionmenu" args="stringSub">
        <![CDATA[
            if($debug) Debug.write("doActionmenu: ",stringSub);
            if (canvas._conferencemenu.visibility == 'visible'){
            	 if (stringSub == "invitation") {
				    canvas.inviteMainWindow.setAttribute('visibility', 'visible');
			    } else if (stringSub=='editWhiteboardDefault') {
                    new lz.editWhiteboardDefault(canvas.main_content._content.inner);
                } else if (stringSub=='createPoll') {
                    new lz.createPollWin(canvas.main_content._content.inner);
                } else if (stringSub=='pollResults') {
                    this.getVotes.doCall();
                } else if (stringSub=='checkPollVoted') {
                    this.checkHasVoted.doCall();
                } else if (stringSub=='importFile') {
                    new lz.uploadWindowExplorer(canvas.main_content._content.inner,{
                            x:60,uploadmodule:canvas.uploadmoduleimg,
                            parentFolderId:0,
                            isOwner:false,
                            fileExplorerRef:null,
                            isOnlyImage:true,
                            servletName:'file.upload'
                        });
                } else if (stringSub=='applyForMod') {
                    if ($debug) Debug.info("Apply For Mod through doActionmenu");
                    //new lz.applyForModeration(canvas.main_content._content.inner);
                    canvas.thishib.applyForModeration.doCall();
                } else if (stringSub=='editCamMicSettings') {
                    canvas._videocontainer._videoviewcontent.changeDevice();
                } else if (stringSub=='showSipDialer') {
                    new lz.sipDialer(canvas.main_content._content.inner);
                } else if (stringSub=='quit') {
					canvas.quit();
                } else if( stringSub == "browser_open" ){
                    var browserPanelWidth  = canvas.browserPanelWidth;
                    var browserPanelHeight = canvas.browserPanelHeight;

                    if ($debug) Debug.write( "is browser[open] ? ", canvas.main_content._content.inner.conferenceBrowser );
                    if ($debug) Debug.write( "is browser[browserPanelWidth] ? ", browserPanelWidth );
                    if ($debug) Debug.write( "is browser[browserPanelHeight] ? ", browserPanelHeight );

                    if( !canvas.conferenceBrowserIsinited ){
                        new lz.conferenceBrowser( canvas.main_content._content.inner,{
                                                         name:'conferenceBrowser',y:30,
                                                         width:canvas.width-220, 
                                                         height:canvas.height-100,
                                                         width:browserPanelWidth, 
                                                         height:browserPanelHeight
                                                     });
                    } else{
                    with( canvas.main_content._content.inner ){
                            conferenceBrowser.htmlviewer.setVisible( true );
                            conferenceBrowser.setVisible( true );
                    }
                }
             } else if( stringSub == "browser_close" ){
                if ($debug) Debug.write( "is browser[close] ? ", canvas.main_content._content.inner.conferenceBrowser );
                with( canvas.main_content._content.inner ){
                    if( conferenceBrowser  != undefined ){
                            conferenceBrowser.htmlviewer.setVisible( false );
                            conferenceBrowser.setVisible( false );
                    }
                }
            }
          }
        ]]>
    </method> 
    
    <method name="startBrowser" args="objMessage">
        <![CDATA[
            if( !canvas.conferenceBrowserIsinited ){
                        if ($debug) Debug.write( "if this" );
                new lz.conferenceBrowser(canvas.main_content._content.inner,{
                                             name:'conferenceBrowser',y:30,
                                             width:canvas.width-220, 
                                             height:canvas.height-100,
                                             initedByUser:false,
                                             initURL:objMessage[1]
                                        });
            } else{Debug.write( "else this" );
                with( canvas.main_content._content.inner ){
                        conferenceBrowser.htmlviewer.setVisible( true );
                        conferenceBrowser.setVisible( true );
                        conferenceBrowser.newBrowserURL(objMessage[1]);
                }
            }
        ]]>
    </method>   
    
    <method name="closeBrowser" args="objMessage">
        <![CDATA[
            if( canvas.conferenceBrowserIsinited ){
                with( canvas.main_content._content.inner ){
                        conferenceBrowser.close();
                }
            }
        ]]>
    </method>
    
    <netRemoteCallHib name="getVotes" funcname="pollservice.getVotes" remotecontext="$once{ canvas.thishib }" >
        <handler name="ondata" args="value">
            new lz.resultPollWin(canvas.main_content._content.inner, {roomPoll: value});
        </handler>   
    </netRemoteCallHib>  
        
    <netRemoteCallHib name="checkHasVoted" funcname="pollservice.checkHasVoted" remotecontext="$once{ canvas.thishib }" >
        <handler name="ondata" args="value">
            <![CDATA[
                      if (value==1){
                        parent.getPoll.doCall();
                      } else if (value==-1){
                        new lz.messageWin(canvas.main_content._content.inner,{labeliderror:31});
                      } else if (value==-2){
                            new lz.messageWin(canvas.main_content._content.inner,{labeliderror:41});
                }
            ]]>
        </handler>   
    </netRemoteCallHib> 
    
    <netRemoteCallHib name="getPoll" funcname="pollservice.getPoll" remotecontext="$once{ canvas.thishib }" >
        <handler name="ondata" args="value">
            <![CDATA[
                if (value!=null){
                    if ($debug) Debug.write(":: getPoll: ", value);
                     new lz.answerPoll(
                        canvas.main_content._content.inner
                        , {
                            createdBy: value.createdBy.login
                            , pollDate: value.created
                            , pollQuestion: value.pollQuestion
                            , pollTypeId: value.pollType.pollTypesId
                            , roomPollAnswerList: value.roomPollAnswerList
                            , roomPollId: value.roomPollId
                            , roomScopeName: value.roomScopeName
                        }
                     );
                }
            ]]>
        </handler>
    </netRemoteCallHib> 
    
    <method name="setRoomValues" args="roomTypeId,roomId,roomObj">
    
        if ($debug) Debug.warn("setRoomValues ",roomTypeId,roomId,roomObj);
        if (roomTypeId==1){
                canvas.isConference = true;
            } else {
                canvas.isConference = false;
        }
        
        //this is needed cause in the rpc-method *getCurrentModeratorList* we check if its roomtype_id == 3
        //and if roomtype_id == 3 we will not show any *There is no Moderator* Warning Dialog
        canvas.currentRoomObject = roomObj;

        hib.currentroomid = roomId;
        if (roomObj!=null){
            if (roomTypeId==1){
                
                new lz.testSetup(canvas,{isDirectLink:true,roomClassName:canvas.conferenceRoomModule,roomObj:roomObj});
                 
            } else if (roomTypeId==2){
                
                new lz.testSetup(canvas,{isDirectLink:true,roomClassName:canvas.restrictedRoomModule,roomObj:roomObj});
                new lz.labelerrorPopup(canvas,{error:'No RoomType currently available for roomTypeId 2'});
                 
            } else if (roomTypeId==3){
                
                new lz.testSetup(canvas,{isDirectLink:true,roomClassName:canvas.restrictedRoomModule,roomObj:roomObj});
                 
            } else if (roomTypeId==4){
                
                new lz.testSetup(canvas,{isDirectLink:true,roomClassName:canvas.interviewRoomModule,roomObj:roomObj});
                 
            } else if (roomTypeId==5){
                
                new lz.testSetup(canvas,{isDirectLink:true,roomClassName:canvas.customRoomModule,roomObj:roomObj});
                 
            } 
        }
    </method>
    
	<method name="roomClosed">
	    <![CDATA[
	        if ($debug) Debug.write("canvas.currentRoomObject ",canvas.currentRoomObject);
	        new lz.redirectBox(canvas,{redirectURL:canvas.currentRoomObject.redirectURL});
	    ]]>
	</method>
                 
        

	
	<method name="parseLanugageObject" args="obj">
	
	    ////Debug.write('parseLanugageObject: ',obj);
	    ////Debug.write('parseLanugageObject: ',obj.childNodes);
	    <![CDATA[
	    var t = new Array();
	    for (var i=0;i<obj.childNodes.length;i++){
	        for (var k=0;k<obj.childNodes[i].childNodes.length;k++){
	            ////Debug.write(obj.childNodes[i].childNodes[k]);
	            var t2 = new Array();
	            t2[obj.childNodes[i].childNodes[k].childNodes[0].nodeName]=obj.childNodes[i].childNodes[k].childNodes[0].childNodes[0].data;
	            t2[obj.childNodes[i].childNodes[k].childNodes[1].nodeName]=obj.childNodes[i].childNodes[k].childNodes[1].childNodes[0].data;
	            t.push(t2);
	        }
	    }
	    setLabelObject(t);
	    canvas.initScreen();
	    //Debug.write(t);
	    ]]>
	</method>
	
	<!-- Data Source Definition -->
	<dataset name="getSessionVarsData" request="false" proxied="false"
	    querytype="POST" src="${ 'http://'+canvas.rtmphost+'/webrooms/checksession.php' }" 
	    type="http" >
	    <handler name="ondata" args="value">
	    
	        //Debug.write(value);
	        canvas.setAttribute('currentcourse',value.childNodes[0].childNodes[0].childNodes[0].childNodes[0].data);
	        canvas.setAttribute('currentcourseName',canvas.currentcourse);
	        canvas.setAttribute('currentcourseNameLong',value.childNodes[0].childNodes[0].childNodes[1].childNodes[0].data);
	        canvas.setAttribute('currentlanguage',value.childNodes[0].childNodes[0].childNodes[8].childNodes[0].data);
	
	        canvas.setAttribute('currentusename',value.childNodes[0].childNodes[1].childNodes[2].childNodes[0].data+' '+value.childNodes[0].childNodes[1].childNodes[1].childNodes[0].data);
	        
	        canvas.setAttribute('user_id',value.childNodes[0].childNodes[1].childNodes[0].childNodes[0].data);
	        canvas.setAttribute('firstName',value.childNodes[0].childNodes[1].childNodes[1].childNodes[0].data);
	        canvas.setAttribute('lastName',value.childNodes[0].childNodes[1].childNodes[2].childNodes[0].data);
	        canvas.setAttribute('mail',value.childNodes[0].childNodes[1].childNodes[3].childNodes[0].data);
	        canvas.setAttribute('lastLogin','');
	        canvas.setAttribute('official_code',value.childNodes[0].childNodes[1].childNodes[5].childNodes[0].data);
	        canvas.setAttribute('picture_uri','');
	        canvas.setAttribute('language',value.childNodes[0].childNodes[1].childNodes[7].childNodes[0].data);
	
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[0].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[1].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[2].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[3].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[4].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[5].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[6].childNodes[0].data);
	        //Debug.write(value.childNodes[0].childNodes[1].childNodes[7].childNodes[0].data);
	        
	        switch (canvas.currentlanguage){
	            case 'english':
	            break;
	            case 'german':
	            break;
	            case 'french':
	            break;          
	            default:
	            canvas.setAttribute('currentlanguage','english');
	            break;
	        }
	        
	        var addIt='conf';
	        if (!canvas.isConference){
	            addIt='meet'
	        }
	        canvas.setAttribute('currentcourse',canvas.rtmphost+canvas.currentcourse+addIt);
	        canvas.setAttribute('currentuser',value.childNodes[0].childNodes[1].childNodes[5].childNodes[0].data);
	        
	        canvas.setAttribute('loadingmessage','loading language data');
	        canvas.languageData.doRequest();
	    </handler>
	</dataset>
	
	<method name="addBrowserTabHistory" args="value">
	    <![CDATA[
	    //Debug.write("addBrowserTabHistory: ",value);
	    _browserhistory.addItem(value);
	    this.browserTabHistory.push(value);
	    ]]>
	</method>
	  
	<!---
	@doc The function does compare the new moderator list with the old and prepares the list 
		the removeModeratorList is used in the performance optimized user list of the restricted 
		room type to re-render the list items only if really something has changed in any 
		of the user list items
	 -->
	<method name="analyzeModerationList" args="newList">
	    <![CDATA[
	    
	       canvas.newModeratorList = new Array();
	       canvas.removeModeratorList = new Array();
	       
	       if (canvas.currentModeratorList != null) {
	           for (var i=0;i<canvas.currentModeratorList.length;i++) {
	                canvas.currentModeratorList[i].found = false;
	           }
	       
	           for (var i=0;i<canvas.currentModeratorList.length;i++) {
	                
	                for (var k=0;k<newList.length;k++) {
	                    if (newList[k].publicSID == canvas.currentModeratorList[i].publicSID) {
	                        canvas.currentModeratorList[i].found = true;
	                    }
	                }
	            }
	        }
	        
	        for (var k=0;k<newList.length;k++) {
	            newList[k].found = false;
	        }
	       
	        for (var k=0;k<newList.length;k++) {
	        	if (canvas.currentModeratorList != null) {
	                for (var i=0;i<canvas.currentModeratorList.length;i++) {
	                    if (newList[k].publicSID == canvas.currentModeratorList[i].publicSID) {
	                        newList[k].found = true;
	                    }
	                }
	        	}
	        }
	        
	        for (var k=0;k<newList.length;k++) {
	            if (!newList[k].found) {
	                canvas.newModeratorList.push(newList[k]);
	            }
	        }
	        
	        if (canvas.currentModeratorList != null) {
	            for (var i=0;i<canvas.currentModeratorList.length;i++) {
	                
	                if (!canvas.currentModeratorList[i].found) {
	                    canvas.removeModeratorList.push(canvas.currentModeratorList[i])
	                }
	            }
	        }
	        
	        if ($debug) Debug.write("newModeratorList :: ",canvas.newModeratorList);
	        if ($debug) Debug.write("removeModeratorList :: ",canvas.removeModeratorList);
	    ]]>
	</method>
	
	<!---
		Updates the "ismoderator" flag
		the setAttribute method will broadcast an event to all event listeners that 
		did subscribe using the "onismoderator" handler with reference to canvas !
		For example in the userlist's of the roomtypes
	 -->
	<method name="updateModerationFlag">
	    <![CDATA[
	        if ($debug) Debug.write("updateModerationFlag",canvas.currentModeratorList);
	        var isCurrentModerator = false;
	        for (var i=0;i<canvas.currentModeratorList.length;i++) {
	            var item = canvas.currentModeratorList[i];
	            if (canvas.publicSID == item.publicSID) {
	                isCurrentModerator = true;
	            }
	        }
	        
	        //Only send this event if the current user moderators status changes
	        if (isCurrentModerator != this.ismoderator) {
		        canvas.sendViaLocalConnection(canvas.vid_lc_name, "updateModerationFlag", [isCurrentModerator]);
	        }
	        
	        // do always spread this event, we need to broadcast the "onismoderator" event
	        // so that we can update the status of other users in the user list
	        this.setAttribute('ismoderator',isCurrentModerator);
	    ]]>
	</method> 
	
	<!---
		Checks if a certain publicSID is a moderator
	 -->
	<method name="getIsModeratorByPublicSID" args="publicSID">
	    <![CDATA[
	        for (var i=0;i<canvas.currentModeratorList.length;i++) {
	            var item = canvas.currentModeratorList[i];
	            if (publicSID == item.publicSID) {
	                return true;
	            }
	        }
	        return false;
	    ]]>
	</method>
	 
	<!---
		Sets the flags isAllowedToDraw, isAllowedToScreenShare, isAllowedToRemoteControl 
		and broadcasts the three rights to SWF10 container
	 -->
	<method name="setDrawAllowStatus" args="roomClientObj">
	    <![CDATA[
	        if ($debug) Debug.write("drawAllowStatus changes ###### ");
	        if (roomClientObj.publicSID==canvas.publicSID) {
	            canvas.setAttribute("isAllowedToDraw",roomClientObj.canDraw);
	            canvas.setAttribute("isAllowedToScreenShare",roomClientObj.canShare);
	            canvas.setAttribute("isAllowedToRemoteControl",roomClientObj.canRemote);
	            canvas.sendViaLocalConnection(canvas.vid_lc_name, "setDrawAllowStatus", [roomClientObj.canDraw, roomClientObj.canShare, roomClientObj.canRemote]);
	        }
	    ]]>
	</method>
	
	<!---
		Sets the flag for the isAllowedToGiveExclusiveAudio status and broadcasts it to the 
		SWF10 container
	 -->
	<method name="setExclusiveAudioAllowStatus" args="roomClientObj">
	    <![CDATA[
	        if ($debug) Debug.write("giveExclusiveAudioStatus changes ###### ");
	        if (roomClientObj.publicSID==canvas.publicSID) {
	            canvas.setAttribute("isAllowedToGiveExclusiveAudio",roomClientObj.canGiveAudio);
	            canvas.sendViaLocalConnection(canvas.vid_lc_name, "setExclusiveAudioAllowStatus", [roomClientObj.canGiveAudio]);
	        }
	    ]]>
	</method>
	
	<method name="setMuteStatus" args="roomClientObj">
	    <![CDATA[
	        if ($debug) Debug.write("setMuteStatus changes ###### ",roomClientObj.micMuted);
	        //Check for self status
	        if (roomClientObj.publicSID==canvas.publicSID) {
	            canvas.setAttribute("micMuted",roomClientObj.micMuted);
	        }
	        
	        canvas._videocontainer.updateMuteStatusVideoView(roomClientObj);
	        
	        //Notify all Listeners for change of the item
	        canvas.setAttribute("micMutedStatusChangedItem",roomClientObj);
	    ]]>
	</method>
	
	<method name="addFolderSequence" args="foldername">
	    <![CDATA[
	    this.uploadmoduleimgfolder = '/';
	    this.uploadmoduleimgfolder += foldername;
	    this.setAttribute('uploadmoduleimgfolder',this.uploadmoduleimgfolder);
	    ]]>
	</method>
	    
	    
	<!-- country validation -->
	<method name="validateCountry" args="str">
	    ////Debug.write("validateCountry: ",str);
	    str = str.toLowerCase();
	    <![CDATA[
	        if (str.length!=0){
	            var a = new Array();
	            for (var i=0;i<canvas.statesInitValues.length;i++){
	                var st = canvas.statesInitValues[i].name.toLowerCase();
	                if (st.startsWith(str))a.push(canvas.statesInitValues[i]);
	                //this.addItem(canvas.statesInitValues[i].name,canvas.statesInitValues[i].state_id);
	            }
	            return a;
	        }
	    ]]> 
	</method>
	    
	<method name="getCountryRecord" args="id">
	    return canvas.statesInitValues[id];
	</method>
	    
	<handler name="onmousewheeldelta" reference="lz.Keys" args="d">
	    var obj = getCurrentMouseWheelObject();
	    ////Debug.write("onmousewheeldelta 12: ",d,obj);
	    <![CDATA[
	        if (obj!=null) {
	            obj.step(-d);
	        }
	    ]]>
	</handler>    
	
	<method name="reverseWordingsBySplit" args="str">
	    <![CDATA[
	        var words_arr = str.split( " " ); // an array of chars
	        for ( var i = 0, str = ""; i < words_arr.length; i++ ) // reverse their order
	        {
	            str += words_arr[ words_arr.length - i - 1 ];
	            if (words_arr.length != 1) {
	                str += " ";
	            }
	        }
	        return str;
	        
	    ]]>
	</method> 
	
	<method name="reverseAll" args="str">
	    <![CDATA[
	        var words_arr = str.split( "" ); // an array of chars
	        for ( var i = 0, str = ""; i < words_arr.length; i++ ) // reverse their order
	        {
	            str += words_arr[ words_arr.length - i - 1 ];
	            
	        }
	        return str;
	        
	    ]]>
	</method> 
	    
	<method name="reverseWords" args="str">
	    <![CDATA[
	        if ( str == "" || str == null ) return ""; // undefined
	        // first char indicates the main directive of str (rtl/ltr)
	        if ( isLTR( str.charCodeAt( 0 ) ) ) return str; // english or number
	        var words_arr = str.split( "" ); // an array of chars
	        for ( var i = 0, str = ""; i < words_arr.length; i++ ) // reverse their order
	            str += words_arr[ words_arr.length - i - 1 ];
	        return str;
	    ]]>
	</method>
	    
	<method name="isLTR" args="c">
	    <![CDATA[
	        return ( c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 );
	    ]]>
	</method>
	
	<method name="isHEB" args="c">
	    <![CDATA[
	        return ( c >= 224 && c <= 250 );
	    ]]>
	</method>    
	
	<method name="setTextAlign" args="obj,type">
	    switch ( type ) {
	        case "left" :
	            obj.setX( 0 );
	        break;
	        case "center" :
	            obj.setX( this.parent.width / 2 - this.getTextWidth() / 2 );
	        break;
	        case "right" :
	            obj.setX( this.parent.width - this.getTextWidth() );
	        break;
	    }
	</method>  
	
	<method name="initSharedObject">
	    if (canvas.sharedObject == null) {
	        if($debug) Debug.write("canvas.initSharedObject sharedObject IS null");
	        canvas.sharedObject = new lz.sharedObject();
	        canvas.sharedObject.getLocal('userdata');
	    }
	</method>
	
	<method name="getUserData">
	    canvas.initSharedObject();
	    var g = canvas.sharedObject.getData('userdata');
	    if (g==null) {
	        if($debug) Debug.write("sharedObject.getData IS null");
	        g = new Array();
	    }
	    return g;
	</method>
	
	<method name="setUserData" args="g">
	    canvas.initSharedObject();
	    canvas.sharedObject.setData('userdata', g);
	    canvas.sharedObject.flush();
	</method>
	
	<attribute name="regExpCounter" value="0" type="number" />
	<attribute name="regExpResultArray" value="null" />
	
	<method name="doRegExpCheck" args="fieldValue,regExpV">
		this.regExpCounter = this.regExpCounter +1;
		canvas.sendViaLocalConnection(canvas.rtmp_lc_name, "regExpTest", [fieldValue, regExpV, this.regExpCounter]);
		return this.regExpCounter;
	</method>
	
	<method name="regExpResult" args="tId,tResult">
		if (this.regExpResultArray == null) {
			this.regExpResultArray = new Array();
		}
		this.regExpResultArray[tId] = tResult;
		if ($debug) Debug.write("regExpResult ",tId,tResult);
	</method>
	
	<method name="checkRegExpResult" args="tId">
		return this.regExpResultArray[tId];
	</method>
	
	
	<method name="getThemeImage" args="tName">
		//if ($debug) Debug.write("load Image by Name: ",tName);
		var tPath = canvas.mainTheme.getPointer().xpathQuery("theme/resource[@name='"+tName+"']/@src");
		//if ($debug) Debug.write("tPath "+tPath);
		if (tPath == null) {
			if ($debug) Debug.warn("getThemeImage - No Image found for config: ",tName);
		}
		return tPath;
	</method>
	
	<method name="getThemeColor" args="tColor">
		//if ($debug) Debug.write("load Color by Name: ",tColor);
		var tResColor = canvas.mainTheme.getPointer().xpathQuery("theme/color[@name='"+tColor+"']/@value");
		//if ($debug) Debug.write("tColor "+tColor);
		if (tResColor == null) {
			if ($debug) Debug.warn("getThemeColor - No Color found for config: ",tColor);
		}
		return tResColor;
	</method>
	
	<method name="setBaseColors">
		defaultstyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
		itemStyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
		menuStyle.setAttribute("basecolor",canvas.getThemeColor('styleMenuBarBaseColor'));
		_conferencemenu.setAttribute("bgcolor",canvas.getThemeColor('baseMousecolorizer'));
		_mainbgcontentNavi.setAttribute("bgcolor",canvas.getThemeColor('mainBackgroundColor'));
		main_content.setAttribute("bgcolor",canvas.getThemeColor('mainBackgroundColor'));
	</method>

	<method name="getPictureUrl" args="pictureuri,extraParams">
	<![CDATA[
		var pUri = (pictureuri == null || pictureuri.length == 0) ? "d.jpg" : pictureuri;
		var downloadurl = pUri;
		if (!pUri.startsWith("http://") && !pUri.startsWith("https://")) {
			pUri = "_profile_" + pUri;
			
			downloadurl = canvas.getUrl() + 'DownloadHandler?fileName=' + pUri
				+ '&parentPath=&room_id=&r=' + (new Date()).getTime()
				+ extraParams + '&sid='+canvas.sessionId;
		}
		if($debug) Debug.write("getPictureUrl/downloadurl ", downloadurl);
		return downloadurl;
	]]>
	</method>
		
	<method name="sendViaLocalConnection" args="lc_name,methodName,tArray">
		//if ($debug) Debug.info("sendViaLocalConnection ",lc_name,methodName); //,tArray
		if (tArray == null || tArray.length == 0) {
			canvas.lc.send(lc_name,methodName);
		} else if (tArray.length == 1) {
			canvas.lc.send(lc_name,methodName,tArray[0]);
		} else if (tArray.length == 2) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1]);
		} else if (tArray.length == 3) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2]);
		} else if (tArray.length == 4) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3]);
		} else if (tArray.length == 5) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4]);
		} else if (tArray.length == 6) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5]);
		} else if (tArray.length == 7) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6]);
		} else if (tArray.length == 8) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7]);
		} else if (tArray.length == 9) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7],tArray[8]);
		} else if (tArray.length == 10) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7],tArray[8],tArray[9]);
		} else {
			if ($debug) Debug.error("tArray in sendViaLocalConnection longer then allowed")
		}
	</method>
	
	<method name="getNotNullString" args="value">
		return value == null ? '' : value;
	</method>
	
	<method name="isRemoteUser" args="">
		return canvas.isinitRoomDirect || canvas.remoteUserLogin || canvas.directUserLogin || canvas.secureRemoteUserLogin;
	</method>
</library>
