Spinner.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:18k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.widget.Spinner");
  9. dojo.require("dojo.io.*");
  10. dojo.require("dojo.lfx.*");
  11. dojo.require("dojo.html.*");
  12. dojo.require("dojo.html.layout");
  13. dojo.require("dojo.string");
  14. dojo.require("dojo.widget.*");
  15. dojo.require("dojo.widget.IntegerTextbox");
  16. dojo.require("dojo.widget.RealNumberTextbox");
  17. dojo.require("dojo.widget.DateTextbox");
  18. dojo.require("dojo.experimental");
  19. dojo.declare("dojo.widget.Spinner", null, {_typamaticTimer:null, _typamaticFunction:null, _currentTimeout:this.defaultTimeout, _eventCount:0, defaultTimeout:500, timeoutChangeRate:0.9, templateString:"<span _="weird end tag formatting is to prevent whitespace from becoming &nbsp;"ntstyle='float:${this.htmlfloat};'nt><table cellpadding=0 cellspacing=0 class="dojoSpinner">ntt<tr>nttt<tdntttt><inputntttttdojoAttachPoint='textbox' type='${this.type}'ntttttdojoAttachEvent='onblur;onfocus;onkey:_handleKeyEvents;onKeyUp:_onSpinnerKeyUp;onresize:_resize'ntttttid='${this.widgetId}' name='${this.name}' size='${this.size}' maxlength='${this.maxlength}'ntttttvalue='${this.value}' class='${this.className}' autocomplete="off"nttt></td>nttt<tdntttt><img dojoAttachPoint="upArrowNode"ntttttdojoAttachEvent="onDblClick: _upArrowDoubleClicked;  onMouseDown: _upArrowPressed; onMouseUp: _arrowReleased; onMouseOut: _arrowReleased; onMouseMove: _discardEvent;"ntttttsrc="${this.incrementSrc}" style="width: ${this.buttonSize.width}px; height: ${this.buttonSize.height}px;"ntttt><img dojoAttachPoint="downArrowNode"ntttttdojoAttachEvent="onDblClick: _downArrowDoubleClicked;  onMouseDown: _downArrowPressed; onMouseUp: _arrowReleased; onMouseOut: _arrowReleased; onMouseMove: _discardEvent;"ntttttsrc="${this.decrementSrc}" style="width: ${this.buttonSize.width}px; height: ${this.buttonSize.height}px;"nttt></td>ntt</tr>nt</tablent><span dojoAttachPoint='invalidSpan' class='${this.invalidClass}'>${this.messages.invalidMessage}</spannt><span dojoAttachPoint='missingSpan' class='${this.missingClass}'>${this.messages.missingMessage}</spannt><span dojoAttachPoint='rangeSpan' class='${this.rangeClass}'>${this.messages.rangeMessage}</spann></span>n", templateCssString:"/* inline the table holding the <input> and buttons (method varies by browser) */n.ie .dojoSpinner, .safari .dojoSpinner {ntdisplay: inline;n}nn.moz .dojoSpinner {ntdisplay: -moz-inline-box;n}nn.opera .dojoSpinner {ntdisplay: inline-table;n}nn/* generic stuff for the table */n.dojoSpinner td {ntpadding:0px;ntmargin:0px;ntvertical-align: middle;n}ntable.dojoSpinner {ntborder:0px;ntborder-spacing:0px;ntline-height:0px;ntpadding:0px;ntmargin: 0px;ntvertical-align: middle;n}nn/* the buttons */n.dojoSpinner img {ntdisplay: block;ntborder-width:0px 1px 1px 0px;ntborder-style:outset;n}n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/Spinner.css"), incrementSrc:dojo.uri.moduleUri("dojo.widget", "templates/images/spinnerIncrement.gif"), decrementSrc:dojo.uri.moduleUri("dojo.widget", "templates/images/spinnerDecrement.gif"), _handleKeyEvents:function (evt) {
  20. if (!evt.key) {
  21. return;
  22. }
  23. if (!evt.ctrlKey && !evt.altKey) {
  24. switch (evt.key) {
  25.   case evt.KEY_DOWN_ARROW:
  26. dojo.event.browser.stopEvent(evt);
  27. this._downArrowPressed(evt);
  28. return;
  29.   case evt.KEY_UP_ARROW:
  30. dojo.event.browser.stopEvent(evt);
  31. this._upArrowPressed(evt);
  32. return;
  33. }
  34. }
  35. this._eventCount++;
  36. }, _onSpinnerKeyUp:function (evt) {
  37. this._arrowReleased(evt);
  38. this.onkeyup(evt);
  39. }, _resize:function () {
  40. var inputSize = dojo.html.getBorderBox(this.textbox);
  41. this.buttonSize = {width:inputSize.height / 2, height:inputSize.height / 2};
  42. if (this.upArrowNode) {
  43. dojo.html.setMarginBox(this.upArrowNode, this.buttonSize);
  44. dojo.html.setMarginBox(this.downArrowNode, this.buttonSize);
  45. }
  46. }, _pressButton:function (node) {
  47. node.style.borderWidth = "1px 0px 0px 1px";
  48. node.style.borderStyle = "inset";
  49. }, _releaseButton:function (node) {
  50. node.style.borderWidth = "0px 1px 1px 0px";
  51. node.style.borderStyle = "outset";
  52. }, _arrowPressed:function (evt, direction) {
  53. var nodePressed = (direction == -1) ? this.downArrowNode : this.upArrowNode;
  54. var nodeReleased = (direction == +1) ? this.downArrowNode : this.upArrowNode;
  55. if (typeof evt != "number") {
  56. if (this._typamaticTimer != null) {
  57. if (this._typamaticNode == nodePressed) {
  58. return;
  59. }
  60. dojo.lang.clearTimeout(this._typamaticTimer);
  61. }
  62. this._releaseButton(nodeReleased);
  63. this._eventCount++;
  64. this._typamaticTimer = null;
  65. this._currentTimeout = this.defaultTimeout;
  66. } else {
  67. if (evt != this._eventCount) {
  68. this._releaseButton(nodePressed);
  69. return;
  70. }
  71. }
  72. this._pressButton(nodePressed);
  73. this._setCursorX(this.adjustValue(direction, this._getCursorX()));
  74. this._typamaticNode = nodePressed;
  75. this._typamaticTimer = dojo.lang.setTimeout(this, "_arrowPressed", this._currentTimeout, this._eventCount, direction);
  76. this._currentTimeout = Math.round(this._currentTimeout * this.timeoutChangeRate);
  77. }, _downArrowPressed:function (evt) {
  78. return this._arrowPressed(evt, -1);
  79. }, _downArrowDoubleClicked:function (evt) {
  80. var rc = this._downArrowPressed(evt);
  81. dojo.lang.setTimeout(this, "_arrowReleased", 50, null);
  82. return rc;
  83. }, _upArrowPressed:function (evt) {
  84. return this._arrowPressed(evt, +1);
  85. }, _upArrowDoubleClicked:function (evt) {
  86. var rc = this._upArrowPressed(evt);
  87. dojo.lang.setTimeout(this, "_arrowReleased", 50, null);
  88. return rc;
  89. }, _arrowReleased:function (evt) {
  90. this.textbox.focus();
  91. if (evt != null && typeof evt == "object" && evt.keyCode && evt.keyCode != null) {
  92. var keyCode = evt.keyCode;
  93. var k = dojo.event.browser.keys;
  94. switch (keyCode) {
  95.   case k.KEY_DOWN_ARROW:
  96.   case k.KEY_UP_ARROW:
  97. dojo.event.browser.stopEvent(evt);
  98. break;
  99. }
  100. }
  101. this._releaseButton(this.upArrowNode);
  102. this._releaseButton(this.downArrowNode);
  103. this._eventCount++;
  104. if (this._typamaticTimer != null) {
  105. dojo.lang.clearTimeout(this._typamaticTimer);
  106. }
  107. this._typamaticTimer = null;
  108. this._currentTimeout = this.defaultTimeout;
  109. }, _mouseWheeled:function (evt) {
  110. var scrollAmount = 0;
  111. if (typeof evt.wheelDelta == "number") {
  112. scrollAmount = evt.wheelDelta;
  113. } else {
  114. if (typeof evt.detail == "number") {
  115. scrollAmount = -evt.detail;
  116. }
  117. }
  118. if (scrollAmount > 0) {
  119. this._upArrowPressed(evt);
  120. this._arrowReleased(evt);
  121. } else {
  122. if (scrollAmount < 0) {
  123. this._downArrowPressed(evt);
  124. this._arrowReleased(evt);
  125. }
  126. }
  127. }, _discardEvent:function (evt) {
  128. dojo.event.browser.stopEvent(evt);
  129. }, _getCursorX:function () {
  130. var x = -1;
  131. try {
  132. this.textbox.focus();
  133. if (typeof this.textbox.selectionEnd == "number") {
  134. x = this.textbox.selectionEnd;
  135. } else {
  136. if (document.selection && document.selection.createRange) {
  137. var range = document.selection.createRange().duplicate();
  138. if (range.parentElement() == this.textbox) {
  139. range.moveStart("textedit", -1);
  140. x = range.text.length;
  141. }
  142. }
  143. }
  144. }
  145. catch (e) {
  146. }
  147. return x;
  148. }, _setCursorX:function (x) {
  149. try {
  150. this.textbox.focus();
  151. if (!x) {
  152. x = 0;
  153. }
  154. if (typeof this.textbox.selectionEnd == "number") {
  155. this.textbox.selectionEnd = x;
  156. } else {
  157. if (this.textbox.createTextRange) {
  158. var range = this.textbox.createTextRange();
  159. range.collapse(true);
  160. range.moveEnd("character", x);
  161. range.moveStart("character", x);
  162. range.select();
  163. }
  164. }
  165. }
  166. catch (e) {
  167. }
  168. }, _spinnerPostMixInProperties:function (args, frag) {
  169. var inputNode = this.getFragNodeRef(frag);
  170. var inputSize = dojo.html.getBorderBox(inputNode);
  171. this.buttonSize = {width:inputSize.height / 2 - 1, height:inputSize.height / 2 - 1};
  172. }, _spinnerPostCreate:function (args, frag) {
  173. if (this.textbox.addEventListener) {
  174. this.textbox.addEventListener("DOMMouseScroll", dojo.lang.hitch(this, "_mouseWheeled"), false);
  175. } else {
  176. dojo.event.connect(this.textbox, "onmousewheel", this, "_mouseWheeled");
  177. }
  178. }});
  179. dojo.widget.defineWidget("dojo.widget.IntegerSpinner", [dojo.widget.IntegerTextbox, dojo.widget.Spinner], {delta:"1", postMixInProperties:function (args, frag) {
  180. dojo.widget.IntegerSpinner.superclass.postMixInProperties.apply(this, arguments);
  181. this._spinnerPostMixInProperties(args, frag);
  182. }, postCreate:function (args, frag) {
  183. dojo.widget.IntegerSpinner.superclass.postCreate.apply(this, arguments);
  184. this._spinnerPostCreate(args, frag);
  185. }, adjustValue:function (direction, x) {
  186. var val = this.getValue().replace(/[^-+d]/g, "");
  187. if (val.length == 0) {
  188. return;
  189. }
  190. var num = Math.min(Math.max((parseInt(val) + (parseInt(this.delta) * direction)), (this.flags.min ? this.flags.min : -Infinity)), (this.flags.max ? this.flags.max : +Infinity));
  191. val = num.toString();
  192. if (num >= 0) {
  193. val = ((this.flags.signed == true) ? "+" : " ") + val;
  194. }
  195. if (this.flags.separator.length > 0) {
  196. for (var i = val.length - 3; i > 1; i -= 3) {
  197. val = val.substr(0, i) + this.flags.separator + val.substr(i);
  198. }
  199. }
  200. if (val.substr(0, 1) == " ") {
  201. val = val.substr(1);
  202. }
  203. this.setValue(val);
  204. return val.length;
  205. }});
  206. dojo.widget.defineWidget("dojo.widget.RealNumberSpinner", [dojo.widget.RealNumberTextbox, dojo.widget.Spinner], function () {
  207. dojo.experimental("dojo.widget.RealNumberSpinner");
  208. }, {delta:"1e1", postMixInProperties:function (args, frag) {
  209. dojo.widget.RealNumberSpinner.superclass.postMixInProperties.apply(this, arguments);
  210. this._spinnerPostMixInProperties(args, frag);
  211. }, postCreate:function (args, frag) {
  212. dojo.widget.RealNumberSpinner.superclass.postCreate.apply(this, arguments);
  213. this._spinnerPostCreate(args, frag);
  214. }, adjustValue:function (direction, x) {
  215. var val = this.getValue().replace(/[^-+.eEd]/g, "");
  216. if (!val.length) {
  217. return;
  218. }
  219. var num = parseFloat(val);
  220. if (isNaN(num)) {
  221. return;
  222. }
  223. var delta = this.delta.split(/[eE]/);
  224. if (!delta.length) {
  225. delta = [1, 1];
  226. } else {
  227. delta[0] = parseFloat(delta[0].replace(/[^-+.d]/g, ""));
  228. if (isNaN(delta[0])) {
  229. delta[0] = 1;
  230. }
  231. if (delta.length > 1) {
  232. delta[1] = parseInt(delta[1]);
  233. }
  234. if (isNaN(delta[1])) {
  235. delta[1] = 1;
  236. }
  237. }
  238. val = this.getValue().split(/[eE]/);
  239. if (!val.length) {
  240. return;
  241. }
  242. var numBase = parseFloat(val[0].replace(/[^-+.d]/g, ""));
  243. if (val.length == 1) {
  244. var numExp = 0;
  245. } else {
  246. var numExp = parseInt(val[1].replace(/[^-+d]/g, ""));
  247. }
  248. if (x <= val[0].length) {
  249. x = 0;
  250. numBase += delta[0] * direction;
  251. } else {
  252. x = Number.MAX_VALUE;
  253. numExp += delta[1] * direction;
  254. if (this.flags.eSigned == false && numExp < 0) {
  255. numExp = 0;
  256. }
  257. }
  258. num = Math.min(Math.max((numBase * Math.pow(10, numExp)), (this.flags.min ? this.flags.min : -Infinity)), (this.flags.max ? this.flags.max : +Infinity));
  259. if ((this.flags.exponent == true || (this.flags.exponent != false && x != 0)) && num.toExponential) {
  260. if (isNaN(this.flags.places) || this.flags.places == Infinity) {
  261. val = num.toExponential();
  262. } else {
  263. val = num.toExponential(this.flags.places);
  264. }
  265. } else {
  266. if (num.toFixed && num.toPrecision) {
  267. if (isNaN(this.flags.places) || this.flags.places == Infinity) {
  268. val = num.toPrecision((1 / 3).toString().length - 1);
  269. } else {
  270. val = num.toFixed(this.flags.places);
  271. }
  272. } else {
  273. val = num.toString();
  274. }
  275. }
  276. if (num >= 0) {
  277. if (this.flags.signed == true) {
  278. val = "+" + val;
  279. }
  280. }
  281. val = val.split(/[eE]/);
  282. if (this.flags.separator.length > 0) {
  283. if (num >= 0 && val[0].substr(0, 1) != "+") {
  284. val[0] = " " + val[0];
  285. }
  286. var i = val[0].lastIndexOf(".");
  287. if (i >= 0) {
  288. i -= 3;
  289. } else {
  290. i = val[0].length - 3;
  291. }
  292. for (; i > 1; i -= 3) {
  293. val[0] = val[0].substr(0, i) + this.flags.separator + val[0].substr(i);
  294. }
  295. if (val[0].substr(0, 1) == " ") {
  296. val[0] = val[0].substr(1);
  297. }
  298. }
  299. if (val.length > 1) {
  300. if ((this.flags.eSigned == true) && (val[1].substr(0, 1) != "+")) {
  301. val[1] = "+" + val[1];
  302. } else {
  303. if ((!this.flags.eSigned) && (val[1].substr(0, 1) == "+")) {
  304. val[1] = val[1].substr(1);
  305. } else {
  306. if ((!this.flags.eSigned) && (val[1].substr(0, 1) == "-") && (num.toFixed && num.toPrecision)) {
  307. if (isNaN(this.flags.places)) {
  308. val[0] = num.toPrecision((1 / 3).toString().length - 1);
  309. } else {
  310. val[0] = num.toFixed(this.flags.places).toString();
  311. }
  312. val[1] = "0";
  313. }
  314. }
  315. }
  316. val[0] += "e" + val[1];
  317. }
  318. this.setValue(val[0]);
  319. if (x > val[0].length) {
  320. x = val[0].length;
  321. }
  322. return x;
  323. }});
  324. dojo.widget.defineWidget("dojo.widget.TimeSpinner", [dojo.widget.TimeTextbox, dojo.widget.Spinner], function () {
  325. dojo.experimental("dojo.widget.TimeSpinner");
  326. }, {postMixInProperties:function (args, frag) {
  327. dojo.widget.TimeSpinner.superclass.postMixInProperties.apply(this, arguments);
  328. this._spinnerPostMixInProperties(args, frag);
  329. }, postCreate:function (args, frag) {
  330. dojo.widget.TimeSpinner.superclass.postCreate.apply(this, arguments);
  331. this._spinnerPostCreate(args, frag);
  332. }, adjustValue:function (direction, x) {
  333. var val = this.getValue();
  334. var format = (this.flags.format && this.flags.format.search(/[Hhmst]/) >= 0) ? this.flags.format : "hh:mm:ss t";
  335. if (direction == 0 || !val.length || !this.isValid()) {
  336. return;
  337. }
  338. if (!this.flags.amSymbol) {
  339. this.flags.amSymbol = "AM";
  340. }
  341. if (!this.flags.pmSymbol) {
  342. this.flags.pmSymbol = "PM";
  343. }
  344. var re = dojo.regexp.time(this.flags);
  345. var qualifiers = format.replace(/H/g, "h").replace(/[^hmst]/g, "").replace(/([hmst])1/g, "$1");
  346. var hourPos = qualifiers.indexOf("h") + 1;
  347. var minPos = qualifiers.indexOf("m") + 1;
  348. var secPos = qualifiers.indexOf("s") + 1;
  349. var ampmPos = qualifiers.indexOf("t") + 1;
  350. var cursorFormat = format;
  351. var ampm = "";
  352. if (ampmPos > 0) {
  353. ampm = val.replace(new RegExp(re), "$" + ampmPos);
  354. cursorFormat = cursorFormat.replace(/t+/, ampm.replace(/./g, "t"));
  355. }
  356. var hour = 0;
  357. var deltaHour = 1;
  358. if (hourPos > 0) {
  359. hour = val.replace(new RegExp(re), "$" + hourPos);
  360. if (dojo.lang.isString(this.delta)) {
  361. deltaHour = this.delta.replace(new RegExp(re), "$" + hourPos);
  362. }
  363. if (isNaN(deltaHour)) {
  364. deltaHour = 1;
  365. } else {
  366. deltaHour = parseInt(deltaHour);
  367. }
  368. if (hour.length == 2) {
  369. cursorFormat = cursorFormat.replace(/([Hh])+/, "$1$1");
  370. } else {
  371. cursorFormat = cursorFormat.replace(/([Hh])+/, "$1");
  372. }
  373. if (isNaN(hour)) {
  374. hour = 0;
  375. } else {
  376. hour = parseInt(hour.replace(/^0(d)/, "$1"));
  377. }
  378. }
  379. var min = 0;
  380. var deltaMin = 1;
  381. if (minPos > 0) {
  382. min = val.replace(new RegExp(re), "$" + minPos);
  383. if (dojo.lang.isString(this.delta)) {
  384. deltaMin = this.delta.replace(new RegExp(re), "$" + minPos);
  385. }
  386. if (isNaN(deltaMin)) {
  387. deltaMin = 1;
  388. } else {
  389. deltaMin = parseInt(deltaMin);
  390. }
  391. cursorFormat = cursorFormat.replace(/m+/, min.replace(/./g, "m"));
  392. if (isNaN(min)) {
  393. min = 0;
  394. } else {
  395. min = parseInt(min.replace(/^0(d)/, "$1"));
  396. }
  397. }
  398. var sec = 0;
  399. var deltaSec = 1;
  400. if (secPos > 0) {
  401. sec = val.replace(new RegExp(re), "$" + secPos);
  402. if (dojo.lang.isString(this.delta)) {
  403. deltaSec = this.delta.replace(new RegExp(re), "$" + secPos);
  404. }
  405. if (isNaN(deltaSec)) {
  406. deltaSec = 1;
  407. } else {
  408. deltaSec = parseInt(deltaSec);
  409. }
  410. cursorFormat = cursorFormat.replace(/s+/, sec.replace(/./g, "s"));
  411. if (isNaN(sec)) {
  412. sec = 0;
  413. } else {
  414. sec = parseInt(sec.replace(/^0(d)/, "$1"));
  415. }
  416. }
  417. if (isNaN(x) || x >= cursorFormat.length) {
  418. x = cursorFormat.length - 1;
  419. }
  420. var cursorToken = cursorFormat.charAt(x);
  421. switch (cursorToken) {
  422.   case "t":
  423. if (ampm == this.flags.amSymbol) {
  424. ampm = this.flags.pmSymbol;
  425. } else {
  426. if (ampm == this.flags.pmSymbol) {
  427. ampm = this.flags.amSymbol;
  428. }
  429. }
  430. break;
  431.   default:
  432. if (hour >= 1 && hour < 12 && ampm == this.flags.pmSymbol) {
  433. hour += 12;
  434. }
  435. if (hour == 12 && ampm == this.flags.amSymbol) {
  436. hour = 0;
  437. }
  438. switch (cursorToken) {
  439.   case "s":
  440. sec += deltaSec * direction;
  441. while (sec < 0) {
  442. min--;
  443. sec += 60;
  444. }
  445. while (sec >= 60) {
  446. min++;
  447. sec -= 60;
  448. }
  449.   case "m":
  450. if (cursorToken == "m") {
  451. min += deltaMin * direction;
  452. }
  453. while (min < 0) {
  454. hour--;
  455. min += 60;
  456. }
  457. while (min >= 60) {
  458. hour++;
  459. min -= 60;
  460. }
  461.   case "h":
  462.   case "H":
  463. if (cursorToken == "h" || cursorToken == "H") {
  464. hour += deltaHour * direction;
  465. }
  466. while (hour < 0) {
  467. hour += 24;
  468. }
  469. while (hour >= 24) {
  470. hour -= 24;
  471. }
  472. break;
  473.   default:
  474. return;
  475. }
  476. if (hour >= 12) {
  477. ampm = this.flags.pmSymbol;
  478. if (format.indexOf("h") >= 0 && hour >= 13) {
  479. hour -= 12;
  480. }
  481. } else {
  482. ampm = this.flags.amSymbol;
  483. if (format.indexOf("h") >= 0 && hour == 0) {
  484. hour = 12;
  485. }
  486. }
  487. }
  488. cursorFormat = format;
  489. if (hour >= 0 && hour < 10 && format.search(/[hH]{2}/) >= 0) {
  490. hour = "0" + hour.toString();
  491. }
  492. if (hour >= 10 && cursorFormat.search(/[hH]{2}/) < 0) {
  493. cursorFormat = cursorFormat.replace(/(h|H)/, "$1$1");
  494. }
  495. if (min >= 0 && min < 10 && cursorFormat.search(/mm/) >= 0) {
  496. min = "0" + min.toString();
  497. }
  498. if (min >= 10 && cursorFormat.search(/mm/) < 0) {
  499. cursorFormat = cursorFormat.replace(/m/, "$1$1");
  500. }
  501. if (sec >= 0 && sec < 10 && cursorFormat.search(/ss/) >= 0) {
  502. sec = "0" + sec.toString();
  503. }
  504. if (sec >= 10 && cursorFormat.search(/ss/) < 0) {
  505. cursorFormat = cursorFormat.replace(/s/, "$1$1");
  506. }
  507. x = cursorFormat.indexOf(cursorToken);
  508. if (x == -1) {
  509. x = format.length;
  510. }
  511. format = format.replace(/[hH]+/, hour);
  512. format = format.replace(/m+/, min);
  513. format = format.replace(/s+/, sec);
  514. format = format.replace(/t/, ampm);
  515. this.setValue(format);
  516. if (x > format.length) {
  517. x = format.length;
  518. }
  519. return x;
  520. }});