/*
 *
 * Copyright (c) 2010 C. F., Wong (<a href="http://cloudgen.w0ng.hk">Cloudgen Examplet Store</a>)
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
﻿
(function (k, e, i, j) {
    k.fn.caret = function (b, l) {
        var a, c, f = this[0], d = k.browser.msie;
        if (typeof b === "object" && typeof b.start === "number" && typeof b.end === "number") {
            a = b.start;
            c = b.end
        } else if (typeof b === "number" && typeof l === "number") {
            a = b;
            c = l
        } else if (typeof b === "string")if ((a = f.value.indexOf(b)) > -1)c = a + b[e]; else a = null; else if (Object.prototype.toString.call(b) === "[object RegExp]") {
            b = b.exec(f.value);
            if (b != null) {
                a = b.index;
                c = a + b[0][e]
            }
        }
        if (typeof a != "undefined") {
            if (d) {
                d = this[0].createTextRange();
                d.collapse(true);
                d.moveStart("character", a);
                d.moveEnd("character", c - a);
                d.select()
            } else {
                this[0].selectionStart = a;
                this[0].selectionEnd = c
            }
            this[0].focus();
            return this
        } else {
            if (d) {
                c = document.selection;
                if (this[0].tagName.toLowerCase() != "textarea") {
                    d = this.val();
                    a = c[i]()[j]();
                    a.moveEnd("character", d[e]);
                    var g = a.text == "" ? d[e] : d.lastIndexOf(a.text);
                    a = c[i]()[j]();
                    a.moveStart("character", -d[e]);
                    var h = a.text[e]
                } else {
                    a = c[i]();
                    c = a[j]();
                    c.moveToElementText(this[0]);
                    c.setEndPoint("EndToEnd", a);
                    g = c.text[e] - a.text[e];
                    h = g + a.text[e]
                }
            } else {
                g =
                    f.selectionStart;
                h = f.selectionEnd
            }
            a = f.value.substring(g, h);
            return {
                start: g, end: h, text: a, replace: function (m) {
                    return f.value.substring(0, g) + m + f.value.substring(h, f.value[e])
                }
            }
        }
    }
})(mQuery, "length", "createRange", "duplicate");