<?xml version="1.0" encoding="UTF-8" ?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->
<library>

<class name="baseDrawObject" extends="baseDrawPointer">
    
    <!-- it uses some of the attribute's defined in baseDrawImage -->
    <attribute name="newSlideNumber" value="1" type="number" />
    
    <attribute name="fullFit" value="true" type="boolean" />
    
    <attribute name="modernToolbar" value="false" type="boolean" />

    <!-- 
    	Invoked by the Library directly
    	Loads a SWFPresenation to the whiteBoard
     -->
    <method name="loadSWFPresentationSynced" args="url,fileName,moduleName,parentPath,room,domain,slideNumber,standardFileName">
  		var now = new Date();
  		//This invokes a Method which is in the remoteWhiteboard.lzx
  		this.startNewObjectSyncProcess.isStarting = true;
  		this.startNewObjectSyncProcess.uniqueObjectSyncName = fileName + now.getTime();
  		this.startNewObjectSyncProcess.doCall();
        //if ($debug) Debug.write("loadSWFPresentationSynced",url,fileName,moduleName,parentPath,room,domain,slideNumber,standardFileName);
        this.addPresentationToLayer(this,url,'swfpresentationobject'+this.getCounter(),
        	0,0,0,0,
        	true,
        	url,fileName,moduleName,parentPath,room,domain,slideNumber,
        	100,0,0,0,0,
        	this.startNewObjectSyncProcess.uniqueObjectSyncName,
            standardFileName,this.fullFit);
            
        
    </method>
    
    <method name="setCurrentScaleByFullFit" args="scaleFactor">
    	<![CDATA[
    	
    		var tScale = Math.round(scaleFactor*100);
    		
    		this.getDisplayObject()._xscale = tScale;
    		this.getDisplayObject()._yscale = tScale;
    		
    		this.setAttribute("x",0);
    		this.setAttribute("y",0);
    		
    		//Already send by x,y change
    		//this.onupdateScale.sendEvent(null);
    		if ($debug) Debug.write("setCurrentScaleByFullFit -1- ",tScale);
    		
    		parent.parent.zoombox.setCurrentScaleByFullFit(tScale);
    	
    	]]>
    </method>
    
    <method name="doUpdateFullFit" args="fullFit,zoom">
    	<![CDATA[
    	
    		if ($debug) Debug.write("doUpdateFullFit ",fullFit,zoom);
    	
    		var actionObject = new Array();
    		actionObject.push("whiteboardObj");
    		actionObject.push(fullFit);
    		
    		this.doFullFit(fullFit);
    		
    		actionObject.push(this.getDisplayObject()._xscale);
    		
    		if ($debug) Debug.write("doUpdateFullFit ",fullFit,this.getDisplayObject()._xscale);
    		
    		this.onsharedMessage('whiteboardObj',actionObject);	
    	
    	]]>
    </method>
    
    <method name="doUpdateZoom" args="fullFit,zoom">
    	<![CDATA[
    	
    		var actionObject = new Array();
    		actionObject.push("whiteboardObj");
    		actionObject.push(fullFit);
    		actionObject.push(zoom);
    		
    		if ($debug) Debug.write("doUpdateZoom ",this.fullFit,zoom);
    		
    		
    		this.getDisplayObject()._xscale = zoom;
    		this.getDisplayObject()._yscale = zoom;
    		
    		this.onupdateScale.sendEvent(null);
    		this.onsharedMessage('whiteboardObj',actionObject);	
    	
    	]]>
    </method>
    
    <method name="doUpdateFullFitAndZoomRemote" args="actionObject,refObj">
    	<![CDATA[
    	
    		parent.parent.zoombox.setWhiteboardValues(actionObject[1],actionObject[2]);
    	
    		this.doFullFit(actionObject[1]);
    		if ($debug) Debug.write("doUpdateFullFitAndZoomRemote ",fullFit,actionObject[2]);
    		
    		if (!actionObject[1]) {
	    		this.getDisplayObject()._xscale = actionObject[2];
	    		this.getDisplayObject()._yscale = actionObject[2];
	    		this.onupdateScale.sendEvent(null);
    		}
    	
    	]]>
    </method>
    
    <method name="doFullFit" args="v">
        <![CDATA[
        	if ($debug) Debug.write("Do Full Fit ?");
        	if ($debug) Debug.write(this.ObjectByName);
        
        	this.fullFit = v;
        	
            if (this.ObjectByName && this.ObjectByName.typeOfObject=="swf") {    
                if (v) {
                    if ($debug) Debug.write("Do Full Fit !");
                    this.ObjectByName._swfView.initialLoadFullFit();
                }
            }
            
        ]]>
    </method>
    
    <method name="checkSWFPresentation" args="url,fileName,moduleName,parentPath,room,domain,slideNumber">
        //this.addPresentationToLayer(this,url,'swfpresentationobject'+this.getCounter(),0,0,0,0,true,url,fileName,moduleName,parentPath,room,domain,slideNumber);
        <![CDATA[
            for (var i=0;i<this.baseactionobjectList.length;i++){
                if (fileName==this.baseactionobjectList[i][3]){
                    var whiteBoardName = this.baseactionobjectList[i][this.baseactionobjectList[i].length-1];
                    //Debug.write("Found File: ",whiteBoardName,this.baseactionobjectList[i]);
                    //this.baseactionobjectList[i].bringToFront();
                    this.doShowObjectBounds(whiteBoardName);
                    this.newSlideNumber = slideNumber;
                    this.doDocumentAction('setSlideNumber');
                    return true;
                }
            } 
            return false;
        ]]>
    </method>
    
	<!--
		alterModus => this is added by the mod not remotely
		
		adds the SWF-Object to the Layer
	 -->
  	<method name="addPresentationToLayer" args="obj,urlName,nameing,posx,posy,width,height,alterModus,baseurl,fileName,moduleName,parentPath,room,domain,slideNumber,currentzoom,innerwidth,innerheight,innerx,innery,uniqueObjectSyncName,standardFileName,fullFit">
        <![CDATA[
            if ($debug) Debug.write("addPresentationToLayer",standardFileName);
            //only show if it is not part of wml-file-object
            //if (!this.isWmlLoaderImage) {
            //    this.loadimageDataWinRef = new lz.loadWhiteboardWindow(canvas.main_content._content.inner,{refObj:this});
            //    this.loadimageDataWinRef.setMessage(canvas.getLabelName(this.imageLoadMessageId));
            //}
        	//if ($debug) Debug.write("addPresentationToLayer uniqueObjectSyncName:",uniqueObjectSyncName,innerwidth,innerheight);
            
            var downloadurl = canvas.getUrl() + 'DownloadHandler?' +
                    'fileName=' + encodeURIComponent(fileName) +
                    '&moduleName=' + moduleName + 
                    '&parentPath=' + encodeURIComponent(parentPath + '/') +
                    '&room_id='+room + 
                    '&sid='+canvas.sessionId;
            
            //var width= this.width;
            //var height = this.height-200;
            ////Debug.write("width:height: ",width,height);
            
            this.currentlayer = new lz.swfResourceView(obj,{refObj:this,name:nameing,
            	x:posx,y:posy,alterModus:alterModus,
            	baseurl:baseurl,fileName:fileName,moduleName:moduleName,parentPath:parentPath,
            	room:room,domain:domain,slideNumber:slideNumber,
            	currentzoom:currentzoom,fullFit:fullFit,
                standardFileName:standardFileName,
            	innerwidth:innerwidth,innerheight:innerheight,
            	innerx:innerx,innery:innery,
            	uniqueObjectSyncName:uniqueObjectSyncName});

            //this.parent.parent.isloadingImage.sendEvent(this.currentlayer);
            ////Debug.write("downloadurl. ",downloadurl);
            this.currentlayer._swfView.setSource(downloadurl);
            
            this.addItemToDocumentToolBar();
            this.doUpdateDocumentToolBar();
		]]>
  	</method>
  	
  	<!--
  		TODO: check Recording
  	
  	<method name="addPresentationToLayerRecording" args="obj,urlName,nameing,posx,posy,width,height,alterModus,baseurl,fileName,moduleName,parentPath,room,domain,slideNumber,currentzoom,innerwidth,innerheight,innerx,innery">
        <![CDATA[
            //Debug.write("addPresentationToLayer",obj,nameing,posx,posy,width,height,alterModus,baseurl,fileName,moduleName,parentPath,room,domain,slideNumber);
            //only show if it is not part of wml-file-object
            if (!this.isWmlLoaderImage) {
                this.loadimageDataWinRef = new lz.loadWhiteboardWindow(canvas.main_content._content.inner,{refObj:this});
                this.loadimageDataWinRef.setMessage(canvas.getLabelName(this.imageLoadMessageId));
            }
            var downloadurl = canvas.getUrl()+'DownloadHandler?' +
                    'fileName=' + encodeURIComponent(fileName) +
                    '&moduleName=' + moduleName + 
                    '&parentPath=' + encodeURIComponent(parentPath) +
                    '&room_id='+room + 
                    '&sid='+canvas.sessionId;
            var width= this.width;
            var height = this.height;
            
            this.currentlayer = new lz.swfResourceView(obj,{refObj:this,name:nameing,
            	x:posx,y:posy,
            	alterModus:alterModus,
            	baseurl:baseurl,fileName:fileName,moduleName:moduleName,
            	parentPath:parentPath,room:room,domain:domain,
            	slideNumber:slideNumber,width:width,height:height,
            	currentzoom:currentzoom,innerwidth:innerwidth,innerheight:innerheight,
            	innerx:innerx,innery:innery,recorderModus:true});

            this.parent.parent.isloadingImage.sendEvent(this.currentlayer);
            this.currentlayer._swfView.setSource(downloadurl);
            
            //Add Layer to global Layer  	
            return this.currentlayer;
		]]>
  	</method>  	
    -->
    
    <method name="addSWFToLayerHistory" args="actionObject,refObj,isWmlLoader">
        this.isWmlLoaderImage = isWmlLoader;
        this.baseactionobjectList.push(actionObject);   
        this.addPresentationToLayer(refObj,actionObject[1],actionObject[actionObject.length-1],
            actionObject[actionObject.length-5],actionObject[actionObject.length-4],actionObject[actionObject.length-3],
            actionObject[actionObject.length-2],false,actionObject[2],actionObject[3],actionObject[4],actionObject[5],
            actionObject[6],actionObject[7],
            actionObject[8],actionObject[16],actionObject[11],actionObject[12],actionObject[9],actionObject[10],
            actionObject[17],actionObject[18],actionObject[19]);
    </method>
    
    <!-- 
    	Invoked by the remote Host, see sendWatchObject in baseDraw.lzx
     -->
    <method name="addSWFToLayerHistorySynced" args="actionObject,refObj">
        this.baseactionobjectList.push(actionObject);	
  		this.startNewObjectSyncProcess.isStarting = false;
  		this.startNewObjectSyncProcess.uniqueObjectSyncName = actionObject[17];
  		this.startNewObjectSyncProcess.doCall();        
   		this.addPresentationToLayer(refObj,actionObject[1],actionObject[actionObject.length-1],
  			actionObject[actionObject.length-5],actionObject[actionObject.length-4],
  			actionObject[actionObject.length-3],actionObject[actionObject.length-2],
  			false,
  			actionObject[2],actionObject[3],actionObject[4],actionObject[5],actionObject[6],
  			actionObject[7],actionObject[8],actionObject[16],actionObject[11],actionObject[12],
  			actionObject[9],actionObject[10],actionObject[17],actionObject[18],actionObject[19]);
  	</method>
  	
	<!--- 
		invoke by the initial Loading process in remoteWhiteboard.lzx, 
		does not invoke any Update Handler
		once this object is loaded, it will throw an Update event of kind
		addSWFToLayerHistoryToLocalLoaded
  	 -->
  	<method name="addSWFToLayerHistoryToLocal" args="actionObject,refObj">
        this.baseactionobjectList.push(actionObject);	
  		this.addPresentationToLayer(refObj,actionObject[1],actionObject[actionObject.length-1],
  			actionObject[actionObject.length-5],actionObject[actionObject.length-4],
  			actionObject[actionObject.length-3],actionObject[actionObject.length-2],
  			false,
  			actionObject[2],actionObject[3],actionObject[4],actionObject[5],actionObject[6],
  			actionObject[7],actionObject[8],actionObject[16],actionObject[11],actionObject[12],
  			actionObject[9],actionObject[10],actionObject[17],actionObject[18],actionObject[19]);
  	</method>
  	
  	<!--
  		TODO: Check Recording Process
  	 
  	<method name="addSWFToLayerHistoryRecording" args="actionObject,refObj,isWmlLoader">
		this.isWmlLoaderImage = isWmlLoader;
        this.baseactionobjectList.push(actionObject);	
  		this.addPresentationToLayerRecording(refObj,actionObject[1],actionObject[actionObject.length-1],actionObject[actionObject.length-5],actionObject[actionObject.length-4],actionObject[actionObject.length-3],actionObject[actionObject.length-2],false,actionObject[2],actionObject[3],actionObject[4],actionObject[5],actionObject[6],actionObject[7],actionObject[8],actionObject[16],actionObject[11],actionObject[12],actionObject[9],actionObject[10]);
  	</method>
    -->
  	
  	<method name="registerNewSWF" args="urlname,posx,posy,width,height,baseurl,fileName,moduleName,parentPath,room,domain,slideNumber,innerx,innery,innerwidth,innerheight,zoomlevel,currentzoom,initwidth,initheight,uniquObjectSyncName,doUpdateMessage,standardFileName,fullFit,zIndex">
		var actionObject = new Array();
	    actionObject.push('swf');//0
	    actionObject.push(urlname);//1
		actionObject.push(baseurl);//2
		actionObject.push(fileName);//3
		actionObject.push(moduleName);//4
		actionObject.push(parentPath);//5
		actionObject.push(room);//6
		actionObject.push(domain);//7
        actionObject.push(slideNumber);//8
        actionObject.push(innerx);//9
        actionObject.push(innery);//10
        actionObject.push(innerwidth);//11
        actionObject.push(innerheight);//12
        actionObject.push(zoomlevel);//13
        actionObject.push(initwidth);//14
        actionObject.push(initheight);//15
        actionObject.push(currentzoom);//16
        actionObject.push(uniquObjectSyncName);//17
        actionObject.push(standardFileName);//18
        actionObject.push(fullFit);//19
        actionObject.push(zIndex);//-8
        actionObject.push(null);//-7
		actionObject.push(this.counter);//-6
	    actionObject.push(posx);//-5
	    actionObject.push(posy);//-4
	    actionObject.push(width);//-3
	    actionObject.push(height);//-2
	    actionObject.push(this.currentlayer.name);//-1
	    this.baseactionobjectList.push(actionObject);
	    this.checkStepLayers();
	    if (doUpdateMessage) this.onsharedMessage('draw',actionObject);	
  	</method>    
    
	<!--
		Invoked by the swfResource, if the alterModus = true,
		throws an Update-Event to all connected Clients
	 -->
	<method name="storeTempValsAndLoadSyncListSWF" args="objRef">
		this.syncImageRefObj = objRef;
		this.doRegisterNewSwf(true);
		this.sendCompletedObjectSyncEvent.uniqueObjectSyncName = this.syncImageRefObj.uniqueObjectSyncName;
		this.sendCompletedObjectSyncEvent.doCall();
	</method>    
	
	<!--
		Invoked by the swfResource, if the alterModus = false,
		throws NO Update-Event to all connected Clients
	 -->
	<method name="sendLoadNotificationSWF" args="objRef" >
		this.syncImageRefObj = objRef;
		this.doRegisterNewSwf(false);
		this.sendCompletedObjectSyncEvent.uniqueObjectSyncName = this.syncImageRefObj.uniqueObjectSyncName;
		this.sendCompletedObjectSyncEvent.doCall();
	</method>
	
	<!-- 
		TODO: Check Recording
	-->
	<method name="storeTempValsAndLoadSyncListSWFRecording" args="objRef">
		this.syncImageRefObj = objRef;
		//this.doRegisterNewSwf();
		//this.sendCompleteSWFSync();
		//This invokes a Method which is in the remoteWhiteboard.lzx
		this.sendCompletedObjectSyncEvent.uniqueObjectSyncName = this.syncImageRefObj.uniqueObjectSyncName;
		this.sendCompletedObjectSyncEvent.doCall();
	</method>    
    
	

	<!-- sending messages/notifications of sync process
		syncing is now on server side implemented, swagner 12.06.2008
	<netRemoteCallHib name="sendMessageWithClientSWF" funcname="sendMessageWithClient" remotecontext="$once{ canvas.thishib }" >   
		<netparam name="vars"><method name="getValue">return parent.parent.imageLoadingCompleteMessage;</method></netparam>
		<handler name="ondata" args="value">
			<![CDATA[
				//The onResult-Handler will be called be the rtmpconnection
				////Debug.write("getValue : ",value);
			]]>
		</handler>   
	</netRemoteCallHib>     
     -->
     
	<!-- get list of clients before loading image cause
		we have to show the sync process
		
		syncing is now on server side implemented, swagner 12.06.2008
	
    <netRemoteCallHib name="getSWFClientListScope" funcname="getClientListScope" remotecontext="$once{ canvas.thishib }" >          
        <handler name="ondata" args="value">
        	<![CDATA[
				//The onResult-Handler will be called by the rtmpconnection
				////Debug.write("getSWFClientListScope Instance: ",value);
				parent._loadingUsersImageList = new Array();
				for (var eg in value){
					if (canvas.streamid != value[eg].streamid){
						//Debug.write("parent._loadingUsersImageList value eg ",eg,value[eg]);
						parent._loadingUsersImageList.push(value[eg]);
					}
				}
				this.parent.doRegisterNewSwf();	
				this.parent.startSWFsyncCheck();			
            ]]>
        </handler>   
    </netRemoteCallHib>
    	-->
    
    <method name="doRegisterNewSwf" args="doUpdateMessage">
		//now send notifications to connected clients
		this.setAttribute('drawmodus','hand');
        
		this.registerNewSWF(this.syncImageRefObj.baseurl,this.syncImageRefObj.x,
                this.syncImageRefObj.y,this.syncImageRefObj._swfView.width,
                this.syncImageRefObj._swfView.height,this.syncImageRefObj.baseurl,
                this.syncImageRefObj.fileName,this.syncImageRefObj.moduleName,
                this.syncImageRefObj.parentPath,this.syncImageRefObj.room,
                this.syncImageRefObj.domain,this.syncImageRefObj.slideNumber,
                this.syncImageRefObj._swfView.x,this.syncImageRefObj._swfView.y,
                this.syncImageRefObj._swfView.width,this.syncImageRefObj._swfView.height,
                this.syncImageRefObj.zoomlevel,this.syncImageRefObj.currentzoomFactor,
                this.syncImageRefObj.initwidth,this.syncImageRefObj.initheight,
                this.syncImageRefObj.uniqueObjectSyncName,doUpdateMessage,
                this.syncImageRefObj.standardFileName,
                this.syncImageRefObj.fullFit,
                this.getZIndex());
        
		//set modus to hand so users can directly select that image
		this.setModus('swf');
    </method>
	
	<!-- after loading the objects check if all connected clients of that conference
		have loaded the file completely, check it every 1 seconds
		syncing is now on server side implemented, swagner 12.06.2008
	<method name="startSWFsyncCheck">
		<![CDATA[
			if (this._loadingUsersImageList.length==0){
				this.sendSyncNotificationSWF();
			} else {
				var txt = this.imageSyncMessageText+' '+this._loadingUsersImageList.length;
				this.loadimageDataWinRef.setMessage(txt);
				this.loadImageObjectTimer = new LzDelegate( this, "startImgaesyncCheck" );
				lz.Timer.addTimer( this.loadImageObjectTimer, this.syncImageCheckTime );
			}
		]]>
	</method>	
	 -->

	<method name="sendSyncNotificationSWF">
		this.imageLoadingCompleteMessage = new Array();
		this.imageLoadingCompleteMessage[0] = "whiteboard";
		this.imageLoadingCompleteMessage[1] = "swfsynccomplete";
		this.sendMessageWithClientSWF.doCall();
	</method>	

	<!-- invoked by remote client once he has completely loaded the wml-file 
		remote client is waiting/still shows loading window untill all clients have 
		completely loaded the object/moderator sends "synccomplete" message
		
		syncing is now on server side implemented, swagner 12.06.2008
		
	<method name="sendCompleteSWFLoadedRClient" args="client">
		<![CDATA[
			//detect self messageing
			if (client.streamid!=canvas.streamid){
				//remove client from sync list
				for (var i=0;i<this._loadingUsersImageList.length;i++){
					if (this._loadingUsersImageList[i].streamid==client.streamid){
						////Debug.write("deleteing client from list: ",this._loadingUsersImageList[i].streamid);
						this._loadingUsersImageList.splice(i,1);
					}
				}
			}
		]]>
	</method>
	
	 -->
	
	<!-- invoked remotely by Moderator
		all clients have succeed in loading the image
		loading win can be closed
		Alert: This notification will be send from Moderator and received by ALL clients INCLUDING
		the moderator, so the moderator needs no extra command *close* for loading bar cause he
		gets its own *sync* complete nofification
		
		syncing is now on server side implemented, swagner 12.06.2008
			
	<method name="sendCompleteSWFSync" args="client">
		////Debug.write("sendCompleteSWFSync ",client);
		this.loadimageDataWinRef.close();
	</method>  
     -->
    
    <!-- Document actions
        this.ObjectByName is set by the method doShowObjectBounds of baseDraw and holds a reference to
        the currently selected object on the whiteboard
     -->
    <method name="doDocumentAction" args="action">
        <![CDATA[
            if ($debug) Debug.info("doDocumentAction :1: sendCurrentSWFObject ",action);
            if (this.ObjectByName.typeOfObject=="swf") {
                if (action=="doc_first"){
                    this.ObjectByName._swfView.setAttribute('frame',1);
                } else if (action=="doc_pre"){
                    if (this.ObjectByName._swfView.frame>1){
                        this.ObjectByName._swfView.setAttribute('frame',(this.ObjectByName._swfView.frame-1));
                    }
                } else if (action=="doc_next"){
                    if (this.ObjectByName._swfView.frame<this.ObjectByName._swfView.totalframes){
                        this.ObjectByName._swfView.setAttribute('frame',(this.ObjectByName._swfView.frame+1));
                    }
                } else if (action=="doc_last"){
                    this.ObjectByName._swfView.setAttribute('frame',(this.ObjectByName._swfView.totalframes));
                } else if (action=="doc_zoom_minus"){
                	
                	if ($debug) Debug.write("doc_zoom_minus ");
                	return;
                	
                    this.ObjectByName.currentzoomFactor-=this.ObjectByName.zoomlevel;       
                    var newwidth = (this.ObjectByName.initwidth/100)*this.ObjectByName.currentzoomFactor;
                    var newheight = (this.ObjectByName.initheight/100)*this.ObjectByName.currentzoomFactor;
                    this.ObjectByName._swfView.setAttribute('width',newwidth);
                    this.ObjectByName._swfView.setAttribute('height',newheight);
                    this.boundingref.doSetInnerObjectsBounds(newwidth,newheight);
                } else if (action=="doc_zoom_plus"){
                	
                	if ($debug) Debug.write("doc_zoom_plus ");
                	return;
                	
                    this.ObjectByName.currentzoomFactor+=this.ObjectByName.zoomlevel;       
                    //Debug.write("doc_zoom_plus 1",this.ObjectByName.currentzoomFactor,this.ObjectByName.zoomlevel);
                    var newwidth = (this.ObjectByName.initwidth/100)*this.ObjectByName.currentzoomFactor;
                    var newheight = (this.ObjectByName.initheight/100)*this.ObjectByName.currentzoomFactor;
                    //Debug.write(this.ObjectByName);
                    //Debug.write("doc_zoom_plus 2",newwidth,newwidth);
                    this.ObjectByName._swfView.setAttribute('width',newwidth);
                    this.ObjectByName._swfView.setAttribute('height',newheight);
                    this.boundingref.doSetInnerObjectsBounds(newwidth,newheight);
                } else if (action=="setSlideNumber"){
                    if (this.newSlideNumber>0 && this.newSlideNumber<=this.ObjectByName._swfView.totalframes){
                    	if ($debug) Debug.warn("Slide New Number ",this.newSlideNumber);
                        this.ObjectByName._swfView.setAttribute('frame',this.newSlideNumber);
                    } else {
                        if ($debug) Debug.warn("Slide Number out of range of that document TotalFrames: ",this.ObjectByName._swfView.totalframes);
                    }
                }
                this.ObjectByName.slideNumber =  this.ObjectByName._swfView.frame;
                this.doUpdateDocumentToolBar();
                
                if ($debug) Debug.info("doDocumentAction :2: sendCurrentSWFObject");
                
                this.sendCurrentSWFObject(this.ObjectByName);
                
            }
        ]]>
    </method>
    
    <method name="addItemToDocumentToolBar">
    	var docToolbar = this.getDocumentToolBar();
    	docToolbar.addCurrentObject(this.currentlayer);
    </method>
    
    <method name="setCurrentDocumentByToolBar" args="itemRefName">
        if (this.boundingIsActive){
        	if (this.boundingref.objRef.name != itemRefName) {
        		this.boundingref._innerDrag.onmouseup.sendEvent();
        	}
        }
        this.setCurrentDocument();
    </method>
    
    <method name="setCurrentDocument" args="itemRefName">
    	var t = this.getObjectByName(itemRefName);
    	if (t==null) {
    		return;
    	}
        this.ObjectByName = t;
        this.doUpdateDocumentToolBar();
        
        if ($debug) Debug.write("setCurrentDocument ",itemRefName,this.ObjectByName);
        
        //not needed anymore
        //this.sendItemToFront(itemRefName);
        //this.bringItemToFrontByName(itemRefName);
    </method>
    
    <method name="sendItemToFront" args="itemRefName">
        var actionObject = new Array();
        actionObject[0] = 'item';
        actionObject[1] = itemRefName;
        this.onsharedMessage('sendItemToFront',actionObject);
    </method>    
    
    <method name="bringItemToFrontByName" args="itemRefName">
        this.ObjectByName = this.getObjectByName(itemRefName);
        this.ObjectByName.bringToFront();
    </method>
    
    <method name="doUpdateDocumentToolBarByParticipant" args="itemObjName">
        this.ObjectByName = this.getObjectByName(itemObjName);
        this.doUpdateDocumentToolBar();
    </method>
    
    <method name="doUpdateDocumentToolBar">
    	<![CDATA[
        	if (this.modernToolbar) {
                //@deprecated
                //this code is not valdi for the latest dev anymore, only inside for 
                //backward compatibility
    	        //this.parent.parent._documentmenu._currentSlideNo.setAttribute('text',this.ObjectByName._swfView.frame);
    	        //this.parent.parent._documentmenu._totalSlideNo.setAttribute('text',this.ObjectByName._swfView.totalframes);
    	        //this.parent.parent._documentmenu._zoom.setAttribute('text',this.ObjectByName.currentzoomFactor);
        	
            } else {
                
        		var docToolbar = this.getDocumentToolBar();
        		
                if ($debug) Debug.write("doUpdateDocumentToolBar ",docToolbar.parent.parent.ignoreUpdates);
                docToolbar.parent.parent.ignoreUpdates = true;
                
        		if (this["ObjectByName"] && this.ObjectByName != null && this.ObjectByName._swfView) {
                    
                    if ($debug) Debug.warn("doUpdateDocumentToolBar ",this.ObjectByName.fullFit);
                    
        			docToolbar._currentSlideNo.setAttribute('text',this.ObjectByName._swfView.frame);
                    docToolbar._totalSlideNo.setAttribute('text',this.ObjectByName._swfView.totalframes);
                    //docToolbar._zoom.setAttribute('text',this.ObjectByName.currentzoomFactor);
                    //docToolbar.parent._fullFit.setValue(this.ObjectByName.fullFit);
        		} else {
        			docToolbar._currentSlideNo.setAttribute('text',"0");
                    docToolbar._totalSlideNo.setAttribute('text',"0");
                    //docToolbar._zoom.setAttribute('text',"100");
                    //docToolbar.parent._fullFit.setValue(false);
        		}
                
                docToolbar.parent.parent.ignoreUpdates = false;
    	        
        	}
    	]]>
    </method>
    
    <method name="doDeleteFromDocumentsBar" args="itemRefName">
    	var docToolbar = this.getDocumentToolBar();
    	docToolbar.removeDocument(itemRefName);
    </method>
    
    <method name="clearDocumentsBar">
    	var docToolbar = this.getDocumentToolBar();
    	docToolbar.clearDocumentsBar();
    </method>
    
    <method name="sendCurrentSWFObject" args="objRef">
		<![CDATA[
            if ($debug) Debug.write("sendCurrentSWFObject :: ",objRef,objRef.name);
            var objName = objRef.name;
            for (var eg=0;eg<this.baseactionobjectList.length;eg++){
                if (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]==objName) {
                    ////Debug.write("Found Object: ",this.baseactionobjectList[eg]);
                    var sendSlideObjectUpdate = false;
                    if (this.baseactionobjectList[eg][8] != objRef.slideNumber) {
                    	sendSlideObjectUpdate = true;
                    }
                    this.baseactionobjectList[eg][8] = objRef.slideNumber;
                    this.baseactionobjectList[eg][9] = objRef._swfView.x;
                    this.baseactionobjectList[eg][10] = objRef._swfView.y;
                    this.baseactionobjectList[eg][11] = objRef._swfView.width;
                    this.baseactionobjectList[eg][12] = objRef._swfView.height;
                    this.baseactionobjectList[eg][13] = objRef.zoomlevel;
                    this.baseactionobjectList[eg][16] = objRef.currentzoomFactor;
                    this.baseactionobjectList[eg][19] = objRef.fullFit;
                    var newA = this.baseactionobjectList[eg];
                    if (newA[0]=='paint') newA[1] = new Array();				
                    this.onsharedMessage('swf',newA);	
                    if (sendSlideObjectUpdate) {
                        this.updateObjectsToSlideNumber(this.baseactionobjectList[eg]);
                    }
                    break;
                }
            }	
		]]>
	</method>
    
    <method name="remoteObjectUpdate" args="lastactionObject">
        <![CDATA[
        
            var obj = this.getObjectByName(lastactionObject[lastactionObject.length-1]);
            
            if ($debug) Debug.write("remoteObjectUpdate :: ",obj.fullFit);
            obj._swfView.doSendChangeValue = false;
            var sendSlideObjectUpdate = false;
            if (obj.slideNumber != lastactionObject[8]) {
            	sendSlideObjectUpdate = true;
            }
			obj.slideNumber = lastactionObject[8];
			obj._swfView.setAttribute('x',lastactionObject[9]);
			obj._swfView.setAttribute('y',lastactionObject[10]);
			obj._swfView.setAttribute('width',lastactionObject[11]);
            obj._swfView.setAttribute('height',lastactionObject[12]);
            //obj.zoomlevel = lastactionObject[13];
            //obj.currentzoomFactor = lastactionObject[16];
            obj.fullFit = lastactionObject[19];
            
            if ($debug) Debug.write("DO initialLoadFullFit ?? ",obj.fullFit);
            
            if (obj.fullFit) {
                if ($debug) Debug.write("DO initialLoadFullFit !! ");
                obj._swfView.initialLoadFullFit();
            }
            
            obj._swfView.setAttribute('frame',obj.slideNumber);
            obj._swfView.doSendChangeValue = true;
            
            this.doUpdateDocumentToolBarByParticipant(obj.name);
            
            this.remoteUpdateBaseObjectList(lastactionObject);
            
            if (sendSlideObjectUpdate) {
                this.updateObjectsToSlideNumber(lastactionObject);
            }
        ]]>
    </method>
    
    <method name="remoteUpdateBaseObjectList" args="actionObject">
		<![CDATA[
            ////Debug.write("remoteUpdateBaseObjectList : ",actionObject);
            for (var eg=0;eg<this.baseactionobjectList.length;eg++){
                if (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]==actionObject[actionObject.length-1]) {
                    this.baseactionobjectList[eg] = actionObject;
                    break;
                }
            }	
		]]>
    </method>
    
    
    
    
    
    <method name="playVideoSynced" args="fileExplorerItemId,fileName,flv_width,flv_height">
        <![CDATA[
        
            if ($debug) Debug.write("playVideoSynced : ",fileExplorerItemId,fileName,flv_width,flv_height);
        
            var tName = 'flv'+this.getCounter();
            
            this.currentlayer = new lz.whiteboardVideoPlayer(this,{
                                            name:tName,
                                            fileExplorerItemId:fileExplorerItemId,
                                            title:fileName,
                                            sendInit:true,
                                            flv_width:flv_width,
                                            flv_height:flv_height
                                        });
                                        
            this.layers.push(this.currentlayer);  
        ]]>
    </method>
    
    <method name="sendNewVideoRemote" args="refObj">
        <![CDATA[
        
            if ($debug) Debug.write("sendNewVideoRemote : ",refObj.fileExplorerItemId,refObj.title);
        
            this.flvregisterFinal(refObj.name,refObj.x,refObj.y,refObj.width,refObj.height,
                                                refObj.fileExplorerItemId,refObj.title,
                                                false, //isPlaying
                                                refObj.flv_width,
                                                refObj.flv_height,
                                                this.getZIndex());
                        
            
        ]]>
    </method>
    
    <method name="flvregisterFinal" args="newName,x,y,width,height,fileExplorerItemId,fileName,isPlaying,flv_width,flv_height,zIndex">
        var actionObject = new Array();
        actionObject[0] = 'flv';
        actionObject[1] = fileExplorerItemId;
        actionObject[2] = fileName;
        actionObject[3] = isPlaying;
        actionObject[4] = flv_width; 
        actionObject[5] = flv_height;   
        actionObject[6] = zIndex;//-8
        actionObject[7] = null;//-7
        actionObject[8] = this.counter;//-6
        actionObject[9] = x;//-5
        actionObject[10] = y;//-4
        actionObject[11] = width;//-3
        actionObject[12] = height;//-2
        actionObject[13] = newName;//-1
        this.baseactionobjectList.push(actionObject);       
        this.onsharedMessage('draw',actionObject);
    </method>     
    
    <method name="drawFlvToHistory" args="lastActionObject,parentView">
        <![CDATA[
        
            if ($debug) Debug.write("drawFlvToHistory PLAY :: ",lastActionObject[3]);
        
            this.currentlayer = new lz.whiteboardVideoPlayer(this,{
                                            name:lastActionObject[lastActionObject.length-1],
                                            fileExplorerItemId:lastActionObject[1],
                                            title:lastActionObject[2],
                                            flv_width:lastActionObject[4],
                                            flv_height:lastActionObject[5]
                                        });
               
            if (lastActionObject[3]) {
                this.currentlayer.playRemote();
            }
                                        
            this.layers.push(this.currentlayer);  
            
        ]]>
    </method>
    <!-- 
     x:lastActionObject[lastActionObject.length-5],
     y:lastActionObject[lastActionObject.length-4],
     width:lastActionObject[lastActionObject.length-3],
     height:lastActionObject[lastActionObject.length-2]
     -->
    
    <method name="playFLV" args="refObj,play">
        <![CDATA[
            
            for (var eg=0;eg<this.baseactionobjectList.length;eg++){
                if (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]==refObj.name) {
                    ////Debug.write("Found Object: ",this.baseactionobjectList[eg]);
                    
                    this.baseactionobjectList[eg][3] = play;
                    
                    if ($debug) Debug.write("playFLV :: ",this.baseactionobjectList[eg]);
                    this.onsharedMessage('flv',this.baseactionobjectList[eg]);
                    
                    break;
                }
            }
            
        ]]>
    </method>
    
    <method name="playFLVRemote" args="actionObject">

        var tObj = this.getObjectByName(actionObject[actionObject.length-1]);
        
        if (actionObject[3]) {
            tObj.playRemote();
        }
        if (!actionObject[3]) {
            tObj.stopRemote();
        }

    </method>

</class>

</library>
