var sourceDataListController = {
    numberOfRows: function() {
        return sourceDataList.length;
    },

    prepareRow: function(rowElement, rowIndex, templateElements) {
        if (templateElements.label) {
            templateElements.label.innerText = sourceDataList[rowIndex].name;
        }
        if (templateElements.labelValue) {
            templateElements.labelValue.innerText = sourceDataList[rowIndex].value;
        }

        var self = this;
        var handler = function() {
            var browser = document.getElementById('browser').object;
            var dataList = sourceDataList[rowIndex];
            switch(rowIndex) {
                case 0:
                    amountEntryController.process(rowIndex, 5, false);
                    browser.goForward(document.getElementById('amountEntryLevel'), dataList.name);
                    break;
                case 1:
                    dateEntryController.process(rowIndex);
                    browser.goForward(document.getElementById('dateEntryLevel'), dataList.name);
                    break;
                case 2:
                    dateEntryController.process(rowIndex);
                    browser.goForward(document.getElementById('dateEntryLevel'), dataList.name);
                    break;
                case 3:
                    amountEntryController.process(rowIndex, 11, true);
                    browser.goForward(document.getElementById('amountEntryLevel'), dataList.name);
                    break;
                case 4:
                    amountEntryController.process(rowIndex, 11, true);
                    browser.goForward(document.getElementById('amountEntryLevel'), dataList.name);
                    break;
            }
        };
        rowElement.onclick = handler;
    },

    calculate: function (event) {
        var browser = document.getElementById('browser').object;
        browser.goForward(document.getElementById('resultLevel'), 'Result');
        document.getElementById("stackLayout").object.setCurrentView("processingLevel", false);
        processingController.waitData();
    }
};

var resultDataListController = {
    numberOfRows: function() {
        return resultDataList.length;
    },

    prepareRow: function(rowElement, rowIndex, templateElements) {
        if (templateElements.resultLabel) {
            templateElements.resultLabel.innerText = resultDataList[rowIndex].name;
        }
        if (templateElements.resultLabelValue) {
            templateElements.resultLabelValue.innerText = resultDataList[rowIndex].value;
        }

        var self = this;
        var handler = function() {
            var browser = document.getElementById('browser').object;
        };
        rowElement.onclick = handler;
    }
};

var dateEntryController = {
    process: function(rowIndex) {
        dateEntryController.rowIndex = rowIndex;
    },

    change: function(event) {
        var control = document.getElementById('popupYear');
        var year = control.options[control.selectedIndex].value;
        control = document.getElementById('popupMonth');
        var month = control.options[control.selectedIndex].value;
        control = document.getElementById('popupDay');
        var day = control.options[control.selectedIndex].value;
        sourceDataList[dateEntryController.rowIndex].value = month + ' ' + day + ', ' + year;
        control = document.getElementById('dataList').object;
        control.reloadData();
    },

    clear: function(event) {
        sourceDataList[dateEntryController.rowIndex].value = '';
        control = document.getElementById('dataList').object;
        control.reloadData();
        var browser = document.getElementById('browser').object;
        browser.goBack();
    }
};

var amountEntryController = {
    process: function(rowIndex, amountLength, commaSep) {
        var amountText = document.getElementById('amountText');
        amountText.innerHTML = sourceDataList[rowIndex].value;
        amountEntryController.rowIndex = rowIndex;
        amountEntryController.amountLength = amountLength;
        amountEntryController.commaSep = commaSep;
    },

    press: function(event) {
        var num = '';
        var control = document.getElementById('dataList').object;
        var amountText = document.getElementById('amountText');
        var curAmount = amountText.innerHTML;
        switch(event.target.id) {
            case 'ovalShape1':
            case 'ovalText1':
                num = '7';
                break;
            case 'ovalShape2':
            case 'ovalText2':
                num = '8';
                break;
            case 'ovalShape3':
            case 'ovalText3':
                num = '9';
                break;
            case 'ovalShape4':
            case 'ovalText4':
                num = '4';
                break;
            case 'ovalShape5':
            case 'ovalText5':
                num = '5';
                break;
            case 'ovalShape6':
            case 'ovalText6':
                num = '6';
                break;
            case 'ovalShape7':
            case 'ovalText7':
                num = '1';
                break;
            case 'ovalShape8':
            case 'ovalText8':
                num = '2';
                break;
            case 'ovalShape9':
            case 'ovalText9':
                num = '3';
                break;
            case 'ovalShape10':
            case 'ovalText10':
                amountText.innerHTML = '0';
                sourceDataList[amountEntryController.rowIndex].value = '0';
                control.reloadData();
                return;
            case 'ovalShape11':
            case 'ovalText11':
                num = '0';
                break;
            case 'ovalShape12':
            case 'ovalText12':
                if(curAmount.length > 1) {
                    curAmount = curAmount.replace(/,/g, '');
                    curAmount = curAmount.substring(0, curAmount.length - 1);
                    if(amountEntryController.commaSep) {
                        var rgx = /(\d+)(\d{3})/;
                        while (rgx.test(curAmount))
                            curAmount = curAmount.replace(rgx, '$1' + ',' + '$2');
                    }
                    amountText.innerHTML = curAmount;
                    sourceDataList[amountEntryController.rowIndex].value = curAmount;
                    control.reloadData();
                }
                else {
                    amountText.innerHTML = '0';
                    sourceDataList[amountEntryController.rowIndex].value = '0';
                    control.reloadData();
                }
                return;
        }
        if(curAmount.length < amountEntryController.amountLength) {
            curAmount = curAmount.replace(/,/g, '') + num;
            if(amountEntryController.commaSep) {
                var rgx = /(\d+)(\d{3})/;
                while (rgx.test(curAmount))
                    curAmount = curAmount.replace(rgx, '$1' + ',' + '$2');
            }
            curAmount = curAmount.replace(/^0(\d+)/, '$1');
            amountText.innerHTML = curAmount;
            sourceDataList[amountEntryController.rowIndex].value = curAmount;
            control.reloadData();
        }
    }
}

var processingController = {
    waitData: function() {
        var feedURL = "http://www.accessrm.com/calculator/process.php";
        var onloadHandler = function() { processingController.xmlLoaded(xmlRequest); };
        var xmlRequest = new XMLHttpRequest();
        xmlRequest.onload = onloadHandler;
        xmlRequest.open("POST", feedURL);
        xmlRequest.setRequestHeader("Cache-Control", "no-cache");
        xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        var queryStr = '';
        for(var i = 0; i < sourceDataList.length; i++) {
            if(i) queryStr = queryStr + '&';
            queryStr = queryStr + i + '=' + sourceDataList[i].value;
        }
        xmlRequest.send(queryStr);
    },

    xmlLoaded: function(xmlRequest) {
        if (xmlRequest.status == 200) {
            if(xmlRequest.responseXML.documentElement.tagName == 'error') {
                alert(xmlRequest.responseXML.documentElement.textContent);
                var browser = document.getElementById('browser').object;
                browser.goBack();
                return;
            }
            var resultSet = xmlRequest.responseXML.documentElement.childNodes;
            for (var i = 0; i < resultSet.length; i++) {
                switch(resultSet[i].tagName) {
                case 'city':
                    resultDataList[0].value = resultSet[i].textContent;
                    break;
                case 'county':
                    resultDataList[1].value = resultSet[i].textContent;
                    break;
                case 'cash':
                    resultDataList[2].value = resultSet[i].textContent;
                    break;
                case 'monthly':
                    resultDataList[3].value = resultSet[i].textContent;
                    break;
                }
            }
            var control = document.getElementById('list').object;
            control.reloadData();
            processingController.showResult();
            // Parse and interpret results
            // XML results found in xmlRequest.responseXML
            // Text results found in xmlRequest.responseText
        }
        else {
            alert("Error fetching data: HTTP status " + xmlRequest.status);
            var browser = document.getElementById('browser').object;
            browser.goBack();
        }
    },

    showResult: function() {
        document.getElementById("stackLayout").object.setCurrentView("resultLevel", false);
    }
};

var infoController = {
    flipToInfo: function(event) {
        var browser = document.getElementById('browser').object;
        browser.goForward(document.getElementById('infoLevel'), 'About');
    },
    
    website: function(event) {
        window.location.href = 'http://www.accessrm.com?ref=calc';
    }
}

//
// Function: load()
// Called by HTML body element's onload event when the web application is ready to start
//
function load()
{
    dashcode.setupParts();
}

var sourceDataList = [
    { name: "Zip Code", value: "" },
    { name: "Birthday", value: "" },
    { name: "Co-Birthday", value: "" },
    { name: "Est. Home Value", value: "" },
    { name: "Outstanding Amount", value: "" }
];

var resultDataList = [
    { name: "City", value: "" },
    { name: "County", value: "" },
    { name: "Total Cash", value: "" },
    { name: "Monthly Income", value: "" }
];
