blob: c1d371fe6d5ef1c88fdfac600c46ff4e0826116e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* General purpose AJAX infrastructure to handle a BU (browser update) response
*
* To add a new handler for a given request, create a new BUHandler and update its
* handlers property.
*
* @version $Id$
*/
dojo.provide("cocoon.ajax.BUHandler");
dojo.require("dojo.dom");
dojo.require("cocoon.ajax.common");
dojo.require("cocoon.ajax.insertion");
cocoon.ajax.BUHandler = function() { };
// Default highlight effect (none)
cocoon.ajax.BUHandler.highlight = null;
dojo.lang.extend(cocoon.ajax.BUHandler, {
processResponse: function(doc) {
var base = doc.documentElement;
var nodes = [];
if (base.nodeName.toLowerCase() == "bu:document") {
nodes = base.childNodes;
dojo.debug("got response using: XMLHTTPTransport");
} else {
base = dojo.byId("browser-update", doc);
if (base) {
nodes = base.childNodes;
dojo.debug("got response using: IframeTransport");
} else {
this.handleError("No response data found", doc);
}
}
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (node.nodeType == dojo.dom.ELEMENT_NODE) {
var handler = node.nodeName.replace(/.*:/, "").toLowerCase();
if (handler == "textarea") handler = node.getAttribute("name");
var handlerFunc = this.handlers[handler];
if (handlerFunc) {
handlerFunc(node);
} else {
this.handleError("No handler found for element " + handler, doc);
}
}
}
},
handleError: function(message, response) {
if (confirm(message + "\nShow server response?")) {
var w = window.open(undefined, "Cocoon Error", "location=no,resizable=yes,scrollbars=yes");
if (w == undefined) {
alert("You must allow popups from this server to display the response.");
} else {
var doc = w.document;
if (response.responseText) {
doc.open();
doc.write(response.responseText);
doc.close();
} else if (response.childNodes) {
dojo.dom.copyChildren(doc,response);
}
}
}
},
handlers: {
replace: function(element) {
var id = element.getAttribute("id");
if (!id) {
alert("no id found on update element");
return;
}
// Get the first child element (the first child may be some text!)
var firstChild = dojo.dom.getFirstChildElement(element);
if (!firstChild && element.nodeName.toLowerCase() == "textarea")
firstChild = dojo.dom.createDocumentFromText(element.value).documentElement;
var oldElement = document.getElementById(id);
if (!oldElement) {
alert("no element '" + id + "' in source document");
return;
}
var newElement = cocoon.ajax.insertion.replace(oldElement, firstChild);
if (typeof(cocoon.ajax.BUHandler.highlight) == "function") {
cocoon.ajax.BUHandler.highlight(newElement);
}
/* update the label */
var nextChild = dojo.dom.getNextSiblingElement(firstChild);
if (nextChild) {
cocoon.ajax.BUHandler.Helper.replaceLabel(nextChild);
}
}
}
});
cocoon.ajax.BUHandler.Helper = function() { };
dojo.lang.mixin(cocoon.ajax.BUHandler.Helper, {
replaceLabel: function(element) {
var oldElement = document.getElementById(element.getAttribute("id"));
if (oldElement) {
var newElement = cocoon.ajax.insertion.replace(oldElement, element);
if (typeof(cocoon.ajax.BUHandler.highlight) == "function") {
cocoon.ajax.BUHandler.highlight(newElement);
}
}
}
});