<?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>