/include/prototype-1.4.0/src/form.js

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql · JavaScript · 298 lines · 245 code · 49 blank · 4 comment · 46 complexity · 28cbda9181d4dc83e8f5d5eea4319cf8 MD5 · raw file

  1. var Field = {
  2. clear: function() {
  3. for (var i = 0; i < arguments.length; i++)
  4. $(arguments[i]).value = '';
  5. },
  6. focus: function(element) {
  7. $(element).focus();
  8. },
  9. present: function() {
  10. for (var i = 0; i < arguments.length; i++)
  11. if ($(arguments[i]).value == '') return false;
  12. return true;
  13. },
  14. select: function(element) {
  15. $(element).select();
  16. },
  17. activate: function(element) {
  18. element = $(element);
  19. element.focus();
  20. if (element.select)
  21. element.select();
  22. }
  23. }
  24. /*--------------------------------------------------------------------------*/
  25. var Form = {
  26. serialize: function(form) {
  27. var elements = Form.getElements($(form));
  28. var queryComponents = new Array();
  29. for (var i = 0; i < elements.length; i++) {
  30. var queryComponent = Form.Element.serialize(elements[i]);
  31. if (queryComponent)
  32. queryComponents.push(queryComponent);
  33. }
  34. return queryComponents.join('&');
  35. },
  36. getElements: function(form) {
  37. form = $(form);
  38. var elements = new Array();
  39. for (tagName in Form.Element.Serializers) {
  40. var tagElements = form.getElementsByTagName(tagName);
  41. for (var j = 0; j < tagElements.length; j++)
  42. elements.push(tagElements[j]);
  43. }
  44. return elements;
  45. },
  46. getInputs: function(form, typeName, name) {
  47. form = $(form);
  48. var inputs = form.getElementsByTagName('input');
  49. if (!typeName && !name)
  50. return inputs;
  51. var matchingInputs = new Array();
  52. for (var i = 0; i < inputs.length; i++) {
  53. var input = inputs[i];
  54. if ((typeName && input.type != typeName) ||
  55. (name && input.name != name))
  56. continue;
  57. matchingInputs.push(input);
  58. }
  59. return matchingInputs;
  60. },
  61. disable: function(form) {
  62. var elements = Form.getElements(form);
  63. for (var i = 0; i < elements.length; i++) {
  64. var element = elements[i];
  65. element.blur();
  66. element.disabled = 'true';
  67. }
  68. },
  69. enable: function(form) {
  70. var elements = Form.getElements(form);
  71. for (var i = 0; i < elements.length; i++) {
  72. var element = elements[i];
  73. element.disabled = '';
  74. }
  75. },
  76. findFirstElement: function(form) {
  77. return Form.getElements(form).find(function(element) {
  78. return element.type != 'hidden' && !element.disabled &&
  79. ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
  80. });
  81. },
  82. focusFirstElement: function(form) {
  83. Field.activate(Form.findFirstElement(form));
  84. },
  85. reset: function(form) {
  86. $(form).reset();
  87. }
  88. }
  89. Form.Element = {
  90. serialize: function(element) {
  91. element = $(element);
  92. var method = element.tagName.toLowerCase();
  93. var parameter = Form.Element.Serializers[method](element);
  94. if (parameter) {
  95. var key = encodeURIComponent(parameter[0]);
  96. if (key.length == 0) return;
  97. if (parameter[1].constructor != Array)
  98. parameter[1] = [parameter[1]];
  99. return parameter[1].map(function(value) {
  100. return key + '=' + encodeURIComponent(value);
  101. }).join('&');
  102. }
  103. },
  104. getValue: function(element) {
  105. element = $(element);
  106. var method = element.tagName.toLowerCase();
  107. var parameter = Form.Element.Serializers[method](element);
  108. if (parameter)
  109. return parameter[1];
  110. }
  111. }
  112. Form.Element.Serializers = {
  113. input: function(element) {
  114. switch (element.type.toLowerCase()) {
  115. case 'submit':
  116. case 'hidden':
  117. case 'password':
  118. case 'text':
  119. return Form.Element.Serializers.textarea(element);
  120. case 'checkbox':
  121. case 'radio':
  122. return Form.Element.Serializers.inputSelector(element);
  123. }
  124. return false;
  125. },
  126. inputSelector: function(element) {
  127. if (element.checked)
  128. return [element.name, element.value];
  129. },
  130. textarea: function(element) {
  131. return [element.name, element.value];
  132. },
  133. select: function(element) {
  134. return Form.Element.Serializers[element.type == 'select-one' ?
  135. 'selectOne' : 'selectMany'](element);
  136. },
  137. selectOne: function(element) {
  138. var value = '', opt, index = element.selectedIndex;
  139. if (index >= 0) {
  140. opt = element.options[index];
  141. value = opt.value;
  142. if (!value && !('value' in opt))
  143. value = opt.text;
  144. }
  145. return [element.name, value];
  146. },
  147. selectMany: function(element) {
  148. var value = new Array();
  149. for (var i = 0; i < element.length; i++) {
  150. var opt = element.options[i];
  151. if (opt.selected) {
  152. var optValue = opt.value;
  153. if (!optValue && !('value' in opt))
  154. optValue = opt.text;
  155. value.push(optValue);
  156. }
  157. }
  158. return [element.name, value];
  159. }
  160. }
  161. /*--------------------------------------------------------------------------*/
  162. var $F = Form.Element.getValue;
  163. /*--------------------------------------------------------------------------*/
  164. Abstract.TimedObserver = function() {}
  165. Abstract.TimedObserver.prototype = {
  166. initialize: function(element, frequency, callback) {
  167. this.frequency = frequency;
  168. this.element = $(element);
  169. this.callback = callback;
  170. this.lastValue = this.getValue();
  171. this.registerCallback();
  172. },
  173. registerCallback: function() {
  174. setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  175. },
  176. onTimerEvent: function() {
  177. var value = this.getValue();
  178. if (this.lastValue != value) {
  179. this.callback(this.element, value);
  180. this.lastValue = value;
  181. }
  182. }
  183. }
  184. Form.Element.Observer = Class.create();
  185. Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  186. getValue: function() {
  187. return Form.Element.getValue(this.element);
  188. }
  189. });
  190. Form.Observer = Class.create();
  191. Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  192. getValue: function() {
  193. return Form.serialize(this.element);
  194. }
  195. });
  196. /*--------------------------------------------------------------------------*/
  197. Abstract.EventObserver = function() {}
  198. Abstract.EventObserver.prototype = {
  199. initialize: function(element, callback) {
  200. this.element = $(element);
  201. this.callback = callback;
  202. this.lastValue = this.getValue();
  203. if (this.element.tagName.toLowerCase() == 'form')
  204. this.registerFormCallbacks();
  205. else
  206. this.registerCallback(this.element);
  207. },
  208. onElementEvent: function() {
  209. var value = this.getValue();
  210. if (this.lastValue != value) {
  211. this.callback(this.element, value);
  212. this.lastValue = value;
  213. }
  214. },
  215. registerFormCallbacks: function() {
  216. var elements = Form.getElements(this.element);
  217. for (var i = 0; i < elements.length; i++)
  218. this.registerCallback(elements[i]);
  219. },
  220. registerCallback: function(element) {
  221. if (element.type) {
  222. switch (element.type.toLowerCase()) {
  223. case 'checkbox':
  224. case 'radio':
  225. Event.observe(element, 'click', this.onElementEvent.bind(this));
  226. break;
  227. case 'password':
  228. case 'text':
  229. case 'textarea':
  230. case 'select-one':
  231. case 'select-multiple':
  232. Event.observe(element, 'change', this.onElementEvent.bind(this));
  233. break;
  234. }
  235. }
  236. }
  237. }
  238. Form.Element.EventObserver = Class.create();
  239. Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  240. getValue: function() {
  241. return Form.Element.getValue(this.element);
  242. }
  243. });
  244. Form.EventObserver = Class.create();
  245. Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  246. getValue: function() {
  247. return Form.serialize(this.element);
  248. }
  249. });