﻿
var ReportSelector = {
    Page_Load: function () {
        if (!IsRequiredPluginPresent()) { alert(Constant.TrialFailError); return; }
        SetUi();
        BindEntityDropdown();
    }
};

var EntityNameField = {
    Get: function () {
        return parent.Xrm.Page.getAttribute('iotap_entityname').getValue();
    },
    Set: function (value) {
        parent.Xrm.Page.getAttribute('iotap_entityname').setValue(value);
    }
};

var EntityObjctCodeField = {
    Get: function () {
        return parent.Xrm.Page.getAttribute('iotap_entityobjectcode').getValue();
    },
    Set: function (value) {
        parent.Xrm.Page.getAttribute('iotap_entityobjectcode').setValue(value);
    }
};

var ReportNameField = {
    Get: function () {
        return parent.Xrm.Page.getAttribute('iotap_report').getValue();
    },
    Set: function (value) {
        parent.Xrm.Page.getAttribute('iotap_report').setValue(value);
    }
};

var DisplayNameField = {
    Get: function () {
        return parent.Xrm.Page.getAttribute('iotap_displayname').getValue();
    },
    Set: function (value) {
        parent.Xrm.Page.getAttribute('iotap_displayname').setValue(value);
    }
};

var NameField = {
    Get: function () {
        return parent.Xrm.Page.getAttribute('iotap_name').getValue();
    },
    Set: function (value) {
        parent.Xrm.Page.getAttribute('iotap_name').setValue(value);
    }
};

function SetUi() {
    if (IsCRM2013()) {
        $('.dynamic-col').width(145);
        $('#tblReportSelector').css({ 'width': '100%' });
        if ($.browser.webkit) //($.browser.chrome)
            $('#tblReportSelector').css({ 'margin-top': '-5px' });
        else
            $('#tblReportSelector').css({ 'margin-top': '-3px' });
    }
    else {
        $('#tblReportSelector').css({ 'table-layout': 'fixed' });
        $('#tblReportSelector').css({ 'margin-top': '-3px' });
        $('#tblReportSelector').css({ 'margin-left': '-4px' });
        $('#tblReportSelector').css({ 'width': '102%' });
        $('.dynamic-col').width(110);
    }
}

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

function BindEntityDropdown() {

    IOTAP_AddOn_OneClickPdf_GetCustomizableEntityList();
    OnFormtypeUpdate();      

}
     
IOTAP_AddOn_OneClickPdf_GetCustomizableEntityList = function ()
{
    var coll;
    
    try {
        var counter = 0;
        var httpReq = new XMLHttpRequest();
        httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + "EntityDefinitions?$select=LogicalName,DisplayName,MetadataId,ObjectTypeCode&$filter=IsCustomizable/Value eq true", 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;     
            var entityArray = new Array( coll.length );
            for ( var i = 0; i < coll.length; i++ ) {
                if ( coll[i].DisplayName != null && coll[i].DisplayName.UserLocalizedLabel != null) {
                    entityArray[i] = new Array( 2 );
                    entityArray[i][0] = coll[i].LogicalName.toLowerCase();
                    entityArray[i][1] = coll[i].DisplayName.UserLocalizedLabel.Label;
                    entityArray[i][2] = coll[i].ObjectTypeCode;
                    counter++;
                }                
            }

            entityArray.sort( sortMultiDimensional );
            for ( var i = 0; i < counter; i++ ) {
                $( '#ddlEntity' ).append( '<option schemaname= "' + entityArray[i][0].toString() + '" value="' + entityArray[i][2].toString() + '">' + entityArray[i][1].toString() + '</option>' )
            }
        }
    }
    catch ( ex ) {
        throw ex;
    }
}


//*******Retrieve All Entities error******
function errorRetrieveAllEntities(error) {
    message.innerText = error.message;
}
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 OnFormtypeUpdate() {
    var _formType = parent.Xrm.Page.ui.getFormType();
    if (_formType == FormType.UPDATE) {
        DdlHelper.SelectDefault('ddlEntity', EntityObjctCodeField.Get());
        BindReportDropdown();
        //DdlHelper.SelectDefault('ddlReports', ReportNameField.Get());
        $( "select#ddlReports" ).val( ReportNameField.Get() );

        checkIsEmailFrameLoaded();
    }
}

function ddlEntity_OnChange() {
    EntityObjctCodeField.Set(document.getElementById('ddlEntity').value);
   
    EntityNameField.Set(document.getElementById('ddlEntity').options[document.getElementById('ddlEntity').selectedIndex].getAttribute('schemaname'));

    DdlHelper.Clear('ddlReports');
    ReportNameField.Set('');
    BindReportDropdown();

    checkIsEmailFrameLoaded();
   
}

function checkIsEmailFrameLoaded()
{
    //var frameDoc = window.parent.document.getElementById( 'WebResource_EmailConfiguration' ).contentWindow;
    var frameDoc = parent.Xrm.Page.ui.controls.get( 'WebResource_EmailConfiguration' ).getObject().contentWindow;
    

    if ( frameDoc == null || frameDoc == "undefined" || frameDoc == "" ) {
        window.setTimeout( checkIsEmailFrameLoaded, 2000 ); /* this checks the flag every 2 sec*/
    }    
    else if ( frameDoc.loadComplete == false ) {
        window.setTimeout( checkIsEmailFrameLoaded, 2000 ); /* this checks the flag every 2 sec*/
    }
    else {       
        frameDoc.BindEmailConfiguration( $( '#ddlEntity' ).val(), $( "#ddlEntity" ).find( ":selected" ).attr( "schemaname" ) );
        frameDoc.OnFormtypeUpdate();
    }
}


function BindReportDropdown() {
    var _entity = EntityObjctCodeField.Get();

    if (_entity == null || _entity == undefined || _entity == '') {
        Log("Entity object code is null.");
        return;
    }

    var ddlReport = document.getElementById('ddlReports');
    var _reportsDataSource = FetchReports( _entity );          

    for ( var i = 0; i < _reportsDataSource.length; i++ ) {
        var opt = document.createElement( 'option' );
        opt.innerHTML = _reportsDataSource[i].name;
        opt.value = _reportsDataSource[i].reportid;
        ddlReport.appendChild( opt );
    }
}

function FetchReports( _entity )
{
    var reportColl;
    var orglcid = parent.Xrm.Page.context.getOrgLcid();
    var _fetchXml = "<fetch mapping='logical' version='1.0' >" +
                    "<entity name='report' >" +
                        "<attribute name='name' />" +
                        "<filter type='and'>" +
                            "<condition attribute='parentreportid' operator='null' />" +
                            "<condition attribute='languagecode' operator='eq' value='" + orglcid + "'/>" +
                        "</filter>" +

                        "<link-entity name='reportentity' from='reportid' to='reportid' >" +
                            "<filter>" +
                                "<condition attribute='objecttypecode' operator='eq' value='" + _entity + "' />" +
                            "</filter>" +
                        "</link-entity>" +   
                    "</entity>" +
                "</fetch>";

    _fetchXml = encodeURI( _fetchXml );    
    
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", IOTAP_AddOn_OneClickPdf_GetClientURL() + "reports?fetchXml=" + _fetchXml, 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 ) {
        reportColl = JSON.parse( httpReq.responseText ).value;
    }                              
    
    return reportColl;
}

function ddlReports_OnChange() {
    ReportNameField.Set(document.getElementById('ddlReports').value);
    DisplayNameField.Set(document.getElementById('ddlReports').options[document.getElementById('ddlReports').selectedIndex].text);

    SetNameField();
}

function getWebResource_ddlFieldText(fieldName) {
    var fieldText = '';
    var index = document.getElementById(fieldName).selectedIndex;
    if (index < 1) return fieldText;

    var fieldText = document.getElementById(fieldName).options[document.getElementById(fieldName).selectedIndex].text;
    //if (fieldText == undefined)
    //    return fieldText;
    //else
    return fieldText;
}

function SetNameField()
{
    var _entity = parent.Xrm.Page.getControl(Constant.WebRes.ReportSelector).getObject().contentWindow.getWebResource_ddlFieldText('ddlEntity');
    var _report = parent.Xrm.Page.getControl(Constant.WebRes.ReportSelector).getObject().contentWindow.getWebResource_ddlFieldText('ddlReports');

    var _action = get_DdlText('iotap_action')
    var _fileFormat = get_DdlText('iotap_fileformat');

    var value = '';

    if (_entity == '' || _report == '')
    {
        parent.Xrm.Page.getAttribute('iotap_name').setValue(value);
        return;
    }
    else
        value = _entity + ' - ' + _report;

    if (_fileFormat != '')
        value = value + ' - ' + _fileFormat;

    if (_action != '')
        value = value + ' - ' + _action;

    parent.Xrm.Page.getAttribute('iotap_name').setValue(value);
}

function get_DdlText(fieldName)
{
    var value = parent.Xrm.Page.getAttribute(fieldName).getSelectedOption();
    if (value == null)
        return ''
    else
        return value.text;
}
