1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/content/widgets/datetimepicker.xml Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1288 @@ 1.4 +<?xml version="1.0"?> 1.5 + 1.6 +<!-- This Source Code Form is subject to the terms of the Mozilla Public 1.7 + - License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> 1.9 + 1.10 +<!DOCTYPE bindings [ 1.11 + <!ENTITY % datetimepickerDTD SYSTEM "chrome://global/locale/datetimepicker.dtd"> 1.12 + %datetimepickerDTD; 1.13 +]> 1.14 + 1.15 +<bindings id="timepickerBindings" 1.16 + xmlns="http://www.mozilla.org/xbl" 1.17 + xmlns:html="http://www.w3.org/1999/xhtml" 1.18 + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 1.19 + xmlns:xbl="http://www.mozilla.org/xbl"> 1.20 + 1.21 + <binding id="datetimepicker-base" 1.22 + extends="chrome://global/content/bindings/general.xml#basecontrol"> 1.23 + 1.24 + <resources> 1.25 + <stylesheet src="chrome://global/content/textbox.css"/> 1.26 + <stylesheet src="chrome://global/skin/textbox.css"/> 1.27 + <stylesheet src="chrome://global/skin/dropmarker.css"/> 1.28 + <stylesheet src="chrome://global/skin/datetimepicker.css"/> 1.29 + </resources> 1.30 + 1.31 + <content align="center"> 1.32 + <xul:hbox class="datetimepicker-input-box" align="center" 1.33 + xbl:inherits="context"> 1.34 + <xul:hbox class="textbox-input-box datetimepicker-input-subbox" align="center"> 1.35 + <html:input class="datetimepicker-input textbox-input" anonid="input-one" 1.36 + size="2" maxlength="2" 1.37 + xbl:inherits="disabled,readonly"/> 1.38 + </xul:hbox> 1.39 + <xul:label anonid="sep-first" class="datetimepicker-separator" value=":"/> 1.40 + <xul:hbox class="textbox-input-box datetimepicker-input-subbox" align="center"> 1.41 + <html:input class="datetimepicker-input textbox-input" anonid="input-two" 1.42 + size="2" maxlength="2" 1.43 + xbl:inherits="disabled,readonly"/> 1.44 + </xul:hbox> 1.45 + <xul:label anonid="sep-second" class="datetimepicker-separator" value=":"/> 1.46 + <xul:hbox class="textbox-input-box datetimepicker-input-subbox" align="center"> 1.47 + <html:input class="datetimepicker-input textbox-input" anonid="input-three" 1.48 + size="2" maxlength="2" 1.49 + xbl:inherits="disabled,readonly"/> 1.50 + </xul:hbox> 1.51 + <xul:hbox class="textbox-input-box datetimepicker-input-subbox" align="center"> 1.52 + <html:input class="datetimepicker-input textbox-input" anonid="input-ampm" 1.53 + size="2" maxlength="2" 1.54 + xbl:inherits="disabled,readonly"/> 1.55 + </xul:hbox> 1.56 + </xul:hbox> 1.57 + <xul:spinbuttons anonid="buttons" xbl:inherits="disabled" 1.58 + onup="this.parentNode._increaseOrDecrease(1);" 1.59 + ondown="this.parentNode._increaseOrDecrease(-1);"/> 1.60 + </content> 1.61 + 1.62 + <implementation> 1.63 + <field name="_dateValue">null</field> 1.64 + <field name="_fieldOne"> 1.65 + document.getAnonymousElementByAttribute(this, "anonid", "input-one"); 1.66 + </field> 1.67 + <field name="_fieldTwo"> 1.68 + document.getAnonymousElementByAttribute(this, "anonid", "input-two"); 1.69 + </field> 1.70 + <field name="_fieldThree"> 1.71 + document.getAnonymousElementByAttribute(this, "anonid", "input-three"); 1.72 + </field> 1.73 + <field name="_fieldAMPM"> 1.74 + document.getAnonymousElementByAttribute(this, "anonid", "input-ampm"); 1.75 + </field> 1.76 + <field name="_separatorFirst"> 1.77 + document.getAnonymousElementByAttribute(this, "anonid", "sep-first"); 1.78 + </field> 1.79 + <field name="_separatorSecond"> 1.80 + document.getAnonymousElementByAttribute(this, "anonid", "sep-second"); 1.81 + </field> 1.82 + <field name="_lastFocusedField">null</field> 1.83 + <field name="_hasEntry">true</field> 1.84 + <field name="_valueEntered">false</field> 1.85 + <field name="attachedControl">null</field> 1.86 + 1.87 + <property name="_currentField" readonly="true"> 1.88 + <getter> 1.89 + var focusedInput = document.activeElement; 1.90 + if (focusedInput == this._fieldOne || 1.91 + focusedInput == this._fieldTwo || 1.92 + focusedInput == this._fieldThree || 1.93 + focusedInput == this._fieldAMPM) 1.94 + return focusedInput; 1.95 + return this._lastFocusedField || this._fieldOne; 1.96 + </getter> 1.97 + </property> 1.98 + 1.99 + <property name="dateValue" onget="return new Date(this._dateValue);"> 1.100 + <setter> 1.101 + <![CDATA[ 1.102 + if (!(val instanceof Date)) 1.103 + throw "Invalid Date"; 1.104 + 1.105 + this._setValueNoSync(val); 1.106 + if (this.attachedControl) 1.107 + this.attachedControl._setValueNoSync(val); 1.108 + return val; 1.109 + ]]> 1.110 + </setter> 1.111 + </property> 1.112 + 1.113 + <property name="readOnly" onset="if (val) this.setAttribute('readonly', 'true'); 1.114 + else this.removeAttribute('readonly'); return val;" 1.115 + onget="return this.getAttribute('readonly') == 'true';"/> 1.116 + 1.117 + <method name="_fireEvent"> 1.118 + <parameter name="aEventName"/> 1.119 + <parameter name="aTarget"/> 1.120 + <body> 1.121 + var event = document.createEvent("Events"); 1.122 + event.initEvent(aEventName, true, true); 1.123 + return !aTarget.dispatchEvent(event); 1.124 + </body> 1.125 + </method> 1.126 + 1.127 + <method name="_setValueOnChange"> 1.128 + <parameter name="aField"/> 1.129 + <body> 1.130 + <![CDATA[ 1.131 + if (!this._hasEntry) 1.132 + return; 1.133 + 1.134 + if (aField == this._fieldOne || 1.135 + aField == this._fieldTwo || 1.136 + aField == this._fieldThree) { 1.137 + var value = Number(aField.value); 1.138 + if (isNaN(value)) 1.139 + value = 0; 1.140 + 1.141 + value = this._constrainValue(aField, value, true); 1.142 + this._setFieldValue(aField, value); 1.143 + } 1.144 + ]]> 1.145 + </body> 1.146 + </method> 1.147 + 1.148 + <method name="_init"> 1.149 + <body/> 1.150 + </method> 1.151 + 1.152 + <constructor> 1.153 + this._init(); 1.154 + 1.155 + var cval = this.getAttribute("value"); 1.156 + if (cval) { 1.157 + try { 1.158 + this.value = cval; 1.159 + return; 1.160 + } catch (ex) { } 1.161 + } 1.162 + this.dateValue = new Date(); 1.163 + </constructor> 1.164 + 1.165 + <destructor> 1.166 + if (this.attachedControl) { 1.167 + this.attachedControl.attachedControl = null; 1.168 + this.attachedControl = null; 1.169 + } 1.170 + </destructor> 1.171 + 1.172 + </implementation> 1.173 + 1.174 + <handlers> 1.175 + <handler event="focus" phase="capturing"> 1.176 + <![CDATA[ 1.177 + var target = event.originalTarget; 1.178 + if (target == this._fieldOne || 1.179 + target == this._fieldTwo || 1.180 + target == this._fieldThree || 1.181 + target == this._fieldAMPM) 1.182 + this._lastFocusedField = target; 1.183 + ]]> 1.184 + </handler> 1.185 + 1.186 + <handler event="keypress"> 1.187 + <![CDATA[ 1.188 + if (this._hasEntry && event.charCode && 1.189 + this._currentField != this._fieldAMPM && 1.190 + ! (event.altKey || event.ctrlKey || event.metaKey) && 1.191 + (event.charCode < 48 || event.charCode > 57)) 1.192 + event.preventDefault(); 1.193 + ]]> 1.194 + </handler> 1.195 + 1.196 + <handler event="keypress" keycode="VK_UP"> 1.197 + if (this._hasEntry) 1.198 + this._increaseOrDecrease(1); 1.199 + </handler> 1.200 + <handler event="keypress" keycode="VK_DOWN"> 1.201 + if (this._hasEntry) 1.202 + this._increaseOrDecrease(-1); 1.203 + </handler> 1.204 + 1.205 + <handler event="input"> 1.206 + this._valueEntered = true; 1.207 + </handler> 1.208 + 1.209 + <handler event="change"> 1.210 + this._setValueOnChange(event.originalTarget); 1.211 + </handler> 1.212 + </handlers> 1.213 + 1.214 + </binding> 1.215 + 1.216 + <binding id="timepicker" 1.217 + extends="chrome://global/content/bindings/datetimepicker.xml#datetimepicker-base"> 1.218 + 1.219 + <implementation> 1.220 + <field name="is24HourClock">false</field> 1.221 + <field name="hourLeadingZero">false</field> 1.222 + <field name="minuteLeadingZero">true</field> 1.223 + <field name="secondLeadingZero">true</field> 1.224 + <field name="amIndicator">"AM"</field> 1.225 + <field name="pmIndicator">"PM"</field> 1.226 + 1.227 + <field name="hourField">null</field> 1.228 + <field name="minuteField">null</field> 1.229 + <field name="secondField">null</field> 1.230 + 1.231 + <property name="value"> 1.232 + <getter> 1.233 + <![CDATA[ 1.234 + var minute = this._dateValue.getMinutes(); 1.235 + if (minute < 10) 1.236 + minute = "0" + minute; 1.237 + 1.238 + var second = this._dateValue.getSeconds(); 1.239 + if (second < 10) 1.240 + second = "0" + second; 1.241 + return this._dateValue.getHours() + ":" + minute + ":" + second; 1.242 + ]]> 1.243 + </getter> 1.244 + <setter> 1.245 + <![CDATA[ 1.246 + var items = val.match(/^([0-9]{1,2})\:([0-9]{1,2})\:?([0-9]{1,2})?$/); 1.247 + if (!items) 1.248 + throw "Invalid Time"; 1.249 + 1.250 + var dt = this.dateValue; 1.251 + dt.setHours(items[1]); 1.252 + dt.setMinutes(items[2]); 1.253 + dt.setSeconds(items[3] ? items[3] : 0); 1.254 + this.dateValue = dt; 1.255 + return val; 1.256 + ]]> 1.257 + </setter> 1.258 + </property> 1.259 + <property name="hour" onget="return this._dateValue.getHours();"> 1.260 + <setter> 1.261 + <![CDATA[ 1.262 + var valnum = Number(val); 1.263 + if (isNaN(valnum) || valnum < 0 || valnum > 23) 1.264 + throw "Invalid Hour"; 1.265 + this._setFieldValue(this.hourField, valnum); 1.266 + return val; 1.267 + ]]> 1.268 + </setter> 1.269 + </property> 1.270 + <property name="minute" onget="return this._dateValue.getMinutes();"> 1.271 + <setter> 1.272 + <![CDATA[ 1.273 + var valnum = Number(val); 1.274 + if (isNaN(valnum) || valnum < 0 || valnum > 59) 1.275 + throw "Invalid Minute"; 1.276 + this._setFieldValue(this.minuteField, valnum); 1.277 + return val; 1.278 + ]]> 1.279 + </setter> 1.280 + </property> 1.281 + <property name="second" onget="return this._dateValue.getSeconds();"> 1.282 + <setter> 1.283 + <![CDATA[ 1.284 + var valnum = Number(val); 1.285 + if (isNaN(valnum) || valnum < 0 || valnum > 59) 1.286 + throw "Invalid Second"; 1.287 + this._setFieldValue(this.secondField, valnum); 1.288 + return val; 1.289 + ]]> 1.290 + </setter> 1.291 + </property> 1.292 + <property name="isPM"> 1.293 + <getter> 1.294 + <![CDATA[ 1.295 + return (this.hour >= 12); 1.296 + ]]> 1.297 + </getter> 1.298 + <setter> 1.299 + <![CDATA[ 1.300 + if (val) { 1.301 + if (this.hour < 12) 1.302 + this.hour += 12; 1.303 + } 1.304 + else if (this.hour >= 12) 1.305 + this.hour -= 12; 1.306 + return val; 1.307 + ]]> 1.308 + </setter> 1.309 + </property> 1.310 + <property name="hideSeconds"> 1.311 + <getter> 1.312 + return (this.getAttribute("hideseconds") == "true"); 1.313 + </getter> 1.314 + <setter> 1.315 + if (val) 1.316 + this.setAttribute("hideseconds", "true"); 1.317 + else 1.318 + this.removeAttribute("hideseconds"); 1.319 + if (this.secondField) 1.320 + this.secondField.parentNode.collapsed = val; 1.321 + this._separatorSecond.collapsed = val; 1.322 + return val; 1.323 + </setter> 1.324 + </property> 1.325 + <property name="increment"> 1.326 + <getter> 1.327 + <![CDATA[ 1.328 + var increment = this.getAttribute("increment"); 1.329 + increment = Number(increment); 1.330 + if (isNaN(increment) || increment <= 0 || increment >= 60) 1.331 + return 1; 1.332 + return increment; 1.333 + ]]> 1.334 + </getter> 1.335 + <setter> 1.336 + <![CDATA[ 1.337 + if (typeof val == "number") 1.338 + this.setAttribute("increment", val); 1.339 + return val; 1.340 + ]]> 1.341 + </setter> 1.342 + </property> 1.343 + 1.344 + <method name="_setValueNoSync"> 1.345 + <parameter name="aValue"/> 1.346 + <body> 1.347 + <![CDATA[ 1.348 + var dt = new Date(aValue); 1.349 + if (!isNaN(dt)) { 1.350 + this._dateValue = dt; 1.351 + this.setAttribute("value", this.value); 1.352 + this._updateUI(this.hourField, this.hour); 1.353 + this._updateUI(this.minuteField, this.minute); 1.354 + this._updateUI(this.secondField, this.second); 1.355 + } 1.356 + ]]> 1.357 + </body> 1.358 + </method> 1.359 + <method name="_increaseOrDecrease"> 1.360 + <parameter name="aDir"/> 1.361 + <body> 1.362 + <![CDATA[ 1.363 + if (this.disabled || this.readOnly) 1.364 + return; 1.365 + 1.366 + var field = this._currentField; 1.367 + if (this._valueEntered) 1.368 + this._setValueOnChange(field); 1.369 + 1.370 + if (field == this._fieldAMPM) { 1.371 + this.isPM = !this.isPM; 1.372 + this._fireEvent("change", this); 1.373 + } 1.374 + else { 1.375 + var oldval; 1.376 + var change = aDir; 1.377 + if (field == this.hourField) { 1.378 + oldval = this.hour; 1.379 + } 1.380 + else if (field == this.minuteField) { 1.381 + oldval = this.minute; 1.382 + change *= this.increment; 1.383 + } 1.384 + else if (field == this.secondField) { 1.385 + oldval = this.second; 1.386 + } 1.387 + 1.388 + var newval = this._constrainValue(field, oldval + change, false); 1.389 + 1.390 + if (field == this.hourField) 1.391 + this.hour = newval; 1.392 + else if (field == this.minuteField) 1.393 + this.minute = newval; 1.394 + else if (field == this.secondField) 1.395 + this.second = newval; 1.396 + 1.397 + if (oldval != newval) 1.398 + this._fireEvent("change", this); 1.399 + } 1.400 + field.select(); 1.401 + ]]> 1.402 + </body> 1.403 + </method> 1.404 + <method name="_setFieldValue"> 1.405 + <parameter name="aField"/> 1.406 + <parameter name="aValue"/> 1.407 + <body> 1.408 + <![CDATA[ 1.409 + if (aField == this.hourField) 1.410 + this._dateValue.setHours(aValue); 1.411 + else if (aField == this.minuteField) 1.412 + this._dateValue.setMinutes(aValue); 1.413 + else if (aField == this.secondField) 1.414 + this._dateValue.setSeconds(aValue); 1.415 + 1.416 + this.setAttribute("value", this.value); 1.417 + this._updateUI(aField, aValue); 1.418 + 1.419 + if (this.attachedControl) 1.420 + this.attachedControl._setValueNoSync(this._dateValue); 1.421 + ]]> 1.422 + </body> 1.423 + </method> 1.424 + <method name="_updateUI"> 1.425 + <parameter name="aField"/> 1.426 + <parameter name="aValue"/> 1.427 + <body> 1.428 + <![CDATA[ 1.429 + this._valueEntered = false; 1.430 + 1.431 + var prependZero = false; 1.432 + if (aField == this.hourField) { 1.433 + prependZero = this.hourLeadingZero; 1.434 + if (!this.is24HourClock) { 1.435 + if (aValue >= 12) { 1.436 + if (aValue > 12) 1.437 + aValue -= 12; 1.438 + this._fieldAMPM.value = this.pmIndicator; 1.439 + } 1.440 + else { 1.441 + if (aValue == 0) 1.442 + aValue = 12; 1.443 + this._fieldAMPM.value = this.amIndicator; 1.444 + } 1.445 + } 1.446 + } 1.447 + else if (aField == this.minuteField) { 1.448 + prependZero = this.minuteLeadingZero; 1.449 + } 1.450 + else if (aField == this.secondField) { 1.451 + prependZero = this.secondLeadingZero; 1.452 + } 1.453 + 1.454 + if (prependZero && aValue < 10) 1.455 + aField.value = "0" + aValue; 1.456 + else 1.457 + aField.value = aValue; 1.458 + ]]> 1.459 + </body> 1.460 + </method> 1.461 + <method name="_constrainValue"> 1.462 + <parameter name="aField"/> 1.463 + <parameter name="aValue"/> 1.464 + <parameter name="aNoWrap"/> 1.465 + <body> 1.466 + <![CDATA[ 1.467 + // aNoWrap is true when the user entered a value, so just 1.468 + // constrain within limits. If false, the value is being 1.469 + // incremented or decremented, so wrap around values 1.470 + var max = (aField == this.hourField) ? 24 : 60; 1.471 + if (aValue < 0) 1.472 + return aNoWrap ? 0 : max + aValue; 1.473 + if (aValue >= max) 1.474 + return aNoWrap ? max - 1 : aValue - max; 1.475 + return aValue; 1.476 + ]]> 1.477 + </body> 1.478 + </method> 1.479 + <method name="_init"> 1.480 + <body> 1.481 + <![CDATA[ 1.482 + this.hourField = this._fieldOne; 1.483 + this.minuteField = this._fieldTwo; 1.484 + this.secondField = this._fieldThree; 1.485 + 1.486 + var numberOrder = /^(\D*)\s*(\d+)(\D*)(\d+)(\D*)(\d+)\s*(\D*)$/; 1.487 + 1.488 + var pmTime = new Date(2000,0,1,16,7,9).toLocaleFormat("%X"); 1.489 + var numberFields = pmTime.match(numberOrder); 1.490 + if (numberFields) { 1.491 + this._separatorFirst.value = numberFields[3]; 1.492 + this._separatorSecond.value = numberFields[5]; 1.493 + if (Number(numberFields[2]) > 12) 1.494 + this.is24HourClock = true; 1.495 + else 1.496 + this.pmIndicator = numberFields[1] || numberFields[7]; 1.497 + } 1.498 + 1.499 + var amTime = new Date(2000,0,1,1,7,9).toLocaleFormat("%X"); 1.500 + numberFields = amTime.match(numberOrder); 1.501 + if (numberFields) { 1.502 + this.hourLeadingZero = (numberFields[2].length > 1); 1.503 + this.minuteLeadingZero = (numberFields[4].length > 1); 1.504 + this.secondLeadingZero = (numberFields[6].length > 1); 1.505 + 1.506 + if (!this.is24HourClock) { 1.507 + this.amIndicator = numberFields[1] || numberFields[7]; 1.508 + if (numberFields[1]) { 1.509 + var mfield = this._fieldAMPM.parentNode; 1.510 + var mcontainer = mfield.parentNode; 1.511 + mcontainer.insertBefore(mfield, mcontainer.firstChild); 1.512 + } 1.513 + var size = (numberFields[1] || numberFields[7]).length; 1.514 + if (this.pmIndicator.length > size) 1.515 + size = this.pmIndicator.length; 1.516 + this._fieldAMPM.size = size; 1.517 + this._fieldAMPM.maxLength = size; 1.518 + } 1.519 + else { 1.520 + this._fieldAMPM.parentNode.collapsed = true; 1.521 + } 1.522 + } 1.523 + 1.524 + this.hideSeconds = this.hideSeconds; 1.525 + ]]> 1.526 + </body> 1.527 + </method> 1.528 + </implementation> 1.529 + 1.530 + <handlers> 1.531 + <handler event="keypress"> 1.532 + <![CDATA[ 1.533 + // just allow any printable character to switch the AM/PM state 1.534 + if (event.charCode && !this.disabled && !this.readOnly && 1.535 + this._currentField == this._fieldAMPM) { 1.536 + this.isPM = !this.isPM; 1.537 + this._fieldAMPM.select(); 1.538 + this._fireEvent("change", this); 1.539 + event.preventDefault(); 1.540 + } 1.541 + ]]> 1.542 + </handler> 1.543 + </handlers> 1.544 + 1.545 + </binding> 1.546 + 1.547 + <binding id="datepicker" 1.548 + extends="chrome://global/content/bindings/datetimepicker.xml#datetimepicker-base"> 1.549 + 1.550 + <implementation> 1.551 + <field name="yearLeadingZero">false</field> 1.552 + <field name="monthLeadingZero">true</field> 1.553 + <field name="dateLeadingZero">true</field> 1.554 + 1.555 + <field name="yearField"/> 1.556 + <field name="monthField"/> 1.557 + <field name="dateField"/> 1.558 + 1.559 + <property name="value"> 1.560 + <getter> 1.561 + <![CDATA[ 1.562 + var month = this._dateValue.getMonth(); 1.563 + month = (month < 9) ? month = "0" + ++month : month + 1; 1.564 + 1.565 + var date = this._dateValue.getDate(); 1.566 + if (date < 10) 1.567 + date = "0" + date; 1.568 + return this._dateValue.getFullYear() + "-" + month + "-" + date; 1.569 + ]]> 1.570 + 1.571 + </getter> 1.572 + <setter> 1.573 + <![CDATA[ 1.574 + var results = val.match(/^([0-9]{1,4})\-([0-9]{1,2})\-([0-9]{1,2})$/); 1.575 + if (!results) 1.576 + throw "Invalid Date"; 1.577 + 1.578 + this.dateValue = new Date(results[1] + "/" + results[2] + "/" + results[3]); 1.579 + this.setAttribute("value", this.value); 1.580 + return val; 1.581 + ]]> 1.582 + </setter> 1.583 + </property> 1.584 + <property name="year" onget="return this._dateValue.getFullYear();"> 1.585 + <setter> 1.586 + <![CDATA[ 1.587 + var valnum = Number(val); 1.588 + if (isNaN(valnum) || valnum < 1 || valnum > 9999) 1.589 + throw "Invalid Year"; 1.590 + this._setFieldValue(this.yearField, valnum); 1.591 + return val; 1.592 + ]]> 1.593 + </setter> 1.594 + </property> 1.595 + <property name="month" onget="return this._dateValue.getMonth();"> 1.596 + <setter> 1.597 + <![CDATA[ 1.598 + var valnum = Number(val); 1.599 + if (isNaN(valnum) || valnum < 0 || valnum > 11) 1.600 + throw "Invalid Month"; 1.601 + this._setFieldValue(this.monthField, valnum); 1.602 + return val; 1.603 + ]]> 1.604 + </setter> 1.605 + </property> 1.606 + <property name="date" onget="return this._dateValue.getDate();"> 1.607 + <setter> 1.608 + <![CDATA[ 1.609 + var valnum = Number(val); 1.610 + if (isNaN(valnum) || valnum < 1 || valnum > 31) 1.611 + throw "Invalid Date"; 1.612 + this._setFieldValue(this.dateField, valnum); 1.613 + return val; 1.614 + ]]> 1.615 + </setter> 1.616 + </property> 1.617 + <property name="open" onget="return false;" onset="return val;"/> 1.618 + 1.619 + <property name="displayedMonth" onget="return this.month;" 1.620 + onset="this.month = val; return val;"/> 1.621 + <property name="displayedYear" onget="return this.year;" 1.622 + onset="this.year = val; return val;"/> 1.623 + 1.624 + <method name="_setValueNoSync"> 1.625 + <parameter name="aValue"/> 1.626 + <body> 1.627 + <![CDATA[ 1.628 + var dt = new Date(aValue); 1.629 + if (!isNaN(dt)) { 1.630 + this._dateValue = dt; 1.631 + this.setAttribute("value", this.value); 1.632 + this._updateUI(this.yearField, this.year); 1.633 + this._updateUI(this.monthField, this.month); 1.634 + this._updateUI(this.dateField, this.date); 1.635 + } 1.636 + ]]> 1.637 + </body> 1.638 + </method> 1.639 + <method name="_increaseOrDecrease"> 1.640 + <parameter name="aDir"/> 1.641 + <body> 1.642 + <![CDATA[ 1.643 + if (this.disabled || this.readOnly) 1.644 + return; 1.645 + 1.646 + var field = this._currentField; 1.647 + if (this._valueEntered) 1.648 + this._setValueOnChange(field); 1.649 + 1.650 + var oldval; 1.651 + if (field == this.yearField) 1.652 + oldval = this.year; 1.653 + else if (field == this.monthField) 1.654 + oldval = this.month; 1.655 + else if (field == this.dateField) 1.656 + oldval = this.date; 1.657 + 1.658 + var newval = this._constrainValue(field, oldval + aDir, false); 1.659 + 1.660 + if (field == this.yearField) 1.661 + this.year = newval; 1.662 + else if (field == this.monthField) 1.663 + this.month = newval; 1.664 + else if (field == this.dateField) 1.665 + this.date = newval; 1.666 + 1.667 + if (oldval != newval) 1.668 + this._fireEvent("change", this); 1.669 + field.select(); 1.670 + ]]> 1.671 + </body> 1.672 + </method> 1.673 + <method name="_setFieldValue"> 1.674 + <parameter name="aField"/> 1.675 + <parameter name="aValue"/> 1.676 + <body> 1.677 + <![CDATA[ 1.678 + if (aField == this.yearField) { 1.679 + var oldDate = this.date; 1.680 + this._dateValue.setFullYear(aValue); 1.681 + if (oldDate != this.date) { 1.682 + this._dateValue.setDate(0); 1.683 + this._updateUI(this.dateField, this.date); 1.684 + } 1.685 + } 1.686 + else if (aField == this.monthField) { 1.687 + var oldDate = this.date; 1.688 + this._dateValue.setMonth(aValue); 1.689 + if (oldDate != this.date) { 1.690 + this._dateValue.setDate(0); 1.691 + this._updateUI(this.dateField, this.date); 1.692 + } 1.693 + } 1.694 + else if (aField == this.dateField) { 1.695 + this._dateValue.setDate(aValue); 1.696 + } 1.697 + 1.698 + this.setAttribute("value", this.value); 1.699 + this._updateUI(aField, aValue); 1.700 + 1.701 + if (this.attachedControl) 1.702 + this.attachedControl._setValueNoSync(this._dateValue); 1.703 + ]]> 1.704 + </body> 1.705 + </method> 1.706 + <method name="_updateUI"> 1.707 + <parameter name="aField"/> 1.708 + <parameter name="aValue"/> 1.709 + <body> 1.710 + <![CDATA[ 1.711 + this._valueEntered = false; 1.712 + 1.713 + var prependZero = false; 1.714 + if (aField == this.yearField) { 1.715 + if (this.yearLeadingZero) { 1.716 + aField.value = ("000" + aValue).slice(-4); 1.717 + return; 1.718 + } 1.719 + } 1.720 + else if (aField == this.monthField) { 1.721 + aValue++; 1.722 + prependZero = this.monthLeadingZero; 1.723 + } 1.724 + else if (aField == this.dateField) { 1.725 + prependZero = this.dateLeadingZero; 1.726 + } 1.727 + if (prependZero && aValue < 10) 1.728 + aField.value = "0" + aValue; 1.729 + else 1.730 + aField.value = aValue; 1.731 + ]]> 1.732 + </body> 1.733 + </method> 1.734 + <method name="_constrainValue"> 1.735 + <parameter name="aField"/> 1.736 + <parameter name="aValue"/> 1.737 + <parameter name="aNoWrap"/> 1.738 + <body> 1.739 + <![CDATA[ 1.740 + // the month will be 1 to 12 if entered by the user, so subtract 1 1.741 + if (aNoWrap && aField == this.monthField) 1.742 + aValue--; 1.743 + 1.744 + if (aField == this.dateField) { 1.745 + if (aValue < 1) 1.746 + return new Date(this.year, this.month + 1, 0).getDate(); 1.747 + 1.748 + var currentMonth = this.month; 1.749 + var dt = new Date(this.year, currentMonth, aValue); 1.750 + return (dt.getMonth() != currentMonth ? 1 : aValue); 1.751 + } 1.752 + var min = (aField == this.monthField) ? 0 : 1; 1.753 + var max = (aField == this.monthField) ? 11 : 9999; 1.754 + if (aValue < min) 1.755 + return aNoWrap ? min : max; 1.756 + if (aValue > max) 1.757 + return aNoWrap ? max : min; 1.758 + return aValue; 1.759 + ]]> 1.760 + </body> 1.761 + </method> 1.762 + <method name="_init"> 1.763 + <body> 1.764 + <![CDATA[ 1.765 + // We'll default to YYYY/MM/DD to start. 1.766 + var yfield = "input-one"; 1.767 + var mfield = "input-two"; 1.768 + var dfield = "input-three"; 1.769 + var twoDigitYear = false; 1.770 + this.yearLeadingZero = true; 1.771 + this.monthLeadingZero = true; 1.772 + this.dateLeadingZero = true; 1.773 + 1.774 + var numberOrder = /^(\D*)\s*(\d+)(\D*)(\d+)(\D*)(\d+)\s*(\D*)$/; 1.775 + 1.776 + var dt = new Date(2002,9,4).toLocaleFormat("%x"); 1.777 + var numberFields = dt.match(numberOrder); 1.778 + if (numberFields) { 1.779 + this._separatorFirst.value = numberFields[3]; 1.780 + this._separatorSecond.value = numberFields[5]; 1.781 + 1.782 + var yi = 2, mi = 4, di = 6; 1.783 + 1.784 + for (var i = 1; i < numberFields.length; i++) { 1.785 + switch (Number(numberFields[i])) { 1.786 + case 2: 1.787 + twoDigitYear = true; // fall through 1.788 + case 2002: 1.789 + yi = i; 1.790 + yfield = (i == 2 ? "input-one" : 1.791 + (i == 4 ? "input-two" : "input-three")); 1.792 + break; 1.793 + case 9, 10: 1.794 + mi = i; 1.795 + mfield = (i == 2 ? "input-one" : 1.796 + (i == 4 ? "input-two" : "input-three")); 1.797 + break; 1.798 + case 4: 1.799 + di = i; 1.800 + dfield = (i == 2 ? "input-one" : 1.801 + (i == 4 ? "input-two" : "input-three")); 1.802 + break; 1.803 + } 1.804 + } 1.805 + 1.806 + this.yearLeadingZero = (numberFields[yi].length > 1); 1.807 + this.monthLeadingZero = (numberFields[mi].length > 1); 1.808 + this.dateLeadingZero = (numberFields[di].length > 1); 1.809 + } 1.810 + 1.811 + this.yearField = document.getAnonymousElementByAttribute(this, "anonid", yfield); 1.812 + if (!twoDigitYear) 1.813 + this.yearField.parentNode.classList.add("datetimepicker-input-subbox", "datetimepicker-year"); 1.814 + this.monthField = document.getAnonymousElementByAttribute(this, "anonid", mfield); 1.815 + this.dateField = document.getAnonymousElementByAttribute(this, "anonid", dfield); 1.816 + 1.817 + this._fieldAMPM.parentNode.collapsed = true; 1.818 + this.yearField.size = twoDigitYear ? 2 : 4; 1.819 + this.yearField.maxLength = twoDigitYear ? 2 : 4; 1.820 + ]]> 1.821 + </body> 1.822 + </method> 1.823 + </implementation> 1.824 + 1.825 + </binding> 1.826 + 1.827 + <binding id="datepicker-grid" 1.828 + extends="chrome://global/content/bindings/datetimepicker.xml#datepicker"> 1.829 + 1.830 + <content> 1.831 + <vbox class="datepicker-mainbox" 1.832 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.833 + <hbox class="datepicker-monthbox" align="center"> 1.834 + <button class="datepicker-previous datepicker-button" type="repeat" 1.835 + xbl:inherits="disabled" 1.836 + oncommand="document.getBindingParent(this)._increaseOrDecreaseMonth(-1);"/> 1.837 + <spacer flex="1"/> 1.838 + <deck anonid="monthlabeldeck"> 1.839 + <label class="datepicker-gridlabel"/> 1.840 + <label class="datepicker-gridlabel"/> 1.841 + <label class="datepicker-gridlabel"/> 1.842 + <label class="datepicker-gridlabel"/> 1.843 + <label class="datepicker-gridlabel"/> 1.844 + <label class="datepicker-gridlabel"/> 1.845 + <label class="datepicker-gridlabel"/> 1.846 + <label class="datepicker-gridlabel"/> 1.847 + <label class="datepicker-gridlabel"/> 1.848 + <label class="datepicker-gridlabel"/> 1.849 + <label class="datepicker-gridlabel"/> 1.850 + <label class="datepicker-gridlabel"/> 1.851 + </deck> 1.852 + <label anonid="yearlabel" class="datepicker-gridlabel"/> 1.853 + <spacer flex="1"/> 1.854 + <button class="datepicker-next datepicker-button" type="repeat" 1.855 + xbl:inherits="disabled" 1.856 + oncommand="document.getBindingParent(this)._increaseOrDecreaseMonth(1);"/> 1.857 + </hbox> 1.858 + <grid class="datepicker-grid" role="grid"> 1.859 + <columns> 1.860 + <column class="datepicker-gridrow" flex="1"/> 1.861 + <column class="datepicker-gridrow" flex="1"/> 1.862 + <column class="datepicker-gridrow" flex="1"/> 1.863 + <column class="datepicker-gridrow" flex="1"/> 1.864 + <column class="datepicker-gridrow" flex="1"/> 1.865 + <column class="datepicker-gridrow" flex="1"/> 1.866 + <column class="datepicker-gridrow" flex="1"/> 1.867 + </columns> 1.868 + <rows anonid="datebox"> 1.869 + <row anonid="dayofweekbox"> 1.870 + <label class="datepicker-weeklabel" role="columnheader"/> 1.871 + <label class="datepicker-weeklabel" role="columnheader"/> 1.872 + <label class="datepicker-weeklabel" role="columnheader"/> 1.873 + <label class="datepicker-weeklabel" role="columnheader"/> 1.874 + <label class="datepicker-weeklabel" role="columnheader"/> 1.875 + <label class="datepicker-weeklabel" role="columnheader"/> 1.876 + <label class="datepicker-weeklabel" role="columnheader"/> 1.877 + </row> 1.878 + <row> 1.879 + <label class="datepicker-gridlabel" role="gridcell"/> 1.880 + <label class="datepicker-gridlabel" role="gridcell"/> 1.881 + <label class="datepicker-gridlabel" role="gridcell"/> 1.882 + <label class="datepicker-gridlabel" role="gridcell"/> 1.883 + <label class="datepicker-gridlabel" role="gridcell"/> 1.884 + <label class="datepicker-gridlabel" role="gridcell"/> 1.885 + <label class="datepicker-gridlabel" role="gridcell"/> 1.886 + </row> 1.887 + <row> 1.888 + <label class="datepicker-gridlabel" role="gridcell"/> 1.889 + <label class="datepicker-gridlabel" role="gridcell"/> 1.890 + <label class="datepicker-gridlabel" role="gridcell"/> 1.891 + <label class="datepicker-gridlabel" role="gridcell"/> 1.892 + <label class="datepicker-gridlabel" role="gridcell"/> 1.893 + <label class="datepicker-gridlabel" role="gridcell"/> 1.894 + <label class="datepicker-gridlabel" role="gridcell"/> 1.895 + </row> 1.896 + <row> 1.897 + <label class="datepicker-gridlabel" role="gridcell"/> 1.898 + <label class="datepicker-gridlabel" role="gridcell"/> 1.899 + <label class="datepicker-gridlabel" role="gridcell"/> 1.900 + <label class="datepicker-gridlabel" role="gridcell"/> 1.901 + <label class="datepicker-gridlabel" role="gridcell"/> 1.902 + <label class="datepicker-gridlabel" role="gridcell"/> 1.903 + <label class="datepicker-gridlabel" role="gridcell"/> 1.904 + </row> 1.905 + <row> 1.906 + <label class="datepicker-gridlabel" role="gridcell"/> 1.907 + <label class="datepicker-gridlabel" role="gridcell"/> 1.908 + <label class="datepicker-gridlabel" role="gridcell"/> 1.909 + <label class="datepicker-gridlabel" role="gridcell"/> 1.910 + <label class="datepicker-gridlabel" role="gridcell"/> 1.911 + <label class="datepicker-gridlabel" role="gridcell"/> 1.912 + <label class="datepicker-gridlabel" role="gridcell"/> 1.913 + </row> 1.914 + <row> 1.915 + <label class="datepicker-gridlabel" role="gridcell"/> 1.916 + <label class="datepicker-gridlabel" role="gridcell"/> 1.917 + <label class="datepicker-gridlabel" role="gridcell"/> 1.918 + <label class="datepicker-gridlabel" role="gridcell"/> 1.919 + <label class="datepicker-gridlabel" role="gridcell"/> 1.920 + <label class="datepicker-gridlabel" role="gridcell"/> 1.921 + <label class="datepicker-gridlabel" role="gridcell"/> 1.922 + </row> 1.923 + <row> 1.924 + <label class="datepicker-gridlabel" role="gridcell"/> 1.925 + <label class="datepicker-gridlabel" role="gridcell"/> 1.926 + <label class="datepicker-gridlabel" role="gridcell"/> 1.927 + <label class="datepicker-gridlabel" role="gridcell"/> 1.928 + <label class="datepicker-gridlabel" role="gridcell"/> 1.929 + <label class="datepicker-gridlabel" role="gridcell"/> 1.930 + <label class="datepicker-gridlabel" role="gridcell"/> 1.931 + </row> 1.932 + </rows> 1.933 + </grid> 1.934 + </vbox> 1.935 + </content> 1.936 + 1.937 + <implementation> 1.938 + <field name="_hasEntry">false</field> 1.939 + <field name="_weekStart">&firstdayofweek.default;</field> 1.940 + <field name="_displayedDate">null</field> 1.941 + <field name="_todayItem">null</field> 1.942 + 1.943 + <field name="yearField"> 1.944 + document.getAnonymousElementByAttribute(this, "anonid", "yearlabel"); 1.945 + </field> 1.946 + <field name="monthField"> 1.947 + document.getAnonymousElementByAttribute(this, "anonid", "monthlabeldeck"); 1.948 + </field> 1.949 + <field name="dateField"> 1.950 + document.getAnonymousElementByAttribute(this, "anonid", "datebox"); 1.951 + </field> 1.952 + 1.953 + <field name="_selectedItem">null</field> 1.954 + 1.955 + <property name="selectedItem" onget="return this._selectedItem"> 1.956 + <setter> 1.957 + <![CDATA[ 1.958 + if (!val.value) 1.959 + return val; 1.960 + if (val.parentNode.parentNode != this.dateField) 1.961 + return val; 1.962 + 1.963 + if (this._selectedItem) 1.964 + this._selectedItem.removeAttribute("selected"); 1.965 + this._selectedItem = val; 1.966 + val.setAttribute("selected", "true"); 1.967 + this._displayedDate.setDate(val.value); 1.968 + return val; 1.969 + ]]> 1.970 + </setter> 1.971 + </property> 1.972 + 1.973 + <property name="displayedMonth"> 1.974 + <getter> 1.975 + return this._displayedDate.getMonth(); 1.976 + </getter> 1.977 + <setter> 1.978 + this._updateUI(this.monthField, val, true); 1.979 + return val; 1.980 + </setter> 1.981 + </property> 1.982 + <property name="displayedYear"> 1.983 + <getter> 1.984 + return this._displayedDate.getFullYear(); 1.985 + </getter> 1.986 + <setter> 1.987 + this._updateUI(this.yearField, val, true); 1.988 + return val; 1.989 + </setter> 1.990 + </property> 1.991 + 1.992 + <method name="_init"> 1.993 + <body> 1.994 + <![CDATA[ 1.995 + var monthLabel = this.monthField.firstChild; 1.996 + var tempDate = new Date(2005, 0, 1); 1.997 + for (var month = 0; month < 12; month++) { 1.998 + tempDate.setMonth(month); 1.999 + monthLabel.setAttribute("value", tempDate.toLocaleFormat("%B")); 1.1000 + monthLabel = monthLabel.nextSibling; 1.1001 + } 1.1002 + 1.1003 + var fdow = Number(this.getAttribute("firstdayofweek")); 1.1004 + if (!isNaN(fdow) && fdow >= 0 && fdow <= 6) 1.1005 + this._weekStart = fdow; 1.1006 + 1.1007 + var weekbox = document.getAnonymousElementByAttribute(this, "anonid", "dayofweekbox").childNodes; 1.1008 + var date = new Date(); 1.1009 + date.setDate(date.getDate() - (date.getDay() - this._weekStart)); 1.1010 + for (var i = 0; i < weekbox.length; i++) { 1.1011 + weekbox[i].value = date.toLocaleFormat("%a").charAt(0); 1.1012 + date.setDate(date.getDate() + 1); 1.1013 + } 1.1014 + ]]> 1.1015 + </body> 1.1016 + </method> 1.1017 + <method name="_setValueNoSync"> 1.1018 + <parameter name="aValue"/> 1.1019 + <body> 1.1020 + <![CDATA[ 1.1021 + var dt = new Date(aValue); 1.1022 + if (!isNaN(dt)) { 1.1023 + this._dateValue = dt; 1.1024 + this.setAttribute("value", this.value); 1.1025 + this._updateUI(); 1.1026 + } 1.1027 + ]]> 1.1028 + </body> 1.1029 + </method> 1.1030 + <method name="_updateUI"> 1.1031 + <parameter name="aField"/> 1.1032 + <parameter name="aValue"/> 1.1033 + <parameter name="aCheckMonth"/> 1.1034 + <body> 1.1035 + <![CDATA[ 1.1036 + var date; 1.1037 + var currentMonth; 1.1038 + if (aCheckMonth) { 1.1039 + if (!this._displayedDate) 1.1040 + this._displayedDate = this.dateValue; 1.1041 + 1.1042 + var expectedMonth = aValue; 1.1043 + if (aField == this.monthField) { 1.1044 + this._displayedDate.setMonth(aValue); 1.1045 + } 1.1046 + else { 1.1047 + expectedMonth = this._displayedDate.getMonth(); 1.1048 + this._displayedDate.setFullYear(aValue); 1.1049 + } 1.1050 + 1.1051 + if (expectedMonth != -1 && expectedMonth != 12 && 1.1052 + expectedMonth != this._displayedDate.getMonth()) { 1.1053 + // If the month isn't what was expected, then the month overflowed. 1.1054 + // Setting the date to 0 will go back to the last day of the right month. 1.1055 + this._displayedDate.setDate(0); 1.1056 + } 1.1057 + 1.1058 + date = new Date(this._displayedDate); 1.1059 + currentMonth = this._displayedDate.getMonth(); 1.1060 + } 1.1061 + else { 1.1062 + var samemonth = (this._displayedDate && 1.1063 + this._displayedDate.getMonth() == this.month && 1.1064 + this._displayedDate.getFullYear() == this.year); 1.1065 + if (samemonth) { 1.1066 + var items = this.dateField.getElementsByAttribute("value", this.date); 1.1067 + if (items.length) 1.1068 + this.selectedItem = items[0]; 1.1069 + return; 1.1070 + } 1.1071 + 1.1072 + date = this.dateValue; 1.1073 + this._displayedDate = new Date(date); 1.1074 + currentMonth = this.month; 1.1075 + } 1.1076 + 1.1077 + if (this._todayItem) { 1.1078 + this._todayItem.removeAttribute("today"); 1.1079 + this._todayItem = null; 1.1080 + } 1.1081 + 1.1082 + if (this._selectedItem) { 1.1083 + this._selectedItem.removeAttribute("selected"); 1.1084 + this._selectedItem = null; 1.1085 + } 1.1086 + 1.1087 + // Update the month and year title 1.1088 + this.monthField.selectedIndex = currentMonth; 1.1089 + this.yearField.setAttribute("value", date.getFullYear()); 1.1090 + 1.1091 + date.setDate(1); 1.1092 + var firstWeekday = (7 + date.getDay() - this._weekStart) % 7; 1.1093 + date.setDate(date.getDate() - firstWeekday); 1.1094 + 1.1095 + var today = new Date(); 1.1096 + var datebox = this.dateField; 1.1097 + for (var k = 1; k < datebox.childNodes.length; k++) { 1.1098 + var row = datebox.childNodes[k]; 1.1099 + for (var i = 0; i < 7; i++) { 1.1100 + var item = row.childNodes[i]; 1.1101 + 1.1102 + if (currentMonth == date.getMonth()) { 1.1103 + item.value = date.getDate(); 1.1104 + 1.1105 + // highlight today 1.1106 + if (this._isSameDay(today, date)) { 1.1107 + this._todayItem = item; 1.1108 + item.setAttribute("today", "true"); 1.1109 + } 1.1110 + 1.1111 + // highlight the selected date 1.1112 + if (this._isSameDay(this._dateValue, date)) { 1.1113 + this._selectedItem = item; 1.1114 + item.setAttribute("selected", "true"); 1.1115 + } 1.1116 + } 1.1117 + else { 1.1118 + item.value = ""; 1.1119 + } 1.1120 + 1.1121 + date.setDate(date.getDate() + 1); 1.1122 + } 1.1123 + } 1.1124 + 1.1125 + this._fireEvent("monthchange", this); 1.1126 + if (this.hasAttribute("monthchange")) { 1.1127 + var fn = new Function("event", aTarget.getAttribute("onmonthchange")); 1.1128 + fn.call(aTarget, event); 1.1129 + } 1.1130 + ]]> 1.1131 + </body> 1.1132 + </method> 1.1133 + <method name="_increaseOrDecreaseDateFromEvent"> 1.1134 + <parameter name="aEvent"/> 1.1135 + <parameter name="aDiff"/> 1.1136 + <body> 1.1137 + <![CDATA[ 1.1138 + if (aEvent.originalTarget == this && !this.disabled && !this.readOnly) { 1.1139 + var newdate = this.dateValue; 1.1140 + newdate.setDate(newdate.getDate() + aDiff); 1.1141 + this.dateValue = newdate; 1.1142 + this._fireEvent("change", this); 1.1143 + } 1.1144 + aEvent.stopPropagation(); 1.1145 + aEvent.preventDefault(); 1.1146 + ]]> 1.1147 + </body> 1.1148 + </method> 1.1149 + <method name="_increaseOrDecreaseMonth"> 1.1150 + <parameter name="aDir"/> 1.1151 + <body> 1.1152 + <![CDATA[ 1.1153 + if (!this.disabled) { 1.1154 + var month = this._displayedDate ? this._displayedDate.getMonth() : 1.1155 + this.month; 1.1156 + this._updateUI(this.monthField, month + aDir, true); 1.1157 + } 1.1158 + ]]> 1.1159 + </body> 1.1160 + </method> 1.1161 + <method name="_isSameDay"> 1.1162 + <parameter name="aDate1"/> 1.1163 + <parameter name="aDate2"/> 1.1164 + <body> 1.1165 + <![CDATA[ 1.1166 + return (aDate1 && aDate2 && 1.1167 + aDate1.getDate() == aDate2.getDate() && 1.1168 + aDate1.getMonth() == aDate2.getMonth() && 1.1169 + aDate1.getFullYear() == aDate2.getFullYear()); 1.1170 + ]]> 1.1171 + </body> 1.1172 + </method> 1.1173 + 1.1174 + </implementation> 1.1175 + 1.1176 + <handlers> 1.1177 + <handler event="click"> 1.1178 + <![CDATA[ 1.1179 + if (event.button != 0 || this.disabled || this.readOnly) 1.1180 + return; 1.1181 + 1.1182 + var target = event.originalTarget; 1.1183 + if (target.classList.contains("datepicker-gridlabel") && 1.1184 + target != this.selectedItem) { 1.1185 + this.selectedItem = target; 1.1186 + this._dateValue = new Date(this._displayedDate); 1.1187 + if (this.attachedControl) 1.1188 + this.attachedControl._setValueNoSync(this._dateValue); 1.1189 + this._fireEvent("change", this); 1.1190 + 1.1191 + if (this.attachedControl && "open" in this.attachedControl) 1.1192 + this.attachedControl.open = false; // close the popup 1.1193 + } 1.1194 + ]]> 1.1195 + </handler> 1.1196 + <handler event="MozMousePixelScroll" preventdefault="true"/> 1.1197 + <handler event="DOMMouseScroll" preventdefault="true"> 1.1198 + <![CDATA[ 1.1199 + this._increaseOrDecreaseMonth(event.detail < 0 ? -1 : 1); 1.1200 + ]]> 1.1201 + </handler> 1.1202 + <handler event="keypress" keycode="VK_LEFT" 1.1203 + action="this._increaseOrDecreaseDateFromEvent(event, -1);"/> 1.1204 + <handler event="keypress" keycode="VK_RIGHT" 1.1205 + action="this._increaseOrDecreaseDateFromEvent(event, 1);"/> 1.1206 + <handler event="keypress" keycode="VK_UP" 1.1207 + action="this._increaseOrDecreaseDateFromEvent(event, -7);"/> 1.1208 + <handler event="keypress" keycode="VK_DOWN" 1.1209 + action="this._increaseOrDecreaseDateFromEvent(event, 7);"/> 1.1210 + <handler event="keypress" keycode="VK_PAGE_UP" preventdefault="true" 1.1211 + action="this._increaseOrDecreaseMonth(-1);"/> 1.1212 + <handler event="keypress" keycode="VK_PAGE_DOWN" preventdefault="true" 1.1213 + action="this._increaseOrDecreaseMonth(1);"/> 1.1214 + </handlers> 1.1215 + </binding> 1.1216 + 1.1217 + <binding id="datepicker-popup" display="xul:menu" 1.1218 + extends="chrome://global/content/bindings/datetimepicker.xml#datepicker"> 1.1219 + <content align="center"> 1.1220 + <xul:hbox class="textbox-input-box datetimepicker-input-box" align="center" 1.1221 + allowevents="true" xbl:inherits="context"> 1.1222 + <xul:hbox class="datetimepicker-input-subbox" align="baseline"> 1.1223 + <html:input class="datetimepicker-input textbox-input" anonid="input-one" 1.1224 + size="2" maxlength="2" 1.1225 + xbl:inherits="disabled,readonly"/> 1.1226 + </xul:hbox> 1.1227 + <xul:label anonid="sep-first" class="datetimepicker-separator" value=":"/> 1.1228 + <xul:hbox class="datetimepicker-input-subbox" align="baseline"> 1.1229 + <html:input class="datetimepicker-input textbox-input" anonid="input-two" 1.1230 + size="2" maxlength="2" 1.1231 + xbl:inherits="disabled,readonly"/> 1.1232 + </xul:hbox> 1.1233 + <xul:label anonid="sep-second" class="datetimepicker-separator" value=":"/> 1.1234 + <xul:hbox class="datetimepicker-input-subbox" align="center"> 1.1235 + <html:input class="datetimepicker-input textbox-input" anonid="input-three" 1.1236 + size="2" maxlength="2" 1.1237 + xbl:inherits="disabled,readonly"/> 1.1238 + </xul:hbox> 1.1239 + <xul:hbox class="datetimepicker-input-subbox" align="center"> 1.1240 + <html:input class="datetimepicker-input textbox-input" anonid="input-ampm" 1.1241 + size="2" maxlength="2" 1.1242 + xbl:inherits="disabled,readonly"/> 1.1243 + </xul:hbox> 1.1244 + </xul:hbox> 1.1245 + <xul:spinbuttons anonid="buttons" xbl:inherits="disabled" allowevents="true" 1.1246 + onup="this.parentNode._increaseOrDecrease(1);" 1.1247 + ondown="this.parentNode._increaseOrDecrease(-1);"/> 1.1248 + <xul:dropmarker class="datepicker-dropmarker" xbl:inherits="disabled"/> 1.1249 + <xul:panel onpopupshown="this.firstChild.focus();" level="top"> 1.1250 + <xul:datepicker anonid="grid" type="grid" class="datepicker-popupgrid" 1.1251 + xbl:inherits="disabled,readonly,firstdayofweek"/> 1.1252 + </xul:panel> 1.1253 + </content> 1.1254 + <implementation> 1.1255 + <constructor> 1.1256 + var grid = document.getAnonymousElementByAttribute(this, "anonid", "grid"); 1.1257 + this.attachedControl = grid; 1.1258 + grid.attachedControl = this; 1.1259 + grid._setValueNoSync(this._dateValue); 1.1260 + </constructor> 1.1261 + <property name="open" onget="return this.hasAttribute('open');"> 1.1262 + <setter> 1.1263 + <![CDATA[ 1.1264 + if (this.boxObject instanceof Components.interfaces.nsIMenuBoxObject) 1.1265 + this.boxObject.openMenu(val); 1.1266 + return val; 1.1267 + ]]> 1.1268 + </setter> 1.1269 + </property> 1.1270 + <property name="displayedMonth"> 1.1271 + <getter> 1.1272 + return document.getAnonymousElementByAttribute(this, "anonid", "grid").displayedMonth; 1.1273 + </getter> 1.1274 + <setter> 1.1275 + document.getAnonymousElementByAttribute(this, "anonid", "grid").displayedMonth = val; 1.1276 + return val; 1.1277 + </setter> 1.1278 + </property> 1.1279 + <property name="displayedYear"> 1.1280 + <getter> 1.1281 + return document.getAnonymousElementByAttribute(this, "anonid", "grid").displayedYear; 1.1282 + </getter> 1.1283 + <setter> 1.1284 + document.getAnonymousElementByAttribute(this, "anonid", "grid").displayedYear = val; 1.1285 + return val; 1.1286 + </setter> 1.1287 + </property> 1.1288 + </implementation> 1.1289 + </binding> 1.1290 + 1.1291 +</bindings>