<?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="helpAndBugs" extends="view" x="${ parent.width-470 }" layout="axis:x;spacing:2">
    <view name="btn0" width="180" height="26">
        <handler name="onmouseover">
            this._bg.setAttribute("visibility","visible");
        </handler>
        <handler name="onmouseout">
            this._bg.setAttribute("visibility","hidden");
        </handler>
        <handler name="onclick">
        	canvas.userSettingsModuleOpt = "contactMessages";
            quicklinkAct("userSettingsModule");
        </handler>
        <view name="_bg" visibility="hidden" width="$once{ parent.width }" y="4" opacity="0.4"
            bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }" height="$once{ parent.height-4 }" />
        <labelText labelid="1188" x="10" y="6" fontsize="12" fgcolor="$once{ canvas.fontColorHeader }"/>
    </view>
    <view bgcolor="0x3C86C3" y="10" height="10" width="1" />
    <view name="btn1" width="80" height="26">
        <handler name="onmouseover">
            this._bg.setAttribute("visibility","visible");
        </handler>
        <handler name="onmouseout">
            this._bg.setAttribute("visibility","hidden");
        </handler>
        <handler name="onclick">
        	canvas.userSettingsModuleOpt = "userProfile";
            quicklinkAct("userSettingsModule");
        </handler>
        <view name="_bg" visibility="hidden" width="$once{ parent.width }" y="4" opacity="0.4"
            bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }" height="$once{ parent.height-4 }" />
        <labelText labelid="5" x="10" y="6" fontsize="12" fgcolor="$once{ canvas.fontColorHeader }"/>
    </view>
    <view bgcolor="0x3C86C3" y="10" height="10" width="1" />
    <view name="btn3" width="80" height="26">
    	<handler name="onmouseover">
            this._bg.setAttribute("visibility","visible");
        </handler>
        <handler name="onmouseout">
            this._bg.setAttribute("visibility","hidden");
        </handler>
        <handler name="onclick">
            quicklinkAct('logout');
        </handler>
        <view name="_bg" visibility="hidden" width="$once{ parent.width }" y="4" opacity="0.4"
            bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }" height="$once{ parent.height }" />
        <labelText labelid="310" x="10" y="6" fontsize="12" fgcolor="$once{ canvas.fontColorHeader }"/>
    </view>
    <view bgcolor="0x3C86C3" y="10" height="10" width="1" />
    <view name="btn2" width="120" height="26">
    	<handler name="onmouseover">
            this._bg.setAttribute("visibility","visible");
        </handler>
        <handler name="onmouseout">
            this._bg.setAttribute("visibility","hidden");
        </handler>
        <handler name="onclick">
            lz.Browser.loadURL(canvas.currentappnamebugurl,"_blank");
        </handler>
        <view name="_bg" visibility="hidden" width="$once{ parent.width-4 }" y="4" opacity="0.4"
            bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }" height="$once{ parent.height-4 }" />
        <labelText labelid="284" x="10" y="6" fontsize="12" fgcolor="$once{ canvas.fontColorHeader }"/>
    </view>
</class>
	

<class name="helpAndBugs2" extends="view" x="${ parent.width-290 }" layout="axis:x">
    <view name="btn1" width="80">
        <view name="v1a" resource="cl_navibar_rsc" />
        <view name="v1b" x="10" width="$once{ parent.width-10 }"
            stretches="width" resource="navibar_rsc" />

        <view name="v2a" resource="cl_navibarbtn_rsc" visibility="hidden"/>
        <view name="v2b" x="10" width="$once{ parent.width-10 }" visibility="hidden"
            stretches="width" resource="mainnavi_rsc" />

        <handler name="onmouseover">
            this.v1a.setAttribute('visibility','hidden');
            this.v1b.setAttribute('visibility','hidden');
            this.v2a.setAttribute('visibility','visible');
            this.v2b.setAttribute('visibility','visible');
        </handler>
        <handler name="onmouseout">
            this.v1a.setAttribute('visibility','visible');
            this.v1b.setAttribute('visibility','visible');
            this.v2a.setAttribute('visibility','hidden');
            this.v2b.setAttribute('visibility','hidden');
        </handler>
        <labelText labelid="5" x="10" y="6" fontsize="14" width="150" />
        <handler name="onclick">
            quicklinkAct("userSettingsModule");
        </handler>

    </view>
    <view name="btn3" width="80">

        <view name="v1b" width="$once{ parent.width }"
            stretches="width" resource="navibar_rsc" />

        <view name="v2b" width="$once{ parent.width }" visibility="hidden"
            stretches="width" resource="mainnavi_rsc" />

        <handler name="onmouseover">
            this.v1b.setAttribute('visibility','hidden');
            this.v2b.setAttribute('visibility','visible');
        </handler>
        <handler name="onmouseout">
            this.v1b.setAttribute('visibility','visible');
            this.v2b.setAttribute('visibility','hidden');
        </handler>
        <labelText labelid="310" x="10" y="6" fontsize="14" width="150" />
        <handler name="onclick">
            quicklinkAct('logout');
        </handler>

    </view>
    <view name="btn2" width="120">

        <view name="v1b" width="$once{ parent.width-10 }"
            stretches="width" resource="navibar_rsc" />
        <view name="v1a"  x="$once{ parent.width-10 }"
            resource="cr_navibar_rsc" />

        <view name="v2b" width="$once{ parent.width-10 }" visibility="hidden"
            stretches="width" resource="mainnavi_rsc" />
        <view name="v2a" x="$once{ parent.width-10 }"
            resource="cr_navibarbtn_rsc" visibility="hidden"/>

        <handler name="onmouseover">
            this.v1a.setAttribute('visibility','hidden');
            this.v1b.setAttribute('visibility','hidden');
            this.v2a.setAttribute('visibility','visible');
            this.v2b.setAttribute('visibility','visible');
        </handler>
        <handler name="onmouseout">
            this.v1a.setAttribute('visibility','visible');
            this.v1b.setAttribute('visibility','visible');
            this.v2a.setAttribute('visibility','hidden');
            this.v2b.setAttribute('visibility','hidden');
        </handler>
        <labelText labelid="284" x="10" y="6" fontsize="14" width="150" />
        <handler name="onclick">
            lz.Browser.loadURL(canvas.currentappnamebugurl,"_blank");
        </handler>

    </view>

    <handler name="oninit">
        this.setShadow();
    </handler>
    <method name="setShadow" >
        <![CDATA[
        if (this.isinited){
            this.normalMC = this.getDisplayObject();
               this.displacementMap = new flash.filters.DropShadowFilter();
            this.normalMC.filters = [this.displacementMap];
        }
        ]]>
    </method>

</class>

</library>
