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.

904 lines
29 KiB

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
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
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. /*
  2. * # Semantic - Visibility
  3. * http://github.com/semantic-org/semantic-ui/
  4. *
  5. *
  6. * Copyright 2014 Contributor
  7. * Released under the MIT license
  8. * http://opensource.org/licenses/MIT
  9. *
  10. */
  11. ;(function ( $, window, document, undefined ) {
  12. $.fn.visibility = function(parameters) {
  13. var
  14. $allModules = $(this),
  15. moduleSelector = $allModules.selector || '',
  16. time = new Date().getTime(),
  17. performance = [],
  18. query = arguments[0],
  19. methodInvoked = (typeof query == 'string'),
  20. queryArguments = [].slice.call(arguments, 1),
  21. returnedValue
  22. ;
  23. $allModules
  24. .each(function() {
  25. var
  26. settings = $.extend(true, {}, $.fn.visibility.settings, parameters),
  27. className = settings.className,
  28. namespace = settings.namespace,
  29. error = settings.error,
  30. eventNamespace = '.' + namespace,
  31. moduleNamespace = 'module-' + namespace,
  32. $window = $(window),
  33. $module = $(this),
  34. $context = $(settings.context),
  35. $container = $module.offsetParent(),
  36. selector = $module.selector || '',
  37. instance = $module.data(moduleNamespace),
  38. requestAnimationFrame = window.requestAnimationFrame
  39. || window.mozRequestAnimationFrame
  40. || window.webkitRequestAnimationFrame
  41. || window.msRequestAnimationFrame
  42. || function(callback) { setTimeout(callback, 0); },
  43. element = this,
  44. module
  45. ;
  46. module = {
  47. initialize: function() {
  48. module.verbose('Initializing visibility', settings);
  49. module.reset();
  50. module.save.position();
  51. module.bindEvents();
  52. module.instantiate();
  53. if(settings.type == 'image') {
  54. module.setup.image();
  55. }
  56. requestAnimationFrame(module.checkVisibility);
  57. },
  58. instantiate: function() {
  59. module.verbose('Storing instance of module', module);
  60. instance = module;
  61. $module
  62. .data(moduleNamespace, module)
  63. ;
  64. },
  65. destroy: function() {
  66. module.verbose('Destroying previous module');
  67. $module
  68. .off(eventNamespace)
  69. .removeData(moduleNamespace)
  70. ;
  71. },
  72. bindEvents: function() {
  73. module.verbose('Binding visibility events to scroll and resize');
  74. $window
  75. .on('resize' + eventNamespace, module.event.refresh)
  76. ;
  77. $context
  78. .on('scroll' + eventNamespace, module.event.scroll)
  79. ;
  80. },
  81. event: {
  82. refresh: function() {
  83. requestAnimationFrame(module.refresh);
  84. },
  85. scroll: function() {
  86. module.verbose('Scroll position changed');
  87. if(settings.throttle) {
  88. clearTimeout(module.timer);
  89. module.timer = setTimeout(module.checkVisibility, settings.throttle);
  90. }
  91. else {
  92. requestAnimationFrame(module.checkVisibility);
  93. }
  94. }
  95. },
  96. precache: function(images, callback) {
  97. if (!(images instanceof Array)) {
  98. images = [images];
  99. }
  100. var
  101. imagesLength = images.length,
  102. loadedCounter = 0,
  103. cache = [],
  104. cacheImage = document.createElement('img'),
  105. handleLoad = function() {
  106. loadedCounter++;
  107. if (loadedCounter >= images.length) {
  108. if ($.isFunction(callback)) {
  109. callback();
  110. }
  111. }
  112. }
  113. ;
  114. while (imagesLength--) {
  115. cacheImage = document.createElement('img');
  116. cacheImage.onload = handleLoad;
  117. cacheImage.onerror = handleLoad;
  118. cacheImage.src = images[imagesLength];
  119. cache.push(cacheImage);
  120. }
  121. },
  122. setup: {
  123. image: function() {
  124. var
  125. src = $module.data('src')
  126. ;
  127. if(src) {
  128. module.verbose('Lazy loading image', src);
  129. // show when top visible
  130. module.topVisible(function() {
  131. module.precache(src, function() {
  132. module.set.image(src);
  133. settings.onTopVisible = false;
  134. });
  135. });
  136. }
  137. }
  138. },
  139. set: {
  140. image: function(src) {
  141. var
  142. offScreen = (module.cache.screen.bottom < module.cache.element.top)
  143. ;
  144. $module
  145. .attr('src', src)
  146. ;
  147. if(offScreen) {
  148. $module.show();
  149. }
  150. else {
  151. if($.fn.transition !== undefined) {
  152. $module.transition(settings.transition, settings.duration);
  153. }
  154. else {
  155. $module.fadeIn(settings.duration);
  156. }
  157. }
  158. }
  159. },
  160. refresh: function() {
  161. module.debug('Refreshing constants (element width/height)');
  162. module.reset();
  163. module.save.position();
  164. module.checkVisibility();
  165. $.proxy(settings.onRefresh, element)();
  166. },
  167. reset: function() {
  168. module.verbose('Reseting all cached values');
  169. module.cache = {
  170. occurred: {},
  171. screen : {},
  172. element : {}
  173. };
  174. },
  175. checkVisibility: function() {
  176. module.verbose('Checking visibility of element', module.cache.element);
  177. module.save.scroll();
  178. module.save.direction();
  179. module.save.screenCalculations();
  180. module.save.elementCalculations();
  181. // percentage
  182. module.passed();
  183. // reverse (must be first)
  184. module.passingReverse();
  185. module.topVisibleReverse();
  186. module.bottomVisibleReverse();
  187. module.topPassedReverse();
  188. module.bottomPassedReverse();
  189. // one time
  190. module.passing();
  191. module.topVisible();
  192. module.bottomVisible();
  193. module.topPassed();
  194. module.bottomPassed();
  195. },
  196. passed: function(amount, newCallback) {
  197. var
  198. calculations = module.get.elementCalculations(),
  199. amountInPixels
  200. ;
  201. // assign callback
  202. if(amount !== undefined && newCallback !== undefined) {
  203. settings.onPassed[amount] = newCallback;
  204. }
  205. else if(amount !== undefined) {
  206. return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);
  207. }
  208. else if(calculations.passing) {
  209. $.each(settings.onPassed, function(amount, callback) {
  210. if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {
  211. module.execute(callback, amount);
  212. }
  213. else if(!settings.once) {
  214. module.remove.occurred(callback);
  215. }
  216. });
  217. }
  218. },
  219. passing: function(newCallback) {
  220. var
  221. calculations = module.get.elementCalculations(),
  222. callback = newCallback || settings.onPassing,
  223. callbackName = 'passing'
  224. ;
  225. if(newCallback) {
  226. module.debug('Adding callback for passing', newCallback);
  227. settings.onPassing = newCallback;
  228. }
  229. if(calculations.passing) {
  230. module.execute(callback, callbackName);
  231. }
  232. else if(!settings.once) {
  233. module.remove.occurred(callbackName);
  234. }
  235. if(newCallback !== undefined) {
  236. return calculations.passing;
  237. }
  238. },
  239. topVisible: function(newCallback) {
  240. var
  241. calculations = module.get.elementCalculations(),
  242. callback = newCallback || settings.onTopVisible,
  243. callbackName = 'topVisible'
  244. ;
  245. if(newCallback) {
  246. module.debug('Adding callback for top visible', newCallback);
  247. settings.onTopVisible = newCallback;
  248. }
  249. if(calculations.topVisible) {
  250. module.execute(callback, callbackName);
  251. }
  252. else if(!settings.once) {
  253. module.remove.occurred(callbackName);
  254. }
  255. if(newCallback === undefined) {
  256. return calculations.topVisible;
  257. }
  258. },
  259. bottomVisible: function(newCallback) {
  260. var
  261. calculations = module.get.elementCalculations(),
  262. callback = newCallback || settings.onBottomVisible,
  263. callbackName = 'bottomVisible'
  264. ;
  265. if(newCallback) {
  266. module.debug('Adding callback for bottom visible', newCallback);
  267. settings.onBottomVisible = newCallback;
  268. }
  269. if(calculations.bottomVisible) {
  270. module.execute(callback, callbackName);
  271. }
  272. else if(!settings.once) {
  273. module.remove.occurred(callbackName);
  274. }
  275. if(newCallback === undefined) {
  276. return calculations.bottomVisible;
  277. }
  278. },
  279. topPassed: function(newCallback) {
  280. var
  281. calculations = module.get.elementCalculations(),
  282. callback = newCallback || settings.onTopPassed,
  283. callbackName = 'topPassed'
  284. ;
  285. if(newCallback) {
  286. module.debug('Adding callback for top passed', newCallback);
  287. settings.onTopPassed = newCallback;
  288. }
  289. if(calculations.topPassed) {
  290. module.execute(callback, callbackName);
  291. }
  292. else if(!settings.once) {
  293. module.remove.occurred(callbackName);
  294. }
  295. if(newCallback === undefined) {
  296. return calculations.onTopPassed;
  297. }
  298. },
  299. bottomPassed: function(newCallback) {
  300. var
  301. calculations = module.get.elementCalculations(),
  302. callback = newCallback || settings.onBottomPassed,
  303. callbackName = 'bottomPassed'
  304. ;
  305. if(newCallback) {
  306. module.debug('Adding callback for bottom passed', newCallback);
  307. settings.onBottomPassed = newCallback;
  308. }
  309. if(calculations.bottomPassed) {
  310. module.execute(callback, callbackName);
  311. }
  312. else if(!settings.once) {
  313. module.remove.occurred(callbackName);
  314. }
  315. if(newCallback === undefined) {
  316. return calculations.bottomPassed;
  317. }
  318. },
  319. passingReverse: function(newCallback) {
  320. var
  321. calculations = module.get.elementCalculations(),
  322. callback = newCallback || settings.onPassingReverse,
  323. callbackName = 'passingReverse'
  324. ;
  325. if(newCallback) {
  326. module.debug('Adding callback for passing reverse', newCallback);
  327. settings.onPassingReverse = newCallback;
  328. }
  329. if(!calculations.passing) {
  330. if(module.get.occurred('passing')) {
  331. module.execute(callback, callbackName);
  332. }
  333. }
  334. else if(!settings.once) {
  335. module.remove.occurred(callbackName);
  336. }
  337. if(newCallback !== undefined) {
  338. return !calculations.passing;
  339. }
  340. },
  341. topVisibleReverse: function(newCallback) {
  342. var
  343. calculations = module.get.elementCalculations(),
  344. callback = newCallback || settings.onTopVisibleReverse,
  345. callbackName = 'topVisibleReverse'
  346. ;
  347. if(newCallback) {
  348. module.debug('Adding callback for top visible reverse', newCallback);
  349. settings.onTopVisibleReverse = newCallback;
  350. }
  351. if(!calculations.topVisible) {
  352. if(module.get.occurred('topVisible')) {
  353. module.execute(callback, callbackName);
  354. }
  355. }
  356. else if(!settings.once) {
  357. module.remove.occurred(callbackName);
  358. }
  359. if(newCallback === undefined) {
  360. return !calculations.topVisible;
  361. }
  362. },
  363. bottomVisibleReverse: function(newCallback) {
  364. var
  365. calculations = module.get.elementCalculations(),
  366. callback = newCallback || settings.onBottomVisibleReverse,
  367. callbackName = 'bottomVisibleReverse'
  368. ;
  369. if(newCallback) {
  370. module.debug('Adding callback for bottom visible reverse', newCallback);
  371. settings.onBottomVisibleReverse = newCallback;
  372. }
  373. if(!calculations.bottomVisible) {
  374. if(module.get.occurred('bottomVisible')) {
  375. module.execute(callback, callbackName);
  376. }
  377. }
  378. else if(!settings.once) {
  379. module.remove.occurred(callbackName);
  380. }
  381. if(newCallback === undefined) {
  382. return !calculations.bottomVisible;
  383. }
  384. },
  385. topPassedReverse: function(newCallback) {
  386. var
  387. calculations = module.get.elementCalculations(),
  388. callback = newCallback || settings.onTopPassedReverse,
  389. callbackName = 'topPassedReverse'
  390. ;
  391. if(newCallback) {
  392. module.debug('Adding callback for top passed reverse', newCallback);
  393. settings.onTopPassedReverse = newCallback;
  394. }
  395. if(!calculations.topPassed) {
  396. if(module.get.occurred('topPassed')) {
  397. module.execute(callback, callbackName);
  398. }
  399. }
  400. else if(!settings.once) {
  401. module.remove.occurred(callbackName);
  402. }
  403. if(newCallback === undefined) {
  404. return !calculations.onTopPassed;
  405. }
  406. },
  407. bottomPassedReverse: function(newCallback) {
  408. var
  409. calculations = module.get.elementCalculations(),
  410. callback = newCallback || settings.onBottomPassedReverse,
  411. callbackName = 'bottomPassedReverse'
  412. ;
  413. if(newCallback) {
  414. module.debug('Adding callback for bottom passed reverse', newCallback);
  415. settings.onBottomPassedReverse = newCallback;
  416. }
  417. if(!calculations.bottomPassed) {
  418. if(module.get.occurred('bottomPassed')) {
  419. module.execute(callback, callbackName);
  420. }
  421. }
  422. else if(!settings.once) {
  423. module.remove.occurred(callbackName);
  424. }
  425. if(newCallback === undefined) {
  426. return !calculations.bottomPassed;
  427. }
  428. },
  429. execute: function(callback, callbackName) {
  430. var
  431. calculations = module.get.elementCalculations(),
  432. screen = module.get.screenCalculations()
  433. ;
  434. callback = callback || false;
  435. if(callback) {
  436. if(settings.continuous) {
  437. module.debug('Callback being called continuously', callbackName, calculations);
  438. $.proxy(callback, element)(calculations, screen);
  439. }
  440. else if(!module.get.occurred(callbackName)) {
  441. module.debug('Conditions met', callbackName, calculations);
  442. $.proxy(callback, element)(calculations, screen);
  443. }
  444. }
  445. module.save.occurred(callbackName);
  446. },
  447. remove: {
  448. occurred: function(callback) {
  449. if(callback) {
  450. if(module.cache.occurred[callback] !== undefined && module.cache.occurred[callback] === true) {
  451. module.debug('Callback can now be called again', callback);
  452. module.cache.occurred[callback] = false;
  453. }
  454. }
  455. else {
  456. module.cache.occurred = {};
  457. }
  458. }
  459. },
  460. save: {
  461. occurred: function(callback) {
  462. if(callback) {
  463. if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {
  464. module.verbose('Saving callback occurred', callback);
  465. module.cache.occurred[callback] = true;
  466. }
  467. }
  468. },
  469. scroll: function() {
  470. module.cache.scroll = $context.scrollTop() + settings.offset;
  471. },
  472. direction: function() {
  473. var
  474. scroll = module.get.scroll(),
  475. lastScroll = module.get.lastScroll(),
  476. direction
  477. ;
  478. if(scroll > lastScroll && lastScroll) {
  479. direction = 'down';
  480. }
  481. else if(scroll < lastScroll && lastScroll) {
  482. direction = 'up';
  483. }
  484. else {
  485. direction = 'static';
  486. }
  487. module.cache.direction = direction;
  488. return module.cache.direction;
  489. },
  490. elementPosition: function() {
  491. var
  492. screen = module.get.screenSize()
  493. ;
  494. module.verbose('Saving element position');
  495. $.extend(module.cache.element, {
  496. margin : {
  497. top : parseInt($module.css('margin-top'), 10),
  498. bottom : parseInt($module.css('margin-bottom'), 10)
  499. },
  500. fits : (element.height < screen.height),
  501. offset : $module.offset(),
  502. width : $module.outerWidth(),
  503. height : $module.outerHeight()
  504. });
  505. return module.cache.element;
  506. },
  507. elementCalculations: function() {
  508. var
  509. screen = module.get.screenCalculations(),
  510. element = module.get.elementPosition()
  511. ;
  512. // offset
  513. if(settings.includeMargin) {
  514. $.extend(module.cache.element, {
  515. top : element.offset.top - element.margin.top,
  516. bottom : element.offset.top + element.height + element.margin.bottom
  517. });
  518. }
  519. else {
  520. $.extend(module.cache.element, {
  521. top : element.offset.top,
  522. bottom : element.offset.top + element.height
  523. });
  524. }
  525. // visibility
  526. $.extend(module.cache.element, {
  527. topVisible : (screen.bottom >= element.top),
  528. topPassed : (screen.top >= element.top),
  529. bottomVisible : (screen.bottom >= element.bottom),
  530. bottomPassed : (screen.top >= element.bottom),
  531. pixelsPassed : 0,
  532. percentagePassed : 0
  533. });
  534. // meta calculations
  535. $.extend(module.cache.element, {
  536. visible : (module.cache.element.topVisible || module.cache.element.bottomVisible),
  537. passing : (module.cache.element.topPassed && !module.cache.element.bottomPassed),
  538. hidden : (!module.cache.element.topVisible && !module.cache.element.bottomVisible)
  539. });
  540. if(module.cache.element.passing) {
  541. module.cache.element.pixelsPassed = (screen.top - element.top);
  542. module.cache.element.percentagePassed = (screen.top - element.top) / element.height;
  543. }
  544. module.verbose('Updated element calculations', module.cache.element);
  545. },
  546. screenCalculations: function() {
  547. var
  548. scroll = $context.scrollTop() + settings.offset
  549. ;
  550. if(module.cache.scroll === undefined) {
  551. module.cache.scroll = $context.scrollTop() + settings.offset;
  552. }
  553. module.save.direction();
  554. $.extend(module.cache.screen, {
  555. top : scroll,
  556. bottom : scroll + module.cache.screen.height
  557. });
  558. return module.cache.screen;
  559. },
  560. screenSize: function() {
  561. module.verbose('Saving window position');
  562. module.cache.screen = {
  563. height: $context.height()
  564. };
  565. },
  566. position: function() {
  567. module.save.screenSize();
  568. module.save.elementPosition();
  569. }
  570. },
  571. get: {
  572. pixelsPassed: function(amount) {
  573. var
  574. element = module.get.elementCalculations()
  575. ;
  576. if(amount.search('%') > -1) {
  577. return ( element.height * (parseInt(amount, 10) / 100) );
  578. }
  579. return parseInt(amount, 10);
  580. },
  581. occurred: function(callback) {
  582. return (module.cache.occurred !== undefined)
  583. ? module.cache.occurred[callback] || false
  584. : false
  585. ;
  586. },
  587. direction: function() {
  588. if(module.cache.direction === undefined) {
  589. module.save.direction();
  590. }
  591. return module.cache.direction;
  592. },
  593. elementPosition: function() {
  594. if(module.cache.element === undefined) {
  595. module.save.elementPosition();
  596. }
  597. return module.cache.element;
  598. },
  599. elementCalculations: function() {
  600. if(module.cache.element === undefined) {
  601. module.save.elementCalculations();
  602. }
  603. return module.cache.element;
  604. },
  605. screenCalculations: function() {
  606. if(module.cache.screen === undefined) {
  607. module.save.screenCalculations();
  608. }
  609. return module.cache.screen;
  610. },
  611. screenSize: function() {
  612. if(module.cache.screen === undefined) {
  613. module.save.screenSize();
  614. }
  615. return module.cache.screen;
  616. },
  617. scroll: function() {
  618. if(module.cache.scroll === undefined) {
  619. module.save.scroll();
  620. }
  621. return module.cache.scroll;
  622. },
  623. lastScroll: function() {
  624. if(module.cache.screen === undefined) {
  625. module.debug('First scroll event, no last scroll could be found');
  626. return false;
  627. }
  628. return module.cache.screen.top;
  629. }
  630. },
  631. setting: function(name, value) {
  632. if( $.isPlainObject(name) ) {
  633. $.extend(true, settings, name);
  634. }
  635. else if(value !== undefined) {
  636. settings[name] = value;
  637. }
  638. else {
  639. return settings[name];
  640. }
  641. },
  642. internal: function(name, value) {
  643. if( $.isPlainObject(name) ) {
  644. $.extend(true, module, name);
  645. }
  646. else if(value !== undefined) {
  647. module[name] = value;
  648. }
  649. else {
  650. return module[name];
  651. }
  652. },
  653. debug: function() {
  654. if(settings.debug) {
  655. if(settings.performance) {
  656. module.performance.log(arguments);
  657. }
  658. else {
  659. module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
  660. module.debug.apply(console, arguments);
  661. }
  662. }
  663. },
  664. verbose: function() {
  665. if(settings.verbose && settings.debug) {
  666. if(settings.performance) {
  667. module.performance.log(arguments);
  668. }
  669. else {
  670. module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
  671. module.verbose.apply(console, arguments);
  672. }
  673. }
  674. },
  675. error: function() {
  676. module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
  677. module.error.apply(console, arguments);
  678. },
  679. performance: {
  680. log: function(message) {
  681. var
  682. currentTime,
  683. executionTime,
  684. previousTime
  685. ;
  686. if(settings.performance) {
  687. currentTime = new Date().getTime();
  688. previousTime = time || currentTime;
  689. executionTime = currentTime - previousTime;
  690. time = currentTime;
  691. performance.push({
  692. 'Element' : element,
  693. 'Name' : message[0],
  694. 'Arguments' : [].slice.call(message, 1) || '',
  695. 'Execution Time' : executionTime
  696. });
  697. }
  698. clearTimeout(module.performance.timer);
  699. module.performance.timer = setTimeout(module.performance.display, 100);
  700. },
  701. display: function() {
  702. var
  703. title = settings.name + ':',
  704. totalTime = 0
  705. ;
  706. time = false;
  707. clearTimeout(module.performance.timer);
  708. $.each(performance, function(index, data) {
  709. totalTime += data['Execution Time'];
  710. });
  711. title += ' ' + totalTime + 'ms';
  712. if(moduleSelector) {
  713. title += ' \'' + moduleSelector + '\'';
  714. }
  715. if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
  716. console.groupCollapsed(title);
  717. if(console.table) {
  718. console.table(performance);
  719. }
  720. else {
  721. $.each(performance, function(index, data) {
  722. console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
  723. });
  724. }
  725. console.groupEnd();
  726. }
  727. performance = [];
  728. }
  729. },
  730. invoke: function(query, passedArguments, context) {
  731. var
  732. object = instance,
  733. maxDepth,
  734. found,
  735. response
  736. ;
  737. passedArguments = passedArguments || queryArguments;
  738. context = element || context;
  739. if(typeof query == 'string' && object !== undefined) {
  740. query = query.split(/[\. ]/);
  741. maxDepth = query.length - 1;
  742. $.each(query, function(depth, value) {
  743. var camelCaseValue = (depth != maxDepth)
  744. ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
  745. : query
  746. ;
  747. if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
  748. object = object[camelCaseValue];
  749. }
  750. else if( object[camelCaseValue] !== undefined ) {
  751. found = object[camelCaseValue];
  752. return false;
  753. }
  754. else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
  755. object = object[value];
  756. }
  757. else if( object[value] !== undefined ) {
  758. found = object[value];
  759. return false;
  760. }
  761. else {
  762. return false;
  763. }
  764. });
  765. }
  766. if ( $.isFunction( found ) ) {
  767. response = found.apply(context, passedArguments);
  768. }
  769. else if(found !== undefined) {
  770. response = found;
  771. }
  772. if($.isArray(returnedValue)) {
  773. returnedValue.push(response);
  774. }
  775. else if(returnedValue !== undefined) {
  776. returnedValue = [returnedValue, response];
  777. }
  778. else if(response !== undefined) {
  779. returnedValue = response;
  780. }
  781. return found;
  782. }
  783. };
  784. if(methodInvoked) {
  785. if(instance === undefined) {
  786. module.initialize();
  787. }
  788. module.invoke(query);
  789. }
  790. else {
  791. if(instance !== undefined) {
  792. module.destroy();
  793. }
  794. module.initialize();
  795. }
  796. })
  797. ;
  798. return (returnedValue !== undefined)
  799. ? returnedValue
  800. : this
  801. ;
  802. };
  803. $.fn.visibility.settings = {
  804. name : 'Visibility',
  805. namespace : 'visibility',
  806. debug : false,
  807. verbose : false,
  808. performance : true,
  809. offset : 0,
  810. includeMargin : false,
  811. context : window,
  812. // visibility check delay in ms
  813. throttle : false,
  814. // special visibility type
  815. type : false,
  816. transition : 'fade in',
  817. duration : 500,
  818. // array of callbacks for percentage
  819. onPassed : {},
  820. // standard callbacks
  821. onPassing : false,
  822. onTopVisible : false,
  823. onBottomVisible : false,
  824. onTopPassed : false,
  825. onBottomPassed : false,
  826. // reverse callbacks
  827. onPassingReverse : false,
  828. onTopVisibleReverse : false,
  829. onBottomVisibleReverse : false,
  830. onTopPassedReverse : false,
  831. onBottomPassedReverse : false,
  832. once : true,
  833. continuous : false,
  834. // utility callbacks
  835. onRefresh : function(){},
  836. onScroll : function(){},
  837. error : {
  838. method : 'The method you called is not defined.'
  839. }
  840. };
  841. })( jQuery, window , document );