﻿var ReportDownloader = {
    ReportId: null,
    Action: null,
    Fileformat: null,
    FileName: null
};

var bytes;
var base64String;
var actionId;

var EntityDetails = {
    Name: null,
    RecordsGuidArray: null
};

var HomeGridEntityDetails = {
    EntityName: null,
    RecordsGuid: null,
    Action: null,
    FileFormat: null
};

function DownloadReport()
{
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", getSUrl() + "/api/data/v8.0/" + "reports(" + ReportDownloader.ReportId + ")?$select=reportid,reportnameonsrs,defaultfilter,iscustomreport,isscheduledreport,name", 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 ) {
        data = JSON.parse( httpReq.responseText );

        if ( data != null ) {
            var reportId = data.reportid.replace( '{', '' ).replace( '}', '' );
            //log.appendLine("Report ID is :-" + reportId);
            var isCustom = data.iscustomreport;
            //log.appendLine("Is Custom Report :-" + isCustom);
            // var isScheduleReport = data[0].IsScheduledReport;
            var reportnameonsrs = data.reportnameonsrs == null ? '' : data.reportnameonsrs;
            //log.appendLine("Report Name on SSRS :-" + reportnameonsrs);
            var currReportName = data.name;
            //log.appendLine("Current Report Name :-" + currReportName);
            var defaultFilter = data.defaultfilter;

            var context = Xrm.Page.context;
            //var name = Xrm.Page.data.entity.getEntityName();
            var SServerUrl = Xrm.Page.context.getClientUrl();

            if ( SServerUrl.match( /\/$/ ) ) {
                SServerUrl = SServerUrl.substring( 0, SServerUrl.length - 1 );
            }
            _downloadReport( reportId, currReportName, isCustom, reportnameonsrs, defaultFilter );
        }
    }
}

function _downloadReport( reportId, reportName, isCustomReport, reportnameonsrs, defaultFilters )
{
    //log.appendLine("Inside DownloadReport Function");
    var path = '', data = '';
    var xmlHttpRes;
    var reportFilter = GetReportFilterXml( defaultFilters );

    Log( reportFilter );

    var reportName = ( ReportDownloader.FileName == null || ReportDownloader.FileName == '' ) ? "Report" : ReportDownloader.FileName;
    //Added by Pranit to get Report filename dynamically from entity field
    var newReportName;
    var fieldName;
    var str1, str2;
    if ( reportName.indexOf( '(' ) > -1 && reportName.indexOf( ')' ) > 0 )
    {
        str1 = reportName.substring( 0, reportName.indexOf( '(' ) );
        str2 = reportName.substring( reportName.indexOf( ')' ) + 1, reportName.length );
        fieldName = reportName.match( /\(([^)]+)\)/ )[1]; 
        var guidList = EntityDetails.RecordsGuidArray;
        var length = guidList.length;
        for ( var i = 0; i < length; i++ ) {
            newReportName = getFilename( fieldName, EntityDetails.Name, guidList[i].replace( '{', '' ).replace( '}', '' ) );
        }
        if (newReportName!="")
        reportName =str1+""+ newReportName+""+str2; //no space needed
    }
        

    //log.appendLine("Report Name : - " + reportName);

    var isCRM2013 = false;  // if (parent.Xrm.Page.context.client != undefined) { isCRM2013 = true; }
    var isOnlineCrm = IsOnlineCrm( parent.Xrm.Page.context );

    //log.appendLine("IS CRM 2013 : - " + isCRM2013);

    var isCRM2015 = true;
    //log.appendLine("IS CRM 2015 : - " + isCRM2015);

    //log.appendLine("IS Online CRM : - " + isOnlineCrm);

    if ( isCRM2015 ) {
        if ( isOnlineCrm ) {
            if ( isCustomReport ) {
                path = getSUrl() + "/CRMReports/rsviewer/quirksreportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName()
                                + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs
                                + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x;
                var ret = [];

                x = xmlHttpRes.responseText.indexOf( "ReportSession=", xmlHttpRes.responseText.indexOf( "ReportSession=" ) + 1 );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id

                x = xmlHttpRes.responseText.indexOf( "ControlID=", xmlHttpRes.responseText.indexOf( "ControlID=" ) + 1 );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id

                if ( ret[0] == "" ) {
                    x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                    ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                    x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                    ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
                }

            } //WORKING
            else //OOB report for crm 2015 online
            {
                path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=false&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=false&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x,
                    ret = [],
                    responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                responseText = responseText.substr( responseText.indexOf( "ReportSession=", responseText.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                var startPoint = 14;
                var endPoint = responseText.indexOf( '&' ) - 14;
                ret[0] = responseText.substr( startPoint, endPoint ); //the session id


                responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );
                responseText = responseText.substr( responseText.indexOf( "ControlID=", responseText.indexOf( "ControlID=" ) + 14 ) ) + 14;
                var startPoint = 10;
                var endPoint = responseText.indexOf( '&' ) - 10;
                ret[1] = responseText.substr( startPoint, endPoint );  //the control id

                if ( ret[0].indexOf( "_common/error/errorhandler.aspx" ) > 0 || ret[1].indexOf( "_common/error/errorhandler.aspx" ) > 0 ) {
                    path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );

                    var x,
                        ret = [],
                        responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                    responseText = responseText.substr( responseText.indexOf( "ReportSession=", responseText.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                    var startPoint = 14;
                    var endPoint = responseText.indexOf( '&' ) - 14;
                    ret[0] = responseText.substr( startPoint, endPoint ); //the session id


                    responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );
                    responseText = responseText.substr( responseText.indexOf( "ControlID=", responseText.indexOf( "ControlID=" ) + 14 ) ) + 14;
                    var startPoint = 10;
                    var endPoint = responseText.indexOf( '&' ) - 10;
                    ret[1] = responseText.substr( startPoint, endPoint );  //the control id
                }

                if ( ret[0] == "" && ret[1] == "" ) {
                    path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );

                    var x,
                        ret = [],
                        responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                    responseText = responseText.substr( responseText.indexOf( "ReportSession=", responseText.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                    var startPoint = 14;
                    var endPoint = responseText.indexOf( '&' ) - 14;
                    ret[0] = responseText.substr( startPoint, endPoint ); //the session id


                    responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );
                    responseText = responseText.substr( responseText.indexOf( "ControlID=", responseText.indexOf( "ControlID=" ) + 14 ) ) + 14;
                    var startPoint = 10;
                    var endPoint = responseText.indexOf( '&' ) - 10;
                    ret[1] = responseText.substr( startPoint, endPoint );  //the control id
                }

                if ( ret[0] == "" && ret[1] == "" ) {
                    path = getSUrl() + "/CRMReports/rsviewer/quirksreportviewer.aspx";
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=false&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=false&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );

                    var x,
                        ret = [],
                        responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                    responseText = responseText.substr( responseText.indexOf( "ReportSession=", responseText.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                    var startPoint = 14;
                    var endPoint = responseText.indexOf( '&' ) - 14;
                    ret[0] = responseText.substr( startPoint, endPoint ); //the session id


                    responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );
                    responseText = responseText.substr( responseText.indexOf( "ControlID=", responseText.indexOf( "ControlID=" ) + 14 ) ) + 14;
                    var startPoint = 10;
                    var endPoint = responseText.indexOf( '&' ) - 10;
                    ret[1] = responseText.substr( startPoint, endPoint );  //the control id
                }
            } //WORKING
            //log.appendLine("Report Session ID = " + ret[0]);
            //log.appendLine("Control ID = " + ret[1]);
        }
        else //onPremiseCRM 2015
        {
            if ( isCustomReport ) {  // custom report crm 2015 onpremise
                path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName()
                                + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs
                                + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x,
                    ret = [],
                    responceTest = xmlHttpRes.responseText;

                responceTest = responceTest.substr( responceTest.indexOf( "ReportSession=", responceTest.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                var startPoint = 14;
                var endPoint = responceTest.indexOf( '\\u0026' ) - 14;
                ret[0] = responceTest.substr( startPoint, endPoint ); //the session id


                responceTest = xmlHttpRes.responseText;
                responceTest = responceTest.substr( responceTest.indexOf( "ControlID=", responceTest.indexOf( "ControlID=" ) + 14 ) ) + 14;
                var startPoint = 10;
                var endPoint = responceTest.indexOf( '\\u0026' ) - 10;
                ret[1] = responceTest.substr( startPoint, endPoint );  //the control id
            } //WORKING
            else //OOB report crm 2015 on premise
            {
                path = getSUrl() + "/CRMReports/rsviewer/quirksreportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter;

                xmlHttpRes = Get_xmlHttpRes( path, data );

                if ( xmlHttpRes.status == 404 ) {
                    path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";//&CRM_FILTER=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                if ( xmlHttpRes.responseText.indexOf( "0x8004832C" ) > 0 ) {
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                if ( ( xmlHttpRes.responseText.indexOf( "ERRORCODE_ETM = '0x8004A001'" ) > 0 ) || xmlHttpRes.responseText.indexOf( "Invalid User Authorization" ) > 0 || xmlHttpRes.responseText.indexOf( "Ungültige Benutzerautorisierung" ) > 0 ) {
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                var x;
                var ret = [];

                x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id

                x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id

                if ( ret[0] == "" ) {
                    x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                    ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                    x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                    ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
                }
            } //WORKING
        }
        //log.appendLine("Report Session ID = " + ret[0]);
        //log.appendLine("Control ID = " + ret[1]);
    }
    if ( isCRM2013 && !isCRM2015 ) {
        if ( isOnlineCrm ) {
            if ( isCustomReport ) {
                path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName()
                                + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs
                                + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x;
                var ret = [];

                x = xmlHttpRes.responseText.indexOf( "ReportSession=", xmlHttpRes.responseText.indexOf( "ReportSession=" ) + 1 );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id

                x = xmlHttpRes.responseText.indexOf( "ControlID=", xmlHttpRes.responseText.indexOf( "ControlID=" ) + 1 );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id

                if ( ret[0] == "" ) {
                    x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                    ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                    x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                    ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
                }

            } //WORKING
            else //OOB report
            {
                path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x,
                    ret = [],
                    responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                if ( responseText.indexOf( "An error has occurred" ) > 0 ) {
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                var x,
                ret = [],
                responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );

                responseText = responseText.substr( responseText.indexOf( "ReportSession=", responseText.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                var startPoint = 14;
                var endPoint = responseText.indexOf( '&' ) - 14;
                ret[0] = responseText.substr( startPoint, endPoint ); //the session id


                responseText = xmlHttpRes.responseText.replace( /\\u0026/g, '&' );
                responseText = responseText.substr( responseText.indexOf( "ControlID=", responseText.indexOf( "ControlID=" ) + 14 ) ) + 14;
                var startPoint = 10;
                var endPoint = responseText.indexOf( '&' ) - 10;
                ret[1] = responseText.substr( startPoint, endPoint );  //the control id

            } //WORKING
            //log.appendLine("Report Session ID = " + ret[0]);
            //log.appendLine("Control ID = " + ret[1]);
        }

        else //onPremiseCRM
        {
            if ( isCustomReport ) {
                path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName()
                                + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs
                                + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );

                var x,
                    ret = [],
                    responceTest = xmlHttpRes.responseText;

                responceTest = responceTest.substr( responceTest.indexOf( "ReportSession=", responceTest.indexOf( "ReportSession=" ) + 14 ) ) + 14;
                var startPoint = 14;
                var endPoint = responceTest.indexOf( '\\u0026' ) - 14;
                ret[0] = responceTest.substr( startPoint, endPoint ); //the session id


                responceTest = xmlHttpRes.responseText;
                responceTest = responceTest.substr( responceTest.indexOf( "ControlID=", responceTest.indexOf( "ControlID=" ) + 14 ) ) + 14;
                var startPoint = 10;
                var endPoint = responceTest.indexOf( '\\u0026' ) - 10;
                ret[1] = responceTest.substr( startPoint, endPoint );  //the control id

            } //WORKING
            else //OOB report
            {
                path = getSUrl() + "/CRMReports/rsviewer/quirksreportviewer.aspx";
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter;

                xmlHttpRes = Get_xmlHttpRes( path, data );

                if ( xmlHttpRes.status == 404 ) {
                    path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";//&CRM_FILTER=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                if ( xmlHttpRes.responseText.indexOf( "0x8004832C" ) > 0 ) {
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                if ( xmlHttpRes.responseText.indexOf( "ERRORCODE_ETM = '0x8004A001'" ) > 0 ) {
                    if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                    else
                        data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                    xmlHttpRes = Get_xmlHttpRes( path, data );
                }

                var x;
                var ret = [];

                x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id

                x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id

                if ( ret[0] == "" ) {
                    x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                    ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                    x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                    ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
                }
            } //WORKING
        }
        //log.appendLine("Report Session ID = " + ret[0]);
        //log.appendLine("Control ID = " + ret[1]);
    }

    //else //CRM2011
    if ( !isCRM2013 && !isCRM2015 ) {
        if ( isCustomReport ) {
            path = getSUrl() + "/CRMReports/rsviewer/reportviewer.aspx";

            if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
            else
                data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter

            xmlHttpRes = Get_xmlHttpRes( path, data );
            if ( xmlHttpRes.responseText.indexOf( "0x8004832C" ) > 0 ) {
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );
            }
            if ( xmlHttpRes.responseText.indexOf( "ERRORCODE_ETM = '0x8004A001'" ) > 0 ) {
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_Filter=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );
            }

            var x, ret = [];

            x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
            ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id
            x = xmlHttpRes.responseText.indexOf( "ControlID=" );
            ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id
            if ( ret[0] == "" ) {
                x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
            }

        }
        else {
            path = getSUrl() + "/CRMReports/rsviewer/quirksreportviewer.aspx";
            if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false";
            else
                data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=" + isCustomReport + "&reportnameonsrs=" + reportnameonsrs + "&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter
            xmlHttpRes = Get_xmlHttpRes( path, data );
            if ( xmlHttpRes.responseText.indexOf( "0x8004832C" ) > 0 || xmlHttpRes.responseText.indexOf( "ERRORCODE_ETM = '0x8004A001'" ) > 0 ) {
                if ( reportFilter == undefined || reportFilter == null || reportFilter == '' )
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false";
                else
                    data = "id=%7B" + reportId + "%7D&uniquename=" + window.parent.Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false&CRM_FILTER=" + reportFilter;
                xmlHttpRes = Get_xmlHttpRes( path, data );
            }

            var x, ret = [];

            x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
            ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "&", x ) - x - 14 ); //the session id
            x = xmlHttpRes.responseText.indexOf( "ControlID=" );
            ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "&", x ) - x - 10 ); //the control id
            if ( ret[0] == "" ) {
                x = xmlHttpRes.responseText.indexOf( "ReportSession=" );
                ret[0] = xmlHttpRes.responseText.substr( x + 14, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 14 ); //the session id
                x = xmlHttpRes.responseText.indexOf( "ControlID=" );
                ret[1] = xmlHttpRes.responseText.substr( x + 10, xmlHttpRes.responseText.indexOf( "\\", x ) - x - 10 ); //the control id
            }
        }
        //log.appendLine("Report Session ID = " + ret[0]);
        //log.appendLine("Control ID = " + ret[1]);
    }

    Log( "**************", ret, "**************" );

    if ( ReportDownloader.Action == "123030004" ) {
        var downloadPath = getSUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + ret[0] +
                           "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + ret[1] +
                           "&OpType=Export&FileName=" + reportName +
                           "&ContentDisposition=OnlyHtmlInline&Format=MHTML";
    }
    else {
        var downloadPath = getSUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + ret[0] +
                           "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + ret[1] +
                           "&OpType=Export&FileName=" + reportName +
                           "&ContentDisposition=OnlyHtmlInline&Format=" + FileFormat[ReportDownloader.Fileformat]; 
    }


    //log.appendLine("");
    //log.appendLine(encodeURIComponent(downloadPath));
    //log.appendLine("");
    Log( downloadPath );
    PostOpperation( downloadPath );
}

function Get_xmlHttpRes( _path, _data )
{
    var xmlHttpReq = new XMLHttpRequest();
    xmlHttpReq.open( "POST", _path, false );
    xmlHttpReq.setRequestHeader( "Accept", "*/*" );
    xmlHttpReq.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
    xmlHttpReq.send( _data );
    return xmlHttpReq;
}

function GetReportFilterXml( _defaultFilterXml )
{
    var _xml = StringToXml( _defaultFilterXml );

    if ( parent.Xrm.Page.data == null ) {
        EntityDetails.Name = DownloadOptions.primaryEntityName

        EntityDetails.RecordsGuidArray = DownloadOptions.recordGuid.split( ',' );
    }
    else {
        EntityDetails.Name = parent.Xrm.Page.data.entity.getEntityName();
        EntityDetails.RecordsGuidArray = [parent.Xrm.Page.data.entity.getId()];
    }

    if ( _defaultFilterXml == null || _defaultFilterXml == '' || _defaultFilterXml == undefined )
        return;

    var length = EntityDetails.RecordsGuidArray.length;
    var counter = false;

    //-newly added Pranit for removing condition element from xml
    var flag = false;
    if ( parent.Xrm.Page.context.client != undefined ) {
        if ( IsOnlineCrm( parent.Xrm.Page.context ) ) {
            y = _xml.getElementsByTagName( "condition" )[0];

            if ( _xml.getElementsByTagName( "condition" ).length == 1 ) {
                _xml.getElementsByTagName( "filter" )[0].removeChild( y );
                //_xml.documentElement.firstChild.childNodes[0].childNodes[0].childNodes[1].removeChild(y);
            }
        }
    }
    //-newly added Pranit for removing condition element from xml

    if ( _xml.getElementsByTagName( "filter" ).length == 0 ) {
        var _newFilter = _xml.createElement( "filter" );
        _newFilter.setAttribute( "type", "and" );
        var e = _xml.getElementsByTagName( "entity" )[0];
        e.appendChild( _newFilter );

        var _newcondition = _xml.createElement( "condition" );
        _newcondition.setAttribute( "attribute", EntityDetails.Name + 'id' );
        _newcondition.setAttribute( "operator", 'in' );
        var e = _xml.getElementsByTagName( "filter" )[0];
        e.appendChild( _newcondition );
    }

    //-newly added by Pranit for adding condition with new attribute and value element in xml
    if ( parent.Xrm.Page.context.client != undefined ) {
        if ( IsOnlineCrm( parent.Xrm.Page.context ) ) {
            if ( _xml.getElementsByTagName( "condition" ).length == 0 ) {
                var _newcondition = _xml.createElement( "condition" );
                _newcondition.setAttribute( "attribute", EntityDetails.Name + 'id' );
                _newcondition.setAttribute( "operator", 'in' );
                var e = _xml.getElementsByTagName( "filter" )[0];
                e.appendChild( _newcondition );

                for ( var i = 0; i < length; i++ ) {
                    var newel = _xml.createElement( "value" );
                    newel.setAttribute( "uitype", EntityDetails.Name );
                    newel.appendChild( _xml.createTextNode( EntityDetails.RecordsGuidArray[i] ) );
                    _newcondition.appendChild( newel );
                }
                flag = true;
            }
        }
    }
    //-newly added by Pranit for adding condition with new attribute and value element in xml


    if ( _xml.getElementsByTagName( "condition" ).length == 0 ) {
        var _newcondition = _xml.createElement( "condition" );
        _newcondition.setAttribute( "attribute", EntityDetails.Name + 'id' );
        _newcondition.setAttribute( "operator", 'in' );
        var e = _xml.getElementsByTagName( "filter" )[0];
        e.appendChild( _newcondition );
    }

    else {
        for ( var i = 0; i < _xml.getElementsByTagName( "condition" ).length; i++ ) {
            tem = _xml.getElementsByTagName( "condition" )[i];


            if ( flag == false ) {//--newly added by pranit 
                //WORKING in chrome//if (tem.hasAttribute("attribute") && tem.getAttribute("attribute") == EntityDetails.Name + "id")
                if ( ( tem.getAttribute( "attribute" ) == null )
                    && tem.getAttribute( "attribute" ) == EntityDetails.Name + "id" ) {
                    y = tem.getAttributeNode( "operator" );
                    y.nodeValue = "in";

                    for ( var i = 0; i < length; i++ ) {
                        var newel = _xml.createElement( "value" );
                        newel.setAttribute( "uitype", EntityDetails.Name );
                        newel.appendChild( _xml.createTextNode( EntityDetails.RecordsGuidArray[i] ) );
                        tem.appendChild( newel );
                    }
                    counter = true;
                }
            }
        }

        if ( !counter ) {
            if ( flag == false ) {//--newly added
                var _newcondition = _xml.createElement( "condition" );
                _newcondition.setAttribute( "attribute", EntityDetails.Name + 'id' );
                _newcondition.setAttribute( "operator", 'in' );
                var e = _xml.getElementsByTagName( "filter" )[0];
                e.appendChild( _newcondition );

                for ( var i = 0; i < length; i++ ) {
                    var newel = _xml.createElement( "value" );
                    newel.setAttribute( "uitype", EntityDetails.Name );
                    newel.appendChild( _xml.createTextNode( EntityDetails.RecordsGuidArray[i] ) );
                    _newcondition.appendChild( newel );
                }
            }
        }
    }

    //Cleanup START
    if ( _xml.getElementsByTagName( "condition" ).length > 1 ) {
        for ( var e = 0; e < _xml.getElementsByTagName( "condition" ).length; e++ ) {
            tem = _xml.getElementsByTagName( "condition" )[e];

            //If condition dont contain "value" attribute AND IF condition dont contain child node value
            if ( tem.getAttribute( 'value' ) == null && tem.childNodes.length == 0 ) {
                tem.parentNode.removeChild( tem );
                //tem.remove(); // this statement not working in old IE
            }
        }
    }
    //Cleanup

    if ( _xml.xml != undefined && _xml.xml != null )
        return _xml.xml;
    else
        return new XMLSerializer().serializeToString( _xml );
}

function RetriveCompleted( varBody )
{
    var action = ReportDownloader.Action;
    var fileMetadata = getFileMetadata( FileFormat[ReportDownloader.Fileformat] );
    var reportName = ( ReportDownloader.FileName == null || ReportDownloader.FileName == '' ) ? "Report" : ReportDownloader.FileName;
    
    //Added by Pranit to get Report filename dynamically from entity field
    var isCustomReportName = false;
    var fieldName;
    var str1, str2;
    if ( reportName.indexOf( '(' ) > -1 && reportName.indexOf( ')' ) > 0 ) {

        str1 = reportName.substring( 0, reportName.indexOf( '(' ) );
        str2 = reportName.substring( reportName.indexOf( ')' ) + 1, reportName.length );

        fieldName = reportName.match( /\(([^)]+)\)/ )[1];
        isCustomReportName = true;

    }



    var wrParameters = getWebresourceParameter();

    switch ( action ) {
        case ActionType.ATTACH_EMAIL:

            var newReportName;
            if ( isCustomReportName == true ) {
                var guidList = EntityDetails.RecordsGuidArray;
                var length = guidList.length;
                for ( var i = 0; i < length; i++ ) {
                    newReportName = getFilename( fieldName, EntityDetails.Name, guidList[i].replace( '{', '' ).replace( '}', '' ) );
                }
                if ( newReportName != "" )
                reportName =str1+""+ newReportName+""+str2;//no space needed
            }

            var emailid;
            //var windowObj = window.parent;
            //if ( window.opener )
            //    windowObj = window.opener;

            var ownerId = parent.Xrm.Page.context.getUserId();

            if ( window.top.opener.Xrm.Page.data ) { 
                var actionId;
                if ( document.getElementById( 'ddlReports' ) )
                    actionId = document.getElementById( 'ddlReports' ).value.split( '|' )[1];
                else
                    actionId = wrParameters;

                var result = ExecuteOdata( _getUrl( parent.Xrm.Page.context ),
                                   Constant.OrgService,
                                   ConfigEntity.LogicalName + "?$select=iotap_name,iotap_emailto,iotap_emailtemplate,iotap_entityname,iotap_subject&$filter=iotap_actionid eq '" + actionId + "'" );

                if ( result != null ) {
                    var length = result.length;
                    for ( var i = 0; i < length; i++ ) {
                        if ( result[i] != undefined ) {

                            var emailObj = {};

                            var entityName = result[i].iotap_entityname;
                            var entityurl = "";

                            var recordId = window.top.opener.Xrm.Page.data.entity.getId();

                            if ( entityName.endsWith( "y" ) )
                                entityurl = entityName.substring( 0, entityName.length - 1 ) + "ies";
                            else
                                entityurl = entityName + "s";

                            emailObj["regardingobjectid_" + entityName + "@odata.bind"] = "/" + entityurl + "(" + recordId.replace( '{', '' ).replace( '}', '' ) + ")";
                            emailObj["subject"] = ( result[i].iotap_subject == null || result[i].iotap_subject == '' ) ? "Report" : result[i].iotap_subject;

                            if ( result[i].iotap_emailtemplate != null )
                                var emailTemplate = getEmailTemplate( entityName, recordId.replace( '{', '' ).replace( '}', '' ), result[i].iotap_emailtemplate );//email-template  

                            var activityparties = [];
                            if ( result[i].iotap_emailto != null ) {
                                if ( result[i].iotap_emailto == "owninguser" )
                                    result[i].iotap_emailto = "ownerid";
                                var customerObj = window.top.opener.Xrm.Page.getAttribute( result[i].iotap_emailto );
                                if ( customerObj != null ) {
                                    customer = customerObj.getValue();
                                    if ( customer != null )//New check
                                    {
                                        var customerurl = "";

                                        if ( customer[0].entityType.endsWith( "y" ) )
                                            customerurl = customer[0].entityType.substring( 0, customer[0].entityType.length - 1 ) + "ies";
                                        else
                                            customerurl = customer[0].entityType + "s";

                                        var to = {};
                                        to["partyid_" + customer[0].entityType + "@odata.bind"] = "/" + customerurl + "(" + customer[0].id.replace( '{', '' ).replace( '}', '' ) + ")";
                                        to["participationtypemask"] = 2;     //to
                                        activityparties.push( to );
                                    }
                                }
                            }

                            var from = {};
                            from["partyid_systemuser@odata.bind"] = "/systemusers(" + ownerId.replace( '{', '' ).replace( '}', '' ) + ")";
                            from["participationtypemask"] = 1;        //sender
                            activityparties.push( from );

                            emailObj["email_activity_parties"] = activityparties;

                            if ( emailTemplate != null && emailTemplate.length > 0 ) {
                                emailObj["subject"] = emailTemplate[0].subject;
                                emailObj["description"] = emailTemplate[0].description;

                                emailid = CreateEntity_odata( getSUrl(), emailObj, 'emails' );
                            }
                            else
                                emailid = CreateEntity_odata( getSUrl(), emailObj, 'emails' );
                        }
                    }
                }
            }
            else {
                var activityparties = [];
                var from = {};
                from["partyid_systemuser@odata.bind"] = "/systemusers(" + ownerId.replace( '{', '' ).replace( '}', '' ) + ")";
                from["participationtypemask"] = 1;        //sender
                activityparties.push( from );
                emailid = CreateEntity_odata( getSUrl(), { subject: reportName, email_activity_parties: activityparties }, 'emails' ); 
            }

            var post = Object();
            post.body = varBody;
            post.subject = "File Attachment";
            post.attachmentnumber = 1;
            post.filename = reportName + "." + fileMetadata.Extension;
            post.mimetype = fileMetadata.MimeType;
            post["objectid_email@odata.bind"] = "/emails(" + emailid + ")";
            post.objecttypecode = "email";

            CreateEntity_odata( getSUrl(), post, "activitymimeattachments" );

            var features = "location=no,menubar=no,status=no,toolbar=no,width=900,height=700";
            window.open( getSUrl() + "/main.aspx?etn=email&pagetype=entityrecord&id=" + emailid, "_blank", features, false );

            break;
        case ActionType.SAVE_NOTES:
            var guidList = EntityDetails.RecordsGuidArray;
            var length = guidList.length;

           
            for ( var i = 0; i < length; i++ ) {
                var post = Object();
                post.documentbody = varBody;
                post.subject = "File Attachment";

                //Added by Pranit to get Report filename dynamically from entity field
                if ( isCustomReportName == true )
                {
                    var newReportName = getFilename( fieldName, EntityDetails.Name, guidList[i].replace( '{', '' ).replace( '}', '' ) );
                    if ( newReportName != "" ) {
                        post.filename =str1+""+ newReportName+""+str2 + "." + fileMetadata.Extension; //no space needed
                    } else
                    { post.filename = reportName + "." + fileMetadata.Extension; }
                }
                else
                {
                    post.filename = reportName + "." + fileMetadata.Extension;
                }
                
                post.mimetype = fileMetadata.MimeType;

                var entityurl = "";

                if ( EntityDetails.Name.endsWith( "y" ) )
                    entityurl = EntityDetails.Name.substring( 0, EntityDetails.Name.length - 1 ) + "ies";
                else
                    entityurl = EntityDetails.Name + "s";

                post["objectid_" + EntityDetails.Name + "@odata.bind"] = "/" + entityurl + "(" + guidList[i].replace( '{', '' ).replace( '}', '' ) + ")";

                

                CreateEntity_odata( getSUrl(), post, "annotations" );
            }
            alert( Constant.NotesAttached );
            break;

        case ActionType.EMBED_EMAIL:
            var emailid;
            //var windowObj = window.parent;
            //if ( window.opener )
            //    windowObj = window.opener;

            var ownerId = parent.Xrm.Page.context.getUserId();

            if ( window.top.opener.Xrm.Page.data ) { 
                var actionId;
                if ( document.getElementById( 'ddlReports' ) )
                    actionId = document.getElementById( 'ddlReports' ).value.split( '|' )[1];
                else
                    actionId = wrParameters;

                var result = ExecuteOdata( _getUrl( parent.Xrm.Page.context ),
                                   Constant.OrgService,
                                   ConfigEntity.LogicalName + "?$select=iotap_name,iotap_emailto,iotap_emailtemplate,iotap_entityname,iotap_subject&$filter=iotap_actionid eq '" + actionId + "'" );

                if ( result != null ) {
                    var length = result.length;
                    for ( var i = 0; i < length; i++ ) {
                        if ( result[i] != undefined ) {

                            var emailObj = {};

                            var entityName = result[i].iotap_entityname;//windowObj.Xrm.Page.data.entity.getEntityName();
                            var entityurl = "";

                            var recordId = window.top.opener.Xrm.Page.data.entity.getId();

                            if ( entityName.endsWith( "y" ) )
                                entityurl = entityName.substring( 0, entityName.length - 1 ) + "ies";
                            else
                                entityurl = entityName + "s";

                            emailObj["regardingobjectid_" + entityName + "@odata.bind"] = "/" + entityurl + "(" + recordId.replace( '{', '' ).replace( '}', '' ) + ")";
                            emailObj["subject"] = ( result[i].iotap_subject == null || result[i].iotap_subject == '' ) ? "Report" : result[i].iotap_subject;

                            if ( result[i].iotap_emailtemplate != null )
                                var emailTemplate = getEmailTemplate( entityName, recordId.replace( '{', '' ).replace( '}', '' ), result[i].iotap_emailtemplate );//email-template  

                            var activityparties = [];
                            if ( result[i].iotap_emailto != null ) {
                                if ( result[i].iotap_emailto == "owninguser" )
                                    result[i].iotap_emailto = "ownerid";
                                var customerObj = window.top.opener.Xrm.Page.getAttribute( result[i].iotap_emailto );//customerid
                                if ( customerObj != null ) {
                                    customer = customerObj.getValue();
                                    if ( customer != null )//New check
                                    {
                                        var customerurl = "";

                                        if ( customer[0].entityType.endsWith( "y" ) )
                                            customerurl = customer[0].entityType.substring( 0, customer[0].entityType.length - 1 ) + "ies";
                                        else
                                            customerurl = customer[0].entityType + "s";

                                        var to = {};
                                        to["partyid_" + customer[0].entityType + "@odata.bind"] = "/" + customerurl + "(" + customer[0].id.replace( '{', '' ).replace( '}', '' ) + ")";
                                        to["participationtypemask"] = 2;     //to
                                        activityparties.push( to );
                                    }
                                }
                            }

                            var from = {};
                            from["partyid_systemuser@odata.bind"] = "/systemusers(" + ownerId.replace( '{', '' ).replace( '}', '' ) + ")";
                            from["participationtypemask"] = 1;        //sender
                            activityparties.push( from );

                            emailObj["email_activity_parties"] = activityparties;

                            if ( emailTemplate != null && emailTemplate.length > 0 ) {
                                //Commented as No Template needed in email body
                                //emailObj["subject"] = emailTemplate[0].subject;
                                //emailObj["description"] = emailTemplate[0].description;
                                //emailid = CreateEntity_odata( getSUrl(), emailObj, 'emails' );

                                //below code is for Getting Report in email Body and added temporary instead of Template 
                                var decodedVarDesc = decodeBase64String( varBody )
                                var finalString = refineString( decodedVarDesc )
                                var desc = finalString;
                                if ( decodedVarDesc.indexOf( 'MIME' ) >= 0 ) {
                                    desc = desc.replace( /(?:\r\n|\r|\n)/g, ' ' );
                                    desc = decodeBase64String( desc );
                                    desc = desc.split( '</html>' )[0] + '</html>'
                                }
                                emailObj["subject"] = emailTemplate[0].subject;
                                emailObj["description"] = desc;
                                emailid = CreateEntity_odata( getSUrl(), emailObj, 'emails' );
                            }
                            else
                            {
                                //below code is for Getting Report in email Body
                                var decodedVarDesc = decodeBase64String( varBody )
                                var finalString = refineString( decodedVarDesc )
                                var desc = finalString;
                                if ( decodedVarDesc.indexOf( 'MIME' ) >= 0 ) {
                                    desc = desc.replace( /(?:\r\n|\r|\n)/g, ' ' );
                                    desc = decodeBase64String( desc );
                                    desc = desc.split( '</html>' )[0] + '</html>'
                                }
                                emailObj["description"] = desc;
                                emailid = CreateEntity_odata( getSUrl(), emailObj, 'emails' );
                            }
                            
                        }
                    }
                }
            }
            else {
                var activityparties = [];
                var from = {};
                from["partyid_systemuser@odata.bind"] = "/systemusers(" + ownerId.replace( '{', '' ).replace( '}', '' ) + ")";
                from["participationtypemask"] = 1;        //sender
                activityparties.push( from );

                //below code is for Getting Report in email Body
                var post = Object();
                var decodedVarDesc = decodeBase64String( varBody )
                var finalString = refineString( decodedVarDesc )
                var desc = finalString;
                if ( decodedVarDesc.indexOf( 'MIME' ) >= 0 ) {
                    desc = desc.replace( /(?:\r\n|\r|\n)/g, ' ' );
                    desc = decodeBase64String( desc );
                    desc = desc.split( '</html>' )[0] + '</html>'
                }
                post.description = desc;

                post.subject = reportName;
                post.email_activity_parties = activityparties;
                emailid = CreateEntity_odata( getSUrl(), post, 'emails' );
                
                //emailid = CreateEntity_odata( getSUrl(), { subject: reportName, email_activity_parties: activityparties }, 'emails' ); //commented by Pranit
            }

            //var post = Object();
            //post.body = varBody;
            //post.subject = "File Attachment";
            //post.attachmentnumber = 1;
            //post.filename = reportName + "." + fileMetadata.Extension;
            //post.mimetype = fileMetadata.MimeType;
            //post["objectid_email@odata.bind"] = "/emails(" + emailid + ")";
            //post.objecttypecode = "email";

            //CreateEntity_odata( getSUrl(), post, "activitymimeattachments" );

            var features = "location=no,menubar=no,status=no,toolbar=no,width=900,height=700";
            window.open( getSUrl() + "/main.aspx?etn=email&pagetype=entityrecord&id=" + emailid, "_blank", features, false );
            
            break;
    }
    $( '#loadingDiv' ).css( 'display', 'none' );

    window.close();
}


function getWebresourceParameter()
{
    var passedParameters;
    if ( location.search != "" ) {
        var vals = location.search.substr( 1 ).split( "&" );
        for ( var i = 0; i < vals.length; i++ ) {
            vals[i] = vals[i].split( "=" );
            if ( vals[i][0].toLowerCase() == "data" && vals[i][1] != "" ) {
                var userVals = decodeURIComponent( vals[i][1] ).split( "," );
                for ( var j = 0; j < userVals.length; j++ ) {

                    //Fixed for multiple email creation scenario
                    if ( userVals[j].indexOf( '|' ) > 0 )
                    {
                        passedParameters = userVals[j].split( "=" )[0].split( "|" )[1].trim();
                    } else
                    {
                        passedParameters = userVals[j].split( "=" )[0];
                    }
                    //passedParameters = userVals[j].split( "=" )[0].split( "|" )[1].trim(); //commented by pranit

                }
            }
        }
    }
    return passedParameters;
}

function getEmailTemplate( entityName, entityId, templateId )
{
    var emailTemplate = "";

    var httpReq = new XMLHttpRequest();
    httpReq.open( "POST", getSUrl() + "/api/data/v8.0/" + "InstantiateTemplate", 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" );

    var templateParameters = {
        "TemplateId": templateId,
        "ObjectType": entityName,
        "ObjectId": entityId
    };

    httpReq.send( JSON.stringify( templateParameters ) );

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

    }

    return emailTemplate;
}

function getFileMetadata( file )
{
    switch ( file ) {
        case 'PDF':
            return { MimeType: "application/pdf", Extension: "pdf" };
        case 'EXCEL':
            return { MimeType: "application/vnd-ms-excel", Extension: "xls" };
        case 'WORD':
            return { MimeType: "application/msword", Extension: "doc" };
        default:
            break;
    }
}

function PostOpperation( _downloadPath, load )
{

    var action = ReportDownloader.Action;

    switch ( action ) {
        case ActionType.SAVE:
        case ActionType.OPEN:
            $( '#loadingDiv' ).css( 'display', 'none' );
            //window.location.href = _downloadPath; 
            window.open(_downloadPath,'_blank');
            setTimeout( function ()
            {
                window.close()
            }, 10000 );
            //log.appendLine("Report Downloaded Successfully");
              
            break;
        case ActionType.EMBED_EMAIL:
        case ActionType.ATTACH_EMAIL:
        case ActionType.SAVE_NOTES:
            var request = new XMLHttpRequest();
            request.open( "GET", _downloadPath, true );
            request.onreadystatechange = function ()
            {
                if ( request.readyState == 4 ) {
                    if ( request.status == 200 ) {
                        var data = new Uint8Array( request.response );
                        var binary = '';
                        for ( var i = 0; i < data.length; i++ ) {
                            binary += String.fromCharCode( data[i] );
                        }
                        base64String = window.btoa( binary );
                        RetriveCompleted( base64String );
                    }
                    else {
                        alert( " An error has occurred: " + request.statusText );
                    }
                }
            };
            request.setRequestHeader( "Cache-Control", "no-cache" );
            request.responseType = "arraybuffer";
            request.send();

            if ( action == "123030002" )
                //log.appendLine("Report Attached to email successfully");
                if ( action == "123030003" )
                    //log.appendLine("Report Saved to notes successfully");

                    break;
        default:
            Log( _downloadPath );
            break;
    }
    var currentdate = new Date();
    var datetime = currentdate.getDate() + "/"
                    + ( currentdate.getMonth() + 1 ) + "/"
                    + currentdate.getFullYear() + " @ "
                    + currentdate.getHours() + ":"
                    + currentdate.getMinutes() + ":"
                    + currentdate.getSeconds();
    //log.appendLine("Stop Time : - " + datetime);
    //var serverUrl = getSUrl();
    //var isEnabled = RetrieveGlobalSettings();
    //if (isEnabled == "true")
    //createOneClickDoc(serverUrl, DownloadOptions.primaryEntityName, log);
   
}

function getSUrl()
{
    return window.parent.Xrm.Page.context.getClientUrl();

}

function RetrieveGlobalSettings()
{
    var isLoggingEnabled;
    var httpReq = new XMLHttpRequest();
    httpReq.open( "GET", window.parent.Xrm.Page.context.getClientUrl() + "/api/data/v8.0/iotap_globalsettingses?$select=iotap_globalsettingsid,iotap_name,createdon,iotap_guid,iotap_enablelogging", 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 ) {
        data = JSON.parse( httpReq.responseText ).value;

        if ( data.length > 0 ) {
            isLoggingEnabled = data[0].iotap_enablelogging;
        }
    }

    return isLoggingEnabled;
}