﻿/*	copyright www.laRouteDuNet.fr 2007

    éléments supplémentaires à prototype.js

	ATTENTION: nécessite prototype.js
*/

if(typeof Prototype == 'undefined')
  throw("protypeplus.js requires prototype.js library");
  
var EntretienSession = Class.create();
EntretienSession.prototype = {
    //entretien de session
    initialize: function() {
        this.delai=1000*60*5;   //5 minutes
        this.marker=new Date() - new Date(2000,0,1);
        this.file='entretiensession.aspx';
        this._entretien();
        setInterval(function() { this._entretien() }.bind(this), this.delai);      
    },
    _entretien: function(marker) {
        this.marker++;
        var img=new Image();
        img.src=this.file+'?m='+this.marker;
    }
}

document.getElementsByTagAndClassName = function(tagName, className, parentElement) {
    // recherche élements par tagName, className, parentElement
    // parentElement est optionel
    var children=($(parentElement) || document.body).getElementsByTagName(tagName);
    var elements=[],child;
    for (var i=0, length=children.length; i<length; i++) {
      child = children[i];
      if (child.className==className || child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
        elements.push(Element.extend(child));
    }
    return elements;
}

if (typeof Node == 'undefined') {
    // construction d'un objet Node minimal s'il n'existe pas dans le DOM (pour IE en particulier)
    Node = {
        //contantes type de node
        ELEMENT_NODE                : 1,
        ATTRIBUTE_NODE              : 2,
        TEXT_NODE                   : 3,
        CDATA_SECTION_NODE          : 4,
        ENTITY_REFERENCE_NODE       : 5,
        ENTITY_NODE                 : 6,
        PROCESSING_INSTRUCTION_NODE : 7,
        COMMENT_NODE                : 8,
        DOCUMENT_NODE               : 9,
        DOCUMENT_TYPE_NODE          : 10,
        DOCUMENT_FRAGMENT_NODE      : 11,
        NOTATION_NODE               : 12
    }
}

twittThis=function(title,url) {
    //génère un partage twiter (retourne une URL courte bit.ly via le proxy)
    new Ajax.Request(cogiteDatas.baseUrl+'proxy.aspx?url='+escape('http://api.bit.ly/v3/shorten?login=lrdn&apiKey=R_915ae3f06acfeb9d645b66df5a2f3929&uri='+escape(url)+'&format=txt'), {
        method:"get",
        onFailure: function(request) {
            alert('Erreur AJAX : '+request.status+' '+request.statusText);
        },
        onSuccess: function(response) {
            var newUrl = response.responseText.replace('\n','');
            if (newUrl=="") {
                newUrl=url;
            }
            window.location='http://twitter.com/home?status='+title+escape(' '+newUrl);
        }
    }); 
}

textSize=function(sens) {
    //augmente ou réduit la taille du texte
    //sens= 1 ou -1
    var obj=document.getElementById('body');
    if (obj) {
        sens=(sens)? sens:1;
        if (sens!=1) sens=-1
        var fs=Element.getStyle(obj,'font-size');
        var fontSize=parseInt(fs);
        if (fs.indexOf('%')!=-1) {
            fontSize+=(10*sens);
            if (fontSize<50) fontSize=50;
            if (fontSize>150) fontSize=150;
            obj.style.fontSize=fontSize+'%';
        }
        else {
            fontSize+=(1*sens);
            if (fontSize<9) fontSize=9;
            if (fontSize>20) fontSize=20;
            obj.style.fontSize=fontSize+'px';
        }
    }
}

boutiqueOnSubmit=function(obj) {
    var s=boutiqueSelectChange(obj.elements[0]);
    if (s[0]) {
        //ok
        //alert("Notre boutique en ligne sera opérationnelle d'ici quelques jours");
        //s[0]=false; //provisoire!!!
        
    }
    else {
        //erreur
        alert(s[1]);
    }
    return s[0];
}
boutiqueSelectChange=function(obj) {
    var form=obj.form;
    var col=[],value,legend,canSubmit,erreur;
    for (var x=0;x<form.elements.length;x++) {
        var el=form.elements[x];
        if (el.name && el.name!='') {
            col[el.name]=el;
        }
    }
    var spans=document.getElementsByTagAndClassName('span','',form);
    for (var x=0;x<spans.length;x++) {
        var el=spans[x];
        if (el.id!='') {
            col[el.id]=el;
        }
    }
    var spans=document.getElementsByTagAndClassName('legend','',form);
    for (var x=0;x<spans.length;x++) {
        var el=spans[x];
        if (el.id!='') {
            col[el.id]=el;
        }
    }
    canSubmit=true;
    erreur='';
    //reference
    value=col['articleid'].value;
    legend=col['articledesignation'].value;
    if (col['selatb1']) {
        var mSelect=col['selatb1'];
        var v=mSelect.value.split('|')[0];
        value+=v;
        if (v!=''){
            legend+=', '+mSelect.options[mSelect.selectedIndex].text;
        }
        else {
            canSubmit=false;
            erreur+=mSelect.options[mSelect.selectedIndex].text+'\n';
        }
    }
    if (col['selatb2']) {
        var mSelect=col['selatb2'];
        var v=mSelect.value.split('|')[0];
        value+=v;
        if (v!=''){
            legend+=', '+mSelect.options[mSelect.selectedIndex].text;
        }
        else {
            canSubmit=false;
            erreur+=mSelect.options[mSelect.selectedIndex].text+'\n';
        }
    }
    col['articlereference'].value=value;
    if (col['afarticlereference'])
        col['afarticlereference'].innerHTML=value;
    col['afarticlelegend'].innerHTML=legend;
    //pu
    //value=.0;
    value=parseFloat(col['articleprix'].value);
    //alert(value);
    if (col['selatb1']) {
        value+=parseFloat(col['selatb1'].value.split('|')[1]);
        col['articlepu'].value=value;
    }
    if (col['selatb2']) {
        value+=parseFloat(col['selatb2'].value.split('|')[1]);
        col['articlepu'].value=value;
    }
    value=''+value;
    if (value.indexOf('.')==-1)
        value+='.00';
    while (value.substr(value.length-3,1)!='.')
        value+='0';
    if (col['afarticlepu'])
        col['afarticlepu'].innerHTML=value;
    //port
    value=.0;
    if (col['selatb1']) {
        value+=parseFloat(col['selatb1'].value.split('|')[2]);
        col['articleport'].value=value;
    }
    if (col['selatb2']) {
        value+=parseFloat(col['selatb2'].value.split('|')[2]);
        col['articleport'].value=value;
    }
    value=''+value;
    if (value.indexOf('.')==-1)
        value+='.00';
    while (value.substr(value.length-3,1)!='.')
        value+='0';
    if (col['afarticleport'])
        col['afarticleport'].innerHTML=value;
    //paypal
    if (col['item_name'])       //nom objet
        col['item_name'].value=col['afarticlelegend'].innerHTML;
    if (col['item_number'])     //ref objet
        col['item_number'].value=col['articlereference'].value;
    if (col['amount'])          //valeur objet
        col['amount'].value=col['articlepu'].value;
    if (col['shipping'])        //port 1er objet
        col['shipping'].value=col['articleport'].value;
    if (col['shipping2'])        //port objets 2 à n
        col['shipping2'].value=col['articleport'].value;
    return [canSubmit,erreur];
}

if (!document.all) {
    //moz outerHTML implémentation

    var _emptyTags = {
       "BR":    true,
       "COL":   true,
       "EMBED": true,
       "HR":    true,
       "IMG":   true,
       "INPUT": true,
       "LINK":  true,
       "META":  true,
       "PARAM": true
    };

    HTMLElement.prototype.__defineGetter__("outerHTML", function () {
       var attrs = this.attributes;
       var str = "<" + this.tagName;
       for (var i = 0; i < attrs.length; i++)
          str += " " + attrs[i].name + "=\"" + attrs[i].value + "\"";
       if (_emptyTags[this.tagName])
          return str + ">";

       return str + ">" + this.innerHTML + "</" + this.tagName + ">";
    });

    HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
       var r = this.ownerDocument.createRange();
       r.setStartBefore(this);
       var df = r.createContextualFragment(sHTML);
       this.parentNode.replaceChild(df, this);
    });

}

var ArrayList = Class.create();
ArrayList.prototype = {
    //gestion d'une liste
    initialize: function() {
        this.array = [];    },
    iterator: function() {        return new IteratorList(this)    },    count: function() {        return this.array.length;    },    get: function(index) {        return this.array[index];    },    toArray: function() {        return this.array;    },    toString: function() {        return this.array.toString();    },    add: function(obj) {        this.array[this.array.length] = obj;    },    merge: function(obj) {        //fusion d'un Array ou ArrayList ou autre        if (obj instanceof Array) {            for (var i=0;i<obj.length;i++)                this.add(obj[i]);        }        else if (obj instanceof ArrayList) {            for (var i=0;i<obj.length();i++)                this.add(obj.get(i));        }        else            this.add(obj);    },    remove: function(index) {        this.array.splice(index,1);    }}
var IteratorList = Class.create();
IteratorList.prototype = {    initialize: function(arrayList) {
        this.arrayList = arrayList;        this.index = 0;    },
    hasNext: function() {        return this.index < this.arrayList.count();    },    next: function() {        return this.index++;    },    item:function() {        return this.arrayList.get(this.index);    }}
var HashTable = Class.create();
HashTable.prototype = {
    initialize: function() {
        this.arrayList = new ArrayList();    },
    iterator: function() {        return this.arrayList.iterator();    },    count: function() {        return this.arrayList.count();    },    get: function(index) {        return this.arrayList.get(index);    },    toArray: function() {        return this.arrayList.toArray();    },    toString: function() {        return this.arrayList.toString();    },    add: function(key,value) {        //attention, une clés est unique        //si la clé existe déjà, seule la valeur associée change        for(var i=this.iterator();i.hasNext();i.next()) {            var item=i.item();            if (item.key===key) {                item.value=value;                return;            }        }        this.arrayList.add(new ItemHashTable(key,value));    },    merge: function(obj) {        //fusion d'un Array, ArrayList ou HashTable        if (obj instanceof Array) {            //attention: si fusion de plusieurs Array, certaines clés seront identiques!!            for (var i=0;i<obj.length;i++)                this.add(i,obj[i]);        }        else if (obj instanceof ArrayList) {            //attention: si fusion de plusieurs ArrayList, certaines clés seront identiques!!            for (var i=0;i<obj.length();i++)                this.add(i,obj.get(i));        }        else if (obj instanceof HashTable) {            for(var i=obj.iterator();i.hasNext();i.next()) {                var item=i.item();                this.add(item.key,item.value)            }        }        else {            throw 'ArrayList.addAll: instance non prise en charge';        }    },    remove: function(key) {        for(var i=this.iterator();i.hasNext();i.next()) {            var index=i.index;            if (i.next().key===key) {                this.arrayList.remove(index);                break;            }        }    },    keys: function() {        // liste des clés        var ret=new ArrayList()        for(var i=this.iterator();i.hasNext();i.next()) {            ret.add(i.item().key);        }        return ret;    },    key: function(value) {        // liste des clés associées à une valeur        var ret=new ArrayList()        for(var i=this.iterator();i.hasNext();i.next()) {            var item=i.item();            if (item.value===value)                ret.add(item.key);        }        return ret;    },    values: function() {        // liste des valeurs        var ret=new ArrayList()        for(var i=this.iterator();i.hasNext();i.next()) {            ret.add(i.item().value);        }        return ret;    },    value: function(key) {        // valeur associé à une clé        for(var i=this.iterator();i.hasNext();i.next()) {            var item=i.item();            if (item.key===key)                return item.value;        }        return null;    }}
var ItemHashTable = Class.create();
ItemHashTable.prototype = {
    initialize: function(key,value) {
        this.key = key;
        this.value = value; 
    },    toString: function() {        return this.value;    }}

String.prototype.HTMLtoXHTML = function(cleaner) {
    //cleaner est optionel
    //cleaner='mso'     nettoyeur MS Office:    supprime les balises (o:*, st1:*) et attributs contenant (mso) 
    //cleaner='style'   nettoyeur présentation: supprime les balises (font) et attributs de présentation (class, style)
    cleaner=(cleaner)? cleaner : '';
    var commun='html,head,body,table,thead,tbody,tfoot,col,form,ul,ol,blockquote,p,object,hr,ul,ol,h1,h2,h3,h4,h5,h6,pre,address,script,embed,fieldset,legend,marquee';
	var nlBefore=(commun+',base,div,meta,option,area,link,base,li,title,td,th,tr,caption').split(',');
	var nlAfter= (commun+',br,param').split(',');
	var nlBeforeAfter= 'fieldset,form,object,ol,tr,ul,div'.split(',');
	var tabBefore= 'li,option,param,td,th'.split(',');
    //supression caractères cr,lf,tab
    var str='';
    var c,fCDATA=0;
    for (var x=0,l=this.length;x<l;x++) {
        c=this.substr(x,1);
        switch (c) {
        case '\n':
        case '\r':
        case '\t':
            if (fCDATA>0)
                str+=c;
            else {
                //un texte peut contenir des \n entre 2 mots
                if (x+1<l && this.substr(x+1,1)>=' ' && this.substr(x+1,1)!='<') {
                    str+=' ';
                }
            }
            break;
        case '-':
        case '<':
            if (fCDATA>0) {
                if ( (x+8<l && this.substr(x,8).toLowerCase()=='</sc'+'ript') || (x+3<l && this.substr(x,3)=='-->') || (x+6<l && this.substr(x,6).toLowerCase()=='</pre>') )
                    fCDATA--;
            }
            else {
                if ( (x+7<l && this.substr(x,7).toLowerCase()=='<sc'+'ript') || (x+4<l && this.substr(x,4)=='<!--')|| (x+5<l && this.substr(x,4).toLowerCase()=='<pre') )
                    fCDATA++;
            }
        default:
            str+=c;
            break;
        }
    }
    //supression anciens commmentaires d'erreurs
    str=str.replace(/<\!-- \[errors\]([\S\s]*?)-->/gi,'');
    //supression commmentaires conditionnels IE
    str=str.replace(/<!--\[if([\S\s]*?)\[endif\]-->/gi,'');
    //supression balises xml
    str=str.replace(/<xml[^>]*>([\S\s]*?)<\/xml>/gi,'');
    if (cleaner.match(/style/)) {
        //supression balises style
        str=str.replace(/<style[^>]*>([\S\s]*?)<\/style>/gi,'');
    }
    //suppression balises sans tagname
    str=str.replace(/<>/gi,'').replace(/<\/>/gi,'');
    
    //supression des endtags solitaires
    str=str.replace(/<\/br>/gi,'');
    str=str.replace(/<\/col>/gi,'');
    str=str.replace(/<\/embed>/gi,'');
    str=str.replace(/<\/hr>/gi,'');
    str=str.replace(/<\/img>/gi,'');
    str=str.replace(/<\/input>/gi,'');
    str=str.replace(/<\/link>/gi,'');
    str=str.replace(/<\/meta>/gi,'');
    str=str.replace(/<\/param>/gi,'');
    
    //traitement
    var errors=new ArrayList();
    var tags=str.match(/<\S[^><]*>/g)
    if (tags) {
        var stack=[];
        for (var i=0,li=tags.length;i<li;i++) {
            var tag=tags[i];
            var tName=tag.match(/<(\/?)([0-9a-zA-Z:]+)(.*?)(\/?)>/);
            if (tName) {
                //tagName
                var tagName=tName[2].toLowerCase();
                var eraseTag=false;
                //if (cleaner.match(/mso/) && (tagName.substr(0,2)=='o:' || tagName.substr(0,2)=='v:' || tagName.substr(0,2)=='m:' || tagName.substr(0,4)=='st1:' || tagName=='span' || tagName=='meta' || tagName=='link' || tagName=='style' || tagName=='xml' ) )
                if (cleaner.match(/mso/) && (tagName.substr(0,2)=='o:' || tagName.substr(0,4)=='st1:' || tagName=='span' || tagName=='meta' || tagName=='title' || tagName=='link' || tagName=='style' ) )
                    eraseTag=true;
                if (cleaner.match(/style/) && (tagName=='font' || tagName=='style') )
                    eraseTag=true;
                switch (tagName) {
                    case 'b':
                        tagName='strong';
                        break;
                    case 'i':
                        tagName='em';
                        break;
                    case 'br':
                    case 'col':
                    case 'embed':
                    case 'hr':
                    case 'img':
                    case 'input':
                    case 'link':
                    case 'meta':
                    case 'param':
                        tName[1]='';
                        tName[4]='/';
                        break;
                }
                var tagStart=(tName[1]=='') && (tName[4]=='');
                var tagEnd=(tName[1]=='/') && (tName[4]=='');
                var tagAlone=(tName[1]=='') && (tName[4]=='/');
                //attributs
                var attributes='';
                var ht=new HashTable();
                switch (tagName) {
                    case 'img':
                        ht.add('alt','');
                        break;
                    case 'input':
                        ht.add('type','text');
                        break
                    case 'script':
                        ht.add('type','text/javascript');
                        break;
                    case 'style':
                        ht.add('type','text/stylesheet');
                        break;
                    case 'textarea':
                        ht.add('cols','20');
                        ht.add('rows','4');
                        break;
                }
                var atbs=tName[3].match(/[0-9a-zA-Z:]+(=?".*?"|=?'.*?'|=\S+)?/g);
                if (atbs) {
                    for (var j=0,lj=atbs.length;j<lj;j++) {
                        var atb=(atbs[j]+'=').split('=');
                        var atbName=atb[0].toLowerCase();
                        var atbValue=(atb[1]=='')? atbName : atbs[j].substr(atbs[j].indexOf('=')+1);
                        var addAtb=true;
                        if (atbName=='moz' || atbName=='dirty')
                            addAtb=false;
                        if (atbName=='class' && atbValue.toLowerCase().indexOf('apple-style')!=-1)
                            addAtb=false;
                        if (atbName=='align' && atbValue=='')
                            addAtb=false;
                        if (cleaner.match(/mso/) && atbValue.toLowerCase().indexOf('mso')!=-1)
                            addAtb=false;
                        if (cleaner.match(/style/) && (atbName=='class' || atbName=='style' || atbName=='align'))
                            addAtb=false;
                        if (addAtb)
                            ht.add(atbName,atbValue);
                    }
                }
                for(var j=ht.iterator();j.hasNext();j.next()) {                    var item=j.item();
                    var sep=item.value.substr(0,1);
                    if (!(sep=='\'' || sep=='"'))
                        item.value='"'+item.value+'"';
                    attributes+=' '+item.key+"="+item.value;
                }
                if (tagName=='input' && ht.value('type') && ht.value('type').indexOf('text')!=-1 && ht.value('alt')==null && ht.value('label')==null)
                    attributes+=' alt=""';
                var newTag='<';
                if (tagStart) {
                    stack.push(tagName);
                    newTag+=tagName+attributes;
                }
                else if (tagEnd) {
                    try {
                        var expected=stack.pop();
                        if (expected!=tagName) {
                            stack.push(expected);
                            errors.add('Syntax error near '+tag+', expected tag: </'+expected+'>.');
                        }
                    }
                    catch (e) {
                        errors.add('Syntax error near '+tag+', too many closed tags.');
                    }
                    newTag+='/'+tagName;
                }
                else if (tagAlone) {
                    newTag+=tagName+attributes+' /';
                }
                
                newTag+='>';
                if (eraseTag) {
                    str=str.replace(tag,'');
                }
                else {
                    str=str.replace(tag,newTag);
                }
            }
        }
        while (stack.length!=0) {
            errors.add('Syntax error near <'+stack.pop()+'>, too many opened tags.');
        }
    }
    //ajout nl
    str=str.replace(new RegExp('<!--','g'),'\n<!--');
    for (var x=0,l=nlBefore.length;x<l;x++) {
        str=str.replace(new RegExp('<'+nlBefore[x],'g'),'\n<'+nlBefore[x]);
    }
    for (var x=0,l=nlAfter.length;x<l;x++) {
        str=str.replace(new RegExp('</'+nlAfter[x]+'>','g'),'</'+nlAfter[x]+'>\n');
        str=str.replace(new RegExp('<'+nlAfter[x]+' />','g'),'<'+nlAfter[x]+' />\n');
    }
    for (var x=0,l=nlBeforeAfter.length;x<l;x++) {
        str=str.replace(new RegExp('</'+nlBeforeAfter[x]+'>','g'),'\n</'+nlBeforeAfter[x]+'>');
    }
    //indente
    for (var x=0,l=tabBefore.length;x<l;x++) {
        str=str.replace(new RegExp('<'+tabBefore[x],'g'),'\t<'+tabBefore[x]);
    }    
    //ponctuation
    str=str.replace(new RegExp(' :','g'),'&nbsp;:');
    str=str.replace(new RegExp(' \\!','g'),'&nbsp;!');
    str=str.replace(new RegExp(' \\?','g'),'&nbsp;?');
    str=str.replace(new RegExp('« ','g'),'«&nbsp;');
    str=str.replace(new RegExp(' »','g'),'&nbsp;»');
    //mise en forme
    str=str.replace(new RegExp(' &nbsp;','g'),' ');
    str=str.replace(new RegExp('\n ','g'),'\n');
    str=str.replace(new RegExp('&nbsp;<br />','g'),'<br />');
    str=str.replace(new RegExp(' <br />','g'),'<br />');
    str=str.replace(new RegExp('<br />\n</p','g'),'</p');
    str=str.replace(new RegExp(' </h','g'),'</h');  //h1 à h6
    str=str.replace(new RegExp(' </a','g'),'</a');
    str=str.replace(new RegExp(' </p','g'),'</p');
    str=str.replace(new RegExp(' </div','g'),'</div');
    str=str.replace(new RegExp('<p></p>','g'),'<p>&nbsp;</p>');

    //messages d'erreurs 
    if (errors.count()!=0) {
        str+='\n<!-- [Errors]: '+errors.count();
        for(var x=errors.iterator();x.hasNext();x.next()) {
            str+='\n\t'+x.item();
        }
        str+='\n-->\n';
    }
    return str;
}

