define(function(require, exports, module) {
"use strict";

var oop = require("../lib/oop");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;

var escape = "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)";
var quantifier = "({\\d+\\b,?\\d*}|[+*?])(\\??)";

var JsRegexHighlightRules = function() {
    this.$rules = {
        "start": [{
                // operators
                token : "keyword",
                regex: "\\\\[bB]",
                next: "no_quantifier"
            }, {
                token: "regexp.keyword.operator",
                regex: escape
            }, {
                // flag
                token: "string.regexp",
                regex: "/\\w*",
                next: "start"
            }, {               
                token : ["string", "string.regex"],
                regex: quantifier,
                next: "no_quantifier"
            }, {
                // operators
                token : "keyword",
                regex: "[$^]|\\\\[bB]",
                next: "no_quantifier"
            }, {
                // operators
                token : "constant.language.escape",
                regex: /\(\?[:=!]|\)|[()$^+*?]/,
                next: "no_quantifier"
            }, {
                token : "constant.language.delimiter",
                regex: /\|/,
                next: "no_quantifier"
            }, {
                token: "constant.language.escape",
                regex: /\[\^?/,
                next: "character_class"
            }, {
                token: "empty",
                regex: "$",
                next: "start"
            }
        ],
        

        "character_class": [{
                regex: /\\[dDwWsS]/
            },{
                token: "markup.list",
                regex: "(?:" + escape + "|.)-(?:[^\\]\\\\]|" + escape + ")"
            }, {
                token: "keyword",
                regex: escape
            }, {
                token: "constant.language.escape",
                regex: "]",
                next: "start"
            }, {
                token: "constant.language.escape",
                regex: "-"
            }, {
                token: "empty",
                regex: "$",
                next: "start"
            }, {
                defaultToken: "string.regexp.charachterclass"
            }
        ],
        "no_quantifier":[{
                token: "invalid",
                regex: quantifier
            }, {
                token: "invalid",
                regex: "",
                next: "start"
            }
        ]
        
    };
};

oop.inherits(JsRegexHighlightRules, TextHighlightRules);

exports.JsRegexHighlightRules = JsRegexHighlightRules;
});