<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");
   
      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;
       }  
    }

   return result;
  };

</script>

<meta charset="utf-8">
</head><body>
<div id="container">
<div style="float: left;" id="loading"><img style="float: left;" id='loading-image"' alt="Loading" src="north52_image_progress"> </div>
<div id="main"><select style="width: 100%; font-family: Segoe UI; font-size: 11px; font-weight: normal; display: none;" id="metadataproperty" onchange="MetadataProperty.DropDownChanged(this.value)" class="ms-crm-SelectBox" multiple="" size="10" name="metadataproperty" req="2" height="10"></select> </div></div></body></html>