//  Flede  - Flexible Data Editor, Copyright (C) 2003-2009
//  JS & AJAX by Alexander Burtsev [bur], http://fastcoder.org
//  Based on Sardar's object <Sardar@vingrad.ru>

var textAreaSelectionObjects = [];
function getTextAreaSelection(id) {
    if (typeof(textAreaSelectionObjects[id]) == "undefined") {
        textAreaSelectionObjects[id] = new textAreaSelectionHelper(id);
    }
    return textAreaSelectionObjects[id];
}
function textAreaSelectionHelper(id) {
    var obj = document.getElementById(id);
    this.target = obj;
    this.target.carretHandler = this;
    this.target.onchange = _textareaSaver;
    this.target.onclick = _textareaSaver;
    this.target.onkeyup = _textareaSaver;
    this.target.onfocus = _textareaSaver;
    if(!document.selection) this.target.onSelect = _textareaSaver;
    this.start=-1;
    this.end=-1;
    this.scroll=-1;
    this.iesel=null;
}
textAreaSelectionHelper.prototype = {
    getSelectedText : function() {
        return this.iesel? this.iesel.text: (this.start>=0&&this.end>this.start)? this.target.value.substring(this.start,this.end): "";
    },
    setSelectedText : function(text, secondtag) {
        if (this.iesel) {
            if (typeof(secondtag) == "string") {
                var l = this.iesel.text.length;
                this.iesel.text = text + this.iesel.text + secondtag;
                this.iesel.moveEnd("character", -secondtag.length);
                this.iesel.moveStart("character", -l);  
            } else {
                this.iesel.text = text;
            }
            this.iesel.select();
        } else if (this.start >= 0 && this.end >= this.start) {
            var left = this.target.value.substring(0, this.start);
            var right = this.target.value.substr(this.end);
            var scont = this.target.value.substring(this.start, this.end);
            if (typeof(secondtag) == "string") {
                this.target.value = left + text + scont + secondtag + right;
                this.end = this.target.selectionEnd=this.start+text.length+scont.length;
                this.start = this.target.selectionStart = this.start + text.length;    
            } else {
                this.target.value = left + text + right;
                this.end = this.target.selectionEnd = this.start + text.length;
                this.start = this.target.selectionStart = this.start + text.length;
            }
            this.target.scrollTop = this.scroll;
            this.target.focus();
        } else {
            this.target.value += text + ((typeof(secondtag) == "string") ? secondtag: "");
            if (this.scroll >= 0) this.target.scrollTop = this.scroll;
        }
    }
}
function _textareaSaver() {
    if(document.selection) {
        this.carretHandler.iesel = document.selection.createRange().duplicate();
    } else if(typeof(this.selectionStart) != "undefined") {
        this.carretHandler.start = this.selectionStart;
        this.carretHandler.end = this.selectionEnd;
        this.carretHandler.scroll = this.scrollTop;
    } else {
        this.carretHandler.start = this.carretHandler.end = -1;
    }
}

// Client functions
function setBold(id) { // Bold
    getTextAreaSelection(id).setSelectedText('<b>', '</b>');
}
function setItalic(id) { // Italic
    getTextAreaSelection(id).setSelectedText('<i>', '</i>');
}
function setUnderline(id) { // Underline
    getTextAreaSelection(id).setSelectedText('<u>', '</u>');
}
function setLink(id, url) { // Link
	var url = prompt("Enter URL", (url ? url : "http://"));
	if (!url || url == "") return;
	if (checkURL(url)) {
		getTextAreaSelection(id).setSelectedText("<a href=\""+url+"\">", "</a>");
	} else {
		alert("URL is not correct");
		setLink(id, url);
	}
}

function checkURL(url) {
	var re = /^(http|https|ftp|news)+(:\/\/){1}[a-zA-Z_\-]+\.(.*)$/i;
	return re.test(url);
}

// Tab
function addHandler(object, event, handler, useCapture) {
    if (object.addEventListener) {
        object.addEventListener(event, handler, useCapture ? useCapture : false);
    } else if (object.attachEvent) {
        object.attachEvent('on' + event, handler);
    }
}
function tabInsertInit(obj) {
    var _obj = obj;
    if (window.opera) addHandler(obj, "keypress", function(evt) {tabInsert(evt, _obj);});
    else addHandler(obj, "keydown", function(evt) {tabInsert(evt, _obj);});
}
function tabInsert(evt, obj) {
    evt = evt || window.event;
    var key = evt.keyCode || evt.which;
    if (key == 9 && !evt.ctrlKey && !evt.shiftKey) {
        if (obj.nodeName) if (obj.nodeName.toLowerCase() == "textarea") obj.focus();
        if(document.selection) {
            var iesel = document.selection.createRange().duplicate();
            iesel.text = "\t";
        } else {
            var start = obj.selectionStart;
            var end = obj.selectionEnd;
            var left = obj.value.substring(0, start);
            var right = obj.value.substring(end);
            var scroll = obj.scrollTop;
            obj.value = left + "\t" + right;
            obj.selectionStart = obj.selectionEnd = start + 1;
            obj.scrollTop = scroll;
            obj.focus();
        }
        if(evt.preventDefault) evt.preventDefault();
        evt.returnValue = false;
        return false;
    }
}
