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

var bytes;
var base64String;

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

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

function DownloadReport() {
    var oDataSetName = "ReportSet";
    var columns = "ReportId,ReportNameOnSRS,DefaultFilter,IsCustomReport,IsScheduledReport,Name,DefaultFilter";
    var filter = "ReportId eq guid'" + ReportDownloader.ReportId + "'";
    RetrieveAllReports(oDataSetName, columns, filter, RetriveReports_OnSuccess);
}

function RetrieveAllReports(odataSetName, select, filter, successCallback) {

    var serverUrl = getSUrl();
    var odataUri = serverUrl + Constant.OrgService + "/" + odataSetName + "?";
    if (select)
        odataUri += "$select=" + select + "&";

    if (filter)
        odataUri += "$filter=" + filter;
    log.appendLine("");
    log.appendLine("OData URL is :- " + encodeURIComponent(odataUri));
    log.appendLine("");
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: odataUri,
        beforeSend: function (XMLHttpRequest) {
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },

        success: function (data, textStatus, XmlHttpRequest) {
            Log('success');
            
            if (successCallback) {
                if (data && data.d && data.d.results)
                    successCallback(data.d.results, textStatus, XmlHttpRequest);
                else if (data && data.d)
                    successCallback(data.d, textStatus, XmlHttpRequest);
                else
                    successCallback(data, textStatus, XmlHttpRequest);
            }
        },

        error: function (XmlHttpRequest, textStatus, errorThrown) {
            Log('error');
            if (XmlHttpRequest && XmlHttpRequest.responseText)
                alert("Error while retrieval ; Error – " + XmlHttpRequest.responseText);
        }
    });
}

function RetriveReports_OnSuccess(data, textStatus, XmlHttpRequest) {
    log.appendLine("Report Retrieved Successfully");
    if (data && data.length > 0) {
        var reportId = data[0].ReportId.replace('{', '').replace('}', '');
        log.appendLine("Report ID is :-" + reportId);
        var isCustom = data[0].IsCustomReport;
        log.appendLine("Is Custom Report :-" + isCustom);
        // var isScheduleReport = data[0].IsScheduledReport;
        var reportnameonsrs = data[0].ReportNameOnSRS == null ? '' : data[0].ReportNameOnSRS;
        log.appendLine("Report Name on SSRS :-" + reportnameonsrs);
        var currReportName = data[0].Name;
        log.appendLine("Current Report Name :-" + currReportName);
        var defaultFilter = data[0].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;

    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 = false; if (parent.Xrm.Page.context.getServerUrl == undefined) { 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) {
                    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, "**************");

    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 || parent.Xrm.Page.context.getServerUrl == 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 || parent.Xrm.Page.context.getServerUrl == 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;

    switch (action)
    {
        case ActionType.ATTACH_EMAIL:
            var emailid;
            var windowObj = window.parent;
            if (window.opener)
                windowObj = window.opener;

            var ownerId = windowObj.Xrm.Page.context.getUserId();
            if (windowObj.Xrm.Page.data)
            {
                var result = ExecuteOdata(_getUrl(windowObj.Xrm.Page.context),
                                   Constant.OrgService,
                                   ConfigEntity.LogicalName + "Set?$select=iotap_name,iotap_emailto,iotap_emailtemplate,iotap_entityname,iotap_subject&$filter=iotap_entityname eq '" + windowObj.Xrm.Page.data.entity.getEntityName() + "'");
                if (result != null)
                {
                    var length = result.length;
                    for (var i = 0; i < length; i++)
                    {
                        if (result[i] != undefined)
                        {
                           
                            var entityName = result[i].iotap_entityname;//windowObj.Xrm.Page.data.entity.getEntityName();
                           
                            var recordId = windowObj.Xrm.Page.data.entity.getId();
                            //var ownerId = windowObj.Xrm.Page.context.getUserId();

                            var regarding = new Object();
                            regarding.Id = recordId.replace('{', '').replace('}', '');
                            regarding.LogicalName = entityName;

                            var 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, regarding.Id, result[i].iotap_emailtemplate);//email-template

                            if (emailTemplate != null && emailTemplate.length > 0)
                            {
                                subject = emailTemplate[0].Subject;
                                var description = emailTemplate[0].Description;
                                emailid = (CreateEntity_odata(getSUrl(), { Subject: subject, Description: description, RegardingObjectId: regarding }, 'Email')).ActivityId;
                            }
                            else
                                emailid = (CreateEntity_odata(getSUrl(), { Subject: subject, RegardingObjectId: regarding }, 'Email')).ActivityId;
                                                       
                            
                            if (result[i].iotap_emailto != null)
                            {
                                if (result[i].iotap_emailto == "owninguser")
                                    result[i].iotap_emailto = "ownerid";
                                var customerObj = windowObj.Xrm.Page.getAttribute(result[i].iotap_emailto);//customerid
                                if (customerObj != null)
                                {
                                    customer = customerObj.getValue();
                                    if (customer != null)//New check
                                    {
                                        var activityPartyTo = new Object();
                                        activityPartyTo.PartyId = {
                                            Id: customer[0].id.replace('{', '').replace('}', ''),
                                            LogicalName: customer[0].entityType
                                        }

                                        activityPartyTo.ActivityId = {
                                            Id: emailid,
                                            LogicalName: "email"
                                        }
                                        activityPartyTo.ParticipationTypeMask = { Value: 2 }; //2 = ToRecipient 
                                        var activityPartyToObj = CreateEntity_odata(getSUrl(), activityPartyTo, 'ActivityParty');
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
                emailid = (CreateEntity_odata(getSUrl(), { Subject: reportName }, 'Email')).ActivityId;

            var activityPartySender = new Object();
            activityPartySender.PartyId = {
                Id: ownerId.replace('{', '').replace('}', ''),
                LogicalName: "systemuser"
            };

            activityPartySender.ActivityId = {
                Id: emailid,
                LogicalName: "email"
            }
            activityPartySender.ParticipationTypeMask = { Value: 1 }; //1 = Sender 
            var activityPartySenderObj = CreateEntity_odata(getSUrl(), activityPartySender, 'ActivityParty');

            var email = new Array();
            email[0] = new Object();
            email[0].id = emailid;
            email[0].entityType = 'email';

            var post = Object();
            post.Body = varBody;
            //post.Body = "DQpmdW5jdGlvbiBQb3N0T3BwZXJhdGlvbihfZG93bmxvYWRQYXRoKSB7DQogICAgdmFyIGFjdGlvbiA9IFJlcG9ydERvd25sb2FkZXIuQWN0aW9uOw0KICAgIHN3aXRjaCAoYWN0aW9uKSB7DQogICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TQVZFOg0K";
            post.Subject = "File Attachment";
            post.AttachmentNumber = 1;
            post.FileName = reportName + "." + fileMetadata.Extension;
            post.MimeType = fileMetadata.MimeType;

            post.ObjectId = Object();
            post.ObjectId.LogicalName = "email";
            post.ObjectId.Id = email[0].id;
            post.ObjectTypeCode = "email";

            CreateEntity_odata(getSUrl(), post, "ActivityMimeAttachment");
            //parent.Xrm.Utility.openEntityForm("email", emailid);

            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.DocumentBody = "DQpmdW5jdGlvbiBQb3N0T3BwZXJhdGlvbihfZG93bmxvYWRQYXRoKSB7DQogICAgdmFyIGFjdGlvbiA9IFJlcG9ydERvd25sb2FkZXIuQWN0aW9uOw0KICAgIHN3aXRjaCAoYWN0aW9uKSB7DQogICAgICAgIGNhc2UgQWN0aW9uVHlwZS5TQVZFOg0K";
                post.Subject = "File Attachment";
                post.FileName = reportName + "." + fileMetadata.Extension;
                post.MimeType = fileMetadata.MimeType;
                post.ObjectId = Object();
                post.ObjectId.LogicalName = EntityDetails.Name;
                post.ObjectId.Id = guidList[i].replace('{', '').replace('}', '');;
                CreateEntity_odata(getSUrl(), post, "Annotation", "");
            }
            alert(Constant.NotesAttached);
            break;
    }
    $('#loadingDiv').css('display', 'none');
    //createOneClickDoc(serverUrl, DownloadOptions.primaryEntityName, log)

    window.close();//
}

function getEmailTemplate(entityName, entityId, templateId)
{
    var soapXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">';
    soapXml += '<s:Body>';
    soapXml += '<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">';
    soapXml += '<request i:type="b:InstantiateTemplateRequest" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">';
    soapXml += '<a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">';
    soapXml += '<a:KeyValuePairOfstringanyType>';
    soapXml += '<c:key>TemplateId</c:key>';
    soapXml += '<c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization/">' + templateId + '</c:value>';//b6c38bb9-2423-471d-8b38-e3b99ed80e7a
    soapXml += '</a:KeyValuePairOfstringanyType>';
    soapXml += '<a:KeyValuePairOfstringanyType>';
    soapXml += '<c:key>ObjectType</c:key>';
    soapXml += '<c:value i:type="d:string" xmlns:d="http://www.w3.org/2001/XMLSchema">' + entityName + '</c:value>';
    soapXml += '</a:KeyValuePairOfstringanyType>';
    soapXml += '<a:KeyValuePairOfstringanyType>';
    soapXml += '<c:key>ObjectId</c:key>';
    soapXml += '<c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization/">' + entityId + '</c:value>';//b076b29f-43d7-e311-aabb-00155d003404
    soapXml += '</a:KeyValuePairOfstringanyType>';
    soapXml += '</a:Parameters>';
    soapXml += '<a:RequestId i:nil="true" />';
    soapXml += '<a:RequestName>InstantiateTemplate</a:RequestName>';
    soapXml += '</request>';
    soapXml += '</Execute>';
    soapXml += '</s:Body>';
    soapXml += '</s:Envelope>';

    var xmlhttp;
    if (navigator.appName == "Microsoft Internet Explorer")
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    else
        xmlhttp = new XMLHttpRequest();

    xmlhttp.open("POST", GetGlobalContext().getClientUrl() + "/XRMServices/2011/Organization.svc/web", false);
    xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");
    xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
    xmlhttp.send(soapXml);

    var resultXml = xmlhttp.responseXML;
    var xmlText = null;
    if (navigator.appName == "Microsoft Internet Explorer")
        xmlText = resultXml.xml || resultXml.activeElement.innerHTML;
    else
        xmlText = (new XMLSerializer()).serializeToString(resultXml);
    //return xmlText;
    var ResultXml = xmlText;
        try
        {
            xmlDoc = $.parseXML(ResultXml);
        }
        catch (E)
        {
            alert(error_Xml);
            return;
        }
    $xml = $(xmlDoc);
    var XmlChildNodeList, emailTemplates;
    if (navigator.appName == "Netscape" && navigator.vendor == "Google Inc.")
    {
        XmlChildNodeList = $xml.find("Results").find("Entity");
        emailTemplates = ForChrome(XmlChildNodeList);
    }
    else
    {
        XmlChildNodeList = $xml.find("a\\:Results").find("a\\:Entity");
        emailTemplates = ForIEandFireFox(XmlChildNodeList);
    }
    return emailTemplates;
}

function ForChrome(XMLEntityNodes)
{
    var templates = [];
    for (var i = 0; i < XMLEntityNodes.length; i++)
    {
        var KVPSanytype = XMLEntityNodes[i].getElementsByTagName("KeyValuePairOfstringanyType");
        templates[i] = new Object();
        for (var j = 0; j < KVPSanytype.length; j++)
        {
            if (KVPSanytype[j].getElementsByTagName("key")[0].textContent == "subject")
            {
                templates[i].Subject = KVPSanytype[j].getElementsByTagName("value")[0].textContent;
            }
            if (KVPSanytype[j].getElementsByTagName("key")[0].textContent == "description")
            {
                templates[i].Description = KVPSanytype[j].getElementsByTagName("value")[0].textContent;
            }
        }
    }
    return templates;
}

function ForIEandFireFox(XMLEntityNodes)
{
    var templates = [];
    for (var i = 0; i < XMLEntityNodes.length; i++)
    {
        var KVPSanytype = XMLEntityNodes[i].getElementsByTagName("a:KeyValuePairOfstringanyType");
        templates[i] = new Object();
        for (var j = 0; j < KVPSanytype.length; j++)
        {
            if (KVPSanytype[j].getElementsByTagName("c:key")[0].textContent == "subject")
            {
                templates[i].Subject = KVPSanytype[j].getElementsByTagName("c:value")[0].textContent;
            }
            if (KVPSanytype[j].getElementsByTagName("c:key")[0].textContent == "description")
            {
                templates[i].Description = KVPSanytype[j].getElementsByTagName("c:value")[0].textContent;
            }
        }
    }
    return templates;
}

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) {
    log.appendLine("Inside PostOpperation Function");
    var action = ReportDownloader.Action;
    switch (action) {
        case ActionType.SAVE:
        case ActionType.OPEN:
            window.location.href = _downloadPath;
            $('#loadingDiv').css('display', 'none');
            log.appendLine("Report Downloaded Successfully");
            break;
        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 isEnabled = RetrieveGlobalSettings();
    if (isEnabled == "true")
        createOneClickDoc(serverUrl, DownloadOptions.primaryEntityName, log);
}

function getSUrl() {
    var isOnlineCrm = IsOnlineCrm(parent.Xrm.Page.context);
    var orgName;
    if (Xrm.Page.context.getOrgUniqueName() == undefined)
        orgName = window.parent.Xrm.Page.context.getOrgUniqueName();
    else
        orgName = Xrm.Page.context.getOrgUniqueName();

    var url = window.parent.Xrm.Page.context.getServerUrl();

    if (!isOnlineCrm) {
        if (url.indexOf(orgName) > 0)
            return url;
        else if (window.parent.Xrm.Page.context.getServerUrl() == undefined || window.parent.Xrm.Page.context.getServerUrl() == null || window.parent.Xrm.Page.context.getServerUrl().indexOf(orgName) < 0)
            return window.parent.opener.Xrm.Page.context.getClientUrl();
        else
            return window.parent.Xrm.Page.context.getClientUrl();
    }
    else
        return url;
}

function createOneClickDoc(ServerUrl, name, string1) {
    var requestMain = '';
    requestMain += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">';
    requestMain += ' <s:Body>';
    requestMain += '<Create xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">';
    requestMain += '      <entity xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">';
    requestMain += '        <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">';
    requestMain += '          <a:KeyValuePairOfstringanyType>';
    requestMain += '            <b:key>iotap_name</b:key>';
    requestMain += '            <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">' + name + '</b:value>';
    requestMain += '          </a:KeyValuePairOfstringanyType>';
    requestMain += '          <a:KeyValuePairOfstringanyType>';
    requestMain += '            <b:key>iotap_errorlog</b:key>';
    requestMain += '            <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">' + string1.toString() + '</b:value>';
    requestMain += '          </a:KeyValuePairOfstringanyType>';
    requestMain += '        </a:Attributes>';
    requestMain += '        <a:EntityState i:nil="true" />';
    requestMain += '        <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />';
    requestMain += '        <a:Id>00000000-0000-0000-0000-000000000000</a:Id>';
    requestMain += '        <a:LogicalName>iotap_oneclickpdflog</a:LogicalName>';
    requestMain += '        <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />';
    requestMain += '      </entity>';
    requestMain += '    </Create>';
    requestMain += '  </s:Body>';
    requestMain += '</s:Envelope>';

    var req = new XMLHttpRequest();
    req.open("POST", ServerUrl + "/XRMServices/2011/Organization.svc/web", false)

    // Responses will return XML. It isn't possible to return JSON.
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Create");
    req.send(requestMain);
}

function RetrieveGlobalSettings()
{
    var ODATA_URL = window.parent.Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc";
    var odataSetName = "iotap_1clickdocSet";
    var odataUri = ODATA_URL + "/" + odataSetName;
    var result = false;

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
      "<entity name='iotap_globalsettings'>" +
      "<attribute name='iotap_globalsettingsid' />" +
        "<attribute name='iotap_name' />" +
        "<attribute name='createdon' />" +
        "<attribute name='iotap_guid' />" +
        "<attribute name='iotap_enablelogging' />" +
        "<order attribute='iotap_name' descending='false' />" +
      "</entity>" +
    "</fetch>";

    var ResultXml = GetFetchXmlResult(fetchXml);
    try {
        xmlDoc = $.parseXML(ResultXml);
    }
    catch (E) {
        alert(error_Xml);
        return;
    }
    $xml = $(xmlDoc);

    var isLoggingEnabled;
    var XMLEntityNodes = $xml.find("Results, a\\:Results").find("Entity, a\\:Entity");
    var KVPSanytype = XMLEntityNodes.find("KeyValuePairOfstringanyType, a\\:KeyValuePairOfstringanyType");
    for (var j = 0; j < KVPSanytype.length; j++) {
        if ($(KVPSanytype[j]).find("key, b\\:key")[0].text == "iotap_enablelogging" || $(KVPSanytype[j]).find("key, b\\:key")[0].innerHTML == "iotap_enablelogging" ||
            $(KVPSanytype[j]).find("key, b\\:key")[0].textContent == "iotap_enablelogging") {
            isLoggingEnabled = $(KVPSanytype[j]).find("value, b\\:value")[0].text || $(KVPSanytype[j]).find("value, b\\:value")[0].innerHTML ||
                $(KVPSanytype[j]).find("value, b\\:value")[0].textContent;
        }
    }
    return isLoggingEnabled;
}





