You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2013/10/30 14:43:10 UTC

[16/52] [partial] Remove unneeded ace files and codemirror

http://git-wip-us.apache.org/repos/asf/couchdb/blob/5b8fb9c3/src/fauxton/assets/js/libs/ace/mode/css/csslint.js
----------------------------------------------------------------------
diff --git a/src/fauxton/assets/js/libs/ace/mode/css/csslint.js b/src/fauxton/assets/js/libs/ace/mode/css/csslint.js
deleted file mode 100644
index 9f4c3bc..0000000
--- a/src/fauxton/assets/js/libs/ace/mode/css/csslint.js
+++ /dev/null
@@ -1,9206 +0,0 @@
-define(function(require, exports, module) {
-/*!
-CSSLint
-Copyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-*/
-/* Build time: 17-January-2013 10:55:01 */
-/*!
-Parser-Lib
-Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-*/
-/* Version v0.2.2, Build time: 17-January-2013 10:26:34 */
-var parserlib = {};
-(function(){
-
-
-/**
- * A generic base to inherit from for any object
- * that needs event handling.
- * @class EventTarget
- * @constructor
- */
-function EventTarget(){
-
-    /**
-     * The array of listeners for various events.
-     * @type Object
-     * @property _listeners
-     * @private
-     */
-    this._listeners = {};    
-}
-
-EventTarget.prototype = {
-
-    //restore constructor
-    constructor: EventTarget,
-
-    /**
-     * Adds a listener for a given event type.
-     * @param {String} type The type of event to add a listener for.
-     * @param {Function} listener The function to call when the event occurs.
-     * @return {void}
-     * @method addListener
-     */
-    addListener: function(type, listener){
-        if (!this._listeners[type]){
-            this._listeners[type] = [];
-        }
-
-        this._listeners[type].push(listener);
-    },
-    
-    /**
-     * Fires an event based on the passed-in object.
-     * @param {Object|String} event An object with at least a 'type' attribute
-     *      or a string indicating the event name.
-     * @return {void}
-     * @method fire
-     */    
-    fire: function(event){
-        if (typeof event == "string"){
-            event = { type: event };
-        }
-        if (typeof event.target != "undefined"){
-            event.target = this;
-        }
-        
-        if (typeof event.type == "undefined"){
-            throw new Error("Event object missing 'type' property.");
-        }
-        
-        if (this._listeners[event.type]){
-        
-            //create a copy of the array and use that so listeners can't chane
-            var listeners = this._listeners[event.type].concat();
-            for (var i=0, len=listeners.length; i < len; i++){
-                listeners[i].call(this, event);
-            }
-        }            
-    },
-
-    /**
-     * Removes a listener for a given event type.
-     * @param {String} type The type of event to remove a listener from.
-     * @param {Function} listener The function to remove from the event.
-     * @return {void}
-     * @method removeListener
-     */
-    removeListener: function(type, listener){
-        if (this._listeners[type]){
-            var listeners = this._listeners[type];
-            for (var i=0, len=listeners.length; i < len; i++){
-                if (listeners[i] === listener){
-                    listeners.splice(i, 1);
-                    break;
-                }
-            }
-            
-            
-        }            
-    }
-};
-/**
- * Convenient way to read through strings.
- * @namespace parserlib.util
- * @class StringReader
- * @constructor
- * @param {String} text The text to read.
- */
-function StringReader(text){
-
-    /**
-     * The input text with line endings normalized.
-     * @property _input
-     * @type String
-     * @private
-     */
-    this._input = text.replace(/\n\r?/g, "\n");
-
-
-    /**
-     * The row for the character to be read next.
-     * @property _line
-     * @type int
-     * @private
-     */
-    this._line = 1;
-
-
-    /**
-     * The column for the character to be read next.
-     * @property _col
-     * @type int
-     * @private
-     */
-    this._col = 1;
-
-    /**
-     * The index of the character in the input to be read next.
-     * @property _cursor
-     * @type int
-     * @private
-     */
-    this._cursor = 0;
-}
-
-StringReader.prototype = {
-
-    //restore constructor
-    constructor: StringReader,
-
-    //-------------------------------------------------------------------------
-    // Position info
-    //-------------------------------------------------------------------------
-
-    /**
-     * Returns the column of the character to be read next.
-     * @return {int} The column of the character to be read next.
-     * @method getCol
-     */
-    getCol: function(){
-        return this._col;
-    },
-
-    /**
-     * Returns the row of the character to be read next.
-     * @return {int} The row of the character to be read next.
-     * @method getLine
-     */
-    getLine: function(){
-        return this._line ;
-    },
-
-    /**
-     * Determines if you're at the end of the input.
-     * @return {Boolean} True if there's no more input, false otherwise.
-     * @method eof
-     */
-    eof: function(){
-        return (this._cursor == this._input.length);
-    },
-
-    //-------------------------------------------------------------------------
-    // Basic reading
-    //-------------------------------------------------------------------------
-
-    /**
-     * Reads the next character without advancing the cursor.
-     * @param {int} count How many characters to look ahead (default is 1).
-     * @return {String} The next character or null if there is no next character.
-     * @method peek
-     */
-    peek: function(count){
-        var c = null;
-        count = (typeof count == "undefined" ? 1 : count);
-
-        //if we're not at the end of the input...
-        if (this._cursor < this._input.length){
-
-            //get character and increment cursor and column
-            c = this._input.charAt(this._cursor + count - 1);
-        }
-
-        return c;
-    },
-
-    /**
-     * Reads the next character from the input and adjusts the row and column
-     * accordingly.
-     * @return {String} The next character or null if there is no next character.
-     * @method read
-     */
-    read: function(){
-        var c = null;
-
-        //if we're not at the end of the input...
-        if (this._cursor < this._input.length){
-
-            //if the last character was a newline, increment row count
-            //and reset column count
-            if (this._input.charAt(this._cursor) == "\n"){
-                this._line++;
-                this._col=1;
-            } else {
-                this._col++;
-            }
-
-            //get character and increment cursor and column
-            c = this._input.charAt(this._cursor++);
-        }
-
-        return c;
-    },
-
-    //-------------------------------------------------------------------------
-    // Misc
-    //-------------------------------------------------------------------------
-
-    /**
-     * Saves the current location so it can be returned to later.
-     * @method mark
-     * @return {void}
-     */
-    mark: function(){
-        this._bookmark = {
-            cursor: this._cursor,
-            line:   this._line,
-            col:    this._col
-        };
-    },
-
-    reset: function(){
-        if (this._bookmark){
-            this._cursor = this._bookmark.cursor;
-            this._line = this._bookmark.line;
-            this._col = this._bookmark.col;
-            delete this._bookmark;
-        }
-    },
-
-    //-------------------------------------------------------------------------
-    // Advanced reading
-    //-------------------------------------------------------------------------
-
-    /**
-     * Reads up to and including the given string. Throws an error if that
-     * string is not found.
-     * @param {String} pattern The string to read.
-     * @return {String} The string when it is found.
-     * @throws Error when the string pattern is not found.
-     * @method readTo
-     */
-    readTo: function(pattern){
-
-        var buffer = "",
-            c;
-
-        /*
-         * First, buffer must be the same length as the pattern.
-         * Then, buffer must end with the pattern or else reach the
-         * end of the input.
-         */
-        while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){
-            c = this.read();
-            if (c){
-                buffer += c;
-            } else {
-                throw new Error("Expected \"" + pattern + "\" at line " + this._line  + ", col " + this._col + ".");
-            }
-        }
-
-        return buffer;
-
-    },
-
-    /**
-     * Reads characters while each character causes the given
-     * filter function to return true. The function is passed
-     * in each character and either returns true to continue
-     * reading or false to stop.
-     * @param {Function} filter The function to read on each character.
-     * @return {String} The string made up of all characters that passed the
-     *      filter check.
-     * @method readWhile
-     */
-    readWhile: function(filter){
-
-        var buffer = "",
-            c = this.read();
-
-        while(c !== null && filter(c)){
-            buffer += c;
-            c = this.read();
-        }
-
-        return buffer;
-
-    },
-
-    /**
-     * Reads characters that match either text or a regular expression and
-     * returns those characters. If a match is found, the row and column
-     * are adjusted; if no match is found, the reader's state is unchanged.
-     * reading or false to stop.
-     * @param {String|RegExp} matchter If a string, then the literal string
-     *      value is searched for. If a regular expression, then any string
-     *      matching the pattern is search for.
-     * @return {String} The string made up of all characters that matched or
-     *      null if there was no match.
-     * @method readMatch
-     */
-    readMatch: function(matcher){
-
-        var source = this._input.substring(this._cursor),
-            value = null;
-
-        //if it's a string, just do a straight match
-        if (typeof matcher == "string"){
-            if (source.indexOf(matcher) === 0){
-                value = this.readCount(matcher.length);
-            }
-        } else if (matcher instanceof RegExp){
-            if (matcher.test(source)){
-                value = this.readCount(RegExp.lastMatch.length);
-            }
-        }
-
-        return value;
-    },
-
-
-    /**
-     * Reads a given number of characters. If the end of the input is reached,
-     * it reads only the remaining characters and does not throw an error.
-     * @param {int} count The number of characters to read.
-     * @return {String} The string made up the read characters.
-     * @method readCount
-     */
-    readCount: function(count){
-        var buffer = "";
-
-        while(count--){
-            buffer += this.read();
-        }
-
-        return buffer;
-    }
-
-};
-/**
- * Type to use when a syntax error occurs.
- * @class SyntaxError
- * @namespace parserlib.util
- * @constructor
- * @param {String} message The error message.
- * @param {int} line The line at which the error occurred.
- * @param {int} col The column at which the error occurred.
- */
-function SyntaxError(message, line, col){
-
-    /**
-     * The column at which the error occurred.
-     * @type int
-     * @property col
-     */
-    this.col = col;
-
-    /**
-     * The line at which the error occurred.
-     * @type int
-     * @property line
-     */
-    this.line = line;
-
-    /**
-     * The text representation of the unit.
-     * @type String
-     * @property text
-     */
-    this.message = message;
-
-}
-
-//inherit from Error
-SyntaxError.prototype = new Error();
-/**
- * Base type to represent a single syntactic unit.
- * @class SyntaxUnit
- * @namespace parserlib.util
- * @constructor
- * @param {String} text The text of the unit.
- * @param {int} line The line of text on which the unit resides.
- * @param {int} col The column of text on which the unit resides.
- */
-function SyntaxUnit(text, line, col, type){
-
-
-    /**
-     * The column of text on which the unit resides.
-     * @type int
-     * @property col
-     */
-    this.col = col;
-
-    /**
-     * The line of text on which the unit resides.
-     * @type int
-     * @property line
-     */
-    this.line = line;
-
-    /**
-     * The text representation of the unit.
-     * @type String
-     * @property text
-     */
-    this.text = text;
-
-    /**
-     * The type of syntax unit.
-     * @type int
-     * @property type
-     */
-    this.type = type;
-}
-
-/**
- * Create a new syntax unit based solely on the given token.
- * Convenience method for creating a new syntax unit when
- * it represents a single token instead of multiple.
- * @param {Object} token The token object to represent.
- * @return {parserlib.util.SyntaxUnit} The object representing the token.
- * @static
- * @method fromToken
- */
-SyntaxUnit.fromToken = function(token){
-    return new SyntaxUnit(token.value, token.startLine, token.startCol);
-};
-
-SyntaxUnit.prototype = {
-
-    //restore constructor
-    constructor: SyntaxUnit,
-    
-    /**
-     * Returns the text representation of the unit.
-     * @return {String} The text representation of the unit.
-     * @method valueOf
-     */
-    valueOf: function(){
-        return this.toString();
-    },
-    
-    /**
-     * Returns the text representation of the unit.
-     * @return {String} The text representation of the unit.
-     * @method toString
-     */
-    toString: function(){
-        return this.text;
-    }
-
-};
-/*global StringReader, SyntaxError*/
-
-/**
- * Generic TokenStream providing base functionality.
- * @class TokenStreamBase
- * @namespace parserlib.util
- * @constructor
- * @param {String|StringReader} input The text to tokenize or a reader from 
- *      which to read the input.
- */
-function TokenStreamBase(input, tokenData){
-
-    /**
-     * The string reader for easy access to the text.
-     * @type StringReader
-     * @property _reader
-     * @private
-     */
-    this._reader = input ? new StringReader(input.toString()) : null;
-    
-    /**
-     * Token object for the last consumed token.
-     * @type Token
-     * @property _token
-     * @private
-     */
-    this._token = null;    
-    
-    /**
-     * The array of token information.
-     * @type Array
-     * @property _tokenData
-     * @private
-     */
-    this._tokenData = tokenData;
-    
-    /**
-     * Lookahead token buffer.
-     * @type Array
-     * @property _lt
-     * @private
-     */
-    this._lt = [];
-    
-    /**
-     * Lookahead token buffer index.
-     * @type int
-     * @property _ltIndex
-     * @private
-     */
-    this._ltIndex = 0;
-    
-    this._ltIndexCache = [];
-}
-
-/**
- * Accepts an array of token information and outputs
- * an array of token data containing key-value mappings
- * and matching functions that the TokenStream needs.
- * @param {Array} tokens An array of token descriptors.
- * @return {Array} An array of processed token data.
- * @method createTokenData
- * @static
- */
-TokenStreamBase.createTokenData = function(tokens){
-
-    var nameMap     = [],
-        typeMap     = {},
-        tokenData     = tokens.concat([]),
-        i            = 0,
-        len            = tokenData.length+1;
-    
-    tokenData.UNKNOWN = -1;
-    tokenData.unshift({name:"EOF"});
-
-    for (; i < len; i++){
-        nameMap.push(tokenData[i].name);
-        tokenData[tokenData[i].name] = i;
-        if (tokenData[i].text){
-            typeMap[tokenData[i].text] = i;
-        }
-    }
-    
-    tokenData.name = function(tt){
-        return nameMap[tt];
-    };
-    
-    tokenData.type = function(c){
-        return typeMap[c];
-    };
-    
-    return tokenData;
-};
-
-TokenStreamBase.prototype = {
-
-    //restore constructor
-    constructor: TokenStreamBase,    
-    
-    //-------------------------------------------------------------------------
-    // Matching methods
-    //-------------------------------------------------------------------------
-    
-    /**
-     * Determines if the next token matches the given token type.
-     * If so, that token is consumed; if not, the token is placed
-     * back onto the token stream. You can pass in any number of
-     * token types and this will return true if any of the token
-     * types is found.
-     * @param {int|int[]} tokenTypes Either a single token type or an array of
-     *      token types that the next token might be. If an array is passed,
-     *      it's assumed that the token can be any of these.
-     * @param {variant} channel (Optional) The channel to read from. If not
-     *      provided, reads from the default (unnamed) channel.
-     * @return {Boolean} True if the token type matches, false if not.
-     * @method match
-     */
-    match: function(tokenTypes, channel){
-    
-        //always convert to an array, makes things easier
-        if (!(tokenTypes instanceof Array)){
-            tokenTypes = [tokenTypes];
-        }
-                
-        var tt  = this.get(channel),
-            i   = 0,
-            len = tokenTypes.length;
-            
-        while(i < len){
-            if (tt == tokenTypes[i++]){
-                return true;
-            }
-        }
-        
-        //no match found, put the token back
-        this.unget();
-        return false;
-    },    
-    
-    /**
-     * Determines if the next token matches the given token type.
-     * If so, that token is consumed; if not, an error is thrown.
-     * @param {int|int[]} tokenTypes Either a single token type or an array of
-     *      token types that the next token should be. If an array is passed,
-     *      it's assumed that the token must be one of these.
-     * @param {variant} channel (Optional) The channel to read from. If not
-     *      provided, reads from the default (unnamed) channel.
-     * @return {void}
-     * @method mustMatch
-     */    
-    mustMatch: function(tokenTypes, channel){
-
-        var token;
-
-        //always convert to an array, makes things easier
-        if (!(tokenTypes instanceof Array)){
-            tokenTypes = [tokenTypes];
-        }
-
-        if (!this.match.apply(this, arguments)){    
-            token = this.LT(1);
-            throw new SyntaxError("Expected " + this._tokenData[tokenTypes[0]].name + 
-                " at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol);
-        }
-    },
-    
-    //-------------------------------------------------------------------------
-    // Consuming methods
-    //-------------------------------------------------------------------------
-    
-    /**
-     * Keeps reading from the token stream until either one of the specified
-     * token types is found or until the end of the input is reached.
-     * @param {int|int[]} tokenTypes Either a single token type or an array of
-     *      token types that the next token should be. If an array is passed,
-     *      it's assumed that the token must be one of these.
-     * @param {variant} channel (Optional) The channel to read from. If not
-     *      provided, reads from the default (unnamed) channel.
-     * @return {void}
-     * @method advance
-     */
-    advance: function(tokenTypes, channel){
-        
-        while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){
-            this.get();
-        }
-
-        return this.LA(0);    
-    },
-    
-    /**
-     * Consumes the next token from the token stream. 
-     * @return {int} The token type of the token that was just consumed.
-     * @method get
-     */      
-    get: function(channel){
-    
-        var tokenInfo   = this._tokenData,
-            reader      = this._reader,
-            value,
-            i           =0,
-            len         = tokenInfo.length,
-            found       = false,
-            token,
-            info;
-            
-        //check the lookahead buffer first
-        if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){  
-                           
-            i++;
-            this._token = this._lt[this._ltIndex++];
-            info = tokenInfo[this._token.type];
-            
-            //obey channels logic
-            while((info.channel !== undefined && channel !== info.channel) &&
-                    this._ltIndex < this._lt.length){
-                this._token = this._lt[this._ltIndex++];
-                info = tokenInfo[this._token.type];
-                i++;
-            }
-            
-            //here be dragons
-            if ((info.channel === undefined || channel === info.channel) &&
-                    this._ltIndex <= this._lt.length){
-                this._ltIndexCache.push(i);
-                return this._token.type;
-            }
-        }
-        
-        //call token retriever method
-        token = this._getToken();
-
-        //if it should be hidden, don't save a token
-        if (token.type > -1 && !tokenInfo[token.type].hide){
-                     
-            //apply token channel
-            token.channel = tokenInfo[token.type].channel;
-         
-            //save for later
-            this._token = token;
-            this._lt.push(token);
-
-            //save space that will be moved (must be done before array is truncated)
-            this._ltIndexCache.push(this._lt.length - this._ltIndex + i);  
-        
-            //keep the buffer under 5 items
-            if (this._lt.length > 5){
-                this._lt.shift();                
-            }
-            
-            //also keep the shift buffer under 5 items
-            if (this._ltIndexCache.length > 5){
-                this._ltIndexCache.shift();
-            }
-                
-            //update lookahead index
-            this._ltIndex = this._lt.length;
-        }
-            
-        /*
-         * Skip to the next token if:
-         * 1. The token type is marked as hidden.
-         * 2. The token type has a channel specified and it isn't the current channel.
-         */
-        info = tokenInfo[token.type];
-        if (info && 
-                (info.hide || 
-                (info.channel !== undefined && channel !== info.channel))){
-            return this.get(channel);
-        } else {
-            //return just the type
-            return token.type;
-        }
-    },
-    
-    /**
-     * Looks ahead a certain number of tokens and returns the token type at
-     * that position. This will throw an error if you lookahead past the
-     * end of input, past the size of the lookahead buffer, or back past
-     * the first token in the lookahead buffer.
-     * @param {int} The index of the token type to retrieve. 0 for the
-     *      current token, 1 for the next, -1 for the previous, etc.
-     * @return {int} The token type of the token in the given position.
-     * @method LA
-     */
-    LA: function(index){
-        var total = index,
-            tt;
-        if (index > 0){
-            //TODO: Store 5 somewhere
-            if (index > 5){
-                throw new Error("Too much lookahead.");
-            }
-        
-            //get all those tokens
-            while(total){
-                tt = this.get();   
-                total--;                            
-            }
-            
-            //unget all those tokens
-            while(total < index){
-                this.unget();
-                total++;
-            }
-        } else if (index < 0){
-        
-            if(this._lt[this._ltIndex+index]){
-                tt = this._lt[this._ltIndex+index].type;
-            } else {
-                throw new Error("Too much lookbehind.");
-            }
-        
-        } else {
-            tt = this._token.type;
-        }
-        
-        return tt;
-    
-    },
-    
-    /**
-     * Looks ahead a certain number of tokens and returns the token at
-     * that position. This will throw an error if you lookahead past the
-     * end of input, past the size of the lookahead buffer, or back past
-     * the first token in the lookahead buffer.
-     * @param {int} The index of the token type to retrieve. 0 for the
-     *      current token, 1 for the next, -1 for the previous, etc.
-     * @return {Object} The token of the token in the given position.
-     * @method LA
-     */    
-    LT: function(index){
-    
-        //lookahead first to prime the token buffer
-        this.LA(index);
-        
-        //now find the token, subtract one because _ltIndex is already at the next index
-        return this._lt[this._ltIndex+index-1];    
-    },
-    
-    /**
-     * Returns the token type for the next token in the stream without 
-     * consuming it.
-     * @return {int} The token type of the next token in the stream.
-     * @method peek
-     */
-    peek: function(){
-        return this.LA(1);
-    },
-    
-    /**
-     * Returns the actual token object for the last consumed token.
-     * @return {Token} The token object for the last consumed token.
-     * @method token
-     */
-    token: function(){
-        return this._token;
-    },
-    
-    /**
-     * Returns the name of the token for the given token type.
-     * @param {int} tokenType The type of token to get the name of.
-     * @return {String} The name of the token or "UNKNOWN_TOKEN" for any
-     *      invalid token type.
-     * @method tokenName
-     */
-    tokenName: function(tokenType){
-        if (tokenType < 0 || tokenType > this._tokenData.length){
-            return "UNKNOWN_TOKEN";
-        } else {
-            return this._tokenData[tokenType].name;
-        }
-    },
-    
-    /**
-     * Returns the token type value for the given token name.
-     * @param {String} tokenName The name of the token whose value should be returned.
-     * @return {int} The token type value for the given token name or -1
-     *      for an unknown token.
-     * @method tokenName
-     */    
-    tokenType: function(tokenName){
-        return this._tokenData[tokenName] || -1;
-    },
-    
-    /**
-     * Returns the last consumed token to the token stream.
-     * @method unget
-     */      
-    unget: function(){
-        //if (this._ltIndex > -1){
-        if (this._ltIndexCache.length){
-            this._ltIndex -= this._ltIndexCache.pop();//--;
-            this._token = this._lt[this._ltIndex - 1];
-        } else {
-            throw new Error("Too much lookahead.");
-        }
-    }
-
-};
-
-
-
-
-parserlib.util = {
-StringReader: StringReader,
-SyntaxError : SyntaxError,
-SyntaxUnit  : SyntaxUnit,
-EventTarget : EventTarget,
-TokenStreamBase : TokenStreamBase
-};
-})();
-
-
-/*
-Parser-Lib
-Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-*/
-/* Version v0.2.2, Build time: 17-January-2013 10:26:34 */
-(function(){
-var EventTarget = parserlib.util.EventTarget,
-TokenStreamBase = parserlib.util.TokenStreamBase,
-StringReader = parserlib.util.StringReader,
-SyntaxError = parserlib.util.SyntaxError,
-SyntaxUnit  = parserlib.util.SyntaxUnit;
-
-
-var Colors = {
-    aliceblue       :"#f0f8ff",
-    antiquewhite    :"#faebd7",
-    aqua            :"#00ffff",
-    aquamarine      :"#7fffd4",
-    azure           :"#f0ffff",
-    beige           :"#f5f5dc",
-    bisque          :"#ffe4c4",
-    black           :"#000000",
-    blanchedalmond  :"#ffebcd",
-    blue            :"#0000ff",
-    blueviolet      :"#8a2be2",
-    brown           :"#a52a2a",
-    burlywood       :"#deb887",
-    cadetblue       :"#5f9ea0",
-    chartreuse      :"#7fff00",
-    chocolate       :"#d2691e",
-    coral           :"#ff7f50",
-    cornflowerblue  :"#6495ed",
-    cornsilk        :"#fff8dc",
-    crimson         :"#dc143c",
-    cyan            :"#00ffff",
-    darkblue        :"#00008b",
-    darkcyan        :"#008b8b",
-    darkgoldenrod   :"#b8860b",
-    darkgray        :"#a9a9a9",
-    darkgreen       :"#006400",
-    darkkhaki       :"#bdb76b",
-    darkmagenta     :"#8b008b",
-    darkolivegreen  :"#556b2f",
-    darkorange      :"#ff8c00",
-    darkorchid      :"#9932cc",
-    darkred         :"#8b0000",
-    darksalmon      :"#e9967a",
-    darkseagreen    :"#8fbc8f",
-    darkslateblue   :"#483d8b",
-    darkslategray   :"#2f4f4f",
-    darkturquoise   :"#00ced1",
-    darkviolet      :"#9400d3",
-    deeppink        :"#ff1493",
-    deepskyblue     :"#00bfff",
-    dimgray         :"#696969",
-    dodgerblue      :"#1e90ff",
-    firebrick       :"#b22222",
-    floralwhite     :"#fffaf0",
-    forestgreen     :"#228b22",
-    fuchsia         :"#ff00ff",
-    gainsboro       :"#dcdcdc",
-    ghostwhite      :"#f8f8ff",
-    gold            :"#ffd700",
-    goldenrod       :"#daa520",
-    gray            :"#808080",
-    green           :"#008000",
-    greenyellow     :"#adff2f",
-    honeydew        :"#f0fff0",
-    hotpink         :"#ff69b4",
-    indianred       :"#cd5c5c",
-    indigo          :"#4b0082",
-    ivory           :"#fffff0",
-    khaki           :"#f0e68c",
-    lavender        :"#e6e6fa",
-    lavenderblush   :"#fff0f5",
-    lawngreen       :"#7cfc00",
-    lemonchiffon    :"#fffacd",
-    lightblue       :"#add8e6",
-    lightcoral      :"#f08080",
-    lightcyan       :"#e0ffff",
-    lightgoldenrodyellow  :"#fafad2",
-    lightgray       :"#d3d3d3",
-    lightgreen      :"#90ee90",
-    lightpink       :"#ffb6c1",
-    lightsalmon     :"#ffa07a",
-    lightseagreen   :"#20b2aa",
-    lightskyblue    :"#87cefa",
-    lightslategray  :"#778899",
-    lightsteelblue  :"#b0c4de",
-    lightyellow     :"#ffffe0",
-    lime            :"#00ff00",
-    limegreen       :"#32cd32",
-    linen           :"#faf0e6",
-    magenta         :"#ff00ff",
-    maroon          :"#800000",
-    mediumaquamarine:"#66cdaa",
-    mediumblue      :"#0000cd",
-    mediumorchid    :"#ba55d3",
-    mediumpurple    :"#9370d8",
-    mediumseagreen  :"#3cb371",
-    mediumslateblue :"#7b68ee",
-    mediumspringgreen   :"#00fa9a",
-    mediumturquoise :"#48d1cc",
-    mediumvioletred :"#c71585",
-    midnightblue    :"#191970",
-    mintcream       :"#f5fffa",
-    mistyrose       :"#ffe4e1",
-    moccasin        :"#ffe4b5",
-    navajowhite     :"#ffdead",
-    navy            :"#000080",
-    oldlace         :"#fdf5e6",
-    olive           :"#808000",
-    olivedrab       :"#6b8e23",
-    orange          :"#ffa500",
-    orangered       :"#ff4500",
-    orchid          :"#da70d6",
-    palegoldenrod   :"#eee8aa",
-    palegreen       :"#98fb98",
-    paleturquoise   :"#afeeee",
-    palevioletred   :"#d87093",
-    papayawhip      :"#ffefd5",
-    peachpuff       :"#ffdab9",
-    peru            :"#cd853f",
-    pink            :"#ffc0cb",
-    plum            :"#dda0dd",
-    powderblue      :"#b0e0e6",
-    purple          :"#800080",
-    red             :"#ff0000",
-    rosybrown       :"#bc8f8f",
-    royalblue       :"#4169e1",
-    saddlebrown     :"#8b4513",
-    salmon          :"#fa8072",
-    sandybrown      :"#f4a460",
-    seagreen        :"#2e8b57",
-    seashell        :"#fff5ee",
-    sienna          :"#a0522d",
-    silver          :"#c0c0c0",
-    skyblue         :"#87ceeb",
-    slateblue       :"#6a5acd",
-    slategray       :"#708090",
-    snow            :"#fffafa",
-    springgreen     :"#00ff7f",
-    steelblue       :"#4682b4",
-    tan             :"#d2b48c",
-    teal            :"#008080",
-    thistle         :"#d8bfd8",
-    tomato          :"#ff6347",
-    turquoise       :"#40e0d0",
-    violet          :"#ee82ee",
-    wheat           :"#f5deb3",
-    white           :"#ffffff",
-    whitesmoke      :"#f5f5f5",
-    yellow          :"#ffff00",
-    yellowgreen     :"#9acd32",
-    //CSS2 system colors http://www.w3.org/TR/css3-color/#css2-system
-    activeBorder        :"Active window border.",
-    activecaption       :"Active window caption.",
-    appworkspace        :"Background color of multiple document interface.",
-    background          :"Desktop background.",
-    buttonface          :"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.",
-    buttonhighlight     :"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",
-    buttonshadow        :"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.",
-    buttontext          :"Text on push buttons.",
-    captiontext         :"Text in caption, size box, and scrollbar arrow box.",
-    graytext            :"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.",
-    highlight           :"Item(s) selected in a control.",
-    highlighttext       :"Text of item(s) selected in a control.",
-    inactiveborder      :"Inactive window border.",
-    inactivecaption     :"Inactive window caption.",
-    inactivecaptiontext :"Color of text in an inactive caption.",
-    infobackground      :"Background color for tooltip controls.",
-    infotext            :"Text color for tooltip controls.",
-    menu                :"Menu background.",
-    menutext            :"Text in menus.",
-    scrollbar           :"Scroll bar gray area.",
-    threeddarkshadow    :"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",
-    threedface          :"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",
-    threedhighlight     :"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",
-    threedlightshadow   :"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",
-    threedshadow        :"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.",
-    window              :"Window background.",
-    windowframe         :"Window frame.",
-    windowtext          :"Text in windows."
-};
-/*global SyntaxUnit, Parser*/
-/**
- * Represents a selector combinator (whitespace, +, >).
- * @namespace parserlib.css
- * @class Combinator
- * @extends parserlib.util.SyntaxUnit
- * @constructor
- * @param {String} text The text representation of the unit. 
- * @param {int} line The line of text on which the unit resides.
- * @param {int} col The column of text on which the unit resides.
- */
-function Combinator(text, line, col){
-    
-    SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE);
-
-    /**
-     * The type of modifier.
-     * @type String
-     * @property type
-     */
-    this.type = "unknown";
-    
-    //pretty simple
-    if (/^\s+$/.test(text)){
-        this.type = "descendant";
-    } else if (text == ">"){
-        this.type = "child";
-    } else if (text == "+"){
-        this.type = "adjacent-sibling";
-    } else if (text == "~"){
-        this.type = "sibling";
-    }
-
-}
-
-Combinator.prototype = new SyntaxUnit();
-Combinator.prototype.constructor = Combinator;
-
-
-/*global SyntaxUnit, Parser*/
-/**
- * Represents a media feature, such as max-width:500.
- * @namespace parserlib.css
- * @class MediaFeature
- * @extends parserlib.util.SyntaxUnit
- * @constructor
- * @param {SyntaxUnit} name The name of the feature.
- * @param {SyntaxUnit} value The value of the feature or null if none.
- */
-function MediaFeature(name, value){
-    
-    SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE);
-
-    /**
-     * The name of the media feature
-     * @type String
-     * @property name
-     */
-    this.name = name;
-
-    /**
-     * The value for the feature or null if there is none.
-     * @type SyntaxUnit
-     * @property value
-     */
-    this.value = value;
-}
-
-MediaFeature.prototype = new SyntaxUnit();
-MediaFeature.prototype.constructor = MediaFeature;
-
-
-/*global SyntaxUnit, Parser*/
-/**
- * Represents an individual media query.
- * @namespace parserlib.css
- * @class MediaQuery
- * @extends parserlib.util.SyntaxUnit
- * @constructor
- * @param {String} modifier The modifier "not" or "only" (or null).
- * @param {String} mediaType The type of media (i.e., "print").
- * @param {Array} parts Array of selectors parts making up this selector.
- * @param {int} line The line of text on which the unit resides.
- * @param {int} col The column of text on which the unit resides.
- */
-function MediaQuery(modifier, mediaType, features, line, col){
-    
-    SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType : "") + (mediaType && features.length > 0 ? " and " : "") + features.join(" and "), line, col, Parser.MEDIA_QUERY_TYPE); 
-
-    /**
-     * The media modifier ("not" or "only")
-     * @type String
-     * @property modifier
-     */
-    this.modifier = modifier;
-
-    /**
-     * The mediaType (i.e., "print")
-     * @type String
-     * @property mediaType
-     */
-    this.mediaType = mediaType;    
-    
-    /**
-     * The parts that make up the selector.
-     * @type Array
-     * @property features
-     */
-    this.features = features;
-
-}
-
-MediaQuery.prototype = new SyntaxUnit();
-MediaQuery.prototype.constructor = MediaQuery;
-
-
-/*global Tokens, TokenStream, SyntaxError, Properties, Validation, ValidationError, SyntaxUnit,
-    PropertyValue, PropertyValuePart, SelectorPart, SelectorSubPart, Selector,
-    PropertyName, Combinator, MediaFeature, MediaQuery, EventTarget */
-
-/**
- * A CSS3 parser.
- * @namespace parserlib.css
- * @class Parser
- * @constructor
- * @param {Object} options (Optional) Various options for the parser:
- *      starHack (true|false) to allow IE6 star hack as valid,
- *      underscoreHack (true|false) to interpret leading underscores
- *      as IE6-7 targeting for known properties, ieFilters (true|false)
- *      to indicate that IE < 8 filters should be accepted and not throw
- *      syntax errors.
- */
-function Parser(options){
-
-    //inherit event functionality
-    EventTarget.call(this);
-
-
-    this.options = options || {};
-
-    this._tokenStream = null;
-}
-
-//Static constants
-Parser.DEFAULT_TYPE = 0;
-Parser.COMBINATOR_TYPE = 1;
-Parser.MEDIA_FEATURE_TYPE = 2;
-Parser.MEDIA_QUERY_TYPE = 3;
-Parser.PROPERTY_NAME_TYPE = 4;
-Parser.PROPERTY_VALUE_TYPE = 5;
-Parser.PROPERTY_VALUE_PART_TYPE = 6;
-Parser.SELECTOR_TYPE = 7;
-Parser.SELECTOR_PART_TYPE = 8;
-Parser.SELECTOR_SUB_PART_TYPE = 9;
-
-Parser.prototype = function(){
-
-    var proto = new EventTarget(),  //new prototype
-        prop,
-        additions =  {
-        
-            //restore constructor
-            constructor: Parser,
-                        
-            //instance constants - yuck
-            DEFAULT_TYPE : 0,
-            COMBINATOR_TYPE : 1,
-            MEDIA_FEATURE_TYPE : 2,
-            MEDIA_QUERY_TYPE : 3,
-            PROPERTY_NAME_TYPE : 4,
-            PROPERTY_VALUE_TYPE : 5,
-            PROPERTY_VALUE_PART_TYPE : 6,
-            SELECTOR_TYPE : 7,
-            SELECTOR_PART_TYPE : 8,
-            SELECTOR_SUB_PART_TYPE : 9,            
-        
-            //-----------------------------------------------------------------
-            // Grammar
-            //-----------------------------------------------------------------
-        
-            _stylesheet: function(){
-            
-                /*
-                 * stylesheet
-                 *  : [ CHARSET_SYM S* STRING S* ';' ]?
-                 *    [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
-                 *    [ namespace [S|CDO|CDC]* ]*
-                 *    [ [ ruleset | media | page | font_face | keyframes ] [S|CDO|CDC]* ]*
-                 *  ;
-                 */ 
-               
-                var tokenStream = this._tokenStream,
-                    charset     = null,
-                    count,
-                    token,
-                    tt;
-                    
-                this.fire("startstylesheet");
-            
-                //try to read character set
-                this._charset();
-                
-                this._skipCruft();
-
-                //try to read imports - may be more than one
-                while (tokenStream.peek() == Tokens.IMPORT_SYM){
-                    this._import();
-                    this._skipCruft();
-                }
-                
-                //try to read namespaces - may be more than one
-                while (tokenStream.peek() == Tokens.NAMESPACE_SYM){
-                    this._namespace();
-                    this._skipCruft();
-                }
-                
-                //get the next token
-                tt = tokenStream.peek();
-                
-                //try to read the rest
-                while(tt > Tokens.EOF){
-                
-                    try {
-                
-                        switch(tt){
-                            case Tokens.MEDIA_SYM:
-                                this._media();
-                                this._skipCruft();
-                                break;
-                            case Tokens.PAGE_SYM:
-                                this._page(); 
-                                this._skipCruft();
-                                break;                   
-                            case Tokens.FONT_FACE_SYM:
-                                this._font_face(); 
-                                this._skipCruft();
-                                break;  
-                            case Tokens.KEYFRAMES_SYM:
-                                this._keyframes(); 
-                                this._skipCruft();
-                                break;                                
-                            case Tokens.UNKNOWN_SYM:  //unknown @ rule
-                                tokenStream.get();
-                                if (!this.options.strict){
-                                
-                                    //fire error event
-                                    this.fire({
-                                        type:       "error",
-                                        error:      null,
-                                        message:    "Unknown @ rule: " + tokenStream.LT(0).value + ".",
-                                        line:       tokenStream.LT(0).startLine,
-                                        col:        tokenStream.LT(0).startCol
-                                    });                          
-                                    
-                                    //skip braces
-                                    count=0;
-                                    while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){
-                                        count++;    //keep track of nesting depth
-                                    }
-                                    
-                                    while(count){
-                                        tokenStream.advance([Tokens.RBRACE]);
-                                        count--;
-                                    }
-                                    
-                                } else {
-                                    //not a syntax error, rethrow it
-                                    throw new SyntaxError("Unknown @ rule.", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);
-                                }                                
-                                break;
-                            case Tokens.S:
-                                this._readWhitespace();
-                                break;
-                            default:                            
-                                if(!this._ruleset()){
-                                
-                                    //error handling for known issues
-                                    switch(tt){
-                                        case Tokens.CHARSET_SYM:
-                                            token = tokenStream.LT(1);
-                                            this._charset(false);
-                                            throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol);
-                                        case Tokens.IMPORT_SYM:
-                                            token = tokenStream.LT(1);
-                                            this._import(false);
-                                            throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol);
-                                        case Tokens.NAMESPACE_SYM:
-                                            token = tokenStream.LT(1);
-                                            this._namespace(false);
-                                            throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol);
-                                        default:
-                                            tokenStream.get();  //get the last token
-                                            this._unexpectedToken(tokenStream.token());
-                                    }
-                                
-                                }
-                        }
-                    } catch(ex) {
-                        if (ex instanceof SyntaxError && !this.options.strict){
-                            this.fire({
-                                type:       "error",
-                                error:      ex,
-                                message:    ex.message,
-                                line:       ex.line,
-                                col:        ex.col
-                            });                     
-                        } else {
-                            throw ex;
-                        }
-                    }
-                    
-                    tt = tokenStream.peek();
-                }
-                
-                if (tt != Tokens.EOF){
-                    this._unexpectedToken(tokenStream.token());
-                }
-            
-                this.fire("endstylesheet");
-            },
-            
-            _charset: function(emit){
-                var tokenStream = this._tokenStream,
-                    charset,
-                    token,
-                    line,
-                    col;
-                    
-                if (tokenStream.match(Tokens.CHARSET_SYM)){
-                    line = tokenStream.token().startLine;
-                    col = tokenStream.token().startCol;
-                
-                    this._readWhitespace();
-                    tokenStream.mustMatch(Tokens.STRING);
-                    
-                    token = tokenStream.token();
-                    charset = token.value;
-                    
-                    this._readWhitespace();
-                    tokenStream.mustMatch(Tokens.SEMICOLON);
-                    
-                    if (emit !== false){
-                        this.fire({ 
-                            type:   "charset",
-                            charset:charset,
-                            line:   line,
-                            col:    col
-                        });
-                    }
-                }            
-            },
-            
-            _import: function(emit){
-                /*
-                 * import
-                 *   : IMPORT_SYM S*
-                 *    [STRING|URI] S* media_query_list? ';' S*
-                 */    
-            
-                var tokenStream = this._tokenStream,
-                    tt,
-                    uri,
-                    importToken,
-                    mediaList   = [];
-                
-                //read import symbol
-                tokenStream.mustMatch(Tokens.IMPORT_SYM);
-                importToken = tokenStream.token();
-                this._readWhitespace();
-                
-                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);
-                
-                //grab the URI value
-                uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1");                
-
-                this._readWhitespace();
-                
-                mediaList = this._media_query_list();
-                
-                //must end with a semicolon
-                tokenStream.mustMatch(Tokens.SEMICOLON);
-                this._readWhitespace();
-                
-                if (emit !== false){
-                    this.fire({
-                        type:   "import",
-                        uri:    uri,
-                        media:  mediaList,
-                        line:   importToken.startLine,
-                        col:    importToken.startCol
-                    });
-                }
-        
-            },
-            
-            _namespace: function(emit){
-                /*
-                 * namespace
-                 *   : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
-                 */    
-            
-                var tokenStream = this._tokenStream,
-                    line,
-                    col,
-                    prefix,
-                    uri;
-                
-                //read import symbol
-                tokenStream.mustMatch(Tokens.NAMESPACE_SYM);
-                line = tokenStream.token().startLine;
-                col = tokenStream.token().startCol;
-                this._readWhitespace();
-                
-                //it's a namespace prefix - no _namespace_prefix() method because it's just an IDENT
-                if (tokenStream.match(Tokens.IDENT)){
-                    prefix = tokenStream.token().value;
-                    this._readWhitespace();
-                }
-                
-                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);
-                /*if (!tokenStream.match(Tokens.STRING)){
-                    tokenStream.mustMatch(Tokens.URI);
-                }*/
-                
-                //grab the URI value
-                uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1");                
-
-                this._readWhitespace();
-
-                //must end with a semicolon
-                tokenStream.mustMatch(Tokens.SEMICOLON);
-                this._readWhitespace();
-                
-                if (emit !== false){
-                    this.fire({
-                        type:   "namespace",
-                        prefix: prefix,
-                        uri:    uri,
-                        line:   line,
-                        col:    col
-                    });
-                }
-        
-            },            
-                       
-            _media: function(){
-                /*
-                 * media
-                 *   : MEDIA_SYM S* media_query_list S* '{' S* ruleset* '}' S*
-                 *   ;
-                 */
-                var tokenStream     = this._tokenStream,
-                    line,
-                    col,
-                    mediaList;//       = [];
-                
-                //look for @media
-                tokenStream.mustMatch(Tokens.MEDIA_SYM);
-                line = tokenStream.token().startLine;
-                col = tokenStream.token().startCol;
-                
-                this._readWhitespace();               
-
-                mediaList = this._media_query_list();
-
-                tokenStream.mustMatch(Tokens.LBRACE);
-                this._readWhitespace();
-                
-                this.fire({
-                    type:   "startmedia",
-                    media:  mediaList,
-                    line:   line,
-                    col:    col
-                });
-                
-                while(true) {
-                    if (tokenStream.peek() == Tokens.PAGE_SYM){
-                        this._page();
-                    } else if (!this._ruleset()){
-                        break;
-                    }                
-                }
-                
-                tokenStream.mustMatch(Tokens.RBRACE);
-                this._readWhitespace();
-        
-                this.fire({
-                    type:   "endmedia",
-                    media:  mediaList,
-                    line:   line,
-                    col:    col
-                });
-            },                           
-        
-
-            //CSS3 Media Queries
-            _media_query_list: function(){
-                /*
-                 * media_query_list
-                 *   : S* [media_query [ ',' S* media_query ]* ]?
-                 *   ;
-                 */
-                var tokenStream = this._tokenStream,
-                    mediaList   = [];
-                
-                
-                this._readWhitespace();
-                
-                if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){
-                    mediaList.push(this._media_query());
-                }
-                
-                while(tokenStream.match(Tokens.COMMA)){
-                    this._readWhitespace();
-                    mediaList.push(this._media_query());
-                }
-                
-                return mediaList;
-            },
-            
-            /*
-             * Note: "expression" in the grammar maps to the _media_expression
-             * method.
-             
-             */
-            _media_query: function(){
-                /*
-                 * media_query
-                 *   : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
-                 *   | expression [ AND S* expression ]*
-                 *   ;
-                 */
-                var tokenStream = this._tokenStream,
-                    type        = null,
-                    ident       = null,
-                    token       = null,
-                    expressions = [];
-                    
-                if (tokenStream.match(Tokens.IDENT)){
-                    ident = tokenStream.token().value.toLowerCase();
-                    
-                    //since there's no custom tokens for these, need to manually check
-                    if (ident != "only" && ident != "not"){
-                        tokenStream.unget();
-                        ident = null;
-                    } else {
-                        token = tokenStream.token();
-                    }
-                }
-                                
-                this._readWhitespace();
-                
-                if (tokenStream.peek() == Tokens.IDENT){
-                    type = this._media_type();
-                    if (token === null){
-                        token = tokenStream.token();
-                    }
-                } else if (tokenStream.peek() == Tokens.LPAREN){
-                    if (token === null){
-                        token = tokenStream.LT(1);
-                    }
-                    expressions.push(this._media_expression());
-                }                               
-                
-                if (type === null && expressions.length === 0){
-                    return null;
-                } else {                
-                    this._readWhitespace();
-                    while (tokenStream.match(Tokens.IDENT)){
-                        if (tokenStream.token().value.toLowerCase() != "and"){
-                            this._unexpectedToken(tokenStream.token());
-                        }
-                        
-                        this._readWhitespace();
-                        expressions.push(this._media_expression());
-                    }
-                }
-
-                return new MediaQuery(ident, type, expressions, token.startLine, token.startCol);
-            },
-
-            //CSS3 Media Queries
-            _media_type: function(){
-                /*
-                 * media_type
-                 *   : IDENT
-                 *   ;
-                 */
-                return this._media_feature();           
-            },
-
-            /**
-             * Note: in CSS3 Media Queries, this is called "expression".
-             * Renamed here to avoid conflict with CSS3 Selectors
-             * definition of "expression". Also note that "expr" in the
-             * grammar now maps to "expression" from CSS3 selectors.
-             * @method _media_expression
-             * @private
-             */
-            _media_expression: function(){
-                /*
-                 * expression
-                 *  : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
-                 *  ;
-                 */
-                var tokenStream = this._tokenStream,
-                    feature     = null,
-                    token,
-                    expression  = null;
-                
-                tokenStream.mustMatch(Tokens.LPAREN);
-                
-                feature = this._media_feature();
-                this._readWhitespace();
-                
-                if (tokenStream.match(Tokens.COLON)){
-                    this._readWhitespace();
-                    token = tokenStream.LT(1);
-                    expression = this._expression();
-                }
-                
-                tokenStream.mustMatch(Tokens.RPAREN);
-                this._readWhitespace();
-
-                return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null));            
-            },
-
-            //CSS3 Media Queries
-            _media_feature: function(){
-                /*
-                 * media_feature
-                 *   : IDENT
-                 *   ;
-                 */
-                var tokenStream = this._tokenStream;
-                    
-                tokenStream.mustMatch(Tokens.IDENT);
-                
-                return SyntaxUnit.fromToken(tokenStream.token());            
-            },
-            
-            //CSS3 Paged Media
-            _page: function(){
-                /*
-                 * page:
-                 *    PAGE_SYM S* IDENT? pseudo_page? S* 
-                 *    '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S*
-                 *    ;
-                 */            
-                var tokenStream = this._tokenStream,
-                    line,
-                    col,
-                    identifier  = null,
-                    pseudoPage  = null;
-                
-                //look for @page
-                tokenStream.mustMatch(Tokens.PAGE_SYM);
-                line = tokenStream.token().startLine;
-                col = tokenStream.token().startCol;
-                
-                this._readWhitespace();
-                
-                if (tokenStream.match(Tokens.IDENT)){
-                    identifier = tokenStream.token().value;
-
-                    //The value 'auto' may not be used as a page name and MUST be treated as a syntax error.
-                    if (identifier.toLowerCase() === "auto"){
-                        this._unexpectedToken(tokenStream.token());
-                    }
-                }                
-                
-                //see if there's a colon upcoming
-                if (tokenStream.peek() == Tokens.COLON){
-                    pseudoPage = this._pseudo_page();
-                }
-            
-                this._readWhitespace();
-                
-                this.fire({
-                    type:   "startpage",
-                    id:     identifier,
-                    pseudo: pseudoPage,
-                    line:   line,
-                    col:    col
-                });                   
-
-                this._readDeclarations(true, true);                
-                
-                this.fire({
-                    type:   "endpage",
-                    id:     identifier,
-                    pseudo: pseudoPage,
-                    line:   line,
-                    col:    col
-                });             
-            
-            },
-            
-            //CSS3 Paged Media
-            _margin: function(){
-                /*
-                 * margin :
-                 *    margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
-                 *    ;
-                 */
-                var tokenStream = this._tokenStream,
-                    line,
-                    col,
-                    marginSym   = this._margin_sym();
-
-                if (marginSym){
-                    line = tokenStream.token().startLine;
-                    col = tokenStream.token().startCol;
-                
-                    this.fire({
-                        type: "startpagemargin",
-                        margin: marginSym,
-                        line:   line,
-                        col:    col
-                    });    
-                    
-                    this._readDeclarations(true);
-
-                    this.fire({
-                        type: "endpagemargin",
-                        margin: marginSym,
-                        line:   line,
-                        col:    col
-                    });    
-                    return true;
-                } else {
-                    return false;
-                }
-            },
-
-            //CSS3 Paged Media
-            _margin_sym: function(){
-            
-                /*
-                 * margin_sym :
-                 *    TOPLEFTCORNER_SYM | 
-                 *    TOPLEFT_SYM | 
-                 *    TOPCENTER_SYM | 
-                 *    TOPRIGHT_SYM | 
-                 *    TOPRIGHTCORNER_SYM |
-                 *    BOTTOMLEFTCORNER_SYM | 
-                 *    BOTTOMLEFT_SYM | 
-                 *    BOTTOMCENTER_SYM | 
-                 *    BOTTOMRIGHT_SYM |
-                 *    BOTTOMRIGHTCORNER_SYM |
-                 *    LEFTTOP_SYM |
-                 *    LEFTMIDDLE_SYM |
-                 *    LEFTBOTTOM_SYM |
-                 *    RIGHTTOP_SYM |
-                 *    RIGHTMIDDLE_SYM |
-                 *    RIGHTBOTTOM_SYM 
-                 *    ;
-                 */
-            
-                var tokenStream = this._tokenStream;
-            
-                if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM,
-                        Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM,
-                        Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, 
-                        Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM,
-                        Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, 
-                        Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM,
-                        Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM]))
-                {
-                    return SyntaxUnit.fromToken(tokenStream.token());                
-                } else {
-                    return null;
-                }
-            
-            },
-            
-            _pseudo_page: function(){
-                /*
-                 * pseudo_page
-                 *   : ':' IDENT
-                 *   ;    
-                 */
-        
-                var tokenStream = this._tokenStream;
-                
-                tokenStream.mustMatch(Tokens.COLON);
-                tokenStream.mustMatch(Tokens.IDENT);
-                
-                //TODO: CSS3 Paged Media says only "left", "center", and "right" are allowed
-                
-                return tokenStream.token().value;
-            },
-            
-            _font_face: function(){
-                /*
-                 * font_face
-                 *   : FONT_FACE_SYM S* 
-                 *     '{' S* declaration [ ';' S* declaration ]* '}' S*
-                 *   ;
-                 */     
-                var tokenStream = this._tokenStream,
-                    line,
-                    col;
-                
-                //look for @page
-                tokenStream.mustMatch(Tokens.FONT_FACE_SYM);
-                line = tokenStream.token().startLine;
-                col = tokenStream.token().startCol;
-                
-                this._readWhitespace();
-
-                this.fire({
-                    type:   "startfontface",
-                    line:   line,
-                    col:    col
-                });                    
-                
-                this._readDeclarations(true);
-                
-                this.fire({
-                    type:   "endfontface",
-                    line:   line,
-                    col:    col
-                });              
-            },
-
-            _operator: function(inFunction){
-            
-                /*
-                 * operator (outside function)
-                 *  : '/' S* | ',' S* | /( empty )/
-                 * operator (inside function)
-                 *  : '/' S* | '+' S* | '*' S* | '-' S* /( empty )/
-                 *  ;
-                 */    
-                 
-                var tokenStream = this._tokenStream,
-                    token       = null;
-                
-                if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) ||
-                    (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){
-                    token =  tokenStream.token();
-                    this._readWhitespace();
-                } 
-                return token ? PropertyValuePart.fromToken(token) : null;
-                
-            },
-            
-            _combinator: function(){
-            
-                /*
-                 * combinator
-                 *  : PLUS S* | GREATER S* | TILDE S* | S+
-                 *  ;
-                 */    
-                 
-                var tokenStream = this._tokenStream,
-                    value       = null,
-                    token;
-                
-                if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){                
-                    token = tokenStream.token();
-                    value = new Combinator(token.value, token.startLine, token.startCol);
-                    this._readWhitespace();
-                }
-                
-                return value;
-            },
-            
-            _unary_operator: function(){
-            
-                /*
-                 * unary_operator
-                 *  : '-' | '+'
-                 *  ;
-                 */
-                 
-                var tokenStream = this._tokenStream;
-                
-                if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){
-                    return tokenStream.token().value;
-                } else {
-                    return null;
-                }         
-            },
-            
-            _property: function(){
-            
-                /*
-                 * property
-                 *   : IDENT S*
-                 *   ;        
-                 */
-                 
-                var tokenStream = this._tokenStream,
-                    value       = null,
-                    hack        = null,
-                    tokenValue,
-                    token,
-                    line,
-                    col;
-                    
-                //check for star hack - throws error if not allowed
-                if (tokenStream.peek() == Tokens.STAR && this.options.starHack){
-                    tokenStream.get();
-                    token = tokenStream.token();
-                    hack = token.value;
-                    line = token.startLine;
-                    col = token.startCol;
-                }
-                
-                if(tokenStream.match(Tokens.IDENT)){
-                    token = tokenStream.token();
-                    tokenValue = token.value;
-                    
-                    //check for underscore hack - no error if not allowed because it's valid CSS syntax
-                    if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){
-                        hack = "_";
-                        tokenValue = tokenValue.substring(1);
-                    }
-                    
-                    value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol));
-                    this._readWhitespace();
-                }
-                
-                return value;
-            },
-        
-            //Augmented with CSS3 Selectors
-            _ruleset: function(){
-                /*
-                 * ruleset
-                 *   : selectors_group
-                 *     '{' S* declaration? [ ';' S* declaration? ]* '}' S*
-                 *   ;    
-                 */    
-                 
-                var tokenStream = this._tokenStream,
-                    tt,
-                    selectors;
-
-
-                /*
-                 * Error Recovery: If even a single selector fails to parse,
-                 * then the entire ruleset should be thrown away.
-                 */
-                try {
-                    selectors = this._selectors_group();
-                } catch (ex){
-                    if (ex instanceof SyntaxError && !this.options.strict){
-                    
-                        //fire error event
-                        this.fire({
-                            type:       "error",
-                            error:      ex,
-                            message:    ex.message,
-                            line:       ex.line,
-                            col:        ex.col
-                        });                          
-                        
-                        //skip over everything until closing brace
-                        tt = tokenStream.advance([Tokens.RBRACE]);
-                        if (tt == Tokens.RBRACE){
-                            //if there's a right brace, the rule is finished so don't do anything
-                        } else {
-                            //otherwise, rethrow the error because it wasn't handled properly
-                            throw ex;
-                        }                        
-                        
-                    } else {
-                        //not a syntax error, rethrow it
-                        throw ex;
-                    }                
-                
-                    //trigger parser to continue
-                    return true;
-                }
-                
-                //if it got here, all selectors parsed
-                if (selectors){ 
-                                    
-                    this.fire({
-                        type:       "startrule",
-                        selectors:  selectors,
-                        line:       selectors[0].line,
-                        col:        selectors[0].col
-                    });                
-                    
-                    this._readDeclarations(true);                
-                    
-                    this.fire({
-                        type:       "endrule",
-                        selectors:  selectors,
-                        line:       selectors[0].line,
-                        col:        selectors[0].col
-                    });  
-                    
-                }
-                
-                return selectors;
-                
-            },
-
-            //CSS3 Selectors
-            _selectors_group: function(){
-            
-                /*            
-                 * selectors_group
-                 *   : selector [ COMMA S* selector ]*
-                 *   ;
-                 */           
-                var tokenStream = this._tokenStream,
-                    selectors   = [],
-                    selector;
-                    
-                selector = this._selector();
-                if (selector !== null){
-                
-                    selectors.push(selector);
-                    while(tokenStream.match(Tokens.COMMA)){
-                        this._readWhitespace();
-                        selector = this._selector();
-                        if (selector !== null){
-                            selectors.push(selector);
-                        } else {
-                            this._unexpectedToken(tokenStream.LT(1));
-                        }
-                    }
-                }
-
-                return selectors.length ? selectors : null;
-            },
-                
-            //CSS3 Selectors
-            _selector: function(){
-                /*
-                 * selector
-                 *   : simple_selector_sequence [ combinator simple_selector_sequence ]*
-                 *   ;    
-                 */
-                 
-                var tokenStream = this._tokenStream,
-                    selector    = [],
-                    nextSelector = null,
-                    combinator  = null,
-                    ws          = null;
-                
-                //if there's no simple selector, then there's no selector
-                nextSelector = this._simple_selector_sequence();
-                if (nextSelector === null){
-                    return null;
-                }
-                
-                selector.push(nextSelector);
-                
-                do {
-                    
-                    //look for a combinator
-                    combinator = this._combinator();
-                    
-                    if (combinator !== null){
-                        selector.push(combinator);
-                        nextSelector = this._simple_selector_sequence();
-                        
-                        //there must be a next selector
-                        if (nextSelector === null){
-                            this._unexpectedToken(tokenStream.LT(1));
-                        } else {
-                        
-                            //nextSelector is an instance of SelectorPart
-                            selector.push(nextSelector);
-                        }
-                    } else {
-                        
-                        //if there's not whitespace, we're done
-                        if (this._readWhitespace()){           
-        
-                            //add whitespace separator
-                            ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol);
-                            
-                            //combinator is not required
-                            combinator = this._combinator();
-                            
-                            //selector is required if there's a combinator
-                            nextSelector = this._simple_selector_sequence();
-                            if (nextSelector === null){                        
-                                if (combinator !== null){
-                                    this._unexpectedToken(tokenStream.LT(1));
-                                }
-                            } else {
-                                
-                                if (combinator !== null){
-                                    selector.push(combinator);
-                                } else {
-                                    selector.push(ws);
-                                }
-                                
-                                selector.push(nextSelector);
-                            }     
-                        } else {
-                            break;
-                        }               
-                    
-                    }
-                } while(true);
-                
-                return new Selector(selector, selector[0].line, selector[0].col);
-            },
-            
-            //CSS3 Selectors
-            _simple_selector_sequence: function(){
-                /*
-                 * simple_selector_sequence
-                 *   : [ type_selector | universal ]
-                 *     [ HASH | class | attrib | pseudo | negation ]*
-                 *   | [ HASH | class | attrib | pseudo | negation ]+
-                 *   ;
-                 */
-                 
-                var tokenStream = this._tokenStream,
-                
-                    //parts of a simple selector
-                    elementName = null,
-                    modifiers   = [],
-                    
-                    //complete selector text
-                    selectorText= "",
-
-                    //the different parts after the element name to search for
-                    components  = [
-                        //HASH
-                        function(){
-                            return tokenStream.match(Tokens.HASH) ?
-                                    new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) :
-                                    null;
-                        },
-                        this._class,
-                        this._attrib,
-                        this._pseudo,
-                        this._negation
-                    ],
-                    i           = 0,
-                    len         = components.length,
-                    component   = null,
-                    found       = false,
-                    line,
-                    col;
-                    
-                    
-                //get starting line and column for the selector
-                line = tokenStream.LT(1).startLine;
-                col = tokenStream.LT(1).startCol;
-                                        
-                elementName = this._type_selector();
-                if (!elementName){
-                    elementName = this._universal();
-                }
-                
-                if (elementName !== null){
-                    selectorText += elementName;
-                }                
-                
-                while(true){
-
-                    //whitespace means we're done
-                    if (tokenStream.peek() === Tokens.S){
-                        break;
-                    }
-                
-                    //check for each component
-                    while(i < len && component === null){
-                        component = components[i++].call(this);
-                    }
-        
-                    if (component === null){
-                    
-                        //we don't have a selector
-                        if (selectorText === ""){
-                            return null;
-                        } else {
-                            break;
-                        }
-                    } else {
-                        i = 0;
-                        modifiers.push(component);
-                        selectorText += component.toString(); 
-                        component = null;
-                    }
-                }
-
-                 
-                return selectorText !== "" ?
-                        new SelectorPart(elementName, modifiers, selectorText, line, col) :
-                        null;
-            },            
-            
-            //CSS3 Selectors
-            _type_selector: function(){
-                /*
-                 * type_selector
-                 *   : [ namespace_prefix ]? element_name
-                 *   ;
-                 */
-                 
-                var tokenStream = this._tokenStream,
-                    ns          = this._namespace_prefix(),
-                    elementName = this._element_name();
-                    
-                if (!elementName){                    
-                    /*
-                     * Need to back out the namespace that was read due to both
-                     * type_selector and universal reading namespace_prefix
-                     * first. Kind of hacky, but only way I can figure out
-                     * right now how to not change the grammar.
-                     */
-                    if (ns){
-                        tokenStream.unget();
-                        if (ns.length > 1){
-                            tokenStream.unget();
-                        }
-                    }
-                
-                    return null;
-                } else {     
-                    if (ns){
-                        elementName.text = ns + elementName.text;
-                        elementName.col -= ns.length;
-                    }
-                    return elementName;
-                }
-            },
-            
-            //CSS3 Selectors
-            _class: function(){
-                /*
-                 * class
-                 *   : '.' IDENT
-                 *   ;
-                 */    
-                 
-                var tokenStream = this._tokenStream,
-                    token;
-                
-                if (tokenStream.match(Tokens.DOT)){
-                    tokenStream.mustMatch(Tokens.IDENT);    
-                    token = tokenStream.token();
-                    return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1);        
-                } else {
-                    return null;
-                }
-        
-            },
-            
-            //CSS3 Selectors
-            _element_name: function(){
-                /*
-                 * element_name
-                 *   : IDENT
-                 *   ;
-                 */    
-                
-                var tokenStream = this._tokenStream,
-                    token;
-                
-                if (tokenStream.match(Tokens.IDENT)){
-                    token = tokenStream.token();
-                    return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol);        
-                
-                } else {
-                    return null;
-                }
-            },
-            
-            //CSS3 Selectors
-            _namespace_prefix: function(){
-                /*            
-                 * namespace_prefix
-                 *   : [ IDENT | '*' ]? '|'
-                 *   ;
-                 */
-                var tokenStream = this._tokenStream,
-                    value       = "";
-                    
-                //verify that this is a namespace prefix
-                if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){
-                        
-                    if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){
-                        value += tokenStream.token().value;
-                    }
-                    
-                    tokenStream.mustMatch(Tokens.PIPE);
-                    value += "|";
-                    
-                }
-                
-                return value.length ? value : null;                
-            },
-            
-            //CSS3 Selectors
-            _universal: function(){
-                /*
-                 * universal
-                 *   : [ namespace_prefix ]? '*'
-                 *   ;            
-                 */
-                var tokenStream = this._tokenStream,
-                    value       = "",
-                    ns;
-                    
-                ns = this._namespace_prefix();
-                if(ns){
-                    value += ns;
-                }
-                
-                if(tokenStream.match(Tokens.STAR)){
-                    value += "*";
-                }
-                
-                return value.length ? value : null;
-                
-           },
-            
-            //CSS3 Selectors
-            _attrib: function(){
-                /*
-                 * attrib
-                 *   : '[' S* [ namespace_prefix ]? IDENT S*
-                 *         [ [ PREFIXMATCH |
-                 *             SUFFIXMATCH |
-                 *             SUBSTRINGMATCH |
-                 *             '=' |
-                 *             INCLUDES |
-                 *             DASHMATCH ] S* [ IDENT | STRING ] S*
-                 *         ]? ']'
-                 *   ;    
-                 */
-                 
-                var tokenStream = this._tokenStream,
-                    value       = null,
-                    ns,
-                    token;
-                
-                if (tokenStream.match(Tokens.LBRACKET)){
-                    token = tokenStream.token();
-                    value = token.value;
-                    value += this._readWhitespace();
-                    
-                    ns = this._namespace_prefix();
-                    
-                    if (ns){
-                        value += ns;
-                    }
-                                        
-                    tokenStream.mustMatch(Tokens.IDENT);
-                    value += tokenStream.token().value;                    
-                    value += this._readWhitespace();
-   

<TRUNCATED>