solar / FTV / bin / lib.js
lib.js
Raw
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);

}