annotate admin.js @ 75:49b0a2f3a118

Fix IE: Rend l'administration utilisable avec Internet Explorer 6 En réalité, seulement trois réels changements sont introduits ici: - il existait quelques problèmes dans le code supposé être executés lorsque le navigateur ne connait pas les treewalkers, le code fait désormais ce qu'il faut (la mauvaise fonction était associé à l'édition des brouillons, la fonction de test ne renvoyait pas true / false) - Internet Explorer 6 ne connait pas textContent. Une fonction essayant diverses possibilités de remplacement, et faisant un parcours récursif de tous les noeuds fils dans le pire des cas a été mise en place - le code cherchant un remplacement à DOMParser supposait que l'objet ActiveX XMLDOM fournissait exactement la même API, ce qui aurait été trop beau. Un wrapper a été développé autour de XMLDOM qui fournit la seule fonction de DOMParser utilisé dans le script. Evidemment ce n'est pas une solution totalement générique... Avec ces modifications, il est possible de poster depuis Internet Explorer (testé sur la version 6), Safari (testé avec la version 3.1) et Firefox (testé avec les versions 2 et 3)
author Franck Deroche <webmaster@defr.org>
date Mon, 31 Mar 2008 15:07:21 +0200
parents 0aa843c6571b
children
rev   line source
webmaster@0 1 var arLIMenu = new Array();
webmaster@0 2 var curBPShown = 0;
webmaster@0 3 var wEdit, wBr, dp;
webmaster@0 4
webmaster@0 5 var xmlRequest = {
webmaster@0 6 init: function() {
webmaster@0 7 try {
webmaster@0 8 xmlRequest.obj = new XMLHttpRequest();
webmaster@0 9 } catch(e) {
webmaster@0 10 xmlRequest.obj = new ActiveXObject("Msxml2.XMLHTTP");
webmaster@0 11 }
webmaster@0 12 },
webmaster@0 13
webmaster@0 14 get: function(url) {
webmaster@0 15 xmlRequest.obj.open("GET", url, false);
webmaster@0 16 xmlRequest.obj.send(null);
webmaster@0 17
webmaster@0 18 return xmlRequest.obj.responseXML;
webmaster@0 19 },
webmaster@0 20
webmaster@0 21 send: function(url, data) {
webmaster@0 22 try {
webmaster@0 23 xmlRequest.obj.open("POST", url, false);
webmaster@0 24 xmlRequest.obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
webmaster@0 25 xmlRequest.obj.send(data);
webmaster@0 26 return true;
webmaster@0 27 } catch(e) {
webmaster@0 28 return false;
webmaster@0 29 }
webmaster@0 30 }
webmaster@0 31
webmaster@0 32 };
webmaster@0 33
webmaster@0 34 var t = {
webmaster@0 35 evtListener:function(elt, evt, func, useCpt) {
webmaster@0 36 if(elt.addEventListener)
webmaster@0 37 elt.addEventListener(evt, func, useCpt);
webmaster@0 38 else if(elt.attachEvent)
webmaster@0 39 elt.attachEvent("on" + evt, func);
webmaster@75 40 else if(elt["on" + evt])
webmaster@75 41 elt["on" + evt] = function() {elt["on" + evt](); func();}
webmaster@0 42 else
webmaster@0 43 elt["on" + evt] = func;
webmaster@75 44 },
webmaster@75 45 getTextContent: function(node) {
webmaster@75 46 if(node.textContent)
webmaster@75 47 return node.textContent;
webmaster@75 48 if(node.innerText)
webmaster@75 49 return node.innerText;
webmaster@75 50 // We tried hard to use something fast, it didn't work, so we'll recurse
webmaster@75 51 if(node.nodeType == 3 || node.nodeType == 4)
webmaster@75 52 return node.data;
webmaster@75 53 var textContent = '', i;
webmaster@75 54 for(i = 0; i < node.childNodes.length; i++)
webmaster@75 55 textContent += t.getTextContent(node.childNodes[i]);
webmaster@75 56 return textContent;
webmaster@75 57 },
webmaster@75 58 empty: function(node) {
webmaster@75 59 while(node.firstChild)
webmaster@75 60 node.removeChild(node.firstChild);
webmaster@0 61 }
webmaster@0 62 }
webmaster@0 63
webmaster@0 64 t.evtListener(window, "load", xmlRequest.init, false);
webmaster@0 65 t.evtListener(window, "load", hideForms, false);
webmaster@75 66 t.evtListener(window, "load", init, false);
webmaster@0 67
webmaster@0 68 var editFilter = {
webmaster@75 69 accept: function(node) {
webmaster@75 70 if(node.nodeName.toLowerCase() == 'a' &&
webmaster@75 71 node.firstChild &&
webmaster@75 72 node.firstChild.nodeValue == 'Editer')
webmaster@75 73 return true;
webmaster@75 74 return false;
webmaster@75 75 },
webmaster@75 76
webmaster@0 77 acceptNode: function(node) {
webmaster@75 78 return this.accept(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
webmaster@0 79 }
webmaster@0 80 }
webmaster@0 81
webmaster@0 82 var brouillonsFilter = {
webmaster@75 83 accept: function(node) {
webmaster@75 84 if(node.nodeName.toLowerCase() == 'a' && node.firstChild && (
webmaster@0 85 node.firstChild.nodeValue == 'Editer' ||
webmaster@0 86 node.firstChild.nodeValue == 'Publier' ||
webmaster@0 87 node.firstChild.nodeValue == 'Supprimer'))
webmaster@75 88 return true;
webmaster@75 89 return false;
webmaster@75 90 },
webmaster@75 91
webmaster@75 92 acceptNode: function(node) {
webmaster@75 93 return this.accept(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
webmaster@0 94 }
webmaster@0 95 }
webmaster@0 96
webmaster@0 97
webmaster@0 98
webmaster@75 99 function init() {
webmaster@0 100 var ar=document.getElementsByTagName('li');
webmaster@0 101 for(var i=0; i<ar.length; i++) {
webmaster@0 102 if(ar[i].parentNode.id=='Menu') {
webmaster@0 103 arLIMenu[arLIMenu.length]=ar[i];
webmaster@0 104 if(ar[i].firstChild.id=='Brouillons') {
webmaster@0 105 ar[i].className="Actif";
webmaster@0 106 document.getElementById('Gest' + ar[i].firstChild.id).style.display='block';
webmaster@0 107 }
webmaster@0 108 t.evtListener(ar[i], 'click', switchSection, true);
webmaster@0 109 }
webmaster@0 110 if(ar[i].className=='Add')
webmaster@0 111 t.evtListener(ar[i].firstChild, 'click', showAddForm, true);
webmaster@0 112 }
webmaster@0 113
webmaster@0 114 try { dp = new DOMParser();}
webmaster@75 115 catch(e) {
webmaster@75 116 dp = {
webmaster@75 117 obj: new ActiveXObject("Microsoft.XMLDOM"),
webmaster@75 118 parseFromString: function(text, type)
webmaster@75 119 {
webmaster@75 120 if(!this.obj.loadXML(text))
webmaster@75 121 {
webmaster@75 122 var error = this.obj.parseError.reason, errorNode;
webmaster@75 123 this.obj.loadXML('<error />');
webmaster@75 124 errorNode = this.obj.createElement('parsererror');
webmaster@75 125 errorNode.appendChild(this.obj.createTextNode(error));
webmaster@75 126 this.obj.documentElement.appendChild(errorNode);
webmaster@75 127 }
webmaster@75 128 return this.obj;
webmaster@75 129 }
webmaster@75 130 }
webmaster@75 131 }
webmaster@0 132 t.evtListener(document.getElementById("editPost").Save, "click", saveFormContent, false);
webmaster@0 133 // TreeWalkers in all their glory
webmaster@0 134 try {
webmaster@75 135 wEdit = document.createTreeWalker(document.getElementById("GestPosts"), NodeFilter.SHOW_ELEMENT, editFilter, true);
webmaster@0 136 while(wEdit.nextNode()) {
webmaster@0 137 t.evtListener(wEdit.currentNode, "click", editPubl, false);
webmaster@0 138 }
webmaster@0 139
webmaster@75 140 wBr = document.createTreeWalker(document.getElementById("GestBrouillons"), NodeFilter.SHOW_ELEMENT, brouillonsFilter, true);
webmaster@0 141 while(wBr.nextNode()) {
webmaster@0 142 if(wBr.currentNode.firstChild.nodeValue == 'Editer') t.evtListener(wBr.currentNode,"click", editBrouillon, false);
webmaster@0 143 else if(wBr.currentNode.firstChild.nodeValue == 'Publier') t.evtListener(wBr.currentNode, "click", pubBrouillon, false);
webmaster@0 144 }
webmaster@0 145 } catch(e) {
webmaster@29 146 var tmpLinks = document.getElementById("GestPosts")
webmaster@29 147 .getElementsByTagName("a");
webmaster@29 148 for(var i = 0; i < tmpLinks.length; i++) {
webmaster@75 149 if(editFilter.accept(tmpLinks[i])) {
webmaster@29 150 t.evtListener(tmpLinks[i], "click", editPubl, false)
webmaster@29 151 }
webmaster@29 152 }
webmaster@29 153
webmaster@29 154 tmpLinks = document.getElementById("GestBrouillons")
webmaster@29 155 .getElementsByTagName("a");
webmaster@29 156 for(var i = 0; i < tmpLinks.length; i++) {
webmaster@75 157 if(brouillonsFilter.accept(tmpLinks[i])) {
webmaster@75 158 if(tmpLinks[i].firstChild.nodeValue == 'Editer')
webmaster@75 159 t.evtListener(tmpLinks[i], "click", editBrouillon, false);
webmaster@75 160 else if(tmpLinks[i].firstChild.nodeValue == 'Publier')
webmaster@75 161 t.evtListener(tmpLinks[i], "click", pubBrouillon, false);
webmaster@29 162 }
webmaster@29 163 }
webmaster@0 164 }
webmaster@0 165 }
webmaster@0 166
webmaster@0 167 function switchSection(e) {
webmaster@0 168 var targetAc = bpEvt(e, 'li').rTarget;
webmaster@0 169 for(i=0; i<arLIMenu.length; i++) {
webmaster@0 170 tmpObj=document.getElementById('Gest' + arLIMenu[i].firstChild.id);
webmaster@0 171 if(arLIMenu[i]==targetAc) {
webmaster@0 172 arLIMenu[i].className='Actif';
webmaster@0 173 tmpObj.style.display='block';
webmaster@0 174 } else {
webmaster@0 175 arLIMenu[i].className='';
webmaster@0 176 tmpObj.style.display='none';
webmaster@0 177 }
webmaster@0 178 }
webmaster@0 179 }
webmaster@0 180
webmaster@0 181
webmaster@0 182 function pubBrouillon(e) {
webmaster@0 183 var whichVersion = document.getElementById("whichVersion");
webmaster@0 184 var pubComment = document.getElementById("pubComment");
webmaster@0 185 var el = bpEvt(e).rTarget;
webmaster@0 186 if(el != curBPShown) {
webmaster@0 187 if(curBPShown != 0) curBPShown.parentNode.parentNode.className = '';
webmaster@0 188 curBPShown = el;
webmaster@0 189 el.parentNode.parentNode.className = 'Pinned';
webmaster@0 190 var pos = el.href.indexOf("#");
webmaster@0 191 whichVersion.pubButton.disabled = true;
webmaster@0 192 pubComment.textContent = "Vérification en cours de la validité XML du post";
webmaster@0 193 whichVersion.id.value = el.href.substring(pos + 4, el.href.length);
webmaster@0 194 el.parentNode.appendChild(whichVersion);
webmaster@0 195 whichVersion.style.display='block';
webmaster@0 196 el.pubIsShown = true;
webmaster@0 197 var data = xmlRequest.get("admin_xml.php?type=brouillon&id=" + whichVersion.id.value);
webmaster@75 198 var doc = dp.parseFromString("<post>" + t.getTextContent(data.getElementsByTagName("contenu")[0]) + "</post>", "text/xml");
webmaster@75 199 t.empty(pubComment);
webmaster@75 200 if(doc.getElementsByTagName('parsererror').length > 0) {
webmaster@75 201 var textNode = document.createTextNode(t.getTextContent(doc.documentElement) + "\n");
webmaster@75 202 pubComment.appendChild(textNode);
webmaster@0 203 }
webmaster@0 204 else {
webmaster@75 205 var textNode = document.createTextNode("Le post est fait de XML valide, bon pour être poster");
webmaster@75 206 pubComment.appendChild(textNode);
webmaster@0 207 whichVersion.pubButton.disabled = false;
webmaster@0 208 }
webmaster@0 209 } else {
webmaster@0 210 curBPShown = 0;
webmaster@0 211 el.parentNode.parentNode.className = '';
webmaster@0 212 hideForms();
webmaster@0 213 el.pubIsShown = false;
webmaster@0 214 }
webmaster@0 215 return false;
webmaster@0 216 }
webmaster@0 217
webmaster@0 218 function editBrouillon(e) {
webmaster@0 219 edit(e, "brouillon");
webmaster@0 220 }
webmaster@0 221
webmaster@0 222 function editPubl(e) {
webmaster@0 223 edit(e, "post");
webmaster@0 224 }
webmaster@0 225
webmaster@0 226 function edit(e, type) {
webmaster@0 227 var editPost = document.getElementById("editPost");
webmaster@0 228 editPost.type = type;
webmaster@0 229 var el = bpEvt(e).rTarget;
webmaster@0 230 if(el.editPostIsShown !=1) {
webmaster@0 231 var id = el.href.substring(el.href.indexOf("#") + 4, el.href.length);
webmaster@0 232 var data = xmlRequest.get("admin_xml.php?type=" + type + "&id=" + id);
webmaster@0 233 el.parentNode.appendChild(editPost);
webmaster@0 234 el.editPostIsShown = 1;
webmaster@52 235 el.parentNode.parentNode.className = 'Pinned';
webmaster@0 236 editPost.style.display = 'block';
webmaster@75 237 editPost.Titre.value = t.getTextContent(data.getElementsByTagName('titre')[0]);
webmaster@75 238 editPost.Contenu.value = t.getTextContent(data.getElementsByTagName('contenu')[0]);
webmaster@0 239 if(type == 'post') {
webmaster@0 240 editPost.mood.style.display = '';
webmaster@75 241 editPost.mood.value = t.getTextContent(data.getElementsByTagName('mood')[0]);
webmaster@0 242 editPost.Tags.style.display = '';
webmaster@0 243 editPost.Tags.value = '';
webmaster@75 244 var tags = data.getElementsByTagName('tag'), tag;
webmaster@0 245 for(var i = 0; i < tags.length; i++)
webmaster@0 246 {
webmaster@75 247 tag = t.getTextContent(tags[i]);
webmaster@75 248 if(tag.indexOf(' ') > -1)
webmaster@0 249 {
webmaster@75 250 editPost.Tags.value += '"' + tag + '"';
webmaster@0 251 } else {
webmaster@75 252 editPost.Tags.value += tag;
webmaster@0 253 }
webmaster@0 254 editPost.Tags.value += ' ';
webmaster@0 255 }
webmaster@0 256 } else {
webmaster@0 257 editPost.mood.style.display = 'none';
webmaster@0 258 editPost.Tags.style.display = 'none';
webmaster@0 259 }
webmaster@0 260
webmaster@0 261 } else {
webmaster@52 262 hideForms();
webmaster@52 263 el.parentNode.parentNode.className = '';
webmaster@52 264 el.editPostIsShown = 0;
webmaster@0 265 }
webmaster@0 266 }
webmaster@0 267
webmaster@0 268 function showAddForm(e) {
webmaster@0 269 var targetAc = bpEvt(e, "a").rTarget;
webmaster@0 270 while(targetAc.nodeName.toLowerCase()!='form') targetAc=targetAc.nextSibling; // Permet d'avoir eventuellement des espaces
webmaster@0 271 targetAc.style.display = (targetAc.style.display=='block')?'none':'block';
webmaster@0 272 }
webmaster@0 273
webmaster@0 274 function saveFormContent(e) {
webmaster@75 275 var el = bpEvt(e).rTarget.form; // Should be the form...
webmaster@0 276 var toggleLink = el.parentNode.firstChild;
webmaster@0 277 var id=toggleLink.href.substring(toggleLink.href.indexOf("#") + 4, toggleLink.href.length);
webmaster@0 278 if(xmlRequest.send('admin_xml.php?id=' + id + '&mode=edit&type=' + el.type,
webmaster@0 279 'title=' + postValue(el.Titre.value) +
webmaster@0 280 '&content=' + postValue(el.Contenu.value) +
webmaster@0 281 '&mood=' + postValue(el.mood.value) +
webmaster@0 282 '&tags=' + postValue(el.Tags.value)))
webmaster@0 283 {
webmaster@0 284 toggleLink.editPostIsShown = 0;
webmaster@56 285 toggleLink.parentNode.parentNode.className = '';
webmaster@0 286 hideForms();
webmaster@0 287 } else {
webmaster@0 288 el.submit();
webmaster@0 289 }
webmaster@0 290 return true;
webmaster@0 291 }
webmaster@0 292
webmaster@0 293 function hideForms() {
webmaster@0 294 document.getElementById('whichVersion').style.display='none';
webmaster@0 295 document.getElementById('editPost').style.display='none';
webmaster@0 296 }
webmaster@0 297
webmaster@0 298 /* Bullet-Proofing of the event variable... Needed because of the huge mess out there */
webmaster@0 299 function bpEvt(eIni, tag) {
webmaster@0 300 var e = (eIni)?eIni:window.event;
webmaster@0 301 e.rTarget = (e.target)?e.target:e.srcElement;
webmaster@0 302 if(tag != undefined)
webmaster@0 303 while(e.rTarget.parentNode && e.rTarget.nodeName.toLowerCase() != tag) e.rTarget = e.rTarget.parentNode;
webmaster@0 304 return e;
webmaster@0 305 }
webmaster@0 306
webmaster@0 307 function postValue(str)
webmaster@0 308 {
webmaster@0 309 str = str.replace(/&/g, "%26");
webmaster@0 310 str = str.replace(/\+/g, "%2B");
webmaster@0 311 return str;
webmaster@29 312 }