// --------------------------------------------------- // Gestion du menu général Framasoft - version JS // RNB, 19 sept 2006 / 18 oct 2006 // 1. Insère l'appel au fichier css si nécessaire // 2. Construit le menu de navigation via innerDOM // --------------------------------------------------- function framanav() { // VARIABLES : root, framanav_id, search_id, search_txt, paypal_id, nav var framanav_id = 'framanav'; var search_id = 'nav-search'; var search_txt = 'Recherche'; var paypal_id = 'nav-paypal'; var root = 'http://www.framasso.org/framanav/'; var nav = "\n\n\n"; // insertion de l'appel css var incFile = function (file,ext) { file += '.' + ext; var head = document.getElementsByTagName('head')[0]; switch(ext) { case 'js': var head_inc = document.createElement('script'); head_inc.setAttribute('type','text/javascript'); head_inc.setAttribute('src',root+file); break; case 'css': var head_inc = document.createElement('link'); head_inc.setAttribute('type','text/css'); head_inc.setAttribute('rel','stylesheet'); head_inc.setAttribute('href',root+file); break; } head.appendChild(head_inc); }; var initSearch = function() { var input = document.getElementById(search_id).getElementsByTagName('input').item(0); input.value = search_txt; input.onfocus = function() { if (input.value==search_txt) { input.value = ''; } } } // ACTIONS incFile('framanav','css'); if (!document.getElementById(framanav_id)) { var fNav = stringToDOM(nav); document.body.appendChild(fNav); } initSearch(); } /* ------------------------------------------------------ * stringToDOM * Par Simon Kühn http://simon-kuehn.de/ ( http://simon-kuehn.de/projekte_innerdom.html ) * Diffusé sous GPL * Absolument géniale !!!! * légère modification pour gérer le HTML (xHTML par défaut) ------------------------------------------------------- */ function stringToDOM (inputString) { // Supprimer les fin de ligne et retour chariot var normaliseString = function (str) { str = str.replace(/\r/g, " "); str = str.replace(/\n/g, " "); return str; }; // Convertir les entités HTML var deEntity = function (str) { str = str.replace(/&/g, "&"); str = str.replace(/>/g, ">"); str = str.replace(/</g, "<"); str = str.replace(/ /g, " "); str = str.replace(/"/g, '"'); return str; }; // Supprimer des espaces var deSpace = function (str) { str = str.replace(/ /g, ""); return str; }; // Parser l'intérieur du tag (attributs) et retourne un objet dom var processTag = function (str) { // fragment document conteneur var newDOM = document.createDocumentFragment(); // premier espace var space = str.indexOf(' '); // le tag n'a pas d'attributs if (space === -1) { var tagName = str.toLowerCase(); newDOM.appendChild(document.createElement(tagName)); } else { // sinon le tag a des attributs // le nom du tag tagName = deSpace(str.substring(0, space)).toLowerCase(); // pour IE, qui a des pbs avec les tags orphelins if (document.all && tagName === 'input') { newDOM.appendChild(document.createElement('<' + str + '/>')); return newDOM; } // aller au début des attributs str = str.substring(space + 1); // créer l'élément tag newDOM.appendChild(document.createElement(tagName)); // Gestion des attributs while (str.length > 0) { // recherche de '=' var equal = str.indexOf('='); if (equal >= 0) { // nom de l'attribut var attributeName = deSpace(str.substring(0, equal)).toLowerCase(); // jusqu'au premier '"' trouvé var quote = str.indexOf('"'); str = str.substring(quote + 1); // jusqu'au '"' suivant pour avoir la valeur de l'attribut quote = str.indexOf('"'); var attributeValue = deEntity(str.substring(0, quote)); // passer à l'attribut suivant str = str.substring(quote + 2); // Pour IE et l'attribut style if (document.all && attributeName === 'style') { // ajouter les attributs au dernier noeud de l'objet newDOM.lastChild.style.cssText = attributeValue; } else { // ajouter les attributs au dernier noeud de l'objet newDOM.lastChild.setAttribute(attributeName, attributeValue) } } else { break; } } } return newDOM; }; var findEndTag = function (innerStr, str, lastTag) { // alle Kommentare und leeren Tags löschen var funcInnerStr = innerStr; var funcStr = str; lastTag = lastTag.toLowerCase(); // wo ist das schließende Tag? var nextClosingTag = funcStr.indexOf(''); // funcInnerStr und func Str auffrischen funcInnerStr = funcInnerStr.concat(funcStr.substring(0, nextClosingTag)); funcStr = funcStr.substring(nextClosingTag); while (funcInnerStr.indexOf('<' + lastTag) != -1) { // solange öfnnende Tags in innerStr vorhanden sind // öffnendes Tag löschen funcInnerStr = funcInnerStr.substring(funcInnerStr.indexOf('<' + lastTag)); funcInnerStr = funcInnerStr.substring(funcInnerStr.indexOf('>') + 1); // schließendes Tag löschen funcStr = funcStr.substring(funcStr.indexOf('>') + 1); // nächstes schließendes suchen nextClosingTag = funcStr.indexOf(''); // bis zum schließenden in den innerStr übernehmen und bis zum schließenden im str löschen funcInnerStr = funcInnerStr.concat(funcStr.substring(0, nextClosingTag)); funcStr = funcStr.substring(nextClosingTag); } // Position des schließenden Tags innerhalb von str zurück geben return str.length - funcStr.length; }; // geht den String von vorne durch und legt ein Objekt an var parseString = function (str) { // Fragment de document var newDOM = document.createDocumentFragment(); // Schleifen sie! while (str && str.length > 0) { // position du premier < var lowerThan = str.indexOf("<"); // absent -> juste un texte if (lowerThan === -1) { str = deEntity(str); newDOM.appendChild(document.createTextNode(str)); str = null; } // Position if (lowerThan > 0) { // Avant -> fragment texte var newTextFrag = deEntity(str.substring(0, lowerThan)); newDOM.appendChild(document.createTextNode(newTextFrag)); // str = après str = str.substring(lowerThan); } // < débute la chaîne if (lowerThan === 0) { var comment = str.indexOf(''); var commentContent = str.substring(4, commentEnd); commentContent = deEntity(commentContent); newDOM.appendChild(document.createComment(commentContent)); str = str.substring(commentEnd + 3); } // sinon, balise fermante else { var greaterThan = str.indexOf('>'); // tag fermant xhtml if (str.substring(greaterThan - 1, greaterThan) === '/') { var emptyTagEnd = str.indexOf('/>'); var emptyTagContent = str.substring(1, emptyTagEnd); // Tag einfügen newDOM.appendChild(processTag(emptyTagContent)); // Reststring speichern str = str.substring(emptyTagEnd + 2); } // ***** ajout pour les tags input, img en HTML ****** else if (str.substr(lowerThan+1,3)==='img' || str.substr(lowerThan+1,5)==='input') { var soloTagEnd = str.indexOf('>'); var soloTagContent = str.substring(1,soloTagEnd); newDOM.appendChild(processTag(soloTagContent)); str = str.substring(soloTagEnd + 1); } // tag normal else { var normalTagEnd = str.indexOf('>'); var normalTagContent = str.substring(1, normalTagEnd); var tmpNewDOM = document.createDocumentFragment(); // Tag einfügen tmpNewDOM.appendChild(processTag(normalTagContent)); // Reststring ohne Taganfang speichern str = str.substring(normalTagEnd + 1); // bis zum nächsten schließenden Tag speichern var innerStr = str.substring(0, str.indexOf('') + 1); // an temporären DOM anhängen tmpNewDOM.lastChild.appendChild(parseString(innerStr)); // temporären DOM in VaterDOM einhängen newDOM.appendChild(tmpNewDOM); } } } } return newDOM; }; // Parser la chaîne de caractères var newDOM = parseString(inputString); // Retourner le fragment DOM return newDOM; } // ------------------------------------------------------------------ // Lancer la fonction framanav() au chargement de la page if (window.attachEvent) { window.attachEvent("onload", framanav); } else { window.addEventListener('load',framanav,true); }