var ms = {};
ms.dropZoneFields = ["Zone1", "Zone2", "Zone3", "Title"];
ms.fieldList = [];
(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])
    }
})();
function prepareDragDrop() {
    $("#debugStatus").hide();
    ms.tabno = ms.queryParms["data"];
    parent.top.registerSyncDataFromCrm(ms.tabno, syncDataFromCRM);
    parent.top.registerFindFieldType(ms.tabno, findFieldType);
    parent.top.registerValidField(ms.tabno, validField);
    parent.top.registerGetPrimaryKey(ms.tabno, getPrimaryKey);
}
function syncDataFromCRM(tabDefinition) {
    if (tabDefinition.entity != null) {
        parent.top.retrieveEntityFieldsAsync(ms.tabno, tabDefinition.entity, successRetrieveEntityFields);
        ms.tabDefinition = tabDefinition;
    }
}
function syncDataToCRM(el, fieldName, fieldType) {
    var el = "ms_tab" + ms.tabno + el;
    parent.Xrm.Page.getAttribute(el).setValue(fieldName);
    var formatter = getOptionValueFromText(fieldType);
    el += "formatter";
    parent.Xrm.Page.getAttribute(el).setValue(formatter);
}
function successRetrieveEntityFields(results) {
    ms.fieldList = results;
    $("#Fields").find("li").remove();
    for (var i = 0; i <= ms.fieldList.length - 1; i++) {
        var elId = "field" + i;
        $('<li id="' + elId + '" draggable="true">' + ms.fieldList[i].SchemaName + '</li>').appendTo("#Fields");
        if (ms.fieldList[i].AttributeType == "Primary Key") {
            parent.Xrm.Page.getAttribute("ms_tab" + ms.tabno + "primarykey").setValue(ms.fieldList[i].SchemaName);
        }
    }
    var items = document.querySelectorAll("#Fields li");
    [].forEach.call(items, function (item) {
        item.addEventListener('dragstart', handleDragStart, false);
    });
    for (var dz = 0; dz < ms.dropZoneFields.length; dz++) {
        var el = "tile" + ms.dropZoneFields[dz];
        document.getElementById(el).addEventListener('dragenter', handleDragEnter, false);
        document.getElementById(el).addEventListener('dragleave', handleDragLeave, false);
        document.getElementById(el).addEventListener('dragover', handleDragOver, false);
        document.getElementById(el).addEventListener('drop', handleDrop, false);
    }
    initTile("#tileZone1", ms.tabDefinition.zone1);
    initTile("#tileZone2", ms.tabDefinition.zone2);
    initTile("#tileZone3", ms.tabDefinition.zone3);
    initTile("#tileTitle", ms.tabDefinition.title);
}
function initTile(el, fieldName) {
    var fieldType = findFieldType(fieldName);
    $(el).html(getSampleData(fieldName, fieldType));
    var tooltip = fieldName + " (" + fieldType + ")";
    $(el).attr("title", tooltip);
}
function handleDragStart(e) {
    e.dataTransfer.effectAllowed = 'move';
    e.dataTransfer.setData("Text", this.innerHTML);
}
function handleDrop(e) {
    var fieldName = e.dataTransfer.getData("Text");
    var fieldType = findFieldType(fieldName);
    if (e.preventDefault) {
        e.preventDefault()
    }
    if (e.stopPropagation) {
        e.stopPropagation()
    }
    var crmEl = e.currentTarget.id.toLowerCase().replace("tile", "");
    e.currentTarget.innerHTML = getSampleData(fieldName, fieldType);
    var tooltip = fieldName + " (" + fieldType + ")";
    $("#" + e.currentTarget.id).attr("title", tooltip);
    syncDataToCRM(crmEl, fieldName, fieldType);
    return false;
}
function handleDragOver(e) {
    if (e.preventDefault) {
        e.preventDefault()
    }
    if (e.stopPropagation) {
        e.stopPropagation()
    }
    e.dataTransfer.dropEffect = 'move';
    return false;
}
function handleDragEnter(e) {
    if (e.preventDefault) {
        e.preventDefault()
    }
    if (e.stopPropagation) {
        e.stopPropagation()
    }
}
function handleDragLeave(e) {
    if (e.preventDefault) {
        e.preventDefault()
    }
    if (e.stopPropagation) {
        e.stopPropagation()
    }
}
function findFieldType(fieldName) {
    for (var i = 0; i < ms.fieldList.length; i++) {
        if (ms.fieldList[i].SchemaName == fieldName) {
            return ms.fieldList[i].AttributeType;
        }
    }
    return null;
}
function validField(fieldName) {
    for (var i = 0; i < ms.fieldList.length; i++) {
        if (ms.fieldList[i].SchemaName == fieldName) {
            return true;
        }
    }
    return false;
}
function getPrimaryKey() {
    for (var i = 0; i < ms.fieldList.length; i++) {
        if (ms.fieldList[i].AttributeType == "Primary Key") {
            return ms.fieldList[i].SchemaName;
        }
    }
    return "";
}
function getOptionTextFromValue(value) {
    switch (value) {
    case 717660000:
        return "None";
    case 717660001:
        return "Currency";
    case 717660002:
        return "Date (dd Mmm)";
    case 717660010:
        return "Date (dd Mmm yy)";
    case 717660017:
        return "Date (dd Mmm ccyy)";
    case 717660011:
        return "Date (Mmm yy)";
    case 717660012:
        return "Date (Mmm ccyy)";
    case 717660008:
        return "Floating Point Number";
    case 717660009:
        return "Decimal Number";
    case 717660009:
        return "Whole Number";
    case 717660014:
        return "Boolean (Yes/No)";
    case 717660015:
        return "Boolean (True/False)";
    case 717660016:
        return "Boolean (Two Options)";
    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";
    }
}
function getOptionValueFromText(value) {
    switch (value) {
    case "None":
        return 717660000;
    case "Currency":
        return 717660001;
    case "Date (dd Mmm)":
        return 717660002;
    case "Date (dd Mmm yy)":
        return 717660010;
    case "Date (dd Mmm ccyy)":
        return 717660017;
    case "Date (Mmm yy)":
        return 717660011;
    case "Date (Mmm ccyy)":
        return 717660012;
    case "Floating Point Number":
        return 717660008;
    case "Decimal Number":
        return 717660009;
    case "Whole Number":
        return 717660009;
    case "Boolean (Yes/No)":
        return 717660014;
    case "Boolean (True/False)":
        return 717660015;
    case "Boolean (Two Options)":
        return 717660016;
    case "Customer":
        case "Lookup":
        return 717660005;
    case "Option Set":
        return 717660006;
    case "Remove '(sample)'":
        return 717660007;
    case "Proper Case":
        return 717660003;
    case "Custom JavaScript Function":
        return 717660004;
    default:
        return "717660000";
    }
}
function getSampleData(fieldName, fieldType) {
    var knownEntities = "OpportunitySet,IncidentSet";
    if (knownEntities.indexOf(ms.tabDefinition.entity) >= 0) {
        switch (ms.tabDefinition.entity + "/" + fieldName) {
        case "OpportunitySet/EstimatedValue":
            return "&euro;&nbsp;124K";
        case "OpportunitySet/BudgetAmount":
            return "&euro;&nbsp;150K";
        case "OpportunitySet/StatusCode":
            return "Open";
        case "OpportunitySet/StateCode":
            return "Active";
        case "OpportunitySet/CloseProbability":
            return "80";
        case "OpportunitySet/EstimatedCloseDate":
            return "23 Apr";
        case "OpportunitySet/Name":
            return "Interested in buying additional products before month-end";
        case "IncidentSet/StatusCode":
            return "In Progress";
        case "IncidentSet/CreatedOn":
            return "23 Jan";
        case "IncidentSet/CreatedBy":
            return "Paul Smith";
        case "IncidentSet/Owner":
            return "John Clark";
        case "IncidentSet/PriorityCode":
            return "High";
        default:
            return "Factum";
        }
    } else {
        switch (fieldType) {
        case "String":
            return "Lorem ipsum dolor sit amet, consectetur, adipisci velit";
        case "Lookup":
            return "Lorem Factum";
        case "Currency":
            return "&euro;&nbsp;24K";
        case "Date":
            return "21 Aug";
        case "Boolean (Yes/No)":
            return "Yes";
        case "Option Set":
            return "Active";
        default:
            return "Ipsum";
        }
    }
}