Emulateur Freebox (fb2ie tagslib.js)

Un article de Wiki FreePlayer.org.

Emulateur Freebox : retour à la page principale.

Cette page contient le code source complet du script "fb2ie_tagslib.js" (v2). Ce code est fourni tel quel, et peut être modifié directement en modifiant cette page.

La section "Changelog" permet à chaque contributeur d'indiquer les changements effectués.

Sommaire

Code source du fichier "fb2ie_tagslib.js"



/***********************************************************/
/*** Fonctions utilitaires  ***/
/***********************************************************/
// liste des touches reconnues
    var touches = {
        'help':"Aide",'options':"Options",
        'red':"Rouge",'green':"Vert",'yellow':"Jaune",'blue':"Bleu",
        'info':"Info",'guide':"Guide",
        'stop':"Stop",'play':"Lecture",'pause':"Pause",'rec':"Enregistrer",
        'prev':"Précédent",'next':"Suivant",'rev':"Retour rapide",'fwd':"Avance rapide",
        'up':"Haut",'down':"Bas",'left':"Gauche",'right':"Droite",
        'star':"Etoile",'sharp':"Dièse",
        'home_page':"Maison",
        'love_page':"Favoris",'love2_page':"Favoris (appui long)",
        'mail_page':"Messages",'mail2_page':"Messages (appui long)",
        'star_page':"Etoile",'sharp_page':"Dièse"
    }
// ajoute la touche "rel" à la liste des touches
function ajouteTouche(relhref) {

    if (touches[rel] != undefined) {
        // préparation du lien
        var lien document.createElement("a");
        lien.setAttribute("href",href);
            lien.appendChild(document.createTextNode(touches[rel]));
        // affichage du lien
        document.body.appendChild(document.createTextNode("["));
        document.body.appendChild(lien);
        document.body.appendChild(document.createTextNode("] "));
    }

}
// corrige l'opacité de l'élément "obj"
function setOpacity(objopacity) {
    opacity hex2dec(opacity)/4
    opacity opacity+36;
    // IE/Win
    obj.style.filter "alpha(opacity:"+opacity+")";
    // Safari<1.2, Konqueror
    obj.style.KHTMLOpacity opacity/100;
    // Older Mozilla and Firefox
    obj.style.MozOpacity opacity/100;
    // Safari 1.2, newer Firefox and Mozilla, CSS3
    obj.style.opacity opacity/100;
}
// mini-freebox (mode html)
function MiniFreebox() {
    // init historique
    lasturl="";
    // déplacement à l'url indiquée
    this.allerAUrl = function allerAUrl(url) {
        // traitement des urls "none"
        if (url == "none") { return(true) };
        // traitement des urls "back"
        if (url == "back") { url=lasturllocation.href=url; };

        lasturl=url;
        location.href=url;
    }
}
/***********************************************************/
/*** Règles de conversion des tags "freebox" en tags HTML  ***/
/***********************************************************/
var myrules = {
    'a' : function(a){
        // style des liens
        a.style.textDecoration="none";                   // pas de soulignement
        a.style.color=document.body.getAttribute("link");    // couleur standard
        // on ajoute un onmouseover/onmouseout sur le lien (IE)
        if (navigator.appName == "Microsoft Internet Explorer") {
            a.setAttribute("onfocus",function() { 
                this.style.color=document.body.getAttribute("alink");
                // - onfocus
                //(this.onfocus)?maFreebox.allerAUrl(this.onfocus):null;
            });
            a.setAttribute("onmouseover",function() { 
                this.style.color=document.body.getAttribute("alink");
                // - onfocus
                //(this.onfocus)?maFreebox.allerAUrl(this.onfocus):null;
            });
            a.setAttribute("onmouseout",function() { 
                this.style.color=document.body.getAttribute("link");
                // - onblur
                //(this.onblur)?maFreebox.allerAUrl(this.onblur):null;
            });
            a.setAttribute("onblur",function() { 
                this.style.color=document.body.getAttribute("link");
                // - onblur
                //(this.onblur)?maFreebox.allerAUrl(this.onblur):null;
            });
            a.setAttribute("onclick",function() { 
                this.style.color=document.body.getAttribute("vlink");
                // - onselect
                //(this.onselect)?maFreebox.allerAUrl(this.onselect):null;
            });
        // on ajoute un onmouseover/onmouseout sur le lien (Firefox/Mozilla)
        } else {
            a.setAttribute("onFocus","this.style.color=document.body.getAttribute('alink');");
            a.setAttribute("onMouseOver","this.style.color=document.body.getAttribute('alink');");
            a.setAttribute("onMouseOut","this.style.color=document.body.getAttribute('link');");
            a.setAttribute("onBlur","this.style.color=document.body.getAttribute('link');");
            a.setAttribute("onClick","this.style.color=document.body.getAttribute('vlink');");
        }
        // - href
        a.href='javascript:maFreebox.allerAUrl("'+a.href+'");';
        // - focused 
        (a.focused)?null:null;
        // - tag
        (a.tag)?null:null;
        // - title 
        (a.title)?null:null;
        // - rel (nouveauté firmwares 1.8.x)
        (a.rel)?ajouteTouche(a.rel,a.href):null;
    },
    'body' : function(body) {
        body.style.fontFamily="helvetica";
        body.style.fontWeight="bold";
        body.style.background="#000000";
        // <body background="ts://127.0.0.1?ox=10&oy=10&ow=700&oh=500">
        //maFreebox.setBackground(body.background);
        
        /*
        Protocoles supportés par la freebox :

                * ts
                  Flux de transport Mpeg2 encapsulé dans des paquets UDP/multicast.
            Les arguments sont :
                * pcr= pid de l'horloge de référence du programme.
                * vid= pid du flux vidéo.
                * aud= pid du flux audio.
                * ttx= pid du flux télétexte.
                * [ix|iy|iw|ih]= définit un rectangle à l'intérieur d'une image vidéo décodée. (NdT:defines a rectangle within a decode video picture.) Notez que la résolution de cette image n'est pas liée à la taille de l'écran (i.e elle peut être plus petite, plus grande ou égale à la taille de l'écran).
                * [ox|oy|ow|oh]= définit un rectangle dans lequel la fenêtre d'entrée sera affichée, ceci définit implicitement un facteur de taille qui est égal au ratio de la taille des fenêtres de sortie et d'entrée. (NdT:defines a rectangle into which the input window is to be displayed, this implicitly defines a scaling factor which is equal to the ration of the output and input window sizes.)
        
        */
    },
    'box' : function(box){
        // préparation de l'élément "table" correspondant à la box
        var table=document.createElement("table");
            table.cellPadding 0;
            table.cellSpacing 0;
            table.width box.width;
            table.height box.height;
            box.bgcolor?table.bgColor box.bgcolor.substr(07):null;
            box.abgcolor?table.abgcolor box.abgcolor.substr(07):null;
            table.border box.border;
            table.borderColor box.bordercolor.substr(07);
            // ajout du texte de la box
            var text document.createElement("tbody");
            var tmpNode2 document.createElement("tr");
            var tmpNode3 document.createElement("td");
            tmpNode3.align "center";
            var textNode document.createTextNode(box.text);
            tmpNode3.appendChild(textNode);
            tmpNode2.appendChild(tmpNode3);
            text.appendChild(tmpNode2);
            table.appendChild(text);
        // remplacement de la "box" par la table créée
        box.parentNode.replaceChild(table,box);    
    },
    'flags' : function(flags) {
        flags.wait_new_picture?null:null;
        flags.program_key?null:null;
        flags.volume_key?null:null;
        flags.no_parental_rating?null:null;
    },
    'font' : function(font) {
        // gestion de la police "symbol"
        // à remplacer par des images
        // ou des symboles équivalents
    },
    'hslider' : function(slider) {
        // todo : créer une bare de défilement horizontale
    },
    'img' : function(img){
        img.alpha?setOpacity(img,alpha.substr(1,2)):null;
        img.border?null:img.border=0;
    },
    'link' : function(link){
        ajouteTouche(link.rel,link.href);
    },
    'meta' : function(meta){
        // simulation des touches
        ajouteTouche(meta.name,meta.content);

        // configuration de la Freebox virtuelle
        switch (meta.name) {
            // dans le cas d'une redirection,, on poite le navgateur sur l'adresse cible
            // avec le timeout qui va bien
            case "refresh" :
                // récupération des paramètres
                valeurs meta.content.split(",");
                setTimeout('maFreebox.allerAUrl("'+valeurs[1].substring(4valeurs[1].length)+'");',valeurs[0]*1000);
            break;
            case "disappear" :
                setTimeout('document.write("")',meta.content*1000);
            break;
            case "location" :
                maFreebox.allerAUrl(meta.content);
            break;
            case "defer_location" :
                setTimeout('maFreebox.allerAUrl("'+meta.content+'");',500);
            break;
            case "nopicture" :
                // redirection si pas d'image vidéo reçue au bout de <content> secondes
            break;
            // flux vidéo
            case "display_aspect_ratio_conversion" :
                // "letterbox" "combined" "panscan" "ignore"
            break;
            case "display_video_output" :
                // "rgb" ou "video"
            break;
            case "video_output_scale" :
            break;
            case "denc_brightness" :
            break;
            case "denc_contrast" :
            break;
            case "denc_saturation" :
            break;
            case "volume" :
            break;
            case "display_video_commut" :
            break;
            // interface utilisateur
            case "scroll_increment" :
            break;
            case "front_panel" :
            break;
            // touches de la télécommande
            case "home_page" :
            break;
            case "love_page" :
            break;
            case "love2_page" :
            break;
            case "mail_page" :
            break;
            case "mail2_page" :
            break;
            case "star_page" :
            break;
            case "sharp_page" :
            break;
            // canaux :
            /*
            Une URL générique est une URL standard, 
             - où le premier '%d' est substitué par le numéro de chaîne courante, 
             - et le second '%d' par l'identificateur de service (sid) courant.
            */
            case "nochannel_page" :
            break;
            case "channel_page" :
                // <meta name="channel_page
                // content="http://192.168.2.10/channel.pl?num=%d&sid=%d"
            break;
            case "channel" :
                // non documentée
            break;
            case "prog_select_timeout" :
                // temps avant validation de saisie d'un digit (2000)
            break;
            case "prog_expand_timeout" :
                // temps avant ajout d'un dgit (300)
            break;
            case "key_repeat_delay" :
                // temps avant répétition de touche (288)
            break;
            case "key_repeat_interval" :
                // intervalle mini entre 2 répétitions de touche (72)
            break;
            // Accueil
            case "settings_page" :
            break;
            case "prompt" :
            break;
            // page d'erreur (VOD)
            case "error_page" :
            break;
            // statut freebox
            case "status_output" :
                // status freebox on ou off (off)
            break;
            // contrôle parental
            case "parental_rating" :
                // âge maximum en années de l'utilisateur final. 
            break;
            case "user-agent" :
                // Redéfinit l'agent utilisateur dans l'en-tête des requêtes HTTP.
            break;
            case "parental_rating_page" :
            break;
            // sous-titres
            case "ttx_subtitle_bgcolor" :
            break;
            case "ttx_subtitle_adjust" :
            break;
            case "ttx_subtitle_default_page" :
            break;
            case "ttx_subtitle_default_display" :
            break;
            case "ttx_subtitle_page" :
            break;
            case "ttx_subtitle_display" :
            break;
            default :
                // gestion des balises meta non reconues
                // lien.appendChild(document.createTextNode("Autre"));
            break;
        }
    },
    'service' : function(service) {
        /*
        <service num=2 sid=1002 shortname="France 2"
        url="ts://224.1.1.2?pcr=68&vid=68&aud=69&ttx=70"
        page="/channel/france2/head.html"
        code="special service flags">
         */
    },
    'table' : function(table){
        // correction du style des bordures sous Firefox
        if (navigator.appName != "Microsoft Internet Explorer") {
            table.style.borderStyle="solid";
        }
        table.getAttribute("vbgcolor")?null:table.setAttribute("vbgcolor",table.getAttribute("abgcolor"));
        // si un lien précède la table
        if (table.parentNode.tagName == "A" && table.getAttribute("abgcolor")) {
            // on ajoute un onmouseover/onmouseout sur le lien (IE)
            if (navigator.appName == "Microsoft Internet Explorer") {
                table.setAttribute("onmouseover",function() { 
                    this.borderColor2=this.borderColor;
                    this.borderColor=document.body.getAttribute("alink");
                    this.bgColor2=this.bgColor;
                    (this.abgcolor)?this.bgColor=this.abgcolor:null;
                    this.style.cursor='hand';
                });
                table.setAttribute("onmouseout",function() { 
                    this.borderColor=this.borderColor2;
                    this.bgColor=this.bgColor2;
                });
                table.setAttribute("onclick",function() { 
                    this.borderColor=document.body.getAttribute("vlink");
                    maFreebox.allerAUrl(this.parentNode.href);
                });
            // on ajoute un onmouseover/onmouseout sur le lien (Firefox/Mozilla/Opera)
            } else {
                table.setAttribute("onmouseover","this.bgColor = '"+table.getAttribute("abgcolor")+"'; ""this.style.borderColor='"+document.body.getAttribute("alink")+"';");
                table.setAttribute("onmouseout","this.bgColor = '"+table.bgColor+"';"+"this.style.borderColor='"+table.style.borderColor+"';");
                table.setAttribute("onfocus","this.bgColor = '"+table.getAttribute("abgcolor")+"'; ""this.style.borderColor='"+document.body.getAttribute("alink")+"';");
                table.setAttribute("onblur","this.bgColor = '"+table.bgColor+"';"+"this.style.borderColor='"+table.style.borderColor+"';");
                table.setAttribute("onclick","this.bgColor = '"+table.getAttribute("vbgcolor")+"';"+"this.style.borderColor='"+document.body.getAttribute("vlink")+"';");
            }
        }
    },
    'var' : function(variable) {
        // todo : gérer les variables dynamiques
    },
    'vslider' : function(slider) {
        // todo : créer une barre de défilement verticale
        // bgcolor="#3f3f3f3f" name="video_pos" min="0" max="99" grad="2"
    }
};


// exécution du script
var maFreebox = new MiniFreebox();
Behaviour.register(myrules);



Fonctionnement

Le tableau associatif "myrules" contient la liste dees règles appliquées aux tags Freebox.

Ces règles font appel aux fonctions utilitaires présentes en début de script.

Utilisation en mode "script" :

Le fichier fb2ie_tagslib.js intègre une mini-freebox vrtuelle assurant la gestion des liens.

Utilisation en mode "stand alone" :

Le fichier fb2ie_core.js prend le relais au niveau de la freebox virtuelle.

Bugs connus

  • Pas encore de bug connu... (mais il y en a sûrement plein !)

Changelog

  • 2007-04-27: version initiale. </u>