//Add a the phoneUS function to our jQuery Validation Plugin
jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
phone_number = phone_number.replace(/\s+/g, "");
return this.optional(element) || phone_number.length > 9 &&
phone_number.match(/^(\+?1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please specify a valid phone number");
$(document).ready(function() {
//Form Validation using jQuery Validation Plugin
$(".socrataForm").validate({
rules: {
//Each "rule" corresponds to an input tag "name" field in the form.
organization_name: "required",
organization_type: "required",
market_name: "required",
market_mailing_address: "required",
market_phone_number: {
required: true,
phoneUS: true
},
market_email_address: {
required: true,
email: true
},
public_phone_number: {
required: true,
phoneUS: true
},
public_email_address: {
required: true,
email: true
},
public_website: {
required: true,
url: true
},
public_address_1: "required",
public_hours_1: "required",
//The following address and hour fields are hidden by default.
//The plugin automatically converts the requirement to false if the field is hidden.
public_address_2: "required",
public_hours_2: "required",
public_address_3: "required",
public_hours_3: "required",
public_address_4: "required",
public_hours_4: "required",
public_address_5: "required",
public_hours_5: "required",
org_gov_entity: "required",
org_health_care_delivery: "required",
org_medicaid_chp_app_assist: "required",
org_under_501c: "required",
priv_sec_screen_application_counselors: "required",
priv_sec_handle_protect_pii: "required",
priv_sec_assist_health_coverage: "required",
//The following assist fields follow the same rule as the previous address and hour fields.
assist_if_yes: "required",
assist_if_no: "required"
//Require the reCAPTCHA field
},
messages: {
organization_name: {
required: "
Organization name is required"
},
organization_type: {
required: "
Organization type is required"
},
market_phone_number: {
required: "
Phone number is required"
},
market_email_address: {
required: "
Email address is required"
},
public_phone_number: {
required: "
Phone number is required"
},
public_email_address: {
required: "
Email address is required"
},
public_website: {
required: "
Web site address is required"
}
}
});
//Fields assist_if_yes and assist_if_no are part of a show/hide and required/!required toggle.
//The toggle operates on the user's answer to priv_sec_assist_health_coverage.
//Hide the assist_if_no since assist_if_yes is the default.
$('.ifno').hide();
$('.ifyes').hide();
//Select and set up for change.
$('#form_field_priv_sec_assist_health_coverage').change(function() {
//If the answer is yes...
if ($('#form_field_priv_sec_assist_health_coverage').find('option:selected').text() === 'Yes') {
$(".ifno").hide();
$(".ifyes").show();
$("assist_if_no").rules("remove", "required");
$("assist_if_yes").rules("add", "required");
} else if ($('#form_field_priv_sec_assist_health_coverage').find('option:selected').text() === 'Select One') {
$(".ifno").hide();
$(".ifyes").hide();
$("assist_if_yes").rules("add", "required");
}
//If the answer is no...
else {
$(".ifyes").hide()
$(".ifno").show()
$("assist_if_yes").rules("remove", "required");
$("assist_if_no").rules("add", "required");
}
});
/* Create an array of the 5 location divs. Each div contains a corresponding address and hour input field, so create arrays of those as well. */
var locations = ['#location1', '#location2', '#location3', '#location4', '#location5'];
var addressFields = ['public_address_2', 'public_address_3', 'public_address_4', 'public_address_5'];
var hourFields = ['public_hours_2', 'public_hours_3', 'public_hours_4', 'public_hours_5'];
//Initialize by hiding all divs in the array except the first.
for (var i = 1; i < locations.length; i++) {
$(locations[i]).hide();
}
//Initialize an int counter for the last div shown.
var divnum = 0;
//Initialize the "add" and "remove" actions...
$('#location1').after("
");
$('#location2').before("");
//Hide the removeDiv before we begin
$('#removeDiv').hide();
//Finally, implement functionality for the "add" and "remove" actions.
$('#add').click(function(e) {
if (divnum < 4) {
divnum += 1;
//$(locations[divnum]).show();
$(locations[divnum]).show('slow', function() {
// Animation complete
});
$('#addDiv').insertAfter(locations[divnum]);
$('#removeDiv').show()
.insertBefore(locations[divnum]);
}
if (divnum == 4) {
$('#addDiv').hide();
}
e.preventDefault();
});
$('#remove').click(function(e) {
if (divnum > 0) {
//$(locations[divnum]).hide();
$(locations[divnum]).hide('slow', function() {
// Animation complete
});
divnum -= 1;
$('#removeDiv').insertBefore(locations[divnum]);
$('#addDiv').show()
.insertAfter(locations[divnum]);
}
if (divnum == 0) {
$('#removeDiv').hide();
}
e.preventDefault();
});
$('#form_field_assist_if_yes').maxlength({
showFeedback: 'active',
max: 250
});
$('#form_field_assist_if_no').maxlength({
showFeedback: 'active',
max: 250
});
});
$("#cacsubmit").click(function() {
if (!$(".socrataForm").validate()) { // Not Valid
return false;
} else {
$(".socrataForm").submit()
}
});
jQuery.validator.addMethod("zipcodeUS", function(value, element) {
return this.optional(element) || /\d{5}-\d{4}$|^\d{5}$/.test(value);
}, "Please enter a valid zip code");
$(document).ready(function() {
//Form Validation using jQuery Validation Plugin
$(".socrataForm-champion").validate({
rules: {
//Each "rule" corresponds to an input tag in the form.
organization_name: "required",
point_of_contact: "required",
email: {
required: true,
email: true
},
city: "required",
state: "required",
zip: {
required: true,
zipcodeUS: true
}
},
messages: {
organization_name: {
required: "
Organization name is required"
},
point_of_contact: {
required: "
Point of contact is required"
},
city: {
required: "
City name is required"
},
email: {
required: "
Email address is required"
},
state: {
required: "
Please select the state"
},
zip: {
required: "
Zip code is required"
}
}
});
$("#pledgesubmit").click(function() {
if (!$(".socrataForm-champion").validate()) { // Not Valid
return false;
} else {
$(".socrataForm-champion").submit();
}
});
});
// polyfill for Array.isArray()
if (!Array.isArray) {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
// force to HTTPS
if ($('#cac-registration-form').length > 0 && window.location.protocol != "https:") {
window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
}
// the following line suports CORS requests in IE 8 and 9
/*!
* jQuery-ajaxTransport-XDomainRequest - v1.0.3 - 2014-06-06
* https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
* Copyright (c) 2014 Jason Moon (@JSONMOON)
* Licensed MIT (/blob/master/LICENSE.txt)
*/
(function(a){if(typeof define==='function'&&define.amd){define(['jquery'],a)}else if(typeof exports==='object'){module.exports=a(require('jquery'))}else{a(jQuery)}}(function($){if($.support.cors||!$.ajaxTransport||!window.XDomainRequest){return}var n=/^https?:\/\//i;var o=/^get|post$/i;var p=new RegExp('^'+location.protocol,'i');$.ajaxTransport('* text html xml json',function(j,k,l){if(!j.crossDomain||!j.async||!o.test(j.type)||!n.test(j.url)||!p.test(j.url)){return}var m=null;return{send:function(f,g){var h='';var i=(k.dataType||'').toLowerCase();m=new XDomainRequest();if(/^\d+$/.test(k.timeout)){m.timeout=k.timeout}m.ontimeout=function(){g(500,'timeout')};m.onload=function(){var a='Content-Length: '+m.responseText.length+'\r\nContent-Type: '+m.contentType;var b={code:200,message:'success'};var c={text:m.responseText};try{if(i==='html'||/text\/html/i.test(m.contentType)){c.html=m.responseText}else if(i==='json'||(i!=='text'&&/\/json/i.test(m.contentType))){try{c.json=$.parseJSON(m.responseText)}catch(e){b.code=500;b.message='parseerror'}}else if(i==='xml'||(i!=='text'&&/\/xml/i.test(m.contentType))){var d=new ActiveXObject('Microsoft.XMLDOM');d.async=false;try{d.loadXML(m.responseText)}catch(e){d=undefined}if(!d||!d.documentElement||d.getElementsByTagName('parsererror').length){b.code=500;b.message='parseerror';throw'Invalid XML: '+m.responseText;}c.xml=d}}catch(parseMessage){throw parseMessage;}finally{g(b.code,b.message,c,a)}};m.onprogress=function(){};m.onerror=function(){g(500,'error',{text:m.responseText})};if(k.data){h=($.type(k.data)==='string')?k.data:$.param(k.data)}m.open(j.type,j.url);m.send(h)},abort:function(){if(m){m.abort()}}}})}));
// data model for all registration form functionality
var cacRegistration = {
formId: 'cac-registration-form',
datasets: {}
};
// set all Socrata destinations
cacRegistration.datasets['registration'] = 'https://data.healthcare.gov/views/pun6-u22w/rows.html?method=createForm&successRedirect=https%3A%2F%2Fdata.healthcare.gov%2Fresource%2Fcac-form-submission-result.json%3F%2524where%3Dresult_status%253D%2527success%2527&errorRedirect=https%3A%2F%2Fdata.healthcare.gov%2Fresource%2Fcac-form-submission-result.json%3F%2524where%3Dresult_status%253D%2527failure%2527';
cacRegistration.datasets['location'] = 'https://data.healthcare.gov/views/e8mn-2jyk/rows.html?method=createForm&successRedirect=https%3A%2F%2Fdata.healthcare.gov%2Fresource%2Fcac-form-submission-result.json%3F%2524where%3Dresult_status%253D%2527success%2527&errorRedirect=https%3A%2F%2Fdata.healthcare.gov%2Fresource%2Fcac-form-submission-result.json%3F%2524where%3Dresult_status%253D%2527failure%2527';
cacRegistration.pingUrl = 'https://data.healthcare.gov/resource/cac-form-submission-result.json';
cacRegistration.systemUp = false;
cacRegistration.browsers = {};
cacRegistration.browsers.isSafari = function () {
return navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1;
};
cacRegistration.ajaxStatus = {};
cacRegistration.messages = [];
// add onload handler, since jQuery is not available yet
cacRegistration.addOnLoad = function (handler) {
if (typeof window.onload !== 'function') {
// add new onload function
window.onload = handler;
} else {
// onload already exists; execute new onload function after existing
var onload = window.onload;
window.onload = function () {
onload();
handler();
}
}
};
// get the registration form element
cacRegistration.getForm = function () {
var formId = this.formId;
if (formId) {
return $('#' + formId);
}
};
// get an array of all datasets used in the form
// each dataset will appear at most once
cacRegistration.getDistinctDatasets = function (form) {
var datasets = [];
if (form) {
var datasetElements = $(form).find('[data-dataset]');
for (var i = 0; i < datasetElements.length; i++) {
var datasetElement = datasetElements[i];
var datasetId = $(datasetElement).attr('data-dataset');
if (datasetId && $.inArray(datasetId, datasets) < 0) {
datasets.push(datasetId);
}
}
}
return datasets;
};
$(document).ajaxSend(function (event, jqXHR, ajaxOptions) {
var id = cacRegistration.generateUUIDv4();
// record the status before going out
cacRegistration.ajaxStatus[id] = jqXHR.readyState;
jqXHR.xRequestId = id;
});
// handle the sumission of form data to a parituclar dataset
cacRegistration.submitForm = function (destination, data, callback) {
if (destination && data) {
$.ajax({
type: 'post',
url: destination,
data: data,
contentType: 'text/plain',
success: function (data) {
if (callback) {
var err = undefined;
if (data) {
if (Array.isArray(data)) {
data = data.pop();
}
if (!data.hasOwnProperty('outcome') || data.outcome !== true) {
err = new Error('problem submitting the form');
}
} else {
err = new Error('missing submission result');
}
callback(err);
}
},
error: function (jqXHR, textStatus, errorThrown) {
if (callback) {
var isCORSRequest = function () {
var id = jqXHR.xRequestId;
var recordedStatus = cacRegistration.ajaxStatus[id];
if (recordedStatus === null || recordedStatus === undefined) {
recordedStatus = jqXHR.readyState - 1;
}
return cacRegistration.systemUp === true &&
cacRegistration.browsers.isSafari() &&
jqXHR.status === 0 &&
// if the readyState is less than recordedStatus,
// then the browser manually changed the state;
// this indicates a possible CORS failure
recordedStatus > jqXHR.readyState &&
jqXHR.readyState === 0;
};
if (isCORSRequest()) {
callback();
} else {
var errMessage = 'error: ' + textStatus + ' - ' +
errorThrown;
callback(new Error(errMessage));
}
}
}
});
}
};
// submit the main body of the form (anything not in a repeatable)
cacRegistration.processMainSubmission = function (form, callback) {
if (!form) {
return;
}
// get all possible datasets for the form
var datasets = cacRegistration.getDistinctDatasets(form);
$.each(datasets, function (index, value) {
// get all elements that get submitted to this data set that are not
// part of repeating element; repeating elements will be submitted
// individually
var datasetSelector = '[data-dataset=' + value + ']';
var matchingElements = form.find(datasetSelector + ':not(.repeatable.subform *):not(.repeatable > .template *)');
if (matchingElements.length > 0) {
var postData = {};
// find the appropriate destination for this data
var postDestination = cacRegistration.datasets[value];
// need to use JSON object, not querystring in order to support IE8
// not sending content-type header in AJAX request
for (var i = 0; i < matchingElements.length; i++) {
var element = $(matchingElements[i]);
var elementType = $(element).attr('type');
if ((elementType != 'radio' && elementType != 'checkbox') || $(element).is(':checked')) {
postData[element.attr('name')] = element.val();
}
}
// submit data to dataset
cacRegistration.submitForm(postDestination, JSON.stringify(postData), callback);
}
});
};
// submit the repeatable sections (treat as sub-forms)
cacRegistration.processRepeatableSubmissions = function (form, callback) {
if (!form) {
return;
}
// iterate over each repeatable sections within the form
var repeatableSections = $(form).find('.repeatable.subform .display > [data-index]')
.get();
$.each(repeatableSections, function (index, section) {
// iterate over the datasets that apply to this particular section
var datasets = cacRegistration.getDistinctDatasets(section);
if (datasets && datasets.length > 0) {
$.each(datasets, function (index, dataset) {
// find any matching form elements in this section
var matchingElements = $(section).find('[data-dataset=' +
dataset + ']');
if (matchingElements.length > 0) {
var dataObj = {};
var postDestination = cacRegistration.datasets[dataset];
var postData;
// build a custom data object that uses the original name,
// not the auto-generated repeatable name
// (repeatables have unique names to handle things like
// radio buttons)
for (var i = 0; i < matchingElements.length; i++) {
var element = matchingElements[i];
var elementType = $(element).attr('type');
if ((elementType != 'radio' && elementType != 'checkbox') || $(element).is(':checked')) {
var name = $(element).attr('data-original-name');
var value = $(element).val();
dataObj[name] = value;
}
}
// need to use JSON object, not querystring in order to support IE8
// not sending content-type header in AJAX request
postData = JSON.stringify(dataObj);
// submit data to the dataset
cacRegistration.submitForm(postDestination, postData,
callback);
}
});
}
});
};
// process the form submission event
cacRegistration.processSubmission = function (form) {
if (!form) {
return;
}
var numRepeatables = $(form).find('.repeatable.subform > .display > .repeated').length;
var totalSubmissions = numRepeatables + 1;
cacRegistration.messages.push("starting new submission...");
var callback = function (err) {
if (err) {
if (!Array.isArray(err)) {
err = [err];
}
cacRegistration.showErrorMessage('There was a problem submitting the form. Please try again.');
cacRegistration.enableForm();
cacRegistration.messages.push(JSON.stringify(err));
} else {
cacRegistration.messages.push("successfully completed submission");
window.location = "http://marketplace.cms.gov/technical-assistance-resources/assister-programs/form-success-cac.html";
}
};
var after = function (times, func) {
var errors = [];
return function () {
var firstArg = arguments[0];
if (firstArg) {
errors.push(firstArg);
}
if (--times < 1) {
return func.call(this, (errors.length > 0) ? errors : undefined);
}
};
};
var whenDone = after(totalSubmissions, callback);
cacRegistration.processMainSubmission(form, whenDone);
cacRegistration.processRepeatableSubmissions(form, whenDone);
};
cacRegistration.getFormattedFieldValue = function (field) {
if (!field) {
return;
}
if (field.val()) {
// if the field already has a value, use it
return field.val();
}
// no field value, build it from the format string
var formatStr = field.attr('data-format');
var resultStr = formatStr;
var indexedParents = field.parents('[data-index]');
var idSuffix = '';
if (indexedParents.length > 0) {
for (var i = 0; i < indexedParents.length; i++) {
var indexVal = $(indexedParents[i]).attr('data-index');
idSuffix += '_' + indexVal;
}
}
if (formatStr) {
var paramRegx = /({)(\w+)(})/g;
var placeholder;
// split the placeholders
while ((placeholder = paramRegx.exec(formatStr)) !== null) {
// use the placeholders to get the data reference
var dataElementName = placeholder[2];
var dataElementVal = field.attr('data-' + dataElementName);
if (dataElementVal) {
// get the value of the referenced field
var dataElementId = '#' + dataElementVal + idSuffix;
var valueElement = $(dataElementId);
var value = valueElement.val();
if (!value && valueElement.attr('data-format')) {
// value does not exist, but can be generated; generate it
value = cacRegistration.getFormattedFieldValue(valueElement);
}
// replace the placeholder with the generated value
resultStr = resultStr.replace(placeholder[0], value);
}
}
}
// store the result in the value
field.val(resultStr);
// return the result
return resultStr;
}
cacRegistration.processFormattedFields = function (form) {
if (!form) {
return;
}
var formattedFields = form.find('[data-format]');
// reset the values (in case anything may have changed)
formattedFields.val('');
// set the value for each field
for (var i = 0; i < formattedFields.length; i++) {
var field = $(formattedFields[i]);
if (field && !field.val()) {
cacRegistration.getFormattedFieldValue($(field));
}
}
};
cacRegistration.processJsonArrayFields = function (form) {
if (!form) {
return;
}
var jsonContainers = form.find('.json-array');
if (jsonContainers.length > 0) {
for (var i = 0; i < jsonContainers.length; i++) {
var container = jsonContainers[i];
var field = $(container).find('.array-value');
var inputs = $(container).find('.display input, .display select, .display textarea');
var arr = [];
field.val('');
if (inputs.length > 0) {
for (var j = 0; j < inputs.length; j++) {
arr.push($(inputs[j]).val());
}
}
field.val(JSON.stringify(arr));
}
}
};
cacRegistration.generateUUIDv4 = function () {
var format = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
var legalY = ['8', '9', 'A', 'B'];
return format.replace(/[xy]/g, function (char) {
var rand, val;
if (char == 'y') {
rand = Math.floor(Math.random() * legalY.length);
val = legalY[rand];
} else {
rand = Math.random() * 16 | 0;
val = rand.toString(16);
}
return val;
});
};
cacRegistration.getTimestamp = function () {
return (new Date()).toGMTString();
};
cacRegistration.processAutoPopulate = function (form) {
if (!form) {
return;
}
var autoPopulatedInputs = form.find('[data-populate]');
if (autoPopulatedInputs.length > 0) {
for (var i = 0; i < autoPopulatedInputs.length; i++) {
var input = autoPopulatedInputs[i];
var type = $(input).attr('data-populate');
// determine what to auto-populate
// (only limited values are supported)
if (type) {
if (type == 'id') {
// only set ID value if it is not already set
if (!$(input).val()) {
var id = cacRegistration.generateUUIDv4();
$(input).val(id);
}
} else if (type == 'timestamp') {
// always set timestamp on submit
var timestamp = cacRegistration.getTimestamp();
$(input).val(timestamp);
}
// else unknown
}
}
}
};
cacRegistration.processAutoReference = function (form) {
if (!form) {
return;
}
var autoReferencedInputs = form.find('[data-reference]');
if (autoReferencedInputs.length > 0) {
for (var i = 0; i < autoReferencedInputs.length; i++) {
var input = autoReferencedInputs[i];
var reference = $(input).attr('data-reference');
if (reference) {
var referencedElem = $(reference);
if (referencedElem.length > 0) {
// set this element to referenced element value
$(input).val(referencedElem.val());
}
// else unknown
}
}
}
};
cacRegistration.processFields = function (form) {
if (!form) {
return;
}
cacRegistration.processFormattedFields(form);
cacRegistration.processJsonArrayFields(form);
cacRegistration.processAutoPopulate(form);
cacRegistration.processAutoReference(form);
};
cacRegistration.registerSelectToggles = function (target) {
if (!target) {
target = $('body');
}
target.find('.toggle-action.hide').hide().removeClass('hide');
target.find('.select-toggle select').change(function () {
var toggleWrapper = $(this).parents('.select-toggle').get(0);
var value = $(this).find('option:selected').text();
var toggleTarget = $(toggleWrapper).find('.toggle-action[data-showon="' + value + '"]');
// hide all
$(toggleWrapper).find('.toggle-action').hide();
// show only the one
toggleTarget.show();
toggleTarget.find(':input:visible:enabled').focus();
});
};
cacRegistration.registerToggles = function (target) {
if (!target) {
target = $('body');
}
// allow js to control if an element is hidden or not
target.find('.toggle-action.hide').hide().removeClass('hide');
target.find('.toggle [data-toggleaction="show"]').change(function () {
var toggle = $(this).parents('.toggle').get(0);
$(toggle).children('.toggle-action').show();
});
target.find('.toggle [data-toggleaction="hide"]').change(function () {
var toggle = $(this).parents('.toggle').get(0);
$(toggle).children('.toggle-action').hide();
});
var getToggleCheckedAction = function (toggleAction, isChecked) {
var checkedAction;
if ($(toggleAction).is('visible')) {
if (isChecked) {
checkedAction = 'hide';
}
} else {
if (!isChecked) {
checkedAction = 'hide';
}
}
return (checkedAction !== undefined) ? checkedAction : 'show';
};
target.find('.toggle [data-toggleaction="toggle"]').change(function () {
var toggle = $(this).parents('.toggle').get(0);
var toggleAction = $(toggle).children('.toggle-action');
var toggleCheckedAction = $(toggle).attr('data-whenchecked');
if (!toggleCheckedAction) {
toggleCheckedAction = getToggleCheckedAction(toggleAction, $(this).is(':checked'));
$(toggle).attr('data-whenchecked', toggleCheckedAction);
}
if ($(this).is(':checked')) {
if (toggleCheckedAction == 'hide') {
$(toggleAction).hide();
} else {
$(toggleAction).show();
}
} else {
if (toggleCheckedAction == 'show') {
$(toggleAction).hide();
} else {
$(toggleAction).show();
}
}
});
};
cacRegistration.setRepeatableIndex = function (target, index) {
if (!target || isNaN(index)) {
return;
}
// determine if an element has the specified attribute
var hasAttribute = function (element, attrName) {
if (!element || !attrName) {
return;
}
var attrVal = $(element).attr(attrName);
return typeof attrVal !== typeof undefined && attrVal !== false;
};
// set the suffix value
var setSuffix = function (element, attrName, suffix) {
if (!element || !attrName || !suffix) {
return;
}
if (!Array.isArray(attrName)) {
attrName = [attrName];
}
for (var i = 0; i < attrName.length; i++) {
var curName = attrName[i];
if (hasAttribute(element, curName)) {
var curVal = $(element).attr(curName);
$(element).attr(curName, curVal + suffix);
$(element).attr('data-original-' + curName, curVal);
}
}
};
// iterate over all elements with unique fields and append a suffix
// name must be included to handle elements like radio buttons
var elementsWithId = $(target).find('[id],[for],[name]');
var suffix = '_' + index;
for (var i = 0; i < elementsWithId.length; i++) {
var element = elementsWithId.get(i);
setSuffix(element, ['id','for','name'], suffix);
}
// store the index in the target as a data element
$(target).attr('data-index', index);
};
cacRegistration.registerRemoves = function (target) {
if (!target) {
return;
}
var removeButtons = $(target).find('.control button.remove');
var enableRepeat = function (target) {
if (!target) {
return;
}
var addButton = $(target).children('.control').find('.add');
if (addButton.length > 0) {
if (addButton.attr('disabled')) {
addButton.attr('disabled', false);
}
addButton.show();
}
};
var removeRepeatable = function (target) {
if (!target) {
return;
}
var repeatableContainer = $(target).parents('.repeatable').get(0);
$(target).remove();
var container = $(repeatableContainer).find('.display').get(0);
$(container).children('.repeated:last').find('.control').show();
$(repeatableContainer).children('.control').find('.add').focus();
enableRepeat(repeatableContainer);
};
removeButtons.click(function (event) {
event.preventDefault();
removeRepeatable($(this).parents('.repeated').get(0));
});
};
cacRegistration.registerRepeatables = function (target) {
if (!target) {
target = $('body');
}
// allow js to control if the element is hidden or not
target.find('.repeatable .template.hide').hide().removeClass('hide');
var repeatables = target.find('.repeatable');
var duplicateButtons = target.find('.repeatable button.add');
var disableRepeat = function (target) {
if (!target) {
return;
}
$(target).children('.control').find('.add').attr('disabled', true).hide();
};
var insertRepeatable = function (target, focus) {
if (!target) {
return;
}
var maxRepeat = $(target).attr('data-maxrepeats');
var insertPoint = $(target).children('.display');
var template = $(target).children('.template');
var templateClone = template.clone(true);
var index = $(target).attr('data-curindex');
var toAdd;
if (!insertPoint || insertPoint.length < 1) {
insertPoint = template
.clone()
.empty()
.show()
.removeClass('template')
.addClass('display');
$(template).before(insertPoint);
}
if (maxRepeat && !isNaN(maxRepeat)) {
var length = insertPoint.children().length;
maxRepeat = parseInt(maxRepeat, 10);
if (length + 1 >= maxRepeat){
disableRepeat(target);
}
if (length >= maxRepeat) {
return;
}
}
if (templateClone.children().length === 1) {
toAdd = templateClone.children();
toAdd.addClass('repeated');
} else {
toAdd = $('')
.addClass('repeated')
.append(templateClone.children());
}
if (isNaN(index)) {
index = 0;
} else {
index = parseInt(index, 10) + 1;
}
if (index == 0) {
toAdd.children('.control').remove();
} else {
insertPoint.children('.repeated').children('.control').hide();
}
$(target).attr('data-curindex', index);
cacRegistration.setRepeatableIndex(toAdd, index);
cacRegistration.registerToggles(toAdd);
cacRegistration.registerRemoves(toAdd);
insertPoint.append(toAdd);
templateClone.show();
if (focus) {
toAdd.find(':input:visible:enabled:first').focus();
}
};
if (duplicateButtons.length > 0) {
for (var i = 0; i < duplicateButtons.length; i++) {
$(duplicateButtons[i]).click(function (event) {
event.preventDefault();
insertRepeatable($(this).parents('.repeatable').get(0), true);
});
}
}
if (repeatables.length > 0) {
for (var j = repeatables.length; j >= 0; j--){
insertRepeatable(repeatables[j]);
}
}
};
cacRegistration.jumpTo = function () {
window.scrollTo(0,0);
$('#main_content').focus();
};
cacRegistration.setMessage = function (message) {
var formMessage = $('#form-message');
if (formMessage.hasClass('hide')) {
formMessage.hide().removeClass('hide');
}
cacRegistration.clearMessage();
if (message) {
formMessage.append('' + message + '
');
formMessage.show();
}
return formMessage;
};
cacRegistration.clearMessage = function () {
var formMessage = $('#form-message');
formMessage.hide();
formMessage.empty();
formMessage.removeClass();
return formMessage;
}
cacRegistration.showInfoMessage = function (message) {
cacRegistration.setMessage(message).addClass('alert alert-info');
};
cacRegistration.showErrorMessage = function (message) {
cacRegistration.setMessage(message).addClass('alert alert-error');
};
cacRegistration.disableForm = function () {
var form = $(cacRegistration.getForm());
form.find('button').attr('disabled', true);
};
cacRegistration.enableForm = function () {
var form = $(cacRegistration.getForm());
form.find('button').removeAttr('disabled');
};
cacRegistration.enableValidation = function (target) {
if (!target) {
target = cacRegistration.getForm();
}
var rules = {};
var messages = {};
// require the first marketplace contact
$('#marketplace-contacts > .display > *[data-index="0"] .field').addClass('require');
$('#marketplace-contacts > .display > *[data-index="0"] input').attr('required', true);
$('#marketplace-contacts > .display > *[data-index="0"] label').append('*');
// require at least 1 organization type
$('#organization-types input').addClass('org-type');
jQuery.validator.addMethod("atLeast1", function(value, element) {
return $('.org-type:checked').length > 0;
}, "Please select at least one Organization Type");
jQuery.validator.addClassRules('org-type', { atLeast1: true });
// require either state or zip for public locations
jQuery.validator.addMethod("atLeastStateOrZip", function (value, element) {
var wrapper = $($(element).parents('fieldset').get(0));
var state = $(wrapper).find('select[name^="location_address_state"]');
var zip = $(wrapper).find('input[name^="location_address_zip"]');
return $(state).val() != '' || $(zip).val() != '';
}, "Please provide either a state or Zip code");
jQuery.validator.addClassRules('zip-or-state', {'atLeastStateOrZip': true});
$(document).on('change', 'select[name^="location_address_state"]', function () {
var wrapper = $($(this).parents('fieldset').get(0));
var zip = $(wrapper).find('input[name^="location_address_zip"]');
zip.valid();
});
$(document).on('change', 'input[name^="location_address_zip"]', function () {
var wrapper = $($(this).parents('fieldset').get(0));
var state = $(wrapper).find('select[name^="location_address_state"]');
state.valid();
});
// allow for phone validation
jQuery.validator.addClassRules('tel', { 'phoneUS': true });
// require hours for at least one day
jQuery.validator.addMethod("hoursOnAtLeastOneDay", function (value, element) {
var wrapper = $($(element).parents('fieldset').get(0));
var needHours = $(wrapper).find('input[id^="location-location_hours-hours"]').is(':checked');
return !needHours || $(wrapper).find('input.hours-selector:checked').length > 0;
}, 'Please specify hours for at least one day of the week, or select "By Appointment Only"');
jQuery.validator.addClassRules('hoursSelect', {'hoursOnAtLeastOneDay': true});
$(document).on('change', 'input.hours-selector', function () {
var wrapper = $($(this).parents('fieldset.hours').get(0));
var hoursSelect = $(wrapper).find('.hoursSelect');
if (hoursSelect.length > 0) {
hoursSelect.valid();
}
});
// enable validation
$(target).validate({
rules: rules,
messages: messages,
errorPlacement: function (error, element) {
if ($(element).hasClass('org-type')) {
var fieldset = $(element).parents('fieldset').get(0);
if ($(fieldset).find('label.error').length < 1) {
$(fieldset).append(error);
}
} else if ($(element).hasClass('hoursSelect')) {
var wrapper = $(element).parents('.radio-wrapper').get(0);
if ($(wrapper).parent().find('label.error').length < 1) {
$(wrapper).after(error);
}
} else {
$(element).after(error);
}
},
invalidHandler: function (event) {
cacRegistration.showErrorMessage('Please correct the validation errors below.');
cacRegistration.jumpTo();
},
submitHandler: function (form) {
cacRegistration.showInfoMessage('Please wait...');
cacRegistration.jumpTo();
cacRegistration.disableForm();
cacRegistration.processFields($(form));
cacRegistration.processSubmission($(form));
},
focusInvalid: false,
success: false
});
};
cacRegistration.addOnLoad(function () {
// register toggle actions
cacRegistration.registerToggles();
cacRegistration.registerSelectToggles();
cacRegistration.registerRepeatables();
cacRegistration.enableValidation();
// register the form submission event handler
cacRegistration.getForm().on('submit', function (event) {
event.preventDefault();
});
if (cacRegistration.browsers.isSafari()) {
$.get(cacRegistration.pingUrl, function () {
cacRegistration.systemUp = true;
});
}
$('#registration-organization_type_other').hide();
$('#registration-organization_type_other-check').click(function(){
$('#registration-organization_type_other').toggle();
});
});