<?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="whiteboardMiniButton" extends="view" width="250" height="18" y="2"
    bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }">
     
    <attribute name="btnName" value="" type="string" />
    <attribute name="objRef" value="null" />

    <attribute name="zielx" value="200" type="number" />
    <attribute name="zielwidth" value="100" type="number" />    
    
    <attribute name="isactive" value="true" type="boolean" />
    
    <attribute name="isHidden" value="false" type="boolean" />
    
    <handler name="oninit">
        this.calcTextWidth();
        parent.onwidth.sendEvent();
    </handler>
    
    <handler name="onwidth">
        if (this.isinited){
            this.calcTextWidth();
        }
    </handler>
    
    <method name="disableItem">
        //if ($debug) Debug.write("disableItem :: set visibility to hidden");
        this.isHidden = true;
        this.setAttribute("visibility","hidden");
        //this.destroy();
    </method>
    
    <method name="enableItem">
        this.setAttribute("visibility","visible");
        this.isHidden = false;
    </method>
    
    <method name="calcTextWidth">
        <![CDATA[
            if (this.isHidden) {
                return;
            }
            ////////if ($debug)  //Debug.write(this,this._text,this._text.getTextWidth());
            if (this._text.getTextWidth()>(this.width-24)) {
                this._long.setAttribute('visibility','visible');
                this._text.setAttribute('width',this.width-26);
            } else {
                this._long.setAttribute('visibility','hidden');
                this._text.setAttribute('width',this.width-18);
            }
        ]]>        
    </method>
        
    <handler name="onclick">
        if (this.isHidden) {
            return;
        }
        this._minimizebtn_mo.setAttribute('visibility','visible');
        this._minimizebtn_dn.setAttribute('visibility','hidden');
        if ($debug) Debug.write(" :: onclick :: ");
        this.sendActiveWindow(this.objRef);
    </handler>
    
    <handler name="onmouseover">
        if (this.isHidden) {
            return;
        }
        this._minimizebtn_mo.setAttribute('visibility','visible');
        this._minimizebtn_dn.setAttribute('visibility','hidden');
    </handler>
    <handler name="onmouseout">
        if (this.isHidden) {
            return;
        }
        if (this.isactive) {
            this._minimizebtn_mo.setAttribute('visibility','hidden');
            this._minimizebtn_dn.setAttribute('visibility','visible');
        } else {
            this._minimizebtn_mo.setAttribute('visibility','hidden');
            this._minimizebtn_dn.setAttribute('visibility','hidden');
        }        
    </handler>
    <handler name="onmousedown">
        if (this.isHidden) {
            return;
        }        
        this._minimizebtn_mo.setAttribute('visibility','hidden');
        this._minimizebtn_dn.setAttribute('visibility','visible');
    </handler>
    <handler name="onmouseup">
        if (this.isHidden) {
            return;
        }        
        this._minimizebtn_mo.setAttribute('visibility','visible');
        this._minimizebtn_dn.setAttribute('visibility','hidden');
    </handler>
    
    <method name="sendActiveWindow" args="win">
        this.parent.sendActiveWindow(this,win);
    </method>    

	<method name="activateSynced">
		this.parent.sendActiveWindowSynced(this,win);
	</method>
    
    <view name="_minimizebtn_mo" width="${ parent.width-2 }" height="16"
        bgcolor="white" opacity="0.3" visibility="hidden" x="1" y="1" />

    <view name="_minimizebtn_dn" width="${ parent.width-2 }" height="16"
        bgcolor="black" opacity="0.3" visibility="hidden" x="1" y="1" />
    

    <text text="${ parent.btnName }" fgcolor="0xFFFFFF" resize="false" 
        x="1" fontsize="10" name="_text" />
    
        <view y="1" x="${ parent.width-18 }" name="_close"
            resource="btn_presenter_close"
            opacity="${ ((canvas.ismoderator) ? 1 : ((canvas.isAllowedToDraw) ? 1 : 0.5 )) }" 
            onmouseover="this.setAttribute('frame',2)"
            onmouseout="this.setAttribute('frame',1)"
            onmousedown="this.setAttribute('frame',3)"
            onmouseup="this.setAttribute('frame',1)" >
            <handler name="onclick">
	            <![CDATA[
	                this.setAttribute('frame',2);
	                canvas._videocontainer._videoviewcontent.closeWhiteboard();
	                var t = this;
                    canvas.videoComp_lc.closeWhiteboard = function(confirm) {
                        if ($debug) Debug.write("confirm closeWhiteboard:", confirm);
                        if (confirm) {
                            t.parent.parent.removeObject(t.parent);
                        }
                    }
                ]]>
            </handler>
            <labelTooltip labelid="1364" />
        </view>  
        
    <text y="1" name="_long" text="..." fgcolor="0xFFFFFF"
        x="${ parent.width-28 }" fontsize="10" />

    <labelTooltip text="${ parent.btnName }" />
</class>

</library>
