Source: addons/preloader.js

  1. import register from "../util/register.js";
  2. import m_cont_fact from "../extern/container.js";
  3. /**
  4. * Preloader add-on.
  5. * Provides API to create various types of standard preloaders.
  6. * @module preloader
  7. */
  8. function Preloader(ns, exports) {
  9. var m_cont = m_cont_fact(ns);
  10. var PL_CONT_BG_COLOR = "#484848";
  11. var PL_BAR_BG_COLOR = "#5276cf";
  12. var PL_BAR_BORDER_COLOR = "rgba(150, 150, 150, 0.7)";
  13. var PL_FONT_COLOR = "#fff";
  14. var _preloader = {};
  15. var _canvas_container_elem = null;
  16. /**
  17. * Create a preloader.
  18. * @param {Object} options Initialization options.
  19. * @param {string} [options.container_color] The CSS background color of the preloader container.
  20. * @param {string} [options.bar_color] The CSS background color of the preloader bar.
  21. * @param {string} [options.frame_color] The CSS color of the preloader frame border.
  22. * @param {string} [options.font_color] The CSS color of the preloader font.
  23. * @cc_externs container_color bar_color frame_color font_color
  24. */
  25. exports.create_preloader = function(options) {
  26. var container_color = PL_CONT_BG_COLOR;
  27. var bar_color = PL_BAR_BG_COLOR;
  28. var frame_color = PL_BAR_BORDER_COLOR;
  29. var font_color = PL_FONT_COLOR;
  30. for (var opt in options) {
  31. switch (opt) {
  32. case "container_color":
  33. container_color = options.container_color;
  34. break;
  35. case "bar_color":
  36. bar_color = options.bar_color;
  37. break;
  38. case "frame_color":
  39. frame_color = options.frame_color;
  40. break;
  41. case "font_color":
  42. font_color = options.font_color;
  43. break;
  44. }
  45. }
  46. var pl_cont = document.createElement("div");
  47. var pl_bar = pl_cont.cloneNode(false);
  48. var pl_frame = pl_cont.cloneNode(false);
  49. var pl_caption = pl_cont.cloneNode(false);
  50. var canvas_cont = m_cont.get_container();
  51. pl_frame.appendChild(pl_bar);
  52. pl_frame.appendChild(pl_caption);
  53. pl_cont.appendChild(pl_frame);
  54. canvas_cont.appendChild(pl_cont);
  55. pl_cont.style.cssText =
  56. "background-color: " + container_color + ";" +
  57. "width: 100%;" +
  58. "height: 100%;" +
  59. "position: absolute;" +
  60. "top: 0;" +
  61. "left: 0;";
  62. pl_frame.style.cssText =
  63. "position: absolute;" +
  64. "left: 50%;" +
  65. "top: 50%;" +
  66. "margin-left: -150px;" +
  67. "margin-top: -30px;" +
  68. "width: 300px;" +
  69. "height: 28px;" +
  70. "box-shadow: 0px 0px 10px 0px " + frame_color + ";" +
  71. "border: 2px solid " + frame_color + ";";
  72. pl_bar.style.cssText =
  73. "position: absolute;" +
  74. "width: 0%;" +
  75. "top: 0;" +
  76. "left: 0;" +
  77. "background-color: " + bar_color + ";" +
  78. "height: 100%;";
  79. pl_caption.style.cssText =
  80. "font-family: Arial, sans-serif;" +
  81. "line-height: 28px;" +
  82. "height: 100%;" +
  83. "width: 100%;" +
  84. "top: 0;" +
  85. "left: 0;" +
  86. "text-align: center;" +
  87. "position: absolute;" +
  88. "font-size: 16px;" +
  89. "font-weight: bold;" +
  90. "text-shadow: 0px 0px 6px " + frame_color + ";" +
  91. "color: " + font_color + ";";
  92. _preloader.bar = pl_bar;
  93. _preloader.caption = pl_caption;
  94. _preloader.container = pl_cont;
  95. _preloader.type = "DEFAULT";
  96. }
  97. /**
  98. * Create a simple preloader.
  99. * @param {Object} options Initialization options.
  100. * @param {string} options.canvas_container_id Canvas container ID.
  101. * @param {string} [options.background_container_id] Background container ID.
  102. * @param {string} [options.bg_color] Background color.
  103. * @param {string} [options.bar_color] Load bar color.
  104. * @cc_externs bar_color bg_color background_container_id
  105. * @cc_externs canvas_container_id preloader_fadeout
  106. * @deprecated Use custom preloader or {@link module:preloader.create_preloader|preloader.create_preloader}.
  107. */
  108. exports.create_simple_preloader = function(options) {
  109. var canvas_container_id = null;
  110. var background_container_id = null;
  111. var bar_color = "#bf9221";
  112. var bg_color = "#000";
  113. for (var opt in options) {
  114. switch (opt) {
  115. case "canvas_container_id":
  116. canvas_container_id = options.canvas_container_id;
  117. break;
  118. case "background_container_id":
  119. background_container_id = options.background_container_id;
  120. break;
  121. case "bg_color":
  122. bg_color = options.bg_color;
  123. break;
  124. case "bar_color":
  125. bar_color = options.bar_color;
  126. break;
  127. case "preloader_fadeout":
  128. _preloader.fadeout = options.preloader_fadeout;
  129. break;
  130. }
  131. }
  132. var container = document.createElement("div");
  133. var frame = document.createElement("div");
  134. container.id = "simple_preloader_container";
  135. var bar = document.createElement("div");
  136. var caption = document.createElement("div");
  137. var background_container = document.getElementById(background_container_id);
  138. _canvas_container_elem = document.getElementById(canvas_container_id);
  139. container.style.cssText =
  140. "z-index: 4;" +
  141. "background-color: " + bg_color + ";" +
  142. "width: 100%;" +
  143. "height: 100%;" +
  144. "position: absolute;" +
  145. "margin: 0;" +
  146. "padding: 0;" +
  147. "top: 0;" +
  148. "left: 0;";
  149. frame.style.cssText =
  150. "position: absolute;" +
  151. "left: 50%;" +
  152. "top: 82%;" +
  153. "width: 300px;" +
  154. "height: 20px;" +
  155. "margin-left: -150px;" +
  156. "margin-top: -10px;" +
  157. "border-style:solid;" +
  158. "border-width:4px;" +
  159. "border-color: " + "#000" + ";" +
  160. "border-radius: 0px;";
  161. bar.style.cssText =
  162. "position: absolute;" +
  163. "left: 0px;" +
  164. "top: 1px;" +
  165. "width: 0px;" +
  166. "height: 18px;" +
  167. "background-color: " + bar_color + ";" +
  168. "border-radius: 0px;";
  169. caption.style.cssText =
  170. "position: absolute;" +
  171. "left: 50%;" +
  172. "top: 50%;" +
  173. "width: 100%;" +
  174. "height: 100%;" +
  175. "margin-left: -150px;" +
  176. "margin-top: -10px;" +
  177. "text-align: center;" +
  178. "font-size: 17px;" +
  179. "font-weight: bold;" +
  180. "color: #000;" +
  181. "font-family: Verdana;" +
  182. frame.appendChild(bar);
  183. frame.appendChild(caption);
  184. container.appendChild(frame);
  185. document.body.appendChild(container);
  186. _preloader.type = "SIMPLE";
  187. _preloader.container = container;
  188. _preloader.bar = bar;
  189. _preloader.caption = caption;
  190. _preloader.background = background_container;
  191. }
  192. /**
  193. * Create a rotation preloader.
  194. * @param {Object} options Initialization options.
  195. * @param {string} options.canvas_container_id Canvas container ID.
  196. * @param {string} [options.background_container_id] Background container ID.
  197. * @param {string} [options.bg_color] Background color.
  198. * @param {string} [options.frame_bg_color] Frame background color.
  199. * @param {string} [options.frame_class] CSS frame class.
  200. * @param {string} [options.anim_elem_class] Animated element class.
  201. * @cc_externs frame_bg_color frame_class anim_elem_class
  202. * @deprecated Use custom preloader or {@link module:preloader.create_preloader|preloader.create_preloader}.
  203. */
  204. exports.create_rotation_preloader = function(options) {
  205. var canvas_container_id = null;
  206. var background_container_id = null;
  207. var frame_bg_color = "rgba(0,0,0,0)";
  208. var frame_class = "";
  209. var anim_elem_class = "";
  210. var bg_color = "rgba(0,0,0,0)";
  211. for (var opt in options) {
  212. switch (opt) {
  213. case "canvas_container_id":
  214. canvas_container_id = options.canvas_container_id;
  215. break;
  216. case "background_container_id":
  217. background_container_id = options.background_container_id;
  218. break;
  219. case "frame_bg_color":
  220. frame_bg_color = options.frame_bg_color;
  221. break;
  222. case "bg_color":
  223. bg_color = options.bg_color;
  224. break;
  225. case "frame_class":
  226. frame_class = options.frame_class;
  227. break;
  228. case "anim_elem_class":
  229. anim_elem_class = options.anim_elem_class;
  230. break;
  231. }
  232. }
  233. var container = document.createElement("div");
  234. var frame = document.createElement("div");
  235. var anim_elem = document.createElement("div");
  236. var caption = document.createElement("div");
  237. var background_container = document.getElementById(background_container_id);
  238. _canvas_container_elem = document.getElementById(canvas_container_id);
  239. container.style.cssText =
  240. "z-index: 4;" +
  241. "background-color: " + bg_color + ";" +
  242. "width: 100%;" +
  243. "height: 100%;" +
  244. "position: absolute;" +
  245. "margin: 0;" +
  246. "padding: 0;" +
  247. "top: 0;" +
  248. "left: 0;";
  249. frame.style.cssText =
  250. "position: absolute;" +
  251. "left: 50%;" +
  252. "top: 50%;" +
  253. "width: 117px;" +
  254. "height: 117px;" +
  255. "margin-left: -58px;" +
  256. "margin-top: -58px;" +
  257. "background-color: " + frame_bg_color + ";";
  258. anim_elem.style.cssText =
  259. "position: absolute;" +
  260. "left: 0px;" +
  261. "top: 0px;" +
  262. "width: 100%;" +
  263. "height: 100%;" +
  264. "background-position: center;" +
  265. "background-repeat: no-repeat;";
  266. caption.style.cssText =
  267. "position: absolute;" +
  268. "width: 100%;" +
  269. "height: 100%;" +
  270. "text-align: center;" +
  271. "margin-top: 38px;" +
  272. "font-size: 36px;" +
  273. "color: #ffffff;" +
  274. "font-family: Arial;" +
  275. "font-weight: bold;";
  276. anim_elem.className = anim_elem_class;
  277. frame.appendChild(anim_elem);
  278. frame.className = frame_class;
  279. frame.appendChild(caption);
  280. container.appendChild(frame);
  281. _canvas_container_elem.appendChild(container);
  282. _preloader.type = "ROTATION";
  283. _preloader.container = container;
  284. _preloader.anim_elem = anim_elem;
  285. _preloader.caption = caption;
  286. _preloader.background = background_container;
  287. }
  288. /**
  289. * Create an advanced preloader.
  290. * @param {Object} options Initialization options.
  291. * @param {string} options.canvas_container_id Canvas container ID.
  292. * @param {string} options.background_container_id Background container ID.
  293. * @param {string} options.preloader_bar_id Preloader bar ID.
  294. * @param {string} options.fill_band_id Preloader band ID.
  295. * @param {string} options.preloader_caption_id Preloader caption ID.
  296. * @param {string} options.preloader_container_id Preloader container ID.
  297. * @param {number} options.img_width Device image width.
  298. * @param {number} options.preloader_width Preloader width.
  299. * @cc_externs fill_band_id preloader_bar_id preloader_caption_id
  300. * @cc_externs preloader_container_id img_width preloader_width
  301. * @deprecated Use custom preloader or {@link module:preloader.create_preloader|preloader.create_preloader}.
  302. */
  303. exports.create_advanced_preloader = function(options) {
  304. var img_width = options.img_width;
  305. var preloader_width = options.preloader_width;
  306. var canvas_container_id = options.canvas_container_id;
  307. var band_width = preloader_width - img_width;
  308. var ratio = preloader_width / band_width;
  309. var preloader_bar = document.getElementById(options.preloader_bar_id);
  310. var fill_band = document.getElementById(options.fill_band_id);
  311. var preloader_caption = document.getElementById(options.preloader_caption_id);
  312. var preloader_container = document.getElementById(options.preloader_container_id);
  313. var background_container = document.getElementById(options.background_container_id);
  314. _canvas_container_elem = document.getElementById(canvas_container_id);
  315. _preloader.type = "ADVANCED";
  316. _preloader.bar = preloader_bar;
  317. _preloader.fill = fill_band;
  318. _preloader.ratio = ratio;
  319. _preloader.caption = preloader_caption;
  320. _preloader.container = preloader_container;
  321. _preloader.background = background_container;
  322. }
  323. /**
  324. * Update the preloader bar status.
  325. * @param {number} percentage The new preloader bar percentage
  326. */
  327. exports.update_preloader = function(percentage) {
  328. _preloader.caption.innerHTML = percentage + "%";
  329. if (_preloader.type == "SIMPLE")
  330. _preloader.bar.style.width = percentage + "%";
  331. else if (_preloader.type == "ADVANCED") {
  332. _preloader.bar.style.width = percentage / _preloader.ratio + "%";
  333. _preloader.fill.style.width = (100 - percentage) + "%";
  334. } else if (_preloader.type == "ROTATION")
  335. _preloader.anim_elem.style.transform = "rotate(" + percentage + "deg)";
  336. else if (_preloader.type == "DEFAULT")
  337. _preloader.bar.style.width = percentage + "%";
  338. if (percentage == 100) {
  339. _preloader.container.parentNode.removeChild(_preloader.container);
  340. if (_preloader.background)
  341. _preloader.background.parentNode.removeChild(_preloader.background);
  342. }
  343. }
  344. }
  345. var preloader_factory = register("preloader", Preloader);
  346. export default preloader_factory;