jquery-clock-timepicker.min.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. (function($) {
  2. $.fn.clockTimePicker = function(K) {
  3. var L = $.extend({
  4. afternoonHoursInOuterCircle: false,
  5. colors: {
  6. buttonTextColor: '#0797FF',
  7. clockFaceColor: '#EEEEEE',
  8. clockInnerCircleTextColor: '#888888',
  9. clockOuterCircleTextColor: '#000000',
  10. hoverCircleColor: '#DDDDDD',
  11. popupBackgroundColor: '#FFFFFF',
  12. popupHeaderBackgroundColor: '#0797FF',
  13. popupHeaderTextColor: '#FFFFFF',
  14. selectorColor: '#0797FF',
  15. selectorNumberColor: '#FFFFFF'
  16. },
  17. fonts: {
  18. fontFamily: 'Arial',
  19. clockOuterCircleFontSize: 14,
  20. clockInnerCircleFontSize: 12,
  21. buttonFontSize: 20
  22. },
  23. i18n: {
  24. okButton: 'OK',
  25. cancelButton: 'Cancel'
  26. },
  27. modeSwitchSpeed: 500,
  28. onChange: function(a, b) {},
  29. onClose: function() {},
  30. onModeSwitch: function() {},
  31. onOpen: function() {},
  32. popupWidthOnDesktop: 200,
  33. vibrate: true
  34. }, K);
  35. if (isMobile()) {
  36. var M = '.clock-timepicker input::selection { background:rgba(255,255,255,0.6); }' + '.clock-timepicker input::-moz-selection { background:rgba(255,255,255,0.6); }';
  37. var N = document.createElement('style');
  38. N.type = 'text/css';
  39. if (N.styleSheet) N.styleSheet.cssText = M;
  40. else N.appendChild(document.createTextNode(M));
  41. (document.head || document.getElementsByTagName('head')[0]).appendChild(N)
  42. }
  43. return this.each(function() {
  44. if (!('vibrate' in navigator)) L.vibrate = false;
  45. var j = $(this);
  46. j.val(formatTime(j.val()));
  47. var k = j.val();
  48. var l = j[0].onchange;
  49. j[0].onchange = '';
  50. var n = 'HOUR';
  51. var o = false;
  52. var p = false;
  53. var q = isMobile() ? $(document).width() - 80 : L.popupWidthOnDesktop;
  54. var r = q - (isMobile() ? 50 : 20);
  55. var t = parseInt(r / 2);
  56. var u = parseInt(r / 2);
  57. var v = parseInt(r / 2);
  58. var w = t - 16;
  59. var z = w - 29;
  60. j.wrap('<div class="clock-timepicker" style="display:inline-block; position:relative">');
  61. var A;
  62. if (isMobile()) {
  63. A = $('<div>');
  64. A.css('zIndex', 99998).css('display', 'none').css('position', 'fixed').css('top', '0px').css('left', '0px').css('width', '100%').css('height', '100%').css('backgroundColor', 'rgba(0,0,0,0.6)');
  65. A.on('touchmove', function(a) {
  66. a.preventDefault()
  67. });
  68. A.on('click', function(a) {
  69. a.preventDefault();
  70. a.stopImmediatePropagation();
  71. if (n == 'HOUR') selectHourOnInputElement();
  72. else selectMinuteOnInputElement();
  73. return false
  74. });
  75. $('body').append(A)
  76. }
  77. var B = $('<div>');
  78. B.css('display', 'none').css('zIndex', 99999).css('cursor', 'default').css('position', 'absolute').css('width', q + 'px').css('backgroundColor', L.colors.popupBackgroundColor).css('box-shadow', '0 4px 20px 0px rgba(0, 0, 0, 0.14)').css('border-radius', '5px');
  79. if (isMobile()) {
  80. B.css('position', 'fixed').css('left', '40px').css('top', '40px')
  81. }
  82. if (isMobile()) {
  83. B.on('touchmove', function(a) {
  84. a.preventDefault()
  85. });
  86. B.on('click', function(a) {
  87. a.stopImmediatePropagation();
  88. if (n == 'HOUR') selectHourOnInputElement();
  89. else selectMinuteOnInputElement();
  90. return false
  91. })
  92. }
  93. j.parent().append(B);
  94. $(window).on('click', function(a) {
  95. if (!isMobile() && B.css('display') != 'none' && !($(a.target)[0] == C[0] || $.contains(C.parent()[0], $(a.target)[0]))) {
  96. hideTimePicker()
  97. }
  98. });
  99. var C = j;
  100. if (isMobile()) {
  101. C = $('<input type="text">');
  102. C.css('display', 'inline-block').css('width', '100%').css('border', '0px').css('outline', '0px').css('fontSize', isMobile() ? '40px' : '20px').css('padding', '10px 0px').css('textAlign', 'center').css('color', L.colors.popupHeaderTextColor).css('backgroundColor', L.colors.popupHeaderBackgroundColor);
  103. C.prop('readonly', true);
  104. B.append(C)
  105. }
  106. C.on('dragenter', function(a) {
  107. a.stopImmediatePropagation();
  108. a.preventDefault();
  109. return false
  110. });
  111. C.on('dragover', function(a) {
  112. a.stopImmediatePropagation();
  113. a.preventDefault();
  114. return false
  115. });
  116. C.on('drop', function(a) {
  117. a.stopImmediatePropagation();
  118. a.preventDefault();
  119. return false
  120. });
  121. C.on('keyup', function(a) {
  122. var b = formatTime(C.val());
  123. if ((a.keyCode >= 48 && a.keyCode <= 57) && (C[0].selectionStart == 2 || (new RegExp('^[0-9]{2}:$').test(C.val())) || C.val().length == 5)) {
  124. C.val(b);
  125. switchToMinuteMode();
  126. selectMinuteOnInputElement()
  127. } else if ((a.keyCode == 8 || a.keyCode == 46) && C.val() && C.val()[C.val().length - 1] == ':') {
  128. b = formatTime(C.val() + '00');
  129. C.val(b);
  130. selectMinuteOnInputElement()
  131. } else if ((a.keyCode == 8 || a.keyCode == 46) && C.val() && C.val()[0] == ':') {
  132. b = formatTime('00' + C.val());
  133. C.val(b);
  134. selectHourOnInputElement()
  135. }
  136. if (k != b) {
  137. repaintClock();
  138. L.onChange(b, k);
  139. if (l) l(a)
  140. }
  141. });
  142. C.on('keydown', function(a) {
  143. k = formatTime(C.val());
  144. if (a.keyCode >= 48 && a.keyCode <= 57) {
  145. if (C.val().length == 5 && C[0].selectionStart == 5 && a.keyCode != 8) {
  146. a.preventDefault();
  147. return false
  148. }
  149. } else if (a.keyCode == 9) {} else if (a.keyCode == 13) {
  150. hideTimePicker();
  151. C.trigger('blur')
  152. } else if (a.keyCode == 27) {
  153. hideTimePicker();
  154. C.trigger('blur')
  155. } else if (a.keyCode == 8 || a.keyCode == 46) {
  156. if (C[0].selectionStart == 0 && C[0].selectionEnd == 2) {
  157. a.preventDefault();
  158. if (C.val().substring(0, 2) == '00') {
  159. C.val('');
  160. switchToHourMode()
  161. } else {
  162. C.val('00:' + C.val().substring(3));
  163. selectHourOnInputElement()
  164. }
  165. } else if (C[0].selectionStart == 3 && C[0].selectionEnd == 5) {
  166. a.preventDefault();
  167. if (C.val().substring(3) == '00') {
  168. if (C.val() == '00:00') C.val('');
  169. switchToHourMode();
  170. selectHourOnInputElement()
  171. } else {
  172. C.val(C.val().substring(0, 2) + ':00');
  173. selectMinuteOnInputElement()
  174. }
  175. }
  176. } else if ((a.keyCode == 36 || a.keyCode == 37) && C.val() != '') {
  177. C.val(formatTime(C.val()));
  178. selectHourOnInputElement();
  179. switchToHourMode()
  180. } else if ((a.keyCode == 35 || a.keyCode == 39) && C.val() != '') {
  181. C.val(formatTime(C.val()));
  182. selectMinuteOnInputElement();
  183. switchToMinuteMode()
  184. } else if (a.keyCode == 190) {
  185. a.preventDefault();
  186. if (C.val().length == 0) C.val('0');
  187. C.val(formatTime(C.val()));
  188. selectMinuteOnInputElement();
  189. switchToMinuteMode()
  190. } else if (a.keyCode == 38 || a.keyCode == 40) {
  191. a.preventDefault();
  192. if (k == '') return;
  193. (new RegExp('^([0-9]{1,2})(:([0-9]{1,2}))?$')).test(C.val());
  194. var h = parseInt(RegExp.$1);
  195. var m = RegExp.$3 ? parseInt(RegExp.$3) : 0;
  196. if (n == 'HOUR') {
  197. if (a.keyCode == 38) h -= 1;
  198. else h += 1;
  199. if (h == -1) h = 23;
  200. if (h == 24) h = 0
  201. } else {
  202. if (a.keyCode == 38) m -= 1;
  203. else m += 1;
  204. if (m == -1) m = 59;
  205. if (m == 60) m = 0
  206. }
  207. C.val((h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m);
  208. repaintClock();
  209. if (n == 'HOUR') selectHourOnInputElement();
  210. else selectMinuteOnInputElement()
  211. } else {
  212. a.preventDefault()
  213. }
  214. });
  215. j.on('mousewheel', function(a) {
  216. processMouseWheelEvent(a)
  217. });
  218. j.on('blur', function(a) {
  219. setTimeout(function() {
  220. if ($(document.activeElement)[0] != $('body')[0] && !$.contains(j.parent()[0], $(document.activeElement)[0])) {
  221. hideTimePicker()
  222. }
  223. }, 1)
  224. });
  225. j.on('focus', function(a) {
  226. if (B.css('display') == 'none') {
  227. p = true;
  228. setTimeout(function() {
  229. p = false
  230. }, 500);
  231. showTimePicker();
  232. selectHourOnInputElement()
  233. }
  234. });
  235. j.on('change', function(a) {
  236. if (B.css('display') == 'none') return;
  237. repaintClock();
  238. if (n == 'HOUR') selectHourOnInputElement();
  239. else selectMinuteOnInputElement()
  240. });
  241. C.on('click', function(a) {
  242. processClick(a)
  243. });
  244. C.on('contextmenu', function(a) {
  245. a.stopImmediatePropagation();
  246. a.preventDefault();
  247. processClick(a);
  248. return false
  249. });
  250. var D = $('<div>');
  251. D.css('position', 'relative').css('width', r + 'px').css('height', r + 'px').css('margin', '10px ' + (isMobile() ? 25 : 10) + 'px');
  252. B.append(D);
  253. var E = $('<canvas>');
  254. E.css('cursor', 'default').css('position', 'absolute').css('top', '0px').css('left', '0px');
  255. E.attr('width', r);
  256. E.attr('height', r);
  257. registerDraggingEventsOnCanvas(E);
  258. D.append(E);
  259. var F = $('<canvas>');
  260. F.css('cursor', 'default').css('position', 'absolute').css('top', '0px').css('left', '0px').css('display', 'none');
  261. F.attr('width', r);
  262. F.attr('height', r);
  263. registerDraggingEventsOnCanvas(F);
  264. D.append(F);
  265. if (isMobile()) {
  266. var G = $('<div>');
  267. G.css('text-align', 'right').css('padding', '15px 30px');
  268. G.html('<div id="log"></div>');
  269. var H = '<a style="text-decoration:none; color:' + L.colors.buttonTextColor + '; font-family:Arial; font-size:' + L.fonts.buttonFontSize + 'px; padding-left:30px">';
  270. var I = $(H);
  271. I.html(L.i18n.cancelButton);
  272. I.on('click', function() {
  273. hideTimePicker()
  274. });
  275. G.append(I);
  276. var J = $(H);
  277. J.html(L.i18n.okButton);
  278. J.on('click', function() {
  279. if (isMobile()) j.val(C.val());
  280. if (L.vibrate) navigator.vibrate(10);
  281. hideTimePicker()
  282. });
  283. G.append(J);
  284. B.append(G)
  285. }
  286. function registerDraggingEventsOnCanvas(b) {
  287. if (!isMobile()) {
  288. b.on('mousedown', function(a) {
  289. var x = a.pageX - $(this).offset().left;
  290. var y = a.pageY - $(this).offset().top;
  291. processTimeSelection(x, y);
  292. o = true
  293. });
  294. b.on('mouseup', function(a) {
  295. o = false;
  296. var x = a.pageX - $(this).offset().left;
  297. var y = a.pageY - $(this).offset().top;
  298. if (!processTimeSelection(x, y, true)) return false;
  299. if (n == 'MINUTE') {
  300. hideTimePicker()
  301. } else {
  302. switchToMinuteMode();
  303. selectMinuteOnInputElement()
  304. }
  305. });
  306. b.on('mousemove', function(a) {
  307. var x = a.pageX - $(this).offset().left;
  308. var y = a.pageY - $(this).offset().top;
  309. processTimeSelection(x, y)
  310. });
  311. b.on('mouseleave', function(a) {
  312. if (n == 'HOUR') repaintClockHourCanvas();
  313. else repaintClockMinuteCanvas()
  314. });
  315. b.on('mousewheel', function(a) {
  316. processMouseWheelEvent(a)
  317. })
  318. } else {
  319. b.on('touchstart', function(a) {
  320. a.preventDefault();
  321. var x = a.originalEvent.touches[0].pageX - $(this).offset().left;
  322. var y = a.originalEvent.touches[0].pageY - $(this).offset().top;
  323. processTimeSelection(x, y);
  324. o = true
  325. });
  326. b.on('touchend', function(a) {
  327. a.preventDefault();
  328. o = false;
  329. switchToMinuteMode();
  330. selectMinuteOnInputElement()
  331. });
  332. b.on('touchmove', function(a) {
  333. a.preventDefault();
  334. if (o) {
  335. var x = a.originalEvent.touches[0].pageX - $(this).offset().left;
  336. var y = a.originalEvent.touches[0].pageY - $(this).offset().top;
  337. processTimeSelection(x, y)
  338. }
  339. })
  340. }
  341. }
  342. function processClick(a) {
  343. if (p) return;
  344. if (C[0].selectionStart >= 3) {
  345. if (n == 'HOUR' && L.vibrate) navigator.vibrate(10);
  346. switchToMinuteMode();
  347. selectMinuteOnInputElement()
  348. } else {
  349. if (n == 'MINUTE' && L.vibrate) navigator.vibrate(10);
  350. switchToHourMode();
  351. selectHourOnInputElement()
  352. }
  353. }
  354. function processMouseWheelEvent(a) {
  355. if (!((C[0].selectionStart == 0 && C[0].selectionEnd == 2) || (C[0].selectionStart == 3 && C[0].selectionEnd == 5))) return;
  356. var e = window.event || a;
  357. var b = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
  358. (new RegExp('^([0-9]{1,2})(:([0-9]{1,2}))?$')).test(C.val());
  359. var h = parseInt(RegExp.$1);
  360. var m = RegExp.$3 ? parseInt(RegExp.$3) : 0;
  361. if (n == 'HOUR') {
  362. h += b;
  363. if (h == -1) h = 23;
  364. if (h == 24) h = 0
  365. } else {
  366. m += b;
  367. if (m == -1) m = 59;
  368. if (m == 60) m = 0
  369. }
  370. C.val((h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m);
  371. repaintClock();
  372. if (n == 'HOUR') selectHourOnInputElement();
  373. else selectMinuteOnInputElement()
  374. }
  375. function processTimeSelection(x, y, a) {
  376. var b = (360 * Math.atan((y - v) / (x - u)) / (2 * Math.PI)) + 90;
  377. var c = Math.sqrt(Math.pow(Math.abs(x - u), 2) + Math.pow(Math.abs(y - v), 2));
  378. var d = 0;
  379. var e = 0;
  380. if ((new RegExp('^([0-9]{2}):([0-9]{2})$')).test(C.val())) {
  381. d = parseInt(RegExp.$1);
  382. e = parseInt(RegExp.$2)
  383. }
  384. if (n == 'HOUR') {
  385. b = Math.round(b / 30);
  386. var h = -1;
  387. if (c < t + 10 && c > t - 28) {
  388. if (x - u >= 0) {
  389. if (b == 0) h = 12;
  390. else h = b
  391. } else if (x - u < 0) {
  392. h = b + 6
  393. }
  394. } else if (c < t - 28 && c > t - 65) {
  395. if (x - u >= 0) {
  396. if (b != 0) h = b + 12;
  397. else h = 0
  398. } else if (x - u < 0) {
  399. h = b + 18;
  400. if (h == 24) h = 0
  401. }
  402. }
  403. if (h > -1) {
  404. var f = (h < 10 ? '0' : '') + h + ':' + (e < 10 ? '0' : '') + e;
  405. if (o || a) {
  406. var g = C.val();
  407. if (f != g && L.vibrate) navigator.vibrate(10);
  408. C.val(f);
  409. if (f != g) {
  410. setTimeout(function() {
  411. L.onChange(f, g);
  412. if (l) l(event)
  413. }, 10)
  414. }
  415. }
  416. repaintClockHourCanvas(h == 0 ? 24 : h);
  417. return true
  418. } else {
  419. repaintClockHourCanvas();
  420. return false
  421. }
  422. } else if (n == 'MINUTE') {
  423. b = Math.round(b / 6);
  424. var m = -1;
  425. if (c < t + 10 && c > t - 40) {
  426. if (x - u >= 0) {
  427. m = b
  428. } else if (x - u < 0) {
  429. m = b + 30;
  430. if (m == 60) m = 0
  431. }
  432. }
  433. if (m > -1) {
  434. var f = (d < 10 ? '0' : '') + d + ':' + (m < 10 ? '0' : '') + m;
  435. if (o || a) {
  436. var g = C.val();
  437. if (f != g && L.vibrate) navigator.vibrate(10);
  438. C.val(f);
  439. if (f != g) {
  440. setTimeout(function() {
  441. L.onChange(f, g);
  442. if (l) l(event)
  443. }, 10)
  444. }
  445. }
  446. repaintClockMinuteCanvas(m == 0 ? 60 : m);
  447. return true
  448. } else {
  449. repaintClockMinuteCanvas();
  450. return false
  451. }
  452. }
  453. }
  454. function repaintClock() {
  455. if (n == 'HOUR') {
  456. repaintClockHourCanvas()
  457. } else {
  458. repaintClockMinuteCanvas()
  459. }
  460. }
  461. function repaintClockHourCanvas(a) {
  462. var b = E.get(0).getContext('2d');
  463. (new RegExp('^([0-9]{1,2}):([0-9]{1,2})$')).test(C.val());
  464. var c = parseInt(RegExp.$1);
  465. if (c == 0) c = 24;
  466. if (!C.val()) c = -1;
  467. b.clearRect(0, 0, r, r);
  468. b.beginPath();
  469. b.arc(u, v, t, 0, 2 * Math.PI, false);
  470. b.fillStyle = L.colors.clockFaceColor;
  471. b.fill();
  472. if (!isMobile() && a) {
  473. b.beginPath();
  474. b.arc(u + Math.cos(Math.PI / 6 * ((a % 12) - 3)) * (a > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)), v + Math.sin(Math.PI / 6 * ((a % 12) - 3)) * (a > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)), 15, 0, 2 * Math.PI, false);
  475. b.fillStyle = L.colors.hoverCircleColor;
  476. b.fill()
  477. }
  478. b.beginPath();
  479. b.arc(u, v, 3, 0, 2 * Math.PI, false);
  480. b.fillStyle = L.colors.selectorColor;
  481. b.fill();
  482. if (c > -1) {
  483. b.beginPath();
  484. b.moveTo(u, v);
  485. b.lineTo(u + Math.cos(Math.PI / 6 * ((c % 12) - 3)) * (c > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)), v + Math.sin(Math.PI / 6 * ((c % 12) - 3)) * (c > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)));
  486. b.lineWidth = 1;
  487. b.strokeStyle = L.colors.selectorColor;
  488. b.stroke();
  489. b.beginPath();
  490. b.arc(u + Math.cos(Math.PI / 6 * ((c % 12) - 3)) * (c > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)), v + Math.sin(Math.PI / 6 * ((c % 12) - 3)) * (c > 12 ? (L.afternoonHoursInOuterCircle ? w : z) : (L.afternoonHoursInOuterCircle ? z : w)), 15, 0, 2 * Math.PI, false);
  491. b.fillStyle = L.colors.selectorColor;
  492. b.fill()
  493. }
  494. b.font = L.fonts.clockOuterCircleFontSize + 'px ' + L.fonts.fontFamily;
  495. for (i = 1; i <= 12; i++) {
  496. var d = Math.PI / 6 * (i - 3);
  497. var s = i;
  498. if (L.afternoonHoursInOuterCircle) {
  499. s = i + 12;
  500. if (c == i + 12) b.fillStyle = L.colors.selectorNumberColor;
  501. else b.fillStyle = L.colors.clockInnerCircleTextColor;
  502. if (s == 24) s = '00'
  503. } else {
  504. if (c == i) b.fillStyle = L.colors.selectorNumberColor;
  505. else b.fillStyle = L.colors.clockOuterCircleTextColor
  506. }
  507. b.fillText(s, u + Math.cos(d) * w - (b.measureText(s).width / 2), v + Math.sin(d) * w + (L.fonts.clockOuterCircleFontSize / 3))
  508. }
  509. b.font = L.fonts.clockInnerCircleFontSize + 'px ' + L.fonts.fontFamily;
  510. for (i = 1; i <= 12; i++) {
  511. var d = Math.PI / 6 * (i - 3);
  512. var s = i;
  513. if (!L.afternoonHoursInOuterCircle) {
  514. s = i + 12;
  515. if (c == i + 12) b.fillStyle = L.colors.selectorNumberColor;
  516. else b.fillStyle = L.colors.clockInnerCircleTextColor;
  517. if (s == 24) s = '00'
  518. } else {
  519. if (c == i) b.fillStyle = L.colors.selectorNumberColor;
  520. else b.fillStyle = L.colors.clockOuterCircleTextColor
  521. }
  522. b.fillText(s, u + Math.cos(d) * z - (b.measureText(s).width / 2), v + Math.sin(d) * z + (L.fonts.clockInnerCircleFontSize / 3))
  523. }
  524. }
  525. function repaintClockMinuteCanvas(a) {
  526. var b = F.get(0).getContext('2d');
  527. (new RegExp('^([0-9]{1,2}):([0-9]{1,2})$')).test(C.val());
  528. var c = parseInt(RegExp.$2);
  529. if (!C.val()) c = -1;
  530. b.clearRect(0, 0, r, r);
  531. b.beginPath();
  532. b.arc(u, v, t, 0, 2 * Math.PI, false);
  533. b.fillStyle = L.colors.clockFaceColor;
  534. b.fill();
  535. if (!isMobile() && a) {
  536. if (a == 60) a = 0;
  537. b.beginPath();
  538. b.arc(u + Math.cos(Math.PI / 6 * ((a / 5) - 3)) * w, v + Math.sin(Math.PI / 6 * ((a / 5) - 3)) * w, 15, 0, 2 * Math.PI, false);
  539. b.fillStyle = L.colors.hoverCircleColor;
  540. b.fill()
  541. }
  542. b.beginPath();
  543. b.arc(u, v, 3, 0, 2 * Math.PI, false);
  544. b.fillStyle = L.colors.selectorColor;
  545. b.fill();
  546. if (c > -1) {
  547. b.beginPath();
  548. b.moveTo(u, v);
  549. b.lineTo(u + Math.cos(Math.PI / 6 * ((c / 5) - 3)) * w, v + Math.sin(Math.PI / 6 * ((c / 5) - 3)) * w);
  550. b.lineWidth = 1;
  551. b.strokeStyle = L.colors.selectorColor;
  552. b.stroke();
  553. b.beginPath();
  554. b.arc(u + Math.cos(Math.PI / 6 * ((c / 5) - 3)) * w, v + Math.sin(Math.PI / 6 * ((c / 5) - 3)) * w, 15, 0, 2 * Math.PI, false);
  555. b.fillStyle = L.colors.selectorColor;
  556. b.fill()
  557. }
  558. b.font = L.fonts.clockOuterCircleFontSize + 'px ' + L.fonts.fontFamily;
  559. for (i = 1; i <= 12; i++) {
  560. var d = Math.PI / 6 * (i - 3);
  561. if (c == i * 5 || (c == 0 && i == 12)) b.fillStyle = L.colors.selectorNumberColor;
  562. else b.fillStyle = L.colors.clockOuterCircleTextColor;
  563. var s = i * 5 == 5 ? '05' : i * 5;
  564. if (s == 60) s = '00';
  565. b.fillText(s, u + Math.cos(d) * w - (b.measureText(s).width / 2), v + Math.sin(d) * w + (L.fonts.clockOuterCircleFontSize / 3))
  566. }
  567. if (c > -1 && c % 5 != 0) {
  568. b.beginPath();
  569. b.arc(u + Math.cos(Math.PI / 6 * ((c / 5) - 3)) * w, v + Math.sin(Math.PI / 6 * ((c / 5) - 3)) * w, 2, 0, 2 * Math.PI, false);
  570. b.fillStyle = 'white';
  571. b.fill()
  572. }
  573. }
  574. function showTimePicker() {
  575. C.val(j.val());
  576. repaintClockHourCanvas();
  577. switchToHourMode(true);
  578. B.css('display', 'block');
  579. if (isMobile()) {
  580. A.stop().css('opacity', 0).css('display', 'block').animate({
  581. opacity: 1
  582. }, 300)
  583. } else {
  584. if (B.outerWidth() > j.outerWidth()) {
  585. var a = parseInt((B.outerWidth() - j.outerWidth()) / 2);
  586. if (a < j.offset().left) {
  587. B.css('left', -a + 'px')
  588. }
  589. }
  590. var b = j.offset().top - $(window).scrollTop();
  591. var c = window.innerHeight - b - j.outerHeight();
  592. if (c < B.outerHeight() && j.offset().top > B.outerHeight()) {
  593. if (b < B.outerHeight()) {
  594. if (b > c + j.outerHeight()) {
  595. B.css('top', -B.outerHeight() + 'px')
  596. } else {
  597. B.css('top', j.outerHeight() + 'px')
  598. }
  599. } else {
  600. B.css('top', -B.outerHeight() + 'px')
  601. }
  602. } else {
  603. B.css('top', j.outerHeight() + 'px')
  604. }
  605. }
  606. L.onOpen()
  607. }
  608. function hideTimePicker() {
  609. B.css('display', 'none');
  610. if (isMobile()) {
  611. A.stop().animate({
  612. opacity: 0
  613. }, 300, function() {
  614. A.css('display', 'none')
  615. })
  616. } else {
  617. j.val(formatTime(j.val()))
  618. }
  619. L.onClose()
  620. }
  621. function switchToHourMode(a) {
  622. if (n == 'HOUR') return;
  623. repaintClockHourCanvas();
  624. if (a) {
  625. F.css('display', 'none')
  626. } else {
  627. F.css('zIndex', 2).stop().animate({
  628. opacity: 0,
  629. zoom: '80%',
  630. left: '10%',
  631. top: '10%'
  632. }, L.modeSwitchSpeed, function() {
  633. F.css('display', 'none')
  634. })
  635. }
  636. E.stop().css('zoom', '100%').css('left', '0px').css('top', '0px').css('display', 'block').css('opacity', 1).css('zIndex', 1);
  637. n = 'HOUR';
  638. L.onModeSwitch(n)
  639. }
  640. function switchToMinuteMode() {
  641. if (n == 'MINUTE') return;
  642. repaintClockMinuteCanvas();
  643. F.stop().css('display', 'block').css('zoom', '80%').css('left', '10%').css('top', '10%').css('opacity', 0).css('zIndex', 1).animate({
  644. opacity: 1,
  645. zoom: '100%',
  646. left: '0px',
  647. top: '0px'
  648. });
  649. n = 'MINUTE';
  650. L.onModeSwitch(n)
  651. }
  652. function selectHourOnInputElement() {
  653. C.focus();
  654. setTimeout(function() {
  655. C.get(0).setSelectionRange(0, 2)
  656. }, 1)
  657. }
  658. function selectMinuteOnInputElement() {
  659. C.focus();
  660. setTimeout(function() {
  661. C.get(0).setSelectionRange(3, 5)
  662. }, 1)
  663. }
  664. function formatTime(a) {
  665. if (a == '') return a;
  666. if ((new RegExp('^([0-9]{1,2})(:([0-9]{1,2}))?')).test(a)) {
  667. var b = parseInt(RegExp.$1);
  668. var c = parseInt(RegExp.$3);
  669. if (b >= 24) b = b % 24;
  670. if (c >= 60) c = c % 60;
  671. a = (b < 10 ? '0' : '') + b + ':' + (RegExp.$3 ? (c < 10 ? '0' : '') + c : '00')
  672. } else if ((new RegExp('^:([0-9]{1,2})')).test(a)) {
  673. var c = parseInt(RegExp.$1);
  674. if (c >= 60) c = c % 60;
  675. a = '00:' + (c < 10 ? '0' : '') + c
  676. } else {
  677. a = '00:00'
  678. }
  679. return a
  680. }
  681. });
  682. function isMobile() {
  683. var b = false;
  684. (function(a) {
  685. if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) b = true
  686. })(navigator.userAgent || navigator.vendor || window.opera);
  687. return b
  688. }
  689. }
  690. }(jQuery));