diff options
Diffstat (limited to 'source/javascripts/libs/ie/DOMAssistantComplete-2.8.js')
-rw-r--r-- | source/javascripts/libs/ie/DOMAssistantComplete-2.8.js | 1529 |
1 files changed, 1529 insertions, 0 deletions
diff --git a/source/javascripts/libs/ie/DOMAssistantComplete-2.8.js b/source/javascripts/libs/ie/DOMAssistantComplete-2.8.js new file mode 100644 index 00000000..ddca30ed --- /dev/null +++ b/source/javascripts/libs/ie/DOMAssistantComplete-2.8.js @@ -0,0 +1,1529 @@ +// 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<il; i++) { + if (fn.call(context || this[i], this[i], i, this) === false) { + break; + } + } + return this; + }; + H.first = function () { + return def(this[0])? DOMAssistant.addMethodsToElm(this[0]) : null; + }; + H.end = function () { + return this.previousSet; + }; + H.indexOf = H.indexOf || function (elm) { + for (var i=0, il=this.length; i<il; i++) { + if (i in this && this[i] === elm) { + return i; + } + } + return -1; + }; + H.map = function (fn, context) { + var res = []; + for (var i=0, il=this.length; i<il; i++) { + if (i in this) { + res[i] = fn.call(context || this[i], this[i], i, this); + } + } + return res; + }; + H.filter = function (fn, context) { + var res = new HTMLArray(); + res.previousSet = this; + for (var i=0, il=this.length; i<il; i++) { + if (i in this && fn.call(context || this[i], this[i], i, this)) { + res.push(this[i]); + } + } + return res; + }; + H.every = function (fn, context) { + for (var i=0, il=this.length; i<il; i++) { + if (i in this && !fn.call(context || this[i], this[i], i, this)) { + return false; + } + } + return true; + }; + H.some = function (fn, context) { + for (var i=0, il=this.length; i<il; i++) { + if (i in this && fn.call(context || this[i], this[i], i, this)) { + return true; + } + } + return false; + }; + })(HTMLArray.prototype); + this.attach(this); + }, + + addMethods : function (name, method) { + if (!def(this.allMethods[name])) { + this.allMethods[name] = method; + this.addHTMLArrayPrototype(name, method); + } + }, + + addMethodsToElm : function (elm) { + for (var method in this.allMethods) { + if (def(this.allMethods[method])) { + this.applyMethod.call(elm, method, this.allMethods[method]); + } + } + return elm; + }, + + applyMethod : function (method, func) { + if (typeof this[method] !== "function") { + this[method] = func; + } + }, + + attach : function (plugin) { + var publicMethods = plugin.publicMethods; + if (!def(publicMethods)) { + for (var method in plugin) { + if (method !== "init" && def(plugin[method])) { + this.addMethods(method, plugin[method]); + } + } + } + else if (publicMethods.constructor === Array) { + for (var i=0, current; (current=publicMethods[i]); i++) { + this.addMethods(current, plugin[current]); + } + } + if (typeof plugin.init === "function") { + plugin.init(); + } + }, + + addHTMLArrayPrototype : function (name, method) { + HTMLArray.prototype[name] = function () { + var elmsToReturn = new HTMLArray(); + elmsToReturn.previousSet = this; + for (var i=0, il=this.length; i<il; i++) { + elmsToReturn.push(method.apply(DOMAssistant.$$(this[i]), arguments)); + } + return elmsToReturn; + }; + }, + + cleanUp : function (elm) { + var children = elm.all || elm.getElementsByTagName("*"); + for (var i=0, child; (child=children[i++]);) { + if (child.hasData && child.hasData()) { + if (child.removeEvent) { child.removeEvent(); } + child.unstore(); + } + } + elm.innerHTML = ""; + }, + + setCache : function (cache) { + useCache = cache; + }, + + $ : function () { + var obj = arguments[0]; + if (arguments.length === 1 && (typeof obj === "object" || (typeof obj === "function" && !!obj.nodeName))) { + return DOMAssistant.$$(obj); + } + var elm = !!obj? new HTMLArray() : null; + for (var i=0, arg, idMatch; (arg=arguments[i]); i++) { + if (typeof arg === "string") { + arg = arg.replace(/^[^#\(]*(#)/, "$1"); + if (regex.id.test(arg)) { + if ((idMatch = DOMAssistant.$$(arg.substr(1), false))) { + elm.push(idMatch); + } + } + else { + var doc = (document.all || document.getElementsByTagName("*")).length; + elm = (!document.querySelectorAll && useCache && lastCache.rule && lastCache.rule === arg && lastCache.doc === doc)? lastCache.elms : pushAll(elm, DOMAssistant.cssSelection.call(document, arg)); + lastCache = { rule: arg, elms: elm, doc: doc }; + } + } + } + return elm; + }, + + $$ : function (id, addMethods) { + var elm = (typeof id === "object" || typeof id === "function" && !!id.nodeName)? id : document.getElementById(id), + applyMethods = def(addMethods)? addMethods : true, + getId = function(el) { var eid = el.id; return typeof eid !== "object"? eid : el.attributes.id.nodeValue; }; + if (typeof id === "string" && elm && getId(elm) !== id) { + elm = null; + for (var i=0, item; (item=document.all[i]); i++) { + if (getId(item) === id) { + elm = item; + break; + } + } + } + if (elm && applyMethods && !elm.next) { + DOMAssistant.addMethodsToElm(elm); + } + return elm; + }, + + prev : function () { + return DOMAssistant.$$(navigate(this, "previous")); + }, + + next : function () { + return DOMAssistant.$$(navigate(this, "next")); + }, + + hasChild: function (elm) { + return this === document || this !== elm && (this.contains? this.contains(elm) : !!(this.compareDocumentPosition(elm) & 16)); + }, + + getSequence : function (expression) { + var start, add = 2, max = -1, modVal = -1, + pseudoVal = regex.nth.exec(expression.replace(/^0n\+/, "").replace(/^2n$/, "even").replace(/^2n+1$/, "odd")); + if (!pseudoVal) { + return null; + } + if (pseudoVal[2]) { // odd or even + start = (pseudoVal[2] === "odd")? 1 : 2; + modVal = (start === 1)? 1 : 0; + } + else if (pseudoVal[3]) { // single digit + start = max = parseInt(pseudoVal[3], 10); + add = 0; + } + else if (pseudoVal[4]) { // an+b + add = pseudoVal[6]? parseInt(pseudoVal[6], 10) : 1; + start = pseudoVal[7]? parseInt(pseudoVal[7], 10) : 0; + while (start < 1) { + start += add; + } + modVal = (start >= 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<ll; l++) { + tagCollectionMatches = getElementsByTagName(splitRule.tag, prevElm[l]); + for (var m=0; (tagMatch=tagCollectionMatches[m]); m++) { + if (!tagMatch.added) { + tagMatch.added = true; + matchingElms[matchingElms.length] = tagMatch; + } + } + } + prevElm = matchingElms; + clearAdded(); + } + } + if (!matchingElms.length) { + break; + } + prevElm.skipTag = false; + if (splitRule.allClasses) { + var n = 0, matchingClassElms = [], allClasses = splitRule.allClasses.split(".").slice(1); + while ((current = prevElm[n++])) { + var matchCls = true, elmClass = current.className; + if (elmClass && elmClass.length) { + elmClass = elmClass.split(" "); + for (var o=allClasses.length; o--;) { + if (elmClass.indexOf(allClasses[o]) < 0) { + matchCls = false; + break; + } + } + if (matchCls) { + matchingClassElms[matchingClassElms.length] = current; + } + } + } + prevElm = matchingElms = matchingClassElms; + } + if (splitRule.allAttr) { + var matchAttr, r = 0, regExpAttributes = [], matchingAttributeElms = [], allAttr = splitRule.allAttr.match(regex.attribs); + for (var specialStrip = /^\[(selected|readonly)(\s*=.+)?\]$/, q=0, ql=allAttr.length, attributeMatch, attrVal; q<ql; q++) { + regex.attribs.lastIndex = 0; + attributeMatch = regex.attribs.exec(allAttr[q].replace(specialStrip, "[$1]")); + attrVal = attrToRegExp(attributeMatch[4], attributeMatch[2] || null); + regExpAttributes[q] = [(attrVal? new RegExp(attrVal) : null), attributeMatch[1]]; + } + while ((current = matchingElms[r++])) { + for (var s=0, sl=regExpAttributes.length; s<sl; s++) { + var attributeRegExp = regExpAttributes[s][0], currentAttr = getAttr(current, regExpAttributes[s][1]); + matchAttr = true; + if (!attributeRegExp && currentAttr === true) { continue; } + if ((!attributeRegExp && (!currentAttr || typeof currentAttr !== "string" || !currentAttr.length)) || (!!attributeRegExp && !attributeRegExp.test(currentAttr))) { + matchAttr = false; + break; + } + } + if (matchAttr) { + matchingAttributeElms[matchingAttributeElms.length] = current; + } + } + prevElm = matchingElms = matchingAttributeElms; + } + if (splitRule.allPseudos) { + var allPseudos = splitRule.allPseudos.match(regex.pseudos); + for (var t=0, tl=allPseudos.length; t<tl; t++) { + regex.pseudos.lastIndex = 0; + var pseudo = regex.pseudos.exec(allPseudos[t]); + var pseudoClass = pseudo[1]? pseudo[1].toLowerCase() : null; + var pseudoValue = pseudo[3] || null; + matchingElms = getElementsByPseudo(matchingElms, pseudoClass, pseudoValue); + clearAdded(matchingElms); + } + prevElm = matchingElms; + } + } + elm = ((tagBin.length && (anyTag || index.call(tagBin, splitRule.tag) >= 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<jl; j++) { + cssSelector = regex.selector.exec(cssSelectors[j]); + splitRule = { + tag: prefix + (cssSelector[1]? cssSelector[1] : "*"), + id: cssSelector[2], + allClasses: cssSelector[3], + allAttr: cssSelector[5], + allPseudos: cssSelector[10], + tagRelation: cssSelector[20] + }; + xPathExpression += + (splitRule.tagRelation? ({ ">": "/", "+": "/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<kl; k++) { + regex.pseudos.lastIndex = 0; + var pseudo = regex.pseudos.exec(allPseudos[k]), + pseudoClass = pseudo[1]? pseudo[1].toLowerCase() : null, + pseudoValue = pseudo[3] || null, + xpath = pseudoToXPath(splitRule.tag, pseudoClass, pseudoValue); + if (xpath.length) { + xPathExpression += "[" + xpath + "]"; + } + } + } + } + } + try { + var xPathNodes = document.evaluate(xPathExpression, this, nsResolver, 7, null), node, p=0; + while ((node = xPathNodes.snapshotItem(p++))) { elm.push(node); } + } catch (e) {} + return elm; + }; + return DOMAssistant.cssByXpath.call(this, cssRule); + }, + + cssSelection : function (cssRule) { + if (!cssRule) { return null; } + var special = regex.special.test(cssRule); + try { + if (document.querySelectorAll && !special) { + return pushAll(new HTMLArray(), this.querySelectorAll(cssRule)); + } + } catch (e) {} + return ((document.evaluate && !special && !/-of-type/.test(cssRule))? DOMAssistant.cssByXpath : DOMAssistant.cssByDOM).call(this, cssRule); + }, + + cssSelect : function (cssRule) { + return DOMAssistant.cssSelection.call(this, cssRule); + }, + + elmsByClass : function (className, tag) { + var cssRule = (tag || "") + "." + className; + return DOMAssistant.cssSelection.call(this, cssRule); + }, + + elmsByAttribute : function (attr, attrVal, tag, substrMatchSelector) { + var cssRule = (tag || "") + "[" + attr + ((attrVal && attrVal !== "*")? ((substrMatchSelector || "") + "=" + attrVal + "]") : "]"); + return DOMAssistant.cssSelection.call(this, cssRule); + }, + + elmsByTag : function (tag) { + return DOMAssistant.cssSelection.call(this, tag); + } + }; +}(); +DOMAssistant.initCore(); +DOMAssistant.Storage = function () { + var uniqueId = 1, data = [], expando = "_da" + +new Date(); + return { + hasData : function () { + var uid = this[expando]; + return !!uid && !!data[uid]; + }, + retrieve : function (key) { + if (!DOMAssistant.def(key)) { + return this[expando] || (this[expando] = uniqueId++); + } + if (!this[expando] || !data[this[expando]]) { return; } + return data[this[expando]][key]; + }, + + store : function (key, val) { + var uid = this[expando] || (this[expando] = uniqueId++); + data[uid] = data[uid] || {}; + if (typeof key === "object") { + for (var i in key) { + if (typeof i === "string") { + data[uid][i] = key[i]; + } + } + } + else { + data[uid][key] = val; + } + return this; + }, + + unstore : function (key) { + var uid = this[expando] || (this[expando] = uniqueId++); + if (data[uid]) { + if (DOMAssistant.def(key)) { + delete data[uid][key]; + } + else { + data[uid] = null; + } + } + return this; + } + }; +}(); +DOMAssistant.attach(DOMAssistant.Storage); +DOMAssistant.AJAX = function () { + var globalXMLHttp = null, + readyState = 0, + status = -1, + statusText = "", + requestPool = [], + createAjaxObj = function (url, method, callback, addToContent) { + var params = null; + if (/POST/i.test(method)) { + url = url.split("?"); + params = url[1]; + url = url[0]; + } + return { + url : url, + method : method, + callback : callback, + params : params, + headers : {}, + responseType : "text", + addToContent : addToContent || false + }; + }; + return { + publicMethods : [ + "ajax", + "get", + "post", + "load" + ], + + initRequest : function () { + var XMLHttp = null; + if (!!window.XMLHttpRequest && !DOMAssistant.isIE) { + XMLHttp = new XMLHttpRequest(); + DOMAssistant.AJAX.initRequest = function () { + return requestPool.length? requestPool.pop() : new XMLHttpRequest(); + }; + } + else if (!!window.ActiveXObject) { + var XMLHttpMS = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; + for (var i=0; i<XMLHttpMS.length; i++) { + try { + XMLHttp = new window.ActiveXObject(XMLHttpMS[i]); + DOMAssistant.AJAX.initRequest = function () { + return requestPool.length? requestPool.pop() : new window.ActiveXObject(XMLHttpMS[i]); + }; + break; + } + catch (e) { + XMLHttp = null; + } + } + } + return XMLHttp; + }, + + ajax : function (ajaxObj) { + if (!ajaxObj.noParse && ajaxObj.url && /\?/.test(ajaxObj.url) && ajaxObj.method && /POST/i.test(ajaxObj.method)) { + var url = ajaxObj.url.split("?"); + ajaxObj.url = url[0]; + ajaxObj.params = url[1] + ((url[1].length > 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<iL; i++) { + if (events[fevt][i].call(this, event) === false) { event.stopPropagation(); } + } + } + else if (typeof this["on" + fevt] === "function") { + this["on" + fevt].call(this, event); + } + var p = DOMAssistant.$$(this.parentNode); + if (!event.cancelBubble && p && p.nodeType === 1) { + p.triggerEvent(fevt, target, event); + } + return this; + }, + + addEvent : function (evt, func, relay, proxy, selector) { + var existingEvent, + fevt = fix(evt), + uid = fevt + this.retrieve(), + onevt = "on" + fevt; + if (!(func.attachedElements && func.attachedElements[uid])) { + var events = this.retrieve(key) || {}; + if (!events[fevt]) { + events[fevt] = []; + existingEvent = this[onevt]; + this[onevt] = null; + } + if (typeof this.window === "object") { this.window[onevt] = handler; } + else if (!events[fevt].length) { + if (w3cMode) { this.addEventListener(fevt, handler, useCapture[fevt]); } + else { this[onevt] = handler; } + } + if (existingEvent) { + events[fevt].push(existingEvent); + } + if (fevt !== evt) { func.evt = evt; } + func.relay = relay; + func.proxy = proxy; + func.selector = selector; + func.attachedElements = func.attachedElements || {}; + func.attachedElements[uid] = true; + events[fevt].push(func); + this.store(key, events); + } + return this; + }, + + handleEvent : function (evt) { + var currentEvt = (evt && regex.dom.test(evt.type) && w3cMode)? evt : createEvent(evt), + type = fix(currentEvt.type), + targ = currentEvt.target, + relatedTarg = currentEvt.relatedTarget, + eventColl = this.retrieve(key)[type].slice(0), eventCollLength, eventReturn, oevt; + if ((eventCollLength = eventColl.length)) { + for (var i=0; i<eventCollLength; i++) { + if (typeof eventColl[i] === "function") { + if ((oevt = eventColl[i].evt) && oevt !== type) { + currentEvt.type = oevt; + if (relatedTarg && regex.mouseenterleave.test(oevt)) { + if (eventColl[i].relay) { + var elms = eventColl[i].elms || (eventColl[i].elms = this.cssSelect(eventColl[i].selector)); + if (elms.indexOf(targ) < 0 || !DOMAssistant.hasChild.call(relatedTarg, targ)) { continue; } + } + else if (this === relatedTarg || this.hasChild(relatedTarg)) { continue; } + } + } + eventReturn = eventColl[i].call(this, currentEvt); + } + } + if (eventReturn === false) { currentEvt.stopPropagation(); } + return eventReturn; + } + }, + + removeEvent : function (evt, func, relay, proxy) { + var uid = (evt = fix(evt)) + this.retrieve(), + events = this.retrieve(key), + onevt = "on" + evt; + if (events && !evt) { + for (var ev in events) { + if (events[ev].length) { this.removeEvent(ev); } + } + var attr = this.attributes; + for (var att, j=attr.length; j--;) { + att = attr[j].nodeName.toLowerCase(); + if (regex.on.test(att) && typeof this[att] === "function") { + this[att] = null; + } + } + } + else if (events && events[evt]) { + var eventColl = events[evt]; + for (var fn, i=eventColl.length; i--;) { + fn = func || eventColl[i]; + if (eventColl[i] === fn && relay === fn.relay && proxy === fn.proxy) { + eventColl.splice(i, 1); + if (!!proxy && fn.selector) { + this.cssSelect(fn.selector).removeEvent(proxy); + } + if (fn.attachedElements) { + fn.attachedElements[uid] = null; + } + } + } + if (!events[evt].length) { + if (w3cMode) { this.removeEventListener(evt, handler, useCapture[evt]); } + else { this[onevt] = null; } + } + } + else if (this[onevt] && !func && !relay) { + this[onevt] = null; + } + return this; + }, + + relayEvent: function (evt, selector, fn, proxy) { + if (special(evt)) { + this.relayEvent("focus", selector, function() { + DOMAssistant.$$(this).removeEvent(evt).addEvent(evt, function(e) { + return fn.call(this, createEvent(e)); + }); + }, evt).relayEvent("blur", selector, function() { + DOMAssistant.$$(this).removeEvent(evt); + }, evt); + return this; + } + return this.addEvent(evt, function(e) { + e = createEvent(e); + var target = e.target, args = arguments, i = 0, elm, elms = this.cssSelect(selector); + while ((elm = elms[i++])) { + if ((elm === target || DOMAssistant.hasChild.call(elm, target)) && !elm.disabled) { + e.currentTarget = elm; + var retVal = fn.apply(elm, args); + if (!retVal) { e.preventDefault(); } + return retVal; + } + } + }, true, proxy, selector); + }, + + unrelayEvent: function (evt) { + if (special(evt)) { + return this.removeEvent("focus", null, true, evt).removeEvent("blur", null, true, evt); + } + return this.removeEvent(evt, null, true); + }, + + preventDefault : function (evt) { + if (evt.preventDefault) { evt.preventDefault(); } + evt.returnValue = false; + }, + + cancelBubble : function (evt) { + if (evt.stopPropagation) { evt.stopPropagation(); } + evt.cancelBubble = true; + } + }; +}(); +DOMAssistant.attach(DOMAssistant.Events); +DOMAssistant.DOMLoad = function () { + var DOMLoaded = false, + DOMLoadTimer = null, + functionsToCall = [], + addedStrings = {}, + errorHandling = null, + execFunctions = function () { + for (var i=0, il=functionsToCall.length; i<il; i++) { + try { + functionsToCall[i](); + } + catch (e) { + if (errorHandling && typeof errorHandling === "function") { + errorHandling(e); + } + } + } + functionsToCall = []; + }, + DOMHasLoaded = function () { + if (DOMLoaded) { + return; + } + DOMLoaded = true; + execFunctions(); + }; + /* Internet Explorer */ + /*@cc_on + @if (@_win32 || @_win64) + document.write("<script id=\"ieScriptLoad\" defer src=\"//:\"><\/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<il; i++) { + funcRef = arguments[i]; + if (!funcRef.DOMReady && !addedStrings[funcRef]) { + if (typeof funcRef === "string") { + addedStrings[funcRef] = true; + funcRef = new Function(funcRef); + } + funcRef.DOMReady = true; + functionsToCall.push(funcRef); + } + } + if (DOMLoaded) { + execFunctions(); + } + }, + + setErrorHandling : function (funcRef) { + errorHandling = funcRef; + } + }; +}(); +DOMAssistant.DOMReady = DOMAssistant.DOMLoad.DOMReady;
\ No newline at end of file |