function formatNumber(num, des) { var res = num.toFixed(des).toString().replace('.', ',').replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 '); return res; } function isJson(str) { try { var parsed = JSON.parse(str); if(parsed && typeof parsed === "object") { return parsed; } }catch (e) { return false; } return true; } function getChildren(n, selector) { var r = []; if(selector.charAt(0) == ".") { selector = selector.substring(1, selector.length); } for( ; n; n = n.nextSibling ) { if(selector === undefined || n.nodeType == 1) { n.className.split(" ").forEach(function(item) { if(item == selector) { r.push(n); } }); } } if(r.length == 1) { r = r[0]; } return r; }; function getSiblings(n) { return getChildren(n.parentNode.firstChild, n); } function toArray(obj) { var array = []; // iterate backwards ensuring that length is an UInt32 for(var i = obj.length >>> 0; i--;) { array[i] = obj[i]; } return array; } function outerHeight(el) { var height = el.offsetHeight; var style = getComputedStyle(el); height += parseInt(style.marginTop) + parseInt(style.marginBottom); return height; } function offsetAnchor() { if (location.hash.length !== 0) { window.scrollTo(window.scrollX, window.scrollY - 100); } } function ajax(params) { params = (typeof params !== 'undefined') ? params : {"data": {}, "url": "", type: "POST", cache: true}; params['data'] = (typeof params['data'] !== 'undefined') ? params['data'] : {}; var dataToSend = null; var trsfData = []; var completeUrl = ""; params['cache'] = (typeof params['cache']) ? params['cache'] : true; if(params['data'].constructor.name == "FormData") { for(var [key, value] of params['data'].entries()) { trsfData.push(key + "=" + value); } }else{ Object.keys(params['data']).forEach(function(key) { trsfData.push(key + "=" + params['data'][key]); }); } if(params['cache'] == false) { trsfData['cache'] = new Date().getTime(); } if(params['type'] == "POST") { var trsfDataStr = trsfData.join('&'); dataToSend = trsfDataStr; completeUrl = params['url']; }else if(params['type'] == "GET") { var trsfDataStr = trsfData.join('&'); completeUrl = params['url'] + '?' + trsfDataStr; } //console.log(params['data']); //console.log(trsfDataStr); var request = new XMLHttpRequest(); request.open(params['type'], completeUrl, true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); request.onreadystatechange = function() { if(request.readyState == 1 && request.status == 200) { // Success! var resp = {msg: "server connection established"}; if(params['connection']) { params['connection'](resp); } }else if(request.readyState == 2 && request.status == 200) { // Success! var resp = {msg: "request received"}; if(params['received']) { params['received'](resp); } }else if(request.readyState == 3 && request.status == 200) { // Success! var resp = {msg: "processing request"}; if(params['processing']) { params['processing'](resp); } }else if(request.readyState == 4 && request.status == 200) { // Success! var resp = {msg: "request finished and response is ready", response: this.response}; if(params['success']) { params['success'](resp); } }else{ // We reached our target server, but it returned an error if(params['error']) { params['error']("response-error"); } } }; request.onerror = function() { // There was a connection error of some sort params['error']("connection-error"); }; request.send(dataToSend); } function isElement(element) { return element instanceof Element || element instanceof HTMLDocument; } var $ = function(selector) { var result; if(!(this instanceof $) ) { return new $(selector); } var element = document.querySelectorAll(selector); if(element.length == 1) { result = element.item(0); }else{ result = element; } return result; } function addEventListenerWrapper(trigger, fn, element) { if(typeof trigger == "object") { trigger.loopEach(function(value) { element.addEventListener(value, fn); }); }else{ element.addEventListener(trigger, fn); } } function sha1(str) { // discuss at: http://phpjs.org/functions/sha1/ // original by: Webtoolkit.info (http://www.webtoolkit.info/) // improved by: Michael White (http://getsprink.com) // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // input by: Brett Zamir (http://brett-zamir.me) // depends on: utf8_encode // example 1: sha1('Kevin van Zonneveld'); // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897' var rotate_left = function(n, s) { var t4 = (n << s) | (n >>> (32 - s)); return t4; }; /*var lsb_hex = function (val) { // Not in use; needed? var str=""; var i; var vh; var vl; for ( i=0; i<=6; i+=2 ) { vh = (val>>>(i*4+4))&0x0f; vl = (val>>>(i*4))&0x0f; str += vh.toString(16) + vl.toString(16); } return str; };*/ var cvt_hex = function(val) { var str = ''; var i; var v; for (i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f; str += v.toString(16); } return str; }; var blockstart; var i, j; var W = new Array(80); var H0 = 0x67452301; var H1 = 0xEFCDAB89; var H2 = 0x98BADCFE; var H3 = 0x10325476; var H4 = 0xC3D2E1F0; var A, B, C, D, E; var temp; str = this.utf8_encode(str); var str_len = str.length; var word_array = []; for (i = 0; i < str_len - 3; i += 4) { j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3); word_array.push(j); } switch (str_len % 4) { case 0: i = 0x080000000; break; case 1: i = str.charCodeAt(str_len - 1) << 24 | 0x0800000; break; case 2: i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000; break; case 3: i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) << 8 | 0x80; break; } word_array.push(i); while ((word_array.length % 16) != 14) { word_array.push(0); } word_array.push(str_len >>> 29); word_array.push((str_len << 3) & 0x0ffffffff); for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = word_array[blockstart + i]; } for (i = 16; i <= 79; i++) { W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); } A = H0; B = H1; C = H2; D = H3; E = H4; for (i = 0; i <= 19; i++) { temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 20; i <= 39; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 40; i <= 59; i++) { temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 60; i <= 79; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } H0 = (H0 + A) & 0x0ffffffff; H1 = (H1 + B) & 0x0ffffffff; H2 = (H2 + C) & 0x0ffffffff; H3 = (H3 + D) & 0x0ffffffff; H4 = (H4 + E) & 0x0ffffffff; } temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4); return temp.toLowerCase(); } Object.defineProperty(String.prototype, 'hashCode', { value: function() { var hash = 0, i, chr; for (i = 0; i < this.length; i++) { chr = this.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; // Convert to 32bit integer } return hash; } }); Window.prototype.on = function(trigger, fn) { var element = this; addEventListenerWrapper(trigger, fn, element); } Document.prototype.on = function(trigger, param1, param2) { var element = this; if(typeof param1 == "function") { var fn = param1; addEventListenerWrapper(trigger, fn, element); }else if(typeof param1 == "string") { var fn = param2; var selector = param1; document.addEventListener(trigger, function(event) { var elementList = $(selector); if(isElement(elementList)) { elementList = [elementList]; } targetLoop: for(var target = event.target; target && target != this; target = target.parentNode) { elementLoop: for(var i = 0; i < elementList.length; i++) { if(elementList[i] === target) { var element = elementList[i]; fn.call(element, event); // we are using call() to change context -> this(element) can by used in callback function break elementLoop; break targetLoop; } } } }); }else{ console.log("Second parametr can't be type of: " + typeof param1); } } HTMLElement.prototype.on = function(trigger, fn) { var element = this; addEventListenerWrapper(trigger, fn, element) } NodeList.prototype.on = function(trigger, fn) { for(var i = 0; i < this.length; i++) { var element = this.item(i); addEventListenerWrapper(trigger, fn, element); }; } Document.prototype.off = function(trigger, fn) { var element = this; element.removeEventListener(trigger, fn); } HTMLElement.prototype.off = function(trigger, fn) { var element = this; element.removeEventListener(trigger, fn); } NodeList.prototype.off = function(trigger, fn) { for(var i = 0; i < this.length; i++) { var element = this.item(i); element.removeEventListener(trigger, fn); }; } NodeList.prototype.loopEach = function(fn, callback) { for(var i = 0; i < this.length; i++) { fn(this[i], i); if(callback && i == this.length - 1) { callback(); } } } Object.prototype.loopEach = function(fn, callback) { for(let [key, value] of Object.entries(this)) { fn(value, key); } if(callback) { callback(); } } Array.prototype.loopEach = function(fn, callback) { for(var i = 0; i < this.length; i++) { fn(this[i], i); if(callback && i == this.length - 1) { callback(); } } } Document.prototype.ready = function(fn) { if(document.readyState != 'loading') { fn(); }else{ document.addEventListener('DOMContentLoaded', fn); } } HTMLElement.prototype.index = function() { var el = this; if(!el) return -1; var i = 0; do{ i++; }while (el = el.previousElementSibling); return i - 1; } HTMLElement.prototype.getChildren = function(searchClass) { return getChildren(this, searchClass); } HTMLElement.prototype.find = function(selector) { var element = this.querySelectorAll(selector); if(element.length == 1) { result = element.item(0); }else{ result = element; } return result; } HTMLElement.prototype.getSiblings = function(selector) { var element = this; if(selector !== undefined) { return getChildren(element.parentNode.firstChild, selector); }else{ return getChildren(element.parentNode.firstChild, selector); } } HTMLElement.prototype.trigger = function(trigger) { var el = this; var event = document.createEvent('HTMLEvents'); event.initEvent(trigger, true, false); el.dispatchEvent(event); }