<?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.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="getAppBaseUrl">
	<![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);
		return urlObject.protocol + "://" + urlObject.host + (port != 80 ? ":" + port : "") + urlObject.path;;
	]]>
	</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.getAppBaseUrl();
		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 config.xml, see comments on 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('rtmpTunnelport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpTunnelport/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('adminModuleUser',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleUser/text()'));  
        this.setAttribute('adminModuleRoom',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleRoom/text()'));  
        this.setAttribute('adminModuleOrg',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleOrg/text()'));  
        this.setAttribute('adminModuleLanguages',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleLanguages/text()'));  
        this.setAttribute('adminModuleConnections',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleConnections/text()'));  
        this.setAttribute('adminModuleConfiguration',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleConfiguration/text()'));  
        this.setAttribute('adminModuleBackup',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleBackup/text()'));  
        this.setAttribute('adminModuleServers',canvas.myConfigSet.getPointer().xpathQuery('config/adminModuleServers/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('conferenceModuleRoomList',canvas.myConfigSet.getPointer().xpathQuery('config/conferenceModuleRoomList/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('userSettingsModule',canvas.myConfigSet.getPointer().xpathQuery('config/userSettingsModule/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.exitRoom = function(confirm) {
            if ($debug) Debug.write("confirm exitRoom:", confirm);
            if (confirm) {
                canvas.currentBaseConferenceRoom._screenSharingAdapter.closeAllScreenSharings();
                if (canvas.appointmentNotificationPopUp != null) {
                    canvas.appointmentNotificationPopUp.destroy();
                }
                canvas.doActionmenu('quit');
            }
        }
    
        mainBaseText.setAttribute('text',canvas.currentappname);
        var elemPrefix = "config/appdisplay/displayelement";
        var cfgDp = canvas.myConfigSet.getPointer();
        mainBaseText.setAttribute('x', cfgDp.xpathQuery(elemPrefix + "[@name='name']/@x"));
        mainBaseText.setAttribute('y', cfgDp.xpathQuery(elemPrefix + "[@name='name']/@y"));
        mainBaseText.setAttribute('visible', "true" == cfgDp.xpathQuery(elemPrefix + "[@name='name']/@display"));
        mainBaseText.setShadow();
        mainBaseTextLabel.setAttribute('text',canvas.currentappnameurl);  
		mainApplogo.setAttribute('src', getThemeImage('logo_image'));
        mainApplogo.setAttribute('x', cfgDp.xpathQuery(elemPrefix + "[@name='logo']/@x"));
        mainApplogo.setAttribute('y', cfgDp.xpathQuery(elemPrefix + "[@name='logo']/@y"));
        mainApplogo.setAttribute('visible', "true" == cfgDp.xpathQuery(elemPrefix + "[@name='logo']/@display"));
        
        var cleanUrl = _url;
        
        var hasParams = _url.indexOf("?");
        if (hasParams != -1) {
            cleanUrl = _url.substr(0,hasParams-1);
        }
        
        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;
        }
        
        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>
    
    <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>

	<!---
		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") {
			        new lz.inviteMainWindow(canvas.main_content._content.inner);
			    } 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') {
                    
                    quicklinkAct('conferenceModuleRoomList')
                
                } 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>
	
</library>
