PageRenderTime 26ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/dist/js/jquery.gridder.js

https://gitlab.com/oytunistrator/gridder
JavaScript | 246 lines | 163 code | 40 blank | 43 comment | 15 complexity | 617d3246e8e6636e4f940d0498aeedab MD5 | raw file
  1. /*
  2. * Gridder - v1.4.2
  3. * A jQuery plugin that displays a thumbnail grid expanding preview similar to the effect seen on Google Images.
  4. * http://www.oriongunning.com/
  5. *
  6. * Made by Orion Gunning
  7. * Under MIT License
  8. */
  9. ;(function($) {
  10. //Ensures there will be no 'console is undefined' errors in IE
  11. window.console = window.console || (function(){
  12. var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(){};
  13. return c;
  14. })();
  15. /* Custom Easing */
  16. $.fn.extend($.easing,{
  17. def:"easeInOutExpo", easeInOutExpo:function(e,f,a,h,g){if(f===0){return a;}if(f===g){return a+h;}if((f/=g/2)<1){return h/2*Math.pow(2,10*(f-1))+a;}return h/2*(-Math.pow(2,-10*--f)+2)+a;}
  18. });
  19. /* KEYPRESS LEFT & RIGHT ARROW */
  20. /* This will work only if a current gridder is opened. */
  21. $(document).keydown(function(e) {
  22. var keycode = e.keyCode;
  23. var $current_gridder = $(".currentGridder");
  24. var $current_target = $current_gridder.find(".gridder-show");
  25. if($current_gridder.length){
  26. if ( keycode === 37 ) {
  27. console.log("Pressed Left Arrow");
  28. $current_target.prev().prev().trigger("click");
  29. e.preventDefault();
  30. }
  31. if ( keycode === 39 ) {
  32. console.log("Pressed Right Arrow");
  33. $current_target.next().trigger("click");
  34. e.preventDefault();
  35. }
  36. }else{
  37. console.log("No active gridder.");
  38. }
  39. });
  40. $.fn.gridderExpander = function(options) {
  41. /* GET DEFAULT OPTIONS OR USE THE ONE PASSED IN THE FUNCTION */
  42. var settings = $.extend( {}, $.fn.gridderExpander.defaults, options );
  43. return this.each(function() {
  44. var mybloc;
  45. var _this = $(this);
  46. var visible = false;
  47. // START CALLBACK
  48. settings.onStart(_this);
  49. // CLOSE FUNCTION
  50. function closeExpander(base) {
  51. // SCROLL TO CORRECT POSITION FIRST
  52. if(settings.scroll){
  53. $("html, body").animate({
  54. scrollTop: base.find(".selectedItem").offset().top - settings.scrollOffset
  55. }, {
  56. duration: 200,
  57. easing: settings.animationEasing
  58. });
  59. }
  60. _this.removeClass("hasSelectedItem");
  61. // REMOVES GRIDDER EXPAND AREA
  62. visible = false;
  63. base.find(".selectedItem").removeClass("selectedItem");
  64. base.find(".gridder-show").slideUp(settings.animationSpeed, settings.animationEasing, function() {
  65. base.find(".gridder-show").remove();
  66. settings.onClosed(base);
  67. });
  68. /* REMOVE CURRENT ACTIVE GRIDDER */
  69. $(".currentGridder").removeClass("currentGridder");
  70. }
  71. // OPEN EXPANDER
  72. function openExpander(myself) {
  73. /* CURRENT ACTIVE GRIDDER */
  74. $(".currentGridder").removeClass("currentGridder");
  75. _this.addClass("currentGridder");
  76. /* ENSURES THE CORRECT BLOC IS ACTIVE */
  77. if (!myself.hasClass("selectedItem")) {
  78. _this.find(".selectedItem").removeClass("selectedItem");
  79. myself.addClass("selectedItem");
  80. } else {
  81. // THE SAME IS ALREADY OPEN, LET"S CLOSE IT
  82. closeExpander(_this, settings);
  83. return;
  84. }
  85. /* REMOVES PREVIOUS BLOC */
  86. _this.find(".gridder-show").remove();
  87. /* ADD CLASS TO THE GRIDDER CONTAINER
  88. * So you can apply global style when item selected.
  89. */
  90. if (!_this.hasClass("hasSelectedItem")) {
  91. _this.addClass("hasSelectedItem");
  92. }
  93. /* ADD LOADING BLOC */
  94. var $htmlcontent = $("<div class=\"gridder-show loading\"></div>");
  95. mybloc = $htmlcontent.insertAfter(myself);
  96. /* GET CONTENT VIA AJAX OR #ID*/
  97. var thecontent = "";
  98. if( myself.data("griddercontent").indexOf("#") === 0 ) {
  99. // Load #ID Content
  100. thecontent = $(myself.data("griddercontent")).html();
  101. processContent(myself, thecontent);
  102. }else{
  103. // Load AJAX Content
  104. $.ajax({
  105. type: "POST",
  106. url: myself.data("griddercontent"),
  107. success: function(data) {
  108. thecontent = data;
  109. processContent(myself, thecontent);
  110. },
  111. error: function (request) {
  112. thecontent = request.responseText;
  113. processContent(myself, thecontent);
  114. }
  115. });
  116. }
  117. }
  118. // PROCESS CONTENT
  119. function processContent(myself, thecontent){
  120. /* FORMAT OUTPUT */
  121. var htmlcontent = "<div class=\"gridder-padding\">";
  122. if(settings.showNav){
  123. /* CHECK IF PREV AND NEXT BUTTON HAVE ITEMS */
  124. var prevItem = ($(".selectedItem").prev());
  125. var nextItem = ($(".selectedItem").next().next());
  126. htmlcontent += "<div class=\"gridder-navigation\">";
  127. htmlcontent += "<a href=\"#\" class=\"gridder-close\">"+settings.closeText+"</a>";
  128. htmlcontent += "<a href=\"#\" class=\"gridder-nav prev "+(!prevItem.length?"disabled":"")+"\">"+settings.prevText+"</a>";
  129. htmlcontent += "<a href=\"#\" class=\"gridder-nav next "+(!nextItem.length?"disabled":"")+"\">"+settings.nextText+"</a>";
  130. htmlcontent += "</div>";
  131. }
  132. htmlcontent += "<div class=\"gridder-expanded-content\">";
  133. htmlcontent += thecontent;
  134. htmlcontent += "</div>";
  135. htmlcontent += "</div>";
  136. // IF EXPANDER IS ALREADY EXPANDED
  137. if (!visible) {
  138. mybloc.hide().append(htmlcontent).slideDown(settings.animationSpeed, settings.animationEasing, function () {
  139. visible = true;
  140. /* AFTER EXPAND CALLBACK */
  141. if ($.isFunction(settings.onContent)) {
  142. settings.onContent(mybloc);
  143. }
  144. });
  145. } else {
  146. mybloc.html(htmlcontent);
  147. mybloc.find(".gridder-padding").fadeIn(settings.animationSpeed, settings.animationEasing, function () {
  148. visible = true;
  149. /* CHANGED CALLBACK */
  150. if ($.isFunction(settings.onContent)) {
  151. settings.onContent(mybloc);
  152. }
  153. });
  154. }
  155. /* SCROLL TO CORRECT POSITION AFTER */
  156. if (settings.scroll) {
  157. var offset = (settings.scrollTo === "panel" ? myself.offset().top + myself.height() - settings.scrollOffset : myself.offset().top - settings.scrollOffset);
  158. $("html, body").animate({
  159. scrollTop: offset
  160. }, {
  161. duration: settings.animationSpeed,
  162. easing: settings.animationEasing
  163. });
  164. }
  165. /* REMOVE LOADING CLASS */
  166. mybloc.removeClass("loading");
  167. }
  168. /* CLICK EVENT */
  169. _this.on("click", ".gridder-list", function (e) {
  170. e.preventDefault();
  171. var myself = $(this);
  172. openExpander(myself);
  173. });
  174. /* NEXT BUTTON */
  175. _this.on("click", ".gridder-nav.next", function(e) {
  176. e.preventDefault();
  177. $(this).parents(".gridder-show").next().trigger("click");
  178. });
  179. /* PREVIOUS BUTTON */
  180. _this.on("click", ".gridder-nav.prev", function(e) {
  181. e.preventDefault();
  182. $(this).parents(".gridder-show").prev().prev().trigger("click");
  183. });
  184. /* CLOSE BUTTON */
  185. _this.on("click", ".gridder-close", function(e) {
  186. e.preventDefault();
  187. closeExpander(_this);
  188. });
  189. });
  190. };
  191. // Default Options
  192. $.fn.gridderExpander.defaults = {
  193. scroll: true,
  194. scrollOffset: 30,
  195. scrollTo: "panel", // panel or listitem
  196. animationSpeed: 400,
  197. animationEasing: "easeInOutExpo",
  198. showNav: true,
  199. nextText: "Next",
  200. prevText: "Previous",
  201. closeText: "Close",
  202. onStart: function(){},
  203. onContent: function(){},
  204. onClosed: function(){}
  205. };
  206. })(jQuery);