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 () {

    $('#loading').show();
    var targetId = "";

    North52.FormulaTest.BuildParametersXml();

    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 '99'";

    SDK.REST.retrieveMultipleRecords("north52_formulacalculation",
                                                               options,
                                                               North52.FormulaTest.retrieveMultipleRecordsSuccess,
                                                               function (error) { North52.FormulaTest.DisplayMessage(error.message, "Red"); $('#loading').hide(); },
                                                               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];

            if (formulaResult.north52_Result == 'NoOp')
                displayResult = 'No Operation';
            else {
                var result = JSON.parse(formulaResult.north52_Result);
                displayResult = result.PropertyValueAction;
            }
        }
        North52.FormulaTest.DisplayMessage("Formula Result: " + displayResult, "Green");
        $('#loading').hide();

    }

    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 = $(":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 () {
    $('#loading').hide();
    var recordid = N52.DialogHelpers.GetParameterByName('id');


    SDK.REST.retrieveRecord(recordid,
                                                  "north52_formula",
                                                    null,
                                                    null,
                                                    North52.FormulaTest.RetrieveRecordSuccess,
                                                    function (error) { alert("North52 Formula Manager: " + error.message); },
                                                    North52.FormulaTest.RetrieveRecordError
                                                  )

};

North52.FormulaTest.RetrieveRecordSuccess = function (retrievedFormula) {

    var parameters = North52.FormulaTest.GetParameters(retrievedFormula.north52_FormulaDescription);
    North52.FormulaTest.BuildParameters(parameters);

    North52.FormulaTest.FormulaShortCode = retrievedFormula.north52_ShortCode;
    North52.FormulaTest.EntityName = retrievedFormula.north52_SourceEntityName;

};

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) {
        North52.FormulaTest.DisplayMessageHeader("No parameters detected. The formula will be executed as is.");

        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 = "12px";
        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.id = "row" + i;
            row.height = "12px";
            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);

           

        }
        North52.FormulaTest.DisplayMessageHeader("Parameters detected, please set values.");
        table.appendChild(tableBody);
    }
};


North52.FormulaTest.DisplayMessage = function (messageText, colour) {
    var ul = document.getElementById("message");
    var li = document.createElement("li");
    var div = document.createElement("div");
    var messageSpan = document.createElement("span");
    messageSpan.innerText = messageText;
    div.appendChild(messageSpan);
    li.appendChild(div);
    ul.appendChild(li);
    $('#message').css("color", colour);

};

North52.FormulaTest.DisplayMessageHeader = function (messageText) {
    var ul = document.getElementById("messageHeader");
    var li = document.createElement("li");
    var div = document.createElement("div");
    var messageSpan = document.createElement("span");
    messageSpan.innerText = messageText;
    div.appendChild(messageSpan);
    li.appendChild(div);
    ul.appendChild(li);

};


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;

};