
org.directwebremoting.util.js Maven / Gradle / Ivy
/*
* Copyright 2005 Joe Walker
*
* Licensed 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.
*/
/**
* Declare an object to which we can add real functions.
*/
if (dwr == null) var dwr = {};
if (dwr.util == null) dwr.util = {};
if (DWRUtil == null) var DWRUtil = dwr.util;
/** @private The flag we use to decide if we should escape html */
dwr.util._escapeHtml = true;
/**
* Set the global escapeHtml flag
*/
dwr.util.setEscapeHtml = function(escapeHtml) {
dwr.util._escapeHtml = escapeHtml;
}
/** @private Work out from an options list and global settings if we should be esccaping */
dwr.util._shouldEscapeHtml = function(options) {
if (options && options.escapeHtml != null) {
return options.escapeHtml;
}
return dwr.util._escapeHtml;
}
/**
* Return a string with &, <, >, ' and " replaced with their entities
* @see TODO
*/
dwr.util.escapeHtml = function(original) {
var div = document.createElement('div');
var text = document.createTextNode(original);
div.appendChild(text);
return div.innerHTML;
}
/**
* Replace common XML entities with characters (see dwr.util.escapeHtml())
* @see TODO
*/
dwr.util.unescapeHtml = function(original) {
var div = document.createElement('div');
div.innerHTML = original.replace(/<\/?[^>]+>/gi, '');
return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
}
/**
* Replace characters dangerous for XSS reasons with visually similar characters
* @see TODO
*/
dwr.util.replaceXmlCharacters = function(original) {
original = original.replace("&", "+");
original = original.replace("<", "\u2039");
original = original.replace(">", "\u203A");
original = original.replace("\'", "\u2018");
original = original.replace("\"", "\u201C");
return original;
}
/**
* Return true iff the input string contains any XSS dangerous characters
* @see TODO
*/
dwr.util.containsXssRiskyCharacters = function(original) {
return (original.indexOf('&') != -1
&& original.indexOf('<') != -1
&& original.indexOf('>') != -1
&& original.indexOf('\'') != -1
&& original.indexOf('\"') != -1);
}
/**
* Enables you to react to return being pressed in an input
* @see http://getahead.ltd.uk/dwr/browser/util/selectrange
*/
dwr.util.onReturn = function(event, action) {
if (!event) event = window.event;
if (event && event.keyCode && event.keyCode == 13) action();
};
/**
* Select a specific range in a text box. Useful for 'google suggest' type functions.
* @see http://getahead.ltd.uk/dwr/browser/util/selectrange
*/
dwr.util.selectRange = function(ele, start, end) {
ele = dwr.util._getElementById(ele, "selectRange()");
if (ele == null) return;
if (ele.setSelectionRange) {
ele.setSelectionRange(start, end);
}
else if (ele.createTextRange) {
var range = ele.createTextRange();
range.moveStart("character", start);
range.moveEnd("character", end - ele.value.length);
range.select();
}
ele.focus();
};
/**
* Find the element in the current HTML document with the given id or ids
* @see http://getahead.ltd.uk/dwr/browser/util/$
*/
if (document.getElementById) {
dwr.util.byId = function() {
var elements = new Array();
for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == 'string') {
element = document.getElementById(element);
}
if (arguments.length == 1) {
return element;
}
elements.push(element);
}
return elements;
};
}
else if (document.all) {
dwr.util.byId = function() {
var elements = new Array();
for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == 'string') {
element = document.all[element];
}
if (arguments.length == 1) {
return element;
}
elements.push(element);
}
return elements;
};
}
/**
* Alias $ to dwr.util.byId
* @see http://getahead.ltd.uk/dwr/browser/util/$
*/
var $;
if (!$) {
$ = dwr.util.byId;
}
/**
* Like toString but aimed at debugging
* @see http://getahead.ltd.uk/dwr/browser/util/todescriptivestring
*/
dwr.util.toDescriptiveString = function(data, level, depth) {
var reply = "";
var i = 0;
var value;
var obj;
if (level == null) level = 0;
if (depth == null) depth = 0;
if (data == null) return "null";
if (dwr.util._isArray(data)) {
if (data.length == 0) reply += "[]";
else {
if (level != 0) reply += "[\n";
else reply = "[";
for (i = 0; i < data.length; i++) {
try {
obj = data[i];
if (obj == null || typeof obj == "function") {
continue;
}
else if (typeof obj == "object") {
if (level > 0) value = dwr.util.toDescriptiveString(obj, level - 1, depth + 1);
else value = dwr.util._detailedTypeOf(obj);
}
else {
value = "" + obj;
value = value.replace(/\/n/g, "\\n");
value = value.replace(/\/t/g, "\\t");
}
}
catch (ex) {
value = "" + ex;
}
if (level != 0) {
reply += dwr.util._indent(level, depth + 2) + value + ", \n";
}
else {
if (value.length > 13) value = value.substring(0, 10) + "...";
reply += value + ", ";
if (i > 5) {
reply += "...";
break;
}
}
}
if (level != 0) reply += dwr.util._indent(level, depth) + "]";
else reply += "]";
}
return reply;
}
if (typeof data == "string" || typeof data == "number" || dwr.util._isDate(data)) {
return data.toString();
}
if (typeof data == "object") {
var typename = dwr.util._detailedTypeOf(data);
if (typename != "Object") reply = typename + " ";
if (level != 0) reply += "{\n";
else reply = "{";
var isHtml = dwr.util._isHTMLElement(data);
for (var prop in data) {
if (isHtml) {
// HTML nodes have far too much stuff. Chop out the constants
if (prop.toUpperCase() == prop || prop == "title" ||
prop == "lang" || prop == "dir" || prop == "className" ||
prop == "form" || prop == "name" || prop == "prefix" ||
prop == "namespaceURI" || prop == "nodeType" ||
prop == "firstChild" || prop == "lastChild" ||
prop.match(/^offset/)) {
continue;
}
}
value = "";
try {
obj = data[prop];
if (obj == null || typeof obj == "function") {
continue;
}
else if (typeof obj == "object") {
if (level > 0) {
value = "\n";
value += dwr.util._indent(level, depth + 2);
value = dwr.util.toDescriptiveString(obj, level - 1, depth + 1);
}
else {
value = dwr.util._detailedTypeOf(obj);
}
}
else {
value = "" + obj;
value = value.replace(/\/n/g, "\\n");
value = value.replace(/\/t/g, "\\t");
}
}
catch (ex) {
value = "" + ex;
}
if (level == 0 && value.length > 13) value = value.substring(0, 10) + "...";
var propStr = prop;
if (propStr.length > 30) propStr = propStr.substring(0, 27) + "...";
if (level != 0) reply += dwr.util._indent(level, depth + 1);
reply += prop + ":" + value + ", ";
if (level != 0) reply += "\n";
i++;
if (level == 0 && i > 5) {
reply += "...";
break;
}
}
reply += dwr.util._indent(level, depth);
reply += "}";
return reply;
}
return data.toString();
};
/**
* @private Indenting for dwr.util.toDescriptiveString
*/
dwr.util._indent = function(level, depth) {
var reply = "";
if (level != 0) {
for (var j = 0; j < depth; j++) {
reply += "\u00A0\u00A0";
}
reply += " ";
}
return reply;
};
/**
* Setup a GMail style loading message.
* @see http://getahead.ltd.uk/dwr/browser/util/useloadingmessage
*/
dwr.util.useLoadingMessage = function(message) {
var loadingMessage;
if (message) loadingMessage = message;
else loadingMessage = "Loading";
dwr.engine.setPreHook(function() {
var disabledZone = dwr.util.byId('disabledZone');
if (!disabledZone) {
disabledZone = document.createElement('div');
disabledZone.setAttribute('id', 'disabledZone');
disabledZone.style.position = "absolute";
disabledZone.style.zIndex = "1000";
disabledZone.style.left = "0px";
disabledZone.style.top = "0px";
disabledZone.style.width = "100%";
disabledZone.style.height = "100%";
document.body.appendChild(disabledZone);
var messageZone = document.createElement('div');
messageZone.setAttribute('id', 'messageZone');
messageZone.style.position = "absolute";
messageZone.style.top = "0px";
messageZone.style.right = "0px";
messageZone.style.background = "red";
messageZone.style.color = "white";
messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";
messageZone.style.padding = "4px";
disabledZone.appendChild(messageZone);
var text = document.createTextNode(loadingMessage);
messageZone.appendChild(text);
dwr.util._disabledZoneUseCount = 1;
}
else {
dwr.util.byId('messageZone').innerHTML = loadingMessage;
disabledZone.style.visibility = 'visible';
dwr.util._disabledZoneUseCount++;
}
});
dwr.engine.setPostHook(function() {
dwr.util._disabledZoneUseCount--;
if (dwr.util._disabledZoneUseCount == 0) {
dwr.util.byId('disabledZone').style.visibility = 'hidden';
}
});
};
/**
* Set a global highlight handler
*/
dwr.util.setHighlightHandler = function(handler) {
dwr.util._highlightHandler = handler;
};
/**
* An example highlight handler
*/
dwr.util.yellowFadeHighlightHandler = function(ele) {
dwr.util._yellowFadeProcess(ele, 0);
};
dwr.util._yellowFadeSteps = [ "d0", "b0", "a0", "90", "98", "a0", "a8", "b0", "b8", "c0", "c8", "d0", "d8", "e0", "e8", "f0", "f8" ];
dwr.util._yellowFadeProcess = function(ele, colorIndex) {
ele = dwr.util.byId(ele);
if (colorIndex < dwr.util._yellowFadeSteps.length) {
ele.style.backgroundColor = "#ffff" + dwr.util._yellowFadeSteps[colorIndex];
setTimeout("dwr.util._yellowFadeProcess('" + ele.id + "'," + (colorIndex + 1) + ")", 200);
}
else {
ele.style.backgroundColor = "transparent";
}
};
/**
* An example highlight handler
*/
dwr.util.borderFadeHighlightHandler = function(ele) {
ele.style.borderWidth = "2px";
ele.style.borderStyle = "solid";
dwr.util._borderFadeProcess(ele, 0);
};
dwr.util._borderFadeSteps = [ "d0", "b0", "a0", "90", "98", "a0", "a8", "b0", "b8", "c0", "c8", "d0", "d8", "e0", "e8", "f0", "f8" ];
dwr.util._borderFadeProcess = function(ele, colorIndex) {
ele = dwr.util.byId(ele);
if (colorIndex < dwr.util._borderFadeSteps.length) {
ele.style.borderColor = "#ff" + dwr.util._borderFadeSteps[colorIndex] + dwr.util._borderFadeSteps[colorIndex];
setTimeout("dwr.util._borderFadeProcess('" + ele.id + "'," + (colorIndex + 1) + ")", 200);
}
else {
ele.style.backgroundColor = "transparent";
}
};
/**
* A focus highlight handler
*/
dwr.util.focusHighlightHandler = function(ele) {
try {
ele.focus();
}
catch (ex) { /* ignore */ }
};
/** @private the current global highlight style */
dwr.util._highlightHandler = null;
/**
* Highlight that an element has changed
*/
dwr.util.highlight = function(ele, options) {
if (options && options.highlightHandler) {
options.highlightHandler(dwr.util.byId(ele));
}
else if (dwr.util._highlightHandler != null) {
dwr.util._highlightHandler(dwr.util.byId(ele));
}
};
/**
* Set the value an HTML element to the specified value.
* @see http://getahead.ltd.uk/dwr/browser/util/setvalue
*/
dwr.util.setValue = function(ele, val, options) {
if (val == null) val = "";
if (options == null) options = {};
if (dwr.util._shouldEscapeHtml(options) && typeof(val) == "string") {
val = dwr.util.escapeHtml(val);
}
var orig = ele;
var nodes, node, i;
ele = dwr.util.byId(ele);
// We can work with names and need to sometimes for radio buttons
if (ele == null) {
nodes = document.getElementsByName(orig);
if (nodes.length >= 1) ele = nodes.item(0);
}
if (ele == null) {
dwr.util._debug("setValue() can't find an element with id/name: " + orig + ".");
return;
}
// All paths now lead to some update so we highlight a change
dwr.util.highlight(ele, options);
if (dwr.util._isHTMLElement(ele, "select")) {
if (ele.type == "select-multiple" && dwr.util._isArray(val)) dwr.util._selectListItems(ele, val);
else dwr.util._selectListItem(ele, val);
return;
}
if (dwr.util._isHTMLElement(ele, "input")) {
if (ele.type == "radio") {
// Some browsers match names when looking for ids, so check names anyway.
if (nodes == null) nodes = document.getElementsByName(orig);
if (nodes != null && nodes.length > 1) {
for (i = 0; i < nodes.length; i++) {
node = nodes.item(i);
if (node.type == "radio") node.checked = (node.value == val);
}
}
else ele.checked = (val == true);
}
else if (ele.type == "checkbox") ele.checked = val;
else ele.value = val;
return;
}
if (dwr.util._isHTMLElement(ele, "textarea")) {
ele.value = val;
return;
}
// If the value to be set is a DOM object then we try importing the node
// rather than serializing it out
if (val.nodeType) {
if (val.nodeType == 9 /*Node.DOCUMENT_NODE*/) val = val.documentElement;
val = dwr.util._importNode(ele.ownerDocument, val, true);
ele.appendChild(val);
return;
}
// Fall back to innerHTML
ele.innerHTML = val;
};
/**
* @private Find multiple items in a select list and select them. Used by setValue()
* @param ele The select list item
* @param val The array of values to select
*/
dwr.util._selectListItems = function(ele, val) {
// We deal with select list elements by selecting the matching option
// Begin by searching through the values
var found = false;
var i;
var j;
for (i = 0; i < ele.options.length; i++) {
ele.options[i].selected = false;
for (j = 0; j < val.length; j++) {
if (ele.options[i].value == val[j]) {
ele.options[i].selected = true;
}
}
}
// If that fails then try searching through the visible text
if (found) return;
for (i = 0; i < ele.options.length; i++) {
for (j = 0; j < val.length; j++) {
if (ele.options[i].text == val[j]) {
ele.options[i].selected = true;
}
}
}
};
/**
* @private Find an item in a select list and select it. Used by setValue()
* @param ele The select list item
* @param val The value to select
*/
dwr.util._selectListItem = function(ele, val) {
// We deal with select list elements by selecting the matching option
// Begin by searching through the values
var found = false;
var i;
for (i = 0; i < ele.options.length; i++) {
if (ele.options[i].value == val) {
ele.options[i].selected = true;
found = true;
}
else {
ele.options[i].selected = false;
}
}
// If that fails then try searching through the visible text
if (found) return;
for (i = 0; i < ele.options.length; i++) {
if (ele.options[i].text == val) {
ele.options[i].selected = true;
}
else {
ele.options[i].selected = false;
}
}
};
/**
* Read the current value for a given HTML element.
* @see http://getahead.ltd.uk/dwr/browser/util/getvalue
*/
dwr.util.getValue = function(ele, options) {
if (options == null) options = {};
var orig = ele;
ele = dwr.util.byId(ele);
// We can work with names and need to sometimes for radio buttons, and IE has
// an annoying bug where
var nodes = document.getElementsByName(orig);
if (ele == null && nodes.length >= 1) {
ele = nodes.item(0);
}
if (ele == null) {
dwr.util._debug("getValue() can't find an element with id/name: " + orig + ".");
return "";
}
if (dwr.util._isHTMLElement(ele, "select")) {
// Using "type" property instead of "multiple" as "type" is an official
// client-side property since JS 1.1
if (ele.type == "select-multiple") {
var reply = new Array();
for (i = 0; i < ele.options.length; i++) {
var item = ele.options[i];
if (item.selected) {
if (item.value != null && item.value != "") {
reply.push(item.value);
}
else {
reply.push(item.text);
}
}
}
return reply;
}
else {
var sel = ele.selectedIndex;
if (sel != -1) {
var item = ele.options[sel];
if (item.value != null && item.value != "") {
return item.value;
}
return item.text;
}
else {
return "";
}
}
}
if (dwr.util._isHTMLElement(ele, "input")) {
if (ele.type == "radio") {
var node;
for (i = 0; i < nodes.length; i++) {
node = nodes.item(i);
if (node.type == "radio") {
if (node.checked) {
if (nodes.length > 1) return node.value;
else return true;
}
}
}
}
switch (ele.type) {
case "checkbox":
case "check-box":
case "radio":
// if (ele.checked && ele.value != "") return ele.value;
// else
return ele.checked;
default:
return ele.value;
}
}
if (dwr.util._isHTMLElement(ele, "textarea")) {
return ele.value;
}
if (dwr.util._shouldEscapeHtml(options)) {
if (ele.textContent) return ele.textContent;
else if (ele.innerText) return ele.innerText;
}
return ele.innerHTML;
};
/**
* getText() is like getValue() except that it reads the text (and not the value) from select elements
* @see http://getahead.ltd.uk/dwr/browser/util/gettext
*/
dwr.util.getText = function(ele) {
ele = dwr.util._getElementById(ele, "getText()");
if (ele == null) return null;
if (!dwr.util._isHTMLElement(ele, "select")) {
dwr.util._debug("getText() can only be used with select elements. Attempt to use: " + dwr.util._detailedTypeOf(ele) + " from id: " + orig + ".");
return "";
}
// This is a bit of a scam because it assumes single select
// but I'm not sure how we should treat multi-select.
var sel = ele.selectedIndex;
if (sel != -1) {
return ele.options[sel].text;
}
else {
return "";
}
};
/**
* Given a map, call setValue() for all the entries in the map using the entry key as an element id
* @see http://getahead.ltd.uk/dwr/browser/util/setvalues
*/
dwr.util.setValues = function(map, options) {
var prefixes = [];
if (options && options.prefix) prefixes.push(options.prefix);
dwr.util._getDataProperties(map, prefixes);
};
/**
* @private retrieve values for the map and set the corresponding form fields. For object properties, recursively
* read sub properties in order to matching nested form fields.
*/
dwr.util._getDataProperties = function(map, prefixes) {
for (var property in map) {
// Only recurse into plain objects, ie not functions, arrays, etc
if (dwr.util._isObject(map[property]) && !dwr.util._isArray(map[property])) {
var prefixClone = [];
for (var i = 0; i < prefixes.length; i++) {
prefixClone.push(prefixes[i]);
}
prefixClone.push(property);
dwr.util._getDataProperties(map[property], prefixClone);
} else {
var nestedProperty = property;
if (prefixes.length > 0) {
nestedProperty = (prefixes.join(".")) + "." + property;
}
// Are there any elements with that id or name
if (dwr.util.byId(nestedProperty) != null || document.getElementsByName(nestedProperty).length >= 1) {
dwr.util.setValue(nestedProperty, map[property]);
}
}
}
};
/**
* Given a map, call getValue() for all the entries in the map using the entry key as an element id.
* Given a string or element that refers to a form, create an object from the elements of the form.
* @see http://getahead.ltd.uk/dwr/browser/util/getvalues
*/
dwr.util.getValues = function(data, options) {
var ele;
if (typeof data == "string") ele = dwr.util.byId(data);
if (dwr.util._isHTMLElement(data)) ele = data;
if (ele != null) {
if (ele.elements == null) {
alert("getValues() requires an object or reference to a form element.");
return null;
}
var reply = {};
var value;
for (var i = 0; i < ele.elements.length; i++) {
if (ele[i].id != null) value = ele[i].id;
else if (ele[i].value != null) value = ele[i].value;
else value = "element" + i;
reply[value] = dwr.util.getValue(ele[i]);
}
return reply;
}
else {
var prefixes = [];
if (options != null && options.prefix) prefixes.push(options.prefix);
dwr.util._setDataProperties(data, prefixes);
return data;
}
};
/**
* @private for each object property, set html field value if present. Recurse for object properties.
*/
dwr.util._setDataProperties = function(data, prefixes) {
for (var property in data) {
// Only recurse into plain objects, ie not functions, arrays, etc
if (dwr.util._isObject(data[property]) && !dwr.util._isArray(data[property])) {
var prefixClone = [];
for (var i = 0; i < prefixes.length; i++) {
prefixClone.push(prefixes[i]);
}
prefixClone.push(property);
dwr.util._setDataProperties(data[property], prefixClone);
}
else
{
var nestedProperty = property;
if (prefixes.length > 0) {
nestedProperty = (prefixes.join(".")) + "." + property;
}
// Are there any elements with that id or name
if (dwr.util.byId(nestedProperty) != null || document.getElementsByName(nestedProperty).length >= 1) {
data[property] = dwr.util.getValue(nestedProperty);
}
}
}
};
/**
* Add options to a list from an array or map.
* @see http://getahead.ltd.uk/dwr/browser/lists
*/
dwr.util.addOptions = function(ele, data/*, options*/) {
ele = dwr.util._getElementById(ele, "addOptions()");
if (ele == null) return;
// TODO: Restructure so we handle arguments to get proper options handling
// if (options == null) options = {};
var useOptions = dwr.util._isHTMLElement(ele, "select");
var useLi = dwr.util._isHTMLElement(ele, ["ul", "ol"]);
if (!useOptions && !useLi) {
dwr.util._debug("addOptions() can only be used with select/ul/ol elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
return;
}
if (data == null) return;
var text, value, li;
if (dwr.util._isArray(data)) {
// Loop through the data that we do have
for (var i = 0; i < data.length; i++) {
if (useOptions) {
if (arguments[2] != null) {
if (arguments[3] != null) {
text = dwr.util._getValueFrom(data[i], arguments[3]);
value = dwr.util._getValueFrom(data[i], arguments[2]);
}
else text = value = dwr.util._getValueFrom(data[i], arguments[2]);
}
else text = value = dwr.util._getValueFrom(data[i], arguments[3]);
if (text != null || value) ele.options[ele.options.length] = new Option(text, value);
}
else {
li = document.createElement("li");
value = dwr.util._getValueFrom(data[i], arguments[2]);
if (value != null) {
li.innerHTML = value;
ele.appendChild(li);
}
}
}
}
else if (arguments[3] != null) {
if (!useOptions) {
alert("dwr.util.addOptions can only create select lists from objects.");
return;
}
for (var prop in data) {
value = dwr.util._getValueFrom(data[prop], arguments[2]);
text = dwr.util._getValueFrom(data[prop], arguments[3]);
if (text || value) ele.options[ele.options.length] = new Option(text, value);
}
}
else {
if (!useOptions) {
dwr.util._debug("dwr.util.addOptions can only create select lists from objects.");
return;
}
for (var prop in data) {
if (typeof data[prop] != "function") {
if (arguments[2]) ele.options[ele.options.length] = new Option(prop, data[prop]);
else ele.options[ele.options.length] = new Option(data[prop], prop);
}
}
}
// All error routes through this function result in a return, so highlight now
dwr.util.highlight(ele, null); // TODO: forward options instead of null
};
/**
* @private Get the data from an array function for dwr.util.addOptions
*/
dwr.util._getValueFrom = function(data, method) {
if (method == null) return data;
else if (typeof method == 'function') return method(data);
else return data[method];
};
/**
* Remove all the options from a select list (specified by id)
* @see http://getahead.ltd.uk/dwr/browser/lists
*/
dwr.util.removeAllOptions = function(ele) {
ele = dwr.util._getElementById(ele, "removeAllOptions()");
if (ele == null) return;
var useOptions = dwr.util._isHTMLElement(ele, "select");
var useLi = dwr.util._isHTMLElement(ele, ["ul", "ol"]);
if (!useOptions && !useLi) {
dwr.util._debug("removeAllOptions() can only be used with select, ol and ul elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
return;
}
if (useOptions) {
ele.options.length = 0;
}
else {
while (ele.childNodes.length > 0) {
ele.removeChild(ele.firstChild);
}
}
};
/**
* Create rows inside a the table, tbody, thead or tfoot element (given by id).
* @see http://getahead.ltd.uk/dwr/browser/tables
*/
dwr.util.addRows = function(ele, data, cellFuncs, options) {
ele = dwr.util._getElementById(ele, "addRows()");
if (ele == null) return;
if (!dwr.util._isHTMLElement(ele, ["table", "tbody", "thead", "tfoot"])) {
dwr.util._debug("addRows() can only be used with table, tbody, thead and tfoot elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
return;
}
if (!options) options = {};
if (!options.rowCreator) options.rowCreator = dwr.util._defaultRowCreator;
if (!options.cellCreator) options.cellCreator = dwr.util._defaultCellCreator;
var tr, rowNum;
if (dwr.util._isArray(data)) {
for (rowNum = 0; rowNum < data.length; rowNum++) {
options.rowData = data[rowNum];
options.rowIndex = rowNum;
options.rowNum = rowNum;
options.data = null;
options.cellNum = -1;
tr = dwr.util._addRowInner(cellFuncs, options);
if (tr != null) ele.appendChild(tr);
}
}
else if (typeof data == "object") {
rowNum = 0;
for (var rowIndex in data) {
options.rowData = data[rowIndex];
options.rowIndex = rowIndex;
options.rowNum = rowNum;
options.data = null;
options.cellNum = -1;
tr = dwr.util._addRowInner(cellFuncs, options);
if (tr != null) ele.appendChild(tr);
rowNum++;
}
}
dwr.util.highlight(ele, options);
};
/**
* @private Internal function to draw a single row of a table.
*/
dwr.util._addRowInner = function(cellFuncs, options) {
var tr = options.rowCreator(options);
if (tr == null) return null;
for (var cellNum = 0; cellNum < cellFuncs.length; cellNum++) {
var func = cellFuncs[cellNum];
if (typeof func == 'function') options.data = func(options.rowData, options);
else options.data = func || "";
options.cellNum = cellNum;
var td = options.cellCreator(options);
if (td != null) {
if (options.data != null) {
if (dwr.util._isHTMLElement(options.data)) td.appendChild(options.data);
else {
if (dwr.util._shouldEscapeHtml(options) && typeof(options.data) == "string") {
td.innerHTML = dwr.util.escapeHtml(options.data);
}
else {
td.innerHTML = options.data;
}
}
}
tr.appendChild(td);
}
}
return tr;
};
/**
* @private Default row creation function
*/
dwr.util._defaultRowCreator = function(options) {
return document.createElement("tr");
};
/**
* @private Default cell creation function
*/
dwr.util._defaultCellCreator = function(options) {
return document.createElement("td");
};
/**
* Remove all the children of a given node.
* @see http://getahead.ltd.uk/dwr/browser/tables
*/
dwr.util.removeAllRows = function(ele, options) {
ele = dwr.util._getElementById(ele, "removeAllRows()");
if (ele == null) return;
if (!options) options = {};
if (!options.filter) options.filter = function() { return true; };
if (!dwr.util._isHTMLElement(ele, ["table", "tbody", "thead", "tfoot"])) {
dwr.util._debug("removeAllRows() can only be used with table, tbody, thead and tfoot elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
return;
}
var child = ele.firstChild;
var next;
while (child != null) {
next = child.nextSibling;
if (options.filter(child)) {
ele.removeChild(child);
}
child = next;
}
};
/**
* dwr.util.byId(ele).className = "X", that we can call from Java easily.
*/
dwr.util.setClassName = function(ele, className) {
ele = dwr.util._getElementById(ele, "setClassName()");
if (ele == null) return;
ele.className = className;
};
/**
* dwr.util.byId(ele).className += "X", that we can call from Java easily.
*/
dwr.util.addClassName = function(ele, className) {
ele = dwr.util._getElementById(ele, "addClassName()");
if (ele == null) return;
ele.className += " " + className;
};
/**
* dwr.util.byId(ele).className -= "X", that we can call from Java easily
* From code originally by Gavin Kistner
*/
dwr.util.removeClassName = function(ele, className) {
ele = dwr.util._getElementById(ele, "removeClassName()");
if (ele == null) return;
var regex = new RegExp("(^|\\s)" + className + "(\\s|$)", 'g');
ele.className = ele.className.replace(regex, '');
};
/**
* dwr.util.byId(ele).className |= "X", that we can call from Java easily.
*/
dwr.util.toggleClassName = function(ele, className) {
ele = dwr.util._getElementById(ele, "toggleClassName()");
if (ele == null) return;
var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
if (regex.test(element.className)) {
ele.className = ele.className.replace(regex, '');
}
else {
ele.className += " " + className;
}
};
/**
* Clone a node and insert it into the document just above the 'template' node
* @see http://getahead.ltd.uk/dwr/???
*/
dwr.util.cloneNode = function(ele, options) {
ele = dwr.util._getElementById(ele, "cloneNode()");
if (ele == null) return null;
if (options == null) options = {};
var clone = ele.cloneNode(true);
if (options.idPrefix || options.idSuffix) {
dwr.util._updateIds(clone, options);
}
else {
dwr.util._removeIds(clone);
}
ele.parentNode.insertBefore(clone, ele);
return clone;
};
/**
* @private Update all of the ids in an element tree
*/
dwr.util._updateIds = function(ele, options) {
if (options == null) options = {};
if (ele.id) {
ele.setAttribute("id", (options.idPrefix || "") + ele.id + (options.idSuffix || ""));
}
var children = ele.childNodes;
for (var i = 0; i < children.length; i++) {
var child = children.item(i);
if (child.nodeType == 1 /*Node.ELEMENT_NODE*/) {
dwr.util._updateIds(child, options);
}
}
};
/**
* @private Remove all the Ids from an element
*/
dwr.util._removeIds = function(ele) {
if (ele.id) ele.removeAttribute("id");
var children = ele.childNodes;
for (var i = 0; i < children.length; i++) {
var child = children.item(i);
if (child.nodeType == 1 /*Node.ELEMENT_NODE*/) {
dwr.util._removeIds(child);
}
}
};
/**
* @private Helper to turn a string into an element with an error message
*/
dwr.util._getElementById = function(ele, source) {
var orig = ele;
ele = dwr.util.byId(ele);
if (ele == null) {
dwr.util._debug(source + " can't find an element with id: " + orig + ".");
}
return ele;
};
/**
* @private Is the given node an HTML element (optionally of a given type)?
* @param ele The element to test
* @param nodeName eg "input", "textarea" - check for node name (optional)
* if nodeName is an array then check all for a match.
*/
dwr.util._isHTMLElement = function(ele, nodeName) {
if (ele == null || typeof ele != "object" || ele.nodeName == null) {
return false;
}
if (nodeName != null) {
var test = ele.nodeName.toLowerCase();
if (typeof nodeName == "string") {
return test == nodeName.toLowerCase();
}
if (dwr.util._isArray(nodeName)) {
var match = false;
for (var i = 0; i < nodeName.length && !match; i++) {
if (test == nodeName[i].toLowerCase()) {
match = true;
}
}
return match;
}
dwr.util._debug("dwr.util._isHTMLElement was passed test node name that is neither a string or array of strings");
return false;
}
return true;
};
/**
* @private Like typeOf except that more information for an object is returned other than "object"
*/
dwr.util._detailedTypeOf = function(x) {
var reply = typeof x;
if (reply == "object") {
reply = Object.prototype.toString.apply(x); // Returns "[object class]"
reply = reply.substring(8, reply.length-1); // Just get the class bit
}
return reply;
};
/**
* @private Object detector. Excluding null from objects.
*/
dwr.util._isObject = function(data) {
return (data && typeof data == "object");
};
/**
* @private Array detector.
*/
dwr.util._isArray = function(data) {
return (data && data instanceof Array);
};
/**
* @private Date detector.
*/
dwr.util._isDate = function(data) {
return (data && data instanceof Date);
};
/**
* @private Used by setValue. Gets around the missing functionallity in IE.
*/
dwr.util._importNode = function(doc, importedNode, deep) {
var newNode;
if (importedNode.nodeType == 1 /*Node.ELEMENT_NODE*/) {
newNode = doc.createElement(importedNode.nodeName);
for (var i = 0; i < importedNode.attributes.length; i++) {
var attr = importedNode.attributes[i];
if (attr.nodeValue != null && attr.nodeValue != '') {
newNode.setAttribute(attr.name, attr.nodeValue);
}
}
if (typeof importedNode.style != "undefined") {
newNode.style.cssText = importedNode.style.cssText;
}
}
else if (importedNode.nodeType == 3 /*Node.TEXT_NODE*/) {
newNode = doc.createTextNode(importedNode.nodeValue);
}
if (deep && importedNode.hasChildNodes()) {
for (i = 0; i < importedNode.childNodes.length; i++) {
newNode.appendChild(dwr.util._importNode(doc, importedNode.childNodes[i], true));
}
}
return newNode;
};
/** @private Used internally when some message needs to get to the programmer */
dwr.util._debug = function(message, stacktrace) {
var written = false;
try {
if (window.console) {
if (stacktrace && window.console.trace) window.console.trace();
window.console.log(message);
written = true;
}
else if (window.opera && window.opera.postError) {
window.opera.postError(message);
written = true;
}
}
catch (ex) { /* ignore */ }
if (!written) {
var debug = document.getElementById("dwr-debug");
if (debug) {
var contents = message + "
" + debug.innerHTML;
if (contents.length > 2048) contents = contents.substring(0, 2048);
debug.innerHTML = contents;
}
}
};
© 2015 - 2025 Weber Informatics LLC | Privacy Policy