;
(function (window, document, location, history) {
    'use strict';

    var isIE = document.all && !window.atob;

    var extend = function (out) {
        out = out || {};

        for (var i = 1; i < arguments.length; i++) {
            if (!arguments[i])
                continue;

            for (var key in arguments[i]) {
                if (arguments[i].hasOwnProperty(key))
                    out[key] = arguments[i][key];
            }
        }

        return out;
    };

    function addEventListener(el, eventName, handler) {
        if (el.addEventListener) {
            el.addEventListener(eventName, handler);
        } else {
            el.attachEvent('on' + eventName, function () {
                handler.call(el);
            });
        }
    }

    function forEach(array, fn) {
        for (var i = 0; i < array.length; i++)
            fn(array[i], i);
    }

    /*
     * Ajouter une classe
     * sources:  http://youmightnotneedjquery.com/
     */
    function addClass(el, className) {
        if (el.classList) {
            el.classList.add(className);
        } else {
            el.className += ' ' + className;
        }
    }

    /*
     * Supprimer une Classe
     * sources:  http://youmightnotneedjquery.com/
     */
    function removeClass(el, className) {
        if (el.classList) {
            el.classList.remove(className);
        } else {
            el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
        }
    }

    function hasClass(el, className) {
        if (el.classList) {
            return el.classList.contains(className);
        } else {
            return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
        }
    }


    function sideMenu(element, options) {
        // Init du tableau d'option
        this.options = {};
        // Merge des options en paramètre avec celle par défaut
        this.options = extend({}, sideMenu.defaults, options);

        if (typeof element === "object") {
            this.element = element;
        }

        if (typeof element === "string") {
            this.element = document.querySelector(element);
        }

        if (this.element != null) {
            // Start !
            this.init();
        }

    }


    sideMenu.defaults = {
        sidebar: ".side-tabs",
        contents: ".contents-tabs",
        content: ".content-tab",
        active: "active",
        onClick: function (event, link) {
        }
    };

    sideMenu.prototype = {
        // Start !
        init: function () {
            var self = this;
            // on va chercher les différents élements dans le HTML pour le traitement
            this.getAllElement();
            // On active les évenements
            this.event();
            // Si un id est dans l'url
            if (location.hash != "") {
                forEach(this.allLinks, function (listlink, k) {
                    if (listlink.getAttribute('href') == location.hash && !hasClass(listlink, 'hide')) {
                        self.changeTab(listlink);
                    }
                });
            }
        },
        // Evenement du module
        event: function () {
            var self = this;
            // Pour chaque lien dans le menu
            forEach(this.allLinks, function (link, i) {
                // on créé un évenement click
                addEventListener(link, 'click', function (event) {
                    if (self.changeTab(link, event)) {
                        event.preventDefault();
                    }
                });

            });

            if (("onhashchange" in window) && !(isIE)) {
                window.onhashchange = function () {
                    self.changeTab(window.location.hash)
                }
            } else {
                var prevHash = window.location.hash;
                window.setInterval(function () {
                    if (window.location.hash != prevHash) {
                        prevHash = window.location.hash;
                        self.changeTab(window.location.hash);
                    }
                }, 100);
            }


        },
        // On va chercher dans le DOM HTML les élements utiles
        getAllElement: function () {
            this.sidebar = this.element.querySelector(this.options.sidebar);
            this.content = this.element.querySelectorAll(this.options.content);
            this.allLinks = this.sidebar.querySelectorAll('a');
        },
        // changement de tab
        changeTab: function (link, event) {

            var
                self = this,
                // regex, savoir si c'est un ID et pas un lien
                isID = /^#(.*)/,

                isHashEvent = typeof link == "string",
                // on récupére le href du lien
                href = (isHashEvent ? link : link.getAttribute('href'));

            // on test le href
            if (isID.test(href)) {
                if (typeof event !== "undefined") {
                    // On annule la propagation de l'evenement (pour que le lien ne fonctionne pas)
                    event.preventDefault();
                }
                // On recupére l'id
                var id = isID.exec(href)[1];
                // on répére le bloc de l'id dans le DOM HTML
                var newContent = document.getElementById(id);
                // On supprime la class active sur tous les élements
                forEach(self.content, function (content, j) {
                    if (hasClass(content, self.options.active)) {
                        removeClass(content, self.options.active);
                    }
                });
                forEach(self.allLinks, function (listlink, k) {
                    if (hasClass(listlink, self.options.active)) {
                        removeClass(listlink, self.options.active);
                    }
                });
                // On met la class Active sur le nouveau bloc conserné
                if (newContent) {
                    addClass(newContent, self.options.active);

                    if(typeof require !== 'undefined'){
                        require(['helper'], function () {
                            Helper.fireEvent(newContent, 'tabs:open');
                        });
                    }
                }

                if (!isHashEvent) {
                    addClass(link, self.options.active);
                } else {
                    addClass(this.sidebar.querySelector('a[href="' + link + '"]'), self.options.active);
                }

                if (history.pushState) {
                    history.pushState(null, null, href);
                } else {
                    location.hash = href;
                }

            }
            // Callback onClick
            self.options.onClick(event, link);

            if (isID.test(href)) {
                return true;
            } else {
                return false;
            }
        }

    };

    // Ajout du NameSpace dans le navigateur
    window.sideMenu = sideMenu;

})(window, document, location, history);