if (typeof North52 == 'undefined') { North52 = {}; }
if (typeof North52.MetadataProperty == 'undefined') { North52.MetadataProperty = {}; }

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

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



    North52.MetadataProperty.Sort = function (a, b) {


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


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

    };

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

        $('#loading-sourceproperty').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) {
            North52.MetadataProperty.successRetrieveAttributes(entityMetadata, parentReferenceProperty, addAllProperties, isFromPageLoad);
        }, North52.MetadataProperty.errorRetrieveAttributes);

    };

    North52.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(North52.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-sourceproperty').hide();
            $('#metadataproperty').show();

        }

        North52.MetadataProperty.LoadClientSide();

    };


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

    North52.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);
        North52.FormulaEditor.ShowHideClientSideSaveMode();
    };

    North52.MetadataProperty.Reset = function () {

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



    North52.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(North52.MetadataProperty.Sort).appendTo("#metadataproperty");

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


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

    };


    North52.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";

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

        }
    };

    North52.MetadataProperty.retrieveFormCallBack = function () {

    };

    North52.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) && (North52.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];
                var attributeName = '';

           try {

                attributeName = node.attributes['id'].value;
            } catch (ex) {
                attributeName = node.attributes[0].value;
              
                if ((attributeName == 'true') || (attributeName == 'false') )
                  attributeName = node.attributes[1].value;
            }             
                 if (excludeArray.indexOf(attributeName ) > -1)
	  continue;
	
                 var attributeDisplayName = North52.MetadataProperty.getDisplayName(attributeName);
	
                 var valueBehind = formResult.Name + ".onchange." + attributeName;
	
                 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-sourceproperty').hide();
        $('#metadataproperty').show();
        North52.FormulaEditor.ShowHideClientSideSaveMode();

    };

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

    North52.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;
            }
        }
        return result;
    };


 North52.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;
    };