X-Git-Url: http://cgit.babelmonkeys.de/?p=adhocweb.git;a=blobdiff_plain;f=js%2Fmain.js;h=85f2ccaeaa2ec8887710ca2fe8baed05aff0ada7;hp=a0800ad54ddecfbcd4d7f0ccff4c3c48a65fe641;hb=7ef6024aa84881aba55e61c38073fc9465aac876;hpb=eea26db826d1821aa4268fa8ccba484bff97a5bb diff --git a/js/main.js b/js/main.js index a0800ad..85f2cca 100644 --- a/js/main.js +++ b/js/main.js @@ -1,13 +1,15 @@ var BOSH_SERVICE = 'http://localhost:5280/http-bind/'; -var show_log = false; +var show_log = true; Strophe.addNamespace("ADHOC", "http://jabber.org/protocol/commands"); var localJID = null; var connection = null; -var sessionid = null; -var cmdNode = null; -var queryJID = null; +var adhoc_status = { + sessionid: null, + cmdNode: null, + queryJID: null +}; function log(msg) { var entry = $('
').append(document.createTextNode(msg)); @@ -40,10 +42,10 @@ function onConnect(status) { } } else if (status == Strophe.Status.CONNECTED) { log('Strophe is connected.'); - queryJID = connection.domain; - $('#queryJID').val(queryJID); + adhoc_status.queryJID = connection.domain; + $('#queryJID').val(adhoc_status.queryJID); $('#query').show(); - checkFeatures(); + checkFeatures("#output"); } } @@ -51,19 +53,23 @@ function addNote(elem, text, type) { if (!type) { type = "info"; } + text = text.replace(/\n/g, "" + text + "
"); } function addForm(elem, x) { - var form = $(""); - form.submit(function(event){event.preventDefault();}); + var form = $(""); + form.submit(function(event) { + executeCommand("execute", serializeToDataform('form'), function(e) { displayResult(elem, e) }); + event.preventDefault(); + }); var fieldset = $(""); form.append(fieldset); if ($(x).find("title").length > 0) $("").text($(x).find("title").text()).appendTo(fieldset); if ($(x).find("instructions").length > 0) $("").text($(x).find("instructions").text()).appendTo(fieldset); - $(x).find("field").each(function(){ + $(x).find("field").each(function() { var item = null; var type = $(this).attr("type"); if($(this).attr("label")) { @@ -87,22 +93,22 @@ function addForm(elem, x) { item = $("").attr("readonly",true); break; case "jid-multi": - item = $(""); + item = $(""); break; case "jid-single": item = $(""); break; case "list-multi": item = $(""); - $(this).find("option").each(function(){ - $("").val($(this).find("value").text()).text($(this).attr("label")).appendTo(item); - }); + $(this).find("option").each(function() { + $("").val($(this).find("value").text()).text($(this).attr("label")).appendTo(item); + }); break; case "list-single": item = $(""); - $(this).find("option").each(function(){ - $("").val($(this).find("value").text()).text($(this).attr("label")).appendTo(item); - }); + $(this).find("option").each(function() { + $("").val($(this).find("value").text()).text($(this).attr("label")).appendTo(item); + }); break; case "text-private": item = $(""); @@ -120,14 +126,17 @@ function addForm(elem, x) { }); item.val(value); } else if (type == "list-multi") { - value = new Array(); - $(this).find("value").each(function() { - value[value.length] = $(this).text(); + $(this).children("value").each(function() { + item.children('option[value="' + $(this).text() + '"]').each(function() { + $(this).attr("selected", "selected"); + }); }); } else { item.val($(this).find("value").text()); } } + if ($(x).attr("type") == "result") + item.attr("readonly", true); if ($(this).attr("var")) { item.attr("name", $(this).attr("var")); item.attr("id", $(this).attr("var")); @@ -139,14 +148,14 @@ function addForm(elem, x) { $(elem).append(form); } -function serializeToDataform(form, st) { - st.c("x", {"xmlns":"jabber:x:data", "type": "submit"}); +function serializeToDataform(form) { + st = $build("x", {"xmlns": "jabber:x:data", "type": "submit"}); $(form).find(".df-item").each(function(){ st.c("field", {"var": $(this).attr("name")}); if (this.nodeName.toLowerCase() == "select" && this.multiple) { for (var i = 0; i < this.options.length; i++) - if (options[i].selected) - st.c("value").t(options[i]).up(); + if (this.options[i].selected) + st.c("value").t(this.options[i].text).up(); } else if (this.nodeName.toLowerCase() == "textarea") { var sp_value = this.value.split(/\r?\n|\r/g); for(var i = 0; i < sp_value.length; i++) @@ -164,88 +173,109 @@ function serializeToDataform(form, st) { st.up(); }); st.up(); + return st.tree(); } -function displayResult(result) { +function displayResult(elem, result) { var status = $(result).find("command").attr("status"); + var kinds = {'prev': 'Prev', 'next': 'Next', 'complete': 'Complete'}; - $("#output").empty(); + $(elem).empty(); $(result).find("command > *").each(function(index, e) { if ($(e).is("note")) { - addNote("#output", $(e).text(), $(e).attr("type")); + addNote(elem, $(e).text(), $(e).attr("type")); } else if ($(e).is("x[xmlns=jabber:x:data]")) { - addForm("#output", e); + addForm(elem, e); } }); if (status == "executing") { - $("#output").append(""+ - ""+ - ""+ - ""+ - ""); - for (kind in ['prev', 'next', 'complete']) { + for (kind in kinds) { + input = $("").click(function() { + if (kind == 'prev') + executeCommand(kind, false, function(e) { displayResult(elem, e) }); + else + executeCommand(kind, serializeToDataform('form'), function(e) { displayResult(elem, e) }); + }); if ($(result).find('actions ' + kind).length > 0) - $('#' + kind + 'Button').attr("disabled", "false"); + input.removeAttr("disabled"); + $(elem).append(input); } - $('#executeButton').bind("click", function() { - var execIQ = $iq({ type: "set", to: queryJID, id: connection.getUniqueId() }) - .c("command", { xmlns: Strophe.NS.ADHOC, node: cmdNode, sessionid: sessionid, action: "execute" }); - serializeToDataform($('form'), execIQ); - connection.sendIQ(execIQ, displayResult); - }); - $('#cancelButton').bind("click", function() { - var cancelIQ = $iq({ type: "set", to: queryJID, id: connection.getUniqueId() }) - .c("command", { xmlns: Strophe.NS.ADHOC, node: cmdNode, sessionid: sessionid, action: "cancel" }); - cmdNode = null - sessionid = null; - connection.sendIQ(cancelIQ, displayResult); - }); + $("").click(function() { + executeCommand("execute", serializeToDataform('form'), function(e) { displayResult(elem, e) }); + }).appendTo(elem); + + $("").click(function() { + cancelCommand(function(e) { displayResult(elem, e) }); + }).appendTo(elem); } else { input = $("").bind("click", function() { - $('#output').empty(); - sessionid = null; - cmdNode = null; - getCommandNodes(); + $(elem).empty(); + adhoc_status.sessionid = null; + adhoc_status.cmdNode = null; + getCommandNodes(elem); }); - $("#output").append(input); + $(elem).append(input); } } -function runCommand(event) { - cmdNode = $(this).attr("id"); // Save node of executed command (in global var) - var execIQ = $iq({ type: "set", to: queryJID, id: connection.getUniqueId() }) - .c("command", { xmlns: Strophe.NS.ADHOC, node: cmdNode, action: "execute" }); - connection.sendIQ(execIQ, function(result) { - sessionid = $(result).find("command").attr("sessionid"); - displayResult(result); +function runCommand(item, callback) { + adhoc_status.cmdNode = $(item).attr("id"); // Save node of executed command (in global var) + executeCommand("execute", false, function(result) { + adhoc_status.sessionid = $(result).find("command").attr("sessionid"); + callback(result); }); - event.preventDefault(); } -function getCommandNodes() { - var nodesIQ = $iq({ type: "get", to: queryJID, id: "nodes1" }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS, node: Strophe.NS.ADHOC}); +function executeCommand(type, childs, callback) { + if (adhoc_status.sessionid) + var execIQ = $iq({ type: "set", to: adhoc_status.queryJID, id: connection.getUniqueId() }) + .c("command", { xmlns: Strophe.NS.ADHOC, node: adhoc_status.cmdNode, sessionid: adhoc_status.sessionid, action: type }); + else + var execIQ = $iq({ type: "set", to: adhoc_status.queryJID, id: connection.getUniqueId() }) + .c("command", { xmlns: Strophe.NS.ADHOC, node: adhoc_status.cmdNode, action: type }); + if (childs) + execIQ.cnode(childs); + connection.sendIQ(execIQ, callback); +} + +function cancelCommand(callback) { + executeCommand("cancel", false, callback); + adhoc_status.cmdNode = null + adhoc_status.sessionid = null; +} + +function getCommandNodes(elem) { + var nodesIQ = $iq({ type: "get", to: adhoc_status.queryJID, id: connection.getUniqueId() }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS, node: Strophe.NS.ADHOC}); connection.sendIQ(nodesIQ, function(result) { - $('#output').append("This entitiy does support AdHoc commands
"); - } else { - $('#output').append("This entitiy does NOT support AdHoc commands
"); +function checkFeatures(elem) { + if (adhoc_status.sessionid) + cancelCommand(); + featureIQ = $iq({ type: "get", to: adhoc_status.queryJID, id: connection.getUniqueId() }).c("query", {xmlns: Strophe.NS.DISCO_INFO}); + $(elem).empty(); + connection.sendIQ(featureIQ, + function(result) { /* Callback */ + if ($(result).find("feature[var='" + Strophe.NS.ADHOC + "']").length > 0) { + getCommandNodes(elem); + } else { + $(elem).append("" + adhoc_status.queryJID + " does NOT support AdHoc commands
"); + } + }, + function(result) { /* Errback */ + $(elem).append("Couldn't get list of supported features
"); } - }); - $('#output').empty(); - getCommandNodes(); + ); } function showConnect() { @@ -301,19 +331,18 @@ $(document).ready(function () { } else { connection.disconnect(); } - event.preventDefault(); + event.preventDefault(); }); $('#queryForm').bind('submit', function (event) { - queryJID = $('#queryJID').val(); - checkFeatures(); - event.preventDefault(); + adhoc_status.queryJID = $('#queryJID').val(); + checkFeatures("#output"); + event.preventDefault(); }); }); -onunload = function() { +window.onunload = window.onbeforeunload = function() { if (connection) { connection.disconnect(); } } -