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.

1022 lines
32 KiB

  1. /*!
  2. * # Semantic UI 2.1.6 - Sidebar
  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. $.fn.sidebar = function(parameters) {
  14. var
  15. $allModules = $(this),
  16. $window = $(window),
  17. $document = $(document),
  18. $html = $('html'),
  19. $head = $('head'),
  20. moduleSelector = $allModules.selector || '',
  21. time = new Date().getTime(),
  22. performance = [],
  23. query = arguments[0],
  24. methodInvoked = (typeof query == 'string'),
  25. queryArguments = [].slice.call(arguments, 1),
  26. requestAnimationFrame = window.requestAnimationFrame
  27. || window.mozRequestAnimationFrame
  28. || window.webkitRequestAnimationFrame
  29. || window.msRequestAnimationFrame
  30. || function(callback) { setTimeout(callback, 0); },
  31. returnedValue
  32. ;
  33. $allModules
  34. .each(function() {
  35. var
  36. settings = ( $.isPlainObject(parameters) )
  37. ? $.extend(true, {}, $.fn.sidebar.settings, parameters)
  38. : $.extend({}, $.fn.sidebar.settings),
  39. selector = settings.selector,
  40. className = settings.className,
  41. namespace = settings.namespace,
  42. regExp = settings.regExp,
  43. error = settings.error,
  44. eventNamespace = '.' + namespace,
  45. moduleNamespace = 'module-' + namespace,
  46. $module = $(this),
  47. $context = $(settings.context),
  48. $sidebars = $module.children(selector.sidebar),
  49. $fixed = $context.children(selector.fixed),
  50. $pusher = $context.children(selector.pusher),
  51. $style,
  52. element = this,
  53. instance = $module.data(moduleNamespace),
  54. elementNamespace,
  55. id,
  56. currentScroll,
  57. transitionEvent,
  58. module
  59. ;
  60. module = {
  61. initialize: function() {
  62. module.debug('Initializing sidebar', parameters);
  63. module.create.id();
  64. transitionEvent = module.get.transitionEvent();
  65. if(module.is.ios()) {
  66. module.set.ios();
  67. }
  68. // avoids locking rendering if initialized in onReady
  69. if(settings.delaySetup) {
  70. requestAnimationFrame(module.setup.layout);
  71. }
  72. else {
  73. module.setup.layout();
  74. }
  75. requestAnimationFrame(function() {
  76. module.setup.cache();
  77. });
  78. module.instantiate();
  79. },
  80. instantiate: function() {
  81. module.verbose('Storing instance of module', module);
  82. instance = module;
  83. $module
  84. .data(moduleNamespace, module)
  85. ;
  86. },
  87. create: {
  88. id: function() {
  89. id = (Math.random().toString(16) + '000000000').substr(2,8);
  90. elementNamespace = '.' + id;
  91. module.verbose('Creating unique id for element', id);
  92. }
  93. },
  94. destroy: function() {
  95. module.verbose('Destroying previous module for', $module);
  96. $module
  97. .off(eventNamespace)
  98. .removeData(moduleNamespace)
  99. ;
  100. if(module.is.ios()) {
  101. module.remove.ios();
  102. }
  103. // bound by uuid
  104. $context.off(elementNamespace);
  105. $window.off(elementNamespace);
  106. $document.off(elementNamespace);
  107. },
  108. event: {
  109. clickaway: function(event) {
  110. var
  111. clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),
  112. clickedContext = ($context.is(event.target))
  113. ;
  114. if(clickedInPusher) {
  115. module.verbose('User clicked on dimmed page');
  116. module.hide();
  117. }
  118. if(clickedContext) {
  119. module.verbose('User clicked on dimmable context (scaled out page)');
  120. module.hide();
  121. }
  122. },
  123. touch: function(event) {
  124. //event.stopPropagation();
  125. },
  126. containScroll: function(event) {
  127. if(element.scrollTop <= 0) {
  128. element.scrollTop = 1;
  129. }
  130. if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {
  131. element.scrollTop = element.scrollHeight - element.offsetHeight - 1;
  132. }
  133. },
  134. scroll: function(event) {
  135. if( $(event.target).closest(selector.sidebar).length === 0 ) {
  136. event.preventDefault();
  137. }
  138. }
  139. },
  140. bind: {
  141. clickaway: function() {
  142. module.verbose('Adding clickaway events to context', $context);
  143. if(settings.closable) {
  144. $context
  145. .on('click' + elementNamespace, module.event.clickaway)
  146. .on('touchend' + elementNamespace, module.event.clickaway)
  147. ;
  148. }
  149. },
  150. scrollLock: function() {
  151. if(settings.scrollLock) {
  152. module.debug('Disabling page scroll');
  153. $window
  154. .on('DOMMouseScroll' + elementNamespace, module.event.scroll)
  155. ;
  156. }
  157. module.verbose('Adding events to contain sidebar scroll');
  158. $document
  159. .on('touchmove' + elementNamespace, module.event.touch)
  160. ;
  161. $module
  162. .on('scroll' + eventNamespace, module.event.containScroll)
  163. ;
  164. }
  165. },
  166. unbind: {
  167. clickaway: function() {
  168. module.verbose('Removing clickaway events from context', $context);
  169. $context.off(elementNamespace);
  170. },
  171. scrollLock: function() {
  172. module.verbose('Removing scroll lock from page');
  173. $document.off(elementNamespace);
  174. $window.off(elementNamespace);
  175. $module.off('scroll' + eventNamespace);
  176. }
  177. },
  178. add: {
  179. inlineCSS: function() {
  180. var
  181. width = module.cache.width || $module.outerWidth(),
  182. height = module.cache.height || $module.outerHeight(),
  183. isRTL = module.is.rtl(),
  184. direction = module.get.direction(),
  185. distance = {
  186. left : width,
  187. right : -width,
  188. top : height,
  189. bottom : -height
  190. },
  191. style
  192. ;
  193. if(isRTL){
  194. module.verbose('RTL detected, flipping widths');
  195. distance.left = -width;
  196. distance.right = width;
  197. }
  198. style = '<style>';
  199. if(direction === 'left' || direction === 'right') {
  200. module.debug('Adding CSS rules for animation distance', width);
  201. style += ''
  202. + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'
  203. + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'
  204. + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
  205. + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
  206. + ' }'
  207. ;
  208. }
  209. else if(direction === 'top' || direction == 'bottom') {
  210. style += ''
  211. + ' .ui.visible.' + direction + '.sidebar ~ .fixed,'
  212. + ' .ui.visible.' + direction + '.sidebar ~ .pusher {'
  213. + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
  214. + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
  215. + ' }'
  216. ;
  217. }
  218. /* IE is only browser not to create context with transforms */
  219. /* https://www.w3.org/Bugs/Public/show_bug.cgi?id=16328 */
  220. if( module.is.ie() ) {
  221. if(direction === 'left' || direction === 'right') {
  222. module.debug('Adding CSS rules for animation distance', width);
  223. style += ''
  224. + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
  225. + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
  226. + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
  227. + ' }'
  228. ;
  229. }
  230. else if(direction === 'top' || direction == 'bottom') {
  231. style += ''
  232. + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
  233. + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
  234. + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
  235. + ' }'
  236. ;
  237. }
  238. /* opposite sides visible forces content overlay */
  239. style += ''
  240. + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher:after,'
  241. + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher:after {'
  242. + ' -webkit-transform: translate3d(0px, 0, 0);'
  243. + ' transform: translate3d(0px, 0, 0);'
  244. + ' }'
  245. ;
  246. }
  247. style += '</style>';
  248. $style = $(style)
  249. .appendTo($head)
  250. ;
  251. module.debug('Adding sizing css to head', $style);
  252. }
  253. },
  254. refresh: function() {
  255. module.verbose('Refreshing selector cache');
  256. $context = $(settings.context);
  257. $sidebars = $context.children(selector.sidebar);
  258. $pusher = $context.children(selector.pusher);
  259. $fixed = $context.children(selector.fixed);
  260. module.clear.cache();
  261. },
  262. refreshSidebars: function() {
  263. module.verbose('Refreshing other sidebars');
  264. $sidebars = $context.children(selector.sidebar);
  265. },
  266. repaint: function() {
  267. module.verbose('Forcing repaint event');
  268. element.style.display = 'none';
  269. var ignored = element.offsetHeight;
  270. element.scrollTop = element.scrollTop;
  271. element.style.display = '';
  272. },
  273. setup: {
  274. cache: function() {
  275. module.cache = {
  276. width : $module.outerWidth(),
  277. height : $module.outerHeight(),
  278. rtl : ($module.css('direction') == 'rtl')
  279. };
  280. },
  281. layout: function() {
  282. if( $context.children(selector.pusher).length === 0 ) {
  283. module.debug('Adding wrapper element for sidebar');
  284. module.error(error.pusher);
  285. $pusher = $('<div class="pusher" />');
  286. $context
  287. .children()
  288. .not(selector.omitted)
  289. .not($sidebars)
  290. .wrapAll($pusher)
  291. ;
  292. module.refresh();
  293. }
  294. if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {
  295. module.debug('Moved sidebar to correct parent element');
  296. module.error(error.movedSidebar, element);
  297. $module.detach().prependTo($context);
  298. module.refresh();
  299. }
  300. module.clear.cache();
  301. module.set.pushable();
  302. module.set.direction();
  303. }
  304. },
  305. attachEvents: function(selector, event) {
  306. var
  307. $toggle = $(selector)
  308. ;
  309. event = $.isFunction(module[event])
  310. ? module[event]
  311. : module.toggle
  312. ;
  313. if($toggle.length > 0) {
  314. module.debug('Attaching sidebar events to element', selector, event);
  315. $toggle
  316. .on('click' + eventNamespace, event)
  317. ;
  318. }
  319. else {
  320. module.error(error.notFound, selector);
  321. }
  322. },
  323. show: function(callback) {
  324. callback = $.isFunction(callback)
  325. ? callback
  326. : function(){}
  327. ;
  328. if(module.is.hidden()) {
  329. module.refreshSidebars();
  330. if(settings.overlay) {
  331. module.error(error.overlay);
  332. settings.transition = 'overlay';
  333. }
  334. module.refresh();
  335. if(module.othersActive()) {
  336. module.debug('Other sidebars currently visible');
  337. if(settings.exclusive) {
  338. // if not overlay queue animation after hide
  339. if(settings.transition != 'overlay') {
  340. module.hideOthers(module.show);
  341. return;
  342. }
  343. else {
  344. module.hideOthers();
  345. }
  346. }
  347. else {
  348. settings.transition = 'overlay';
  349. }
  350. }
  351. module.pushPage(function() {
  352. callback.call(element);
  353. settings.onShow.call(element);
  354. });
  355. settings.onChange.call(element);
  356. settings.onVisible.call(element);
  357. }
  358. else {
  359. module.debug('Sidebar is already visible');
  360. }
  361. },
  362. hide: function(callback) {
  363. callback = $.isFunction(callback)
  364. ? callback
  365. : function(){}
  366. ;
  367. if(module.is.visible() || module.is.animating()) {
  368. module.debug('Hiding sidebar', callback);
  369. module.refreshSidebars();
  370. module.pullPage(function() {
  371. callback.call(element);
  372. settings.onHidden.call(element);
  373. });
  374. settings.onChange.call(element);
  375. settings.onHide.call(element);
  376. }
  377. },
  378. othersAnimating: function() {
  379. return ($sidebars.not($module).filter('.' + className.animating).length > 0);
  380. },
  381. othersVisible: function() {
  382. return ($sidebars.not($module).filter('.' + className.visible).length > 0);
  383. },
  384. othersActive: function() {
  385. return(module.othersVisible() || module.othersAnimating());
  386. },
  387. hideOthers: function(callback) {
  388. var
  389. $otherSidebars = $sidebars.not($module).filter('.' + className.visible),
  390. sidebarCount = $otherSidebars.length,
  391. callbackCount = 0
  392. ;
  393. callback = callback || function(){};
  394. $otherSidebars
  395. .sidebar('hide', function() {
  396. callbackCount++;
  397. if(callbackCount == sidebarCount) {
  398. callback();
  399. }
  400. })
  401. ;
  402. },
  403. toggle: function() {
  404. module.verbose('Determining toggled direction');
  405. if(module.is.hidden()) {
  406. module.show();
  407. }
  408. else {
  409. module.hide();
  410. }
  411. },
  412. pushPage: function(callback) {
  413. var
  414. transition = module.get.transition(),
  415. $transition = (transition === 'overlay' || module.othersActive())
  416. ? $module
  417. : $pusher,
  418. animate,
  419. dim,
  420. transitionEnd
  421. ;
  422. callback = $.isFunction(callback)
  423. ? callback
  424. : function(){}
  425. ;
  426. if(settings.transition == 'scale down') {
  427. module.scrollToTop();
  428. }
  429. module.set.transition(transition);
  430. module.repaint();
  431. animate = function() {
  432. module.bind.clickaway();
  433. module.add.inlineCSS();
  434. module.set.animating();
  435. module.set.visible();
  436. };
  437. dim = function() {
  438. module.set.dimmed();
  439. };
  440. transitionEnd = function(event) {
  441. if( event.target == $transition[0] ) {
  442. $transition.off(transitionEvent + elementNamespace, transitionEnd);
  443. module.remove.animating();
  444. module.bind.scrollLock();
  445. callback.call(element);
  446. }
  447. };
  448. $transition.off(transitionEvent + elementNamespace);
  449. $transition.on(transitionEvent + elementNamespace, transitionEnd);
  450. requestAnimationFrame(animate);
  451. if(settings.dimPage && !module.othersVisible()) {
  452. requestAnimationFrame(dim);
  453. }
  454. },
  455. pullPage: function(callback) {
  456. var
  457. transition = module.get.transition(),
  458. $transition = (transition == 'overlay' || module.othersActive())
  459. ? $module
  460. : $pusher,
  461. animate,
  462. transitionEnd
  463. ;
  464. callback = $.isFunction(callback)
  465. ? callback
  466. : function(){}
  467. ;
  468. module.verbose('Removing context push state', module.get.direction());
  469. module.unbind.clickaway();
  470. module.unbind.scrollLock();
  471. animate = function() {
  472. module.set.transition(transition);
  473. module.set.animating();
  474. module.remove.visible();
  475. if(settings.dimPage && !module.othersVisible()) {
  476. $pusher.removeClass(className.dimmed);
  477. }
  478. };
  479. transitionEnd = function(event) {
  480. if( event.target == $transition[0] ) {
  481. $transition.off(transitionEvent + elementNamespace, transitionEnd);
  482. module.remove.animating();
  483. module.remove.transition();
  484. module.remove.inlineCSS();
  485. if(transition == 'scale down' || (settings.returnScroll && module.is.mobile()) ) {
  486. module.scrollBack();
  487. }
  488. callback.call(element);
  489. }
  490. };
  491. $transition.off(transitionEvent + elementNamespace);
  492. $transition.on(transitionEvent + elementNamespace, transitionEnd);
  493. requestAnimationFrame(animate);
  494. },
  495. scrollToTop: function() {
  496. module.verbose('Scrolling to top of page to avoid animation issues');
  497. currentScroll = $(window).scrollTop();
  498. $module.scrollTop(0);
  499. window.scrollTo(0, 0);
  500. },
  501. scrollBack: function() {
  502. module.verbose('Scrolling back to original page position');
  503. window.scrollTo(0, currentScroll);
  504. },
  505. clear: {
  506. cache: function() {
  507. module.verbose('Clearing cached dimensions');
  508. module.cache = {};
  509. }
  510. },
  511. set: {
  512. // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios
  513. ios: function() {
  514. $html.addClass(className.ios);
  515. },
  516. // container
  517. pushed: function() {
  518. $context.addClass(className.pushed);
  519. },
  520. pushable: function() {
  521. $context.addClass(className.pushable);
  522. },
  523. // pusher
  524. dimmed: function() {
  525. $pusher.addClass(className.dimmed);
  526. },
  527. // sidebar
  528. active: function() {
  529. $module.addClass(className.active);
  530. },
  531. animating: function() {
  532. $module.addClass(className.animating);
  533. },
  534. transition: function(transition) {
  535. transition = transition || module.get.transition();
  536. $module.addClass(transition);
  537. },
  538. direction: function(direction) {
  539. direction = direction || module.get.direction();
  540. $module.addClass(className[direction]);
  541. },
  542. visible: function() {
  543. $module.addClass(className.visible);
  544. },
  545. overlay: function() {
  546. $module.addClass(className.overlay);
  547. }
  548. },
  549. remove: {
  550. inlineCSS: function() {
  551. module.debug('Removing inline css styles', $style);
  552. if($style && $style.length > 0) {
  553. $style.remove();
  554. }
  555. },
  556. // ios scroll on html not document
  557. ios: function() {
  558. $html.removeClass(className.ios);
  559. },
  560. // context
  561. pushed: function() {
  562. $context.removeClass(className.pushed);
  563. },
  564. pushable: function() {
  565. $context.removeClass(className.pushable);
  566. },
  567. // sidebar
  568. active: function() {
  569. $module.removeClass(className.active);
  570. },
  571. animating: function() {
  572. $module.removeClass(className.animating);
  573. },
  574. transition: function(transition) {
  575. transition = transition || module.get.transition();
  576. $module.removeClass(transition);
  577. },
  578. direction: function(direction) {
  579. direction = direction || module.get.direction();
  580. $module.removeClass(className[direction]);
  581. },
  582. visible: function() {
  583. $module.removeClass(className.visible);
  584. },
  585. overlay: function() {
  586. $module.removeClass(className.overlay);
  587. }
  588. },
  589. get: {
  590. direction: function() {
  591. if($module.hasClass(className.top)) {
  592. return className.top;
  593. }
  594. else if($module.hasClass(className.right)) {
  595. return className.right;
  596. }
  597. else if($module.hasClass(className.bottom)) {
  598. return className.bottom;
  599. }
  600. return className.left;
  601. },
  602. transition: function() {
  603. var
  604. direction = module.get.direction(),
  605. transition
  606. ;
  607. transition = ( module.is.mobile() )
  608. ? (settings.mobileTransition == 'auto')
  609. ? settings.defaultTransition.mobile[direction]
  610. : settings.mobileTransition
  611. : (settings.transition == 'auto')
  612. ? settings.defaultTransition.computer[direction]
  613. : settings.transition
  614. ;
  615. module.verbose('Determined transition', transition);
  616. return transition;
  617. },
  618. transitionEvent: function() {
  619. var
  620. element = document.createElement('element'),
  621. transitions = {
  622. 'transition' :'transitionend',
  623. 'OTransition' :'oTransitionEnd',
  624. 'MozTransition' :'transitionend',
  625. 'WebkitTransition' :'webkitTransitionEnd'
  626. },
  627. transition
  628. ;
  629. for(transition in transitions){
  630. if( element.style[transition] !== undefined ){
  631. return transitions[transition];
  632. }
  633. }
  634. }
  635. },
  636. is: {
  637. ie: function() {
  638. var
  639. isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
  640. isIE = ('ActiveXObject' in window)
  641. ;
  642. return (isIE11 || isIE);
  643. },
  644. ios: function() {
  645. var
  646. userAgent = navigator.userAgent,
  647. isIOS = userAgent.match(regExp.ios),
  648. isMobileChrome = userAgent.match(regExp.mobileChrome)
  649. ;
  650. if(isIOS && !isMobileChrome) {
  651. module.verbose('Browser was found to be iOS', userAgent);
  652. return true;
  653. }
  654. else {
  655. return false;
  656. }
  657. },
  658. mobile: function() {
  659. var
  660. userAgent = navigator.userAgent,
  661. isMobile = userAgent.match(regExp.mobile)
  662. ;
  663. if(isMobile) {
  664. module.verbose('Browser was found to be mobile', userAgent);
  665. return true;
  666. }
  667. else {
  668. module.verbose('Browser is not mobile, using regular transition', userAgent);
  669. return false;
  670. }
  671. },
  672. hidden: function() {
  673. return !module.is.visible();
  674. },
  675. visible: function() {
  676. return $module.hasClass(className.visible);
  677. },
  678. // alias
  679. open: function() {
  680. return module.is.visible();
  681. },
  682. closed: function() {
  683. return module.is.hidden();
  684. },
  685. vertical: function() {
  686. return $module.hasClass(className.top);
  687. },
  688. animating: function() {
  689. return $context.hasClass(className.animating);
  690. },
  691. rtl: function () {
  692. if(module.cache.rtl === undefined) {
  693. module.cache.rtl = ($module.css('direction') == 'rtl');
  694. }
  695. return module.cache.rtl;
  696. }
  697. },
  698. setting: function(name, value) {
  699. module.debug('Changing setting', name, value);
  700. if( $.isPlainObject(name) ) {
  701. $.extend(true, settings, name);
  702. }
  703. else if(value !== undefined) {
  704. settings[name] = value;
  705. }
  706. else {
  707. return settings[name];
  708. }
  709. },
  710. internal: function(name, value) {
  711. if( $.isPlainObject(name) ) {
  712. $.extend(true, module, name);
  713. }
  714. else if(value !== undefined) {
  715. module[name] = value;
  716. }
  717. else {
  718. return module[name];
  719. }
  720. },
  721. debug: function() {
  722. if(settings.debug) {
  723. if(settings.performance) {
  724. module.performance.log(arguments);
  725. }
  726. else {
  727. module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
  728. module.debug.apply(console, arguments);
  729. }
  730. }
  731. },
  732. verbose: function() {
  733. if(settings.verbose && settings.debug) {
  734. if(settings.performance) {
  735. module.performance.log(arguments);
  736. }
  737. else {
  738. module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
  739. module.verbose.apply(console, arguments);
  740. }
  741. }
  742. },
  743. error: function() {
  744. module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
  745. module.error.apply(console, arguments);
  746. },
  747. performance: {
  748. log: function(message) {
  749. var
  750. currentTime,
  751. executionTime,
  752. previousTime
  753. ;
  754. if(settings.performance) {
  755. currentTime = new Date().getTime();
  756. previousTime = time || currentTime;
  757. executionTime = currentTime - previousTime;
  758. time = currentTime;
  759. performance.push({
  760. 'Name' : message[0],
  761. 'Arguments' : [].slice.call(message, 1) || '',
  762. 'Element' : element,
  763. 'Execution Time' : executionTime
  764. });
  765. }
  766. clearTimeout(module.performance.timer);
  767. module.performance.timer = setTimeout(module.performance.display, 500);
  768. },
  769. display: function() {
  770. var
  771. title = settings.name + ':',
  772. totalTime = 0
  773. ;
  774. time = false;
  775. clearTimeout(module.performance.timer);
  776. $.each(performance, function(index, data) {
  777. totalTime += data['Execution Time'];
  778. });
  779. title += ' ' + totalTime + 'ms';
  780. if(moduleSelector) {
  781. title += ' \'' + moduleSelector + '\'';
  782. }
  783. if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
  784. console.groupCollapsed(title);
  785. if(console.table) {
  786. console.table(performance);
  787. }
  788. else {
  789. $.each(performance, function(index, data) {
  790. console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
  791. });
  792. }
  793. console.groupEnd();
  794. }
  795. performance = [];
  796. }
  797. },
  798. invoke: function(query, passedArguments, context) {
  799. var
  800. object = instance,
  801. maxDepth,
  802. found,
  803. response
  804. ;
  805. passedArguments = passedArguments || queryArguments;
  806. context = element || context;
  807. if(typeof query == 'string' && object !== undefined) {
  808. query = query.split(/[\. ]/);
  809. maxDepth = query.length - 1;
  810. $.each(query, function(depth, value) {
  811. var camelCaseValue = (depth != maxDepth)
  812. ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
  813. : query
  814. ;
  815. if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
  816. object = object[camelCaseValue];
  817. }
  818. else if( object[camelCaseValue] !== undefined ) {
  819. found = object[camelCaseValue];
  820. return false;
  821. }
  822. else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
  823. object = object[value];
  824. }
  825. else if( object[value] !== undefined ) {
  826. found = object[value];
  827. return false;
  828. }
  829. else {
  830. module.error(error.method, query);
  831. return false;
  832. }
  833. });
  834. }
  835. if ( $.isFunction( found ) ) {
  836. response = found.apply(context, passedArguments);
  837. }
  838. else if(found !== undefined) {
  839. response = found;
  840. }
  841. if($.isArray(returnedValue)) {
  842. returnedValue.push(response);
  843. }
  844. else if(returnedValue !== undefined) {
  845. returnedValue = [returnedValue, response];
  846. }
  847. else if(response !== undefined) {
  848. returnedValue = response;
  849. }
  850. return found;
  851. }
  852. }
  853. ;
  854. if(methodInvoked) {
  855. if(instance === undefined) {
  856. module.initialize();
  857. }
  858. module.invoke(query);
  859. }
  860. else {
  861. if(instance !== undefined) {
  862. module.invoke('destroy');
  863. }
  864. module.initialize();
  865. }
  866. });
  867. return (returnedValue !== undefined)
  868. ? returnedValue
  869. : this
  870. ;
  871. };
  872. $.fn.sidebar.settings = {
  873. name : 'Sidebar',
  874. namespace : 'sidebar',
  875. debug : false,
  876. verbose : false,
  877. performance : true,
  878. transition : 'auto',
  879. mobileTransition : 'auto',
  880. defaultTransition : {
  881. computer: {
  882. left : 'uncover',
  883. right : 'uncover',
  884. top : 'overlay',
  885. bottom : 'overlay'
  886. },
  887. mobile: {
  888. left : 'uncover',
  889. right : 'uncover',
  890. top : 'overlay',
  891. bottom : 'overlay'
  892. }
  893. },
  894. context : 'body',
  895. exclusive : false,
  896. closable : true,
  897. dimPage : true,
  898. scrollLock : false,
  899. returnScroll : false,
  900. delaySetup : false,
  901. duration : 500,
  902. onChange : function(){},
  903. onShow : function(){},
  904. onHide : function(){},
  905. onHidden : function(){},
  906. onVisible : function(){},
  907. className : {
  908. active : 'active',
  909. animating : 'animating',
  910. dimmed : 'dimmed',
  911. ios : 'ios',
  912. pushable : 'pushable',
  913. pushed : 'pushed',
  914. right : 'right',
  915. top : 'top',
  916. left : 'left',
  917. bottom : 'bottom',
  918. visible : 'visible'
  919. },
  920. selector: {
  921. fixed : '.fixed',
  922. omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',
  923. pusher : '.pusher',
  924. sidebar : '.ui.sidebar'
  925. },
  926. regExp: {
  927. ios : /(iPad|iPhone|iPod)/g,
  928. mobileChrome : /(CriOS)/g,
  929. mobile : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g
  930. },
  931. error : {
  932. method : 'The method you called is not defined.',
  933. pusher : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',
  934. movedSidebar : 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',
  935. overlay : 'The overlay setting is no longer supported, use animation: overlay',
  936. notFound : 'There were no elements that matched the specified selector'
  937. }
  938. };
  939. })( jQuery, window, document );