Initial dev repository
[kcls-web.git] / js / ui / default / booking / capture.js
diff --git a/js/ui/default/booking/capture.js b/js/ui/default/booking/capture.js
new file mode 100644 (file)
index 0000000..5aa0ffa
--- /dev/null
@@ -0,0 +1,239 @@
+dojo.require("openils.User");
+dojo.require("openils.widget.OrgUnitFilteringSelect");
+dojo.requireLocalization("openils.booking", "capture");
+
+const CAPTURE_FAILURE = 0;
+const CAPTURE_SUCCESS = 1;
+const CAPTURE_UNKNOWN = 2;
+
+var localeStrings = dojo.i18n.getLocalization("openils.booking", "capture");
+
+function CaptureDisplay(control_holder, data_holder) {
+    this.control_holder = control_holder;
+    this.data_holder = data_holder;
+}
+CaptureDisplay.prototype.no_payload = function() {
+    this.data_holder.appendChild(
+        document.createTextNode(localeStrings.NO_PAYLOAD)
+    );
+};
+CaptureDisplay.prototype.dump = function(payload) {
+    var div = document.createElement("div");
+    div.appendChild(document.createTextNode(localeStrings.HERES_WHAT_WE_KNOW));
+    this.data_holder.appendChild(div);
+
+    var ul = document.createElement("ul");
+    for (var k in payload) {
+        var li = document.createElement("li");
+        li.appendChild(document.createTextNode(k + ": " + payload[k]));
+        ul.appendChild(li);
+    }
+    this.data_holder.appendChild(ul);
+};
+CaptureDisplay.prototype._generate_barcode_line = function(payload) {
+    var div = document.createElement("div");
+    div.appendChild(document.createTextNode(
+        localeStrings.BARCODE + ": " + payload.resource.barcode()
+    ));
+    return div;
+};
+CaptureDisplay.prototype._generate_title_line = function(payload) {
+    var div = document.createElement("div");
+    div.appendChild(document.createTextNode(
+        localeStrings.TITLE + ": " +
+        (payload.mvr ? payload.mvr.title() : payload.type.name())
+    ));
+    return div;
+};
+CaptureDisplay.prototype._generate_author_line = function(payload) {
+    var div = document.createElement("div");
+    if (payload.mvr) {
+        div.appendChild(document.createTextNode(
+            localeStrings.AUTHOR + ": " + payload.mvr.author()
+        ));
+    }
+    return div;
+};
+CaptureDisplay.prototype._generate_transit_notice = function(payload) {
+    var div = document.createElement("div");
+    if (payload.transit) {
+        div.setAttribute("class", "transit_notice");
+        div.appendChild(document.createTextNode(localeStrings.TRANSIT));
+    }
+    return div;
+};
+CaptureDisplay.prototype._generate_route_line = function(payload) {
+    var div = document.createElement("div");
+    var strong = document.createElement("strong");
+    strong.appendChild(document.createTextNode(
+        (payload.transit ?
+            fieldmapper.aou.findOrgUnit(payload.transit.dest()).shortname() :
+            localeStrings.RESERVATION_SHELF) + ":"
+    ));
+    div.appendChild(document.createTextNode(
+        localeStrings.NEEDS_ROUTED_TO + " "
+    ));
+    div.appendChild(strong);
+    return div;
+};
+CaptureDisplay.prototype._generate_patron_info = function(payload) {
+    var p = document.createElement("p");
+    p.innerHTML = "<strong>" + localeStrings.RESERVED + "</strong> " +
+        formal_name(payload.reservation.usr()) + "<br />" +
+        localeStrings.BARCODE + ": " +
+        payload.reservation.usr().card().barcode();
+    return p;
+};
+CaptureDisplay.prototype._generate_resv_info = function(payload) {
+    var p = document.createElement("p");
+    p.innerHTML = localeStrings.REQUEST + ": " +
+        humanize_timestamp_string(payload.reservation.request_time()) +
+        "<br />" + 
+        localeStrings.DURATION + ": " +
+        humanize_timestamp_string(payload.reservation.start_time()) +
+        " - " + 
+        humanize_timestamp_string(payload.reservation.end_time());
+    return p;
+};
+CaptureDisplay.prototype._generate_meta_info = function(result) {
+    var p = document.createElement("p");
+    p.innerHTML = localeStrings.SLIP_DATE + ": " + result.servertime +
+        "<br />" + localeStrings.PRINTED_BY + " " +
+        formal_name(openils.User.user) + " " + localeStrings.AT + " " +
+        fieldmapper.aou.findOrgUnit(openils.User.user.ws_ou()).shortname()
+    return p;
+};
+CaptureDisplay.prototype.display_with_transit_info = function(result) {
+    var div = document.createElement("div");
+    var span = document.createElement("span");
+    span.appendChild(document.createTextNode(localeStrings.CAPTURE_INFO));
+    span.setAttribute("class", "capture_info");
+    this.control_holder.appendChild(span);
+
+    var button = document.createElement("button");
+    button.setAttribute("class", "print_slip");
+    button.setAttribute("type", "button");
+    button.setAttribute("accesskey", localeStrings.PRINT_ACCESSKEY);
+    button.innerHTML = localeStrings.PRINT;
+    button.onclick = function() {
+        try { dojo.byId("printing_iframe").contentWindow.print(); }
+        catch (E) { alert(E); } /* XXX */
+        return false;
+    };
+    this.control_holder.appendChild(button);
+
+    div.appendChild(this._generate_transit_notice(result.payload));
+
+    var p = document.createElement("p");
+    p.appendChild(this._generate_route_line(result.payload));
+    p.appendChild(this._generate_barcode_line(result.payload));
+    p.appendChild(this._generate_title_line(result.payload));
+    p.appendChild(this._generate_author_line(result.payload));
+    div.appendChild(p);
+
+    div.appendChild(this._generate_patron_info(result.payload));
+    div.appendChild(this._generate_resv_info(result.payload));
+    div.appendChild(this._generate_meta_info(result));
+
+    this._create_iframe(div);
+};
+CaptureDisplay.prototype._create_iframe = function(contents) {
+    var iframe = document.createElement("iframe");
+    iframe.setAttribute("name", "printing_iframe");
+    iframe.setAttribute("id", "printing_iframe");
+    iframe.setAttribute("src", "");
+    iframe.setAttribute("width", "100%");
+    iframe.setAttribute("height", "400"); /* hardcode 400px? really? */
+
+    this.data_holder.appendChild(iframe);
+
+    var w = dojo.byId("printing_iframe").contentWindow;
+    w.document.open();
+    w.document.write(
+        "<html><head><link rel='stylesheet' type='text/css' href='" +
+        dojo.byId("booking_stylesheet_link").href +
+        "' /><body></body></html>"
+    );
+    w.document.close();
+    w.document.body.appendChild(contents);
+    /* FIXME if (determine_autoprint_setting_somehow()) w.print(); */
+};
+CaptureDisplay.prototype.clear = function() {
+    this.control_holder.innerHTML = "";
+    this.data_holder.innerHTML = "";
+};
+CaptureDisplay.prototype.load = function(result) {
+    try {
+        this.control_holder.appendChild(document.createElement("hr"));
+        if (!result.payload) {
+            this.no_payload();
+        } else if (!result.payload.fail_cause && result.payload.captured) {
+            this.display_with_transit_info(result);
+        } else {
+            this.dump(result.payload);
+        }
+    } catch (E) {
+        alert(E); /* XXX */
+    }
+};
+
+var capture_display;
+var last_result;
+
+function clear_for_next() {
+    if (last_result == CAPTURE_SUCCESS) {
+        last_result = undefined;
+        document.getElementById("result_display").innerHTML = "";
+        document.getElementById("resource_barcode").value = "";
+    }
+}
+
+function capture() {
+    var barcode = document.getElementById("resource_barcode").value;
+    var result = fieldmapper.standardRequest(
+        [
+            "open-ils.booking",
+            "open-ils.booking.resources.capture_for_reservation"
+        ],
+        [xulG.auth.session.key, barcode]
+    );
+
+    if (result && result.ilsevent !== undefined) {
+        if (result.payload && result.payload.captured > 0) {
+            capture_display.load(result);
+            return CAPTURE_SUCCESS;
+        } else {
+            capture_display.load(result);
+            alert(my_ils_error(localeStrings.CAPTURED_NOTHING, result));
+            return CAPTURE_FAILURE;
+        }
+    } else {
+        return CAPTURE_UNKNOWN;
+    }
+}
+
+function attempt_capture() {
+    var rd = document.getElementById("result_display");
+    capture_display.clear();
+    switch(last_result = capture()) {
+        case CAPTURE_FAILURE:
+            rd.setAttribute("class", "capture_failure");
+            rd.innerHTML = localeStrings.FAILURE;
+            break;
+        case CAPTURE_SUCCESS:
+            rd.setAttribute("class", "capture_success");
+            rd.innerHTML = localeStrings.SUCCESS;
+            break;
+        default:
+            alert(localeStrings.UNKNOWN_PROBLEM);
+            break;
+    }
+}
+
+function my_init() {
+    init_auto_l10n(dojo.byId("auto_l10n_start_here"));
+    capture_display = new CaptureDisplay(
+        dojo.byId("capture_info_top"),
+        dojo.byId("capture_info_bottom")
+    );
+}