1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mochitest/MochiKit/DOM.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1043 @@ 1.4 +/*** 1.5 + 1.6 +MochiKit.DOM 1.4 1.7 + 1.8 +See <http://mochikit.com/> for documentation, downloads, license, etc. 1.9 + 1.10 +(c) 2005 Bob Ippolito. All rights Reserved. 1.11 + 1.12 +***/ 1.13 + 1.14 +if (typeof(dojo) != 'undefined') { 1.15 + dojo.provide("MochiKit.DOM"); 1.16 + dojo.require("MochiKit.Base"); 1.17 +} 1.18 +if (typeof(JSAN) != 'undefined') { 1.19 + JSAN.use("MochiKit.Base", []); 1.20 +} 1.21 + 1.22 +try { 1.23 + if (typeof(MochiKit.Base) == 'undefined') { 1.24 + throw ""; 1.25 + } 1.26 +} catch (e) { 1.27 + throw "MochiKit.DOM depends on MochiKit.Base!"; 1.28 +} 1.29 + 1.30 +if (typeof(MochiKit.DOM) == 'undefined') { 1.31 + MochiKit.DOM = {}; 1.32 +} 1.33 + 1.34 +MochiKit.DOM.NAME = "MochiKit.DOM"; 1.35 +MochiKit.DOM.VERSION = "1.4"; 1.36 +MochiKit.DOM.__repr__ = function () { 1.37 + return "[" + this.NAME + " " + this.VERSION + "]"; 1.38 +}; 1.39 +MochiKit.DOM.toString = function () { 1.40 + return this.__repr__(); 1.41 +}; 1.42 + 1.43 +MochiKit.DOM.EXPORT = [ 1.44 + "removeEmptyTextNodes", 1.45 + "formContents", 1.46 + "currentWindow", 1.47 + "currentDocument", 1.48 + "withWindow", 1.49 + "withDocument", 1.50 + "registerDOMConverter", 1.51 + "coerceToDOM", 1.52 + "createDOM", 1.53 + "createDOMFunc", 1.54 + "isChildNode", 1.55 + "getNodeAttribute", 1.56 + "setNodeAttribute", 1.57 + "updateNodeAttributes", 1.58 + "appendChildNodes", 1.59 + "replaceChildNodes", 1.60 + "removeElement", 1.61 + "swapDOM", 1.62 + "BUTTON", 1.63 + "TT", 1.64 + "PRE", 1.65 + "H1", 1.66 + "H2", 1.67 + "H3", 1.68 + "BR", 1.69 + "CANVAS", 1.70 + "HR", 1.71 + "LABEL", 1.72 + "TEXTAREA", 1.73 + "FORM", 1.74 + "STRONG", 1.75 + "SELECT", 1.76 + "OPTION", 1.77 + "OPTGROUP", 1.78 + "LEGEND", 1.79 + "FIELDSET", 1.80 + "P", 1.81 + "UL", 1.82 + "OL", 1.83 + "LI", 1.84 + "TD", 1.85 + "TR", 1.86 + "THEAD", 1.87 + "TBODY", 1.88 + "TFOOT", 1.89 + "TABLE", 1.90 + "TH", 1.91 + "INPUT", 1.92 + "SPAN", 1.93 + "A", 1.94 + "DIV", 1.95 + "IMG", 1.96 + "getElement", 1.97 + "$", 1.98 + "getElementsByTagAndClassName", 1.99 + "addToCallStack", 1.100 + "addLoadEvent", 1.101 + "focusOnLoad", 1.102 + "setElementClass", 1.103 + "toggleElementClass", 1.104 + "addElementClass", 1.105 + "removeElementClass", 1.106 + "swapElementClass", 1.107 + "hasElementClass", 1.108 + "escapeHTML", 1.109 + "toHTML", 1.110 + "emitHTML", 1.111 + "scrapeText" 1.112 +]; 1.113 + 1.114 +MochiKit.DOM.EXPORT_OK = [ 1.115 + "domConverters" 1.116 +]; 1.117 + 1.118 +MochiKit.DOM.DEPRECATED = [ 1.119 + ['computedStyle', 'MochiKit.Style.computedStyle', '1.4'], 1.120 + /** @id MochiKit.DOM.elementDimensions */ 1.121 + ['elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4'], 1.122 + /** @id MochiKit.DOM.elementPosition */ 1.123 + ['elementPosition', 'MochiKit.Style.getElementPosition', '1.4'], 1.124 + ['hideElement', 'MochiKit.Style.hideElement', '1.4'], 1.125 + /** @id MochiKit.DOM.setElementDimensions */ 1.126 + ['setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4'], 1.127 + /** @id MochiKit.DOM.setElementPosition */ 1.128 + ['setElementPosition', 'MochiKit.Style.setElementPosition', '1.4'], 1.129 + ['setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4'], 1.130 + /** @id MochiKit.DOM.setOpacity */ 1.131 + ['setOpacity', 'MochiKit.Style.setOpacity', '1.4'], 1.132 + ['showElement', 'MochiKit.Style.showElement', '1.4'], 1.133 + /** @id MochiKit.DOM.Coordinates */ 1.134 + ['Coordinates', 'MochiKit.Style.Coordinates', '1.4'], // FIXME: broken 1.135 + /** @id MochiKit.DOM.Dimensions */ 1.136 + ['Dimensions', 'MochiKit.Style.Dimensions', '1.4'] // FIXME: broken 1.137 +]; 1.138 + 1.139 +/** @id MochiKit.DOM.getViewportDimensions */ 1.140 +MochiKit.DOM.getViewportDimensions = new Function('' + 1.141 + 'if (!MochiKit["Style"]) {' + 1.142 + ' throw new Error("This function has been deprecated and depends on MochiKit.Style.");' + 1.143 + '}' + 1.144 + 'return MochiKit.Style.getViewportDimensions.apply(this, arguments);'); 1.145 + 1.146 +MochiKit.Base.update(MochiKit.DOM, { 1.147 + 1.148 + /** @id MochiKit.DOM.currentWindow */ 1.149 + currentWindow: function () { 1.150 + return MochiKit.DOM._window; 1.151 + }, 1.152 + 1.153 + /** @id MochiKit.DOM.currentDocument */ 1.154 + currentDocument: function () { 1.155 + return MochiKit.DOM._document; 1.156 + }, 1.157 + 1.158 + /** @id MochiKit.DOM.withWindow */ 1.159 + withWindow: function (win, func) { 1.160 + var self = MochiKit.DOM; 1.161 + var oldDoc = self._document; 1.162 + var oldWin = self._win; 1.163 + var rval; 1.164 + try { 1.165 + self._window = win; 1.166 + self._document = win.document; 1.167 + rval = func(); 1.168 + } catch (e) { 1.169 + self._window = oldWin; 1.170 + self._document = oldDoc; 1.171 + throw e; 1.172 + } 1.173 + self._window = oldWin; 1.174 + self._document = oldDoc; 1.175 + return rval; 1.176 + }, 1.177 + 1.178 + /** @id MochiKit.DOM.formContents */ 1.179 + formContents: function (elem/* = document */) { 1.180 + var names = []; 1.181 + var values = []; 1.182 + var m = MochiKit.Base; 1.183 + var self = MochiKit.DOM; 1.184 + if (typeof(elem) == "undefined" || elem === null) { 1.185 + elem = self._document; 1.186 + } else { 1.187 + elem = self.getElement(elem); 1.188 + } 1.189 + m.nodeWalk(elem, function (elem) { 1.190 + var name = elem.name; 1.191 + if (m.isNotEmpty(name)) { 1.192 + var tagName = elem.tagName.toUpperCase(); 1.193 + if (tagName === "INPUT" 1.194 + && (elem.type == "radio" || elem.type == "checkbox") 1.195 + && !elem.checked 1.196 + ) { 1.197 + return null; 1.198 + } 1.199 + if (tagName === "SELECT") { 1.200 + if (elem.type == "select-one") { 1.201 + if (elem.selectedIndex >= 0) { 1.202 + var opt = elem.options[elem.selectedIndex]; 1.203 + names.push(name); 1.204 + values.push(opt.value); 1.205 + return null; 1.206 + } 1.207 + // no form elements? 1.208 + names.push(name); 1.209 + values.push(""); 1.210 + return null; 1.211 + } else { 1.212 + var opts = elem.options; 1.213 + if (!opts.length) { 1.214 + names.push(name); 1.215 + values.push(""); 1.216 + return null; 1.217 + } 1.218 + for (var i = 0; i < opts.length; i++) { 1.219 + var opt = opts[i]; 1.220 + if (!opt.selected) { 1.221 + continue; 1.222 + } 1.223 + names.push(name); 1.224 + values.push(opt.value); 1.225 + } 1.226 + return null; 1.227 + } 1.228 + } 1.229 + if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" 1.230 + || tagName === "DIV" 1.231 + ) { 1.232 + return elem.childNodes; 1.233 + } 1.234 + names.push(name); 1.235 + values.push(elem.value || ''); 1.236 + return null; 1.237 + } 1.238 + return elem.childNodes; 1.239 + }); 1.240 + return [names, values]; 1.241 + }, 1.242 + 1.243 + /** @id MochiKit.DOM.withDocument */ 1.244 + withDocument: function (doc, func) { 1.245 + var self = MochiKit.DOM; 1.246 + var oldDoc = self._document; 1.247 + var rval; 1.248 + try { 1.249 + self._document = doc; 1.250 + rval = func(); 1.251 + } catch (e) { 1.252 + self._document = oldDoc; 1.253 + throw e; 1.254 + } 1.255 + self._document = oldDoc; 1.256 + return rval; 1.257 + }, 1.258 + 1.259 + /** @id MochiKit.DOM.registerDOMConverter */ 1.260 + registerDOMConverter: function (name, check, wrap, /* optional */override) { 1.261 + MochiKit.DOM.domConverters.register(name, check, wrap, override); 1.262 + }, 1.263 + 1.264 + /** @id MochiKit.DOM.coerceToDOM */ 1.265 + coerceToDOM: function (node, ctx) { 1.266 + var m = MochiKit.Base; 1.267 + var im = MochiKit.Iter; 1.268 + var self = MochiKit.DOM; 1.269 + if (im) { 1.270 + var iter = im.iter; 1.271 + var repeat = im.repeat; 1.272 + var map = m.map; 1.273 + } 1.274 + var domConverters = self.domConverters; 1.275 + var coerceToDOM = arguments.callee; 1.276 + var NotFound = m.NotFound; 1.277 + while (true) { 1.278 + if (typeof(node) == 'undefined' || node === null) { 1.279 + return null; 1.280 + } 1.281 + if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) { 1.282 + return node; 1.283 + } 1.284 + if (typeof(node) == 'number' || typeof(node) == 'boolean') { 1.285 + node = node.toString(); 1.286 + // FALL THROUGH 1.287 + } 1.288 + if (typeof(node) == 'string') { 1.289 + return self._document.createTextNode(node); 1.290 + } 1.291 + if (typeof(node.__dom__) == 'function') { 1.292 + node = node.__dom__(ctx); 1.293 + continue; 1.294 + } 1.295 + if (typeof(node.dom) == 'function') { 1.296 + node = node.dom(ctx); 1.297 + continue; 1.298 + } 1.299 + if (typeof(node) == 'function') { 1.300 + node = node.apply(ctx, [ctx]); 1.301 + continue; 1.302 + } 1.303 + 1.304 + if (im) { 1.305 + // iterable 1.306 + var iterNodes = null; 1.307 + try { 1.308 + iterNodes = iter(node); 1.309 + } catch (e) { 1.310 + // pass 1.311 + } 1.312 + if (iterNodes) { 1.313 + return map(coerceToDOM, iterNodes, repeat(ctx)); 1.314 + } 1.315 + } 1.316 + 1.317 + // adapter 1.318 + try { 1.319 + node = domConverters.match(node, ctx); 1.320 + continue; 1.321 + } catch (e) { 1.322 + if (e != NotFound) { 1.323 + throw e; 1.324 + } 1.325 + } 1.326 + 1.327 + // fallback 1.328 + return self._document.createTextNode(node.toString()); 1.329 + } 1.330 + // mozilla warnings aren't too bright 1.331 + return undefined; 1.332 + }, 1.333 + 1.334 + /** @id MochiKit.DOM.isChildNode */ 1.335 + isChildNode: function (node, maybeparent) { 1.336 + var self = MochiKit.DOM; 1.337 + if (typeof(node) == "string") { 1.338 + node = self.getElement(node); 1.339 + } 1.340 + if (typeof(maybeparent) == "string") { 1.341 + maybeparent = self.getElement(maybeparent); 1.342 + } 1.343 + if (node === maybeparent) { 1.344 + return true; 1.345 + } 1.346 + while (node && node.tagName.toUpperCase() != "BODY") { 1.347 + node = node.parentNode; 1.348 + if (node === maybeparent) { 1.349 + return true; 1.350 + } 1.351 + } 1.352 + return false; 1.353 + }, 1.354 + 1.355 + /** @id MochiKit.DOM.setNodeAttribute */ 1.356 + setNodeAttribute: function (node, attr, value) { 1.357 + var o = {}; 1.358 + o[attr] = value; 1.359 + try { 1.360 + return MochiKit.DOM.updateNodeAttributes(node, o); 1.361 + } catch (e) { 1.362 + // pass 1.363 + } 1.364 + return null; 1.365 + }, 1.366 + 1.367 + /** @id MochiKit.DOM.getNodeAttribute */ 1.368 + getNodeAttribute: function (node, attr) { 1.369 + var self = MochiKit.DOM; 1.370 + var rename = self.attributeArray.renames[attr]; 1.371 + node = self.getElement(node); 1.372 + try { 1.373 + if (rename) { 1.374 + return node[rename]; 1.375 + } 1.376 + return node.getAttribute(attr); 1.377 + } catch (e) { 1.378 + // pass 1.379 + } 1.380 + return null; 1.381 + }, 1.382 + 1.383 + /** @id MochiKit.DOM.updateNodeAttributes */ 1.384 + updateNodeAttributes: function (node, attrs) { 1.385 + var elem = node; 1.386 + var self = MochiKit.DOM; 1.387 + if (typeof(node) == 'string') { 1.388 + elem = self.getElement(node); 1.389 + } 1.390 + if (attrs) { 1.391 + var updatetree = MochiKit.Base.updatetree; 1.392 + if (self.attributeArray.compliant) { 1.393 + // not IE, good. 1.394 + for (var k in attrs) { 1.395 + var v = attrs[k]; 1.396 + if (typeof(v) == 'object' && typeof(elem[k]) == 'object') { 1.397 + updatetree(elem[k], v); 1.398 + } else if (k.substring(0, 2) == "on") { 1.399 + if (typeof(v) == "string") { 1.400 + v = new Function(v); 1.401 + } 1.402 + elem[k] = v; 1.403 + } else { 1.404 + elem.setAttribute(k, v); 1.405 + } 1.406 + } 1.407 + } else { 1.408 + // IE is insane in the membrane 1.409 + var renames = self.attributeArray.renames; 1.410 + for (k in attrs) { 1.411 + v = attrs[k]; 1.412 + var renamed = renames[k]; 1.413 + if (k == "style" && typeof(v) == "string") { 1.414 + elem.style.cssText = v; 1.415 + } else if (typeof(renamed) == "string") { 1.416 + elem[renamed] = v; 1.417 + } else if (typeof(elem[k]) == 'object' 1.418 + && typeof(v) == 'object') { 1.419 + updatetree(elem[k], v); 1.420 + } else if (k.substring(0, 2) == "on") { 1.421 + if (typeof(v) == "string") { 1.422 + v = new Function(v); 1.423 + } 1.424 + elem[k] = v; 1.425 + } else { 1.426 + elem.setAttribute(k, v); 1.427 + } 1.428 + } 1.429 + } 1.430 + } 1.431 + return elem; 1.432 + }, 1.433 + 1.434 + /** @id MochiKit.DOM.appendChildNodes */ 1.435 + appendChildNodes: function (node/*, nodes...*/) { 1.436 + var elem = node; 1.437 + var self = MochiKit.DOM; 1.438 + if (typeof(node) == 'string') { 1.439 + elem = self.getElement(node); 1.440 + } 1.441 + var nodeStack = [ 1.442 + self.coerceToDOM( 1.443 + MochiKit.Base.extend(null, arguments, 1), 1.444 + elem 1.445 + ) 1.446 + ]; 1.447 + var concat = MochiKit.Base.concat; 1.448 + while (nodeStack.length) { 1.449 + var n = nodeStack.shift(); 1.450 + if (typeof(n) == 'undefined' || n === null) { 1.451 + // pass 1.452 + } else if (typeof(n.nodeType) == 'number') { 1.453 + elem.appendChild(n); 1.454 + } else { 1.455 + nodeStack = concat(n, nodeStack); 1.456 + } 1.457 + } 1.458 + return elem; 1.459 + }, 1.460 + 1.461 + /** @id MochiKit.DOM.replaceChildNodes */ 1.462 + replaceChildNodes: function (node/*, nodes...*/) { 1.463 + var elem = node; 1.464 + var self = MochiKit.DOM; 1.465 + if (typeof(node) == 'string') { 1.466 + elem = self.getElement(node); 1.467 + arguments[0] = elem; 1.468 + } 1.469 + var child; 1.470 + while ((child = elem.firstChild)) { 1.471 + elem.removeChild(child); 1.472 + } 1.473 + if (arguments.length < 2) { 1.474 + return elem; 1.475 + } else { 1.476 + return self.appendChildNodes.apply(this, arguments); 1.477 + } 1.478 + }, 1.479 + 1.480 + /** @id MochiKit.DOM.createDOM */ 1.481 + createDOM: function (name, attrs/*, nodes... */) { 1.482 + var elem; 1.483 + var self = MochiKit.DOM; 1.484 + var m = MochiKit.Base; 1.485 + if (typeof(attrs) == "string" || typeof(attrs) == "number") { 1.486 + var args = m.extend([name, null], arguments, 1); 1.487 + return arguments.callee.apply(this, args); 1.488 + } 1.489 + if (typeof(name) == 'string') { 1.490 + // Internet Explorer is dumb 1.491 + var xhtml = self._xhtml; 1.492 + if (attrs && !self.attributeArray.compliant) { 1.493 + // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp 1.494 + var contents = ""; 1.495 + if ('name' in attrs) { 1.496 + contents += ' name="' + self.escapeHTML(attrs.name) + '"'; 1.497 + } 1.498 + if (name == 'input' && 'type' in attrs) { 1.499 + contents += ' type="' + self.escapeHTML(attrs.type) + '"'; 1.500 + } 1.501 + if (contents) { 1.502 + name = "<" + name + contents + ">"; 1.503 + xhtml = false; 1.504 + } 1.505 + } 1.506 + var d = self._document; 1.507 + if (xhtml && d === document) { 1.508 + elem = d.createElementNS("http://www.w3.org/1999/xhtml", name); 1.509 + } else { 1.510 + elem = d.createElement(name); 1.511 + } 1.512 + } else { 1.513 + elem = name; 1.514 + } 1.515 + if (attrs) { 1.516 + self.updateNodeAttributes(elem, attrs); 1.517 + } 1.518 + if (arguments.length <= 2) { 1.519 + return elem; 1.520 + } else { 1.521 + var args = m.extend([elem], arguments, 2); 1.522 + return self.appendChildNodes.apply(this, args); 1.523 + } 1.524 + }, 1.525 + 1.526 + /** @id MochiKit.DOM.createDOMFunc */ 1.527 + createDOMFunc: function (/* tag, attrs, *nodes */) { 1.528 + var m = MochiKit.Base; 1.529 + return m.partial.apply( 1.530 + this, 1.531 + m.extend([MochiKit.DOM.createDOM], arguments) 1.532 + ); 1.533 + }, 1.534 + 1.535 + /** @id MochiKit.DOM.removeElement */ 1.536 + removeElement: function (elem) { 1.537 + var e = MochiKit.DOM.getElement(elem); 1.538 + e.parentNode.removeChild(e); 1.539 + return e; 1.540 + }, 1.541 + 1.542 + /** @id MochiKit.DOM.swapDOM */ 1.543 + swapDOM: function (dest, src) { 1.544 + var self = MochiKit.DOM; 1.545 + dest = self.getElement(dest); 1.546 + var parent = dest.parentNode; 1.547 + if (src) { 1.548 + src = self.getElement(src); 1.549 + parent.replaceChild(src, dest); 1.550 + } else { 1.551 + parent.removeChild(dest); 1.552 + } 1.553 + return src; 1.554 + }, 1.555 + 1.556 + /** @id MochiKit.DOM.getElement */ 1.557 + getElement: function (id) { 1.558 + var self = MochiKit.DOM; 1.559 + if (arguments.length == 1) { 1.560 + return ((typeof(id) == "string") ? 1.561 + self._document.getElementById(id) : id); 1.562 + } else { 1.563 + return MochiKit.Base.map(self.getElement, arguments); 1.564 + } 1.565 + }, 1.566 + 1.567 + /** @id MochiKit.DOM.getElementsByTagAndClassName */ 1.568 + getElementsByTagAndClassName: function (tagName, className, 1.569 + /* optional */parent) { 1.570 + var self = MochiKit.DOM; 1.571 + if (typeof(tagName) == 'undefined' || tagName === null) { 1.572 + tagName = '*'; 1.573 + } 1.574 + if (typeof(parent) == 'undefined' || parent === null) { 1.575 + parent = self._document; 1.576 + } 1.577 + parent = self.getElement(parent); 1.578 + var children = (parent.getElementsByTagName(tagName) 1.579 + || self._document.all); 1.580 + if (typeof(className) == 'undefined' || className === null) { 1.581 + return MochiKit.Base.extend(null, children); 1.582 + } 1.583 + 1.584 + var elements = []; 1.585 + for (var i = 0; i < children.length; i++) { 1.586 + var child = children[i]; 1.587 + var cls = child.className; 1.588 + if (!cls) { 1.589 + continue; 1.590 + } 1.591 + var classNames = cls.split(' '); 1.592 + for (var j = 0; j < classNames.length; j++) { 1.593 + if (classNames[j] == className) { 1.594 + elements.push(child); 1.595 + break; 1.596 + } 1.597 + } 1.598 + } 1.599 + 1.600 + return elements; 1.601 + }, 1.602 + 1.603 + _newCallStack: function (path, once) { 1.604 + var rval = function () { 1.605 + var callStack = arguments.callee.callStack; 1.606 + for (var i = 0; i < callStack.length; i++) { 1.607 + if (callStack[i].apply(this, arguments) === false) { 1.608 + break; 1.609 + } 1.610 + } 1.611 + if (once) { 1.612 + try { 1.613 + this[path] = null; 1.614 + } catch (e) { 1.615 + // pass 1.616 + } 1.617 + } 1.618 + }; 1.619 + rval.callStack = []; 1.620 + return rval; 1.621 + }, 1.622 + 1.623 + /** @id MochiKit.DOM.addToCallStack */ 1.624 + addToCallStack: function (target, path, func, once) { 1.625 + var self = MochiKit.DOM; 1.626 + var existing = target[path]; 1.627 + var regfunc = existing; 1.628 + if (!(typeof(existing) == 'function' 1.629 + && typeof(existing.callStack) == "object" 1.630 + && existing.callStack !== null)) { 1.631 + regfunc = self._newCallStack(path, once); 1.632 + if (typeof(existing) == 'function') { 1.633 + regfunc.callStack.push(existing); 1.634 + } 1.635 + target[path] = regfunc; 1.636 + } 1.637 + regfunc.callStack.push(func); 1.638 + }, 1.639 + 1.640 + /** @id MochiKit.DOM.addLoadEvent */ 1.641 + addLoadEvent: function (func) { 1.642 + var self = MochiKit.DOM; 1.643 + self.addToCallStack(self._window, "onload", func, true); 1.644 + 1.645 + }, 1.646 + 1.647 + /** @id MochiKit.DOM.focusOnLoad */ 1.648 + focusOnLoad: function (element) { 1.649 + var self = MochiKit.DOM; 1.650 + self.addLoadEvent(function () { 1.651 + element = self.getElement(element); 1.652 + if (element) { 1.653 + element.focus(); 1.654 + } 1.655 + }); 1.656 + }, 1.657 + 1.658 + /** @id MochiKit.DOM.setElementClass */ 1.659 + setElementClass: function (element, className) { 1.660 + var self = MochiKit.DOM; 1.661 + var obj = self.getElement(element); 1.662 + if (self.attributeArray.compliant) { 1.663 + obj.setAttribute("class", className); 1.664 + } else { 1.665 + obj.setAttribute("className", className); 1.666 + } 1.667 + }, 1.668 + 1.669 + /** @id MochiKit.DOM.toggleElementClass */ 1.670 + toggleElementClass: function (className/*, element... */) { 1.671 + var self = MochiKit.DOM; 1.672 + for (var i = 1; i < arguments.length; i++) { 1.673 + var obj = self.getElement(arguments[i]); 1.674 + if (!self.addElementClass(obj, className)) { 1.675 + self.removeElementClass(obj, className); 1.676 + } 1.677 + } 1.678 + }, 1.679 + 1.680 + /** @id MochiKit.DOM.addElementClass */ 1.681 + addElementClass: function (element, className) { 1.682 + var self = MochiKit.DOM; 1.683 + var obj = self.getElement(element); 1.684 + var cls = obj.className; 1.685 + // trivial case, no className yet 1.686 + if (cls == undefined || cls.length === 0) { 1.687 + self.setElementClass(obj, className); 1.688 + return true; 1.689 + } 1.690 + // the other trivial case, already set as the only class 1.691 + if (cls == className) { 1.692 + return false; 1.693 + } 1.694 + var classes = cls.split(" "); 1.695 + for (var i = 0; i < classes.length; i++) { 1.696 + // already present 1.697 + if (classes[i] == className) { 1.698 + return false; 1.699 + } 1.700 + } 1.701 + // append class 1.702 + self.setElementClass(obj, cls + " " + className); 1.703 + return true; 1.704 + }, 1.705 + 1.706 + /** @id MochiKit.DOM.removeElementClass */ 1.707 + removeElementClass: function (element, className) { 1.708 + var self = MochiKit.DOM; 1.709 + var obj = self.getElement(element); 1.710 + var cls = obj.className; 1.711 + // trivial case, no className yet 1.712 + if (cls == undefined || cls.length === 0) { 1.713 + return false; 1.714 + } 1.715 + // other trivial case, set only to className 1.716 + if (cls == className) { 1.717 + self.setElementClass(obj, ""); 1.718 + return true; 1.719 + } 1.720 + var classes = cls.split(" "); 1.721 + for (var i = 0; i < classes.length; i++) { 1.722 + // already present 1.723 + if (classes[i] == className) { 1.724 + // only check sane case where the class is used once 1.725 + classes.splice(i, 1); 1.726 + self.setElementClass(obj, classes.join(" ")); 1.727 + return true; 1.728 + } 1.729 + } 1.730 + // not found 1.731 + return false; 1.732 + }, 1.733 + 1.734 + /** @id MochiKit.DOM.swapElementClass */ 1.735 + swapElementClass: function (element, fromClass, toClass) { 1.736 + var obj = MochiKit.DOM.getElement(element); 1.737 + var res = MochiKit.DOM.removeElementClass(obj, fromClass); 1.738 + if (res) { 1.739 + MochiKit.DOM.addElementClass(obj, toClass); 1.740 + } 1.741 + return res; 1.742 + }, 1.743 + 1.744 + /** @id MochiKit.DOM.hasElementClass */ 1.745 + hasElementClass: function (element, className/*...*/) { 1.746 + var obj = MochiKit.DOM.getElement(element); 1.747 + var cls = obj.className; 1.748 + if (!cls) { 1.749 + return false; 1.750 + } 1.751 + var classes = cls.split(" "); 1.752 + for (var i = 1; i < arguments.length; i++) { 1.753 + var good = false; 1.754 + for (var j = 0; j < classes.length; j++) { 1.755 + if (classes[j] == arguments[i]) { 1.756 + good = true; 1.757 + break; 1.758 + } 1.759 + } 1.760 + if (!good) { 1.761 + return false; 1.762 + } 1.763 + } 1.764 + return true; 1.765 + }, 1.766 + 1.767 + /** @id MochiKit.DOM.escapeHTML */ 1.768 + escapeHTML: function (s) { 1.769 + return s.replace(/&/g, "&" 1.770 + ).replace(/"/g, """ 1.771 + ).replace(/</g, "<" 1.772 + ).replace(/>/g, ">"); 1.773 + }, 1.774 + 1.775 + /** @id MochiKit.DOM.toHTML */ 1.776 + toHTML: function (dom) { 1.777 + return MochiKit.DOM.emitHTML(dom).join(""); 1.778 + }, 1.779 + 1.780 + /** @id MochiKit.DOM.emitHTML */ 1.781 + emitHTML: function (dom, /* optional */lst) { 1.782 + if (typeof(lst) == 'undefined' || lst === null) { 1.783 + lst = []; 1.784 + } 1.785 + // queue is the call stack, we're doing this non-recursively 1.786 + var queue = [dom]; 1.787 + var self = MochiKit.DOM; 1.788 + var escapeHTML = self.escapeHTML; 1.789 + var attributeArray = self.attributeArray; 1.790 + while (queue.length) { 1.791 + dom = queue.pop(); 1.792 + if (typeof(dom) == 'string') { 1.793 + lst.push(dom); 1.794 + } else if (dom.nodeType == 1) { 1.795 + // we're not using higher order stuff here 1.796 + // because safari has heisenbugs.. argh. 1.797 + // 1.798 + // I think it might have something to do with 1.799 + // garbage collection and function calls. 1.800 + lst.push('<' + dom.tagName.toLowerCase()); 1.801 + var attributes = []; 1.802 + var domAttr = attributeArray(dom); 1.803 + for (var i = 0; i < domAttr.length; i++) { 1.804 + var a = domAttr[i]; 1.805 + attributes.push([ 1.806 + " ", 1.807 + a.name, 1.808 + '="', 1.809 + escapeHTML(a.value), 1.810 + '"' 1.811 + ]); 1.812 + } 1.813 + attributes.sort(); 1.814 + for (i = 0; i < attributes.length; i++) { 1.815 + var attrs = attributes[i]; 1.816 + for (var j = 0; j < attrs.length; j++) { 1.817 + lst.push(attrs[j]); 1.818 + } 1.819 + } 1.820 + if (dom.hasChildNodes()) { 1.821 + lst.push(">"); 1.822 + // queue is the FILO call stack, so we put the close tag 1.823 + // on first 1.824 + queue.push("</" + dom.tagName.toLowerCase() + ">"); 1.825 + var cnodes = dom.childNodes; 1.826 + for (i = cnodes.length - 1; i >= 0; i--) { 1.827 + queue.push(cnodes[i]); 1.828 + } 1.829 + } else { 1.830 + lst.push('/>'); 1.831 + } 1.832 + } else if (dom.nodeType == 3) { 1.833 + lst.push(escapeHTML(dom.nodeValue)); 1.834 + } 1.835 + } 1.836 + return lst; 1.837 + }, 1.838 + 1.839 + /** @id MochiKit.DOM.scrapeText */ 1.840 + scrapeText: function (node, /* optional */asArray) { 1.841 + var rval = []; 1.842 + (function (node) { 1.843 + var cn = node.childNodes; 1.844 + if (cn) { 1.845 + for (var i = 0; i < cn.length; i++) { 1.846 + arguments.callee.call(this, cn[i]); 1.847 + } 1.848 + } 1.849 + var nodeValue = node.nodeValue; 1.850 + if (typeof(nodeValue) == 'string') { 1.851 + rval.push(nodeValue); 1.852 + } 1.853 + })(MochiKit.DOM.getElement(node)); 1.854 + if (asArray) { 1.855 + return rval; 1.856 + } else { 1.857 + return rval.join(""); 1.858 + } 1.859 + }, 1.860 + 1.861 + /** @id MochiKit.DOM.removeEmptyTextNodes */ 1.862 + removeEmptyTextNodes: function (element) { 1.863 + element = MochiKit.DOM.getElement(element); 1.864 + for (var i = 0; i < element.childNodes.length; i++) { 1.865 + var node = element.childNodes[i]; 1.866 + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) { 1.867 + node.parentNode.removeChild(node); 1.868 + } 1.869 + } 1.870 + }, 1.871 + 1.872 + __new__: function (win) { 1.873 + 1.874 + var m = MochiKit.Base; 1.875 + if (typeof(document) != "undefined") { 1.876 + this._document = document; 1.877 + this._xhtml = 1.878 + document.createElementNS && 1.879 + document.createElement("testname").localName == "testname"; 1.880 + } else if (MochiKit.MockDOM) { 1.881 + this._document = MochiKit.MockDOM.document; 1.882 + } 1.883 + this._window = win; 1.884 + 1.885 + this.domConverters = new m.AdapterRegistry(); 1.886 + 1.887 + var __tmpElement = this._document.createElement("span"); 1.888 + var attributeArray; 1.889 + if (__tmpElement && __tmpElement.attributes && 1.890 + __tmpElement.attributes.length > 0) { 1.891 + // for braindead browsers (IE) that insert extra junk 1.892 + var filter = m.filter; 1.893 + attributeArray = function (node) { 1.894 + return filter(attributeArray.ignoreAttrFilter, node.attributes); 1.895 + }; 1.896 + attributeArray.ignoreAttr = {}; 1.897 + var attrs = __tmpElement.attributes; 1.898 + var ignoreAttr = attributeArray.ignoreAttr; 1.899 + for (var i = 0; i < attrs.length; i++) { 1.900 + var a = attrs[i]; 1.901 + ignoreAttr[a.name] = a.value; 1.902 + } 1.903 + attributeArray.ignoreAttrFilter = function (a) { 1.904 + return (attributeArray.ignoreAttr[a.name] != a.value); 1.905 + }; 1.906 + attributeArray.compliant = false; 1.907 + attributeArray.renames = { 1.908 + "class": "className", 1.909 + "checked": "defaultChecked", 1.910 + "usemap": "useMap", 1.911 + "for": "htmlFor", 1.912 + "readonly": "readOnly", 1.913 + "colspan": "colSpan", 1.914 + "bgcolor": "bgColor" 1.915 + }; 1.916 + } else { 1.917 + attributeArray = function (node) { 1.918 + /*** 1.919 + 1.920 + Return an array of attributes for a given node, 1.921 + filtering out attributes that don't belong for 1.922 + that are inserted by "Certain Browsers". 1.923 + 1.924 + ***/ 1.925 + return node.attributes; 1.926 + }; 1.927 + attributeArray.compliant = true; 1.928 + attributeArray.renames = {}; 1.929 + } 1.930 + this.attributeArray = attributeArray; 1.931 + 1.932 + // FIXME: this really belongs in Base, and could probably be cleaner 1.933 + var _deprecated = function(fromModule, arr) { 1.934 + var modules = arr[1].split('.'); 1.935 + var str = ''; 1.936 + var obj = {}; 1.937 + 1.938 + str += 'if (!MochiKit.' + modules[1] + ') { throw new Error("'; 1.939 + str += 'This function has been deprecated and depends on MochiKit.'; 1.940 + str += modules[1] + '.");}'; 1.941 + str += 'return MochiKit.' + modules[1] + '.' + arr[0]; 1.942 + str += '.apply(this, arguments);'; 1.943 + 1.944 + obj[modules[2]] = new Function(str); 1.945 + MochiKit.Base.update(MochiKit[fromModule], obj); 1.946 + } 1.947 + for (var i; i < MochiKit.DOM.DEPRECATED.length; i++) { 1.948 + _deprecated('DOM', MochiKit.DOM.DEPRECATED[i]); 1.949 + } 1.950 + 1.951 + // shorthand for createDOM syntax 1.952 + var createDOMFunc = this.createDOMFunc; 1.953 + /** @id MochiKit.DOM.UL */ 1.954 + this.UL = createDOMFunc("ul"); 1.955 + /** @id MochiKit.DOM.OL */ 1.956 + this.OL = createDOMFunc("ol"); 1.957 + /** @id MochiKit.DOM.LI */ 1.958 + this.LI = createDOMFunc("li"); 1.959 + /** @id MochiKit.DOM.TD */ 1.960 + this.TD = createDOMFunc("td"); 1.961 + /** @id MochiKit.DOM.TR */ 1.962 + this.TR = createDOMFunc("tr"); 1.963 + /** @id MochiKit.DOM.TBODY */ 1.964 + this.TBODY = createDOMFunc("tbody"); 1.965 + /** @id MochiKit.DOM.THEAD */ 1.966 + this.THEAD = createDOMFunc("thead"); 1.967 + /** @id MochiKit.DOM.TFOOT */ 1.968 + this.TFOOT = createDOMFunc("tfoot"); 1.969 + /** @id MochiKit.DOM.TABLE */ 1.970 + this.TABLE = createDOMFunc("table"); 1.971 + /** @id MochiKit.DOM.TH */ 1.972 + this.TH = createDOMFunc("th"); 1.973 + /** @id MochiKit.DOM.INPUT */ 1.974 + this.INPUT = createDOMFunc("input"); 1.975 + /** @id MochiKit.DOM.SPAN */ 1.976 + this.SPAN = createDOMFunc("span"); 1.977 + /** @id MochiKit.DOM.A */ 1.978 + this.A = createDOMFunc("a"); 1.979 + /** @id MochiKit.DOM.DIV */ 1.980 + this.DIV = createDOMFunc("div"); 1.981 + /** @id MochiKit.DOM.IMG */ 1.982 + this.IMG = createDOMFunc("img"); 1.983 + /** @id MochiKit.DOM.BUTTON */ 1.984 + this.BUTTON = createDOMFunc("button"); 1.985 + /** @id MochiKit.DOM.TT */ 1.986 + this.TT = createDOMFunc("tt"); 1.987 + /** @id MochiKit.DOM.PRE */ 1.988 + this.PRE = createDOMFunc("pre"); 1.989 + /** @id MochiKit.DOM.H1 */ 1.990 + this.H1 = createDOMFunc("h1"); 1.991 + /** @id MochiKit.DOM.H2 */ 1.992 + this.H2 = createDOMFunc("h2"); 1.993 + /** @id MochiKit.DOM.H3 */ 1.994 + this.H3 = createDOMFunc("h3"); 1.995 + /** @id MochiKit.DOM.BR */ 1.996 + this.BR = createDOMFunc("br"); 1.997 + /** @id MochiKit.DOM.HR */ 1.998 + this.HR = createDOMFunc("hr"); 1.999 + /** @id MochiKit.DOM.LABEL */ 1.1000 + this.LABEL = createDOMFunc("label"); 1.1001 + /** @id MochiKit.DOM.TEXTAREA */ 1.1002 + this.TEXTAREA = createDOMFunc("textarea"); 1.1003 + /** @id MochiKit.DOM.FORM */ 1.1004 + this.FORM = createDOMFunc("form"); 1.1005 + /** @id MochiKit.DOM.P */ 1.1006 + this.P = createDOMFunc("p"); 1.1007 + /** @id MochiKit.DOM.SELECT */ 1.1008 + this.SELECT = createDOMFunc("select"); 1.1009 + /** @id MochiKit.DOM.OPTION */ 1.1010 + this.OPTION = createDOMFunc("option"); 1.1011 + /** @id MochiKit.DOM.OPTGROUP */ 1.1012 + this.OPTGROUP = createDOMFunc("optgroup"); 1.1013 + /** @id MochiKit.DOM.LEGEND */ 1.1014 + this.LEGEND = createDOMFunc("legend"); 1.1015 + /** @id MochiKit.DOM.FIELDSET */ 1.1016 + this.FIELDSET = createDOMFunc("fieldset"); 1.1017 + /** @id MochiKit.DOM.STRONG */ 1.1018 + this.STRONG = createDOMFunc("strong"); 1.1019 + /** @id MochiKit.DOM.CANVAS */ 1.1020 + this.CANVAS = createDOMFunc("canvas"); 1.1021 + 1.1022 + /** @id MochiKit.DOM.$ */ 1.1023 + this.$ = this.getElement; 1.1024 + 1.1025 + this.EXPORT_TAGS = { 1.1026 + ":common": this.EXPORT, 1.1027 + ":all": m.concat(this.EXPORT, this.EXPORT_OK) 1.1028 + }; 1.1029 + 1.1030 + m.nameFunctions(this); 1.1031 + 1.1032 + } 1.1033 +}); 1.1034 + 1.1035 + 1.1036 +MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); 1.1037 + 1.1038 +// 1.1039 +// XXX: Internet Explorer blows 1.1040 +// 1.1041 +if (MochiKit.__export__) { 1.1042 + withWindow = MochiKit.DOM.withWindow; 1.1043 + withDocument = MochiKit.DOM.withDocument; 1.1044 +} 1.1045 + 1.1046 +MochiKit.Base._exportSymbols(this, MochiKit.DOM);