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.

712 lines
20 KiB

9 years ago
8 years ago
10 years ago
9 years ago
10 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
8 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
10 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
9 years ago
10 years ago
  1. /*!
  2. * # Semantic UI 2.2.0 - Dimmer
  3. * http://github.com/semantic-org/semantic-ui/
  4. *
  5. *
  6. * Copyright 2015 Contributors
  7. * Released under the MIT license
  8. * http://opensource.org/licenses/MIT
  9. *
  10. */
  11. ;(function ($, window, document, undefined) {
  12. "use strict";
  13. window = (typeof window != 'undefined' && window.Math == Math)
  14. ? window
  15. : (typeof self != 'undefined' && self.Math == Math)
  16. ? self
  17. : Function('return this')()
  18. ;
  19. $.fn.dimmer = function(parameters) {
  20. var
  21. $allModules = $(this),
  22. time = new Date().getTime(),
  23. performance = [],
  24. query = arguments[0],
  25. methodInvoked = (typeof query == 'string'),
  26. queryArguments = [].slice.call(arguments, 1),
  27. returnedValue
  28. ;
  29. $allModules
  30. .each(function() {
  31. var
  32. settings = ( $.isPlainObject(parameters) )
  33. ? $.extend(true, {}, $.fn.dimmer.settings, parameters)
  34. : $.extend({}, $.fn.dimmer.settings),
  35. selector = settings.selector,
  36. namespace = settings.namespace,
  37. className = settings.className,
  38. error = settings.error,
  39. eventNamespace = '.' + namespace,
  40. moduleNamespace = 'module-' + namespace,
  41. moduleSelector = $allModules.selector || '',
  42. clickEvent = ('ontouchstart' in document.documentElement)
  43. ? 'touchstart'
  44. : 'click',
  45. $module = $(this),
  46. $dimmer,
  47. $dimmable,
  48. element = this,
  49. instance = $module.data(moduleNamespace),
  50. module
  51. ;
  52. module = {
  53. preinitialize: function() {
  54. if( module.is.dimmer() ) {
  55. $dimmable = $module.parent();
  56. $dimmer = $module;
  57. }
  58. else {
  59. $dimmable = $module;
  60. if( module.has.dimmer() ) {
  61. if(settings.dimmerName) {
  62. $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);
  63. }
  64. else {
  65. $dimmer = $dimmable.find(selector.dimmer);
  66. }
  67. }
  68. else {
  69. $dimmer = module.create();
  70. }
  71. }
  72. },
  73. initialize: function() {
  74. module.debug('Initializing dimmer', settings);
  75. module.bind.events();
  76. module.set.dimmable();
  77. module.instantiate();
  78. },
  79. instantiate: function() {
  80. module.verbose('Storing instance of module', module);
  81. instance = module;
  82. $module
  83. .data(moduleNamespace, instance)
  84. ;
  85. },
  86. destroy: function() {
  87. module.verbose('Destroying previous module', $dimmer);
  88. module.unbind.events();
  89. module.remove.variation();
  90. $dimmable
  91. .off(eventNamespace)
  92. ;
  93. },
  94. bind: {
  95. events: function() {
  96. if(settings.on == 'hover') {
  97. $dimmable
  98. .on('mouseenter' + eventNamespace, module.show)
  99. .on('mouseleave' + eventNamespace, module.hide)
  100. ;
  101. }
  102. else if(settings.on == 'click') {
  103. $dimmable
  104. .on(clickEvent + eventNamespace, module.toggle)
  105. ;
  106. }
  107. if( module.is.page() ) {
  108. module.debug('Setting as a page dimmer', $dimmable);
  109. module.set.pageDimmer();
  110. }
  111. if( module.is.closable() ) {
  112. module.verbose('Adding dimmer close event', $dimmer);
  113. $dimmable
  114. .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)
  115. ;
  116. }
  117. }
  118. },
  119. unbind: {
  120. events: function() {
  121. $module
  122. .removeData(moduleNamespace)
  123. ;
  124. $dimmable
  125. .off(eventNamespace)
  126. ;
  127. }
  128. },
  129. event: {
  130. click: function(event) {
  131. module.verbose('Determining if event occured on dimmer', event);
  132. if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {
  133. module.hide();
  134. event.stopImmediatePropagation();
  135. }
  136. }
  137. },
  138. addContent: function(element) {
  139. var
  140. $content = $(element)
  141. ;
  142. module.debug('Add content to dimmer', $content);
  143. if($content.parent()[0] !== $dimmer[0]) {
  144. $content.detach().appendTo($dimmer);
  145. }
  146. },
  147. create: function() {
  148. var
  149. $element = $( settings.template.dimmer() )
  150. ;
  151. if(settings.variation) {
  152. module.debug('Creating dimmer with variation', settings.variation);
  153. $element.addClass(settings.variation);
  154. }
  155. if(settings.dimmerName) {
  156. module.debug('Creating named dimmer', settings.dimmerName);
  157. $element.addClass(settings.dimmerName);
  158. }
  159. $element
  160. .appendTo($dimmable)
  161. ;
  162. return $element;
  163. },
  164. show: function(callback) {
  165. callback = $.isFunction(callback)
  166. ? callback
  167. : function(){}
  168. ;
  169. module.debug('Showing dimmer', $dimmer, settings);
  170. if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
  171. module.animate.show(callback);
  172. settings.onShow.call(element);
  173. settings.onChange.call(element);
  174. }
  175. else {
  176. module.debug('Dimmer is already shown or disabled');
  177. }
  178. },
  179. hide: function(callback) {
  180. callback = $.isFunction(callback)
  181. ? callback
  182. : function(){}
  183. ;
  184. if( module.is.dimmed() || module.is.animating() ) {
  185. module.debug('Hiding dimmer', $dimmer);
  186. module.animate.hide(callback);
  187. settings.onHide.call(element);
  188. settings.onChange.call(element);
  189. }
  190. else {
  191. module.debug('Dimmer is not visible');
  192. }
  193. },
  194. toggle: function() {
  195. module.verbose('Toggling dimmer visibility', $dimmer);
  196. if( !module.is.dimmed() ) {
  197. module.show();
  198. }
  199. else {
  200. module.hide();
  201. }
  202. },
  203. animate: {
  204. show: function(callback) {
  205. callback = $.isFunction(callback)
  206. ? callback
  207. : function(){}
  208. ;
  209. if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
  210. if(settings.opacity !== 'auto') {
  211. module.set.opacity();
  212. }
  213. $dimmer
  214. .transition({
  215. animation : settings.transition + ' in',
  216. queue : false,
  217. duration : module.get.duration(),
  218. useFailSafe : true,
  219. onStart : function() {
  220. module.set.dimmed();
  221. },
  222. onComplete : function() {
  223. module.set.active();
  224. callback();
  225. }
  226. })
  227. ;
  228. }
  229. else {
  230. module.verbose('Showing dimmer animation with javascript');
  231. module.set.dimmed();
  232. if(settings.opacity == 'auto') {
  233. settings.opacity = 0.8;
  234. }
  235. $dimmer
  236. .stop()
  237. .css({
  238. opacity : 0,
  239. width : '100%',
  240. height : '100%'
  241. })
  242. .fadeTo(module.get.duration(), settings.opacity, function() {
  243. $dimmer.removeAttr('style');
  244. module.set.active();
  245. callback();
  246. })
  247. ;
  248. }
  249. },
  250. hide: function(callback) {
  251. callback = $.isFunction(callback)
  252. ? callback
  253. : function(){}
  254. ;
  255. if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
  256. module.verbose('Hiding dimmer with css');
  257. $dimmer
  258. .transition({
  259. animation : settings.transition + ' out',
  260. queue : false,
  261. duration : module.get.duration(),
  262. useFailSafe : true,
  263. onStart : function() {
  264. module.remove.dimmed();
  265. },
  266. onComplete : function() {
  267. module.remove.active();
  268. callback();
  269. }
  270. })
  271. ;
  272. }
  273. else {
  274. module.verbose('Hiding dimmer with javascript');
  275. module.remove.dimmed();
  276. $dimmer
  277. .stop()
  278. .fadeOut(module.get.duration(), function() {
  279. module.remove.active();
  280. $dimmer.removeAttr('style');
  281. callback();
  282. })
  283. ;
  284. }
  285. }
  286. },
  287. get: {
  288. dimmer: function() {
  289. return $dimmer;
  290. },
  291. duration: function() {
  292. if(typeof settings.duration == 'object') {
  293. if( module.is.active() ) {
  294. return settings.duration.hide;
  295. }
  296. else {
  297. return settings.duration.show;
  298. }
  299. }
  300. return settings.duration;
  301. }
  302. },
  303. has: {
  304. dimmer: function() {
  305. if(settings.dimmerName) {
  306. return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);
  307. }
  308. else {
  309. return ( $module.find(selector.dimmer).length > 0 );
  310. }
  311. }
  312. },
  313. is: {
  314. active: function() {
  315. return $dimmer.hasClass(className.active);
  316. },
  317. animating: function() {
  318. return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );
  319. },
  320. closable: function() {
  321. if(settings.closable == 'auto') {
  322. if(settings.on == 'hover') {
  323. return false;
  324. }
  325. return true;
  326. }
  327. return settings.closable;
  328. },
  329. dimmer: function() {
  330. return $module.hasClass(className.dimmer);
  331. },
  332. dimmable: function() {
  333. return $module.hasClass(className.dimmable);
  334. },
  335. dimmed: function() {
  336. return $dimmable.hasClass(className.dimmed);
  337. },
  338. disabled: function() {
  339. return $dimmable.hasClass(className.disabled);
  340. },
  341. enabled: function() {
  342. return !module.is.disabled();
  343. },
  344. page: function () {
  345. return $dimmable.is('body');
  346. },
  347. pageDimmer: function() {
  348. return $dimmer.hasClass(className.pageDimmer);
  349. }
  350. },
  351. can: {
  352. show: function() {
  353. return !$dimmer.hasClass(className.disabled);
  354. }
  355. },
  356. set: {
  357. opacity: function(opacity) {
  358. var
  359. color = $dimmer.css('background-color'),
  360. colorArray = color.split(','),
  361. isRGB = (colorArray && colorArray.length == 3),
  362. isRGBA = (colorArray && colorArray.length == 4)
  363. ;
  364. opacity = settings.opacity === 0 ? 0 : settings.opacity || opacity;
  365. if(isRGB || isRGBA) {
  366. colorArray[3] = opacity + ')';
  367. color = colorArray.join(',');
  368. }
  369. else {
  370. color = 'rgba(0, 0, 0, ' + opacity + ')';
  371. }
  372. module.debug('Setting opacity to', opacity);
  373. $dimmer.css('background-color', color);
  374. },
  375. active: function() {
  376. $dimmer.addClass(className.active);
  377. },
  378. dimmable: function() {
  379. $dimmable.addClass(className.dimmable);
  380. },
  381. dimmed: function() {
  382. $dimmable.addClass(className.dimmed);
  383. },
  384. pageDimmer: function() {
  385. $dimmer.addClass(className.pageDimmer);
  386. },
  387. disabled: function() {
  388. $dimmer.addClass(className.disabled);
  389. },
  390. variation: function(variation) {
  391. variation = variation || settings.variation;
  392. if(variation) {
  393. $dimmer.addClass(variation);
  394. }
  395. }
  396. },
  397. remove: {
  398. active: function() {
  399. $dimmer
  400. .removeClass(className.active)
  401. ;
  402. },
  403. dimmed: function() {
  404. $dimmable.removeClass(className.dimmed);
  405. },
  406. disabled: function() {
  407. $dimmer.removeClass(className.disabled);
  408. },
  409. variation: function(variation) {
  410. variation = variation || settings.variation;
  411. if(variation) {
  412. $dimmer.removeClass(variation);
  413. }
  414. }
  415. },
  416. setting: function(name, value) {
  417. module.debug('Changing setting', name, value);
  418. if( $.isPlainObject(name) ) {
  419. $.extend(true, settings, name);
  420. }
  421. else if(value !== undefined) {
  422. if($.isPlainObject(settings[name])) {
  423. $.extend(true, settings[name], value);
  424. }
  425. else {
  426. settings[name] = value;
  427. }
  428. }
  429. else {
  430. return settings[name];
  431. }
  432. },
  433. internal: function(name, value) {
  434. if( $.isPlainObject(name) ) {
  435. $.extend(true, module, name);
  436. }
  437. else if(value !== undefined) {
  438. module[name] = value;
  439. }
  440. else {
  441. return module[name];
  442. }
  443. },
  444. debug: function() {
  445. if(!settings.silent && settings.debug) {
  446. if(settings.performance) {
  447. module.performance.log(arguments);
  448. }
  449. else {
  450. module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
  451. module.debug.apply(console, arguments);
  452. }
  453. }
  454. },
  455. verbose: function() {
  456. if(!settings.silent && settings.verbose && settings.debug) {
  457. if(settings.performance) {
  458. module.performance.log(arguments);
  459. }
  460. else {
  461. module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
  462. module.verbose.apply(console, arguments);
  463. }
  464. }
  465. },
  466. error: function() {
  467. if(!settings.silent) {
  468. module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
  469. module.error.apply(console, arguments);
  470. }
  471. },
  472. performance: {
  473. log: function(message) {
  474. var
  475. currentTime,
  476. executionTime,
  477. previousTime
  478. ;
  479. if(settings.performance) {
  480. currentTime = new Date().getTime();
  481. previousTime = time || currentTime;
  482. executionTime = currentTime - previousTime;
  483. time = currentTime;
  484. performance.push({
  485. 'Name' : message[0],
  486. 'Arguments' : [].slice.call(message, 1) || '',
  487. 'Element' : element,
  488. 'Execution Time' : executionTime
  489. });
  490. }
  491. clearTimeout(module.performance.timer);
  492. module.performance.timer = setTimeout(module.performance.display, 500);
  493. },
  494. display: function() {
  495. var
  496. title = settings.name + ':',
  497. totalTime = 0
  498. ;
  499. time = false;
  500. clearTimeout(module.performance.timer);
  501. $.each(performance, function(index, data) {
  502. totalTime += data['Execution Time'];
  503. });
  504. title += ' ' + totalTime + 'ms';
  505. if(moduleSelector) {
  506. title += ' \'' + moduleSelector + '\'';
  507. }
  508. if($allModules.length > 1) {
  509. title += ' ' + '(' + $allModules.length + ')';
  510. }
  511. if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
  512. console.groupCollapsed(title);
  513. if(console.table) {
  514. console.table(performance);
  515. }
  516. else {
  517. $.each(performance, function(index, data) {
  518. console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
  519. });
  520. }
  521. console.groupEnd();
  522. }
  523. performance = [];
  524. }
  525. },
  526. invoke: function(query, passedArguments, context) {
  527. var
  528. object = instance,
  529. maxDepth,
  530. found,
  531. response
  532. ;
  533. passedArguments = passedArguments || queryArguments;
  534. context = element || context;
  535. if(typeof query == 'string' && object !== undefined) {
  536. query = query.split(/[\. ]/);
  537. maxDepth = query.length - 1;
  538. $.each(query, function(depth, value) {
  539. var camelCaseValue = (depth != maxDepth)
  540. ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
  541. : query
  542. ;
  543. if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
  544. object = object[camelCaseValue];
  545. }
  546. else if( object[camelCaseValue] !== undefined ) {
  547. found = object[camelCaseValue];
  548. return false;
  549. }
  550. else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
  551. object = object[value];
  552. }
  553. else if( object[value] !== undefined ) {
  554. found = object[value];
  555. return false;
  556. }
  557. else {
  558. module.error(error.method, query);
  559. return false;
  560. }
  561. });
  562. }
  563. if ( $.isFunction( found ) ) {
  564. response = found.apply(context, passedArguments);
  565. }
  566. else if(found !== undefined) {
  567. response = found;
  568. }
  569. if($.isArray(returnedValue)) {
  570. returnedValue.push(response);
  571. }
  572. else if(returnedValue !== undefined) {
  573. returnedValue = [returnedValue, response];
  574. }
  575. else if(response !== undefined) {
  576. returnedValue = response;
  577. }
  578. return found;
  579. }
  580. };
  581. module.preinitialize();
  582. if(methodInvoked) {
  583. if(instance === undefined) {
  584. module.initialize();
  585. }
  586. module.invoke(query);
  587. }
  588. else {
  589. if(instance !== undefined) {
  590. instance.invoke('destroy');
  591. }
  592. module.initialize();
  593. }
  594. })
  595. ;
  596. return (returnedValue !== undefined)
  597. ? returnedValue
  598. : this
  599. ;
  600. };
  601. $.fn.dimmer.settings = {
  602. name : 'Dimmer',
  603. namespace : 'dimmer',
  604. silent : false,
  605. debug : false,
  606. verbose : false,
  607. performance : true,
  608. // name to distinguish between multiple dimmers in context
  609. dimmerName : false,
  610. // whether to add a variation type
  611. variation : false,
  612. // whether to bind close events
  613. closable : 'auto',
  614. // whether to use css animations
  615. useCSS : true,
  616. // css animation to use
  617. transition : 'fade',
  618. // event to bind to
  619. on : false,
  620. // overriding opacity value
  621. opacity : 'auto',
  622. // transition durations
  623. duration : {
  624. show : 500,
  625. hide : 500
  626. },
  627. onChange : function(){},
  628. onShow : function(){},
  629. onHide : function(){},
  630. error : {
  631. method : 'The method you called is not defined.'
  632. },
  633. className : {
  634. active : 'active',
  635. animating : 'animating',
  636. dimmable : 'dimmable',
  637. dimmed : 'dimmed',
  638. dimmer : 'dimmer',
  639. disabled : 'disabled',
  640. hide : 'hide',
  641. pageDimmer : 'page',
  642. show : 'show'
  643. },
  644. selector: {
  645. dimmer : '> .ui.dimmer',
  646. content : '.ui.dimmer > .content, .ui.dimmer > .content > .center'
  647. },
  648. template: {
  649. dimmer: function() {
  650. return $('<div />').attr('class', 'ui dimmer');
  651. }
  652. }
  653. };
  654. })( jQuery, window, document );