// Park everything in a function to avoid poluting the global namespace
(function(host) {

// Mock the console if it isn't defined
if (typeof(console) == 'undefined') {
    console = { log: function() {} }
}

// Simple bind utility
var bind = function( object, method ){
    return function(){
        return method.apply(object,arguments);
    };
}

// Handle ajax interaction
// Some code taken from prototype.js (http://www.prototypejs.org/)
var Ajax = {
    Request: function(url, opts) {
        this.getTransport = function(){
            try{ return new XMLHttpRequest()}                   catch(e){};
            try{ return new ActiveXObject('Msxml2.XMLHTTP')}    catch(e){};
            try{ return new ActiveXObject('Microsoft.XMLHTTP')} catch(e){};
            alert("XMLHttpRequest not supported");
        };

        this.opts = opts;
        this.transport = this.getTransport();

        this.timeout = setTimeout( bind( this, function(){
                this.transport.abort();
            } ), this.opts.wait );

        this.transport.open( 'get', url, true );
        this.transport.onreadystatechange =
            bind( this, function(){
                if( this.transport.readyState != 4 ) { return }
                clearTimeout( this.timeout );
                if( this.transport.status != 200 ){
                    this.opts.onFailure && this.opts.onFailure( this.transport );
                } else {
                    this.opts.onSuccess && this.opts.onSuccess( this.transport );
                }
            } );
        this.transport.send(null);
    }
};

// Primary routine to check for changes to source files and reload
// the page if there is a change
var check =  function(wait){
    var start = +"{{now}}";
    new Ajax.Request( host, {
        wait: wait,
        onSuccess: function(transport) {

            // Server will return json as the body 
            // Changed is the only currently supported entity
            try { 
                var json = JSON && JSON.parse(transport.responseText)
                         || eval('('+transport.responseText+')');

                if( json.changed > start ){
                    location.reload(true);   // never returns
                }
            } catch(e) { }

            // If we got here, either their was an exception in the try
            // or the json.changed <= start
            // Either way, queue another check
            setTimeout( function(){ check(wait) }, 1500 );

        },
        onFailure: function(transport) {
            setTimeout( function(){ check(wait) }, 1500 );
        }
      });

};

// Prevent multiple connections
window['-plackAutoRefresh-'] ||
    (window['-plackAutoRefresh-'] = 1) && check(+"{{wait}}");

})("{{url}}/{{uid}}/{{now}}")

// vim: ts=4 sw=4 expandtab: