/* Cross-Browser Split 1.0.1
(c) Steven Levithan <stevenlevithan.com>; MIT License
An ECMA-compliant, uniform cross-browser split method */

(function(window, undefined) {

    var cbSplit;
    
    // avoid running twice, which would break `cbSplit._nativeSplit`'s reference to the native `split`
    if (!cbSplit) {
        
        cbSplit = function(str, separator, limit) {
            // if `separator` is not a regex, use the native `split`
            if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
                return cbSplit._nativeSplit.call(str, separator, limit);
            }
        
            var output = [],
                lastLastIndex = 0,
                flags = (separator.ignoreCase ? "i" : "") +
                        (separator.multiline  ? "m" : "") +
                        (separator.sticky     ? "y" : ""),
                separator = RegExp(separator.source, flags + "g"), // make `global` and avoid `lastIndex` issues by working with a copy
                separator2, match, lastIndex, lastLength;
        
            str = str + ""; // type conversion
            if (!cbSplit._compliantExecNpcg) {
                separator2 = RegExp("^" + separator.source + "$(?!\\s)", flags); // doesn't need /g or /y, but they don't hurt
            }
        
            /* behavior for `limit`: if it's...
            - `undefined`: no limit.
            - `NaN` or zero: return an empty array.
            - a positive number: use `Math.floor(limit)`.
            - a negative number: no limit.
            - other: type-convert, then use the above rules. */
            if (limit === undefined || +limit < 0) {
                limit = Infinity;
            } else {
                limit = Math.floor(+limit);
                if (!limit) {
                    return [];
                }
            }
        
            while (match = separator.exec(str)) {
                lastIndex = match.index + match[0].length; // `separator.lastIndex` is not reliable cross-browser
        
                if (lastIndex > lastLastIndex) {
                    output.push(str.slice(lastLastIndex, match.index));
        
                    // fix browsers whose `exec` methods don't consistently return `undefined` for nonparticipating capturing groups
                    if (!cbSplit._compliantExecNpcg && match.length > 1) {
                        match[0].replace(separator2, function () {
                            for (var i = 1; i < arguments.length - 2; i++) {
                                if (arguments[i] === undefined) {
                                    match[i] = undefined;
                                }
                            }
                        });
                    }
        
                    if (match.length > 1 && match.index < str.length) {
                        Array.prototype.push.apply(output, match.slice(1));
                    }
        
                    lastLength = match[0].length;
                    lastLastIndex = lastIndex;
        
                    if (output.length >= limit) {
                        break;
                    }
                }
        
                if (separator.lastIndex === match.index) {
                    separator.lastIndex++; // avoid an infinite loop
                }
            }
        
            if (lastLastIndex === str.length) {
                if (lastLength || !separator.test("")) {
                    output.push("");
                }
            } else {
                output.push(str.slice(lastLastIndex));
            }
        
            return output.length > limit ? output.slice(0, limit) : output;
        };
        
        cbSplit._compliantExecNpcg = /()??/.exec("")[1] === undefined; // NPCG: nonparticipating capturing group
        cbSplit._nativeSplit = String.prototype.split;
    
    } // end `if (!cbSplit)`
    
    // for convenience...
    String.prototype.split = function(separator, limit) {
        return cbSplit(this, separator, limit);
    };

})(window);
