﻿var DdlHelper = {
    Clear: function (_id) {
        var dropdown = document.getElementById( _id );
        if ( dropdown != null ) {
            dropdown.options.length = 0;
            var opt = document.createElement( 'option' );
            dropdown.appendChild( opt );
        }
    },
    SelectDefault: function (_id, valueToSelect) {
        var element = document.getElementById(_id);
        element.value = valueToSelect;
    },
    Sort: function (_id) {
        var tmpAry = new Array();
        for (var i = 0; i < _id.options.length; i++) {
            tmpAry[i] = new Array();
            tmpAry[i][0] = _id.options[i].text;
            tmpAry[i][1] = _id.options[i].value;
        }
        tmpAry.sort();
        while (_id.options.length > 0) {
            _id.options[0] = null;
        }
        for (var i = 0; i < tmpAry.length; i++) {
            var op = new Option(tmpAry[i][0], tmpAry[i][1]);
            _id.options[i] = op;
        }
        return;
    }
};

var FormType = {
    UNDEFINED: 0, CREATE: 1, UPDATE: 2, READ_ONLY: 3,
    DISABLED: 4, QUICK_CREATE: 5, BULK_EDIT: 6, READ_OPTIMIZED: 11
}

var ActionType = {
    SAVE: "123030000",
    OPEN: "123030001",
    ATTACH_EMAIL: "123030002",
    SAVE_NOTES: "123030003",
    EMBED_EMAIL: "123030004"
};

var FileFormat = {
    123030000: 'PDF',
    123030001: 'EXCEL',
    123030002: 'WORD'
};

var Constant = {
    TrialFailError: "Trial period has expired. Please contact sales@iotap.com for product license.",
    NotesAttached: "Report has been attached to Notes.",
    DynamicButtonError: "Please add proper ActionId in Dynamic button. Contact sales@iotap.com for help.",
    RequiredDdlReportError: "Report must be selected.",
    RequiredDdlFileFormatError: "File Format must be selected.",
    RequiredDdlActionError: "Action must be selected.",
    FieldMandatoryError: "You must provide a value for ",
    OrgService: "/api/data/v8.0/",
    WebRes: {
        DownloadOption: "iotap_DownloadOptions.htm",
        ReportSelector: "WebResource_ReportSelector"
    }
};

var ConfigEntity = {
    LogicalName: "iotap_1clickdocs"

};

function _getUrl(objContext) {
    return objContext.getClientUrl();    
};

function Log(_msg) {
    try {
        //alert(_msg);
        if (typeof console != "undefined")
            console.log(_msg);
        //console.error(_msg);
        //throw new Error(_msg);
    } catch (e) {
    }
};

function IsCRM2013() {
    var isCRM2013 = false; if (parent.Xrm.Page.context.client != undefined) { isCRM2013 = true; }
    return isCRM2013;
}

function IsOnlineCrm(objContext) {
    var url = _getUrl(parent.Xrm.Page.context);
    var urlArray = url.split('.');
    var length = urlArray.length;

    if (urlArray[length - 1] == 'com' && urlArray[length - 2] == 'dynamics')
        return true;
    else
        return false;
}


function ExecuteOdata(_orgUrl, _serviceUrl, _oDataQuerry) {
    var req = new XMLHttpRequest();
    var _url = _orgUrl + _serviceUrl + _oDataQuerry;
    
    Log(_url);
    req.open("GET", _url, false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
    req.setRequestHeader( "Content-Type", "application/json; charset=utf-8" );
    req.setRequestHeader( "OData-MaxVersion", "4.0" );
    req.setRequestHeader( "OData-Version", "4.0" );
    req.send(null);

    if (req.status == 200) {
        data = JSON.parse( req.responseText ).value;
        if(data != null)          
                return data;
            else
                return null;                      
    }

    if (req.status == 500) {
        alert(Constant.TrialFailError);
        return;
    }
    else
        throw new Error("Fails to execute " + _url);
}

function getDataParam(number) {
    var vals = new Array();
    if (location.search != "") {
        vals = location.search.substr(1).split("&");
        for (var i in vals) {
            vals[i] = vals[i].replace(/\+/g, " ").split("=");
        }
        for (var i in vals) {
            if (vals[i][0].toLowerCase() == "data") {
                var datavalue = vals[i][1];
                if (datavalue != "") {
                    var vals = new Array();
                    vals = decodeURIComponent(datavalue).split("&");
                    return vals[0].replace(/\+/g, " ").split("|")[number];
                }
            }
        }
    }
    else
        throw new Error("No data parameter was passed to this page");
}

function CreateEntity_odata( _orgUrl, entityObject, entityName )
{
    var ID = "";
    var ODataPath = _orgUrl + Constant.OrgService;
    
    $.ajax( {
        type: "POST",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: ODataPath + entityName,
        data: JSON.stringify( entityObject ),
        async:false,
        beforeSend: function ( XMLHttpRequest )
        {
            XMLHttpRequest.setRequestHeader( "Accept", "application/json" );
            XMLHttpRequest.setRequestHeader( "OData-MaxVersion", "4.0" );
            XMLHttpRequest.setRequestHeader( "OData-Version", "4.0" );
        },
        success: function ( data, textStatus, XmlHttpRequest )
        {
            var uri = XmlHttpRequest.getResponseHeader( "OData-EntityId" );
            ID = uri.substr( uri.length - 38 ).substring( 1, 37 );
        },
        error: function ( XmlHttpRequest, textStatus, errorThrown )
        {
            alert( "Error " + textStatus + errorThrown );

        }
    } );
    
    return ID;
}

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

function StringToXml(_text) {
    try {
        var xmlDoc = null;
        if (window.DOMParser) {
            var parser = new DOMParser();
            xmlDoc = parser.parseFromString(_text, "text/xml");
        }
        else // code for IE
        {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(_text);
        }
        return xmlDoc;
    } catch (e) {
        Log("Unable to parse the XML.");
    }
}

function IsRequiredPluginPresent() {
    return true; //todo: remove this line while

    var path = "sdkmessageprocessingsteps?$filter=startswith(Name,%27LicensePlugin.LicensePlugin:%27)";
    var result = ExecuteOdata(_getUrl(parent.Xrm.Page.context), Constant.OrgService, path);

    if (result == null) { return false; }

    var length = result.length;

    if (length < 2) { return false; }

    for (var i = 0; i < length; i++) {
        if (!(result[i].StateCode.Value == 0 && result[0].StatusCode.Value == 1))
        { return false; }
    }
    return true;
}

function decodeBase64String( input )
{
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace( /[^A-Za-z0-9\+\/\=]/g, "" );

    while ( i < input.length ) {

        enc1 = _keyStr.indexOf( input.charAt( i++ ) );
        enc2 = _keyStr.indexOf( input.charAt( i++ ) );
        enc3 = _keyStr.indexOf( input.charAt( i++ ) );
        enc4 = _keyStr.indexOf( input.charAt( i++ ) );

        chr1 = ( enc1 << 2 ) | ( enc2 >> 4 );
        chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 );
        chr3 = ( ( enc3 & 3 ) << 6 ) | enc4;

        output = output + String.fromCharCode( chr1 );

        if ( enc3 != 64 ) {
            output = output + String.fromCharCode( chr2 );
        }
        if ( enc4 != 64 ) {
            output = output + String.fromCharCode( chr3 );
        }

    }

    output = _utf8_decode( output );

    return output;
}

function _utf8_decode (utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while (i < utftext.length) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if ((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i + 1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i + 1);
            c3 = utftext.charCodeAt(i + 2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }

    return string;
}

function encodeBase64String( input )
{
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    input = _utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);

    }

    return output;
}

function _utf8_encode(string) {
    string = string.replace(/\r\n/g, "\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if ((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
}

function refineString(varBody)
{
    if ( varBody.indexOf( 'MIME' ) >= 0 && varBody.indexOf( 'base64' ) >= 0 )
    {
        var desc = varBody;
        //var set1 = "", set2 = "", set3 = "";
        var sets = [];
        var finalString = "";
        var count = ( varBody.match( /base64/g ) || [] ).length
        for ( var i = 0; i <= count; ++i )
        {
            if ( desc.indexOf( "base64" ) >= 0 ) {
                desc = desc.substring( desc.indexOf( 'base64' ) + 6, desc.length )   //6 is the length of word 'base64'       
            }
            if ( desc.indexOf( "=" ) >= 0 ) {
                sets[i] = desc.substring( 0, desc.indexOf( '=' ) )
                desc = desc.substring( desc.indexOf( '=' ), desc.length )
            }
        }
        
        for ( var i = 0; i <= count; ++i )
        {
            finalString = finalString+sets[i]
        }
        return finalString;

        //  //1st Set
        //if ( desc.indexOf( "base64" ) >= 0 ) {
        //    desc = desc.substring( desc.indexOf( 'base64' ) + 6, desc.length )   //6 is the length of word 'base64'       
        //}
        //if ( desc.indexOf( "=" ) >= 0 ) {
        //    set1 = desc.substring( 0, desc.indexOf( '=' ) )
        //    desc = desc.substring( desc.indexOf( '=' ), desc.length )
        //}

        ////2nd Set
        //if ( desc.indexOf( "base64" ) >= 0 ) {
        //    desc = desc.substring( desc.indexOf( 'base64' ) + 6, desc.length )
        //}
        //if ( desc.indexOf( "=" ) >= 0 ) {
        //    set2 = desc.substring( 0, desc.indexOf( '=' ) )
        //    desc = desc.substring( desc.indexOf( '=' ), desc.length )
        //}

        ////3rd Set
        //if ( desc.indexOf( "base64" ) >= 0 ) {
        //    desc = desc.substring( desc.indexOf( 'base64' ) + 6, desc.length )
        //}
        //if ( desc.indexOf( "=" ) >= 0 ) {
        //    set3 = desc.substring( 0, desc.indexOf( '=' ) )
        //    desc = desc.substring( desc.indexOf( '=' ), desc.length )
        //}
        //return set1 + set2 + set3;
    }
    else
    {
        return varBody;
    }
    
}

function getFilename(reportName, entityName, entityRecordGuid )
{
    //get Entity Guid from entity Name
    var entityGuid = getEntityGuid( entityName );

    //Getting Attribute type 
    var attributeType = getAttributeType( entityGuid, reportName );
    if ( attributeType == undefined )
        return "";

    var httpReq = new XMLHttpRequest();
    if ( attributeType.toLowerCase() == "string" ) {
        httpReq.open( "GET", getSUrl() + "/api/data/v8.0/" + entityName + "s?$select=" + reportName + "&$filter=" + entityName + "id eq " + entityRecordGuid + " ", false );
        //httpReq.open( "GET", getSUrl() + "/api/data/v8.0/" + entityName + "s("+entityRecordGuid+")?$select=" + reportName + "", 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 ) {
            result = JSON.parse( httpReq.responseText ).value;

            if ( result != null ) {
                //alert( result[0][reportName] )
                return result[0][reportName];
            }
        }
        else {
            return "";
        }
    }
    else if ( attributeType.toLowerCase() == "lookup" ) {

        httpReq.open( "GET", getSUrl() + "/api/data/v8.0/" + entityName + "s?$select=_" + reportName + "_value&$filter=" + entityName + "id eq " + entityRecordGuid + " ", false );
        //httpReq.open( "GET", getSUrl() + "/api/data/v8.0/" + entityName + "s("+entityRecordGuid+")?$select=" + reportName + "", 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.setRequestHeader( "Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"" );
        httpReq.send( null );

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

            if ( result != null ) {
                //alert( result[0][reportName] )
                return result[0]["_" + reportName + "_value@OData.Community.Display.V1.FormattedValue"];
            }
        }
        else {
            return "";
        }
    }
    else
        return "";
    
    
}

function getAttributeType( entityGuid, reportName )
{
    
    var httpReq = new XMLHttpRequest();

    httpReq.open( "GET", getSUrl() + "/api/data/v8.0/EntityDefinitions("+entityGuid+")?$expand=Attributes($select=AttributeType;$filter=LogicalName eq '"+reportName+"')", 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.setRequestHeader( "Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"" )
    httpReq.send( null );

    if ( httpReq.status === 200 ) {
        result = JSON.parse( httpReq.responseText ).Attributes[0];

        if ( result != null ) {
            return result.AttributeType;
        }
    }
    else {
        return "";
    }
}

function getEntityGuid( entityName )
{

    var httpReq = new XMLHttpRequest();

    httpReq.open( "GET", getSUrl() + "/api/data/v8.0/EntityDefinitions?$select=LogicalName,DisplayName,MetadataId,ObjectTypeCode&$filter=LogicalName eq '" + entityName + "'", 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 ) {
        result = JSON.parse( httpReq.responseText ).value;

        if ( result != null ) {
            return result[0].MetadataId;
        }
    }
    else {
        return "";
    }
}