// Developed by Robert Nyman/DOMAssistant team, code/licensing: http://domassistant.googlecode.com/, documentation: http://www.domassistant.com/documentation, version 2.8 var DOMAssistant = function () { var HTMLArray = function () { // Constructor }, w = window, _$ = w.$, _$$ = w.$$, isIE = /*@cc_on!@*/false, isIE5 = isIE && parseFloat(navigator.appVersion) < 6, sort, tagCache = {}, lastCache = {}, useCache = true, slice = Array.prototype.slice, camel = { "accesskey": "accessKey", "class": "className", "colspan": "colSpan", "for": "htmlFor", "maxlength": "maxLength", "readonly": "readOnly", "rowspan": "rowSpan", "tabindex": "tabIndex", "valign": "vAlign", "cellspacing": "cellSpacing", "cellpadding": "cellPadding" }, regex = { rules: /\s*,\s*/g, selector: /^(\w+|\*)?(#[\w\u00C0-\uFFFF\-=$]+)?((\.[\w\u00C0-\uFFFF\-]+)*)?((\[\w+\s*([~^$*|])?(=\s*([-\w\u00C0-\uFFFF\s.]+|"[^"]*"|'[^']*'))?\]+)*)?((:\w[-\w]*(\((odd|even|\-?\d*n?([-+]\d+)?|[:#]?[-\w\u00C0-\uFFFF.]+|"[^"]*"|'[^']*'|((\w*\.[-\w\u00C0-\uFFFF]+)*)?|(\[#?\w+([~^$*|])?=?[-\w\u00C0-\uFFFF\s.'"]+\]+)|(:\w[-\w]*\(.+\)))\))?)*)?([+>~])?/, selectorSplit: /(?:\[.*\]|\(.*\)|[^\s+>~[(])+|[+>~]/g, id: /^#([-\w\u00C0-\uFFFF=$]+)$/, tag: /^\w+/, relation: /^[+>~]$/, pseudo: /^:(\w[-\w]*)(\((.+)\))?$/, pseudos: /:(\w[-\w]*)(\((([^(]+)|([^(]+\([^(]+)\))\))?/g, attribs: /\[(\w+)\s*([~^$*|])?(=)?\s*([^\[\]]*|"[^"]*"|'[^']*')?\](?=$|\[|:|\s)/g, classes: /\.([-\w\u00C0-\uFFFF]+)/g, quoted: /^["'](.*)["']$/, nth: /^((odd|even)|([1-9]\d*)|((([1-9]\d*)?)n([-+]\d+)?)|(-(([1-9]\d*)?)n\+(\d+)))$/, special: /(:check|:enabl|\bselect)ed\b/ }, navigate = function (node, direction, checkTagName) { var oldName = node.tagName; while ((node = node[direction + "Sibling"]) && (node.nodeType !== 1 || (checkTagName? node.tagName !== oldName : node.tagName === "!"))) {} return node; }, def = function (obj) { return typeof obj !== "undefined"; }, sortDocumentOrder = function (elmArray) { return (sortDocumentOrder = elmArray[0].compareDocumentPosition? function (elmArray) { return elmArray.sort( function (a, b) { return 3 - (a.compareDocumentPosition(b) & 6); } ); } : isIE? function (elmArray) { return elmArray.sort( function (a, b) { return a.sourceIndex - b.sourceIndex; } ); } : function (elmArray) { return elmArray.sort( function (a, b) { var range1 = document.createRange(), range2 = document.createRange(); range1.setStart(a, 0); range1.setEnd(a, 0); range2.setStart(b, 0); range2.setEnd(b, 0); return range1.compareBoundaryPoints(Range.START_TO_END, range2); } ); })(elmArray); }; var pushAll = function (set1, set2) { set1.push.apply(set1, slice.apply(set2)); return set1; }; if (isIE) { pushAll = function (set1, set2) { if (set2.slice) { return set1.concat(set2); } var i=0, item; while ((item = set2[i++])) { set1[set1.length] = item; } return set1; }; } return { isIE : isIE, camel : camel, def : def, allMethods : [], publicMethods : [ "prev", "next", "hasChild", "cssSelect", "elmsByClass", "elmsByAttribute", "elmsByTag" ], harmonize : function () { w.$ = _$; w.$$ = _$$; return this; }, initCore : function () { this.applyMethod.call(w, "$", this.$); this.applyMethod.call(w, "$$", this.$$); w.DOMAssistant = this; if (isIE) { HTMLArray = Array; } HTMLArray.prototype = []; (function (H) { H.each = function (fn, context) { for (var i=0, il=this.length; i= add)? (start - add) % add : start; } else if (pseudoVal[8]) { // -an+b add = pseudoVal[10]? parseInt(pseudoVal[10], 10) : 1; start = max = parseInt(pseudoVal[11], 10); while (start > add) { start -= add; } modVal = (max >= add)? (max - add) % add : max; } return { start: start, add: add, max: max, modVal: modVal }; }, cssByDOM : function (cssRule) { var prevParents, currentRule, cssSelectors, childOrSiblingRef, nextTag, nextRegExp, current, previous, prevParent, notElm, addElm, iteratorNext, childElm, sequence, anyTag, elm = new HTMLArray(), index = elm.indexOf, prevElm = [], matchingElms = [], cssRules = cssRule.replace(regex.rules, ",").split(","), splitRule = {}; function clearAdded (elm) { elm = elm || prevElm; for (var n=elm.length; n--;) { elm[n].added = null; elm[n].removeAttribute("added"); } } function clearChildElms () { for (var n=prevParents.length; n--;) { prevParents[n].childElms = null; } } function subtractArray (arr1, arr2) { for (var i=0, src1; (src1=arr1[i]); i++) { var found = false; for (var j=0, src2; (src2=arr2[j]); j++) { if (src2 === src1) { found = true; arr2.splice(j, 1); break; } } if (found) { arr1.splice(i--, 1); } } return arr1; } function getAttr (elm, attr) { return (isIE || regex.special.test(attr))? elm[camel[attr.toLowerCase()] || attr] : elm.getAttribute(attr, 2); } function attrToRegExp (attrVal, substrOperator) { attrVal = attrVal? attrVal.replace(regex.quoted, "$1").replace(/(\.|\[|\])/g, "\\$1") : null; return { "^": "^" + attrVal, "$": attrVal + "$", "*": attrVal, "|": "^" + attrVal + "(\\-\\w+)*$", "~": "\\b" + attrVal + "\\b" }[substrOperator] || (attrVal !== null? "^" + attrVal + "$" : attrVal); } function notComment(el) { return (el || this).tagName !== "!"; } function getTags (tag, context) { return isIE5? (tag === "*"? context.all : context.all.tags(tag)) : context.getElementsByTagName(tag); } function getElementsByTagName (tag, parent) { tag = tag || "*"; parent = parent || document; return (parent === document || parent.lastModified)? tagCache[tag] || (tagCache[tag] = getTags(tag, document)) : getTags(tag, parent); } function getElementsByPseudo (previousMatch, pseudoClass, pseudoValue) { prevParents = []; var pseudo = pseudoClass.split("-"), matchingElms = [], idx = 0, checkNodeName = /\-of\-type$/.test(pseudoClass), recur, match = { first: function(el) { return !navigate(el, "previous", checkNodeName); }, last: function(el) { return !navigate(el, "next", checkNodeName); }, empty: function(el) { return !el.firstChild; }, enabled: function(el) { return !el.disabled && el.type !== "hidden"; }, disabled: function(el) { return el.disabled; }, checked: function(el) { return el.checked; }, contains: function(el) { return (el.innerText || el.textContent || "").indexOf(pseudoValue.replace(regex.quoted, "$1")) > -1; }, other: function(el) { return getAttr(el, pseudoClass) === pseudoValue; } }; function basicMatch(key) { while ((previous=previousMatch[idx++])) { if (notComment(previous) && match[key](previous)) { matchingElms[matchingElms.length] = previous; } } return matchingElms; } var word = pseudo[0] || null; if (word && match[word]) { return basicMatch(word); } switch (word) { case "only": var kParent, kTag; while ((previous=previousMatch[idx++])) { prevParent = previous.parentNode; var q = previous.nodeName; if (prevParent !== kParent || q !== kTag) { if (match.first(previous) && match.last(previous)) { matchingElms[matchingElms.length] = previous; } kParent = prevParent; kTag = q; } } break; case "nth": if (pseudoValue === "n") { matchingElms = previousMatch; } else { var direction = (pseudo[1] === "last")? ["lastChild", "previousSibling"] : ["firstChild", "nextSibling"]; sequence = DOMAssistant.getSequence(pseudoValue); if (sequence) { while ((previous=previousMatch[idx++])) { prevParent = previous.parentNode; prevParent.childElms = prevParent.childElms || {}; var p = previous.nodeName; if (!prevParent.childElms[p]) { var childCount = 0; iteratorNext = sequence.start; childElm = prevParent[direction[0]]; while (childElm && (sequence.max < 0 || iteratorNext <= sequence.max)) { var c = childElm.nodeName; if ((checkNodeName && c === p) || (!checkNodeName && childElm.nodeType === 1 && c !== "!")) { if (++childCount === iteratorNext) { if (c === p) { matchingElms[matchingElms.length] = childElm; } iteratorNext += sequence.add; } } childElm = childElm[direction[1]]; } if (anyTag) { sort++; } prevParent.childElms[p] = true; prevParents[prevParents.length] = prevParent; } } clearChildElms(); } } break; case "target": var hash = document.location.hash.slice(1); if (hash) { while ((previous=previousMatch[idx++])) { if (getAttr(previous, "name") === hash || getAttr(previous, "id") === hash) { matchingElms[matchingElms.length] = previous; break; } } } break; case "not": if ((recur = regex.pseudo.exec(pseudoValue))) { matchingElms = subtractArray(previousMatch, getElementsByPseudo(previousMatch, recur[1]? recur[1].toLowerCase() : null, recur[3] || null)); } else { for (var re in regex) { if (regex[re].lastIndex) { regex[re].lastIndex = 0; } } pseudoValue = pseudoValue.replace(regex.id, "[id=$1]"); var notTag = regex.tag.exec(pseudoValue); var notClass = regex.classes.exec(pseudoValue); var notAttr = regex.attribs.exec(pseudoValue); var notRegExp = new RegExp(notAttr? attrToRegExp(notAttr[4], notAttr[2]) : "(^|\\s)" + (notTag? notTag[0] : notClass? notClass[1] : "") + "(\\s|$)", "i"); while ((notElm=previousMatch[idx++])) { addElm = null; if (notTag && !notRegExp.test(notElm.nodeName) || notClass && !notRegExp.test(notElm.className)) { addElm = notElm; } else if (notAttr) { var att = getAttr(notElm, notAttr[1]); if (!def(att) || att === false || typeof att === "string" && !notRegExp.test(att)) { addElm = notElm; } } if (addElm && !addElm.added) { addElm.added = true; matchingElms[matchingElms.length] = addElm; } } } break; default: return basicMatch("other"); } return matchingElms; } function pushUnique(set1, set2) { var i=0, s=set1, item; while ((item = set2[i++])) { if (!s.length || s.indexOf(item) < 0) { set1.push(item); } } return set1; } sort = -1; for (var a=0, tagBin=[]; (currentRule=cssRules[a]); a++) { if (!(cssSelectors = currentRule.match(regex.selectorSplit)) || a && index.call(cssRules.slice(0, a), currentRule) > -1) { continue; } prevElm = [this]; for (var i=0, rule; (rule=cssSelectors[i]); i++) { matchingElms = []; if ((childOrSiblingRef = regex.relation.exec(rule))) { var idElm = null, nextWord = cssSelectors[i+1]; if ((nextTag = regex.tag.exec(nextWord))) { nextTag = nextTag[0]; nextRegExp = new RegExp("(^|\\s)" + nextTag + "(\\s|$)", "i"); } else if (regex.id.test(nextWord)) { idElm = DOMAssistant.$(nextWord) || null; } for (var j=0, prevRef; (prevRef=prevElm[j]); j++) { switch (childOrSiblingRef[0]) { case ">": var children = idElm || getElementsByTagName(nextTag, prevRef); for (var k=0, child; (child=children[k]); k++) { if (child.parentNode === prevRef) { matchingElms[matchingElms.length] = child; } } break; case "+": if ((prevRef = navigate(prevRef, "next"))) { if ((idElm && idElm[0] === prevRef) || (!idElm && (!nextTag || nextRegExp.test(prevRef.nodeName)))) { matchingElms[matchingElms.length] = prevRef; } } break; case "~": while ((prevRef = prevRef.nextSibling) && !prevRef.added) { if ((idElm && idElm[0] === prevRef) || (!idElm && (!nextTag || nextRegExp.test(prevRef.nodeName)))) { prevRef.added = true; matchingElms[matchingElms.length] = prevRef; } } break; } } prevElm = matchingElms; clearAdded(); rule = cssSelectors[++i]; if (/^\w+$/.test(rule) || regex.id.test(rule)) { continue; } prevElm.skipTag = true; } var cssSelector = regex.selector.exec(rule); splitRule = { tag : cssSelector[1]? cssSelector[1] : "*", id : cssSelector[2], allClasses : cssSelector[3], allAttr : cssSelector[5], allPseudos : cssSelector[10] }; anyTag = (splitRule.tag === "*"); if (splitRule.id) { var u = 0, DOMElm = document.getElementById(splitRule.id.slice(1)); if (DOMElm) { while (prevElm[u] && !DOMAssistant.hasChild.call(prevElm[u], DOMElm)) { u++; } matchingElms = (u < prevElm.length && (anyTag || splitRule.tag === DOMElm.tagName.toLowerCase()))? [DOMElm] : []; } prevElm = matchingElms; } else if (splitRule.tag && !prevElm.skipTag) { if (i===0 && !matchingElms.length && prevElm.length === 1) { prevElm = matchingElms = pushAll([], getElementsByTagName(splitRule.tag, prevElm[0])); } else { for (var l=0, ll=prevElm.length, tagCollectionMatches, tagMatch; l= 0 || index.call(tagBin, "*") >= 0))? pushUnique : pushAll)(elm, prevElm); tagBin.push(splitRule.tag); if (isIE && anyTag) { elm = elm.filter(notComment); } } return ((elm.length > 1 && cssRules.length > 1) || sort > 0)? sortDocumentOrder(elm) : elm; }, cssByXpath : function (cssRule) { var ns = { xhtml: "http://www.w3.org/1999/xhtml" }, prefix = (document.documentElement.namespaceURI === ns.xhtml)? "xhtml:" : "", nsResolver = function lookupNamespaceURI (prefix) { return ns[prefix] || null; }; DOMAssistant.cssByXpath = function (cssRule) { var currentRule, cssSelectors, xPathExpression, cssSelector, splitRule, sequence, elm = new HTMLArray(), cssRules = cssRule.replace(regex.rules, ",").split(","); function attrToXPath (wrap) { var pre = wrap? "[" : "", post = wrap? "]" : ""; return function (match, p1, p2, p3, p4) { p4 = (p4 || "").replace(regex.quoted, "$1"); if (p1 === p4 && p1 === "readonly") { p3 = null; } return pre + ({ "^": "starts-with(@" + p1 + ", \"" + p4 + "\")", "$": "substring(@" + p1 + ", (string-length(@" + p1 + ") - " + (p4.length - 1) + "), " + p4.length + ") = \"" + p4 + "\"", "*": "contains(concat(\" \", @" + p1 + ", \" \"), \"" + p4 + "\")", "|": "@" + p1 + "=\"" + p4 + "\" or starts-with(@" + p1 + ", \"" + p4 + "-\")", "~": "contains(concat(\" \", @" + p1 + ", \" \"), \" " + p4 + " \")" }[p2] || ("@" + p1 + (p3? "=\"" + p4 + "\"" : ""))) + post; }; } function pseudoToXPath (tag, pseudoClass, pseudoValue) { tag = /\-child$/.test(pseudoClass)? "*" : tag; var pseudo = pseudoClass.split("-"), position = ((pseudo[1] === "last")? "(count(following-sibling::" : "(count(preceding-sibling::") + tag + ") + 1)", recur, hash; switch (pseudo[0]) { case "nth": return (pseudoValue !== "n" && (sequence = DOMAssistant.getSequence(pseudoValue)))? ((sequence.start === sequence.max)? position + " = " + sequence.start : position + " mod " + sequence.add + " = " + sequence.modVal + ((sequence.start > 1)? " and " + position + " >= " + sequence.start : "") + ((sequence.max > 0)? " and " + position + " <= " + sequence.max: "")) : ""; case "not": return "not(" + ((recur = regex.pseudo.exec(pseudoValue))? pseudoToXPath(tag, recur[1]? recur[1].toLowerCase() : null, recur[3] || null) : pseudoValue.replace(regex.id, "[id=$1]").replace(regex.tag, "self::$0").replace(regex.classes, "contains(concat(\" \", @class, \" \"), \" $1 \")").replace(regex.attribs, attrToXPath())) + ")"; case "first": return "not(preceding-sibling::" + tag + ")"; case "last": return "not(following-sibling::" + tag + ")"; case "only": return "not(preceding-sibling::" + tag + " or following-sibling::" + tag + ")"; case "empty": return "not(child::*) and not(text())"; case "contains": return "contains(., \"" + pseudoValue.replace(regex.quoted, "$1") + "\")"; case "enabled": return "not(@disabled) and not(@type=\"hidden\")"; case "disabled": return "@disabled"; case "target": return "@name=\"" + (hash = document.location.hash.slice(1)) + "\" or @id=\"" + hash + "\""; default: return "@" + pseudoClass + "=\"" + pseudoValue + "\""; } } for (var i=0; (currentRule=cssRules[i]); i++) { if (!(cssSelectors = currentRule.match(regex.selectorSplit)) || i && elm.indexOf.call(cssRules.slice(0, i), currentRule) > -1) { continue; } xPathExpression = xPathExpression? xPathExpression + " | ." : "."; for (var j=0, jl=cssSelectors.length; j": "/", "+": "/following-sibling::*[1]/self::", "~": "/following-sibling::" }[splitRule.tagRelation] || "") : ((j > 0 && regex.relation.test(cssSelectors[j-1]))? splitRule.tag : ("//" + splitRule.tag))) + (splitRule.id || "").replace(regex.id, "[@id = \"$1\"]") + (splitRule.allClasses || "").replace(regex.classes, "[contains(concat(\" \", @class, \" \"), \" $1 \")]") + (splitRule.allAttr || "").replace(regex.attribs, attrToXPath(true)); if (splitRule.allPseudos) { var allPseudos = splitRule.allPseudos.match(regex.pseudos); for (var k=0, kl=allPseudos.length; k 0 && ajaxObj.params)? ("&" + ajaxObj.params) : ""); } return DOMAssistant.AJAX.makeCall.call(this, ajaxObj); }, get : function (url, callback, addToContent) { return DOMAssistant.AJAX.makeCall.call(this, createAjaxObj(url, "GET", callback, addToContent)); }, post : function (url, callback) { return DOMAssistant.AJAX.makeCall.call(this, createAjaxObj(url, "POST", callback)); }, load : function (url, addToContent) { this.get(url, DOMAssistant.AJAX.replaceWithAJAXContent, addToContent); }, makeCall : function (ajaxObj) { var XMLHttp = DOMAssistant.AJAX.initRequest(); if (XMLHttp) { globalXMLHttp = XMLHttp; (function (elm) { var url = ajaxObj.url, method = ajaxObj.method || "GET", callback = ajaxObj.callback, params = ajaxObj.params, headers = ajaxObj.headers, responseType = ajaxObj.responseType || "text", addToContent = ajaxObj.addToContent, timeout = ajaxObj.timeout || null, ex = ajaxObj.exception, timeoutId = null, done = false; XMLHttp.open(method, url, true); XMLHttp.setRequestHeader("AJAX", "true"); XMLHttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); if (method === "POST") { XMLHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); XMLHttp.setRequestHeader("Content-length", params? params.length : 0); if (XMLHttp.overrideMimeType) { XMLHttp.setRequestHeader("Connection", "close"); } } if (responseType === "json") { XMLHttp.setRequestHeader("Accept", "application/json, text/javascript, */*"); } for (var i in headers) { if (typeof i === "string") { XMLHttp.setRequestHeader(i, headers[i]); } } if (typeof callback === "function") { XMLHttp.onreadystatechange = function () { try { if (XMLHttp.readyState === 4 && !done) { window.clearTimeout(timeoutId); done = true; status = XMLHttp.status; statusText = XMLHttp.statusText; readyState = 4; if ((status || location.protocol !== "file:") && (status < 200 || status >= 300)) { throw new Error(statusText); } var response = /xml/i.test(responseType)? XMLHttp.responseXML : XMLHttp.responseText; if (/json/i.test(responseType) && !!response) { response = (typeof JSON === "object" && typeof JSON.parse === "function")? JSON.parse(response) : eval("(" + response + ")"); } globalXMLHttp = null; XMLHttp.onreadystatechange = function () {}; requestPool.push(XMLHttp); callback.call(elm, response, addToContent); } } catch (e) { globalXMLHttp = XMLHttp = null; if (typeof ex === "function") { ex.call(elm, e); ex = null; } } }; } XMLHttp.send(params); if (timeout) { timeoutId = window.setTimeout( function () { if (!done) { XMLHttp.abort(); done = true; if (typeof ex === "function") { readyState = 0; status = 408; statusText = "Request timeout"; globalXMLHttp = XMLHttp = null; ex.call(elm, new Error(statusText)); ex = null; } } }, timeout); } })(this); } return this; }, replaceWithAJAXContent : function (content, add) { if (add) { this.innerHTML += content; } else { DOMAssistant.cleanUp(this); this.innerHTML = content; } }, getReadyState : function () { return (globalXMLHttp && DOMAssistant.def(globalXMLHttp.readyState))? globalXMLHttp.readyState : readyState; }, getStatus : function () { return status; }, getStatusText : function () { return statusText; } }; }(); DOMAssistant.attach(DOMAssistant.AJAX); DOMAssistant.CSS = function () { var def = DOMAssistant.def, direct = { display: true }; return { addClass : function (className) { if (!this.hasClass(className)) { var currentClass = this.className; this.className = currentClass + (currentClass.length? " " : "") + className; } return this; }, removeClass : function (className) { return this.replaceClass(className); }, replaceClass : function (className, newClass) { var classToRemove = new RegExp(("(^|\\s)" + className + "(\\s|$)"), "i"); this.className = this.className.replace(classToRemove, function (match, p1, p2) { return newClass? (p1 + newClass + p2) : " "; }).replace(/^\s+|\s+$/g, ""); return this; }, hasClass : function (className) { return (" " + this.className + " ").indexOf(" " + className + " ") > -1; }, setStyle : function (style, value) { var css = this.style; if ("filters" in this && (typeof style === "string"? /opacity/i.test(style) : def(style.opacity))) { css.zoom = 1; css.filter = (css.filter || "").replace(/alpha\([^)]*\)/, "") + "alpha(opacity=" + (def(style.opacity)? style.opacity : value) * 100 + ")"; } if (def(css.cssText)) { var styleToSet = css.cssText; if (typeof style === "object") { for (var i in style) { if (typeof i === "string") { if (direct[i]) { css[i] = style[i]; } styleToSet += ";" + i + ":" + style[i]; } } } else { if (direct[style]) { css[style] = value; } styleToSet += ";" + style + ":" + value; } css.cssText = styleToSet; } return this; }, getStyle : function (cssRule) { var val = "", f; cssRule = cssRule.toLowerCase(); if (document.defaultView && document.defaultView.getComputedStyle) { val = document.defaultView.getComputedStyle(this, "").getPropertyValue(cssRule); } else if (this.currentStyle) { if ("filters" in this && cssRule === "opacity") { val = (f = this.style.filter || this.currentStyle.filter) && f.indexOf("opacity=") >= 0? parseFloat(f.match(/opacity=([^)]*)/)[1]) / 100 : 1; } else { cssRule = cssRule.replace(/^float$/, "styleFloat").replace(/\-(\w)/g, function (match, p1) { return p1.toUpperCase(); }); val = this.currentStyle[cssRule]; } if (val === "auto" && /^(width|height)$/.test(cssRule) && this.currentStyle.display !== "none") { val = this["offset" + cssRule.charAt(0).toUpperCase() + cssRule.substr(1)] + "px"; } } return val; } }; }(); DOMAssistant.attach(DOMAssistant.CSS); DOMAssistant.Content = function () { var D$ = DOMAssistant.$$; return { init : function () { DOMAssistant.setCache(false); }, create : function (name, attr, append, content) { var elm = D$(document.createElement(name)); if (attr) { elm = elm.setAttributes(attr); } if (DOMAssistant.def(content)) { elm.addContent(content); } if (append) { this.appendChild(elm); } return elm; }, setAttributes : function (attr) { if (DOMAssistant.isIE) { var setAttr = function (elm, att, val) { var attLower = att.toLowerCase(); switch (attLower) { case "name": case "type": case "multiple": return D$(document.createElement(elm.outerHTML.replace(new RegExp(attLower + "(=[a-zA-Z]+)?"), " ").replace(">", " " + attLower + "=" + val + ">"))); case "style": elm.style.cssText = val; return elm; default: elm[DOMAssistant.camel[attLower] || att] = val; return elm; } }; DOMAssistant.Content.setAttributes = function (attr) { var elem = this; var parent = this.parentNode; for (var i in attr) { if (typeof attr[i] === "string" || typeof attr[i] === "number") { var newElem = setAttr(elem, i, attr[i]); if (parent && /(name|type)/i.test(i)) { if (elem.innerHTML) { newElem.innerHTML = elem.innerHTML; } parent.replaceChild(newElem, elem); } elem = newElem; } } return elem; }; } else { DOMAssistant.Content.setAttributes = function (attr) { for (var i in attr) { if (/class/i.test(i)) { this.className = attr[i]; } else { this.setAttribute(i, attr[i]); } } return this; }; } return DOMAssistant.Content.setAttributes.call(this, attr); }, addContent : function (content) { var type = typeof content; if (type === "string" || type === "number") { if (!this.firstChild) { this.innerHTML = content; } else { var tmp = document.createElement("div"); tmp.innerHTML = content; for (var i=tmp.childNodes.length-1, last=null; i>=0; i--) { last = this.insertBefore(tmp.childNodes[i], last); } } } else if (type === "object" || (type === "function" && !!content.nodeName)) { this.appendChild(content); } return this; }, replaceContent : function (content) { DOMAssistant.cleanUp(this); return this.addContent(content); }, replace : function (content, returnNew) { var type = typeof content; if (type === "string" || type === "number") { var parent = this.parentNode; var tmp = DOMAssistant.Content.create.call(parent, "div", null, false, content); for (var i=tmp.childNodes.length; i--;) { parent.insertBefore(tmp.childNodes[i], this.nextSibling); } content = this.nextSibling; parent.removeChild(this); } else if (type === "object" || (type === "function" && !!content.nodeName)) { this.parentNode.replaceChild(content, this); } return returnNew? content : this; }, remove : function () { DOMAssistant.cleanUp(this); if (this.hasData()) { if (this.removeEvent) { this.removeEvent(); } this.unstore(); } this.parentNode.removeChild(this); return null; } }; }(); DOMAssistant.attach(DOMAssistant.Content); DOMAssistant.Events = function () { var handler, key = "_events", w3cMode = !!document.addEventListener, useCapture = { focus: true, blur: true }, translate = DOMAssistant.isIE? { focus: "activate", blur: "deactivate", mouseenter: "mouseover", mouseleave: "mouseout" } : { mouseenter: "mouseover", mouseleave: "mouseout" }, regex = { special: /^submit|reset|change|select$/i, mouseenterleave: /^mouse(enter|leave)$/i, dom: /^DOM/, on: /^on/i }, special = function (e) { return DOMAssistant.isIE && regex.special.test(e); }, fix = function (e) { return translate[e] || e; }, createEvent = function (e, type, target) { e = e || window.event || {}; if (e.event) { return e; } var event = { event: e, type: type || e.type, bubbles: e.bubbles || true, cancelable: e.cancelable || false, target: target || e.target || e.srcElement, clientX: e.clientX || 0, clientY: e.clientY || 0, altKey: e.altKey || false, ctrlKey: e.ctrlKey || false, shiftKey: e.shiftKey || false, button: e.button || null, timeStamp: +new Date(), preventDefault: function() { if (e.preventDefault) { e.preventDefault(); } this.returnValue = e.returnValue = false; }, stopPropagation: function() { if (e.stopPropagation) { e.stopPropagation(); } this.cancelBubble = e.cancelBubble = true; } }; if (event.target && 3 === event.target.nodeType) { // Safari textnode bug event.target = event.target.parentNode; } event.currentTarget = event.target; event.relatedTarget = e.relatedTarget || (e.fromElement === event.target? e.toElement : e.fromElement) || null; var de = document.documentElement, b = document.body; event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0)); event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); if ("number" === typeof e.which) { event.keyCode = e.keyCode; event.charCode = event.which = e.which; } else if (e.keyCode) { event.keyCode = event.charCode = e.keyCode; } return event; }; return { publicMethods : [ "triggerEvent", "addEvent", "removeEvent", "relayEvent", "unrelayEvent", "preventDefault", "cancelBubble" ], init : function () { DOMAssistant.preventDefault = this.preventDefault; DOMAssistant.cancelBubble = this.cancelBubble; handler = this.handleEvent; }, triggerEvent : function (evt, target, e) { var fevt = fix(evt), events = this.retrieve(key), event = e || createEvent(e, fevt, target || this); event.currentTarget = this; if (events && events[fevt]) { for (var i=0, iL=events[fevt].length; i<\/script>"); document.getElementById("ieScriptLoad").onreadystatechange = function() { if (this.readyState === "complete") { DOMHasLoaded(); } }; @end @*/ /* Mozilla, Chrome, Opera */ if (document.addEventListener) { document.addEventListener("DOMContentLoaded", DOMHasLoaded, false); } /* Safari, iCab, Konqueror */ if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) { DOMLoadTimer = setInterval(function () { if (/loaded|complete/i.test(document.readyState)) { DOMHasLoaded(); clearInterval(DOMLoadTimer); } }, 10); } /* Other web browsers */ window.onload = DOMHasLoaded; return { DOMReady : function () { for (var i=0, il=arguments.length, funcRef; i