--- /dev/null
+.mkwsLang, .mkws-lang,
+.mkwsSwitch, .mkws-switch,
+.mkwsSearch, .mkws-search,
+.mkwsTermlists, .mkws-facets,
+.mkwsFacet, .mkws-facet,
+.mkwsRanking, .mkws-ranking,
+.mkwsPager, .mkws-pager,
+.mkwsNavi, .mkws-navi,
+.mkwsRecords, .mkws-records,
+.mkwsRecord, .mkws-record,
+.mkwsTargets, .mkws-targets,
+.mkwsStat, .mkws-stat,
+.mkwsMOTD, .mkws-motd,
+.mkwsAuthname, .mkws-auth-name {
+ font-family: Gill Sans, "Gillius ADF", Gillius, GilliusADF, Verdana, Sans-Serif;
+}
+
+.mkwsLang, .mkws-lang {
+ float: left;
+ padding-left: 1em;
+ padding-top: 0.4em;
+}
+
+.mkwsLang a, .mkws-lang a {
+ background: #d0e0ff;
+ padding: 1px 4px;
+}
+
+.mkwsLang span, .mkws-lang span {
+ border: solid 1px #d0e0ff;
+ padding: 0px 3px;
+}
+
+.mkwsSearch, .mkws-search {
+ float: right;
+}
+
+.mkwsSwitch, .mkws-switch {
+ float: right;
+ padding-left: 1em;
+ padding-top: 0.4em;
+}
+
+.mkwsTargets, .mkws-targets {
+ background-color: #fafafa;
+}
+
+.mkwsStat, .mkws-stat {
+ margin-top: 10px;
+ border-top: 1px solid #156a16;
+ padding-top: 5px;
+ font-size: small;
+}
+
+.mkwsStat:before, .mkws-stat:before {
+ content: "Status info";
+ font-weight: bold;
+}
+
+.mkwsSwitch a, .mkws-switch a,
+.mkwsLang a, .mkws-lang a,
+.mkwsFacet a, .mkws-facet a,
+.mkwsRanking a, .mkws-ranking a,
+.mkwsPager a, .mkws-pager a,
+.mkwsNavi a, .mkws-navi a,
+.mkwsRecords a, .mkws-records a,
+.mkwsRecord a, .mkws-record a {
+ color: #005701;
+ text-decoration: none;
+}
+
+.mkwsSwitch a:hover, .mkws-switch a:hover,
+.mkwsLang a:hover, .mkws-lang a:hover,
+.mkwsFacet a:hover, .mkws-facet a:hover,
+.mkwsPager a:hover, .mkws-pager a:hover,
+.mkwsRecords a:hover, .mkws-records a:hover,
+.mkwsRecord a:hover, .mkws-record a:hover {
+ text-decoration: underline;
+}
+
+.mkwsNavi a.mkwsRemovable:hover, .mkws-navi a.mkws-removable:hover {
+ text-decoration: line-through;
+}
+
+.mkwsSearch input.mkwsButton, .mkws-search input.mkws-button {
+ border: 3px outset #132194;
+ background-color: #132194;
+ padding: 2px;
+ width: 6em;
+ color: #FFFFFF;
+ font-weight: bold;
+ text-transform: uppercase;
+ font-size: 10px;
+ margin-left: 8px;
+ cursor: pointer;
+}
+
+.mkwsAuthname, .mkws-auth-name {
+ color: #132194;
+}
+
+.mkwsSearch input.mkwsQuery, .mkws-search input.mkws-query {
+ border: 2px inset #e0f0ff;
+ padding: 3px;
+ font-size: 12px;
+ background: #f0f8ff;
+ width: 30em;
+ max-width: 100%;
+}
+
+.mkwsTermlistsTitle, .mkws-facets-title {
+ font-size: large;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+
+.mkwsTermlists, .mkws-facets {
+ background: #d0e0ff;
+ padding: 0.7em;
+ font-size: small;
+ display: none;
+
+ border-top-right-radius: 10px;
+ -moz-border-top-right-radius: 10px;
+ -webkit-border-top-right-radius: 10px;
+}
+
+.mkwsTermlists.active, .mkws-facets.active {
+ display: block;
+}
+
+.mkwsFacet, .mkws-facet {
+ background: #e0f0ff;
+ padding: 0.7em;
+ margin-top: 0.7em;
+
+ border-top-right-radius: 10px;
+ -moz-border-top-right-radius: 10px;
+ -webkit-border-top-right-radius: 10px;
+}
+
+.mkwsTerm, .mkws-term {
+ clear: both;
+}
+
+.mkwsTerm span, .mkws-term span {
+ float: right;
+}
+
+.mkwsFacetTitle, .mkws-facet-title {
+ font-weight: bold;
+}
+
+.mkwsSummary, .mkws-summary {
+ padding: 5px;
+}
+
+.mkwsDetails, .mkws-details {
+ border: 1px solid #404040;
+ background: #e8e8e8;
+ color: black;
+ padding: 5px 10px;
+ margin: 10px 0px;
+ box-shadow: 10px 10px 5px #808080;
+
+ border-top-right-radius: 10px;
+ -moz-border-top-right-radius: 10px;
+ -webkit-border-top-right-radius: 10px;
+}
+
+.mkwsDetails th, .mkws-details th {
+ text-align: right;
+ vertical-align: top;
+ padding-right: 0.6em;
+}
+
+.mkwsDetails th:after, .mkws-details th:after {
+ content: ":";
+}
+
+.mkwsPager, .mkws-pager {
+ background: #e0e0e0;
+ padding: 0.3em;
+}
+
+.mkwsTargets table thead tr td, .mkws-targets table thead tr td {
+ background-color: #132194;
+ color: white;
+ font-weight: bold;
+ padding: 0.2em 0.5em;
+}
+
+.mkwsTargets table tbody tr:nth-child(odd), .mkws-targets table tbody tr:nth-child(odd) {
+ background-color: #e0f0ff;
+}
+
+.mkwsTargets table tbody tr:nth-child(even), .mkws-targets table tbody tr:nth-child(even) {
+ background-color: #d0e0ff;
+}
+
+.mkwsTargets table tbody tr td, .mkws-targets table tbody tr td {
+ padding: 0.2em 0.5em;
+}
+
+.mkwsCurrentPage, .mkws-current-page {
+ padding: 0.1em 0.5em;
+ background: #508751;
+ color: white;
+}
+
+.mkwsProgress, .mkws-progress {
+ border: 1px solid #c0c0c0;
+ float: left;
+ margin-left: 2em;
+ margin-top: 0.2em;
+ padding: 0 0.3em;
+}
+
+.mkwsProgress .mkwsDone, .mkws-progress .mkws-done { color: #005701 }
+.mkwsProgress .mkwsWaiting, .mkws-progress .mkws-waiting { color: #c0c0c0 }
+
+.mkwsResults table, .mkws-results table {
+ display: inline-table /* only for Firefox! */
+}
+
+.mkws-field-description, .mkws-field-date, .mkws-field-thumb {
+ display: none;
+}
+
+
--- /dev/null
+// Handlebars helpers
+
+Handlebars.registerHelper('mkws-json', function(obj) {
+ return mkws.$.toJSON(obj);
+});
+
+
+// This is intended to handle paragraphs from Wikipedia, hence the
+// rather hacky code to remove numbered references.
+//
+Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
+ var acc = [];
+
+ // For some reason, Handlebars provides the value
+ // {"hash":{},"data":{}} for parameters that are not provided. So we
+ // have to be prepared for actual numbers, explicitly undefined
+ // values and this dumb magic value.
+ if (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
+ nPara = obj.length;
+ }
+ if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
+ nSent = Infinity;
+ }
+
+ for (var i = 0; i < nPara; i++) {
+ // Remove numbered references such as "[1,3,4]" from text
+ var text = obj[i].replace(/\[[0-9,]+\]/g, '');
+ // Next line from http://stackoverflow.com/questions/18914629/split-string-into-sentences-in-javascript
+ var sentences = text.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|");
+ if (sentences.length > nSent)
+ sentences.length = nSent;
+
+ acc.push('<p>', sentences.join(' '), '</p>');
+ nSent -= sentences.length;
+ if (nSent == 0)
+ break;
+ }
+
+ return acc.join('');
+});
+
+
+Handlebars.registerHelper('mkws-translate', function(s) {
+ return mkws.M(s);
+});
+
+
+// We need {{mkws-attr '@name'}} because Handlebars can't parse {{@name}}
+Handlebars.registerHelper('mkws-attr', function(attrName) {
+ return this[attrName];
+});
+
+
+/*
+ * Use as follows: {{#mkws-if-any NAME1 having="NAME2"}}
+ * Applicable when NAME1 is the name of an array
+ * The guarded code runs only if at least one element of the NAME1
+ * array has a subelement called NAME2.
+ */
+Handlebars.registerHelper('mkws-if-any', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(this);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-first', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(item);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-commaList', function(items, options) {
+ var out = "";
+
+ for (var i in items) {
+ if (i > 0) out += ", ";
+ out += options.fn(items[i])
+ }
+
+ return out;
+});
+
+
+Handlebars.registerHelper('mkws-index1', function(obj) {
+ return obj.data.index + 1;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+ var out = "";
+ for (var i = 0; i < count; i++) {
+ out += options.fn(this);
+ }
+ return out;
+});
+/*! MKWS, the MasterKey Widget Set.
+ * Copyright (C) 2013-2014 Index Data
+ * See the file LICENSE for details
+ */
+
+"use strict"; // HTML5: disable for log_level >= 2
+
+
+// Set up global mkws object. Contains truly global state such as SP
+// authentication, and a hash of team objects, indexed by team-name.
+//
+// We set it as a property of window to make the global explicit as
+// some things complain about an implicit global.
+window.mkws = {
+ $: $, // Our own local copy of the jQuery object
+ authenticated: false,
+ authenticating: false,
+ active: false,
+ log_level: 1, // Will be overridden from mkws.config, but
+ // initial value allows jQuery popup to use logging.
+ teams: {},
+ widgetType2function: {},
+ defaultTemplates: {},
+
+ locale_lang: {
+ "de": {
+ "Authors": "Autoren",
+ "Subjects": "Schlagwörter",
+ "Sources": "Daten und Quellen",
+ "source": "datenquelle",
+ "Facets": "Termlisten",
+ "Next": "Weiter",
+ "Prev": "Zurück",
+ "Search": "Suche",
+ "Sort by": "Sortieren nach",
+ "and show": "und zeige",
+ "per page": "pro Seite",
+ "Displaying": "Zeige",
+ "to": "von",
+ "of": "aus",
+ "found": "gefunden",
+ "Title": "Titel",
+ "Author": "Autor",
+ "author": "autor",
+ "Date": "Datum",
+ "Subject": "Schlagwort",
+ "subject": "schlagwort",
+ "Location": "Ort",
+ "Records": "Datensätze",
+ "Targets": "Datenbanken",
+
+ "dummy": "dummy"
+ },
+
+ "da": {
+ "Authors": "Forfattere",
+ "Subjects": "Emner",
+ "Sources": "Kilder",
+ "source": "kilder",
+ "Facets": "Termlists",
+ "Next": "Næste",
+ "Prev": "Forrige",
+ "Search": "Søg",
+ "Sort by": "Sorter efter",
+ "and show": "og vis",
+ "per page": "per side",
+ "Displaying": "Viser",
+ "to": "til",
+ "of": "ud af",
+ "found": "fandt",
+ "Title": "Title",
+ "Author": "Forfatter",
+ "author": "forfatter",
+ "Date": "Dato",
+ "Subject": "Emneord",
+ "subject": "emneord",
+ "Location": "Lokation",
+ "Records": "Poster",
+ "Targets": "Baser",
+
+ "dummy": "dummy"
+ }
+ }
+};
+
+// We may be using a separate copy
+if (typeof(mkws_jQuery) !== "undefined") {
+ mkws.$ = mkws_jQuery;
+} else {
+ mkws.$ = jQuery;
+}
+
+mkws.log = function(string) {
+ if (!mkws.log_level)
+ return;
+
+ if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */
+ return;
+ }
+
+ // you need to disable use strict at the top of the file!!!
+ if (mkws.log_level >= 3) {
+ // Works in Chrome; not sure about elsewhere
+ console.trace();
+ } else if (mkws.log_level >= 2) {
+ console.log(">>> called from function " + arguments.callee.caller.name + ' <<<');
+ }
+ console.log(string);
+};
+
+
+// Translation function.
+mkws.M = function(word) {
+ var lang = mkws.config.lang;
+
+ if (!lang || !mkws.locale_lang[lang])
+ return word;
+
+ return mkws.locale_lang[lang][word] || word;
+};
+
+
+// This function is taken from a StackOverflow answer
+// http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript/901144#901144
+mkws.getParameterByName = function(name, url) {
+ if (!url) url = location.search;
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+ results = regex.exec(url);
+ return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+}
+
+
+mkws.registerWidgetType = function(name, fn) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerWidgetType old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ mkws.widgetType2function[name] = fn;
+ mkws.log("registered widget-type '" + name + "'");
+};
+
+mkws.promotionFunction = function(name) {
+ return mkws.widgetType2function[name];
+};
+
+
+mkws.setMkwsConfig = function(overrides) {
+ // Set global log_level flag early so that mkws.log() works
+ var tmp = overrides.log_level;
+ if (typeof(tmp) !== 'undefined') mkws.log_level = tmp;
+
+ var config_default = {
+ use_service_proxy: true,
+ pazpar2_url: undefined,
+ pp2_hostname: "sp-mkws.indexdata.com",
+ pp2_path: "service-proxy/",
+ service_proxy_auth: undefined,
+ sp_auth_path: undefined,
+ sp_auth_query: "command=auth&action=perconfig",
+ sp_auth_credentials: undefined,
+ lang: "",
+ sort_options: [["relevance"], ["title:1", "title"], ["date:0", "newest"], ["date:1", "oldest"]],
+ perpage_options: [10, 20, 30, 50],
+ sort_default: "relevance",
+ perpage_default: 20,
+ show_lang: true, /* show/hide language menu */
+ show_sort: true, /* show/hide sort menu */
+ show_perpage: true, /* show/hide perpage menu */
+ show_switch: true, /* show/hide switch menu */
+ lang_options: [], /* display languages links for given languages, [] for all */
+ facets: ["xtargets", "subject", "author"], /* display facets, in this order, [] for none */
+ responsive_design_width: undefined, /* a page with less pixel width considered as narrow */
+ log_level: 1, /* log level for development: 0..2 */
+ template_vars: {}, /* values that may be exposed to templates */
+
+ dummy: "dummy"
+ };
+
+ mkws.config = mkws.objectInheritingFrom(config_default);
+ for (var k in overrides) {
+ mkws.config[k] = overrides[k];
+ }
+};
+
+
+// This code is from Douglas Crockford's article "Prototypal Inheritance in JavaScript"
+// http://javascript.crockford.com/prototypal.html
+// mkws.objectInheritingFrom behaves the same as Object.create,
+// but since the latter is not available in IE8 we can't use it.
+//
+mkws.objectInheritingFrom = function(o) {
+ function F() {}
+ F.prototype = o;
+ return new F();
+}
+
+
+// The following functions are dispatchers for team methods that
+// are called from the UI using a team-name rather than implicit
+// context.
+mkws.switchView = function(tname, view) {
+ mkws.teams[tname].switchView(view);
+};
+
+mkws.showDetails = function(tname, prefixRecId) {
+ mkws.teams[tname].showDetails(prefixRecId);
+};
+
+mkws.limitTarget = function(tname, id, name) {
+ mkws.teams[tname].limitTarget(id, name);
+};
+
+mkws.limitQuery = function(tname, field, value) {
+ mkws.teams[tname].limitQuery(field, value);
+};
+
+mkws.limitCategory = function(tname, id) {
+ mkws.teams[tname].limitCategory(id);
+};
+
+mkws.delimitTarget = function(tname, id) {
+ mkws.teams[tname].delimitTarget(id);
+};
+
+mkws.delimitQuery = function(tname, field, value) {
+ mkws.teams[tname].delimitQuery(field, value);
+};
+
+mkws.showPage = function(tname, pageNum) {
+ mkws.teams[tname].showPage(pageNum);
+};
+
+mkws.pagerPrev = function(tname) {
+ mkws.teams[tname].pagerPrev();
+};
+
+mkws.pagerNext = function(tname) {
+ mkws.teams[tname].pagerNext();
+};
+
+
+mkws.pazpar2_url = function() {
+ if (mkws.config.pazpar2_url) {
+ mkws.log("using pre-baked pazpar2_url '" + mkws.config.pazpar2_url + "'");
+ return mkws.config.pazpar2_url;
+ } else {
+ var s = document.location.protocol + "//" + mkws.config.pp2_hostname + "/" + mkws.config.pp2_path;
+ mkws.log("generated pazpar2_url '" + s + "'");
+ return s;
+ }
+};
+
+
+// We put a session token in window.name, as it's the only place to
+// keep data that is preserved across reloads and within-site
+// navigation. pz2.js picks this up and uses it as part of the
+// cookie-name, to ensure we get a new session when we need one.
+//
+// We want to use different sessions for different windows/tabs (so
+// they don't receive each other's messages), different hosts and
+// different paths on a host (since in general these will
+// authenticate as different libraries). So the window name needs to
+// include the hostname and the path from the URL, plus the token.
+//
+var token;
+if (window.name) {
+ token = window.name.replace(/.*\//, '');
+ mkws.log("Reusing existing window token '" + token + "'");
+} else {
+ // Incredible that the standard JavaScript runtime doesn't define a
+ // unique windowId. Instead, we have to make one up. And since there's
+ // no global area shared between windows, the best we can do for
+ // ensuring uniqueness is generating a random ID and crossing our
+ // fingers.
+ //
+ // Ten chars from 26 alpha-numerics = 36^10 = 3.65e15 combinations.
+ // At one per second, it will take 116 million years to duplicate a token
+ token = Math.random().toString(36).slice(2, 12);
+ mkws.log("Generated new window token '" + token + "'");
+}
+
+window.name = window.location.hostname + window.location.pathname + '/' + token;
+mkws.log("Using window.name '" + window.name + "'");
+
+
+// wrapper to provide local copy of the jQuery object.
+(function($) {
+ var log = mkws.log;
+ var _old2new = { // Maps old-style widget names to new-style
+ 'Authname': 'auth-name',
+ 'ConsoleBuilder': 'console-builder',
+ 'Coverart': 'cover-art',
+ 'GoogleImage': 'google-image',
+ 'MOTD': 'motd',
+ 'MOTDContainer': 'motd-container',
+ 'Perpage': 'per-page',
+ 'SearchForm': 'search-form',
+ 'ReferenceUniverse': 'reference-universe',
+ 'Termlists': 'facets'
+ };
+ // Annoyingly, there is no built-in way to invert a hash
+ var _new2old = {};
+ for (var key in _old2new) {
+ if(_old2new.hasOwnProperty(key)) {
+ _new2old[_old2new[key]] = key;
+ }
+ }
+
+ mkws._old2new = _old2new;
+
+ function handleNodeWithTeam(node, callback) {
+ // First branch for DOM objects; second branch for jQuery objects
+ var classes = node.className || node.attr('class');
+ if (!classes) {
+ // For some reason, if we try to proceed when classes is
+ // undefined, we don't get an error message, but this
+ // function and its callers, up several stack level,
+ // silently return. What a crock.
+ log("handleNodeWithTeam() called on node with no classes");
+ return;
+ }
+ var list = classes.split(/\s+/)
+ var teamName, type;
+
+ for (var i = 0; i < list.length; i++) {
+ var cname = list[i];
+ if (cname.match(/^mkws-team-/)) {
+ // New-style teamnames of the form mkws-team-xyz
+ teamName = cname.replace(/^mkws-team-/, '');
+ } else if (cname.match(/^mkwsTeam_/)) {
+ // Old-style teamnames of the form mkwsTeam_xyz
+ teamName = cname.replace(/^mkwsTeam_/, '');
+ } else if (cname.match(/^mkws-/)) {
+ // New-style names of the from mkws-foo-bar
+ type = cname.replace(/^mkws-/, '');
+ } else if (cname.match(/^mkws/)) {
+ // Old-style names of the form mkwsFooBar
+ var tmp = cname.replace(/^mkws/, '');
+ type = _old2new[tmp] || tmp.toLowerCase();
+ }
+ }
+
+ // Widgets without a team are on team "AUTO"
+ if (!teamName) {
+ teamName = "AUTO";
+ // Autosearch widgets don't join team AUTO if there is already an
+ // autosearch on the team or the team has otherwise gotten a query
+ if (node.getAttribute("autosearch")) {
+ if (mkws.autoHasAuto ||
+ mkws.teams["AUTO"] && mkws.teams["AUTO"].config["query"]) {
+ log("AUTO team already has a query, using unique team");
+ teamName = "UNIQUE";
+ }
+ mkws.autoHasAuto = true;
+ }
+ }
+
+ // Widgets on team "UNIQUE" get a random team
+ if (teamName === "UNIQUE") {
+ teamName = Math.floor(Math.random() * 100000000).toString();
+ }
+
+ callback.call(node, teamName, type);
+ }
+
+
+ function resizePage() {
+ var threshhold = mkws.config.responsive_design_width;
+ var width = $(window).width();
+ var from, to, method;
+
+ if ((mkws.width === undefined || mkws.width > threshhold) &&
+ width <= threshhold) {
+ from = "wide"; to = "narrow"; method = "hide";
+ } else if ((mkws.width === undefined || mkws.width <= threshhold) &&
+ width > threshhold) {
+ from = "narrow"; to = "wide"; method = "show";
+ }
+ mkws.width = width;
+
+ if (from) {
+ log("changing from " + from + " to " + to + ": " + width);
+ for (var tname in mkws.teams) {
+ var team = mkws.teams[tname];
+ team.visitWidgets(function(t, w) {
+ var w1 = team.widget(t + "-container-" + from);
+ var w2 = team.widget(t + "-container-" + to);
+ if (w1) {
+ w1.node.hide();
+ }
+ if (w2) {
+ w2.node.show();
+ w.node.appendTo(w2.node);
+ }
+ });
+ team.queue("resize-" + to).publish();
+ }
+ }
+ };
+
+
+ /*
+ * Run service-proxy authentication in background (after page load).
+ * The username/password is configured in the apache config file
+ * for the site.
+ */
+ function authenticateSession(auth_url, auth_domain, pp2_url) {
+ mkws.authenticating = true;
+ log("service proxy authentication on URL: " + auth_url);
+
+ if (!auth_domain) {
+ auth_domain = pp2_url.replace(/^(https?:)?\/\/(.*?)\/.*/, '$2');
+ log("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'");
+ }
+
+ var request = new pzHttpRequest(auth_url, function(err) {
+ alert("HTTP call for authentication failed: " + err)
+ return;
+ }, auth_domain);
+
+ request.get(null, function(data) {
+ mkws.authenticating = false;
+ if (!$.isXMLDoc(data)) {
+ alert("Service Proxy authentication response is not a valid XML document");
+ return;
+ }
+ var status = $(data).find("status");
+ if (status.text() != "OK") {
+ var message = $(data).find("message");
+ alert("Service Proxy authentication response: " + status.text() + " (" + message.text() + ")");
+ return;
+ }
+
+ log("service proxy authentication successful");
+ mkws.authenticated = true;
+ var authName = $(data).find("displayName").text();
+ // You'd think there would be a better way to do this:
+ var realm = $(data).find("realm:not(realmAttributes realm)").text();
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("authenticated").publish(authName, realm);
+ }
+
+ runAutoSearches();
+ });
+ }
+
+
+ function runAutoSearches() {
+ log("running auto searches");
+
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("ready").publish();
+ }
+ }
+
+
+ function selectorForAllWidgets() {
+ if (mkws.config && mkws.config.scan_all_nodes) {
+ // This is the old version, which works by telling jQuery to
+ // find every node that has a class beginning with "mkws". In
+ // theory it should be slower than the class-based selector; but
+ // instrumentation suprisingly shows this is consistently
+ // faster. It also has the advantage that any widgets of
+ // non-registered types are logged as warnings rather than
+ // silently ignored.
+ return '[class^="mkws"],[class*=" mkws"]';
+ } else {
+ // This is the new version, which works by looking up the
+ // specific classes of all registered widget types and their
+ // resize containers. Because all it requires jQuery to do is
+ // some hash lookups in pre-built tables, it should be very
+ // fast; but it silently ignores widgets of unregistered types.
+ var s = "";
+ for (var type in mkws.widgetType2function) {
+ if (s) s += ',';
+ s += '.mkws-' + type;
+ s += ',.mkws-' + type + "-container-wide";
+ s += ',.mkws-' + type + "-container-narrow";
+ // Annoyingly, we also need to recognise old-style names
+ var oldtype = _new2old[type] || type.charAt(0).toUpperCase() + type.slice(1);
+ s += ',.mkws' + oldtype;
+ s += ',.mkws' + oldtype + "-Container-wide";
+ s += ',.mkws' + oldtype + "-Container-narrow";
+ }
+ return s;
+ }
+ }
+
+
+ function makeWidgetsWithin(level, node) {
+ if (node) var widgetNodes = node.find(selectorForAllWidgets());
+ else widgetNodes = $(selectorForAllWidgets());
+ // Return false if we parse no widgets
+ if (widgetNodes.length < 1) return false;
+ widgetNodes.each(function() {
+ handleNodeWithTeam(this, function(tname, type) {
+ var myTeam = mkws.teams[tname];
+ if (!myTeam) {
+ myTeam = mkws.teams[tname] = mkws.makeTeam($, tname);
+ }
+
+ var oldHTML = this.innerHTML;
+ var myWidget = mkws.makeWidget($, myTeam, type, this);
+ myTeam.addWidget(myWidget);
+ var newHTML = this.innerHTML;
+ if (newHTML !== oldHTML) {
+ myTeam.log("widget " + type + " HTML changed: reparsing");
+ makeWidgetsWithin(level+1, $(this));
+ }
+ });
+ });
+ return true;
+ }
+
+
+ // The second "rootsel" parameter is passed to jQuery and is a DOM node
+ // or a selector string you would like to constrain the search for widgets to.
+ //
+ // This function has no side effects if run again on an operating session,
+ // even if the element/selector passed causes existing widgets to be reparsed:
+ //
+ // (TODO: that last bit isn't true and we currently have to avoid reinitialising
+ // widgets, MKWS-261)
+ //
+ // * configuration is not regenerated
+ // * authentication is not performed again
+ // * autosearches are not re-run
+ mkws.init = function(message, rootsel) {
+ var greet = "MKWS initialised";
+ if (rootsel) greet += " (limited to " + rootsel + ")"
+ if (message) greet += " :: " + message;
+ mkws.log(greet);
+
+ // MKWS is not active until init() has been run against an object with widget nodes.
+ // We only set initial configuration when MKWS is first activated.
+ if (!mkws.isActive) {
+ var widgetSelector = selectorForAllWidgets();
+ if ($(widgetSelector).length < 1) {
+ mkws.log("no widgets found");
+ return;
+ }
+
+ // Initial configuration
+ mkws.autoHasAuto = false;
+ var saved_config;
+ if (typeof mkws_config === 'undefined') {
+ log("setting empty config");
+ saved_config = {};
+ } else {
+ log("using config: " + $.toJSON(mkws_config));
+ saved_config = mkws_config;
+ }
+ mkws.setMkwsConfig(saved_config);
+
+ for (var key in mkws.config) {
+ if (mkws.config.hasOwnProperty(key)) {
+ if (key.match(/^language_/)) {
+ var lang = key.replace(/^language_/, "");
+ // Copy custom languages into list
+ mkws.locale_lang[lang] = mkws.config[key];
+ log("added locally configured language '" + lang + "'");
+ }
+ }
+ }
+
+ var lang = mkws.getParameterByName("lang") || mkws.config.lang;
+ if (!lang || !mkws.locale_lang[lang]) {
+ mkws.config.lang = ""
+ } else {
+ mkws.config.lang = lang;
+ }
+
+ log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
+
+ // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
+ if (mkws.pazpar2_url().match(/^\/\//)) {
+ mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
+ log("adjusted protocol independent link to " + mkws.pazpar2_url());
+ }
+
+ if (mkws.config.responsive_design_width) {
+ // Responsive web design - change layout on the fly based on
+ // current screen width. Required for mobile devices.
+ $(window).resize(resizePage);
+ // initial check after page load
+ $(document).ready(resizePage);
+ }
+ }
+
+ var then = $.now();
+ // If we've made no widgets, return without starting an SP session
+ // or marking MKWS active.
+ if (makeWidgetsWithin(1, rootsel ? $(rootsel) : undefined) === false) {
+ return false;
+ }
+ var now = $.now();
+
+ log("walking MKWS nodes took " + (now-then) + " ms");
+ for (var tName in mkws.teams) {
+ var myTeam = mkws.teams[tName]
+ myTeam.makePz2();
+ myTeam.log("made PZ2 object");
+ /*
+ myTeam.visitWidgets(function(t, w) {
+ log(" has widget of type '" + t + "': " + w);
+ });
+ */
+ }
+
+ function sp_auth_url(config) {
+ if (config.service_proxy_auth) {
+ mkws.log("using pre-baked sp_auth_url '" + config.service_proxy_auth + "'");
+ return config.service_proxy_auth;
+ } else {
+ var s = '//';
+ s += config.sp_auth_hostname ? config.sp_auth_hostname : config.pp2_hostname;
+ s += '/';
+ s += config.sp_auth_path ? config.sp_auth_path : config.pp2_path;
+ var q = config.sp_auth_query;
+ if (q) {
+ s += '?' + q;
+ }
+ var c = config.sp_auth_credentials;
+ if (c) {
+ s += ('&username=' + c.substr(0, c.indexOf('/')) +
+ '&password=' + c.substr(c.indexOf('/')+1));
+ }
+ mkws.log("generated sp_auth_url '" + s + "'");
+ return s;
+ }
+ }
+
+ if (mkws.config.use_service_proxy && !mkws.authenticated && !mkws.authenticating) {
+ authenticateSession(sp_auth_url(mkws.config),
+ mkws.config.service_proxy_auth_domain,
+ mkws.pazpar2_url());
+ } else if (!mkws.authenticating) {
+ // raw pp2 or we have a session already open
+ runAutoSearches();
+ }
+
+ mkws.isActive = true;
+ return true;
+ };
+
+ $(document).ready(function() {
+ if (!window.mkws_noready && !mkws.authenticating && !mkws.active) {
+ mkws.init();
+ }
+ });
+
+})(mkws.$);
+// Factory function for team objects. As much as possible, this uses
+// only member variables (prefixed "m_") and inner functions with
+// private scope.
+//
+// Some functions are visible as member-functions to be called from
+// outside code -- specifically, from generated HTML. These functions
+// are that.switchView(), showDetails(), limitTarget(), limitQuery(),
+// limitCategory(), delimitTarget(), delimitQuery(), showPage(),
+// pagerPrev(), pagerNext().
+//
+// Before the team can be used for searching and related operations,
+// its pz2 object must be created by calling team.makePz2().
+//
+mkws.makeTeam = function($, teamName) {
+ var that = {};
+ var m_teamName = teamName;
+ var m_submitted = false;
+ var m_query; // initially undefined
+ var m_sortOrder; // will be set below
+ var m_perpage; // will be set below
+ var m_filterSet = filterSet(that);
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_logTime = {
+ // Timestamps for logging
+ "start": $.now(),
+ "last": $.now()
+ };
+ var m_paz; // will be initialised below
+ var m_templateText = {}; // widgets can register templates to be compiled
+ var m_template = {}; // compiled templates, from any source
+ var m_widgets = {}; // Maps widget-type to array of widget objects
+ var m_gotRecords = false;
+
+ var config = mkws.objectInheritingFrom(mkws.config);
+ that.config = config;
+
+ that.toString = function() { return '[Team ' + teamName + ']'; };
+
+ // Accessor methods for individual widgets: readers
+ that.name = function() { return m_teamName; };
+ that.submitted = function() { return m_submitted; };
+ that.sortOrder = function() { return m_sortOrder; };
+ that.perpage = function() { return m_perpage; };
+ that.query = function() { return m_query; };
+ that.totalRecordCount = function() { return m_totalRecordCount; };
+ that.currentPage = function() { return m_currentPage; };
+ that.currentRecordId = function() { return m_currentRecordId; };
+ that.currentRecordData = function() { return m_currentRecordData; };
+ that.filters = function() { return m_filterSet; };
+ that.gotRecords = function() { return m_gotRecords; };
+
+ // Accessor methods for individual widgets: writers
+ that.set_sortOrder = function(val) { m_sortOrder = val };
+ that.set_perpage = function(val) { m_perpage = val };
+
+
+ // The following PubSub code is modified from the jQuery manual:
+ // http://api.jquery.com/jQuery.Callbacks/
+ //
+ // Use as:
+ // team.queue("eventName").subscribe(function(param1, param2 ...) { ... });
+ // team.queue("eventName").publish(arg1, arg2, ...);
+ //
+ var m_queues = {};
+ function queue(id) {
+ if (!m_queues[id]) {
+ var callbacks = $.Callbacks();
+ m_queues[id] = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ }
+ return m_queues[id];
+ };
+ that.queue = queue;
+
+
+ function log(s) {
+ var now = $.now();
+ var timestamp = (((now - m_logTime.start)/1000).toFixed(3) + " (+" +
+ ((now - m_logTime.last)/1000).toFixed(3) + ") ");
+ m_logTime.last = now;
+ mkws.log(m_teamName + ": " + timestamp + s);
+ that.queue("log").publish(m_teamName, timestamp, s);
+ }
+ that.log = log;
+
+
+ log("making new widget team");
+
+ m_sortOrder = config.sort_default;
+ m_perpage = config.perpage_default;
+
+ // pz2.js event handlers:
+ function onInit() {
+ log("init");
+ m_paz.stat();
+ m_paz.bytarget();
+ }
+
+ function onBytarget(data) {
+ log("bytarget");
+ queue("targets").publish(data);
+ }
+
+ function onStat(data) {
+ queue("stat").publish(data);
+ var hitcount = parseInt(data.hits[0], 10);
+ if (!m_gotRecords && hitcount > 0) {
+ m_gotRecords = true;
+ queue("firstrecords").publish(hitcount);
+ }
+ if (parseInt(data.activeclients[0], 10) === 0) {
+ log("complete");
+ queue("complete").publish(hitcount);
+ }
+ }
+
+ function onTerm(data) {
+ log("term");
+ queue("facets").publish(data);
+ }
+
+ function onShow(data, teamName) {
+ log("show");
+ m_totalRecordCount = data.merged;
+ log("found " + m_totalRecordCount + " records");
+ queue("pager").publish(data);
+ queue("records").publish(data);
+ }
+
+ function onRecord(data, args, teamName) {
+ log("record");
+ // FIXME: record is async!!
+ clearTimeout(m_paz.recordTimer);
+ queue("record").publish(data);
+ var detRecordDiv = findnode(recordDetailsId(data.recid[0]));
+ if (detRecordDiv.length) {
+ // in case on_show was faster to redraw element
+ return;
+ }
+ m_currentRecordData = data;
+ var recordDiv = findnode('.' + recordElementId(m_currentRecordData.recid[0]));
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
+ }
+
+
+ // create a parameters array and pass it to the pz2's constructor
+ // then register the form submit event with the pz2.search function
+ // autoInit is set to true on default
+ that.makePz2 = function() {
+ log("m_queues=" + $.toJSON(m_queues));
+ var params = {
+ "windowid": teamName,
+ "pazpar2path": mkws.pazpar2_url(),
+ "usesessions" : config.use_service_proxy ? false : true,
+ "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
+ "termlist": config.facets.join(',')
+ };
+
+ params.oninit = onInit;
+ if (m_queues.targets) {
+ params.onbytarget = onBytarget;
+ log("setting bytarget callback");
+ }
+ if (m_queues.stat) {
+ params.onstat = onStat;
+ log("setting stat callback");
+ }
+ if (m_queues.facets && config.facets.length) {
+ params.onterm = onTerm;
+ log("setting term callback");
+ }
+ if (m_queues.records) {
+ log("setting show callback");
+ params.onshow = onShow;
+ // Record callback is subscribed from records callback
+ log("setting record callback");
+ params.onrecord = onRecord;
+ }
+
+ m_paz = new pz2(params);
+ log("created main pz2 object");
+ }
+
+
+ // Used by the Records widget and onRecord()
+ function recordElementId(s) {
+ return 'mkws-rec_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+ that.recordElementId = recordElementId;
+
+ // Used by onRecord(), showDetails() and renderDetails()
+ function recordDetailsId(s) {
+ return 'mkws-det_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+
+
+ that.targetFiltered = function(id) {
+ return m_filterSet.targetFiltered(id);
+ };
+
+
+ that.limitTarget = function(id, name) {
+ log("limitTarget(id=" + id + ", name=" + name + ")");
+ m_filterSet.add(targetFilter(id, name));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitQuery = function(field, value) {
+ log("limitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.add(fieldFilter(field, value));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitCategory = function(id) {
+ log("limitCategory(id=" + id + ")");
+ // Only one category filter at a time
+ m_filterSet.removeMatching(function(f) { return f.type === 'category' });
+ if (id !== '') m_filterSet.add(categoryFilter(id));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitTarget = function(id) {
+ log("delimitTarget(id=" + id + ")");
+ m_filterSet.removeMatching(function(f) { return f.type === 'target' });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitQuery = function(field, value) {
+ log("delimitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.removeMatching(function(f) { return f.type == 'field' &&
+ field == f.field && value == f.value });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.showPage = function(pageNum) {
+ m_currentPage = pageNum;
+ m_paz.showPage(m_currentPage - 1);
+ };
+
+
+ that.pagerNext = function() {
+ if (m_totalRecordCount - m_perpage*m_currentPage > 0) {
+ m_paz.showNext();
+ m_currentPage++;
+ }
+ };
+
+
+ that.pagerPrev = function() {
+ if (m_paz.showPrev() != false)
+ m_currentPage--;
+ };
+
+
+ that.reShow = function() {
+ resetPage();
+ m_paz.show(0, m_perpage, m_sortOrder);
+ };
+
+
+ function resetPage() {
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
+ m_gotRecords = false;
+ }
+ that.resetPage = resetPage;
+
+
+ function newSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ log("newSearch: " + query);
+
+ if (config.use_service_proxy && !mkws.authenticated) {
+ alert("searching before authentication");
+ return;
+ }
+
+ m_filterSet.removeMatching(function(f) { return f.type !== 'category' });
+ triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery);
+ switchView('records'); // In case it's configured to start off as hidden
+ m_submitted = true;
+ }
+ that.newSearch = newSearch;
+
+
+ function triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ resetPage();
+ queue("navi").publish();
+
+ // Continue to use previous query/sort-order unless new ones are specified
+ if (query) m_query = query;
+ if (sortOrder) m_sortOrder = sortOrder;
+ if (perpage) m_perpage = perpage;
+ if (targets) m_filterSet.add(targetFilter(targets, targets));
+
+ var pp2filter = m_filterSet.pp2filter();
+ var pp2limit = m_filterSet.pp2limit(limit);
+ var pp2catLimit = m_filterSet.pp2catLimit();
+ if (pp2catLimit) {
+ pp2filter = pp2filter ? pp2filter + "," + pp2catLimit : pp2catLimit;
+ }
+
+ var params = {};
+ if (pp2limit) params.limit = pp2limit;
+ if (maxrecs) params.maxrecs = maxrecs;
+ if (torusquery) {
+ if (!mkws.config.use_service_proxy)
+ alert("can't narrow search by torusquery when not authenticated");
+ params.torusquery = torusquery;
+ }
+
+ log("triggerSearch(" + m_query + "): filters = " + m_filterSet.toJSON() + ", " +
+ "pp2filter = " + pp2filter + ", params = " + $.toJSON(params));
+
+ m_paz.search(m_query, m_perpage, m_sortOrder, pp2filter, undefined, params);
+ }
+
+ // fetch record details to be retrieved from the record queue
+ that.fetchDetails = function(recId) {
+ log("fetchDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // switching view between targets and records
+ function switchView(view) {
+ var targets = widgetNode('targets');
+ var results = widgetNode('results') || widgetNode('records');
+ var blanket = widgetNode('blanket');
+ var motd = widgetNode('motd');
+
+ switch(view) {
+ case 'targets':
+ if (targets) $(targets).show();
+ if (results) $(results).hide();
+ if (blanket) $(blanket).hide();
+ if (motd) $(motd).hide();
+ break;
+ case 'records':
+ if (targets) $(targets).hide();
+ if (results) $(results).show();
+ if (blanket) $(blanket).show();
+ if (motd) $(motd).hide();
+ break;
+ default:
+ alert("Unknown view '" + view + "'");
+ }
+ }
+ that.switchView = switchView;
+
+
+ // detailed record drawing
+ that.showDetails = function(recId) {
+ var oldRecordId = m_currentRecordId;
+ m_currentRecordId = recId;
+
+ // remove current detailed view if any
+ findnode('#' + recordDetailsId(oldRecordId)).remove();
+
+ // if the same clicked, just hide
+ if (recId == oldRecordId) {
+ m_currentRecordId = '';
+ m_currentRecordData = null;
+ return;
+ }
+ // request the record
+ log("showDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // Finds the node of the specified class within the current team
+ function findnode(selector, teamName) {
+ teamName = teamName || m_teamName;
+
+ if (teamName === 'AUTO') {
+ selector = (selector + '.mkws-team-' + teamName + ',' +
+ selector + ':not([class^="mkws-team"],[class*=" mkws-team"])');
+ } else {
+ selector = selector + '.mkws-team-' + teamName;
+ }
+
+ var node = $(selector);
+ //log('findnode(' + selector + ') found ' + node.length + ' nodes');
+ return node;
+ }
+
+
+ function widgetNode(type) {
+ var w = that.widget(type);
+ return w ? w.node : undefined;
+ }
+
+ function renderDetails(data, marker) {
+ var template = loadTemplate("details");
+ var details = template(data);
+ return '<div class="mkws-details mkwsDetails mkwsTeam_' + m_teamName + '" ' +
+ 'id="' + recordDetailsId(data.recid[0]) + '">' + details + '</div>';
+ }
+ that.renderDetails = renderDetails;
+
+
+ that.registerTemplate = function(name, text) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerTemplate old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+ m_templateText[name] = text;
+ };
+
+
+ function loadTemplate(name, fallbackString) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning loadTemplate: old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ var template = m_template[name];
+ if (template === undefined && Handlebars.compile) {
+ var source;
+ var node = $(".mkws-template-" + name + " .mkws-team-" + that.name());
+ if (node && node.length < 1) {
+ node = $(".mkws-template-" + name);
+ }
+ if (node) source = node.html();
+ if (!source) source = m_templateText[name];
+ if (source) {
+ template = Handlebars.compile(source);
+ log("compiled template '" + name + "'");
+ }
+ }
+ //if (template === undefined) template = mkws_templatesbyteam[m_teamName][name];
+ if (template === undefined && Handlebars.templates) {
+ template = Handlebars.templates["mkws-template-" + name];
+ }
+ if (template === undefined && mkws.defaultTemplates) {
+ template = mkws.defaultTemplates[name];
+ }
+ if (template) {
+ m_template[name] = template;
+ return template;
+ }
+ else {
+ log("No MKWS template for " + name);
+ return null;
+ }
+ }
+ that.loadTemplate = loadTemplate;
+
+
+ that.addWidget = function(w) {
+ if (m_widgets[w.type] === undefined) {
+ m_widgets[w.type] = [ w ];
+ } else {
+ m_widgets[w.type].push(w);
+ }
+ }
+
+ that.widget = function(type) {
+ var list = m_widgets[type];
+
+ if (!list)
+ return undefined;
+ if (list.length > 1) {
+ alert("widget('" + type + "') finds " + list.length + " widgets: using first");
+ }
+ return list[0];
+ }
+
+ that.visitWidgets = function(callback) {
+ for (var type in m_widgets) {
+ var list = m_widgets[type];
+ for (var i = 0; i < list.length; i++) {
+ var res = callback(type, list[i]);
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ }
+ return undefined;
+ }
+
+
+ return that;
+};
+// Factory function for sets of filters.
+function filterSet(team) {
+ var m_team = team;
+ var m_list = [];
+
+ var that = {};
+
+ that.toJSON = function() {
+ return mkws.$.toJSON(m_list);
+ };
+
+ that.add = function(filter) {
+ m_list.push(filter);
+ };
+
+ that.visitTargets = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'target') {
+ callback(filter.id, filter.name);
+ }
+ }
+ };
+
+ that.visitFields = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'field') {
+ callback(filter.field, filter.value);
+ }
+ }
+ };
+
+ that.visitCategories = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'category') {
+ callback(filter.id);
+ }
+ }
+ };
+
+ that.removeMatching = function(matchFn) {
+ var newList = [];
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (matchFn(filter)) {
+ m_team.log("removeMatching: removing filter " + mkws.$.toJSON(filter));
+ } else {
+ m_team.log("removeMatching: keeping filter " + mkws.$.toJSON(filter));
+ newList.push(filter);
+ }
+ }
+ m_list = newList;
+ };
+
+ that.targetFiltered = function(id) {
+ for (var i = 0; i < m_list.length; i++) {
+ if (m_list[i].type === 'target' ||
+ m_list[i].id === 'pz:id=' + id) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ that.pp2filter = function() {
+ var res = "";
+
+ that.visitTargets(function(id, name) {
+ if (res) res += ",";
+ if (id.match(/^[a-z:]+[=~]/)) {
+ m_team.log("filter '" + id + "' already begins with SETTING OP");
+ } else {
+ id = 'pz:id=' + id;
+ }
+ res += id;
+ });
+
+ return res;
+ };
+
+ that.pp2limit = function(initial) {
+ var res = initial || "";
+
+ that.visitFields(function(field, value) {
+ if (res) res += ",";
+ res += field + "=" + value.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ that.pp2catLimit = function() {
+ var res = "";
+
+ that.visitCategories(function(id) {
+ if (res) res += ",";
+ res += "category~" + id.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ return that;
+}
+
+
+// Factory functions for filters. These can be of several types.
+function targetFilter(id, name) {
+ return {
+ type: 'target',
+ id: id,
+ name: name
+ };
+}
+
+function fieldFilter(field, value) {
+ return {
+ type: 'field',
+ field: field,
+ value: value
+ };
+}
+
+function categoryFilter(id) {
+ return {
+ type: 'category',
+ id: id
+ };
+}
+// Factory function for widget objects.
+mkws.makeWidget = function($, team, type, node) {
+ // Static register of attributes that do not contribute to config
+ var ignoreAttrs = {
+ id:1, 'class':1, style:1, name:1, action:1, type:1, size:1,
+ value:1, width:1, valign:1
+ };
+
+ var that = {
+ team: team,
+ type: type,
+ node: $(node),
+ config: mkws.objectInheritingFrom(team.config)
+ };
+
+ function log(s) {
+ team.log(s);
+ }
+ that.log = log;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + type + ']';
+ };
+
+ that.value = function() {
+ return node.value;
+ };
+
+ // Returns the HTML of a subwidget of the specified type. It gets
+ // the same attributes at the parent widget that invokes this
+ // function, except where overrides are passed in. If defaults are
+ // also provided, then these are used when the parent widget
+ // provides no values.
+ that.subwidget = function(type, overrides, defaults) {
+ var attrs = { _team: team.name() };
+
+ // Copy locally-set properties from the parent widget
+ for (var name in this.config) {
+ if (this.config.hasOwnProperty(name)) {
+ attrs[name] = this.config[name];
+ log(this + " copied property " + name + "='" + attrs[name] + "' to " + type + " subwidget");
+ }
+ }
+
+ for (var name in overrides) {
+ log(this + " overrode property " + name + "='" + overrides[name] + "' (was '" + attrs[name] + "') for " + type + " subwidget");
+ attrs[name] = overrides[name];
+ }
+
+ if (defaults) {
+ for (var name in defaults) {
+ if (!attrs[name]) {
+ attrs[name] = defaults[name];
+ log(this + " fell back to default property " + name + "='" + attrs[name] + "' for " + type + " subwidget");
+ }
+ }
+ }
+
+ var s = [];
+ s.push('<div class="mkws', type, ' mkws-team-', attrs._team, '"');
+ for (var name in attrs) {
+ if (name !== '_team')
+ s.push(' ', name, '="', attrs[name], '"');
+ }
+ s.push('></div>');
+ return s.join('');
+ };
+
+ function expandValue(val) {
+ if (val.match(/^!param!/)) {
+ var param = val.replace(/^!param!/, '');
+ val = mkws.getParameterByName(param);
+ log("obtained val '" + val + "' from param '" + param + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + param + "' parameter");
+ }
+ } else if (val.match(/^!path!/)) {
+ var index = val.replace(/^!path!/, '');
+ var path = window.location.pathname.split('/');
+ val = path[path.length - index];
+ log("obtained val '" + val + "' from path-component '" + index + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the path-component " + index);
+ }
+ } else if (val.match(/^!var!/)) {
+ var name = val.replace(/^!var!/, '');
+ val = window[name]; // It's ridiculous that this works
+ log("obtained val '" + val + "' from variable '" + name + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + name + "' variable");
+ }
+ }
+ return val;
+ };
+
+ // Utility function for use by all widgets that can invoke autosearch.
+ that.autosearch = function() {
+ var that = this;
+ var query = this.config.autosearch;
+ if (query) {
+ var old = this.team.config.query;
+ if (!old) {
+ // Stash this for subsequent inspection
+ this.team.config.query = query;
+ } else if (old === query) {
+ this.log("duplicate autosearch: '" + query + "': ignoring");
+ return;
+ } else {
+ this.log("conflicting autosearch: '" + query + "' vs '" + old + "': ignoring");
+ return;
+ }
+
+ this.team.queue("ready").subscribe(function() {
+ // Postpone testing for the configuration items: these are not
+ // yet set for Record subclass widgets that fill them in in the
+ // subclass, as widget.autosearch is called in the superclass,
+ // before the subclass fiddles with the configuration.
+ var sortOrder = that.config.sort;
+ var maxrecs = that.config.maxrecs;
+ var perpage = that.config.perpage;
+ var limit = that.config.limit;
+ var targets = that.config.targets;
+ var targetfilter = that.config.targetfilter;
+ var target = that.config.target;
+ if (target) targetfilter = 'udb=="' + target + '"';
+
+ var s = "running auto search: '" + query + "'";
+ if (sortOrder) s += " sorted by '" + sortOrder + "'";
+ if (maxrecs) s += " restricted to " + maxrecs + " records";
+ if (perpage) s += " with " + perpage + " per page";
+ if (limit) s += " limited by '" + limit + "'";
+ if (targets) s += " in targets '" + targets + "'";
+ if (targetfilter) s += " constrained by targetfilter '" + targetfilter + "'";
+ that.log(s);
+
+ that.team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter);
+ });
+ }
+ };
+
+ // Utility function for all widgets that want to hide in narrow windows
+ that.hideWhenNarrow = function() {
+ var that = this;
+ this.team.queue("resize-narrow").subscribe(function(n) {
+ that.node.hide();
+ });
+ this.team.queue("resize-wide").subscribe(function(n) {
+ that.node.show();
+ });
+ };
+
+
+ for (var i = 0; i < node.attributes.length; i++) {
+ var a = node.attributes[i];
+ var val = expandValue(a.value);
+ if (a.name === 'data-mkws-config') {
+ // Treat as a JSON fragment configuring just this widget
+ log(node + ": parsing config fragment '" + val + "'");
+ var data;
+ try {
+ data = $.parseJSON(val);
+ for (var key in data) {
+ log(node + ": adding config element " + key + "='" + data[key] + "'");
+ that.config[key] = data[key];
+ }
+ } catch (err) {
+ alert("Can't parse " + node + " data-mkws-config as JSON: " + val);
+ }
+ } else if (a.name.match (/^data-mkws-/)) {
+ var name = a.name.replace(/^data-mkws-/, '')
+ that.config[name] = val;
+ log(that + ": set data-mkws attribute " + name + "='" + val + "'");
+ } else if (!ignoreAttrs[a.name]) {
+ that.config[a.name] = val;
+ log(that + ": set regular attribute " + a.name + "='" + val + "'");
+ }
+ }
+
+ var fn = mkws.promotionFunction(type);
+ if (fn) {
+ fn.call(that);
+ log("made " + type + " widget(node=" + node + ")");
+ } else if (type.match(/-Container-(narrow|wide)$/)) {
+ // Not really a widget: no need to log its lack of promotion
+ } else {
+ log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")");
+ }
+
+ return that;
+};
+(function($) { // jQuery wrapper
+
+// Functions follow for promoting the regular widget object into
+// widgets of specific types. These could be moved into their own
+// source files.
+
+
+mkws.registerWidgetType('targets', function() {
+ if (!this.config.show_switch) return;
+ var that = this;
+
+ this.node.html('No information available yet.');
+ this.node.css("display", "none");
+
+ this.team.queue("targets").subscribe(function(data) {
+ // There is a bug in pz2.js wherein it makes each data object an array but
+ // simply assigns properties to it.
+ // TODO: remove this when PAZ-946 is addressed.
+ var cleandata = [];
+ for (var i = 0; i < data.length; i++) {
+ var cur = {};
+ cur.id = data[i].id;
+ cur.hits = data[i].hits;
+ cur.diagnostic = data[i].diagnostic;
+ cur.message = data[i].message;
+ cur.records = data[i].records;
+ cur.state = data[i].state;
+ cleandata.push(cur);
+ }
+
+ var template = that.team.loadTemplate(that.config.template || "targets");
+ that.node.html(template({data: cleandata}));
+ });
+});
+
+
+mkws.registerWidgetType('stat', function() {
+ var that = this;
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "stat");
+ that.node.html(template(data));
+ });
+});
+
+
+mkws.registerWidgetType('pager', function() {
+ var that = this;
+ var M = mkws.M;
+
+ this.team.queue("pager").subscribe(function(data) {
+ var teamName = that.team.name();
+ var output = {};
+ output.first = data.start + 1;
+ output.last = data.start + data.num;
+ output.count = data.merged;
+ output.found = data.total;
+
+ //client indexes pages from 1 but pz2 from 0
+ var onsides = 5;
+ var pages = Math.ceil(that.team.totalRecordCount() / that.team.perpage());
+ var currentPage = that.team.currentPage();
+
+ var firstClkbl = (currentPage - onsides > 0)
+ ? currentPage - onsides
+ : 1;
+ var lastClkbl = firstClkbl + 2*onsides < pages
+ ? firstClkbl + 2*onsides
+ : pages;
+
+ if (firstClkbl > 1) output.morePrev = true;
+ if (lastClkbl < pages) output.moreNext = true;
+
+ if (currentPage > 1) output.prevClick = "mkws.pagerPrev(\'" + teamName + "\');";
+
+ output.pages = [];
+ for(var i = firstClkbl; i <= lastClkbl; i++) {
+ var o = {};
+ o.number = i;
+ if (i !== currentPage) {
+ o.click = "mkws.showPage(\'" + teamName + "\', " + i + ");";
+ }
+ output.pages.push(o);
+ }
+
+ if (pages - currentPage > 0) output.nextClick = "mkws.pagerNext(\'" + teamName + "\')";
+
+ var template = that.team.loadTemplate(that.config.template || "pager");
+ that.node.html(template(output));
+ });
+});
+
+mkws.registerWidgetType('details', function() {
+ var that = this;
+ var recid = that.node.attr("data-mkws-recid");
+ if (this.team.gotRecords()) {
+ that.team.fetchDetails(recid);
+ } else {
+ this.team.queue("firstrecords").subscribe(function() {
+ that.team.fetchDetails(recid);
+ });
+ }
+ this.team.queue("record").subscribe(function(data) {
+ if ($.inArray(recid, data.recid) > -1) {
+ var template = that.team.loadTemplate(that.config.template || "details");
+ that.node.html(template(data));
+ }
+ });
+});
+
+mkws.registerWidgetType('records', function() {
+ var that = this;
+ var team = this.team;
+
+ this.team.queue("records").subscribe(function(data) {
+ for (var i = 0; i < data.hits.length; i++) {
+ var hit = data.hits[i];
+ hit.detailLinkId = team.recordElementId(hit.recid[0]);
+ hit.detailClick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;";
+ hit.containerClass = "mkws-summary mkwsSummary mkws-team-" + team.name();
+ hit.containerClass += " " + hit.detailLinkId;
+ // ### At some point, we may be able to move the
+ // m_currentRecordId and m_currentRecordData members
+ // from the team object into this widget.
+ if (hit.recid == team.currentRecordId()) {
+ if (team.currentRecordData()) {
+ hit.renderedDetails = team.renderDetails(team.currentRecordData());
+ }
+ }
+ }
+ var template = team.loadTemplate(that.config.template || "records");
+ var summaryPartial = team.loadTemplate(that.config['summary-template'] || "summary");
+ var tdata = $.extend({}, {"hits": data.hits}, that.config.template_vars);
+ that.node.html(template(tdata, {"partials":{"summary":summaryPartial}}));
+ });
+
+ that.autosearch();
+});
+
+
+mkws.registerWidgetType('navi', function() {
+ var that = this;
+ var teamName = this.team.name();
+
+ this.team.queue("navi").subscribe(function() {
+ var filters = that.team.filters();
+ var output = {filters:[]};
+
+ filters.visitTargets(function(id, name) {
+ var cur = {};
+ cur.facet = 'source';
+ cur.value = name;
+ cur.click = "mkws.delimitTarget('" + teamName + "', '" + id + "'); return false;";
+ output.filters.push(cur);
+ });
+
+ filters.visitFields(function(field, value) {
+ var cur = {};
+ cur.facet = field;
+ cur.value = value;
+ cur.click = "mkws.delimitQuery('" + teamName + "', '" + field + "', '" + value + "'" + ");return false;";
+ output.filters.push(cur);
+ });
+
+ var template = that.team.loadTemplate(that.config.template || "navi");
+ that.node.html(template(output));
+ });
+});
+
+
+// It seems this and the Perpage widget doen't need to subscribe to
+// anything, since they produce events rather than consuming them.
+//
+mkws.registerWidgetType('sort', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_sortOrder(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('per-page', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_perpage(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('done', function() {
+ var that = this;
+ this.team.queue("complete").subscribe(function(n) {
+ var template = that.team.loadTemplate(that.config.template || "done");
+ that.node.html(template({count: n}));
+ });
+});
+
+
+mkws.registerWidgetType('switch', function() {
+ if (!this.config.show_switch) return;
+ var tname = this.team.name();
+ var output = {};
+ output.recordClick = "mkws.switchView(\'" + tname + "\', \'records\')";
+ output.targetClick = "mkws.switchView(\'" + tname + "\', \'targets\')";
+ var template = this.team.loadTemplate(this.config.template || "switch");
+ this.node.html(template(output));
+ this.hideWhenNarrow();
+});
+
+
+mkws.registerWidgetType('search', function() {
+ var output = {};
+ output.team = this.team.name();
+ var template = this.team.loadTemplate(this.config.template || "search");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('search-form', function() {
+ var team = this.team;
+ this.node.submit(function() {
+ var val = team.widget('query').value();
+ team.newSearch(val);
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('results', function() {
+ var template = this.team.loadTemplate(this.config.template || "results");
+ this.node.html(template({team: this.team.name()}));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('ranking', function() {
+ var output = {};
+ output.perPage = [];
+ output.sort = [];
+ output.team = this.team.name();
+ output.showSort = this.config.show_sort;
+ output.showPerPage = this.config.show_perpage;
+
+ var order = this.team.sortOrder();
+ this.log("making sort, sortOrder = '" + order + "'");
+ for (var i = 0; i < this.config.sort_options.length; i++) {
+ var cur = {};
+ var opt = this.config.sort_options[i];
+ cur.key = opt[0];
+ cur.label = opt.length == 1 ? opt[0] : opt[1];
+ if (order == cur.key || order == cur.label) cur.selected = true;
+ output.sort.push(cur);
+ }
+
+ var perpage = this.team.perpage();
+ this.log("making perpage, perpage = " + perpage);
+ for(var i = 0; i < this.config.perpage_options.length; i++) {
+ var cur = {};
+ cur.perPage = this.config.perpage_options[i];
+ if (cur.perPage == perpage) cur.selected = true;
+ output.perPage.push(cur);
+ }
+
+ var template = this.team.loadTemplate(this.config.template || "ranking");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('lang', function() {
+ // dynamic URL or static page? /path/foo?query=test
+ /* create locale language menu */
+ if (!this.config.show_lang) return;
+
+ var lang_default = "en";
+ var lang = this.config.lang || lang_default;
+ var list = [];
+
+ /* display a list of configured languages, or all */
+ var lang_options = this.config.lang_options;
+ var toBeIncluded = {};
+ for (var i = 0; i < lang_options.length; i++) {
+ toBeIncluded[lang_options[i]] = true;
+ }
+
+ for (var k in mkws.locale_lang) {
+ if (toBeIncluded[k] || lang_options.length == 0) {
+ cur = {};
+ if (lang === k) cur.selected = true;
+ cur.code = k;
+ cur.url = lang_url(k);
+ list.push(cur);
+ }
+ }
+
+ // add english link
+ if (lang_options.length == 0 || toBeIncluded[lang_default]) {
+ cur = {};
+ if (lang === lang_default) cur.selected = true;
+ cur.code = lang_default;
+ cur.url = lang_url(lang_default);
+ list.push(cur);
+ }
+
+ this.log("language menu: " + list.join(", "));
+
+ var template = this.team.loadTemplate(this.config.template || "lang");
+ this.node.html(template({languages: list}));
+ this.hideWhenNarrow();
+
+ // set or re-set "lang" URL parameter
+ function lang_url(lang) {
+ var query = location.search;
+ // no query parameters? done
+ if (!query) {
+ return "?lang=" + lang;
+ }
+
+ // parameter does not exist
+ if (!query.match(/[\?&]lang=/)) {
+ return query + "&lang=" + lang;
+ }
+
+ // replace existing parameter
+ query = query.replace(/\?lang=([^&#;]*)/, "?lang=" + lang);
+ query = query.replace(/\&lang=([^&#;]*)/, "&lang=" + lang);
+ return query;
+ }
+});
+
+
+mkws.registerWidgetType('motd', function() {
+ var container = this.team.widget('motd-container');
+ if (container) {
+ // Move the MOTD from the provided element down into the container
+ this.node.appendTo(container.node);
+ }
+});
+
+
+// This widget has no functionality of its own, but its configuration
+// is copied up into its team, allowing it to affect other widgets in
+// the team.
+//
+mkws.registerWidgetType('config', function() {
+ var c = this.config;
+ for (var name in c) {
+ if (c.hasOwnProperty(name)) {
+ this.team.config[name] = c[name];
+ this.log(this + " copied property " + name + "='" + c[name] + "' up to team");
+ }
+ }
+});
+
+
+mkws.registerWidgetType('progress', function() {
+ var that = this;
+ this.node.hide();
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "progress");
+ that.node.html(template({
+ done: data.clients - data.activeclients,
+ waiting: data.activeclients
+ }));
+ that.node.show();
+ });
+});
+
+
+// Some elements have mkws* classes that makes them appear as widgets
+// -- for example, because we want to style them using CSS -- but have
+// no actual functionality. We register these to prevent ignorable
+// warnings when they occur.
+
+mkws.registerWidgetType('query', function() {});
+mkws.registerWidgetType('motd-container', function() {});
+mkws.registerWidgetType('button', function() {});
+
+
+})(mkws.$); // jQuery wrapper
+mkws.registerWidgetType('facets', function() {
+ // Initially hide the facets; display when we get results
+ var that = this;
+ var team = this.team;
+ team.queue("facets").subscribe(function(data) {
+ that.node.addClass("active");
+ });
+
+ var template = team.loadTemplate(this.config.template || "facets");
+ this.node.html(template({
+ team: team.name(),
+ facets: this.config.facets
+ }));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('facet', function() {
+ var facetConfig = {
+ xtargets: [ "Sources", 16, false ],
+ subject: [ "Subjects", 10, true ],
+ author: [ "Authors", 10, true ]
+ }
+ var that = this;
+ var team = this.team;
+ var name = that.config.facet;
+ var ref = facetConfig[name] || [ "Unknown", 10, true ];
+ var caption = this.config['facet_caption_' + name] || ref[0];
+ var max = parseInt(this.config['facet_max_' + name] || ref[1]);
+ var pzIndex = ref[2] ? name : null;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + that.type + '(' + name + ')]';
+ };
+
+ team.queue("facets").subscribe(function(data) {
+ data = data[name];
+ var terms = [];
+ var teamName = team.name();
+ for (var i = 0; i < data.length && i < max; i++) {
+ var linkdata = "";
+ var action = "";
+ if (!pzIndex) {
+ // Special case: target selection
+ linkdata += ('target_id='+data[i].id+' ');
+ if (!team.targetFiltered(data[i].id)) {
+ action = 'mkws.limitTarget(\'' + teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+ }
+ } else {
+ action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
+ }
+ linkdata += 'onclick="' + action + ';return false;"';
+ terms.push({
+ term: data[i].name,
+ field: data[i].id,
+ count: data[i].freq,
+ linkdata: linkdata
+ });
+ }
+ // configured template > facet specific template > default facet template
+ var template;
+ if (that.config.template) {
+ template = team.loadTemplate(that.config.template);
+ } else {
+ template = team.loadTemplate("facet-" + name);
+ if (template) {
+ that.log("Using facet-" + name + " template.")
+ } else {
+ that.log("No " + name + " specific template, using default.")
+ template = team.loadTemplate("facet");
+ }
+ }
+ that.node.html(template({
+ name: name,
+ caption: caption,
+ query: that.config.query,
+ terms: terms
+ }));
+ });
+ this.autosearch();
+});
+mkws.registerWidgetType('auth-name', function() {
+ var that = this;
+
+ this.team.queue("authenticated").subscribe(function(authName) {
+ that.node.html(authName);
+ });
+});
+mkws.registerWidgetType('categories', function() {
+ var that = this;
+
+ if (!mkws.authenticated) {
+ alert("can't use categories widget when not authenticated");
+ return;
+ }
+
+ this.team.queue("authenticated").subscribe(function(authName, realm) {
+ var req = new pzHttpRequest(mkws.pazpar2_url() + "?command=categories", function(err) {
+ alert("HTTP call for categories failed: " + err)
+ });
+
+ req.get(null, function(data) {
+ if (!$.isXMLDoc(data)) {
+ alert("categories response document is not XML");
+ return;
+ }
+ that.log("got categories: " + data);
+
+ var text = [];
+ text.push("Select category: ");
+ text.push("<select name='mkws-category mkwsCategory' " +
+ "onchange='mkws.limitCategory(\"" + that.team.name() + "\", this.value)'>");
+ text.push("<option value=''>[All]</option>");
+ $(data).find('category').each(function() {
+ var name = $(this).find('categoryName').text();
+ var id = $(this).find('categoryId').text();
+ text.push("<option value='", id, "'>", name, "</option>");
+ });
+ text.push("</select>");
+ that.node.html(text.join(''));
+ });
+ });
+});
+mkws.registerWidgetType('log', function() {
+ var that = this;
+
+ this.team.queue("log").subscribe(function(teamName, timestamp, message) {
+ that.node.append(teamName + ": " + timestamp + message + "<br/>");
+ });
+});
+// A widget for a record-list of a single record
+mkws.registerWidgetType('record', function() {
+ if (!this.config.maxrecs) this.config.maxrecs = 1;
+ var that = this;
+ var team = this.team;
+ team.queue("records").subscribe(function(data) {
+ var template = team.loadTemplate(that.config.template || "details");
+ var targs = mkws.$.extend({}, data.hits[0], that.config.template_vars);
+ that.node.html(template(targs));
+ });
+ that.autosearch();
+});
+
+mkws.registerWidgetType('images', function() {
+ mkws.promotionFunction('records').call(this);
+ if (!this.config.template) this.config.template = 'images';
+});
+
+mkws.registerWidgetType('google-image', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'Google_Images';
+});
+
+mkws.registerWidgetType('lolcat', function() {
+ mkws.promotionFunction('google-image').call(this);
+ if (!this.config.autosearch) this.config.autosearch = 'kitteh';
+});
+
+mkws.registerWidgetType('cover-art', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'AmazonBooks';
+});
+mkws.registerWidgetType('reference', function() {
+ mkws.promotionFunction('record').call(this);
+ if (!this.config.target) this.config.target = 'wikimedia_wikipedia_single_result';
+ if (!this.config.template) this.config.template = 'reference';
+ this.config.template_vars.paragraphs = this.config.paragraphs || 0;
+ this.config.template_vars.sentences = this.config.sentences || 0;
+});
+mkws.registerWidgetType('builder', function() {
+ var that = this;
+ var team = this.team;
+
+ var button = mkws.$('<button/>', {
+ type: 'button',
+ text: this.config.text || "Build!"
+ });
+ this.node.append(button);
+ button.click(function() {
+ var query = team.widget('query').value();
+ var sort = team.widget('sort').value();
+ var perpage = team.widget('per-page').value();
+
+ var html = ('<div class="mkws-records mkwsRecords" ' +
+ 'autosearch="' + query + '" ' +
+ 'sort="' + sort + '" ' +
+ 'perpage="' + perpage + '"></div>');
+ var fn = that.callback || alert;
+ fn(html);
+ });
+});
+
+mkws.registerWidgetType('console-builder', function() {
+ mkws.promotionFunction('builder').call(this);
+ this.callback = function(s) {
+ console.log("generated widget: " + s);
+ }
+});
+(function() {
+ var template = Handlebars.template, templates = mkws.defaultTemplates = mkws.defaultTemplates || {};
+templates['details'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " ("
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Date", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Author", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"9":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Links", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, lambda=this.lambda, escapeExpression=this.escapeExpression, functionType="function", helperMissing=helpers.helperMissing;
+ return " <a href=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\">Link"
+ + escapeExpression(((helper = (helper = helpers['mkws-index1'] || (depth0 != null ? depth0['mkws-index1'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"mkws-index1","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Subject", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-first","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(13, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"13":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(15, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"15":function(depth0,helpers,partials,data) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(lambda(depth0, depth0));
+},"17":function(depth0,helpers,partials,data) {
+ var helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helpers['mkws-attr'] || (depth0 && depth0['mkws-attr']) || helperMissing).call(depth0, "@name", {"name":"mkws-attr","hash":{},"data":data})));
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<table>\n <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Title", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </td>\n </tr>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-if-any'] || (depth0 && depth0['mkws-if-any']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-if-any","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(12, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Locations", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(17, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n </td>\n </tr>\n</table>\n";
+},"useData":true});
+templates['done'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search complete: found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n\n";
+},"useData":true});
+templates['facet'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\"mkws-term mkwsTerm\">\n <a href=\"#\" ";
+ stack1 = ((helper = (helper = helpers.linkdata || (depth0 != null ? depth0.linkdata : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"linkdata","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + ">"
+ + escapeExpression(((helper = (helper = helpers.term || (depth0 != null ? depth0.term : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"term","hash":{},"data":data}) : helper)))
+ + "</a> <span>"
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + "</span>\n </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n<div class=\"mkws-facet-title mkwsFacetTitle\">"
+ + escapeExpression(((helper = (helper = helpers.caption || (depth0 != null ? depth0.caption : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"caption","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.terms : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['facets'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-facet mkwsFacet mkws-team-"
+ + escapeExpression(lambda((depths[1] != null ? depths[1].team : depths[1]), depth0))
+ + "\" data-mkws-facet=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\"></div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.facets : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['images'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"mkws-first","hash":{},"fn":this.program(2, data, depths),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " <br/>\n </a>\n";
+},"2":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <img src=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\" alt=\""
+ + escapeExpression(lambda((depths[1] != null ? depths[1]['md-title'] : depths[1]), depth0))
+ + "\"/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['lang'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<span>"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</span>";
+},"4":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<a href=\"";
+ stack1 = ((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\">"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</a>";
+},"6":function(depth0,helpers,partials,data) {
+ return " |\n";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.languages : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['navi'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.facet : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": <a class=\"mkws-removable mkwsRemovable\" href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">"
+ + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+ + "</a>\n ";
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"2":function(depth0,helpers,partials,data) {
+ return "|";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.filters : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['pager'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" class=\"mkws-prev mkwsPrev\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.prevClick || (depth0 != null ? depth0.prevClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"prevClick","hash":{},"data":data}) : helper)))
+ + "\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a> |\n";
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " <span class=\"mkws-prev mkwsPrev\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span> |\n";
+},"5":function(depth0,helpers,partials,data) {
+ return "...";
+ },"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.click : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.program(10, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <a href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-current-page mkwsCurrentPage\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " | <a href=\"#\" class=\"mkws-next mkwsNext\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.nextClick || (depth0 != null ? depth0.nextClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nextClick","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></a>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " | <span class=\"mkws-next mkwsNext\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></span>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<div style=\"float: right\">\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Displaying", {"name":"mkws-translate","hash":{},"data":data})))
+ + ":\n "
+ + escapeExpression(((helper = (helper = helpers.first || (depth0 != null ? depth0.first : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"first","hash":{},"data":data}) : helper)))
+ + " "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "to", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.last || (depth0 != null ? depth0.last : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"last","hash":{},"data":data}) : helper)))
+ + "\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "of", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " (";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": "
+ + escapeExpression(((helper = (helper = helpers.found || (depth0 != null ? depth0.found : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"found","hash":{},"data":data}) : helper)))
+ + ")\n</div>\n\n<div style=\"float: clear\">\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.prevClick : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.morePrev : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.pages : depth0), {"name":"each","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.moreNext : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.nextClick : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.program(14, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</div>\n";
+},"useData":true});
+templates['progress'] = template({"1":function(depth0,helpers,partials,data) {
+ return "█";
+ },"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-waiting mkws-waiting mkwsWaiting\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span>";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-done mkws-done mkwsDone\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.done : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</span>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['ranking'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Sort by", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-sort mkwsSort mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.sort : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </select>";
+},"2":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(5, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " <option value=\"";
+ stack1 = ((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\" selected=\"selected\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "and show", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-perpage mkwsPerpage mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.perPage : depth0), {"name":"each","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </select>\n ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "per page", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.program(11, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"9":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\" selected=\"selected\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"11":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "<form>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showSort : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showPerPage : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</form>\n\n";
+},"useData":true});
+templates['records'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\""
+ + escapeExpression(((helper = (helper = helpers.containerClass || (depth0 != null ? depth0.containerClass : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"containerClass","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = this.invokePartial(partials.summary, ' ', 'summary', depth0, undefined, helpers, partials, data);
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"usePartial":true,"useData":true});
+templates['reference'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<b>"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</b>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<img src=\""
+ + escapeExpression(((helper = (helper = helpers['md-thumburl'] || (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-thumburl","hash":{},"data":data}) : helper)))
+ + "\" alt=\""
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\">\n<h1><a href=\""
+ + escapeExpression(((helper = (helper = helpers['md-electronic-url'] || (depth0 != null ? depth0['md-electronic-url'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-electronic-url","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "</a></h1>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-paragraphs'] || (depth0 && depth0['mkws-paragraphs']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-description'] : depth0), (depth0 != null ? depth0.paragraphs : depth0), (depth0 != null ? depth0.sentences : depth0), {"name":"mkws-paragraphs","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n<p class=\"mkws-credit mkwsCredit\">Wikipedia</p>\n";
+},"useData":true});
+templates['results'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<table width=\"100%\" border=\"0\" cellpadding=\"6\" cellspacing=\"0\">\n <tr>\n <td class=\"mkws-facets-container-wide mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" width=\"250\" valign=\"top\">\n <div class=\"mkws-facets mkwsTermlists mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n <td class=\"mkws-motd-container mkwsMOTDContainer mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" valign=\"top\">\n <div class=\"mkws-ranking mkwsRanking mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-pager mkwsPager mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-navi mkwsNavi mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-records mkwsRecords mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\">\n <div class=\"mkws-facets-container-narrow mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n</table>\n\n";
+},"useData":true});
+templates['search'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<form name=\"mkws-search-form\" class=\"mkws-search-form mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" action=\"\">\n <input class=\"mkws-query mkws-query mkwsQuery mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"text\"/>\n <input class=\"mkws-button mkws-button mkwsButton mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"submit\" value=\"";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\"/>\n</form>\n\n";
+},"useData":true});
+templates['stat'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " -- <span class=\"mkws-client-count mkwsClientCount\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Active clients", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " : "
+ + escapeExpression(((helper = (helper = helpers.activeclients || (depth0 != null ? depth0.activeclients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"activeclients","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.clients || (depth0 != null ? depth0.clients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"clients","hash":{},"data":data}) : helper)))
+ + "</span> -- ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Retrieved records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " : "
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "\n";
+},"useData":true});
+templates['summary'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, lambda=this.lambda;
+ return " <a class=\"mkws-field-thumb\" href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n <img src=\""
+ + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? stack1['0'] : stack1), depth0))
+ + "\"/>\n </a>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-title-remainder\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-field-description\">"
+ + escapeExpression(((helper = (helper = helpers['md-description'] || (depth0 != null ? depth0['md-description'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-description","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-date\">"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " ";
+ stack1 = ((helper = (helper = helpers.renderedDetails || (depth0 != null ? depth0.renderedDetails : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"renderedDetails","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "<div class=\"mkws-field-data\">\n <span class=\"mkws-field-title\">\n <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n </a>\n </span>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-description'] : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</div>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.renderedDetails : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['switch'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.recordClick || (depth0 != null ? depth0.recordClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"recordClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</a>\n<span>|</span>\n<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.targetClick || (depth0 != null ? depth0.targetClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"targetClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Targets", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a>\n";
+},"useData":true});
+templates['targets'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <td>";
+ stack1 = ((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.message : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.state || (depth0 != null ? depth0.state : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"state","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helper = (helper = helpers.diagnostic || (depth0 != null ? depth0.diagnostic : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"diagnostic","hash":{},"data":data}) : helper)))
+ + " ("
+ + escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<table>\n <thead>\n <tr>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Target ID", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Hits", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Diags", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "State", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n </td>\n </tr>\n </thead>\n <tbody>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.data : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </tbody>\n</table>\n";
+},"useData":true});
+})();/* generic function to open results in a popup window
+ *
+ */
+
+//"use strict";
+// $(document).ready(function () {
+mkws.registerWidgetType('popup', function() {
+ var $ = mkws.$;
+ var debug = this.log;
+ debug("init popup window");
+
+ var popup_window = $(this.node);
+ // var popup_window = $(".mkws-popup mkwsPopup"); // $(document).ready()
+ if (!popup_window) {
+ debug("no popup found, skip...");
+ return;
+ } else {
+ debug("number of popup windows found: " + popup_window.length);
+ }
+
+ if (!$.ui) {
+ alert("Error: jquery-ui.js is missing, did you include it after jQuery core in the HTML file?");
+ return;
+ }
+
+ // more than one widget on a page are possible
+ popup_window.each(function(i) {
+ var that = $(this);
+
+ // all atributes are strings, convert them to integers here
+ var width = parseInt(that.attr("popup_width") || "800");
+ var height = parseInt(that.attr("popup_height") || "600");
+ var autoOpen = parseInt(that.attr("popup_autoOpen") || "0");
+ var modal = parseInt(that.attr("popup_modal") || "0");
+
+ debug("Popup parameters: width: " + width + ", height: " + height + ", autoOpen: " + autoOpen);
+ that.dialog({
+ closeOnEscape: true,
+ autoOpen: autoOpen,
+ height: height,
+ width: width,
+ modal: modal ? true : false,
+ resizable: true,
+ buttons: {
+ Cancel: function() {
+ that.dialog("close");
+ }
+ },
+ close: function() {}
+ });
+
+ // open at search query submit: "input.mkws-button mkwsButton"
+ var id_botton = that.attr("popup_button");
+ if (id_botton) {
+ $(id_botton).button().click(function() {
+ that.dialog("open");
+ });
+ }
+ });
+});
--- /dev/null
+// Handlebars helpers
+
+Handlebars.registerHelper('mkws-json', function(obj) {
+ return mkws.$.toJSON(obj);
+});
+
+
+// This is intended to handle paragraphs from Wikipedia, hence the
+// rather hacky code to remove numbered references.
+//
+Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
+ var acc = [];
+
+ // For some reason, Handlebars provides the value
+ // {"hash":{},"data":{}} for parameters that are not provided. So we
+ // have to be prepared for actual numbers, explicitly undefined
+ // values and this dumb magic value.
+ if (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
+ nPara = obj.length;
+ }
+ if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
+ nSent = Infinity;
+ }
+
+ for (var i = 0; i < nPara; i++) {
+ // Remove numbered references such as "[1,3,4]" from text
+ var text = obj[i].replace(/\[[0-9,]+\]/g, '');
+ // Next line from http://stackoverflow.com/questions/18914629/split-string-into-sentences-in-javascript
+ var sentences = text.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|");
+ if (sentences.length > nSent)
+ sentences.length = nSent;
+
+ acc.push('<p>', sentences.join(' '), '</p>');
+ nSent -= sentences.length;
+ if (nSent == 0)
+ break;
+ }
+
+ return acc.join('');
+});
+
+
+Handlebars.registerHelper('mkws-translate', function(s) {
+ return mkws.M(s);
+});
+
+
+// We need {{mkws-attr '@name'}} because Handlebars can't parse {{@name}}
+Handlebars.registerHelper('mkws-attr', function(attrName) {
+ return this[attrName];
+});
+
+
+/*
+ * Use as follows: {{#mkws-if-any NAME1 having="NAME2"}}
+ * Applicable when NAME1 is the name of an array
+ * The guarded code runs only if at least one element of the NAME1
+ * array has a subelement called NAME2.
+ */
+Handlebars.registerHelper('mkws-if-any', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(this);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-first', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(item);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-commaList', function(items, options) {
+ var out = "";
+
+ for (var i in items) {
+ if (i > 0) out += ", ";
+ out += options.fn(items[i])
+ }
+
+ return out;
+});
+
+
+Handlebars.registerHelper('mkws-index1', function(obj) {
+ return obj.data.index + 1;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+ var out = "";
+ for (var i = 0; i < count; i++) {
+ out += options.fn(this);
+ }
+ return out;
+});
+/*! MKWS, the MasterKey Widget Set.
+ * Copyright (C) 2013-2014 Index Data
+ * See the file LICENSE for details
+ */
+
+"use strict"; // HTML5: disable for log_level >= 2
+
+
+// Set up global mkws object. Contains truly global state such as SP
+// authentication, and a hash of team objects, indexed by team-name.
+//
+// We set it as a property of window to make the global explicit as
+// some things complain about an implicit global.
+window.mkws = {
+ $: $, // Our own local copy of the jQuery object
+ authenticated: false,
+ authenticating: false,
+ active: false,
+ log_level: 1, // Will be overridden from mkws.config, but
+ // initial value allows jQuery popup to use logging.
+ teams: {},
+ widgetType2function: {},
+ defaultTemplates: {},
+
+ locale_lang: {
+ "de": {
+ "Authors": "Autoren",
+ "Subjects": "Schlagwörter",
+ "Sources": "Daten und Quellen",
+ "source": "datenquelle",
+ "Facets": "Termlisten",
+ "Next": "Weiter",
+ "Prev": "Zurück",
+ "Search": "Suche",
+ "Sort by": "Sortieren nach",
+ "and show": "und zeige",
+ "per page": "pro Seite",
+ "Displaying": "Zeige",
+ "to": "von",
+ "of": "aus",
+ "found": "gefunden",
+ "Title": "Titel",
+ "Author": "Autor",
+ "author": "autor",
+ "Date": "Datum",
+ "Subject": "Schlagwort",
+ "subject": "schlagwort",
+ "Location": "Ort",
+ "Records": "Datensätze",
+ "Targets": "Datenbanken",
+
+ "dummy": "dummy"
+ },
+
+ "da": {
+ "Authors": "Forfattere",
+ "Subjects": "Emner",
+ "Sources": "Kilder",
+ "source": "kilder",
+ "Facets": "Termlists",
+ "Next": "Næste",
+ "Prev": "Forrige",
+ "Search": "Søg",
+ "Sort by": "Sorter efter",
+ "and show": "og vis",
+ "per page": "per side",
+ "Displaying": "Viser",
+ "to": "til",
+ "of": "ud af",
+ "found": "fandt",
+ "Title": "Title",
+ "Author": "Forfatter",
+ "author": "forfatter",
+ "Date": "Dato",
+ "Subject": "Emneord",
+ "subject": "emneord",
+ "Location": "Lokation",
+ "Records": "Poster",
+ "Targets": "Baser",
+
+ "dummy": "dummy"
+ }
+ }
+};
+
+// We may be using a separate copy
+if (typeof(mkws_jQuery) !== "undefined") {
+ mkws.$ = mkws_jQuery;
+} else {
+ mkws.$ = jQuery;
+}
+
+mkws.log = function(string) {
+ if (!mkws.log_level)
+ return;
+
+ if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */
+ return;
+ }
+
+ // you need to disable use strict at the top of the file!!!
+ if (mkws.log_level >= 3) {
+ // Works in Chrome; not sure about elsewhere
+ console.trace();
+ } else if (mkws.log_level >= 2) {
+ console.log(">>> called from function " + arguments.callee.caller.name + ' <<<');
+ }
+ console.log(string);
+};
+
+
+// Translation function.
+mkws.M = function(word) {
+ var lang = mkws.config.lang;
+
+ if (!lang || !mkws.locale_lang[lang])
+ return word;
+
+ return mkws.locale_lang[lang][word] || word;
+};
+
+
+// This function is taken from a StackOverflow answer
+// http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript/901144#901144
+mkws.getParameterByName = function(name, url) {
+ if (!url) url = location.search;
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+ results = regex.exec(url);
+ return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+}
+
+
+mkws.registerWidgetType = function(name, fn) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerWidgetType old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ mkws.widgetType2function[name] = fn;
+ mkws.log("registered widget-type '" + name + "'");
+};
+
+mkws.promotionFunction = function(name) {
+ return mkws.widgetType2function[name];
+};
+
+
+mkws.setMkwsConfig = function(overrides) {
+ // Set global log_level flag early so that mkws.log() works
+ var tmp = overrides.log_level;
+ if (typeof(tmp) !== 'undefined') mkws.log_level = tmp;
+
+ var config_default = {
+ use_service_proxy: true,
+ pazpar2_url: undefined,
+ pp2_hostname: "sp-mkws.indexdata.com",
+ pp2_path: "service-proxy/",
+ service_proxy_auth: undefined,
+ sp_auth_path: undefined,
+ sp_auth_query: "command=auth&action=perconfig",
+ sp_auth_credentials: undefined,
+ lang: "",
+ sort_options: [["relevance"], ["title:1", "title"], ["date:0", "newest"], ["date:1", "oldest"]],
+ perpage_options: [10, 20, 30, 50],
+ sort_default: "relevance",
+ perpage_default: 20,
+ show_lang: true, /* show/hide language menu */
+ show_sort: true, /* show/hide sort menu */
+ show_perpage: true, /* show/hide perpage menu */
+ show_switch: true, /* show/hide switch menu */
+ lang_options: [], /* display languages links for given languages, [] for all */
+ facets: ["xtargets", "subject", "author"], /* display facets, in this order, [] for none */
+ responsive_design_width: undefined, /* a page with less pixel width considered as narrow */
+ log_level: 1, /* log level for development: 0..2 */
+ template_vars: {}, /* values that may be exposed to templates */
+
+ dummy: "dummy"
+ };
+
+ mkws.config = mkws.objectInheritingFrom(config_default);
+ for (var k in overrides) {
+ mkws.config[k] = overrides[k];
+ }
+};
+
+
+// This code is from Douglas Crockford's article "Prototypal Inheritance in JavaScript"
+// http://javascript.crockford.com/prototypal.html
+// mkws.objectInheritingFrom behaves the same as Object.create,
+// but since the latter is not available in IE8 we can't use it.
+//
+mkws.objectInheritingFrom = function(o) {
+ function F() {}
+ F.prototype = o;
+ return new F();
+}
+
+
+// The following functions are dispatchers for team methods that
+// are called from the UI using a team-name rather than implicit
+// context.
+mkws.switchView = function(tname, view) {
+ mkws.teams[tname].switchView(view);
+};
+
+mkws.showDetails = function(tname, prefixRecId) {
+ mkws.teams[tname].showDetails(prefixRecId);
+};
+
+mkws.limitTarget = function(tname, id, name) {
+ mkws.teams[tname].limitTarget(id, name);
+};
+
+mkws.limitQuery = function(tname, field, value) {
+ mkws.teams[tname].limitQuery(field, value);
+};
+
+mkws.limitCategory = function(tname, id) {
+ mkws.teams[tname].limitCategory(id);
+};
+
+mkws.delimitTarget = function(tname, id) {
+ mkws.teams[tname].delimitTarget(id);
+};
+
+mkws.delimitQuery = function(tname, field, value) {
+ mkws.teams[tname].delimitQuery(field, value);
+};
+
+mkws.showPage = function(tname, pageNum) {
+ mkws.teams[tname].showPage(pageNum);
+};
+
+mkws.pagerPrev = function(tname) {
+ mkws.teams[tname].pagerPrev();
+};
+
+mkws.pagerNext = function(tname) {
+ mkws.teams[tname].pagerNext();
+};
+
+
+mkws.pazpar2_url = function() {
+ if (mkws.config.pazpar2_url) {
+ mkws.log("using pre-baked pazpar2_url '" + mkws.config.pazpar2_url + "'");
+ return mkws.config.pazpar2_url;
+ } else {
+ var s = document.location.protocol + "//" + mkws.config.pp2_hostname + "/" + mkws.config.pp2_path;
+ mkws.log("generated pazpar2_url '" + s + "'");
+ return s;
+ }
+};
+
+
+// We put a session token in window.name, as it's the only place to
+// keep data that is preserved across reloads and within-site
+// navigation. pz2.js picks this up and uses it as part of the
+// cookie-name, to ensure we get a new session when we need one.
+//
+// We want to use different sessions for different windows/tabs (so
+// they don't receive each other's messages), different hosts and
+// different paths on a host (since in general these will
+// authenticate as different libraries). So the window name needs to
+// include the hostname and the path from the URL, plus the token.
+//
+var token;
+if (window.name) {
+ token = window.name.replace(/.*\//, '');
+ mkws.log("Reusing existing window token '" + token + "'");
+} else {
+ // Incredible that the standard JavaScript runtime doesn't define a
+ // unique windowId. Instead, we have to make one up. And since there's
+ // no global area shared between windows, the best we can do for
+ // ensuring uniqueness is generating a random ID and crossing our
+ // fingers.
+ //
+ // Ten chars from 26 alpha-numerics = 36^10 = 3.65e15 combinations.
+ // At one per second, it will take 116 million years to duplicate a token
+ token = Math.random().toString(36).slice(2, 12);
+ mkws.log("Generated new window token '" + token + "'");
+}
+
+window.name = window.location.hostname + window.location.pathname + '/' + token;
+mkws.log("Using window.name '" + window.name + "'");
+
+
+// wrapper to provide local copy of the jQuery object.
+(function($) {
+ var log = mkws.log;
+ var _old2new = { // Maps old-style widget names to new-style
+ 'Authname': 'auth-name',
+ 'ConsoleBuilder': 'console-builder',
+ 'Coverart': 'cover-art',
+ 'GoogleImage': 'google-image',
+ 'MOTD': 'motd',
+ 'MOTDContainer': 'motd-container',
+ 'Perpage': 'per-page',
+ 'SearchForm': 'search-form',
+ 'ReferenceUniverse': 'reference-universe',
+ 'Termlists': 'facets'
+ };
+ // Annoyingly, there is no built-in way to invert a hash
+ var _new2old = {};
+ for (var key in _old2new) {
+ if(_old2new.hasOwnProperty(key)) {
+ _new2old[_old2new[key]] = key;
+ }
+ }
+
+ mkws._old2new = _old2new;
+
+ function handleNodeWithTeam(node, callback) {
+ // First branch for DOM objects; second branch for jQuery objects
+ var classes = node.className || node.attr('class');
+ if (!classes) {
+ // For some reason, if we try to proceed when classes is
+ // undefined, we don't get an error message, but this
+ // function and its callers, up several stack level,
+ // silently return. What a crock.
+ log("handleNodeWithTeam() called on node with no classes");
+ return;
+ }
+ var list = classes.split(/\s+/)
+ var teamName, type;
+
+ for (var i = 0; i < list.length; i++) {
+ var cname = list[i];
+ if (cname.match(/^mkws-team-/)) {
+ // New-style teamnames of the form mkws-team-xyz
+ teamName = cname.replace(/^mkws-team-/, '');
+ } else if (cname.match(/^mkwsTeam_/)) {
+ // Old-style teamnames of the form mkwsTeam_xyz
+ teamName = cname.replace(/^mkwsTeam_/, '');
+ } else if (cname.match(/^mkws-/)) {
+ // New-style names of the from mkws-foo-bar
+ type = cname.replace(/^mkws-/, '');
+ } else if (cname.match(/^mkws/)) {
+ // Old-style names of the form mkwsFooBar
+ var tmp = cname.replace(/^mkws/, '');
+ type = _old2new[tmp] || tmp.toLowerCase();
+ }
+ }
+
+ // Widgets without a team are on team "AUTO"
+ if (!teamName) {
+ teamName = "AUTO";
+ // Autosearch widgets don't join team AUTO if there is already an
+ // autosearch on the team or the team has otherwise gotten a query
+ if (node.getAttribute("autosearch")) {
+ if (mkws.autoHasAuto ||
+ mkws.teams["AUTO"] && mkws.teams["AUTO"].config["query"]) {
+ log("AUTO team already has a query, using unique team");
+ teamName = "UNIQUE";
+ }
+ mkws.autoHasAuto = true;
+ }
+ }
+
+ // Widgets on team "UNIQUE" get a random team
+ if (teamName === "UNIQUE") {
+ teamName = Math.floor(Math.random() * 100000000).toString();
+ }
+
+ callback.call(node, teamName, type);
+ }
+
+
+ function resizePage() {
+ var threshhold = mkws.config.responsive_design_width;
+ var width = $(window).width();
+ var from, to, method;
+
+ if ((mkws.width === undefined || mkws.width > threshhold) &&
+ width <= threshhold) {
+ from = "wide"; to = "narrow"; method = "hide";
+ } else if ((mkws.width === undefined || mkws.width <= threshhold) &&
+ width > threshhold) {
+ from = "narrow"; to = "wide"; method = "show";
+ }
+ mkws.width = width;
+
+ if (from) {
+ log("changing from " + from + " to " + to + ": " + width);
+ for (var tname in mkws.teams) {
+ var team = mkws.teams[tname];
+ team.visitWidgets(function(t, w) {
+ var w1 = team.widget(t + "-container-" + from);
+ var w2 = team.widget(t + "-container-" + to);
+ if (w1) {
+ w1.node.hide();
+ }
+ if (w2) {
+ w2.node.show();
+ w.node.appendTo(w2.node);
+ }
+ });
+ team.queue("resize-" + to).publish();
+ }
+ }
+ };
+
+
+ /*
+ * Run service-proxy authentication in background (after page load).
+ * The username/password is configured in the apache config file
+ * for the site.
+ */
+ function authenticateSession(auth_url, auth_domain, pp2_url) {
+ mkws.authenticating = true;
+ log("service proxy authentication on URL: " + auth_url);
+
+ if (!auth_domain) {
+ auth_domain = pp2_url.replace(/^(https?:)?\/\/(.*?)\/.*/, '$2');
+ log("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'");
+ }
+
+ var request = new pzHttpRequest(auth_url, function(err) {
+ alert("HTTP call for authentication failed: " + err)
+ return;
+ }, auth_domain);
+
+ request.get(null, function(data) {
+ mkws.authenticating = false;
+ if (!$.isXMLDoc(data)) {
+ alert("Service Proxy authentication response is not a valid XML document");
+ return;
+ }
+ var status = $(data).find("status");
+ if (status.text() != "OK") {
+ var message = $(data).find("message");
+ alert("Service Proxy authentication response: " + status.text() + " (" + message.text() + ")");
+ return;
+ }
+
+ log("service proxy authentication successful");
+ mkws.authenticated = true;
+ var authName = $(data).find("displayName").text();
+ // You'd think there would be a better way to do this:
+ var realm = $(data).find("realm:not(realmAttributes realm)").text();
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("authenticated").publish(authName, realm);
+ }
+
+ runAutoSearches();
+ });
+ }
+
+
+ function runAutoSearches() {
+ log("running auto searches");
+
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("ready").publish();
+ }
+ }
+
+
+ function selectorForAllWidgets() {
+ if (mkws.config && mkws.config.scan_all_nodes) {
+ // This is the old version, which works by telling jQuery to
+ // find every node that has a class beginning with "mkws". In
+ // theory it should be slower than the class-based selector; but
+ // instrumentation suprisingly shows this is consistently
+ // faster. It also has the advantage that any widgets of
+ // non-registered types are logged as warnings rather than
+ // silently ignored.
+ return '[class^="mkws"],[class*=" mkws"]';
+ } else {
+ // This is the new version, which works by looking up the
+ // specific classes of all registered widget types and their
+ // resize containers. Because all it requires jQuery to do is
+ // some hash lookups in pre-built tables, it should be very
+ // fast; but it silently ignores widgets of unregistered types.
+ var s = "";
+ for (var type in mkws.widgetType2function) {
+ if (s) s += ',';
+ s += '.mkws-' + type;
+ s += ',.mkws-' + type + "-container-wide";
+ s += ',.mkws-' + type + "-container-narrow";
+ // Annoyingly, we also need to recognise old-style names
+ var oldtype = _new2old[type] || type.charAt(0).toUpperCase() + type.slice(1);
+ s += ',.mkws' + oldtype;
+ s += ',.mkws' + oldtype + "-Container-wide";
+ s += ',.mkws' + oldtype + "-Container-narrow";
+ }
+ return s;
+ }
+ }
+
+
+ function makeWidgetsWithin(level, node) {
+ if (node) var widgetNodes = node.find(selectorForAllWidgets());
+ else widgetNodes = $(selectorForAllWidgets());
+ // Return false if we parse no widgets
+ if (widgetNodes.length < 1) return false;
+ widgetNodes.each(function() {
+ handleNodeWithTeam(this, function(tname, type) {
+ var myTeam = mkws.teams[tname];
+ if (!myTeam) {
+ myTeam = mkws.teams[tname] = mkws.makeTeam($, tname);
+ }
+
+ var oldHTML = this.innerHTML;
+ var myWidget = mkws.makeWidget($, myTeam, type, this);
+ myTeam.addWidget(myWidget);
+ var newHTML = this.innerHTML;
+ if (newHTML !== oldHTML) {
+ myTeam.log("widget " + type + " HTML changed: reparsing");
+ makeWidgetsWithin(level+1, $(this));
+ }
+ });
+ });
+ return true;
+ }
+
+
+ // The second "rootsel" parameter is passed to jQuery and is a DOM node
+ // or a selector string you would like to constrain the search for widgets to.
+ //
+ // This function has no side effects if run again on an operating session,
+ // even if the element/selector passed causes existing widgets to be reparsed:
+ //
+ // (TODO: that last bit isn't true and we currently have to avoid reinitialising
+ // widgets, MKWS-261)
+ //
+ // * configuration is not regenerated
+ // * authentication is not performed again
+ // * autosearches are not re-run
+ mkws.init = function(message, rootsel) {
+ var greet = "MKWS initialised";
+ if (rootsel) greet += " (limited to " + rootsel + ")"
+ if (message) greet += " :: " + message;
+ mkws.log(greet);
+
+ // MKWS is not active until init() has been run against an object with widget nodes.
+ // We only set initial configuration when MKWS is first activated.
+ if (!mkws.isActive) {
+ var widgetSelector = selectorForAllWidgets();
+ if ($(widgetSelector).length < 1) {
+ mkws.log("no widgets found");
+ return;
+ }
+
+ // Initial configuration
+ mkws.autoHasAuto = false;
+ var saved_config;
+ if (typeof mkws_config === 'undefined') {
+ log("setting empty config");
+ saved_config = {};
+ } else {
+ log("using config: " + $.toJSON(mkws_config));
+ saved_config = mkws_config;
+ }
+ mkws.setMkwsConfig(saved_config);
+
+ for (var key in mkws.config) {
+ if (mkws.config.hasOwnProperty(key)) {
+ if (key.match(/^language_/)) {
+ var lang = key.replace(/^language_/, "");
+ // Copy custom languages into list
+ mkws.locale_lang[lang] = mkws.config[key];
+ log("added locally configured language '" + lang + "'");
+ }
+ }
+ }
+
+ var lang = mkws.getParameterByName("lang") || mkws.config.lang;
+ if (!lang || !mkws.locale_lang[lang]) {
+ mkws.config.lang = ""
+ } else {
+ mkws.config.lang = lang;
+ }
+
+ log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
+
+ // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
+ if (mkws.pazpar2_url().match(/^\/\//)) {
+ mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
+ log("adjusted protocol independent link to " + mkws.pazpar2_url());
+ }
+
+ if (mkws.config.responsive_design_width) {
+ // Responsive web design - change layout on the fly based on
+ // current screen width. Required for mobile devices.
+ $(window).resize(resizePage);
+ // initial check after page load
+ $(document).ready(resizePage);
+ }
+ }
+
+ var then = $.now();
+ // If we've made no widgets, return without starting an SP session
+ // or marking MKWS active.
+ if (makeWidgetsWithin(1, rootsel ? $(rootsel) : undefined) === false) {
+ return false;
+ }
+ var now = $.now();
+
+ log("walking MKWS nodes took " + (now-then) + " ms");
+ for (var tName in mkws.teams) {
+ var myTeam = mkws.teams[tName]
+ myTeam.makePz2();
+ myTeam.log("made PZ2 object");
+ /*
+ myTeam.visitWidgets(function(t, w) {
+ log(" has widget of type '" + t + "': " + w);
+ });
+ */
+ }
+
+ function sp_auth_url(config) {
+ if (config.service_proxy_auth) {
+ mkws.log("using pre-baked sp_auth_url '" + config.service_proxy_auth + "'");
+ return config.service_proxy_auth;
+ } else {
+ var s = '//';
+ s += config.sp_auth_hostname ? config.sp_auth_hostname : config.pp2_hostname;
+ s += '/';
+ s += config.sp_auth_path ? config.sp_auth_path : config.pp2_path;
+ var q = config.sp_auth_query;
+ if (q) {
+ s += '?' + q;
+ }
+ var c = config.sp_auth_credentials;
+ if (c) {
+ s += ('&username=' + c.substr(0, c.indexOf('/')) +
+ '&password=' + c.substr(c.indexOf('/')+1));
+ }
+ mkws.log("generated sp_auth_url '" + s + "'");
+ return s;
+ }
+ }
+
+ if (mkws.config.use_service_proxy && !mkws.authenticated && !mkws.authenticating) {
+ authenticateSession(sp_auth_url(mkws.config),
+ mkws.config.service_proxy_auth_domain,
+ mkws.pazpar2_url());
+ } else if (!mkws.authenticating) {
+ // raw pp2 or we have a session already open
+ runAutoSearches();
+ }
+
+ mkws.isActive = true;
+ return true;
+ };
+
+ $(document).ready(function() {
+ if (!window.mkws_noready && !mkws.authenticating && !mkws.active) {
+ mkws.init();
+ }
+ });
+
+})(mkws.$);
+// Factory function for team objects. As much as possible, this uses
+// only member variables (prefixed "m_") and inner functions with
+// private scope.
+//
+// Some functions are visible as member-functions to be called from
+// outside code -- specifically, from generated HTML. These functions
+// are that.switchView(), showDetails(), limitTarget(), limitQuery(),
+// limitCategory(), delimitTarget(), delimitQuery(), showPage(),
+// pagerPrev(), pagerNext().
+//
+// Before the team can be used for searching and related operations,
+// its pz2 object must be created by calling team.makePz2().
+//
+mkws.makeTeam = function($, teamName) {
+ var that = {};
+ var m_teamName = teamName;
+ var m_submitted = false;
+ var m_query; // initially undefined
+ var m_sortOrder; // will be set below
+ var m_perpage; // will be set below
+ var m_filterSet = filterSet(that);
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_logTime = {
+ // Timestamps for logging
+ "start": $.now(),
+ "last": $.now()
+ };
+ var m_paz; // will be initialised below
+ var m_templateText = {}; // widgets can register templates to be compiled
+ var m_template = {}; // compiled templates, from any source
+ var m_widgets = {}; // Maps widget-type to array of widget objects
+ var m_gotRecords = false;
+
+ var config = mkws.objectInheritingFrom(mkws.config);
+ that.config = config;
+
+ that.toString = function() { return '[Team ' + teamName + ']'; };
+
+ // Accessor methods for individual widgets: readers
+ that.name = function() { return m_teamName; };
+ that.submitted = function() { return m_submitted; };
+ that.sortOrder = function() { return m_sortOrder; };
+ that.perpage = function() { return m_perpage; };
+ that.query = function() { return m_query; };
+ that.totalRecordCount = function() { return m_totalRecordCount; };
+ that.currentPage = function() { return m_currentPage; };
+ that.currentRecordId = function() { return m_currentRecordId; };
+ that.currentRecordData = function() { return m_currentRecordData; };
+ that.filters = function() { return m_filterSet; };
+ that.gotRecords = function() { return m_gotRecords; };
+
+ // Accessor methods for individual widgets: writers
+ that.set_sortOrder = function(val) { m_sortOrder = val };
+ that.set_perpage = function(val) { m_perpage = val };
+
+
+ // The following PubSub code is modified from the jQuery manual:
+ // http://api.jquery.com/jQuery.Callbacks/
+ //
+ // Use as:
+ // team.queue("eventName").subscribe(function(param1, param2 ...) { ... });
+ // team.queue("eventName").publish(arg1, arg2, ...);
+ //
+ var m_queues = {};
+ function queue(id) {
+ if (!m_queues[id]) {
+ var callbacks = $.Callbacks();
+ m_queues[id] = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ }
+ return m_queues[id];
+ };
+ that.queue = queue;
+
+
+ function log(s) {
+ var now = $.now();
+ var timestamp = (((now - m_logTime.start)/1000).toFixed(3) + " (+" +
+ ((now - m_logTime.last)/1000).toFixed(3) + ") ");
+ m_logTime.last = now;
+ mkws.log(m_teamName + ": " + timestamp + s);
+ that.queue("log").publish(m_teamName, timestamp, s);
+ }
+ that.log = log;
+
+
+ log("making new widget team");
+
+ m_sortOrder = config.sort_default;
+ m_perpage = config.perpage_default;
+
+ // pz2.js event handlers:
+ function onInit() {
+ log("init");
+ m_paz.stat();
+ m_paz.bytarget();
+ }
+
+ function onBytarget(data) {
+ log("bytarget");
+ queue("targets").publish(data);
+ }
+
+ function onStat(data) {
+ queue("stat").publish(data);
+ var hitcount = parseInt(data.hits[0], 10);
+ if (!m_gotRecords && hitcount > 0) {
+ m_gotRecords = true;
+ queue("firstrecords").publish(hitcount);
+ }
+ if (parseInt(data.activeclients[0], 10) === 0) {
+ log("complete");
+ queue("complete").publish(hitcount);
+ }
+ }
+
+ function onTerm(data) {
+ log("term");
+ queue("facets").publish(data);
+ }
+
+ function onShow(data, teamName) {
+ log("show");
+ m_totalRecordCount = data.merged;
+ log("found " + m_totalRecordCount + " records");
+ queue("pager").publish(data);
+ queue("records").publish(data);
+ }
+
+ function onRecord(data, args, teamName) {
+ log("record");
+ // FIXME: record is async!!
+ clearTimeout(m_paz.recordTimer);
+ queue("record").publish(data);
+ var detRecordDiv = findnode(recordDetailsId(data.recid[0]));
+ if (detRecordDiv.length) {
+ // in case on_show was faster to redraw element
+ return;
+ }
+ m_currentRecordData = data;
+ var recordDiv = findnode('.' + recordElementId(m_currentRecordData.recid[0]));
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
+ }
+
+
+ // create a parameters array and pass it to the pz2's constructor
+ // then register the form submit event with the pz2.search function
+ // autoInit is set to true on default
+ that.makePz2 = function() {
+ log("m_queues=" + $.toJSON(m_queues));
+ var params = {
+ "windowid": teamName,
+ "pazpar2path": mkws.pazpar2_url(),
+ "usesessions" : config.use_service_proxy ? false : true,
+ "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
+ "termlist": config.facets.join(',')
+ };
+
+ params.oninit = onInit;
+ if (m_queues.targets) {
+ params.onbytarget = onBytarget;
+ log("setting bytarget callback");
+ }
+ if (m_queues.stat) {
+ params.onstat = onStat;
+ log("setting stat callback");
+ }
+ if (m_queues.facets && config.facets.length) {
+ params.onterm = onTerm;
+ log("setting term callback");
+ }
+ if (m_queues.records) {
+ log("setting show callback");
+ params.onshow = onShow;
+ // Record callback is subscribed from records callback
+ log("setting record callback");
+ params.onrecord = onRecord;
+ }
+
+ m_paz = new pz2(params);
+ log("created main pz2 object");
+ }
+
+
+ // Used by the Records widget and onRecord()
+ function recordElementId(s) {
+ return 'mkws-rec_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+ that.recordElementId = recordElementId;
+
+ // Used by onRecord(), showDetails() and renderDetails()
+ function recordDetailsId(s) {
+ return 'mkws-det_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+
+
+ that.targetFiltered = function(id) {
+ return m_filterSet.targetFiltered(id);
+ };
+
+
+ that.limitTarget = function(id, name) {
+ log("limitTarget(id=" + id + ", name=" + name + ")");
+ m_filterSet.add(targetFilter(id, name));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitQuery = function(field, value) {
+ log("limitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.add(fieldFilter(field, value));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitCategory = function(id) {
+ log("limitCategory(id=" + id + ")");
+ // Only one category filter at a time
+ m_filterSet.removeMatching(function(f) { return f.type === 'category' });
+ if (id !== '') m_filterSet.add(categoryFilter(id));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitTarget = function(id) {
+ log("delimitTarget(id=" + id + ")");
+ m_filterSet.removeMatching(function(f) { return f.type === 'target' });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitQuery = function(field, value) {
+ log("delimitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.removeMatching(function(f) { return f.type == 'field' &&
+ field == f.field && value == f.value });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.showPage = function(pageNum) {
+ m_currentPage = pageNum;
+ m_paz.showPage(m_currentPage - 1);
+ };
+
+
+ that.pagerNext = function() {
+ if (m_totalRecordCount - m_perpage*m_currentPage > 0) {
+ m_paz.showNext();
+ m_currentPage++;
+ }
+ };
+
+
+ that.pagerPrev = function() {
+ if (m_paz.showPrev() != false)
+ m_currentPage--;
+ };
+
+
+ that.reShow = function() {
+ resetPage();
+ m_paz.show(0, m_perpage, m_sortOrder);
+ };
+
+
+ function resetPage() {
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
+ m_gotRecords = false;
+ }
+ that.resetPage = resetPage;
+
+
+ function newSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ log("newSearch: " + query);
+
+ if (config.use_service_proxy && !mkws.authenticated) {
+ alert("searching before authentication");
+ return;
+ }
+
+ m_filterSet.removeMatching(function(f) { return f.type !== 'category' });
+ triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery);
+ switchView('records'); // In case it's configured to start off as hidden
+ m_submitted = true;
+ }
+ that.newSearch = newSearch;
+
+
+ function triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ resetPage();
+ queue("navi").publish();
+
+ // Continue to use previous query/sort-order unless new ones are specified
+ if (query) m_query = query;
+ if (sortOrder) m_sortOrder = sortOrder;
+ if (perpage) m_perpage = perpage;
+ if (targets) m_filterSet.add(targetFilter(targets, targets));
+
+ var pp2filter = m_filterSet.pp2filter();
+ var pp2limit = m_filterSet.pp2limit(limit);
+ var pp2catLimit = m_filterSet.pp2catLimit();
+ if (pp2catLimit) {
+ pp2filter = pp2filter ? pp2filter + "," + pp2catLimit : pp2catLimit;
+ }
+
+ var params = {};
+ if (pp2limit) params.limit = pp2limit;
+ if (maxrecs) params.maxrecs = maxrecs;
+ if (torusquery) {
+ if (!mkws.config.use_service_proxy)
+ alert("can't narrow search by torusquery when not authenticated");
+ params.torusquery = torusquery;
+ }
+
+ log("triggerSearch(" + m_query + "): filters = " + m_filterSet.toJSON() + ", " +
+ "pp2filter = " + pp2filter + ", params = " + $.toJSON(params));
+
+ m_paz.search(m_query, m_perpage, m_sortOrder, pp2filter, undefined, params);
+ }
+
+ // fetch record details to be retrieved from the record queue
+ that.fetchDetails = function(recId) {
+ log("fetchDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // switching view between targets and records
+ function switchView(view) {
+ var targets = widgetNode('targets');
+ var results = widgetNode('results') || widgetNode('records');
+ var blanket = widgetNode('blanket');
+ var motd = widgetNode('motd');
+
+ switch(view) {
+ case 'targets':
+ if (targets) $(targets).show();
+ if (results) $(results).hide();
+ if (blanket) $(blanket).hide();
+ if (motd) $(motd).hide();
+ break;
+ case 'records':
+ if (targets) $(targets).hide();
+ if (results) $(results).show();
+ if (blanket) $(blanket).show();
+ if (motd) $(motd).hide();
+ break;
+ default:
+ alert("Unknown view '" + view + "'");
+ }
+ }
+ that.switchView = switchView;
+
+
+ // detailed record drawing
+ that.showDetails = function(recId) {
+ var oldRecordId = m_currentRecordId;
+ m_currentRecordId = recId;
+
+ // remove current detailed view if any
+ findnode('#' + recordDetailsId(oldRecordId)).remove();
+
+ // if the same clicked, just hide
+ if (recId == oldRecordId) {
+ m_currentRecordId = '';
+ m_currentRecordData = null;
+ return;
+ }
+ // request the record
+ log("showDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // Finds the node of the specified class within the current team
+ function findnode(selector, teamName) {
+ teamName = teamName || m_teamName;
+
+ if (teamName === 'AUTO') {
+ selector = (selector + '.mkws-team-' + teamName + ',' +
+ selector + ':not([class^="mkws-team"],[class*=" mkws-team"])');
+ } else {
+ selector = selector + '.mkws-team-' + teamName;
+ }
+
+ var node = $(selector);
+ //log('findnode(' + selector + ') found ' + node.length + ' nodes');
+ return node;
+ }
+
+
+ function widgetNode(type) {
+ var w = that.widget(type);
+ return w ? w.node : undefined;
+ }
+
+ function renderDetails(data, marker) {
+ var template = loadTemplate("details");
+ var details = template(data);
+ return '<div class="mkws-details mkwsDetails mkwsTeam_' + m_teamName + '" ' +
+ 'id="' + recordDetailsId(data.recid[0]) + '">' + details + '</div>';
+ }
+ that.renderDetails = renderDetails;
+
+
+ that.registerTemplate = function(name, text) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerTemplate old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+ m_templateText[name] = text;
+ };
+
+
+ function loadTemplate(name, fallbackString) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning loadTemplate: old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ var template = m_template[name];
+ if (template === undefined && Handlebars.compile) {
+ var source;
+ var node = $(".mkws-template-" + name + " .mkws-team-" + that.name());
+ if (node && node.length < 1) {
+ node = $(".mkws-template-" + name);
+ }
+ if (node) source = node.html();
+ if (!source) source = m_templateText[name];
+ if (source) {
+ template = Handlebars.compile(source);
+ log("compiled template '" + name + "'");
+ }
+ }
+ //if (template === undefined) template = mkws_templatesbyteam[m_teamName][name];
+ if (template === undefined && Handlebars.templates) {
+ template = Handlebars.templates["mkws-template-" + name];
+ }
+ if (template === undefined && mkws.defaultTemplates) {
+ template = mkws.defaultTemplates[name];
+ }
+ if (template) {
+ m_template[name] = template;
+ return template;
+ }
+ else {
+ log("No MKWS template for " + name);
+ return null;
+ }
+ }
+ that.loadTemplate = loadTemplate;
+
+
+ that.addWidget = function(w) {
+ if (m_widgets[w.type] === undefined) {
+ m_widgets[w.type] = [ w ];
+ } else {
+ m_widgets[w.type].push(w);
+ }
+ }
+
+ that.widget = function(type) {
+ var list = m_widgets[type];
+
+ if (!list)
+ return undefined;
+ if (list.length > 1) {
+ alert("widget('" + type + "') finds " + list.length + " widgets: using first");
+ }
+ return list[0];
+ }
+
+ that.visitWidgets = function(callback) {
+ for (var type in m_widgets) {
+ var list = m_widgets[type];
+ for (var i = 0; i < list.length; i++) {
+ var res = callback(type, list[i]);
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ }
+ return undefined;
+ }
+
+
+ return that;
+};
+// Factory function for sets of filters.
+function filterSet(team) {
+ var m_team = team;
+ var m_list = [];
+
+ var that = {};
+
+ that.toJSON = function() {
+ return mkws.$.toJSON(m_list);
+ };
+
+ that.add = function(filter) {
+ m_list.push(filter);
+ };
+
+ that.visitTargets = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'target') {
+ callback(filter.id, filter.name);
+ }
+ }
+ };
+
+ that.visitFields = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'field') {
+ callback(filter.field, filter.value);
+ }
+ }
+ };
+
+ that.visitCategories = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'category') {
+ callback(filter.id);
+ }
+ }
+ };
+
+ that.removeMatching = function(matchFn) {
+ var newList = [];
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (matchFn(filter)) {
+ m_team.log("removeMatching: removing filter " + mkws.$.toJSON(filter));
+ } else {
+ m_team.log("removeMatching: keeping filter " + mkws.$.toJSON(filter));
+ newList.push(filter);
+ }
+ }
+ m_list = newList;
+ };
+
+ that.targetFiltered = function(id) {
+ for (var i = 0; i < m_list.length; i++) {
+ if (m_list[i].type === 'target' ||
+ m_list[i].id === 'pz:id=' + id) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ that.pp2filter = function() {
+ var res = "";
+
+ that.visitTargets(function(id, name) {
+ if (res) res += ",";
+ if (id.match(/^[a-z:]+[=~]/)) {
+ m_team.log("filter '" + id + "' already begins with SETTING OP");
+ } else {
+ id = 'pz:id=' + id;
+ }
+ res += id;
+ });
+
+ return res;
+ };
+
+ that.pp2limit = function(initial) {
+ var res = initial || "";
+
+ that.visitFields(function(field, value) {
+ if (res) res += ",";
+ res += field + "=" + value.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ that.pp2catLimit = function() {
+ var res = "";
+
+ that.visitCategories(function(id) {
+ if (res) res += ",";
+ res += "category~" + id.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ return that;
+}
+
+
+// Factory functions for filters. These can be of several types.
+function targetFilter(id, name) {
+ return {
+ type: 'target',
+ id: id,
+ name: name
+ };
+}
+
+function fieldFilter(field, value) {
+ return {
+ type: 'field',
+ field: field,
+ value: value
+ };
+}
+
+function categoryFilter(id) {
+ return {
+ type: 'category',
+ id: id
+ };
+}
+// Factory function for widget objects.
+mkws.makeWidget = function($, team, type, node) {
+ // Static register of attributes that do not contribute to config
+ var ignoreAttrs = {
+ id:1, 'class':1, style:1, name:1, action:1, type:1, size:1,
+ value:1, width:1, valign:1
+ };
+
+ var that = {
+ team: team,
+ type: type,
+ node: $(node),
+ config: mkws.objectInheritingFrom(team.config)
+ };
+
+ function log(s) {
+ team.log(s);
+ }
+ that.log = log;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + type + ']';
+ };
+
+ that.value = function() {
+ return node.value;
+ };
+
+ // Returns the HTML of a subwidget of the specified type. It gets
+ // the same attributes at the parent widget that invokes this
+ // function, except where overrides are passed in. If defaults are
+ // also provided, then these are used when the parent widget
+ // provides no values.
+ that.subwidget = function(type, overrides, defaults) {
+ var attrs = { _team: team.name() };
+
+ // Copy locally-set properties from the parent widget
+ for (var name in this.config) {
+ if (this.config.hasOwnProperty(name)) {
+ attrs[name] = this.config[name];
+ log(this + " copied property " + name + "='" + attrs[name] + "' to " + type + " subwidget");
+ }
+ }
+
+ for (var name in overrides) {
+ log(this + " overrode property " + name + "='" + overrides[name] + "' (was '" + attrs[name] + "') for " + type + " subwidget");
+ attrs[name] = overrides[name];
+ }
+
+ if (defaults) {
+ for (var name in defaults) {
+ if (!attrs[name]) {
+ attrs[name] = defaults[name];
+ log(this + " fell back to default property " + name + "='" + attrs[name] + "' for " + type + " subwidget");
+ }
+ }
+ }
+
+ var s = [];
+ s.push('<div class="mkws', type, ' mkws-team-', attrs._team, '"');
+ for (var name in attrs) {
+ if (name !== '_team')
+ s.push(' ', name, '="', attrs[name], '"');
+ }
+ s.push('></div>');
+ return s.join('');
+ };
+
+ function expandValue(val) {
+ if (val.match(/^!param!/)) {
+ var param = val.replace(/^!param!/, '');
+ val = mkws.getParameterByName(param);
+ log("obtained val '" + val + "' from param '" + param + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + param + "' parameter");
+ }
+ } else if (val.match(/^!path!/)) {
+ var index = val.replace(/^!path!/, '');
+ var path = window.location.pathname.split('/');
+ val = path[path.length - index];
+ log("obtained val '" + val + "' from path-component '" + index + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the path-component " + index);
+ }
+ } else if (val.match(/^!var!/)) {
+ var name = val.replace(/^!var!/, '');
+ val = window[name]; // It's ridiculous that this works
+ log("obtained val '" + val + "' from variable '" + name + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + name + "' variable");
+ }
+ }
+ return val;
+ };
+
+ // Utility function for use by all widgets that can invoke autosearch.
+ that.autosearch = function() {
+ var that = this;
+ var query = this.config.autosearch;
+ if (query) {
+ var old = this.team.config.query;
+ if (!old) {
+ // Stash this for subsequent inspection
+ this.team.config.query = query;
+ } else if (old === query) {
+ this.log("duplicate autosearch: '" + query + "': ignoring");
+ return;
+ } else {
+ this.log("conflicting autosearch: '" + query + "' vs '" + old + "': ignoring");
+ return;
+ }
+
+ this.team.queue("ready").subscribe(function() {
+ // Postpone testing for the configuration items: these are not
+ // yet set for Record subclass widgets that fill them in in the
+ // subclass, as widget.autosearch is called in the superclass,
+ // before the subclass fiddles with the configuration.
+ var sortOrder = that.config.sort;
+ var maxrecs = that.config.maxrecs;
+ var perpage = that.config.perpage;
+ var limit = that.config.limit;
+ var targets = that.config.targets;
+ var targetfilter = that.config.targetfilter;
+ var target = that.config.target;
+ if (target) targetfilter = 'udb=="' + target + '"';
+
+ var s = "running auto search: '" + query + "'";
+ if (sortOrder) s += " sorted by '" + sortOrder + "'";
+ if (maxrecs) s += " restricted to " + maxrecs + " records";
+ if (perpage) s += " with " + perpage + " per page";
+ if (limit) s += " limited by '" + limit + "'";
+ if (targets) s += " in targets '" + targets + "'";
+ if (targetfilter) s += " constrained by targetfilter '" + targetfilter + "'";
+ that.log(s);
+
+ that.team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter);
+ });
+ }
+ };
+
+ // Utility function for all widgets that want to hide in narrow windows
+ that.hideWhenNarrow = function() {
+ var that = this;
+ this.team.queue("resize-narrow").subscribe(function(n) {
+ that.node.hide();
+ });
+ this.team.queue("resize-wide").subscribe(function(n) {
+ that.node.show();
+ });
+ };
+
+
+ for (var i = 0; i < node.attributes.length; i++) {
+ var a = node.attributes[i];
+ var val = expandValue(a.value);
+ if (a.name === 'data-mkws-config') {
+ // Treat as a JSON fragment configuring just this widget
+ log(node + ": parsing config fragment '" + val + "'");
+ var data;
+ try {
+ data = $.parseJSON(val);
+ for (var key in data) {
+ log(node + ": adding config element " + key + "='" + data[key] + "'");
+ that.config[key] = data[key];
+ }
+ } catch (err) {
+ alert("Can't parse " + node + " data-mkws-config as JSON: " + val);
+ }
+ } else if (a.name.match (/^data-mkws-/)) {
+ var name = a.name.replace(/^data-mkws-/, '')
+ that.config[name] = val;
+ log(that + ": set data-mkws attribute " + name + "='" + val + "'");
+ } else if (!ignoreAttrs[a.name]) {
+ that.config[a.name] = val;
+ log(that + ": set regular attribute " + a.name + "='" + val + "'");
+ }
+ }
+
+ var fn = mkws.promotionFunction(type);
+ if (fn) {
+ fn.call(that);
+ log("made " + type + " widget(node=" + node + ")");
+ } else if (type.match(/-Container-(narrow|wide)$/)) {
+ // Not really a widget: no need to log its lack of promotion
+ } else {
+ log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")");
+ }
+
+ return that;
+};
+(function($) { // jQuery wrapper
+
+// Functions follow for promoting the regular widget object into
+// widgets of specific types. These could be moved into their own
+// source files.
+
+
+mkws.registerWidgetType('targets', function() {
+ if (!this.config.show_switch) return;
+ var that = this;
+
+ this.node.html('No information available yet.');
+ this.node.css("display", "none");
+
+ this.team.queue("targets").subscribe(function(data) {
+ // There is a bug in pz2.js wherein it makes each data object an array but
+ // simply assigns properties to it.
+ // TODO: remove this when PAZ-946 is addressed.
+ var cleandata = [];
+ for (var i = 0; i < data.length; i++) {
+ var cur = {};
+ cur.id = data[i].id;
+ cur.hits = data[i].hits;
+ cur.diagnostic = data[i].diagnostic;
+ cur.message = data[i].message;
+ cur.records = data[i].records;
+ cur.state = data[i].state;
+ cleandata.push(cur);
+ }
+
+ var template = that.team.loadTemplate(that.config.template || "targets");
+ that.node.html(template({data: cleandata}));
+ });
+});
+
+
+mkws.registerWidgetType('stat', function() {
+ var that = this;
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "stat");
+ that.node.html(template(data));
+ });
+});
+
+
+mkws.registerWidgetType('pager', function() {
+ var that = this;
+ var M = mkws.M;
+
+ this.team.queue("pager").subscribe(function(data) {
+ var teamName = that.team.name();
+ var output = {};
+ output.first = data.start + 1;
+ output.last = data.start + data.num;
+ output.count = data.merged;
+ output.found = data.total;
+
+ //client indexes pages from 1 but pz2 from 0
+ var onsides = 5;
+ var pages = Math.ceil(that.team.totalRecordCount() / that.team.perpage());
+ var currentPage = that.team.currentPage();
+
+ var firstClkbl = (currentPage - onsides > 0)
+ ? currentPage - onsides
+ : 1;
+ var lastClkbl = firstClkbl + 2*onsides < pages
+ ? firstClkbl + 2*onsides
+ : pages;
+
+ if (firstClkbl > 1) output.morePrev = true;
+ if (lastClkbl < pages) output.moreNext = true;
+
+ if (currentPage > 1) output.prevClick = "mkws.pagerPrev(\'" + teamName + "\');";
+
+ output.pages = [];
+ for(var i = firstClkbl; i <= lastClkbl; i++) {
+ var o = {};
+ o.number = i;
+ if (i !== currentPage) {
+ o.click = "mkws.showPage(\'" + teamName + "\', " + i + ");";
+ }
+ output.pages.push(o);
+ }
+
+ if (pages - currentPage > 0) output.nextClick = "mkws.pagerNext(\'" + teamName + "\')";
+
+ var template = that.team.loadTemplate(that.config.template || "pager");
+ that.node.html(template(output));
+ });
+});
+
+mkws.registerWidgetType('details', function() {
+ var that = this;
+ var recid = that.node.attr("data-mkws-recid");
+ if (this.team.gotRecords()) {
+ that.team.fetchDetails(recid);
+ } else {
+ this.team.queue("firstrecords").subscribe(function() {
+ that.team.fetchDetails(recid);
+ });
+ }
+ this.team.queue("record").subscribe(function(data) {
+ if ($.inArray(recid, data.recid) > -1) {
+ var template = that.team.loadTemplate(that.config.template || "details");
+ that.node.html(template(data));
+ }
+ });
+});
+
+mkws.registerWidgetType('records', function() {
+ var that = this;
+ var team = this.team;
+
+ this.team.queue("records").subscribe(function(data) {
+ for (var i = 0; i < data.hits.length; i++) {
+ var hit = data.hits[i];
+ hit.detailLinkId = team.recordElementId(hit.recid[0]);
+ hit.detailClick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;";
+ hit.containerClass = "mkws-summary mkwsSummary mkws-team-" + team.name();
+ hit.containerClass += " " + hit.detailLinkId;
+ // ### At some point, we may be able to move the
+ // m_currentRecordId and m_currentRecordData members
+ // from the team object into this widget.
+ if (hit.recid == team.currentRecordId()) {
+ if (team.currentRecordData()) {
+ hit.renderedDetails = team.renderDetails(team.currentRecordData());
+ }
+ }
+ }
+ var template = team.loadTemplate(that.config.template || "records");
+ var summaryPartial = team.loadTemplate(that.config['summary-template'] || "summary");
+ var tdata = $.extend({}, {"hits": data.hits}, that.config.template_vars);
+ that.node.html(template(tdata, {"partials":{"summary":summaryPartial}}));
+ });
+
+ that.autosearch();
+});
+
+
+mkws.registerWidgetType('navi', function() {
+ var that = this;
+ var teamName = this.team.name();
+
+ this.team.queue("navi").subscribe(function() {
+ var filters = that.team.filters();
+ var output = {filters:[]};
+
+ filters.visitTargets(function(id, name) {
+ var cur = {};
+ cur.facet = 'source';
+ cur.value = name;
+ cur.click = "mkws.delimitTarget('" + teamName + "', '" + id + "'); return false;";
+ output.filters.push(cur);
+ });
+
+ filters.visitFields(function(field, value) {
+ var cur = {};
+ cur.facet = field;
+ cur.value = value;
+ cur.click = "mkws.delimitQuery('" + teamName + "', '" + field + "', '" + value + "'" + ");return false;";
+ output.filters.push(cur);
+ });
+
+ var template = that.team.loadTemplate(that.config.template || "navi");
+ that.node.html(template(output));
+ });
+});
+
+
+// It seems this and the Perpage widget doen't need to subscribe to
+// anything, since they produce events rather than consuming them.
+//
+mkws.registerWidgetType('sort', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_sortOrder(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('per-page', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_perpage(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('done', function() {
+ var that = this;
+ this.team.queue("complete").subscribe(function(n) {
+ var template = that.team.loadTemplate(that.config.template || "done");
+ that.node.html(template({count: n}));
+ });
+});
+
+
+mkws.registerWidgetType('switch', function() {
+ if (!this.config.show_switch) return;
+ var tname = this.team.name();
+ var output = {};
+ output.recordClick = "mkws.switchView(\'" + tname + "\', \'records\')";
+ output.targetClick = "mkws.switchView(\'" + tname + "\', \'targets\')";
+ var template = this.team.loadTemplate(this.config.template || "switch");
+ this.node.html(template(output));
+ this.hideWhenNarrow();
+});
+
+
+mkws.registerWidgetType('search', function() {
+ var output = {};
+ output.team = this.team.name();
+ var template = this.team.loadTemplate(this.config.template || "search");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('search-form', function() {
+ var team = this.team;
+ this.node.submit(function() {
+ var val = team.widget('query').value();
+ team.newSearch(val);
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('results', function() {
+ var template = this.team.loadTemplate(this.config.template || "results");
+ this.node.html(template({team: this.team.name()}));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('ranking', function() {
+ var output = {};
+ output.perPage = [];
+ output.sort = [];
+ output.team = this.team.name();
+ output.showSort = this.config.show_sort;
+ output.showPerPage = this.config.show_perpage;
+
+ var order = this.team.sortOrder();
+ this.log("making sort, sortOrder = '" + order + "'");
+ for (var i = 0; i < this.config.sort_options.length; i++) {
+ var cur = {};
+ var opt = this.config.sort_options[i];
+ cur.key = opt[0];
+ cur.label = opt.length == 1 ? opt[0] : opt[1];
+ if (order == cur.key || order == cur.label) cur.selected = true;
+ output.sort.push(cur);
+ }
+
+ var perpage = this.team.perpage();
+ this.log("making perpage, perpage = " + perpage);
+ for(var i = 0; i < this.config.perpage_options.length; i++) {
+ var cur = {};
+ cur.perPage = this.config.perpage_options[i];
+ if (cur.perPage == perpage) cur.selected = true;
+ output.perPage.push(cur);
+ }
+
+ var template = this.team.loadTemplate(this.config.template || "ranking");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('lang', function() {
+ // dynamic URL or static page? /path/foo?query=test
+ /* create locale language menu */
+ if (!this.config.show_lang) return;
+
+ var lang_default = "en";
+ var lang = this.config.lang || lang_default;
+ var list = [];
+
+ /* display a list of configured languages, or all */
+ var lang_options = this.config.lang_options;
+ var toBeIncluded = {};
+ for (var i = 0; i < lang_options.length; i++) {
+ toBeIncluded[lang_options[i]] = true;
+ }
+
+ for (var k in mkws.locale_lang) {
+ if (toBeIncluded[k] || lang_options.length == 0) {
+ cur = {};
+ if (lang === k) cur.selected = true;
+ cur.code = k;
+ cur.url = lang_url(k);
+ list.push(cur);
+ }
+ }
+
+ // add english link
+ if (lang_options.length == 0 || toBeIncluded[lang_default]) {
+ cur = {};
+ if (lang === lang_default) cur.selected = true;
+ cur.code = lang_default;
+ cur.url = lang_url(lang_default);
+ list.push(cur);
+ }
+
+ this.log("language menu: " + list.join(", "));
+
+ var template = this.team.loadTemplate(this.config.template || "lang");
+ this.node.html(template({languages: list}));
+ this.hideWhenNarrow();
+
+ // set or re-set "lang" URL parameter
+ function lang_url(lang) {
+ var query = location.search;
+ // no query parameters? done
+ if (!query) {
+ return "?lang=" + lang;
+ }
+
+ // parameter does not exist
+ if (!query.match(/[\?&]lang=/)) {
+ return query + "&lang=" + lang;
+ }
+
+ // replace existing parameter
+ query = query.replace(/\?lang=([^&#;]*)/, "?lang=" + lang);
+ query = query.replace(/\&lang=([^&#;]*)/, "&lang=" + lang);
+ return query;
+ }
+});
+
+
+mkws.registerWidgetType('motd', function() {
+ var container = this.team.widget('motd-container');
+ if (container) {
+ // Move the MOTD from the provided element down into the container
+ this.node.appendTo(container.node);
+ }
+});
+
+
+// This widget has no functionality of its own, but its configuration
+// is copied up into its team, allowing it to affect other widgets in
+// the team.
+//
+mkws.registerWidgetType('config', function() {
+ var c = this.config;
+ for (var name in c) {
+ if (c.hasOwnProperty(name)) {
+ this.team.config[name] = c[name];
+ this.log(this + " copied property " + name + "='" + c[name] + "' up to team");
+ }
+ }
+});
+
+
+mkws.registerWidgetType('progress', function() {
+ var that = this;
+ this.node.hide();
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "progress");
+ that.node.html(template({
+ done: data.clients - data.activeclients,
+ waiting: data.activeclients
+ }));
+ that.node.show();
+ });
+});
+
+
+// Some elements have mkws* classes that makes them appear as widgets
+// -- for example, because we want to style them using CSS -- but have
+// no actual functionality. We register these to prevent ignorable
+// warnings when they occur.
+
+mkws.registerWidgetType('query', function() {});
+mkws.registerWidgetType('motd-container', function() {});
+mkws.registerWidgetType('button', function() {});
+
+
+})(mkws.$); // jQuery wrapper
+mkws.registerWidgetType('facets', function() {
+ // Initially hide the facets; display when we get results
+ var that = this;
+ var team = this.team;
+ team.queue("facets").subscribe(function(data) {
+ that.node.addClass("active");
+ });
+
+ var template = team.loadTemplate(this.config.template || "facets");
+ this.node.html(template({
+ team: team.name(),
+ facets: this.config.facets
+ }));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('facet', function() {
+ var facetConfig = {
+ xtargets: [ "Sources", 16, false ],
+ subject: [ "Subjects", 10, true ],
+ author: [ "Authors", 10, true ]
+ }
+ var that = this;
+ var team = this.team;
+ var name = that.config.facet;
+ var ref = facetConfig[name] || [ "Unknown", 10, true ];
+ var caption = this.config['facet_caption_' + name] || ref[0];
+ var max = parseInt(this.config['facet_max_' + name] || ref[1]);
+ var pzIndex = ref[2] ? name : null;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + that.type + '(' + name + ')]';
+ };
+
+ team.queue("facets").subscribe(function(data) {
+ data = data[name];
+ var terms = [];
+ var teamName = team.name();
+ for (var i = 0; i < data.length && i < max; i++) {
+ var linkdata = "";
+ var action = "";
+ if (!pzIndex) {
+ // Special case: target selection
+ linkdata += ('target_id='+data[i].id+' ');
+ if (!team.targetFiltered(data[i].id)) {
+ action = 'mkws.limitTarget(\'' + teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+ }
+ } else {
+ action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
+ }
+ linkdata += 'onclick="' + action + ';return false;"';
+ terms.push({
+ term: data[i].name,
+ field: data[i].id,
+ count: data[i].freq,
+ linkdata: linkdata
+ });
+ }
+ // configured template > facet specific template > default facet template
+ var template;
+ if (that.config.template) {
+ template = team.loadTemplate(that.config.template);
+ } else {
+ template = team.loadTemplate("facet-" + name);
+ if (template) {
+ that.log("Using facet-" + name + " template.")
+ } else {
+ that.log("No " + name + " specific template, using default.")
+ template = team.loadTemplate("facet");
+ }
+ }
+ that.node.html(template({
+ name: name,
+ caption: caption,
+ query: that.config.query,
+ terms: terms
+ }));
+ });
+ this.autosearch();
+});
+mkws.registerWidgetType('auth-name', function() {
+ var that = this;
+
+ this.team.queue("authenticated").subscribe(function(authName) {
+ that.node.html(authName);
+ });
+});
+mkws.registerWidgetType('categories', function() {
+ var that = this;
+
+ if (!mkws.authenticated) {
+ alert("can't use categories widget when not authenticated");
+ return;
+ }
+
+ this.team.queue("authenticated").subscribe(function(authName, realm) {
+ var req = new pzHttpRequest(mkws.pazpar2_url() + "?command=categories", function(err) {
+ alert("HTTP call for categories failed: " + err)
+ });
+
+ req.get(null, function(data) {
+ if (!$.isXMLDoc(data)) {
+ alert("categories response document is not XML");
+ return;
+ }
+ that.log("got categories: " + data);
+
+ var text = [];
+ text.push("Select category: ");
+ text.push("<select name='mkws-category mkwsCategory' " +
+ "onchange='mkws.limitCategory(\"" + that.team.name() + "\", this.value)'>");
+ text.push("<option value=''>[All]</option>");
+ $(data).find('category').each(function() {
+ var name = $(this).find('categoryName').text();
+ var id = $(this).find('categoryId').text();
+ text.push("<option value='", id, "'>", name, "</option>");
+ });
+ text.push("</select>");
+ that.node.html(text.join(''));
+ });
+ });
+});
+mkws.registerWidgetType('log', function() {
+ var that = this;
+
+ this.team.queue("log").subscribe(function(teamName, timestamp, message) {
+ that.node.append(teamName + ": " + timestamp + message + "<br/>");
+ });
+});
+// A widget for a record-list of a single record
+mkws.registerWidgetType('record', function() {
+ if (!this.config.maxrecs) this.config.maxrecs = 1;
+ var that = this;
+ var team = this.team;
+ team.queue("records").subscribe(function(data) {
+ var template = team.loadTemplate(that.config.template || "details");
+ var targs = mkws.$.extend({}, data.hits[0], that.config.template_vars);
+ that.node.html(template(targs));
+ });
+ that.autosearch();
+});
+
+mkws.registerWidgetType('images', function() {
+ mkws.promotionFunction('records').call(this);
+ if (!this.config.template) this.config.template = 'images';
+});
+
+mkws.registerWidgetType('google-image', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'Google_Images';
+});
+
+mkws.registerWidgetType('lolcat', function() {
+ mkws.promotionFunction('google-image').call(this);
+ if (!this.config.autosearch) this.config.autosearch = 'kitteh';
+});
+
+mkws.registerWidgetType('cover-art', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'AmazonBooks';
+});
+mkws.registerWidgetType('reference', function() {
+ mkws.promotionFunction('record').call(this);
+ if (!this.config.target) this.config.target = 'wikimedia_wikipedia_single_result';
+ if (!this.config.template) this.config.template = 'reference';
+ this.config.template_vars.paragraphs = this.config.paragraphs || 0;
+ this.config.template_vars.sentences = this.config.sentences || 0;
+});
+mkws.registerWidgetType('builder', function() {
+ var that = this;
+ var team = this.team;
+
+ var button = mkws.$('<button/>', {
+ type: 'button',
+ text: this.config.text || "Build!"
+ });
+ this.node.append(button);
+ button.click(function() {
+ var query = team.widget('query').value();
+ var sort = team.widget('sort').value();
+ var perpage = team.widget('per-page').value();
+
+ var html = ('<div class="mkws-records mkwsRecords" ' +
+ 'autosearch="' + query + '" ' +
+ 'sort="' + sort + '" ' +
+ 'perpage="' + perpage + '"></div>');
+ var fn = that.callback || alert;
+ fn(html);
+ });
+});
+
+mkws.registerWidgetType('console-builder', function() {
+ mkws.promotionFunction('builder').call(this);
+ this.callback = function(s) {
+ console.log("generated widget: " + s);
+ }
+});
+(function() {
+ var template = Handlebars.template, templates = mkws.defaultTemplates = mkws.defaultTemplates || {};
+templates['details'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " ("
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Date", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Author", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"9":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Links", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, lambda=this.lambda, escapeExpression=this.escapeExpression, functionType="function", helperMissing=helpers.helperMissing;
+ return " <a href=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\">Link"
+ + escapeExpression(((helper = (helper = helpers['mkws-index1'] || (depth0 != null ? depth0['mkws-index1'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"mkws-index1","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Subject", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-first","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(13, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"13":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(15, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"15":function(depth0,helpers,partials,data) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(lambda(depth0, depth0));
+},"17":function(depth0,helpers,partials,data) {
+ var helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helpers['mkws-attr'] || (depth0 && depth0['mkws-attr']) || helperMissing).call(depth0, "@name", {"name":"mkws-attr","hash":{},"data":data})));
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<table>\n <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Title", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </td>\n </tr>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-if-any'] || (depth0 && depth0['mkws-if-any']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-if-any","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(12, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Locations", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(17, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n </td>\n </tr>\n</table>\n";
+},"useData":true});
+templates['done'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search complete: found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n\n";
+},"useData":true});
+templates['facet'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\"mkws-term mkwsTerm\">\n <a href=\"#\" ";
+ stack1 = ((helper = (helper = helpers.linkdata || (depth0 != null ? depth0.linkdata : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"linkdata","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + ">"
+ + escapeExpression(((helper = (helper = helpers.term || (depth0 != null ? depth0.term : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"term","hash":{},"data":data}) : helper)))
+ + "</a> <span>"
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + "</span>\n </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n<div class=\"mkws-facet-title mkwsFacetTitle\">"
+ + escapeExpression(((helper = (helper = helpers.caption || (depth0 != null ? depth0.caption : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"caption","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.terms : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['facets'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-facet mkwsFacet mkws-team-"
+ + escapeExpression(lambda((depths[1] != null ? depths[1].team : depths[1]), depth0))
+ + "\" data-mkws-facet=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\"></div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.facets : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['images'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"mkws-first","hash":{},"fn":this.program(2, data, depths),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " <br/>\n </a>\n";
+},"2":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <img src=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\" alt=\""
+ + escapeExpression(lambda((depths[1] != null ? depths[1]['md-title'] : depths[1]), depth0))
+ + "\"/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['lang'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<span>"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</span>";
+},"4":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<a href=\"";
+ stack1 = ((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\">"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</a>";
+},"6":function(depth0,helpers,partials,data) {
+ return " |\n";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.languages : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['navi'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.facet : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": <a class=\"mkws-removable mkwsRemovable\" href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">"
+ + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+ + "</a>\n ";
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"2":function(depth0,helpers,partials,data) {
+ return "|";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.filters : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['pager'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" class=\"mkws-prev mkwsPrev\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.prevClick || (depth0 != null ? depth0.prevClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"prevClick","hash":{},"data":data}) : helper)))
+ + "\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a> |\n";
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " <span class=\"mkws-prev mkwsPrev\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span> |\n";
+},"5":function(depth0,helpers,partials,data) {
+ return "...";
+ },"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.click : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.program(10, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <a href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-current-page mkwsCurrentPage\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " | <a href=\"#\" class=\"mkws-next mkwsNext\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.nextClick || (depth0 != null ? depth0.nextClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nextClick","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></a>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " | <span class=\"mkws-next mkwsNext\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></span>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<div style=\"float: right\">\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Displaying", {"name":"mkws-translate","hash":{},"data":data})))
+ + ":\n "
+ + escapeExpression(((helper = (helper = helpers.first || (depth0 != null ? depth0.first : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"first","hash":{},"data":data}) : helper)))
+ + " "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "to", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.last || (depth0 != null ? depth0.last : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"last","hash":{},"data":data}) : helper)))
+ + "\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "of", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " (";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": "
+ + escapeExpression(((helper = (helper = helpers.found || (depth0 != null ? depth0.found : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"found","hash":{},"data":data}) : helper)))
+ + ")\n</div>\n\n<div style=\"float: clear\">\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.prevClick : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.morePrev : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.pages : depth0), {"name":"each","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.moreNext : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.nextClick : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.program(14, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</div>\n";
+},"useData":true});
+templates['progress'] = template({"1":function(depth0,helpers,partials,data) {
+ return "█";
+ },"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-waiting mkws-waiting mkwsWaiting\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span>";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-done mkws-done mkwsDone\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.done : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</span>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['ranking'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Sort by", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-sort mkwsSort mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.sort : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </select>";
+},"2":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(5, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " <option value=\"";
+ stack1 = ((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\" selected=\"selected\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "and show", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-perpage mkwsPerpage mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.perPage : depth0), {"name":"each","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </select>\n ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "per page", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.program(11, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"9":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\" selected=\"selected\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"11":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "<form>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showSort : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showPerPage : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</form>\n\n";
+},"useData":true});
+templates['records'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\""
+ + escapeExpression(((helper = (helper = helpers.containerClass || (depth0 != null ? depth0.containerClass : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"containerClass","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = this.invokePartial(partials.summary, ' ', 'summary', depth0, undefined, helpers, partials, data);
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"usePartial":true,"useData":true});
+templates['reference'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<b>"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</b>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<img src=\""
+ + escapeExpression(((helper = (helper = helpers['md-thumburl'] || (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-thumburl","hash":{},"data":data}) : helper)))
+ + "\" alt=\""
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\">\n<h1><a href=\""
+ + escapeExpression(((helper = (helper = helpers['md-electronic-url'] || (depth0 != null ? depth0['md-electronic-url'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-electronic-url","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "</a></h1>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-paragraphs'] || (depth0 && depth0['mkws-paragraphs']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-description'] : depth0), (depth0 != null ? depth0.paragraphs : depth0), (depth0 != null ? depth0.sentences : depth0), {"name":"mkws-paragraphs","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n<p class=\"mkws-credit mkwsCredit\">Wikipedia</p>\n";
+},"useData":true});
+templates['results'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<table width=\"100%\" border=\"0\" cellpadding=\"6\" cellspacing=\"0\">\n <tr>\n <td class=\"mkws-facets-container-wide mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" width=\"250\" valign=\"top\">\n <div class=\"mkws-facets mkwsTermlists mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n <td class=\"mkws-motd-container mkwsMOTDContainer mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" valign=\"top\">\n <div class=\"mkws-ranking mkwsRanking mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-pager mkwsPager mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-navi mkwsNavi mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-records mkwsRecords mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\">\n <div class=\"mkws-facets-container-narrow mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n</table>\n\n";
+},"useData":true});
+templates['search'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<form name=\"mkws-search-form\" class=\"mkws-search-form mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" action=\"\">\n <input class=\"mkws-query mkws-query mkwsQuery mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"text\"/>\n <input class=\"mkws-button mkws-button mkwsButton mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"submit\" value=\"";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\"/>\n</form>\n\n";
+},"useData":true});
+templates['stat'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " -- <span class=\"mkws-client-count mkwsClientCount\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Active clients", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " : "
+ + escapeExpression(((helper = (helper = helpers.activeclients || (depth0 != null ? depth0.activeclients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"activeclients","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.clients || (depth0 != null ? depth0.clients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"clients","hash":{},"data":data}) : helper)))
+ + "</span> -- ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Retrieved records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " : "
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "\n";
+},"useData":true});
+templates['summary'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, lambda=this.lambda;
+ return " <a class=\"mkws-field-thumb\" href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n <img src=\""
+ + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? stack1['0'] : stack1), depth0))
+ + "\"/>\n </a>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-title-remainder\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-field-description\">"
+ + escapeExpression(((helper = (helper = helpers['md-description'] || (depth0 != null ? depth0['md-description'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-description","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-date\">"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " ";
+ stack1 = ((helper = (helper = helpers.renderedDetails || (depth0 != null ? depth0.renderedDetails : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"renderedDetails","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "<div class=\"mkws-field-data\">\n <span class=\"mkws-field-title\">\n <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n </a>\n </span>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-description'] : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</div>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.renderedDetails : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['switch'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.recordClick || (depth0 != null ? depth0.recordClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"recordClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</a>\n<span>|</span>\n<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.targetClick || (depth0 != null ? depth0.targetClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"targetClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Targets", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a>\n";
+},"useData":true});
+templates['targets'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <td>";
+ stack1 = ((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.message : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.state || (depth0 != null ? depth0.state : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"state","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helper = (helper = helpers.diagnostic || (depth0 != null ? depth0.diagnostic : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"diagnostic","hash":{},"data":data}) : helper)))
+ + " ("
+ + escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<table>\n <thead>\n <tr>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Target ID", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Hits", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Diags", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "State", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n </td>\n </tr>\n </thead>\n <tbody>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.data : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </tbody>\n</table>\n";
+},"useData":true});
+})();/* generic function to open results in a popup window
+ *
+ */
+
+//"use strict";
+// $(document).ready(function () {
+mkws.registerWidgetType('popup', function() {
+ var $ = mkws.$;
+ var debug = this.log;
+ debug("init popup window");
+
+ var popup_window = $(this.node);
+ // var popup_window = $(".mkws-popup mkwsPopup"); // $(document).ready()
+ if (!popup_window) {
+ debug("no popup found, skip...");
+ return;
+ } else {
+ debug("number of popup windows found: " + popup_window.length);
+ }
+
+ if (!$.ui) {
+ alert("Error: jquery-ui.js is missing, did you include it after jQuery core in the HTML file?");
+ return;
+ }
+
+ // more than one widget on a page are possible
+ popup_window.each(function(i) {
+ var that = $(this);
+
+ // all atributes are strings, convert them to integers here
+ var width = parseInt(that.attr("popup_width") || "800");
+ var height = parseInt(that.attr("popup_height") || "600");
+ var autoOpen = parseInt(that.attr("popup_autoOpen") || "0");
+ var modal = parseInt(that.attr("popup_modal") || "0");
+
+ debug("Popup parameters: width: " + width + ", height: " + height + ", autoOpen: " + autoOpen);
+ that.dialog({
+ closeOnEscape: true,
+ autoOpen: autoOpen,
+ height: height,
+ width: width,
+ modal: modal ? true : false,
+ resizable: true,
+ buttons: {
+ Cancel: function() {
+ that.dialog("close");
+ }
+ },
+ close: function() {}
+ });
+
+ // open at search query submit: "input.mkws-button mkwsButton"
+ var id_botton = that.attr("popup_button");
+ if (id_botton) {
+ $(id_botton).button().click(function() {
+ that.dialog("open");
+ });
+ }
+ });
+});
--- /dev/null
+/*! Copyright (c) 2013-2014 Index Data ApS. http://indexdata.com
+ Licence: LGPL, http://www.indexdata.com/licences/lgpl
+ created at: Tue Nov 11 13:25:11 GMT 2014
+ MKWS GIT id: b99a8c62ed342809871bdad8ec8890809ee0b726
+ pz2.js GIT id: 376322f0e5d56c9dcc23d0f7d15c90eb58342326
+*/
+/*! jQuery v1.10.0 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.0",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),r.attributes=ct(function(e){return e.innerHTML="<a href='#'></a>",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="<input>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;
+if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})
+}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(n.unit=o,n.start=+a||+r||0,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);a.finish=function(){t.stop(!0)},(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
+/**
+ * jQuery JSON plugin 2.4.0
+ *
+ * @author Brantley Harris, 2009-2011
+ * @author Timo Tijhof, 2011-2012
+ * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
+ * copyrighted 2005 by Bob Ippolito.
+ * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
+ * website's http://www.json.org/json2.js, which proclaims:
+ * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ * I uphold.
+ * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
+ */
+(function ($) {
+ 'use strict';
+
+ var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
+ meta = {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ hasOwn = Object.prototype.hasOwnProperty;
+
+ /**
+ * jQuery.toJSON
+ * Converts the given argument into a JSON representation.
+ *
+ * @param o {Mixed} The json-serializable *thing* to be converted
+ *
+ * If an object has a toJSON prototype, that will be used to get the representation.
+ * Non-integer/string keys are skipped in the object, as are keys that point to a
+ * function.
+ *
+ */
+ $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
+ if (o === null) {
+ return 'null';
+ }
+
+ var pairs, k, name, val,
+ type = $.type(o);
+
+ if (type === 'undefined') {
+ return undefined;
+ }
+
+ // Also covers instantiated Number and Boolean objects,
+ // which are typeof 'object' but thanks to $.type, we
+ // catch them here. I don't know whether it is right
+ // or wrong that instantiated primitives are not
+ // exported to JSON as an {"object":..}.
+ // We choose this path because that's what the browsers did.
+ if (type === 'number' || type === 'boolean') {
+ return String(o);
+ }
+ if (type === 'string') {
+ return $.quoteString(o);
+ }
+ if (typeof o.toJSON === 'function') {
+ return $.toJSON(o.toJSON());
+ }
+ if (type === 'date') {
+ var month = o.getUTCMonth() + 1,
+ day = o.getUTCDate(),
+ year = o.getUTCFullYear(),
+ hours = o.getUTCHours(),
+ minutes = o.getUTCMinutes(),
+ seconds = o.getUTCSeconds(),
+ milli = o.getUTCMilliseconds();
+
+ if (month < 10) {
+ month = '0' + month;
+ }
+ if (day < 10) {
+ day = '0' + day;
+ }
+ if (hours < 10) {
+ hours = '0' + hours;
+ }
+ if (minutes < 10) {
+ minutes = '0' + minutes;
+ }
+ if (seconds < 10) {
+ seconds = '0' + seconds;
+ }
+ if (milli < 100) {
+ milli = '0' + milli;
+ }
+ if (milli < 10) {
+ milli = '0' + milli;
+ }
+ return '"' + year + '-' + month + '-' + day + 'T' +
+ hours + ':' + minutes + ':' + seconds +
+ '.' + milli + 'Z"';
+ }
+
+ pairs = [];
+
+ if ($.isArray(o)) {
+ for (k = 0; k < o.length; k++) {
+ pairs.push($.toJSON(o[k]) || 'null');
+ }
+ return '[' + pairs.join(',') + ']';
+ }
+
+ // Any other object (plain object, RegExp, ..)
+ // Need to do typeof instead of $.type, because we also
+ // want to catch non-plain objects.
+ if (typeof o === 'object') {
+ for (k in o) {
+ // Only include own properties,
+ // Filter out inherited prototypes
+ if (hasOwn.call(o, k)) {
+ // Keys must be numerical or string. Skip others
+ type = typeof k;
+ if (type === 'number') {
+ name = '"' + k + '"';
+ } else if (type === 'string') {
+ name = $.quoteString(k);
+ } else {
+ continue;
+ }
+ type = typeof o[k];
+
+ // Invalid values like these return undefined
+ // from toJSON, however those object members
+ // shouldn't be included in the JSON string at all.
+ if (type !== 'function' && type !== 'undefined') {
+ val = $.toJSON(o[k]);
+ pairs.push(name + ':' + val);
+ }
+ }
+ }
+ return '{' + pairs.join(',') + '}';
+ }
+ };
+
+ /**
+ * jQuery.evalJSON
+ * Evaluates a given json string.
+ *
+ * @param str {String}
+ */
+ $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
+ };
+
+ /**
+ * jQuery.secureEvalJSON
+ * Evals JSON in a way that is *more* secure.
+ *
+ * @param str {String}
+ */
+ $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+ var filtered =
+ str
+ .replace(/\\["\\\/bfnrtu]/g, '@')
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+
+ if (/^[\],:{}\s]*$/.test(filtered)) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
+ }
+ throw new SyntaxError('Error parsing JSON, source is not valid.');
+ };
+
+ /**
+ * jQuery.quoteString
+ * Returns a string-repr of a string, escaping quotes intelligently.
+ * Mostly a support function for toJSON.
+ * Examples:
+ * >>> jQuery.quoteString('apple')
+ * "apple"
+ *
+ * >>> jQuery.quoteString('"Where are we going?", she asked.')
+ * "\"Where are we going?\", she asked."
+ */
+ $.quoteString = function (str) {
+ if (str.match(escape)) {
+ return '"' + str.replace(escape, function (a) {
+ var c = meta[a];
+ if (typeof c === 'string') {
+ return c;
+ }
+ c = a.charCodeAt();
+ return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
+ }) + '"';
+ }
+ return '"' + str + '"';
+ };
+
+}(jQuery));
+mkws_jQuery = jQuery.noConflict(true);
+/*!
+
+ handlebars v2.0.0
+
+Copyright (C) 2011-2014 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@license
+*/
+/* exported Handlebars */
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define([], factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.Handlebars = root.Handlebars || factory();
+ }
+}(this, function () {
+// handlebars/safe-string.js
+var __module4__ = (function() {
+ "use strict";
+ var __exports__;
+ // Build out our basic SafeString type
+ function SafeString(string) {
+ this.string = string;
+ }
+
+ SafeString.prototype.toString = function() {
+ return "" + this.string;
+ };
+
+ __exports__ = SafeString;
+ return __exports__;
+})();
+
+// handlebars/utils.js
+var __module3__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__ = {};
+ /*jshint -W004 */
+ var SafeString = __dependency1__;
+
+ var escape = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ };
+
+ var badChars = /[&<>"'`]/g;
+ var possible = /[&<>"'`]/;
+
+ function escapeChar(chr) {
+ return escape[chr];
+ }
+
+ function extend(obj /* , ...source */) {
+ for (var i = 1; i < arguments.length; i++) {
+ for (var key in arguments[i]) {
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
+ obj[key] = arguments[i][key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ __exports__.extend = extend;var toString = Object.prototype.toString;
+ __exports__.toString = toString;
+ // Sourced from lodash
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
+ var isFunction = function(value) {
+ return typeof value === 'function';
+ };
+ // fallback for older versions of Chrome and Safari
+ /* istanbul ignore next */
+ if (isFunction(/x/)) {
+ isFunction = function(value) {
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
+ };
+ }
+ var isFunction;
+ __exports__.isFunction = isFunction;
+ /* istanbul ignore next */
+ var isArray = Array.isArray || function(value) {
+ return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
+ };
+ __exports__.isArray = isArray;
+
+ function escapeExpression(string) {
+ // don't escape SafeStrings, since they're already safe
+ if (string instanceof SafeString) {
+ return string.toString();
+ } else if (string == null) {
+ return "";
+ } else if (!string) {
+ return string + '';
+ }
+
+ // Force a string conversion as this will be done by the append regardless and
+ // the regex test will do this transparently behind the scenes, causing issues if
+ // an object's to string has escaped characters in it.
+ string = "" + string;
+
+ if(!possible.test(string)) { return string; }
+ return string.replace(badChars, escapeChar);
+ }
+
+ __exports__.escapeExpression = escapeExpression;function isEmpty(value) {
+ if (!value && value !== 0) {
+ return true;
+ } else if (isArray(value) && value.length === 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ __exports__.isEmpty = isEmpty;function appendContextPath(contextPath, id) {
+ return (contextPath ? contextPath + '.' : '') + id;
+ }
+
+ __exports__.appendContextPath = appendContextPath;
+ return __exports__;
+})(__module4__);
+
+// handlebars/exception.js
+var __module5__ = (function() {
+ "use strict";
+ var __exports__;
+
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+ function Exception(message, node) {
+ var line;
+ if (node && node.firstLine) {
+ line = node.firstLine;
+
+ message += ' - ' + line + ':' + node.firstColumn;
+ }
+
+ var tmp = Error.prototype.constructor.call(this, message);
+
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
+ for (var idx = 0; idx < errorProps.length; idx++) {
+ this[errorProps[idx]] = tmp[errorProps[idx]];
+ }
+
+ if (line) {
+ this.lineNumber = line;
+ this.column = node.firstColumn;
+ }
+ }
+
+ Exception.prototype = new Error();
+
+ __exports__ = Exception;
+ return __exports__;
+})();
+
+// handlebars/base.js
+var __module2__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__ = {};
+ var Utils = __dependency1__;
+ var Exception = __dependency2__;
+
+ var VERSION = "2.0.0";
+ __exports__.VERSION = VERSION;var COMPILER_REVISION = 6;
+ __exports__.COMPILER_REVISION = COMPILER_REVISION;
+ var REVISION_CHANGES = {
+ 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
+ 2: '== 1.0.0-rc.3',
+ 3: '== 1.0.0-rc.4',
+ 4: '== 1.x.x',
+ 5: '== 2.0.0-alpha.x',
+ 6: '>= 2.0.0-beta.1'
+ };
+ __exports__.REVISION_CHANGES = REVISION_CHANGES;
+ var isArray = Utils.isArray,
+ isFunction = Utils.isFunction,
+ toString = Utils.toString,
+ objectType = '[object Object]';
+
+ function HandlebarsEnvironment(helpers, partials) {
+ this.helpers = helpers || {};
+ this.partials = partials || {};
+
+ registerDefaultHelpers(this);
+ }
+
+ __exports__.HandlebarsEnvironment = HandlebarsEnvironment;HandlebarsEnvironment.prototype = {
+ constructor: HandlebarsEnvironment,
+
+ logger: logger,
+ log: log,
+
+ registerHelper: function(name, fn) {
+ if (toString.call(name) === objectType) {
+ if (fn) { throw new Exception('Arg not supported with multiple helpers'); }
+ Utils.extend(this.helpers, name);
+ } else {
+ this.helpers[name] = fn;
+ }
+ },
+ unregisterHelper: function(name) {
+ delete this.helpers[name];
+ },
+
+ registerPartial: function(name, partial) {
+ if (toString.call(name) === objectType) {
+ Utils.extend(this.partials, name);
+ } else {
+ this.partials[name] = partial;
+ }
+ },
+ unregisterPartial: function(name) {
+ delete this.partials[name];
+ }
+ };
+
+ function registerDefaultHelpers(instance) {
+ instance.registerHelper('helperMissing', function(/* [args, ]options */) {
+ if(arguments.length === 1) {
+ // A missing field in a {{foo}} constuct.
+ return undefined;
+ } else {
+ // Someone is actually trying to call something, blow up.
+ throw new Exception("Missing helper: '" + arguments[arguments.length-1].name + "'");
+ }
+ });
+
+ instance.registerHelper('blockHelperMissing', function(context, options) {
+ var inverse = options.inverse,
+ fn = options.fn;
+
+ if(context === true) {
+ return fn(this);
+ } else if(context === false || context == null) {
+ return inverse(this);
+ } else if (isArray(context)) {
+ if(context.length > 0) {
+ if (options.ids) {
+ options.ids = [options.name];
+ }
+
+ return instance.helpers.each(context, options);
+ } else {
+ return inverse(this);
+ }
+ } else {
+ if (options.data && options.ids) {
+ var data = createFrame(options.data);
+ data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);
+ options = {data: data};
+ }
+
+ return fn(context, options);
+ }
+ });
+
+ instance.registerHelper('each', function(context, options) {
+ if (!options) {
+ throw new Exception('Must pass iterator to #each');
+ }
+
+ var fn = options.fn, inverse = options.inverse;
+ var i = 0, ret = "", data;
+
+ var contextPath;
+ if (options.data && options.ids) {
+ contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
+ }
+
+ if (isFunction(context)) { context = context.call(this); }
+
+ if (options.data) {
+ data = createFrame(options.data);
+ }
+
+ if(context && typeof context === 'object') {
+ if (isArray(context)) {
+ for(var j = context.length; i<j; i++) {
+ if (data) {
+ data.index = i;
+ data.first = (i === 0);
+ data.last = (i === (context.length-1));
+
+ if (contextPath) {
+ data.contextPath = contextPath + i;
+ }
+ }
+ ret = ret + fn(context[i], { data: data });
+ }
+ } else {
+ for(var key in context) {
+ if(context.hasOwnProperty(key)) {
+ if(data) {
+ data.key = key;
+ data.index = i;
+ data.first = (i === 0);
+
+ if (contextPath) {
+ data.contextPath = contextPath + key;
+ }
+ }
+ ret = ret + fn(context[key], {data: data});
+ i++;
+ }
+ }
+ }
+ }
+
+ if(i === 0){
+ ret = inverse(this);
+ }
+
+ return ret;
+ });
+
+ instance.registerHelper('if', function(conditional, options) {
+ if (isFunction(conditional)) { conditional = conditional.call(this); }
+
+ // Default behavior is to render the positive path if the value is truthy and not empty.
+ // The `includeZero` option may be set to treat the condtional as purely not empty based on the
+ // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
+ if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) {
+ return options.inverse(this);
+ } else {
+ return options.fn(this);
+ }
+ });
+
+ instance.registerHelper('unless', function(conditional, options) {
+ return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});
+ });
+
+ instance.registerHelper('with', function(context, options) {
+ if (isFunction(context)) { context = context.call(this); }
+
+ var fn = options.fn;
+
+ if (!Utils.isEmpty(context)) {
+ if (options.data && options.ids) {
+ var data = createFrame(options.data);
+ data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);
+ options = {data:data};
+ }
+
+ return fn(context, options);
+ } else {
+ return options.inverse(this);
+ }
+ });
+
+ instance.registerHelper('log', function(message, options) {
+ var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
+ instance.log(level, message);
+ });
+
+ instance.registerHelper('lookup', function(obj, field) {
+ return obj && obj[field];
+ });
+ }
+
+ var logger = {
+ methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },
+
+ // State enum
+ DEBUG: 0,
+ INFO: 1,
+ WARN: 2,
+ ERROR: 3,
+ level: 3,
+
+ // can be overridden in the host environment
+ log: function(level, message) {
+ if (logger.level <= level) {
+ var method = logger.methodMap[level];
+ if (typeof console !== 'undefined' && console[method]) {
+ console[method].call(console, message);
+ }
+ }
+ }
+ };
+ __exports__.logger = logger;
+ var log = logger.log;
+ __exports__.log = log;
+ var createFrame = function(object) {
+ var frame = Utils.extend({}, object);
+ frame._parent = object;
+ return frame;
+ };
+ __exports__.createFrame = createFrame;
+ return __exports__;
+})(__module3__, __module5__);
+
+// handlebars/runtime.js
+var __module6__ = (function(__dependency1__, __dependency2__, __dependency3__) {
+ "use strict";
+ var __exports__ = {};
+ var Utils = __dependency1__;
+ var Exception = __dependency2__;
+ var COMPILER_REVISION = __dependency3__.COMPILER_REVISION;
+ var REVISION_CHANGES = __dependency3__.REVISION_CHANGES;
+ var createFrame = __dependency3__.createFrame;
+
+ function checkRevision(compilerInfo) {
+ var compilerRevision = compilerInfo && compilerInfo[0] || 1,
+ currentRevision = COMPILER_REVISION;
+
+ if (compilerRevision !== currentRevision) {
+ if (compilerRevision < currentRevision) {
+ var runtimeVersions = REVISION_CHANGES[currentRevision],
+ compilerVersions = REVISION_CHANGES[compilerRevision];
+ throw new Exception("Template was precompiled with an older version of Handlebars than the current runtime. "+
+ "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").");
+ } else {
+ // Use the embedded version info since the runtime doesn't know about this revision yet
+ throw new Exception("Template was precompiled with a newer version of Handlebars than the current runtime. "+
+ "Please update your runtime to a newer version ("+compilerInfo[1]+").");
+ }
+ }
+ }
+
+ __exports__.checkRevision = checkRevision;// TODO: Remove this line and break up compilePartial
+
+ function template(templateSpec, env) {
+ /* istanbul ignore next */
+ if (!env) {
+ throw new Exception("No environment passed to template");
+ }
+ if (!templateSpec || !templateSpec.main) {
+ throw new Exception('Unknown template object: ' + typeof templateSpec);
+ }
+
+ // Note: Using env.VM references rather than local var references throughout this section to allow
+ // for external users to override these as psuedo-supported APIs.
+ env.VM.checkRevision(templateSpec.compiler);
+
+ var invokePartialWrapper = function(partial, indent, name, context, hash, helpers, partials, data, depths) {
+ if (hash) {
+ context = Utils.extend({}, context, hash);
+ }
+
+ var result = env.VM.invokePartial.call(this, partial, name, context, helpers, partials, data, depths);
+
+ if (result == null && env.compile) {
+ var options = { helpers: helpers, partials: partials, data: data, depths: depths };
+ partials[name] = env.compile(partial, { data: data !== undefined, compat: templateSpec.compat }, env);
+ result = partials[name](context, options);
+ }
+ if (result != null) {
+ if (indent) {
+ var lines = result.split('\n');
+ for (var i = 0, l = lines.length; i < l; i++) {
+ if (!lines[i] && i + 1 === l) {
+ break;
+ }
+
+ lines[i] = indent + lines[i];
+ }
+ result = lines.join('\n');
+ }
+ return result;
+ } else {
+ throw new Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
+ }
+ };
+
+ // Just add water
+ var container = {
+ lookup: function(depths, name) {
+ var len = depths.length;
+ for (var i = 0; i < len; i++) {
+ if (depths[i] && depths[i][name] != null) {
+ return depths[i][name];
+ }
+ }
+ },
+ lambda: function(current, context) {
+ return typeof current === 'function' ? current.call(context) : current;
+ },
+
+ escapeExpression: Utils.escapeExpression,
+ invokePartial: invokePartialWrapper,
+
+ fn: function(i) {
+ return templateSpec[i];
+ },
+
+ programs: [],
+ program: function(i, data, depths) {
+ var programWrapper = this.programs[i],
+ fn = this.fn(i);
+ if (data || depths) {
+ programWrapper = program(this, i, fn, data, depths);
+ } else if (!programWrapper) {
+ programWrapper = this.programs[i] = program(this, i, fn);
+ }
+ return programWrapper;
+ },
+
+ data: function(data, depth) {
+ while (data && depth--) {
+ data = data._parent;
+ }
+ return data;
+ },
+ merge: function(param, common) {
+ var ret = param || common;
+
+ if (param && common && (param !== common)) {
+ ret = Utils.extend({}, common, param);
+ }
+
+ return ret;
+ },
+
+ noop: env.VM.noop,
+ compilerInfo: templateSpec.compiler
+ };
+
+ var ret = function(context, options) {
+ options = options || {};
+ var data = options.data;
+
+ ret._setup(options);
+ if (!options.partial && templateSpec.useData) {
+ data = initData(context, data);
+ }
+ var depths;
+ if (templateSpec.useDepths) {
+ depths = options.depths ? [context].concat(options.depths) : [context];
+ }
+
+ return templateSpec.main.call(container, context, container.helpers, container.partials, data, depths);
+ };
+ ret.isTop = true;
+
+ ret._setup = function(options) {
+ if (!options.partial) {
+ container.helpers = container.merge(options.helpers, env.helpers);
+
+ if (templateSpec.usePartial) {
+ container.partials = container.merge(options.partials, env.partials);
+ }
+ } else {
+ container.helpers = options.helpers;
+ container.partials = options.partials;
+ }
+ };
+
+ ret._child = function(i, data, depths) {
+ if (templateSpec.useDepths && !depths) {
+ throw new Exception('must pass parent depths');
+ }
+
+ return program(container, i, templateSpec[i], data, depths);
+ };
+ return ret;
+ }
+
+ __exports__.template = template;function program(container, i, fn, data, depths) {
+ var prog = function(context, options) {
+ options = options || {};
+
+ return fn.call(container, context, container.helpers, container.partials, options.data || data, depths && [context].concat(depths));
+ };
+ prog.program = i;
+ prog.depth = depths ? depths.length : 0;
+ return prog;
+ }
+
+ __exports__.program = program;function invokePartial(partial, name, context, helpers, partials, data, depths) {
+ var options = { partial: true, helpers: helpers, partials: partials, data: data, depths: depths };
+
+ if(partial === undefined) {
+ throw new Exception("The partial " + name + " could not be found");
+ } else if(partial instanceof Function) {
+ return partial(context, options);
+ }
+ }
+
+ __exports__.invokePartial = invokePartial;function noop() { return ""; }
+
+ __exports__.noop = noop;function initData(context, data) {
+ if (!data || !('root' in data)) {
+ data = data ? createFrame(data) : {};
+ data.root = context;
+ }
+ return data;
+ }
+ return __exports__;
+})(__module3__, __module5__, __module2__);
+
+// handlebars.runtime.js
+var __module1__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
+ "use strict";
+ var __exports__;
+ /*globals Handlebars: true */
+ var base = __dependency1__;
+
+ // Each of these augment the Handlebars object. No need to setup here.
+ // (This is done to easily share code between commonjs and browse envs)
+ var SafeString = __dependency2__;
+ var Exception = __dependency3__;
+ var Utils = __dependency4__;
+ var runtime = __dependency5__;
+
+ // For compatibility and usage outside of module systems, make the Handlebars object a namespace
+ var create = function() {
+ var hb = new base.HandlebarsEnvironment();
+
+ Utils.extend(hb, base);
+ hb.SafeString = SafeString;
+ hb.Exception = Exception;
+ hb.Utils = Utils;
+ hb.escapeExpression = Utils.escapeExpression;
+
+ hb.VM = runtime;
+ hb.template = function(spec) {
+ return runtime.template(spec, hb);
+ };
+
+ return hb;
+ };
+
+ var Handlebars = create();
+ Handlebars.create = create;
+
+ Handlebars['default'] = Handlebars;
+
+ __exports__ = Handlebars;
+ return __exports__;
+})(__module2__, __module4__, __module5__, __module3__, __module6__);
+
+// handlebars/compiler/ast.js
+var __module7__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__;
+ var Exception = __dependency1__;
+
+ function LocationInfo(locInfo) {
+ locInfo = locInfo || {};
+ this.firstLine = locInfo.first_line;
+ this.firstColumn = locInfo.first_column;
+ this.lastColumn = locInfo.last_column;
+ this.lastLine = locInfo.last_line;
+ }
+
+ var AST = {
+ ProgramNode: function(statements, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "program";
+ this.statements = statements;
+ this.strip = strip;
+ },
+
+ MustacheNode: function(rawParams, hash, open, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "mustache";
+ this.strip = strip;
+
+ // Open may be a string parsed from the parser or a passed boolean flag
+ if (open != null && open.charAt) {
+ // Must use charAt to support IE pre-10
+ var escapeFlag = open.charAt(3) || open.charAt(2);
+ this.escaped = escapeFlag !== '{' && escapeFlag !== '&';
+ } else {
+ this.escaped = !!open;
+ }
+
+ if (rawParams instanceof AST.SexprNode) {
+ this.sexpr = rawParams;
+ } else {
+ // Support old AST API
+ this.sexpr = new AST.SexprNode(rawParams, hash);
+ }
+
+ // Support old AST API that stored this info in MustacheNode
+ this.id = this.sexpr.id;
+ this.params = this.sexpr.params;
+ this.hash = this.sexpr.hash;
+ this.eligibleHelper = this.sexpr.eligibleHelper;
+ this.isHelper = this.sexpr.isHelper;
+ },
+
+ SexprNode: function(rawParams, hash, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ this.type = "sexpr";
+ this.hash = hash;
+
+ var id = this.id = rawParams[0];
+ var params = this.params = rawParams.slice(1);
+
+ // a mustache is definitely a helper if:
+ // * it is an eligible helper, and
+ // * it has at least one parameter or hash segment
+ this.isHelper = !!(params.length || hash);
+
+ // a mustache is an eligible helper if:
+ // * its id is simple (a single part, not `this` or `..`)
+ this.eligibleHelper = this.isHelper || id.isSimple;
+
+ // if a mustache is an eligible helper but not a definite
+ // helper, it is ambiguous, and will be resolved in a later
+ // pass or at runtime.
+ },
+
+ PartialNode: function(partialName, context, hash, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "partial";
+ this.partialName = partialName;
+ this.context = context;
+ this.hash = hash;
+ this.strip = strip;
+
+ this.strip.inlineStandalone = true;
+ },
+
+ BlockNode: function(mustache, program, inverse, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ this.type = 'block';
+ this.mustache = mustache;
+ this.program = program;
+ this.inverse = inverse;
+ this.strip = strip;
+
+ if (inverse && !program) {
+ this.isInverse = true;
+ }
+ },
+
+ RawBlockNode: function(mustache, content, close, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ if (mustache.sexpr.id.original !== close) {
+ throw new Exception(mustache.sexpr.id.original + " doesn't match " + close, this);
+ }
+
+ content = new AST.ContentNode(content, locInfo);
+
+ this.type = 'block';
+ this.mustache = mustache;
+ this.program = new AST.ProgramNode([content], {}, locInfo);
+ },
+
+ ContentNode: function(string, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "content";
+ this.original = this.string = string;
+ },
+
+ HashNode: function(pairs, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "hash";
+ this.pairs = pairs;
+ },
+
+ IdNode: function(parts, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "ID";
+
+ var original = "",
+ dig = [],
+ depth = 0,
+ depthString = '';
+
+ for(var i=0,l=parts.length; i<l; i++) {
+ var part = parts[i].part;
+ original += (parts[i].separator || '') + part;
+
+ if (part === ".." || part === "." || part === "this") {
+ if (dig.length > 0) {
+ throw new Exception("Invalid path: " + original, this);
+ } else if (part === "..") {
+ depth++;
+ depthString += '../';
+ } else {
+ this.isScoped = true;
+ }
+ } else {
+ dig.push(part);
+ }
+ }
+
+ this.original = original;
+ this.parts = dig;
+ this.string = dig.join('.');
+ this.depth = depth;
+ this.idName = depthString + this.string;
+
+ // an ID is simple if it only has one part, and that part is not
+ // `..` or `this`.
+ this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
+
+ this.stringModeValue = this.string;
+ },
+
+ PartialNameNode: function(name, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "PARTIAL_NAME";
+ this.name = name.original;
+ },
+
+ DataNode: function(id, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "DATA";
+ this.id = id;
+ this.stringModeValue = id.stringModeValue;
+ this.idName = '@' + id.stringModeValue;
+ },
+
+ StringNode: function(string, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "STRING";
+ this.original =
+ this.string =
+ this.stringModeValue = string;
+ },
+
+ NumberNode: function(number, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "NUMBER";
+ this.original =
+ this.number = number;
+ this.stringModeValue = Number(number);
+ },
+
+ BooleanNode: function(bool, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "BOOLEAN";
+ this.bool = bool;
+ this.stringModeValue = bool === "true";
+ },
+
+ CommentNode: function(comment, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "comment";
+ this.comment = comment;
+
+ this.strip = {
+ inlineStandalone: true
+ };
+ }
+ };
+
+
+ // Must be exported as an object rather than the root of the module as the jison lexer
+ // most modify the object to operate properly.
+ __exports__ = AST;
+ return __exports__;
+})(__module5__);
+
+// handlebars/compiler/parser.js
+var __module9__ = (function() {
+ "use strict";
+ var __exports__;
+ /* jshint ignore:start */
+ /* istanbul ignore next */
+ /* Jison generated parser */
+ var handlebars = (function(){
+ var parser = {trace: function trace() { },
+ yy: {},
+ symbols_: {"error":2,"root":3,"program":4,"EOF":5,"program_repetition0":6,"statement":7,"mustache":8,"block":9,"rawBlock":10,"partial":11,"CONTENT":12,"COMMENT":13,"openRawBlock":14,"END_RAW_BLOCK":15,"OPEN_RAW_BLOCK":16,"sexpr":17,"CLOSE_RAW_BLOCK":18,"openBlock":19,"block_option0":20,"closeBlock":21,"openInverse":22,"block_option1":23,"OPEN_BLOCK":24,"CLOSE":25,"OPEN_INVERSE":26,"inverseAndProgram":27,"INVERSE":28,"OPEN_ENDBLOCK":29,"path":30,"OPEN":31,"OPEN_UNESCAPED":32,"CLOSE_UNESCAPED":33,"OPEN_PARTIAL":34,"partialName":35,"param":36,"partial_option0":37,"partial_option1":38,"sexpr_repetition0":39,"sexpr_option0":40,"dataName":41,"STRING":42,"NUMBER":43,"BOOLEAN":44,"OPEN_SEXPR":45,"CLOSE_SEXPR":46,"hash":47,"hash_repetition_plus0":48,"hashSegment":49,"ID":50,"EQUALS":51,"DATA":52,"pathSegments":53,"SEP":54,"$accept":0,"$end":1},
+ terminals_: {2:"error",5:"EOF",12:"CONTENT",13:"COMMENT",15:"END_RAW_BLOCK",16:"OPEN_RAW_BLOCK",18:"CLOSE_RAW_BLOCK",24:"OPEN_BLOCK",25:"CLOSE",26:"OPEN_INVERSE",28:"INVERSE",29:"OPEN_ENDBLOCK",31:"OPEN",32:"OPEN_UNESCAPED",33:"CLOSE_UNESCAPED",34:"OPEN_PARTIAL",42:"STRING",43:"NUMBER",44:"BOOLEAN",45:"OPEN_SEXPR",46:"CLOSE_SEXPR",50:"ID",51:"EQUALS",52:"DATA",54:"SEP"},
+ productions_: [0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[10,3],[14,3],[9,4],[9,4],[19,3],[22,3],[27,2],[21,3],[8,3],[8,3],[11,5],[11,4],[17,3],[17,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,3],[47,1],[49,3],[35,1],[35,1],[35,1],[41,2],[30,1],[53,3],[53,1],[6,0],[6,2],[20,0],[20,1],[23,0],[23,1],[37,0],[37,1],[38,0],[38,1],[39,0],[39,2],[40,0],[40,1],[48,1],[48,2]],
+ performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
+
+ var $0 = $$.length - 1;
+ switch (yystate) {
+ case 1: yy.prepareProgram($$[$0-1].statements, true); return $$[$0-1];
+ break;
+ case 2:this.$ = new yy.ProgramNode(yy.prepareProgram($$[$0]), {}, this._$);
+ break;
+ case 3:this.$ = $$[$0];
+ break;
+ case 4:this.$ = $$[$0];
+ break;
+ case 5:this.$ = $$[$0];
+ break;
+ case 6:this.$ = $$[$0];
+ break;
+ case 7:this.$ = new yy.ContentNode($$[$0], this._$);
+ break;
+ case 8:this.$ = new yy.CommentNode($$[$0], this._$);
+ break;
+ case 9:this.$ = new yy.RawBlockNode($$[$0-2], $$[$0-1], $$[$0], this._$);
+ break;
+ case 10:this.$ = new yy.MustacheNode($$[$0-1], null, '', '', this._$);
+ break;
+ case 11:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], false, this._$);
+ break;
+ case 12:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], true, this._$);
+ break;
+ case 13:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 14:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 15:this.$ = { strip: yy.stripFlags($$[$0-1], $$[$0-1]), program: $$[$0] };
+ break;
+ case 16:this.$ = {path: $$[$0-1], strip: yy.stripFlags($$[$0-2], $$[$0])};
+ break;
+ case 17:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 18:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 19:this.$ = new yy.PartialNode($$[$0-3], $$[$0-2], $$[$0-1], yy.stripFlags($$[$0-4], $$[$0]), this._$);
+ break;
+ case 20:this.$ = new yy.PartialNode($$[$0-2], undefined, $$[$0-1], yy.stripFlags($$[$0-3], $$[$0]), this._$);
+ break;
+ case 21:this.$ = new yy.SexprNode([$$[$0-2]].concat($$[$0-1]), $$[$0], this._$);
+ break;
+ case 22:this.$ = new yy.SexprNode([$$[$0]], null, this._$);
+ break;
+ case 23:this.$ = $$[$0];
+ break;
+ case 24:this.$ = new yy.StringNode($$[$0], this._$);
+ break;
+ case 25:this.$ = new yy.NumberNode($$[$0], this._$);
+ break;
+ case 26:this.$ = new yy.BooleanNode($$[$0], this._$);
+ break;
+ case 27:this.$ = $$[$0];
+ break;
+ case 28:$$[$0-1].isHelper = true; this.$ = $$[$0-1];
+ break;
+ case 29:this.$ = new yy.HashNode($$[$0], this._$);
+ break;
+ case 30:this.$ = [$$[$0-2], $$[$0]];
+ break;
+ case 31:this.$ = new yy.PartialNameNode($$[$0], this._$);
+ break;
+ case 32:this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0], this._$), this._$);
+ break;
+ case 33:this.$ = new yy.PartialNameNode(new yy.NumberNode($$[$0], this._$));
+ break;
+ case 34:this.$ = new yy.DataNode($$[$0], this._$);
+ break;
+ case 35:this.$ = new yy.IdNode($$[$0], this._$);
+ break;
+ case 36: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2];
+ break;
+ case 37:this.$ = [{part: $$[$0]}];
+ break;
+ case 38:this.$ = [];
+ break;
+ case 39:$$[$0-1].push($$[$0]);
+ break;
+ case 48:this.$ = [];
+ break;
+ case 49:$$[$0-1].push($$[$0]);
+ break;
+ case 52:this.$ = [$$[$0]];
+ break;
+ case 53:$$[$0-1].push($$[$0]);
+ break;
+ }
+ },
+ table: [{3:1,4:2,5:[2,38],6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],31:[2,38],32:[2,38],34:[2,38]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:[1,10],13:[1,11],14:16,16:[1,20],19:14,22:15,24:[1,18],26:[1,19],28:[2,2],29:[2,2],31:[1,12],32:[1,13],34:[1,17]},{1:[2,1]},{5:[2,39],12:[2,39],13:[2,39],16:[2,39],24:[2,39],26:[2,39],28:[2,39],29:[2,39],31:[2,39],32:[2,39],34:[2,39]},{5:[2,3],12:[2,3],13:[2,3],16:[2,3],24:[2,3],26:[2,3],28:[2,3],29:[2,3],31:[2,3],32:[2,3],34:[2,3]},{5:[2,4],12:[2,4],13:[2,4],16:[2,4],24:[2,4],26:[2,4],28:[2,4],29:[2,4],31:[2,4],32:[2,4],34:[2,4]},{5:[2,5],12:[2,5],13:[2,5],16:[2,5],24:[2,5],26:[2,5],28:[2,5],29:[2,5],31:[2,5],32:[2,5],34:[2,5]},{5:[2,6],12:[2,6],13:[2,6],16:[2,6],24:[2,6],26:[2,6],28:[2,6],29:[2,6],31:[2,6],32:[2,6],34:[2,6]},{5:[2,7],12:[2,7],13:[2,7],16:[2,7],24:[2,7],26:[2,7],28:[2,7],29:[2,7],31:[2,7],32:[2,7],34:[2,7]},{5:[2,8],12:[2,8],13:[2,8],16:[2,8],24:[2,8],26:[2,8],28:[2,8],29:[2,8],31:[2,8],32:[2,8],34:[2,8]},{17:21,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:27,30:22,41:23,50:[1,26],52:[1,25],53:24},{4:28,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{4:29,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{12:[1,30]},{30:32,35:31,42:[1,33],43:[1,34],50:[1,26],53:24},{17:35,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:36,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:37,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[1,38]},{18:[2,48],25:[2,48],33:[2,48],39:39,42:[2,48],43:[2,48],44:[2,48],45:[2,48],46:[2,48],50:[2,48],52:[2,48]},{18:[2,22],25:[2,22],33:[2,22],46:[2,22]},{18:[2,35],25:[2,35],33:[2,35],42:[2,35],43:[2,35],44:[2,35],45:[2,35],46:[2,35],50:[2,35],52:[2,35],54:[1,40]},{30:41,50:[1,26],53:24},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],52:[2,37],54:[2,37]},{33:[1,42]},{20:43,27:44,28:[1,45],29:[2,40]},{23:46,27:47,28:[1,45],29:[2,42]},{15:[1,48]},{25:[2,46],30:51,36:49,38:50,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],47:57,48:58,49:60,50:[1,59],52:[1,25],53:24},{25:[2,31],42:[2,31],43:[2,31],44:[2,31],45:[2,31],50:[2,31],52:[2,31]},{25:[2,32],42:[2,32],43:[2,32],44:[2,32],45:[2,32],50:[2,32],52:[2,32]},{25:[2,33],42:[2,33],43:[2,33],44:[2,33],45:[2,33],50:[2,33],52:[2,33]},{25:[1,61]},{25:[1,62]},{18:[1,63]},{5:[2,17],12:[2,17],13:[2,17],16:[2,17],24:[2,17],26:[2,17],28:[2,17],29:[2,17],31:[2,17],32:[2,17],34:[2,17]},{18:[2,50],25:[2,50],30:51,33:[2,50],36:65,40:64,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],46:[2,50],47:66,48:58,49:60,50:[1,59],52:[1,25],53:24},{50:[1,67]},{18:[2,34],25:[2,34],33:[2,34],42:[2,34],43:[2,34],44:[2,34],45:[2,34],46:[2,34],50:[2,34],52:[2,34]},{5:[2,18],12:[2,18],13:[2,18],16:[2,18],24:[2,18],26:[2,18],28:[2,18],29:[2,18],31:[2,18],32:[2,18],34:[2,18]},{21:68,29:[1,69]},{29:[2,41]},{4:70,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{21:71,29:[1,69]},{29:[2,43]},{5:[2,9],12:[2,9],13:[2,9],16:[2,9],24:[2,9],26:[2,9],28:[2,9],29:[2,9],31:[2,9],32:[2,9],34:[2,9]},{25:[2,44],37:72,47:73,48:58,49:60,50:[1,74]},{25:[1,75]},{18:[2,23],25:[2,23],33:[2,23],42:[2,23],43:[2,23],44:[2,23],45:[2,23],46:[2,23],50:[2,23],52:[2,23]},{18:[2,24],25:[2,24],33:[2,24],42:[2,24],43:[2,24],44:[2,24],45:[2,24],46:[2,24],50:[2,24],52:[2,24]},{18:[2,25],25:[2,25],33:[2,25],42:[2,25],43:[2,25],44:[2,25],45:[2,25],46:[2,25],50:[2,25],52:[2,25]},{18:[2,26],25:[2,26],33:[2,26],42:[2,26],43:[2,26],44:[2,26],45:[2,26],46:[2,26],50:[2,26],52:[2,26]},{18:[2,27],25:[2,27],33:[2,27],42:[2,27],43:[2,27],44:[2,27],45:[2,27],46:[2,27],50:[2,27],52:[2,27]},{17:76,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[2,47]},{18:[2,29],25:[2,29],33:[2,29],46:[2,29],49:77,50:[1,74]},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],51:[1,78],52:[2,37],54:[2,37]},{18:[2,52],25:[2,52],33:[2,52],46:[2,52],50:[2,52]},{12:[2,13],13:[2,13],16:[2,13],24:[2,13],26:[2,13],28:[2,13],29:[2,13],31:[2,13],32:[2,13],34:[2,13]},{12:[2,14],13:[2,14],16:[2,14],24:[2,14],26:[2,14],28:[2,14],29:[2,14],31:[2,14],32:[2,14],34:[2,14]},{12:[2,10]},{18:[2,21],25:[2,21],33:[2,21],46:[2,21]},{18:[2,49],25:[2,49],33:[2,49],42:[2,49],43:[2,49],44:[2,49],45:[2,49],46:[2,49],50:[2,49],52:[2,49]},{18:[2,51],25:[2,51],33:[2,51],46:[2,51]},{18:[2,36],25:[2,36],33:[2,36],42:[2,36],43:[2,36],44:[2,36],45:[2,36],46:[2,36],50:[2,36],52:[2,36],54:[2,36]},{5:[2,11],12:[2,11],13:[2,11],16:[2,11],24:[2,11],26:[2,11],28:[2,11],29:[2,11],31:[2,11],32:[2,11],34:[2,11]},{30:79,50:[1,26],53:24},{29:[2,15]},{5:[2,12],12:[2,12],13:[2,12],16:[2,12],24:[2,12],26:[2,12],28:[2,12],29:[2,12],31:[2,12],32:[2,12],34:[2,12]},{25:[1,80]},{25:[2,45]},{51:[1,78]},{5:[2,20],12:[2,20],13:[2,20],16:[2,20],24:[2,20],26:[2,20],28:[2,20],29:[2,20],31:[2,20],32:[2,20],34:[2,20]},{46:[1,81]},{18:[2,53],25:[2,53],33:[2,53],46:[2,53],50:[2,53]},{30:51,36:82,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],50:[1,26],52:[1,25],53:24},{25:[1,83]},{5:[2,19],12:[2,19],13:[2,19],16:[2,19],24:[2,19],26:[2,19],28:[2,19],29:[2,19],31:[2,19],32:[2,19],34:[2,19]},{18:[2,28],25:[2,28],33:[2,28],42:[2,28],43:[2,28],44:[2,28],45:[2,28],46:[2,28],50:[2,28],52:[2,28]},{18:[2,30],25:[2,30],33:[2,30],46:[2,30],50:[2,30]},{5:[2,16],12:[2,16],13:[2,16],16:[2,16],24:[2,16],26:[2,16],28:[2,16],29:[2,16],31:[2,16],32:[2,16],34:[2,16]}],
+ defaultActions: {4:[2,1],44:[2,41],47:[2,43],57:[2,47],63:[2,10],70:[2,15],73:[2,45]},
+ parseError: function parseError(str, hash) {
+ throw new Error(str);
+ },
+ parse: function parse(input) {
+ var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+ this.yy.parser = this;
+ if (typeof this.lexer.yylloc == "undefined")
+ this.lexer.yylloc = {};
+ var yyloc = this.lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = this.lexer.options && this.lexer.options.ranges;
+ if (typeof this.yy.parseError === "function")
+ this.parseError = this.yy.parseError;
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+ function lex() {
+ var token;
+ token = self.lexer.lex() || 1;
+ if (typeof token !== "number") {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ }
+ var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == "undefined") {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === "undefined" || !action.length || !action[0]) {
+ var errStr = "";
+ if (!recovering) {
+ expected = [];
+ for (p in table[state])
+ if (this.terminals_[p] && p > 2) {
+ expected.push("'" + this.terminals_[p] + "'");
+ }
+ if (this.lexer.showPosition) {
+ errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
+ } else {
+ errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
+ }
+ this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
+ }
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext);
+ lstack.push(this.lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ yyloc = this.lexer.yylloc;
+ if (recovering > 0)
+ recovering--;
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+ if (typeof r !== "undefined") {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+ }
+ };
+ /* Jison generated lexer */
+ var lexer = (function(){
+ var lexer = ({EOF:1,
+ parseError:function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ setInput:function (input) {
+ this._input = input;
+ this._more = this._less = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
+ if (this.options.ranges) this.yylloc.range = [0,0];
+ this.offset = 0;
+ return this;
+ },
+ input:function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) this.yylloc.range[1]++;
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ unput:function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length-1);
+ this.matched = this.matched.substr(0, this.matched.length-1);
+
+ if (lines.length-1) this.yylineno -= lines.length-1;
+ var r = this.yylloc.range;
+
+ this.yylloc = {first_line: this.yylloc.first_line,
+ last_line: this.yylineno+1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ?
+ (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
+ this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ return this;
+ },
+ more:function () {
+ this._more = true;
+ return this;
+ },
+ less:function (n) {
+ this.unput(this.match.slice(n));
+ },
+ pastInput:function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+ },
+ upcomingInput:function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20-next.length);
+ }
+ return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
+ },
+ showPosition:function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c+"^";
+ },
+ next:function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) this.done = true;
+
+ var token,
+ match,
+ tempMatch,
+ index,
+ col,
+ lines;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i=0;i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (!this.options.flex) break;
+ }
+ }
+ if (match) {
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) this.yylineno += lines.length;
+ this.yylloc = {first_line: this.yylloc.last_line,
+ last_line: this.yylineno+1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
+ if (this.done && this._input) this.done = false;
+ if (token) return token;
+ else return;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
+ {text: "", token: null, line: this.yylineno});
+ }
+ },
+ lex:function lex() {
+ var r = this.next();
+ if (typeof r !== 'undefined') {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ begin:function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ popState:function popState() {
+ return this.conditionStack.pop();
+ },
+ _currentRules:function _currentRules() {
+ return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
+ },
+ topState:function () {
+ return this.conditionStack[this.conditionStack.length-2];
+ },
+ pushState:function begin(condition) {
+ this.begin(condition);
+ }});
+ lexer.options = {};
+ lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+
+
+ function strip(start, end) {
+ return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end);
+ }
+
+
+ var YYSTATE=YY_START
+ switch($avoiding_name_collisions) {
+ case 0:
+ if(yy_.yytext.slice(-2) === "\\\\") {
+ strip(0,1);
+ this.begin("mu");
+ } else if(yy_.yytext.slice(-1) === "\\") {
+ strip(0,1);
+ this.begin("emu");
+ } else {
+ this.begin("mu");
+ }
+ if(yy_.yytext) return 12;
+
+ break;
+ case 1:return 12;
+ break;
+ case 2:
+ this.popState();
+ return 12;
+
+ break;
+ case 3:
+ yy_.yytext = yy_.yytext.substr(5, yy_.yyleng-9);
+ this.popState();
+ return 15;
+
+ break;
+ case 4: return 12;
+ break;
+ case 5:strip(0,4); this.popState(); return 13;
+ break;
+ case 6:return 45;
+ break;
+ case 7:return 46;
+ break;
+ case 8: return 16;
+ break;
+ case 9:
+ this.popState();
+ this.begin('raw');
+ return 18;
+
+ break;
+ case 10:return 34;
+ break;
+ case 11:return 24;
+ break;
+ case 12:return 29;
+ break;
+ case 13:this.popState(); return 28;
+ break;
+ case 14:this.popState(); return 28;
+ break;
+ case 15:return 26;
+ break;
+ case 16:return 26;
+ break;
+ case 17:return 32;
+ break;
+ case 18:return 31;
+ break;
+ case 19:this.popState(); this.begin('com');
+ break;
+ case 20:strip(3,5); this.popState(); return 13;
+ break;
+ case 21:return 31;
+ break;
+ case 22:return 51;
+ break;
+ case 23:return 50;
+ break;
+ case 24:return 50;
+ break;
+ case 25:return 54;
+ break;
+ case 26:// ignore whitespace
+ break;
+ case 27:this.popState(); return 33;
+ break;
+ case 28:this.popState(); return 25;
+ break;
+ case 29:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 42;
+ break;
+ case 30:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 42;
+ break;
+ case 31:return 52;
+ break;
+ case 32:return 44;
+ break;
+ case 33:return 44;
+ break;
+ case 34:return 43;
+ break;
+ case 35:return 50;
+ break;
+ case 36:yy_.yytext = strip(1,2); return 50;
+ break;
+ case 37:return 'INVALID';
+ break;
+ case 38:return 5;
+ break;
+ }
+ };
+ lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
+ lexer.conditions = {"mu":{"rules":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[5],"inclusive":false},"raw":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,1,38],"inclusive":true}};
+ return lexer;})()
+ parser.lexer = lexer;
+ function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
+ return new Parser;
+ })();__exports__ = handlebars;
+ /* jshint ignore:end */
+ return __exports__;
+})();
+
+// handlebars/compiler/helpers.js
+var __module10__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__ = {};
+ var Exception = __dependency1__;
+
+ function stripFlags(open, close) {
+ return {
+ left: open.charAt(2) === '~',
+ right: close.charAt(close.length-3) === '~'
+ };
+ }
+
+ __exports__.stripFlags = stripFlags;
+ function prepareBlock(mustache, program, inverseAndProgram, close, inverted, locInfo) {
+ /*jshint -W040 */
+ if (mustache.sexpr.id.original !== close.path.original) {
+ throw new Exception(mustache.sexpr.id.original + ' doesn\'t match ' + close.path.original, mustache);
+ }
+
+ var inverse = inverseAndProgram && inverseAndProgram.program;
+
+ var strip = {
+ left: mustache.strip.left,
+ right: close.strip.right,
+
+ // Determine the standalone candiacy. Basically flag our content as being possibly standalone
+ // so our parent can determine if we actually are standalone
+ openStandalone: isNextWhitespace(program.statements),
+ closeStandalone: isPrevWhitespace((inverse || program).statements)
+ };
+
+ if (mustache.strip.right) {
+ omitRight(program.statements, null, true);
+ }
+
+ if (inverse) {
+ var inverseStrip = inverseAndProgram.strip;
+
+ if (inverseStrip.left) {
+ omitLeft(program.statements, null, true);
+ }
+ if (inverseStrip.right) {
+ omitRight(inverse.statements, null, true);
+ }
+ if (close.strip.left) {
+ omitLeft(inverse.statements, null, true);
+ }
+
+ // Find standalone else statments
+ if (isPrevWhitespace(program.statements)
+ && isNextWhitespace(inverse.statements)) {
+
+ omitLeft(program.statements);
+ omitRight(inverse.statements);
+ }
+ } else {
+ if (close.strip.left) {
+ omitLeft(program.statements, null, true);
+ }
+ }
+
+ if (inverted) {
+ return new this.BlockNode(mustache, inverse, program, strip, locInfo);
+ } else {
+ return new this.BlockNode(mustache, program, inverse, strip, locInfo);
+ }
+ }
+
+ __exports__.prepareBlock = prepareBlock;
+ function prepareProgram(statements, isRoot) {
+ for (var i = 0, l = statements.length; i < l; i++) {
+ var current = statements[i],
+ strip = current.strip;
+
+ if (!strip) {
+ continue;
+ }
+
+ var _isPrevWhitespace = isPrevWhitespace(statements, i, isRoot, current.type === 'partial'),
+ _isNextWhitespace = isNextWhitespace(statements, i, isRoot),
+
+ openStandalone = strip.openStandalone && _isPrevWhitespace,
+ closeStandalone = strip.closeStandalone && _isNextWhitespace,
+ inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
+
+ if (strip.right) {
+ omitRight(statements, i, true);
+ }
+ if (strip.left) {
+ omitLeft(statements, i, true);
+ }
+
+ if (inlineStandalone) {
+ omitRight(statements, i);
+
+ if (omitLeft(statements, i)) {
+ // If we are on a standalone node, save the indent info for partials
+ if (current.type === 'partial') {
+ current.indent = (/([ \t]+$)/).exec(statements[i-1].original) ? RegExp.$1 : '';
+ }
+ }
+ }
+ if (openStandalone) {
+ omitRight((current.program || current.inverse).statements);
+
+ // Strip out the previous content node if it's whitespace only
+ omitLeft(statements, i);
+ }
+ if (closeStandalone) {
+ // Always strip the next node
+ omitRight(statements, i);
+
+ omitLeft((current.inverse || current.program).statements);
+ }
+ }
+
+ return statements;
+ }
+
+ __exports__.prepareProgram = prepareProgram;function isPrevWhitespace(statements, i, isRoot) {
+ if (i === undefined) {
+ i = statements.length;
+ }
+
+ // Nodes that end with newlines are considered whitespace (but are special
+ // cased for strip operations)
+ var prev = statements[i-1],
+ sibling = statements[i-2];
+ if (!prev) {
+ return isRoot;
+ }
+
+ if (prev.type === 'content') {
+ return (sibling || !isRoot ? (/\r?\n\s*?$/) : (/(^|\r?\n)\s*?$/)).test(prev.original);
+ }
+ }
+ function isNextWhitespace(statements, i, isRoot) {
+ if (i === undefined) {
+ i = -1;
+ }
+
+ var next = statements[i+1],
+ sibling = statements[i+2];
+ if (!next) {
+ return isRoot;
+ }
+
+ if (next.type === 'content') {
+ return (sibling || !isRoot ? (/^\s*?\r?\n/) : (/^\s*?(\r?\n|$)/)).test(next.original);
+ }
+ }
+
+ // Marks the node to the right of the position as omitted.
+ // I.e. {{foo}}' ' will mark the ' ' node as omitted.
+ //
+ // If i is undefined, then the first child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitRight(statements, i, multiple) {
+ var current = statements[i == null ? 0 : i + 1];
+ if (!current || current.type !== 'content' || (!multiple && current.rightStripped)) {
+ return;
+ }
+
+ var original = current.string;
+ current.string = current.string.replace(multiple ? (/^\s+/) : (/^[ \t]*\r?\n?/), '');
+ current.rightStripped = current.string !== original;
+ }
+
+ // Marks the node to the left of the position as omitted.
+ // I.e. ' '{{foo}} will mark the ' ' node as omitted.
+ //
+ // If i is undefined then the last child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitLeft(statements, i, multiple) {
+ var current = statements[i == null ? statements.length - 1 : i - 1];
+ if (!current || current.type !== 'content' || (!multiple && current.leftStripped)) {
+ return;
+ }
+
+ // We omit the last node if it's whitespace only and not preceeded by a non-content node.
+ var original = current.string;
+ current.string = current.string.replace(multiple ? (/\s+$/) : (/[ \t]+$/), '');
+ current.leftStripped = current.string !== original;
+ return current.leftStripped;
+ }
+ return __exports__;
+})(__module5__);
+
+// handlebars/compiler/base.js
+var __module8__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
+ "use strict";
+ var __exports__ = {};
+ var parser = __dependency1__;
+ var AST = __dependency2__;
+ var Helpers = __dependency3__;
+ var extend = __dependency4__.extend;
+
+ __exports__.parser = parser;
+
+ var yy = {};
+ extend(yy, Helpers, AST);
+
+ function parse(input) {
+ // Just return if an already-compile AST was passed in.
+ if (input.constructor === AST.ProgramNode) { return input; }
+
+ parser.yy = yy;
+
+ return parser.parse(input);
+ }
+
+ __exports__.parse = parse;
+ return __exports__;
+})(__module9__, __module7__, __module10__, __module3__);
+
+// handlebars/compiler/compiler.js
+var __module11__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__ = {};
+ var Exception = __dependency1__;
+ var isArray = __dependency2__.isArray;
+
+ var slice = [].slice;
+
+ function Compiler() {}
+
+ __exports__.Compiler = Compiler;// the foundHelper register will disambiguate helper lookup from finding a
+ // function in a context. This is necessary for mustache compatibility, which
+ // requires that context functions in blocks are evaluated by blockHelperMissing,
+ // and then proceed as if the resulting value was provided to blockHelperMissing.
+
+ Compiler.prototype = {
+ compiler: Compiler,
+
+ equals: function(other) {
+ var len = this.opcodes.length;
+ if (other.opcodes.length !== len) {
+ return false;
+ }
+
+ for (var i = 0; i < len; i++) {
+ var opcode = this.opcodes[i],
+ otherOpcode = other.opcodes[i];
+ if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
+ return false;
+ }
+ }
+
+ // We know that length is the same between the two arrays because they are directly tied
+ // to the opcode behavior above.
+ len = this.children.length;
+ for (i = 0; i < len; i++) {
+ if (!this.children[i].equals(other.children[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ guid: 0,
+
+ compile: function(program, options) {
+ this.opcodes = [];
+ this.children = [];
+ this.depths = {list: []};
+ this.options = options;
+ this.stringParams = options.stringParams;
+ this.trackIds = options.trackIds;
+
+ // These changes will propagate to the other compiler components
+ var knownHelpers = this.options.knownHelpers;
+ this.options.knownHelpers = {
+ 'helperMissing': true,
+ 'blockHelperMissing': true,
+ 'each': true,
+ 'if': true,
+ 'unless': true,
+ 'with': true,
+ 'log': true,
+ 'lookup': true
+ };
+ if (knownHelpers) {
+ for (var name in knownHelpers) {
+ this.options.knownHelpers[name] = knownHelpers[name];
+ }
+ }
+
+ return this.accept(program);
+ },
+
+ accept: function(node) {
+ return this[node.type](node);
+ },
+
+ program: function(program) {
+ var statements = program.statements;
+
+ for(var i=0, l=statements.length; i<l; i++) {
+ this.accept(statements[i]);
+ }
+ this.isSimple = l === 1;
+
+ this.depths.list = this.depths.list.sort(function(a, b) {
+ return a - b;
+ });
+
+ return this;
+ },
+
+ compileProgram: function(program) {
+ var result = new this.compiler().compile(program, this.options);
+ var guid = this.guid++, depth;
+
+ this.usePartial = this.usePartial || result.usePartial;
+
+ this.children[guid] = result;
+
+ for(var i=0, l=result.depths.list.length; i<l; i++) {
+ depth = result.depths.list[i];
+
+ if(depth < 2) { continue; }
+ else { this.addDepth(depth - 1); }
+ }
+
+ return guid;
+ },
+
+ block: function(block) {
+ var mustache = block.mustache,
+ program = block.program,
+ inverse = block.inverse;
+
+ if (program) {
+ program = this.compileProgram(program);
+ }
+
+ if (inverse) {
+ inverse = this.compileProgram(inverse);
+ }
+
+ var sexpr = mustache.sexpr;
+ var type = this.classifySexpr(sexpr);
+
+ if (type === "helper") {
+ this.helperSexpr(sexpr, program, inverse);
+ } else if (type === "simple") {
+ this.simpleSexpr(sexpr);
+
+ // now that the simple mustache is resolved, we need to
+ // evaluate it by executing `blockHelperMissing`
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+ this.opcode('emptyHash');
+ this.opcode('blockValue', sexpr.id.original);
+ } else {
+ this.ambiguousSexpr(sexpr, program, inverse);
+
+ // now that the simple mustache is resolved, we need to
+ // evaluate it by executing `blockHelperMissing`
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+ this.opcode('emptyHash');
+ this.opcode('ambiguousBlockValue');
+ }
+
+ this.opcode('append');
+ },
+
+ hash: function(hash) {
+ var pairs = hash.pairs, i, l;
+
+ this.opcode('pushHash');
+
+ for(i=0, l=pairs.length; i<l; i++) {
+ this.pushParam(pairs[i][1]);
+ }
+ while(i--) {
+ this.opcode('assignToHash', pairs[i][0]);
+ }
+ this.opcode('popHash');
+ },
+
+ partial: function(partial) {
+ var partialName = partial.partialName;
+ this.usePartial = true;
+
+ if (partial.hash) {
+ this.accept(partial.hash);
+ } else {
+ this.opcode('push', 'undefined');
+ }
+
+ if (partial.context) {
+ this.accept(partial.context);
+ } else {
+ this.opcode('getContext', 0);
+ this.opcode('pushContext');
+ }
+
+ this.opcode('invokePartial', partialName.name, partial.indent || '');
+ this.opcode('append');
+ },
+
+ content: function(content) {
+ if (content.string) {
+ this.opcode('appendContent', content.string);
+ }
+ },
+
+ mustache: function(mustache) {
+ this.sexpr(mustache.sexpr);
+
+ if(mustache.escaped && !this.options.noEscape) {
+ this.opcode('appendEscaped');
+ } else {
+ this.opcode('append');
+ }
+ },
+
+ ambiguousSexpr: function(sexpr, program, inverse) {
+ var id = sexpr.id,
+ name = id.parts[0],
+ isBlock = program != null || inverse != null;
+
+ this.opcode('getContext', id.depth);
+
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+
+ this.ID(id);
+
+ this.opcode('invokeAmbiguous', name, isBlock);
+ },
+
+ simpleSexpr: function(sexpr) {
+ var id = sexpr.id;
+
+ if (id.type === 'DATA') {
+ this.DATA(id);
+ } else if (id.parts.length) {
+ this.ID(id);
+ } else {
+ // Simplified ID for `this`
+ this.addDepth(id.depth);
+ this.opcode('getContext', id.depth);
+ this.opcode('pushContext');
+ }
+
+ this.opcode('resolvePossibleLambda');
+ },
+
+ helperSexpr: function(sexpr, program, inverse) {
+ var params = this.setupFullMustacheParams(sexpr, program, inverse),
+ id = sexpr.id,
+ name = id.parts[0];
+
+ if (this.options.knownHelpers[name]) {
+ this.opcode('invokeKnownHelper', params.length, name);
+ } else if (this.options.knownHelpersOnly) {
+ throw new Exception("You specified knownHelpersOnly, but used the unknown helper " + name, sexpr);
+ } else {
+ id.falsy = true;
+
+ this.ID(id);
+ this.opcode('invokeHelper', params.length, id.original, id.isSimple);
+ }
+ },
+
+ sexpr: function(sexpr) {
+ var type = this.classifySexpr(sexpr);
+
+ if (type === "simple") {
+ this.simpleSexpr(sexpr);
+ } else if (type === "helper") {
+ this.helperSexpr(sexpr);
+ } else {
+ this.ambiguousSexpr(sexpr);
+ }
+ },
+
+ ID: function(id) {
+ this.addDepth(id.depth);
+ this.opcode('getContext', id.depth);
+
+ var name = id.parts[0];
+ if (!name) {
+ // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
+ this.opcode('pushContext');
+ } else {
+ this.opcode('lookupOnContext', id.parts, id.falsy, id.isScoped);
+ }
+ },
+
+ DATA: function(data) {
+ this.options.data = true;
+ this.opcode('lookupData', data.id.depth, data.id.parts);
+ },
+
+ STRING: function(string) {
+ this.opcode('pushString', string.string);
+ },
+
+ NUMBER: function(number) {
+ this.opcode('pushLiteral', number.number);
+ },
+
+ BOOLEAN: function(bool) {
+ this.opcode('pushLiteral', bool.bool);
+ },
+
+ comment: function() {},
+
+ // HELPERS
+ opcode: function(name) {
+ this.opcodes.push({ opcode: name, args: slice.call(arguments, 1) });
+ },
+
+ addDepth: function(depth) {
+ if(depth === 0) { return; }
+
+ if(!this.depths[depth]) {
+ this.depths[depth] = true;
+ this.depths.list.push(depth);
+ }
+ },
+
+ classifySexpr: function(sexpr) {
+ var isHelper = sexpr.isHelper;
+ var isEligible = sexpr.eligibleHelper;
+ var options = this.options;
+
+ // if ambiguous, we can possibly resolve the ambiguity now
+ // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.
+ if (isEligible && !isHelper) {
+ var name = sexpr.id.parts[0];
+
+ if (options.knownHelpers[name]) {
+ isHelper = true;
+ } else if (options.knownHelpersOnly) {
+ isEligible = false;
+ }
+ }
+
+ if (isHelper) { return "helper"; }
+ else if (isEligible) { return "ambiguous"; }
+ else { return "simple"; }
+ },
+
+ pushParams: function(params) {
+ for(var i=0, l=params.length; i<l; i++) {
+ this.pushParam(params[i]);
+ }
+ },
+
+ pushParam: function(val) {
+ if (this.stringParams) {
+ if(val.depth) {
+ this.addDepth(val.depth);
+ }
+ this.opcode('getContext', val.depth || 0);
+ this.opcode('pushStringParam', val.stringModeValue, val.type);
+
+ if (val.type === 'sexpr') {
+ // Subexpressions get evaluated and passed in
+ // in string params mode.
+ this.sexpr(val);
+ }
+ } else {
+ if (this.trackIds) {
+ this.opcode('pushId', val.type, val.idName || val.stringModeValue);
+ }
+ this.accept(val);
+ }
+ },
+
+ setupFullMustacheParams: function(sexpr, program, inverse) {
+ var params = sexpr.params;
+ this.pushParams(params);
+
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+
+ if (sexpr.hash) {
+ this.hash(sexpr.hash);
+ } else {
+ this.opcode('emptyHash');
+ }
+
+ return params;
+ }
+ };
+
+ function precompile(input, options, env) {
+ if (input == null || (typeof input !== 'string' && input.constructor !== env.AST.ProgramNode)) {
+ throw new Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
+ }
+
+ options = options || {};
+ if (!('data' in options)) {
+ options.data = true;
+ }
+ if (options.compat) {
+ options.useDepths = true;
+ }
+
+ var ast = env.parse(input);
+ var environment = new env.Compiler().compile(ast, options);
+ return new env.JavaScriptCompiler().compile(environment, options);
+ }
+
+ __exports__.precompile = precompile;function compile(input, options, env) {
+ if (input == null || (typeof input !== 'string' && input.constructor !== env.AST.ProgramNode)) {
+ throw new Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
+ }
+
+ options = options || {};
+
+ if (!('data' in options)) {
+ options.data = true;
+ }
+ if (options.compat) {
+ options.useDepths = true;
+ }
+
+ var compiled;
+
+ function compileInput() {
+ var ast = env.parse(input);
+ var environment = new env.Compiler().compile(ast, options);
+ var templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
+ return env.template(templateSpec);
+ }
+
+ // Template is only compiled on first use and cached after that point.
+ var ret = function(context, options) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled.call(this, context, options);
+ };
+ ret._setup = function(options) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled._setup(options);
+ };
+ ret._child = function(i, data, depths) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled._child(i, data, depths);
+ };
+ return ret;
+ }
+
+ __exports__.compile = compile;function argEquals(a, b) {
+ if (a === b) {
+ return true;
+ }
+
+ if (isArray(a) && isArray(b) && a.length === b.length) {
+ for (var i = 0; i < a.length; i++) {
+ if (!argEquals(a[i], b[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ return __exports__;
+})(__module5__, __module3__);
+
+// handlebars/compiler/javascript-compiler.js
+var __module12__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__;
+ var COMPILER_REVISION = __dependency1__.COMPILER_REVISION;
+ var REVISION_CHANGES = __dependency1__.REVISION_CHANGES;
+ var Exception = __dependency2__;
+
+ function Literal(value) {
+ this.value = value;
+ }
+
+ function JavaScriptCompiler() {}
+
+ JavaScriptCompiler.prototype = {
+ // PUBLIC API: You can override these methods in a subclass to provide
+ // alternative compiled forms for name lookup and buffering semantics
+ nameLookup: function(parent, name /* , type*/) {
+ if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
+ return parent + "." + name;
+ } else {
+ return parent + "['" + name + "']";
+ }
+ },
+ depthedLookup: function(name) {
+ this.aliases.lookup = 'this.lookup';
+
+ return 'lookup(depths, "' + name + '")';
+ },
+
+ compilerInfo: function() {
+ var revision = COMPILER_REVISION,
+ versions = REVISION_CHANGES[revision];
+ return [revision, versions];
+ },
+
+ appendToBuffer: function(string) {
+ if (this.environment.isSimple) {
+ return "return " + string + ";";
+ } else {
+ return {
+ appendToBuffer: true,
+ content: string,
+ toString: function() { return "buffer += " + string + ";"; }
+ };
+ }
+ },
+
+ initializeBuffer: function() {
+ return this.quotedString("");
+ },
+
+ namespace: "Handlebars",
+ // END PUBLIC API
+
+ compile: function(environment, options, context, asObject) {
+ this.environment = environment;
+ this.options = options;
+ this.stringParams = this.options.stringParams;
+ this.trackIds = this.options.trackIds;
+ this.precompile = !asObject;
+
+ this.name = this.environment.name;
+ this.isChild = !!context;
+ this.context = context || {
+ programs: [],
+ environments: []
+ };
+
+ this.preamble();
+
+ this.stackSlot = 0;
+ this.stackVars = [];
+ this.aliases = {};
+ this.registers = { list: [] };
+ this.hashes = [];
+ this.compileStack = [];
+ this.inlineStack = [];
+
+ this.compileChildren(environment, options);
+
+ this.useDepths = this.useDepths || environment.depths.list.length || this.options.compat;
+
+ var opcodes = environment.opcodes,
+ opcode,
+ i,
+ l;
+
+ for (i = 0, l = opcodes.length; i < l; i++) {
+ opcode = opcodes[i];
+
+ this[opcode.opcode].apply(this, opcode.args);
+ }
+
+ // Flush any trailing content that might be pending.
+ this.pushSource('');
+
+ /* istanbul ignore next */
+ if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {
+ throw new Exception('Compile completed with content left on stack');
+ }
+
+ var fn = this.createFunctionContext(asObject);
+ if (!this.isChild) {
+ var ret = {
+ compiler: this.compilerInfo(),
+ main: fn
+ };
+ var programs = this.context.programs;
+ for (i = 0, l = programs.length; i < l; i++) {
+ if (programs[i]) {
+ ret[i] = programs[i];
+ }
+ }
+
+ if (this.environment.usePartial) {
+ ret.usePartial = true;
+ }
+ if (this.options.data) {
+ ret.useData = true;
+ }
+ if (this.useDepths) {
+ ret.useDepths = true;
+ }
+ if (this.options.compat) {
+ ret.compat = true;
+ }
+
+ if (!asObject) {
+ ret.compiler = JSON.stringify(ret.compiler);
+ ret = this.objectLiteral(ret);
+ }
+
+ return ret;
+ } else {
+ return fn;
+ }
+ },
+
+ preamble: function() {
+ // track the last context pushed into place to allow skipping the
+ // getContext opcode when it would be a noop
+ this.lastContext = 0;
+ this.source = [];
+ },
+
+ createFunctionContext: function(asObject) {
+ var varDeclarations = '';
+
+ var locals = this.stackVars.concat(this.registers.list);
+ if(locals.length > 0) {
+ varDeclarations += ", " + locals.join(", ");
+ }
+
+ // Generate minimizer alias mappings
+ for (var alias in this.aliases) {
+ if (this.aliases.hasOwnProperty(alias)) {
+ varDeclarations += ', ' + alias + '=' + this.aliases[alias];
+ }
+ }
+
+ var params = ["depth0", "helpers", "partials", "data"];
+
+ if (this.useDepths) {
+ params.push('depths');
+ }
+
+ // Perform a second pass over the output to merge content when possible
+ var source = this.mergeSource(varDeclarations);
+
+ if (asObject) {
+ params.push(source);
+
+ return Function.apply(this, params);
+ } else {
+ return 'function(' + params.join(',') + ') {\n ' + source + '}';
+ }
+ },
+ mergeSource: function(varDeclarations) {
+ var source = '',
+ buffer,
+ appendOnly = !this.forceBuffer,
+ appendFirst;
+
+ for (var i = 0, len = this.source.length; i < len; i++) {
+ var line = this.source[i];
+ if (line.appendToBuffer) {
+ if (buffer) {
+ buffer = buffer + '\n + ' + line.content;
+ } else {
+ buffer = line.content;
+ }
+ } else {
+ if (buffer) {
+ if (!source) {
+ appendFirst = true;
+ source = buffer + ';\n ';
+ } else {
+ source += 'buffer += ' + buffer + ';\n ';
+ }
+ buffer = undefined;
+ }
+ source += line + '\n ';
+
+ if (!this.environment.isSimple) {
+ appendOnly = false;
+ }
+ }
+ }
+
+ if (appendOnly) {
+ if (buffer || !source) {
+ source += 'return ' + (buffer || '""') + ';\n';
+ }
+ } else {
+ varDeclarations += ", buffer = " + (appendFirst ? '' : this.initializeBuffer());
+ if (buffer) {
+ source += 'return buffer + ' + buffer + ';\n';
+ } else {
+ source += 'return buffer;\n';
+ }
+ }
+
+ if (varDeclarations) {
+ source = 'var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n ') + source;
+ }
+
+ return source;
+ },
+
+ // [blockValue]
+ //
+ // On stack, before: hash, inverse, program, value
+ // On stack, after: return value of blockHelperMissing
+ //
+ // The purpose of this opcode is to take a block of the form
+ // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and
+ // replace it on the stack with the result of properly
+ // invoking blockHelperMissing.
+ blockValue: function(name) {
+ this.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+ var params = [this.contextName(0)];
+ this.setupParams(name, 0, params);
+
+ var blockName = this.popStack();
+ params.splice(1, 0, blockName);
+
+ this.push('blockHelperMissing.call(' + params.join(', ') + ')');
+ },
+
+ // [ambiguousBlockValue]
+ //
+ // On stack, before: hash, inverse, program, value
+ // Compiler value, before: lastHelper=value of last found helper, if any
+ // On stack, after, if no lastHelper: same as [blockValue]
+ // On stack, after, if lastHelper: value
+ ambiguousBlockValue: function() {
+ this.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+ // We're being a bit cheeky and reusing the options value from the prior exec
+ var params = [this.contextName(0)];
+ this.setupParams('', 0, params, true);
+
+ this.flushInline();
+
+ var current = this.topStack();
+ params.splice(1, 0, current);
+
+ this.pushSource("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
+ },
+
+ // [appendContent]
+ //
+ // On stack, before: ...
+ // On stack, after: ...
+ //
+ // Appends the string value of `content` to the current buffer
+ appendContent: function(content) {
+ if (this.pendingContent) {
+ content = this.pendingContent + content;
+ }
+
+ this.pendingContent = content;
+ },
+
+ // [append]
+ //
+ // On stack, before: value, ...
+ // On stack, after: ...
+ //
+ // Coerces `value` to a String and appends it to the current buffer.
+ //
+ // If `value` is truthy, or 0, it is coerced into a string and appended
+ // Otherwise, the empty string is appended
+ append: function() {
+ // Force anything that is inlined onto the stack so we don't have duplication
+ // when we examine local
+ this.flushInline();
+ var local = this.popStack();
+ this.pushSource('if (' + local + ' != null) { ' + this.appendToBuffer(local) + ' }');
+ if (this.environment.isSimple) {
+ this.pushSource("else { " + this.appendToBuffer("''") + " }");
+ }
+ },
+
+ // [appendEscaped]
+ //
+ // On stack, before: value, ...
+ // On stack, after: ...
+ //
+ // Escape `value` and append it to the buffer
+ appendEscaped: function() {
+ this.aliases.escapeExpression = 'this.escapeExpression';
+
+ this.pushSource(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
+ },
+
+ // [getContext]
+ //
+ // On stack, before: ...
+ // On stack, after: ...
+ // Compiler value, after: lastContext=depth
+ //
+ // Set the value of the `lastContext` compiler value to the depth
+ getContext: function(depth) {
+ this.lastContext = depth;
+ },
+
+ // [pushContext]
+ //
+ // On stack, before: ...
+ // On stack, after: currentContext, ...
+ //
+ // Pushes the value of the current context onto the stack.
+ pushContext: function() {
+ this.pushStackLiteral(this.contextName(this.lastContext));
+ },
+
+ // [lookupOnContext]
+ //
+ // On stack, before: ...
+ // On stack, after: currentContext[name], ...
+ //
+ // Looks up the value of `name` on the current context and pushes
+ // it onto the stack.
+ lookupOnContext: function(parts, falsy, scoped) {
+ /*jshint -W083 */
+ var i = 0,
+ len = parts.length;
+
+ if (!scoped && this.options.compat && !this.lastContext) {
+ // The depthed query is expected to handle the undefined logic for the root level that
+ // is implemented below, so we evaluate that directly in compat mode
+ this.push(this.depthedLookup(parts[i++]));
+ } else {
+ this.pushContext();
+ }
+
+ for (; i < len; i++) {
+ this.replaceStack(function(current) {
+ var lookup = this.nameLookup(current, parts[i], 'context');
+ // We want to ensure that zero and false are handled properly if the context (falsy flag)
+ // needs to have the special handling for these values.
+ if (!falsy) {
+ return ' != null ? ' + lookup + ' : ' + current;
+ } else {
+ // Otherwise we can use generic falsy handling
+ return ' && ' + lookup;
+ }
+ });
+ }
+ },
+
+ // [lookupData]
+ //
+ // On stack, before: ...
+ // On stack, after: data, ...
+ //
+ // Push the data lookup operator
+ lookupData: function(depth, parts) {
+ /*jshint -W083 */
+ if (!depth) {
+ this.pushStackLiteral('data');
+ } else {
+ this.pushStackLiteral('this.data(data, ' + depth + ')');
+ }
+
+ var len = parts.length;
+ for (var i = 0; i < len; i++) {
+ this.replaceStack(function(current) {
+ return ' && ' + this.nameLookup(current, parts[i], 'data');
+ });
+ }
+ },
+
+ // [resolvePossibleLambda]
+ //
+ // On stack, before: value, ...
+ // On stack, after: resolved value, ...
+ //
+ // If the `value` is a lambda, replace it on the stack by
+ // the return value of the lambda
+ resolvePossibleLambda: function() {
+ this.aliases.lambda = 'this.lambda';
+
+ this.push('lambda(' + this.popStack() + ', ' + this.contextName(0) + ')');
+ },
+
+ // [pushStringParam]
+ //
+ // On stack, before: ...
+ // On stack, after: string, currentContext, ...
+ //
+ // This opcode is designed for use in string mode, which
+ // provides the string value of a parameter along with its
+ // depth rather than resolving it immediately.
+ pushStringParam: function(string, type) {
+ this.pushContext();
+ this.pushString(type);
+
+ // If it's a subexpression, the string result
+ // will be pushed after this opcode.
+ if (type !== 'sexpr') {
+ if (typeof string === 'string') {
+ this.pushString(string);
+ } else {
+ this.pushStackLiteral(string);
+ }
+ }
+ },
+
+ emptyHash: function() {
+ this.pushStackLiteral('{}');
+
+ if (this.trackIds) {
+ this.push('{}'); // hashIds
+ }
+ if (this.stringParams) {
+ this.push('{}'); // hashContexts
+ this.push('{}'); // hashTypes
+ }
+ },
+ pushHash: function() {
+ if (this.hash) {
+ this.hashes.push(this.hash);
+ }
+ this.hash = {values: [], types: [], contexts: [], ids: []};
+ },
+ popHash: function() {
+ var hash = this.hash;
+ this.hash = this.hashes.pop();
+
+ if (this.trackIds) {
+ this.push('{' + hash.ids.join(',') + '}');
+ }
+ if (this.stringParams) {
+ this.push('{' + hash.contexts.join(',') + '}');
+ this.push('{' + hash.types.join(',') + '}');
+ }
+
+ this.push('{\n ' + hash.values.join(',\n ') + '\n }');
+ },
+
+ // [pushString]
+ //
+ // On stack, before: ...
+ // On stack, after: quotedString(string), ...
+ //
+ // Push a quoted version of `string` onto the stack
+ pushString: function(string) {
+ this.pushStackLiteral(this.quotedString(string));
+ },
+
+ // [push]
+ //
+ // On stack, before: ...
+ // On stack, after: expr, ...
+ //
+ // Push an expression onto the stack
+ push: function(expr) {
+ this.inlineStack.push(expr);
+ return expr;
+ },
+
+ // [pushLiteral]
+ //
+ // On stack, before: ...
+ // On stack, after: value, ...
+ //
+ // Pushes a value onto the stack. This operation prevents
+ // the compiler from creating a temporary variable to hold
+ // it.
+ pushLiteral: function(value) {
+ this.pushStackLiteral(value);
+ },
+
+ // [pushProgram]
+ //
+ // On stack, before: ...
+ // On stack, after: program(guid), ...
+ //
+ // Push a program expression onto the stack. This takes
+ // a compile-time guid and converts it into a runtime-accessible
+ // expression.
+ pushProgram: function(guid) {
+ if (guid != null) {
+ this.pushStackLiteral(this.programExpression(guid));
+ } else {
+ this.pushStackLiteral(null);
+ }
+ },
+
+ // [invokeHelper]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of helper invocation
+ //
+ // Pops off the helper's parameters, invokes the helper,
+ // and pushes the helper's return value onto the stack.
+ //
+ // If the helper is not found, `helperMissing` is called.
+ invokeHelper: function(paramSize, name, isSimple) {
+ this.aliases.helperMissing = 'helpers.helperMissing';
+
+ var nonHelper = this.popStack();
+ var helper = this.setupHelper(paramSize, name);
+
+ var lookup = (isSimple ? helper.name + ' || ' : '') + nonHelper + ' || helperMissing';
+ this.push('((' + lookup + ').call(' + helper.callParams + '))');
+ },
+
+ // [invokeKnownHelper]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of helper invocation
+ //
+ // This operation is used when the helper is known to exist,
+ // so a `helperMissing` fallback is not required.
+ invokeKnownHelper: function(paramSize, name) {
+ var helper = this.setupHelper(paramSize, name);
+ this.push(helper.name + ".call(" + helper.callParams + ")");
+ },
+
+ // [invokeAmbiguous]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of disambiguation
+ //
+ // This operation is used when an expression like `{{foo}}`
+ // is provided, but we don't know at compile-time whether it
+ // is a helper or a path.
+ //
+ // This operation emits more code than the other options,
+ // and can be avoided by passing the `knownHelpers` and
+ // `knownHelpersOnly` flags at compile-time.
+ invokeAmbiguous: function(name, helperCall) {
+ this.aliases.functionType = '"function"';
+ this.aliases.helperMissing = 'helpers.helperMissing';
+ this.useRegister('helper');
+
+ var nonHelper = this.popStack();
+
+ this.emptyHash();
+ var helper = this.setupHelper(0, name, helperCall);
+
+ var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
+
+ this.push(
+ '((helper = (helper = ' + helperName + ' || ' + nonHelper + ') != null ? helper : helperMissing'
+ + (helper.paramsInit ? '),(' + helper.paramsInit : '') + '),'
+ + '(typeof helper === functionType ? helper.call(' + helper.callParams + ') : helper))');
+ },
+
+ // [invokePartial]
+ //
+ // On stack, before: context, ...
+ // On stack after: result of partial invocation
+ //
+ // This operation pops off a context, invokes a partial with that context,
+ // and pushes the result of the invocation back.
+ invokePartial: function(name, indent) {
+ var params = [this.nameLookup('partials', name, 'partial'), "'" + indent + "'", "'" + name + "'", this.popStack(), this.popStack(), "helpers", "partials"];
+
+ if (this.options.data) {
+ params.push("data");
+ } else if (this.options.compat) {
+ params.push('undefined');
+ }
+ if (this.options.compat) {
+ params.push('depths');
+ }
+
+ this.push("this.invokePartial(" + params.join(", ") + ")");
+ },
+
+ // [assignToHash]
+ //
+ // On stack, before: value, ..., hash, ...
+ // On stack, after: ..., hash, ...
+ //
+ // Pops a value off the stack and assigns it to the current hash
+ assignToHash: function(key) {
+ var value = this.popStack(),
+ context,
+ type,
+ id;
+
+ if (this.trackIds) {
+ id = this.popStack();
+ }
+ if (this.stringParams) {
+ type = this.popStack();
+ context = this.popStack();
+ }
+
+ var hash = this.hash;
+ if (context) {
+ hash.contexts.push("'" + key + "': " + context);
+ }
+ if (type) {
+ hash.types.push("'" + key + "': " + type);
+ }
+ if (id) {
+ hash.ids.push("'" + key + "': " + id);
+ }
+ hash.values.push("'" + key + "': (" + value + ")");
+ },
+
+ pushId: function(type, name) {
+ if (type === 'ID' || type === 'DATA') {
+ this.pushString(name);
+ } else if (type === 'sexpr') {
+ this.pushStackLiteral('true');
+ } else {
+ this.pushStackLiteral('null');
+ }
+ },
+
+ // HELPERS
+
+ compiler: JavaScriptCompiler,
+
+ compileChildren: function(environment, options) {
+ var children = environment.children, child, compiler;
+
+ for(var i=0, l=children.length; i<l; i++) {
+ child = children[i];
+ compiler = new this.compiler();
+
+ var index = this.matchExistingProgram(child);
+
+ if (index == null) {
+ this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
+ index = this.context.programs.length;
+ child.index = index;
+ child.name = 'program' + index;
+ this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);
+ this.context.environments[index] = child;
+
+ this.useDepths = this.useDepths || compiler.useDepths;
+ } else {
+ child.index = index;
+ child.name = 'program' + index;
+ }
+ }
+ },
+ matchExistingProgram: function(child) {
+ for (var i = 0, len = this.context.environments.length; i < len; i++) {
+ var environment = this.context.environments[i];
+ if (environment && environment.equals(child)) {
+ return i;
+ }
+ }
+ },
+
+ programExpression: function(guid) {
+ var child = this.environment.children[guid],
+ depths = child.depths.list,
+ useDepths = this.useDepths,
+ depth;
+
+ var programParams = [child.index, 'data'];
+
+ if (useDepths) {
+ programParams.push('depths');
+ }
+
+ return 'this.program(' + programParams.join(', ') + ')';
+ },
+
+ useRegister: function(name) {
+ if(!this.registers[name]) {
+ this.registers[name] = true;
+ this.registers.list.push(name);
+ }
+ },
+
+ pushStackLiteral: function(item) {
+ return this.push(new Literal(item));
+ },
+
+ pushSource: function(source) {
+ if (this.pendingContent) {
+ this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent)));
+ this.pendingContent = undefined;
+ }
+
+ if (source) {
+ this.source.push(source);
+ }
+ },
+
+ pushStack: function(item) {
+ this.flushInline();
+
+ var stack = this.incrStack();
+ this.pushSource(stack + " = " + item + ";");
+ this.compileStack.push(stack);
+ return stack;
+ },
+
+ replaceStack: function(callback) {
+ var prefix = '',
+ inline = this.isInline(),
+ stack,
+ createdStack,
+ usedLiteral;
+
+ /* istanbul ignore next */
+ if (!this.isInline()) {
+ throw new Exception('replaceStack on non-inline');
+ }
+
+ // We want to merge the inline statement into the replacement statement via ','
+ var top = this.popStack(true);
+
+ if (top instanceof Literal) {
+ // Literals do not need to be inlined
+ prefix = stack = top.value;
+ usedLiteral = true;
+ } else {
+ // Get or create the current stack name for use by the inline
+ createdStack = !this.stackSlot;
+ var name = !createdStack ? this.topStackName() : this.incrStack();
+
+ prefix = '(' + this.push(name) + ' = ' + top + ')';
+ stack = this.topStack();
+ }
+
+ var item = callback.call(this, stack);
+
+ if (!usedLiteral) {
+ this.popStack();
+ }
+ if (createdStack) {
+ this.stackSlot--;
+ }
+ this.push('(' + prefix + item + ')');
+ },
+
+ incrStack: function() {
+ this.stackSlot++;
+ if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
+ return this.topStackName();
+ },
+ topStackName: function() {
+ return "stack" + this.stackSlot;
+ },
+ flushInline: function() {
+ var inlineStack = this.inlineStack;
+ if (inlineStack.length) {
+ this.inlineStack = [];
+ for (var i = 0, len = inlineStack.length; i < len; i++) {
+ var entry = inlineStack[i];
+ if (entry instanceof Literal) {
+ this.compileStack.push(entry);
+ } else {
+ this.pushStack(entry);
+ }
+ }
+ }
+ },
+ isInline: function() {
+ return this.inlineStack.length;
+ },
+
+ popStack: function(wrapped) {
+ var inline = this.isInline(),
+ item = (inline ? this.inlineStack : this.compileStack).pop();
+
+ if (!wrapped && (item instanceof Literal)) {
+ return item.value;
+ } else {
+ if (!inline) {
+ /* istanbul ignore next */
+ if (!this.stackSlot) {
+ throw new Exception('Invalid stack pop');
+ }
+ this.stackSlot--;
+ }
+ return item;
+ }
+ },
+
+ topStack: function() {
+ var stack = (this.isInline() ? this.inlineStack : this.compileStack),
+ item = stack[stack.length - 1];
+
+ if (item instanceof Literal) {
+ return item.value;
+ } else {
+ return item;
+ }
+ },
+
+ contextName: function(context) {
+ if (this.useDepths && context) {
+ return 'depths[' + context + ']';
+ } else {
+ return 'depth' + context;
+ }
+ },
+
+ quotedString: function(str) {
+ return '"' + str
+ .replace(/\\/g, '\\\\')
+ .replace(/"/g, '\\"')
+ .replace(/\n/g, '\\n')
+ .replace(/\r/g, '\\r')
+ .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
+ .replace(/\u2029/g, '\\u2029') + '"';
+ },
+
+ objectLiteral: function(obj) {
+ var pairs = [];
+
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ pairs.push(this.quotedString(key) + ':' + obj[key]);
+ }
+ }
+
+ return '{' + pairs.join(',') + '}';
+ },
+
+ setupHelper: function(paramSize, name, blockHelper) {
+ var params = [],
+ paramsInit = this.setupParams(name, paramSize, params, blockHelper);
+ var foundHelper = this.nameLookup('helpers', name, 'helper');
+
+ return {
+ params: params,
+ paramsInit: paramsInit,
+ name: foundHelper,
+ callParams: [this.contextName(0)].concat(params).join(", ")
+ };
+ },
+
+ setupOptions: function(helper, paramSize, params) {
+ var options = {}, contexts = [], types = [], ids = [], param, inverse, program;
+
+ options.name = this.quotedString(helper);
+ options.hash = this.popStack();
+
+ if (this.trackIds) {
+ options.hashIds = this.popStack();
+ }
+ if (this.stringParams) {
+ options.hashTypes = this.popStack();
+ options.hashContexts = this.popStack();
+ }
+
+ inverse = this.popStack();
+ program = this.popStack();
+
+ // Avoid setting fn and inverse if neither are set. This allows
+ // helpers to do a check for `if (options.fn)`
+ if (program || inverse) {
+ if (!program) {
+ program = 'this.noop';
+ }
+
+ if (!inverse) {
+ inverse = 'this.noop';
+ }
+
+ options.fn = program;
+ options.inverse = inverse;
+ }
+
+ // The parameters go on to the stack in order (making sure that they are evaluated in order)
+ // so we need to pop them off the stack in reverse order
+ var i = paramSize;
+ while (i--) {
+ param = this.popStack();
+ params[i] = param;
+
+ if (this.trackIds) {
+ ids[i] = this.popStack();
+ }
+ if (this.stringParams) {
+ types[i] = this.popStack();
+ contexts[i] = this.popStack();
+ }
+ }
+
+ if (this.trackIds) {
+ options.ids = "[" + ids.join(",") + "]";
+ }
+ if (this.stringParams) {
+ options.types = "[" + types.join(",") + "]";
+ options.contexts = "[" + contexts.join(",") + "]";
+ }
+
+ if (this.options.data) {
+ options.data = "data";
+ }
+
+ return options;
+ },
+
+ // the params and contexts arguments are passed in arrays
+ // to fill in
+ setupParams: function(helperName, paramSize, params, useRegister) {
+ var options = this.objectLiteral(this.setupOptions(helperName, paramSize, params));
+
+ if (useRegister) {
+ this.useRegister('options');
+ params.push('options');
+ return 'options=' + options;
+ } else {
+ params.push(options);
+ return '';
+ }
+ }
+ };
+
+ var reservedWords = (
+ "break else new var" +
+ " case finally return void" +
+ " catch for switch while" +
+ " continue function this with" +
+ " default if throw" +
+ " delete in try" +
+ " do instanceof typeof" +
+ " abstract enum int short" +
+ " boolean export interface static" +
+ " byte extends long super" +
+ " char final native synchronized" +
+ " class float package throws" +
+ " const goto private transient" +
+ " debugger implements protected volatile" +
+ " double import public let yield"
+ ).split(" ");
+
+ var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
+
+ for(var i=0, l=reservedWords.length; i<l; i++) {
+ compilerWords[reservedWords[i]] = true;
+ }
+
+ JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
+ return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
+ };
+
+ __exports__ = JavaScriptCompiler;
+ return __exports__;
+})(__module2__, __module5__);
+
+// handlebars.js
+var __module0__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
+ "use strict";
+ var __exports__;
+ /*globals Handlebars: true */
+ var Handlebars = __dependency1__;
+
+ // Compiler imports
+ var AST = __dependency2__;
+ var Parser = __dependency3__.parser;
+ var parse = __dependency3__.parse;
+ var Compiler = __dependency4__.Compiler;
+ var compile = __dependency4__.compile;
+ var precompile = __dependency4__.precompile;
+ var JavaScriptCompiler = __dependency5__;
+
+ var _create = Handlebars.create;
+ var create = function() {
+ var hb = _create();
+
+ hb.compile = function(input, options) {
+ return compile(input, options, hb);
+ };
+ hb.precompile = function (input, options) {
+ return precompile(input, options, hb);
+ };
+
+ hb.AST = AST;
+ hb.Compiler = Compiler;
+ hb.JavaScriptCompiler = JavaScriptCompiler;
+ hb.Parser = Parser;
+ hb.parse = parse;
+
+ return hb;
+ };
+
+ Handlebars = create();
+ Handlebars.create = create;
+
+ Handlebars['default'] = Handlebars;
+
+ __exports__ = Handlebars;
+ return __exports__;
+})(__module1__, __module7__, __module8__, __module11__, __module12__);
+
+ return __module0__;
+}));
+/*
+ * $Id$
+** pz2.js - pazpar2's javascript client library.
+*/
+
+//since explorer is flawed
+if (!window['Node']) {
+ window.Node = new Object();
+ Node.ELEMENT_NODE = 1;
+ Node.ATTRIBUTE_NODE = 2;
+ Node.TEXT_NODE = 3;
+ Node.CDATA_SECTION_NODE = 4;
+ Node.ENTITY_REFERENCE_NODE = 5;
+ Node.ENTITY_NODE = 6;
+ Node.PROCESSING_INSTRUCTION_NODE = 7;
+ Node.COMMENT_NODE = 8;
+ Node.DOCUMENT_NODE = 9;
+ Node.DOCUMENT_TYPE_NODE = 10;
+ Node.DOCUMENT_FRAGMENT_NODE = 11;
+ Node.NOTATION_NODE = 12;
+}
+
+// prevent execution of more than once
+if(typeof window.pz2 == "undefined") {
+window.undefined = window.undefined;
+
+var pz2 = function ( paramArray )
+{
+
+ // at least one callback required
+ if ( !paramArray )
+ throw new Error("Pz2.js: Array with parameters has to be supplied.");
+
+ //supported pazpar2's protocol version
+ this.windowid = paramArray.windowid || window.name;
+ this.suppProtoVer = '1';
+ if (typeof paramArray.pazpar2path != "undefined")
+ this.pz2String = paramArray.pazpar2path;
+ else
+ this.pz2String = "/pazpar2/search.pz2";
+ this.useSessions = true;
+
+ this.stylesheet = paramArray.detailstylesheet || null;
+ //load stylesheet if required in async mode
+ if( this.stylesheet ) {
+ var context = this;
+ var request = new pzHttpRequest( this.stylesheet );
+ request.get( {}, function ( doc ) { context.xslDoc = doc; } );
+ }
+
+ this.errorHandler = paramArray.errorhandler || null;
+ this.showResponseType = paramArray.showResponseType || "xml";
+
+ // function callbacks
+ this.initCallback = paramArray.oninit || null;
+ this.statCallback = paramArray.onstat || null;
+ this.showCallback = paramArray.onshow || null;
+ this.termlistCallback = paramArray.onterm || null;
+ this.recordCallback = paramArray.onrecord || null;
+ this.bytargetCallback = paramArray.onbytarget || null;
+ this.resetCallback = paramArray.onreset || null;
+
+ // termlist keys
+ this.termKeys = paramArray.termlist || "subject";
+
+ // some configurational stuff
+ this.keepAlive = 50000;
+
+ if ( paramArray.keepAlive < this.keepAlive )
+ this.keepAlive = paramArray.keepAlive;
+
+ this.sessionID = null;
+ this.serviceId = paramArray.serviceId || null;
+ this.initStatusOK = false;
+ this.pingStatusOK = false;
+ this.searchStatusOK = false;
+ this.mergekey = paramArray.mergekey || null;
+ this.rank = paramArray.rank || null;
+
+ // for sorting
+ this.currentSort = "relevance";
+
+ // where are we?
+ this.currentStart = 0;
+ // currentNum can be overwritten in show
+ this.currentNum = 20;
+
+ // last full record retrieved
+ this.currRecID = null;
+
+ // current query
+ this.currQuery = null;
+
+ //current raw record offset
+ this.currRecOffset = null;
+
+ //timers
+ this.pingTimer = null;
+ this.statTime = paramArray.stattime || 1000;
+ this.statTimer = null;
+ this.termTime = paramArray.termtime || 1000;
+ this.termTimer = null;
+ this.showTime = paramArray.showtime || 1000;
+ this.showTimer = null;
+ this.showFastCount = 4;
+ this.bytargetTime = paramArray.bytargettime || 1000;
+ this.bytargetTimer = null;
+ this.recordTime = paramArray.recordtime || 500;
+ this.recordTimer = null;
+
+ // counters for each command and applied delay
+ this.dumpFactor = 500;
+ this.showCounter = 0;
+ this.termCounter = 0;
+ this.statCounter = 0;
+ this.bytargetCounter = 0;
+ this.recordCounter = 0;
+
+ // active clients, updated by stat and show
+ // might be an issue since bytarget will poll accordingly
+ this.activeClients = 1;
+
+ // if in proxy mode no need to init
+ if (paramArray.usesessions != undefined) {
+ this.useSessions = paramArray.usesessions;
+ this.initStatusOK = true;
+ }
+ // else, auto init session or wait for a user init?
+ if (this.useSessions && paramArray.autoInit !== false) {
+ this.init(this.sessionID, this.serviceId);
+ }
+ // Version parameter
+ this.version = paramArray.version || null;
+};
+
+pz2.prototype =
+{
+ //error handler for async error throws
+ throwError: function (errMsg, errCode)
+ {
+ var err = new Error(errMsg);
+ if (errCode) err.code = errCode;
+
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ },
+
+ // stop activity by clearing tiemouts
+ stop: function ()
+ {
+ clearTimeout(this.statTimer);
+ clearTimeout(this.showTimer);
+ clearTimeout(this.termTimer);
+ clearTimeout(this.bytargetTimer);
+ },
+
+ // reset status variables
+ reset: function ()
+ {
+ if ( this.useSessions ) {
+ this.sessionID = null;
+ this.initStatusOK = false;
+ this.pingStatusOK = false;
+ clearTimeout(this.pingTimer);
+ }
+ this.searchStatusOK = false;
+ this.stop();
+
+ if ( this.resetCallback )
+ this.resetCallback(this.windowid);
+ },
+
+ init: function (sessionId, serviceId)
+ {
+ this.reset();
+
+ // session id as a param
+ if (sessionId && this.useSessions ) {
+ this.initStatusOK = true;
+ this.sessionID = sessionId;
+ this.ping();
+ // old school direct pazpar2 init
+ } else if (this.useSessions) {
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ var opts = {'command' : 'init'};
+ if (serviceId) opts.service = serviceId;
+ request.safeGet(
+ opts,
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ if ( data.getElementsByTagName("protocol")[0]
+ .childNodes[0].nodeValue
+ != context.suppProtoVer )
+ throw new Error(
+ "Server's protocol not supported by the client"
+ );
+ context.initStatusOK = true;
+ context.sessionID =
+ data.getElementsByTagName("session")[0]
+ .childNodes[0].nodeValue;
+ if (data.getElementsByTagName("keepAlive").length > 0) {
+ context.keepAlive = data.getElementsByTagName("keepAlive")[0].childNodes[0].nodeValue;
+ }
+ context.pingTimer =
+ setTimeout(
+ function () {
+ context.ping();
+ },
+ context.keepAlive
+ );
+ if ( context.initCallback )
+ context.initCallback(context.windowid);
+ }
+ else
+ context.throwError('Init failed. Malformed WS resonse.',
+ 110);
+ }
+ );
+ // when through proxy no need to init
+ } else {
+ this.initStatusOK = true;
+ }
+ },
+ // no need to ping explicitly
+ ping: function ()
+ {
+ // pinging only makes sense when using pazpar2 directly
+ if( !this.initStatusOK || !this.useSessions )
+ throw new Error(
+ 'Pz2.js: Ping not allowed (proxy mode) or session not initialized.'
+ );
+ var context = this;
+
+ clearTimeout(context.pingTimer);
+
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ { "command": "ping", "session": this.sessionID, "windowid" : context.windowid },
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ context.pingStatusOK = true;
+ context.pingTimer =
+ setTimeout(
+ function () {
+ context.ping();
+ },
+ context.keepAlive
+ );
+ }
+ else
+ context.throwError('Ping failed. Malformed WS resonse.',
+ 111);
+ }
+ );
+ },
+ search: function (query, num, sort, filter, showfrom, addParamsArr)
+ {
+ clearTimeout(this.statTimer);
+ clearTimeout(this.showTimer);
+ clearTimeout(this.termTimer);
+ clearTimeout(this.bytargetTimer);
+
+ this.showCounter = 0;
+ this.termCounter = 0;
+ this.bytargetCounter = 0;
+ this.statCounter = 0;
+ this.activeClients = 1;
+
+ // no proxy mode
+ if( !this.initStatusOK )
+ throw new Error('Pz2.js: session not initialized.');
+
+ if( query !== undefined )
+ this.currQuery = query;
+ else
+ throw new Error("Pz2.js: no query supplied to the search command.");
+
+ if ( showfrom !== undefined )
+ var start = showfrom;
+ else
+ var start = 0;
+
+ var searchParams = {
+ "command": "search",
+ "query": this.currQuery,
+ "session": this.sessionID,
+ "windowid" : this.windowid
+ };
+
+ if( sort !== undefined ) {
+ this.currentSort = sort;
+ searchParams["sort"] = sort;
+ }
+ if (filter !== undefined) searchParams["filter"] = filter;
+ if (this.mergekey) searchParams["mergekey"] = this.mergekey;
+ if (this.rank) searchParams["rank"] = this.rank;
+
+ // copy additional parmeters, do not overwrite
+ if (addParamsArr != undefined) {
+ for (var prop in addParamsArr) {
+ if (!searchParams.hasOwnProperty(prop))
+ searchParams[prop] = addParamsArr[prop];
+ }
+ }
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ searchParams,
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ context.searchStatusOK = true;
+ //piggyback search
+ if (context.showCallback)
+ context.show(start, num, sort);
+ if (context.statCallback)
+ context.stat();
+ if (context.termlistCallback)
+ context.termlist();
+ if (context.bytargetCallback)
+ context.bytarget();
+ }
+ else
+ context.throwError('Search failed. Malformed WS resonse.',
+ 112);
+ }
+ );
+ },
+ stat: function()
+ {
+ if( !this.initStatusOK )
+ throw new Error('Pz2.js: session not initialized.');
+
+ // if called explicitly takes precedence
+ clearTimeout(this.statTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ { "command": "stat", "session": this.sessionID, "windowid" : context.windowid },
+ function(data) {
+ if ( data.getElementsByTagName("stat") ) {
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+
+ var stat = Element_parseChildNodes(data.documentElement);
+
+ context.statCounter++;
+ var delay = context.statTime
+ + context.statCounter * context.dumpFactor;
+
+ if ( activeClients > 0 )
+ context.statTimer =
+ setTimeout(
+ function () {
+ context.stat();
+ },
+ delay
+ );
+ context.statCallback(stat, context.windowid);
+ }
+ else
+ context.throwError('Stat failed. Malformed WS resonse.',
+ 113);
+ }
+ );
+ },
+ show: function(start, num, sort, query_state)
+ {
+ if( !this.searchStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: show command has to be preceded with a search command.'
+ );
+
+ // if called explicitly takes precedence
+ clearTimeout(this.showTimer);
+
+ if( sort !== undefined )
+ this.currentSort = sort;
+ if( start !== undefined )
+ this.currentStart = Number( start );
+ if( num !== undefined )
+ this.currentNum = Number( num );
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ var requestParameters =
+ {
+ "command": "show",
+ "session": this.sessionID,
+ "start": this.currentStart,
+ "num": this.currentNum,
+ "sort": this.currentSort,
+ "block": 1,
+ "type": this.showResponseType,
+ "windowid" : this.windowid
+ };
+ if (query_state)
+ requestParameters["query-state"] = query_state;
+ if (this.version && this.version > 0)
+ requestParameters["version"] = this.version;
+ request.safeGet(
+ requestParameters,
+ function(data, type) {
+ var show = null;
+ var activeClients = 0;
+ if (type === "json") {
+ show = {};
+ activeClients = Number(data.activeclients[0]);
+ show.activeclients = activeClients;
+ show.merged = Number(data.merged[0]);
+ show.total = Number(data.total[0]);
+ show.start = Number(data.start[0]);
+ show.num = Number(data.num[0]);
+ show.hits = data.hit;
+ } else if (data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK") {
+ // first parse the status data send along with records
+ // this is strictly bound to the format
+ activeClients =
+ Number(data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue);
+ show = {
+ "activeclients": activeClients,
+ "merged":
+ Number( data.getElementsByTagName("merged")[0]
+ .childNodes[0].nodeValue ),
+ "total":
+ Number( data.getElementsByTagName("total")[0]
+ .childNodes[0].nodeValue ),
+ "start":
+ Number( data.getElementsByTagName("start")[0]
+ .childNodes[0].nodeValue ),
+ "num":
+ Number( data.getElementsByTagName("num")[0]
+ .childNodes[0].nodeValue ),
+ "hits": []
+ };
+ // parse all the first-level nodes for all <hit> tags
+ var hits = data.getElementsByTagName("hit");
+ for (i = 0; i < hits.length; i++)
+ show.hits[i] = Element_parseChildNodes(hits[i]);
+ } else {
+ context.throwError('Show failed. Malformed WS resonse.',
+ 114);
+ };
+
+ var approxNode = data.getElementsByTagName("approximation");
+ if (approxNode && approxNode[0] && approxNode[0].childNodes[0] && approxNode[0].childNodes[0].nodeValue)
+ show['approximation'] =
+ Number( approxNode[0].childNodes[0].nodeValue);
+
+
+ data.getElementsByTagName("")
+ context.activeClients = activeClients;
+ context.showCounter++;
+ var delay = context.showTime;
+ if (context.showCounter > context.showFastCount)
+ delay += context.showCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.showTimer = setTimeout(
+ function () {
+ context.show();
+ },
+ delay);
+ context.showCallback(show, context.windowid);
+ }
+ );
+ },
+ record: function(id, offset, syntax, handler)
+ {
+ // we may call record with no previous search if in proxy mode
+ if(!this.searchStatusOK && this.useSessions)
+ throw new Error(
+ 'Pz2.js: record command has to be preceded with a search command.'
+ );
+
+ if( id !== undefined )
+ this.currRecID = id;
+
+ var recordParams = {
+ "command": "record",
+ "session": this.sessionID,
+ "id": this.currRecID,
+ "windowid" : this.windowid
+ };
+
+ this.currRecOffset = null;
+ if (offset != undefined) {
+ recordParams["offset"] = offset;
+ this.currRecOffset = offset;
+ }
+
+ if (syntax != undefined)
+ recordParams['syntax'] = syntax;
+
+ //overwrite default callback id needed
+ var callback = this.recordCallback;
+ var args = undefined;
+ if (handler != undefined) {
+ callback = handler['callback'];
+ args = handler['args'];
+ }
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+
+ request.safeGet(
+ recordParams,
+ function(data) {
+ var recordNode;
+ var record;
+ //raw record
+ if (context.currRecOffset !== null) {
+ record = new Array();
+ record['xmlDoc'] = data;
+ record['offset'] = context.currRecOffset;
+ callback(record, args, context.windowid);
+ //pz2 record
+ } else if ( recordNode =
+ data.getElementsByTagName("record")[0] ) {
+ // if stylesheet was fetched do not parse the response
+ if ( context.xslDoc ) {
+ record = new Array();
+ record['xmlDoc'] = data;
+ record['xslDoc'] = context.xslDoc;
+ record['recid'] =
+ recordNode.getElementsByTagName("recid")[0]
+ .firstChild.nodeValue;
+ //parse record
+ } else {
+ record = Element_parseChildNodes(recordNode);
+ }
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+ context.recordCounter++;
+ var delay = context.recordTime + context.recordCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.recordTimer =
+ setTimeout (
+ function() {
+ context.record(id, offset, syntax, handler);
+ },
+ delay
+ );
+ callback(record, args, context.windowid);
+ }
+ else
+ context.throwError('Record failed. Malformed WS resonse.',
+ 115);
+ }
+ );
+ },
+
+ termlist: function()
+ {
+ if( !this.searchStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: termlist command has to be preceded with a search command.'
+ );
+
+ // if called explicitly takes precedence
+ clearTimeout(this.termTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ {
+ "command": "termlist",
+ "session": this.sessionID,
+ "name": this.termKeys,
+ "windowid" : this.windowid,
+ "version" : this.version
+
+ },
+ function(data) {
+ if ( data.getElementsByTagName("termlist") ) {
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+ var termList = { "activeclients": activeClients };
+ var termLists = data.getElementsByTagName("list");
+ //for each termlist
+ for (i = 0; i < termLists.length; i++) {
+ var listName = termLists[i].getAttribute('name');
+ termList[listName] = new Array();
+ var terms = termLists[i].getElementsByTagName('term');
+ //for each term in the list
+ for (j = 0; j < terms.length; j++) {
+ var term = {
+ "name":
+ (terms[j].getElementsByTagName("name")[0]
+ .childNodes.length
+ ? terms[j].getElementsByTagName("name")[0]
+ .childNodes[0].nodeValue
+ : 'ERROR'),
+ "freq":
+ terms[j]
+ .getElementsByTagName("frequency")[0]
+ .childNodes[0].nodeValue || 'ERROR'
+ };
+
+ // Only for xtargets: id, records, filtered
+ var termIdNode =
+ terms[j].getElementsByTagName("id");
+ if(terms[j].getElementsByTagName("id").length)
+ term["id"] =
+ termIdNode[0].childNodes[0].nodeValue;
+ termList[listName][j] = term;
+
+ var recordsNode = terms[j].getElementsByTagName("records");
+ if (recordsNode && recordsNode.length)
+ term["records"] = recordsNode[0].childNodes[0].nodeValue;
+
+ var filteredNode = terms[j].getElementsByTagName("filtered");
+ if (filteredNode && filteredNode.length)
+ term["filtered"] = filteredNode[0].childNodes[0].nodeValue;
+
+ }
+ }
+
+ context.termCounter++;
+ var delay = context.termTime
+ + context.termCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.termTimer =
+ setTimeout(
+ function () {
+ context.termlist();
+ },
+ delay
+ );
+
+ context.termlistCallback(termList, context.windowid);
+ }
+ else
+ context.throwError('Termlist failed. Malformed WS resonse.',
+ 116);
+ }
+ );
+
+ },
+ bytarget: function()
+ {
+ if( !this.initStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: bytarget command has to be preceded with a search command.'
+ );
+
+ // no need to continue
+ if( !this.searchStatusOK )
+ return;
+
+ // if called explicitly takes precedence
+ clearTimeout(this.bytargetTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ {
+ "command": "bytarget",
+ "session": this.sessionID,
+ "block": 1,
+ "windowid" : this.windowid,
+ "version" : this.version
+ },
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ var targetNodes = data.getElementsByTagName("target");
+ var bytarget = new Array();
+ for ( i = 0; i < targetNodes.length; i++) {
+ bytarget[i] = new Array();
+ for( j = 0; j < targetNodes[i].childNodes.length; j++ ) {
+ if ( targetNodes[i].childNodes[j].nodeType
+ == Node.ELEMENT_NODE ) {
+ var nodeName =
+ targetNodes[i].childNodes[j].nodeName;
+ if (targetNodes[i].childNodes[j].firstChild != null)
+ {
+ var nodeText = targetNodes[i].childNodes[j]
+ .firstChild.nodeValue;
+ bytarget[i][nodeName] = nodeText;
+ }
+ else {
+ bytarget[i][nodeName] = "";
+ }
+
+
+ }
+ }
+ if (bytarget[i]["state"]=="Client_Disconnected") {
+ bytarget[i]["hits"] = "Error";
+ } else if (bytarget[i]["state"]=="Client_Error") {
+ bytarget[i]["hits"] = "Error";
+ } else if (bytarget[i]["state"]=="Client_Working") {
+ bytarget[i]["hits"] = "...";
+ }
+ var targetsSuggestions = targetNodes[i].getElementsByTagName("suggestions");
+ if (targetsSuggestions != undefined && targetsSuggestions.length>0) {
+ var suggestions = targetsSuggestions[0];
+ bytarget[i]["suggestions"] = Element_parseChildNodes(suggestions);
+ }
+ }
+
+ context.bytargetCounter++;
+ var delay = context.bytargetTime
+ + context.bytargetCounter * context.dumpFactor;
+ if ( context.activeClients > 0 )
+ context.bytargetTimer =
+ setTimeout(
+ function () {
+ context.bytarget();
+ },
+ delay
+ );
+
+ context.bytargetCallback(bytarget, context.windowid);
+ }
+ else
+ context.throwError('Bytarget failed. Malformed WS resonse.',
+ 117);
+ }
+ );
+ },
+
+ // just for testing, probably shouldn't be here
+ showNext: function(page)
+ {
+ var step = page || 1;
+ this.show( ( step * this.currentNum ) + this.currentStart );
+ },
+
+ showPrev: function(page)
+ {
+ if (this.currentStart == 0 )
+ return false;
+ var step = page || 1;
+ var newStart = this.currentStart - (step * this.currentNum );
+ this.show( newStart > 0 ? newStart : 0 );
+ },
+
+ showPage: function(pageNum)
+ {
+ //var page = pageNum || 1;
+ this.show(pageNum * this.currentNum);
+ }
+};
+
+/*
+********************************************************************************
+** AJAX HELPER CLASS ***********************************************************
+********************************************************************************
+*/
+var pzHttpRequest = function (url, errorHandler, cookieDomain, windowId) {
+ this.maxUrlLength = 2048;
+ this.request = null;
+ this.url = url;
+ this.errorHandler = errorHandler || null;
+ this.async = true;
+ this.requestHeaders = {};
+ this.isXDR = false;
+ this.domainRegex = /https?:\/\/([^:/]+).*/;
+ this.cookieDomain = cookieDomain || null;
+ this.windowId = windowId || window.name;
+
+ var xhr = new XMLHttpRequest();
+ var domain = this._getDomainFromUrl(url);
+ if ("withCredentials" in xhr) {
+ // XHR for Chrome/Firefox/Opera/Safari.
+ } else if (domain && this._isCrossDomain(domain) &&
+ typeof XDomainRequest != "undefined") {
+ // use XDR (IE7/8) when no other way
+ xhr = new XDomainRequest();
+ this.isXDR = true;
+ } else {
+ // CORS not supported.
+ }
+ this.request = xhr;
+};
+
+
+pzHttpRequest.prototype =
+{
+ safeGet: function ( params, callback )
+ {
+ var encodedParams = this.encodeParams(params);
+ var url = this._urlAppendParams(encodedParams);
+ if (url.length >= this.maxUrlLength) {
+ this.requestHeaders["Content-Type"]
+ = "application/x-www-form-urlencoded";
+ this._send( 'POST', this.url, encodedParams, callback );
+ } else {
+ this._send( 'GET', url, '', callback );
+ }
+ },
+
+ get: function ( params, callback )
+ {
+ this._send( 'GET', this._urlAppendParams(this.encodeParams(params)),
+ '', callback );
+ },
+
+ post: function ( params, data, callback )
+ {
+ this._send( 'POST', this._urlAppendParams(this.encodeParams(params)),
+ data, callback );
+ },
+
+ load: function ()
+ {
+ this.async = false;
+ this.request.open( 'GET', this.url, this.async );
+ this.request.send('');
+ if ( this.request.status == 200 )
+ return this.request.responseXML;
+ },
+
+ encodeParams: function (params)
+ {
+ var sep = "";
+ var encoded = "";
+ for (var key in params) {
+ if (params[key] != null) {
+ encoded += sep + key + '=' + encodeURIComponent(params[key]);
+ sep = '&';
+ }
+ }
+ return encoded;
+ },
+
+ _getDomainFromUrl: function (url)
+ {
+ if (this.cookieDomain) return this.cookieDomain; //explicit cookie domain
+ var m = this.domainRegex.exec(url);
+ return (m && m.length > 1) ? m[1] : null;
+ },
+
+ _strEndsWith: function (str, suffix)
+ {
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
+ },
+
+ _isCrossDomain: function (domain)
+ {
+ if (this.cookieDomain) return true; //assume xdomain is cookie domain set
+ return !this._strEndsWith(domain, document.domain);
+ },
+
+ getCookie: function (sKey) {
+ return decodeURI(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"
+ + encodeURI(sKey).replace(/[\-\.\+\*]/g, "\\$&")
+ + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
+ },
+
+ setCookie: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
+ if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
+ return false;
+ }
+ var sExpires = "";
+ if (vEnd) {
+ switch (vEnd.constructor) {
+ case Number:
+ sExpires = vEnd === Infinity
+ ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT"
+ : "; max-age=" + vEnd;
+ break;
+ case String:
+ sExpires = "; expires=" + vEnd;
+ break;
+ case Date:
+ sExpires = "; expires=" + vEnd.toGMTString();
+ break;
+ }
+ }
+ document.cookie = encodeURI(sKey) + "=" + encodeURI(sValue)
+ + sExpires
+ + (sDomain ? "; domain=" + sDomain : "")
+ + (sPath ? "; path=" + sPath : "")
+ + (bSecure ? "; secure" : "");
+ return true;
+ },
+
+ _send: function ( type, url, data, callback)
+ {
+ var context = this;
+ this.callback = callback;
+ this.async = true;
+ //we never do withCredentials, so if it's CORS and we have
+ //session cookie, resend it
+ var domain = this._getDomainFromUrl(url);
+ if (domain && this._isCrossDomain(domain) &&
+ this.getCookie(domain+":"+this.windowId+":SESSID")) {
+ //rewrite the URL
+ var sessparam = ';jsessionid=' + this.getCookie(domain+":"+this.windowId+":SESSID");
+ var q = url.indexOf('?');
+ if (q == -1) {
+ url += sessparam;
+ } else {
+ url = url.substring(0, q) + sessparam + url.substring(q);
+ }
+ }
+ this.request.open( type, url, this.async );
+ if (!this.isXDR) {
+ //setting headers is only allowed with XHR
+ for (var key in this.requestHeaders)
+ this.request.setRequestHeader(key, this.requestHeaders[key]);
+ }
+ if (this.isXDR) {
+ this.request.onload = function () {
+ //fake XHR props
+ context.request.status = 200;
+ context.request.readyState = 4;
+ //handle
+ context._handleResponse(url);
+ }
+ this.request.onerror = function () {
+ //fake XHR props
+ context.request.status = 417; //not really, but what can we do
+ context.request.readyState = 4;
+ //handle
+ context._handleResponse(url);
+ }
+ } else {
+ this.request.onreadystatechange = function () {
+ context._handleResponse(url); /// url used ONLY for error reporting
+ }
+ }
+ this.request.send(data);
+ },
+
+ _urlAppendParams: function (encodedParams)
+ {
+ if (encodedParams)
+ return this.url + "?" + encodedParams;
+ else
+ return this.url;
+ },
+
+ _handleResponse: function (requestUrl)
+ {
+ if ( this.request.readyState == 4 ) {
+ // pick up appplication errors first
+ var errNode = null;
+ // xdomainreq does not have responseXML
+ if (this.isXDR) {
+ if (this.request.contentType.match(/\/xml/)){
+ var dom = new ActiveXObject('Microsoft.XMLDOM');
+ dom.async = false;
+ dom.loadXML(this.request.responseText);
+ this.request.responseXML = dom;
+ } else {
+ this.request.responseXML = null;
+ }
+ }
+ if (this.request.responseXML &&
+ (errNode = this.request.responseXML.documentElement)
+ && errNode.nodeName == 'error') {
+ var errMsg = errNode.getAttribute("msg");
+ var errCode = errNode.getAttribute("code");
+ var errAddInfo = '';
+ if (errNode.childNodes.length)
+ errAddInfo = ': ' + errNode.childNodes[0].nodeValue;
+
+ var err = new Error(errMsg + errAddInfo);
+ err.code = errCode;
+
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ }
+ else if (this.request.status == 200 &&
+ this.request.responseXML === null) {
+ if (this.request.responseText !== null) {
+ //assume JSON
+ var json = null;
+ var text = this.request.responseText;
+ if (typeof window.JSON == "undefined") {
+ json = eval("(" + text + ")");
+ } else {
+ try {
+ json = JSON.parse(text);
+ } catch (e) {
+ }
+ }
+ this.callback(json, "json");
+ } else {
+ var err = new Error("XML/Text response is empty but no error " +
+ "for " + requestUrl);
+ err.code = -1;
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ } else {
+ throw err;
+ }
+ }
+ } else if (this.request.status == 200) {
+ //set cookie manually only if cross-domain
+ var domain = this._getDomainFromUrl(requestUrl);
+ if (domain && this._isCrossDomain(domain)) {
+ var jsessionId = this.request.responseXML
+ .documentElement.getAttribute('jsessionId');
+ if (jsessionId)
+ this.setCookie(domain+":"+this.windowId+":SESSID", jsessionId);
+ }
+ this.callback(this.request.responseXML);
+ } else {
+ var err = new Error("HTTP response not OK: "
+ + this.request.status + " - "
+ + this.request.statusText );
+ err.code = '00' + this.request.status;
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ }
+ }
+ }
+};
+
+/*
+********************************************************************************
+** XML HELPER FUNCTIONS ********************************************************
+********************************************************************************
+*/
+
+// DOMDocument
+
+if ( window.ActiveXObject) {
+ var DOMDoc = document;
+} else {
+ var DOMDoc = Document.prototype;
+}
+
+DOMDoc.newXmlDoc = function ( root )
+{
+ var doc;
+
+ if (document.implementation && document.implementation.createDocument) {
+ doc = document.implementation.createDocument('', root, null);
+ } else if ( window.ActiveXObject ) {
+ doc = new ActiveXObject("MSXML2.DOMDocument");
+ doc.loadXML('<' + root + '/>');
+ } else {
+ throw new Error ('No XML support in this browser');
+ }
+
+ return doc;
+}
+
+
+DOMDoc.parseXmlFromString = function ( xmlString )
+{
+ var doc;
+
+ if ( window.DOMParser ) {
+ var parser = new DOMParser();
+ doc = parser.parseFromString( xmlString, "text/xml");
+ } else if ( window.ActiveXObject ) {
+ doc = new ActiveXObject("MSXML2.DOMDocument");
+ doc.loadXML( xmlString );
+ } else {
+ throw new Error ("No XML parsing support in this browser.");
+ }
+
+ return doc;
+}
+
+DOMDoc.transformToDoc = function (xmlDoc, xslDoc)
+{
+ if ( window.XSLTProcessor ) {
+ var proc = new XSLTProcessor();
+ proc.importStylesheet( xslDoc );
+ return proc.transformToDocument(xmlDoc);
+ } else if ( window.ActiveXObject ) {
+ return document.parseXmlFromString(xmlDoc.transformNode(xslDoc));
+ } else {
+ alert( 'Unable to perform XSLT transformation in this browser' );
+ }
+}
+
+// DOMElement
+
+Element_removeFromDoc = function (DOM_Element)
+{
+ DOM_Element.parentNode.removeChild(DOM_Element);
+}
+
+Element_emptyChildren = function (DOM_Element)
+{
+ while( DOM_Element.firstChild ) {
+ DOM_Element.removeChild( DOM_Element.firstChild )
+ }
+}
+
+Element_appendTransformResult = function ( DOM_Element, xmlDoc, xslDoc )
+{
+ if ( window.XSLTProcessor ) {
+ var proc = new XSLTProcessor();
+ proc.importStylesheet( xslDoc );
+ var docFrag = false;
+ docFrag = proc.transformToFragment( xmlDoc, DOM_Element.ownerDocument );
+ DOM_Element.appendChild(docFrag);
+ } else if ( window.ActiveXObject ) {
+ DOM_Element.innerHTML = xmlDoc.transformNode( xslDoc );
+ } else {
+ alert( 'Unable to perform XSLT transformation in this browser' );
+ }
+}
+
+Element_appendTextNode = function (DOM_Element, tagName, textContent )
+{
+ var node = DOM_Element.ownerDocument.createElement(tagName);
+ var text = DOM_Element.ownerDocument.createTextNode(textContent);
+
+ DOM_Element.appendChild(node);
+ node.appendChild(text);
+
+ return node;
+}
+
+Element_setTextContent = function ( DOM_Element, textContent )
+{
+ if (typeof DOM_Element.textContent !== "undefined") {
+ DOM_Element.textContent = textContent;
+ } else if (typeof DOM_Element.innerText !== "undefined" ) {
+ DOM_Element.innerText = textContent;
+ } else {
+ throw new Error("Cannot set text content of the node, no such method.");
+ }
+}
+
+Element_getTextContent = function (DOM_Element)
+{
+ if ( typeof DOM_Element.textContent != 'undefined' ) {
+ return DOM_Element.textContent;
+ } else if (typeof DOM_Element.text != 'undefined') {
+ return DOM_Element.text;
+ } else {
+ throw new Error("Cannot get text content of the node, no such method.");
+ }
+}
+
+Element_parseChildNodes = function (node)
+{
+ var parsed = {};
+ var hasChildElems = false;
+ var textContent = '';
+
+ if (node.hasChildNodes()) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ switch (child.nodeType) {
+ case Node.ELEMENT_NODE:
+ hasChildElems = true;
+ var nodeName = child.nodeName;
+ if (!(nodeName in parsed))
+ parsed[nodeName] = [];
+ parsed[nodeName].push(Element_parseChildNodes(child));
+ break;
+ case Node.TEXT_NODE:
+ textContent += child.nodeValue;
+ break;
+ case Node.CDATA_SECTION_NODE:
+ textContent += child.nodeValue;
+ break;
+ }
+ }
+ }
+
+ var attrs = node.attributes;
+ for (var i = 0; i < attrs.length; i++) {
+ hasChildElems = true;
+ var attrName = '@' + attrs[i].nodeName;
+ var attrValue = attrs[i].nodeValue;
+ parsed[attrName] = attrValue;
+ }
+
+ // if no nested elements/attrs set value to text
+ if (hasChildElems)
+ parsed['#text'] = textContent;
+ else
+ parsed = textContent;
+
+ return parsed;
+}
+
+/* do not remove trailing bracket */
+}
+// Handlebars helpers
+
+Handlebars.registerHelper('mkws-json', function(obj) {
+ return mkws.$.toJSON(obj);
+});
+
+
+// This is intended to handle paragraphs from Wikipedia, hence the
+// rather hacky code to remove numbered references.
+//
+Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
+ var acc = [];
+
+ // For some reason, Handlebars provides the value
+ // {"hash":{},"data":{}} for parameters that are not provided. So we
+ // have to be prepared for actual numbers, explicitly undefined
+ // values and this dumb magic value.
+ if (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
+ nPara = obj.length;
+ }
+ if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
+ nSent = Infinity;
+ }
+
+ for (var i = 0; i < nPara; i++) {
+ // Remove numbered references such as "[1,3,4]" from text
+ var text = obj[i].replace(/\[[0-9,]+\]/g, '');
+ // Next line from http://stackoverflow.com/questions/18914629/split-string-into-sentences-in-javascript
+ var sentences = text.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|");
+ if (sentences.length > nSent)
+ sentences.length = nSent;
+
+ acc.push('<p>', sentences.join(' '), '</p>');
+ nSent -= sentences.length;
+ if (nSent == 0)
+ break;
+ }
+
+ return acc.join('');
+});
+
+
+Handlebars.registerHelper('mkws-translate', function(s) {
+ return mkws.M(s);
+});
+
+
+// We need {{mkws-attr '@name'}} because Handlebars can't parse {{@name}}
+Handlebars.registerHelper('mkws-attr', function(attrName) {
+ return this[attrName];
+});
+
+
+/*
+ * Use as follows: {{#mkws-if-any NAME1 having="NAME2"}}
+ * Applicable when NAME1 is the name of an array
+ * The guarded code runs only if at least one element of the NAME1
+ * array has a subelement called NAME2.
+ */
+Handlebars.registerHelper('mkws-if-any', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(this);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-first', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(item);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-commaList', function(items, options) {
+ var out = "";
+
+ for (var i in items) {
+ if (i > 0) out += ", ";
+ out += options.fn(items[i])
+ }
+
+ return out;
+});
+
+
+Handlebars.registerHelper('mkws-index1', function(obj) {
+ return obj.data.index + 1;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+ var out = "";
+ for (var i = 0; i < count; i++) {
+ out += options.fn(this);
+ }
+ return out;
+});
+/*! MKWS, the MasterKey Widget Set.
+ * Copyright (C) 2013-2014 Index Data
+ * See the file LICENSE for details
+ */
+
+"use strict"; // HTML5: disable for log_level >= 2
+
+
+// Set up global mkws object. Contains truly global state such as SP
+// authentication, and a hash of team objects, indexed by team-name.
+//
+// We set it as a property of window to make the global explicit as
+// some things complain about an implicit global.
+window.mkws = {
+ $: $, // Our own local copy of the jQuery object
+ authenticated: false,
+ authenticating: false,
+ active: false,
+ log_level: 1, // Will be overridden from mkws.config, but
+ // initial value allows jQuery popup to use logging.
+ teams: {},
+ widgetType2function: {},
+ defaultTemplates: {},
+
+ locale_lang: {
+ "de": {
+ "Authors": "Autoren",
+ "Subjects": "Schlagwörter",
+ "Sources": "Daten und Quellen",
+ "source": "datenquelle",
+ "Facets": "Termlisten",
+ "Next": "Weiter",
+ "Prev": "Zurück",
+ "Search": "Suche",
+ "Sort by": "Sortieren nach",
+ "and show": "und zeige",
+ "per page": "pro Seite",
+ "Displaying": "Zeige",
+ "to": "von",
+ "of": "aus",
+ "found": "gefunden",
+ "Title": "Titel",
+ "Author": "Autor",
+ "author": "autor",
+ "Date": "Datum",
+ "Subject": "Schlagwort",
+ "subject": "schlagwort",
+ "Location": "Ort",
+ "Records": "Datensätze",
+ "Targets": "Datenbanken",
+
+ "dummy": "dummy"
+ },
+
+ "da": {
+ "Authors": "Forfattere",
+ "Subjects": "Emner",
+ "Sources": "Kilder",
+ "source": "kilder",
+ "Facets": "Termlists",
+ "Next": "Næste",
+ "Prev": "Forrige",
+ "Search": "Søg",
+ "Sort by": "Sorter efter",
+ "and show": "og vis",
+ "per page": "per side",
+ "Displaying": "Viser",
+ "to": "til",
+ "of": "ud af",
+ "found": "fandt",
+ "Title": "Title",
+ "Author": "Forfatter",
+ "author": "forfatter",
+ "Date": "Dato",
+ "Subject": "Emneord",
+ "subject": "emneord",
+ "Location": "Lokation",
+ "Records": "Poster",
+ "Targets": "Baser",
+
+ "dummy": "dummy"
+ }
+ }
+};
+
+// We may be using a separate copy
+if (typeof(mkws_jQuery) !== "undefined") {
+ mkws.$ = mkws_jQuery;
+} else {
+ mkws.$ = jQuery;
+}
+
+mkws.log = function(string) {
+ if (!mkws.log_level)
+ return;
+
+ if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */
+ return;
+ }
+
+ // you need to disable use strict at the top of the file!!!
+ if (mkws.log_level >= 3) {
+ // Works in Chrome; not sure about elsewhere
+ console.trace();
+ } else if (mkws.log_level >= 2) {
+ console.log(">>> called from function " + arguments.callee.caller.name + ' <<<');
+ }
+ console.log(string);
+};
+
+
+// Translation function.
+mkws.M = function(word) {
+ var lang = mkws.config.lang;
+
+ if (!lang || !mkws.locale_lang[lang])
+ return word;
+
+ return mkws.locale_lang[lang][word] || word;
+};
+
+
+// This function is taken from a StackOverflow answer
+// http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript/901144#901144
+mkws.getParameterByName = function(name, url) {
+ if (!url) url = location.search;
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+ results = regex.exec(url);
+ return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+}
+
+
+mkws.registerWidgetType = function(name, fn) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerWidgetType old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ mkws.widgetType2function[name] = fn;
+ mkws.log("registered widget-type '" + name + "'");
+};
+
+mkws.promotionFunction = function(name) {
+ return mkws.widgetType2function[name];
+};
+
+
+mkws.setMkwsConfig = function(overrides) {
+ // Set global log_level flag early so that mkws.log() works
+ var tmp = overrides.log_level;
+ if (typeof(tmp) !== 'undefined') mkws.log_level = tmp;
+
+ var config_default = {
+ use_service_proxy: true,
+ pazpar2_url: undefined,
+ pp2_hostname: "sp-mkws.indexdata.com",
+ pp2_path: "service-proxy/",
+ service_proxy_auth: undefined,
+ sp_auth_path: undefined,
+ sp_auth_query: "command=auth&action=perconfig",
+ sp_auth_credentials: undefined,
+ lang: "",
+ sort_options: [["relevance"], ["title:1", "title"], ["date:0", "newest"], ["date:1", "oldest"]],
+ perpage_options: [10, 20, 30, 50],
+ sort_default: "relevance",
+ perpage_default: 20,
+ show_lang: true, /* show/hide language menu */
+ show_sort: true, /* show/hide sort menu */
+ show_perpage: true, /* show/hide perpage menu */
+ show_switch: true, /* show/hide switch menu */
+ lang_options: [], /* display languages links for given languages, [] for all */
+ facets: ["xtargets", "subject", "author"], /* display facets, in this order, [] for none */
+ responsive_design_width: undefined, /* a page with less pixel width considered as narrow */
+ log_level: 1, /* log level for development: 0..2 */
+ template_vars: {}, /* values that may be exposed to templates */
+
+ dummy: "dummy"
+ };
+
+ mkws.config = mkws.objectInheritingFrom(config_default);
+ for (var k in overrides) {
+ mkws.config[k] = overrides[k];
+ }
+};
+
+
+// This code is from Douglas Crockford's article "Prototypal Inheritance in JavaScript"
+// http://javascript.crockford.com/prototypal.html
+// mkws.objectInheritingFrom behaves the same as Object.create,
+// but since the latter is not available in IE8 we can't use it.
+//
+mkws.objectInheritingFrom = function(o) {
+ function F() {}
+ F.prototype = o;
+ return new F();
+}
+
+
+// The following functions are dispatchers for team methods that
+// are called from the UI using a team-name rather than implicit
+// context.
+mkws.switchView = function(tname, view) {
+ mkws.teams[tname].switchView(view);
+};
+
+mkws.showDetails = function(tname, prefixRecId) {
+ mkws.teams[tname].showDetails(prefixRecId);
+};
+
+mkws.limitTarget = function(tname, id, name) {
+ mkws.teams[tname].limitTarget(id, name);
+};
+
+mkws.limitQuery = function(tname, field, value) {
+ mkws.teams[tname].limitQuery(field, value);
+};
+
+mkws.limitCategory = function(tname, id) {
+ mkws.teams[tname].limitCategory(id);
+};
+
+mkws.delimitTarget = function(tname, id) {
+ mkws.teams[tname].delimitTarget(id);
+};
+
+mkws.delimitQuery = function(tname, field, value) {
+ mkws.teams[tname].delimitQuery(field, value);
+};
+
+mkws.showPage = function(tname, pageNum) {
+ mkws.teams[tname].showPage(pageNum);
+};
+
+mkws.pagerPrev = function(tname) {
+ mkws.teams[tname].pagerPrev();
+};
+
+mkws.pagerNext = function(tname) {
+ mkws.teams[tname].pagerNext();
+};
+
+
+mkws.pazpar2_url = function() {
+ if (mkws.config.pazpar2_url) {
+ mkws.log("using pre-baked pazpar2_url '" + mkws.config.pazpar2_url + "'");
+ return mkws.config.pazpar2_url;
+ } else {
+ var s = document.location.protocol + "//" + mkws.config.pp2_hostname + "/" + mkws.config.pp2_path;
+ mkws.log("generated pazpar2_url '" + s + "'");
+ return s;
+ }
+};
+
+
+// We put a session token in window.name, as it's the only place to
+// keep data that is preserved across reloads and within-site
+// navigation. pz2.js picks this up and uses it as part of the
+// cookie-name, to ensure we get a new session when we need one.
+//
+// We want to use different sessions for different windows/tabs (so
+// they don't receive each other's messages), different hosts and
+// different paths on a host (since in general these will
+// authenticate as different libraries). So the window name needs to
+// include the hostname and the path from the URL, plus the token.
+//
+var token;
+if (window.name) {
+ token = window.name.replace(/.*\//, '');
+ mkws.log("Reusing existing window token '" + token + "'");
+} else {
+ // Incredible that the standard JavaScript runtime doesn't define a
+ // unique windowId. Instead, we have to make one up. And since there's
+ // no global area shared between windows, the best we can do for
+ // ensuring uniqueness is generating a random ID and crossing our
+ // fingers.
+ //
+ // Ten chars from 26 alpha-numerics = 36^10 = 3.65e15 combinations.
+ // At one per second, it will take 116 million years to duplicate a token
+ token = Math.random().toString(36).slice(2, 12);
+ mkws.log("Generated new window token '" + token + "'");
+}
+
+window.name = window.location.hostname + window.location.pathname + '/' + token;
+mkws.log("Using window.name '" + window.name + "'");
+
+
+// wrapper to provide local copy of the jQuery object.
+(function($) {
+ var log = mkws.log;
+ var _old2new = { // Maps old-style widget names to new-style
+ 'Authname': 'auth-name',
+ 'ConsoleBuilder': 'console-builder',
+ 'Coverart': 'cover-art',
+ 'GoogleImage': 'google-image',
+ 'MOTD': 'motd',
+ 'MOTDContainer': 'motd-container',
+ 'Perpage': 'per-page',
+ 'SearchForm': 'search-form',
+ 'ReferenceUniverse': 'reference-universe',
+ 'Termlists': 'facets'
+ };
+ // Annoyingly, there is no built-in way to invert a hash
+ var _new2old = {};
+ for (var key in _old2new) {
+ if(_old2new.hasOwnProperty(key)) {
+ _new2old[_old2new[key]] = key;
+ }
+ }
+
+ mkws._old2new = _old2new;
+
+ function handleNodeWithTeam(node, callback) {
+ // First branch for DOM objects; second branch for jQuery objects
+ var classes = node.className || node.attr('class');
+ if (!classes) {
+ // For some reason, if we try to proceed when classes is
+ // undefined, we don't get an error message, but this
+ // function and its callers, up several stack level,
+ // silently return. What a crock.
+ log("handleNodeWithTeam() called on node with no classes");
+ return;
+ }
+ var list = classes.split(/\s+/)
+ var teamName, type;
+
+ for (var i = 0; i < list.length; i++) {
+ var cname = list[i];
+ if (cname.match(/^mkws-team-/)) {
+ // New-style teamnames of the form mkws-team-xyz
+ teamName = cname.replace(/^mkws-team-/, '');
+ } else if (cname.match(/^mkwsTeam_/)) {
+ // Old-style teamnames of the form mkwsTeam_xyz
+ teamName = cname.replace(/^mkwsTeam_/, '');
+ } else if (cname.match(/^mkws-/)) {
+ // New-style names of the from mkws-foo-bar
+ type = cname.replace(/^mkws-/, '');
+ } else if (cname.match(/^mkws/)) {
+ // Old-style names of the form mkwsFooBar
+ var tmp = cname.replace(/^mkws/, '');
+ type = _old2new[tmp] || tmp.toLowerCase();
+ }
+ }
+
+ // Widgets without a team are on team "AUTO"
+ if (!teamName) {
+ teamName = "AUTO";
+ // Autosearch widgets don't join team AUTO if there is already an
+ // autosearch on the team or the team has otherwise gotten a query
+ if (node.getAttribute("autosearch")) {
+ if (mkws.autoHasAuto ||
+ mkws.teams["AUTO"] && mkws.teams["AUTO"].config["query"]) {
+ log("AUTO team already has a query, using unique team");
+ teamName = "UNIQUE";
+ }
+ mkws.autoHasAuto = true;
+ }
+ }
+
+ // Widgets on team "UNIQUE" get a random team
+ if (teamName === "UNIQUE") {
+ teamName = Math.floor(Math.random() * 100000000).toString();
+ }
+
+ callback.call(node, teamName, type);
+ }
+
+
+ function resizePage() {
+ var threshhold = mkws.config.responsive_design_width;
+ var width = $(window).width();
+ var from, to, method;
+
+ if ((mkws.width === undefined || mkws.width > threshhold) &&
+ width <= threshhold) {
+ from = "wide"; to = "narrow"; method = "hide";
+ } else if ((mkws.width === undefined || mkws.width <= threshhold) &&
+ width > threshhold) {
+ from = "narrow"; to = "wide"; method = "show";
+ }
+ mkws.width = width;
+
+ if (from) {
+ log("changing from " + from + " to " + to + ": " + width);
+ for (var tname in mkws.teams) {
+ var team = mkws.teams[tname];
+ team.visitWidgets(function(t, w) {
+ var w1 = team.widget(t + "-container-" + from);
+ var w2 = team.widget(t + "-container-" + to);
+ if (w1) {
+ w1.node.hide();
+ }
+ if (w2) {
+ w2.node.show();
+ w.node.appendTo(w2.node);
+ }
+ });
+ team.queue("resize-" + to).publish();
+ }
+ }
+ };
+
+
+ /*
+ * Run service-proxy authentication in background (after page load).
+ * The username/password is configured in the apache config file
+ * for the site.
+ */
+ function authenticateSession(auth_url, auth_domain, pp2_url) {
+ mkws.authenticating = true;
+ log("service proxy authentication on URL: " + auth_url);
+
+ if (!auth_domain) {
+ auth_domain = pp2_url.replace(/^(https?:)?\/\/(.*?)\/.*/, '$2');
+ log("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'");
+ }
+
+ var request = new pzHttpRequest(auth_url, function(err) {
+ alert("HTTP call for authentication failed: " + err)
+ return;
+ }, auth_domain);
+
+ request.get(null, function(data) {
+ mkws.authenticating = false;
+ if (!$.isXMLDoc(data)) {
+ alert("Service Proxy authentication response is not a valid XML document");
+ return;
+ }
+ var status = $(data).find("status");
+ if (status.text() != "OK") {
+ var message = $(data).find("message");
+ alert("Service Proxy authentication response: " + status.text() + " (" + message.text() + ")");
+ return;
+ }
+
+ log("service proxy authentication successful");
+ mkws.authenticated = true;
+ var authName = $(data).find("displayName").text();
+ // You'd think there would be a better way to do this:
+ var realm = $(data).find("realm:not(realmAttributes realm)").text();
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("authenticated").publish(authName, realm);
+ }
+
+ runAutoSearches();
+ });
+ }
+
+
+ function runAutoSearches() {
+ log("running auto searches");
+
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("ready").publish();
+ }
+ }
+
+
+ function selectorForAllWidgets() {
+ if (mkws.config && mkws.config.scan_all_nodes) {
+ // This is the old version, which works by telling jQuery to
+ // find every node that has a class beginning with "mkws". In
+ // theory it should be slower than the class-based selector; but
+ // instrumentation suprisingly shows this is consistently
+ // faster. It also has the advantage that any widgets of
+ // non-registered types are logged as warnings rather than
+ // silently ignored.
+ return '[class^="mkws"],[class*=" mkws"]';
+ } else {
+ // This is the new version, which works by looking up the
+ // specific classes of all registered widget types and their
+ // resize containers. Because all it requires jQuery to do is
+ // some hash lookups in pre-built tables, it should be very
+ // fast; but it silently ignores widgets of unregistered types.
+ var s = "";
+ for (var type in mkws.widgetType2function) {
+ if (s) s += ',';
+ s += '.mkws-' + type;
+ s += ',.mkws-' + type + "-container-wide";
+ s += ',.mkws-' + type + "-container-narrow";
+ // Annoyingly, we also need to recognise old-style names
+ var oldtype = _new2old[type] || type.charAt(0).toUpperCase() + type.slice(1);
+ s += ',.mkws' + oldtype;
+ s += ',.mkws' + oldtype + "-Container-wide";
+ s += ',.mkws' + oldtype + "-Container-narrow";
+ }
+ return s;
+ }
+ }
+
+
+ function makeWidgetsWithin(level, node) {
+ if (node) var widgetNodes = node.find(selectorForAllWidgets());
+ else widgetNodes = $(selectorForAllWidgets());
+ // Return false if we parse no widgets
+ if (widgetNodes.length < 1) return false;
+ widgetNodes.each(function() {
+ handleNodeWithTeam(this, function(tname, type) {
+ var myTeam = mkws.teams[tname];
+ if (!myTeam) {
+ myTeam = mkws.teams[tname] = mkws.makeTeam($, tname);
+ }
+
+ var oldHTML = this.innerHTML;
+ var myWidget = mkws.makeWidget($, myTeam, type, this);
+ myTeam.addWidget(myWidget);
+ var newHTML = this.innerHTML;
+ if (newHTML !== oldHTML) {
+ myTeam.log("widget " + type + " HTML changed: reparsing");
+ makeWidgetsWithin(level+1, $(this));
+ }
+ });
+ });
+ return true;
+ }
+
+
+ // The second "rootsel" parameter is passed to jQuery and is a DOM node
+ // or a selector string you would like to constrain the search for widgets to.
+ //
+ // This function has no side effects if run again on an operating session,
+ // even if the element/selector passed causes existing widgets to be reparsed:
+ //
+ // (TODO: that last bit isn't true and we currently have to avoid reinitialising
+ // widgets, MKWS-261)
+ //
+ // * configuration is not regenerated
+ // * authentication is not performed again
+ // * autosearches are not re-run
+ mkws.init = function(message, rootsel) {
+ var greet = "MKWS initialised";
+ if (rootsel) greet += " (limited to " + rootsel + ")"
+ if (message) greet += " :: " + message;
+ mkws.log(greet);
+
+ // MKWS is not active until init() has been run against an object with widget nodes.
+ // We only set initial configuration when MKWS is first activated.
+ if (!mkws.isActive) {
+ var widgetSelector = selectorForAllWidgets();
+ if ($(widgetSelector).length < 1) {
+ mkws.log("no widgets found");
+ return;
+ }
+
+ // Initial configuration
+ mkws.autoHasAuto = false;
+ var saved_config;
+ if (typeof mkws_config === 'undefined') {
+ log("setting empty config");
+ saved_config = {};
+ } else {
+ log("using config: " + $.toJSON(mkws_config));
+ saved_config = mkws_config;
+ }
+ mkws.setMkwsConfig(saved_config);
+
+ for (var key in mkws.config) {
+ if (mkws.config.hasOwnProperty(key)) {
+ if (key.match(/^language_/)) {
+ var lang = key.replace(/^language_/, "");
+ // Copy custom languages into list
+ mkws.locale_lang[lang] = mkws.config[key];
+ log("added locally configured language '" + lang + "'");
+ }
+ }
+ }
+
+ var lang = mkws.getParameterByName("lang") || mkws.config.lang;
+ if (!lang || !mkws.locale_lang[lang]) {
+ mkws.config.lang = ""
+ } else {
+ mkws.config.lang = lang;
+ }
+
+ log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
+
+ // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
+ if (mkws.pazpar2_url().match(/^\/\//)) {
+ mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
+ log("adjusted protocol independent link to " + mkws.pazpar2_url());
+ }
+
+ if (mkws.config.responsive_design_width) {
+ // Responsive web design - change layout on the fly based on
+ // current screen width. Required for mobile devices.
+ $(window).resize(resizePage);
+ // initial check after page load
+ $(document).ready(resizePage);
+ }
+ }
+
+ var then = $.now();
+ // If we've made no widgets, return without starting an SP session
+ // or marking MKWS active.
+ if (makeWidgetsWithin(1, rootsel ? $(rootsel) : undefined) === false) {
+ return false;
+ }
+ var now = $.now();
+
+ log("walking MKWS nodes took " + (now-then) + " ms");
+ for (var tName in mkws.teams) {
+ var myTeam = mkws.teams[tName]
+ myTeam.makePz2();
+ myTeam.log("made PZ2 object");
+ /*
+ myTeam.visitWidgets(function(t, w) {
+ log(" has widget of type '" + t + "': " + w);
+ });
+ */
+ }
+
+ function sp_auth_url(config) {
+ if (config.service_proxy_auth) {
+ mkws.log("using pre-baked sp_auth_url '" + config.service_proxy_auth + "'");
+ return config.service_proxy_auth;
+ } else {
+ var s = '//';
+ s += config.sp_auth_hostname ? config.sp_auth_hostname : config.pp2_hostname;
+ s += '/';
+ s += config.sp_auth_path ? config.sp_auth_path : config.pp2_path;
+ var q = config.sp_auth_query;
+ if (q) {
+ s += '?' + q;
+ }
+ var c = config.sp_auth_credentials;
+ if (c) {
+ s += ('&username=' + c.substr(0, c.indexOf('/')) +
+ '&password=' + c.substr(c.indexOf('/')+1));
+ }
+ mkws.log("generated sp_auth_url '" + s + "'");
+ return s;
+ }
+ }
+
+ if (mkws.config.use_service_proxy && !mkws.authenticated && !mkws.authenticating) {
+ authenticateSession(sp_auth_url(mkws.config),
+ mkws.config.service_proxy_auth_domain,
+ mkws.pazpar2_url());
+ } else if (!mkws.authenticating) {
+ // raw pp2 or we have a session already open
+ runAutoSearches();
+ }
+
+ mkws.isActive = true;
+ return true;
+ };
+
+ $(document).ready(function() {
+ if (!window.mkws_noready && !mkws.authenticating && !mkws.active) {
+ mkws.init();
+ }
+ });
+
+})(mkws.$);
+// Factory function for team objects. As much as possible, this uses
+// only member variables (prefixed "m_") and inner functions with
+// private scope.
+//
+// Some functions are visible as member-functions to be called from
+// outside code -- specifically, from generated HTML. These functions
+// are that.switchView(), showDetails(), limitTarget(), limitQuery(),
+// limitCategory(), delimitTarget(), delimitQuery(), showPage(),
+// pagerPrev(), pagerNext().
+//
+// Before the team can be used for searching and related operations,
+// its pz2 object must be created by calling team.makePz2().
+//
+mkws.makeTeam = function($, teamName) {
+ var that = {};
+ var m_teamName = teamName;
+ var m_submitted = false;
+ var m_query; // initially undefined
+ var m_sortOrder; // will be set below
+ var m_perpage; // will be set below
+ var m_filterSet = filterSet(that);
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_logTime = {
+ // Timestamps for logging
+ "start": $.now(),
+ "last": $.now()
+ };
+ var m_paz; // will be initialised below
+ var m_templateText = {}; // widgets can register templates to be compiled
+ var m_template = {}; // compiled templates, from any source
+ var m_widgets = {}; // Maps widget-type to array of widget objects
+ var m_gotRecords = false;
+
+ var config = mkws.objectInheritingFrom(mkws.config);
+ that.config = config;
+
+ that.toString = function() { return '[Team ' + teamName + ']'; };
+
+ // Accessor methods for individual widgets: readers
+ that.name = function() { return m_teamName; };
+ that.submitted = function() { return m_submitted; };
+ that.sortOrder = function() { return m_sortOrder; };
+ that.perpage = function() { return m_perpage; };
+ that.query = function() { return m_query; };
+ that.totalRecordCount = function() { return m_totalRecordCount; };
+ that.currentPage = function() { return m_currentPage; };
+ that.currentRecordId = function() { return m_currentRecordId; };
+ that.currentRecordData = function() { return m_currentRecordData; };
+ that.filters = function() { return m_filterSet; };
+ that.gotRecords = function() { return m_gotRecords; };
+
+ // Accessor methods for individual widgets: writers
+ that.set_sortOrder = function(val) { m_sortOrder = val };
+ that.set_perpage = function(val) { m_perpage = val };
+
+
+ // The following PubSub code is modified from the jQuery manual:
+ // http://api.jquery.com/jQuery.Callbacks/
+ //
+ // Use as:
+ // team.queue("eventName").subscribe(function(param1, param2 ...) { ... });
+ // team.queue("eventName").publish(arg1, arg2, ...);
+ //
+ var m_queues = {};
+ function queue(id) {
+ if (!m_queues[id]) {
+ var callbacks = $.Callbacks();
+ m_queues[id] = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ }
+ return m_queues[id];
+ };
+ that.queue = queue;
+
+
+ function log(s) {
+ var now = $.now();
+ var timestamp = (((now - m_logTime.start)/1000).toFixed(3) + " (+" +
+ ((now - m_logTime.last)/1000).toFixed(3) + ") ");
+ m_logTime.last = now;
+ mkws.log(m_teamName + ": " + timestamp + s);
+ that.queue("log").publish(m_teamName, timestamp, s);
+ }
+ that.log = log;
+
+
+ log("making new widget team");
+
+ m_sortOrder = config.sort_default;
+ m_perpage = config.perpage_default;
+
+ // pz2.js event handlers:
+ function onInit() {
+ log("init");
+ m_paz.stat();
+ m_paz.bytarget();
+ }
+
+ function onBytarget(data) {
+ log("bytarget");
+ queue("targets").publish(data);
+ }
+
+ function onStat(data) {
+ queue("stat").publish(data);
+ var hitcount = parseInt(data.hits[0], 10);
+ if (!m_gotRecords && hitcount > 0) {
+ m_gotRecords = true;
+ queue("firstrecords").publish(hitcount);
+ }
+ if (parseInt(data.activeclients[0], 10) === 0) {
+ log("complete");
+ queue("complete").publish(hitcount);
+ }
+ }
+
+ function onTerm(data) {
+ log("term");
+ queue("facets").publish(data);
+ }
+
+ function onShow(data, teamName) {
+ log("show");
+ m_totalRecordCount = data.merged;
+ log("found " + m_totalRecordCount + " records");
+ queue("pager").publish(data);
+ queue("records").publish(data);
+ }
+
+ function onRecord(data, args, teamName) {
+ log("record");
+ // FIXME: record is async!!
+ clearTimeout(m_paz.recordTimer);
+ queue("record").publish(data);
+ var detRecordDiv = findnode(recordDetailsId(data.recid[0]));
+ if (detRecordDiv.length) {
+ // in case on_show was faster to redraw element
+ return;
+ }
+ m_currentRecordData = data;
+ var recordDiv = findnode('.' + recordElementId(m_currentRecordData.recid[0]));
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
+ }
+
+
+ // create a parameters array and pass it to the pz2's constructor
+ // then register the form submit event with the pz2.search function
+ // autoInit is set to true on default
+ that.makePz2 = function() {
+ log("m_queues=" + $.toJSON(m_queues));
+ var params = {
+ "windowid": teamName,
+ "pazpar2path": mkws.pazpar2_url(),
+ "usesessions" : config.use_service_proxy ? false : true,
+ "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
+ "termlist": config.facets.join(',')
+ };
+
+ params.oninit = onInit;
+ if (m_queues.targets) {
+ params.onbytarget = onBytarget;
+ log("setting bytarget callback");
+ }
+ if (m_queues.stat) {
+ params.onstat = onStat;
+ log("setting stat callback");
+ }
+ if (m_queues.facets && config.facets.length) {
+ params.onterm = onTerm;
+ log("setting term callback");
+ }
+ if (m_queues.records) {
+ log("setting show callback");
+ params.onshow = onShow;
+ // Record callback is subscribed from records callback
+ log("setting record callback");
+ params.onrecord = onRecord;
+ }
+
+ m_paz = new pz2(params);
+ log("created main pz2 object");
+ }
+
+
+ // Used by the Records widget and onRecord()
+ function recordElementId(s) {
+ return 'mkws-rec_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+ that.recordElementId = recordElementId;
+
+ // Used by onRecord(), showDetails() and renderDetails()
+ function recordDetailsId(s) {
+ return 'mkws-det_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+
+
+ that.targetFiltered = function(id) {
+ return m_filterSet.targetFiltered(id);
+ };
+
+
+ that.limitTarget = function(id, name) {
+ log("limitTarget(id=" + id + ", name=" + name + ")");
+ m_filterSet.add(targetFilter(id, name));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitQuery = function(field, value) {
+ log("limitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.add(fieldFilter(field, value));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitCategory = function(id) {
+ log("limitCategory(id=" + id + ")");
+ // Only one category filter at a time
+ m_filterSet.removeMatching(function(f) { return f.type === 'category' });
+ if (id !== '') m_filterSet.add(categoryFilter(id));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitTarget = function(id) {
+ log("delimitTarget(id=" + id + ")");
+ m_filterSet.removeMatching(function(f) { return f.type === 'target' });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitQuery = function(field, value) {
+ log("delimitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.removeMatching(function(f) { return f.type == 'field' &&
+ field == f.field && value == f.value });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.showPage = function(pageNum) {
+ m_currentPage = pageNum;
+ m_paz.showPage(m_currentPage - 1);
+ };
+
+
+ that.pagerNext = function() {
+ if (m_totalRecordCount - m_perpage*m_currentPage > 0) {
+ m_paz.showNext();
+ m_currentPage++;
+ }
+ };
+
+
+ that.pagerPrev = function() {
+ if (m_paz.showPrev() != false)
+ m_currentPage--;
+ };
+
+
+ that.reShow = function() {
+ resetPage();
+ m_paz.show(0, m_perpage, m_sortOrder);
+ };
+
+
+ function resetPage() {
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
+ m_gotRecords = false;
+ }
+ that.resetPage = resetPage;
+
+
+ function newSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ log("newSearch: " + query);
+
+ if (config.use_service_proxy && !mkws.authenticated) {
+ alert("searching before authentication");
+ return;
+ }
+
+ m_filterSet.removeMatching(function(f) { return f.type !== 'category' });
+ triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery);
+ switchView('records'); // In case it's configured to start off as hidden
+ m_submitted = true;
+ }
+ that.newSearch = newSearch;
+
+
+ function triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ resetPage();
+ queue("navi").publish();
+
+ // Continue to use previous query/sort-order unless new ones are specified
+ if (query) m_query = query;
+ if (sortOrder) m_sortOrder = sortOrder;
+ if (perpage) m_perpage = perpage;
+ if (targets) m_filterSet.add(targetFilter(targets, targets));
+
+ var pp2filter = m_filterSet.pp2filter();
+ var pp2limit = m_filterSet.pp2limit(limit);
+ var pp2catLimit = m_filterSet.pp2catLimit();
+ if (pp2catLimit) {
+ pp2filter = pp2filter ? pp2filter + "," + pp2catLimit : pp2catLimit;
+ }
+
+ var params = {};
+ if (pp2limit) params.limit = pp2limit;
+ if (maxrecs) params.maxrecs = maxrecs;
+ if (torusquery) {
+ if (!mkws.config.use_service_proxy)
+ alert("can't narrow search by torusquery when not authenticated");
+ params.torusquery = torusquery;
+ }
+
+ log("triggerSearch(" + m_query + "): filters = " + m_filterSet.toJSON() + ", " +
+ "pp2filter = " + pp2filter + ", params = " + $.toJSON(params));
+
+ m_paz.search(m_query, m_perpage, m_sortOrder, pp2filter, undefined, params);
+ }
+
+ // fetch record details to be retrieved from the record queue
+ that.fetchDetails = function(recId) {
+ log("fetchDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // switching view between targets and records
+ function switchView(view) {
+ var targets = widgetNode('targets');
+ var results = widgetNode('results') || widgetNode('records');
+ var blanket = widgetNode('blanket');
+ var motd = widgetNode('motd');
+
+ switch(view) {
+ case 'targets':
+ if (targets) $(targets).show();
+ if (results) $(results).hide();
+ if (blanket) $(blanket).hide();
+ if (motd) $(motd).hide();
+ break;
+ case 'records':
+ if (targets) $(targets).hide();
+ if (results) $(results).show();
+ if (blanket) $(blanket).show();
+ if (motd) $(motd).hide();
+ break;
+ default:
+ alert("Unknown view '" + view + "'");
+ }
+ }
+ that.switchView = switchView;
+
+
+ // detailed record drawing
+ that.showDetails = function(recId) {
+ var oldRecordId = m_currentRecordId;
+ m_currentRecordId = recId;
+
+ // remove current detailed view if any
+ findnode('#' + recordDetailsId(oldRecordId)).remove();
+
+ // if the same clicked, just hide
+ if (recId == oldRecordId) {
+ m_currentRecordId = '';
+ m_currentRecordData = null;
+ return;
+ }
+ // request the record
+ log("showDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // Finds the node of the specified class within the current team
+ function findnode(selector, teamName) {
+ teamName = teamName || m_teamName;
+
+ if (teamName === 'AUTO') {
+ selector = (selector + '.mkws-team-' + teamName + ',' +
+ selector + ':not([class^="mkws-team"],[class*=" mkws-team"])');
+ } else {
+ selector = selector + '.mkws-team-' + teamName;
+ }
+
+ var node = $(selector);
+ //log('findnode(' + selector + ') found ' + node.length + ' nodes');
+ return node;
+ }
+
+
+ function widgetNode(type) {
+ var w = that.widget(type);
+ return w ? w.node : undefined;
+ }
+
+ function renderDetails(data, marker) {
+ var template = loadTemplate("details");
+ var details = template(data);
+ return '<div class="mkws-details mkwsDetails mkwsTeam_' + m_teamName + '" ' +
+ 'id="' + recordDetailsId(data.recid[0]) + '">' + details + '</div>';
+ }
+ that.renderDetails = renderDetails;
+
+
+ that.registerTemplate = function(name, text) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerTemplate old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+ m_templateText[name] = text;
+ };
+
+
+ function loadTemplate(name, fallbackString) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning loadTemplate: old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ var template = m_template[name];
+ if (template === undefined && Handlebars.compile) {
+ var source;
+ var node = $(".mkws-template-" + name + " .mkws-team-" + that.name());
+ if (node && node.length < 1) {
+ node = $(".mkws-template-" + name);
+ }
+ if (node) source = node.html();
+ if (!source) source = m_templateText[name];
+ if (source) {
+ template = Handlebars.compile(source);
+ log("compiled template '" + name + "'");
+ }
+ }
+ //if (template === undefined) template = mkws_templatesbyteam[m_teamName][name];
+ if (template === undefined && Handlebars.templates) {
+ template = Handlebars.templates["mkws-template-" + name];
+ }
+ if (template === undefined && mkws.defaultTemplates) {
+ template = mkws.defaultTemplates[name];
+ }
+ if (template) {
+ m_template[name] = template;
+ return template;
+ }
+ else {
+ log("No MKWS template for " + name);
+ return null;
+ }
+ }
+ that.loadTemplate = loadTemplate;
+
+
+ that.addWidget = function(w) {
+ if (m_widgets[w.type] === undefined) {
+ m_widgets[w.type] = [ w ];
+ } else {
+ m_widgets[w.type].push(w);
+ }
+ }
+
+ that.widget = function(type) {
+ var list = m_widgets[type];
+
+ if (!list)
+ return undefined;
+ if (list.length > 1) {
+ alert("widget('" + type + "') finds " + list.length + " widgets: using first");
+ }
+ return list[0];
+ }
+
+ that.visitWidgets = function(callback) {
+ for (var type in m_widgets) {
+ var list = m_widgets[type];
+ for (var i = 0; i < list.length; i++) {
+ var res = callback(type, list[i]);
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ }
+ return undefined;
+ }
+
+
+ return that;
+};
+// Factory function for sets of filters.
+function filterSet(team) {
+ var m_team = team;
+ var m_list = [];
+
+ var that = {};
+
+ that.toJSON = function() {
+ return mkws.$.toJSON(m_list);
+ };
+
+ that.add = function(filter) {
+ m_list.push(filter);
+ };
+
+ that.visitTargets = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'target') {
+ callback(filter.id, filter.name);
+ }
+ }
+ };
+
+ that.visitFields = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'field') {
+ callback(filter.field, filter.value);
+ }
+ }
+ };
+
+ that.visitCategories = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'category') {
+ callback(filter.id);
+ }
+ }
+ };
+
+ that.removeMatching = function(matchFn) {
+ var newList = [];
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (matchFn(filter)) {
+ m_team.log("removeMatching: removing filter " + mkws.$.toJSON(filter));
+ } else {
+ m_team.log("removeMatching: keeping filter " + mkws.$.toJSON(filter));
+ newList.push(filter);
+ }
+ }
+ m_list = newList;
+ };
+
+ that.targetFiltered = function(id) {
+ for (var i = 0; i < m_list.length; i++) {
+ if (m_list[i].type === 'target' ||
+ m_list[i].id === 'pz:id=' + id) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ that.pp2filter = function() {
+ var res = "";
+
+ that.visitTargets(function(id, name) {
+ if (res) res += ",";
+ if (id.match(/^[a-z:]+[=~]/)) {
+ m_team.log("filter '" + id + "' already begins with SETTING OP");
+ } else {
+ id = 'pz:id=' + id;
+ }
+ res += id;
+ });
+
+ return res;
+ };
+
+ that.pp2limit = function(initial) {
+ var res = initial || "";
+
+ that.visitFields(function(field, value) {
+ if (res) res += ",";
+ res += field + "=" + value.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ that.pp2catLimit = function() {
+ var res = "";
+
+ that.visitCategories(function(id) {
+ if (res) res += ",";
+ res += "category~" + id.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ return that;
+}
+
+
+// Factory functions for filters. These can be of several types.
+function targetFilter(id, name) {
+ return {
+ type: 'target',
+ id: id,
+ name: name
+ };
+}
+
+function fieldFilter(field, value) {
+ return {
+ type: 'field',
+ field: field,
+ value: value
+ };
+}
+
+function categoryFilter(id) {
+ return {
+ type: 'category',
+ id: id
+ };
+}
+// Factory function for widget objects.
+mkws.makeWidget = function($, team, type, node) {
+ // Static register of attributes that do not contribute to config
+ var ignoreAttrs = {
+ id:1, 'class':1, style:1, name:1, action:1, type:1, size:1,
+ value:1, width:1, valign:1
+ };
+
+ var that = {
+ team: team,
+ type: type,
+ node: $(node),
+ config: mkws.objectInheritingFrom(team.config)
+ };
+
+ function log(s) {
+ team.log(s);
+ }
+ that.log = log;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + type + ']';
+ };
+
+ that.value = function() {
+ return node.value;
+ };
+
+ // Returns the HTML of a subwidget of the specified type. It gets
+ // the same attributes at the parent widget that invokes this
+ // function, except where overrides are passed in. If defaults are
+ // also provided, then these are used when the parent widget
+ // provides no values.
+ that.subwidget = function(type, overrides, defaults) {
+ var attrs = { _team: team.name() };
+
+ // Copy locally-set properties from the parent widget
+ for (var name in this.config) {
+ if (this.config.hasOwnProperty(name)) {
+ attrs[name] = this.config[name];
+ log(this + " copied property " + name + "='" + attrs[name] + "' to " + type + " subwidget");
+ }
+ }
+
+ for (var name in overrides) {
+ log(this + " overrode property " + name + "='" + overrides[name] + "' (was '" + attrs[name] + "') for " + type + " subwidget");
+ attrs[name] = overrides[name];
+ }
+
+ if (defaults) {
+ for (var name in defaults) {
+ if (!attrs[name]) {
+ attrs[name] = defaults[name];
+ log(this + " fell back to default property " + name + "='" + attrs[name] + "' for " + type + " subwidget");
+ }
+ }
+ }
+
+ var s = [];
+ s.push('<div class="mkws', type, ' mkws-team-', attrs._team, '"');
+ for (var name in attrs) {
+ if (name !== '_team')
+ s.push(' ', name, '="', attrs[name], '"');
+ }
+ s.push('></div>');
+ return s.join('');
+ };
+
+ function expandValue(val) {
+ if (val.match(/^!param!/)) {
+ var param = val.replace(/^!param!/, '');
+ val = mkws.getParameterByName(param);
+ log("obtained val '" + val + "' from param '" + param + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + param + "' parameter");
+ }
+ } else if (val.match(/^!path!/)) {
+ var index = val.replace(/^!path!/, '');
+ var path = window.location.pathname.split('/');
+ val = path[path.length - index];
+ log("obtained val '" + val + "' from path-component '" + index + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the path-component " + index);
+ }
+ } else if (val.match(/^!var!/)) {
+ var name = val.replace(/^!var!/, '');
+ val = window[name]; // It's ridiculous that this works
+ log("obtained val '" + val + "' from variable '" + name + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + name + "' variable");
+ }
+ }
+ return val;
+ };
+
+ // Utility function for use by all widgets that can invoke autosearch.
+ that.autosearch = function() {
+ var that = this;
+ var query = this.config.autosearch;
+ if (query) {
+ var old = this.team.config.query;
+ if (!old) {
+ // Stash this for subsequent inspection
+ this.team.config.query = query;
+ } else if (old === query) {
+ this.log("duplicate autosearch: '" + query + "': ignoring");
+ return;
+ } else {
+ this.log("conflicting autosearch: '" + query + "' vs '" + old + "': ignoring");
+ return;
+ }
+
+ this.team.queue("ready").subscribe(function() {
+ // Postpone testing for the configuration items: these are not
+ // yet set for Record subclass widgets that fill them in in the
+ // subclass, as widget.autosearch is called in the superclass,
+ // before the subclass fiddles with the configuration.
+ var sortOrder = that.config.sort;
+ var maxrecs = that.config.maxrecs;
+ var perpage = that.config.perpage;
+ var limit = that.config.limit;
+ var targets = that.config.targets;
+ var targetfilter = that.config.targetfilter;
+ var target = that.config.target;
+ if (target) targetfilter = 'udb=="' + target + '"';
+
+ var s = "running auto search: '" + query + "'";
+ if (sortOrder) s += " sorted by '" + sortOrder + "'";
+ if (maxrecs) s += " restricted to " + maxrecs + " records";
+ if (perpage) s += " with " + perpage + " per page";
+ if (limit) s += " limited by '" + limit + "'";
+ if (targets) s += " in targets '" + targets + "'";
+ if (targetfilter) s += " constrained by targetfilter '" + targetfilter + "'";
+ that.log(s);
+
+ that.team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter);
+ });
+ }
+ };
+
+ // Utility function for all widgets that want to hide in narrow windows
+ that.hideWhenNarrow = function() {
+ var that = this;
+ this.team.queue("resize-narrow").subscribe(function(n) {
+ that.node.hide();
+ });
+ this.team.queue("resize-wide").subscribe(function(n) {
+ that.node.show();
+ });
+ };
+
+
+ for (var i = 0; i < node.attributes.length; i++) {
+ var a = node.attributes[i];
+ var val = expandValue(a.value);
+ if (a.name === 'data-mkws-config') {
+ // Treat as a JSON fragment configuring just this widget
+ log(node + ": parsing config fragment '" + val + "'");
+ var data;
+ try {
+ data = $.parseJSON(val);
+ for (var key in data) {
+ log(node + ": adding config element " + key + "='" + data[key] + "'");
+ that.config[key] = data[key];
+ }
+ } catch (err) {
+ alert("Can't parse " + node + " data-mkws-config as JSON: " + val);
+ }
+ } else if (a.name.match (/^data-mkws-/)) {
+ var name = a.name.replace(/^data-mkws-/, '')
+ that.config[name] = val;
+ log(that + ": set data-mkws attribute " + name + "='" + val + "'");
+ } else if (!ignoreAttrs[a.name]) {
+ that.config[a.name] = val;
+ log(that + ": set regular attribute " + a.name + "='" + val + "'");
+ }
+ }
+
+ var fn = mkws.promotionFunction(type);
+ if (fn) {
+ fn.call(that);
+ log("made " + type + " widget(node=" + node + ")");
+ } else if (type.match(/-Container-(narrow|wide)$/)) {
+ // Not really a widget: no need to log its lack of promotion
+ } else {
+ log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")");
+ }
+
+ return that;
+};
+(function($) { // jQuery wrapper
+
+// Functions follow for promoting the regular widget object into
+// widgets of specific types. These could be moved into their own
+// source files.
+
+
+mkws.registerWidgetType('targets', function() {
+ if (!this.config.show_switch) return;
+ var that = this;
+
+ this.node.html('No information available yet.');
+ this.node.css("display", "none");
+
+ this.team.queue("targets").subscribe(function(data) {
+ // There is a bug in pz2.js wherein it makes each data object an array but
+ // simply assigns properties to it.
+ // TODO: remove this when PAZ-946 is addressed.
+ var cleandata = [];
+ for (var i = 0; i < data.length; i++) {
+ var cur = {};
+ cur.id = data[i].id;
+ cur.hits = data[i].hits;
+ cur.diagnostic = data[i].diagnostic;
+ cur.message = data[i].message;
+ cur.records = data[i].records;
+ cur.state = data[i].state;
+ cleandata.push(cur);
+ }
+
+ var template = that.team.loadTemplate(that.config.template || "targets");
+ that.node.html(template({data: cleandata}));
+ });
+});
+
+
+mkws.registerWidgetType('stat', function() {
+ var that = this;
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "stat");
+ that.node.html(template(data));
+ });
+});
+
+
+mkws.registerWidgetType('pager', function() {
+ var that = this;
+ var M = mkws.M;
+
+ this.team.queue("pager").subscribe(function(data) {
+ var teamName = that.team.name();
+ var output = {};
+ output.first = data.start + 1;
+ output.last = data.start + data.num;
+ output.count = data.merged;
+ output.found = data.total;
+
+ //client indexes pages from 1 but pz2 from 0
+ var onsides = 5;
+ var pages = Math.ceil(that.team.totalRecordCount() / that.team.perpage());
+ var currentPage = that.team.currentPage();
+
+ var firstClkbl = (currentPage - onsides > 0)
+ ? currentPage - onsides
+ : 1;
+ var lastClkbl = firstClkbl + 2*onsides < pages
+ ? firstClkbl + 2*onsides
+ : pages;
+
+ if (firstClkbl > 1) output.morePrev = true;
+ if (lastClkbl < pages) output.moreNext = true;
+
+ if (currentPage > 1) output.prevClick = "mkws.pagerPrev(\'" + teamName + "\');";
+
+ output.pages = [];
+ for(var i = firstClkbl; i <= lastClkbl; i++) {
+ var o = {};
+ o.number = i;
+ if (i !== currentPage) {
+ o.click = "mkws.showPage(\'" + teamName + "\', " + i + ");";
+ }
+ output.pages.push(o);
+ }
+
+ if (pages - currentPage > 0) output.nextClick = "mkws.pagerNext(\'" + teamName + "\')";
+
+ var template = that.team.loadTemplate(that.config.template || "pager");
+ that.node.html(template(output));
+ });
+});
+
+mkws.registerWidgetType('details', function() {
+ var that = this;
+ var recid = that.node.attr("data-mkws-recid");
+ if (this.team.gotRecords()) {
+ that.team.fetchDetails(recid);
+ } else {
+ this.team.queue("firstrecords").subscribe(function() {
+ that.team.fetchDetails(recid);
+ });
+ }
+ this.team.queue("record").subscribe(function(data) {
+ if ($.inArray(recid, data.recid) > -1) {
+ var template = that.team.loadTemplate(that.config.template || "details");
+ that.node.html(template(data));
+ }
+ });
+});
+
+mkws.registerWidgetType('records', function() {
+ var that = this;
+ var team = this.team;
+
+ this.team.queue("records").subscribe(function(data) {
+ for (var i = 0; i < data.hits.length; i++) {
+ var hit = data.hits[i];
+ hit.detailLinkId = team.recordElementId(hit.recid[0]);
+ hit.detailClick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;";
+ hit.containerClass = "mkws-summary mkwsSummary mkws-team-" + team.name();
+ hit.containerClass += " " + hit.detailLinkId;
+ // ### At some point, we may be able to move the
+ // m_currentRecordId and m_currentRecordData members
+ // from the team object into this widget.
+ if (hit.recid == team.currentRecordId()) {
+ if (team.currentRecordData()) {
+ hit.renderedDetails = team.renderDetails(team.currentRecordData());
+ }
+ }
+ }
+ var template = team.loadTemplate(that.config.template || "records");
+ var summaryPartial = team.loadTemplate(that.config['summary-template'] || "summary");
+ var tdata = $.extend({}, {"hits": data.hits}, that.config.template_vars);
+ that.node.html(template(tdata, {"partials":{"summary":summaryPartial}}));
+ });
+
+ that.autosearch();
+});
+
+
+mkws.registerWidgetType('navi', function() {
+ var that = this;
+ var teamName = this.team.name();
+
+ this.team.queue("navi").subscribe(function() {
+ var filters = that.team.filters();
+ var output = {filters:[]};
+
+ filters.visitTargets(function(id, name) {
+ var cur = {};
+ cur.facet = 'source';
+ cur.value = name;
+ cur.click = "mkws.delimitTarget('" + teamName + "', '" + id + "'); return false;";
+ output.filters.push(cur);
+ });
+
+ filters.visitFields(function(field, value) {
+ var cur = {};
+ cur.facet = field;
+ cur.value = value;
+ cur.click = "mkws.delimitQuery('" + teamName + "', '" + field + "', '" + value + "'" + ");return false;";
+ output.filters.push(cur);
+ });
+
+ var template = that.team.loadTemplate(that.config.template || "navi");
+ that.node.html(template(output));
+ });
+});
+
+
+// It seems this and the Perpage widget doen't need to subscribe to
+// anything, since they produce events rather than consuming them.
+//
+mkws.registerWidgetType('sort', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_sortOrder(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('per-page', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_perpage(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('done', function() {
+ var that = this;
+ this.team.queue("complete").subscribe(function(n) {
+ var template = that.team.loadTemplate(that.config.template || "done");
+ that.node.html(template({count: n}));
+ });
+});
+
+
+mkws.registerWidgetType('switch', function() {
+ if (!this.config.show_switch) return;
+ var tname = this.team.name();
+ var output = {};
+ output.recordClick = "mkws.switchView(\'" + tname + "\', \'records\')";
+ output.targetClick = "mkws.switchView(\'" + tname + "\', \'targets\')";
+ var template = this.team.loadTemplate(this.config.template || "switch");
+ this.node.html(template(output));
+ this.hideWhenNarrow();
+});
+
+
+mkws.registerWidgetType('search', function() {
+ var output = {};
+ output.team = this.team.name();
+ var template = this.team.loadTemplate(this.config.template || "search");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('search-form', function() {
+ var team = this.team;
+ this.node.submit(function() {
+ var val = team.widget('query').value();
+ team.newSearch(val);
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('results', function() {
+ var template = this.team.loadTemplate(this.config.template || "results");
+ this.node.html(template({team: this.team.name()}));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('ranking', function() {
+ var output = {};
+ output.perPage = [];
+ output.sort = [];
+ output.team = this.team.name();
+ output.showSort = this.config.show_sort;
+ output.showPerPage = this.config.show_perpage;
+
+ var order = this.team.sortOrder();
+ this.log("making sort, sortOrder = '" + order + "'");
+ for (var i = 0; i < this.config.sort_options.length; i++) {
+ var cur = {};
+ var opt = this.config.sort_options[i];
+ cur.key = opt[0];
+ cur.label = opt.length == 1 ? opt[0] : opt[1];
+ if (order == cur.key || order == cur.label) cur.selected = true;
+ output.sort.push(cur);
+ }
+
+ var perpage = this.team.perpage();
+ this.log("making perpage, perpage = " + perpage);
+ for(var i = 0; i < this.config.perpage_options.length; i++) {
+ var cur = {};
+ cur.perPage = this.config.perpage_options[i];
+ if (cur.perPage == perpage) cur.selected = true;
+ output.perPage.push(cur);
+ }
+
+ var template = this.team.loadTemplate(this.config.template || "ranking");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('lang', function() {
+ // dynamic URL or static page? /path/foo?query=test
+ /* create locale language menu */
+ if (!this.config.show_lang) return;
+
+ var lang_default = "en";
+ var lang = this.config.lang || lang_default;
+ var list = [];
+
+ /* display a list of configured languages, or all */
+ var lang_options = this.config.lang_options;
+ var toBeIncluded = {};
+ for (var i = 0; i < lang_options.length; i++) {
+ toBeIncluded[lang_options[i]] = true;
+ }
+
+ for (var k in mkws.locale_lang) {
+ if (toBeIncluded[k] || lang_options.length == 0) {
+ cur = {};
+ if (lang === k) cur.selected = true;
+ cur.code = k;
+ cur.url = lang_url(k);
+ list.push(cur);
+ }
+ }
+
+ // add english link
+ if (lang_options.length == 0 || toBeIncluded[lang_default]) {
+ cur = {};
+ if (lang === lang_default) cur.selected = true;
+ cur.code = lang_default;
+ cur.url = lang_url(lang_default);
+ list.push(cur);
+ }
+
+ this.log("language menu: " + list.join(", "));
+
+ var template = this.team.loadTemplate(this.config.template || "lang");
+ this.node.html(template({languages: list}));
+ this.hideWhenNarrow();
+
+ // set or re-set "lang" URL parameter
+ function lang_url(lang) {
+ var query = location.search;
+ // no query parameters? done
+ if (!query) {
+ return "?lang=" + lang;
+ }
+
+ // parameter does not exist
+ if (!query.match(/[\?&]lang=/)) {
+ return query + "&lang=" + lang;
+ }
+
+ // replace existing parameter
+ query = query.replace(/\?lang=([^&#;]*)/, "?lang=" + lang);
+ query = query.replace(/\&lang=([^&#;]*)/, "&lang=" + lang);
+ return query;
+ }
+});
+
+
+mkws.registerWidgetType('motd', function() {
+ var container = this.team.widget('motd-container');
+ if (container) {
+ // Move the MOTD from the provided element down into the container
+ this.node.appendTo(container.node);
+ }
+});
+
+
+// This widget has no functionality of its own, but its configuration
+// is copied up into its team, allowing it to affect other widgets in
+// the team.
+//
+mkws.registerWidgetType('config', function() {
+ var c = this.config;
+ for (var name in c) {
+ if (c.hasOwnProperty(name)) {
+ this.team.config[name] = c[name];
+ this.log(this + " copied property " + name + "='" + c[name] + "' up to team");
+ }
+ }
+});
+
+
+mkws.registerWidgetType('progress', function() {
+ var that = this;
+ this.node.hide();
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "progress");
+ that.node.html(template({
+ done: data.clients - data.activeclients,
+ waiting: data.activeclients
+ }));
+ that.node.show();
+ });
+});
+
+
+// Some elements have mkws* classes that makes them appear as widgets
+// -- for example, because we want to style them using CSS -- but have
+// no actual functionality. We register these to prevent ignorable
+// warnings when they occur.
+
+mkws.registerWidgetType('query', function() {});
+mkws.registerWidgetType('motd-container', function() {});
+mkws.registerWidgetType('button', function() {});
+
+
+})(mkws.$); // jQuery wrapper
+mkws.registerWidgetType('facets', function() {
+ // Initially hide the facets; display when we get results
+ var that = this;
+ var team = this.team;
+ team.queue("facets").subscribe(function(data) {
+ that.node.addClass("active");
+ });
+
+ var template = team.loadTemplate(this.config.template || "facets");
+ this.node.html(template({
+ team: team.name(),
+ facets: this.config.facets
+ }));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('facet', function() {
+ var facetConfig = {
+ xtargets: [ "Sources", 16, false ],
+ subject: [ "Subjects", 10, true ],
+ author: [ "Authors", 10, true ]
+ }
+ var that = this;
+ var team = this.team;
+ var name = that.config.facet;
+ var ref = facetConfig[name] || [ "Unknown", 10, true ];
+ var caption = this.config['facet_caption_' + name] || ref[0];
+ var max = parseInt(this.config['facet_max_' + name] || ref[1]);
+ var pzIndex = ref[2] ? name : null;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + that.type + '(' + name + ')]';
+ };
+
+ team.queue("facets").subscribe(function(data) {
+ data = data[name];
+ var terms = [];
+ var teamName = team.name();
+ for (var i = 0; i < data.length && i < max; i++) {
+ var linkdata = "";
+ var action = "";
+ if (!pzIndex) {
+ // Special case: target selection
+ linkdata += ('target_id='+data[i].id+' ');
+ if (!team.targetFiltered(data[i].id)) {
+ action = 'mkws.limitTarget(\'' + teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+ }
+ } else {
+ action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
+ }
+ linkdata += 'onclick="' + action + ';return false;"';
+ terms.push({
+ term: data[i].name,
+ field: data[i].id,
+ count: data[i].freq,
+ linkdata: linkdata
+ });
+ }
+ // configured template > facet specific template > default facet template
+ var template;
+ if (that.config.template) {
+ template = team.loadTemplate(that.config.template);
+ } else {
+ template = team.loadTemplate("facet-" + name);
+ if (template) {
+ that.log("Using facet-" + name + " template.")
+ } else {
+ that.log("No " + name + " specific template, using default.")
+ template = team.loadTemplate("facet");
+ }
+ }
+ that.node.html(template({
+ name: name,
+ caption: caption,
+ query: that.config.query,
+ terms: terms
+ }));
+ });
+ this.autosearch();
+});
+mkws.registerWidgetType('auth-name', function() {
+ var that = this;
+
+ this.team.queue("authenticated").subscribe(function(authName) {
+ that.node.html(authName);
+ });
+});
+mkws.registerWidgetType('categories', function() {
+ var that = this;
+
+ if (!mkws.authenticated) {
+ alert("can't use categories widget when not authenticated");
+ return;
+ }
+
+ this.team.queue("authenticated").subscribe(function(authName, realm) {
+ var req = new pzHttpRequest(mkws.pazpar2_url() + "?command=categories", function(err) {
+ alert("HTTP call for categories failed: " + err)
+ });
+
+ req.get(null, function(data) {
+ if (!$.isXMLDoc(data)) {
+ alert("categories response document is not XML");
+ return;
+ }
+ that.log("got categories: " + data);
+
+ var text = [];
+ text.push("Select category: ");
+ text.push("<select name='mkws-category mkwsCategory' " +
+ "onchange='mkws.limitCategory(\"" + that.team.name() + "\", this.value)'>");
+ text.push("<option value=''>[All]</option>");
+ $(data).find('category').each(function() {
+ var name = $(this).find('categoryName').text();
+ var id = $(this).find('categoryId').text();
+ text.push("<option value='", id, "'>", name, "</option>");
+ });
+ text.push("</select>");
+ that.node.html(text.join(''));
+ });
+ });
+});
+mkws.registerWidgetType('log', function() {
+ var that = this;
+
+ this.team.queue("log").subscribe(function(teamName, timestamp, message) {
+ that.node.append(teamName + ": " + timestamp + message + "<br/>");
+ });
+});
+// A widget for a record-list of a single record
+mkws.registerWidgetType('record', function() {
+ if (!this.config.maxrecs) this.config.maxrecs = 1;
+ var that = this;
+ var team = this.team;
+ team.queue("records").subscribe(function(data) {
+ var template = team.loadTemplate(that.config.template || "details");
+ var targs = mkws.$.extend({}, data.hits[0], that.config.template_vars);
+ that.node.html(template(targs));
+ });
+ that.autosearch();
+});
+
+mkws.registerWidgetType('images', function() {
+ mkws.promotionFunction('records').call(this);
+ if (!this.config.template) this.config.template = 'images';
+});
+
+mkws.registerWidgetType('google-image', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'Google_Images';
+});
+
+mkws.registerWidgetType('lolcat', function() {
+ mkws.promotionFunction('google-image').call(this);
+ if (!this.config.autosearch) this.config.autosearch = 'kitteh';
+});
+
+mkws.registerWidgetType('cover-art', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'AmazonBooks';
+});
+mkws.registerWidgetType('reference', function() {
+ mkws.promotionFunction('record').call(this);
+ if (!this.config.target) this.config.target = 'wikimedia_wikipedia_single_result';
+ if (!this.config.template) this.config.template = 'reference';
+ this.config.template_vars.paragraphs = this.config.paragraphs || 0;
+ this.config.template_vars.sentences = this.config.sentences || 0;
+});
+mkws.registerWidgetType('builder', function() {
+ var that = this;
+ var team = this.team;
+
+ var button = mkws.$('<button/>', {
+ type: 'button',
+ text: this.config.text || "Build!"
+ });
+ this.node.append(button);
+ button.click(function() {
+ var query = team.widget('query').value();
+ var sort = team.widget('sort').value();
+ var perpage = team.widget('per-page').value();
+
+ var html = ('<div class="mkws-records mkwsRecords" ' +
+ 'autosearch="' + query + '" ' +
+ 'sort="' + sort + '" ' +
+ 'perpage="' + perpage + '"></div>');
+ var fn = that.callback || alert;
+ fn(html);
+ });
+});
+
+mkws.registerWidgetType('console-builder', function() {
+ mkws.promotionFunction('builder').call(this);
+ this.callback = function(s) {
+ console.log("generated widget: " + s);
+ }
+});
+(function() {
+ var template = Handlebars.template, templates = mkws.defaultTemplates = mkws.defaultTemplates || {};
+templates['details'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " ("
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Date", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Author", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"9":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Links", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, lambda=this.lambda, escapeExpression=this.escapeExpression, functionType="function", helperMissing=helpers.helperMissing;
+ return " <a href=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\">Link"
+ + escapeExpression(((helper = (helper = helpers['mkws-index1'] || (depth0 != null ? depth0['mkws-index1'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"mkws-index1","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Subject", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-first","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(13, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"13":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(15, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"15":function(depth0,helpers,partials,data) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(lambda(depth0, depth0));
+},"17":function(depth0,helpers,partials,data) {
+ var helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helpers['mkws-attr'] || (depth0 && depth0['mkws-attr']) || helperMissing).call(depth0, "@name", {"name":"mkws-attr","hash":{},"data":data})));
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<table>\n <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Title", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </td>\n </tr>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-if-any'] || (depth0 && depth0['mkws-if-any']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-if-any","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(12, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Locations", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(17, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n </td>\n </tr>\n</table>\n";
+},"useData":true});
+templates['done'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search complete: found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n\n";
+},"useData":true});
+templates['facet'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\"mkws-term mkwsTerm\">\n <a href=\"#\" ";
+ stack1 = ((helper = (helper = helpers.linkdata || (depth0 != null ? depth0.linkdata : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"linkdata","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + ">"
+ + escapeExpression(((helper = (helper = helpers.term || (depth0 != null ? depth0.term : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"term","hash":{},"data":data}) : helper)))
+ + "</a> <span>"
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + "</span>\n </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n<div class=\"mkws-facet-title mkwsFacetTitle\">"
+ + escapeExpression(((helper = (helper = helpers.caption || (depth0 != null ? depth0.caption : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"caption","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.terms : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['facets'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-facet mkwsFacet mkws-team-"
+ + escapeExpression(lambda((depths[1] != null ? depths[1].team : depths[1]), depth0))
+ + "\" data-mkws-facet=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\"></div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.facets : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['images'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"mkws-first","hash":{},"fn":this.program(2, data, depths),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " <br/>\n </a>\n";
+},"2":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <img src=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\" alt=\""
+ + escapeExpression(lambda((depths[1] != null ? depths[1]['md-title'] : depths[1]), depth0))
+ + "\"/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['lang'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<span>"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</span>";
+},"4":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<a href=\"";
+ stack1 = ((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\">"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</a>";
+},"6":function(depth0,helpers,partials,data) {
+ return " |\n";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.languages : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['navi'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.facet : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": <a class=\"mkws-removable mkwsRemovable\" href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">"
+ + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+ + "</a>\n ";
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"2":function(depth0,helpers,partials,data) {
+ return "|";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.filters : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['pager'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" class=\"mkws-prev mkwsPrev\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.prevClick || (depth0 != null ? depth0.prevClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"prevClick","hash":{},"data":data}) : helper)))
+ + "\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a> |\n";
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " <span class=\"mkws-prev mkwsPrev\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span> |\n";
+},"5":function(depth0,helpers,partials,data) {
+ return "...";
+ },"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.click : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.program(10, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <a href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-current-page mkwsCurrentPage\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " | <a href=\"#\" class=\"mkws-next mkwsNext\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.nextClick || (depth0 != null ? depth0.nextClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nextClick","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></a>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " | <span class=\"mkws-next mkwsNext\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></span>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<div style=\"float: right\">\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Displaying", {"name":"mkws-translate","hash":{},"data":data})))
+ + ":\n "
+ + escapeExpression(((helper = (helper = helpers.first || (depth0 != null ? depth0.first : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"first","hash":{},"data":data}) : helper)))
+ + " "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "to", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.last || (depth0 != null ? depth0.last : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"last","hash":{},"data":data}) : helper)))
+ + "\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "of", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " (";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": "
+ + escapeExpression(((helper = (helper = helpers.found || (depth0 != null ? depth0.found : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"found","hash":{},"data":data}) : helper)))
+ + ")\n</div>\n\n<div style=\"float: clear\">\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.prevClick : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.morePrev : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.pages : depth0), {"name":"each","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.moreNext : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.nextClick : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.program(14, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</div>\n";
+},"useData":true});
+templates['progress'] = template({"1":function(depth0,helpers,partials,data) {
+ return "█";
+ },"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-waiting mkws-waiting mkwsWaiting\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span>";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-done mkws-done mkwsDone\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.done : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</span>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['ranking'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Sort by", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-sort mkwsSort mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.sort : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </select>";
+},"2":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(5, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " <option value=\"";
+ stack1 = ((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\" selected=\"selected\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "and show", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-perpage mkwsPerpage mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.perPage : depth0), {"name":"each","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </select>\n ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "per page", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.program(11, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"9":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\" selected=\"selected\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"11":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "<form>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showSort : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showPerPage : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</form>\n\n";
+},"useData":true});
+templates['records'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\""
+ + escapeExpression(((helper = (helper = helpers.containerClass || (depth0 != null ? depth0.containerClass : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"containerClass","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = this.invokePartial(partials.summary, ' ', 'summary', depth0, undefined, helpers, partials, data);
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"usePartial":true,"useData":true});
+templates['reference'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<b>"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</b>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<img src=\""
+ + escapeExpression(((helper = (helper = helpers['md-thumburl'] || (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-thumburl","hash":{},"data":data}) : helper)))
+ + "\" alt=\""
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\">\n<h1><a href=\""
+ + escapeExpression(((helper = (helper = helpers['md-electronic-url'] || (depth0 != null ? depth0['md-electronic-url'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-electronic-url","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "</a></h1>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-paragraphs'] || (depth0 && depth0['mkws-paragraphs']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-description'] : depth0), (depth0 != null ? depth0.paragraphs : depth0), (depth0 != null ? depth0.sentences : depth0), {"name":"mkws-paragraphs","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n<p class=\"mkws-credit mkwsCredit\">Wikipedia</p>\n";
+},"useData":true});
+templates['results'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<table width=\"100%\" border=\"0\" cellpadding=\"6\" cellspacing=\"0\">\n <tr>\n <td class=\"mkws-facets-container-wide mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" width=\"250\" valign=\"top\">\n <div class=\"mkws-facets mkwsTermlists mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n <td class=\"mkws-motd-container mkwsMOTDContainer mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" valign=\"top\">\n <div class=\"mkws-ranking mkwsRanking mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-pager mkwsPager mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-navi mkwsNavi mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-records mkwsRecords mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\">\n <div class=\"mkws-facets-container-narrow mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n</table>\n\n";
+},"useData":true});
+templates['search'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<form name=\"mkws-search-form\" class=\"mkws-search-form mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" action=\"\">\n <input class=\"mkws-query mkws-query mkwsQuery mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"text\"/>\n <input class=\"mkws-button mkws-button mkwsButton mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"submit\" value=\"";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\"/>\n</form>\n\n";
+},"useData":true});
+templates['stat'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " -- <span class=\"mkws-client-count mkwsClientCount\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Active clients", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " : "
+ + escapeExpression(((helper = (helper = helpers.activeclients || (depth0 != null ? depth0.activeclients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"activeclients","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.clients || (depth0 != null ? depth0.clients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"clients","hash":{},"data":data}) : helper)))
+ + "</span> -- ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Retrieved records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " : "
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "\n";
+},"useData":true});
+templates['summary'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, lambda=this.lambda;
+ return " <a class=\"mkws-field-thumb\" href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n <img src=\""
+ + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? stack1['0'] : stack1), depth0))
+ + "\"/>\n </a>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-title-remainder\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-field-description\">"
+ + escapeExpression(((helper = (helper = helpers['md-description'] || (depth0 != null ? depth0['md-description'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-description","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-date\">"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " ";
+ stack1 = ((helper = (helper = helpers.renderedDetails || (depth0 != null ? depth0.renderedDetails : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"renderedDetails","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "<div class=\"mkws-field-data\">\n <span class=\"mkws-field-title\">\n <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n </a>\n </span>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-description'] : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</div>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.renderedDetails : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['switch'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.recordClick || (depth0 != null ? depth0.recordClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"recordClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</a>\n<span>|</span>\n<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.targetClick || (depth0 != null ? depth0.targetClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"targetClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Targets", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a>\n";
+},"useData":true});
+templates['targets'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <td>";
+ stack1 = ((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.message : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.state || (depth0 != null ? depth0.state : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"state","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helper = (helper = helpers.diagnostic || (depth0 != null ? depth0.diagnostic : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"diagnostic","hash":{},"data":data}) : helper)))
+ + " ("
+ + escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<table>\n <thead>\n <tr>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Target ID", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Hits", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Diags", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "State", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n </td>\n </tr>\n </thead>\n <tbody>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.data : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </tbody>\n</table>\n";
+},"useData":true});
+})();/* generic function to open results in a popup window
+ *
+ */
+
+//"use strict";
+// $(document).ready(function () {
+mkws.registerWidgetType('popup', function() {
+ var $ = mkws.$;
+ var debug = this.log;
+ debug("init popup window");
+
+ var popup_window = $(this.node);
+ // var popup_window = $(".mkws-popup mkwsPopup"); // $(document).ready()
+ if (!popup_window) {
+ debug("no popup found, skip...");
+ return;
+ } else {
+ debug("number of popup windows found: " + popup_window.length);
+ }
+
+ if (!$.ui) {
+ alert("Error: jquery-ui.js is missing, did you include it after jQuery core in the HTML file?");
+ return;
+ }
+
+ // more than one widget on a page are possible
+ popup_window.each(function(i) {
+ var that = $(this);
+
+ // all atributes are strings, convert them to integers here
+ var width = parseInt(that.attr("popup_width") || "800");
+ var height = parseInt(that.attr("popup_height") || "600");
+ var autoOpen = parseInt(that.attr("popup_autoOpen") || "0");
+ var modal = parseInt(that.attr("popup_modal") || "0");
+
+ debug("Popup parameters: width: " + width + ", height: " + height + ", autoOpen: " + autoOpen);
+ that.dialog({
+ closeOnEscape: true,
+ autoOpen: autoOpen,
+ height: height,
+ width: width,
+ modal: modal ? true : false,
+ resizable: true,
+ buttons: {
+ Cancel: function() {
+ that.dialog("close");
+ }
+ },
+ close: function() {}
+ });
+
+ // open at search query submit: "input.mkws-button mkwsButton"
+ var id_botton = that.attr("popup_button");
+ if (id_botton) {
+ $(id_botton).button().click(function() {
+ that.dialog("open");
+ });
+ }
+ });
+});
--- /dev/null
+/*! Copyright (c) 2013-2014 Index Data ApS. http://indexdata.com
+ Licence: LGPL, http://www.indexdata.com/licences/lgpl
+ created at: Tue Nov 11 13:25:11 GMT 2014
+ MKWS GIT id: b99a8c62ed342809871bdad8ec8890809ee0b726
+ pz2.js GIT id: 376322f0e5d56c9dcc23d0f7d15c90eb58342326
+*/
+/*! jQuery v1.10.0 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.0",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),r.attributes=ct(function(e){return e.innerHTML="<a href='#'></a>",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="<input>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;
+if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})
+}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(n.unit=o,n.start=+a||+r||0,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);a.finish=function(){t.stop(!0)},(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
+/**
+ * jQuery JSON plugin 2.4.0
+ *
+ * @author Brantley Harris, 2009-2011
+ * @author Timo Tijhof, 2011-2012
+ * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
+ * copyrighted 2005 by Bob Ippolito.
+ * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
+ * website's http://www.json.org/json2.js, which proclaims:
+ * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ * I uphold.
+ * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
+ */
+(function ($) {
+ 'use strict';
+
+ var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
+ meta = {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ hasOwn = Object.prototype.hasOwnProperty;
+
+ /**
+ * jQuery.toJSON
+ * Converts the given argument into a JSON representation.
+ *
+ * @param o {Mixed} The json-serializable *thing* to be converted
+ *
+ * If an object has a toJSON prototype, that will be used to get the representation.
+ * Non-integer/string keys are skipped in the object, as are keys that point to a
+ * function.
+ *
+ */
+ $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
+ if (o === null) {
+ return 'null';
+ }
+
+ var pairs, k, name, val,
+ type = $.type(o);
+
+ if (type === 'undefined') {
+ return undefined;
+ }
+
+ // Also covers instantiated Number and Boolean objects,
+ // which are typeof 'object' but thanks to $.type, we
+ // catch them here. I don't know whether it is right
+ // or wrong that instantiated primitives are not
+ // exported to JSON as an {"object":..}.
+ // We choose this path because that's what the browsers did.
+ if (type === 'number' || type === 'boolean') {
+ return String(o);
+ }
+ if (type === 'string') {
+ return $.quoteString(o);
+ }
+ if (typeof o.toJSON === 'function') {
+ return $.toJSON(o.toJSON());
+ }
+ if (type === 'date') {
+ var month = o.getUTCMonth() + 1,
+ day = o.getUTCDate(),
+ year = o.getUTCFullYear(),
+ hours = o.getUTCHours(),
+ minutes = o.getUTCMinutes(),
+ seconds = o.getUTCSeconds(),
+ milli = o.getUTCMilliseconds();
+
+ if (month < 10) {
+ month = '0' + month;
+ }
+ if (day < 10) {
+ day = '0' + day;
+ }
+ if (hours < 10) {
+ hours = '0' + hours;
+ }
+ if (minutes < 10) {
+ minutes = '0' + minutes;
+ }
+ if (seconds < 10) {
+ seconds = '0' + seconds;
+ }
+ if (milli < 100) {
+ milli = '0' + milli;
+ }
+ if (milli < 10) {
+ milli = '0' + milli;
+ }
+ return '"' + year + '-' + month + '-' + day + 'T' +
+ hours + ':' + minutes + ':' + seconds +
+ '.' + milli + 'Z"';
+ }
+
+ pairs = [];
+
+ if ($.isArray(o)) {
+ for (k = 0; k < o.length; k++) {
+ pairs.push($.toJSON(o[k]) || 'null');
+ }
+ return '[' + pairs.join(',') + ']';
+ }
+
+ // Any other object (plain object, RegExp, ..)
+ // Need to do typeof instead of $.type, because we also
+ // want to catch non-plain objects.
+ if (typeof o === 'object') {
+ for (k in o) {
+ // Only include own properties,
+ // Filter out inherited prototypes
+ if (hasOwn.call(o, k)) {
+ // Keys must be numerical or string. Skip others
+ type = typeof k;
+ if (type === 'number') {
+ name = '"' + k + '"';
+ } else if (type === 'string') {
+ name = $.quoteString(k);
+ } else {
+ continue;
+ }
+ type = typeof o[k];
+
+ // Invalid values like these return undefined
+ // from toJSON, however those object members
+ // shouldn't be included in the JSON string at all.
+ if (type !== 'function' && type !== 'undefined') {
+ val = $.toJSON(o[k]);
+ pairs.push(name + ':' + val);
+ }
+ }
+ }
+ return '{' + pairs.join(',') + '}';
+ }
+ };
+
+ /**
+ * jQuery.evalJSON
+ * Evaluates a given json string.
+ *
+ * @param str {String}
+ */
+ $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
+ };
+
+ /**
+ * jQuery.secureEvalJSON
+ * Evals JSON in a way that is *more* secure.
+ *
+ * @param str {String}
+ */
+ $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+ var filtered =
+ str
+ .replace(/\\["\\\/bfnrtu]/g, '@')
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+
+ if (/^[\],:{}\s]*$/.test(filtered)) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
+ }
+ throw new SyntaxError('Error parsing JSON, source is not valid.');
+ };
+
+ /**
+ * jQuery.quoteString
+ * Returns a string-repr of a string, escaping quotes intelligently.
+ * Mostly a support function for toJSON.
+ * Examples:
+ * >>> jQuery.quoteString('apple')
+ * "apple"
+ *
+ * >>> jQuery.quoteString('"Where are we going?", she asked.')
+ * "\"Where are we going?\", she asked."
+ */
+ $.quoteString = function (str) {
+ if (str.match(escape)) {
+ return '"' + str.replace(escape, function (a) {
+ var c = meta[a];
+ if (typeof c === 'string') {
+ return c;
+ }
+ c = a.charCodeAt();
+ return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
+ }) + '"';
+ }
+ return '"' + str + '"';
+ };
+
+}(jQuery));
+mkws_jQuery = jQuery.noConflict(true);
+/*!
+
+ handlebars v2.0.0
+
+Copyright (C) 2011-2014 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@license
+*/
+/* exported Handlebars */
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define([], factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.Handlebars = root.Handlebars || factory();
+ }
+}(this, function () {
+// handlebars/safe-string.js
+var __module4__ = (function() {
+ "use strict";
+ var __exports__;
+ // Build out our basic SafeString type
+ function SafeString(string) {
+ this.string = string;
+ }
+
+ SafeString.prototype.toString = function() {
+ return "" + this.string;
+ };
+
+ __exports__ = SafeString;
+ return __exports__;
+})();
+
+// handlebars/utils.js
+var __module3__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__ = {};
+ /*jshint -W004 */
+ var SafeString = __dependency1__;
+
+ var escape = {
+ "&": "&",
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ };
+
+ var badChars = /[&<>"'`]/g;
+ var possible = /[&<>"'`]/;
+
+ function escapeChar(chr) {
+ return escape[chr];
+ }
+
+ function extend(obj /* , ...source */) {
+ for (var i = 1; i < arguments.length; i++) {
+ for (var key in arguments[i]) {
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
+ obj[key] = arguments[i][key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ __exports__.extend = extend;var toString = Object.prototype.toString;
+ __exports__.toString = toString;
+ // Sourced from lodash
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
+ var isFunction = function(value) {
+ return typeof value === 'function';
+ };
+ // fallback for older versions of Chrome and Safari
+ /* istanbul ignore next */
+ if (isFunction(/x/)) {
+ isFunction = function(value) {
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
+ };
+ }
+ var isFunction;
+ __exports__.isFunction = isFunction;
+ /* istanbul ignore next */
+ var isArray = Array.isArray || function(value) {
+ return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
+ };
+ __exports__.isArray = isArray;
+
+ function escapeExpression(string) {
+ // don't escape SafeStrings, since they're already safe
+ if (string instanceof SafeString) {
+ return string.toString();
+ } else if (string == null) {
+ return "";
+ } else if (!string) {
+ return string + '';
+ }
+
+ // Force a string conversion as this will be done by the append regardless and
+ // the regex test will do this transparently behind the scenes, causing issues if
+ // an object's to string has escaped characters in it.
+ string = "" + string;
+
+ if(!possible.test(string)) { return string; }
+ return string.replace(badChars, escapeChar);
+ }
+
+ __exports__.escapeExpression = escapeExpression;function isEmpty(value) {
+ if (!value && value !== 0) {
+ return true;
+ } else if (isArray(value) && value.length === 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ __exports__.isEmpty = isEmpty;function appendContextPath(contextPath, id) {
+ return (contextPath ? contextPath + '.' : '') + id;
+ }
+
+ __exports__.appendContextPath = appendContextPath;
+ return __exports__;
+})(__module4__);
+
+// handlebars/exception.js
+var __module5__ = (function() {
+ "use strict";
+ var __exports__;
+
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+ function Exception(message, node) {
+ var line;
+ if (node && node.firstLine) {
+ line = node.firstLine;
+
+ message += ' - ' + line + ':' + node.firstColumn;
+ }
+
+ var tmp = Error.prototype.constructor.call(this, message);
+
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
+ for (var idx = 0; idx < errorProps.length; idx++) {
+ this[errorProps[idx]] = tmp[errorProps[idx]];
+ }
+
+ if (line) {
+ this.lineNumber = line;
+ this.column = node.firstColumn;
+ }
+ }
+
+ Exception.prototype = new Error();
+
+ __exports__ = Exception;
+ return __exports__;
+})();
+
+// handlebars/base.js
+var __module2__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__ = {};
+ var Utils = __dependency1__;
+ var Exception = __dependency2__;
+
+ var VERSION = "2.0.0";
+ __exports__.VERSION = VERSION;var COMPILER_REVISION = 6;
+ __exports__.COMPILER_REVISION = COMPILER_REVISION;
+ var REVISION_CHANGES = {
+ 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
+ 2: '== 1.0.0-rc.3',
+ 3: '== 1.0.0-rc.4',
+ 4: '== 1.x.x',
+ 5: '== 2.0.0-alpha.x',
+ 6: '>= 2.0.0-beta.1'
+ };
+ __exports__.REVISION_CHANGES = REVISION_CHANGES;
+ var isArray = Utils.isArray,
+ isFunction = Utils.isFunction,
+ toString = Utils.toString,
+ objectType = '[object Object]';
+
+ function HandlebarsEnvironment(helpers, partials) {
+ this.helpers = helpers || {};
+ this.partials = partials || {};
+
+ registerDefaultHelpers(this);
+ }
+
+ __exports__.HandlebarsEnvironment = HandlebarsEnvironment;HandlebarsEnvironment.prototype = {
+ constructor: HandlebarsEnvironment,
+
+ logger: logger,
+ log: log,
+
+ registerHelper: function(name, fn) {
+ if (toString.call(name) === objectType) {
+ if (fn) { throw new Exception('Arg not supported with multiple helpers'); }
+ Utils.extend(this.helpers, name);
+ } else {
+ this.helpers[name] = fn;
+ }
+ },
+ unregisterHelper: function(name) {
+ delete this.helpers[name];
+ },
+
+ registerPartial: function(name, partial) {
+ if (toString.call(name) === objectType) {
+ Utils.extend(this.partials, name);
+ } else {
+ this.partials[name] = partial;
+ }
+ },
+ unregisterPartial: function(name) {
+ delete this.partials[name];
+ }
+ };
+
+ function registerDefaultHelpers(instance) {
+ instance.registerHelper('helperMissing', function(/* [args, ]options */) {
+ if(arguments.length === 1) {
+ // A missing field in a {{foo}} constuct.
+ return undefined;
+ } else {
+ // Someone is actually trying to call something, blow up.
+ throw new Exception("Missing helper: '" + arguments[arguments.length-1].name + "'");
+ }
+ });
+
+ instance.registerHelper('blockHelperMissing', function(context, options) {
+ var inverse = options.inverse,
+ fn = options.fn;
+
+ if(context === true) {
+ return fn(this);
+ } else if(context === false || context == null) {
+ return inverse(this);
+ } else if (isArray(context)) {
+ if(context.length > 0) {
+ if (options.ids) {
+ options.ids = [options.name];
+ }
+
+ return instance.helpers.each(context, options);
+ } else {
+ return inverse(this);
+ }
+ } else {
+ if (options.data && options.ids) {
+ var data = createFrame(options.data);
+ data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);
+ options = {data: data};
+ }
+
+ return fn(context, options);
+ }
+ });
+
+ instance.registerHelper('each', function(context, options) {
+ if (!options) {
+ throw new Exception('Must pass iterator to #each');
+ }
+
+ var fn = options.fn, inverse = options.inverse;
+ var i = 0, ret = "", data;
+
+ var contextPath;
+ if (options.data && options.ids) {
+ contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
+ }
+
+ if (isFunction(context)) { context = context.call(this); }
+
+ if (options.data) {
+ data = createFrame(options.data);
+ }
+
+ if(context && typeof context === 'object') {
+ if (isArray(context)) {
+ for(var j = context.length; i<j; i++) {
+ if (data) {
+ data.index = i;
+ data.first = (i === 0);
+ data.last = (i === (context.length-1));
+
+ if (contextPath) {
+ data.contextPath = contextPath + i;
+ }
+ }
+ ret = ret + fn(context[i], { data: data });
+ }
+ } else {
+ for(var key in context) {
+ if(context.hasOwnProperty(key)) {
+ if(data) {
+ data.key = key;
+ data.index = i;
+ data.first = (i === 0);
+
+ if (contextPath) {
+ data.contextPath = contextPath + key;
+ }
+ }
+ ret = ret + fn(context[key], {data: data});
+ i++;
+ }
+ }
+ }
+ }
+
+ if(i === 0){
+ ret = inverse(this);
+ }
+
+ return ret;
+ });
+
+ instance.registerHelper('if', function(conditional, options) {
+ if (isFunction(conditional)) { conditional = conditional.call(this); }
+
+ // Default behavior is to render the positive path if the value is truthy and not empty.
+ // The `includeZero` option may be set to treat the condtional as purely not empty based on the
+ // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
+ if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) {
+ return options.inverse(this);
+ } else {
+ return options.fn(this);
+ }
+ });
+
+ instance.registerHelper('unless', function(conditional, options) {
+ return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});
+ });
+
+ instance.registerHelper('with', function(context, options) {
+ if (isFunction(context)) { context = context.call(this); }
+
+ var fn = options.fn;
+
+ if (!Utils.isEmpty(context)) {
+ if (options.data && options.ids) {
+ var data = createFrame(options.data);
+ data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);
+ options = {data:data};
+ }
+
+ return fn(context, options);
+ } else {
+ return options.inverse(this);
+ }
+ });
+
+ instance.registerHelper('log', function(message, options) {
+ var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
+ instance.log(level, message);
+ });
+
+ instance.registerHelper('lookup', function(obj, field) {
+ return obj && obj[field];
+ });
+ }
+
+ var logger = {
+ methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },
+
+ // State enum
+ DEBUG: 0,
+ INFO: 1,
+ WARN: 2,
+ ERROR: 3,
+ level: 3,
+
+ // can be overridden in the host environment
+ log: function(level, message) {
+ if (logger.level <= level) {
+ var method = logger.methodMap[level];
+ if (typeof console !== 'undefined' && console[method]) {
+ console[method].call(console, message);
+ }
+ }
+ }
+ };
+ __exports__.logger = logger;
+ var log = logger.log;
+ __exports__.log = log;
+ var createFrame = function(object) {
+ var frame = Utils.extend({}, object);
+ frame._parent = object;
+ return frame;
+ };
+ __exports__.createFrame = createFrame;
+ return __exports__;
+})(__module3__, __module5__);
+
+// handlebars/runtime.js
+var __module6__ = (function(__dependency1__, __dependency2__, __dependency3__) {
+ "use strict";
+ var __exports__ = {};
+ var Utils = __dependency1__;
+ var Exception = __dependency2__;
+ var COMPILER_REVISION = __dependency3__.COMPILER_REVISION;
+ var REVISION_CHANGES = __dependency3__.REVISION_CHANGES;
+ var createFrame = __dependency3__.createFrame;
+
+ function checkRevision(compilerInfo) {
+ var compilerRevision = compilerInfo && compilerInfo[0] || 1,
+ currentRevision = COMPILER_REVISION;
+
+ if (compilerRevision !== currentRevision) {
+ if (compilerRevision < currentRevision) {
+ var runtimeVersions = REVISION_CHANGES[currentRevision],
+ compilerVersions = REVISION_CHANGES[compilerRevision];
+ throw new Exception("Template was precompiled with an older version of Handlebars than the current runtime. "+
+ "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").");
+ } else {
+ // Use the embedded version info since the runtime doesn't know about this revision yet
+ throw new Exception("Template was precompiled with a newer version of Handlebars than the current runtime. "+
+ "Please update your runtime to a newer version ("+compilerInfo[1]+").");
+ }
+ }
+ }
+
+ __exports__.checkRevision = checkRevision;// TODO: Remove this line and break up compilePartial
+
+ function template(templateSpec, env) {
+ /* istanbul ignore next */
+ if (!env) {
+ throw new Exception("No environment passed to template");
+ }
+ if (!templateSpec || !templateSpec.main) {
+ throw new Exception('Unknown template object: ' + typeof templateSpec);
+ }
+
+ // Note: Using env.VM references rather than local var references throughout this section to allow
+ // for external users to override these as psuedo-supported APIs.
+ env.VM.checkRevision(templateSpec.compiler);
+
+ var invokePartialWrapper = function(partial, indent, name, context, hash, helpers, partials, data, depths) {
+ if (hash) {
+ context = Utils.extend({}, context, hash);
+ }
+
+ var result = env.VM.invokePartial.call(this, partial, name, context, helpers, partials, data, depths);
+
+ if (result == null && env.compile) {
+ var options = { helpers: helpers, partials: partials, data: data, depths: depths };
+ partials[name] = env.compile(partial, { data: data !== undefined, compat: templateSpec.compat }, env);
+ result = partials[name](context, options);
+ }
+ if (result != null) {
+ if (indent) {
+ var lines = result.split('\n');
+ for (var i = 0, l = lines.length; i < l; i++) {
+ if (!lines[i] && i + 1 === l) {
+ break;
+ }
+
+ lines[i] = indent + lines[i];
+ }
+ result = lines.join('\n');
+ }
+ return result;
+ } else {
+ throw new Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
+ }
+ };
+
+ // Just add water
+ var container = {
+ lookup: function(depths, name) {
+ var len = depths.length;
+ for (var i = 0; i < len; i++) {
+ if (depths[i] && depths[i][name] != null) {
+ return depths[i][name];
+ }
+ }
+ },
+ lambda: function(current, context) {
+ return typeof current === 'function' ? current.call(context) : current;
+ },
+
+ escapeExpression: Utils.escapeExpression,
+ invokePartial: invokePartialWrapper,
+
+ fn: function(i) {
+ return templateSpec[i];
+ },
+
+ programs: [],
+ program: function(i, data, depths) {
+ var programWrapper = this.programs[i],
+ fn = this.fn(i);
+ if (data || depths) {
+ programWrapper = program(this, i, fn, data, depths);
+ } else if (!programWrapper) {
+ programWrapper = this.programs[i] = program(this, i, fn);
+ }
+ return programWrapper;
+ },
+
+ data: function(data, depth) {
+ while (data && depth--) {
+ data = data._parent;
+ }
+ return data;
+ },
+ merge: function(param, common) {
+ var ret = param || common;
+
+ if (param && common && (param !== common)) {
+ ret = Utils.extend({}, common, param);
+ }
+
+ return ret;
+ },
+
+ noop: env.VM.noop,
+ compilerInfo: templateSpec.compiler
+ };
+
+ var ret = function(context, options) {
+ options = options || {};
+ var data = options.data;
+
+ ret._setup(options);
+ if (!options.partial && templateSpec.useData) {
+ data = initData(context, data);
+ }
+ var depths;
+ if (templateSpec.useDepths) {
+ depths = options.depths ? [context].concat(options.depths) : [context];
+ }
+
+ return templateSpec.main.call(container, context, container.helpers, container.partials, data, depths);
+ };
+ ret.isTop = true;
+
+ ret._setup = function(options) {
+ if (!options.partial) {
+ container.helpers = container.merge(options.helpers, env.helpers);
+
+ if (templateSpec.usePartial) {
+ container.partials = container.merge(options.partials, env.partials);
+ }
+ } else {
+ container.helpers = options.helpers;
+ container.partials = options.partials;
+ }
+ };
+
+ ret._child = function(i, data, depths) {
+ if (templateSpec.useDepths && !depths) {
+ throw new Exception('must pass parent depths');
+ }
+
+ return program(container, i, templateSpec[i], data, depths);
+ };
+ return ret;
+ }
+
+ __exports__.template = template;function program(container, i, fn, data, depths) {
+ var prog = function(context, options) {
+ options = options || {};
+
+ return fn.call(container, context, container.helpers, container.partials, options.data || data, depths && [context].concat(depths));
+ };
+ prog.program = i;
+ prog.depth = depths ? depths.length : 0;
+ return prog;
+ }
+
+ __exports__.program = program;function invokePartial(partial, name, context, helpers, partials, data, depths) {
+ var options = { partial: true, helpers: helpers, partials: partials, data: data, depths: depths };
+
+ if(partial === undefined) {
+ throw new Exception("The partial " + name + " could not be found");
+ } else if(partial instanceof Function) {
+ return partial(context, options);
+ }
+ }
+
+ __exports__.invokePartial = invokePartial;function noop() { return ""; }
+
+ __exports__.noop = noop;function initData(context, data) {
+ if (!data || !('root' in data)) {
+ data = data ? createFrame(data) : {};
+ data.root = context;
+ }
+ return data;
+ }
+ return __exports__;
+})(__module3__, __module5__, __module2__);
+
+// handlebars.runtime.js
+var __module1__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
+ "use strict";
+ var __exports__;
+ /*globals Handlebars: true */
+ var base = __dependency1__;
+
+ // Each of these augment the Handlebars object. No need to setup here.
+ // (This is done to easily share code between commonjs and browse envs)
+ var SafeString = __dependency2__;
+ var Exception = __dependency3__;
+ var Utils = __dependency4__;
+ var runtime = __dependency5__;
+
+ // For compatibility and usage outside of module systems, make the Handlebars object a namespace
+ var create = function() {
+ var hb = new base.HandlebarsEnvironment();
+
+ Utils.extend(hb, base);
+ hb.SafeString = SafeString;
+ hb.Exception = Exception;
+ hb.Utils = Utils;
+ hb.escapeExpression = Utils.escapeExpression;
+
+ hb.VM = runtime;
+ hb.template = function(spec) {
+ return runtime.template(spec, hb);
+ };
+
+ return hb;
+ };
+
+ var Handlebars = create();
+ Handlebars.create = create;
+
+ Handlebars['default'] = Handlebars;
+
+ __exports__ = Handlebars;
+ return __exports__;
+})(__module2__, __module4__, __module5__, __module3__, __module6__);
+
+// handlebars/compiler/ast.js
+var __module7__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__;
+ var Exception = __dependency1__;
+
+ function LocationInfo(locInfo) {
+ locInfo = locInfo || {};
+ this.firstLine = locInfo.first_line;
+ this.firstColumn = locInfo.first_column;
+ this.lastColumn = locInfo.last_column;
+ this.lastLine = locInfo.last_line;
+ }
+
+ var AST = {
+ ProgramNode: function(statements, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "program";
+ this.statements = statements;
+ this.strip = strip;
+ },
+
+ MustacheNode: function(rawParams, hash, open, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "mustache";
+ this.strip = strip;
+
+ // Open may be a string parsed from the parser or a passed boolean flag
+ if (open != null && open.charAt) {
+ // Must use charAt to support IE pre-10
+ var escapeFlag = open.charAt(3) || open.charAt(2);
+ this.escaped = escapeFlag !== '{' && escapeFlag !== '&';
+ } else {
+ this.escaped = !!open;
+ }
+
+ if (rawParams instanceof AST.SexprNode) {
+ this.sexpr = rawParams;
+ } else {
+ // Support old AST API
+ this.sexpr = new AST.SexprNode(rawParams, hash);
+ }
+
+ // Support old AST API that stored this info in MustacheNode
+ this.id = this.sexpr.id;
+ this.params = this.sexpr.params;
+ this.hash = this.sexpr.hash;
+ this.eligibleHelper = this.sexpr.eligibleHelper;
+ this.isHelper = this.sexpr.isHelper;
+ },
+
+ SexprNode: function(rawParams, hash, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ this.type = "sexpr";
+ this.hash = hash;
+
+ var id = this.id = rawParams[0];
+ var params = this.params = rawParams.slice(1);
+
+ // a mustache is definitely a helper if:
+ // * it is an eligible helper, and
+ // * it has at least one parameter or hash segment
+ this.isHelper = !!(params.length || hash);
+
+ // a mustache is an eligible helper if:
+ // * its id is simple (a single part, not `this` or `..`)
+ this.eligibleHelper = this.isHelper || id.isSimple;
+
+ // if a mustache is an eligible helper but not a definite
+ // helper, it is ambiguous, and will be resolved in a later
+ // pass or at runtime.
+ },
+
+ PartialNode: function(partialName, context, hash, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "partial";
+ this.partialName = partialName;
+ this.context = context;
+ this.hash = hash;
+ this.strip = strip;
+
+ this.strip.inlineStandalone = true;
+ },
+
+ BlockNode: function(mustache, program, inverse, strip, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ this.type = 'block';
+ this.mustache = mustache;
+ this.program = program;
+ this.inverse = inverse;
+ this.strip = strip;
+
+ if (inverse && !program) {
+ this.isInverse = true;
+ }
+ },
+
+ RawBlockNode: function(mustache, content, close, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ if (mustache.sexpr.id.original !== close) {
+ throw new Exception(mustache.sexpr.id.original + " doesn't match " + close, this);
+ }
+
+ content = new AST.ContentNode(content, locInfo);
+
+ this.type = 'block';
+ this.mustache = mustache;
+ this.program = new AST.ProgramNode([content], {}, locInfo);
+ },
+
+ ContentNode: function(string, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "content";
+ this.original = this.string = string;
+ },
+
+ HashNode: function(pairs, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "hash";
+ this.pairs = pairs;
+ },
+
+ IdNode: function(parts, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "ID";
+
+ var original = "",
+ dig = [],
+ depth = 0,
+ depthString = '';
+
+ for(var i=0,l=parts.length; i<l; i++) {
+ var part = parts[i].part;
+ original += (parts[i].separator || '') + part;
+
+ if (part === ".." || part === "." || part === "this") {
+ if (dig.length > 0) {
+ throw new Exception("Invalid path: " + original, this);
+ } else if (part === "..") {
+ depth++;
+ depthString += '../';
+ } else {
+ this.isScoped = true;
+ }
+ } else {
+ dig.push(part);
+ }
+ }
+
+ this.original = original;
+ this.parts = dig;
+ this.string = dig.join('.');
+ this.depth = depth;
+ this.idName = depthString + this.string;
+
+ // an ID is simple if it only has one part, and that part is not
+ // `..` or `this`.
+ this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
+
+ this.stringModeValue = this.string;
+ },
+
+ PartialNameNode: function(name, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "PARTIAL_NAME";
+ this.name = name.original;
+ },
+
+ DataNode: function(id, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "DATA";
+ this.id = id;
+ this.stringModeValue = id.stringModeValue;
+ this.idName = '@' + id.stringModeValue;
+ },
+
+ StringNode: function(string, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "STRING";
+ this.original =
+ this.string =
+ this.stringModeValue = string;
+ },
+
+ NumberNode: function(number, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "NUMBER";
+ this.original =
+ this.number = number;
+ this.stringModeValue = Number(number);
+ },
+
+ BooleanNode: function(bool, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "BOOLEAN";
+ this.bool = bool;
+ this.stringModeValue = bool === "true";
+ },
+
+ CommentNode: function(comment, locInfo) {
+ LocationInfo.call(this, locInfo);
+ this.type = "comment";
+ this.comment = comment;
+
+ this.strip = {
+ inlineStandalone: true
+ };
+ }
+ };
+
+
+ // Must be exported as an object rather than the root of the module as the jison lexer
+ // most modify the object to operate properly.
+ __exports__ = AST;
+ return __exports__;
+})(__module5__);
+
+// handlebars/compiler/parser.js
+var __module9__ = (function() {
+ "use strict";
+ var __exports__;
+ /* jshint ignore:start */
+ /* istanbul ignore next */
+ /* Jison generated parser */
+ var handlebars = (function(){
+ var parser = {trace: function trace() { },
+ yy: {},
+ symbols_: {"error":2,"root":3,"program":4,"EOF":5,"program_repetition0":6,"statement":7,"mustache":8,"block":9,"rawBlock":10,"partial":11,"CONTENT":12,"COMMENT":13,"openRawBlock":14,"END_RAW_BLOCK":15,"OPEN_RAW_BLOCK":16,"sexpr":17,"CLOSE_RAW_BLOCK":18,"openBlock":19,"block_option0":20,"closeBlock":21,"openInverse":22,"block_option1":23,"OPEN_BLOCK":24,"CLOSE":25,"OPEN_INVERSE":26,"inverseAndProgram":27,"INVERSE":28,"OPEN_ENDBLOCK":29,"path":30,"OPEN":31,"OPEN_UNESCAPED":32,"CLOSE_UNESCAPED":33,"OPEN_PARTIAL":34,"partialName":35,"param":36,"partial_option0":37,"partial_option1":38,"sexpr_repetition0":39,"sexpr_option0":40,"dataName":41,"STRING":42,"NUMBER":43,"BOOLEAN":44,"OPEN_SEXPR":45,"CLOSE_SEXPR":46,"hash":47,"hash_repetition_plus0":48,"hashSegment":49,"ID":50,"EQUALS":51,"DATA":52,"pathSegments":53,"SEP":54,"$accept":0,"$end":1},
+ terminals_: {2:"error",5:"EOF",12:"CONTENT",13:"COMMENT",15:"END_RAW_BLOCK",16:"OPEN_RAW_BLOCK",18:"CLOSE_RAW_BLOCK",24:"OPEN_BLOCK",25:"CLOSE",26:"OPEN_INVERSE",28:"INVERSE",29:"OPEN_ENDBLOCK",31:"OPEN",32:"OPEN_UNESCAPED",33:"CLOSE_UNESCAPED",34:"OPEN_PARTIAL",42:"STRING",43:"NUMBER",44:"BOOLEAN",45:"OPEN_SEXPR",46:"CLOSE_SEXPR",50:"ID",51:"EQUALS",52:"DATA",54:"SEP"},
+ productions_: [0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[10,3],[14,3],[9,4],[9,4],[19,3],[22,3],[27,2],[21,3],[8,3],[8,3],[11,5],[11,4],[17,3],[17,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,3],[47,1],[49,3],[35,1],[35,1],[35,1],[41,2],[30,1],[53,3],[53,1],[6,0],[6,2],[20,0],[20,1],[23,0],[23,1],[37,0],[37,1],[38,0],[38,1],[39,0],[39,2],[40,0],[40,1],[48,1],[48,2]],
+ performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
+
+ var $0 = $$.length - 1;
+ switch (yystate) {
+ case 1: yy.prepareProgram($$[$0-1].statements, true); return $$[$0-1];
+ break;
+ case 2:this.$ = new yy.ProgramNode(yy.prepareProgram($$[$0]), {}, this._$);
+ break;
+ case 3:this.$ = $$[$0];
+ break;
+ case 4:this.$ = $$[$0];
+ break;
+ case 5:this.$ = $$[$0];
+ break;
+ case 6:this.$ = $$[$0];
+ break;
+ case 7:this.$ = new yy.ContentNode($$[$0], this._$);
+ break;
+ case 8:this.$ = new yy.CommentNode($$[$0], this._$);
+ break;
+ case 9:this.$ = new yy.RawBlockNode($$[$0-2], $$[$0-1], $$[$0], this._$);
+ break;
+ case 10:this.$ = new yy.MustacheNode($$[$0-1], null, '', '', this._$);
+ break;
+ case 11:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], false, this._$);
+ break;
+ case 12:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], true, this._$);
+ break;
+ case 13:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 14:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 15:this.$ = { strip: yy.stripFlags($$[$0-1], $$[$0-1]), program: $$[$0] };
+ break;
+ case 16:this.$ = {path: $$[$0-1], strip: yy.stripFlags($$[$0-2], $$[$0])};
+ break;
+ case 17:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 18:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$);
+ break;
+ case 19:this.$ = new yy.PartialNode($$[$0-3], $$[$0-2], $$[$0-1], yy.stripFlags($$[$0-4], $$[$0]), this._$);
+ break;
+ case 20:this.$ = new yy.PartialNode($$[$0-2], undefined, $$[$0-1], yy.stripFlags($$[$0-3], $$[$0]), this._$);
+ break;
+ case 21:this.$ = new yy.SexprNode([$$[$0-2]].concat($$[$0-1]), $$[$0], this._$);
+ break;
+ case 22:this.$ = new yy.SexprNode([$$[$0]], null, this._$);
+ break;
+ case 23:this.$ = $$[$0];
+ break;
+ case 24:this.$ = new yy.StringNode($$[$0], this._$);
+ break;
+ case 25:this.$ = new yy.NumberNode($$[$0], this._$);
+ break;
+ case 26:this.$ = new yy.BooleanNode($$[$0], this._$);
+ break;
+ case 27:this.$ = $$[$0];
+ break;
+ case 28:$$[$0-1].isHelper = true; this.$ = $$[$0-1];
+ break;
+ case 29:this.$ = new yy.HashNode($$[$0], this._$);
+ break;
+ case 30:this.$ = [$$[$0-2], $$[$0]];
+ break;
+ case 31:this.$ = new yy.PartialNameNode($$[$0], this._$);
+ break;
+ case 32:this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0], this._$), this._$);
+ break;
+ case 33:this.$ = new yy.PartialNameNode(new yy.NumberNode($$[$0], this._$));
+ break;
+ case 34:this.$ = new yy.DataNode($$[$0], this._$);
+ break;
+ case 35:this.$ = new yy.IdNode($$[$0], this._$);
+ break;
+ case 36: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2];
+ break;
+ case 37:this.$ = [{part: $$[$0]}];
+ break;
+ case 38:this.$ = [];
+ break;
+ case 39:$$[$0-1].push($$[$0]);
+ break;
+ case 48:this.$ = [];
+ break;
+ case 49:$$[$0-1].push($$[$0]);
+ break;
+ case 52:this.$ = [$$[$0]];
+ break;
+ case 53:$$[$0-1].push($$[$0]);
+ break;
+ }
+ },
+ table: [{3:1,4:2,5:[2,38],6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],31:[2,38],32:[2,38],34:[2,38]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:[1,10],13:[1,11],14:16,16:[1,20],19:14,22:15,24:[1,18],26:[1,19],28:[2,2],29:[2,2],31:[1,12],32:[1,13],34:[1,17]},{1:[2,1]},{5:[2,39],12:[2,39],13:[2,39],16:[2,39],24:[2,39],26:[2,39],28:[2,39],29:[2,39],31:[2,39],32:[2,39],34:[2,39]},{5:[2,3],12:[2,3],13:[2,3],16:[2,3],24:[2,3],26:[2,3],28:[2,3],29:[2,3],31:[2,3],32:[2,3],34:[2,3]},{5:[2,4],12:[2,4],13:[2,4],16:[2,4],24:[2,4],26:[2,4],28:[2,4],29:[2,4],31:[2,4],32:[2,4],34:[2,4]},{5:[2,5],12:[2,5],13:[2,5],16:[2,5],24:[2,5],26:[2,5],28:[2,5],29:[2,5],31:[2,5],32:[2,5],34:[2,5]},{5:[2,6],12:[2,6],13:[2,6],16:[2,6],24:[2,6],26:[2,6],28:[2,6],29:[2,6],31:[2,6],32:[2,6],34:[2,6]},{5:[2,7],12:[2,7],13:[2,7],16:[2,7],24:[2,7],26:[2,7],28:[2,7],29:[2,7],31:[2,7],32:[2,7],34:[2,7]},{5:[2,8],12:[2,8],13:[2,8],16:[2,8],24:[2,8],26:[2,8],28:[2,8],29:[2,8],31:[2,8],32:[2,8],34:[2,8]},{17:21,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:27,30:22,41:23,50:[1,26],52:[1,25],53:24},{4:28,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{4:29,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{12:[1,30]},{30:32,35:31,42:[1,33],43:[1,34],50:[1,26],53:24},{17:35,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:36,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:37,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[1,38]},{18:[2,48],25:[2,48],33:[2,48],39:39,42:[2,48],43:[2,48],44:[2,48],45:[2,48],46:[2,48],50:[2,48],52:[2,48]},{18:[2,22],25:[2,22],33:[2,22],46:[2,22]},{18:[2,35],25:[2,35],33:[2,35],42:[2,35],43:[2,35],44:[2,35],45:[2,35],46:[2,35],50:[2,35],52:[2,35],54:[1,40]},{30:41,50:[1,26],53:24},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],52:[2,37],54:[2,37]},{33:[1,42]},{20:43,27:44,28:[1,45],29:[2,40]},{23:46,27:47,28:[1,45],29:[2,42]},{15:[1,48]},{25:[2,46],30:51,36:49,38:50,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],47:57,48:58,49:60,50:[1,59],52:[1,25],53:24},{25:[2,31],42:[2,31],43:[2,31],44:[2,31],45:[2,31],50:[2,31],52:[2,31]},{25:[2,32],42:[2,32],43:[2,32],44:[2,32],45:[2,32],50:[2,32],52:[2,32]},{25:[2,33],42:[2,33],43:[2,33],44:[2,33],45:[2,33],50:[2,33],52:[2,33]},{25:[1,61]},{25:[1,62]},{18:[1,63]},{5:[2,17],12:[2,17],13:[2,17],16:[2,17],24:[2,17],26:[2,17],28:[2,17],29:[2,17],31:[2,17],32:[2,17],34:[2,17]},{18:[2,50],25:[2,50],30:51,33:[2,50],36:65,40:64,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],46:[2,50],47:66,48:58,49:60,50:[1,59],52:[1,25],53:24},{50:[1,67]},{18:[2,34],25:[2,34],33:[2,34],42:[2,34],43:[2,34],44:[2,34],45:[2,34],46:[2,34],50:[2,34],52:[2,34]},{5:[2,18],12:[2,18],13:[2,18],16:[2,18],24:[2,18],26:[2,18],28:[2,18],29:[2,18],31:[2,18],32:[2,18],34:[2,18]},{21:68,29:[1,69]},{29:[2,41]},{4:70,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{21:71,29:[1,69]},{29:[2,43]},{5:[2,9],12:[2,9],13:[2,9],16:[2,9],24:[2,9],26:[2,9],28:[2,9],29:[2,9],31:[2,9],32:[2,9],34:[2,9]},{25:[2,44],37:72,47:73,48:58,49:60,50:[1,74]},{25:[1,75]},{18:[2,23],25:[2,23],33:[2,23],42:[2,23],43:[2,23],44:[2,23],45:[2,23],46:[2,23],50:[2,23],52:[2,23]},{18:[2,24],25:[2,24],33:[2,24],42:[2,24],43:[2,24],44:[2,24],45:[2,24],46:[2,24],50:[2,24],52:[2,24]},{18:[2,25],25:[2,25],33:[2,25],42:[2,25],43:[2,25],44:[2,25],45:[2,25],46:[2,25],50:[2,25],52:[2,25]},{18:[2,26],25:[2,26],33:[2,26],42:[2,26],43:[2,26],44:[2,26],45:[2,26],46:[2,26],50:[2,26],52:[2,26]},{18:[2,27],25:[2,27],33:[2,27],42:[2,27],43:[2,27],44:[2,27],45:[2,27],46:[2,27],50:[2,27],52:[2,27]},{17:76,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[2,47]},{18:[2,29],25:[2,29],33:[2,29],46:[2,29],49:77,50:[1,74]},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],51:[1,78],52:[2,37],54:[2,37]},{18:[2,52],25:[2,52],33:[2,52],46:[2,52],50:[2,52]},{12:[2,13],13:[2,13],16:[2,13],24:[2,13],26:[2,13],28:[2,13],29:[2,13],31:[2,13],32:[2,13],34:[2,13]},{12:[2,14],13:[2,14],16:[2,14],24:[2,14],26:[2,14],28:[2,14],29:[2,14],31:[2,14],32:[2,14],34:[2,14]},{12:[2,10]},{18:[2,21],25:[2,21],33:[2,21],46:[2,21]},{18:[2,49],25:[2,49],33:[2,49],42:[2,49],43:[2,49],44:[2,49],45:[2,49],46:[2,49],50:[2,49],52:[2,49]},{18:[2,51],25:[2,51],33:[2,51],46:[2,51]},{18:[2,36],25:[2,36],33:[2,36],42:[2,36],43:[2,36],44:[2,36],45:[2,36],46:[2,36],50:[2,36],52:[2,36],54:[2,36]},{5:[2,11],12:[2,11],13:[2,11],16:[2,11],24:[2,11],26:[2,11],28:[2,11],29:[2,11],31:[2,11],32:[2,11],34:[2,11]},{30:79,50:[1,26],53:24},{29:[2,15]},{5:[2,12],12:[2,12],13:[2,12],16:[2,12],24:[2,12],26:[2,12],28:[2,12],29:[2,12],31:[2,12],32:[2,12],34:[2,12]},{25:[1,80]},{25:[2,45]},{51:[1,78]},{5:[2,20],12:[2,20],13:[2,20],16:[2,20],24:[2,20],26:[2,20],28:[2,20],29:[2,20],31:[2,20],32:[2,20],34:[2,20]},{46:[1,81]},{18:[2,53],25:[2,53],33:[2,53],46:[2,53],50:[2,53]},{30:51,36:82,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],50:[1,26],52:[1,25],53:24},{25:[1,83]},{5:[2,19],12:[2,19],13:[2,19],16:[2,19],24:[2,19],26:[2,19],28:[2,19],29:[2,19],31:[2,19],32:[2,19],34:[2,19]},{18:[2,28],25:[2,28],33:[2,28],42:[2,28],43:[2,28],44:[2,28],45:[2,28],46:[2,28],50:[2,28],52:[2,28]},{18:[2,30],25:[2,30],33:[2,30],46:[2,30],50:[2,30]},{5:[2,16],12:[2,16],13:[2,16],16:[2,16],24:[2,16],26:[2,16],28:[2,16],29:[2,16],31:[2,16],32:[2,16],34:[2,16]}],
+ defaultActions: {4:[2,1],44:[2,41],47:[2,43],57:[2,47],63:[2,10],70:[2,15],73:[2,45]},
+ parseError: function parseError(str, hash) {
+ throw new Error(str);
+ },
+ parse: function parse(input) {
+ var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+ this.yy.parser = this;
+ if (typeof this.lexer.yylloc == "undefined")
+ this.lexer.yylloc = {};
+ var yyloc = this.lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = this.lexer.options && this.lexer.options.ranges;
+ if (typeof this.yy.parseError === "function")
+ this.parseError = this.yy.parseError;
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+ function lex() {
+ var token;
+ token = self.lexer.lex() || 1;
+ if (typeof token !== "number") {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ }
+ var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == "undefined") {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === "undefined" || !action.length || !action[0]) {
+ var errStr = "";
+ if (!recovering) {
+ expected = [];
+ for (p in table[state])
+ if (this.terminals_[p] && p > 2) {
+ expected.push("'" + this.terminals_[p] + "'");
+ }
+ if (this.lexer.showPosition) {
+ errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
+ } else {
+ errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
+ }
+ this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
+ }
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext);
+ lstack.push(this.lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ yyloc = this.lexer.yylloc;
+ if (recovering > 0)
+ recovering--;
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+ if (typeof r !== "undefined") {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+ }
+ };
+ /* Jison generated lexer */
+ var lexer = (function(){
+ var lexer = ({EOF:1,
+ parseError:function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ setInput:function (input) {
+ this._input = input;
+ this._more = this._less = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
+ if (this.options.ranges) this.yylloc.range = [0,0];
+ this.offset = 0;
+ return this;
+ },
+ input:function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) this.yylloc.range[1]++;
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ unput:function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length-1);
+ this.matched = this.matched.substr(0, this.matched.length-1);
+
+ if (lines.length-1) this.yylineno -= lines.length-1;
+ var r = this.yylloc.range;
+
+ this.yylloc = {first_line: this.yylloc.first_line,
+ last_line: this.yylineno+1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ?
+ (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
+ this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ return this;
+ },
+ more:function () {
+ this._more = true;
+ return this;
+ },
+ less:function (n) {
+ this.unput(this.match.slice(n));
+ },
+ pastInput:function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+ },
+ upcomingInput:function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20-next.length);
+ }
+ return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
+ },
+ showPosition:function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c+"^";
+ },
+ next:function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) this.done = true;
+
+ var token,
+ match,
+ tempMatch,
+ index,
+ col,
+ lines;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i=0;i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (!this.options.flex) break;
+ }
+ }
+ if (match) {
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) this.yylineno += lines.length;
+ this.yylloc = {first_line: this.yylloc.last_line,
+ last_line: this.yylineno+1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
+ if (this.done && this._input) this.done = false;
+ if (token) return token;
+ else return;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
+ {text: "", token: null, line: this.yylineno});
+ }
+ },
+ lex:function lex() {
+ var r = this.next();
+ if (typeof r !== 'undefined') {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ begin:function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ popState:function popState() {
+ return this.conditionStack.pop();
+ },
+ _currentRules:function _currentRules() {
+ return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
+ },
+ topState:function () {
+ return this.conditionStack[this.conditionStack.length-2];
+ },
+ pushState:function begin(condition) {
+ this.begin(condition);
+ }});
+ lexer.options = {};
+ lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+
+
+ function strip(start, end) {
+ return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end);
+ }
+
+
+ var YYSTATE=YY_START
+ switch($avoiding_name_collisions) {
+ case 0:
+ if(yy_.yytext.slice(-2) === "\\\\") {
+ strip(0,1);
+ this.begin("mu");
+ } else if(yy_.yytext.slice(-1) === "\\") {
+ strip(0,1);
+ this.begin("emu");
+ } else {
+ this.begin("mu");
+ }
+ if(yy_.yytext) return 12;
+
+ break;
+ case 1:return 12;
+ break;
+ case 2:
+ this.popState();
+ return 12;
+
+ break;
+ case 3:
+ yy_.yytext = yy_.yytext.substr(5, yy_.yyleng-9);
+ this.popState();
+ return 15;
+
+ break;
+ case 4: return 12;
+ break;
+ case 5:strip(0,4); this.popState(); return 13;
+ break;
+ case 6:return 45;
+ break;
+ case 7:return 46;
+ break;
+ case 8: return 16;
+ break;
+ case 9:
+ this.popState();
+ this.begin('raw');
+ return 18;
+
+ break;
+ case 10:return 34;
+ break;
+ case 11:return 24;
+ break;
+ case 12:return 29;
+ break;
+ case 13:this.popState(); return 28;
+ break;
+ case 14:this.popState(); return 28;
+ break;
+ case 15:return 26;
+ break;
+ case 16:return 26;
+ break;
+ case 17:return 32;
+ break;
+ case 18:return 31;
+ break;
+ case 19:this.popState(); this.begin('com');
+ break;
+ case 20:strip(3,5); this.popState(); return 13;
+ break;
+ case 21:return 31;
+ break;
+ case 22:return 51;
+ break;
+ case 23:return 50;
+ break;
+ case 24:return 50;
+ break;
+ case 25:return 54;
+ break;
+ case 26:// ignore whitespace
+ break;
+ case 27:this.popState(); return 33;
+ break;
+ case 28:this.popState(); return 25;
+ break;
+ case 29:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 42;
+ break;
+ case 30:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 42;
+ break;
+ case 31:return 52;
+ break;
+ case 32:return 44;
+ break;
+ case 33:return 44;
+ break;
+ case 34:return 43;
+ break;
+ case 35:return 50;
+ break;
+ case 36:yy_.yytext = strip(1,2); return 50;
+ break;
+ case 37:return 'INVALID';
+ break;
+ case 38:return 5;
+ break;
+ }
+ };
+ lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
+ lexer.conditions = {"mu":{"rules":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[5],"inclusive":false},"raw":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,1,38],"inclusive":true}};
+ return lexer;})()
+ parser.lexer = lexer;
+ function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
+ return new Parser;
+ })();__exports__ = handlebars;
+ /* jshint ignore:end */
+ return __exports__;
+})();
+
+// handlebars/compiler/helpers.js
+var __module10__ = (function(__dependency1__) {
+ "use strict";
+ var __exports__ = {};
+ var Exception = __dependency1__;
+
+ function stripFlags(open, close) {
+ return {
+ left: open.charAt(2) === '~',
+ right: close.charAt(close.length-3) === '~'
+ };
+ }
+
+ __exports__.stripFlags = stripFlags;
+ function prepareBlock(mustache, program, inverseAndProgram, close, inverted, locInfo) {
+ /*jshint -W040 */
+ if (mustache.sexpr.id.original !== close.path.original) {
+ throw new Exception(mustache.sexpr.id.original + ' doesn\'t match ' + close.path.original, mustache);
+ }
+
+ var inverse = inverseAndProgram && inverseAndProgram.program;
+
+ var strip = {
+ left: mustache.strip.left,
+ right: close.strip.right,
+
+ // Determine the standalone candiacy. Basically flag our content as being possibly standalone
+ // so our parent can determine if we actually are standalone
+ openStandalone: isNextWhitespace(program.statements),
+ closeStandalone: isPrevWhitespace((inverse || program).statements)
+ };
+
+ if (mustache.strip.right) {
+ omitRight(program.statements, null, true);
+ }
+
+ if (inverse) {
+ var inverseStrip = inverseAndProgram.strip;
+
+ if (inverseStrip.left) {
+ omitLeft(program.statements, null, true);
+ }
+ if (inverseStrip.right) {
+ omitRight(inverse.statements, null, true);
+ }
+ if (close.strip.left) {
+ omitLeft(inverse.statements, null, true);
+ }
+
+ // Find standalone else statments
+ if (isPrevWhitespace(program.statements)
+ && isNextWhitespace(inverse.statements)) {
+
+ omitLeft(program.statements);
+ omitRight(inverse.statements);
+ }
+ } else {
+ if (close.strip.left) {
+ omitLeft(program.statements, null, true);
+ }
+ }
+
+ if (inverted) {
+ return new this.BlockNode(mustache, inverse, program, strip, locInfo);
+ } else {
+ return new this.BlockNode(mustache, program, inverse, strip, locInfo);
+ }
+ }
+
+ __exports__.prepareBlock = prepareBlock;
+ function prepareProgram(statements, isRoot) {
+ for (var i = 0, l = statements.length; i < l; i++) {
+ var current = statements[i],
+ strip = current.strip;
+
+ if (!strip) {
+ continue;
+ }
+
+ var _isPrevWhitespace = isPrevWhitespace(statements, i, isRoot, current.type === 'partial'),
+ _isNextWhitespace = isNextWhitespace(statements, i, isRoot),
+
+ openStandalone = strip.openStandalone && _isPrevWhitespace,
+ closeStandalone = strip.closeStandalone && _isNextWhitespace,
+ inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
+
+ if (strip.right) {
+ omitRight(statements, i, true);
+ }
+ if (strip.left) {
+ omitLeft(statements, i, true);
+ }
+
+ if (inlineStandalone) {
+ omitRight(statements, i);
+
+ if (omitLeft(statements, i)) {
+ // If we are on a standalone node, save the indent info for partials
+ if (current.type === 'partial') {
+ current.indent = (/([ \t]+$)/).exec(statements[i-1].original) ? RegExp.$1 : '';
+ }
+ }
+ }
+ if (openStandalone) {
+ omitRight((current.program || current.inverse).statements);
+
+ // Strip out the previous content node if it's whitespace only
+ omitLeft(statements, i);
+ }
+ if (closeStandalone) {
+ // Always strip the next node
+ omitRight(statements, i);
+
+ omitLeft((current.inverse || current.program).statements);
+ }
+ }
+
+ return statements;
+ }
+
+ __exports__.prepareProgram = prepareProgram;function isPrevWhitespace(statements, i, isRoot) {
+ if (i === undefined) {
+ i = statements.length;
+ }
+
+ // Nodes that end with newlines are considered whitespace (but are special
+ // cased for strip operations)
+ var prev = statements[i-1],
+ sibling = statements[i-2];
+ if (!prev) {
+ return isRoot;
+ }
+
+ if (prev.type === 'content') {
+ return (sibling || !isRoot ? (/\r?\n\s*?$/) : (/(^|\r?\n)\s*?$/)).test(prev.original);
+ }
+ }
+ function isNextWhitespace(statements, i, isRoot) {
+ if (i === undefined) {
+ i = -1;
+ }
+
+ var next = statements[i+1],
+ sibling = statements[i+2];
+ if (!next) {
+ return isRoot;
+ }
+
+ if (next.type === 'content') {
+ return (sibling || !isRoot ? (/^\s*?\r?\n/) : (/^\s*?(\r?\n|$)/)).test(next.original);
+ }
+ }
+
+ // Marks the node to the right of the position as omitted.
+ // I.e. {{foo}}' ' will mark the ' ' node as omitted.
+ //
+ // If i is undefined, then the first child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitRight(statements, i, multiple) {
+ var current = statements[i == null ? 0 : i + 1];
+ if (!current || current.type !== 'content' || (!multiple && current.rightStripped)) {
+ return;
+ }
+
+ var original = current.string;
+ current.string = current.string.replace(multiple ? (/^\s+/) : (/^[ \t]*\r?\n?/), '');
+ current.rightStripped = current.string !== original;
+ }
+
+ // Marks the node to the left of the position as omitted.
+ // I.e. ' '{{foo}} will mark the ' ' node as omitted.
+ //
+ // If i is undefined then the last child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitLeft(statements, i, multiple) {
+ var current = statements[i == null ? statements.length - 1 : i - 1];
+ if (!current || current.type !== 'content' || (!multiple && current.leftStripped)) {
+ return;
+ }
+
+ // We omit the last node if it's whitespace only and not preceeded by a non-content node.
+ var original = current.string;
+ current.string = current.string.replace(multiple ? (/\s+$/) : (/[ \t]+$/), '');
+ current.leftStripped = current.string !== original;
+ return current.leftStripped;
+ }
+ return __exports__;
+})(__module5__);
+
+// handlebars/compiler/base.js
+var __module8__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
+ "use strict";
+ var __exports__ = {};
+ var parser = __dependency1__;
+ var AST = __dependency2__;
+ var Helpers = __dependency3__;
+ var extend = __dependency4__.extend;
+
+ __exports__.parser = parser;
+
+ var yy = {};
+ extend(yy, Helpers, AST);
+
+ function parse(input) {
+ // Just return if an already-compile AST was passed in.
+ if (input.constructor === AST.ProgramNode) { return input; }
+
+ parser.yy = yy;
+
+ return parser.parse(input);
+ }
+
+ __exports__.parse = parse;
+ return __exports__;
+})(__module9__, __module7__, __module10__, __module3__);
+
+// handlebars/compiler/compiler.js
+var __module11__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__ = {};
+ var Exception = __dependency1__;
+ var isArray = __dependency2__.isArray;
+
+ var slice = [].slice;
+
+ function Compiler() {}
+
+ __exports__.Compiler = Compiler;// the foundHelper register will disambiguate helper lookup from finding a
+ // function in a context. This is necessary for mustache compatibility, which
+ // requires that context functions in blocks are evaluated by blockHelperMissing,
+ // and then proceed as if the resulting value was provided to blockHelperMissing.
+
+ Compiler.prototype = {
+ compiler: Compiler,
+
+ equals: function(other) {
+ var len = this.opcodes.length;
+ if (other.opcodes.length !== len) {
+ return false;
+ }
+
+ for (var i = 0; i < len; i++) {
+ var opcode = this.opcodes[i],
+ otherOpcode = other.opcodes[i];
+ if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
+ return false;
+ }
+ }
+
+ // We know that length is the same between the two arrays because they are directly tied
+ // to the opcode behavior above.
+ len = this.children.length;
+ for (i = 0; i < len; i++) {
+ if (!this.children[i].equals(other.children[i])) {
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ guid: 0,
+
+ compile: function(program, options) {
+ this.opcodes = [];
+ this.children = [];
+ this.depths = {list: []};
+ this.options = options;
+ this.stringParams = options.stringParams;
+ this.trackIds = options.trackIds;
+
+ // These changes will propagate to the other compiler components
+ var knownHelpers = this.options.knownHelpers;
+ this.options.knownHelpers = {
+ 'helperMissing': true,
+ 'blockHelperMissing': true,
+ 'each': true,
+ 'if': true,
+ 'unless': true,
+ 'with': true,
+ 'log': true,
+ 'lookup': true
+ };
+ if (knownHelpers) {
+ for (var name in knownHelpers) {
+ this.options.knownHelpers[name] = knownHelpers[name];
+ }
+ }
+
+ return this.accept(program);
+ },
+
+ accept: function(node) {
+ return this[node.type](node);
+ },
+
+ program: function(program) {
+ var statements = program.statements;
+
+ for(var i=0, l=statements.length; i<l; i++) {
+ this.accept(statements[i]);
+ }
+ this.isSimple = l === 1;
+
+ this.depths.list = this.depths.list.sort(function(a, b) {
+ return a - b;
+ });
+
+ return this;
+ },
+
+ compileProgram: function(program) {
+ var result = new this.compiler().compile(program, this.options);
+ var guid = this.guid++, depth;
+
+ this.usePartial = this.usePartial || result.usePartial;
+
+ this.children[guid] = result;
+
+ for(var i=0, l=result.depths.list.length; i<l; i++) {
+ depth = result.depths.list[i];
+
+ if(depth < 2) { continue; }
+ else { this.addDepth(depth - 1); }
+ }
+
+ return guid;
+ },
+
+ block: function(block) {
+ var mustache = block.mustache,
+ program = block.program,
+ inverse = block.inverse;
+
+ if (program) {
+ program = this.compileProgram(program);
+ }
+
+ if (inverse) {
+ inverse = this.compileProgram(inverse);
+ }
+
+ var sexpr = mustache.sexpr;
+ var type = this.classifySexpr(sexpr);
+
+ if (type === "helper") {
+ this.helperSexpr(sexpr, program, inverse);
+ } else if (type === "simple") {
+ this.simpleSexpr(sexpr);
+
+ // now that the simple mustache is resolved, we need to
+ // evaluate it by executing `blockHelperMissing`
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+ this.opcode('emptyHash');
+ this.opcode('blockValue', sexpr.id.original);
+ } else {
+ this.ambiguousSexpr(sexpr, program, inverse);
+
+ // now that the simple mustache is resolved, we need to
+ // evaluate it by executing `blockHelperMissing`
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+ this.opcode('emptyHash');
+ this.opcode('ambiguousBlockValue');
+ }
+
+ this.opcode('append');
+ },
+
+ hash: function(hash) {
+ var pairs = hash.pairs, i, l;
+
+ this.opcode('pushHash');
+
+ for(i=0, l=pairs.length; i<l; i++) {
+ this.pushParam(pairs[i][1]);
+ }
+ while(i--) {
+ this.opcode('assignToHash', pairs[i][0]);
+ }
+ this.opcode('popHash');
+ },
+
+ partial: function(partial) {
+ var partialName = partial.partialName;
+ this.usePartial = true;
+
+ if (partial.hash) {
+ this.accept(partial.hash);
+ } else {
+ this.opcode('push', 'undefined');
+ }
+
+ if (partial.context) {
+ this.accept(partial.context);
+ } else {
+ this.opcode('getContext', 0);
+ this.opcode('pushContext');
+ }
+
+ this.opcode('invokePartial', partialName.name, partial.indent || '');
+ this.opcode('append');
+ },
+
+ content: function(content) {
+ if (content.string) {
+ this.opcode('appendContent', content.string);
+ }
+ },
+
+ mustache: function(mustache) {
+ this.sexpr(mustache.sexpr);
+
+ if(mustache.escaped && !this.options.noEscape) {
+ this.opcode('appendEscaped');
+ } else {
+ this.opcode('append');
+ }
+ },
+
+ ambiguousSexpr: function(sexpr, program, inverse) {
+ var id = sexpr.id,
+ name = id.parts[0],
+ isBlock = program != null || inverse != null;
+
+ this.opcode('getContext', id.depth);
+
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+
+ this.ID(id);
+
+ this.opcode('invokeAmbiguous', name, isBlock);
+ },
+
+ simpleSexpr: function(sexpr) {
+ var id = sexpr.id;
+
+ if (id.type === 'DATA') {
+ this.DATA(id);
+ } else if (id.parts.length) {
+ this.ID(id);
+ } else {
+ // Simplified ID for `this`
+ this.addDepth(id.depth);
+ this.opcode('getContext', id.depth);
+ this.opcode('pushContext');
+ }
+
+ this.opcode('resolvePossibleLambda');
+ },
+
+ helperSexpr: function(sexpr, program, inverse) {
+ var params = this.setupFullMustacheParams(sexpr, program, inverse),
+ id = sexpr.id,
+ name = id.parts[0];
+
+ if (this.options.knownHelpers[name]) {
+ this.opcode('invokeKnownHelper', params.length, name);
+ } else if (this.options.knownHelpersOnly) {
+ throw new Exception("You specified knownHelpersOnly, but used the unknown helper " + name, sexpr);
+ } else {
+ id.falsy = true;
+
+ this.ID(id);
+ this.opcode('invokeHelper', params.length, id.original, id.isSimple);
+ }
+ },
+
+ sexpr: function(sexpr) {
+ var type = this.classifySexpr(sexpr);
+
+ if (type === "simple") {
+ this.simpleSexpr(sexpr);
+ } else if (type === "helper") {
+ this.helperSexpr(sexpr);
+ } else {
+ this.ambiguousSexpr(sexpr);
+ }
+ },
+
+ ID: function(id) {
+ this.addDepth(id.depth);
+ this.opcode('getContext', id.depth);
+
+ var name = id.parts[0];
+ if (!name) {
+ // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
+ this.opcode('pushContext');
+ } else {
+ this.opcode('lookupOnContext', id.parts, id.falsy, id.isScoped);
+ }
+ },
+
+ DATA: function(data) {
+ this.options.data = true;
+ this.opcode('lookupData', data.id.depth, data.id.parts);
+ },
+
+ STRING: function(string) {
+ this.opcode('pushString', string.string);
+ },
+
+ NUMBER: function(number) {
+ this.opcode('pushLiteral', number.number);
+ },
+
+ BOOLEAN: function(bool) {
+ this.opcode('pushLiteral', bool.bool);
+ },
+
+ comment: function() {},
+
+ // HELPERS
+ opcode: function(name) {
+ this.opcodes.push({ opcode: name, args: slice.call(arguments, 1) });
+ },
+
+ addDepth: function(depth) {
+ if(depth === 0) { return; }
+
+ if(!this.depths[depth]) {
+ this.depths[depth] = true;
+ this.depths.list.push(depth);
+ }
+ },
+
+ classifySexpr: function(sexpr) {
+ var isHelper = sexpr.isHelper;
+ var isEligible = sexpr.eligibleHelper;
+ var options = this.options;
+
+ // if ambiguous, we can possibly resolve the ambiguity now
+ // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.
+ if (isEligible && !isHelper) {
+ var name = sexpr.id.parts[0];
+
+ if (options.knownHelpers[name]) {
+ isHelper = true;
+ } else if (options.knownHelpersOnly) {
+ isEligible = false;
+ }
+ }
+
+ if (isHelper) { return "helper"; }
+ else if (isEligible) { return "ambiguous"; }
+ else { return "simple"; }
+ },
+
+ pushParams: function(params) {
+ for(var i=0, l=params.length; i<l; i++) {
+ this.pushParam(params[i]);
+ }
+ },
+
+ pushParam: function(val) {
+ if (this.stringParams) {
+ if(val.depth) {
+ this.addDepth(val.depth);
+ }
+ this.opcode('getContext', val.depth || 0);
+ this.opcode('pushStringParam', val.stringModeValue, val.type);
+
+ if (val.type === 'sexpr') {
+ // Subexpressions get evaluated and passed in
+ // in string params mode.
+ this.sexpr(val);
+ }
+ } else {
+ if (this.trackIds) {
+ this.opcode('pushId', val.type, val.idName || val.stringModeValue);
+ }
+ this.accept(val);
+ }
+ },
+
+ setupFullMustacheParams: function(sexpr, program, inverse) {
+ var params = sexpr.params;
+ this.pushParams(params);
+
+ this.opcode('pushProgram', program);
+ this.opcode('pushProgram', inverse);
+
+ if (sexpr.hash) {
+ this.hash(sexpr.hash);
+ } else {
+ this.opcode('emptyHash');
+ }
+
+ return params;
+ }
+ };
+
+ function precompile(input, options, env) {
+ if (input == null || (typeof input !== 'string' && input.constructor !== env.AST.ProgramNode)) {
+ throw new Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
+ }
+
+ options = options || {};
+ if (!('data' in options)) {
+ options.data = true;
+ }
+ if (options.compat) {
+ options.useDepths = true;
+ }
+
+ var ast = env.parse(input);
+ var environment = new env.Compiler().compile(ast, options);
+ return new env.JavaScriptCompiler().compile(environment, options);
+ }
+
+ __exports__.precompile = precompile;function compile(input, options, env) {
+ if (input == null || (typeof input !== 'string' && input.constructor !== env.AST.ProgramNode)) {
+ throw new Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
+ }
+
+ options = options || {};
+
+ if (!('data' in options)) {
+ options.data = true;
+ }
+ if (options.compat) {
+ options.useDepths = true;
+ }
+
+ var compiled;
+
+ function compileInput() {
+ var ast = env.parse(input);
+ var environment = new env.Compiler().compile(ast, options);
+ var templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
+ return env.template(templateSpec);
+ }
+
+ // Template is only compiled on first use and cached after that point.
+ var ret = function(context, options) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled.call(this, context, options);
+ };
+ ret._setup = function(options) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled._setup(options);
+ };
+ ret._child = function(i, data, depths) {
+ if (!compiled) {
+ compiled = compileInput();
+ }
+ return compiled._child(i, data, depths);
+ };
+ return ret;
+ }
+
+ __exports__.compile = compile;function argEquals(a, b) {
+ if (a === b) {
+ return true;
+ }
+
+ if (isArray(a) && isArray(b) && a.length === b.length) {
+ for (var i = 0; i < a.length; i++) {
+ if (!argEquals(a[i], b[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ return __exports__;
+})(__module5__, __module3__);
+
+// handlebars/compiler/javascript-compiler.js
+var __module12__ = (function(__dependency1__, __dependency2__) {
+ "use strict";
+ var __exports__;
+ var COMPILER_REVISION = __dependency1__.COMPILER_REVISION;
+ var REVISION_CHANGES = __dependency1__.REVISION_CHANGES;
+ var Exception = __dependency2__;
+
+ function Literal(value) {
+ this.value = value;
+ }
+
+ function JavaScriptCompiler() {}
+
+ JavaScriptCompiler.prototype = {
+ // PUBLIC API: You can override these methods in a subclass to provide
+ // alternative compiled forms for name lookup and buffering semantics
+ nameLookup: function(parent, name /* , type*/) {
+ if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
+ return parent + "." + name;
+ } else {
+ return parent + "['" + name + "']";
+ }
+ },
+ depthedLookup: function(name) {
+ this.aliases.lookup = 'this.lookup';
+
+ return 'lookup(depths, "' + name + '")';
+ },
+
+ compilerInfo: function() {
+ var revision = COMPILER_REVISION,
+ versions = REVISION_CHANGES[revision];
+ return [revision, versions];
+ },
+
+ appendToBuffer: function(string) {
+ if (this.environment.isSimple) {
+ return "return " + string + ";";
+ } else {
+ return {
+ appendToBuffer: true,
+ content: string,
+ toString: function() { return "buffer += " + string + ";"; }
+ };
+ }
+ },
+
+ initializeBuffer: function() {
+ return this.quotedString("");
+ },
+
+ namespace: "Handlebars",
+ // END PUBLIC API
+
+ compile: function(environment, options, context, asObject) {
+ this.environment = environment;
+ this.options = options;
+ this.stringParams = this.options.stringParams;
+ this.trackIds = this.options.trackIds;
+ this.precompile = !asObject;
+
+ this.name = this.environment.name;
+ this.isChild = !!context;
+ this.context = context || {
+ programs: [],
+ environments: []
+ };
+
+ this.preamble();
+
+ this.stackSlot = 0;
+ this.stackVars = [];
+ this.aliases = {};
+ this.registers = { list: [] };
+ this.hashes = [];
+ this.compileStack = [];
+ this.inlineStack = [];
+
+ this.compileChildren(environment, options);
+
+ this.useDepths = this.useDepths || environment.depths.list.length || this.options.compat;
+
+ var opcodes = environment.opcodes,
+ opcode,
+ i,
+ l;
+
+ for (i = 0, l = opcodes.length; i < l; i++) {
+ opcode = opcodes[i];
+
+ this[opcode.opcode].apply(this, opcode.args);
+ }
+
+ // Flush any trailing content that might be pending.
+ this.pushSource('');
+
+ /* istanbul ignore next */
+ if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {
+ throw new Exception('Compile completed with content left on stack');
+ }
+
+ var fn = this.createFunctionContext(asObject);
+ if (!this.isChild) {
+ var ret = {
+ compiler: this.compilerInfo(),
+ main: fn
+ };
+ var programs = this.context.programs;
+ for (i = 0, l = programs.length; i < l; i++) {
+ if (programs[i]) {
+ ret[i] = programs[i];
+ }
+ }
+
+ if (this.environment.usePartial) {
+ ret.usePartial = true;
+ }
+ if (this.options.data) {
+ ret.useData = true;
+ }
+ if (this.useDepths) {
+ ret.useDepths = true;
+ }
+ if (this.options.compat) {
+ ret.compat = true;
+ }
+
+ if (!asObject) {
+ ret.compiler = JSON.stringify(ret.compiler);
+ ret = this.objectLiteral(ret);
+ }
+
+ return ret;
+ } else {
+ return fn;
+ }
+ },
+
+ preamble: function() {
+ // track the last context pushed into place to allow skipping the
+ // getContext opcode when it would be a noop
+ this.lastContext = 0;
+ this.source = [];
+ },
+
+ createFunctionContext: function(asObject) {
+ var varDeclarations = '';
+
+ var locals = this.stackVars.concat(this.registers.list);
+ if(locals.length > 0) {
+ varDeclarations += ", " + locals.join(", ");
+ }
+
+ // Generate minimizer alias mappings
+ for (var alias in this.aliases) {
+ if (this.aliases.hasOwnProperty(alias)) {
+ varDeclarations += ', ' + alias + '=' + this.aliases[alias];
+ }
+ }
+
+ var params = ["depth0", "helpers", "partials", "data"];
+
+ if (this.useDepths) {
+ params.push('depths');
+ }
+
+ // Perform a second pass over the output to merge content when possible
+ var source = this.mergeSource(varDeclarations);
+
+ if (asObject) {
+ params.push(source);
+
+ return Function.apply(this, params);
+ } else {
+ return 'function(' + params.join(',') + ') {\n ' + source + '}';
+ }
+ },
+ mergeSource: function(varDeclarations) {
+ var source = '',
+ buffer,
+ appendOnly = !this.forceBuffer,
+ appendFirst;
+
+ for (var i = 0, len = this.source.length; i < len; i++) {
+ var line = this.source[i];
+ if (line.appendToBuffer) {
+ if (buffer) {
+ buffer = buffer + '\n + ' + line.content;
+ } else {
+ buffer = line.content;
+ }
+ } else {
+ if (buffer) {
+ if (!source) {
+ appendFirst = true;
+ source = buffer + ';\n ';
+ } else {
+ source += 'buffer += ' + buffer + ';\n ';
+ }
+ buffer = undefined;
+ }
+ source += line + '\n ';
+
+ if (!this.environment.isSimple) {
+ appendOnly = false;
+ }
+ }
+ }
+
+ if (appendOnly) {
+ if (buffer || !source) {
+ source += 'return ' + (buffer || '""') + ';\n';
+ }
+ } else {
+ varDeclarations += ", buffer = " + (appendFirst ? '' : this.initializeBuffer());
+ if (buffer) {
+ source += 'return buffer + ' + buffer + ';\n';
+ } else {
+ source += 'return buffer;\n';
+ }
+ }
+
+ if (varDeclarations) {
+ source = 'var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n ') + source;
+ }
+
+ return source;
+ },
+
+ // [blockValue]
+ //
+ // On stack, before: hash, inverse, program, value
+ // On stack, after: return value of blockHelperMissing
+ //
+ // The purpose of this opcode is to take a block of the form
+ // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and
+ // replace it on the stack with the result of properly
+ // invoking blockHelperMissing.
+ blockValue: function(name) {
+ this.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+ var params = [this.contextName(0)];
+ this.setupParams(name, 0, params);
+
+ var blockName = this.popStack();
+ params.splice(1, 0, blockName);
+
+ this.push('blockHelperMissing.call(' + params.join(', ') + ')');
+ },
+
+ // [ambiguousBlockValue]
+ //
+ // On stack, before: hash, inverse, program, value
+ // Compiler value, before: lastHelper=value of last found helper, if any
+ // On stack, after, if no lastHelper: same as [blockValue]
+ // On stack, after, if lastHelper: value
+ ambiguousBlockValue: function() {
+ this.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+ // We're being a bit cheeky and reusing the options value from the prior exec
+ var params = [this.contextName(0)];
+ this.setupParams('', 0, params, true);
+
+ this.flushInline();
+
+ var current = this.topStack();
+ params.splice(1, 0, current);
+
+ this.pushSource("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
+ },
+
+ // [appendContent]
+ //
+ // On stack, before: ...
+ // On stack, after: ...
+ //
+ // Appends the string value of `content` to the current buffer
+ appendContent: function(content) {
+ if (this.pendingContent) {
+ content = this.pendingContent + content;
+ }
+
+ this.pendingContent = content;
+ },
+
+ // [append]
+ //
+ // On stack, before: value, ...
+ // On stack, after: ...
+ //
+ // Coerces `value` to a String and appends it to the current buffer.
+ //
+ // If `value` is truthy, or 0, it is coerced into a string and appended
+ // Otherwise, the empty string is appended
+ append: function() {
+ // Force anything that is inlined onto the stack so we don't have duplication
+ // when we examine local
+ this.flushInline();
+ var local = this.popStack();
+ this.pushSource('if (' + local + ' != null) { ' + this.appendToBuffer(local) + ' }');
+ if (this.environment.isSimple) {
+ this.pushSource("else { " + this.appendToBuffer("''") + " }");
+ }
+ },
+
+ // [appendEscaped]
+ //
+ // On stack, before: value, ...
+ // On stack, after: ...
+ //
+ // Escape `value` and append it to the buffer
+ appendEscaped: function() {
+ this.aliases.escapeExpression = 'this.escapeExpression';
+
+ this.pushSource(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
+ },
+
+ // [getContext]
+ //
+ // On stack, before: ...
+ // On stack, after: ...
+ // Compiler value, after: lastContext=depth
+ //
+ // Set the value of the `lastContext` compiler value to the depth
+ getContext: function(depth) {
+ this.lastContext = depth;
+ },
+
+ // [pushContext]
+ //
+ // On stack, before: ...
+ // On stack, after: currentContext, ...
+ //
+ // Pushes the value of the current context onto the stack.
+ pushContext: function() {
+ this.pushStackLiteral(this.contextName(this.lastContext));
+ },
+
+ // [lookupOnContext]
+ //
+ // On stack, before: ...
+ // On stack, after: currentContext[name], ...
+ //
+ // Looks up the value of `name` on the current context and pushes
+ // it onto the stack.
+ lookupOnContext: function(parts, falsy, scoped) {
+ /*jshint -W083 */
+ var i = 0,
+ len = parts.length;
+
+ if (!scoped && this.options.compat && !this.lastContext) {
+ // The depthed query is expected to handle the undefined logic for the root level that
+ // is implemented below, so we evaluate that directly in compat mode
+ this.push(this.depthedLookup(parts[i++]));
+ } else {
+ this.pushContext();
+ }
+
+ for (; i < len; i++) {
+ this.replaceStack(function(current) {
+ var lookup = this.nameLookup(current, parts[i], 'context');
+ // We want to ensure that zero and false are handled properly if the context (falsy flag)
+ // needs to have the special handling for these values.
+ if (!falsy) {
+ return ' != null ? ' + lookup + ' : ' + current;
+ } else {
+ // Otherwise we can use generic falsy handling
+ return ' && ' + lookup;
+ }
+ });
+ }
+ },
+
+ // [lookupData]
+ //
+ // On stack, before: ...
+ // On stack, after: data, ...
+ //
+ // Push the data lookup operator
+ lookupData: function(depth, parts) {
+ /*jshint -W083 */
+ if (!depth) {
+ this.pushStackLiteral('data');
+ } else {
+ this.pushStackLiteral('this.data(data, ' + depth + ')');
+ }
+
+ var len = parts.length;
+ for (var i = 0; i < len; i++) {
+ this.replaceStack(function(current) {
+ return ' && ' + this.nameLookup(current, parts[i], 'data');
+ });
+ }
+ },
+
+ // [resolvePossibleLambda]
+ //
+ // On stack, before: value, ...
+ // On stack, after: resolved value, ...
+ //
+ // If the `value` is a lambda, replace it on the stack by
+ // the return value of the lambda
+ resolvePossibleLambda: function() {
+ this.aliases.lambda = 'this.lambda';
+
+ this.push('lambda(' + this.popStack() + ', ' + this.contextName(0) + ')');
+ },
+
+ // [pushStringParam]
+ //
+ // On stack, before: ...
+ // On stack, after: string, currentContext, ...
+ //
+ // This opcode is designed for use in string mode, which
+ // provides the string value of a parameter along with its
+ // depth rather than resolving it immediately.
+ pushStringParam: function(string, type) {
+ this.pushContext();
+ this.pushString(type);
+
+ // If it's a subexpression, the string result
+ // will be pushed after this opcode.
+ if (type !== 'sexpr') {
+ if (typeof string === 'string') {
+ this.pushString(string);
+ } else {
+ this.pushStackLiteral(string);
+ }
+ }
+ },
+
+ emptyHash: function() {
+ this.pushStackLiteral('{}');
+
+ if (this.trackIds) {
+ this.push('{}'); // hashIds
+ }
+ if (this.stringParams) {
+ this.push('{}'); // hashContexts
+ this.push('{}'); // hashTypes
+ }
+ },
+ pushHash: function() {
+ if (this.hash) {
+ this.hashes.push(this.hash);
+ }
+ this.hash = {values: [], types: [], contexts: [], ids: []};
+ },
+ popHash: function() {
+ var hash = this.hash;
+ this.hash = this.hashes.pop();
+
+ if (this.trackIds) {
+ this.push('{' + hash.ids.join(',') + '}');
+ }
+ if (this.stringParams) {
+ this.push('{' + hash.contexts.join(',') + '}');
+ this.push('{' + hash.types.join(',') + '}');
+ }
+
+ this.push('{\n ' + hash.values.join(',\n ') + '\n }');
+ },
+
+ // [pushString]
+ //
+ // On stack, before: ...
+ // On stack, after: quotedString(string), ...
+ //
+ // Push a quoted version of `string` onto the stack
+ pushString: function(string) {
+ this.pushStackLiteral(this.quotedString(string));
+ },
+
+ // [push]
+ //
+ // On stack, before: ...
+ // On stack, after: expr, ...
+ //
+ // Push an expression onto the stack
+ push: function(expr) {
+ this.inlineStack.push(expr);
+ return expr;
+ },
+
+ // [pushLiteral]
+ //
+ // On stack, before: ...
+ // On stack, after: value, ...
+ //
+ // Pushes a value onto the stack. This operation prevents
+ // the compiler from creating a temporary variable to hold
+ // it.
+ pushLiteral: function(value) {
+ this.pushStackLiteral(value);
+ },
+
+ // [pushProgram]
+ //
+ // On stack, before: ...
+ // On stack, after: program(guid), ...
+ //
+ // Push a program expression onto the stack. This takes
+ // a compile-time guid and converts it into a runtime-accessible
+ // expression.
+ pushProgram: function(guid) {
+ if (guid != null) {
+ this.pushStackLiteral(this.programExpression(guid));
+ } else {
+ this.pushStackLiteral(null);
+ }
+ },
+
+ // [invokeHelper]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of helper invocation
+ //
+ // Pops off the helper's parameters, invokes the helper,
+ // and pushes the helper's return value onto the stack.
+ //
+ // If the helper is not found, `helperMissing` is called.
+ invokeHelper: function(paramSize, name, isSimple) {
+ this.aliases.helperMissing = 'helpers.helperMissing';
+
+ var nonHelper = this.popStack();
+ var helper = this.setupHelper(paramSize, name);
+
+ var lookup = (isSimple ? helper.name + ' || ' : '') + nonHelper + ' || helperMissing';
+ this.push('((' + lookup + ').call(' + helper.callParams + '))');
+ },
+
+ // [invokeKnownHelper]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of helper invocation
+ //
+ // This operation is used when the helper is known to exist,
+ // so a `helperMissing` fallback is not required.
+ invokeKnownHelper: function(paramSize, name) {
+ var helper = this.setupHelper(paramSize, name);
+ this.push(helper.name + ".call(" + helper.callParams + ")");
+ },
+
+ // [invokeAmbiguous]
+ //
+ // On stack, before: hash, inverse, program, params..., ...
+ // On stack, after: result of disambiguation
+ //
+ // This operation is used when an expression like `{{foo}}`
+ // is provided, but we don't know at compile-time whether it
+ // is a helper or a path.
+ //
+ // This operation emits more code than the other options,
+ // and can be avoided by passing the `knownHelpers` and
+ // `knownHelpersOnly` flags at compile-time.
+ invokeAmbiguous: function(name, helperCall) {
+ this.aliases.functionType = '"function"';
+ this.aliases.helperMissing = 'helpers.helperMissing';
+ this.useRegister('helper');
+
+ var nonHelper = this.popStack();
+
+ this.emptyHash();
+ var helper = this.setupHelper(0, name, helperCall);
+
+ var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
+
+ this.push(
+ '((helper = (helper = ' + helperName + ' || ' + nonHelper + ') != null ? helper : helperMissing'
+ + (helper.paramsInit ? '),(' + helper.paramsInit : '') + '),'
+ + '(typeof helper === functionType ? helper.call(' + helper.callParams + ') : helper))');
+ },
+
+ // [invokePartial]
+ //
+ // On stack, before: context, ...
+ // On stack after: result of partial invocation
+ //
+ // This operation pops off a context, invokes a partial with that context,
+ // and pushes the result of the invocation back.
+ invokePartial: function(name, indent) {
+ var params = [this.nameLookup('partials', name, 'partial'), "'" + indent + "'", "'" + name + "'", this.popStack(), this.popStack(), "helpers", "partials"];
+
+ if (this.options.data) {
+ params.push("data");
+ } else if (this.options.compat) {
+ params.push('undefined');
+ }
+ if (this.options.compat) {
+ params.push('depths');
+ }
+
+ this.push("this.invokePartial(" + params.join(", ") + ")");
+ },
+
+ // [assignToHash]
+ //
+ // On stack, before: value, ..., hash, ...
+ // On stack, after: ..., hash, ...
+ //
+ // Pops a value off the stack and assigns it to the current hash
+ assignToHash: function(key) {
+ var value = this.popStack(),
+ context,
+ type,
+ id;
+
+ if (this.trackIds) {
+ id = this.popStack();
+ }
+ if (this.stringParams) {
+ type = this.popStack();
+ context = this.popStack();
+ }
+
+ var hash = this.hash;
+ if (context) {
+ hash.contexts.push("'" + key + "': " + context);
+ }
+ if (type) {
+ hash.types.push("'" + key + "': " + type);
+ }
+ if (id) {
+ hash.ids.push("'" + key + "': " + id);
+ }
+ hash.values.push("'" + key + "': (" + value + ")");
+ },
+
+ pushId: function(type, name) {
+ if (type === 'ID' || type === 'DATA') {
+ this.pushString(name);
+ } else if (type === 'sexpr') {
+ this.pushStackLiteral('true');
+ } else {
+ this.pushStackLiteral('null');
+ }
+ },
+
+ // HELPERS
+
+ compiler: JavaScriptCompiler,
+
+ compileChildren: function(environment, options) {
+ var children = environment.children, child, compiler;
+
+ for(var i=0, l=children.length; i<l; i++) {
+ child = children[i];
+ compiler = new this.compiler();
+
+ var index = this.matchExistingProgram(child);
+
+ if (index == null) {
+ this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
+ index = this.context.programs.length;
+ child.index = index;
+ child.name = 'program' + index;
+ this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);
+ this.context.environments[index] = child;
+
+ this.useDepths = this.useDepths || compiler.useDepths;
+ } else {
+ child.index = index;
+ child.name = 'program' + index;
+ }
+ }
+ },
+ matchExistingProgram: function(child) {
+ for (var i = 0, len = this.context.environments.length; i < len; i++) {
+ var environment = this.context.environments[i];
+ if (environment && environment.equals(child)) {
+ return i;
+ }
+ }
+ },
+
+ programExpression: function(guid) {
+ var child = this.environment.children[guid],
+ depths = child.depths.list,
+ useDepths = this.useDepths,
+ depth;
+
+ var programParams = [child.index, 'data'];
+
+ if (useDepths) {
+ programParams.push('depths');
+ }
+
+ return 'this.program(' + programParams.join(', ') + ')';
+ },
+
+ useRegister: function(name) {
+ if(!this.registers[name]) {
+ this.registers[name] = true;
+ this.registers.list.push(name);
+ }
+ },
+
+ pushStackLiteral: function(item) {
+ return this.push(new Literal(item));
+ },
+
+ pushSource: function(source) {
+ if (this.pendingContent) {
+ this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent)));
+ this.pendingContent = undefined;
+ }
+
+ if (source) {
+ this.source.push(source);
+ }
+ },
+
+ pushStack: function(item) {
+ this.flushInline();
+
+ var stack = this.incrStack();
+ this.pushSource(stack + " = " + item + ";");
+ this.compileStack.push(stack);
+ return stack;
+ },
+
+ replaceStack: function(callback) {
+ var prefix = '',
+ inline = this.isInline(),
+ stack,
+ createdStack,
+ usedLiteral;
+
+ /* istanbul ignore next */
+ if (!this.isInline()) {
+ throw new Exception('replaceStack on non-inline');
+ }
+
+ // We want to merge the inline statement into the replacement statement via ','
+ var top = this.popStack(true);
+
+ if (top instanceof Literal) {
+ // Literals do not need to be inlined
+ prefix = stack = top.value;
+ usedLiteral = true;
+ } else {
+ // Get or create the current stack name for use by the inline
+ createdStack = !this.stackSlot;
+ var name = !createdStack ? this.topStackName() : this.incrStack();
+
+ prefix = '(' + this.push(name) + ' = ' + top + ')';
+ stack = this.topStack();
+ }
+
+ var item = callback.call(this, stack);
+
+ if (!usedLiteral) {
+ this.popStack();
+ }
+ if (createdStack) {
+ this.stackSlot--;
+ }
+ this.push('(' + prefix + item + ')');
+ },
+
+ incrStack: function() {
+ this.stackSlot++;
+ if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
+ return this.topStackName();
+ },
+ topStackName: function() {
+ return "stack" + this.stackSlot;
+ },
+ flushInline: function() {
+ var inlineStack = this.inlineStack;
+ if (inlineStack.length) {
+ this.inlineStack = [];
+ for (var i = 0, len = inlineStack.length; i < len; i++) {
+ var entry = inlineStack[i];
+ if (entry instanceof Literal) {
+ this.compileStack.push(entry);
+ } else {
+ this.pushStack(entry);
+ }
+ }
+ }
+ },
+ isInline: function() {
+ return this.inlineStack.length;
+ },
+
+ popStack: function(wrapped) {
+ var inline = this.isInline(),
+ item = (inline ? this.inlineStack : this.compileStack).pop();
+
+ if (!wrapped && (item instanceof Literal)) {
+ return item.value;
+ } else {
+ if (!inline) {
+ /* istanbul ignore next */
+ if (!this.stackSlot) {
+ throw new Exception('Invalid stack pop');
+ }
+ this.stackSlot--;
+ }
+ return item;
+ }
+ },
+
+ topStack: function() {
+ var stack = (this.isInline() ? this.inlineStack : this.compileStack),
+ item = stack[stack.length - 1];
+
+ if (item instanceof Literal) {
+ return item.value;
+ } else {
+ return item;
+ }
+ },
+
+ contextName: function(context) {
+ if (this.useDepths && context) {
+ return 'depths[' + context + ']';
+ } else {
+ return 'depth' + context;
+ }
+ },
+
+ quotedString: function(str) {
+ return '"' + str
+ .replace(/\\/g, '\\\\')
+ .replace(/"/g, '\\"')
+ .replace(/\n/g, '\\n')
+ .replace(/\r/g, '\\r')
+ .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
+ .replace(/\u2029/g, '\\u2029') + '"';
+ },
+
+ objectLiteral: function(obj) {
+ var pairs = [];
+
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ pairs.push(this.quotedString(key) + ':' + obj[key]);
+ }
+ }
+
+ return '{' + pairs.join(',') + '}';
+ },
+
+ setupHelper: function(paramSize, name, blockHelper) {
+ var params = [],
+ paramsInit = this.setupParams(name, paramSize, params, blockHelper);
+ var foundHelper = this.nameLookup('helpers', name, 'helper');
+
+ return {
+ params: params,
+ paramsInit: paramsInit,
+ name: foundHelper,
+ callParams: [this.contextName(0)].concat(params).join(", ")
+ };
+ },
+
+ setupOptions: function(helper, paramSize, params) {
+ var options = {}, contexts = [], types = [], ids = [], param, inverse, program;
+
+ options.name = this.quotedString(helper);
+ options.hash = this.popStack();
+
+ if (this.trackIds) {
+ options.hashIds = this.popStack();
+ }
+ if (this.stringParams) {
+ options.hashTypes = this.popStack();
+ options.hashContexts = this.popStack();
+ }
+
+ inverse = this.popStack();
+ program = this.popStack();
+
+ // Avoid setting fn and inverse if neither are set. This allows
+ // helpers to do a check for `if (options.fn)`
+ if (program || inverse) {
+ if (!program) {
+ program = 'this.noop';
+ }
+
+ if (!inverse) {
+ inverse = 'this.noop';
+ }
+
+ options.fn = program;
+ options.inverse = inverse;
+ }
+
+ // The parameters go on to the stack in order (making sure that they are evaluated in order)
+ // so we need to pop them off the stack in reverse order
+ var i = paramSize;
+ while (i--) {
+ param = this.popStack();
+ params[i] = param;
+
+ if (this.trackIds) {
+ ids[i] = this.popStack();
+ }
+ if (this.stringParams) {
+ types[i] = this.popStack();
+ contexts[i] = this.popStack();
+ }
+ }
+
+ if (this.trackIds) {
+ options.ids = "[" + ids.join(",") + "]";
+ }
+ if (this.stringParams) {
+ options.types = "[" + types.join(",") + "]";
+ options.contexts = "[" + contexts.join(",") + "]";
+ }
+
+ if (this.options.data) {
+ options.data = "data";
+ }
+
+ return options;
+ },
+
+ // the params and contexts arguments are passed in arrays
+ // to fill in
+ setupParams: function(helperName, paramSize, params, useRegister) {
+ var options = this.objectLiteral(this.setupOptions(helperName, paramSize, params));
+
+ if (useRegister) {
+ this.useRegister('options');
+ params.push('options');
+ return 'options=' + options;
+ } else {
+ params.push(options);
+ return '';
+ }
+ }
+ };
+
+ var reservedWords = (
+ "break else new var" +
+ " case finally return void" +
+ " catch for switch while" +
+ " continue function this with" +
+ " default if throw" +
+ " delete in try" +
+ " do instanceof typeof" +
+ " abstract enum int short" +
+ " boolean export interface static" +
+ " byte extends long super" +
+ " char final native synchronized" +
+ " class float package throws" +
+ " const goto private transient" +
+ " debugger implements protected volatile" +
+ " double import public let yield"
+ ).split(" ");
+
+ var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
+
+ for(var i=0, l=reservedWords.length; i<l; i++) {
+ compilerWords[reservedWords[i]] = true;
+ }
+
+ JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
+ return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
+ };
+
+ __exports__ = JavaScriptCompiler;
+ return __exports__;
+})(__module2__, __module5__);
+
+// handlebars.js
+var __module0__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
+ "use strict";
+ var __exports__;
+ /*globals Handlebars: true */
+ var Handlebars = __dependency1__;
+
+ // Compiler imports
+ var AST = __dependency2__;
+ var Parser = __dependency3__.parser;
+ var parse = __dependency3__.parse;
+ var Compiler = __dependency4__.Compiler;
+ var compile = __dependency4__.compile;
+ var precompile = __dependency4__.precompile;
+ var JavaScriptCompiler = __dependency5__;
+
+ var _create = Handlebars.create;
+ var create = function() {
+ var hb = _create();
+
+ hb.compile = function(input, options) {
+ return compile(input, options, hb);
+ };
+ hb.precompile = function (input, options) {
+ return precompile(input, options, hb);
+ };
+
+ hb.AST = AST;
+ hb.Compiler = Compiler;
+ hb.JavaScriptCompiler = JavaScriptCompiler;
+ hb.Parser = Parser;
+ hb.parse = parse;
+
+ return hb;
+ };
+
+ Handlebars = create();
+ Handlebars.create = create;
+
+ Handlebars['default'] = Handlebars;
+
+ __exports__ = Handlebars;
+ return __exports__;
+})(__module1__, __module7__, __module8__, __module11__, __module12__);
+
+ return __module0__;
+}));
+/*
+ * $Id$
+** pz2.js - pazpar2's javascript client library.
+*/
+
+//since explorer is flawed
+if (!window['Node']) {
+ window.Node = new Object();
+ Node.ELEMENT_NODE = 1;
+ Node.ATTRIBUTE_NODE = 2;
+ Node.TEXT_NODE = 3;
+ Node.CDATA_SECTION_NODE = 4;
+ Node.ENTITY_REFERENCE_NODE = 5;
+ Node.ENTITY_NODE = 6;
+ Node.PROCESSING_INSTRUCTION_NODE = 7;
+ Node.COMMENT_NODE = 8;
+ Node.DOCUMENT_NODE = 9;
+ Node.DOCUMENT_TYPE_NODE = 10;
+ Node.DOCUMENT_FRAGMENT_NODE = 11;
+ Node.NOTATION_NODE = 12;
+}
+
+// prevent execution of more than once
+if(typeof window.pz2 == "undefined") {
+window.undefined = window.undefined;
+
+var pz2 = function ( paramArray )
+{
+
+ // at least one callback required
+ if ( !paramArray )
+ throw new Error("Pz2.js: Array with parameters has to be supplied.");
+
+ //supported pazpar2's protocol version
+ this.windowid = paramArray.windowid || window.name;
+ this.suppProtoVer = '1';
+ if (typeof paramArray.pazpar2path != "undefined")
+ this.pz2String = paramArray.pazpar2path;
+ else
+ this.pz2String = "/pazpar2/search.pz2";
+ this.useSessions = true;
+
+ this.stylesheet = paramArray.detailstylesheet || null;
+ //load stylesheet if required in async mode
+ if( this.stylesheet ) {
+ var context = this;
+ var request = new pzHttpRequest( this.stylesheet );
+ request.get( {}, function ( doc ) { context.xslDoc = doc; } );
+ }
+
+ this.errorHandler = paramArray.errorhandler || null;
+ this.showResponseType = paramArray.showResponseType || "xml";
+
+ // function callbacks
+ this.initCallback = paramArray.oninit || null;
+ this.statCallback = paramArray.onstat || null;
+ this.showCallback = paramArray.onshow || null;
+ this.termlistCallback = paramArray.onterm || null;
+ this.recordCallback = paramArray.onrecord || null;
+ this.bytargetCallback = paramArray.onbytarget || null;
+ this.resetCallback = paramArray.onreset || null;
+
+ // termlist keys
+ this.termKeys = paramArray.termlist || "subject";
+
+ // some configurational stuff
+ this.keepAlive = 50000;
+
+ if ( paramArray.keepAlive < this.keepAlive )
+ this.keepAlive = paramArray.keepAlive;
+
+ this.sessionID = null;
+ this.serviceId = paramArray.serviceId || null;
+ this.initStatusOK = false;
+ this.pingStatusOK = false;
+ this.searchStatusOK = false;
+ this.mergekey = paramArray.mergekey || null;
+ this.rank = paramArray.rank || null;
+
+ // for sorting
+ this.currentSort = "relevance";
+
+ // where are we?
+ this.currentStart = 0;
+ // currentNum can be overwritten in show
+ this.currentNum = 20;
+
+ // last full record retrieved
+ this.currRecID = null;
+
+ // current query
+ this.currQuery = null;
+
+ //current raw record offset
+ this.currRecOffset = null;
+
+ //timers
+ this.pingTimer = null;
+ this.statTime = paramArray.stattime || 1000;
+ this.statTimer = null;
+ this.termTime = paramArray.termtime || 1000;
+ this.termTimer = null;
+ this.showTime = paramArray.showtime || 1000;
+ this.showTimer = null;
+ this.showFastCount = 4;
+ this.bytargetTime = paramArray.bytargettime || 1000;
+ this.bytargetTimer = null;
+ this.recordTime = paramArray.recordtime || 500;
+ this.recordTimer = null;
+
+ // counters for each command and applied delay
+ this.dumpFactor = 500;
+ this.showCounter = 0;
+ this.termCounter = 0;
+ this.statCounter = 0;
+ this.bytargetCounter = 0;
+ this.recordCounter = 0;
+
+ // active clients, updated by stat and show
+ // might be an issue since bytarget will poll accordingly
+ this.activeClients = 1;
+
+ // if in proxy mode no need to init
+ if (paramArray.usesessions != undefined) {
+ this.useSessions = paramArray.usesessions;
+ this.initStatusOK = true;
+ }
+ // else, auto init session or wait for a user init?
+ if (this.useSessions && paramArray.autoInit !== false) {
+ this.init(this.sessionID, this.serviceId);
+ }
+ // Version parameter
+ this.version = paramArray.version || null;
+};
+
+pz2.prototype =
+{
+ //error handler for async error throws
+ throwError: function (errMsg, errCode)
+ {
+ var err = new Error(errMsg);
+ if (errCode) err.code = errCode;
+
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ },
+
+ // stop activity by clearing tiemouts
+ stop: function ()
+ {
+ clearTimeout(this.statTimer);
+ clearTimeout(this.showTimer);
+ clearTimeout(this.termTimer);
+ clearTimeout(this.bytargetTimer);
+ },
+
+ // reset status variables
+ reset: function ()
+ {
+ if ( this.useSessions ) {
+ this.sessionID = null;
+ this.initStatusOK = false;
+ this.pingStatusOK = false;
+ clearTimeout(this.pingTimer);
+ }
+ this.searchStatusOK = false;
+ this.stop();
+
+ if ( this.resetCallback )
+ this.resetCallback(this.windowid);
+ },
+
+ init: function (sessionId, serviceId)
+ {
+ this.reset();
+
+ // session id as a param
+ if (sessionId && this.useSessions ) {
+ this.initStatusOK = true;
+ this.sessionID = sessionId;
+ this.ping();
+ // old school direct pazpar2 init
+ } else if (this.useSessions) {
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ var opts = {'command' : 'init'};
+ if (serviceId) opts.service = serviceId;
+ request.safeGet(
+ opts,
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ if ( data.getElementsByTagName("protocol")[0]
+ .childNodes[0].nodeValue
+ != context.suppProtoVer )
+ throw new Error(
+ "Server's protocol not supported by the client"
+ );
+ context.initStatusOK = true;
+ context.sessionID =
+ data.getElementsByTagName("session")[0]
+ .childNodes[0].nodeValue;
+ if (data.getElementsByTagName("keepAlive").length > 0) {
+ context.keepAlive = data.getElementsByTagName("keepAlive")[0].childNodes[0].nodeValue;
+ }
+ context.pingTimer =
+ setTimeout(
+ function () {
+ context.ping();
+ },
+ context.keepAlive
+ );
+ if ( context.initCallback )
+ context.initCallback(context.windowid);
+ }
+ else
+ context.throwError('Init failed. Malformed WS resonse.',
+ 110);
+ }
+ );
+ // when through proxy no need to init
+ } else {
+ this.initStatusOK = true;
+ }
+ },
+ // no need to ping explicitly
+ ping: function ()
+ {
+ // pinging only makes sense when using pazpar2 directly
+ if( !this.initStatusOK || !this.useSessions )
+ throw new Error(
+ 'Pz2.js: Ping not allowed (proxy mode) or session not initialized.'
+ );
+ var context = this;
+
+ clearTimeout(context.pingTimer);
+
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ { "command": "ping", "session": this.sessionID, "windowid" : context.windowid },
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ context.pingStatusOK = true;
+ context.pingTimer =
+ setTimeout(
+ function () {
+ context.ping();
+ },
+ context.keepAlive
+ );
+ }
+ else
+ context.throwError('Ping failed. Malformed WS resonse.',
+ 111);
+ }
+ );
+ },
+ search: function (query, num, sort, filter, showfrom, addParamsArr)
+ {
+ clearTimeout(this.statTimer);
+ clearTimeout(this.showTimer);
+ clearTimeout(this.termTimer);
+ clearTimeout(this.bytargetTimer);
+
+ this.showCounter = 0;
+ this.termCounter = 0;
+ this.bytargetCounter = 0;
+ this.statCounter = 0;
+ this.activeClients = 1;
+
+ // no proxy mode
+ if( !this.initStatusOK )
+ throw new Error('Pz2.js: session not initialized.');
+
+ if( query !== undefined )
+ this.currQuery = query;
+ else
+ throw new Error("Pz2.js: no query supplied to the search command.");
+
+ if ( showfrom !== undefined )
+ var start = showfrom;
+ else
+ var start = 0;
+
+ var searchParams = {
+ "command": "search",
+ "query": this.currQuery,
+ "session": this.sessionID,
+ "windowid" : this.windowid
+ };
+
+ if( sort !== undefined ) {
+ this.currentSort = sort;
+ searchParams["sort"] = sort;
+ }
+ if (filter !== undefined) searchParams["filter"] = filter;
+ if (this.mergekey) searchParams["mergekey"] = this.mergekey;
+ if (this.rank) searchParams["rank"] = this.rank;
+
+ // copy additional parmeters, do not overwrite
+ if (addParamsArr != undefined) {
+ for (var prop in addParamsArr) {
+ if (!searchParams.hasOwnProperty(prop))
+ searchParams[prop] = addParamsArr[prop];
+ }
+ }
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ searchParams,
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ context.searchStatusOK = true;
+ //piggyback search
+ if (context.showCallback)
+ context.show(start, num, sort);
+ if (context.statCallback)
+ context.stat();
+ if (context.termlistCallback)
+ context.termlist();
+ if (context.bytargetCallback)
+ context.bytarget();
+ }
+ else
+ context.throwError('Search failed. Malformed WS resonse.',
+ 112);
+ }
+ );
+ },
+ stat: function()
+ {
+ if( !this.initStatusOK )
+ throw new Error('Pz2.js: session not initialized.');
+
+ // if called explicitly takes precedence
+ clearTimeout(this.statTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ { "command": "stat", "session": this.sessionID, "windowid" : context.windowid },
+ function(data) {
+ if ( data.getElementsByTagName("stat") ) {
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+
+ var stat = Element_parseChildNodes(data.documentElement);
+
+ context.statCounter++;
+ var delay = context.statTime
+ + context.statCounter * context.dumpFactor;
+
+ if ( activeClients > 0 )
+ context.statTimer =
+ setTimeout(
+ function () {
+ context.stat();
+ },
+ delay
+ );
+ context.statCallback(stat, context.windowid);
+ }
+ else
+ context.throwError('Stat failed. Malformed WS resonse.',
+ 113);
+ }
+ );
+ },
+ show: function(start, num, sort, query_state)
+ {
+ if( !this.searchStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: show command has to be preceded with a search command.'
+ );
+
+ // if called explicitly takes precedence
+ clearTimeout(this.showTimer);
+
+ if( sort !== undefined )
+ this.currentSort = sort;
+ if( start !== undefined )
+ this.currentStart = Number( start );
+ if( num !== undefined )
+ this.currentNum = Number( num );
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ var requestParameters =
+ {
+ "command": "show",
+ "session": this.sessionID,
+ "start": this.currentStart,
+ "num": this.currentNum,
+ "sort": this.currentSort,
+ "block": 1,
+ "type": this.showResponseType,
+ "windowid" : this.windowid
+ };
+ if (query_state)
+ requestParameters["query-state"] = query_state;
+ if (this.version && this.version > 0)
+ requestParameters["version"] = this.version;
+ request.safeGet(
+ requestParameters,
+ function(data, type) {
+ var show = null;
+ var activeClients = 0;
+ if (type === "json") {
+ show = {};
+ activeClients = Number(data.activeclients[0]);
+ show.activeclients = activeClients;
+ show.merged = Number(data.merged[0]);
+ show.total = Number(data.total[0]);
+ show.start = Number(data.start[0]);
+ show.num = Number(data.num[0]);
+ show.hits = data.hit;
+ } else if (data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK") {
+ // first parse the status data send along with records
+ // this is strictly bound to the format
+ activeClients =
+ Number(data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue);
+ show = {
+ "activeclients": activeClients,
+ "merged":
+ Number( data.getElementsByTagName("merged")[0]
+ .childNodes[0].nodeValue ),
+ "total":
+ Number( data.getElementsByTagName("total")[0]
+ .childNodes[0].nodeValue ),
+ "start":
+ Number( data.getElementsByTagName("start")[0]
+ .childNodes[0].nodeValue ),
+ "num":
+ Number( data.getElementsByTagName("num")[0]
+ .childNodes[0].nodeValue ),
+ "hits": []
+ };
+ // parse all the first-level nodes for all <hit> tags
+ var hits = data.getElementsByTagName("hit");
+ for (i = 0; i < hits.length; i++)
+ show.hits[i] = Element_parseChildNodes(hits[i]);
+ } else {
+ context.throwError('Show failed. Malformed WS resonse.',
+ 114);
+ };
+
+ var approxNode = data.getElementsByTagName("approximation");
+ if (approxNode && approxNode[0] && approxNode[0].childNodes[0] && approxNode[0].childNodes[0].nodeValue)
+ show['approximation'] =
+ Number( approxNode[0].childNodes[0].nodeValue);
+
+
+ data.getElementsByTagName("")
+ context.activeClients = activeClients;
+ context.showCounter++;
+ var delay = context.showTime;
+ if (context.showCounter > context.showFastCount)
+ delay += context.showCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.showTimer = setTimeout(
+ function () {
+ context.show();
+ },
+ delay);
+ context.showCallback(show, context.windowid);
+ }
+ );
+ },
+ record: function(id, offset, syntax, handler)
+ {
+ // we may call record with no previous search if in proxy mode
+ if(!this.searchStatusOK && this.useSessions)
+ throw new Error(
+ 'Pz2.js: record command has to be preceded with a search command.'
+ );
+
+ if( id !== undefined )
+ this.currRecID = id;
+
+ var recordParams = {
+ "command": "record",
+ "session": this.sessionID,
+ "id": this.currRecID,
+ "windowid" : this.windowid
+ };
+
+ this.currRecOffset = null;
+ if (offset != undefined) {
+ recordParams["offset"] = offset;
+ this.currRecOffset = offset;
+ }
+
+ if (syntax != undefined)
+ recordParams['syntax'] = syntax;
+
+ //overwrite default callback id needed
+ var callback = this.recordCallback;
+ var args = undefined;
+ if (handler != undefined) {
+ callback = handler['callback'];
+ args = handler['args'];
+ }
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+
+ request.safeGet(
+ recordParams,
+ function(data) {
+ var recordNode;
+ var record;
+ //raw record
+ if (context.currRecOffset !== null) {
+ record = new Array();
+ record['xmlDoc'] = data;
+ record['offset'] = context.currRecOffset;
+ callback(record, args, context.windowid);
+ //pz2 record
+ } else if ( recordNode =
+ data.getElementsByTagName("record")[0] ) {
+ // if stylesheet was fetched do not parse the response
+ if ( context.xslDoc ) {
+ record = new Array();
+ record['xmlDoc'] = data;
+ record['xslDoc'] = context.xslDoc;
+ record['recid'] =
+ recordNode.getElementsByTagName("recid")[0]
+ .firstChild.nodeValue;
+ //parse record
+ } else {
+ record = Element_parseChildNodes(recordNode);
+ }
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+ context.recordCounter++;
+ var delay = context.recordTime + context.recordCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.recordTimer =
+ setTimeout (
+ function() {
+ context.record(id, offset, syntax, handler);
+ },
+ delay
+ );
+ callback(record, args, context.windowid);
+ }
+ else
+ context.throwError('Record failed. Malformed WS resonse.',
+ 115);
+ }
+ );
+ },
+
+ termlist: function()
+ {
+ if( !this.searchStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: termlist command has to be preceded with a search command.'
+ );
+
+ // if called explicitly takes precedence
+ clearTimeout(this.termTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ {
+ "command": "termlist",
+ "session": this.sessionID,
+ "name": this.termKeys,
+ "windowid" : this.windowid,
+ "version" : this.version
+
+ },
+ function(data) {
+ if ( data.getElementsByTagName("termlist") ) {
+ var activeClients =
+ Number( data.getElementsByTagName("activeclients")[0]
+ .childNodes[0].nodeValue );
+ context.activeClients = activeClients;
+ var termList = { "activeclients": activeClients };
+ var termLists = data.getElementsByTagName("list");
+ //for each termlist
+ for (i = 0; i < termLists.length; i++) {
+ var listName = termLists[i].getAttribute('name');
+ termList[listName] = new Array();
+ var terms = termLists[i].getElementsByTagName('term');
+ //for each term in the list
+ for (j = 0; j < terms.length; j++) {
+ var term = {
+ "name":
+ (terms[j].getElementsByTagName("name")[0]
+ .childNodes.length
+ ? terms[j].getElementsByTagName("name")[0]
+ .childNodes[0].nodeValue
+ : 'ERROR'),
+ "freq":
+ terms[j]
+ .getElementsByTagName("frequency")[0]
+ .childNodes[0].nodeValue || 'ERROR'
+ };
+
+ // Only for xtargets: id, records, filtered
+ var termIdNode =
+ terms[j].getElementsByTagName("id");
+ if(terms[j].getElementsByTagName("id").length)
+ term["id"] =
+ termIdNode[0].childNodes[0].nodeValue;
+ termList[listName][j] = term;
+
+ var recordsNode = terms[j].getElementsByTagName("records");
+ if (recordsNode && recordsNode.length)
+ term["records"] = recordsNode[0].childNodes[0].nodeValue;
+
+ var filteredNode = terms[j].getElementsByTagName("filtered");
+ if (filteredNode && filteredNode.length)
+ term["filtered"] = filteredNode[0].childNodes[0].nodeValue;
+
+ }
+ }
+
+ context.termCounter++;
+ var delay = context.termTime
+ + context.termCounter * context.dumpFactor;
+ if ( activeClients > 0 )
+ context.termTimer =
+ setTimeout(
+ function () {
+ context.termlist();
+ },
+ delay
+ );
+
+ context.termlistCallback(termList, context.windowid);
+ }
+ else
+ context.throwError('Termlist failed. Malformed WS resonse.',
+ 116);
+ }
+ );
+
+ },
+ bytarget: function()
+ {
+ if( !this.initStatusOK && this.useSessions )
+ throw new Error(
+ 'Pz2.js: bytarget command has to be preceded with a search command.'
+ );
+
+ // no need to continue
+ if( !this.searchStatusOK )
+ return;
+
+ // if called explicitly takes precedence
+ clearTimeout(this.bytargetTimer);
+
+ var context = this;
+ var request = new pzHttpRequest(this.pz2String, this.errorHandler);
+ request.safeGet(
+ {
+ "command": "bytarget",
+ "session": this.sessionID,
+ "block": 1,
+ "windowid" : this.windowid,
+ "version" : this.version
+ },
+ function(data) {
+ if ( data.getElementsByTagName("status")[0]
+ .childNodes[0].nodeValue == "OK" ) {
+ var targetNodes = data.getElementsByTagName("target");
+ var bytarget = new Array();
+ for ( i = 0; i < targetNodes.length; i++) {
+ bytarget[i] = new Array();
+ for( j = 0; j < targetNodes[i].childNodes.length; j++ ) {
+ if ( targetNodes[i].childNodes[j].nodeType
+ == Node.ELEMENT_NODE ) {
+ var nodeName =
+ targetNodes[i].childNodes[j].nodeName;
+ if (targetNodes[i].childNodes[j].firstChild != null)
+ {
+ var nodeText = targetNodes[i].childNodes[j]
+ .firstChild.nodeValue;
+ bytarget[i][nodeName] = nodeText;
+ }
+ else {
+ bytarget[i][nodeName] = "";
+ }
+
+
+ }
+ }
+ if (bytarget[i]["state"]=="Client_Disconnected") {
+ bytarget[i]["hits"] = "Error";
+ } else if (bytarget[i]["state"]=="Client_Error") {
+ bytarget[i]["hits"] = "Error";
+ } else if (bytarget[i]["state"]=="Client_Working") {
+ bytarget[i]["hits"] = "...";
+ }
+ var targetsSuggestions = targetNodes[i].getElementsByTagName("suggestions");
+ if (targetsSuggestions != undefined && targetsSuggestions.length>0) {
+ var suggestions = targetsSuggestions[0];
+ bytarget[i]["suggestions"] = Element_parseChildNodes(suggestions);
+ }
+ }
+
+ context.bytargetCounter++;
+ var delay = context.bytargetTime
+ + context.bytargetCounter * context.dumpFactor;
+ if ( context.activeClients > 0 )
+ context.bytargetTimer =
+ setTimeout(
+ function () {
+ context.bytarget();
+ },
+ delay
+ );
+
+ context.bytargetCallback(bytarget, context.windowid);
+ }
+ else
+ context.throwError('Bytarget failed. Malformed WS resonse.',
+ 117);
+ }
+ );
+ },
+
+ // just for testing, probably shouldn't be here
+ showNext: function(page)
+ {
+ var step = page || 1;
+ this.show( ( step * this.currentNum ) + this.currentStart );
+ },
+
+ showPrev: function(page)
+ {
+ if (this.currentStart == 0 )
+ return false;
+ var step = page || 1;
+ var newStart = this.currentStart - (step * this.currentNum );
+ this.show( newStart > 0 ? newStart : 0 );
+ },
+
+ showPage: function(pageNum)
+ {
+ //var page = pageNum || 1;
+ this.show(pageNum * this.currentNum);
+ }
+};
+
+/*
+********************************************************************************
+** AJAX HELPER CLASS ***********************************************************
+********************************************************************************
+*/
+var pzHttpRequest = function (url, errorHandler, cookieDomain, windowId) {
+ this.maxUrlLength = 2048;
+ this.request = null;
+ this.url = url;
+ this.errorHandler = errorHandler || null;
+ this.async = true;
+ this.requestHeaders = {};
+ this.isXDR = false;
+ this.domainRegex = /https?:\/\/([^:/]+).*/;
+ this.cookieDomain = cookieDomain || null;
+ this.windowId = windowId || window.name;
+
+ var xhr = new XMLHttpRequest();
+ var domain = this._getDomainFromUrl(url);
+ if ("withCredentials" in xhr) {
+ // XHR for Chrome/Firefox/Opera/Safari.
+ } else if (domain && this._isCrossDomain(domain) &&
+ typeof XDomainRequest != "undefined") {
+ // use XDR (IE7/8) when no other way
+ xhr = new XDomainRequest();
+ this.isXDR = true;
+ } else {
+ // CORS not supported.
+ }
+ this.request = xhr;
+};
+
+
+pzHttpRequest.prototype =
+{
+ safeGet: function ( params, callback )
+ {
+ var encodedParams = this.encodeParams(params);
+ var url = this._urlAppendParams(encodedParams);
+ if (url.length >= this.maxUrlLength) {
+ this.requestHeaders["Content-Type"]
+ = "application/x-www-form-urlencoded";
+ this._send( 'POST', this.url, encodedParams, callback );
+ } else {
+ this._send( 'GET', url, '', callback );
+ }
+ },
+
+ get: function ( params, callback )
+ {
+ this._send( 'GET', this._urlAppendParams(this.encodeParams(params)),
+ '', callback );
+ },
+
+ post: function ( params, data, callback )
+ {
+ this._send( 'POST', this._urlAppendParams(this.encodeParams(params)),
+ data, callback );
+ },
+
+ load: function ()
+ {
+ this.async = false;
+ this.request.open( 'GET', this.url, this.async );
+ this.request.send('');
+ if ( this.request.status == 200 )
+ return this.request.responseXML;
+ },
+
+ encodeParams: function (params)
+ {
+ var sep = "";
+ var encoded = "";
+ for (var key in params) {
+ if (params[key] != null) {
+ encoded += sep + key + '=' + encodeURIComponent(params[key]);
+ sep = '&';
+ }
+ }
+ return encoded;
+ },
+
+ _getDomainFromUrl: function (url)
+ {
+ if (this.cookieDomain) return this.cookieDomain; //explicit cookie domain
+ var m = this.domainRegex.exec(url);
+ return (m && m.length > 1) ? m[1] : null;
+ },
+
+ _strEndsWith: function (str, suffix)
+ {
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
+ },
+
+ _isCrossDomain: function (domain)
+ {
+ if (this.cookieDomain) return true; //assume xdomain is cookie domain set
+ return !this._strEndsWith(domain, document.domain);
+ },
+
+ getCookie: function (sKey) {
+ return decodeURI(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"
+ + encodeURI(sKey).replace(/[\-\.\+\*]/g, "\\$&")
+ + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
+ },
+
+ setCookie: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
+ if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
+ return false;
+ }
+ var sExpires = "";
+ if (vEnd) {
+ switch (vEnd.constructor) {
+ case Number:
+ sExpires = vEnd === Infinity
+ ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT"
+ : "; max-age=" + vEnd;
+ break;
+ case String:
+ sExpires = "; expires=" + vEnd;
+ break;
+ case Date:
+ sExpires = "; expires=" + vEnd.toGMTString();
+ break;
+ }
+ }
+ document.cookie = encodeURI(sKey) + "=" + encodeURI(sValue)
+ + sExpires
+ + (sDomain ? "; domain=" + sDomain : "")
+ + (sPath ? "; path=" + sPath : "")
+ + (bSecure ? "; secure" : "");
+ return true;
+ },
+
+ _send: function ( type, url, data, callback)
+ {
+ var context = this;
+ this.callback = callback;
+ this.async = true;
+ //we never do withCredentials, so if it's CORS and we have
+ //session cookie, resend it
+ var domain = this._getDomainFromUrl(url);
+ if (domain && this._isCrossDomain(domain) &&
+ this.getCookie(domain+":"+this.windowId+":SESSID")) {
+ //rewrite the URL
+ var sessparam = ';jsessionid=' + this.getCookie(domain+":"+this.windowId+":SESSID");
+ var q = url.indexOf('?');
+ if (q == -1) {
+ url += sessparam;
+ } else {
+ url = url.substring(0, q) + sessparam + url.substring(q);
+ }
+ }
+ this.request.open( type, url, this.async );
+ if (!this.isXDR) {
+ //setting headers is only allowed with XHR
+ for (var key in this.requestHeaders)
+ this.request.setRequestHeader(key, this.requestHeaders[key]);
+ }
+ if (this.isXDR) {
+ this.request.onload = function () {
+ //fake XHR props
+ context.request.status = 200;
+ context.request.readyState = 4;
+ //handle
+ context._handleResponse(url);
+ }
+ this.request.onerror = function () {
+ //fake XHR props
+ context.request.status = 417; //not really, but what can we do
+ context.request.readyState = 4;
+ //handle
+ context._handleResponse(url);
+ }
+ } else {
+ this.request.onreadystatechange = function () {
+ context._handleResponse(url); /// url used ONLY for error reporting
+ }
+ }
+ this.request.send(data);
+ },
+
+ _urlAppendParams: function (encodedParams)
+ {
+ if (encodedParams)
+ return this.url + "?" + encodedParams;
+ else
+ return this.url;
+ },
+
+ _handleResponse: function (requestUrl)
+ {
+ if ( this.request.readyState == 4 ) {
+ // pick up appplication errors first
+ var errNode = null;
+ // xdomainreq does not have responseXML
+ if (this.isXDR) {
+ if (this.request.contentType.match(/\/xml/)){
+ var dom = new ActiveXObject('Microsoft.XMLDOM');
+ dom.async = false;
+ dom.loadXML(this.request.responseText);
+ this.request.responseXML = dom;
+ } else {
+ this.request.responseXML = null;
+ }
+ }
+ if (this.request.responseXML &&
+ (errNode = this.request.responseXML.documentElement)
+ && errNode.nodeName == 'error') {
+ var errMsg = errNode.getAttribute("msg");
+ var errCode = errNode.getAttribute("code");
+ var errAddInfo = '';
+ if (errNode.childNodes.length)
+ errAddInfo = ': ' + errNode.childNodes[0].nodeValue;
+
+ var err = new Error(errMsg + errAddInfo);
+ err.code = errCode;
+
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ }
+ else if (this.request.status == 200 &&
+ this.request.responseXML === null) {
+ if (this.request.responseText !== null) {
+ //assume JSON
+ var json = null;
+ var text = this.request.responseText;
+ if (typeof window.JSON == "undefined") {
+ json = eval("(" + text + ")");
+ } else {
+ try {
+ json = JSON.parse(text);
+ } catch (e) {
+ }
+ }
+ this.callback(json, "json");
+ } else {
+ var err = new Error("XML/Text response is empty but no error " +
+ "for " + requestUrl);
+ err.code = -1;
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ } else {
+ throw err;
+ }
+ }
+ } else if (this.request.status == 200) {
+ //set cookie manually only if cross-domain
+ var domain = this._getDomainFromUrl(requestUrl);
+ if (domain && this._isCrossDomain(domain)) {
+ var jsessionId = this.request.responseXML
+ .documentElement.getAttribute('jsessionId');
+ if (jsessionId)
+ this.setCookie(domain+":"+this.windowId+":SESSID", jsessionId);
+ }
+ this.callback(this.request.responseXML);
+ } else {
+ var err = new Error("HTTP response not OK: "
+ + this.request.status + " - "
+ + this.request.statusText );
+ err.code = '00' + this.request.status;
+ if (this.errorHandler) {
+ this.errorHandler(err);
+ }
+ else {
+ throw err;
+ }
+ }
+ }
+ }
+};
+
+/*
+********************************************************************************
+** XML HELPER FUNCTIONS ********************************************************
+********************************************************************************
+*/
+
+// DOMDocument
+
+if ( window.ActiveXObject) {
+ var DOMDoc = document;
+} else {
+ var DOMDoc = Document.prototype;
+}
+
+DOMDoc.newXmlDoc = function ( root )
+{
+ var doc;
+
+ if (document.implementation && document.implementation.createDocument) {
+ doc = document.implementation.createDocument('', root, null);
+ } else if ( window.ActiveXObject ) {
+ doc = new ActiveXObject("MSXML2.DOMDocument");
+ doc.loadXML('<' + root + '/>');
+ } else {
+ throw new Error ('No XML support in this browser');
+ }
+
+ return doc;
+}
+
+
+DOMDoc.parseXmlFromString = function ( xmlString )
+{
+ var doc;
+
+ if ( window.DOMParser ) {
+ var parser = new DOMParser();
+ doc = parser.parseFromString( xmlString, "text/xml");
+ } else if ( window.ActiveXObject ) {
+ doc = new ActiveXObject("MSXML2.DOMDocument");
+ doc.loadXML( xmlString );
+ } else {
+ throw new Error ("No XML parsing support in this browser.");
+ }
+
+ return doc;
+}
+
+DOMDoc.transformToDoc = function (xmlDoc, xslDoc)
+{
+ if ( window.XSLTProcessor ) {
+ var proc = new XSLTProcessor();
+ proc.importStylesheet( xslDoc );
+ return proc.transformToDocument(xmlDoc);
+ } else if ( window.ActiveXObject ) {
+ return document.parseXmlFromString(xmlDoc.transformNode(xslDoc));
+ } else {
+ alert( 'Unable to perform XSLT transformation in this browser' );
+ }
+}
+
+// DOMElement
+
+Element_removeFromDoc = function (DOM_Element)
+{
+ DOM_Element.parentNode.removeChild(DOM_Element);
+}
+
+Element_emptyChildren = function (DOM_Element)
+{
+ while( DOM_Element.firstChild ) {
+ DOM_Element.removeChild( DOM_Element.firstChild )
+ }
+}
+
+Element_appendTransformResult = function ( DOM_Element, xmlDoc, xslDoc )
+{
+ if ( window.XSLTProcessor ) {
+ var proc = new XSLTProcessor();
+ proc.importStylesheet( xslDoc );
+ var docFrag = false;
+ docFrag = proc.transformToFragment( xmlDoc, DOM_Element.ownerDocument );
+ DOM_Element.appendChild(docFrag);
+ } else if ( window.ActiveXObject ) {
+ DOM_Element.innerHTML = xmlDoc.transformNode( xslDoc );
+ } else {
+ alert( 'Unable to perform XSLT transformation in this browser' );
+ }
+}
+
+Element_appendTextNode = function (DOM_Element, tagName, textContent )
+{
+ var node = DOM_Element.ownerDocument.createElement(tagName);
+ var text = DOM_Element.ownerDocument.createTextNode(textContent);
+
+ DOM_Element.appendChild(node);
+ node.appendChild(text);
+
+ return node;
+}
+
+Element_setTextContent = function ( DOM_Element, textContent )
+{
+ if (typeof DOM_Element.textContent !== "undefined") {
+ DOM_Element.textContent = textContent;
+ } else if (typeof DOM_Element.innerText !== "undefined" ) {
+ DOM_Element.innerText = textContent;
+ } else {
+ throw new Error("Cannot set text content of the node, no such method.");
+ }
+}
+
+Element_getTextContent = function (DOM_Element)
+{
+ if ( typeof DOM_Element.textContent != 'undefined' ) {
+ return DOM_Element.textContent;
+ } else if (typeof DOM_Element.text != 'undefined') {
+ return DOM_Element.text;
+ } else {
+ throw new Error("Cannot get text content of the node, no such method.");
+ }
+}
+
+Element_parseChildNodes = function (node)
+{
+ var parsed = {};
+ var hasChildElems = false;
+ var textContent = '';
+
+ if (node.hasChildNodes()) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ switch (child.nodeType) {
+ case Node.ELEMENT_NODE:
+ hasChildElems = true;
+ var nodeName = child.nodeName;
+ if (!(nodeName in parsed))
+ parsed[nodeName] = [];
+ parsed[nodeName].push(Element_parseChildNodes(child));
+ break;
+ case Node.TEXT_NODE:
+ textContent += child.nodeValue;
+ break;
+ case Node.CDATA_SECTION_NODE:
+ textContent += child.nodeValue;
+ break;
+ }
+ }
+ }
+
+ var attrs = node.attributes;
+ for (var i = 0; i < attrs.length; i++) {
+ hasChildElems = true;
+ var attrName = '@' + attrs[i].nodeName;
+ var attrValue = attrs[i].nodeValue;
+ parsed[attrName] = attrValue;
+ }
+
+ // if no nested elements/attrs set value to text
+ if (hasChildElems)
+ parsed['#text'] = textContent;
+ else
+ parsed = textContent;
+
+ return parsed;
+}
+
+/* do not remove trailing bracket */
+}
+// Handlebars helpers
+
+Handlebars.registerHelper('mkws-json', function(obj) {
+ return mkws.$.toJSON(obj);
+});
+
+
+// This is intended to handle paragraphs from Wikipedia, hence the
+// rather hacky code to remove numbered references.
+//
+Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
+ var acc = [];
+
+ // For some reason, Handlebars provides the value
+ // {"hash":{},"data":{}} for parameters that are not provided. So we
+ // have to be prepared for actual numbers, explicitly undefined
+ // values and this dumb magic value.
+ if (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
+ nPara = obj.length;
+ }
+ if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
+ nSent = Infinity;
+ }
+
+ for (var i = 0; i < nPara; i++) {
+ // Remove numbered references such as "[1,3,4]" from text
+ var text = obj[i].replace(/\[[0-9,]+\]/g, '');
+ // Next line from http://stackoverflow.com/questions/18914629/split-string-into-sentences-in-javascript
+ var sentences = text.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|");
+ if (sentences.length > nSent)
+ sentences.length = nSent;
+
+ acc.push('<p>', sentences.join(' '), '</p>');
+ nSent -= sentences.length;
+ if (nSent == 0)
+ break;
+ }
+
+ return acc.join('');
+});
+
+
+Handlebars.registerHelper('mkws-translate', function(s) {
+ return mkws.M(s);
+});
+
+
+// We need {{mkws-attr '@name'}} because Handlebars can't parse {{@name}}
+Handlebars.registerHelper('mkws-attr', function(attrName) {
+ return this[attrName];
+});
+
+
+/*
+ * Use as follows: {{#mkws-if-any NAME1 having="NAME2"}}
+ * Applicable when NAME1 is the name of an array
+ * The guarded code runs only if at least one element of the NAME1
+ * array has a subelement called NAME2.
+ */
+Handlebars.registerHelper('mkws-if-any', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(this);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-first', function(items, options) {
+ var having = options.hash.having;
+ for (var i in items) {
+ var item = items[i]
+ if (!having || item[having]) {
+ return options.fn(item);
+ }
+ }
+ return "";
+});
+
+
+Handlebars.registerHelper('mkws-commaList', function(items, options) {
+ var out = "";
+
+ for (var i in items) {
+ if (i > 0) out += ", ";
+ out += options.fn(items[i])
+ }
+
+ return out;
+});
+
+
+Handlebars.registerHelper('mkws-index1', function(obj) {
+ return obj.data.index + 1;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+ var out = "";
+ for (var i = 0; i < count; i++) {
+ out += options.fn(this);
+ }
+ return out;
+});
+/*! MKWS, the MasterKey Widget Set.
+ * Copyright (C) 2013-2014 Index Data
+ * See the file LICENSE for details
+ */
+
+"use strict"; // HTML5: disable for log_level >= 2
+
+
+// Set up global mkws object. Contains truly global state such as SP
+// authentication, and a hash of team objects, indexed by team-name.
+//
+// We set it as a property of window to make the global explicit as
+// some things complain about an implicit global.
+window.mkws = {
+ $: $, // Our own local copy of the jQuery object
+ authenticated: false,
+ authenticating: false,
+ active: false,
+ log_level: 1, // Will be overridden from mkws.config, but
+ // initial value allows jQuery popup to use logging.
+ teams: {},
+ widgetType2function: {},
+ defaultTemplates: {},
+
+ locale_lang: {
+ "de": {
+ "Authors": "Autoren",
+ "Subjects": "Schlagwörter",
+ "Sources": "Daten und Quellen",
+ "source": "datenquelle",
+ "Facets": "Termlisten",
+ "Next": "Weiter",
+ "Prev": "Zurück",
+ "Search": "Suche",
+ "Sort by": "Sortieren nach",
+ "and show": "und zeige",
+ "per page": "pro Seite",
+ "Displaying": "Zeige",
+ "to": "von",
+ "of": "aus",
+ "found": "gefunden",
+ "Title": "Titel",
+ "Author": "Autor",
+ "author": "autor",
+ "Date": "Datum",
+ "Subject": "Schlagwort",
+ "subject": "schlagwort",
+ "Location": "Ort",
+ "Records": "Datensätze",
+ "Targets": "Datenbanken",
+
+ "dummy": "dummy"
+ },
+
+ "da": {
+ "Authors": "Forfattere",
+ "Subjects": "Emner",
+ "Sources": "Kilder",
+ "source": "kilder",
+ "Facets": "Termlists",
+ "Next": "Næste",
+ "Prev": "Forrige",
+ "Search": "Søg",
+ "Sort by": "Sorter efter",
+ "and show": "og vis",
+ "per page": "per side",
+ "Displaying": "Viser",
+ "to": "til",
+ "of": "ud af",
+ "found": "fandt",
+ "Title": "Title",
+ "Author": "Forfatter",
+ "author": "forfatter",
+ "Date": "Dato",
+ "Subject": "Emneord",
+ "subject": "emneord",
+ "Location": "Lokation",
+ "Records": "Poster",
+ "Targets": "Baser",
+
+ "dummy": "dummy"
+ }
+ }
+};
+
+// We may be using a separate copy
+if (typeof(mkws_jQuery) !== "undefined") {
+ mkws.$ = mkws_jQuery;
+} else {
+ mkws.$ = jQuery;
+}
+
+mkws.log = function(string) {
+ if (!mkws.log_level)
+ return;
+
+ if (typeof console === "undefined" || typeof console.log === "undefined") { /* ARGH!!! old IE */
+ return;
+ }
+
+ // you need to disable use strict at the top of the file!!!
+ if (mkws.log_level >= 3) {
+ // Works in Chrome; not sure about elsewhere
+ console.trace();
+ } else if (mkws.log_level >= 2) {
+ console.log(">>> called from function " + arguments.callee.caller.name + ' <<<');
+ }
+ console.log(string);
+};
+
+
+// Translation function.
+mkws.M = function(word) {
+ var lang = mkws.config.lang;
+
+ if (!lang || !mkws.locale_lang[lang])
+ return word;
+
+ return mkws.locale_lang[lang][word] || word;
+};
+
+
+// This function is taken from a StackOverflow answer
+// http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript/901144#901144
+mkws.getParameterByName = function(name, url) {
+ if (!url) url = location.search;
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+ results = regex.exec(url);
+ return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+}
+
+
+mkws.registerWidgetType = function(name, fn) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerWidgetType old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ mkws.widgetType2function[name] = fn;
+ mkws.log("registered widget-type '" + name + "'");
+};
+
+mkws.promotionFunction = function(name) {
+ return mkws.widgetType2function[name];
+};
+
+
+mkws.setMkwsConfig = function(overrides) {
+ // Set global log_level flag early so that mkws.log() works
+ var tmp = overrides.log_level;
+ if (typeof(tmp) !== 'undefined') mkws.log_level = tmp;
+
+ var config_default = {
+ use_service_proxy: true,
+ pazpar2_url: undefined,
+ pp2_hostname: "sp-mkws.indexdata.com",
+ pp2_path: "service-proxy/",
+ service_proxy_auth: undefined,
+ sp_auth_path: undefined,
+ sp_auth_query: "command=auth&action=perconfig",
+ sp_auth_credentials: undefined,
+ lang: "",
+ sort_options: [["relevance"], ["title:1", "title"], ["date:0", "newest"], ["date:1", "oldest"]],
+ perpage_options: [10, 20, 30, 50],
+ sort_default: "relevance",
+ perpage_default: 20,
+ show_lang: true, /* show/hide language menu */
+ show_sort: true, /* show/hide sort menu */
+ show_perpage: true, /* show/hide perpage menu */
+ show_switch: true, /* show/hide switch menu */
+ lang_options: [], /* display languages links for given languages, [] for all */
+ facets: ["xtargets", "subject", "author"], /* display facets, in this order, [] for none */
+ responsive_design_width: undefined, /* a page with less pixel width considered as narrow */
+ log_level: 1, /* log level for development: 0..2 */
+ template_vars: {}, /* values that may be exposed to templates */
+
+ dummy: "dummy"
+ };
+
+ mkws.config = mkws.objectInheritingFrom(config_default);
+ for (var k in overrides) {
+ mkws.config[k] = overrides[k];
+ }
+};
+
+
+// This code is from Douglas Crockford's article "Prototypal Inheritance in JavaScript"
+// http://javascript.crockford.com/prototypal.html
+// mkws.objectInheritingFrom behaves the same as Object.create,
+// but since the latter is not available in IE8 we can't use it.
+//
+mkws.objectInheritingFrom = function(o) {
+ function F() {}
+ F.prototype = o;
+ return new F();
+}
+
+
+// The following functions are dispatchers for team methods that
+// are called from the UI using a team-name rather than implicit
+// context.
+mkws.switchView = function(tname, view) {
+ mkws.teams[tname].switchView(view);
+};
+
+mkws.showDetails = function(tname, prefixRecId) {
+ mkws.teams[tname].showDetails(prefixRecId);
+};
+
+mkws.limitTarget = function(tname, id, name) {
+ mkws.teams[tname].limitTarget(id, name);
+};
+
+mkws.limitQuery = function(tname, field, value) {
+ mkws.teams[tname].limitQuery(field, value);
+};
+
+mkws.limitCategory = function(tname, id) {
+ mkws.teams[tname].limitCategory(id);
+};
+
+mkws.delimitTarget = function(tname, id) {
+ mkws.teams[tname].delimitTarget(id);
+};
+
+mkws.delimitQuery = function(tname, field, value) {
+ mkws.teams[tname].delimitQuery(field, value);
+};
+
+mkws.showPage = function(tname, pageNum) {
+ mkws.teams[tname].showPage(pageNum);
+};
+
+mkws.pagerPrev = function(tname) {
+ mkws.teams[tname].pagerPrev();
+};
+
+mkws.pagerNext = function(tname) {
+ mkws.teams[tname].pagerNext();
+};
+
+
+mkws.pazpar2_url = function() {
+ if (mkws.config.pazpar2_url) {
+ mkws.log("using pre-baked pazpar2_url '" + mkws.config.pazpar2_url + "'");
+ return mkws.config.pazpar2_url;
+ } else {
+ var s = document.location.protocol + "//" + mkws.config.pp2_hostname + "/" + mkws.config.pp2_path;
+ mkws.log("generated pazpar2_url '" + s + "'");
+ return s;
+ }
+};
+
+
+// We put a session token in window.name, as it's the only place to
+// keep data that is preserved across reloads and within-site
+// navigation. pz2.js picks this up and uses it as part of the
+// cookie-name, to ensure we get a new session when we need one.
+//
+// We want to use different sessions for different windows/tabs (so
+// they don't receive each other's messages), different hosts and
+// different paths on a host (since in general these will
+// authenticate as different libraries). So the window name needs to
+// include the hostname and the path from the URL, plus the token.
+//
+var token;
+if (window.name) {
+ token = window.name.replace(/.*\//, '');
+ mkws.log("Reusing existing window token '" + token + "'");
+} else {
+ // Incredible that the standard JavaScript runtime doesn't define a
+ // unique windowId. Instead, we have to make one up. And since there's
+ // no global area shared between windows, the best we can do for
+ // ensuring uniqueness is generating a random ID and crossing our
+ // fingers.
+ //
+ // Ten chars from 26 alpha-numerics = 36^10 = 3.65e15 combinations.
+ // At one per second, it will take 116 million years to duplicate a token
+ token = Math.random().toString(36).slice(2, 12);
+ mkws.log("Generated new window token '" + token + "'");
+}
+
+window.name = window.location.hostname + window.location.pathname + '/' + token;
+mkws.log("Using window.name '" + window.name + "'");
+
+
+// wrapper to provide local copy of the jQuery object.
+(function($) {
+ var log = mkws.log;
+ var _old2new = { // Maps old-style widget names to new-style
+ 'Authname': 'auth-name',
+ 'ConsoleBuilder': 'console-builder',
+ 'Coverart': 'cover-art',
+ 'GoogleImage': 'google-image',
+ 'MOTD': 'motd',
+ 'MOTDContainer': 'motd-container',
+ 'Perpage': 'per-page',
+ 'SearchForm': 'search-form',
+ 'ReferenceUniverse': 'reference-universe',
+ 'Termlists': 'facets'
+ };
+ // Annoyingly, there is no built-in way to invert a hash
+ var _new2old = {};
+ for (var key in _old2new) {
+ if(_old2new.hasOwnProperty(key)) {
+ _new2old[_old2new[key]] = key;
+ }
+ }
+
+ mkws._old2new = _old2new;
+
+ function handleNodeWithTeam(node, callback) {
+ // First branch for DOM objects; second branch for jQuery objects
+ var classes = node.className || node.attr('class');
+ if (!classes) {
+ // For some reason, if we try to proceed when classes is
+ // undefined, we don't get an error message, but this
+ // function and its callers, up several stack level,
+ // silently return. What a crock.
+ log("handleNodeWithTeam() called on node with no classes");
+ return;
+ }
+ var list = classes.split(/\s+/)
+ var teamName, type;
+
+ for (var i = 0; i < list.length; i++) {
+ var cname = list[i];
+ if (cname.match(/^mkws-team-/)) {
+ // New-style teamnames of the form mkws-team-xyz
+ teamName = cname.replace(/^mkws-team-/, '');
+ } else if (cname.match(/^mkwsTeam_/)) {
+ // Old-style teamnames of the form mkwsTeam_xyz
+ teamName = cname.replace(/^mkwsTeam_/, '');
+ } else if (cname.match(/^mkws-/)) {
+ // New-style names of the from mkws-foo-bar
+ type = cname.replace(/^mkws-/, '');
+ } else if (cname.match(/^mkws/)) {
+ // Old-style names of the form mkwsFooBar
+ var tmp = cname.replace(/^mkws/, '');
+ type = _old2new[tmp] || tmp.toLowerCase();
+ }
+ }
+
+ // Widgets without a team are on team "AUTO"
+ if (!teamName) {
+ teamName = "AUTO";
+ // Autosearch widgets don't join team AUTO if there is already an
+ // autosearch on the team or the team has otherwise gotten a query
+ if (node.getAttribute("autosearch")) {
+ if (mkws.autoHasAuto ||
+ mkws.teams["AUTO"] && mkws.teams["AUTO"].config["query"]) {
+ log("AUTO team already has a query, using unique team");
+ teamName = "UNIQUE";
+ }
+ mkws.autoHasAuto = true;
+ }
+ }
+
+ // Widgets on team "UNIQUE" get a random team
+ if (teamName === "UNIQUE") {
+ teamName = Math.floor(Math.random() * 100000000).toString();
+ }
+
+ callback.call(node, teamName, type);
+ }
+
+
+ function resizePage() {
+ var threshhold = mkws.config.responsive_design_width;
+ var width = $(window).width();
+ var from, to, method;
+
+ if ((mkws.width === undefined || mkws.width > threshhold) &&
+ width <= threshhold) {
+ from = "wide"; to = "narrow"; method = "hide";
+ } else if ((mkws.width === undefined || mkws.width <= threshhold) &&
+ width > threshhold) {
+ from = "narrow"; to = "wide"; method = "show";
+ }
+ mkws.width = width;
+
+ if (from) {
+ log("changing from " + from + " to " + to + ": " + width);
+ for (var tname in mkws.teams) {
+ var team = mkws.teams[tname];
+ team.visitWidgets(function(t, w) {
+ var w1 = team.widget(t + "-container-" + from);
+ var w2 = team.widget(t + "-container-" + to);
+ if (w1) {
+ w1.node.hide();
+ }
+ if (w2) {
+ w2.node.show();
+ w.node.appendTo(w2.node);
+ }
+ });
+ team.queue("resize-" + to).publish();
+ }
+ }
+ };
+
+
+ /*
+ * Run service-proxy authentication in background (after page load).
+ * The username/password is configured in the apache config file
+ * for the site.
+ */
+ function authenticateSession(auth_url, auth_domain, pp2_url) {
+ mkws.authenticating = true;
+ log("service proxy authentication on URL: " + auth_url);
+
+ if (!auth_domain) {
+ auth_domain = pp2_url.replace(/^(https?:)?\/\/(.*?)\/.*/, '$2');
+ log("guessed auth_domain '" + auth_domain + "' from pp2_url '" + pp2_url + "'");
+ }
+
+ var request = new pzHttpRequest(auth_url, function(err) {
+ alert("HTTP call for authentication failed: " + err)
+ return;
+ }, auth_domain);
+
+ request.get(null, function(data) {
+ mkws.authenticating = false;
+ if (!$.isXMLDoc(data)) {
+ alert("Service Proxy authentication response is not a valid XML document");
+ return;
+ }
+ var status = $(data).find("status");
+ if (status.text() != "OK") {
+ var message = $(data).find("message");
+ alert("Service Proxy authentication response: " + status.text() + " (" + message.text() + ")");
+ return;
+ }
+
+ log("service proxy authentication successful");
+ mkws.authenticated = true;
+ var authName = $(data).find("displayName").text();
+ // You'd think there would be a better way to do this:
+ var realm = $(data).find("realm:not(realmAttributes realm)").text();
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("authenticated").publish(authName, realm);
+ }
+
+ runAutoSearches();
+ });
+ }
+
+
+ function runAutoSearches() {
+ log("running auto searches");
+
+ for (var teamName in mkws.teams) {
+ mkws.teams[teamName].queue("ready").publish();
+ }
+ }
+
+
+ function selectorForAllWidgets() {
+ if (mkws.config && mkws.config.scan_all_nodes) {
+ // This is the old version, which works by telling jQuery to
+ // find every node that has a class beginning with "mkws". In
+ // theory it should be slower than the class-based selector; but
+ // instrumentation suprisingly shows this is consistently
+ // faster. It also has the advantage that any widgets of
+ // non-registered types are logged as warnings rather than
+ // silently ignored.
+ return '[class^="mkws"],[class*=" mkws"]';
+ } else {
+ // This is the new version, which works by looking up the
+ // specific classes of all registered widget types and their
+ // resize containers. Because all it requires jQuery to do is
+ // some hash lookups in pre-built tables, it should be very
+ // fast; but it silently ignores widgets of unregistered types.
+ var s = "";
+ for (var type in mkws.widgetType2function) {
+ if (s) s += ',';
+ s += '.mkws-' + type;
+ s += ',.mkws-' + type + "-container-wide";
+ s += ',.mkws-' + type + "-container-narrow";
+ // Annoyingly, we also need to recognise old-style names
+ var oldtype = _new2old[type] || type.charAt(0).toUpperCase() + type.slice(1);
+ s += ',.mkws' + oldtype;
+ s += ',.mkws' + oldtype + "-Container-wide";
+ s += ',.mkws' + oldtype + "-Container-narrow";
+ }
+ return s;
+ }
+ }
+
+
+ function makeWidgetsWithin(level, node) {
+ if (node) var widgetNodes = node.find(selectorForAllWidgets());
+ else widgetNodes = $(selectorForAllWidgets());
+ // Return false if we parse no widgets
+ if (widgetNodes.length < 1) return false;
+ widgetNodes.each(function() {
+ handleNodeWithTeam(this, function(tname, type) {
+ var myTeam = mkws.teams[tname];
+ if (!myTeam) {
+ myTeam = mkws.teams[tname] = mkws.makeTeam($, tname);
+ }
+
+ var oldHTML = this.innerHTML;
+ var myWidget = mkws.makeWidget($, myTeam, type, this);
+ myTeam.addWidget(myWidget);
+ var newHTML = this.innerHTML;
+ if (newHTML !== oldHTML) {
+ myTeam.log("widget " + type + " HTML changed: reparsing");
+ makeWidgetsWithin(level+1, $(this));
+ }
+ });
+ });
+ return true;
+ }
+
+
+ // The second "rootsel" parameter is passed to jQuery and is a DOM node
+ // or a selector string you would like to constrain the search for widgets to.
+ //
+ // This function has no side effects if run again on an operating session,
+ // even if the element/selector passed causes existing widgets to be reparsed:
+ //
+ // (TODO: that last bit isn't true and we currently have to avoid reinitialising
+ // widgets, MKWS-261)
+ //
+ // * configuration is not regenerated
+ // * authentication is not performed again
+ // * autosearches are not re-run
+ mkws.init = function(message, rootsel) {
+ var greet = "MKWS initialised";
+ if (rootsel) greet += " (limited to " + rootsel + ")"
+ if (message) greet += " :: " + message;
+ mkws.log(greet);
+
+ // MKWS is not active until init() has been run against an object with widget nodes.
+ // We only set initial configuration when MKWS is first activated.
+ if (!mkws.isActive) {
+ var widgetSelector = selectorForAllWidgets();
+ if ($(widgetSelector).length < 1) {
+ mkws.log("no widgets found");
+ return;
+ }
+
+ // Initial configuration
+ mkws.autoHasAuto = false;
+ var saved_config;
+ if (typeof mkws_config === 'undefined') {
+ log("setting empty config");
+ saved_config = {};
+ } else {
+ log("using config: " + $.toJSON(mkws_config));
+ saved_config = mkws_config;
+ }
+ mkws.setMkwsConfig(saved_config);
+
+ for (var key in mkws.config) {
+ if (mkws.config.hasOwnProperty(key)) {
+ if (key.match(/^language_/)) {
+ var lang = key.replace(/^language_/, "");
+ // Copy custom languages into list
+ mkws.locale_lang[lang] = mkws.config[key];
+ log("added locally configured language '" + lang + "'");
+ }
+ }
+ }
+
+ var lang = mkws.getParameterByName("lang") || mkws.config.lang;
+ if (!lang || !mkws.locale_lang[lang]) {
+ mkws.config.lang = ""
+ } else {
+ mkws.config.lang = lang;
+ }
+
+ log("using language: " + (mkws.config.lang ? mkws.config.lang : "none"));
+
+ // protocol independent link for pazpar2: "//mkws/sp" -> "https://mkws/sp"
+ if (mkws.pazpar2_url().match(/^\/\//)) {
+ mkws.config.pazpar2_url = document.location.protocol + mkws.config.pazpar2_url;
+ log("adjusted protocol independent link to " + mkws.pazpar2_url());
+ }
+
+ if (mkws.config.responsive_design_width) {
+ // Responsive web design - change layout on the fly based on
+ // current screen width. Required for mobile devices.
+ $(window).resize(resizePage);
+ // initial check after page load
+ $(document).ready(resizePage);
+ }
+ }
+
+ var then = $.now();
+ // If we've made no widgets, return without starting an SP session
+ // or marking MKWS active.
+ if (makeWidgetsWithin(1, rootsel ? $(rootsel) : undefined) === false) {
+ return false;
+ }
+ var now = $.now();
+
+ log("walking MKWS nodes took " + (now-then) + " ms");
+ for (var tName in mkws.teams) {
+ var myTeam = mkws.teams[tName]
+ myTeam.makePz2();
+ myTeam.log("made PZ2 object");
+ /*
+ myTeam.visitWidgets(function(t, w) {
+ log(" has widget of type '" + t + "': " + w);
+ });
+ */
+ }
+
+ function sp_auth_url(config) {
+ if (config.service_proxy_auth) {
+ mkws.log("using pre-baked sp_auth_url '" + config.service_proxy_auth + "'");
+ return config.service_proxy_auth;
+ } else {
+ var s = '//';
+ s += config.sp_auth_hostname ? config.sp_auth_hostname : config.pp2_hostname;
+ s += '/';
+ s += config.sp_auth_path ? config.sp_auth_path : config.pp2_path;
+ var q = config.sp_auth_query;
+ if (q) {
+ s += '?' + q;
+ }
+ var c = config.sp_auth_credentials;
+ if (c) {
+ s += ('&username=' + c.substr(0, c.indexOf('/')) +
+ '&password=' + c.substr(c.indexOf('/')+1));
+ }
+ mkws.log("generated sp_auth_url '" + s + "'");
+ return s;
+ }
+ }
+
+ if (mkws.config.use_service_proxy && !mkws.authenticated && !mkws.authenticating) {
+ authenticateSession(sp_auth_url(mkws.config),
+ mkws.config.service_proxy_auth_domain,
+ mkws.pazpar2_url());
+ } else if (!mkws.authenticating) {
+ // raw pp2 or we have a session already open
+ runAutoSearches();
+ }
+
+ mkws.isActive = true;
+ return true;
+ };
+
+ $(document).ready(function() {
+ if (!window.mkws_noready && !mkws.authenticating && !mkws.active) {
+ mkws.init();
+ }
+ });
+
+})(mkws.$);
+// Factory function for team objects. As much as possible, this uses
+// only member variables (prefixed "m_") and inner functions with
+// private scope.
+//
+// Some functions are visible as member-functions to be called from
+// outside code -- specifically, from generated HTML. These functions
+// are that.switchView(), showDetails(), limitTarget(), limitQuery(),
+// limitCategory(), delimitTarget(), delimitQuery(), showPage(),
+// pagerPrev(), pagerNext().
+//
+// Before the team can be used for searching and related operations,
+// its pz2 object must be created by calling team.makePz2().
+//
+mkws.makeTeam = function($, teamName) {
+ var that = {};
+ var m_teamName = teamName;
+ var m_submitted = false;
+ var m_query; // initially undefined
+ var m_sortOrder; // will be set below
+ var m_perpage; // will be set below
+ var m_filterSet = filterSet(that);
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_logTime = {
+ // Timestamps for logging
+ "start": $.now(),
+ "last": $.now()
+ };
+ var m_paz; // will be initialised below
+ var m_templateText = {}; // widgets can register templates to be compiled
+ var m_template = {}; // compiled templates, from any source
+ var m_widgets = {}; // Maps widget-type to array of widget objects
+ var m_gotRecords = false;
+
+ var config = mkws.objectInheritingFrom(mkws.config);
+ that.config = config;
+
+ that.toString = function() { return '[Team ' + teamName + ']'; };
+
+ // Accessor methods for individual widgets: readers
+ that.name = function() { return m_teamName; };
+ that.submitted = function() { return m_submitted; };
+ that.sortOrder = function() { return m_sortOrder; };
+ that.perpage = function() { return m_perpage; };
+ that.query = function() { return m_query; };
+ that.totalRecordCount = function() { return m_totalRecordCount; };
+ that.currentPage = function() { return m_currentPage; };
+ that.currentRecordId = function() { return m_currentRecordId; };
+ that.currentRecordData = function() { return m_currentRecordData; };
+ that.filters = function() { return m_filterSet; };
+ that.gotRecords = function() { return m_gotRecords; };
+
+ // Accessor methods for individual widgets: writers
+ that.set_sortOrder = function(val) { m_sortOrder = val };
+ that.set_perpage = function(val) { m_perpage = val };
+
+
+ // The following PubSub code is modified from the jQuery manual:
+ // http://api.jquery.com/jQuery.Callbacks/
+ //
+ // Use as:
+ // team.queue("eventName").subscribe(function(param1, param2 ...) { ... });
+ // team.queue("eventName").publish(arg1, arg2, ...);
+ //
+ var m_queues = {};
+ function queue(id) {
+ if (!m_queues[id]) {
+ var callbacks = $.Callbacks();
+ m_queues[id] = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ }
+ return m_queues[id];
+ };
+ that.queue = queue;
+
+
+ function log(s) {
+ var now = $.now();
+ var timestamp = (((now - m_logTime.start)/1000).toFixed(3) + " (+" +
+ ((now - m_logTime.last)/1000).toFixed(3) + ") ");
+ m_logTime.last = now;
+ mkws.log(m_teamName + ": " + timestamp + s);
+ that.queue("log").publish(m_teamName, timestamp, s);
+ }
+ that.log = log;
+
+
+ log("making new widget team");
+
+ m_sortOrder = config.sort_default;
+ m_perpage = config.perpage_default;
+
+ // pz2.js event handlers:
+ function onInit() {
+ log("init");
+ m_paz.stat();
+ m_paz.bytarget();
+ }
+
+ function onBytarget(data) {
+ log("bytarget");
+ queue("targets").publish(data);
+ }
+
+ function onStat(data) {
+ queue("stat").publish(data);
+ var hitcount = parseInt(data.hits[0], 10);
+ if (!m_gotRecords && hitcount > 0) {
+ m_gotRecords = true;
+ queue("firstrecords").publish(hitcount);
+ }
+ if (parseInt(data.activeclients[0], 10) === 0) {
+ log("complete");
+ queue("complete").publish(hitcount);
+ }
+ }
+
+ function onTerm(data) {
+ log("term");
+ queue("facets").publish(data);
+ }
+
+ function onShow(data, teamName) {
+ log("show");
+ m_totalRecordCount = data.merged;
+ log("found " + m_totalRecordCount + " records");
+ queue("pager").publish(data);
+ queue("records").publish(data);
+ }
+
+ function onRecord(data, args, teamName) {
+ log("record");
+ // FIXME: record is async!!
+ clearTimeout(m_paz.recordTimer);
+ queue("record").publish(data);
+ var detRecordDiv = findnode(recordDetailsId(data.recid[0]));
+ if (detRecordDiv.length) {
+ // in case on_show was faster to redraw element
+ return;
+ }
+ m_currentRecordData = data;
+ var recordDiv = findnode('.' + recordElementId(m_currentRecordData.recid[0]));
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
+ }
+
+
+ // create a parameters array and pass it to the pz2's constructor
+ // then register the form submit event with the pz2.search function
+ // autoInit is set to true on default
+ that.makePz2 = function() {
+ log("m_queues=" + $.toJSON(m_queues));
+ var params = {
+ "windowid": teamName,
+ "pazpar2path": mkws.pazpar2_url(),
+ "usesessions" : config.use_service_proxy ? false : true,
+ "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
+ "termlist": config.facets.join(',')
+ };
+
+ params.oninit = onInit;
+ if (m_queues.targets) {
+ params.onbytarget = onBytarget;
+ log("setting bytarget callback");
+ }
+ if (m_queues.stat) {
+ params.onstat = onStat;
+ log("setting stat callback");
+ }
+ if (m_queues.facets && config.facets.length) {
+ params.onterm = onTerm;
+ log("setting term callback");
+ }
+ if (m_queues.records) {
+ log("setting show callback");
+ params.onshow = onShow;
+ // Record callback is subscribed from records callback
+ log("setting record callback");
+ params.onrecord = onRecord;
+ }
+
+ m_paz = new pz2(params);
+ log("created main pz2 object");
+ }
+
+
+ // Used by the Records widget and onRecord()
+ function recordElementId(s) {
+ return 'mkws-rec_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+ that.recordElementId = recordElementId;
+
+ // Used by onRecord(), showDetails() and renderDetails()
+ function recordDetailsId(s) {
+ return 'mkws-det_' + s.replace(/[^a-z0-9]/ig, '_');
+ }
+
+
+ that.targetFiltered = function(id) {
+ return m_filterSet.targetFiltered(id);
+ };
+
+
+ that.limitTarget = function(id, name) {
+ log("limitTarget(id=" + id + ", name=" + name + ")");
+ m_filterSet.add(targetFilter(id, name));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitQuery = function(field, value) {
+ log("limitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.add(fieldFilter(field, value));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.limitCategory = function(id) {
+ log("limitCategory(id=" + id + ")");
+ // Only one category filter at a time
+ m_filterSet.removeMatching(function(f) { return f.type === 'category' });
+ if (id !== '') m_filterSet.add(categoryFilter(id));
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitTarget = function(id) {
+ log("delimitTarget(id=" + id + ")");
+ m_filterSet.removeMatching(function(f) { return f.type === 'target' });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.delimitQuery = function(field, value) {
+ log("delimitQuery(field=" + field + ", value=" + value + ")");
+ m_filterSet.removeMatching(function(f) { return f.type == 'field' &&
+ field == f.field && value == f.value });
+ if (m_query) triggerSearch();
+ return false;
+ };
+
+
+ that.showPage = function(pageNum) {
+ m_currentPage = pageNum;
+ m_paz.showPage(m_currentPage - 1);
+ };
+
+
+ that.pagerNext = function() {
+ if (m_totalRecordCount - m_perpage*m_currentPage > 0) {
+ m_paz.showNext();
+ m_currentPage++;
+ }
+ };
+
+
+ that.pagerPrev = function() {
+ if (m_paz.showPrev() != false)
+ m_currentPage--;
+ };
+
+
+ that.reShow = function() {
+ resetPage();
+ m_paz.show(0, m_perpage, m_sortOrder);
+ };
+
+
+ function resetPage() {
+ m_currentPage = 1;
+ m_totalRecordCount = 0;
+ m_gotRecords = false;
+ }
+ that.resetPage = resetPage;
+
+
+ function newSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ log("newSearch: " + query);
+
+ if (config.use_service_proxy && !mkws.authenticated) {
+ alert("searching before authentication");
+ return;
+ }
+
+ m_filterSet.removeMatching(function(f) { return f.type !== 'category' });
+ triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery);
+ switchView('records'); // In case it's configured to start off as hidden
+ m_submitted = true;
+ }
+ that.newSearch = newSearch;
+
+
+ function triggerSearch(query, sortOrder, maxrecs, perpage, limit, targets, torusquery) {
+ resetPage();
+ queue("navi").publish();
+
+ // Continue to use previous query/sort-order unless new ones are specified
+ if (query) m_query = query;
+ if (sortOrder) m_sortOrder = sortOrder;
+ if (perpage) m_perpage = perpage;
+ if (targets) m_filterSet.add(targetFilter(targets, targets));
+
+ var pp2filter = m_filterSet.pp2filter();
+ var pp2limit = m_filterSet.pp2limit(limit);
+ var pp2catLimit = m_filterSet.pp2catLimit();
+ if (pp2catLimit) {
+ pp2filter = pp2filter ? pp2filter + "," + pp2catLimit : pp2catLimit;
+ }
+
+ var params = {};
+ if (pp2limit) params.limit = pp2limit;
+ if (maxrecs) params.maxrecs = maxrecs;
+ if (torusquery) {
+ if (!mkws.config.use_service_proxy)
+ alert("can't narrow search by torusquery when not authenticated");
+ params.torusquery = torusquery;
+ }
+
+ log("triggerSearch(" + m_query + "): filters = " + m_filterSet.toJSON() + ", " +
+ "pp2filter = " + pp2filter + ", params = " + $.toJSON(params));
+
+ m_paz.search(m_query, m_perpage, m_sortOrder, pp2filter, undefined, params);
+ }
+
+ // fetch record details to be retrieved from the record queue
+ that.fetchDetails = function(recId) {
+ log("fetchDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // switching view between targets and records
+ function switchView(view) {
+ var targets = widgetNode('targets');
+ var results = widgetNode('results') || widgetNode('records');
+ var blanket = widgetNode('blanket');
+ var motd = widgetNode('motd');
+
+ switch(view) {
+ case 'targets':
+ if (targets) $(targets).show();
+ if (results) $(results).hide();
+ if (blanket) $(blanket).hide();
+ if (motd) $(motd).hide();
+ break;
+ case 'records':
+ if (targets) $(targets).hide();
+ if (results) $(results).show();
+ if (blanket) $(blanket).show();
+ if (motd) $(motd).hide();
+ break;
+ default:
+ alert("Unknown view '" + view + "'");
+ }
+ }
+ that.switchView = switchView;
+
+
+ // detailed record drawing
+ that.showDetails = function(recId) {
+ var oldRecordId = m_currentRecordId;
+ m_currentRecordId = recId;
+
+ // remove current detailed view if any
+ findnode('#' + recordDetailsId(oldRecordId)).remove();
+
+ // if the same clicked, just hide
+ if (recId == oldRecordId) {
+ m_currentRecordId = '';
+ m_currentRecordData = null;
+ return;
+ }
+ // request the record
+ log("showDetails() requesting record '" + recId + "'");
+ m_paz.record(recId);
+ };
+
+
+ // Finds the node of the specified class within the current team
+ function findnode(selector, teamName) {
+ teamName = teamName || m_teamName;
+
+ if (teamName === 'AUTO') {
+ selector = (selector + '.mkws-team-' + teamName + ',' +
+ selector + ':not([class^="mkws-team"],[class*=" mkws-team"])');
+ } else {
+ selector = selector + '.mkws-team-' + teamName;
+ }
+
+ var node = $(selector);
+ //log('findnode(' + selector + ') found ' + node.length + ' nodes');
+ return node;
+ }
+
+
+ function widgetNode(type) {
+ var w = that.widget(type);
+ return w ? w.node : undefined;
+ }
+
+ function renderDetails(data, marker) {
+ var template = loadTemplate("details");
+ var details = template(data);
+ return '<div class="mkws-details mkwsDetails mkwsTeam_' + m_teamName + '" ' +
+ 'id="' + recordDetailsId(data.recid[0]) + '">' + details + '</div>';
+ }
+ that.renderDetails = renderDetails;
+
+
+ that.registerTemplate = function(name, text) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning: registerTemplate old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+ m_templateText[name] = text;
+ };
+
+
+ function loadTemplate(name, fallbackString) {
+ if(mkws._old2new.hasOwnProperty(name)) {
+ mkws.log("Warning loadTemplate: old widget name: " + name + " => " + mkws._old2new[name]);
+ name = mkws._old2new[name];
+ }
+
+ var template = m_template[name];
+ if (template === undefined && Handlebars.compile) {
+ var source;
+ var node = $(".mkws-template-" + name + " .mkws-team-" + that.name());
+ if (node && node.length < 1) {
+ node = $(".mkws-template-" + name);
+ }
+ if (node) source = node.html();
+ if (!source) source = m_templateText[name];
+ if (source) {
+ template = Handlebars.compile(source);
+ log("compiled template '" + name + "'");
+ }
+ }
+ //if (template === undefined) template = mkws_templatesbyteam[m_teamName][name];
+ if (template === undefined && Handlebars.templates) {
+ template = Handlebars.templates["mkws-template-" + name];
+ }
+ if (template === undefined && mkws.defaultTemplates) {
+ template = mkws.defaultTemplates[name];
+ }
+ if (template) {
+ m_template[name] = template;
+ return template;
+ }
+ else {
+ log("No MKWS template for " + name);
+ return null;
+ }
+ }
+ that.loadTemplate = loadTemplate;
+
+
+ that.addWidget = function(w) {
+ if (m_widgets[w.type] === undefined) {
+ m_widgets[w.type] = [ w ];
+ } else {
+ m_widgets[w.type].push(w);
+ }
+ }
+
+ that.widget = function(type) {
+ var list = m_widgets[type];
+
+ if (!list)
+ return undefined;
+ if (list.length > 1) {
+ alert("widget('" + type + "') finds " + list.length + " widgets: using first");
+ }
+ return list[0];
+ }
+
+ that.visitWidgets = function(callback) {
+ for (var type in m_widgets) {
+ var list = m_widgets[type];
+ for (var i = 0; i < list.length; i++) {
+ var res = callback(type, list[i]);
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ }
+ return undefined;
+ }
+
+
+ return that;
+};
+// Factory function for sets of filters.
+function filterSet(team) {
+ var m_team = team;
+ var m_list = [];
+
+ var that = {};
+
+ that.toJSON = function() {
+ return mkws.$.toJSON(m_list);
+ };
+
+ that.add = function(filter) {
+ m_list.push(filter);
+ };
+
+ that.visitTargets = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'target') {
+ callback(filter.id, filter.name);
+ }
+ }
+ };
+
+ that.visitFields = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'field') {
+ callback(filter.field, filter.value);
+ }
+ }
+ };
+
+ that.visitCategories = function(callback) {
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (filter.type === 'category') {
+ callback(filter.id);
+ }
+ }
+ };
+
+ that.removeMatching = function(matchFn) {
+ var newList = [];
+ for (var i in m_list) {
+ var filter = m_list[i];
+ if (matchFn(filter)) {
+ m_team.log("removeMatching: removing filter " + mkws.$.toJSON(filter));
+ } else {
+ m_team.log("removeMatching: keeping filter " + mkws.$.toJSON(filter));
+ newList.push(filter);
+ }
+ }
+ m_list = newList;
+ };
+
+ that.targetFiltered = function(id) {
+ for (var i = 0; i < m_list.length; i++) {
+ if (m_list[i].type === 'target' ||
+ m_list[i].id === 'pz:id=' + id) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ that.pp2filter = function() {
+ var res = "";
+
+ that.visitTargets(function(id, name) {
+ if (res) res += ",";
+ if (id.match(/^[a-z:]+[=~]/)) {
+ m_team.log("filter '" + id + "' already begins with SETTING OP");
+ } else {
+ id = 'pz:id=' + id;
+ }
+ res += id;
+ });
+
+ return res;
+ };
+
+ that.pp2limit = function(initial) {
+ var res = initial || "";
+
+ that.visitFields(function(field, value) {
+ if (res) res += ",";
+ res += field + "=" + value.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ that.pp2catLimit = function() {
+ var res = "";
+
+ that.visitCategories(function(id) {
+ if (res) res += ",";
+ res += "category~" + id.replace(/[\\|,]/g, '\\$&');
+ });
+ return res;
+ }
+
+ return that;
+}
+
+
+// Factory functions for filters. These can be of several types.
+function targetFilter(id, name) {
+ return {
+ type: 'target',
+ id: id,
+ name: name
+ };
+}
+
+function fieldFilter(field, value) {
+ return {
+ type: 'field',
+ field: field,
+ value: value
+ };
+}
+
+function categoryFilter(id) {
+ return {
+ type: 'category',
+ id: id
+ };
+}
+// Factory function for widget objects.
+mkws.makeWidget = function($, team, type, node) {
+ // Static register of attributes that do not contribute to config
+ var ignoreAttrs = {
+ id:1, 'class':1, style:1, name:1, action:1, type:1, size:1,
+ value:1, width:1, valign:1
+ };
+
+ var that = {
+ team: team,
+ type: type,
+ node: $(node),
+ config: mkws.objectInheritingFrom(team.config)
+ };
+
+ function log(s) {
+ team.log(s);
+ }
+ that.log = log;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + type + ']';
+ };
+
+ that.value = function() {
+ return node.value;
+ };
+
+ // Returns the HTML of a subwidget of the specified type. It gets
+ // the same attributes at the parent widget that invokes this
+ // function, except where overrides are passed in. If defaults are
+ // also provided, then these are used when the parent widget
+ // provides no values.
+ that.subwidget = function(type, overrides, defaults) {
+ var attrs = { _team: team.name() };
+
+ // Copy locally-set properties from the parent widget
+ for (var name in this.config) {
+ if (this.config.hasOwnProperty(name)) {
+ attrs[name] = this.config[name];
+ log(this + " copied property " + name + "='" + attrs[name] + "' to " + type + " subwidget");
+ }
+ }
+
+ for (var name in overrides) {
+ log(this + " overrode property " + name + "='" + overrides[name] + "' (was '" + attrs[name] + "') for " + type + " subwidget");
+ attrs[name] = overrides[name];
+ }
+
+ if (defaults) {
+ for (var name in defaults) {
+ if (!attrs[name]) {
+ attrs[name] = defaults[name];
+ log(this + " fell back to default property " + name + "='" + attrs[name] + "' for " + type + " subwidget");
+ }
+ }
+ }
+
+ var s = [];
+ s.push('<div class="mkws', type, ' mkws-team-', attrs._team, '"');
+ for (var name in attrs) {
+ if (name !== '_team')
+ s.push(' ', name, '="', attrs[name], '"');
+ }
+ s.push('></div>');
+ return s.join('');
+ };
+
+ function expandValue(val) {
+ if (val.match(/^!param!/)) {
+ var param = val.replace(/^!param!/, '');
+ val = mkws.getParameterByName(param);
+ log("obtained val '" + val + "' from param '" + param + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + param + "' parameter");
+ }
+ } else if (val.match(/^!path!/)) {
+ var index = val.replace(/^!path!/, '');
+ var path = window.location.pathname.split('/');
+ val = path[path.length - index];
+ log("obtained val '" + val + "' from path-component '" + index + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the path-component " + index);
+ }
+ } else if (val.match(/^!var!/)) {
+ var name = val.replace(/^!var!/, '');
+ val = window[name]; // It's ridiculous that this works
+ log("obtained val '" + val + "' from variable '" + name + "'");
+ if (!val) {
+ alert("This page has a MasterKey widget that needs a val specified by the '" + name + "' variable");
+ }
+ }
+ return val;
+ };
+
+ // Utility function for use by all widgets that can invoke autosearch.
+ that.autosearch = function() {
+ var that = this;
+ var query = this.config.autosearch;
+ if (query) {
+ var old = this.team.config.query;
+ if (!old) {
+ // Stash this for subsequent inspection
+ this.team.config.query = query;
+ } else if (old === query) {
+ this.log("duplicate autosearch: '" + query + "': ignoring");
+ return;
+ } else {
+ this.log("conflicting autosearch: '" + query + "' vs '" + old + "': ignoring");
+ return;
+ }
+
+ this.team.queue("ready").subscribe(function() {
+ // Postpone testing for the configuration items: these are not
+ // yet set for Record subclass widgets that fill them in in the
+ // subclass, as widget.autosearch is called in the superclass,
+ // before the subclass fiddles with the configuration.
+ var sortOrder = that.config.sort;
+ var maxrecs = that.config.maxrecs;
+ var perpage = that.config.perpage;
+ var limit = that.config.limit;
+ var targets = that.config.targets;
+ var targetfilter = that.config.targetfilter;
+ var target = that.config.target;
+ if (target) targetfilter = 'udb=="' + target + '"';
+
+ var s = "running auto search: '" + query + "'";
+ if (sortOrder) s += " sorted by '" + sortOrder + "'";
+ if (maxrecs) s += " restricted to " + maxrecs + " records";
+ if (perpage) s += " with " + perpage + " per page";
+ if (limit) s += " limited by '" + limit + "'";
+ if (targets) s += " in targets '" + targets + "'";
+ if (targetfilter) s += " constrained by targetfilter '" + targetfilter + "'";
+ that.log(s);
+
+ that.team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter);
+ });
+ }
+ };
+
+ // Utility function for all widgets that want to hide in narrow windows
+ that.hideWhenNarrow = function() {
+ var that = this;
+ this.team.queue("resize-narrow").subscribe(function(n) {
+ that.node.hide();
+ });
+ this.team.queue("resize-wide").subscribe(function(n) {
+ that.node.show();
+ });
+ };
+
+
+ for (var i = 0; i < node.attributes.length; i++) {
+ var a = node.attributes[i];
+ var val = expandValue(a.value);
+ if (a.name === 'data-mkws-config') {
+ // Treat as a JSON fragment configuring just this widget
+ log(node + ": parsing config fragment '" + val + "'");
+ var data;
+ try {
+ data = $.parseJSON(val);
+ for (var key in data) {
+ log(node + ": adding config element " + key + "='" + data[key] + "'");
+ that.config[key] = data[key];
+ }
+ } catch (err) {
+ alert("Can't parse " + node + " data-mkws-config as JSON: " + val);
+ }
+ } else if (a.name.match (/^data-mkws-/)) {
+ var name = a.name.replace(/^data-mkws-/, '')
+ that.config[name] = val;
+ log(that + ": set data-mkws attribute " + name + "='" + val + "'");
+ } else if (!ignoreAttrs[a.name]) {
+ that.config[a.name] = val;
+ log(that + ": set regular attribute " + a.name + "='" + val + "'");
+ }
+ }
+
+ var fn = mkws.promotionFunction(type);
+ if (fn) {
+ fn.call(that);
+ log("made " + type + " widget(node=" + node + ")");
+ } else if (type.match(/-Container-(narrow|wide)$/)) {
+ // Not really a widget: no need to log its lack of promotion
+ } else {
+ log("made UNPROMOTED widget(type=" + type + ", node=" + node + ")");
+ }
+
+ return that;
+};
+(function($) { // jQuery wrapper
+
+// Functions follow for promoting the regular widget object into
+// widgets of specific types. These could be moved into their own
+// source files.
+
+
+mkws.registerWidgetType('targets', function() {
+ if (!this.config.show_switch) return;
+ var that = this;
+
+ this.node.html('No information available yet.');
+ this.node.css("display", "none");
+
+ this.team.queue("targets").subscribe(function(data) {
+ // There is a bug in pz2.js wherein it makes each data object an array but
+ // simply assigns properties to it.
+ // TODO: remove this when PAZ-946 is addressed.
+ var cleandata = [];
+ for (var i = 0; i < data.length; i++) {
+ var cur = {};
+ cur.id = data[i].id;
+ cur.hits = data[i].hits;
+ cur.diagnostic = data[i].diagnostic;
+ cur.message = data[i].message;
+ cur.records = data[i].records;
+ cur.state = data[i].state;
+ cleandata.push(cur);
+ }
+
+ var template = that.team.loadTemplate(that.config.template || "targets");
+ that.node.html(template({data: cleandata}));
+ });
+});
+
+
+mkws.registerWidgetType('stat', function() {
+ var that = this;
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "stat");
+ that.node.html(template(data));
+ });
+});
+
+
+mkws.registerWidgetType('pager', function() {
+ var that = this;
+ var M = mkws.M;
+
+ this.team.queue("pager").subscribe(function(data) {
+ var teamName = that.team.name();
+ var output = {};
+ output.first = data.start + 1;
+ output.last = data.start + data.num;
+ output.count = data.merged;
+ output.found = data.total;
+
+ //client indexes pages from 1 but pz2 from 0
+ var onsides = 5;
+ var pages = Math.ceil(that.team.totalRecordCount() / that.team.perpage());
+ var currentPage = that.team.currentPage();
+
+ var firstClkbl = (currentPage - onsides > 0)
+ ? currentPage - onsides
+ : 1;
+ var lastClkbl = firstClkbl + 2*onsides < pages
+ ? firstClkbl + 2*onsides
+ : pages;
+
+ if (firstClkbl > 1) output.morePrev = true;
+ if (lastClkbl < pages) output.moreNext = true;
+
+ if (currentPage > 1) output.prevClick = "mkws.pagerPrev(\'" + teamName + "\');";
+
+ output.pages = [];
+ for(var i = firstClkbl; i <= lastClkbl; i++) {
+ var o = {};
+ o.number = i;
+ if (i !== currentPage) {
+ o.click = "mkws.showPage(\'" + teamName + "\', " + i + ");";
+ }
+ output.pages.push(o);
+ }
+
+ if (pages - currentPage > 0) output.nextClick = "mkws.pagerNext(\'" + teamName + "\')";
+
+ var template = that.team.loadTemplate(that.config.template || "pager");
+ that.node.html(template(output));
+ });
+});
+
+mkws.registerWidgetType('details', function() {
+ var that = this;
+ var recid = that.node.attr("data-mkws-recid");
+ if (this.team.gotRecords()) {
+ that.team.fetchDetails(recid);
+ } else {
+ this.team.queue("firstrecords").subscribe(function() {
+ that.team.fetchDetails(recid);
+ });
+ }
+ this.team.queue("record").subscribe(function(data) {
+ if ($.inArray(recid, data.recid) > -1) {
+ var template = that.team.loadTemplate(that.config.template || "details");
+ that.node.html(template(data));
+ }
+ });
+});
+
+mkws.registerWidgetType('records', function() {
+ var that = this;
+ var team = this.team;
+
+ this.team.queue("records").subscribe(function(data) {
+ for (var i = 0; i < data.hits.length; i++) {
+ var hit = data.hits[i];
+ hit.detailLinkId = team.recordElementId(hit.recid[0]);
+ hit.detailClick = "mkws.showDetails('" + team.name() + "', '" + hit.recid[0] + "');return false;";
+ hit.containerClass = "mkws-summary mkwsSummary mkws-team-" + team.name();
+ hit.containerClass += " " + hit.detailLinkId;
+ // ### At some point, we may be able to move the
+ // m_currentRecordId and m_currentRecordData members
+ // from the team object into this widget.
+ if (hit.recid == team.currentRecordId()) {
+ if (team.currentRecordData()) {
+ hit.renderedDetails = team.renderDetails(team.currentRecordData());
+ }
+ }
+ }
+ var template = team.loadTemplate(that.config.template || "records");
+ var summaryPartial = team.loadTemplate(that.config['summary-template'] || "summary");
+ var tdata = $.extend({}, {"hits": data.hits}, that.config.template_vars);
+ that.node.html(template(tdata, {"partials":{"summary":summaryPartial}}));
+ });
+
+ that.autosearch();
+});
+
+
+mkws.registerWidgetType('navi', function() {
+ var that = this;
+ var teamName = this.team.name();
+
+ this.team.queue("navi").subscribe(function() {
+ var filters = that.team.filters();
+ var output = {filters:[]};
+
+ filters.visitTargets(function(id, name) {
+ var cur = {};
+ cur.facet = 'source';
+ cur.value = name;
+ cur.click = "mkws.delimitTarget('" + teamName + "', '" + id + "'); return false;";
+ output.filters.push(cur);
+ });
+
+ filters.visitFields(function(field, value) {
+ var cur = {};
+ cur.facet = field;
+ cur.value = value;
+ cur.click = "mkws.delimitQuery('" + teamName + "', '" + field + "', '" + value + "'" + ");return false;";
+ output.filters.push(cur);
+ });
+
+ var template = that.team.loadTemplate(that.config.template || "navi");
+ that.node.html(template(output));
+ });
+});
+
+
+// It seems this and the Perpage widget doen't need to subscribe to
+// anything, since they produce events rather than consuming them.
+//
+mkws.registerWidgetType('sort', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_sortOrder(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('per-page', function() {
+ var that = this;
+
+ this.node.change(function() {
+ that.team.set_perpage(that.node.val());
+ if (that.team.submitted()) {
+ that.team.reShow();
+ }
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('done', function() {
+ var that = this;
+ this.team.queue("complete").subscribe(function(n) {
+ var template = that.team.loadTemplate(that.config.template || "done");
+ that.node.html(template({count: n}));
+ });
+});
+
+
+mkws.registerWidgetType('switch', function() {
+ if (!this.config.show_switch) return;
+ var tname = this.team.name();
+ var output = {};
+ output.recordClick = "mkws.switchView(\'" + tname + "\', \'records\')";
+ output.targetClick = "mkws.switchView(\'" + tname + "\', \'targets\')";
+ var template = this.team.loadTemplate(this.config.template || "switch");
+ this.node.html(template(output));
+ this.hideWhenNarrow();
+});
+
+
+mkws.registerWidgetType('search', function() {
+ var output = {};
+ output.team = this.team.name();
+ var template = this.team.loadTemplate(this.config.template || "search");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('search-form', function() {
+ var team = this.team;
+ this.node.submit(function() {
+ var val = team.widget('query').value();
+ team.newSearch(val);
+ return false;
+ });
+});
+
+
+mkws.registerWidgetType('results', function() {
+ var template = this.team.loadTemplate(this.config.template || "results");
+ this.node.html(template({team: this.team.name()}));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('ranking', function() {
+ var output = {};
+ output.perPage = [];
+ output.sort = [];
+ output.team = this.team.name();
+ output.showSort = this.config.show_sort;
+ output.showPerPage = this.config.show_perpage;
+
+ var order = this.team.sortOrder();
+ this.log("making sort, sortOrder = '" + order + "'");
+ for (var i = 0; i < this.config.sort_options.length; i++) {
+ var cur = {};
+ var opt = this.config.sort_options[i];
+ cur.key = opt[0];
+ cur.label = opt.length == 1 ? opt[0] : opt[1];
+ if (order == cur.key || order == cur.label) cur.selected = true;
+ output.sort.push(cur);
+ }
+
+ var perpage = this.team.perpage();
+ this.log("making perpage, perpage = " + perpage);
+ for(var i = 0; i < this.config.perpage_options.length; i++) {
+ var cur = {};
+ cur.perPage = this.config.perpage_options[i];
+ if (cur.perPage == perpage) cur.selected = true;
+ output.perPage.push(cur);
+ }
+
+ var template = this.team.loadTemplate(this.config.template || "ranking");
+ this.node.html(template(output));
+});
+
+
+mkws.registerWidgetType('lang', function() {
+ // dynamic URL or static page? /path/foo?query=test
+ /* create locale language menu */
+ if (!this.config.show_lang) return;
+
+ var lang_default = "en";
+ var lang = this.config.lang || lang_default;
+ var list = [];
+
+ /* display a list of configured languages, or all */
+ var lang_options = this.config.lang_options;
+ var toBeIncluded = {};
+ for (var i = 0; i < lang_options.length; i++) {
+ toBeIncluded[lang_options[i]] = true;
+ }
+
+ for (var k in mkws.locale_lang) {
+ if (toBeIncluded[k] || lang_options.length == 0) {
+ cur = {};
+ if (lang === k) cur.selected = true;
+ cur.code = k;
+ cur.url = lang_url(k);
+ list.push(cur);
+ }
+ }
+
+ // add english link
+ if (lang_options.length == 0 || toBeIncluded[lang_default]) {
+ cur = {};
+ if (lang === lang_default) cur.selected = true;
+ cur.code = lang_default;
+ cur.url = lang_url(lang_default);
+ list.push(cur);
+ }
+
+ this.log("language menu: " + list.join(", "));
+
+ var template = this.team.loadTemplate(this.config.template || "lang");
+ this.node.html(template({languages: list}));
+ this.hideWhenNarrow();
+
+ // set or re-set "lang" URL parameter
+ function lang_url(lang) {
+ var query = location.search;
+ // no query parameters? done
+ if (!query) {
+ return "?lang=" + lang;
+ }
+
+ // parameter does not exist
+ if (!query.match(/[\?&]lang=/)) {
+ return query + "&lang=" + lang;
+ }
+
+ // replace existing parameter
+ query = query.replace(/\?lang=([^&#;]*)/, "?lang=" + lang);
+ query = query.replace(/\&lang=([^&#;]*)/, "&lang=" + lang);
+ return query;
+ }
+});
+
+
+mkws.registerWidgetType('motd', function() {
+ var container = this.team.widget('motd-container');
+ if (container) {
+ // Move the MOTD from the provided element down into the container
+ this.node.appendTo(container.node);
+ }
+});
+
+
+// This widget has no functionality of its own, but its configuration
+// is copied up into its team, allowing it to affect other widgets in
+// the team.
+//
+mkws.registerWidgetType('config', function() {
+ var c = this.config;
+ for (var name in c) {
+ if (c.hasOwnProperty(name)) {
+ this.team.config[name] = c[name];
+ this.log(this + " copied property " + name + "='" + c[name] + "' up to team");
+ }
+ }
+});
+
+
+mkws.registerWidgetType('progress', function() {
+ var that = this;
+ this.node.hide();
+ this.team.queue("stat").subscribe(function(data) {
+ var template = that.team.loadTemplate(that.config.template || "progress");
+ that.node.html(template({
+ done: data.clients - data.activeclients,
+ waiting: data.activeclients
+ }));
+ that.node.show();
+ });
+});
+
+
+// Some elements have mkws* classes that makes them appear as widgets
+// -- for example, because we want to style them using CSS -- but have
+// no actual functionality. We register these to prevent ignorable
+// warnings when they occur.
+
+mkws.registerWidgetType('query', function() {});
+mkws.registerWidgetType('motd-container', function() {});
+mkws.registerWidgetType('button', function() {});
+
+
+})(mkws.$); // jQuery wrapper
+mkws.registerWidgetType('facets', function() {
+ // Initially hide the facets; display when we get results
+ var that = this;
+ var team = this.team;
+ team.queue("facets").subscribe(function(data) {
+ that.node.addClass("active");
+ });
+
+ var template = team.loadTemplate(this.config.template || "facets");
+ this.node.html(template({
+ team: team.name(),
+ facets: this.config.facets
+ }));
+ this.autosearch();
+});
+
+
+mkws.registerWidgetType('facet', function() {
+ var facetConfig = {
+ xtargets: [ "Sources", 16, false ],
+ subject: [ "Subjects", 10, true ],
+ author: [ "Authors", 10, true ]
+ }
+ var that = this;
+ var team = this.team;
+ var name = that.config.facet;
+ var ref = facetConfig[name] || [ "Unknown", 10, true ];
+ var caption = this.config['facet_caption_' + name] || ref[0];
+ var max = parseInt(this.config['facet_max_' + name] || ref[1]);
+ var pzIndex = ref[2] ? name : null;
+
+ that.toString = function() {
+ return '[Widget ' + team.name() + ':' + that.type + '(' + name + ')]';
+ };
+
+ team.queue("facets").subscribe(function(data) {
+ data = data[name];
+ var terms = [];
+ var teamName = team.name();
+ for (var i = 0; i < data.length && i < max; i++) {
+ var linkdata = "";
+ var action = "";
+ if (!pzIndex) {
+ // Special case: target selection
+ linkdata += ('target_id='+data[i].id+' ');
+ if (!team.targetFiltered(data[i].id)) {
+ action = 'mkws.limitTarget(\'' + teamName + '\', this.getAttribute(\'target_id\'),this.firstChild.nodeValue)';
+ }
+ } else {
+ action = 'mkws.limitQuery(\'' + teamName + '\', \'' + pzIndex + '\', this.firstChild.nodeValue)';
+ }
+ linkdata += 'onclick="' + action + ';return false;"';
+ terms.push({
+ term: data[i].name,
+ field: data[i].id,
+ count: data[i].freq,
+ linkdata: linkdata
+ });
+ }
+ // configured template > facet specific template > default facet template
+ var template;
+ if (that.config.template) {
+ template = team.loadTemplate(that.config.template);
+ } else {
+ template = team.loadTemplate("facet-" + name);
+ if (template) {
+ that.log("Using facet-" + name + " template.")
+ } else {
+ that.log("No " + name + " specific template, using default.")
+ template = team.loadTemplate("facet");
+ }
+ }
+ that.node.html(template({
+ name: name,
+ caption: caption,
+ query: that.config.query,
+ terms: terms
+ }));
+ });
+ this.autosearch();
+});
+mkws.registerWidgetType('auth-name', function() {
+ var that = this;
+
+ this.team.queue("authenticated").subscribe(function(authName) {
+ that.node.html(authName);
+ });
+});
+mkws.registerWidgetType('categories', function() {
+ var that = this;
+
+ if (!mkws.authenticated) {
+ alert("can't use categories widget when not authenticated");
+ return;
+ }
+
+ this.team.queue("authenticated").subscribe(function(authName, realm) {
+ var req = new pzHttpRequest(mkws.pazpar2_url() + "?command=categories", function(err) {
+ alert("HTTP call for categories failed: " + err)
+ });
+
+ req.get(null, function(data) {
+ if (!$.isXMLDoc(data)) {
+ alert("categories response document is not XML");
+ return;
+ }
+ that.log("got categories: " + data);
+
+ var text = [];
+ text.push("Select category: ");
+ text.push("<select name='mkws-category mkwsCategory' " +
+ "onchange='mkws.limitCategory(\"" + that.team.name() + "\", this.value)'>");
+ text.push("<option value=''>[All]</option>");
+ $(data).find('category').each(function() {
+ var name = $(this).find('categoryName').text();
+ var id = $(this).find('categoryId').text();
+ text.push("<option value='", id, "'>", name, "</option>");
+ });
+ text.push("</select>");
+ that.node.html(text.join(''));
+ });
+ });
+});
+mkws.registerWidgetType('log', function() {
+ var that = this;
+
+ this.team.queue("log").subscribe(function(teamName, timestamp, message) {
+ that.node.append(teamName + ": " + timestamp + message + "<br/>");
+ });
+});
+// A widget for a record-list of a single record
+mkws.registerWidgetType('record', function() {
+ if (!this.config.maxrecs) this.config.maxrecs = 1;
+ var that = this;
+ var team = this.team;
+ team.queue("records").subscribe(function(data) {
+ var template = team.loadTemplate(that.config.template || "details");
+ var targs = mkws.$.extend({}, data.hits[0], that.config.template_vars);
+ that.node.html(template(targs));
+ });
+ that.autosearch();
+});
+
+mkws.registerWidgetType('images', function() {
+ mkws.promotionFunction('records').call(this);
+ if (!this.config.template) this.config.template = 'images';
+});
+
+mkws.registerWidgetType('google-image', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'Google_Images';
+});
+
+mkws.registerWidgetType('lolcat', function() {
+ mkws.promotionFunction('google-image').call(this);
+ if (!this.config.autosearch) this.config.autosearch = 'kitteh';
+});
+
+mkws.registerWidgetType('cover-art', function() {
+ mkws.promotionFunction('images').call(this);
+ if (!this.config.target) this.config.target = 'AmazonBooks';
+});
+mkws.registerWidgetType('reference', function() {
+ mkws.promotionFunction('record').call(this);
+ if (!this.config.target) this.config.target = 'wikimedia_wikipedia_single_result';
+ if (!this.config.template) this.config.template = 'reference';
+ this.config.template_vars.paragraphs = this.config.paragraphs || 0;
+ this.config.template_vars.sentences = this.config.sentences || 0;
+});
+mkws.registerWidgetType('builder', function() {
+ var that = this;
+ var team = this.team;
+
+ var button = mkws.$('<button/>', {
+ type: 'button',
+ text: this.config.text || "Build!"
+ });
+ this.node.append(button);
+ button.click(function() {
+ var query = team.widget('query').value();
+ var sort = team.widget('sort').value();
+ var perpage = team.widget('per-page').value();
+
+ var html = ('<div class="mkws-records mkwsRecords" ' +
+ 'autosearch="' + query + '" ' +
+ 'sort="' + sort + '" ' +
+ 'perpage="' + perpage + '"></div>');
+ var fn = that.callback || alert;
+ fn(html);
+ });
+});
+
+mkws.registerWidgetType('console-builder', function() {
+ mkws.promotionFunction('builder').call(this);
+ this.callback = function(s) {
+ console.log("generated widget: " + s);
+ }
+});
+(function() {
+ var template = Handlebars.template, templates = mkws.defaultTemplates = mkws.defaultTemplates || {};
+templates['details'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " ("
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Date", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
+ return " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Author", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"9":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Links", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, lambda=this.lambda, escapeExpression=this.escapeExpression, functionType="function", helperMissing=helpers.helperMissing;
+ return " <a href=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\">Link"
+ + escapeExpression(((helper = (helper = helpers['mkws-index1'] || (depth0 != null ? depth0['mkws-index1'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"mkws-index1","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Subject", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-first","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(13, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n </tr>\n";
+},"13":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-subject'] : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(15, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"15":function(depth0,helpers,partials,data) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(lambda(depth0, depth0));
+},"17":function(depth0,helpers,partials,data) {
+ var helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helpers['mkws-attr'] || (depth0 && depth0['mkws-attr']) || helperMissing).call(depth0, "@name", {"name":"mkws-attr","hash":{},"data":data})));
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<table>\n <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Title", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </td>\n </tr>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-electronic-url'] : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-if-any'] || (depth0 && depth0['mkws-if-any']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-if-any","hash":{
+ 'having': ("md-subject")
+ },"fn":this.program(12, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " <tr>\n <th>"
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Locations", {"name":"mkws-translate","hash":{},"data":data})))
+ + "</th>\n <td>\n";
+ stack1 = ((helpers['mkws-commaList'] || (depth0 && depth0['mkws-commaList']) || helperMissing).call(depth0, (depth0 != null ? depth0.location : depth0), {"name":"mkws-commaList","hash":{},"fn":this.program(17, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n </td>\n </tr>\n</table>\n";
+},"useData":true});
+templates['done'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search complete: found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n\n";
+},"useData":true});
+templates['facet'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\"mkws-term mkwsTerm\">\n <a href=\"#\" ";
+ stack1 = ((helper = (helper = helpers.linkdata || (depth0 != null ? depth0.linkdata : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"linkdata","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + ">"
+ + escapeExpression(((helper = (helper = helpers.term || (depth0 != null ? depth0.term : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"term","hash":{},"data":data}) : helper)))
+ + "</a> <span>"
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + "</span>\n </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n<div class=\"mkws-facet-title mkwsFacetTitle\">"
+ + escapeExpression(((helper = (helper = helpers.caption || (depth0 != null ? depth0.caption : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"caption","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.terms : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['facets'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-facet mkwsFacet mkws-team-"
+ + escapeExpression(lambda((depths[1] != null ? depths[1].team : depths[1]), depth0))
+ + "\" data-mkws-facet=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\"></div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.facets : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['images'] = template({"1":function(depth0,helpers,partials,data,depths) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = ((helpers['mkws-first'] || (depth0 && depth0['mkws-first']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"mkws-first","hash":{},"fn":this.program(2, data, depths),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " <br/>\n </a>\n";
+},"2":function(depth0,helpers,partials,data,depths) {
+ var lambda=this.lambda, escapeExpression=this.escapeExpression;
+ return " <img src=\""
+ + escapeExpression(lambda(depth0, depth0))
+ + "\" alt=\""
+ + escapeExpression(lambda((depths[1] != null ? depths[1]['md-title'] : depths[1]), depth0))
+ + "\"/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,depths) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data, depths),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true,"useDepths":true});
+templates['lang'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<span>"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</span>";
+},"4":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<a href=\"";
+ stack1 = ((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\">"
+ + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+ + "</a>";
+},"6":function(depth0,helpers,partials,data) {
+ return " |\n";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.languages : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['navi'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.facet : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": <a class=\"mkws-removable mkwsRemovable\" href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">"
+ + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+ + "</a>\n ";
+ stack1 = helpers.unless.call(depth0, (data && data.last), {"name":"unless","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"2":function(depth0,helpers,partials,data) {
+ return "|";
+ },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.filters : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"useData":true});
+templates['pager'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <a href=\"#\" class=\"mkws-prev mkwsPrev\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.prevClick || (depth0 != null ? depth0.prevClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"prevClick","hash":{},"data":data}) : helper)))
+ + "\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a> |\n";
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " <span class=\"mkws-prev mkwsPrev\"><< ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Prev", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span> |\n";
+},"5":function(depth0,helpers,partials,data) {
+ return "...";
+ },"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.click : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.program(10, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <a href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.click || (depth0 != null ? depth0.click : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"click","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</a>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-current-page mkwsCurrentPage\">"
+ + escapeExpression(((helper = (helper = helpers.number || (depth0 != null ? depth0.number : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"number","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " | <a href=\"#\" class=\"mkws-next mkwsNext\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.nextClick || (depth0 != null ? depth0.nextClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nextClick","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></a>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = " | <span class=\"mkws-next mkwsNext\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Next", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " >></span>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function", buffer = "<div style=\"float: right\">\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Displaying", {"name":"mkws-translate","hash":{},"data":data})))
+ + ":\n "
+ + escapeExpression(((helper = (helper = helpers.first || (depth0 != null ? depth0.first : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"first","hash":{},"data":data}) : helper)))
+ + " "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "to", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.last || (depth0 != null ? depth0.last : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"last","hash":{},"data":data}) : helper)))
+ + "\n "
+ + escapeExpression(((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "of", {"name":"mkws-translate","hash":{},"data":data})))
+ + " "
+ + escapeExpression(((helper = (helper = helpers.count || (depth0 != null ? depth0.count : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"count","hash":{},"data":data}) : helper)))
+ + " (";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "found", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += ": "
+ + escapeExpression(((helper = (helper = helpers.found || (depth0 != null ? depth0.found : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"found","hash":{},"data":data}) : helper)))
+ + ")\n</div>\n\n<div style=\"float: clear\">\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.prevClick : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.morePrev : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.pages : depth0), {"name":"each","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n ";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.moreNext : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.nextClick : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.program(14, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</div>\n";
+},"useData":true});
+templates['progress'] = template({"1":function(depth0,helpers,partials,data) {
+ return "█";
+ },"3":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-waiting mkws-waiting mkwsWaiting\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</span>";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<span class=\"mkws-done mkws-done mkwsDone\">";
+ stack1 = ((helpers['mkws-repeat'] || (depth0 && depth0['mkws-repeat']) || helperMissing).call(depth0, (depth0 != null ? depth0.done : depth0), {"name":"mkws-repeat","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</span>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.waiting : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['ranking'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Sort by", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-sort mkwsSort mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.sort : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </select>";
+},"2":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(5, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"3":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " <option value=\"";
+ stack1 = ((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\" selected=\"selected\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.key || (depth0 != null ? depth0.key : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"key","hash":{},"data":data}) : helper)))
+ + "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, (depth0 != null ? depth0.label : depth0), {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</option>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "and show", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\n <select class=\"mkws-perpage mkwsPerpage mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.perPage : depth0), {"name":"each","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " </select>\n ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "per page", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.selected : depth0), {"name":"if","hash":{},"fn":this.program(9, data),"inverse":this.program(11, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"9":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\" selected=\"selected\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"11":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <option value=\""
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers.perPage || (depth0 != null ? depth0.perPage : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"perPage","hash":{},"data":data}) : helper)))
+ + "</option>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "<form>";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showSort : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.showPerPage : depth0), {"name":"if","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</form>\n\n";
+},"useData":true});
+templates['records'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <div class=\""
+ + escapeExpression(((helper = (helper = helpers.containerClass || (depth0 != null ? depth0.containerClass : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"containerClass","hash":{},"data":data}) : helper)))
+ + "\">\n";
+ stack1 = this.invokePartial(partials.summary, ' ', 'summary', depth0, undefined, helpers, partials, data);
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </div>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.hits : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"usePartial":true,"useData":true});
+templates['reference'] = template({"1":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<b>"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</b>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<i>"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</i>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<img src=\""
+ + escapeExpression(((helper = (helper = helpers['md-thumburl'] || (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-thumburl","hash":{},"data":data}) : helper)))
+ + "\" alt=\""
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\">\n<h1><a href=\""
+ + escapeExpression(((helper = (helper = helpers['md-electronic-url'] || (depth0 != null ? depth0['md-electronic-url'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-electronic-url","hash":{},"data":data}) : helper)))
+ + "\">"
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "</a></h1>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = ((helpers['mkws-paragraphs'] || (depth0 && depth0['mkws-paragraphs']) || helperMissing).call(depth0, (depth0 != null ? depth0['md-description'] : depth0), (depth0 != null ? depth0.paragraphs : depth0), (depth0 != null ? depth0.sentences : depth0), {"name":"mkws-paragraphs","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n<p class=\"mkws-credit mkwsCredit\">Wikipedia</p>\n";
+},"useData":true});
+templates['results'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return "<table width=\"100%\" border=\"0\" cellpadding=\"6\" cellspacing=\"0\">\n <tr>\n <td class=\"mkws-facets-container-wide mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" width=\"250\" valign=\"top\">\n <div class=\"mkws-facets mkwsTermlists mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n <td class=\"mkws-motd-container mkwsMOTDContainer mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" valign=\"top\">\n <div class=\"mkws-ranking mkwsRanking mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-pager mkwsPager mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-navi mkwsNavi mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n <div class=\"mkws-records mkwsRecords mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\">\n <div class=\"mkws-facets-container-narrow mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\"></div>\n </td>\n </tr>\n</table>\n\n";
+},"useData":true});
+templates['search'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<form name=\"mkws-search-form\" class=\"mkws-search-form mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" action=\"\">\n <input class=\"mkws-query mkws-query mkwsQuery mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"text\"/>\n <input class=\"mkws-button mkws-button mkwsButton mkws-team-"
+ + escapeExpression(((helper = (helper = helpers.team || (depth0 != null ? depth0.team : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"team","hash":{},"data":data}) : helper)))
+ + "\" type=\"submit\" value=\"";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Search", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\"/>\n</form>\n\n";
+},"useData":true});
+templates['stat'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression, buffer = " -- <span class=\"mkws-client-count mkwsClientCount\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Active clients", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += " : "
+ + escapeExpression(((helper = (helper = helpers.activeclients || (depth0 != null ? depth0.activeclients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"activeclients","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.clients || (depth0 != null ? depth0.clients : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"clients","hash":{},"data":data}) : helper)))
+ + "</span> -- ";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Retrieved records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " : "
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "/"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "\n";
+},"useData":true});
+templates['summary'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, lambda=this.lambda;
+ return " <a class=\"mkws-field-thumb\" href=\"#\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n <img src=\""
+ + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0['md-thumburl'] : depth0)) != null ? stack1['0'] : stack1), depth0))
+ + "\"/>\n </a>\n";
+},"3":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-title-remainder\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-remainder'] || (depth0 != null ? depth0['md-title-remainder'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-remainder","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"5":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-author'] || (depth0 != null ? depth0['md-author'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-author","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"7":function(depth0,helpers,partials,data) {
+ var stack1, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-responsibility'] : depth0), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"8":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-author\">"
+ + escapeExpression(((helper = (helper = helpers['md-title-responsibility'] || (depth0 != null ? depth0['md-title-responsibility'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title-responsibility","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"10":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <div class=\"mkws-field-description\">"
+ + escapeExpression(((helper = (helper = helpers['md-description'] || (depth0 != null ? depth0['md-description'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-description","hash":{},"data":data}) : helper)))
+ + "</div>\n";
+},"12":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " <span class=\"mkws-field-date\">"
+ + escapeExpression(((helper = (helper = helpers['md-date'] || (depth0 != null ? depth0['md-date'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-date","hash":{},"data":data}) : helper)))
+ + "</span>\n";
+},"14":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = " ";
+ stack1 = ((helper = (helper = helpers.renderedDetails || (depth0 != null ? depth0.renderedDetails : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"renderedDetails","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-thumburl'] : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "<div class=\"mkws-field-data\">\n <span class=\"mkws-field-title\">\n <a href=\"#\" id=\""
+ + escapeExpression(((helper = (helper = helpers.detailLinkId || (depth0 != null ? depth0.detailLinkId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailLinkId","hash":{},"data":data}) : helper)))
+ + "\" onclick=\""
+ + escapeExpression(((helper = (helper = helpers.detailClick || (depth0 != null ? depth0.detailClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"detailClick","hash":{},"data":data}) : helper)))
+ + "\">\n "
+ + escapeExpression(((helper = (helper = helpers['md-title'] || (depth0 != null ? depth0['md-title'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"md-title","hash":{},"data":data}) : helper)))
+ + "\n </a>\n </span>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-title-remainder'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-author'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-description'] : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['md-date'] : depth0), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</div>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.renderedDetails : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer;
+},"useData":true});
+templates['switch'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.recordClick || (depth0 != null ? depth0.recordClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"recordClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</a>\n<span>|</span>\n<a href=\"#\" onclick=\"";
+ stack1 = ((helper = (helper = helpers.targetClick || (depth0 != null ? depth0.targetClick : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"targetClick","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "\">";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Targets", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + "</a>\n";
+},"useData":true});
+templates['targets'] = template({"1":function(depth0,helpers,partials,data) {
+ var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = " <tr>\n <td>";
+ stack1 = ((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.hits || (depth0 != null ? depth0.hits : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"hits","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>\n";
+ stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.message : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.records || (depth0 != null ? depth0.records : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"records","hash":{},"data":data}) : helper)))
+ + "</td>\n <td>"
+ + escapeExpression(((helper = (helper = helpers.state || (depth0 != null ? depth0.state : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"state","hash":{},"data":data}) : helper)))
+ + "</td>\n </tr>\n";
+},"2":function(depth0,helpers,partials,data) {
+ var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+ return " "
+ + escapeExpression(((helper = (helper = helpers.diagnostic || (depth0 != null ? depth0.diagnostic : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"diagnostic","hash":{},"data":data}) : helper)))
+ + " ("
+ + escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper)))
+ + ")\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+ var stack1, helperMissing=helpers.helperMissing, buffer = "<table>\n <thead>\n <tr>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Target ID", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Hits", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Diags", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "Records", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n <td>";
+ stack1 = ((helpers['mkws-translate'] || (depth0 && depth0['mkws-translate']) || helperMissing).call(depth0, "State", {"name":"mkws-translate","hash":{},"data":data}));
+ if (stack1 != null) { buffer += stack1; }
+ buffer += "</td>\n </td>\n </tr>\n </thead>\n <tbody>\n";
+ stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.data : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+ if (stack1 != null) { buffer += stack1; }
+ return buffer + " </tbody>\n</table>\n";
+},"useData":true});
+})();/* generic function to open results in a popup window
+ *
+ */
+
+//"use strict";
+// $(document).ready(function () {
+mkws.registerWidgetType('popup', function() {
+ var $ = mkws.$;
+ var debug = this.log;
+ debug("init popup window");
+
+ var popup_window = $(this.node);
+ // var popup_window = $(".mkws-popup mkwsPopup"); // $(document).ready()
+ if (!popup_window) {
+ debug("no popup found, skip...");
+ return;
+ } else {
+ debug("number of popup windows found: " + popup_window.length);
+ }
+
+ if (!$.ui) {
+ alert("Error: jquery-ui.js is missing, did you include it after jQuery core in the HTML file?");
+ return;
+ }
+
+ // more than one widget on a page are possible
+ popup_window.each(function(i) {
+ var that = $(this);
+
+ // all atributes are strings, convert them to integers here
+ var width = parseInt(that.attr("popup_width") || "800");
+ var height = parseInt(that.attr("popup_height") || "600");
+ var autoOpen = parseInt(that.attr("popup_autoOpen") || "0");
+ var modal = parseInt(that.attr("popup_modal") || "0");
+
+ debug("Popup parameters: width: " + width + ", height: " + height + ", autoOpen: " + autoOpen);
+ that.dialog({
+ closeOnEscape: true,
+ autoOpen: autoOpen,
+ height: height,
+ width: width,
+ modal: modal ? true : false,
+ resizable: true,
+ buttons: {
+ Cancel: function() {
+ that.dialog("close");
+ }
+ },
+ close: function() {}
+ });
+
+ // open at search query submit: "input.mkws-button mkwsButton"
+ var id_botton = that.attr("popup_button");
+ if (id_botton) {
+ $(id_botton).button().click(function() {
+ that.dialog("open");
+ });
+ }
+ });
+});