;var mydhr = mydhr || {};
     mydhr.Data = mydhr.Data || {};

mydhr.Data.WorkflowDataProxy = function (options) {
    var self = this;
    options = options || {};
    options.apiBase = options.apiBase || '/api/';

    self.initiateWorkflow = function (wf) {
        return $.ajax({
            url: options.apiBase + 'Apply/InitiateWorkflow',
            type: 'post',
            data: wf
        })
        .error(function () {
            window.location.href = '/Apply/ApplicationError';
        }).
        success(function(data) {
            if (data == false)
                window.location.href = '/Apply/ApplicationError';
        });
    };

    self.submitStep = function (step) {
        return $.ajax({
            url: options.apiBase + 'Apply/SubmitStep',
            type: 'post',
            data: JSON.stringify(step),
            contentType: "application/json; charset=utf-8",
            dataType: 'json'
        })
        .error(function () {
            window.location.href = '/Apply/ApplicationError';
        }).
        success(function (data) {
            if (data == false)
                window.location.href = '/Apply/ApplicationError';
        });
    };

    self.skipToSummary = function (step) {
        return $.ajax({
            url: options.apiBase + 'Apply/SkipToSummary',
            type: 'post',
            data: JSON.stringify(step),
            contentType: "application/json; charset=utf-8",
            dataType: 'json'
        })
        .error(function () {
            window.location.href = 'Apply/ApplicationError';
        })
        .success(function (data) {
            if (data == false)
                window.location.href = 'Apply/ApplicationError';
        });
    }

    self.submitStepWithoutRender = function (step) {
        return $.ajax({
            url: options.apiBase + 'Apply/SubmitStepWithoutRender',
            type: 'post',
            data: JSON.stringify(step),
            contentType: "application/json; charset=utf-8",
            dataType: 'json'
        })
        .error(function (data) {
            window.location.href = '/Apply/ApplicationError';
            
        }).
        success(function (data) {
            if (data == false)
                window.location.href = '/Apply/ApplicationError';
        });
    };

    self.submitMultiFormStepWithoutRender = function (step) {
        return $.ajax({
            url: options.apiBase + 'Apply/SubmitMultiFormStepWithoutRender',
            type: 'post',
            data: JSON.stringify(step),
            contentType: "application/json; charset=utf-8",
            dataType: 'json'
        })
        .error(function () {
            window.location.href = '/Apply/ApplicationError';
        }).
        success(function (data) {
            if (data == false)
                window.location.href = '/Apply/ApplicationError';
        });
    };

    self.submitMultiFormStep = function (step) {
        return $.ajax({
            url: options.apiBase + 'Apply/SubmitMultiFormStep',
            type: 'post',
            data: JSON.stringify(step),
            contentType: "application/json; charset=utf-8",
            dataType: 'json'
        })
        .error(function () {
            window.location.href = '/Apply/ApplicationError';
        }).
        success(function (data) {
            if (data == false)
                window.location.href = '/Apply/ApplicationError';
        });
    };

    self.getApplicantSex = function () {
        return $.ajax({
            url: options.apiBase + 'Apply/GetApplicantSex',
            type: 'get'
        })
    };
};;
ko.observableArray.fn.filterByStartsWith = function (propName, substring) {
    return ko.computed(function () {
        var allItems = this(), matchingItems = [];
        for (var i = 0; i < allItems.length; i++) {
            var current = allItems[i];
            var key = ko.utils.unwrapObservable(current[propName])
            if (key.ToString().slice(0, substring.length) == substring)
                matchingItems.push(current);
        }
        return matchingItems;
    }, this);
};;
;
var mydhr = mydhr || {};
mydhr.ViewModels = mydhr.ViewModels || {};

mydhr.ViewModels.ApplyVm = function() {
    var stringStartsWith = function(string, startsWith) {
        string = string || "";
        if (startsWith.length > string.length)
            return false;
        return string.substring(0, startsWith.length) === startsWith;
    };

    var self = this,
        pageDiv = $('#pageDiv');

    self.submitted = ko.observable(false);

    self.membersTracker = ko.observableArray();
    self.membersInEdit = ko.computed(function() {
        for (var i = 0; i < self.membersTracker().length; i++) {
            if (self.membersTracker()[i]())
                return true;
        }
        return false;
    });

    self.proxy = new mydhr.Data.WorkflowDataProxy({
        apiBase: mydhr.rootPath
    }); // TODO - change apiBase

    self.pages = ko.observableDictionary();

    self.removePage = function(page) {
        self.pages.remove(page);
    };
    self.addFormInstance = function(dataName) {
        var array = ko.utils.arrayFilter(self.pages.items(), function(item) {
            return stringStartsWith(item.key(), dataName);
        });

        var first = array[0].value();
        var last = array[array.length - 1];
        var lastIndex = self.pages.items.indexOf(last) + 1;

        if (first) {
            first.stepVariables["Action"] = "Add";
            var bundle = first.bundle();
            bundle.UnorderedExecute = true;
            self.proxy.submitMultiFormStep(bundle).success(function(val) {
                var v = val.Answers[0];
                first.stepVariables["Action"] = null;

                var newStep = val;
                var instanceId = val.StepId + "_" + v.InstanceKey;
                //var answersLeft = answersLength - i - 1;

                newStep.Answers = [v];
                newStep.RenderedPage = newStep.RenderedPage.replace(/{{STEP-ID}}/g, val.StepId);
                newStep.RenderedPage = newStep.RenderedPage.replace(/{{INSTANCE-KEY}}/g, v.InstanceKey);
                //newStep.RenderedPage = newStep.RenderedPage.replace("{{STEP-ID}}", val.StepId);
                //newStep.RenderedPage = newStep.RenderedPage.replace("{{INSTANCE-KEY}}", v.InstanceKey);

                newStep.StepId = instanceId;

                var vm = self.createWorkflowStepViewModel(newStep, self);
                vm.dictionaryKey = val.FormDataName + "_" + v.InstanceKey;
                //self.pages.push(vm.dictionaryKey, vm);
                self.pages.splice(lastIndex, 0, vm.dictionaryKey, vm);

                ko.applyBindings(vm, document.getElementById(instanceId));

                // TODO: should probably be more...elegant
                var needSave = true;
                if (val.FormDataName == "householdMember") {
                    var hasChildren = true;
                    var thisPage = $("#" + instanceId).children();
                    needSave = false;
                    //Event listener in formFlow
                    //$('#fakeAddNewMember').hide();
                    //$('#AddNewMember').show();
                } else {
                    var hasChildren = false;
                    var thisPage = $("#" + instanceId);
                }

                resumePage(instanceId, 1, 0, hasChildren);

                thisPage.find('.btn-next').hide();
                thisPage.find('.btn-edit').hide();
                if (needSave) {
                    thisPage.find('.btn-save').show();
                    thisPage.find('.btn-cancel').show();
                } else {
                    $(thisPage[1]).find('.btn-save').show();
                }

            });
        }
    };
    self.summarySSN = function(formDataName, fieldDataName, useStale) {
        var ssnFull = self.pages.get(formDataName)().answer.Responses.get(fieldDataName)().Value();
        if (useStale)
            ssnFull = self.pages.get(formDataName)().staleAnswer.Responses.get(fieldDataName)().Value();
        if (ssnFull && ssnFull.length >= 4) {
            return "***-**-" + ssnFull.substr(ssnFull.length - 4);
        }
        return "";
    }.bind(self);

    self.summaryField = function(formDataName, fieldDataName) {
        return self.pages.get(formDataName)().answer.Responses.get(fieldDataName)().Value();
    }.bind(self);

    self.staleSummaryField = function(formDataName, fieldDataName) {
        return self.pages.get(formDataName)().staleAnswer.Responses.get(fieldDataName)().Value();
    }.bind(self);

    self.needSave = function(formDataName) {
        return self.pages.get(formDataName)().needSave();
    }.bind(self);

    self.summaryHouseholdFlagCheck = function(instanceKey, fieldDataName, assertValue, useStale) {
        try {
            if (useStale)
                return self.staleSummaryField('householdMember_' + instanceKey, fieldDataName) == assertValue;
            else
                return self.summaryField('householdMember_' + instanceKey, fieldDataName) == assertValue;
        } catch (err) {
            return false;
        }
    }.bind(self);

    self.summaryMultipleFields = function(formDataName, fieldDataNames, value, shouldEqual, useStale) {
        start = false;
        final = start;
        for (var i = 0; i < fieldDataNames.length; i++) {
            if (useStale) {
                if ((self.staleSummaryField(formDataName, fieldDataNames[i]) == value) == shouldEqual) {
                    final = !start;
                }
            } else {
                if ((self.summaryField(formDataName, fieldDataNames[i]) == value) == shouldEqual) {
                    final = !start;
                }
            }
        }
        return final;
    }.bind(self);

    self.summaryEmptyPages = function(pageList) {
        for (var i = 0; i < pageList.length; i++) {
            if (self.pages.get(pageList[i])() != null && self.pages.get(pageList[i])().answers().length != 0)
                return false;
        }
        return true;
    }.bind(self);

    self.formatCurrency = function(currency) {
        if (currency != '') {
            //var str = currency.toString();
            //var money = str.split('.');
            //for (var i = money[0].length; i > 0; i -= 3)
            //    money[0] = money[0].substr(0, i) + "," + money[0].substr(i);

            return "$" + currency;
        }
        return currency;
    }.bind(self);

    self.summaryList = function(FormDataName) {
        return ko.utils.arrayFilter(self.pages.items(), function(item) {
            return stringStartsWith(item.key(), FormDataName);
        });
    }.bind(self);

    self.lookupList = function(formDataName, valueFieldDataName, textFieldDataName, textFieldDataName2) {
        var returnArr = ko.observableArray();
        var array = ko.utils.arrayFilter(self.pages.items(), function(item) {
            return stringStartsWith(item.key(), formDataName);
        });
        ko.utils.arrayForEach(array, function(item) {
            var opt = ko.observable();
            if (textFieldDataName && textFieldDataName2) {
                opt.opText = item.value().answer.Responses.get(textFieldDataName)().Value() + " " +
                    item.value().answer.Responses.get(textFieldDataName2)().Value();
            } else if (textFieldDataName) {
                opt.opText = item.value().answer.Responses.get(textFieldDataName)().Value;
            } else {
                opt.opText = item.value().answer.Responses.get(valueFieldDataName)().Value;
            }
            try {
                opt.opDate = item.value().answer.Responses.get('householdMemberDOB')().Value;
            } catch (err) {
                //Nothing
            }
            opt.opValue = item.value().answer.Responses.get(valueFieldDataName)().Value;
            if (formDataName != 'householdMember' || (formDataName == 'householdMember' && opt.opValue() != null)) {
                returnArr.push(opt);
            }
        });

        return returnArr;
    };

    self.lookupListAge = function(formDataName, valueFieldDataName, textFieldDataName, textFieldDataName2) {
        var sixtyYearsInMilli = 1893415558482;
        var realReturn = ko.observableArray();
        var begin = self.lookupList(formDataName, valueFieldDataName, textFieldDataName, textFieldDataName2);
        ko.utils.arrayForEach(begin(), function(item) {
            var dob = null;
            try {
                dob = item.opDate;
                var b = new Date(dob());
                var c = new Date();
                if (c.getTime() - b.getTime() > sixtyYearsInMilli) {
                    realReturn.push(item);
                    item.handled = true;
                }
            } catch (err) {
                realReturn.push(item);
                item.handled = true;
            }
        });
        var arr = self.pages.get('incomeUnearnedIncome')().answers();
        ko.utils.arrayForEach(arr, function(item) {
            if (item.Responses.get('unearnedIncomeIsForDisability')().Value() == 'true') {
                ko.utils.arrayForEach(begin(), function(item2) {
                    if (item2.handled != true && item2.opValue() == item.Responses.get('unearnedIncomeName')().Value()) {
                        realReturn.push(item2);
                        item2.handled = true;
                    }
                });
            }
        });
        return realReturn;
    };

    self.lookupField = function(formDataName, lookupFieldName, lookupFieldValue, resultFieldName) {
        var result;
        var array = ko.utils.arrayFilter(self.pages.items(), function(item) {
            return stringStartsWith(item.key(), formDataName);
        });
        ko.utils.arrayForEach(array, function(item) {
            var fieldVal = item.value().answer.Responses.get(lookupFieldName)().Value();
            if (fieldVal == lookupFieldValue) {
                result = item.value().answer.Responses.get(resultFieldName)().Value();
            }
        });

        return result;
    };

    self.verifyHeadOfHouseholdExists = function() {
        var array = ko.utils.arrayFilter(self.pages.items(), function(item) {
            return stringStartsWith(item.key(), 'householdMember');
        });
        for (var i = 0; i < array.length; i++) {
            var itemInstance = array[i].value().answer.Responses.get('householdMemberInstanceKey')().Value();

            // instance key will be null if the form hasn't been saved yet
            if (itemInstance == "instance-0") {
                return true;
            }
        } 
        return false;
    };

    self.lookupMemberNumber = function(instanceKey) {
        return ko.computed(function() {
            var array = ko.utils.arrayFilter(self.pages.items(), function(item) {
                return stringStartsWith(item.key(), 'householdMember');
            });
            for (var i = 0; i < array.length; i++) {
                var itemInstance = array[i].value().answer.Responses.get('householdMemberInstanceKey')().Value();

                // instance key will be null if the form hasn't been saved yet
                if (itemInstance == instanceKey || itemInstance == null) {
                    return i + 1;
                }
            } 
        });
    };

    self.lookupFamilyMember = function(instanceKey) {
        return ko.computed(function() {
            var firstName = self.lookupField('householdMember', 'householdMemberInstanceKey', instanceKey(), 'householdMemberFirstName');
            var lastName = self.lookupField('householdMember', 'householdMemberInstanceKey', instanceKey(), 'householdMemberLastName');
            return firstName + " " + lastName;
        });
    };

    self.next = function(data) {
        //var form = $(e.target).closest('form');
        //proxy.submitStep({ Name: page.name() })
        //    .success(function (data) {
        //        self.pages.push(new mydhr.ViewModels.WorkflowStepVm(data));
        //    });
        if (data.FormDataName == "summarySubmitted") {
            self.submitted(true);
        }
        var newvm = self.createWorkflowStepViewModel(data);
        if (newvm.answer && newvm.answer.InstanceKey) {
            newvm.dictionaryKey = data.FormDataName + "_" + newvm.answer.InstanceKey;
            self.pages.push(newvm.dictionaryKey, newvm);
        } else {
            self.pages.push(data.FormDataName, newvm);
        }
        //eval(decodeURI(unescape(data.Code)));

        //run this before apply binding in case it messes up bindings
        //can probably be moved though

        //TODO: remove later
        //var elementId = data.StepId;
        //$('#'+elementId+' input:radio').screwDefaultButtons({
        //    image: 'url("content/images/DHR_radiobtns_emerald.png")',
        //    width: 26,
        //    height: 26
        //});
        //$('#' + elementId + ' input:checkbox').screwDefaultButtons({
        //    image: 'url("content/images/DHR_checkboxes_emerald.png")',
        //    width: 26,
        //    height: 26
        //});
        var elementId = data.StepId;
        mydhr.FormFlow.initializeForm("#" + elementId + " .form-section-content");
        //cc_on only evaluates on IE8 and IE9
        /*@cc_on window.setTimeout(function () {  @*/
        /*@cc_on });
        window.setTimeout(function () { @*/
        ko.applyBindings(newvm, document.getElementById(data.StepId));
        $(document.getElementById(data.StepId)).trigger('firstPrep');
        /*@cc_on }); @*/
        /*cc_on }); @*/
    };

    ////////////////////////////////////////////////////////////////////////////////////
    //                                    Skip To Summary
    self.showQuickModal = function() {
        $('#quickModal').modal();
    };

    self.skipToSummary = function() {
        var lastPage = self.pages.items()[self.pages.items().length - 1];
        if (lastPage.value().name() == "Multiple Form Step") {
            self.pages.remove(lastPage.key());
        }
        //for all but last form, call edit to make sure everything is saved.
        //pages.forEach(function (item) {
        //    var value = item.value();
        //    if (value.StepUniqueName == "d0e07942-5245-c5e2-edba-d946e6960a5c") { // if the form is householdMember
        //        var isBlankHM = true;
        //        var fields = value.answer.Responses.items();
        //        fields.forEach(function (field) {
        //            if (field.key() == "householdMemberFirstName" || field.key() == "householdMemberLastName") {
        //                if(field.value().Value() != "") {
        //                    isBlankHM = false;                            
        //                }
        //            }
        //        });
        //        if (isBlankHM) {
        //            value.remove(value);
        //        }
        //    } 
        //});
        self.proxy.skipToSummary()
            .success(function(data) {
                if (data.containsMultiple) {
                    var dataLength = data.data.length;
                    $.each(data.data, function(index, val) {
                        if (val.StepType == 'MultipleFormsStep') {
                            var blankHtml = val.RenderedPage;
                            var answersLength = val.Answers.length;

                            $.each(val.Answers, function(i, v) {
                                if (!val.HasEntries) {
                                    var newvm = self.createWorkflowStepViewModel(val, self);
                                    newvm.dictionaryKey = val.FormDataName + "_" + v.InstanceKey;
                                    self.pages.push(val.FormDataName + "_" + v.InstanceKey, newvm);

                                    //eval(decodeURI(unescape(data.Code)));
                                    ko.applyBindings(newvm, document.getElementById(val.StepId));

                                    resumePage(val.StepId, index, dataLength);
                                } else {
                                    var newStep = val;
                                    var instanceId = val.StepId + "_" + v.InstanceKey;
                                    var answersLeft = answersLength - i - 1;

                                    newStep.Answers = [v];
                                    newStep.RenderedPage = blankHtml.replace(/{{STEP-ID}}/g, val.StepId);
                                    newStep.RenderedPage = newStep.RenderedPage.replace(/{{INSTANCE-KEY}}/g, v.InstanceKey);

                                    newStep.StepId = instanceId;

                                    var vm = self.createWorkflowStepViewModel(newStep, self);
                                    vm.dictionaryKey = val.FormDataName + "_" + v.InstanceKey;
                                    self.pages.push(vm.dictionaryKey, vm);

                                    /*@cc_on window.setTimeout(function () { @*/
                                    ko.applyBindings(vm, document.getElementById(instanceId));
                                    /*@cc_on }); @*/

                                    // TODO: should probably be more...elegant
                                    if (val.FormDataName == "householdMember") {
                                        resumePage(instanceId, index - answersLeft, dataLength, true, true);
                                    } else {
                                        resumePage(instanceId, index - answersLeft, dataLength, false);
                                    }
                                }
                            });
                        } else {
                            var newvm = self.createWorkflowStepViewModel(val, self);
                            self.pages.push(val.FormDataName, newvm);

                            //eval(decodeURI(unescape(data.Code)));
                            /*@cc_on window.setTimeout(function () { @*/
                            ko.applyBindings(newvm, document.getElementById(val.StepId));
                            /*@cc_on }); @*/

                            resumePage(val.StepId, index, dataLength);
                        }


                    });
                } else {
                    var newvm = self.createWorkflowStepViewModel(data);
                    newvm.dictionaryKey = data.FormDataName;
                    self.pages.push(data.FormDataName, newvm);

                    // handle fading and spacer for first form in workflow
                    var pageDiv = $('#pageDiv');
                    var pageDivNext = pageDiv.find('.btn-next');
                    pageDivNext.hide();
                    var currentSection = pageDiv.find('.form-section');
                    currentSection.find('.form-section-header').fadeTo(1000, 1.0, null);
                    currentSection.find('.form-section-content').fadeTo(1000, 1.0, function() {
                        pageDivNext.show();

                        mydhr.Spacer.resize(currentSection, true);
                    });

                    //eval(decodeURI(unescape(data.Code)));
                    /*@cc_on window.setTimeout(function () { @*/
                    ko.applyBindings(newvm, document.getElementById(data.StepId))
                    /*@cc_on }); @*/
                }
            });
    };

    ///////////////////////////////////////////////////////////////////////////////////////
    self.startWorkflow = function() {
        self.proxy.initiateWorkflow({
            Id: 'test'
        })
            .success(function(data) {
                self.submitted(data.submitted);
                if (data.containsMultiple) {
                    var dataLength = data.data.length;
                    $.each(data.data, function(index, val) {
                        if (val.StepType == 'MultipleFormsStep') {
                            var blankHtml = val.RenderedPage;
                            var answersLength = val.Answers.length;

                            $.each(val.Answers, function(i, v) {
                                if (!val.HasEntries) {
                                    var newvm = self.createWorkflowStepViewModel(val, self);
                                    newvm.dictionaryKey = val.FormDataName + "_" + v.InstanceKey;
                                    self.pages.push(val.FormDataName + "_" + v.InstanceKey, newvm);

                                    //eval(decodeURI(unescape(data.Code)));
                                    ko.applyBindings(newvm, document.getElementById(val.StepId));

                                    resumePage(val.StepId, index, dataLength);
                                } else {
                                    var newStep = val;
                                    var instanceId = val.StepId + "_" + v.InstanceKey;
                                    var answersLeft = answersLength - i - 1;

                                    newStep.Answers = [v];
                                    newStep.RenderedPage = blankHtml.replace(/{{STEP-ID}}/g, val.StepId);
                                    newStep.RenderedPage = newStep.RenderedPage.replace(/{{INSTANCE-KEY}}/g, v.InstanceKey);
                                    //newStep.RenderedPage = blankHtml.replace("{{STEP-ID}}", val.StepId);
                                    //newStep.RenderedPage = newStep.RenderedPage.replace("{{INSTANCE-KEY}}", v.InstanceKey);
                                    //newStep.RenderedPage = newStep.RenderedPage.replace("{{STEP-ID}}", val.StepId);
                                    //newStep.RenderedPage = newStep.RenderedPage.replace("{{INSTANCE-KEY}}", v.InstanceKey);

                                    newStep.StepId = instanceId;

                                    var vm = self.createWorkflowStepViewModel(newStep, self);
                                    vm.dictionaryKey = val.FormDataName + "_" + v.InstanceKey;
                                    self.pages.push(vm.dictionaryKey, vm);

                                    /*@cc_on window.setTimeout(function () { @*/
                                    ko.applyBindings(vm, document.getElementById(instanceId));
                                    /*@cc_on }); @*/

                                    // TODO: should probably be more...elegant
                                    if (val.FormDataName == "householdMember") {
                                        resumePage(instanceId, index - answersLeft, dataLength, true, true);
                                    } else {
                                        resumePage(instanceId, index - answersLeft, dataLength, false);
                                    }
                                }
                            });
                        } else {
                            var newvm = self.createWorkflowStepViewModel(val, self);
                            self.pages.push(val.FormDataName, newvm);

                            //eval(decodeURI(unescape(data.Code)));
                            /*@cc_on window.setTimeout(function () { @*/
                            ko.applyBindings(newvm, document.getElementById(val.StepId));
                            /*@cc_on }); @*/

                            resumePage(val.StepId, index, dataLength);
                        }


                    });
                } else {
                    var newvm = self.createWorkflowStepViewModel(data);
                    newvm.dictionaryKey = data.FormDataName;
                    self.pages.push(data.FormDataName, newvm);

                    // handle fading and spacer for first form in workflow
                    var pageDiv = $('#pageDiv');
                    var pageDivNext = pageDiv.find('.btn-next');
                    pageDivNext.hide();
                    var currentSection = pageDiv.find('.form-section');
                    currentSection.find('.form-section-header').fadeTo(1000, 1.0, null);
                    currentSection.find('.form-section-content').fadeTo(1000, 1.0, function() {
                        pageDivNext.show();

                        mydhr.Spacer.resize(currentSection, true);
                    });

                    //eval(decodeURI(unescape(data.Code)));
                    /*@cc_on window.setTimeout(function () { @*/
                    ko.applyBindings(newvm, document.getElementById(data.StepId))
                    /*@cc_on }); @*/
                }
            });
    };
    var submittedProcessed = false;

    function resumePage(pageId, index, dataLength, showChildren, makeChildrenVisible) {
        if (self.submitted() && !submittedProcessed) {
            submittedProcessed = true;
            /*@cc_on window.setTimeout(function () { @*/
            mydhr.FormFlow.initializeForm('#' + pageId + " .form-section-content");
            /*@cc_on }); @*/
            $('#sidebar-house').show();
            $('#sidebar-AF').show();
            $('#sidebar-income').show();
            $('#sidebar-expenses').show();
            $('#sidebar-summary').show();

            $('#sidebar-start a').addClass('sidebar-disabled');
            $('#sidebar-house a').addClass('sidebar-disabled');
            $('#sidebar-AF a').addClass('sidebar-disabled');
            $('#sidebar-income a').addClass('sidebar-disabled');
            $('#sidebar-expenses a').addClass('sidebar-disabled');
            $('#sidebar-summary').addClass('active');

            $('body').undelegate('.side', 'click');

            $('#sidebar-start a').removeAttr("href");
            $('#sidebar-house a').removeAttr("href");
            $('#sidebar-AF a').removeAttr("href");
            $('#sidebar-income a').removeAttr("href");
            $('#sidebar-expenses a').removeAttr("href");

            $('#submitted').fadeTo(1000, 1.0, null);

            var viewportHeight = $(window).height();
            var subNavHeight = $('.subnav').outerHeight();
            var footerHeight = $('.footer').outerHeight();
            var containerHeight = $('#submitted').parent().height() - 8;

            var spacerHeight = (viewportHeight - containerHeight) - (footerHeight + subNavHeight);
            //if (spacerHeight < 0) {
            $('.spacer').height(0);
            //}
            //else {
            //    $('.spacer').height(spacerHeight);
            //}

            $('#sidebar-summary').on('click', function(e) {
                mydhr.Spacer.scroll($('#submitted'));
                e.stopImmediatePropagation();
            });
        } else if (!self.submitted()) {
            /*@cc_on window.setTimeout(function () { @*/
            mydhr.FormFlow.initializeForm('#' + pageId + " .form-section-content");
            /*@cc_on }); @*/
            if (showChildren) {
                var thisPage = $("#" + pageId).children();
                if (makeChildrenVisible) {
                    thisPage.show();
                }
            } else {
                var thisPage = $("#" + pageId);
            }

            //show necessary sidebar elements
            if (thisPage.hasClass('household')) {
                $('#sidebar-house').show();
            } else if (thisPage.hasClass('AF')) {
                $('#sidebar-AF').show();
            } else if (thisPage.hasClass('income')) {
                $('#sidebar-income').show();
            } else if (thisPage.hasClass('expense')) {
                $('#sidebar-expenses').show();
            } else if (thisPage.hasClass('summary')) {
                $('#sidebar-summary').show();
            }

            if (thisPage.hasClass('shelter')) {
                //set shelter questions based on selection
                thisPage.find('#shelterQ3').hide();
                thisPage.find('#shelterQ4').hide();
                thisPage.find('#shelterQ5').hide();
                thisPage.find('#shelterQ6').hide();
                thisPage.find('#shelterQ7').hide();
                thisPage.find('#shelterQP').hide();

                var ownRentList = document.getElementById("ownRentDropdown");
                var shelterList = document.getElementById("shelterDropdown");
                var ownRent = ownRentList.options[ownRentList.selectedIndex].value;
                var shelter = shelterList.options[shelterList.selectedIndex].value;

                if (ownRent != 'F' && (ownRent != '' && shelter != '')) {
                    if (ownRent == 'O') {
                        thisPage.find('#shelterQ5').show();
                        thisPage.find('#shelterQ6').show();
                    } else if (ownRent == 'B') {
                        thisPage.find('#shelterQ3').show();
                        thisPage.find('#shelterQ5').show();
                        thisPage.find('#shelterQ6').show();
                        thisPage.find('#shelterQ7').show();
                    } else if (ownRent == 'R') {
                        thisPage.find('#shelterQ3').show();
                        thisPage.find('#shelterQ7').show();
                    }

                    if (shelter == 'M') {
                        thisPage.find('#shelterQ4').show();
                    }

                    thisPage.find('#shelterQP').show();


                    //var spacerHeight = (viewportHeight - containerHeight) - (footerHeight + subNavHeight);
                    //if (spacerHeight < 0) {
                    //    $('.spacer').height(0);
                    //}
                    //else {
                    //    $('.spacer').height(spacerHeight);
                    //}
                }
            }

            //show add divs where necessary
            thisPage.find('.btn-next').hide();
            thisPage.find('.btn-save').hide();
            thisPage.find('.btn-cancel').hide();
            /*@cc_on window.setTimeout(function () { @*/
            var showAddDivInputs = thisPage.find('input.showAddDiv');
            var yesSecInputs = thisPage.find('input.yesSec');
            var noSecInputs = thisPage.find('input.noSec');

            for (i = 0; i < showAddDivInputs.length; i++) {
                var currentInput = $('#' + showAddDivInputs[i].id);
                if (currentInput.prop('checked')) {
                    var addDiv = $('[data-add-div="' + currentInput.prop('data-target') + '"]');
                    addDiv.show();
                }
            }
            for (i = 0; i < yesSecInputs.length; i++) { //index will be the same for noSec as they appear in pairs
                var currentYesInput = $('#' + yesSecInputs[i].id);
                var currentNoInput = $('#' + noSecInputs[i].id);
                if (currentYesInput.prop('checked')) {
                    currentYesInput.closest('div.form-section').find('.addSec2').hide();
                    currentYesInput.closest('div.form-section').find('.addSec1').show();
                } else if (currentNoInput.prop('checked')) {
                    currentNoInput.closest('div.form-section').find('.addSec1').hide();
                    currentNoInput.closest('div.form-section').find('.addSec2').show();
                }
            }
            //thisPage.find('.btn-next').hide();
            //thisPage.find('.btn-save').hide();
            //thisPage.find('.btn-cancel').hide();
            if (index < dataLength - 1) {
                thisPage.find('.btn-edit').show();
                thisPage.find('.btn-remove').show();
                thisPage.find('.btn-addNewMember').show();

                thisPage.find('input.fundsBox').trigger("checkEntries");
                mydhr.FormFlow.disableInputs(thisPage);
            } else {
                if (makeChildrenVisible) {
                    var topOfPage = thisPage[0];
                    $(topOfPage).find('.btn-edit').show();
                    mydhr.FormFlow.disableInputs($(topOfPage));
                    thisPage = $(thisPage[1]);
                }
                mydhr.Spacer.resize(thisPage, true);

                //var navbarHeight = $('.subnav').outerHeight();
                //var toPosition = thisPage.offset().top - subNavHeight;

                $('html, body').delay(1000).animate({
                    opacity: 1
                }, {
                    duration: 10,
                    done: function() {
                        mydhr.Spacer.scroll(thisPage);
                        $(document).trigger('showAddMember');
                    }
                });

                //$('html, body').delay(10000).animate({
                //    scrollTop: getPosition()
                //}, 600, function () { $('html, body').stop(true); getPosition(); });

                setTimeout(function() {
                    thisPage.find('.form-section-header').fadeTo(1000, 1.0, null);
                    thisPage.find('.form-section-content').fadeTo(1000, 1.0, function() {
                        if (dataLength != 0) {
                            thisPage.find('.btn-next').show();
                        } else {
                            $(thisPage[0]).find('.btn-next').show();
                        }
                    });
                }, 1100);
                thisPage.trigger("setupValidation");
            }
            /*@cc_on }); @*/
        } else if ($('#'.concat(pageId).concat('.appSummary')).length != 0) {
            var thisPage = $('#'.concat(pageId));
            mydhr.FormFlow.initializeForm('#' + pageId + " .form-section-content");
            mydhr.FormFlow.disableInputs(thisPage);
            thisPage.find('.btn-next, .btn-print').hide();
            //$('#submitted').parent().append(thisPage.detach());
            $(thisPage).insertAfter($('#submitted').parent());
            thisPage.find('.form-section-header').fadeTo(1000, 1.0, null);
            thisPage.find('.form-section-content').fadeTo(1000, 1.0, null);
        }

    };

    self.createWorkflowStepViewModel = function(step) {
        switch (step.StepType) {
            case "ShowPage":
                return new mydhr.ViewModels.ShowPageWorkflowStepVm(step, self);
                break;
            case "FormStep":
                return new mydhr.ViewModels.FormWorkflowStepVm(step, self);
                break;
            case "MultipleFormsStep":
                return new mydhr.ViewModels.MultipleFormWorkflowStepVm(step, self);
                break;
            case "FormsTableStep":
                return new mydhr.ViewModels.FormsTableStepVm(step, self);
                break;
            case "HouseholdFlagsStep":
                return new mydhr.ViewModels.HouseholdFlagsStepVm(step, self);
                break;
            default:
                return new mydhr.ViewModels.ShowPageWorkflowStepVm(step, self);
        }
    };
};
;
; var mydhr = mydhr || {};
mydhr.Data = mydhr.Data || {};

var stringStartsWith = function (string, startsWith) {
    string = string || "";
    if (startsWith.length > string.length)
        return false;
    return string.substring(0, startsWith.length) === startsWith;
};

var findSelector = function (renderedPage) {
    var classes = $($(renderedPage)[0].className.split(/\s+/)).filter(function (item) { return item != "row" && item != "form-section" });
    for (var i = 0; i < classes.length; i++) {
        var word = classes[i];
        if (mydhr.Validator[word]) {
            var remaining = classes.filter(function (item) { return item != word; });
            for (var j = 0; j < remaining.length; j++) {
                var second = remaining[j];
                if (mydhr.Validator[word][second]) {
                    return mydhr.Validator[word][second]
                }
            }
        }
    }
    return false;
};

mydhr.ViewModels.FormWorkflowStepVm = function (step, parent) {
    var self = this;
    step = step || {};
    step.Name = step.Name || 'Test Step';
    step.RenderedPage = step.RenderedPage || '<b>rendered html</b>';
    step.StepId = step.StepId || '';
    step.Code = step.Code || '';
    step.Answer = step.Answer || {};
    step.FormTemplateId = step.FormTemplateId || '';
    step.WorkflowId = step.WorkflowId || '00000000-0000-0000-0000-000000000000';
    step.StepType = step.StepType || "TestStep";

    self.name = ko.observable(step.Name);
    self.renderedPage = ko.observable(step.RenderedPage);
    self.stepId = step.StepId;
    self.formTemplateId = step.FormTemplateId;
    self.answer = new mydhr.ViewModels.FormAnswer(step.Answer);
    self.staleAnswer = new mydhr.ViewModels.FormAnswer(step.Answer);
    self.needSave = ko.observable(false);
    self.stepVariables = step.StepVariables || [];
    self.workflowId = step.WorkflowId;
    self.stepType = step.StepType;
    self.parentVm = parent;

    self.validator = findSelector(step.RenderedPage);
    if (self.validator) {
        $('#body').on('setupValidation', '#'+self.stepId, function () {
            mydhr.Validator.setupForm(self.validator);
        });
        if (self.validator.customRules)
            mydhr.Validator.setCustomRules(self.validator);
        if (self.validator.changeRules)
            mydhr.Validator.delegateChanges(self.validator);
        if (self.validator.initializeFunction)
            self.validator.initializeFunction();
    }
    
    self.bundle = function () {

        var bundle =
            {
                WorkflowId: self.workflowId,
                StepUniqueName: self.stepId,
                StepType: self.stepType,
                FormTemplateId: self.formTemplateId,
                Responses: ko.mapping.toJS(self.answer.Responses).toJSON()
            };
        if (bundle.Responses && bundle.Responses.__ko_mapping__) {
            delete bundle.Responses.__ko_mapping__;
        }
        return bundle;
    };
    self.next = function (form) {
        if (!mydhr.Validator.isValid(self.validator))
            return;
        mydhr.Validator.cancelForm(self.validator);
        mydhr.FormFlow.ButtonActions.next(self);
        self.staleAnswer.merge(self.answer.Responses);
        parent.proxy.submitStep(self.bundle()).success(function (data) {
            parent.next(data);
            mydhr.FormFlow.ButtonActions.prepareNext($(".form-section").filter(':visible').last());
        });
    };

    self.startEdit = function (form) {
        mydhr.Validator.setupForm(self.validator);
        mydhr.FormFlow.ButtonActions.edit(self);
        self.needSave(true);
        self.orig = ko.mapping.toJS(form.answer.Responses).toJSON();
    };
    self.edit = function (form) {
        if (!mydhr.Validator.isValid(self.validator))
            return;
        mydhr.Validator.cancelForm(self.validator);
        delete self.orig;
        if (parent.pages.items()[parent.pages.items().length-1].value() == self)
            return null;
        mydhr.FormFlow.ButtonActions.save(self);
        self.staleAnswer.merge(self.answer.Responses);
        self.needSave(false);
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        parent.proxy.submitStepWithoutRender(bundle).success(function (data) {

        });
    };
    self.remove = function (form) {
        delete self.orig;
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        parent.proxy.submitStepWithoutRender(bundle).success(function (data) {

        });
    };
    self.cancel = function (form) {
        mydhr.Validator.cancelForm(self.validator);
        var items = form.answer.Responses;
        var old = self.orig;
        $.each(old, function (index, value) {
            try {
                items.get(index)().Value(value.Value);
            } catch (e) {
                // Nothing
            }
        });
        delete self.orig;
        self.needSave(false);
        mydhr.FormFlow.ButtonActions.cancel(self);
    };
};

mydhr.ViewModels.ShowPageWorkflowStepVm = function(step, parent) {
    var self = this;
    step = step || {};

    self.name = ko.observable(step.Name || 'Test Step');
    self.renderedPage = ko.observable( step.RenderedPage || '<b>rendered html</b>');
    self.stepId = step.StepId || '';
    self.formTemplateId = step.FormTemplateId || '';
    self.workflowId = step.WorkflowId || '00000000-0000-0000-0000-000000000000';
    self.stepVariables = step.StepVariables || [];
    self.stepType = step.StepType || "TestStep";
    self.parentVm = parent;

    self.validator = findSelector(step.RenderedPage);
    if (self.validator) {
        $('#body').on('setupValidation', '#' + self.stepId, function () {
            mydhr.Validator.setupForm(self.validator);
        });
        if (self.validator.customRules)
            mydhr.Validator.setCustomRules(self.validator);
        if (self.validator.changeRules)
            mydhr.Validator.delegateChanges(self.validator);
        if (self.validator.initializeFunction)
            self.validator.initializeFunction();
    }

    self.nextWithHOHValidation = function() {
        var hohExists = self.parentVm.verifyHeadOfHouseholdExists();
        if (hohExists)
            self.next();
        else
            $('#hohMissingModal').modal();
    };

    self.next = function () {
        //var proxy = new mydhr.Data.WorkflowDataProxy();
        //This breaks in ie
        console.log(self);

        if (!mydhr.Validator.isValid(self.validator))
            return;
        mydhr.Validator.cancelForm(self.validator);
        mydhr.FormFlow.ButtonActions.next(self);
        parent.proxy.submitStep({
            WorkflowId: self.workflowId,
            StepUniqueName: self.stepId,
            StepType: self.stepType,
            Responses: {}
        }).success(function (data) {
            parent.next(data);
            mydhr.FormFlow.ButtonActions.prepareNext($(".form-section").filter(':visible').last());
        });
    };
};

mydhr.ViewModels.FormAnswer = function(answer) {
    var self = this;
    answer = answer || {};
    answer.AnswerDate = answer.AnswerDate || '2013-01-01';
    answer.Responses = answer.Responses || {};
    answer.InstanceKey = answer.InstanceKey || '';

    self.InstanceKey = answer.InstanceKey;
    self.InstanceNumber = ko.computed(function () {
        if (self.InstanceKey) {
            return parseInt(self.InstanceKey.toString().substring(9)) + 1;
        }
        return "";
    });
    self.AnswerDate = answer.AnswerDate;
    //self.Responses = new ko.observableDictionary(answer.Responses);
    var observableResponses = ko.mapping.fromJS(answer.Responses);
    for (obj in observableResponses) {
        try {
            if (observableResponses[obj].Value() == "False")
                observableResponses[obj].Value(false);
        } catch (e)
        { }
    }
    self.Responses = ko.observableDictionary(observableResponses);
    self.merge = function (old) {
        var keys = self.Responses.keys()
        $.each(keys, function (index, key) {
            try {
                self.Responses.get(key)().Value(old.get(key)().Value());
            } catch (e) { }
        });
    };
};

mydhr.ViewModels.MultipleFormWorkflowStepVm = function (step, parent) {
    var self = this;
    step = step || {};
    step.Name = step.Name || 'Test Step';
    step.RenderedPage = step.RenderedPage || '<b>rendered html</b>';
    step.StepId = step.StepId || '';
    step.Code = step.Code || '';
    step.Answers = step.Answers || {};
    step.FormTemplateId = step.FormTemplateId || '';
    step.WorkflowId = step.WorkflowId || '00000000-0000-0000-0000-000000000000';
    step.StepType = step.StepType || "TestStep";
    self.parentVm = parent;

    self.name = ko.observable(step.Name);
    self.renderedPage = ko.observable(step.RenderedPage);
    self.stepId = step.StepId;
    self.formTemplateId = step.FormTemplateId;
    var Answers = [];
    for (var i = 0; i < step.Answers.length; i++) {
        Answers.push(new mydhr.ViewModels.FormAnswer(step.Answers[i]));
    }
    self.answer = new mydhr.ViewModels.FormAnswer(step.Answers[0]);
    self.staleAnswer = new mydhr.ViewModels.FormAnswer(step.Answers[0]);
    self.needSave = ko.observable(false);
    parent.membersTracker.push(self.needSave);
    self.stepVariables = step.StepVariables || {};
    self.workflowId = step.WorkflowId;
    self.stepType = step.StepType;
    self.dictionaryKey = null;  // key ued in "pages" dictionary of parent VM

    self.id = [];
    self.id[0] = '#' + self.stepId;
    self.id[1] = self.stepId.split('_')[self.stepId.split('_').length - 1];
    self.memberValidator = mydhr.Validator.household.member;
    self.infoValidator = mydhr.Validator.household.info1;
    $('#body').on('setupValidation', self.id[0] + ' .member, ' + self.id[0],
        { formName: self.id[0], instance: self.id[1] },
        self.memberValidator.setupFormByEvent);
    $('#body').on('setupValidation', self.id[0] + ' .info1',
        { formName: self.id[0], instance: self.id[1] },
        self.infoValidator.setupFormByEvent);
    mydhr.Validator.setCustomRules(self.memberValidator);
    mydhr.Validator.setCustomRules(self.infoValidator);

    self.hoh = ko.computed(function () {
        if (self.answer.InstanceKey == 'instance-0') {
            return true;
        }
        return false;
    });

    self.confirmAge18AndHOH = ko.computed(function () {
        var value = self.answer.Responses.get('householdMemberDOB')().Value();
        if (value == "" || !self.hoh())
            return false;
        try {
            var b = new Date(value);
            var c = new Date(); c.setHours(0); c.setMinutes(0); c.setSeconds(0); c.setMilliseconds(0);
            c.setFullYear(c.getFullYear() - 18);
            if (isNaN(b) || c.getTime() >= b.getTime()) {
                return false;
            }
        } catch (err) {
            return false;
        }
        return true;
    });

    self.instanceKey = ko.computed(function () { return self.answer.InstanceKey });

    self.showInfo = function () {
        if (!mydhr.Validator.isValid(self.memberValidator, false, self.id))
            return;
        self.memberValidator.cancelForm(self.id);
        var nextNotHidden = $('#'+self.stepId).children('.info1').find('.btn-save').css("display") != "none";
        mydhr.FormFlow.ButtonActions.next({ stepId: self.stepId + ' .member' });
        mydhr.FormFlow.ButtonActions.prepareNext($('#' + self.stepId + ' .info1' ), nextNotHidden);
    };

    self.skipToSummary = function (form) {
        parent.skipToSummary();
    }

    self.bundle = function () {
        var responses = {};

        var div = $('#' + self.stepId);
        var instanceKey = div.attr('data-instance');

        self.answer.Responses.get('householdMemberInstanceKey')().Value(instanceKey);

        responses[instanceKey] = ko.mapping.toJS(self.answer.Responses).toJSON();

        var bundle =
            {
                WorkflowId: self.workflowId,
                StepUniqueName: self.stepId.substr(0, 36),
                StepType: self.stepType,
                FormTemplateId: self.formTemplateId,
                Responses: responses,
                StepVariables: self.stepVariables
            };
        if (bundle.Responses[instanceKey] && bundle.Responses[instanceKey].__ko_mapping__) {
            delete bundle.Responses[instanceKey].__ko_mapping__;
        }
        return bundle;
    };
    self.next = function (form) {
        var isInfoValid = mydhr.Validator.isValid(self.infoValidator, false, self.id);
        if (!isInfoValid)
            return;
        else {
            var proceed = self.memberValidator.checkForm(self.id);
            if (proceed[0]) {
                self.infoValidator.cancelForm(self.id);
            } else {
                if (!proceed[1])
                    self.startEditMember(form);
                mydhr.Spacer.scroll($('#' + self.stepId + ' .member'));
                return;
            }
        }
        self.staleAnswer.merge(self.answer.Responses);
        mydhr.FormFlow.ButtonActions.next({ stepId: self.stepId + ' .info1' });
        parent.proxy.submitMultiFormStep(self.bundle()).success(function (data) {
            if (self.hoh()) {
                showQuickQuestion();
            }
            parent.next(data);
            mydhr.FormFlow.ButtonActions.prepareNext($(".form-section").filter(':visible').last());
        });
    };
    self.startEditMember = function (form) {
        self.memberValidator.setupForm(self.id);
        self.needSave(true);
        mydhr.FormFlow.ButtonActions.edit({ stepId: self.stepId + ' .member' });
    };
    self.startEditInfo = function (form) {
        self.infoValidator.setupForm(self.id);
        self.needSave(true);
        mydhr.FormFlow.ButtonActions.edit({ stepId: self.stepId + ' .info1' });
    }
    self.edit = function (form) {
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        self.staleAnswer.merge(self.answer.Responses);
        self.needSave(false);
        parent.proxy.submitMultiFormStepWithoutRender(bundle).success(function (data) {

        });
        return true;
    };
    self.editMember = function (form) {
        var isMemberValid = mydhr.Validator.isValid(self.memberValidator, false, self.id);
        if (!isMemberValid)
            return;
        else {
            var proceed = self.infoValidator.checkForm(self.id);
            if (proceed[0]) {
                self.memberValidator.cancelForm(self.id);
                if (proceed[1])
                    self.infoValidator.setupForm(self.id);
            } else {
                if (!proceed[1])
                    self.startEditInfo(form);
                mydhr.Spacer.scroll($('#' + self.stepId + ' .info1'));
                return;
            }
        }
        mydhr.FormFlow.ButtonActions.save({ stepId: self.stepId + ' .member' });
        self.edit(form);
    }
    self.editInfo = function (form) {
        var isInfoValid = mydhr.Validator.isValid(self.infoValidator, false, self.id);
        if (!isInfoValid)
            return;
        else {
            var proceed = self.memberValidator.checkForm(self.id);
            if (proceed[0]) {
                self.infoValidator.cancelForm(self.id);
            } else {
                if (!proceed[1])
                    self.startEditMember(form);
                mydhr.Spacer.scroll($('#' + self.stepId + ' .member'));
                return;
            }
        }
        mydhr.FormFlow.ButtonActions.save({ stepId: self.stepId + ' .info1' });
        self.edit(form);
    };
    self.cancelMember = function (form) {
        self.memberValidator.cancelForm(self.id);
        self.needSave(false);
        mydhr.FormFlow.ButtonActions.cancel({ stepId: self.stepId + ' .member' });
    };
    self.cancelInfo = function (form) {
        self.infoValidator.cancelForm(self.id);
        self.needSave(false);
        mydhr.FormFlow.ButtonActions.cancel({ stepId: self.stepId + ' .info1' });
    };
    self.confirmRemove = function(form) {
        var instanceKey = $('#'+self.stepId).attr('data-instance');
        if (self.hasRelatedForm("incomeJobIncome", "jobIncomeName", instanceKey) ||
            self.hasRelatedForm("incomeSelfEmploymentIncome", "selfEmploymentIncomeName", instanceKey) ||
            self.hasRelatedForm("incomeRoomAndBoardIncome", "roomAndBoardIncomeName", instanceKey) ||
            self.hasRelatedForm("incomeUnearnedIncome", "unearnedIncomeName", instanceKey) ||
            self.hasRelatedForm("expensesDependentCare", "dependentCareName", instanceKey) ||
            self.hasRelatedForm("expensesChildSupport", "childSupportWhoPays", instanceKey) ||
            self.hasRelatedForm("expensesMedical", "medicalExpenseExpenseIncurredBy", instanceKey) ||
            self.hasRelatedForm("availableFundsCashOnHand", "cashOnHandName", instanceKey) ||
            self.hasRelatedForm("AvailableFundsSavings", "SavingsName", instanceKey) ||
            self.hasRelatedForm("availableFundsChecking", "CheckingName", instanceKey) ||
            self.hasRelatedForm("AvailableFundsInvestments", "InvestmentsName", instanceKey) ||
            self.hasRelatedForm("AvailableFundsRetirement", "RetirementName", instanceKey) ||
            self.hasRelatedForm("availableFundsTrustFunds", "TrustFundsName", instanceKey) ||
            self.hasRelatedForm("availableFundsBurial", "BurialAccountName", instanceKey) ||
            self.hasRelatedForm("availableFundsOther", "OtherName", instanceKey)) {
            //use modal
            mydhr.ThisPage.confirmMemberDelete = self;
            var name = self.answer.Responses.get('householdMemberFirstName')().Value() + " " +
                self.answer.Responses.get('householdMemberLastName')().Value();
            $('#memberModalName').text(name);
            $('#memberConfirmModal').modal('show');
        } else { self.remove(); }
    }
    self.remove = function (form) {
        if (self.instanceKey() == 'instance-0') {
            return null;
        }
        $('#' + self.stepId).find('.btn-remove').trigger('clickRemove');
        parent.membersTracker.remove(self.needSave);
        self.stepVariables["Action"] = "DeleteHouseholdMembers";
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        parent.proxy.submitMultiFormStepWithoutRender(bundle).success(function (data) {
            self.stepVariables["Action"] = null;
            $('#' + self.stepId).hide(1000, function () {
                var div = $('#' + self.stepId);
                var instanceKey = div.attr('data-instance');


                self.removeRelatedForms("availableFundsCashOnHand", "cashOnHandName", instanceKey);
                self.removeRelatedForms("AvailableFundsSavings", "SavingsName", instanceKey);
                self.removeRelatedForms("availableFundsChecking", "CheckingName", instanceKey);
                self.removeRelatedForms("AvailableFundsInvestments", "InvestmentsName", instanceKey);
                self.removeRelatedForms("AvailableFundsRetirement", "RetirementName", instanceKey);
                self.removeRelatedForms("availableFundsTrustFunds", "TrustFundsName", instanceKey);
                self.removeRelatedForms("availableFundsBurial", "BurialAccountName", instanceKey);
                self.removeRelatedForms("availableFundsOther", "OtherName", instanceKey);
                self.removeRelatedForms("incomeJobIncome", "jobIncomeName", instanceKey);
                self.removeRelatedForms("incomeSelfEmploymentIncome", "selfEmploymentIncomeName", instanceKey);
                self.removeRelatedForms("incomeRoomAndBoardIncome", "roomAndBoardIncomeName", instanceKey);
                self.removeRelatedForms("incomeUnearnedIncome", "unearnedIncomeName", instanceKey);
                self.removeRelatedForms("expensesDependentCare", "dependentCareName", instanceKey);
                self.removeRelatedForms("expensesChildSupport", "childSupportWhoPays", instanceKey);
                self.removeRelatedForms("expensesMedical", "medicalExpenseExpenseIncurredBy", instanceKey);

                parent.pages.remove(self.dictionaryKey);

                //Save AC field in case this member was in charge
                var ac = ko.utils.arrayFilter(parent.pages.items(), function (item) {
                    return stringStartsWith(item.key(), "expensesUtilities");
                });
                ko.utils.arrayForEach(ac, function (item) {
                    if (!(parent.pages.items()[parent.pages.items().length - 1] == item)) {
                        item.value().edit();
                    }
                });
            });


        });
    };

    self.removeRelatedForms = function (formDataName, lookupFieldName, lookupFieldValue) {
        var result;
        var array = ko.utils.arrayFilter(parent.pages.items(), function (item) {
            return stringStartsWith(item.key(), formDataName);
        });
        var deleteAnswers = new Array();
        ko.utils.arrayForEach(array, function (item) {
            deleteAnswers = new Array();
            //var fieldVal = item.value().answer.Responses.get(lookupFieldName)().Value();
            ko.utils.arrayForEach(item.value().answers(), function (i) {
                var fieldVal = i.Responses.get(lookupFieldName)().Value();
                if (fieldVal == lookupFieldValue) {
                    //item.value().answers.remove(i);
                    deleteAnswers.push(i);
                }
            });
            var needToSave = false;
            ko.utils.arrayForEach(deleteAnswers, function (i) {
                item.value().answers.remove(i);
                needToSave = true;
            });
            if (needToSave) {
                item.value().edit();
            }
        });

        return result;
    };
    self.hasRelatedForm = function (formDataName, lookupFieldName, lookupFieldValue) {
        var result = false;
        var array = ko.utils.arrayFilter(parent.pages.items(), function (item) {
            return stringStartsWith(item.key(), formDataName);
        });
        for (var i = 0; i < array.length&&!result; i++) {
            var item = array[i];
            for (var j = 0; j < item.value().answers().length && !result; j++) {
                var item2 = item.value().answers()[j];
                if (item2.Responses.get(lookupFieldName)().Value() == lookupFieldValue)
                    result = true;
            }
        }
        return result;
    }
};

mydhr.ViewModels.FormsTableStepVm = function (step, parent) {
    var self = this;
    step = step || {};
    step.Name = step.Name || 'Test Step';
    step.RenderedPage = step.RenderedPage || '<b>rendered html</b>';
    step.StepId = step.StepId || '';
    step.Code = step.Code || '';
    step.Answers = step.Answers || {};
    step.FormTemplateId = step.FormTemplateId || '';
    step.WorkflowId = step.WorkflowId || '00000000-0000-0000-0000-000000000000';
    step.StepType = step.StepType || "TestStep";

    self.name = ko.observable(step.Name);
    self.renderedPage = ko.observable(step.RenderedPage);
    self.stepId = step.StepId;
    self.formTemplateId = step.FormTemplateId;
    self.answers = ko.observableArray();
    self.staleAnswers = ko.observableArray();
    self.needSave = ko.observable(false);
    self.parentVm = parent;
    self.formsToDelete = [];

    self.nextInstance = 0;

    self.blankForm = step.BlankAnswer;
    self.currentForm = ko.observable(new mydhr.ViewModels.FormAnswer(self.blankForm));
    self.isNewForm = true;

    self.validator = findSelector(step.RenderedPage);
    if (self.validator) {
        $('#body').on('setupValidation', '#' + self.stepId, function () {
            mydhr.Validator.setupForm(self.validator);
        });
        if (self.validator.customRules)
            mydhr.Validator.setCustomRules(self.validator);
        if (self.validator.changeRules)
            mydhr.Validator.delegateChanges(self.validator);
        if (self.validator.changeModalRules)
            mydhr.Validator.delegateChanges(self.validator, true);
        if (self.validator.initializeFunction)
            self.validator.initializeFunction();
    }

    for (var i = 0; i < step.Answers.length; i++) {
        var ans = new mydhr.ViewModels.FormAnswer(step.Answers[i]);
        var ans2 = new mydhr.ViewModels.FormAnswer(step.Answers[i]);
        if (ans.InstanceNumber() > self.nextInstance) {      // InstanceNumber is 1 based, nextInstance is 0 based - so if InstanceNumber = 1 (first instance) then nextInstance should also be 1 (second instance)
            self.nextInstance = ans.InstanceNumber();
        }
        self.answers.push(ans);
        self.staleAnswers.push(ans2);
    }
    //self.answer = new mydhr.ViewModels.FormAnswer(step.Answers[0]);
    self.stepVariables = step.StepVariables || {};
    //FormsToDelete tells server what forms actually need to be deleted
    self.stepVariables["FormsToDelete"] = [];
    //FormsSaved and FormsDeleted are used locally to track changes for cancel button
    self.stepVariables["FormsSaved"] = [];
    self.stepVariables["FormsDeleted"] = [];
    self.workflowId = step.WorkflowId;
    self.stepType = step.StepType;

    self.startAddForm = function () {
        self.currentForm(new mydhr.ViewModels.FormAnswer(self.blankForm));
        mydhr.FormFlow.initializeForm('#' + $('#' + self.stepId).find('.modal').prop('id'));
        mydhr.Validator.setupModal(self.validator);
        self.isNewForm = true;
    };

    self.startEditForm = function (form) {
        self.tempResponses = ko.mapping.toJS(form.Responses).toJSON();    // save existing values in case we decide not to save
        if (self.tempResponses && self.tempResponses.__ko_mapping__) {
            delete self.tempResponses.__ko_mapping__;
        }
        if (!form.orig)
            form.orig = ko.mapping.toJS(form.Responses).toJSON();
        self.currentForm(form);
        mydhr.FormFlow.initializeForm('#' + $('#' + self.stepId).find('.modal').prop('id'));
        mydhr.Validator.setupModal(self.validator);
        self.isNewForm = false;
    };
    self.cancelSaveForm = function (form) {
        mydhr.Validator.cancelModal(self.validator);
        $('#' + self.validator.modal).modal('hide');
        if (!self.isNewForm) {      // if we are editing an existing form and cancel, need to restore old values

            $.each(self.tempResponses, function (index, value) {
                form.Responses.get(index)().Value(value.Value);
            });

        }
    };
    self.saveForm = function () {
        if (!mydhr.Validator.isValid(self.validator, true))
            return;
        mydhr.Validator.cancelModal(self.validator);
        $('#' + self.validator.modal).modal('hide');
        if (self.isNewForm) {       // if we are adding a form, add it to list, otherwise just updating the view model is sufficient
            self.currentForm().InstanceKey = "instance_" + self.nextInstance.toString();
            self.answers.push(self.currentForm());
            self.stepVariables["FormsSaved"].push(self.currentForm());
            self.nextInstance++;
        }
        mydhr.Validator.isValid(self.validator);
    };
    self.deleteForm = function (form) {
        self.answers.remove(form);
        self.stepVariables["FormsToDelete"].push(form.InstanceKey);
        self.stepVariables["FormsDeleted"].push(form);
    };
    self.bundle = function () {
        var responses = {};

        var div = $('#' + self.stepId);
        //var instanceKey = div.attr('data-instance');

        //responses[instanceKey] = ko.mapping.toJS(self.answer.Responses).toJSON();
        $.each(self.answers(), function(index, value) {
            responses[value.InstanceKey] = ko.mapping.toJS(value.Responses).toJSON();
            if (responses[value.InstanceKey] && responses[value.InstanceKey].__ko_mapping__) {
                delete responses[value.InstanceKey].__ko_mapping__;
            }
        });

        var bundle =
            {
                WorkflowId: self.workflowId,
                StepUniqueName: self.stepId,
                StepType: self.stepType,
                FormTemplateId: self.formTemplateId,
                Responses: responses,
                StepVariables: self.stepVariables
            };
        return bundle;
    };

    self.next = function (form) {
        if (!mydhr.Validator.isValid(self.validator))
            return;
        mydhr.Validator.cancelForm(self.validator);
        mydhr.FormFlow.ButtonActions.next(self);
        //Clear the tracking of any alterations
        ko.utils.arrayForEach(self.answers(), function (item) {
            delete item.orig;
        });
        self.stepVariables["FormsDeleted"] = [];
        self.stepVariables["FormsSaved"] = [];

        self.staleAnswers.removeAll();
        ko.utils.arrayForEach(self.answers(), function (item) {
            var map = { Responses: ko.mapping.toJS(item.Responses).toJSON() };
            var temp = new mydhr.ViewModels.FormAnswer(map);
            self.staleAnswers.push(temp);
        });
        //This breaks in ie
        //console.log(self);
        parent.proxy.submitMultiFormStep(self.bundle()).success(function (data) {
            parent.next(data);
            mydhr.FormFlow.ButtonActions.prepareNext($(".form-section").filter(':visible').last());
        });
    };

    self.startEdit = function (form) {
        mydhr.Validator.setupForm(self.validator);
        self.needSave(true);
        mydhr.FormFlow.ButtonActions.edit(self);
    };

    self.edit = function (form) {
        if (!mydhr.Validator.isValid(self.validator))
            return;
        mydhr.Validator.cancelForm(self.validator);
        mydhr.FormFlow.ButtonActions.save(self);
        //Clear the tracking of any alterations
        ko.utils.arrayForEach(self.answers(), function (item) {
            delete item.orig;
        });
        self.stepVariables["FormsDeleted"] = [];
        self.stepVariables["FormsSaved"] = [];
        self.staleAnswers.removeAll();
        ko.utils.arrayForEach(self.answers(), function (item) {
            var map = { Responses: ko.mapping.toJS(item.Responses).toJSON() };
            var temp = new mydhr.ViewModels.FormAnswer(map);
            self.staleAnswers.push(temp);
        });
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        self.needSave(false);
        parent.proxy.submitMultiFormStepWithoutRender(bundle).success(function (data) {
            self.stepVariables["FormsToDelete"] = [];
        });

    };

    self.cancel = function (form) {
        mydhr.Validator.cancelForm(self.validator);

        //Restore any entries that were deleted
        ko.utils.arrayForEach(self.stepVariables["FormsDeleted"], function (item) {
            self.answers.push(item);
        });
        //Restore any values in entries that were altered
        needResave = false;
        self.needSave(false);
        ko.utils.arrayForEach(self.answers(), function(item) {
            if (item.orig) {
                $.each(item.orig, function (index, value) {
                    try {
                        item.Responses.get(index)().Value(value.Value);
                        if (item.Responses.get(index)().Value() != value.Value) {
                            needResave = true;
                            self.stepVariables["FormsSaved"].push(item);
                            //Set entry for deletion because a value could not be restored; see below
                        }
                    } catch (e) {
                        //Nothing
                    }
                });
                delete item.orig;
            }
        });
        //Remove any entries that were created
        ko.utils.arrayForEach(self.stepVariables["FormsSaved"], function (item) {
            self.answers.remove(item);
        });
        //Clean up
        self.stepVariables["FormsDeleted"] = [];
        self.stepVariables["FormsSaved"] = [];
        //Resave if a value in a form could not be reset to its original value
        //Usually occurs if form name tries to reset to an instance that has been deleted
        if (needResave) {
            self.edit();
        }
        //self.stepVariables["FormsToDelete"] = [];
        mydhr.FormFlow.ButtonActions.cancel(self);
    };
};

mydhr.ViewModels.HouseholdFlagsStepVm = function (step, parent) {
    var self = this;
    step = step || {};
    step.Name = step.Name || 'Test Step';
    step.RenderedPage = step.RenderedPage || '<b>rendered html</b>';
    step.StepId = step.StepId || '';
    step.Code = step.Code || '';
    step.Answer = step.Answer || {};
    step.FormTemplateId = step.FormTemplateId || '';
    step.WorkflowId = step.WorkflowId || '00000000-0000-0000-0000-000000000000';
    step.StepType = step.StepType || "TestStep";

    self.name = ko.observable(step.Name);
    self.renderedPage = ko.observable(step.RenderedPage);
    self.stepId = step.StepId;
    self.formTemplateId = step.FormTemplateId;
    self.answer = new mydhr.ViewModels.FormAnswer(step.Answer);
    self.staleAnswer = new mydhr.ViewModels.FormAnswer(step.Answer);
    self.stepVariables = step.StepVariables || [];
    self.workflowId = step.WorkflowId;
    self.stepType = step.StepType;

    self.bundle = function () {

        var bundle =
            {
                WorkflowId: self.workflowId,
                StepUniqueName: self.stepId,
                StepType: self.stepType,
                FormTemplateId: self.formTemplateId,
                Responses: ko.mapping.toJS(self.answer.Responses).toJSON()
            };
        if (bundle.Responses && bundle.Responses.__ko_mapping__) {
            delete bundle.Responses.__ko_mapping__;
        }
        return bundle;
    };
    self.next = function (form) {
        //This breaks in ie
        //console.log(self);
        mydhr.FormFlow.ButtonActions.next(self);
        delete self.orig;
        parent.proxy.submitStep(self.bundle()).success(function (data) {
            parent.next(data);
            mydhr.FormFlow.ButtonActions.prepareNext($(".form-section").filter(':visible').last());
        });
    };
    self.remove = function (form) {
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        parent.proxy.submitStepWithoutRender(bundle).success(function (data) {
        });
    };
    self.startEdit = function (form) {
        mydhr.FormFlow.ButtonActions.edit(self);
        self.orig = ko.mapping.toJS(form.answer.Responses).toJSON();
    };
    self.edit = function (form) {
        mydhr.FormFlow.ButtonActions.save(self);
        delete self.orig;
        var bundle = self.bundle();
        bundle.UnorderedExecute = true;
        parent.proxy.submitStepWithoutRender(bundle).success(function (data) {

        });
    };
    self.cancel = function (form) {
        mydhr.FormFlow.ButtonActions.cancel(self);
        var items = form.answer.Responses;
        var old = self.orig;
        $.each(old, function (index, value) {
            try {
                items.get(index)().Value(value.Value);
            } catch (e) {
                //Nothing
            }
        });
        delete self.orig;
    };
};
;
