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.

970 lines
30 KiB

10 years ago
10 years ago
  1. /*
  2. * # Semantic - Dropdown
  3. * http://github.com/semantic-org/semantic-ui/
  4. *
  5. *
  6. * Copyright 2013 Contributors
  7. * Released under the MIT license
  8. * http://opensource.org/licenses/MIT
  9. *
  10. */
  11. ;(function ( $, window, document, undefined ) {
  12. $.fn.dropdown = function(parameters) {
  13. var
  14. $allModules = $(this),
  15. $document = $(document),
  16. moduleSelector = $allModules.selector || '',
  17. hasTouch = ('ontouchstart' in document.documentElement),
  18. time = new Date().getTime(),
  19. performance = [],
  20. query = arguments[0],
  21. methodInvoked = (typeof query == 'string'),
  22. queryArguments = [].slice.call(arguments, 1),
  23. returnedValue
  24. ;
  25. $allModules
  26. .each(function() {
  27. var
  28. settings = ( $.isPlainObject(parameters) )
  29. ? $.extend(true, {}, $.fn.dropdown.settings, parameters)
  30. : $.extend({}, $.fn.dropdown.settings),
  31. className = settings.className,
  32. metadata = settings.metadata,
  33. namespace = settings.namespace,
  34. selector = settings.selector,
  35. error = settings.error,
  36. eventNamespace = '.' + namespace,
  37. moduleNamespace = 'module-' + namespace,
  38. $module = $(this),
  39. $item = $module.find(selector.item),
  40. $text = $module.find(selector.text),
  41. $input = $module.find(selector.input),
  42. $combo = ($module.prev().find(selector.text).size() > 0)
  43. ? $module.prev().find(selector.text)
  44. : $module.prev(),
  45. $menu = $module.children(selector.menu),
  46. element = this,
  47. instance = $module.data(moduleNamespace),
  48. module
  49. ;
  50. module = {
  51. initialize: function() {
  52. module.debug('Initializing dropdown', settings);
  53. module.save.defaults();
  54. module.set.selected();
  55. if(hasTouch) {
  56. module.bind.touchEvents();
  57. }
  58. module.bind.mouseEvents();
  59. module.instantiate();
  60. },
  61. instantiate: function() {
  62. module.verbose('Storing instance of dropdown', module);
  63. instance = module;
  64. $module
  65. .data(moduleNamespace, module)
  66. ;
  67. },
  68. destroy: function() {
  69. module.verbose('Destroying previous dropdown for', $module);
  70. $item
  71. .off(eventNamespace)
  72. ;
  73. $module
  74. .off(eventNamespace)
  75. .removeData(moduleNamespace)
  76. ;
  77. },
  78. bind: {
  79. touchEvents: function() {
  80. module.debug('Touch device detected binding touch events');
  81. $module
  82. .on('touchstart' + eventNamespace, module.event.test.toggle)
  83. ;
  84. $item
  85. .on('touchstart' + eventNamespace, module.event.item.mouseenter)
  86. .on('touchstart' + eventNamespace, module.event.item.click)
  87. ;
  88. },
  89. mouseEvents: function() {
  90. module.verbose('Mouse detected binding mouse events');
  91. if(settings.on == 'click') {
  92. $module
  93. .on('click' + eventNamespace, module.event.test.toggle)
  94. ;
  95. }
  96. else if(settings.on == 'hover') {
  97. $module
  98. .on('mouseenter' + eventNamespace, module.delay.show)
  99. .on('mouseleave' + eventNamespace, module.delay.hide)
  100. ;
  101. }
  102. else {
  103. $module
  104. .on(settings.on + eventNamespace, module.toggle)
  105. ;
  106. }
  107. $item
  108. .on('mouseenter' + eventNamespace, module.event.item.mouseenter)
  109. .on('mouseleave' + eventNamespace, module.event.item.mouseleave)
  110. .on('click' + eventNamespace, module.event.item.click)
  111. ;
  112. },
  113. intent: function() {
  114. module.verbose('Binding hide intent event to document');
  115. if(hasTouch) {
  116. $document
  117. .on('touchstart' + eventNamespace, module.event.test.touch)
  118. .on('touchmove' + eventNamespace, module.event.test.touch)
  119. ;
  120. }
  121. $document
  122. .on('click' + eventNamespace, module.event.test.hide)
  123. ;
  124. }
  125. },
  126. unbind: {
  127. intent: function() {
  128. module.verbose('Removing hide intent event from document');
  129. if(hasTouch) {
  130. $document
  131. .off('touchstart' + eventNamespace)
  132. .off('touchmove' + eventNamespace)
  133. ;
  134. }
  135. $document
  136. .off('click' + eventNamespace)
  137. ;
  138. }
  139. },
  140. event: {
  141. test: {
  142. toggle: function(event) {
  143. if( module.determine.intent(event, module.toggle) ) {
  144. event.preventDefault();
  145. }
  146. },
  147. touch: function(event) {
  148. module.determine.intent(event, function() {
  149. if(event.type == 'touchstart') {
  150. module.timer = setTimeout(module.hide, settings.delay.touch);
  151. }
  152. else if(event.type == 'touchmove') {
  153. clearTimeout(module.timer);
  154. }
  155. });
  156. event.stopPropagation();
  157. },
  158. hide: function(event) {
  159. module.determine.intent(event, module.hide);
  160. }
  161. },
  162. item: {
  163. mouseenter: function(event) {
  164. var
  165. $currentMenu = $(this).find(selector.menu),
  166. $otherMenus = $(this).siblings(selector.item).children(selector.menu)
  167. ;
  168. if( $currentMenu.size() > 0 ) {
  169. clearTimeout(module.itemTimer);
  170. module.itemTimer = setTimeout(function() {
  171. module.animate.hide(false, $otherMenus);
  172. module.verbose('Showing sub-menu', $currentMenu);
  173. module.animate.show(false, $currentMenu);
  174. }, settings.delay.show * 2);
  175. event.preventDefault();
  176. }
  177. },
  178. mouseleave: function(event) {
  179. var
  180. $currentMenu = $(this).find(selector.menu)
  181. ;
  182. if($currentMenu.size() > 0) {
  183. clearTimeout(module.itemTimer);
  184. module.itemTimer = setTimeout(function() {
  185. module.verbose('Hiding sub-menu', $currentMenu);
  186. module.animate.hide(false, $currentMenu);
  187. }, settings.delay.hide);
  188. }
  189. },
  190. click: function (event) {
  191. var
  192. $choice = $(this),
  193. text = ( $choice.data(metadata.text) !== undefined )
  194. ? $choice.data(metadata.text)
  195. : $choice.text(),
  196. value = ( $choice.data(metadata.value) !== undefined)
  197. ? $choice.data(metadata.value)
  198. : (typeof text === 'string')
  199. ? text.toLowerCase()
  200. : text,
  201. callback = function() {
  202. module.determine.selectAction(text, value);
  203. $.proxy(settings.onChange, element)(value, text);
  204. }
  205. ;
  206. if( $choice.find(selector.menu).size() === 0 ) {
  207. if(event.type == 'touchstart') {
  208. $choice.one('click', callback);
  209. }
  210. else {
  211. callback();
  212. }
  213. }
  214. }
  215. },
  216. resetStyle: function() {
  217. $(this).removeAttr('style');
  218. }
  219. },
  220. determine: {
  221. selectAction: function(text, value) {
  222. module.verbose('Determining action', settings.action);
  223. if( $.isFunction( module.action[settings.action] ) ) {
  224. module.verbose('Triggering preset action', settings.action, text, value);
  225. module.action[ settings.action ](text, value);
  226. }
  227. else if( $.isFunction(settings.action) ) {
  228. module.verbose('Triggering user action', settings.action, text, value);
  229. settings.action(text, value);
  230. }
  231. else {
  232. module.error(error.action, settings.action);
  233. }
  234. },
  235. intent: function(event, callback) {
  236. module.debug('Determining whether event occurred in dropdown', event.target);
  237. callback = callback || function(){};
  238. if( $(event.target).closest($menu).size() === 0 ) {
  239. module.verbose('Triggering event', callback);
  240. callback();
  241. return true;
  242. }
  243. else {
  244. module.verbose('Event occurred in dropdown, canceling callback');
  245. return false;
  246. }
  247. }
  248. },
  249. action: {
  250. nothing: function() {},
  251. hide: function() {
  252. module.hide();
  253. },
  254. select: function(text, value) {
  255. value = (value !== undefined)
  256. ? value
  257. : text
  258. ;
  259. module.set.selected(value);
  260. module.set.value(value);
  261. module.hide();
  262. },
  263. activate: function(text, value) {
  264. value = (value !== undefined)
  265. ? value
  266. : text
  267. ;
  268. module.set.selected(value);
  269. module.set.value(value);
  270. module.hide();
  271. },
  272. combo: function(text, value) {
  273. value = (value !== undefined)
  274. ? value
  275. : text
  276. ;
  277. module.set.selected(value);
  278. module.set.value(value);
  279. module.hide();
  280. },
  281. /* Deprecated */
  282. auto: function(text, value) {
  283. value = (value !== undefined)
  284. ? value
  285. : text
  286. ;
  287. module.set.selected(value);
  288. module.set.value(value);
  289. module.hide();
  290. },
  291. /* Deprecated */
  292. changeText: function(text, value) {
  293. value = (value !== undefined)
  294. ? value
  295. : text
  296. ;
  297. module.set.selected(value);
  298. module.hide();
  299. },
  300. /* Deprecated */
  301. updateForm: function(text, value) {
  302. value = (value !== undefined)
  303. ? value
  304. : text
  305. ;
  306. module.set.selected(value);
  307. module.set.value(value);
  308. module.hide();
  309. }
  310. },
  311. get: {
  312. text: function() {
  313. return $text.text();
  314. },
  315. value: function() {
  316. return ($input.size() > 0)
  317. ? $input.val()
  318. : $module.data(metadata.value)
  319. ;
  320. },
  321. item: function(value, strict) {
  322. var
  323. $selectedItem = false
  324. ;
  325. value = (value !== undefined)
  326. ? value
  327. : ( module.get.value() !== undefined)
  328. ? module.get.value()
  329. : module.get.text()
  330. ;
  331. strict = (value === '')
  332. ? true
  333. : strict || false
  334. ;
  335. if(value !== undefined) {
  336. $item
  337. .each(function() {
  338. var
  339. $choice = $(this),
  340. optionText = ( $choice.data(metadata.text) !== undefined )
  341. ? $choice.data(metadata.text)
  342. : $choice.text(),
  343. optionValue = ( $choice.data(metadata.value) !== undefined )
  344. ? $choice.data(metadata.value)
  345. : (typeof optionText === 'string')
  346. ? optionText.toLowerCase()
  347. : optionText
  348. ;
  349. if(strict) {
  350. module.debug('Ambiguous dropdown value using strict type check', value);
  351. if( optionValue === value ) {
  352. $selectedItem = $(this);
  353. }
  354. else if( !$selectedItem && optionText === value ) {
  355. $selectedItem = $(this);
  356. }
  357. }
  358. else {
  359. if( optionValue == value ) {
  360. $selectedItem = $(this);
  361. }
  362. else if( !$selectedItem && optionText == value ) {
  363. $selectedItem = $(this);
  364. }
  365. }
  366. })
  367. ;
  368. }
  369. else {
  370. value = module.get.text();
  371. }
  372. return $selectedItem || false;
  373. }
  374. },
  375. restore: {
  376. defaults: function() {
  377. module.restore.defaultText();
  378. module.restore.defaultValue();
  379. },
  380. defaultText: function() {
  381. var
  382. defaultText = $module.data(metadata.defaultText)
  383. ;
  384. module.debug('Restoring default text', defaultText);
  385. module.set.text(defaultText);
  386. },
  387. defaultValue: function() {
  388. var
  389. defaultValue = $module.data(metadata.defaultValue)
  390. ;
  391. if(defaultValue !== undefined) {
  392. module.debug('Restoring default value', defaultValue);
  393. module.set.selected(defaultValue);
  394. module.set.value(defaultValue);
  395. }
  396. }
  397. },
  398. save: {
  399. defaults: function() {
  400. module.save.defaultText();
  401. module.save.defaultValue();
  402. },
  403. defaultValue: function() {
  404. $module.data(metadata.defaultValue, module.get.value() );
  405. },
  406. defaultText: function() {
  407. $module.data(metadata.defaultText, $text.text() );
  408. }
  409. },
  410. set: {
  411. scrollPosition: function() {
  412. var
  413. $activeItem = module.get.item(),
  414. activeOffset = ($activeItem.size() > 0)
  415. ? $activeItem.position().top
  416. : false
  417. ;
  418. if(activeOffset) {
  419. module.debug('Scrolling to active item');
  420. $menu
  421. .scrollTop(activeOffset)
  422. ;
  423. }
  424. },
  425. text: function(text) {
  426. if(settings.action == 'combo') {
  427. module.debug('Changing combo button text', text, $combo);
  428. $combo
  429. .text(text)
  430. ;
  431. }
  432. else if(settings.action !== 'select') {
  433. module.debug('Changing text', text, $text);
  434. $text.removeClass(className.placeholder);
  435. $text.text(text);
  436. }
  437. },
  438. value: function(value) {
  439. module.debug('Adding selected value to hidden input', value, $input);
  440. if($input.size() > 0) {
  441. $input
  442. .val(value)
  443. .trigger('change')
  444. ;
  445. }
  446. else {
  447. $module.data(metadata.value, value);
  448. }
  449. },
  450. active: function() {
  451. $module.addClass(className.active);
  452. },
  453. visible: function() {
  454. $module.addClass(className.visible);
  455. },
  456. selected: function(value) {
  457. var
  458. $selectedItem = module.get.item(value),
  459. selectedText
  460. ;
  461. if($selectedItem) {
  462. module.debug('Setting selected menu item to', $selectedItem);
  463. selectedText = ($selectedItem.data(metadata.text) !== undefined)
  464. ? $selectedItem.data(metadata.text)
  465. : $selectedItem.text()
  466. ;
  467. $item
  468. .removeClass(className.active)
  469. ;
  470. $selectedItem
  471. .addClass(className.active)
  472. ;
  473. module.set.text(selectedText);
  474. }
  475. }
  476. },
  477. remove: {
  478. active: function() {
  479. $module.removeClass(className.active);
  480. },
  481. visible: function() {
  482. $module.removeClass(className.visible);
  483. }
  484. },
  485. is: {
  486. selection: function() {
  487. return $module.hasClass(className.selection);
  488. },
  489. animated: function($subMenu) {
  490. return ($subMenu)
  491. ? $subMenu.is(':animated') || $subMenu.transition('is animating')
  492. : $menu.is(':animated') || $menu.transition('is animating')
  493. ;
  494. },
  495. visible: function($subMenu) {
  496. return ($subMenu)
  497. ? $subMenu.is(':visible')
  498. : $menu.is(':visible')
  499. ;
  500. },
  501. hidden: function($subMenu) {
  502. return ($subMenu)
  503. ? $subMenu.is(':not(:visible)')
  504. : $menu.is(':not(:visible)')
  505. ;
  506. }
  507. },
  508. can: {
  509. click: function() {
  510. return (hasTouch || settings.on == 'click');
  511. },
  512. show: function() {
  513. return !$module.hasClass(className.disabled);
  514. }
  515. },
  516. animate: {
  517. show: function(callback, $subMenu) {
  518. var
  519. $currentMenu = $subMenu || $menu
  520. ;
  521. callback = callback || function(){};
  522. if( module.is.hidden($currentMenu) ) {
  523. module.verbose('Doing menu show animation', $currentMenu);
  524. if(settings.transition == 'none') {
  525. callback();
  526. }
  527. else if($.fn.transition !== undefined && $module.transition('is supported')) {
  528. $currentMenu
  529. .transition({
  530. animation : settings.transition + ' in',
  531. duration : settings.duration,
  532. complete : callback,
  533. queue : false
  534. })
  535. ;
  536. }
  537. else if(settings.transition == 'slide down') {
  538. $currentMenu
  539. .hide()
  540. .clearQueue()
  541. .children()
  542. .clearQueue()
  543. .css('opacity', 0)
  544. .delay(50)
  545. .animate({
  546. opacity : 1
  547. }, settings.duration, 'easeOutQuad', module.event.resetStyle)
  548. .end()
  549. .slideDown(100, 'easeOutQuad', function() {
  550. $.proxy(module.event.resetStyle, this)();
  551. callback();
  552. })
  553. ;
  554. }
  555. else if(settings.transition == 'fade') {
  556. $currentMenu
  557. .hide()
  558. .clearQueue()
  559. .fadeIn(settings.duration, function() {
  560. $.proxy(module.event.resetStyle, this)();
  561. callback();
  562. })
  563. ;
  564. }
  565. else {
  566. module.error(error.transition, settings.transition);
  567. }
  568. }
  569. },
  570. hide: function(callback, $subMenu) {
  571. var
  572. $currentMenu = $subMenu || $menu
  573. ;
  574. callback = callback || function(){};
  575. if(module.is.visible($currentMenu) ) {
  576. module.verbose('Doing menu hide animation', $currentMenu);
  577. if($.fn.transition !== undefined && $module.transition('is supported')) {
  578. $currentMenu
  579. .transition({
  580. animation : settings.transition + ' out',
  581. duration : settings.duration,
  582. complete : callback,
  583. queue : false
  584. })
  585. ;
  586. }
  587. else if(settings.transition == 'none') {
  588. callback();
  589. }
  590. else if(settings.transition == 'slide down') {
  591. $currentMenu
  592. .show()
  593. .clearQueue()
  594. .children()
  595. .clearQueue()
  596. .css('opacity', 1)
  597. .animate({
  598. opacity : 0
  599. }, 100, 'easeOutQuad', module.event.resetStyle)
  600. .end()
  601. .delay(50)
  602. .slideUp(100, 'easeOutQuad', function() {
  603. $.proxy(module.event.resetStyle, this)();
  604. callback();
  605. })
  606. ;
  607. }
  608. else if(settings.transition == 'fade') {
  609. $currentMenu
  610. .show()
  611. .clearQueue()
  612. .fadeOut(150, function() {
  613. $.proxy(module.event.resetStyle, this)();
  614. callback();
  615. })
  616. ;
  617. }
  618. else {
  619. module.error(error.transition);
  620. }
  621. }
  622. }
  623. },
  624. show: function() {
  625. module.debug('Checking if dropdown can show');
  626. if( module.is.hidden() ) {
  627. module.hideOthers();
  628. module.set.active();
  629. module.animate.show(function() {
  630. if( module.can.click() ) {
  631. module.bind.intent();
  632. }
  633. module.set.visible();
  634. });
  635. $.proxy(settings.onShow, element)();
  636. }
  637. },
  638. hide: function() {
  639. if( !module.is.animated() && module.is.visible() ) {
  640. module.debug('Hiding dropdown');
  641. if( module.can.click() ) {
  642. module.unbind.intent();
  643. }
  644. module.remove.active();
  645. module.animate.hide(module.remove.visible);
  646. $.proxy(settings.onHide, element)();
  647. }
  648. },
  649. delay: {
  650. show: function() {
  651. module.verbose('Delaying show event to ensure user intent');
  652. clearTimeout(module.timer);
  653. module.timer = setTimeout(module.show, settings.delay.show);
  654. },
  655. hide: function() {
  656. module.verbose('Delaying hide event to ensure user intent');
  657. clearTimeout(module.timer);
  658. module.timer = setTimeout(module.hide, settings.delay.hide);
  659. }
  660. },
  661. hideOthers: function() {
  662. module.verbose('Finding other dropdowns to hide');
  663. $allModules
  664. .not($module)
  665. .has(selector.menu + ':visible')
  666. .dropdown('hide')
  667. ;
  668. },
  669. toggle: function() {
  670. module.verbose('Toggling menu visibility');
  671. if( module.is.hidden() ) {
  672. module.show();
  673. }
  674. else {
  675. module.hide();
  676. }
  677. },
  678. setting: function(name, value) {
  679. module.debug('Changing setting', name, value);
  680. if( $.isPlainObject(name) ) {
  681. $.extend(true, settings, name);
  682. }
  683. else if(value !== undefined) {
  684. settings[name] = value;
  685. }
  686. else {
  687. return settings[name];
  688. }
  689. },
  690. internal: function(name, value) {
  691. if( $.isPlainObject(name) ) {
  692. $.extend(true, module, name);
  693. }
  694. else if(value !== undefined) {
  695. module[name] = value;
  696. }
  697. else {
  698. return module[name];
  699. }
  700. },
  701. debug: function() {
  702. if(settings.debug) {
  703. if(settings.performance) {
  704. module.performance.log(arguments);
  705. }
  706. else {
  707. module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
  708. module.debug.apply(console, arguments);
  709. }
  710. }
  711. },
  712. verbose: function() {
  713. if(settings.verbose && settings.debug) {
  714. if(settings.performance) {
  715. module.performance.log(arguments);
  716. }
  717. else {
  718. module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
  719. module.verbose.apply(console, arguments);
  720. }
  721. }
  722. },
  723. error: function() {
  724. module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
  725. module.error.apply(console, arguments);
  726. },
  727. performance: {
  728. log: function(message) {
  729. var
  730. currentTime,
  731. executionTime,
  732. previousTime
  733. ;
  734. if(settings.performance) {
  735. currentTime = new Date().getTime();
  736. previousTime = time || currentTime;
  737. executionTime = currentTime - previousTime;
  738. time = currentTime;
  739. performance.push({
  740. 'Element' : element,
  741. 'Name' : message[0],
  742. 'Arguments' : [].slice.call(message, 1) || '',
  743. 'Execution Time' : executionTime
  744. });
  745. }
  746. clearTimeout(module.performance.timer);
  747. module.performance.timer = setTimeout(module.performance.display, 100);
  748. },
  749. display: function() {
  750. var
  751. title = settings.name + ':',
  752. totalTime = 0
  753. ;
  754. time = false;
  755. clearTimeout(module.performance.timer);
  756. $.each(performance, function(index, data) {
  757. totalTime += data['Execution Time'];
  758. });
  759. title += ' ' + totalTime + 'ms';
  760. if(moduleSelector) {
  761. title += ' \'' + moduleSelector + '\'';
  762. }
  763. if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
  764. console.groupCollapsed(title);
  765. if(console.table) {
  766. console.table(performance);
  767. }
  768. else {
  769. $.each(performance, function(index, data) {
  770. console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
  771. });
  772. }
  773. console.groupEnd();
  774. }
  775. performance = [];
  776. }
  777. },
  778. invoke: function(query, passedArguments, context) {
  779. var
  780. object = instance,
  781. maxDepth,
  782. found,
  783. response
  784. ;
  785. passedArguments = passedArguments || queryArguments;
  786. context = element || context;
  787. if(typeof query == 'string' && object !== undefined) {
  788. query = query.split(/[\. ]/);
  789. maxDepth = query.length - 1;
  790. $.each(query, function(depth, value) {
  791. var camelCaseValue = (depth != maxDepth)
  792. ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
  793. : query
  794. ;
  795. if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
  796. object = object[camelCaseValue];
  797. }
  798. else if( object[camelCaseValue] !== undefined ) {
  799. found = object[camelCaseValue];
  800. return false;
  801. }
  802. else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
  803. object = object[value];
  804. }
  805. else if( object[value] !== undefined ) {
  806. found = object[value];
  807. return false;
  808. }
  809. else {
  810. module.error(error.method, query);
  811. return false;
  812. }
  813. });
  814. }
  815. if ( $.isFunction( found ) ) {
  816. response = found.apply(context, passedArguments);
  817. }
  818. else if(found !== undefined) {
  819. response = found;
  820. }
  821. if($.isArray(returnedValue)) {
  822. returnedValue.push(response);
  823. }
  824. else if(returnedValue !== undefined) {
  825. returnedValue = [returnedValue, response];
  826. }
  827. else if(response !== undefined) {
  828. returnedValue = response;
  829. }
  830. return found;
  831. }
  832. };
  833. if(methodInvoked) {
  834. if(instance === undefined) {
  835. module.initialize();
  836. }
  837. module.invoke(query);
  838. }
  839. else {
  840. if(instance !== undefined) {
  841. module.destroy();
  842. }
  843. module.initialize();
  844. }
  845. })
  846. ;
  847. return (returnedValue !== undefined)
  848. ? returnedValue
  849. : this
  850. ;
  851. };
  852. $.fn.dropdown.settings = {
  853. name : 'Dropdown',
  854. namespace : 'dropdown',
  855. debug : false,
  856. verbose : true,
  857. performance : true,
  858. on : 'click',
  859. action : 'activate',
  860. delay: {
  861. show : 200,
  862. hide : 300,
  863. touch : 50
  864. },
  865. transition : 'slide down',
  866. duration : 250,
  867. onChange : function(value, text){},
  868. onShow : function(){},
  869. onHide : function(){},
  870. error : {
  871. action : 'You called a dropdown action that was not defined',
  872. method : 'The method you called is not defined.',
  873. transition : 'The requested transition was not found'
  874. },
  875. metadata: {
  876. defaultText : 'defaultText',
  877. defaultValue : 'defaultValue',
  878. text : 'text',
  879. value : 'value'
  880. },
  881. selector : {
  882. menu : '.menu',
  883. item : '.menu > .item',
  884. text : '> .text',
  885. input : '> input[type="hidden"]'
  886. },
  887. className : {
  888. active : 'active',
  889. placeholder : 'default',
  890. disabled : 'disabled',
  891. visible : 'visible',
  892. selection : 'selection'
  893. }
  894. };
  895. // Adds easing
  896. $.extend( $.easing, {
  897. easeOutQuad: function (x, t, b, c, d) {
  898. return -c *(t/=d)*(t-2) + b;
  899. },
  900. });
  901. })( jQuery, window , document );