// Developed by Robert Nyman/DOMAssistant team, code/licensing: http://code.google.com/p/domassistant/, documentation: http://www.domassistant.com/documentation, version 2.7 var DOMAssistant = function () { var HTMLArray = function () { // Constructor }; var isIE = /*@cc_on!@*/false; var cachedElms = []; var pushAll = function (set1, set2) { for (var j=0, jL=set2.length; j add)? (start - add) % add : ((start === add)? 0 : start); } else if (pseudoValue[10]) { // -an+b add = pseudoValue[12]? parseInt(pseudoValue[12], 10) : 1; start = max = parseInt(pseudoValue[13], 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 }; }, $ : function () { var elm = new HTMLArray(); if (document.getElementById) { var arg = arguments[0]; if (typeof arg === "string") { arg = arg.replace(/^[^#]*(#)/, "$1"); if (/^#[\w\u00C0-\uFFFF\-\_]+$/.test(arg)) { var idMatch = DOMAssistant.$$(arg.substr(1), false); if (idMatch) { elm.push(idMatch); } } else { elm = DOMAssistant.cssSelection.call(document, arg); } } else if (typeof arg === "object") { elm = (arguments.length === 1)? DOMAssistant.$$(arg) : pushAll(elm, arguments); } } return elm; }, $$ : function (id, addMethods) { var elm = (typeof id === "object")? id : document.getElementById(id); var applyMethods = addMethods || true; if (typeof id === "string" && elm && elm.id !== id) { elm = null; for (var i=0, item; (item=document.all[i]); i++) { if (item.id === id) { elm = item; break; } } } if (elm && applyMethods) { DOMAssistant.addMethodsToElm(elm); } return elm; }, cssSelection : function (cssRule) { if (document.evaluate) { 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) { 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) { var xpath = ""; switch (pseudoClass) { case "first-child": xpath = "not(preceding-sibling::*)"; break; case "first-of-type": xpath = "not(preceding-sibling::" + tag + ")"; break; case "last-child": xpath = "not(following-sibling::*)"; break; case "last-of-type": xpath = "not(following-sibling::" + tag + ")"; break; case "only-child": xpath = "not(preceding-sibling::* or following-sibling::*)"; break; case "only-of-type": xpath = "not(preceding-sibling::" + tag + " or following-sibling::" + tag + ")"; break; case "nth-child": if (!/^n$/.test(pseudoValue)) { sequence = DOMAssistant.getSequence(pseudoValue); if (sequence) { if (sequence.start === sequence.max) { xpath = "count(preceding-sibling::*) = " + (sequence.start - 1); } else { xpath = "(count(preceding-sibling::*) + 1) mod " + sequence.add + " = " + sequence.modVal + ((sequence.start > 1)? " and count(preceding-sibling::*) >= " + (sequence.start - 1) : "") + ((sequence.max > 0)? " and count(preceding-sibling::*) <= " + (sequence.max - 1): ""); } } } break; case "nth-of-type": if (!/^n$/.test(pseudoValue)) { sequence = DOMAssistant.getSequence(pseudoValue); if (sequence) { if (sequence.start === sequence.max) { xpath = pseudoValue; } 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 + "')"; 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 "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[10] }; 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.elmsByTag("*"); for (var i=0, elm, attr; (elm=elms[i]); i++) { attr = elm.attributes; if (attr) { for (var j=0, jl=attr.length; j=0; i--) { child = this.childNodes[i]; attr = child.attributes; if (attr) { for (var j=0, jl=attr.length; 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