Introduction

Le package que vous venez de décompresser contient les fichiers suivants :

  • README.html : les instructions que vous êtes en train de lire.
  • samp.js : librairie javascript SAMP (développé par Mark Taylor).
  • index.html : la page Web à laquelle nous souhaitons ajouter des fonctionnalités SAMP.
  • init.js : le script appelé par index.html . C'est ce fichier que nous allons modifier.
  • checkplayer.js, flXHR.js, flXHR.swf, flXHR.vbs, flensed.js, json2.js et swobject.js : fichiers utilitaires de la librairie flXHR/flensed (qui permet de faire de l'AJAX cross-domain). Sert pour les navigateurs ne supportant pas CORS (Cross-Origin Resource Sharing)
  • jquery-1.7.1.min.js

Pré-requis

Pour tester nos développements en local, il faut lancer Chrome avec l'option --disable-web-security (sous Mac OS: open /Applications/Google\ Chrome.app --args --disable-web-security).
Si vous utilisez Firefox ou un autre navigateur, il faudra uploader le code derrière un serveur HTTP pour pouvoir le tester.

Il nous faudra aussi utiliser le hub JSAMP. Téléchargez le JAR de la dernière version depuis la page http://software.astrogrid.org/doc/p/jsamp/1.3-2/downloads.html, puis lancez-le avec:
java java -jar jsamp.jar hub

Remarque : Pour des raisons de simplicité et de concision, nous utiliserons la librairie jQuery. Mais on pourrait très bien s'en passer.

1. Connexion au hub

Editez le fichier init.js et ajoutez les lignes suivantes :

    var metadata = {
        "samp.name": "Web SAMP demo",
        "samp.description": "A small application to demonstrate Web SAMP profile",
        "samp.icon.url": "http://www.obspm.fr/images_interface/logo.gif"
    };
    var connector =  new samp.Connector("Web SAMP example", metadata, null, null);
L'objet connector va gérer la connexion au hub SAMP. metadata contient les métadonnées propres à notre application.

On va maintenant demander la connexion au hub SAMP lors du click sur le bouton Register

    $('#register').click(function(e) {
        connector.register();
    });

Tester votre code dans un navigateur (en vous assurant au préalable que le hub a été lancé). Si tout fonctionne correctement, le hub vous demandera confirmation de la connexion.
Remarque : en lançant le hub avec le paramètre -web:auth true , on désactive l'apparition de la fenetre de confirmation de connexion.

Complétons maintenant notre code pour faire apparaitre sur notre page le statut actuel de la connexion au hub SAMP.
Pour cela, nous testerons à intervalle régulier la valeur de la variable connector.connection :

setInterval(function () {
    if (connector.connection) {
        $('#register').hide();
        $('#unregister').show();
        $('#sampStatus').html('Connected');
        $('#sampStatus').removeClass('disconnected');
        $('#sampStatus').addClass('connected');
    }
    else {
        $('#register').show();
        $('#unregister').hide();
        $('#sampStatus').html('Not connected');
        $('#sampStatus').removeClass('connected');
        $('#sampStatus').addClass('disconnected');
    }
}, 1000);

Recharger la page et testez si l'état de la connexion est correctement reflétée dans la page web.

Ajoutons le code pour nous déconnecter du hub lors du click sur le bouton Unregister:

    $('#unregister').click(function(e) {
        connector.unregister();
    });

Remarque: Si vous regardez la fenêtre du hub, vous constaterez que plusieurs instances de notre application apparaissent dans la liste des clients connectés.
Pour nous déconnecter lorsqu'on ferme l'onglet de la page, on peut ajouter le code suivant :

    $(window).unload(function() {
        if (connector.connection) {
            connector.unregister();
        }
    });

2. Chargement d'une VOTable

On va maintenant voir comment demander le chargement d'une VOTable lors du click sur le bouton Broadcast results table
Il faut créer un objet samp.Message et lui passer en paramètres le mtype approprié et la liste des paramètres correspondants, notamment l'URL de la VOTable à charger:

    $('#broadcastVOTable#').click(function(e) {
        var tableUrl = 'http://vizier.u-strasbg.fr/viz-bin/votable?-source=J%2FAJ%2F125%2F2411%2Ftable1&-out.add=_RAJ,_DEJ&-oc.form=dm&-out.meta=DhuL&-out.max=50&-out=_VizieR,*Mime(image/fits),*&-mime=TSV';
        var msg = new samp.Message("table.load.votable",
                                   {"table-id": "maTable",
                                    "url": tableUrl,
                                    "name": "SIRTF-table"});
        connector.connection.notifyAll([msg]);
    });

3. Chargement d'une image

Au click sur un des boutons Broadcast image, on va récupérer l'URL correspondant à l'image FITS, créer le message SAMP et l'envoyer à tous les clients connectés :

    $('.imageBtn').click(function(e) {
        var imgUrl = $(this).parent().parent().find('a').attr('href');
        var msg = new samp.Message("image.load.fits",
                                  {"image-id": imgUrl,
                                  "url": imgUrl,
                                  "name": "SIRTF-image"});
        connector.connection.notifyAll([msg]); 
    });
          

4. Traiter des messages provenant d'une autre application

Avant la déclaration de l'objet connector, déclarez un CallableClient :

var callableClient = new samp.CallableClient();
          
Puis, on déclare les messages que l'on souhaite recevoir (table.select.rowList) et on code le traitement associé:
callableClient.callHandler["table.select.rowList"] = function(senderId, message) {
    //console.log(message);
    var params = message["samp.params"];
    // on vérifie qu'il s'agit bien de la table qu'on a envoyé précédemment
    if (params['table-id'] != 'maTable') {
        return;
    }
    // on remet toutes les lignes en blanc
    $('#tableResults tr').css('background-color', 'white');
    for (var idx in params["row-list"]) {
        // on colore en orange les lignes sélectionnées
        $('#row' + params["row-list"][idx]).css('background-color', 'orange');
    }
}
Remplacez la ligne var connector = ... par
var connector = new samp.Connector("Web SAMP example", metadata, callableClient, callableClient.calculateSubscriptions());

5. Ajouter des fonctionnalités SAMP à votre application

A vous de jouer !