if (typeof North52 == 'undefined') { North52 = {}; }
if (typeof North52.FormulaTest == 'undefined') { North52.FormulaTest = {}; }

North52.FormulaTest.FormulaName = "";
North52.FormulaTest.FormulaParameterXml = ""; 
North52.FormulaTest.EntityName = "";

North52.FormulaTest.Ok = function () {

    
    $('#btnOk').attr("disabled", true);
    var targetId = parent.Xrm.Page.data.entity.getEntityName() == 'north52_test' ? parent.Xrm.Page.data.entity.getId() : '';

    North52.FormulaTest.BuildParametersXml();

    var testType = parent.Xrm.Page.data.entity.getEntityName() == 'north52_formula' ? 99 : 999;
    var options = "$select=north52_Result&$filter=north52_name eq " + "'" + North52.FormulaTest.FormulaShortCode + "' and north52_Parameters eq '" + North52.FormulaTest.FormulaParameterXml + "' and north52_TargetEntityID eq '" + targetId + "' and north52_FormulaType eq '" +  testType  + "'";

    SDK.REST.retrieveMultipleRecords("north52_formulacalculation",
                                                               options,
                                                               North52.FormulaTest.retrieveMultipleRecordsSuccess,
                                                               function (error) { North52.FormulaTest.DisplayMessage(error.message, "Red"); $('#btnOk').attr("disabled", false); },
                                                               North52.FormulaTest.retrieveMultipleRecordsError)
};

North52.FormulaTest.retrieveMultipleRecordsSuccess = function (retrievedResult) {

    try {
        var displayResult = '';

        if (retrievedResult == null)
            displayResult = "An internal failure has occurred. Please enable server side tracing & check the N52 Trace Log entity.";
        else {
            var formulaResult = retrievedResult[0];
            var displayResult = formulaResult.north52_Result == null ? formulaResult.north52_result : formulaResult.north52_Result;

            
        }
        North52.FormulaTest.DisplayMessage("Formula Result: " + displayResult, "Green");
        $('#btnOk').attr("disabled", false);
       

    }

    catch (ex) {
        alert('North52 Formula Manager Error: ' + ex.message);
    }
};

North52.FormulaTest.retrieveMultipleRecordsError = function (XmlHttpRequest, textStatus, errorThrown) {

};

North52.FormulaTest.BuildParametersXml = function () {
    
    North52.FormulaTest.FormulaParameterXml = "";
    var allInputs = $("#divwrapper :input[type=text]");
    
    for (var i = 0; i < allInputs.length; i++) {
        North52.FormulaTest.FormulaParameterXml += North52.FormulaTest.GetXmlElement(allInputs[i].name, allInputs[i].value);
    }
   
    North52.FormulaTest.FormulaParameterXml = "<" + North52.FormulaTest.EntityName + ">" + North52.FormulaTest.FormulaParameterXml + "</" + North52.FormulaTest.EntityName + ">";
    North52.FormulaTest.FormulaParameterXml = North52.FormulaTest.HtmlDecode(North52.FormulaTest.FormulaParameterXml);

};

North52.FormulaTest.GetXmlElement = function (elementName, elementValue) {

    return "<" + elementName + ">" + elementValue + "</" + elementName + ">";

};

North52.FormulaTest.OnLoad = function () {
    
    $('#btnOk').attr("disabled", true);
    var recordid = N52.DialogHelpers.GetParameterByName('id');
 
    if (recordid == '')
    {
          recordid  = parent.Xrm.Page.data.entity.getId();
    }

  
    $( "#north52_parameterList" ).empty();
    $( "#message" ).empty();

    SDK.REST.retrieveRecord(recordid,
                                                    parent.Xrm.Page.data.entity.getEntityName() ,
                                                    null,
                                                    null,
                                                    North52.FormulaTest.RetrieveRecordSuccess,
                                                    function (error) { alert("North52 Formula Manager: " + error.message); },
                                                    North52.FormulaTest.RetrieveRecordError
                                                  )

};

North52.FormulaTest.RetrieveRecordSuccess = function (retrievedFormula) {

    var txtarea = retrievedFormula.north52_FormulaDescription;
    txtarea = txtarea.replace(/\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm, '$1');
    txtarea = txtarea.replace(/\«(.*?)\»/, '');
    txtarea = txtarea.replace(/\«(.*?)\»/, '');
    txtarea = txtarea.replace(/\«(.*?)\»/, '');
    txtarea = txtarea.replace(/\«(.*?)\»/, '');
    txtarea = txtarea.replace(/\«(.*?)\»/, '');


    var parameters = North52.FormulaTest.GetParameters(txtarea);
    North52.FormulaTest.BuildParameters(parameters);

    North52.FormulaTest.FormulaShortCode = retrievedFormula.north52_ShortCode;
    North52.FormulaTest.EntityName = retrievedFormula.north52_SourceEntityName;
    
    $('#btnOk').attr("disabled", false);
};

North52.FormulaTest.RetrieveRecordError = function (XmlHttpRequest, textStatus, errorThrown) {
    alert('North52 Formula Manager: ' + XmlHttpRequest.message)

};


North52.FormulaTest.GetParameters = function (str) {

    var myArray = str.match(/\[(.*?)\]/g);

    return North52.FormulaTest.UniqueArray(myArray);

};

North52.FormulaTest.UniqueArray = function (arr) {

    var hash = {}, result = [];

    if (arr == null)
        return arr;
    else {
        for (var i = 0, l = arr.length; i < l; ++i) {
            if (!hash.hasOwnProperty(arr[i])) {
                hash[arr[i]] = true;
                result.push(arr[i]);
            }
        }
        return result;
    }


};

North52.FormulaTest.BuildParameters = function (parameters) {

    if (parameters == null) {
        
        var table = document.getElementById("north52_parameterList");
        var header = document.createElement("thead");
        var headerRow = document.createElement("tr");
        header.appendChild(headerRow);

        var tableBody = document.createElement("tbody");
        tableBody.id = "north52tbody";
        table.appendChild(header);

        table.appendChild(tableBody);

        var parameter = "                                                                               ";
        var row = document.createElement("tr");
        row.id = "row1";

        var cell = document.createElement("td");
        var displayElement = document.createElement("span");
        displayElement.innerText = parameter;
        cell.appendChild(displayElement);
        row.appendChild(cell);

        var cell2 = document.createElement("td");
        var displayElement2 = document.createElement("span");
        displayElement2.innerText = parameter;
        cell2.appendChild(displayElement2);
        row.appendChild(cell2);

        tableBody.appendChild(row);

        table.appendChild(tableBody);

    }
    else {


        var table = document.getElementById("north52_parameterList");
        var header = document.createElement("thead");
        var headerRow = document.createElement("tr"); 
        
       
        headerRow.height = "10px";
        header.appendChild(headerRow);

        var tableBody = document.createElement("tbody");
        tableBody.id = "north52tbody";
        table.appendChild(header);


        table.appendChild(tableBody);

        for (var i = 0; i < parameters.length; i++) {
            var parameter = parameters[i];
            var row = document.createElement("tr");
            row.style.fontSize = '12px';
            row.id = "row" + i;
            row.height = "10px";
            var cell = document.createElement("td");
            var displayElement = document.createElement("span");
            displayElement.innerText = parameter;
            cell.appendChild(displayElement);
            row.appendChild(cell);

            var cell2 = document.createElement("td");
            var inputElement = document.createElement("input");
            inputElement.type = "text";
            inputElement.name = parameter.replace('[', "").replace(']', "").split('.')[1];

            cell2.appendChild(inputElement);
            row.appendChild(cell2);
            tableBody.appendChild(row);

        }
       
        table.appendChild(tableBody);
    }
};


North52.FormulaTest.DisplayMessage = function (messageText, colour) {
  
    messageText = String(messageText).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
    messageText = '<br></br>' + messageText;
    messageText = messageText.replace(/~/g, '<br></br>');
    messageText = messageText.replace(/Function Name/g, '<br></br>Function Name');
    messageText = messageText.replace(/Final FormulaDescription/g, '<br></br>Final FormulaDescription');
    messageText = messageText.replace(/Server stack trace/g, '<br></br>Server stack trace');
    
    
    $('#message').append( messageText  );
  
 
    $('#message').css("color", colour);

};



North52.FormulaTest.HtmlDecode = function (s) {
    var out = "";
    if (s == null) return;

    var l = s.length;
    for (var i = 0; i < l; i++) {
        var ch = s.charAt(i);

        if (ch == '&') {
            var semicolonIndex = s.indexOf(';', i + 1);

            if (semicolonIndex > 0) {
                var entity = s.substring(i + 1, semicolonIndex);
                if (entity.length > 1 && entity.charAt(0) == '#') {
                    if (entity.charAt(1) == 'x' || entity.charAt(1) == 'X')
                        ch = String.fromCharCode(eval('0' + entity.substring(1)));
                    else
                        ch = String.fromCharCode(eval(entity.substring(1)));
                }
                else {
                    switch (entity) {
                        case 'quot': ch = String.fromCharCode(0x0022); break;
                        case 'amp': ch = String.fromCharCode(0x0026); break;
                        case 'lt': ch = String.fromCharCode(0x003c); break;
                        case 'gt': ch = String.fromCharCode(0x003e); break;
                        case 'nbsp': ch = String.fromCharCode(0x00a0); break;
                        case 'iexcl': ch = String.fromCharCode(0x00a1); break;
                        case 'cent': ch = String.fromCharCode(0x00a2); break;
                        case 'pound': ch = String.fromCharCode(0x00a3); break;
                        case 'curren': ch = String.fromCharCode(0x00a4); break;

                        default: ch = ''; break;
                    }
                }
                i = semicolonIndex;
            }
        }

        out += ch;
    }

    return out;

};