parsley error on web app

by bradleytrager

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/2.2.1/knockout-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/parsley.js/1.1.16/parsley.min.js"></script>
<form>
<span><strong>Where</strong> to send the distribution</span>

    <div class="row-fluid">
        <div>
            <div class="parsley-container"></div>
            <div class="span3">
                <input class="span12" type="text" pattern="(^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$)|(^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z]|[A-Za-z][A-Za-z\-]*[A-Za-z])$)" id="Recipient_FTP_Address" data-bind="value:ftp.address" placeholder="ftp address" required />
            </div>
            <div class="note large">FTP Address aka: Host or URL
                <br/>i.e.:ftp.jstor.org, 71.23.43.218</div>
        </div>
    </div>
    <div class="row-fluid">
        <div class="span3">
            <input class="span12" type="text" pattern="(/[a-zA-Z0-9])+" data-bind="value:ftp.path" id="FTP_Path" placeholder="path (optional)" />
        </div>
        <div class="note large">Path within FTP directory
            <br/>i.e.:/www/domain</div>
    </div>
    <div>
        <div class="parsley-container"></div>
        <div class="row-fluid">
            <div class="span3">
                <input class="span12" type="text" id="FTP_Username" data-bind="value:ftp.username" placeholder="username" required />
            </div>
            <div class="note large">FTP Username
                <br />&nbsp;</div>
        </div>
    </div>
    <div>
        <div class="parsley-container"></div>
        <div class="row-fluid">
            <div class="span3">
                <input class="span12" type="text" data-bind="value:ftp.password" id="FTP_Password" placeholder="password" required />
            </div>
            <div class="note large">FTP Password</div>
        </div>
    </div>
    <button...

JavaScript

$(function () {
    $('form').parsley({
        errors: {
            container: function (element, isRadioOrCheckbox) {
                //Use jQuery to select the first preceding div with class="parsley-container"
                var $container = element.parent().parent().parent().find("div.parsley-container").first();
                return $container;
            }
        }
    });
    $("#submit_btn").click(function () {
        console.log("submit");
        $("form").parsley('validate');
    });
});
$(function () {
    var vm = new viewModel();
    ko.applyBindings(vm);

});
var DAYS_OF_WEEK = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

function coalesceJSON(data, data2) {
    var source1 = data.substring(0, data.length - 1);
    var source2 = data2.substring(1, data2.length);
    return source1 + ',' + source2;
}

function Recipient() {
    var self = this;
    self.id = ko.observable();
    self.name = ko.observable();
    self.contactName = ko.observable();
    self.contactEmail = ko.observable();
    self.contactPhone = ko.observable();
    self.version = ko.observable();
}

function parseDate(str) {
    var y = str.substr(6, 4),
        m = str.substr(0, 2) - 1,
        d = str.substr(3, 2);
    return new Date(y, m, d);
}

function pluralizeString(number, baseString) {
    if (number > 1) {
        return baseString + "s";
    } else {
        return baseString;
    }
}
/*Takes an array and creates a comma separated string with "and" at
the end instead of a comma*/
function pluralizeArray(array) {
    var string = array.join(", ");
    if (array.length > 1) {
        var lastComma = string.lastIndexOf(",");
        var partOne = string.substring(0, lastComma);
        var partTwo = string.substring(lastComma + 1, string.length);
        var pluralizedString = partOne + " and" + partTwo;
        return pluralizedString;
    } else {
        return string;
    }
}

function viewModel() {
    var self = this;
   ...