/*
 * Access counter using Ajax withl a php backend.
 * Author: Gaspar Sinai 2009-02-02, Tokyo.
 */

var COUNTER_TIMEOUT = 10000;

function counter_new_htttp( ) { 
    if (typeof XMLHttpRequest != 'undefined') { 
        return new XMLHttpRequest();
    }
    try {
        return new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
        return new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {}
    }
    return null;
}

/*
 * Process http reply asynchroously.
 * The reply is something like: 
 *  <counter>
 *   <item id="MyPage1" count="133" />
 *  </counter>
 */
function counter_reply (http, timer) {
    if (http.readyState != 4 && http.readyState != "complete") {
        return;
    }
    var xml_doc=http.responseXML;
    if (xml_doc == null) {
        //alert ("Error:" + http.responseText);
        return;
    }
    clearTimeout (timer);
    var counter = xml_doc.getElementsByTagName("counter");
    if (counter == null || counter.length == 0) {
        //alert ("Error (counter):" + http.responseText);
        return;
    }
    var items = xml_doc.getElementsByTagName("item");
    if (items == null) {
        //alert ("Error (item):" + http.responseText);
        return;
    }
    for (var i=0; i<items.length; i++) {
        var id = items[i].getAttribute ("id");
        var count = items[i].getAttribute ("count");
        var element = document.getElementById(id);
        if (element == null) {
            // alert ("Can not find element by id=" + id);
            continue;
        }
        // Overwrite our text.
        element.firstChild.nodeValue = "" + count;
    }
    var error = xml_doc.getElementsByTagName("error");
    if (error != null && error.length != 0) {
        var err_str = error[0].childNodes[0].nodeValue;
        // Show only one error.
        //alert (err_str);
    }
}

var counter_delayed_requests_id = new Array ();
var counter_delayed_requests_flags = new Array ();


/*
 * Handle timeout
 */
function counter_timeout (http) {
    for (var i=0; i<counter_delayed_requests_id.length; i++) {
        var id = counter_delayed_requests_id[i];
        var element = document.getElementById(id);
        if (element == null) {
            // alert ("Can not find element by id=" + id);
            continue; 
        }
        element.firstChild.nodeValue = "?";
    }
}


/*
 *  Send a request after page is loaded to show access times in our html page.
 *  id is the page identifier and it is also the id of the
 *    node where text element of count will be inserted in out page.
 *  flags is 1 if you want to increment the counter.
 *  usage
     <script type="text/javascript">
      <!-- Begin
        counter_accesss ("MainID", 1);
        counter_accesss ("PageID1", 0);
        counter_accesss ("PageID2", 0);
      // End -->
    </script>

 */   
function counter_accesss (id, flags) {
   counter_delayed_requests_id [counter_delayed_requests_id.length] = id;
   counter_delayed_requests_flags [counter_delayed_requests_flags.length] 
        = flags;
}

var counter_old_handler = null;
/**
 * Send the requests now.
 */
function counter_send_delayed_requests () {

    if (counter_old_handler != null) counter_old_handler();

    var query = "counter.php?";
    for (var i=0; i<counter_delayed_requests_id.length; i++) {
        var cid = counter_delayed_requests_id[i];
        var cflags = counter_delayed_requests_flags[i];
        if (i>0) query = query + "&";
        query = query + "id" + i + "=" + cid 
           + "&flags" + i + "=" + cflags;
    }
    var http = counter_new_htttp ();
    if (http == null) return;
    var timer = setTimeout (function  () { counter_timeout (http); },
        COUNTER_TIMEOUT);
    http.onreadystatechange = function () { counter_reply (http, timer); };
    http.open("GET", query, true);
    http.send(null);
}
counter_old_handler = window.onload;
window.onload = counter_send_delayed_requests;

