﻿/*	copyright www.laRouteDuNet.fr 2007

    lecture et affichage de flux RSS ou ATOM
    exemple: new Control.Rss(url,span)  où span est un container d'affichage (ou son ID)

	ATTENTION:  nécessite prototype.js, prototypeplus.js, controltime.js
	            utilise proxy.aspx
*/
if(typeof Prototype == 'undefined')
  throw("controlsyndication.js requires prototype.js library");

if(!Control) var Control = {};

Control.ElmNode = Class.create();
Control.ElmNode.prototype = {
    //stockage de données d'un node et de ses enfants
    initialize: function() {
        this.nodeName='';
        this.text='';
        this.children=new Array();
        this.attributes=new Array();
    },
    getAtbValue: function(nodeName) {
        for (var x=0;x<this.attributes.length;x++) {
            if (this.attributes[x].nodeName==nodeName)
                return this.attributes[x].text;
        }
        return '';
    },
    getElm: function(nodeName,atbName,atbValue) {
        for (var x=0;x<this.children.length;x++) {
            if (this.children[x].nodeName==nodeName) {
                if (atbName) {
                    if (this.children[x].getAtbValue(atbName)==atbValue)
                        return this.children[x];
                }
                else
                    return this.children[x];
            }
        }
        return null;
    },
    getElmValue: function(nodeName,atbName,atbValue) {
        for (var x=0;x<this.children.length;x++) {
            if (this.children[x].nodeName==nodeName) {
                if (atbName) {
                    if (this.children[x].getAtbValue(atbName)==atbValue)
                        return this.children[x].text;
                }
                else
                    return this.children[x].text;
            }
        }
        return '';
    },
    getElements: function(nodeName,atbName,atbValue) {
        var elements=new Array();
        for (var x=0;x<this.children.length;x++) {
            if (this.children[x].nodeName==nodeName) {
                if (atbName) {
                    if (this.children[x].getAtbValue(atbName)==atbValue)
                        elements.push(this.children[x]);
                }
                else
                    elements.push(this.children[x]);
            }
        }
        return elements;
    }
}


Control.Rss = Class.create();
//lecteur RSS
Control.Rss.prototype = {
    initialize: function(url,span) {
        this.url=url;
        var r=new RegExp(/^http:\/\/[0-9a-zA-Z_.-]*\//)
        var r2=this.url.match(r);
        this.base=r2[0];
        this.span=$(span);
        if (!this.span) {
            this.span=document.createElement('div');
            document.body.appendChild(this.span);
        }
        this.showheader=eval(this.span.getAttribute('cogite:showheader') || 'true');    //affiche la titraille du flux
        this.showcreate=eval(this.span.getAttribute('cogite:showcreate') || 'true');    //affiche la date sous les liens
        this.showby=eval(this.span.getAttribute('cogite:showby') || 'true');            //affiche l'auteur sous les liens
        this.showdesc=eval(this.span.getAttribute('cogite:showdesc') || 'true');        //affiche les descriptions sous les liens
        this.showvignette=eval(this.span.getAttribute('cogite:showvignette') || 'true');//affiche les vignettes dans les description
        this.showlink=eval(this.span.getAttribute('cogite:showlink') || 'true');        //affiche les liens
        this.showcontent=eval(this.span.getAttribute('cogite:showcontent') || 'true');  //affiche les contenus
        this.showreadmore=eval(this.span.getAttribute('cogite:showreadmore') || 'false'); //affiche le lien "Lire +"
        this.max=parseInt(this.span.getAttribute('cogite:max') || '999');               //affiche max items
        this.topview=parseInt(this.span.getAttribute('cogite:topview') || '999');       //affiche les n premiers normalement, les autres avec showdesc=false et showcontent=false
        this.title=this.span.title;                                                     //title!='' => substitue la titraille du flux rss
        this.span.title='';


        this.baseUrl=(typeof cogiteDatas == 'undefined')? document.location.href.substr(0,document.location.href.toLowerCase().indexOf('default.aspx')) :  cogiteDatas.baseUrl;
        this.iconeArticle=(typeof cogiteDatas == 'undefined')? 'images/icones/article.gif' : 'images/icones/'+cogiteDatas.siteIcones+'/article.'+cogiteDatas.siteIcones.split('_')[0];
        this.iconeReadMore=(typeof cogiteDatas == 'undefined')? 'images/icones/readmore.gif' : 'images/icones/'+cogiteDatas.siteIcones+'/readmore.'+cogiteDatas.siteIcones.split('_')[0];
        this.rssRefresh();
    },
    ajaxFailure:function(request) {
        //alert('Erreur AJAX RSS: '+request.status+' '+request.statusText);
        this.span.innerHTML='Erreur AJAX RSS: '+request.status+' '+request.statusText;
    },
    rssRefresh: function() {
        this.span.innerHTML='<img src="images/divers/ajax_load.gif" alt="loading..." />'+this.span.innerHTML;
        var url=this.baseUrl+'proxy.aspx?url='+escape(this.url)
		var pars = '';
		var xp=url.indexOf('?');
		if (xp!=-1) {
		    pars=url.substr(xp+1);
		    url=url.substr(0,xp);
		}
        new Ajax.Request(
					url, 
					{method: 'get', parameters: pars, onFailure: this.ajaxFailure.bind(this), onSuccess: this.rssResponse.bind(this)}
					);
    },
    rssResponse: function(request) {
        this.span.innerHTML='';
        var obj=new Control.ElmNode();
        this.rssReader(request.responseXML,obj);
        //RSS
        var root=obj.getElm('rss');
        if (!root)
            root=obj.getElm('rdf:RDF')
        if (root) {        
            //titraille
            var rssA=document.createElement('a');
            rssA.href=this.url;
            var rssImg=document.createElement('img')
            rssImg.alt='[rss]';
            rssImg.title="M'abonner";
            rssA.appendChild(rssImg);
            rssImg.src="images/rss/syndication.gif";
            var channel=root.getElm('channel');
            if (this.title=='') {
                if (this.showheader) {
                    var h2=document.createElement('h2');
                    h2.appendChild(rssA);
                    var a=document.createElement('a');
                    a.innerHTML=channel.getElmValue('title');
                    a.href=channel.getElmValue('link');
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                    h2.appendChild(a);
                    this.span.appendChild(h2);
                }
            }
            else {
                var h1=document.createElement('h1');
                h1.innerHTML=this.title;
                h1.appendChild(rssA);
                this.span.appendChild(h1);
            }
            
            //image
            var image=channel.getElm('image');
            if (image) {
                var img=document.createElement('img');
                img.src=image.getElmValue('url');
                var imageLink=image.getElm('link');
                if (imageLink) {
                    var a=document.createElement('a');
                    a.href=imageLink.text;
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                    a.appendChild(img);
                    this.span.appendChild(a);
                }
                else
                    this.span.appendChild(img);
            }
            
            //corps
            var ul=document.createElement('div');
            this.span.appendChild(ul)
            var items=channel.getElements('item');
            if (root.nodeName=='rdf:RDF')
                items=root.getElements('item')
            var mMax=items.length;
            if (mMax>this.max)
                mMax=this.max;
            for (var x=0;x<mMax;x++) {
                if (x>=this.topview) {
                    this.showdesc=false;
                    this.showcontent=false;
                }
                var item=items[x];
                var li=document.createElement('div');
                li.className='item';
                ul.appendChild(li)
                
                if (this.showlink) {
                    var h=document.createElement('h2');
                    li.appendChild(h)
                    var a=document.createElement('a');
                    h.appendChild(a)
                    a.innerHTML='<img src="'+this.iconeArticle+'" alt="" />'+item.getElmValue('title');
                    a.className='node article';
                    a.href=item.getElmValue('link');
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                }
                
                var desc=document.createElement('span');
                desc.className='desc';
                li.appendChild(desc)
                
                var pubDate=item.getElmValue('pubDate');
                if (pubDate=='')
                    pubDate=item.getElmValue('dc:date');
                if (this.showcreate && (pubDate!='')) {
                    var create=document.createElement('span');
                    create.className='create';
                    create.innerHTML=Control.DateParser(pubDate).longFormat();
                    desc.appendChild(create);
                }

                var author=item.getElm('dc:creator');
                if (author) {
                    var authorName=item.getElmValue('dc:creator');
                    if (this.showby && (authorName!='' && authorName!='?')) {
                        var by=document.createElement('span');
                        by.className='by';
                        by.innerHTML=authorName;
                        desc.appendChild(by);
                    }
                }
                
                if (this.showdesc) {
                    var description=document.createElement('span');
                    description.className='description';
                    desc.appendChild(description);

                    if (this.showvignette) {
                        var enclosures=item.getElements('enclosure')
                        for (var y=0;y<enclosures.length;y++) {
                            var enclosure=enclosures[y];
                            var atbType=enclosure.getAtbValue('type');
                            var url=enclosure.getAtbValue('url')
                            if (atbType.indexOf('image/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                //if (cogiteDatas && cogiteDatas.siteLinkVignette) {
                                    switch (cogiteDatas.siteLinkVignette) {
                                        case 0: //_self
                                            a.rel='lightbox';
                                            break;
                                        case 1: //_blank
                                            a.target='_blank';
                                            break;
                                        case 2: //lien parent
                                            a.href=item.getElmValue('link');
                                            break;
                                    }
                                //}
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src=url;
                                img.className='vignette';
                                description.appendChild(a);
                            }
                            else if (atbType.indexOf('audio/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src='images/rss/listen.gif';
                                var cssFloat= (img.style.styleFloat === undefined ? 'cssFloat' : 'styleFloat');
                                img.style[cssFloat]='right';
                                description.appendChild(a);
                            }
                            else if (atbType.indexOf('video/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src='images/rss/watch.gif';
                                var cssFloat= (img.style.styleFloat === undefined ? 'cssFloat' : 'styleFloat');
                                img.style[cssFloat]='right';
                                description.appendChild(a);
                            }
                        }
                    }
                    var textDescription=document.createElement('span');
                    var T=item.getElmValue('description');
                    T=T.replace(new RegExp('src="/',"gi"),'src="'+this.base)
                    T=T.replace(new RegExp("src='/","gi"),"src='"+this.base)
                    T=T.replace(new RegExp('href="/',"gi"),'href="'+this.base)
                    T=T.replace(new RegExp("href='/","gi"),"href='"+this.base)
                    textDescription.innerHTML=T;
                    description.appendChild(textDescription);
                }
                //content
                var content=item.getElm('content:encoded');
                if (content && this.showcontent)
                {
                    var textContent=document.createElement('div');
                    var T=item.getElmValue('content:encoded');
                    T=T.replace(new RegExp('src="/',"gi"),'src="'+this.base)
                    T=T.replace(new RegExp("src='/","gi"),"src='"+this.base)
                    T=T.replace(new RegExp('href="/',"gi"),'href="'+this.base)
                    T=T.replace(new RegExp("href='/","gi"),"href='"+this.base)
                    textContent.innerHTML=T;
                    li.appendChild(textContent);
                }
                //read more
                if (this.showreadmore)
                {
                    var textReadMore=document.createElement('div');
                    var a=document.createElement('a');
                    textReadMore.appendChild(a)
                    //a.innerHTML='Lire +';
                    a.innerHTML='<img alt="" src="'+this.iconeReadMore+'"/>Lire +';
                    a.className='readmore';
                    a.href=item.getElmValue('link');
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                    li.appendChild(textReadMore);
                }
            }
            return
        }
        //ATOM
        root=obj.getElm('feed')
        if (root) {
            //titraille
            var rssA=document.createElement('a');
            rssA.href=this.url;
            var rssImg=document.createElement('img')
            rssImg.alt='[rss]';
            rssImg.title="M'abonner";
            rssA.appendChild(rssImg);
            rssImg.src="images/rss/syndication.gif";
            if (this.title=='') {
                if (this.showheader) {
                    var h2=document.createElement('h2');
                    h2.appendChild(rssA);
                    var a=document.createElement('a');
                    a.innerHTML=root.getElmValue('title');
                    var link=root.getElm('link','rel','') || root.getElm('link','rel','alternate');
                    a.href=link.getAtbValue('href');
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                    h2.appendChild(a);
                    this.span.appendChild(h2);
                }
            }
            else {
                var h1=document.createElement('h1');
                h1.innerHTML=this.title;
                h1.appendChild(rssA);
                this.span.appendChild(h1);
            }
            
            //corps
            var ul=document.createElement('div');
            this.span.appendChild(ul)
            var items=root.getElements('entry');
            var mMax=items.length;
            if (mMax>this.max)
                mMax=this.max;
            for (var x=0;x<mMax;x++) {
                if (x>=this.topview) {
                    this.showdesc=false;
                    this.showcontent=false;
                }
                //item
                var item=items[x];
                var li=document.createElement('div');
                li.className='item';
                ul.appendChild(li)
                
                if (this.showlink) {
                    var h=document.createElement('h2');
                    li.appendChild(h)
                    var a=document.createElement('a');
                    h.appendChild(a)
                    a.innerHTML='<img src="'+this.iconeArticle+'" alt="" />'+item.getElmValue('title');
                    a.href=item.getElm('link').getAtbValue('href');
                    a.className='node article';
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                }
                    
                var desc=document.createElement('span');
                desc.className='desc';
                li.appendChild(desc)
                
                var pubDate=item.getElmValue('published');
                if (pubDate=='')
                    pubDate=item.getElmValue('updated');
                if (pubDate=='')
                    pubDate=item.getElmValue('issued');
                if (pubDate=='')
                    pubDate=item.getElmValue('modified');
                if (this.showcreate && (pubDate!='')) {
                    var create=document.createElement('span');
                    create.className='create';
                    create.innerHTML=Control.DateParser(pubDate).longFormat();
                    desc.appendChild(create);
                }
                
                var author=item.getElm('author');
                if (this.showby && author) {
                    var authorName=author.getElmValue('name');
                    if (authorName!='' && authorName!='?') {
                        var by=document.createElement('span');
                        by.className='by';
                        authorName=author.getElmValue('name');
                        by.innerHTML=authorName;
                        desc.appendChild(by);
                    }
                }
                
                
                if (this.showdesc) {
                    var description=document.createElement('span');
                    description.className='description';
                    desc.appendChild(description);

                    if (this.showvignette) {
                        var enclosures=item.getElements('link','rel','enclosure')
                        for (var y=0;y<enclosures.length;y++) {
                            var enclosure=enclosures[y];
                            var atbType=enclosure.getAtbValue('type');
                            var url=enclosure.getAtbValue('href')
                            if (atbType.indexOf('image/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                //if (cogiteDatas && cogiteDatas.siteLinkVignette) {
                                    switch (cogiteDatas.siteLinkVignette) {
                                        case 0: //_self
                                            a.rel='lightbox';
                                            break;
                                        case 1: //_blank
                                            a.target='_blank';
                                            break;
                                        case 2: //lien parent
                                            a.href=item.getElm('link').getAtbValue('href');
                                            break;
                                    }
                                //}
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src=url;
                                img.className='vignette';
                                description.appendChild(a);
                            }
                            else if (atbType.indexOf('audio/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src='images/rss/listen.gif';
                                var cssFloat= (img.style.styleFloat === undefined ? 'cssFloat' : 'styleFloat');
                                img.style[cssFloat]='right';
                                description.appendChild(a);
                            }
                            else if (atbType.indexOf('video/')==0) {
                                var a=document.createElement('a');
                                a.href=url;
                                var img=document.createElement('img');
                                a.appendChild(img);
                                img.src='images/rss/watch.gif';
                                var cssFloat= (img.style.styleFloat === undefined ? 'cssFloat' : 'styleFloat');
                                img.style[cssFloat]='right';
                                description.appendChild(a);
                            }
                        }
                    }
                    var textDescription=document.createElement('span');
                    var T=item.getElmValue('summary');
                    T=T.replace(new RegExp('src="/',"gi"),'src="'+this.base)
                    T=T.replace(new RegExp('href="/',"gi"),'href="'+this.base)
                    textDescription.innerHTML=T;
                    description.appendChild(textDescription);
                }
                
                //content
                var content=item.getElm('content');
                if (content && this.showcontent)
                {
                    var textContent=document.createElement('div');
                    var T=item.getElmValue('content');
                    T=T.replace(new RegExp('src="/',"gi"),'src="'+this.base)
                    T=T.replace(new RegExp('href="/',"gi"),'href="'+this.base)
                    textContent.innerHTML=T;
                    li.appendChild(textContent);
                }
                //read more
                if (this.showreadmore)
                {
                    var textReadMore=document.createElement('div');
                    var a=document.createElement('a');
                    textReadMore.appendChild(a)
                    //a.innerHTML='Lire +';
                    a.innerHTML='<img alt="" src="'+this.iconeReadMore+'"/>Lire +';
                    a.className='readmore';
                    a.href=item.getElm('link').getAtbValue('href');
                    if (a.href.toString().indexOf(this.baseUrl)==-1)
                        a.target='_blank';
                    li.appendChild(textReadMore);
                }
            }
            return
        }
        
    },
    rssReader: function(node,parentObj) {
        var cn=node.childNodes;
        var xx=node.documentElement;
        var n=cn.length;
        if (n!=0) {
            for (var x=0;x<n;x++) {
                var elm=cn[x];
                switch (elm.nodeType) {
                case Node.ELEMENT_NODE:
                    var obj=new Control.ElmNode();
                    obj.nodeName=elm.nodeName;
                    obj.text=this.rssReaderText(elm)
                    parentObj.children.push(obj);
                    var nn=elm.attributes.length;
                    if (window.opera)
                        nn=999;             //avec opera, si un attribut est nommé 'length': elm.attributes.length retourne l'attribut 'length' à la place du nombre d'attributs!!!
                    for (var y=0;y<nn;y++) {
                        try {               //fix bug opera, voir plus haut
                            var atb=elm.attributes[y];
                            var objAtb=new Control.ElmNode();
                            objAtb.nodeName=atb.nodeName;
                            objAtb.text=atb.value;
                            obj.attributes.push(objAtb);
                        } catch (atbErr) {break;}
                    }
                    this.rssReader(elm,obj);   
                    break;             
                }
            }
        }
    },
    rssReaderText: function(node) {
        var text='';
        var cn=node.childNodes;
        var n=cn.length;
        for (var x=0;x<n;x++) {
            switch (cn[x].nodeType) {
            case Node.TEXT_NODE:
            case Node.CDATA_SECTION_NODE:
                text+=cn[x].nodeValue;
                break;
            }
        }
        return text;
    }
}

Control.AutoRss = Class.create();
//lecteur RSS
Control.AutoRss.prototype = {
    initialize: function() {
        //Event.observe(window, 'load', this.load.bind(this), false);
        document.observe('dom:loaded', this.load.bind(this), false);
    },
    load: function() {
        //la page est chargée
        var elms=document.getElementsByTagAndClassName('DIV','rss');
        for (var x=0,length=elms.length;x<length;x++) {
            var src=this.nodeId=elms[x].getAttribute('cogite:src') || '';
            if (src!='')
                new Control.Rss(src,elms[x]);
        }
    }
}
var AutoRss=new Control.AutoRss();