zeloras

Untitled

May 1st, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.03 KB | None | 0 0
  1. let _eventHandlers = {};
  2.  
  3. let DomHelpers = {
  4. /**
  5. * Find parent element by classname and return her or null
  6. * @return Null|Object;
  7. */
  8. findParentByClass: function (elem, classname) {
  9. let self = this;
  10. if (elem != null) {
  11. let parent = elem.parentNode;
  12.  
  13. if (parent != null) {
  14. if (parent.classList && parent.classList.contains(classname)) {
  15. return parent;
  16. } else {
  17. return self.findParentByClass(parent, classname);
  18. }
  19. }
  20. }
  21.  
  22. return null;
  23. },
  24.  
  25. parseHtmlToDom: function (data) {
  26. let html = new DOMParser().parseFromString( data , 'text/html');
  27. return html.body.firstChild;
  28. },
  29.  
  30. addListener: function (node, event, handler, capture) {
  31. let self = this;
  32.  
  33. // Remove prebinded elements
  34. self.removeAllListeners(node, event);
  35.  
  36. if(!(node in _eventHandlers)) {
  37. // _eventHandlers stores references to nodes
  38. _eventHandlers[node] = {};
  39. }
  40. if(!(event in _eventHandlers[node])) {
  41. // each entry contains another entry for each event type
  42. _eventHandlers[node][event] = [];
  43. }
  44. // capture reference
  45. _eventHandlers[node][event].push([handler, capture]);
  46. node.addEventListener(event, handler, capture);
  47. },
  48.  
  49. removeAllListeners: function (node, event) {
  50. if(node in _eventHandlers) {
  51. let handlers = _eventHandlers[node];
  52. if(event in handlers) {
  53. let eventHandlers = handlers[event];
  54. for(var i = eventHandlers.length; i--;) {
  55. let handler = eventHandlers[i];
  56. node.removeEventListener(event, handler[0], handler[1]);
  57. }
  58. }
  59. }
  60. },
  61.  
  62. overlaysClose: function (notActiveArea, removeFrom, removeClass, callback) {
  63. let self = this;
  64.  
  65. document.addEventListener('click', function (e) {
  66. let tryFindParentNeed = self.findParentByClass(e.target, notActiveArea);
  67. let ifCurrentNeed = e.target.classList.contains(notActiveArea);
  68.  
  69. if (tryFindParentNeed !== null || ifCurrentNeed) {
  70. return false;
  71. } else {
  72. let findElem = document.querySelector(removeFrom);
  73. findElem.classList.remove(removeClass);
  74. }
  75. }, true);
  76. }
  77. };
  78.  
  79. let CustomSelect = {
  80. config: {
  81. 'modify': '.custom-select',
  82. 'blockClass': 'custom-select-block',
  83. 'selector': 'custom-select-block__main',
  84. 'currentOption': 'custom-select-block__title',
  85. 'options': 'custom-select-block__options',
  86. 'option': 'custom-select-block__option',
  87. 'multiselect': 'custom-select_multiselect',
  88. 'active': 'active',
  89. 'optionSelected': 'custom-select-block__option_state_selected',
  90. 'classOperator': '.'
  91. },
  92.  
  93. init: function () {
  94. let self = this;
  95. let config = self.config;
  96. let items = document.querySelectorAll(config.modify);
  97. let currentCustom = null;
  98. let customOptions = null;
  99.  
  100. for (let x of items) {
  101. currentCustom = self.createBlock(x);
  102. customOptions = currentCustom.querySelectorAll(config.classOperator + config.option);
  103. for (let i of customOptions) {
  104. DomHelpers.addListener(i, 'click', function (e) {
  105. self.selectOption(e);
  106. }, false);
  107. }
  108.  
  109. DomHelpers.addListener(currentCustom, 'click', function (e) {
  110. self.changeVisible(e);
  111. }, false);
  112.  
  113. document.addEventListener('click', function (e) {
  114. self.outWindowClick(e);
  115. }, false);
  116. }
  117. },
  118.  
  119. /**
  120. * First, we need create block and put in block hidden select
  121. * @return Object
  122. */
  123. createBlock: function (elem) {
  124. let self = this;
  125. let config = self.config;
  126. let currentTitle = 'All';
  127. let options = "";
  128. let selected = "";
  129. let cloned = elem.cloneNode(true);
  130. let modsClass = " ";
  131. let ismultiselect = elem.classList.contains(config.multiselect);
  132.  
  133. if (cloned.dataset.mods !== undefined) {
  134. modsClass += cloned.dataset.mods;
  135. }
  136.  
  137. // get all chidrens and create elements with current data
  138. for (let x of cloned.children) {
  139. selected = "";
  140. if (x.selected) {
  141. selected = " " + config.optionSelected;
  142. currentTitle = x.textContent;
  143. }
  144. options += "<div class='" + config.option + selected + "' data-value='" + x.value + "'>" + x.textContent + "</div>\n"
  145. }
  146.  
  147. // Create first time template
  148. let firstBlock = "<div class='" + config.currentOption + "'>" + currentTitle + "</div>";
  149. if (ismultiselect) {
  150. firstBlock = "";
  151. }
  152. let template = "<div class='" + config.blockClass + modsClass + "'>" +
  153. "<div class='" + config.selector + "'>" +
  154. firstBlock+
  155. "</div>" +
  156. "<div class='" + config.options + "'>" + options + "</div>" +
  157. "</div>";
  158.  
  159. // Change our html template to dom tree, after that we paste select in this template
  160. let workNode = DomHelpers.parseHtmlToDom(template);
  161. workNode.appendChild(cloned);
  162. elem.parentNode.appendChild(workNode);
  163. elem.remove();
  164.  
  165. return workNode;
  166. },
  167.  
  168. /**
  169. * Add binds to block
  170. * @return Object
  171. */
  172. changeVisible: function (e) {
  173. let self = this;
  174. let config = self.config;
  175. let parent = (e.target.classList.contains(config.blockClass)) ? e.target : DomHelpers.findParentByClass(e.target, config.blockClass);
  176. let elems = document.querySelectorAll(config.classOperator + config.blockClass + config.classOperator + config.active);
  177.  
  178. for (let x of elems) {
  179. if (!x.isEqualNode(parent)) {
  180. x.classList.remove(config.active);
  181. }
  182. }
  183.  
  184. parent.classList.toggle(config.active);
  185. return parent;
  186. },
  187. /**
  188. * Catch custom div option and change value for select
  189. * @return object
  190. */
  191. selectOption: function (e) {
  192. let self = this;
  193. let config = self.config;
  194. let target = e.target;
  195. let rootNode = DomHelpers.findParentByClass(target, config.blockClass);
  196. let select = rootNode.querySelector(config.modify);
  197. let selectedOptions = select.selectedOptions
  198. let findByValue = select.querySelector("[value='" + target.dataset.value + "']");
  199. let activeCustomOpt = rootNode.querySelectorAll(config.classOperator + config.optionSelected);
  200. let ismultiselect = select.classList.contains(config.multiselect);
  201.  
  202. if (!ismultiselect) {
  203. // Now remove select statuses from another options and set selected option
  204. rootNode.querySelector(config.classOperator + config.currentOption).textContent = target.textContent;
  205.  
  206. for (let x of selectedOptions) {
  207. x.selected = null;
  208. }
  209. select.value = null;
  210. findByValue.value = target.dataset.value;
  211. // Remove old statuses and add new
  212. for (let x of activeCustomOpt) {
  213. x.classList.remove(config.optionSelected);
  214. }
  215. } else {
  216. if (!findByValue.selected) {
  217. let template = "<div class='" + config.currentOption + "' data-value='" + target.dataset.value + "'>" + target.textContent + "</div>";
  218. let workNode = DomHelpers.parseHtmlToDom(template);
  219. rootNode.querySelector(config.classOperator + config.selector).appendChild(workNode)
  220. }
  221. }
  222.  
  223. if (!ismultiselect || ismultiselect && !findByValue.selected) {
  224. findByValue.selected = true;
  225. target.classList.add(config.optionSelected);
  226. } else {
  227. let selectList = rootNode.querySelectorAll(config.classOperator + config.currentOption);
  228. findByValue.selected = false;
  229. for (let x of activeCustomOpt) {
  230. if (x.dataset.value === target.dataset.value) {
  231. x.classList.remove(config.optionSelected);
  232. }
  233. }
  234.  
  235. for (let x of selectList) {
  236. if (x.dataset.value === target.dataset.value) {
  237. x.remove();
  238. }
  239. }
  240. }
  241.  
  242. return target;
  243. },
  244.  
  245. /**
  246. * Close all open selects
  247. * @return bool
  248. */
  249. outWindowClick: function (e) {
  250. let self = this;
  251. let config = self.config;
  252. let target = e.target;
  253. let checkRoot = DomHelpers.findParentByClass(target, config.blockClass);
  254. let activeCustomSelects = document.querySelectorAll(config.classOperator + config.blockClass + config.classOperator + config.active);
  255.  
  256. if (!target.classList.contains(config.blockClass) && checkRoot == null) {
  257. for (let x of activeCustomSelects) {
  258. x.classList.remove(config.active);
  259. }
  260. return true;
  261. }
  262. return true;
  263. }
  264. };
  265.  
  266. let Expander = {
  267. config: {
  268. 'block': 'expander',
  269. 'element': 'expander__item',
  270. 'container': 'expander__block',
  271. 'active': 'active',
  272. 'animated': 'animated',
  273. 'separator': '.'
  274. },
  275.  
  276. init: function () {
  277. let self = this;
  278. let config = self.config;
  279. let elems = document.querySelectorAll(config.separator + config.element);
  280.  
  281. for (let x of elems) {
  282. DomHelpers.addListener(x, 'click', function (e) {
  283. self.changeVisible(e);
  284. }, false);
  285. }
  286. },
  287.  
  288. changeVisible: function (e) {
  289. let self = this;
  290. let config = self.config;
  291. let parentNode = DomHelpers.findParentByClass(e.target, config.block);
  292. let classes = parentNode.classList;
  293. let whatcanido = (classes.contains(config.deactive)) ? [config.active, config.deactive] : [config.deactive, config.active];
  294.  
  295. if (classes.contains(config.active) && !classes.contains(config.animated)) {
  296. classes.add(config.animated);
  297. }
  298.  
  299. classes.toggle(config.active);
  300. }
  301. };
  302.  
  303. let Validator = {
  304. config: {
  305. 'defForm': 'form-validator',
  306. 'errorBlock': 'form-validator__message',
  307. 'errorClass': 'form-validator__error',
  308. 'dataPatternElem': 'pattern',
  309. 'dataPatternElemText': 'error',
  310. 'active': 'active',
  311. 'separator': '.'
  312. },
  313.  
  314. init: function () {
  315. let self = this;
  316. let config = self.config;
  317. let defElems = document.querySelectorAll(config.separator + config.defForm);
  318.  
  319. for (let x of defElems) {
  320. DomHelpers.addListener(x, 'submit', function (e) {
  321. if (self.checkInputs(e)) {
  322. return true;
  323. }
  324.  
  325. e.preventDefault();
  326. }, false);
  327. }
  328. },
  329.  
  330. checkInputs: function (elem) {
  331. let self = this;
  332. let config = self.config;
  333. let element = elem.target;
  334. let valElems = element.querySelectorAll('[data-' + config.dataPatternElem + ']');
  335. let noErr = valElems.length;
  336.  
  337. for (let x of valElems) {
  338. if (self.checkRule(x)) {
  339. noErr--;
  340. }
  341. }
  342.  
  343. return (noErr > 0) ? false : true;
  344. },
  345.  
  346. checkRule: function (elem) {
  347. let self = this;
  348. let config = self.config;
  349. let pattern = elem.dataset[config.dataPatternElem];
  350. let val = elem.value;
  351. let parent = elem.parentNode;
  352. if (!parent) {
  353. alert('fck u');
  354. }
  355. let errorBlock = parent.querySelector(config.separator + config.errorBlock);
  356.  
  357. if (pattern) {
  358. let regexp = new RegExp(pattern, 'gm');
  359. let errorText = elem.dataset[config.dataPatternElemText];
  360. if (!regexp.test(val)) {
  361. if (errorBlock) {
  362. errorBlock.textContent = errorText;
  363. errorBlock.classList.add(config.active);
  364. }
  365. elem.classList.add(config.errorClass);
  366.  
  367. return false;
  368. }
  369. }
  370.  
  371. elem.classList.remove(config.errorClass);
  372. if (errorBlock) {
  373. errorBlock.classList.remove(config.active);
  374. }
  375.  
  376. return true;
  377. }
  378. };
  379.  
  380. let ScrollTo = {
  381. config: {
  382. 'element': 'scrollto',
  383. 'data_attr': 'scroll',
  384. 'speed': 400,
  385. 'separator': '.'
  386. },
  387.  
  388. init: function () {
  389. let self = this;
  390. let config = self.config;
  391. let elems = document.querySelectorAll(config.separator + config.element);
  392.  
  393. for (let x of elems) {
  394. DomHelpers.addListener(x, 'click', function (e) {
  395. let to_element = e.target.dataset[config.data_attr];
  396. if (to_element) {
  397. let elem = document.querySelectorAll(to_element);
  398. if (elem) {
  399. self.block(elem, 'html');
  400. }
  401. }
  402. }, false);
  403. }
  404. },
  405.  
  406. block: function (to_element, fromBlock) {
  407. let self = this;
  408. let config = self.config;
  409. let current_duration = 0;
  410. let start_block = document.querySelector(fromBlock);
  411. let start_offset_height = start_block.offsetHeight / 2;
  412. let current_position = start_block.scrollTop;
  413. if (to_element) {
  414. let point_position = to_element.offsetTop;
  415. let distance = (point_position - current_position);
  416. console.log(distance);
  417. const animateScroll = (() => {
  418. current_duration += 20;
  419. const val = self.easeInOutQuad(current_duration, current_position, distance, config.speed);
  420. start_block.scrollTop = val;
  421. console.log(val);
  422.  
  423. if (current_duration < config.speed) {
  424. setTimeout(animateScroll, 20);
  425. }
  426. });
  427.  
  428. animateScroll();
  429. }
  430.  
  431. return false;
  432. },
  433.  
  434. easeInOutQuad: function (t, b, c, d) {
  435. t /= d / 2;
  436. if (t < 1) return c / 2 * t * t + b;
  437. t--;
  438. return -c / 2 * (t * (t - 2) - 1) + b;
  439. }
  440. };
  441.  
  442. Validator.init();
  443. Expander.init();
  444. CustomSelect.init();
  445.  
  446. let ckeEdit = document.querySelectorAll('#editor');
  447.  
  448. for (let x of ckeEdit) {
  449. ClassicEditor.create( x ).catch(error => {
  450. console.error( error );
  451. });
  452. }
Advertisement
Add Comment
Please, Sign In to add comment