Subversion-Projekte lars-tiefland.prado

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/*
        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