<?xml version="1.0"?>

<bindings id="progressmeterBindings"
   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="progressmeter">
    <resources>
      <stylesheet src="chrome://global/skin/progressmeter.css"/>
    </resources>

    <content>
      <xul:spacer class="progress-bar" xbl:inherits="mode"/>
      <xul:spacer class="progress-remainder" xbl:inherits="mode"/>
    </content>
    
    <implementation implements="nsIAccessibleProvider">
      <property name="mode" onset="if (this.mode != val) this.setAttribute('mode', val); return val;"
                            onget="return this.getAttribute('mode');"/>

      <property name="value" onget="return this.getAttribute('value') || '0';">
        <setter><![CDATA[
          var p = Math.round(val);
          var max = Math.round(this.max);
          if (p < 0)
            p = 0;
          else if (p > max)
            p = max;
          var c = this.value; 
          if (p != c) {
            var delta = p - c;
            if (delta < 0)
              delta = -delta;
            if (delta > 3 || p == 0 || p == max) {
              this.setAttribute("value", p);
              // Fire DOM event so that accessible value change events occur
              var event = document.createEvent('Events');
              event.initEvent('ValueChange', true, true);
              this.dispatchEvent(event);
            }
          }
          
          return val;
        ]]></setter>
      </property>
      <property name="max"
                onget="return this.getAttribute('max') || '100';"
                onset="this.setAttribute('max', isNaN(val) ? 100 : Math.max(val, 1));
                       this.value = this.value;
                       return val;" />

      <property name="accessibleType" readonly="true">
        <getter>
          <![CDATA[
            return Components.interfaces.nsIAccessibleProvider.XULProgressMeter;
          ]]>
        </getter>
      </property>
    </implementation>
  </binding>

  <binding id="progressmeter-undetermined"
           extends="chrome://global/content/bindings/progressmeter.xml#progressmeter">
    <content>
      <xul:stack class="progress-remainder" flex="1" anonid="stack" style="overflow: -moz-hidden-unscrollable;">
        <xul:spacer class="progress-bar" anonid="spacer" top="0" style="margin-right: -1000px;"/>
      </xul:stack>
    </content>

    <implementation>
      <field name="_alive">true</field>
      <method name="_init">
        <body><![CDATA[
          var stack = document.getAnonymousElementByAttribute(this, "anonid", "stack");
          var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
          var self = this;

          var isLTR = 
           document.defaultView.getComputedStyle(this, null).direction == "ltr";

          var position = isLTR ? 4 : -1;
          var interval = setInterval(function nextStep() {
            try {
              var width = stack.boxObject.width;
              if (!width) {
                // Maybe we've been removed from the document.
                if (!self._alive)
                  clearInterval(interval);
                return;
              }
              width = width >> 2;
              spacer.height = stack.boxObject.height;
              spacer.width = width;
              spacer.left = width * position;
              if (isLTR) {
                position += 15 / (width + 150);
                if (position >= 4)
                  position = -1;
              }
              else {
                position -= 15 / (width + 150);
                if (position < 0)
                  position = 4;
              }
            } catch (e) {
              clearInterval(interval);
            }
          }, 20);
        ]]></body>
      </method>

      <constructor>this._init();</constructor>
    </implementation>
  </binding>

  <binding id="progressmeter-periodic-redraw"
           extends="chrome://global/content/bindings/progressmeter.xml#progressmeter">
    <content>
      <xul:spacer anonid="visibility-detector" flex="1"/>
    </content>
    <implementation>
      <field name="_alive">true</field>
      <method name="_init">
        <body><![CDATA[
          var step = 0;
          var self = this;
          var spacer = document.getAnonymousElementByAttribute(this, "anonid", "visibility-detector");
          var interval = setInterval(function nextStep() {
            try {
              // Only bother redrawing when we're visible
              var width = spacer.boxObject.width;
              if (!width) {
                // Maybe we've been removed from the document.
                if (!self._alive)
                  clearInterval(interval);
                return;
              }
              // Trigger redraw by changing the step attribute
              step = 1 - step;
              self.setAttribute('step', step);
            } catch (e) {
              clearInterval(interval);
            }
          }, 1000/30);
        ]]></body>
      </method>
      <constructor>this._init();</constructor>
    </implementation>
  </binding>

</bindings>
