function binarySearch(array, find, caseInsensitive, getSubstring, arrayCheckThisIndex) 
{
/*
Source: unitedscripters.com
the last 3 parameters are optional

Precondition:
The array must be naturally sorted. Use sort(numSort), if neccessary
*/
    if (!array ||
        typeof array != "object" ||
        typeof find == "undefined" || !array.length) {
        return null;
    }
    find = !caseInsensitive ? find : find.toLowerCase();
    var low = 0;
    var high = array.length - 1;
    var highOnTop = array[0] > array[array.length - 1] ? 1 : 0;
    while (low <= high) {
        var aTry = parseInt((low + high) / 2);
        var checkThis = typeof arrayCheckThisIndex == "undefined" ? array[aTry] : array[aTry][arrayCheckThisIndex];
        checkThis = !caseInsensitive ? checkThis : checkThis.toLowerCase();
        checkThis = !getSubstring ? checkThis : checkThis.substring(0, find.length);
        if (!highOnTop) {
            if (checkThis < find) {
                low = aTry + 1;
                continue;
            }
            if (checkThis > find) {
                high = aTry - 1;
                continue;
            }
        } else {
            if (checkThis > find) {
                low = aTry + 1;
                continue;
            }
            if (checkThis < find) {
                high = aTry - 1;
                continue;
            }
        }
        return aTry;
    }
    return null;
}
