/* SELECTOR ALIASES */ function $(selector){ return document.querySelector(selector); } function $$(selector){ return document.querySelectorAll(selector); } /* Retourne un data-* attribute d'un element (surcharge de l'ELEMENT natif) * * @attribute L'attribut qui nous interesse * * @return value Retourne la valeur si l'attribut existe * @return false Retourne FALSE si rien n'a ete trouve * * */ Element.prototype.getData = function(attribute){ // On verifie qu'un data-* attribute existe if( typeof this.dataset == 'undefined' ) return false; return ( this.dataset.hasOwnProperty(attribute) ) ? this.dataset[attribute] : false; }; /* Ajout de classe pour un element (surcharge de l'ELEMENT natif) * * @className Classe a ajouter a l'element * */ Element.prototype.addClass = function(className){ /* [1] On transforme la classe actuelle en tableau ====================================================*/ var classArray = this.className.split(' '); /* [2] On ajoute la classe si elle n'y est pas deja ====================================================*/ if( classArray.indexOf(className) > -1 ) return; // La classe y est deja classArray.push(className); /* [3] On reformatte tout ====================================================*/ this.className = classArray.join(' ').trim(); }; /* Suppression de classe pour un element (surcharge de l'ELEMENT natif) * * @className Classe a supprimer a l'element * */ Element.prototype.remClass = function(className){ /* [1] On transforme la classe actuelle en tableau ====================================================*/ var classArray = this.className.split(' '); /* [2] On retire la classe si elle y est ====================================================*/ var index = classArray.indexOf(className); if( index == -1 ) return; // La classe n'y est pas classArray = classArray.slice(0,index).concat( classArray.slice(index+1) ); /* [3] On reformatte tout ====================================================*/ this.className = classArray.join(' ').trim(); }; // on définit le "indexOf" pour et NodeList.prototype.indexOf = HTMLCollection.prototype.indexOf = function(searchedElement){ for( var i = 0 ; i < this.length ; i++ ) // on parcours la collection // si on trouve l'élement, on retourne son rang if( this[i] == searchedElement ) return i; // si on a rien trouvé, on retourne -1 return -1; }; // GESTION DES ANIMATIONS (CLASSE PENDANT TEMPS IMPARTI) Element.prototype.anim = function(className, timeout){ var pointer = this; // on cree un pointeur pointer.addClass(className); // on met la classe // on la retire apres le @timeout imparti setTimeout(function(){ pointer.remClass(className); }, timeout); }; // INCLUSION D'UN SCRIPT JAVASCRIPT var _includes = []; var _includeTags = []; var _includeLoad = []; function include(jsResource, callback, action){ // action=true -> EXCLUSION, SINON -> INCLUSION /* (0) On formatte les arguments */ jsResource = typeof jsResource === 'string' ? jsResource : null; callback = typeof callback === 'function' ? callback : function(){ console.log('[x] '+jsResource+' loaded'); }; action = typeof action === 'boolean' ? action : false; // Si la ressource n'est pas donnée if( !jsResource ) return false; /* (1) Gestion de l'inclusion */ if( !action ){ var index = _includes.indexOf(jsResource); // Si le fichier est déja inclus, on lance le callback if( index > -1 ){ // Si le fichier est déja chargé uniquement, on relance callback(); return true; } // On crée l'élément dans le tag var tag = document.createElement('script'); // On ajoute la ressource et le tag à la liste index = _includes.length; _includes[index] = jsResource; _includeLoad[index] = false; _includeTags[index] = tag; // On définit le callback tag.onload = (function(v){ var i = v; return function(){ _includeLoad[i] = true; callback(); }; })(index); // Attributs de l'élément tag.setAttribute('src', jsResource); tag.setAttribute('type', 'text/javascript'); document.head.appendChild( tag ); return true; /* (2) Gestion de l'exclusion */ }else{ var index = _includes.indexOf(jsResource); // On vérifie que le fichier est déja inclus if( index == -1 ) return false; // On supprime l'élément document.head.removeChild( _includeTags[index] ); // On dé-indexe l'élément _includes.splice(index, 1); _includeTags.splice(index, 1); return true; } } /* RETOURNE LES CLÉS N'AYANT PAS UNE VALEUR EGALE POUR 2 OBJETS * * @A Premier Objet * @B Second Objet * @ignore Tableau des clés à ignorer * * @return diff Tableau contenant les clés des valeurs différentes (uniquement les clés communes et non NULLes) * */ function diff(A, B, ignore){ var dKeys = []; for( var key in A ){ // Si A[key] ou B[key] est NULL, on ne compare pas if( B[key] == null || A[key] == null || ignore instanceof Array && ignore.indexOf(key) > -1 ) continue; /* (1) On vérifie le type */ if( typeof A[key] !== typeof B[key] ) dKeys.push(key); /* (2) Vérification récursive si 2 objets */ else if( A[key] instanceof Object && B[key] instanceof Object ){ // Si au moins 1 différence profonde (récursive), on ajoute la clé if( diff(A[key], B[key]).length > 0 ) dKeys.push(key); /* (3) Vérification superficielle (types non composés) */ }else if( A[key] != B[key] ) dKeys.push(key); } return dKeys; } /* CLONE UN OBJET DE PROFONDEUR 1 * * @input Objet à cloner * * @return clone Objet identique (cloné) * * Note: prise en compte des primitifs && tableaux uniquement * */ // Object.prototype.clone = function(){ // return this; // }; /* DEFINITION DES FORMATS UTILES POUR INPUT-CHECKER * */ // Numéro de téléphone var format_number = new formatChecker(null, '0i ii ii ii ii' );