ms = {};
(window.onpopstate = function () {
    var match, pl = /\+/g,
    search = /([^&=]+)=?([^&]*)/g,
    decode = function (s) {
        return decodeURIComponent(s.replace(pl, " "));
    },
    query = window.location.search.substring(1);
    ms.queryParms = {};
    while (match = search.exec(query)) {
        ms.queryParms[decode(match[1])] = decode(match[2])
    }
})();
ms.currentId = parent.Xrm.Page.data.entity.getId();
ms.tabRecords = [[], [], [], []];
ms.optionSetQueue = [];
ms.deferredUpdates = [];
ms.baseCurrency = "&euro;&nbsp";
ms.notifiers = [];
var tCnt = 0;
$(".ms-crm-tabcolumn1", parent.document.body).css("padding-left", "20px");
$(".ms-crm-tabcolumn2", parent.document.body).css("padding-left", "0px");

function populateClient360() {
    var formType = parent.Xrm.Page.ui.getFormType();
    switch (formType) {
    case 1:
        case 5:
        case 6:
        break;
    case 2:
        case 3:
        var singleViewSettings = ms.queryParms["data"];
        if (singleViewSettings === undefined || singleViewSettings == "") {
            singleViewSettings = "Contact - Basic Single View"
        }
        retrieveConfigChainRetrieveData(singleViewSettings);
        break;
    case 4:
        default:
        break;
    }
}
function handleTabDisplay(showMe) {
    for (var i = 1; i < 5; i++) {
        if (i == showMe) {
            $("#containerTab" + i).show();
            $("#htab" + i).addClass("selected");
        } else {
            $("#containerTab" + i).hide();
            $("#htab" + i).removeClass("selected");
        }
    }
}
function retrieveConfigChainRetrieveData(singleViewSettings) {
    retrieveMultiple("ms_singleviewsettingSet", "ms_name eq '" + singleViewSettings + "'", "", null, processConfigChainRetrieveData, null, false);
}
function processConfigChainRetrieveData(results) {
    if (results.length != 1) {
        alert("No Matching Configuration Record Found");
        return;
    }
    ms.Config = results[0];
    ms.baseCurrency = getCurrencySymbol(ms.Config["ms_BaseCurrency"].Name);
    if (ms.Config.ms_RandomWordList1 == null || ms.Config.ms_RandomWordList1 == "") {
        ms.Config.ms_RandomWordList1 = "Gold,Silver,Bronze,Platinum"
    }
    if (ms.Config.ms_RandomWordList2 == null || ms.Config.ms_RandomWordList2 == "") {
        ms.Config.ms_RandomWordList2 = "Loan,Credit Card,Deposit"
    }
    ms.Config.randomWords1 = ms.Config.ms_RandomWordList1.split(",");
    ms.Config.randomWords2 = ms.Config.ms_RandomWordList2.split(",");
    if (ms.Config.ms_ShowBestNextActions) {
        $("#containerTab1").addClass("smaller");
        populateBestNextActions();
    } else {
        $("#containerTab1").removeClass("smaller");
    }

    for (var tabno = 1; tabno <= 4; tabno++) {
        var prefix = "ms_Tab" + tabno;
        ms.Config["ms_HTab" + tabno + "Content"] = resolveInternalOptionText("Content", ms.Config["ms_HTab" + tabno + "Content"].Value);
        setupTab(tabno, ms.Config["ms_HTab" + tabno + "Name"]);
        var tabContent = ms.Config["ms_HTab" + tabno + "Content"];
        switch (tabContent) {
        case "Tiles":
            var entityODataName = ms.Config[prefix + "Entity"];
            if (entityODataName != null) {
                ms.Config[prefix + "EntityLogicalName"] = entityODataName.substr(0, entityODataName.length - 3).toLowerCase();
                var filter = constructFilter(prefix + "ForeignKey", ms.Config[prefix + "Filter"].Value, ms.Config[prefix + "CustomFilter"]);
                var iconSource = resolveInternalOptionText("Icon", ms.Config[prefix + "Icon"].Value);
                if (iconSource == "From Field on Entity") {
                    ms.Config[prefix + "AdditionalFields"] = concatField(ms.Config[prefix + "AdditionalFields"], ms.Config[prefix + "IconFile"]);
                }
                var colorSource = resolveInternalOptionText("Color", ms.Config[prefix + "Color"].Value);
                if (colorSource == "From Field on Entity") {
                    ms.Config[prefix + "AdditionalFields"] = concatField(ms.Config[prefix + "AdditionalFields"], ms.Config[prefix + "ColorField"]);
                }
                var fieldList = concatFields(ms.Config[prefix + "Zone1"], ms.Config[prefix + "Zone2"], ms.Config[prefix + "Zone3"], ms.Config[prefix + "Title"], ms.Config[prefix + "PrimaryKey"], ms.Config[prefix + "ForeignKey"], ms.Config[prefix + "AdditionalFields"]);
                var orderby = ms.Config[prefix + "OrderBy"];
                var sortorder = ms.Config[prefix + "SortOrder"].Value;
                orderby = (orderby == "null") ? null : orderby += (sortorder == 717660001) ? " desc" : " asc";
                retrieveMultiple(ms.Config[prefix + "Entity"], filter, fieldList, orderby, processResults, tabno, false);
            }
            break;
        case "CRM Web Resource":
            processWebResource(tabno, "#containerTab" + tabno)
            break;
        default:
            break;
        }
    }
}
function constructFilter(foreignKey, filterType, customFilter) {
    customFilter = (customFilter + "//").split("//")[0];
    switch (filterType) {
    case 717660000:
        return ms.Config[foreignKey] + "/Id eq guid'" + ms.currentId + "'";
    case 717660001:
        return ms.Config[foreignKey] + "/Id eq guid'" + ms.currentId + "' and StateCode/Value eq 0";
    case 717660002:
        return ms.Config[foreignKey] + "/Id eq guid'" + ms.currentId + "' and " + customFilter;
    case 717660003:
        return ms.Config[foreignKey] + "/Id eq guid'" + ms.currentId + "' and StateCode/Value eq 0 and " + customFilter;
    case 717660004:
        return customFilter;
    }
}
function setupTab(i, name) {
    if (name == null || name == "") {
        $("#htab" + i).hide();
        $("#containerTab" + i).hide();
    } else {
        $("#tab" + i + "title").text(name);
    }
}
function processResults(results, tabno) {
    $("#tab" + tabno + "Count").text(" [" + results.length + "]");
    for (var i = 1; i <= 7; i++) {
        var el = $("#msAlert" + i);
        var t = el.html();
        if (t != null) {
            t = t.replace("&amp;Cnt" + tabno, results.length + "");
            el.html(t);
        }
    }
    var records = [];
    var htab = "ms_Tab" + tabno;
    var tileLayout = resolveInternalOptionText("Tile Layout", ms.Config[htab + "TileLayout"].Value);
    var iconSource = resolveInternalOptionText("Icon", ms.Config[htab + "Icon"].Value);
    var colorSource = resolveInternalOptionText("Color", ms.Config[htab + "Color"].Value);
    var entityLogicalName = ms.Config[htab + "EntityLogicalName"];
    for (var i = 0; i < results.length; i++) {
        records[i] = {};
        if (results[i].TransactionCurrencyId === undefined) {
            results[i].tranCurrency = (ms.Config.ms_DefaultCurrencyDisplay === null) ? "&euro;&nbsp;" : ms.Config.ms_DefaultCurrencyDisplay;
        } else {
            results[i].tranCurrency = getCurrencySymbol(results[i].TransactionCurrencyId.Name);
        }
        records[i].title = polishOutput(results[i], entityLogicalName, htab + "Title");
        records[i].zone1 = polishOutput(results[i], entityLogicalName, htab + "Zone1");
        records[i].zone2 = polishOutput(results[i], entityLogicalName, htab + "Zone2");
        records[i].zone3 = polishOutput(results[i], entityLogicalName, htab + "Zone3");
        switch (iconSource) {
        case "Specific":
            records[i].icon = ms.Config[htab + "IconFile"];
            break;
        case "From Field on Entity":
            var t = results[i][ms.Config[htab + "IconFile"]];
            if (t == null || t == "null" || t == "") {
                t = "Temp.png"
            }
            records[i].icon = t;
            break;
        case "By Status Code":
            records[i].icon = "AssetMgt/Temp.png";
            break;
        case "By Probability":
            records[i].icon = "Oppty/Opp" + results[i].CloseProbability + ".png";
            break;
        case "Custom JavaScript Function":
            records[i].icon = top.window.determineCustomIcon(results[i], entityLogicalName);
            break;
        default:
            records[i].icon = "General/Temp.png";
        }
        records[i].guid = results[i][ms.Config[htab + "PrimaryKey"]];
        var n = records[i].icon.indexOf("_");
        if (n == -1) {
            records[i].icon = "../Icons/" + records[i].icon;
        }
        switch (colorSource) {
        case "Specific":
            records[i].color = ms.Config[htab + "ColorField"];
            break;
        case "From Field on Entity":
            records[i].color = results[i][ms.Config[htab + "ColorField"]];
            switch (records[i].color) {
            case "Green":
                records[i].color = "DarkGreen";
                break;
            case "Amber":
                records[i].color = "DarkOrange";
                break;
            case "Red":
                records[i].color = "DarkRed";
                break;
            }
            break;
        case "By Status Code":
            records[i].color = getColorByStatusCode(entityLogicalName, results[i].StatusCode.Value);
            break;
        case "By Probability":
            records[i].color = opportunityColorsByProbability[results[i].CloseProbability];
            break;
        case "Custom JavaScript Function":
            records[i].color = top.window.determineCustomColor(results[i], entityLogicalName);
            break;
        default:
            records[i].color = "DarkGray";
        }
        var elbase = "htab" + tabno + "-";
        if (i <= 9) {
            elbase += "0" + i
        } else {
            elbase += i
        }
        var attribute = "";
        var html = "<div id='";
        html += elbase + "' class='" + tileLayout + "Tile'>";
        html += "<div id='" + elbase + "Icon' class='" + tileLayout + "TileIcon' ><img src='" + records[i].icon + "' /></div>";
        for (var z = 1; z < 4; z++) {
            var id = elbase + "Zone" + z;
            attribute = ms.Config[htab + "Zone" + z];
            if (records[i]["zone" + z] != undefined && records[i]["zone" + z].toString().substr(0, 6) == "!Defer") {
                deferOptionSetUpdate(entityLogicalName, attribute, records[i]["zone" + z], "#" + id);
                records[i]["zone" + z] = "..."
            }
            html += "<div id='" + id + "' class='" + tileLayout + "TileZone" + z + "' >" + records[i]["zone" + z] + "</div>";
        }
        if (records[i].title != undefined && records[i].title.toString().substr(0, 6) == "!Defer") {
            attribute = ms.Config["ms_Tab" + tabno + "Title"];
            deferOptionSetUpdate(entityLogicalName, attribute, records[i].title, "#" + elbase + "Title");
            records[i].title = "..."
        }
        html += "<div id='" + elbase + "Title" + "' class='" + tileLayout + "TileTitle' >" + records[i].title + "</div>";
        html += "</div>";
        $("#containerTab" + tabno).append(html);
        elbase = "#" + elbase;
        $(elbase).css("background-color", records[i].color);
    }
    ms.tabRecords[tabno - 1] = records;
    $("#containerTab" + tabno).find("." + tileLayout + "Tile").click(function (el) {
        var htab = parseInt(el.currentTarget.id.substr(4, 1));
        var tile = parseInt(el.currentTarget.id.substr(6, 2));
        var entityLogicalName = ms.Config["ms_Tab" + htab + "EntityLogicalName"];
        var guid = ms.tabRecords[htab - 1][tile].guid;
        parent.Xrm.Utility.openEntityForm(entityLogicalName, guid);
    });
    queueOptionSetLabels();
    return records;
}
function populateBestNextActions() {

    $("#guidance").html(ms.Config["ms_GuidanceName"]);
    var html = "";
    for (var i = 1; i <= 7; i++) {
        var id = "msAlert" + i;
        var action = ms.Config["ms_NextBestAction" + i];
        if (action != null) {
            html += "<div id='" + id + "' class='action'>&raquo;&nbsp;" + polishAction(action) + "</div>"
        }
    }
    $("#bestNextActions").append(html);
    for (var i = 1; i <= 4; i++) {
        id = "#button" + i;
        var txt = ms.Config["ms_Button" + i + "Name"];
        if (txt == null) {
            $(id).hide();
        } else {
            $(id + "Text").html(txt);
        }
    }
    for (var i = 1; i <= 4; i++) {
        id = "#button" + i;
        $(id).click(quickButtonClicked);
    }
}
function quickButtonClicked(el) {
    var i = parseInt(el.currentTarget.id.substr(6, 1));
    var buttonAction = resolveInternalOptionText("QuickButton", ms.Config["ms_Button" + i + "Action"].Value);
    var context = {};
    context.foreignKey = ms.Config["ms_Button" + i + "ForeignKey"];
    context.primaryKey = ms.Config["ms_Button" + i + "PrimaryKey"];
    context.entityLogicalName = ms.Config["ms_Button" + i + "Entity"];
    context.formId = null;
    switch (buttonAction) {
    case "Create New (Empty) Record":
        parent.Xrm.Utility.openEntityForm(ms.Config["ms_Button" + i + "Entity"].replace("Set", "").toLowerCase());
        break;
    case "Create New Related Record":
        createNewAssociatedRecord(context);
        break;
    case "Quick Create New (Empty) Record":
        alert(buttonAction);
        break;
    case "Pop Up Web Resource":
        alert(buttonAction);
        break;
    case "Show Associated Records":
        alert(buttonAction);
        break;
    case "Invoke CRM Action":
        var actionInternalName = getActionInternalname(i);
        ExecuteActionInCrm(ms.currentId, "contact", actionInternalName);
        break;
    case "Custom Javascript Function":
        top.window.quickButtonClicked(i, buttonAction, context)
        break;
    case "Do Nothing":
        break;
    case null:
        default:
        break;
    }
}
function getActionInternalname(i) {
    var name = ms.Config["ms_Button" + i + "CRMAction"].Name.replace(/ /g, "");
    var prefix = ms.Config["ms_Button" + i + "CRMActionPrefix"];
    return (prefix + "_" + name).replace("__", "_");
}
function ExecuteActionInCrm(guid, entityLogicalName, processName) {
    try {
        var requestXml = CreateActionRequest(guid, entityLogicalName, processName);
        var response = XrmServiceToolkit.Soap.Execute(requestXml);
        flashFormNotification("CRM Action triggered.", "INFO", processName);
        return response;
    } catch(e) {
        flashFormNotification("CRM Action failed.", "WARNING", processName);
    }
}
function flashFormNotification(message, level, processName) {
    ms.notifiers.push(ms.notifiers.length + ":" + processName);
    parent.Xrm.Page.ui.setFormNotification(message, level, ms.notifiers[ms.notifiers.length - 1]);
    setTimeout(clearFromNotifications, 5000);
}
function clearFromNotifications() {
    for (var i = 0; i < ms.notifiers.length; i++) {
        parent.Xrm.Page.ui.clearFormNotification(ms.notifiers[i]);
    }
    ms.notifiers = [];
}
function CreateActionRequest(guid, entityLogicalName, processName) {
    var request = '';
    request += '<request xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">';
    request += ' <a:Parameters xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">';
    request += ' <a:KeyValuePairOfstringanyType>';
    request += '        <b:key>Target</b:key>';
    request += '        <b:value i:type="a:EntityReference">';
    request += '        <a:Id>' + guid + '</a:Id>';
    request += '        <a:LogicalName>' + entityLogicalName + '</a:LogicalName>';
    request += '        <a:Name i:nil="true" />';
    request += '        </b:value>';
    request += ' </a:KeyValuePairOfstringanyType>';
    request += ' </a:Parameters>';
    request += ' <a:RequestId i:nil="true" />';
    request += ' <a:RequestName>' + processName + '</a:RequestName>';
    request += '</request>';
    return request;
}
function createNewAssociatedRecord(context) {
    var record = {};
    if (context.foreignKey != null) {
        record[context.foreignKey] = {
            __metadata: {
                type: "Microsoft.Crm.Sdk.Data.Services.EntityReference"
            },
            Id: ms.currentId.toLowerCase().replace("{", "").replace("}", ""),
            LogicalName: ms.Config["ms_Entity"].toLowerCase(),
            Name: "Test"
        }
    }
    if (context.entityLogicalName == "AppointmentSet") {
        var now = new Date();
        now.setHours(9);
        now.setMinutes(0);
        now.setMilliseconds(0);
        record.ScheduledStart = DateToUTCFormat(now);
        now.setHours(11);
        record.ScheduledEnd = DateToUTCFormat(now);
        record.Location = "TBA";
    }
    createRecord(record, context.entityLogicalName, createRecordCompleted, context, false);
}
function createRecordCompleted(result, context) {
    var guid = result[context.primaryKey];
    var parameters = {};
    context.entityLogicalName = context.entityLogicalName.replace("Set", "");
    context.entityLogicalName = context.entityLogicalName.toLowerCase();
    parent.Xrm.Utility.openEntityForm(context.entityLogicalName, guid, parameters);
}
function processWebResource(tabno, container) {
    var htab = "ms_Tab" + tabno;
    var url = ms.Config[htab + "URL"];
    var html = "<iframe tabindex='0' src='" + url + "' frameborder='0' scrolling='auto' style='width: 100%; height: 100%; border: 0px;'>"
    $(container).append(html);
}
function DateToUTCFormat(inputDate) {
    var date = inputDate.getDate();
    var month = inputDate.getMonth() + 1;
    var year = inputDate.getFullYear();
    var hours = inputDate.getHours();
    var minutes = inputDate.getMinutes();
    var ampm = " AM";
    if (hours > 11) {
        ampm = " PM";
        hours = hours - 12;
    }
    if (hours == 0) {
        hours = 12;
    }
    if (minutes < 10) {
        var time = hours.toString() + ":0" + minutes.toString() + ":00" + ampm;
    } else {
        var time = hours.toString() + ":" + minutes.toString() + ":00" + ampm;
    }
    return month.toString() + "/" + date.toString() + "/" + year.toString() + " " + time;
}
function getCurrencySymbol(currencyName) {
    switch (currencyName) {
    case "Pound Sterling":
        return "&pound;&nbsp;"
    case "Euro":
        return "&euro;&nbsp;"
    case "US Dollar":
        return "$&nbsp;"
    case "Australian Dollar":
        return "$&nbsp;"
    case "Dansk krone":
        return "kr.&nbsp;"
    }
    return ms.Config["ms_DefaultCurrencyDisplay"];
}
function polishOutput(record, entityLogicalName, key) {
    var formatter = resolveInternalOptionText("Formatter", ms.Config[key + "Formatter"].Value);
    if (record[ms.Config[key]] == null) {
        return "-"
    }
    switch (formatter) {
    case "None":
        return record[ms.Config[key]];
    case "Remove '(sample)'":
        return record[ms.Config[key]].replace(" (sample)", "");
    case "Currency":
        return parseMoney(record, entityLogicalName, ms.Config[key]);
    case "Date (dd Mmm)":
        case "Date (dd Mmm yy)":
        case "Date (Mmm yy)":
        case "Date (Mmm ccyy)":
        case "Date (dd Mmm ccyy)":
        return parseOdataDate(record[ms.Config[key]], formatter);
    case "Boolean (Yes/No)":
        return (record[ms.Config[key]]) ? "Yes" : "No";
    case "Boolean (True/False)":
        return (record[ms.Config[key]]) ? "True" : "False";
    case "Boolean (Two Options)":
        return "!Defer " + record[ms.Config[key]].Value;
    case "Lookup":
        return record[ms.Config[key]].Name;
    case "Whole Number":
        return record[ms.Config[key]].Value;
    case "Floating Point Number":
        return record[ms.Config[key]].Value;
    case "Decimal Number":
        return record[ms.Config[key]].Value;
    case "Option Set":
        return "!Defer " + record[ms.Config[key]].Value;
    case "Custom JavaScript Function":
        return top.window.determineCustomFormat(record, entityLogicalName, ms.Config[key]);
    default:
        return record[ms.Config[key]];
    }
}
function polishAction(action) {
    action = action.replace("&RandomWord1", ms.Config.randomWords1[1]);
    action = action.replace("&RandomWord2", ms.Config.randomWords2[2]);
    action = action.replace("&CntOpenIncidents", "1");
    return action;
}
function getOptionLabel(key, value, id) {
    $(id).text(ms[key].options[value].Label);
}
function concatFields() {
    var fieldList = "";
    var sep = "";
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] != null && arguments[i] != "") {
            fieldList += sep + arguments[i];
            sep = ",";
        }
    }
    return fieldList;
}
function concatField(fieldList, field) {
    if (fieldList != null && fieldList != "") {
        fieldList += ",";
    } else {
        fieldList = "";
    }
    return fieldList + field;
}
function parseOdataDate(odataDate, formatter) {
    var Months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    if (odataDate == null) {
        return "?"
    }
    odataDate = odataDate.replace("/Date(", "");
    odataDate = odataDate.replace(")/", "");
    var dateValue = new Date(parseInt(odataDate, 10));
    switch (formatter) {
    case "Date (dd Mmm)":
        return dateValue.getDate() + " " + Months[dateValue.getMonth()];
    case "Date (dd Mmm yy)":
        return dateValue.getDate() + " " + Months[dateValue.getMonth()] + " " + (dateValue.getFullYear() + "").substr(2);
    case "Date (dd Mmm ccyy)":
        return dateValue.getDate() + " " + Months[dateValue.getMonth()] + " " + dateValue.getFullYear();
    case "Date (Mmm yy)":
        return Months[dateValue.getMonth()] + " " + (dateValue.getFullYear() + "").substr(2);
    case "Date (Mmm ccyy)":
        return Months[dateValue.getMonth()] + " " + dateValue.getFullYear();
    case "Date (dd Mmm ccyy)":
        return dateValue.getDate() + " " + Months[dateValue.getMonth()] + " " + dateValue.getFullYear();
    }
    return "??";
}
function parseMoney(record, entityLogicalName, field) {
    var currency = record.tranCurrency;
    var t = field.indexOf("_Base");
    if (t > 0) {
        currency = ms.baseCurrency
    }
    var amount = record[field].Value;
    var delimiter = ",";
    var postfix = "";
    if (Math.abs(amount) >= 1000000) {
        postfix = "M";
        amount = parseInt(amount / 10000) / 100;
    } else if (Math.abs(amount) >= 1000) {
        postfix = "K";
        amount = parseInt(amount / 100) / 10;
    }
    amount = new String(amount);
    var a = amount.split('.', 2)
    var d = a[1];
    if (!d) {
        d = ""
    }
    var i = parseInt(a[0]);
    if (isNaN(i)) {
        return '';
    }
    var minus = '';
    if (i < 0) {
        minus = '-';
    }
    i = Math.abs(i);
    var n = new String(i);
    var a = [];
    while (n.length > 3) {
        var nn = n.substr(n.length - 3);
        a.unshift(nn);
        n = n.substr(0, n.length - 3);
    }
    if (n.length > 0) {
        a.unshift(n);
    }
    n = a.join(delimiter);
    if (d.length < 1) {
        amount = n;
    } else {
        amount = n + '.' + d.substr(0, 2);
    }
    if (n == "") {
        n = "-"
    }
    if (currency == null || currency == "null") {
        currency = "&euro;&nbsp"
    }
    amount = currency + minus + amount + postfix;
    return amount;
}
function resolveInternalOptionText(type, value) {
    switch (type) {
    case "Content":
        switch (value) {
        case 717660000:
            return "Tiles";
        case 717660001:
            return "CRM Web Resource";
        case 717660002:
            return "CRM Chart";
        default:
            return "Not Used";
        }
    case "Color":
        case "Icon":
        switch (value) {
        case 717660000:
            return "From Field on Entity";
        case 717660001:
            return "By Status Code";
        case 717660002:
            return "By Probability";
        case 717660003:
            return "Custom JavaScript Function";
        default:
            return "Specific";
        }
    case "Tile Layout":
        switch (value) {
        case 717660000:
            return "small";
        case 717660001:
            return "medium";
        case 717660002:
            return "large";
        case 717660003:
            return "case process";
        case 717660004:
            return "opportunity process";
        default:
            return "small";
        }
    case "Formatter":
        switch (value) {
        case 717660000:
            return "None";
        case 717660001:
            return "Currency";
        case 717660002:
            return "Date (dd Mmm)";
        case 717660010:
            return "Date (dd Mmm yy)";
        case 717660011:
            return "Date (Mmm yy)";
        case 717660012:
            return "Date (Mmm ccyy)";
        case 717660017:
            return "Date (dd Mmm ccyy)";
        case 717660014:
            return "Boolean (Yes/No)";
        case 717660015:
            return "Boolean (True/False)";
        case 717660016:
            return "Boolean (Two Options)";
        case 717660008:
            return "Floating Point Number";
        case 717660009:
            return "Decimal Number";
        case 717660009:
            return "Whole Number";
        case 717660005:
            return "Lookup";
        case 717660006:
            return "Option Set";
        case 717660007:
            return "Remove '(sample)'";
        case 717660003:
            return "Proper Case";
        case 717660004:
            return "Custom JavaScript Function";
        default:
            return "None";
        }
    case "QuickButton":
        switch (value) {
        case 717660000:
            return "Create New (Empty) Record";
        case 717660006:
            return "Create New Related Record";
        case 717660001:
            return "Quick Create New (Empty) Record";
        case 717660002:
            return "Pop Up Web Resource";
        case 717660003:
            return "Show Associated Records";
        case 717660007:
            return "Invoke CRM Action";
        case 717660004:
            return "Custom Javascript Function";
        default:
            return "Do Nothing";
        }
    default:
        return "undefined";
    }
}
function deferOptionSetUpdate(entity, attribute, value, id) {
    var deferredUpdate = {};
    deferredUpdate.key = entity + "/" + attribute;
    deferredUpdate.entityLogicalName = entity;
    deferredUpdate.RetrieveAttributeName = attribute;
    deferredUpdate.value = value.substr(7, value.length - 7);
    deferredUpdate.id = id;
    deferredUpdate.processed = false;
    ms.deferredUpdates.push(deferredUpdate);
}
function processDeferredUpdates() {
    for (var i = 0; i < ms.deferredUpdates.length; i++) {
        if (! (ms[ms.deferredUpdates[i].key] === undefined)) {
            if (!ms.deferredUpdates[i].processed) {
                if (! (ms[ms.deferredUpdates[i].key].options === undefined) && !(ms[ms.deferredUpdates[i].key].options[ms.deferredUpdates[i].value] === undefined)) {
                    ms.deferredUpdates[i].processed = true;
                    $(ms.deferredUpdates[i].id).text(ms[ms.deferredUpdates[i].key].options[ms.deferredUpdates[i].value].Label);
                }
            }
        }
    }
}
function queueOptionSetLabels() {
    for (var i = 0; i < ms.deferredUpdates.length; i++) {
        var key = ms.deferredUpdates[i].key;
        if (ms[key] === undefined) {
            ms.optionSetQueue.push(key);
            ms[key] = {};
            ms[key].entityLogicalName = ms.deferredUpdates[i].entityLogicalName;
            ms[key].RetrieveAttributeName = ms.deferredUpdates[i].RetrieveAttributeName;
            ms[key].resolved = false;
            ms[key].options = [];
            resolveOptionSetLabels();
        }
    }
}
function resolveOptionSetLabels() {
    for (var i = 0; i < ms.optionSetQueue.length; i++) {
        key = ms.optionSetQueue[i];
        if (!ms[key].resolved) {
            ms[key].resolved = true;
            var AssignAttributeName = "";
            var stateValue = 0;
            var entityLogicalName = ms[key].entityLogicalName;
            var RetrieveAttributeName = ms[key].RetrieveAttributeName;
            SDK.Metadata.RetrieveAttribute(entityLogicalName, RetrieveAttributeName, null, false, function (entityMetadata) {
                successRetrieveAttribute(entityLogicalName, entityMetadata, RetrieveAttributeName, stateValue, AssignAttributeName);
            },
            errorDisplay);
        }
    }
}
function successRetrieveAttribute(logicalName, entityMetadata, RetrieveAttributeName, OptionValue, AssignAttributeName) {
    var option = {};
    var key = logicalName + "/" + RetrieveAttributeName;
    ms[key].options = [];
    for (var i = 0; i < entityMetadata.OptionSet.Options.length; i++) {
        option = {};
        option.Value = entityMetadata.OptionSet.Options[i].Value;
        option.Label = entityMetadata.OptionSet.Options[i].Label.UserLocalizedLabel.Label;
        ms[key].options[option.Value] = option;
    }
    processDeferredUpdates(logicalName, RetrieveAttributeName);
}
function errorDisplay(XmlHttpRequest, textStatus, errorThrown) {
    alert(errorThrown);
}
var opportunityColorsByProbability = {
    null: "DarkGray",
    10: "DarkGray",
    20: "DarkGray",
    30: "Purple",
    40: "Purple",
    50: "DarkBlue",
    60: "DarkBlue",
    70: "DarkBlue",
    80: "DarkGreen",
    90: "DarkGreen",
    95: "DarkGreen",
    99: "DarkGreen",
    100: "DarkGreen"
};
function getColorByStatusCode(entityLogicalName, statusCode) {
    if (statusCode == null || statusCode == "null") {
        return "DarkGray"
    };
    switch (entityLogicalName + "/" + statusCode) {
    case "opportunity/1":
        return "DarkGreen";
    case "opportunity/2":
        return "DarkOrange";
    case "opportunity/3":
        return "DarkGreen";
    case "opportunity/4":
        return "DarkGray";
    case "opportunity/5":
        return "DarkRed";
    case "incident/1":
        return "DarkBlue";
    case "incident/2":
        return "DarkGreen";
    case "incident/3":
        return "DarkOrange";
    case "incident/4":
        return "DarkOrange";
    case "incident/5":
        return "DarkGray";
    case "incident/1000":
        return "DarkGray";
    case "incident/6":
        return "#666666";
    default:
        return "Purple";
    }
}