<?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.checkSharerSession.doCall();
    	</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']"/> 
     -->
   
    <!--  
    	There is no image export at the moment
    <confmenucommand id="cmd_exportFilePNG" onselect="canvas.doWhiteboardActionmenu('exportFilePNG')" />
    <confmenucommand id="cmd_exportFileJPG" onselect="canvas.doWhiteboardActionmenu('exportFileJPG')" />
    <confmenucommand id="cmd_exportFilePDF" onselect="canvas.doWhiteboardActionmenu('exportFilePDF')" />
    <confmenucommand id="cmd_exportFileSVG" onselect="canvas.doWhiteboardActionmenu('exportFileSVG')" />
    <confmenucommand id="cmd_exportFileTIF" onselect="canvas.doWhiteboardActionmenu('exportFileTIF')" />
     -->
    
    <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>
        
    <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('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('microphoneRateNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateNormal/text()')));  
        this.setAttribute('microphoneRateBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateBest/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('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('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);
        mainBaseText.setShadow();
        mainBaseTextLabel.setAttribute('text',canvas.currentappnameurl);  
        
        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;
            }
        }
        
        
        hib.protocollPort = canvas.rtmpport;
        
        if (canvas.useSSL) {
            hib.protocollName = "rtmps";
            hib.protocollPort = canvas.rtmpsslport;
        }
        
        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') {
                    
                    quicklink('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="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>
	
</library>
