
	String.prototype.trim=function(){
	    return this.replace(/^\s*|\s*$/g,'');
	}
	
	String.prototype.ltrim=function(){
	    return this.replace(/^\s*/g,'');
	}
	
	String.prototype.rtrim=function(){
	    return this.replace(/\s*$/g,'');
	}

	function textarea_setSelection(textarea, idx, cnt) {
	    textarea.focus();
	    if (document.selection) {
	        textarea.value = preprocess(textarea.value);
	        var range = document.selection.createRange();
	        try {
	            range.moveToElementText(textarea);
	        } catch (e) {
	            range.expand('textedit');
	        }
	        range.collapse(true);
	        range.moveStart("character", idx);
	        range.moveEnd("character", cnt);
	        range.select();
	        range.scrollIntoView();
	    } else if (textarea.setSelectionRange) {
	        textarea.setSelectionRange(idx, idx + cnt);
	        var text = textarea.value;
	        var selline = 0;
	        var linecnt = 0;
	        for (var i = 0; i < text.length; i++) {
	            if (text.substr(i, 1) == '\n') {
	                if (i < idx)
	                    selline++;
	                linecnt++;
	            }
	        }
            textarea.scrollTop = Math.round(textarea.scrollHeight / (linecnt + 1) * selline);
	    }
	}

	function textarea_getSelection(textarea) {
	    var selobj = new Object();
	    selobj.text = "";
	    selobj.idx = 0;
	    if (document.selection) {
	        textarea.focus();
	        var range = document.selection.createRange();
	        selobj.text = range.text;
            // We'll use this as a 'dummy'
            var stored_range = range.duplicate();
            // Select all text
            try {
                stored_range.moveToElementText(textarea);
            } catch (e) {
                stored_range.expand('textedit');
            }
            // Now move 'dummy' end point to end point of original range
            stored_range.setEndPoint('EndToEnd', range);
            // Now we can calculate start and end points
            selobj.idx = preprocess(stored_range.text).length - preprocess(range.text).length;
        } else if (textarea.setSelectionRange) {
            selobj.idx = textarea.selectionStart;
            selobj.text = textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
	    }
	    return selobj;
	}

	function textarea_replaceSelection(textarea, s) {
	    var scroll_top = textarea.scrollTop;
	    if (document.selection) {
	        textarea.focus();
	        var range = document.selection.createRange();
	        range.text = s;
	        range.select();
	    } else if (textarea.setSelectionRange) {
	        var selection_start = textarea.selectionStart;
	        textarea.value = textarea.value.substring(0, selection_start) + s + textarea.value.substring(textarea.selectionEnd);
	        textarea.setSelectionRange(selection_start + s.length, selection_start + s.length);
	    }
	    textarea.focus();
	    textarea.scrollTop = scroll_top; 
	}

	function htmlEncode(str) {
		var elem1 = document.createElement('div');
		var elem2 = document.createTextNode(str);
		elem1.appendChild(elem2);
		return elem1.innerHTML;
    }

    function jsEncode(str) {
        var replaces = [
            ["\\", "\\\\"],
            ["\'", "\\\'"]
        ];
        for (var j = 0; j < replaces.length; j++) {
            var i = 0;
            while (true) {
                var idx = str.indexOf(replaces[j][0], i);
                if (idx == -1)
                    break;
                var s1 = str.substr(0, idx);
                var s2 = str.substr(idx + 1);
                str = s1 + replaces[j][1] + s2;
                i = s1.length + replaces[j][1].length;
            }
        }
        return str;
	}
	
	function angleadd(angle, add) {
		angle += add;
		while (angle < 0) angle += 360;
		while (angle >= 360) angle -= 360;
		return angle;
	}
	
	function anglesub(angle, sub) {
		return angleadd(angle, -sub);
	}
	  
	function numberformat(a) {
		a += '';
		x = a.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}
	
	function timespanformat(h) {
		var ret = "N/A";
		if (h > 0) {
			ret = "";
			var m = Math.floor((h - Math.floor(h))*60);
			if (m > 0) {
				ret = " " + m + "m";
			}
			h = Math.floor(h);
			var d = Math.floor(h / 24);
			h = h % 24;
			if (h > 0)
				ret = " " + h + "h" + ret;
			if (d) {
				var w = Math.floor(d / 7);
				d = d % 7;
				if (d > 0)
					ret = " " + d + "d" + ret;
				if (w > 0)
					ret = w + "w" + ret;
			}
		}
		return ret;
    }

    function isalnum(aChar) {
        return (isdigit(aChar) || isalpha(aChar));
    }

    function isdigit(aChar) {
        myCharCode = aChar.charCodeAt(0);
        if ((myCharCode > 47) && (myCharCode < 58)) {
            return true;
        }
        return false;
    }

    function isalpha(aChar) {
        myCharCode = aChar.charCodeAt(0);
        if (((myCharCode > 64) && (myCharCode < 91)) || ((myCharCode > 96) && (myCharCode < 123))) {
            return true;
        }
        return false;
    }
	
	