2009/dap/docs/lrest gallery-lrest.html,NONE,1.1 gallery-lrest.js,NONE,1.1 test.txt,NONE,1.1

Update of /sources/public/2009/dap/docs/lrest
In directory hutz:/tmp/cvs-serv16337

Added Files:
	gallery-lrest.html gallery-lrest.js test.txt 
Log Message:
LREST toying

--- NEW FILE: gallery-lrest.html ---
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
    <title>A Quick and Dirty Hack to Support LREST Gallery</title>
    <script src='gallery-lrest.js' type='text/javascript' charset='utf-8'></script>
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js' type='text/javascript' charset='utf-8'></script>
  </head>
  <body>
    <p>
      A normal XHR request still works: <button onclick='normal()'>Do it!</button>. Result:
    </p>
    <div id='normal' style='border: 1px solid orange; min-height: 20px;'></div>
    <hr/>
    <p>
      List the galleries that your browser knows about: <button onclick='listGals()'>Do it!</button>.
    </p>
    <table>
      <thead>
        <tr><th>Name</th><th>Action</th></tr>
      </thead>
      <tbody id='gals'></tbody>
    </table>
    <hr/>
    <div id='gal'>
      <h3>Gallery: <span id='galName'></span></h3>
      <table id='pics'></table>
    </div>
    <div id='big' style='text-align: center'><img/></div>
    <hr/>
    <pre id='log'></pre>
    
    <script type='text/javascript'>
      $("#gal").hide();
      $("#big").hide();
      $("#gals").parent().hide();
      
      // normal XHR request
      function normal () {
          try { $.get("test.txt", function (data) { $("#normal").html(data) }); }
          catch (e) { log("ERROR:", e); }
      }
      // list the gallery sources
      function listGals () {
          var $tb = $("#gals");
          $tb.parent().show();
          $tb.empty();
          $.each(navigator.services.galleries, function (i, it) {
              $tb.append("<tr><td></td><td></td></tr>")
                 .find("tr:last td:first")
                    .text(it.name)
                 .end()
                 .find("td:last")
                    .html("<button>Show</button>")
                    .find("button")
                      .click(function () { showGal(it); });
          });
      }
      // show gallery
      function showGal (gal) {
          log("showGal", gal.uri);
          try { $.getJSON(gal.uri, function (data) { displayGal(gal.name, data); }); }
          catch (e) { log("ERROR:", e); }
      }
      function displayGal (name, data) {
          log("name", name);
          log("dump", JSON.stringify(data));
          $("#gal").show();
          $("#galName").text(name);
          var $t = $("#pics");
          $t.empty();
          var $tr;
          $.each(data.items, function (i, it) {
              if ((i%5) == 0) {
                  $t.append("<tr></tr>");
                  $tr = $t.find("tr:last");
              }
              $tr.append("<td><img/><br/><span></span></td>")
                 .find("img:last")
                    .attr({ src: it.thumb })
                    .click(function () { showPic(it.uri) })
                 .end()
                 .find("span:last")
                    .css({fontSize: "0.8em"})
                    .text(it.title + " (" + it.date + ")");
          });
      }
      function showPic (uri) {
          var $g = $("#gal");
          $g.hide();
          var $b = $("#big");
          $b.find("img").attr({ src: uri })
                        .click(function () {
                            $b.hide();
                            $g.show();
                        });
          $b.show();
      }
      
      // for each:
      //    GET all
      //    GET one
      //    DELETE one
    </script>
  </body>
</html>

--- NEW FILE: gallery-lrest.js ---

function log () {
    var args = Array.prototype.slice.call(arguments);
    document.getElementById("log").textContent += args.join(" ") + "\n";
}

(function (GLOBAL) {
    // create the gallery services
    GLOBAL.navigator.services = {
        galleries:  [
            {
                name:   "Robin's Stream",
                uri:    "unicorn:flickr/person/14384224@N00",
            },
            {
                name:   "Unicorns",
                uri:    "unicorn:flickr/tag/werewolf",
            },
            {
                name:   "More Robin Than You Can Take",
                uri:    "unicorn:flickr/tag/robinberjon",
            },
        ],
    };

    // wrap the XHR
    var XHR = function () {
        // log("XHR constructed");
    };
    XHR.prototype = {
        oldXHR:     GLOBAL.XMLHttpRequest,
        isMagic:    false,
        open:   function (meth, uri) {
            // log("open called with", meth, uri);
            if (/^unicorn:/.test(uri)) {
                this.isMagic = true;
                uri = uri.replace(/^unicorn:/, "");
                var tmp = uri.split(/\//);
                this.service = tmp[0];
                this.type = tmp[1];
                this.param = tmp[2];
                this.method = meth;
                this.aborted = false;
                if (arguments.length > 2 && !arguments[2]) throw("No support for synchronous requests in this hack");
            }
            else {
                this.isMagic = false;
                this.xhr = new this.oldXHR();
                this.xhr.open.apply(this.xhr, arguments);
            }
            // log("xhr, magic:", this.xhr, this.isMagic);
        },
        send:   function (data) {
            try {
                // log("send called with", data, this.isMagic);
                if (!this.isMagic) return this.xhr.send.apply(this.xhr, arguments);
                var obj = this;
                GLOBAL.jsonFlickrFeed = function (o) {
                    if (!obj.cb) return;
                    var res = [];
                    for (var i = 0; i < o.items.length; i++) {
                        var it = o.items[i];
                        var pic = { 
                                title:  it.title, 
                                date:   it.date_taken, 
                                tags:   it.tags.split(/\s+/), 
                                // uri:    it.media.m.replace(/_m\./, "_b."),
                                uri:    it.media.m,
                                thumb:  it.media.m.replace(/_m\./, "_t."),
                        };
                        res.push(pic);
                    }
                    obj._status = 200;
                    obj._statusText = "OK";
                    obj._readyState = 4;
                    obj._responseText = JSON.stringify({ items: res });
                    obj.cb(obj);
                };
                if (this.service != "flickr") throw("Unknown service: " + this.service);
                var src = "http://api.flickr.com/services/feeds/photos_public.gne?";
                if      (this.type == "person") src += "id=";
                else if (this.type == "tag")    src += "tags=";
                else throw("Unknown type for service: " + this.type);
                src += this.param + "&lang=en-us&format=json";
                // log("req uri", src);
                $.getScript(src, function () {});
            }
            catch (e) { log("boom", e); }
        },
        abort:  function () {
            // log("send called with", data);
            if (!this.isMagic) return this.oldXHR.prototype.abort.apply(this.xhr, arguments);
            this.aborted = true;
        },
        getResponseHeader:      function (header) {
            // log("getResponseHeader called with", header);
            if (!this.isMagic) return this.oldXHR.prototype.getResponseHeader.apply(this.xhr, arguments);
            return "";
        },
        getAllResponseHeaders:  function () {
            // log("getAllResponseHeaders called");
            if (!this.isMagic) return this.oldXHR.prototype.getAllResponseHeaders.apply(this.xhr, arguments);
            return "";
        },
        setRequestHeader:       function (header, value) {
            // log("setRequestHeader called with", header, value);
            if (!this.isMagic) return this.oldXHR.prototype.setRequestHeader.apply(this.xhr, arguments);
            // noop
        },
        get status () {
            // log("status got");
            if (!this.isMagic) return this.xhr.status;
            return this._status;
        },
        get statusText () {
            // log("statusText got");
            if (!this.isMagic) return this.xhr.statusText;
            return this._statusText;
        },
        get responseText () {
            // log("responseText got");
            if (!this.isMagic) return this.xhr.responseText;
            return this._responseText;
        },
        get responseXML () {
            // log("responseXML got");
            if (!this.isMagic) return this.xhr.responseXML;
            return null;
        },
        get readyState () {
            // log("readyState got");
            if (!this.isMagic) return this.xhr.readyState;
            return this._readyState ? this._readyState : 1;
        },
        get onreadystatechange () {
            // log("onreadystatechange got");
            if (!this.isMagic) return this.xhr.onreadystatechange;
            return this.cb;
        },
        set onreadystatechange (cb) {
            // log("onreadystatechange set to ", cb);
            if (!this.isMagic) return this.xhr.onreadystatechange = cb;
            return this.cb = cb;
        },
    };
    GLOBAL.XMLHttpRequest = XHR;
    
    // XXX create the Infauxbox!
})(this);


--- NEW FILE: test.txt ---
Hi! I'm the result of a perfectly normal XHR request.

Received on Thursday, 11 February 2010 15:03:21 UTC