if (typeof (MI) == "undefined" || MI == null) {
    MI = {};
}

function confirmLogout() { return confirm('Are you sure you want to log out?'); }
function MI_setFocus(ctlId){
    if (ctlId) {
        var e = document.getElementById(ctlId);
        if (e && e.focus) {
            e.focus();
        }
    }
}
function MI_initAutocomplete(inputControlId, resultsContainerId, url) {
    var ds = new YAHOO.widget.DS_XHR(url, ["\n"]);
    ds.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT;
    ds.maxCacheEntries = 60;
    ds.queryMatchSubset = true;
    ds.queryMatchCase = false;
    var ac = new YAHOO.widget.AutoComplete(inputControlId, resultsContainerId, ds);
    ac.minQueryLength = 1;
    ac.queryDelay = 0.17;
    ac.maxResultsDisplayed = 10;
    ac.autoHighlight = false;
    ac.formatResult = function(resultData, query, match) {
        return resultData[0].replace(new RegExp("(" + query + ")", "ig"), '<b>$1</b>');
    };
};
///Map func 'fn' over each element in 'items'.  Scope of 'fn' is 'scope'; first argument passed to 'fn' is the element being processed. If 'args' is supplied, it
//will be passed as another argument to fn (to send multiple args, make 'args' an array of objects).
if (!window.map) {
    window.map = function(items, fn, scope, args) {
        var items2 = new Array(items.length);
        if (items && items.length && fn) {
            for (i = 0; i < items.length; i++) {
                items2[i] = fn.apply(scope, [items[i], args]);
            }
        }
        return items2;
    };
}
//Foldl (aka reduce): function applied to each element in 'items', returning a single result value.
if (!window.foldl) {
    window.foldl = function(items, fn, acc, scope, args) {
        if (items && items.length && fn) {
            for (i = 0; i < items.length; i++) {
                acc = fn.apply(scope, [items[i], acc, args]);
            }
        }
        return acc;
    };
}
//Scroll a textbox to the bottom of it's displayed text.
function MI_scrollToBottom(ctlId) {
    if (ctlId) {
        var e = document.getElementById(ctlId);
        if (e != null && typeof (e.scrollTop) != "undefined" && typeof (e.scrollHeight) != "undefined") {
            e.scrollTop = e.scrollHeight;
        }
    }
}
//Select/deselect all checkboxes in a grid
function MI_toggleGridCheckboxes(sender, rootId, setChk) {
    var elements = YAHOO.util.Dom.getElementsByClassName("", "input", document.getElementById(rootId));
    var fn = function(X){if (X != sender && X.type == "checkbox" && !X.disabled) { X.checked = setChk; } };
    window.map(elements, fn);
};
/*Fix multiple select issue with radio buttons in a repeater: http://www.developer.com/net/asp/article.php/3623096/ASPNET-Tip-Using-RadioButton-Controls-in-a-Repeater.htm */
function MI_setUniqueRadioButton(nameregex, current) {
    re = new RegExp(nameregex);
    for (i = 0; i < document.forms[0].elements.length; i++) {
        elm = document.forms[0].elements[i]
        if (elm.type == 'radio') {
            if (re.test(elm.name)) {
                elm.checked = false;
            }
        }
    }
    current.checked = true;
}
function MI_setSelectedDateIfBefore(startDatePickerId, endDatePickerId) {
    var startDatePicker = $find(startDatePickerId);
    if (startDatePicker) {
        var endDatePicker = $find(endDatePickerId);
        if (endDatePicker) {
            if (typeof (date) == "string") {
                date = new Date(date);
            }
            var startDate = startDatePicker.get_selectedDate();
            var endDate = endDatePicker.get_selectedDate();
            if (endDate == null || endDate < startDate) {
                endDatePicker.set_selectedDate(startDate);
            }
        }
    }
}
function MI_ensureEndDateIsAfterStartDate(startDatePickerId, endDatePickerId, errorMessage) {
    var startDatePicker = $find(startDatePickerId);
    if (startDatePicker) {
        var endDatePicker = $find(endDatePickerId);
        if (endDatePicker) {
            if (startDatePicker.get_selectedDate() > endDatePicker.get_selectedDate()) {
                alert(errorMessage);
                endDatePicker.set_selectedDate(startDatePicker.get_selectedDate());
            }            
        }
    }
}
//This section used to be in the include.js file
function confirmClick(question) { return confirm(question); }

function confirmClickPopup(question, url) {
    var response = confirmClick(question);
    if (response === true) {       
        window.open(url, "_blank");
        window.focus();
    }
    return response;
};

// Open a page in new window
function openwindow(URL, width, height) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + "=window.open(URL," + id + ",\"width=" + width + ",height=" + height + ",toolbar=0,scrollbars=1,location=1,statusbar=0,menubar=0,resizable=1\");");
}
function openwindow2(URL, width, height) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + "=window.open(URL," + id + ",\"width=" + width + ",height=" + height + ",toolbar=1,scrollbars=1,location=1,status=1,menubar=1,resizable=1\");");
}
function openwindow3(URL, width, height) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + "=window.open(URL," + id + ",\"width=" + width + ",height=" + height + ",toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1\");");
}
function openwindownoscroll(URL, width, height) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + "=window.open(URL," + id + ",\"width=" + width + ",height=" + height + ",toolbar=0,scrollbars=0,location=0,status=0,menubar=0,resizable=0\");");
}
function MM_openBrWindow(theURL, winName, features) { //v2.0
    window.open(theURL, winName, features);
}
function uploadwaiting(URL) {
    day = new Date();
    id = day.getTime();
    eval("page" + id + "=window.open(URL," + id + ",\"width=" + width + ",height=" + height + ",toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0\");");
}
/* ---------------------------------------
selectAll
author: Vincent Puglia, GrassBlade Software
site:   http://members.aol.com/grassblad
usage:
<input type="radio" name="selectall"  onclick="selectAll(this.form,0);">Select All
<input type="radio" name="selectall"  onclick="selectAll(this.form,1);">Inverse All
------------------------------------------- */
function selectAll(formObj, isInverse) {
    for (var i = 0; i < formObj.length; i++) {
        fldObj = formObj.elements[i];
        if (fldObj.type == 'checkbox') {
            if (isInverse)
                fldObj.checked = (fldObj.checked) ? false : true;
            else fldObj.checked = true;
        }
    }
}
function deselectAll(formObj, isInverse) {
    for (var i = 0; i < formObj.length; i++) {
        fldObj = formObj.elements[i];
        if (fldObj.type == 'checkbox') {
            fldObj.checked = false;
        }
    }
}
//works for strange versions of NN
function MMO_replaceButtonText(buttonId, text) {
    if (document.getElementById) {
        var button = document.getElementById(buttonId);
        if (button) {
            if (button.childNodes[0]) {
                button.childNodes[0].nodeValue = text;
            }
            else if (button.value) {
                button.value = text;
            }
            else //if (button.innerHTML)
            {
                button.innerHTML = text;
            }
        }
    }
}
function MMO_getStyleClass(className) {
    if (document.all) {
        for (var s = 0; s < document.styleSheets.length; s++) {
            for (var r = 0; r < document.styleSheets[s].rules.length; r++) {
                if (document.styleSheets[s].rules[r].selectorText == '.' + className) {
                    return document.styleSheets[s].rules[r];
                }
            }
        }
    }
    else if (document.getElementById) {
        for (var s = 0; s < document.styleSheets.length; s++) {
            for (var r = 0; r < document.styleSheets[s].cssRules.length; r++) {
                if (document.styleSheets[s].cssRules[r].selectorText == '.' + className) {
                    return document.styleSheets[s].cssRules[r];
                }
            }
        }
    }
    return null;
}
function ValidatingTextBox_Validate(sender, required, validationExpression, errorCssClass) {
    if (sender) {
        sender.className = sender.className.replace(errorCssClass, "");
        var text = sender.value;
        if (text.length == 0 && required) {
            sender.className = sender.className + " " + errorCssClass;
            return;
        }
        if (validationExpression) {
            var re = new RegExp(validationExpression, "m");
            if (!re.test(text)) {
                sender.className = sender.className + " " + errorCssClass;
                return;
            }
        }
    }
}
function ValidatingDropDownList_Validate(sender, errorCssClass) {
    if (sender) {
        sender.className = sender.className.replace(errorCssClass, "");
        var op = sender.options[sender.selectedIndex];
        if (op == null || op.value == null || op.value.length == 0) {
            sender.className = sender.className + " " + errorCssClass;
            return;            
        }
    }
}
function mi_scriptPreloaderLoad(url) {
    try
    {            
        var type = 'js';
        if (url.substr(url.length - 4) === ".css") {
            type = "css";            
        }        
        miYuiLoader.addModule({
            name: url,
            type: type,
            fullpath: url
        });            
        miYuiLoader.require(url);            
    }
    catch (e)
    {
        if (console) 
            console.log(e);
    }
}

/*String extensions*/

String.format = function() {
  var args = arguments;
  return this.replace(/{(\d+)}/g, function(match, number) { 
    return typeof args[number] != 'undefined' ? args[number] : match;
  });
};
String.prototype.format = String.format;

/*End string extensions.*/

/* EXPERIMENTAL STUFF! */

//if (!window.mapworkflow) {
//    window.mapworkflow = function (items, bl, scope, args) {
//        //bl is an array of functions that make up some unit of business logic.
//        //We'll map each function of BL over the list of items, sequentially, to perform all business logic on the entire data list.
//        var items2 = new Array(items.length);
//        for (j = 0; j < bl.length; j++) {
//            var fn = bl[j];
//            if (items && items.length && fn) {
//                for (i = 0; i < items.length; i++) {
//                    items2[i] = fn.apply(scope, [items[i], args]);
//                }
//                items = items2;
//            }
//        }
//        return items2;
//    };
//}
