/* cssQuery, version 2.0.2 (2005-08-19) Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) License: http://creativecommons.org/licenses/LGPL/2.1/ */ cssQuery.addModule("css-level2", function() { // ----------------------------------------------------------------------- // selectors // ----------------------------------------------------------------------- // child selector selectors[">"] = function($results, $from, $tagName, $namespace) { var $element, i, j; for (i = 0; i < $from.length; i++) { var $subset = childElements($from[i]); for (j = 0; ($element = $subset[j]); j++) if (compareTagName($element, $tagName, $namespace)) $results.push($element); } }; // sibling selector selectors["+"] = function($results, $from, $tagName, $namespace) { for (var i = 0; i < $from.length; i++) { var $element = nextElementSibling($from[i]); if ($element && compareTagName($element, $tagName, $namespace)) $results.push($element); } }; // attribute selector selectors["@"] = function($results, $from, $attributeSelectorID) { var $test = attributeSelectors[$attributeSelectorID].test; var $element, i; for (i = 0; ($element = $from[i]); i++) if ($test($element)) $results.push($element); }; // ----------------------------------------------------------------------- // pseudo-classes // ----------------------------------------------------------------------- pseudoClasses["first-child"] = function($element) { return !previousElementSibling($element); }; pseudoClasses["lang"] = function($element, $code) { $code = new RegExp("^" + $code, "i"); while ($element && !$element.getAttribute("lang")) $element = $element.parentNode; return $element && $code.test($element.getAttribute("lang")); }; // ----------------------------------------------------------------------- // attribute selectors // ----------------------------------------------------------------------- // constants AttributeSelector.NS_IE = /\\:/g; AttributeSelector.PREFIX = "@"; // properties AttributeSelector.tests = {}; // methods AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) { var $key = this.PREFIX + $match; if (!attributeSelectors[$key]) { $attribute = this.create($attribute, $compare || "", $value || ""); // store the selector attributeSelectors[$key] = $attribute; attributeSelectors.push($attribute); } return attributeSelectors[$key].id; }; AttributeSelector.parse = function($selector) { $selector = $selector.replace(this.NS_IE, "|"); var $match; while ($match = $selector.match(this.match)) { var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]); $selector = $selector.replace(this.match, $replace); } return $selector; }; AttributeSelector.create = function($propertyName, $test, $value) { var $attributeSelector = {}; $attributeSelector.id = this.PREFIX + attributeSelectors.length; $attributeSelector.name = $propertyName; $test = this.tests[$test]; $test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false; $attributeSelector.test = new Function("e", "return " + $test); return $attributeSelector; }; AttributeSelector.getAttribute = function($name) { switch ($name.toLowerCase()) { case "id": return "e.id"; case "class": return "e.className"; case "for": return "e.htmlFor"; case "href": if (isMSIE) { // IE always returns the full path not the fragment in the href attribute // so we RegExp it out of outerHTML. Opera does the same thing but there // is no way to get the original attribute. return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')"; } } return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')"; }; // ----------------------------------------------------------------------- // attribute selector tests // ----------------------------------------------------------------------- AttributeSelector.tests[""] = function($attribute) { return $attribute; }; AttributeSelector.tests["="] = function($attribute, $value) { return $attribute + "==" + Quote.add($value); }; AttributeSelector.tests["~="] = function($attribute, $value) { return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")"; }; AttributeSelector.tests["|="] = function($attribute, $value) { return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")"; }; // ----------------------------------------------------------------------- // parsing // ----------------------------------------------------------------------- // override parseSelector to parse out attribute selectors var _parseSelector = parseSelector; parseSelector = function($selector) { return _parseSelector(AttributeSelector.parse($selector)); }; }); // addModule