﻿var globalmetaId;
var loadComplete = false;

var GlobalEntityMetadataId = function ()
{
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + "EntityDefinitions?$select=LogicalName,MetadataId", false );
    httpReq.setRequestHeader( "Accept", "application/json" );
    httpReq.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
    httpReq.setRequestHeader( "OData-MaxVersion", "4.0" );
    httpReq.setRequestHeader( "OData-Version", "4.0" );
    httpReq.send( null );

    if ( httpReq.status === 200 ) {
        coll = JSON.parse( httpReq.responseText ).value;

        globalmetaId = new Array( coll.length );

        for ( var i = 0; i < coll.length; i++ ) {
            globalmetaId[i] = new Array( 2 );
            globalmetaId[i][0] = coll[i].LogicalName;
            globalmetaId[i][1] = coll[i].MetadataId;
        }
    }
}

var GetEntityMetadataId = function ( entityName )
{
    for ( var i = 0; i < globalmetaId.length; i++ ) {
        if ( entityName.toLowerCase() == globalmetaId[i][0].toLowerCase() ) {
            return globalmetaId[i][1];
        }
    }
}

function BindEmailConfiguration( otc, schemaname )
{
    RetrieveEmailTemplates( schemaname ); 
    BindEmailToDropdown( schemaname );
}

function IOTAP_AddOn_OneClickPdf_GetClientURL()
{
    return parent.Xrm.Page.context.getClientUrl() + "/api/data/v8.0/";
}

function RetrieveEmailTemplates( schemaname )
{       
    var dropdown = document.getElementById( "ddlEmailTemplate" );
    if ( dropdown != null ) {
        dropdown.options.length = 0;
        var opt = document.createElement( 'option' );
        dropdown.appendChild( opt );
    }

    var filterQuery = "templates?$select=title&$orderby=title asc&$filter=templatetypecode eq '" + schemaname + "'";
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + filterQuery, false );
    httpReq.setRequestHeader( "Accept", "application/json" );
    httpReq.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
    httpReq.setRequestHeader( "OData-MaxVersion", "4.0" );
    httpReq.setRequestHeader( "OData-Version", "4.0" );
    httpReq.send( null );

    if ( httpReq.status === 200 ) {
        var templateColl = JSON.parse( httpReq.responseText ).value;

        for ( var i = 0; i < templateColl.length; i++ ) {
            $( '#ddlEmailTemplate' ).append( '<option value="' + templateColl[i].templateid + '">' + templateColl[i].title + '</option>' );
        }
    }    
}
                

function SetUi()
{
    $('#tblEmailConfig').css({ 'table-layout': 'fixed' });
    $('#tblEmailConfig').css({ 'margin-top': '-3px' });
    $('#tblEmailConfig').css({ 'margin-left': '-4px' });
    $('#tblEmailConfig').css({ 'width': '102%' });
    $( '.dynamic-col' ).width( 110 );

    loadComplete = true;
}

function BindEmailToDropdown(schemaname)
{
    var retVal = [];
        
    var dropdown = document.getElementById( "ddlEmailTo" );
    if ( dropdown != null ) {
        dropdown.options.length = 0;
        var opt = document.createElement( 'option' );
        dropdown.appendChild( opt );
    }
    
    var entityMetadataId = GetEntityMetadataId( schemaname );
    
    var filterQuery = "EntityDefinitions(" + entityMetadataId + ")/ManyToOneRelationships?$select=SchemaName,ReferencedEntity,ReferencingAttribute";
    
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + filterQuery, false );
    httpReq.setRequestHeader( "Accept", "application/json" );
    httpReq.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
    httpReq.setRequestHeader( "OData-MaxVersion", "4.0" );
    httpReq.setRequestHeader( "OData-Version", "4.0" );
    httpReq.send( null );       

    if ( httpReq.status === 200 ) {
        coll = JSON.parse( httpReq.responseText ).value;
    
        for ( var i = 0; i < coll.length; i++ ) {              
            var entityName = coll[i].ReferencedEntity.toLowerCase();
            var referencingAttrName = coll[i].ReferencingAttribute.toLowerCase();
           
            if ( referencingAttrName != "masterid" && referencingAttrName != "createdby" && referencingAttrName != "createdonbehalfby"
                        && referencingAttrName != "modifiedby" && referencingAttrName != "modifiedonbehalfby" ) {
                
                var entityMetaId = GetEntityMetadataId( entityName );

                var isEmailableEntity = IsEmailableEntity( entityName, entityMetaId );

                if ( isEmailableEntity ) {

                    var displayName = GetAttributeDisplayName( referencingAttrName, entityMetadataId );

                    lblObject = {};
                    if ( referencingAttrName == "regardingobjectid" )
                        lblObject.Value = displayName + " - " + entityName;
                    else
                        lblObject.Value = displayName;
                    lblObject.Key = referencingAttrName;
                    lblObject.Number = i;
                    retVal.push( lblObject );                    
                }                            
            }
        }

        retVal.sort( function ( a, b )
        {
            var textA = a.Value;
            var textB = b.Value;
            return ( textA < textB ) ? -1 : ( textA > textB ) ? 1 : 0;
        } );

        var customerid = false;
        for ( var i = 0; i < retVal.length; i++ ) {
            if ( retVal[i].Key == "customerid" || retVal[i].Key == "parentcustomerid" ) {
                if ( !customerid ) {
                    customerid = true;
                    $( '#ddlEmailTo' ).append( '<option value="' + retVal[i].Key + '">' + retVal[i].Value + '</option>' );
                }
            }
            else
                $( '#ddlEmailTo' ).append( '<option value="' + retVal[i].Key + '">' + retVal[i].Value + '</option>' );
        }
                
        //setTimeout( OnFormtypeUpdate, 1000 );
    }                                            
}

function CompareDictionary(a, b)
{
    var x = a.Value.toLowerCase();
    var y = b.Value.toLowerCase();
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function GetAttributeDisplayName(attrName, metaId)
{

    var retVal = attrName;

    try
    {
        var filterQuery = "EntityDefinitions(" + metaId + ")?$select=LogicalName&$expand=Attributes($select=DisplayName;$filter=LogicalName%20eq%20'" + attrName  + "')";

        var httpReq = new XMLHttpRequest();
        httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + filterQuery, false );
        httpReq.setRequestHeader( "Accept", "application/json" );
        httpReq.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
        httpReq.setRequestHeader( "OData-MaxVersion", "4.0" );
        httpReq.setRequestHeader( "OData-Version", "4.0" );
        httpReq.send( null );

        if ( httpReq.status === 200 ) {            
            var attrColl = JSON.parse( httpReq.responseText ).Attributes;


            for ( var i = 0; i < attrColl.length; i++ ) {
                if ( attrColl[i].DisplayName.UserLocalizedLabel ) {
                    retVal = attrColl[i].DisplayName.UserLocalizedLabel.Label;
                }
            }           
        }        
    }
    catch (e)
    {
    }

    return retVal;
}

function IsEmailableEntity(entity, entityMetaId)
{
    try
    {
        var retVal = false;

        if (entity == "account" || entity == "contact"
            || entity == "equipment" || entity == "lead"
            || entity == "queue" || entity == "systemuser")
        {

            return true;
        }
        
        var filterQuery = "EntityDefinitions(" + entityMetaId + ")?$select=IsActivityParty&$expand=Attributes($select=LogicalName;$filter=LogicalName%20eq%20'emailaddress')";

        var httpReq = new XMLHttpRequest();
        httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + filterQuery, false );
        httpReq.setRequestHeader( "Accept", "application/json" );
        httpReq.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
        httpReq.setRequestHeader( "OData-MaxVersion", "4.0" );
        httpReq.setRequestHeader( "OData-Version", "4.0" );
        httpReq.send( null );

        if ( httpReq.status === 200 ) {           
            var metaData = JSON.parse( httpReq.responseText );
            var attrColl = JSON.parse( httpReq.responseText ).Attributes;
           
            if ( metaData.IsActivityParty == true && attrColl != null ) {  
                retVal = true;
            }
        } 

        return retVal;
    }
    catch (e)
    {
        alert(e.message)
        return false;
    }
}

function sortMultiDimensional(a, b)
{
    // for instance, this will sort the array using the second element
    return ((a[1] < b[1]) ? -1 : ((a[1] > b[1]) ? 1 : 0));
}
   

function ddlEmailTo_OnChange()
{
    var value = $("#ddlEmailTo").val();
    parent.Xrm.Page.getAttribute('iotap_emailto').setValue(value);
}

function ddlEmailTemplate_OnChange()
{
    var value = $("#ddlEmailTemplate").val();
    parent.Xrm.Page.getAttribute('iotap_emailtemplate').setValue(value);
}

function OnFormtypeUpdate()
{
    var _formType = parent.Xrm.Page.ui.getFormType();
    if (_formType == FormType.UPDATE)
    {
        var emailTo = parent.Xrm.Page.getAttribute('iotap_emailto').getValue();
        var emailTemplate = parent.Xrm.Page.getAttribute('iotap_emailtemplate').getValue();
        DdlHelper.SelectDefault('ddlEmailTo', emailTo);
        DdlHelper.SelectDefault('ddlEmailTemplate', emailTemplate);
    }
}

//call this when page loads
GlobalEntityMetadataId();