You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

351 lines
10 KiB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
  1. /*
  2. * # Semantic - Checkbox
  3. * http://github.com/jlukic/semantic-ui/
  4. *
  5. *
  6. * Copyright 2014 Contributors
  7. * Released under the MIT license
  8. * http://opensource.org/licenses/MIT
  9. *
  10. */
  11. ;(function ( $, window, document, undefined ) {
  12. module.exports = function(parameters) {
  13. var _module = module;
  14. var
  15. $allModules = $(this),
  16. moduleSelector = $allModules.selector || '',
  17. time = new Date().getTime(),
  18. performance = [],
  19. query = arguments[0],
  20. methodInvoked = (typeof query == 'string'),
  21. queryArguments = [].slice.call(arguments, 1),
  22. returnedValue
  23. ;
  24. $allModules
  25. .each(function() {
  26. var
  27. settings = $.extend(true, {}, _module.exports.settings, parameters),
  28. className = settings.className,
  29. namespace = settings.namespace,
  30. error = settings.error,
  31. eventNamespace = '.' + namespace,
  32. moduleNamespace = 'module-' + namespace,
  33. $module = $(this),
  34. $label = $(this).next(settings.selector.label).first(),
  35. $input = $(this).find(settings.selector.input),
  36. selector = $module.selector || '',
  37. instance = $module.data(moduleNamespace),
  38. element = this,
  39. module
  40. ;
  41. module = {
  42. initialize: function() {
  43. module.verbose('Initializing checkbox', settings);
  44. if(settings.context && selector !== '') {
  45. module.verbose('Adding delegated events');
  46. $(element, settings.context)
  47. .on(selector, 'click' + eventNamespace, module.toggle)
  48. .on(selector + ' + ' + settings.selector.label, 'click' + eventNamespace, module.toggle)
  49. ;
  50. }
  51. else {
  52. $module
  53. .on('click' + eventNamespace, module.toggle)
  54. .data(moduleNamespace, module)
  55. ;
  56. $label
  57. .on('click' + eventNamespace, module.toggle)
  58. ;
  59. }
  60. module.instantiate();
  61. },
  62. instantiate: function() {
  63. module.verbose('Storing instance of module', module);
  64. instance = module;
  65. $module
  66. .data(moduleNamespace, module)
  67. ;
  68. },
  69. destroy: function() {
  70. module.verbose('Destroying previous module');
  71. $module
  72. .off(eventNamespace)
  73. .removeData(moduleNamespace)
  74. ;
  75. },
  76. is: {
  77. radio: function() {
  78. return $module.hasClass(className.radio);
  79. },
  80. enabled: function() {
  81. return $input.prop('checked') !== undefined && $input.prop('checked');
  82. },
  83. disabled: function() {
  84. return !module.is.enabled();
  85. }
  86. },
  87. can: {
  88. disable: function() {
  89. return (typeof settings.required === 'boolean')
  90. ? settings.required
  91. : !module.is.radio()
  92. ;
  93. }
  94. },
  95. enable: function() {
  96. module.debug('Enabling checkbox', $input);
  97. $input
  98. .prop('checked', true)
  99. .trigger('change')
  100. ;
  101. $.proxy(settings.onChange, $input.get())();
  102. $.proxy(settings.onEnable, $input.get())();
  103. },
  104. disable: function() {
  105. module.debug('Disabling checkbox');
  106. $input
  107. .prop('checked', false)
  108. .trigger('change')
  109. ;
  110. $.proxy(settings.onChange, $input.get())();
  111. $.proxy(settings.onDisable, $input.get())();
  112. },
  113. toggle: function(event) {
  114. module.verbose('Determining new checkbox state');
  115. if( !$input.prop('disabled') ) {
  116. if( module.is.disabled() ) {
  117. module.enable();
  118. }
  119. else if( module.is.enabled() && module.can.disable() ) {
  120. module.disable();
  121. }
  122. }
  123. },
  124. setting: function(name, value) {
  125. if( $.isPlainObject(name) ) {
  126. $.extend(true, settings, name);
  127. }
  128. else if(value !== undefined) {
  129. settings[name] = value;
  130. }
  131. else {
  132. return settings[name];
  133. }
  134. },
  135. internal: function(name, value) {
  136. if( $.isPlainObject(name) ) {
  137. $.extend(true, module, name);
  138. }
  139. else if(value !== undefined) {
  140. module[name] = value;
  141. }
  142. else {
  143. return module[name];
  144. }
  145. },
  146. debug: function() {
  147. if(settings.debug) {
  148. if(settings.performance) {
  149. module.performance.log(arguments);
  150. }
  151. else {
  152. module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
  153. module.debug.apply(console, arguments);
  154. }
  155. }
  156. },
  157. verbose: function() {
  158. if(settings.verbose && settings.debug) {
  159. if(settings.performance) {
  160. module.performance.log(arguments);
  161. }
  162. else {
  163. module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
  164. module.verbose.apply(console, arguments);
  165. }
  166. }
  167. },
  168. error: function() {
  169. module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
  170. module.error.apply(console, arguments);
  171. },
  172. performance: {
  173. log: function(message) {
  174. var
  175. currentTime,
  176. executionTime,
  177. previousTime
  178. ;
  179. if(settings.performance) {
  180. currentTime = new Date().getTime();
  181. previousTime = time || currentTime;
  182. executionTime = currentTime - previousTime;
  183. time = currentTime;
  184. performance.push({
  185. 'Element' : element,
  186. 'Name' : message[0],
  187. 'Arguments' : [].slice.call(message, 1) || '',
  188. 'Execution Time' : executionTime
  189. });
  190. }
  191. clearTimeout(module.performance.timer);
  192. module.performance.timer = setTimeout(module.performance.display, 100);
  193. },
  194. display: function() {
  195. var
  196. title = settings.name + ':',
  197. totalTime = 0
  198. ;
  199. time = false;
  200. clearTimeout(module.performance.timer);
  201. $.each(performance, function(index, data) {
  202. totalTime += data['Execution Time'];
  203. });
  204. title += ' ' + totalTime + 'ms';
  205. if(moduleSelector) {
  206. title += ' \'' + moduleSelector + '\'';
  207. }
  208. if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
  209. console.groupCollapsed(title);
  210. if(console.table) {
  211. console.table(performance);
  212. }
  213. else {
  214. $.each(performance, function(index, data) {
  215. console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
  216. });
  217. }
  218. console.groupEnd();
  219. }
  220. performance = [];
  221. }
  222. },
  223. invoke: function(query, passedArguments, context) {
  224. var
  225. object = instance,
  226. maxDepth,
  227. found,
  228. response
  229. ;
  230. passedArguments = passedArguments || queryArguments;
  231. context = element || context;
  232. if(typeof query == 'string' && object !== undefined) {
  233. query = query.split(/[\. ]/);
  234. maxDepth = query.length - 1;
  235. $.each(query, function(depth, value) {
  236. var camelCaseValue = (depth != maxDepth)
  237. ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
  238. : query
  239. ;
  240. if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
  241. object = object[camelCaseValue];
  242. }
  243. else if( object[camelCaseValue] !== undefined ) {
  244. found = object[camelCaseValue];
  245. return false;
  246. }
  247. else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
  248. object = object[value];
  249. }
  250. else if( object[value] !== undefined ) {
  251. found = object[value];
  252. return false;
  253. }
  254. else {
  255. return false;
  256. }
  257. });
  258. }
  259. if ( $.isFunction( found ) ) {
  260. response = found.apply(context, passedArguments);
  261. }
  262. else if(found !== undefined) {
  263. response = found;
  264. }
  265. if($.isArray(returnedValue)) {
  266. returnedValue.push(response);
  267. }
  268. else if(returnedValue !== undefined) {
  269. returnedValue = [returnedValue, response];
  270. }
  271. else if(response !== undefined) {
  272. returnedValue = response;
  273. }
  274. return found;
  275. }
  276. };
  277. if(methodInvoked) {
  278. if(instance === undefined) {
  279. module.initialize();
  280. }
  281. module.invoke(query);
  282. }
  283. else {
  284. if(instance !== undefined) {
  285. module.destroy();
  286. }
  287. module.initialize();
  288. }
  289. })
  290. ;
  291. return (returnedValue !== undefined)
  292. ? returnedValue
  293. : this
  294. ;
  295. };
  296. module.exports.settings = {
  297. name : 'Checkbox',
  298. namespace : 'checkbox',
  299. debug : false,
  300. verbose : true,
  301. performance : true,
  302. // delegated event context
  303. context : false,
  304. required : 'auto',
  305. onChange : function(){},
  306. onEnable : function(){},
  307. onDisable : function(){},
  308. error : {
  309. method : 'The method you called is not defined.'
  310. },
  311. selector : {
  312. input : 'input[type=checkbox], input[type=radio]',
  313. label : 'label'
  314. },
  315. className : {
  316. radio : 'radio'
  317. }
  318. };
  319. })( require("jquery"), window , document );