// Developed by Robert Nyman/DOMAssistant team, code/licensing: http://code.google.com/p/domassistant/, documentation: http://www.domassistant.com/documentation, version 2.7.1.1 var DOMAssistant = function () { var HTMLArray = function () { // Constructor }; var isIE = /*@cc_on!@*/false; var cachedElms = []; var camel = { "accesskey": "accessKey", "class": "className", "colspan": "colSpan", "for": "htmlFor", "maxlength": "maxLength", "readonly": "readOnly", "rowspan": "rowSpan", "tabindex": "tabIndex", "valign": "vAlign", "cellspacing": "cellSpacing", "cellpadding": "cellPadding" }; var pushAll = function (set1, set2) { for (var j=0, jL=set2.length; j add)? (start - add) % add : ((start === add)? 0 : start); } else if (pseudoValue[8]) { // -an+b add = pseudoValue[10]? parseInt(pseudoValue[10], 10) : 1; start = max = parseInt(pseudoValue[11], 10); while (start > add) { start -= add; } modVal = (max > add)? (max - add) % add : ((max === add)? 0 : max); } } return { start: start, add: add, max: max, modVal: modVal }; }; if (document.evaluate) { var ns = { xhtml: "http://www.w3.org/1999/xhtml" }; var prefix = (document.documentElement.namespaceURI === ns.xhtml)? "xhtml:" : ""; var nsResolver = function lookupNamespaceURI (prefix) { return ns[prefix] || null; }; DOMAssistant.cssSelection = function (cssRule) { var cssRules = cssRule.replace(/\s*(,)\s*/g, "$1").split(","); var elm = new HTMLArray(); var currentRule, identical, cssSelectors, xPathExpression, cssSelector, splitRule, sequence; var cssSelectorRegExp = /^(\w+)?(#[\w\u00C0-\uFFFF\-\_]+|(\*))?((\.[\w\u00C0-\uFFFF\-_]+)*)?((\[\w+(\^|\$|\*|\||~)?(=([\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\-]*))\))?)*)?(>|\+|~)?/; var selectorSplitRegExp = new RegExp("(?:\\[[^\\[]*\\]|\\(.*\\)|[^\\s\\+>~\\[\\(])+|[\\+>~]", "g"); function attrToXPath (match, p1, p2, p3) { p3 = p3.replace(/^["'](.*)["']$/, "$1"); switch (p2) { case "^": return "starts-with(@" + p1 + ", \"" + p3 + "\")"; case "$": return "substring(@" + p1 + ", (string-length(@" + p1 + ") - " + (p3.length - 1) + "), " + p3.length + ") = \"" + p3 + "\""; case "*": return "contains(concat(\" \", @" + p1 + ", \" \"), \"" + p3 + "\")"; case "|": return "(@" + p1 + "=\"" + p3 + "\" or starts-with(@" + p1 + ", \"" + p3 + "-\"))"; case "~": return "contains(concat(\" \", @" + p1 + ", \" \"), \" " + p3 + " \")"; default: return "@" + p1 + (p3? "=\"" + p3 + "\"" : ""); } } function pseudoToXPath (tag, pseudoClass, pseudoValue) { tag = (/\-child$/.test(pseudoClass))? "*" : tag; var xpath = "", pseudo = pseudoClass.split("-"); switch (pseudo[0]) { case "first": xpath = "not(preceding-sibling::" + tag + ")"; break; case "last": xpath = "not(following-sibling::" + tag + ")"; break; case "only": xpath = "not(preceding-sibling::" + tag + " or following-sibling::" + tag + ")"; break; case "nth": if (!/^n$/.test(pseudoValue)) { var position = ((pseudo[1] === "last")? "(count(following-sibling::" : "(count(preceding-sibling::") + tag + ") + 1)"; sequence = getSequence(pseudoValue); if (sequence) { if (sequence.start === sequence.max) { xpath = position + " = " + sequence.start; } else { xpath = position + " mod " + sequence.add + " = " + sequence.modVal + ((sequence.start > 1)? " and " + position + " >= " + sequence.start : "") + ((sequence.max > 0)? " and " + position + " <= " + sequence.max: ""); } } } break; case "empty": xpath = "count(child::*) = 0 and string-length(text()) = 0"; break; case "contains": xpath = "contains(., \"" + pseudoValue.replace(/^["'](.*)["']$/, "$1") + "\")"; break; case "enabled": xpath = "not(@disabled)"; break; case "disabled": xpath = "@disabled"; break; case "checked": xpath = "@checked=\"checked\""; // Doesn't work in Opera 9.24 break; case "target": var hash = document.location.hash.slice(1); xpath = "@name=\"" + hash + "\" or @id=\"" + hash + "\""; break; case "not": if (/^(:\w+[\w\-]*)$/.test(pseudoValue)) { xpath = "not(" + pseudoToXPath(tag, pseudoValue.slice(1)) + ")"; } else { pseudoValue = pseudoValue.replace(/^\[#([\w\u00C0-\uFFFF\-\_]+)\]$/, "[id=$1]"); var notSelector = pseudoValue.replace(/^(\w+)/, "self::$1"); notSelector = notSelector.replace(/^\.([\w\u00C0-\uFFFF\-_]+)/g, "contains(concat(\" \", @class, \" \"), \" $1 \")"); notSelector = notSelector.replace(/\[(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+)?\]/g, attrToXPath); xpath = "not(" + notSelector + ")"; } break; default: xpath = "@" + pseudoClass + "=\"" + pseudoValue + "\""; break; } return xpath; } for (var i=0; (currentRule=cssRules[i]); i++) { if (i > 0) { identical = false; for (var x=0, xl=i; x": xPathExpression += "/child::"; break; case "+": xPathExpression += "/following-sibling::*[1]/self::"; break; case "~": xPathExpression += "/following-sibling::"; break; } } else { xPathExpression += (j > 0 && /(>|\+|~)/.test(cssSelectors[j-1]))? splitRule.tag : ("/descendant::" + splitRule.tag); } if (splitRule.id) { xPathExpression += "[@id = \"" + splitRule.id.replace(/^#/, "") + "\"]"; } if (splitRule.allClasses) { xPathExpression += splitRule.allClasses.replace(/\.([\w\u00C0-\uFFFF\-_]+)/g, "[contains(concat(\" \", @class, \" \"), \" $1 \")]"); } if (splitRule.allAttr) { xPathExpression += splitRule.allAttr.replace(/(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+|"[^"]*"|'[^']*')?/g, attrToXPath); } if (splitRule.allPseudos) { var pseudoSplitRegExp = /:(\w[\w\-]*)(\(([^\)]+)\))?/; splitRule.allPseudos = splitRule.allPseudos.match(/(:\w+[\w\-]*)(\([^\)]+\))?/g); for (var k=0, kl=splitRule.allPseudos.length; k|\+|~)$/; var cssSelectorRegExp = /^(\w+)?(#[\w\u00C0-\uFFFF\-\_]+|(\*))?((\.[\w\u00C0-\uFFFF\-_]+)*)?((\[\w+(\^|\$|\*|\||~)?(=([\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\-]*))\))?)*)?/; var selectorSplitRegExp; try { selectorSplitRegExp = new RegExp("(?:\\[[^\\[]*\\]|\\(.*\\)|[^\\s\\+>~\\[\\(])+|[\\+>~]", "g"); } catch (e) { selectorSplitRegExp = /[^\s]+/g; } function clearAdded (elm) { elm = elm || prevElm; for (var n=0, nl=elm.length; n 0) { identical = false; for (var b=0, bl=a; b 0 && childOrSiblingRefRegExp.test(rule)) { childOrSiblingRef = childOrSiblingRefRegExp.exec(rule); if (childOrSiblingRef) { nextTag = /^\w+/.exec(cssSelectors[i+1]); if (nextTag) { nextTag = nextTag[0]; nextRegExp = new RegExp("(^|\\s)" + nextTag + "(\\s|$)", "i"); } for (var j=0, prevRef; (prevRef=prevElm[j]); j++) { switch (childOrSiblingRef[0]) { case ">": var children = getElementsByTagName(nextTag, prevRef); for (var k=0, child; (child=children[k]); k++) { if (child.parentNode === prevRef) { matchingElms[matchingElms.length] = child; } } break; case "+": while ((prevRef = prevRef.nextSibling) && prevRef.nodeType !== 1) {} if (prevRef) { if (!nextTag || nextRegExp.test(prevRef.nodeName)) { matchingElms[matchingElms.length] = prevRef; } } break; case "~": while ((prevRef = prevRef.nextSibling) && !prevRef.added) { if (!nextTag || nextRegExp.test(prevRef.nodeName)) { prevRef.added = true; matchingElms[matchingElms.length] = prevRef; } } break; } } prevElm = matchingElms; clearAdded(); rule = cssSelectors[++i]; if (/^\w+$/.test(rule)) { continue; } prevElm.skipTag = true; } } var cssSelector = cssSelectorRegExp.exec(rule); var splitRule = { tag : (!cssSelector[1] || cssSelector[3] === "*")? "*" : cssSelector[1], id : (cssSelector[3] !== "*")? cssSelector[2] : null, allClasses : cssSelector[4], allAttr : cssSelector[6], allPseudos : cssSelector[11] }; if (splitRule.id) { var DOMElm = document.getElementById(splitRule.id.replace(/#/, "")); if (DOMElm) { matchingElms = [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 && ajaxObj.params)? ("&" + ajaxObj.params) : ""); } return DOMAssistant.AJAX.makeCall.call(this, ajaxObj); }, get : function (url, callback, addToContent) { var ajaxObj = createAjaxObj(url, "GET", callback, addToContent); return DOMAssistant.AJAX.makeCall.call(this, ajaxObj); }, post : function (url, callback) { var ajaxObj = createAjaxObj(url, "POST", callback); return DOMAssistant.AJAX.makeCall.call(this, ajaxObj); }, load : function (url, addToContent) { DOMAssistant.AJAX.get.call(this, url, DOMAssistant.AJAX.replaceWithAJAXContent, addToContent); }, makeCall : function (ajaxObj) { var XMLHttp = DOMAssistant.AJAX.initRequest(); if (XMLHttp) { globalXMLHttp = XMLHttp; var ajaxCall = function (elm) { var url = ajaxObj.url; var method = ajaxObj.method || "GET"; var callback = ajaxObj.callback; var params = ajaxObj.params; var headers = ajaxObj.headers; var responseType = ajaxObj.responseType || "text"; var addToContent = ajaxObj.addToContent; XMLHttp.open(method, url, true); XMLHttp.setRequestHeader("AJAX", "true"); XMLHttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); if (method === "POST") { var contentLength = params? params.length : 0; XMLHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); XMLHttp.setRequestHeader("Content-length", contentLength); if (XMLHttp.overrideMimeType) { XMLHttp.setRequestHeader("Connection", "close"); } } for (var i in headers) { if (typeof i === "string") { XMLHttp.setRequestHeader(i, headers[i]); } } if (typeof callback === "function") { XMLHttp.onreadystatechange = function () { if (XMLHttp.readyState === 4) { var response = (/xml/i.test(responseType))? XMLHttp.responseXML : XMLHttp.responseText; callback.call(elm, response, addToContent); readyState = 4; status = XMLHttp.status; statusText = XMLHttp.statusText; globalXMLHttp = null; XMLHttp = null; } }; } XMLHttp.send(params); }(this); } return this; }, replaceWithAJAXContent : function (content, add) { if (add) { this.innerHTML += content; } else { var elms = this.all || this.getElementsByTagName("*"); for (var i=0, elm, attr; (elm=elms[i]); i++) { attr = elm.attributes; if (attr) { for (var j=0, jl=attr.length, att; j", " " + 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 DOMAssistant.$(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) { if (typeof content === "string" || typeof content === "number") { this.innerHTML += content; } else if ((typeof content === "object") || (typeof content === "function" && typeof content.nodeName !== "undefined")) { this.appendChild(content); } return this; }, replaceContent : function (newContent) { var children = this.all || this.getElementsByTagName("*"); for (var i=0, child, attr; (child=children[i]); i++) { attr = child.attributes; if (attr) { for (var j=0, jl=attr.length, att; j<\/script>"); document.getElementById("ieScriptLoad").onreadystatechange = function() { if (this.readyState === "complete") { DOMHasLoaded(); } }; } @end @*/ /* Mozilla/Opera 9 */ 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