<?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>


	<!--- Base container for a client, can be either: a remote-video (subscribing/playing a video) or a self-video (broadcasting 
		a cam/mic) -->
	<class name="baseVideoObject" extends="view" bgcolor="0x000000" width="122" height="101">

		<switch>
			<when property="$as3">
				<passthrough>
					import flash.filters.DropShadowFilter;
					import flash.media.*
					import flash.net.SharedObject;
				</passthrough>
			</when>
		</switch>

		<!--- @keywords private -->
		<attribute name="chatpartnername" value="" type="string" />
		<!--- @keywords private -->
		<attribute name="showUserProfilePic" type="boolean" value="false" />

		<!--- color of this user, this is the color the user will also use for his chat-color -->
		<attribute name="usercolor" value="0" type="number" />

		<!--- publicSID is a hash-value to identify a user -->
		<attribute name="publicSID" value="" type="string" />

		<!--- micMuted indicates if the microphone is currently turned sound or gain to 0 -->
		<attribute name="micMuted" value="false" type="boolean" />

		<!--- @keywords private -->
		<attribute name="isremote" value="true" type="boolean" />

		<!--- @keywords private -->
		<attribute name="clientVars" value="null" />

		<!--- @keywords private -->
		<attribute name="isResizing" value="false" type="boolean" />

		<!--- @keywords private -->
		<attribute name="isInterview" value="false" type="boolean" />

		<attribute name="respectRatio" value="true" type="boolean" />

		<attribute name="minimized" value="false" type="boolean" />

		<attribute name="hidebyAudioOnly" value="false" type="boolean" />

		<attribute name="custom" value="false" type="boolean" />

		<attribute name="initH" value="40" type="number" />
		<attribute name="initW" value="40" type="number" />

		<attribute name="isShowMicMute" value="false" type="boolean" />

		<attribute name="isMutedByModerator" value="false" type="boolean" />

		<attribute name="isMicrophonesRoom" value="false" type="boolean" />

		<attribute name="lastPositiveVolume" type="number" value="50" />

		<!-- Initial stream ratio: width / height -->
		<attribute name="initRatio" type="number" value="null" />
		<attribute name="initialHeight" value="$once{ this.height }" type="number" />

		<handler name="onisremote" args="r">
			this.isremote = r;
		</handler>

		<handler name="oninit">
        <![CDATA[
            this.clientVars = new Array();
            this.clientVars['User']='No User Connected';
            
            if (this.isInterview) {
            	this._toolbar._minimize.setAttribute("visibility","hidden");
            	this._resizeview.setAttribute("visibility","hidden");
            	this._innerbottom.setAttribute("visibility","hidden");
            	return;
            }
            
            if (this.custom) {
                this._toolbar._minimize.setAttribute("visibility","hidden");
                this._resizeview.setAttribute("visibility","hidden");
                this._toolbar.setAttribute("visibility","hidden");
                this._resizeview.setAttribute("visibility","hidden");
                this._loudness.setAttribute("visibility","hidden");
                this._innertop.setAttribute("visibility","hidden");
                this._innerbottom.setAttribute("visibility","hidden");
            }
            this.setShadow();
            
            if (this.publicSID == canvas.publicSID) {
                this._toolbar._resync._tip.setAttribute("labelid",610);
            }
            this._giveExclusiveAudioView.bringToFront();
            
            this.isMicrophonesRoom = canvas.currentRoomObject.showMicrophoneStatus;
            if (canvas.currentRoomObject.showMicrophoneStatus) {
                this._innertop.setAttribute("bgcolor", "0xFF6600");
                this._innerbottom.setAttribute("bgcolor", "0xFF6600");
            } else {
                this._innerbottom.setAttribute("visibility", "hidden");
            }
        ]]>
		</handler>

		<handler name="ony">
		<![CDATA[
		    if (this.isInterview || this.custom || canvas.currentRoomObject.hideWhiteboard) {
                return;
            }
            var bounds = this.getBounds();
            var parentBounds = canvas.getBounds();
            if (bounds.y < 0) {
                this.setAttribute('y',0);
            }
            if (bounds.y > (parentBounds.height - bounds.height)) {           
                this.setAttribute('y', parentBounds.height - bounds.height );
            }
        ]]>
		</handler>

		<handler name="onx">
		<![CDATA[
            if (this.isInterview || this.custom) {
                return;
            }	
		
			var bounds = this.getBounds();
            var parentBounds = canvas.getBounds();
            if (bounds.x < 0) {
                this.setAttribute('x',0);
            }
            
            if (bounds.x > (parentBounds.width - bounds.width)) {
                this.setAttribute('x', parentBounds.width - bounds.width );
            }
        ]]>
		</handler>

		<method name="setShadow">
        <![CDATA[
	        if (this.isinited){
	            this.normalMC = this.getDisplayObject();
	            //if($debug) Debug.write(this.normalMC);
	            //if($debug) Debug.write("this.normalMC: ",this.normalMC);
	            //if($debug) Debug.write("this: ",this);
	            this.displacementMap = new flash.filters.DropShadowFilter();
	            this.normalMC.filters = [this.displacementMap];
	        }
        ]]>
		</method>

		<!-- respect ratio and keep minimum width / height -->
		<method name="setItemContraintsWidth" args="unused">
        <![CDATA[
            if (!this.respectRatio) {
                return;
            }
            var h=this.width * this.initH/this.initW;
            h=((h < this.initH ) ? initH : h);

            if ($debug) Debug.write("setItemContraintsWidth",this.respectRatio,'orig',this.height,this.width,'new h',h);

            this.setAttribute("height",h);
        ]]>
		</method>

		<method name="setItemContraintsHeight" args="unused">
        <![CDATA[
            if (!this.respectRatio) {
                return;
            }
            var w=this.height * this.initW/this.initH;
            w=((w < this.initW ) ? initW : w);

            if ($debug) Debug.write("setItemContraintsHeight",this.respectRatio,'orig',this.height,this.width,'new w',w);

            this.setAttribute("width",w);
        ]]>
		</method>

		<method name="updateAVSettingsSymbol" args="rcl">
			//FIXME: Set a Symbol wether this Client is Audio(only)/Video(only), both or Profile Picture
			if ($debug) Debug.warn("updateAVSettingsSymbol TODO ",rcl);
		</method>

		<method name="doResize" args="bool">
			if ($debug) Debug.write("doResize",bool);
			if(bool) {
				dragHelper.create();
			} else {
				dragHelper.remove();
			}
			if (this.isInterview || this.custom) {
				return;
			}

			if (bool) {
				this.isResizing = true;
				this.rs.apply();
			} else {
				this.isResizing = false;
				this.rs.remove();
			}
		</method>

		<!--- resets all values and stops the streaming -->
		<method name="resetValues">
		<![CDATA[
	    	if ($debug) Debug.write("resetValues: ",this.isremote);
	    	this.clientVars=null;
	    	if (!this.isremote) {
	    		deleteVideoConfProfilePic();
	    	}
	    	if (this.isremote){
	    		this._chatvideoinner._videostream.restart();
	    	} else {
	    		this._chatvideoinner._videostream._stop();
	    	}
		]]>
		</method>
		
		<method name="setVideouserProfilePic" args="value">
			if ($debug) Debug.write("### setVideouserProfilePic ",value);
			this.deleteVideoConfProfilePic();
			new lz.videoUserProfilePicSWF10(this._chatvideoinner,{name:'userProfilePic',value:value});
			this.showUserProfilePic = true;
		</method>
		
		<method name="deleteVideoConfProfilePic">
			if ($debug) Debug.write("### deleteVideoConfProfilePic ###");
			if ($debug) Debug.write("delete ",this.showUserProfilePic);
			if (this.showUserProfilePic) {
				this._chatvideoinner.userProfilePic.destroy();
				this.showUserProfilePic = false;
			}
		</method>

		<!--- @keywords private -->
		<method name="_startDragState" args="obj">
			if (this.isInterview || this.custom) {
				return;
			}

			dragHelper.create();

			this.bringToFront();
			parent.bringToFront();
			this.dragger.apply();
		</method>

		<!--- @keywords private -->
		<method name="_removeDragState" args="obj">
    	<![CDATA[
	        lz.Cursor.unlock();
	        
	        if (this.x < 0) {
	        	this.setAttribute("x",20);
	        }
	        
	        if (this.y < 0) {
	        	this.setAttribute("y",20);
	        }
	        
	        if (this.x+this.width > parent.width) {
	        	this.setAttribute("x",parent.width - this.width - 20);
	        }
	        
	        if (this.y+this.height > parent.height) {
	        	this.setAttribute("y",parent.height - this.height - 20);
	        }
	        dragHelper.remove();
	        this.dragger.remove();
        ]]>
		</method>

		<method name="minimize">
        <![CDATA[
            this.respectRatio = false;
        
            this.setAttribute("minimized",true);
            
            this._toolbar._minimize.setAttribute("visibility","hidden");
            this._toolbar._maximize2.setAttribute("visibility","visible");
            
            for (var eg in this.subviews) {
                if (this.subviews[eg].name != "_toolbar" 
                        && this.subviews[eg].name != "_innertop"
                        && this.subviews[eg].name != "_loudness") {
                     this.subviews[eg].setAttribute("visibility","hidden");   
                }
            }
            
            this._loudness.setAttribute("x",this.width - 84 - (this.isShowMicMute ? 20 : 0));
            this._loudness.bringToFront();
            
            this.initialHeight = this.height;
            //this.setAttribute("height",20);
            this._minimizeZoom.setAttribute("to",20);
            this._minimizeZoom.setAttribute('started', true);
        ]]>
		</method>

		<method name="reminimize">
        <![CDATA[
            this.setAttribute("minimized",false);
            
            this._toolbar._minimize.setAttribute("visibility","visible");
            this._toolbar._maximize2.setAttribute("visibility","hidden");
            
            this._loudness.setAttribute("x",1);
            
            //this.setAttribute("height",this.initialHeight); 
            if ($debug) Debug.write("this.initialHeight ",this.initialHeight);
            this._minimizeZoom.setAttribute("to",this.initialHeight);
            this._minimizeZoom.setAttribute('started', true);
        ]]>
		</method>

		<method name="reminimizeComplete">
        <![CDATA[
            if (!this.minimized) {
                for (var eg in this.subviews) {
                    if (this.subviews[eg].name != "_toolbar" 
                            && this.subviews[eg].name != "_innertop"
                            && this.subviews[eg].name != "_loudness"
                            && this.subviews[eg].name != "_innerbottom") {
                         this.subviews[eg].setAttribute("visibility","visible");   
                    }
                }
                if (isMicrophonesRoom) {
                    this._innerbottom.setAttribute("visibility", "visible");
                }
                this.respectRatio = true;
            }
        ]]>
		</method>

		<view name="_innertop" width="${parent.width-2 }" height="18" x="1" y="1"
			bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }">
			<text text="${ parent.parent.chatpartnername }" onmousedown="parent.parent._startDragState(this)"
				onmouseup="parent.parent._removeDragState(this)"
				width="${ parent.width-2 }" fgcolor="white" fontsize="9">
				<handler name="onmouseover">
					//cursor="arrow_draw_panel_cursor"
					lz.Cursor.setCursorGlobal("arrow_draw_panel_cursor");
				</handler>

				<handler name="onmouseout">
					lz.Cursor.unlock();
				</handler>
			</text>
		</view>

		<view name="_innerbottom" width="${parent.width - 2}" x="1" y="${parent.height - 19}" height="18"
			bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }">
			<text text="${canvas.getLabelName(1434)}" width="${ parent.width-2 }" fgcolor="white" name="title" fontsize="9" />
		</view>

		<view name="_loudness" x="1" visible="${parent.isremote}" y="${parent.height - 20 - ((parent._innerbottom.visible) ? 18 : 0) }">
			<method name="setSpeaking" args="bool">
				this.loudness.setAttribute('opacity', bool ? 1 : 0.2);
			</method>
			<view x="2" y="2" name="loudness" resource="speaking" opacity="0.2" onmouseover="" onmouseout="">
				<handler name="onclick">
				<![CDATA[
					if (canvas.ismoderator || canvas.isAllowedToGiveExclusiveAudio) {
						parent.parent.confirmExclusiveAudio();
					} else {
						new lz.labelerrorPopupSWF10(canvas,{errorlabelid:1478});
					}
				]]>
				</handler>
				<labelTooltip inittwice="true" labelid="372" />
			</view>
		</view>

		<view name="_resizeview" x="${ this.parent.width - 16 }" valign="bottom" resource="explorer_resize_rsc" cursor="explorer_resizemouse_rsc"
			onmousedown="this.parent.doResize(true)" onmouseup="this.parent.doResize(false)">
			<handler name="oninit">
				//if ($debug) Debug.write("setTint");
				//TODO: Fix this, does not work at the moment
				//canvas.protocol + '://code.google.com/p/openmeetings/issues/detail?id=470
				this.setColor(canvas.getThemeColor('baseMousecolorizer'));
			</handler>
		</view>

		<view name="_toolbar" x="${ parent.width-this.width-2 }" layout="axis:x;spacing:0" y="2">

			<attribute name="isload" value="true" type="boolean" />

			<miniIconsPresenter name="_resync" iconRessourceName="resyncuser_rsc">
				<handler name="onclick">
					parent.parent.resetValues();
					if(!this.parent.parent.isremote) {
						if ($debug) Debug.write("editRecordStream ################# baseVideObject isInterview"
								,this.parent.parent.isInterview,this.parent.parent.interviewPodId);
						if (this.parent.parent.isInterview) {
							//TODO: fix it
							new lz.editRecordStreamSWF10(canvas.inner,{
								name:"editRecordStream",
								doDefaultAnimation:false,
								isInterview:true,
								interviewPodId:this.parent.parent.interviewPodId,
								isSyncUpdate:true});
						} else {
							new lz.editRecordStreamSWF10(canvas.inner,{
								name:"editRecordStream",
								isInterview:false,
								isSyncUpdate:true});
						}
					}
				</handler>
				<labelTooltip name="_tip" labelid="540" />
			</miniIconsPresenter>

			<miniIconsPresenter name="_mute" width="16" height="16" iconRessourceName="mute_micro_btn_rsc">
				<handler name="onclick">
					parent.parent.silenceMicrophone(!parent.parent.micMuted);
				</handler>
				<labelTooltip name="_tip" labelid="1405" />
			</miniIconsPresenter>

			<miniIconsPresenter x="0" y="0" name="_volume" width="16" height="16" iconRessourceName="volume">
				<handler name="oninit">
					_tip.setAttribute("labelid", parent.parent.isremote ? 1511 : 1512);
				</handler>
				<handler name="onclick">
					var volume = parent.parent.getStreamVolume();

					var sliderHeight = 120;
					var sliderX =
					this.getAttributeRelative('x',canvas) - 2;
					var pick = new lz.VolumeSlider(canvas, {
							height:sliderHeight,
							x:sliderX,
							y:(parent.getAttributeRelative('y',canvas) - sliderHeight/2),
							initialNumber:volume,
							videoObject:parent.parent
						});
					lz.ModeManager.makeModal(pick);
				</handler>
				<labelTooltip name="_tip" />
			</miniIconsPresenter>

			<miniIconsPresenter name="_minimize" iconRessourceName="btn_presenter_minimize">
				<handler name="onclick">
					this.parent.parent.minimize();
				</handler>
				<labelTooltip labelid="856" />
			</miniIconsPresenter>

			<miniIconsPresenter name="_maximize2" visibility="hidden" iconRessourceName="btn_presenter_maximize">
				<handler name="onclick">
					this.parent.parent.reminimize();
				</handler>
				<labelTooltip labelid="857" />
			</miniIconsPresenter>

		</view>

		<view name="_giveExclusiveAudioView" valign="middle" align="center" visible="false">
			<view name="_micButton" width="40" height="40" resource="mic_rsc" showhandcursor="true">
				<labelTooltip name="_toolTipTextExclusiveAudio" labelid="1386" />
			</view>
		</view>

		<handler name="onmouseover">
        <![CDATA[
	        if (this.isInterview || this.minimized) {
	            return;
	        }
	        if (canvas.ismoderator || canvas.isAllowedToGiveExclusiveAudio) {
	        	this._giveExclusiveAudioView._micButton._toolTipTextExclusiveAudio.doonmouseover();
	            this._giveExclusiveAudioView.setAttribute("visible", true);
	        }
        ]]>
		</handler>

		<handler name="onmouseout">
        <![CDATA[
	        if (this.isInterview || this.minimized) {
	            return;
	        }
	        this._giveExclusiveAudioView._micButton._toolTipTextExclusiveAudio.cleanHolder();
	        this._giveExclusiveAudioView.setAttribute("visible", false);
        ]]>
		</handler>

		<handler name="onclick">
		<![CDATA[
	      	if (canvas.ismoderator || canvas.isAllowedToGiveExclusiveAudio) {
	      		this._giveExclusiveAudioView._micButton._toolTipTextExclusiveAudio.cleanHolder();
	          	this.confirmExclusiveAudio();
	        } else {
				new lz.labelerrorPopupSWF10(canvas,{errorlabelid:1478});        
	        }
		]]>
		</handler>

		<dragstate name="dragger" />
		<resizestatemin name="rs" resize_min_width="70" resize_min_height="70" />
		<dragHelper name="dragHelper" />

		<animator name="_minimizeZoom" attribute="height" duration="750" to="20" started="false">
			<handler name="onstop" args="s">
				parent.reminimizeComplete();
			</handler>
		</animator>

		<handler name="onismoderator" reference="canvas" args="m">
        <![CDATA[
			if ($debug) Debug.write("###### ismoderator ", m);
	        
	        if (this.minimized) {
	            this._loudness.setAttribute("x",this.width - 84 - (this.isShowMicMute ? 20 : 0));
	            this._loudness.bringToFront();
	        }
        ]]>
		</handler>

		<method name="giveExclusiveAudio">
			canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'lc_giveExclusiveAudio', this.publicSID);
		</method>

		<method name="confirmExclusiveAudio">
			var so:SharedObject = SharedObject.getLocal('userdata');
			var userData = so.data;
			var dontShowExclusiveAudioConfirmation = userData["dontShowExclusiveAudioConfirmation"];
			var exclusiveAudioListener = new Object();
			exclusiveAudioListener.sendNoConfirmation = function() {};
			exclusiveAudioListener.sendConfirmation = function(answer, remember) {
					if (answer) {
						giveExclusiveAudio();
						if (remember) {
							userData["dontShowExclusiveAudioConfirmation"] = true;
							so.flush();
						}
					}
				};
			if (dontShowExclusiveAudioConfirmation == true) {
				exclusiveAudioListener.sendConfirmation(true, true);
			} else {
				new lz.confirmationSingleSWF10(canvas,{
					labelid:1428,
					labeliderror:1539,
					refObj:exclusiveAudioListener,
					showCheckBox:true});
			}
		</method>

		<!-- This will mute the Microphone only to the person that is speaking if the gain is set to zero NOBODY will hear 'em -->
		<method name="muteMicrophone" args="roomClientObj">
		<![CDATA[
			if ($debug) Debug.write("############ muteMicrophone ", roomClientObj.micMuted, roomClientObj.publicSID, this.publicSID);
			
			if (roomClientObj.publicSID == this.publicSID) {
				if ($debug) Debug.write("Set Mute for Client :: ", roomClientObj);
				if ($debug) Debug.write("############ SET GAIN " + roomClientObj.micMuted);
				this._chatvideoinner._videostream.muteMicro(roomClientObj.micMuted);
				this.isMutedByModerator = roomClientObj.micMuted;
				this.setMicMuted(roomClientObj.micMuted);
			}
		]]>
		</method>

		<!-- This will mute it only locally, that means on other screens the user might be still online and loud -->
		<method name="silenceMicrophone" args="mute">
		<![CDATA[
			if ($debug) Debug.write("############ silenceMicrophone ", this.publicSID);
			if (this.publicSID == canvas.publicSID) {
				//self sound turned off
				canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'lc_switchMicMuted', this.publicSID, mute);
				if (!mute) {
					this._chatvideoinner._videostream.muteMicro(false);
				}
			} else {
				//disable this action for now
				if (!canvas.ismoderator) {
					new lz.labelerrorPopupSWF10(canvas,{errorlabelid:1409});
					return;
				}
				//you can not unmute it locally by putting sound to 100 cause the gain is set to zero globally in the micro of the sender!
				//so setting the sound/volume on the other remote clients has zero effect
				if (this.isMutedByModerator && !canvas.ismoderator) {
					//FIXME: That is not true, you could restart audio/video ...
					var errorlabelid = this.publicSID == canvas.publicSID ? 1387 : 1402;
					new lz.labelerrorPopupSWF10(canvas,{errorlabelid:errorlabelid});
					return;
				}
				if (canvas.ismoderator) {
					canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'lc_switchMicMuted', this.publicSID, mute);
				} else {
					this._chatvideoinner._videostream.setSoundVolume(mute ? 0 : 100);
				}
			}
			this.setMicMuted(mute);
		]]>
		</method>

		<method name="setMicMuted" args="micMuted">
        <![CDATA[
	        this.micMuted = micMuted;
            this._toolbar._mute._tip.setAttribute("labelid", micMuted ? "1406" : "1405");
            this._toolbar._mute._itemRsc.setAttribute('frame', micMuted ? 2 : 1);
            if (isMicrophonesRoom) {
                var label = canvas.getLabelName(micMuted ? 1435 : 1434);
                var color = micMuted ? canvas.getThemeColor('basebgcolorizer') : "0xFF6600";
                this._innertop.setAttribute('bgcolor', color);
                this._innerbottom.setAttribute('bgcolor', color);
                this._innerbottom.title.setAttribute('text', label);
            }
        ]]>
		</method>

		<method name="setStreamVolume" args="v">
			if ($debug) Debug.write("############ setStreamVolume ", v, this.publicSID);
			var stream = this._chatvideoinner._videostream;
			if (this.isremote) {
				stream.setSoundVolume(v);
			} else {
				stream.setAttribute('micGain', v);
				stream.micro.gain = v;
				if (0 == v) {
					this.setMicMuted(true);
					canvas.videoComp_lc.send(canvas.videoComp_lc_name, 'lc_switchMicMuted', this.publicSID, true);
				} else if (micMuted) {
					this.silenceMicrophone(false);
				}
			}
		</method>

		<method name="getStreamVolume">
			var stream = this._chatvideoinner._videostream;
			return this.isremote ? Number(stream._ns.soundTransform.volume * 100) : stream.micro.gain;
		</method>

		<handler name="onheight" args="value">
			if (null == initRatio || !respectRatio) {
				return;
			}
			var videoHeight = value - this.videoInsetY - this.bottomBarHeight;
			var expectedVideoWidth = videoHeight * initRatio;
			var expectedPodWidth = expectedVideoWidth + this.videoInsetX;
			if (this.width != expectedPodWidth) {
				this.setAttribute("width", expectedPodWidth);
			}
		</handler>

		<handler name="onwidth" args="value">
			if (null == initRatio || !respectRatio) {
				return;
			}
			var videoWidth = value - this.videoInsetX;
			var expectedVideoHeight = videoWidth / initRatio;
			var expectedPodHeight = expectedVideoHeight + this.videoInsetY + this.bottomBarHeight;
			if (this.height != expectedPodHeight) {
				this.setAttribute("height", expectedPodHeight);
			}
		</handler>
	</class>
</library>
