var RubyConsoleInput = DUI.Class.create({
    init: function(consoleContainerSelector, inputLines) {
        this.LINE_HEIGHT = 1.2;
        this.consoleContainer = $(consoleContainerSelector);
        this.line = this.consoleContainer.children('.line').
                focus(function() { $(this).addClass('focus');}).blur(function() { $(this).removeClass('focus')});
        this.pleaseWait = this.consoleContainer.children('.please_wait');

        this.inputLines = inputLines ? inputLines : [];
        this.historyPointer = this.inputLines.length;
    },

    displayPleaseWait: function(show) {
        if (show) {
            this.pleaseWait.show();
        } else {
            this.pleaseWait.hide();
        }
    },

    upInHistory: function() {
        if(this.historyPointer == 0)
            return;
        this.accomodateInputLine(this.inputLines[--this.historyPointer]);
    },

    downInHistory: function() {
        if(this.historyPointer >= this.inputLines.length - 1) {
            this.accomodateInputLine('');
            this.historyPointer = this.inputLines.length;
            return;
        }
        this.accomodateInputLine(this.inputLines[++this.historyPointer]);
    },

    addToHistory: function(inputLine) {
        this.inputLines[this.inputLines.length] = inputLine;
        this.historyPointer = this.inputLines.length;
    },

    clearInputLine: function() {
        this.line.val('');
        this.line.attr('rows', 1);
        this.line.css('height', this.LINE_HEIGHT + 'em');
    },

    focus: function() {
        if(this.line.hasClass('focus'))
            return;
        this.line.blur();
        this.line.focus();
    },

    blur: function() {
        if(this.line.hasClass('focus'))
            this.line.blur();
    },

    prepareForNextLine: function() {
        this.accomodateInputLine(this.line.val() + '\n');
    },

    lineCount: function() {
        var str = this.line.val(); 
        var count = 1;
        for (var i = 0; i < str.length; i++) {
            if (str[i] == '\n')
                count++;
        }
        return count;
    },

    accomodateInputLine: function(inputLine) {
        this.line.val(inputLine);
        this.line.attr('rows', this.lineCount());
        this.line.css('height', this.lineCount() * this.LINE_HEIGHT + 'em');
    }
});