﻿/// <reference path='../../triipcrm_/TR_KU_V2015_2_902/js/jquery.min.js' />

//ViaWorkloadLookupScriptLib.js
//Contains variables and functions used by the ViaWorkloadLookup.html page

//Static Variables
var viawl_crmOdataEndPoint = '/XRMServices/2011/OrganizationData.svc';
var viawl_context = GetGlobalContext();
var viawl_serverUrl = viawl_context.getClientUrl();
var viawl_orgName = viawl_context.getOrgUniqueName();
var viawl_userId = viawl_context.getUserId();
var viawl_userSiteId = '';
var viawl_UserSiteNo = '';
var viawl_duz = '';
var viawl_providername = '';
var viawl_baseServiceEndpointUrl = null;
var viawl_requestingApp = null;
var viawl_consumingAppToken = null;
var viawl_consumingAppPassword = null;
var viawl_NoteTitleIEN = null;
var viawl_LocationIEN = null;
var viawl_isValidNoteTitle = false;
var viawl_isValidLocation = false;

var viawl_freqUsedNoteTitleArray = [{ "text": "--SELECT A NOTE TITLE--", "value": "00" }];
var viawl_freqUsedLocationArray = [{ "text": "--SELECT A LOCATION--", "value": "00" }];

function viawl_onTransportReadNoteTitle(e) {
    try {
        var viawl_NoteTitleText = $.trim(e.data.filter.filters[0].value);
        //Clear existing note data
        var viawl_noNoteTitleData = [];
        //Set data when data is found
        if (viawl_NoteTitleText.length == 0) { e.success(viawl_noNoteTitleData); }
        if (viawl_NoteTitleText.length >= 1) {
            //Apply Note Title form data
            var viawl_sortChar = viawl_NoteTitleText.toUpperCase();
            var viawl_sortDir = "1"; //Asc
            //Execute getNoteTitles Service
            vialib_getNoteTitles(viawl_requestingApp, viawl_consumingAppToken, viawl_consumingAppPassword, viawl_baseServiceEndpointUrl, viawl_providername, viawl_duz, viawl_UserSiteNo, viawl_sortChar, viawl_sortDir, viawl_onTransportReadNoteTitle_response, e);
        }
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onTransportReadNoteTitle): " + err.message);
    }
}

function viawl_onTransportReadNoteTitle_response(viawl_error, viawl_getnotetitlesresponse, viawl_externalObject) {
    try {
        //Create empty Notes Title Array
        viawl_NoteTitleArray = [];
        //Check for non VIA service error
        if (viawl_error != null) {
            viawl_externalObject.success(viawl_NoteTitleArray);
            return false;
        }
        //Test for VIA Service Error
        if (viawl_getnotetitlesresponse.getElementsByTagName("fault").length > 0) {
            viawl_externalObject.success(viawl_NoteTitleArray);
            return false;
        }
        //Get VIA service Response
        if (viawl_getnotetitlesresponse.getElementsByTagName("taggedResults")[0].childNodes.length > 0) {
            var viawl_notetitlesArray = viawl_getnotetitlesresponse.getElementsByTagName("taggedResults")[0].childNodes;
            //Add each value returned to the array
            for (var i = 0; i <= viawl_notetitlesArray.length - 1; i++) {
                //childNodes[0] holds the record identifier or IEN,  childNodes[1] holds the text value
                viawl_NoteTitleArray.push({ id: viawl_notetitlesArray[i].childNodes[0].textContent, name: viawl_notetitlesArray[i].childNodes[1].textContent });
            }
            viawl_externalObject.success(viawl_NoteTitleArray);
            return false;
        }
        else {
            viawl_externalObject.success(viawl_NoteTitleArray);
            return false;
        }
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onTransportReadNoteTitle_response): " + err.message);
    }
}

function viawl_onSelectNoteTitle(e) {
    try {
        viawl_isValidNoteTitle = true;
        var viawl_dataItem = this.dataItem(e.item.index());
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setValue(viawl_dataItem.name);
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setSubmitMode('always');
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setValue(viawl_dataItem.id);
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setSubmitMode('always');
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onSelectNoteTitle): " + err.message);
    }
}

function viawl_onChangeNoteTitle(e) {
    try {
        if ($('#viawl_searchNoteTitle').val() == "") { viawl_isValidNoteTitle = false; }
        // if no valid selection - clear input
        if (!viawl_isValidNoteTitle) {
            e.sender.value("");
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setSubmitMode('always');
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setSubmitMode('always');
        }
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onChangeNoteTitle): " + err.message);
    }
}

function viawl_onTransportReadLocation(e) {
    try {
        var viawl_LocationText = $.trim(e.data.filter.filters[0].value);
        //Clear existing location data
        var viawl_noLocationData = [];
        //Set data when data is found
        if (viawl_LocationText.length == 0) { e.success(viawl_noLocationData); }
        //Apply Note Title form data
        var viawl_locSortChar = viawl_LocationText.toUpperCase();
        var viawl_locSortDir = "1";
        //Execute getLocations Service
        vialib_getLocations(viawl_requestingApp, viawl_consumingAppToken, viawl_consumingAppPassword, viawl_baseServiceEndpointUrl, viawl_providername, viawl_duz, viawl_UserSiteNo, viawl_locSortChar, viawl_locSortDir, viawl_onTransportReadLocation_response, e);
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onTransportReadLocation): " + err.message);
    }
}

function viawl_onTransportReadLocation_response(viawl_error, viawl_getlocationsresponse, viawl_externalObject) {
    try {
        //Create empty Location Array
        viawl_LocationArray = [];
        //Check for non VIA service error
        if (viawl_error != null) {
            viawl_externalObject.success(viawl_LocationArray);
            return false;
        }
        //Test for VIA Service Error
        if (viawl_getlocationsresponse.getElementsByTagName("fault").length > 0) {
            viawl_externalObject.success(viawl_LocationArray);
            return false;
        }
        //Get VIA service Response
        if (viawl_getlocationsresponse.getElementsByTagName("locations")[0].childNodes.length > 0) {
            var viawl_locationsArray = viawl_getlocationsresponse.getElementsByTagName("locations")[0].childNodes;
            //Add each value returned to the array
            for (var i = 0; i <= viawl_locationsArray.length - 1; i++) {
                //childNodes[0] holds the record identifier or IEN,  childNodes[1] holds the text value
                viawl_LocationArray.push({ id: viawl_locationsArray[i].childNodes[0].textContent, name: viawl_locationsArray[i].childNodes[1].textContent });
            }
            viawl_externalObject.success(viawl_LocationArray);
            return false;
        }
        else {
            viawl_externalObject.success(viawl_LocationArray);
            return false;
        }
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onTransportReadLocation_response): " + err.message);
    }
}

function viawl_onSelectLocation(e) {
    try {
        viawl_isValidLocation = true;
        var viawl_dataItem = this.dataItem(e.item.index());
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setValue(viawl_dataItem.name);
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setSubmitMode('always');
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setValue(viawl_dataItem.id);
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setSubmitMode('always');
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onSelectLocation): " + err.message);
    }
}

function viawl_onChangeLocation(e) {
    try {
        if ($('#viawl_searchLocation').val() == "") { viawl_isValidLocation = false; }
        // if no valid selection - clear input
        if (!viawl_isValidLocation) {
            e.sender.value("");
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setSubmitMode('always');
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setSubmitMode('always');
        }
    }
    catch (err) {
        alert("ViaWorkloadLookup Web Resource Function Error(viawl_onChangeLocation): " + err.message);
    }
}

function viawl_decryptServiceConnector(viawl_connectorArray, viawl_connectorValue) {
    var viawl_decryptedString = "";
    if (viawl_connectorArray != null && viawl_connectorArray != "") {
        var viawl_newArray = viawl_connectorArray.toString().split(',');
        viawl_newArray.reverse();
        for (i = 0; i < viawl_newArray.length; i++) {
            var viawl_curChar = "";
            if (i == 0) {
                viawl_curChar = viawl_newArray[i] - viawl_connectorValue;
            }
            else {
                viawl_curChar = viawl_newArray[i] - (i + viawl_connectorValue);
            }
            viawl_decryptedString = viawl_decryptedString + String.fromCharCode(viawl_curChar);
        }
    }
    return viawl_decryptedString;
}

function viawl_formLoad() {
    try {
        //Configure Kendo autocomplete for Search Note Title
        $('#viawl_searchNoteTitle').kendoAutoComplete({
            placeholder: "Select Note Title...",
            dataValueField: "id",
            dataTextField: "name",
            dataSource: new kendo.data.DataSource({
                serverFiltering: true,
                transport: { read: viawl_onTransportReadNoteTitle }
            }),
            select: viawl_onSelectNoteTitle,
            change: viawl_onChangeNoteTitle,
            filtering: function () { viawl_isValidNoteTitle = false; },
            suggest: false,
            height: 120
        });

        //Configure Kendo autocomplete for Search Location
        $('#viawl_searchLocation').kendoAutoComplete({
            placeholder: "Select Location...",
            dataValueField: "id",
            dataTextField: "name",
            dataSource: new kendo.data.DataSource({
                serverFiltering: true,
                transport: { read: viawl_onTransportReadLocation }
            }),
            select: viawl_onSelectLocation,
            change: viawl_onChangeLocation,
            filtering: function () { viawl_isValidLocation = false; },
            suggest: false,
            height: 120
        });

        //Create Frequently Used Note Titles and Locations
        viawl_populateFrequentlyUsed(0);

        //Determine the status of the parent record, if open, build lookups and grids
        if (parent.Xrm.Page.ui.getFormType() > 2) {
            //The form is disabled, disable the lookup and grid controls and exit
            document.getElementById('viawl_searchNoteTitle').disabled = true;
            document.getElementById('viawl_searchLocation').disabled = true;
            document.getElementById('selFreqUsedNoteTitle').disabled = true;
            document.getElementById('selFreqUsedLocation').disabled = true;
            return false;
        }

        //Check if VIA Login cookie exist (not expired)
        var viawl_ViaLoginCookie = viawl_getCookie("viasessionlink");

        if (viawl_ViaLoginCookie != null && viawl_ViaLoginCookie != '') {
            var viawl_cookiearray = viawl_ViaLoginCookie.split("~~~~", 2);
            viawl_duz = viawl_cookiearray[0];
            viawl_providername = viawl_cookiearray[1];
        }

        //Check Cookie return values if missing exit
        if (viawl_duz == '' || viawl_providername == '') { return false; }

        //GET CRM SETTINGS WEB SERVICE URLS
        var viawl_conditionalFilter = "(mcs_name eq 'Active Settings')";
        viawl_getMultipleEntityDataAsync('mcs_settingSet', 'ftp_VIAServiceBaseURL, ftp_VIARequestingApplicationCode, ftp_VIAConsumingApplicationToken, ftp_VIAConsumingApplicationPassword', viawl_conditionalFilter, 'mcs_name', 'asc', 0, viawl_SettingsWebServiceURL_response, '');

        //Get the current CRM User's assigned site/facility
        var viawl_userData = viawl_getSingleEntityDataSync('SystemUserSet', 'ftp_FacilitySiteId', viawl_userId);

        if (viawl_userData != null) {
            if (viawl_userData.d.ftp_FacilitySiteId != null) {
                viawl_userSiteId = viawl_userData.d.ftp_FacilitySiteId.Id;
            }
        }

        //Lookup the Facility/Site #
        if (viawl_userSiteId != null && viawl_userSiteId != '') {
            var viawl_facilityData = viawl_getSingleEntityDataSync('ftp_facilitySet', 'ftp_facilitycode', viawl_userSiteId);
            if (viawl_facilityData != null) {
                if (viawl_facilityData.d.ftp_facilitycode != null) { viawl_UserSiteNo = viawl_facilityData.d.ftp_facilitycode; }
            }
        }


    }
    catch (err) {
        alert('Via Workload Lookup Web Resource Function Error(viawl_formLoad): ' + err.message);
    }
}

function viawl_SettingsWebServiceURL_response(viawl_settingData, viawl_lastSkip, viawl_Blank_NA) {
    try {
        //viawl_lastSkip is the starting point in the result (use if more than 50 records) //Not used in this scenario
        for (var i = 0; i <= viawl_settingData.d.results.length - 1; i++) {
            //Get info
            if (viawl_settingData.d.results[i].ftp_VIAServiceBaseURL != null) { viawl_baseServiceEndpointUrl = viawl_settingData.d.results[i].ftp_VIAServiceBaseURL; }
            if (viawl_settingData.d.results[i].ftp_VIARequestingApplicationCode != null) { viawl_requestingApp = viawl_settingData.d.results[i].ftp_VIARequestingApplicationCode; }
            if (viawl_settingData.d.results[i].ftp_VIAConsumingApplicationToken != null) { viawl_consumingAppToken = viawl_settingData.d.results[i].ftp_VIAConsumingApplicationToken; }
            if (viawl_settingData.d.results[i].ftp_VIAConsumingApplicationPassword != null) { viawl_consumingAppPassword = viawl_settingData.d.results[i].ftp_VIAConsumingApplicationPassword; }
            break;
        }
        if (viawl_baseServiceEndpointUrl == null || viawl_requestingApp == null || viawl_consumingAppToken == null || viawl_consumingAppPassword == null) {
            parent.Xrm.Page.ui.setFormNotification("ERROR: THE 'VIA Service Connector' CONFIGURATION IS MISSING DATA IN THE 'Settings Entity', PLEASE CONTACT TECHNICAL SUPPORT!", "ERROR", "VISTASERVICE");
        }
        //Decrypt VIA Service Connector Items
        viawl_requestingApp = viawl_decryptServiceConnector(viawl_requestingApp, 4);
        viawl_consumingAppToken = viawl_decryptServiceConnector(viawl_consumingAppToken, 6);
        viawl_consumingAppPassword = viawl_decryptServiceConnector(viawl_consumingAppPassword, 8);

    }
    catch (err) {
        alert('Via Workload Lookup Web Resource Function Error(viawl_formLoad): ' + err.message);
    }
}

function viawl_getCookie(cname) {
    try {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1);
            }
            if (c.indexOf(name) == 0) {
                return c.substring(name.length, c.length);
            }
        }
        return "";
    }
    catch (err) {
        alert('ViaWorkloadLookup Control Web Resource Function Error(viawl_getCookie): ' + err.message);
    }
}

function viawl_populateFrequentlyUsed(viawl_retryCount) {
    try {
        //Get Parent Document Facility Group Default Id
        var viawl_facilityGroupDefaultId = null;

        //Verify that parent value is loaded, if not wait and retry
        if (parent.vcmn_facilityGroupDefaultId == null && viawl_retryCount < 6) {
            setTimeout(function () {
                viawl_populateFrequentlyUsed(viawl_retryCount + 1);
            }, 1000);
            return false;
        }

        viawl_facilityGroupDefaultId = parent.vcmn_facilityGroupDefaultId;

        if (viawl_facilityGroupDefaultId != null && viawl_facilityGroupDefaultId != "") {
            //Get data and add to note title and location array for frequently used items
            var viawl_frequentlyUsedNoteTitles = null;
            var viawl_frequentlyUsedLocations = null;
            var viawl_facilityGroupDefaultData = viawl_getSingleEntityDataSync('ftp_facilitygroupdefaultSet', 'ftp_frequentlyusednotetitles, ftp_frequentlyusedlocations', viawl_facilityGroupDefaultId);
            if (viawl_facilityGroupDefaultData != null) {
                if (viawl_facilityGroupDefaultData.d.ftp_frequentlyusednotetitles != null) {
                    viawl_frequentlyUsedNoteTitles = viawl_facilityGroupDefaultData.d.ftp_frequentlyusednotetitles;
                }
                if (viawl_facilityGroupDefaultData.d.ftp_frequentlyusedlocations != null) {
                    viawl_frequentlyUsedLocations = viawl_facilityGroupDefaultData.d.ftp_frequentlyusedlocations;
                }
            }

            //Loop through values if they exist
            if (viawl_frequentlyUsedNoteTitles != null & viawl_frequentlyUsedNoteTitles != "") {
                var viawl_freqUsedMainNoteTitleArray = viawl_frequentlyUsedNoteTitles.split("^^");
                if (viawl_freqUsedMainNoteTitleArray.length > 0) {
                    //Parse data and add to option array
                    for (i = 0; i < viawl_freqUsedMainNoteTitleArray.length; i++) {
                        var viawl_freqUsedMainNoteTitleItemArray = viawl_freqUsedMainNoteTitleArray[i].split("~~");
                        if (viawl_freqUsedMainNoteTitleItemArray.length == 2) {
                            //Add to Frequently Used Note Title array
                            if (viawl_freqUsedMainNoteTitleItemArray[0] != null && viawl_freqUsedMainNoteTitleItemArray[0] != '' && viawl_freqUsedMainNoteTitleItemArray[1] != null && viawl_freqUsedMainNoteTitleItemArray[1] != '') {
                                viawl_freqUsedNoteTitleArray.push({ "text": viawl_freqUsedMainNoteTitleItemArray[1], "value": viawl_freqUsedMainNoteTitleItemArray[0] });
                            }
                        }
                    }
                }
            }

            if (viawl_frequentlyUsedLocations != null & viawl_frequentlyUsedLocations != "") {
                var viawl_freqUsedMainLocationArray = viawl_frequentlyUsedLocations.split("^^");
                if (viawl_freqUsedMainLocationArray.length > 0) {
                    //Parse data and add to option array
                    for (i = 0; i < viawl_freqUsedMainLocationArray.length; i++) {
                        var viawl_freqUsedMainLocationItemArray = viawl_freqUsedMainLocationArray[i].split("~~");
                        if (viawl_freqUsedMainLocationItemArray.length == 2) {
                            //Add to Frequently Used Location array
                            if (viawl_freqUsedMainLocationItemArray[0] != null && viawl_freqUsedMainLocationItemArray[0] != '' && viawl_freqUsedMainLocationItemArray[1] != null && viawl_freqUsedMainLocationItemArray[1] != '') {
                                viawl_freqUsedLocationArray.push({ "text": viawl_freqUsedMainLocationItemArray[1], "value": viawl_freqUsedMainLocationItemArray[0] });
                            }
                        }
                    }
                }
            }
        }
        
        //Define Frequently Used Note Title Options from Array
        for (i = 0; i < viawl_freqUsedNoteTitleArray.length; i++) {
            //Add to optionset
            var viawl_newOption = document.createElement("option");
            viawl_newOption.text = viawl_freqUsedNoteTitleArray[i].text;
            viawl_newOption.value = viawl_freqUsedNoteTitleArray[i].value;
            document.getElementById("selFreqUsedNoteTitle").add(viawl_newOption);
        }

        //Define Frequently Used Location Options from Array
        for (i = 0; i < viawl_freqUsedLocationArray.length; i++) {
            //Add to optionset
            var viawl_newOption = document.createElement("option");
            viawl_newOption.text = viawl_freqUsedLocationArray[i].text;
            viawl_newOption.value = viawl_freqUsedLocationArray[i].value;
            document.getElementById("selFreqUsedLocation").add(viawl_newOption);
        }
    }
    catch (err) {
        alert('ViaWorkloadLookup Control Web Resource Function Error(viawl_populateFrequentlyUsed): ' + err.message);
    }
}

function viawl_selectFreqUsedNoteTitle() {
    try{
        //Get the selected Frequently Used Note Title options
        var viawl_freqNoteTitleOptions = document.getElementById("selFreqUsedNoteTitle");
        var viawl_freqNoteTitleText = viawl_freqNoteTitleOptions.options[viawl_freqNoteTitleOptions.selectedIndex].text;
        var viawl_freqNoteTitleValue = viawl_freqNoteTitleOptions.options[viawl_freqNoteTitleOptions.selectedIndex].value;
        //Update workload note title text
        if (viawl_freqNoteTitleValue != "00") {
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setValue(viawl_freqNoteTitleText);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setValue(viawl_freqNoteTitleValue);
        }
        else {
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setValue(null);
        }
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitletext").setSubmitMode('always');
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadnotetitleid").setSubmitMode('always');
    }
    catch (err) {
        alert('ViaWorkloadLookup Control Web Resource Function Error(viawl_selectFreqUsedNoteTitle): ' + err.message);
    }
}

function viawl_selectFreqUsedLocation() {
    try {
        //Get the selected Frequently Used Location options
        var viawl_freqLocationOptions = document.getElementById("selFreqUsedLocation");
        var viawl_freqLocationText = viawl_freqLocationOptions.options[viawl_freqLocationOptions.selectedIndex].text;
        var viawl_freqLocationValue = viawl_freqLocationOptions.options[viawl_freqLocationOptions.selectedIndex].value;
        //Update workload location text and IEN
        if (viawl_freqLocationValue != "00") {
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setValue(viawl_freqLocationText);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setValue(viawl_freqLocationValue);
        }
        else {
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setValue(null);
            parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setValue(null);
        }
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationtext").setSubmitMode('always');
        parent.Xrm.Page.getAttribute("ftp_selectedworkloadlocationid").setSubmitMode('always');
    }
    catch (err) {
        alert('ViaWorkloadLookup Control Web Resource Function Error(viawl_selectFreqUsedLocation): ' + err.message);
    }
}


function viawl_executeCrmOdataGetRequest(viawl_jsonQuery, viawl_aSync, viawl_aSyncCallback, viawl_skipCount, viawl_optionArray) {
    //This function executes a CRM Odata web service call to retrieve Crm data
    //*viawl_jsonQuery* - a properly formatted CRM Odata Query string (required)
    //*viawl_aSync* - specify 'true' to execute asynchronously otherwise 'false' (required)
    //*viawl_aSyncCallback* - specify the name of the return function to call upon completion (required if viawl_aSync = true.  Otherwise '')
    //*viawl_skipCount* - Initial setting is always '0', increments by 50 per CRM SDK Odata standards (required)
    //*viawl_optionArray* - is an optional array or single value, that contains additional task specific variables that can be passed between functions (pass 'null' if not used)
    try {
        var viawl_entityData = null;
        $.ajax({
            type: 'GET',
            contentType: 'application/json; charset=utf-8',
            datatype: 'json',
            url: viawl_jsonQuery,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader('Accept', 'application/json');
            },
            success: function (data, textStatus, XmlHttpRequest) {
                viawl_entityData = data;
                if (viawl_aSync == true) {
                    viawl_aSyncCallback(viawl_entityData, viawl_skipCount, viawl_optionArray);
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert('Fail: Ajax Error in viawl_executeCrmOdataGetRequest: ' + errorThrown + " Request: " + viawl_jsonQuery);
            },
            async: viawl_aSync,
            cache: false
        });
        return viawl_entityData;
    }
    catch (err) {
        alert('An error occured in the viawl_executeCrmOdataGetRequest function.  Error Detail Message: ' + err);
    }
}

function viawl_getMultipleEntityDataAsync(viawl_entitySetName, viawl_attributeSet, viawl_conditionalFilter, viawl_sortAttribute, viawl_sortDirection, viawl_skipCount, viawl_aSyncCallback, viawl_optionArray) {
    //This function returns a CRM JSON dataset for all entity records matching criteria provided Asyncronously
    //*viawl_entitySetName* - is the name of the entity set e.g 'ContactSet'
    //*viawl_attributeSet* -  is a string containing the Crm Attributes to retrieve e.g. 'FirstName, LastName, Telephone1, EMailAddress1'
    //*viawl_conditionalFilter* - is the conditional filter value placed on the data values retrived e.g. 'StateCode/Value eq 0'  to retrieve active contact records only
    //*viawl_sortAttribute* - is a string containing the name of the attribute to sort the result set by e.g. 'LastName'
    //*viawl_sortDirection* - is a string specifying the sort as Ascending or Descending e.g. 'asc' or 'desc'
    //*viawl_skipCount* - is the starting point in the result (use if more than 50), (Put 0 if not used)
    //*viawl_aSyncCallback* - is the name of the function to call when returning the result
    //*viawl_optionArray* - is an optional array, that contains additional task specific variables that can be passed between functions

    try {
        var viawl_jsonQuery = viawl_serverUrl + viawl_crmOdataEndPoint + '/' + viawl_entitySetName + '?$select=' + viawl_attributeSet + '&$filter=' + viawl_conditionalFilter + '&$orderby=' + viawl_sortAttribute + ' ' + viawl_sortDirection + '&$skip=' + viawl_skipCount;
        viawl_executeCrmOdataGetRequest(viawl_jsonQuery, true, viawl_aSyncCallback, viawl_skipCount, viawl_optionArray);
    }
    catch (err) {
        alert('An error occured in the viawl_getMultipleEntityDataAsync function.  Error Detail Message: ' + err);
    }
}

function viawl_getSingleEntityDataSync(viawl_entitySetName, viawl_attributeSet, viawl_entityId) {
    //This function returns a CRM JSON dataset for a single entity record based on the entity id provided Syncronously
    //*viawl_entitySetName* - is the name of the entity set e.g 'ContactSet'
    //*viawl_attributeSet* -  is a string containing the Crm Attributes to retrieve e.g. 'FirstName, LastName, Telephone1, EMailAddress1'
    //*viawl_entityId* - is the Guid for the entity record

    try {
        var viawl_entityIdNoBracket = viawl_entityId.replace(/({|})/g, '');
        var viawl_selectString = '(guid' + "'" + viawl_entityIdNoBracket + "'" + ')?$select=' + viawl_attributeSet;
        var viawl_jsonQuery = viawl_serverUrl + viawl_crmOdataEndPoint + '/' + viawl_entitySetName + viawl_selectString;
        var viawl_entityData = viawl_executeCrmOdataGetRequest(viawl_jsonQuery, false, '', 0, null);
        return viawl_entityData;
    }
    catch (err) {
        alert('An error occured in the viawl_getSingleEntityDataSync function.  Error Detail Message: ' + err);
    }
}

function viawl_getMultipleEntityDataSync(viawl_entitySetName, viawl_attributeSet, viawl_conditionalFilter, viawl_sortAttribute, viawl_sortDirection, viawl_skipCount) {
    //This function returns a CRM JSON dataset for all entity records matching criteria provided Syncronously
    //*viawl_entitySetName* - is the name of the entity set e.g 'ContactSet'
    //*viawl_attributeSet* -  is a string containing the Crm Attributes to retrieve e.g. 'FirstName, LastName, Telephone1, EMailAddress1'
    //*viawl_conditionalFilter* - is the conditional filter value placed on the data values retrived e.g. 'StateCode/Value eq 0'  to retrieve active contact records only
    //*viawl_sortAttribute* - is a string containing the name of the attribute to sort the result set by e.g. 'LastName'
    //*viawl_sortDirection* - is a string specifying the sort as Ascending or Descending e.g. 'asc' or 'desc'
    //*viawl_skipCount* - is the starting point in the result (use if more than 50), (Put 0 if not used)

    try {
        var viawl_jsonQuery = viawl_serverUrl + viawl_crmOdataEndPoint + '/' + viawl_entitySetName + '?$select=' + viawl_attributeSet + '&$filter=' + viawl_conditionalFilter + '&$orderby=' + viawl_sortAttribute + ' ' + viawl_sortDirection + '&$skip=' + viawl_skipCount;
        var viawl_entityData = viawl_executeCrmOdataGetRequest(viawl_jsonQuery, false, '', viawl_skipCount, null);
        return viawl_entityData;
    }
    catch (err) {
        alert('An error occured in the viawl_getMultipleEntityDataSync function.  Error Detail Message: ' + err);
    }
}
