<html><head><title>North52 Formula Manager Metadata Property</title>
<style type="text/css">

html, body{
margin: 0px;
padding: 0px;
background-color: transparent;
}

#loading { 
  width: 100%; 
  height: 100%; 
  top: 0px; 
  left: 0px; 
  position: fixed; 
  float: left;
  display: block; 
  opacity: 0.7; 
  background-color: #fff; 
  z-index: 99; 
  text-align: center; 
} 
 
#loading-image { 
  position: absolute; 
  float: left;
  top: 100px; 
  left: 240px; 
  z-index: 100; 
}


</style>

<script src="ClientGlobalContext.js.aspx"></script>

<script type="text/javascript" src="north52_/javascript/jquery"></script>

<script type="text/javascript" src="north52_/javascript/JSON2"></script>

<script type="text/javascript" src="north52_/javascript/sdk.rest"></script>

<script type="text/javascript" src="north52_/Javascript/sdk.metadata.js"></script>

<script type="text/javascript" src="north52_/javascript/north52.formula.loadalpha"></script>

<script type="text/javascript" src="north52_/javascript/north52.htmlwebresource.helper">




</script>
<script type="text/javascript">

    $(document).ready(function () {
        MetadataProperty.Init();
    });

    var MetadataProperty = {};
    MetadataProperty.parentReferenceProperty = "";
    MetadataProperty.entityMetadata = null;
    MetadataProperty.CacheKey = "";

    MetadataProperty.Disable = function () {
        $("#metadataproperty").attr("disabled", true);
    }


    MetadataProperty.Init = function () {

        MetadataProperty.SetBackGround();
        var data = N52.HTMLWebResourceHelper.GetParameterByName('data');

        if (data != "") {
            var vals = N52.HTMLWebResourceHelper.GetDataParameterArray(data);
            var parentReferenceProperty = vals[0][1];
            var allProperties = vals[1][1];
            var initialLoad = vals[2][1];

            var entityName = parent.Xrm.Page.data.entity.attributes.get("north52_sourceentityname").getValue();
            MetadataProperty.Load(entityName, parentReferenceProperty, allProperties, initialLoad);
        }
        else
            $("#metadataproperty").hide();
    }

    MetadataProperty.Sort = function (a, b) {


        return (a.innerHTML > b.innerHTML) ? 1 : -1;
    }

    MetadataProperty.SetBackGround = function () {

        try {
            var bgcolor = '';
            if (typeof window.getComputedStyle != "undefined")
                bgcolor = window.getComputedStyle(parent.document.getElementById('WebResource_html_metadata_sourceproperty'), null).backgroundColor;
            else
                bgcolor = parent.document.body.currentStyle['backgroundColor'];

            if ((bgcolor == 'transparent') || (bgcolor == 'rgba(0, 0, 0, 0)') || (bgcolor == '#ffffff'))
                document.body.style.background = 'transparent';
            else
                document.body.style.background = "#f6f8fa";
        }
        catch (ex) {
        }
    }

    MetadataProperty.Clear = function () {
        $("select[id$=metadataproperty] > option").remove();
        N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "", "");

    }

    MetadataProperty.Load = function (entity, parentReferenceProperty, addAllProperties, isFromPageLoad) {

        $('#loading').show();
        $('#metadataproperty').hide();

        $("select[id$=metadataproperty] > option").remove();
        MetadataProperty.parentReferenceProperty = parentReferenceProperty;
        MetadataProperty.CacheKey = 'SingleEntity' + parent.Xrm.Page.context.getOrgUniqueName() + entity;

        SDK.Metadata.RetrieveEntity(SDK.Metadata.EntityFilters.Attributes, entity, null, false, function (entityMetadata) {
            MetadataProperty.successRetrieveAttributes(entityMetadata, parentReferenceProperty, addAllProperties, isFromPageLoad);
        }, MetadataProperty.errorRetrieveAttributes);

    };

    MetadataProperty.successRetrieveAttributes = function (entityMetadata, parentReferenceProperty, addAllProperties, isFromPageLoad) {

        MetadataProperty.entityMetadata = entityMetadata;


        var mode = parent.Xrm.Page.data.entity.attributes.get("north52_mode").getValue();
        if (mode == null) mode = 217890002;

        if ((entityMetadata.Attributes != null) && ((mode == 217890000) || (mode == 217890002))) {

            for (var i = 0; i < entityMetadata.Attributes.length; i++) {
                var attribute = entityMetadata.Attributes[i];

                if (attribute.DisplayName.UserLocalizedLabel != null) {
                    if (attribute.DisplayName.UserLocalizedLabel.Label != null) {
                        text = attribute.DisplayName.UserLocalizedLabel.Label
                        value = attribute.LogicalName;

                        N52.HTMLWebResourceHelper.InsertOptionSetItem('metadataproperty', text, value);
                    }
                }
            }

            currentServerSideAttribute = parent.Xrm.Page.getAttribute(parentReferenceProperty).getValue();
            if (currentServerSideAttribute !== null && currentServerSideAttribute !== "") {
                var splitString = currentServerSideAttribute.split("|");
                $("#metadataproperty").val(splitString);
            }


            $("#metadataproperty option").sort(MetadataProperty.Sort).appendTo("#metadataproperty");

            if (addAllProperties == 'true') {
                N52.HTMLWebResourceHelper.InsertOptionSetItemAtTop("metadataproperty", "All Properties", "");

                if (currentServerSideAttribute == null || currentServerSideAttribute == "")
                    $("#metadataproperty").val("");
            }
            else {
                N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "", "na");
            }


            N52.HTMLWebResourceHelper.InsertOptionSetItemAtTop("metadataproperty", "", "na");
            N52.HTMLWebResourceHelper.InsertOptionSetItemAtTop("metadataproperty", "--- Server Side Properties ---", "na");


            $('#loading').hide();
            $('#metadataproperty').show();

        }

        MetadataProperty.LoadClientSide();

    };


    MetadataProperty.errorRetrieveAttributes = function (error) {
        alert("North52 Formula Manager : " + error.message);
    };

    MetadataProperty.DropDownChanged = function (value) {
        var selectedValues = $("#metadataproperty").val() || [];

        var selectedValuesServerSide = [];
        var selectedValuesClientSide = [];

        for (var i = 0; i < selectedValues.length; i++) {
            if (selectedValues[i] != 'na') {
                if (selectedValues[i].split('.').length > 1)
                    selectedValuesClientSide.push(selectedValues[i]);
                else
                    selectedValuesServerSide.push(selectedValues[i]);
            }
        }

        var selectedValuesServerSideFinal = selectedValuesServerSide.join("|");
        var selectedValuesClientSideFinal = selectedValuesClientSide.join("|");

        if (selectedValuesServerSideFinal.substring(0, 1) == "|") { selectedValuesServerSideFinal = selectedValuesServerSideFinal.substring(1); }
        if (selectedValuesClientSideFinal.substring(0, 1) == "|") { selectedValuesClientSideFinal = selectedValuesClientSideFinal.substring(1); }

        parent.Xrm.Page.data.entity.attributes.get(MetadataProperty.parentReferenceProperty).setValue(selectedValuesServerSideFinal);
        parent.Xrm.Page.data.entity.attributes.get("north52_sourceentitypropertyclientside").setValue(selectedValuesClientSideFinal);
    };

    MetadataProperty.Reset = function () {

        $('#metadataproperty option:first-child').attr("selected", "selected");
    };



    MetadataProperty.LoadFromQuery = function (query) {

        $("select[id$=metadataproperty] > option").remove();

        var xml = N52.HTMLWebResourceHelper.GetXmlDocument(query);
        var attributes = xml.selectNodes("//attribute");

        for (var i = 0; i < attributes.length; i++) {
            var node = attributes[i];
            var value = node.attributes[0].value;

            N52.HTMLWebResourceHelper.InsertOptionSetItem('metadataproperty', value, value);

        }

        $("#metadataproperty option").sort(MetadataProperty.Sort).appendTo("#metadataproperty");

        currentAttribute = parent.Xrm.Page.getAttribute("north52_targetentityproperty").getValue();
        if (currentAttribute !== null && currentAttribute !== "") {
            $("#metadataproperty").val(currentAttribute);
            MetadataProperty.DropDownChanged(currentAttribute);
        }
        else {
            $('#metadataproperty option:first-child').attr("selected", "selected");
            currentAttribute = $("#metadataproperty option:selected").val();
            MetadataProperty.DropDownChanged(currentAttribute);
        }


        $('#loading').hide();
        $('#metadataproperty').show();

    };


    MetadataProperty.LoadClientSide = function () {

        var mode = parent.Xrm.Page.data.entity.attributes.get("north52_mode").getValue();
        if (mode == null) mode = 217890002;

        if ((mode == 217890000) || (mode == 217890001)) {
            var sourceEntity = parent.Xrm.Page.data.entity.attributes.get("north52_sourceentityname").getValue();
            var options = "";

            if (typeof parent.Xrm.Page.ui.clearFormNotification != "undefined")
                options = "$select=*&$filter=ObjectTypeCode eq " + "'" + sourceEntity + "' and (Type/Value eq 2 or Type/Value eq 7) and FormActivationState/Value eq 1";
            else
                options = "$select=*&$filter=ObjectTypeCode eq " + "'" + sourceEntity + "' and Type/Value eq 2";

            //options = "$select=*&$filter=ObjectTypeCode eq " + "'"+ sourceEntity + "' and (Type/Value eq 2 or Type/Value eq 7) and FormActivationState/Value eq 1";

            SDK.REST.retrieveMultipleRecords("SystemForm", options, MetadataProperty.retrieveFormCallBack, function (error) { alert("North52 Formula Manager: " + error.message); }, MetadataProperty.formsRetrieveComplete)

        }
    };

    MetadataProperty.retrieveFormCallBack = function () {

    };

    MetadataProperty.retrieveFormCallBack = function (retrievedForms) {

        var duplicateFormName = false;
        var formNames = [];
        var excludeArray = ["mapcontrol", "notescontrol", "WebResource_RecordWall"];
        N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "--- Client Side Properties ---", "na");
        
        for (var i = 0; i < retrievedForms.length; i++) {
            var formResult = retrievedForms[i];
            var xml = N52.HTMLWebResourceHelper.GetXmlDocument(formResult.FormXml);
            var xpath = "/form/tabs/tab/columns/column/sections/section/rows/row/cell/control";

            var attributes = N52.HTMLWebResourceHelper.GetXmlNodes(xml, xpath);

            formNames.push(formResult.Name);

            N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "", "na");
            N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "*** " + formResult.Name + " Events ***", "na");
            N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "", "na");

            N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "OnLoad", formResult.Name + ".onload");
            N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "OnSave", formResult.Name + ".onsave");
            if ( (formResult.Type.Value == 2) && (MetadataProperty.isBusinessProcessEnabled(parent.Xrm.Page.getAttribute("north52_sourceentityname").getValue()) == true ) ) 
                    N52.HTMLWebResourceHelper.InsertOptionSetItem("metadataproperty", "OnStageChange", formResult.Name + ".onload.stageid");

            for (var k = 0; k < attributes.length; k++) {
                var node = attributes[k];

                if (excludeArray.indexOf(node.attributes[0].value) > -1)
                    continue;

                var attributeDisplayName = MetadataProperty.getDisplayName(node.attributes[0].value);

                var valueBehind = formResult.Name + ".onchange." + node.attributes[0].value;

                N52.HTMLWebResourceHelper.InsertOptionSetItem('metadataproperty', attributeDisplayName, valueBehind);
            }
        }

        duplicateFormName = N52.HTMLWebResourceHelper.CheckDuplicates('metadataproperty', formNames);

        if (duplicateFormName == false) {

            var selectedValuesServerSide = $("#metadataproperty").val() || [];

            currentClientSideAttribute = parent.Xrm.Page.getAttribute("north52_sourceentitypropertyclientside").getValue();
            if (currentClientSideAttribute !== null && currentClientSideAttribute !== "") {
                var splitStringClientSide = currentClientSideAttribute.split("|");

                var splitStringMerged = selectedValuesServerSide.concat(splitStringClientSide);

                $("#metadataproperty").val(splitStringMerged);
            }
        }



        $('#loading').hide();
        $('#metadataproperty').show();

    };

    MetadataProperty.formsRetrieveComplete = function () {
        var msg = 'Complete';
    };

    MetadataProperty.getDisplayName = function (logicalName) {
        var result = logicalName;

        if (MetadataProperty.entityMetadata != null) {
            var entityMetadata = MetadataProperty.entityMetadata;

            for (var i = 0; i < entityMetadata.Attributes.length; i++) {
                var attribute = entityMetadata.Attributes[i];

                if (attribute.LogicalName == logicalName)
                    result = attribute.DisplayName.UserLocalizedLabel.Label;
            }
        }

        if ((result == 'true') || (result == 'false')) result = logicalName;

        return result;
    };


 MetadataProperty.isBusinessProcessEnabled = function (entitylogicalname) {
        var result = false;
        var entityCacheKey = 'EntityList52' + parent.Xrm.Page.context.getOrgUniqueName();
        var entityMetadataCollection = JSON.parse(localStorage.getItem(entityCacheKey ));


 for (var i = 0; i < entityMetadataCollection.length; i++)
   {
        var splitArray = entityMetadataCollection[i].split('|');
        if (splitArray.length < 2)
             continue;

        var label =  splitArray[0]; 
        var logicalname =  splitArray[1]; 
        var businessenabled =  splitArray[2]; 

        if (entitylogicalname == logicalname ) 
             if (businessenabled == 'true')
                 result = true;

   }

        return result;
    };

</script>

<meta charset="utf-8">
</head><body>&nbsp;</body></html>