MassEdit.SmartTextField = function(text, parentElmt) {
    var div = document.createElement("div");
    div.innerHTML = "<input type='text' />";
    
    var self = this;
    var input = div.firstChild;
    input.onkeydown = function(evt)  { return self._onKeyDown(evt); };
    input.onkeyup = function(evt)    { return self._onKeyUp(evt); };
    input.onselect = function(evt)   { return self._onSelect(evt); };
    input.onclick = function(evt)    { return self._onClick(evt); };
    input.onchange = function(evt)   { return self._onChange(evt); };
    input.value = text;
    parentElmt.appendChild(input);
    this._input = input;
    
    this._value = text;
    this._selectionStart = input.selectionStart;
    this._selectionEnd = input.selectionEnd;
};

MassEdit.SmartTextField.prototype.setReadOnly = function(readOnly) {
	if (readOnly) {
		this._input.setAttribute("readonly", "true")
	} else {
		this._input.removeAttribute("readonly")
	}
}

MassEdit.SmartTextField.prototype.getInput = function() {
    return this._input;
};

MassEdit.SmartTextField.prototype.focus = function() {
    return this._input.focus();
};

MassEdit.SmartTextField.prototype.getText = function() {
    return this._input.value;
};

MassEdit.SmartTextField.prototype.setText = function(text) {
    this._input.value = text;
    this._value = text
    this._detectSelectionChange();
};

MassEdit.SmartTextField.prototype.getSelectionStart = function() {
    return this._selectionStart;
};

MassEdit.SmartTextField.prototype.getSelectionEnd = function() {
    return this._selectionEnd;
};

MassEdit.SmartTextField.prototype._onKeyDown = function(evt) {
	if (this._input.getAttribute("readonly")) {
		MassEdit.callback_onKeyDownWhileReadOnly()
	}

    evt = (evt) ? evt : event;
    var cancel = false;
    var action = "";
    
    if (SimileAjax.Platform.os.isMac) {
        if (evt.keyCode == 90 && evt.metaKey) { // meta-z
            if (evt.shiftKey) {
                action = "redo";
            } else {
                action = "undo";
            }
        }
    } else {
        if (evt.keyCode == 90 && evt.ctrlKey) { // ctrl-z
            action = "undo";
        } else if (evt.keyCode == 89 && evt.ctrlKey) { // ctrl-y
            action = "redo";
        }
    }
    
    if (action == "undo") {
        if ("onUndo" in this) {
            cancel = this["onUndo"]();
        }
    } else if (action == "redo") {
        if ("onRedo" in this) {
            cancel = this["onRedo"]();
        }
    }
    
    if (cancel) {
        evt.preventDefault();
        evt.returnValue = false;
        return false;
    } else {
        return true;
    }
};


MassEdit.SmartTextField.prototype._onSelect = function(evt) {
    evt = (evt) ? evt : event;
    this._detectSelectionChange();
    return true;
};

MassEdit.SmartTextField.prototype._onKeyUp = function(evt) {
    evt = (evt) ? evt : event;
    var self = this;
    window.setTimeout(function() { self._detectChange(); }, 0);
    
    return true;
};

MassEdit.SmartTextField.prototype._onClick = function(evt) {
    evt = (evt) ? evt : event;
    this._detectChange();
    return true;
};

MassEdit.SmartTextField.prototype._onChange = function(evt) {
    evt = (evt) ? evt : event;
    this._detectChange();
    return true;
};

MassEdit.SmartTextField.prototype._detectChange = function() {
    var input = this._input;
    if (this._value != input.value) {

        if ("onChange" in this) {
            this["onChange"](
                this._value, 
                this._selectionStart, 
                this._selectionEnd, 
                input.value,
                input.selectionStart,
                input.selectionEnd
            );
        }
        this._value = input.value;
    }
    this._detectSelectionChange();
};

MassEdit.SmartTextField.prototype._detectSelectionChange = function() {
    var input = this._input;
    if (input.selectionStart != this._selectionStart || input.selectionEnd != this._selectionEnd) {
        this._selectionStart = input.selectionStart;
        this._selectionEnd = input.selectionEnd;
        if ("onSelectionChange" in this) {
            this["onSelectionChange"](this._selectionStart, this._selectionEnd);
        }
    }
};

