<NME> stats.js
<BEF> ADDFILE
<MSG> *Stats* extension ported to jquery/bootstrap.

see #204

<DFF> @@ -0,0 +1,114 @@
+var Stats = function(options) {
+    this.initialize(options);
+};
+
+Stats.prototype = {
+    constructor: Stats,
+
+    defaults: {
+        deflocation: "graphs/?view=global"
+    },
+
+    initialize: function(options) {
+        this.options = $.extend({}, this.defaults, options);
+        this.options.defcallback = $.proxy(this.graphs_cb, this);
+
+        var navobj = new History(this.options);
+        this.navobj = navobj;
+
+        if (navobj.params.view != undefined) {
+            $("#searchquery").attr("value", navobj.params.view);
+        }
+        $("#searchquery").focus(function() {
+            $(this).attr("value", "");
+        }).blur(function() {
+            var $this = $(this);
+            if ($this.attr("value") == "") {
+                if (navobj.params["view"] == "global") {
+                    $this.attr("value", gettext("Search a domain"));
+                } else {
+                    $this.attr("value", navobj.params.view);
+                }
+            }
+        });
+        if (navobj.params.period) {
+            $("input[value=" + navobj.params.period + "]").attr("checked", "checked");
+            if (navobj.params.period != "custom") {
+                $("#custom-period").hide();
+            }
+        } else {
+            $("#custom-period").hide();
+        }
+        if (navobj.params.start) {
+            $("#id_from").attr("value", navobj.params.start);
+        }
+        if (navobj.params.end) {
+            $("#id_to").attr("value", navobj.params.end);
+        }
+        $("#custom-period input").datepicker({
+            format: 'yyyy-mm-dd'
+        });
+
+        this.register_nav_callbacks();
+        this.listen();
+    },
+
+    listen: function() {
+        $("#searchform").on("keypress", $.proxy(this.search_domain, this));
+        $(document).on("change", "input[name=period]",
+            $.proxy(this.change_period, this));
+        $("#customsend").on("click", $.proxy(this.customgraphs, this));
+    },
+
+    register_nav_callbacks: function() {
+        this.navobj.register_callback("graphs",
+            $.proxy(this.graphs_cb, this));
+    },
+
+    change_period: function(e) {
+        var $input = $(e.target);
+
+        if ($input.attr("value") == "custom") {
+            $("#custom-period").show();
+        } else {
+            $("#custom-period").hide();
+            this.navobj.delparam("start").delparam("end");
+            this.navobj.setparam("period", $input.attr("value")).update();
+        }
+    },
+
+    graphs_cb: function(data) {
+        if (data.status == "ko") {
+            $("body").notify("error", data.respmsg);
+            return;
+        }
+        $("#graphs").html(data.content);
+    },
+
+    search_domain: function(e) {
+        var $input = $(e.target);
+
+        switch (e.which) {
+        case 13:
+            e.preventDefault();
+            var domain = ($input.attr("value") == "") ? "global" : $input.attr("value");
+            this.navobj.setparam("view", domain).update();
+            break;
+        }
+    },
+
+    customgraphs: function(e) {
+        e.preventDefault();
+        var $fromdate = $("#id_from");
+        var $todate = $("#id_to");
+
+        if ($fromdate.attr("value") == "" || $todate.attr("value") == "") {
+            return;
+        }
+        this.navobj.setparams({
+            period: "custom",
+            start: $fromdate.attr("value"),
+            end: $todate.attr("value")
+        }).update();
+    }
+};

*Stats* extension ported to jquery/bootstrap.