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;
});
