<?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_applyforA" tipLabelId="1602">
    	<handler name="onselect" args="tSel">
    		if (!this.enabled) {
    			return;
    		}
    		if ($debug) Debug.write("cmd_applyforA 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.canVideo = false;
				canvas.thishib.setBroadCastingFlag.doCall();
			} else {
				//Apply for Right to Share Audio/Video
				var tDate = new Date();
				canvas.thishib.sendMessageWithClient.sendMessage("applyForA",tDate.getTime());
			}
    	</handler>
    </baseconfmenucommand>
    <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.canVideo = true;
				canvas.thishib.setBroadCastingFlag.doCall();
			} else {
				//Apply for Right to Share Audio/Video
				var tDate = new Date();
				canvas.thishib.sendMessageWithClient.sendMessage("applyForAV",tDate.getTime());
			}
    	</handler>
    </baseconfmenucommand>
    
    <confmenucommand id="cmd_createPoll" tipLabelId="1483" actionCommand="createPoll" />
    <confmenucommand id="cmd_pollResults" tipLabelId="1484" actionCommand="pollResults" />
    <confmenucommand id="cmd_checkPollVoted" tipLabelId="1485" actionCommand="checkPollVoted" />
    <confmenucommand id="cmd_importFile" tipLabelId="1479" actionCommand="importFile" />
    <confmenucommand id="cmd_editCamMicSettings" actionCommand="editCamMicSettings" tipLabelId="1486" /> 
    <confmenucommand id="cmd_quit" actionCommand="quit" tipLabelId="1487" />
    <confmenucommand id="cmd_showSipDialer" actionCommand="showSipDialer" tipLabelId="1488" />
    
    <confmenucommand id="cmd_invitation" actionCommand="invitation" tipLabelId="1489" /> 
    <confmenucommand id="cmd_editWhiteboardDefault" actionCommand="editWhiteboardDefault" tipLabelId="1490" /> 
    
    <!-- 
    <confmenucommand id="cmd_coBrowser" actionCommand="browser_open" key="['control','b']"/> 
     -->
   
    <confmenucommand id="cmd_exportFilePNG" onselect="canvas.doWhiteboardActionmenu('exportFilePNG')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileJPG" onselect="canvas.doWhiteboardActionmenu('exportFileJPG')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileSVG" onselect="canvas.doWhiteboardActionmenu('exportFileSVG')" tipLabelId="1489" />
    <!-- 
    <confmenucommand id="cmd_exportFilePDF" onselect="canvas.doWhiteboardActionmenu('exportFilePDF')" tipLabelId="1489" />
    <confmenucommand id="cmd_exportFileTIF" onselect="canvas.doWhiteboardActionmenu('exportFileTIF')" tipLabelId="1489" />
     -->
    
    <attribute name="colorArray" value="null" />
    
    <method name="getColorForUser">
    	<![CDATA[
    	   var colorArray = [0x92E8A4,0xC2F1FF,0xFFFCAE,0xE8C792,0xFF8073,
                            0xE8DB87,0xAFFFB8,0xBED4FF,0xE0BBE8,0xFFBBA5];
    	   return colorArray[Math.round(Math.random()*10)];
    	]]>
    </method>
    
    <method name="remoteLogWrite" args="message">
    	if ($debug) Debug.write(message);
    	var remoteLog = new lz.dataset();
    	remoteLog.setQueryType("POST");
    	remoteLog.setAttribute("src", canvas.getUrl() + "remotelog.upload");
    	remoteLog.setQueryParam("message", message);
    	remoteLog.setQueryParam("sid", canvas.sessionId);
    	remoteLog.doRequest();
    </method>
    
    <method name="getHttpHost">
   	<![CDATA[
    	if (canvas.httphostlocal != null && canvas.httphostlocal.length > 0) {
			return canvas.httphostlocal;
		}
		return canvas.rtmphostlocal;
	]]>
    </method>
        
	<method name="getUrl">
	<![CDATA[
		return canvas.protocol + '://' + getHttpHost()
			+ ':' + canvas.red5httpport + canvas.httpRootKey;
	]]>
	</method>
        
	<method name="getServicesUrl">
	<![CDATA[
		return getUrl() + 'services/';
	]]>
	</method>

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

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

	<method name="getScreenSharingUrl">
	<![CDATA[
		var organisation_id = (hib.currentdomainObj != null && hib.currentdomainObj.organisation_id != null)
			? hib.currentdomainObj.organisation_id : 1;
		if ($debug) Debug.write("mainMethods::getScreenSharingUrl ", hib.userobject, hib.currentdomainObj);
		
		var appBase = canvas.getUrl();
		if ($debug) Debug.write("appBase=" + appBase);
		var downloadurl = appBase + 'screen.upload?'
			+'rtmphostlocal=' + canvas.getHttpHost()
			+'&baseurl=' + escape(appBase)
			+'&domain=' + hib.conferencedomain
			+'&organization_id=' + organisation_id
			+'&sid=' + canvas.sessionId
			+'&connectionType=' + canvas.thishib.getProtocol()
			+'&port=' + canvas.thishib.getPort()
			+'&publicSID=' + canvas.publicSID
			+'&languageAsString=' + hib.userlang;
		if ($debug) Debug.write("mainMethods::getScreenSharingUrl ", downloadurl); 
		return downloadurl;
	]]>
	</method>
	
    <method name="myinit">
        <![CDATA[
        canvas.mediaerrortimeout = 30000;
        canvas.medialoadtimeout = 30000;
        
        if($debug) Debug.write("main.lzx/config.xml ondata",this);
        
        //Set Config-values by public/config.xml, see comments on public/config.xml
        if (!canvas.isCluster) {
        	this.setAttribute('rtmphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/rtmphostlocal/text()'));
        }   
        this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));  
        this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()'))); 
        
        var userSSLString = canvas.myConfigSet.getPointer().xpathQuery('config/useSSL/text()');
        if ($debug) Debug.write("userSSLString",userSSLString)
        if (userSSLString == "yes") {
            this.setAttribute('useSSL',true);
        }
        
        this.setAttribute('red5httpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/red5httpport/text()')));
        
        this.setAttribute('currentappname',canvas.myConfigSet.getPointer().xpathQuery('config/currentappname/text()'));  
        this.setAttribute('currentappnameurl',canvas.myConfigSet.getPointer().xpathQuery('config/currentappnameurl/text()'));  
        this.setAttribute('currentappnamebugurl',canvas.myConfigSet.getPointer().xpathQuery('config/currentappnamebugurl/text()'));
        this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
        this.setAttribute('webAppRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/webAppRootKey/text()'));
        this.setAttribute('showWindowEffect',canvas.myConfigSet.getPointer().xpathQuery('config/showWindowEffect/text()'));
        this.setAttribute('firstdayinweek',canvas.myConfigSet.getPointer().xpathQuery('config/firstdayinweek/text()'));
        this.setAttribute('showRecording',canvas.myConfigSet.getPointer().xpathQuery('config/showRecording/text()'));
        
        //old menubar is not active anymore
        //this.setAttribute('showmodernWhiteBoard',canvas.myConfigSet.getPointer().xpathQuery('config/showmodernWhiteBoard/text()'));
        
        //Audio-Video-Settings
        this.setAttribute('codecType',canvas.myConfigSet.getPointer().xpathQuery('config/codecType/text()'));
        this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));  
        this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));  
        this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));  
        this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));  
        this.setAttribute('camQualityBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityBest/text()')));  
        
        this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));  
        this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));  
        
        
        this.setAttribute('moderatorModuleUser',canvas.myConfigSet.getPointer().xpathQuery('config/moderatorModuleUser/text()'));  
        this.setAttribute('moderatorModuleRoom',canvas.myConfigSet.getPointer().xpathQuery('config/moderatorModuleRoom/text()'));  
        
        this.setAttribute('dashboardModuleStartScreen',canvas.myConfigSet.getPointer().xpathQuery('config/dashboardModuleStartScreen/text()'));  
        this.setAttribute('dashboardModuleCalendar',canvas.myConfigSet.getPointer().xpathQuery('config/dashboardModuleCalendar/text()'));  
        this.setAttribute('conferenceRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/conferenceRoomModule/text()'));  
        this.setAttribute('restrictedRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/restrictedRoomModule/text()'));  
        this.setAttribute('interviewRoomModule',canvas.myConfigSet.getPointer().xpathQuery('config/interviewRoomModule/text()'));  
        this.setAttribute('recordModule',canvas.myConfigSet.getPointer().xpathQuery('config/recordModule/text()'));
          
        this.setAttribute('httpRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/httpRootKey/text()'));
        this.setAttribute('httphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/httphostlocal/text()'));
        this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));  
        this.setAttribute('proxyType',canvas.myConfigSet.getPointer().xpathQuery('config/proxyType/text()'));

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

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

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

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

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

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

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

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

	
	<method name="parseLanugageObject" args="obj">
	
	    ////Debug.write('parseLanugageObject: ',obj);
	    ////Debug.write('parseLanugageObject: ',obj.childNodes);
	    <![CDATA[
	    var t = new Array();
	    for (var i=0;i<obj.childNodes.length;i++){
	        for (var k=0;k<obj.childNodes[i].childNodes.length;k++){
	            ////Debug.write(obj.childNodes[i].childNodes[k]);
	            var t2 = new Array();
	            t2[obj.childNodes[i].childNodes[k].childNodes[0].nodeName]=obj.childNodes[i].childNodes[k].childNodes[0].childNodes[0].data;
	            t2[obj.childNodes[i].childNodes[k].childNodes[1].nodeName]=obj.childNodes[i].childNodes[k].childNodes[1].childNodes[0].data;
	            t.push(t2);
	        }
	    }
	    setLabelObject(t);
	    canvas.initScreen();
	    //Debug.write(t);
	    ]]>
	</method>
	
	<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">
		var so:SharedObject = SharedObject.getLocal("__getObjectSizeHelper");
		so.data.o = tArray;
		var size:Number = so.getSize();
		so.clear();
		if (size > 35000) {
			if ($debug) Debug.warn("Too big object being sent via localConnection ", size); //,tArray
			return;
		}
		//if ($debug) Debug.info("sendViaLocalConnection ",lc_name,methodName); //,tArray
		if (tArray == null || tArray.length == 0) {
			canvas.lc.send(lc_name,methodName);
		} else if (tArray.length == 1) {
			canvas.lc.send(lc_name,methodName,tArray[0]);
		} else if (tArray.length == 2) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1]);
		} else if (tArray.length == 3) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2]);
		} else if (tArray.length == 4) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3]);
		} else if (tArray.length == 5) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4]);
		} else if (tArray.length == 6) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5]);
		} else if (tArray.length == 7) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6]);
		} else if (tArray.length == 8) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7]);
		} else if (tArray.length == 9) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7],tArray[8]);
		} else if (tArray.length == 10) {
			canvas.lc.send(lc_name,methodName,tArray[0],tArray[1],tArray[2],tArray[3],tArray[4],tArray[5],tArray[6],tArray[7],tArray[8],tArray[9]);
		} else {
			if ($debug) Debug.error("tArray in sendViaLocalConnection longer then allowed")
		}
	</method>
	
	<method name="getNotNullString" args="value">
		return value == null ? '' : value;
	</method>
	
	<method name="isRemoteUser" args="">
		return canvas.isinitRoomDirect || canvas.remoteUserLogin || canvas.directUserLogin || canvas.secureRemoteUserLogin;
	</method>
</library>
