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

    var oop = require("../../lib/oop");
    var Range = require("../../range").Range;
    var BaseFoldMode = require("./fold_mode").FoldMode;
    var TokenIterator = require("../../token_iterator").TokenIterator;

    var FoldMode = exports.FoldMode = function () {
    };
    oop.inherits(FoldMode, BaseFoldMode);

    (function () {

        // regular expressions that identify starting and stopping points
        this.foldingStartMarker = /\b(rule|declare|query|when|then)\b/;
        this.foldingStopMarker = /\bend\b/;

        this.getFoldWidgetRange = function (session, foldStyle, row) {
            var line = session.getLine(row);
            var match = line.match(this.foldingStartMarker);
            if (match) {
                var i = match.index;

                if (match[1]) {
                    var position = {row: row, column: line.length};
                    var iterator = new TokenIterator(session, position.row, position.column);
                    var seek = "end";
                    var token = iterator.getCurrentToken();
                    if (token.value == "when") {
                        seek = "then";
                    }
                    while (token) {
                        if (token.value == seek) {
                            return Range.fromPoints(position, {
                                row: iterator.getCurrentTokenRow(),
                                column: iterator.getCurrentTokenColumn()
                            });
                        }
                        token = iterator.stepForward();
                    }
                }

            }
            // test each line, and return a range of segments to collapse
        }

    }).call(FoldMode.prototype);

});