pauloabmiranda
10/7/2015 - 10:27 AM

Jquery alternatives and general utils

Jquery alternatives and general utils

'use strict';

var Utils = {
    ready: function(fn) {
        if (document.readyState != 'loading') {
            fn();
        } else {
            document.addEventListener('DOMContentLoaded', fn);
        }
    },

    $: function(selector, container) {
        var selectorType = 'querySelectorAll';

        if (selector.indexOf('#') === 0) {
            selectorType = 'getElementById';
            selector = selector.substr(1, selector.length);
        }
        
        return [].slice.call((container || document)[selectorType](selector));
        // return (container || document)[selectorType](selector);
    },

    $: function(selector, container) {
        return (container || document).querySelector(selector);
    },

    // Returns all elements that match CSS selector {expr} as an array.
    // Querying can optionally be restricted to {container}’s descendants
    $$: function(selector, container) {
        return [].slice.call((container || document).querySelectorAll(selector));
    },

    removeClass: function(el, className) {
        if (el.classList) {
            el.classList.remove(className);
        }else {
            el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
        }
    },

    addClass: function(el, className) {
        if (el.classList) {
            el.classList.add(className);
        }else {
            el.className += ' ' + className;
        }
    },

    hasClass: function(el, className) {

        if (el.classList) {
            return el.classList.contains(className);
        }else {
            return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
        }
    },

    is: function(el, selector) {
        return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);
    },

    parents: function(el, className) {
        if (Utils.is(el, className)) {
            return el;
        }

        while (el && el.parentNode) {
            el = el.parentNode;
            // console.log('el.querySelector(selector)', el.querySelector(selector));
            // console.log('this.hasClass(selector)', Utils.hasClass(el, selector));
            // if (el.querySelector(selector) !== null) {
            // if (Utils.hasClass(el, className)) {
            if (Utils.is(el, className)) {
                return el;
            }
        }

        return null;
    },

    transEndEventName: {
        'WebkitTransition': 'webkitTransitionEnd',
        'MozTransition': 'transitionend',
        'OTransition': 'oTransitionEnd otransitionend',
        'msTransition': 'MSTransitionEnd',
        'transition': 'transitionend'
    }[Modernizr.prefixed('transition')],

    isNumber: function(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    },
    
    trackPage: function (page) {
        if (ga){
            if(page === undefined){
                ga('send', 'pageview');
            }else{
                ga('send', 'pageview', page);
            }
        }
    },

    trackEvent: function (category, action, label) {
        ga && ga('send', 'event', category, action, label);
    }

};

module.exports = Utils;