<?xml version="1.0" encoding="UTF-8"?>

<!-- This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. -->

<bindings id="status4evar-bindings"
          xmlns="http://www.mozilla.org/xbl"
          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          xmlns:xbl="http://www.mozilla.org/xbl">

  <binding id="statuspanel" display="xul:hbox" extends="chrome://browser/content/tabbrowser.xml#statuspanel">
    <implementation>
      <!--                          -->
      <!-- Inverted mirror handling -->
      <!--                          -->

      <field name="_invertMirror"><![CDATA[
        false
      ]]></field>

      <property name="invertMirror">
        <setter><![CDATA[
          this._invertMirror = val;
          this.mirror = this._isMirrored;
          return val;
        ]]></setter>
        <getter><![CDATA[
          return this._invertMirror;
        ]]></getter>
      </property>

      <!--                       -->
      <!-- Mouse mirror handling -->
      <!--                       -->

      <field name="_mouseMirror"><![CDATA[
        true
      ]]></field>

      <field name="_mouseMirrorListen"><![CDATA[
        false
      ]]></field>

      <property name="mouseMirror">
        <setter><![CDATA[
          this._mouseMirror = val;
          this.setupMouseMirror(this.value);
          return val;
        ]]></setter>
        <getter><![CDATA[
          return this._mouseMirror;
        ]]></getter>
      </property>

      <method name="setupMouseMirror">
        <parameter name="val"/>
        <body><![CDATA[
          if(val && this._mouseMirror)
          {
            this._calcMouseTargetRect();
            if(!this._mouseMirrorListen)
            {
              MousePosTracker.addListener(this);
              this._mouseMirrorListen = true;
            }
          }
          else
          {
            this.mirror = false;
            if(this._mouseMirrorListen)
            {
              MousePosTracker.removeListener(this);
              this._mouseMirrorListen = false;
            }
          }
        ]]></body>
      </method>

      <method name="_calcMouseTargetRect">
        <body><![CDATA[
          let alignRight = false;
          let isRTL = (getComputedStyle(document.documentElement).direction == "rtl");
          if((this._invertMirror && !isRTL) || (!this._invertMirror && isRTL))
          {
            alignRight = true;
          }

          let rect = this.getBoundingClientRect();
          this._mouseTargetRect =
          {
            top:    rect.top,
            bottom: rect.bottom,
            left:   ((alignRight) ? window.innerWidth - rect.width : 0),
            right:  ((alignRight) ? window.innerWidth : rect.width)
          };
        ]]></body>
      </method>

      <method name="onMouseEnter">
        <body><![CDATA[
          this.mirror = true;
        ]]></body>
      </method>

      <method name="onMouseLeave">
        <body><![CDATA[
          this.mirror = false;
        ]]></body>
      </method>

      <!--                 -->
      <!-- Mirror handling -->
      <!--                 -->

      <field name="_isMirrored"><![CDATA[
        false
      ]]></field>

      <property name="mirror">
        <setter><![CDATA[
          this._isMirrored = val;
          if(this._invertMirror)
          {
            val = !val;
          }

          this.setBooleanAttr("mirror", val);
        ]]></setter>
        <getter><![CDATA[
          return this._isMirrored;
        ]]></getter>
      </property>

      <method name="_mirror">
        <body><![CDATA[
          this.mirror = !this._isMirrored;
        ]]></body>
      </method>

      <!--                -->
      <!-- Value handling -->
      <!--                -->

      <property name="label">
        <setter><![CDATA[
          if(window.caligon && window.caligon.status4evar)
          {
            window.caligon.status4evar.statusService.setStatusText(val);
          }
          return undefined;
        ]]></setter>
        <getter><![CDATA[
          if(window.caligon && window.caligon.status4evar)
          {
            return window.caligon.status4evar.statusService.getStatusText();
          }
          return "";
        ]]></getter>
      </property>

      <property name="value">
        <setter><![CDATA[
          this.setValue(val);
          this.setupMouseMirror(val);
          return val;
        ]]></setter>
        <getter><![CDATA[
          return ((this.hasAttribute("inactive")) ? "" : this.getAttribute("label"));
        ]]></getter>
      </property>

      <method name="setValue">
        <parameter name="val"/>
        <body><![CDATA[
          if((this.getAttribute("type") || "").indexOf("network") > -1 && (this.getAttribute("previoustype") || "").indexOf("network") > -1)
          {
            this.style.minWidth = getComputedStyle(this).width;
          }
          else
          {
            this.style.minWidth = "";
          }

          if(val)
          {
            this.setAttribute("label", val);
            this.setBooleanAttr("inactive", false);
          }
          else
          {
            this.setBooleanAttr("inactive", true);
          }
        ]]></body>
      </method>

      <!--         -->
      <!-- Helpers -->
      <!--         -->

      <method name="setBooleanAttr">
        <parameter name="name"/>
        <parameter name="val"/>
        <body><![CDATA[
          if(val)
          {
            this.setAttribute(name, "true");
          }
          else
          {
            this.removeAttribute(name);
          }
        ]]></body>
      </method>
    </implementation>
  </binding>
</bindings>