Advertisement
Guest User

Untitled

a guest
Jul 26th, 2014
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.57 KB | None | 0 0
  1. ;(function (window, document, undefined) {
  2. var docElem = document.documentElement;
  3.  
  4. var DomM = (function() {
  5. var f_ToDOMStyle = function (p_Style) {
  6. return p_Style.replace(/-[a-z]/g, function (p_Style) {
  7. return p_Style.charAt(1).toUpperCase();
  8. });
  9. };
  10.  
  11. return {
  12. event: {
  13. set: function (p_Element, p_Events, p_Function) {
  14. var i = 0,
  15. j = 0;
  16.  
  17. p_Events = p_Events.split(" ");
  18.  
  19. if (!p_Element.length) {
  20. for (i = 0; i < p_Events.length; i++) {
  21. p_Element.addEventListener(p_Events[i], p_Function, false);
  22. }
  23. } else {
  24. for (i = 0; i < p_Element.length; i++) {
  25. for (j = 0; j < p_Events.length; j++) {
  26. p_Element[i].addEventListener(p_Events[j], p_Function, false);
  27. }
  28. }
  29. }
  30. }
  31. },
  32. css: {
  33. set: function (p_Element, p_Style) {
  34. var j;
  35. if (!p_Element.length) {
  36. for (j in p_Style) {
  37. if (p_Style.hasOwnProperty(j)) {
  38. j = f_ToDOMStyle(j);
  39. p_Element.style[j] = p_Style[j];
  40. }
  41. }
  42. } else {
  43. for (var i = 0; i < p_Element.length; i++) {
  44. for (j in p_Style) {
  45. if (p_Style.hasOwnProperty(j)) {
  46. j = f_ToDOMStyle(j);
  47. p_Element[i].style[j] = p_Style[j];
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }
  54. };
  55. }());
  56.  
  57. var _LightBox = {
  58. f_MergeObjects: function (p_Original, p_Updates) {
  59. for (var i in p_Updates) {
  60. if (p_Updates.hasOwnProperty(i)) {
  61. p_Original[i] = p_Updates[i];
  62. }
  63. }
  64. return p_Original;
  65. },
  66.  
  67. f_isFunction: function (p_Function) {
  68. return !!(p_Function && p_Function.constructor && p_Function.call && p_Function.apply);
  69. },
  70.  
  71. f_Initialize: function (p_Options) {
  72. var base = this;
  73.  
  74. base.m_Options = base.f_MergeObjects(_LightBox.options, p_Options || {});
  75. base.m_Elements = document.querySelectorAll(base.m_Options.selector);
  76. base.m_ElementsLength = base.m_Elements.length - 1;
  77. base.m_Body = document.getElementsByTagName("body")[0];
  78.  
  79. base.m_CurrentImageElement = false;
  80. base.m_CurrentImageNumber = 0;
  81. base.m_Direction = 1;
  82. base.m_InProgress = false;
  83. base.m_InstalledImageBox = false;
  84.  
  85. console.log(base.m_Elements);
  86.  
  87. // Check if hardware acceleration is supported and check if touch is enabled.
  88. base.f_CheckBrowser();
  89.  
  90. // Adds events.
  91. base.f_AddEvents();
  92. },
  93.  
  94. f_CheckBrowser: function () {
  95. var base = this,
  96. isTouch = "ontouchstart" in window || window.navigator.msMaxTouchPoints || navigator.maxTouchPoints || false,
  97. vendors = ["ms", "O", "Moz", "Webkit", "Khtml"],
  98. rootStyle = docElem.style,
  99. hardwareAccelerated = false;
  100.  
  101. if ("transform" in rootStyle) {
  102. hardwareAccelerated = true;
  103. } else {
  104. while (vendors.length) {
  105. if (vendors.pop() + "Transform" in rootStyle) {
  106. hardwareAccelerated = true;
  107. }
  108. }
  109. }
  110.  
  111. base.browser = {
  112. "isHardwareAccelerated": hardwareAccelerated,
  113. "isTouch": isTouch
  114. };
  115. },
  116.  
  117. f_AddEvents: function () {
  118. var base = this;
  119.  
  120. // Add open image event on images.
  121. for (var i = 0; i < base.m_Elements.length; i++) {
  122. (function (i) {
  123. base.m_Elements[i].addEventListener("click", function (event) {
  124. event.preventDefault();
  125.  
  126. console.log(base.m_Elements[i]);
  127.  
  128. if (base.f_isFunction(base.m_Options.onImageStart)) {
  129. base.m_Options.onImageStart();
  130. }
  131.  
  132. base.f_OpenImage(i);
  133. }, false);
  134. })(i);
  135. }
  136.  
  137. // Resize event for window.
  138. window.addEventListener("resize", function (event) {
  139. event.preventDefault();
  140.  
  141. base.f_SetImage();
  142. }, false);
  143.  
  144. // Add keyboard support.
  145. if (base.m_Options.enableKeyboard) {
  146. var keyBoard = {
  147. left: 37,
  148. right: 39,
  149. esc: 27
  150. };
  151.  
  152. window.addEventListener("keydown", function (event) {
  153. event.preventDefault();
  154.  
  155. if (base.m_CurrentImageElement) {
  156. if (base.m_InProgress) {
  157. return false;
  158. }
  159.  
  160. switch (event.keyCode) {
  161. case keyBoard.left:
  162. // If the previous one is out of target range then go to the last image.
  163. if ((base.m_CurrentImageNumber - 1) < 0) {
  164. base.f_OpenImage(base.m_ElementsLength, "left");
  165. } else {
  166. base.f_OpenImage(base.m_CurrentImageNumber - 1, "left");
  167. }
  168.  
  169. return false;
  170.  
  171. case keyBoard.right:
  172. // If the next one is out of target range then go to the first image.
  173. if ((base.m_CurrentImageNumber + 1) > base.m_ElementsLength) {
  174. base.f_OpenImage(0, "right");
  175. } else {
  176. base.f_OpenImage(base.m_CurrentImageNumber + 1, "right");
  177. }
  178.  
  179. return false;
  180.  
  181. case keyBoard.esc:
  182. base.f_QuitImage();
  183. return false;
  184. }
  185. }
  186.  
  187. return false;
  188. }, false);
  189. }
  190.  
  191. // Add document click event.
  192. if (base.m_Options.quitOnDocumentClick) {
  193. document.body.addEventListener("click", function (event) {
  194. var target = event.target ? event.target : event.srcElement;
  195.  
  196. event.preventDefault();
  197.  
  198. if (target && target.id != "imagelightbox" && base.m_CurrentImageElement && !base.m_InProgress && base.m_InstalledImageBox) {
  199. base.f_QuitImage();
  200. return false;
  201. }
  202.  
  203. return false;
  204. }, false);
  205. }
  206. },
  207.  
  208. f_OpenImage: function (p_WhichOne, p_Direction) {
  209. var base = this,
  210. newFragment = document.createDocumentFragment(),
  211. newImageElement = document.createElement("img"),
  212. target = base.m_Elements[p_WhichOne].getAttribute("href");
  213.  
  214. if (base.m_CurrentImageElement) {
  215. base.f_RemoveImage();
  216. }
  217.  
  218. if (base.f_isFunction(base.m_Options.imageLoadStart)) {
  219. base.m_Options.imageLoadStart();
  220. }
  221.  
  222. base.m_InProgress = true;
  223. base.m_InstalledImageBox = false;
  224. base.m_Direction = typeof p_Direction === "undefined" ? 1 : p_Direction == "left" ? -1 : 1;
  225.  
  226. newImageElement.setAttribute("src", target);
  227. newImageElement.setAttribute("alt", "LightBox");
  228. newImageElement.setAttribute("id", base.m_Options.boxId);
  229.  
  230. newFragment.appendChild(newImageElement);
  231. base.m_Body.appendChild(newFragment);
  232.  
  233. base.m_CurrentImageElement = document.getElementById(base.m_Options.boxId);
  234. base.m_CurrentImageElement.style.opacity = "0";
  235. base.m_CurrentImageNumber = p_WhichOne;
  236.  
  237. if (base.m_Options.quitOnImageClick) {
  238. base.f_ImageClickEvent = function (event) {
  239. event.preventDefault();
  240. base.f_QuitImage();
  241. };
  242.  
  243. base.m_CurrentImageElement.addEventListener("click", base.f_ImageClickEvent, false);
  244. }
  245.  
  246. if (base.browser.isHardwareAccelerated) {
  247. DomM.css.set(base.m_CurrentImageElement, base.f_AddTransitionSpeed(base.m_Options.animationSpeed));
  248. }
  249.  
  250. base.f_SetImage();
  251.  
  252. DomM.css.set(base.m_CurrentImageElement, base.f_doTranslateX(50 * base.m_Direction + "px"));
  253.  
  254. setTimeout(function () {
  255. if (base.browser.isHardwareAccelerated) {
  256. setTimeout(function () {
  257. DomM.css.set(base.m_CurrentImageElement, base.f_doTranslateX("0px"));
  258. }, 50);
  259. }
  260.  
  261. if (base.f_isFunction(base.m_Options.imageLoadEnd)) {
  262. base.m_Options.imageLoadEnd();
  263. }
  264. }, 20);
  265.  
  266. setTimeout(function () {
  267. base.m_InProgress = false;
  268. base.m_InstalledImageBox = true;
  269. }, base.m_Options.animationSpeed - 200);
  270. },
  271.  
  272. f_SetImage: function () {
  273. var base = this,
  274. screenHeight = window.innerHeight || docElem.offsetHeight,
  275. screenWidth = window.innerWidth || docElem.offsetWidth,
  276. tmpImage = new Image(),
  277. imageWidth, imageHeight, imageSizeRatio;
  278.  
  279. if (!base.m_CurrentImageElement) {
  280. return;
  281. }
  282.  
  283. tmpImage.onload = function () {
  284. imageWidth = this.width;
  285. imageHeight = this.height;
  286. imageSizeRatio = imageWidth / imageHeight;
  287.  
  288. if (Math.floor(screenWidth/imageSizeRatio) > screenHeight) {
  289. imageWidth = screenHeight * imageSizeRatio * 0.7;
  290. imageHeight = screenHeight * 0.7;
  291. } else {
  292. imageWidth = screenWidth * 0.7;
  293. imageHeight = screenWidth / imageSizeRatio * 0.7;
  294. }
  295.  
  296. DomM.css.set(base.m_CurrentImageElement, {
  297. "top": ((screenHeight - imageHeight) / 2) + "px",
  298. "left": ((screenWidth - imageWidth) / 2) + "px",
  299. "width": Math.floor(imageWidth) + "px",
  300. "height": Math.floor(imageHeight) + "px",
  301. "opacity": 1
  302. });
  303. };
  304.  
  305. tmpImage.src = base.m_CurrentImageElement.getAttribute("src");
  306. },
  307.  
  308. f_RemoveImage: function () {
  309. var base = this;
  310.  
  311. if (base.m_CurrentImageElement) {
  312. if (base.f_isFunction(base.m_Options.quitOnImageClick)) {
  313. base.m_CurrentImageElement.removeEventListener("click", base.f_ImageClickEvent, false);
  314. }
  315.  
  316. base.m_CurrentImageElement.parentNode.removeChild(base.m_CurrentImageElement);
  317. base.m_CurrentImageElement = false;
  318. }
  319. return false;
  320. },
  321.  
  322. f_QuitImage: function () {
  323. var base = this;
  324.  
  325. if (base.m_CurrentImageElement) {
  326. setTimeout(function () {
  327. DomM.css.set(base.m_CurrentImageElement, {
  328. "opacity": 0,
  329. "transition": ("opacity " + base.m_Options.fadeOutSpeed + "ms ease")
  330. });
  331.  
  332. setTimeout(function () {
  333. base.f_RemoveImage();
  334.  
  335. if (base.f_isFunction(base.m_Options.onImageQuit)) {
  336. base.m_Options.onImageQuit();
  337. }
  338.  
  339. }, base.m_Options.fadeOutSpeed);
  340. }, 20);
  341. }
  342. },
  343.  
  344. f_IsValidSource: function (p_Src) {
  345. return new RegExp().test(p_Src);
  346. },
  347.  
  348. f_doTranslateX: function (p_Pixels) {
  349. return {
  350. "-webkit-transform": "translateX(" + p_Pixels + ")",
  351. "-moz-transform": "translateX(" + p_Pixels + ")",
  352. "-o-transform": "translateX(" + p_Pixels + ")",
  353. "-ms-transform": "translateX(" + p_Pixels + ")",
  354. "transform": "translateX(" + p_Pixels + ")"
  355. };
  356. },
  357.  
  358. f_AddTransitionSpeed: function (p_Speed) {
  359. var base = this;
  360.  
  361. return {
  362. "-webkit-transition": "transform " + p_Speed + "ms ease, opacity " + base.m_Options.fadeInSpeed + "ms ease",
  363. "-moz-transition": "transform " + p_Speed + "ms ease, opacity " + base.m_Options.fadeInSpeed + "ms ease",
  364. "-o-transition": "transform " + p_Speed + "ms ease, opacity " + base.m_Options.fadeInSpeed + "ms ease",
  365. "transition": "transform " + p_Speed + "ms ease, opacity " + base.m_Options.fadeInSpeed + "ms ease"
  366. };
  367. }
  368. };
  369.  
  370. _LightBox.options = {
  371. selector: "[data-imagelightbox]",
  372. boxId: "imagelightbox",
  373. allowedTypes: "png|jpg|jpeg|gif",
  374.  
  375. quitOnImageClick: true,
  376. quitOnDocumentClick: true,
  377. enableKeyboard: true,
  378.  
  379. animationSpeed: 750,
  380. fadeInSpeed: 500,
  381. fadeOutSpeed: 200,
  382.  
  383. imageLoadStart: function () {},
  384. imageLoadEnd: function () {},
  385. onImageQuit: function () {},
  386. onImageStart: function () {}
  387. };
  388.  
  389. LightBox.init = function (p_Options) {
  390. _LightBox.f_Initialize(p_Options);
  391. };
  392. })(window, document, window.LightBox = window.LightBox || {});
  393.  
  394. var activityIndicatorOn = function () {
  395. var newE = document.createElement("div"),
  396. newB = document.createElement("div");
  397.  
  398. newE.setAttribute("id", "imagelightbox-loading");
  399. newE.appendChild(newB);
  400. document.body.appendChild(newE);
  401. },
  402. activityIndicatorOff = function () {
  403. var elE = document.getElementById("imagelightbox-loading");
  404. elE.parentNode.removeChild(elE);
  405. };
  406.  
  407. LightBox.init({
  408. selector: "[data-simplbox='demo1']",
  409. boxId: "simplbox"
  410. });
  411.  
  412. LightBox.init({
  413. selector: "[data-simplbox='demo2']",
  414. boxId: "simplbox",
  415. imageLoadStart: activityIndicatorOn,
  416. imageLoadEnd: activityIndicatorOff
  417. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement