12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069 |
- /*============================================
- Conditional Logic
- ==============================================*/
- var __gf_timeout_handle;
- function gf_apply_rules(formId, fields, isInit){
- var rule_applied = 0;
- for(var i=0; i < fields.length; i++){
- gf_apply_field_rule(formId, fields[i], isInit, function(){
- rule_applied++;
- if(rule_applied == fields.length){
- jQuery(document).trigger('gform_post_conditional_logic', [formId, fields, isInit]);
- if(window["gformCalculateTotalPrice"])
- window["gformCalculateTotalPrice"](formId);
- }
- });
- }
- }
- function gf_check_field_rule(formId, fieldId, isInit, callback){
- //if conditional logic is not specified for that field, it is supposed to be displayed
- if(!window["gf_form_conditional_logic"] || !window["gf_form_conditional_logic"][formId] || !window["gf_form_conditional_logic"][formId]["logic"][fieldId])
- return "show";
- var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId];
- var action = gf_get_field_action(formId, conditionalLogic["section"]);
- //If section is hidden, always hide field. If section is displayed, see if field is supposed to be displayed or hidden
- if(action != "hide")
- action = gf_get_field_action(formId, conditionalLogic["field"]);
- return action;
- }
- function gf_apply_field_rule(formId, fieldId, isInit, callback){
- var action = gf_check_field_rule(formId, fieldId, isInit, callback);
- gf_do_field_action(formId, action, fieldId, isInit, callback);
- var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId];
- //perform conditional logic for the next button
- if(conditionalLogic["nextButton"]){
- action = gf_get_field_action(formId, conditionalLogic["nextButton"]);
- gf_do_next_button_action(formId, action, fieldId, isInit);
- }
- }
- function gf_get_field_action(formId, conditionalLogic){
- if(!conditionalLogic)
- return "show";
- var matches = 0;
- for(var i = 0; i < conditionalLogic["rules"].length; i++){
- var rule = conditionalLogic["rules"][i];
- if(gf_is_match(formId, rule))
- matches++;
- }
- var action;
- if( (conditionalLogic["logicType"] == "all" && matches == conditionalLogic["rules"].length) || (conditionalLogic["logicType"] == "any" && matches > 0) )
- action = conditionalLogic["actionType"];
- else
- action = conditionalLogic["actionType"] == "show" ? "hide" : "show";
- return action;
- }
- function gf_is_match(formId, rule){
- var isMatch = false;
- var inputs = jQuery("#input_" + formId + "_" + rule["fieldId"] + " input");
- var fieldValue;
- if(inputs.length > 0){
- //handling checkboxes/radio
- for(var i=0; i< inputs.length; i++){
- fieldValue = gf_get_value(jQuery(inputs[i]).val());
- //find specific checkbox/radio item. Skip if this is not the specific item and the operator is not one that targets a range of values (i.e. greater than and less than)
- var isRangeOperator = jQuery.inArray(rule["operator"], ["<", ">", "contains", "starts_with", "ends_with"]) >= 0;
- if(fieldValue != rule["value"] && !isRangeOperator) {
- continue;
- }
- //blank value if item isn't checked
- if(!jQuery(inputs[i]).is(":checked")) {
- fieldValue = "";
- }
- else if (fieldValue == "gf_other_choice"){
- //get the value from the associated text box
- fieldValue = jQuery("#input_" + formId + "_" + rule["fieldId"] + "_other").val();
- }
- if(gf_matches_operation(fieldValue, rule["value"], rule["operator"]))
- isMatch = true;
- }
- }
- else{
- //handling all other fields (non-checkboxes)
- var val = jQuery("#input_" + formId + "_" + rule["fieldId"]).val();
- //transform regular value into array to support multi-select (which returns an array of selected items)
- var values = (val instanceof Array) ? val : [val];
- var matchCount = 0;
- var fieldNumberFormat = window['gf_global'] && gf_global.number_formats && gf_global.number_formats[formId] && gf_global.number_formats[formId][rule["fieldId"]] ? gf_global.number_formats[formId][rule["fieldId"]] : false;
- for(var i=0; i < values.length; i++){
- //fields with pipes in the value will use the label for conditional logic comparison
- var hasLabel = values[i] ? values[i].indexOf("|") >= 0 : true;
- fieldValue = gf_get_value(values[i]);
- var decimalSeparator = ".";
- if( fieldNumberFormat && !hasLabel){
- if( fieldNumberFormat == "currency" )
- decimalSeparator = gformGetDecimalSeparator('currency');
- else if( fieldNumberFormat == "decimal_comma")
- decimalSeparator = ",";
- else if( fieldNumberFormat == "decimal_dot")
- decimalSeparator = ".";
- //transform to a decimal dot number
- fieldValue = gformCleanNumber( fieldValue, '', '', decimalSeparator);
- //now transform to number specified by locale
- if(window['gf_number_format'] && window['gf_number_format'] == "decimal_comma")
- fieldValue = gformFormatNumber(fieldValue, -1, ",", ".");
- if( ! fieldValue )
- fieldValue = 0;
- fieldValue = fieldValue.toString();
- }
- if(gf_matches_operation(fieldValue, rule["value"], rule["operator"])){
- matchCount++;
- }
- }
- //If operator is Is Not, none of the value can match
- isMatch = rule["operator"] == "isnot" ? matchCount == values.length : matchCount > 0;
- }
- return gform.applyFilters( 'gform_is_value_match', isMatch, formId, rule );
- }
- function gf_try_convert_float(text){
- var format = window["gf_number_format"] == "decimal_comma" ? "decimal_comma" : "decimal_dot";
- if(gformIsNumeric(text, format)){
- var decimal_separator = format == "decimal_comma" ? "," : ".";
- return gformCleanNumber(text, "", "", decimal_separator);
- }
- return text;
- }
- function gf_matches_operation(val1, val2, operation){
- val1 = val1 ? val1.toLowerCase() : "";
- val2 = val2 ? val2.toLowerCase() : "";
- switch(operation){
- case "is" :
- return val1 == val2;
- break;
- case "isnot" :
- return val1 != val2;
- break;
- case ">" :
- val1 = gf_try_convert_float(val1);
- val2 = gf_try_convert_float(val2);
- return gformIsNumber(val1) && gformIsNumber(val2) ? val1 > val2 : false;
- break;
- case "<" :
- val1 = gf_try_convert_float(val1);
- val2 = gf_try_convert_float(val2);
- return gformIsNumber(val1) && gformIsNumber(val2) ? val1 < val2 : false;
- break;
- case "contains" :
- return val1.indexOf(val2) >=0;
- break;
- case "starts_with" :
- return val1.indexOf(val2) ==0;
- break;
- case "ends_with" :
- var start = val1.length - val2.length;
- if(start < 0)
- return false;
- var tail = val1.substring(start);
- return val2 == tail;
- break;
- }
- return false;
- }
- function gf_get_value(val){
- if(!val)
- return "";
- val = val.split("|");
- return val[0];
- }
- function gf_do_field_action(formId, action, fieldId, isInit, callback){
- var conditional_logic = window["gf_form_conditional_logic"][formId];
- var dependent_fields = conditional_logic["dependents"][fieldId];
- for(var i=0; i < dependent_fields.length; i++){
- var targetId = fieldId == 0 ? "#gform_submit_button_" + formId : "#field_" + formId + "_" + dependent_fields[i];
- //calling callback function on the last dependent field, to make sure it is only called once
- do_callback = (i+1) == dependent_fields.length ? callback : null;
- gf_do_action(action, targetId, conditional_logic["animation"], conditional_logic["defaults"][dependent_fields[i]], isInit, do_callback);
- }
- }
- function gf_do_next_button_action(formId, action, fieldId, isInit){
- var conditional_logic = window["gf_form_conditional_logic"][formId];
- var targetId = "#gform_next_button_" + formId + "_" + fieldId;
- gf_do_action(action, targetId, conditional_logic["animation"], null, isInit);
- }
- function gf_do_action(action, targetId, useAnimation, defaultValues, isInit, callback){
- var $target = jQuery(targetId);
- if(action == "show"){
- if(useAnimation && !isInit){
- if($target.length > 0){
- $target.slideDown(callback);
- } else if(callback){
- callback();
- }
- }
- else{
- //$target.show();
- //Getting around an issue with Chrome on Android. Does not like jQuery('xx').show() ...
- $target.css('display', 'block');
- if(callback){
- callback();
- }
- }
- }
- else{
- //if field is not already hidden, reset its values to the default
- var child = $target.children().first();
- if (child.length > 0){
- if(!gformIsHidden(child)){
- gf_reset_to_default(targetId, defaultValues);
- }
- }
- if(useAnimation && !isInit){
- if($target.length > 0 && $target.is(":visible")) {
- $target.slideUp(callback);
- } else if(callback) {
- callback();
- }
- } else{
- $target.hide();
- if(callback){
- callback();
- }
- }
- }
- }
- function gf_reset_to_default(targetId, defaultValue){
- var dateFields = jQuery(targetId).find('.gfield_date_month input[type="text"], .gfield_date_day input[type="text"], .gfield_date_year input[type="text"], .gfield_date_dropdown_month select, .gfield_date_dropdown_day select, .gfield_date_dropdown_year select');
- var dateIndex = 0;
- if(dateFields.length > 0){
- dateFields.each(function(){
- if(defaultValue){
- val = defaultValue.split(/[\.\/-]+/)[dateIndex];
- dateIndex++;
- }
- else{
- val = "";
- }
- var element = jQuery(this);
- if(element.prop("tagName") == "SELECT")
- val = parseInt(val);
- if(element.val() != val)
- element.val(val).trigger("change");
- else
- element.val(val);
- });
- return;
- }
- //cascading down conditional logic to children to suppport nested conditions
- //text fields and drop downs
- var target = jQuery(targetId).find('select, input[type="text"], input[type="number"], textarea');
- var target_index = 0;
- target.each(function(){
- var val = "";
- var element = jQuery(this);
- if(element.is('select:not([multiple])')){
- val = element.find('option' ).not( ':disabled' ).eq(0).val();
- }
- //get name of previous input field to see if it is the radio button which goes with the "Other" text box
- //otherwise field is populated with input field name
- var radio_button_name = element.prev("input").attr("value");
- if(radio_button_name == "gf_other_choice"){
- val = element.attr("value");
- }
- else if(jQuery.isArray(defaultValue)){
- val = defaultValue[target_index];
- }
- else if(jQuery.isPlainObject(defaultValue)){
- val = defaultValue[element.attr("name")];
- }
- else if(defaultValue){
- val = defaultValue;
- }
- if(element.val() != val)
- element.val(val).trigger('change');
- else
- element.val(val);
- target_index++;
- });
- //checkboxes and radio buttons
- var elements = jQuery(targetId).find('input[type="radio"], input[type="checkbox"]');
- elements.each(function(){
- //is input currently checked?
- var isChecked = jQuery(this).is(':checked') ? true : false;
- //does input need to be marked as checked or unchecked?
- var doCheck = defaultValue ? jQuery.inArray(jQuery(this).attr('id'), defaultValue) > -1 : false;
- //if value changed, trigger click event
- if(isChecked != doCheck){
- //setting input as checked or unchecked appropriately
- if(jQuery(this).attr("type") == "checkbox"){
- jQuery(this).trigger('click');
- }
- else{
- jQuery(this).prop("checked", doCheck);
- //need to set the prop again after the click is triggered
- jQuery(this).trigger('click').prop('checked', doCheck);
- }
- }
- });
- }
- /*============================================
- jQuery JSON
- ==============================================*/
- (function($) {
- function toIntegersAtLease(n)
- // Format integers to have at least two digits.
- {
- return n < 10 ? '0' + n : n;
- }
- Date.prototype.toJSON = function(date)
- // Yes, it polutes the Date namespace, but we'll allow it here, as
- // it's damned usefull.
- {
- return this.getUTCFullYear() + '-' +
- toIntegersAtLease(this.getUTCMonth()) + '-' +
- toIntegersAtLease(this.getUTCDate());
- };
- var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
- var meta = { // table of character substitutions
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- };
- $.quoteString = function(string)
- // Places quotes around a string, inteligently.
- // If the string contains no control characters, no quote characters, and no
- // backslash characters, then we can safely slap some quotes around it.
- // Otherwise we must also replace the offending characters with safe escape
- // sequences.
- {
- //if (escapeable.test(string))
- //{
- return '"' + string.replace(escapeable, function (a)
- {
- var c = meta[a];
- if (typeof c === 'string') {
- return c;
- }
- c = a.charCodeAt();
- return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
- }) + '"';
- //}
- //else{
- // string = string.replace('\n','\\n');
- //}
- return '"' + string + '"';
- };
- $.toJSON = function(o, compact)
- {
- var type = typeof(o);
- if (type == "undefined")
- return "undefined";
- else if (type == "number" || type == "boolean")
- return o + "";
- else if (o === null)
- return "null";
- // Is it a string?
- if (type == "string")
- {
- var str = $.quoteString(o);
- return str;
- }
- // Does it have a .toJSON function?
- if (type == "object" && typeof o.toJSON == "function")
- return o.toJSON(compact);
- // Is it an array?
- if (type != "function" && typeof(o.length) == "number")
- {
- var ret = [];
- for (var i = 0; i < o.length; i++) {
- ret.push( $.toJSON(o[i], compact) );
- }
- if (compact)
- return "[" + ret.join(",") + "]";
- else
- return "[" + ret.join(", ") + "]";
- }
- // If it's a function, we have to warn somebody!
- if (type == "function") {
- throw new TypeError("Unable to convert object of type 'function' to json.");
- }
- // It's probably an object, then.
- var ret = [];
- for (var k in o) {
- var name;
- type = typeof(k);
- if (type == "number")
- name = '"' + k + '"';
- else if (type == "string")
- name = $.quoteString(k);
- else
- continue; //skip non-string or number keys
- var val = $.toJSON(o[k], compact);
- if (typeof(val) != "string") {
- // skip non-serializable values
- continue;
- }
- if (compact)
- ret.push(name + ":" + val);
- else
- ret.push(name + ": " + val);
- }
- return "{" + ret.join(", ") + "}";
- };
- $.compactJSON = function(o)
- {
- return $.toJSON(o, true);
- };
- $.evalJSON = function(src)
- // Evals JSON that we know to be safe.
- {
- return eval("(" + src + ")");
- };
- $.secureEvalJSON = function(src)
- // Evals JSON in a way that is *more* secure.
- {
- var filtered = src;
- filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
- filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
- filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
- if (/^[\],:{}\s]*$/.test(filtered))
- return eval("(" + src + ")");
- else
- throw new SyntaxError("Error parsing JSON, source is not valid.");
- };
- })(jQuery);
- /*============================================
- Placeholders.js v2.1.1
- ==============================================*/
- (function(t){"use strict";function e(t,e,r){return t.addEventListener?t.addEventListener(e,r,!1):t.attachEvent?t.attachEvent("on"+e,r):void 0}function r(t,e){var r,n;for(r=0,n=t.length;n>r;r++)if(t[r]===e)return!0;return!1}function n(t,e){var r;t.createTextRange?(r=t.createTextRange(),r.move("character",e),r.select()):t.selectionStart&&(t.focus(),t.setSelectionRange(e,e))}function a(t,e){try{return t.type=e,!0}catch(r){return!1}}t.Placeholders={Utils:{addEventListener:e,inArray:r,moveCaret:n,changeType:a}}})(this),function(t){"use strict";function e(){}function r(t,e){var r,n,a=!!e&&t.value!==e,u=t.value===t.getAttribute(V);return(a||u)&&"true"===t.getAttribute(D)?(t.setAttribute(D,"false"),t.value=t.value.replace(t.getAttribute(V),""),t.className=t.className.replace(R,""),n=t.getAttribute(z),n&&(t.setAttribute("maxLength",n),t.removeAttribute(z)),r=t.getAttribute(I),r&&(t.type=r),!0):!1}function n(t){var e,r,n=t.getAttribute(V);return""===t.value&&n?(t.setAttribute(D,"true"),t.value=n,t.className+=" "+k,r=t.getAttribute(z),r||(t.setAttribute(z,t.maxLength),t.removeAttribute("maxLength")),e=t.getAttribute(I),e?t.type="text":"password"===t.type&&K.changeType(t,"text")&&t.setAttribute(I,"password"),!0):!1}function a(t,e){var r,n,a,u,i;if(t&&t.getAttribute(V))e(t);else for(r=t?t.getElementsByTagName("input"):p,n=t?t.getElementsByTagName("textarea"):h,i=0,u=r.length+n.length;u>i;i++)a=r.length>i?r[i]:n[i-r.length],e(a)}function u(t){a(t,r)}function i(t){a(t,n)}function l(t){return function(){b&&t.value===t.getAttribute(V)&&"true"===t.getAttribute(D)?K.moveCaret(t,0):r(t)}}function o(t){return function(){n(t)}}function c(t){return function(e){return m=t.value,"true"===t.getAttribute(D)&&m===t.getAttribute(V)&&K.inArray(C,e.keyCode)?(e.preventDefault&&e.preventDefault(),!1):void 0}}function s(t){return function(){r(t,m),""===t.value&&(t.blur(),K.moveCaret(t,0))}}function d(t){return function(){t===document.activeElement&&t.value===t.getAttribute(V)&&"true"===t.getAttribute(D)&&K.moveCaret(t,0)}}function g(t){return function(){u(t)}}function v(t){t.form&&(L=t.form,L.getAttribute(P)||(K.addEventListener(L,"submit",g(L)),L.setAttribute(P,"true"))),K.addEventListener(t,"focus",l(t)),K.addEventListener(t,"blur",o(t)),b&&(K.addEventListener(t,"keydown",c(t)),K.addEventListener(t,"keyup",s(t)),K.addEventListener(t,"click",d(t))),t.setAttribute(U,"true"),t.setAttribute(V,E),n(t)}var p,h,b,f,m,A,y,E,x,L,T,N,S,w=["text","search","url","tel","email","password","number","textarea"],C=[27,33,34,35,36,37,38,39,40,8,46],B="#ccc",k="placeholdersjs",R=RegExp("(?:^|\\s)"+k+"(?!\\S)"),V="data-placeholder-value",D="data-placeholder-active",I="data-placeholder-type",P="data-placeholder-submit",U="data-placeholder-bound",j="data-placeholder-focus",q="data-placeholder-live",z="data-placeholder-maxlength",F=document.createElement("input"),G=document.getElementsByTagName("head")[0],H=document.documentElement,J=t.Placeholders,K=J.Utils;if(J.nativeSupport=void 0!==F.placeholder,!J.nativeSupport){for(p=document.getElementsByTagName("input"),h=document.getElementsByTagName("textarea"),b="false"===H.getAttribute(j),f="false"!==H.getAttribute(q),A=document.createElement("style"),A.type="text/css",y=document.createTextNode("."+k+" { color:"+B+"; }"),A.styleSheet?A.styleSheet.cssText=y.nodeValue:A.appendChild(y),G.insertBefore(A,G.firstChild),S=0,N=p.length+h.length;N>S;S++)T=p.length>S?p[S]:h[S-p.length],E=T.attributes.placeholder,E&&(E=E.nodeValue,E&&K.inArray(w,T.type)&&v(T));x=setInterval(function(){for(S=0,N=p.length+h.length;N>S;S++)T=p.length>S?p[S]:h[S-p.length],E=T.attributes.placeholder,E&&(E=E.nodeValue,E&&K.inArray(w,T.type)&&(T.getAttribute(U)||v(T),(E!==T.getAttribute(V)||"password"===T.type&&!T.getAttribute(I))&&("password"===T.type&&!T.getAttribute(I)&&K.changeType(T,"text")&&T.setAttribute(I,"password"),T.value===T.getAttribute(V)&&(T.value=E),T.setAttribute(V,E))));f||clearInterval(x)},100)}J.disable=J.nativeSupport?e:u,J.enable=J.nativeSupport?e:i}(this);
- /*============================================
- Gravity Forms
- ==============================================*/
- // "prop" method fix for previous versions of jQuery (1.5 and below)
- if( typeof jQuery.fn.prop === 'undefined' ) {
- jQuery.fn.prop = jQuery.fn.attr;
- }
- //Formatting free form currency fields to currency
- jQuery(document).ready(function(){
- jQuery(document).bind('gform_post_render', gformBindFormatPricingFields);
- });
- function gformBindFormatPricingFields(){
- jQuery(".ginput_amount, .ginput_donation_amount").bind("change", function(){
- gformFormatPricingField(this);
- });
- jQuery(".ginput_amount, .ginput_donation_amount").each(function(){
- gformFormatPricingField(this);
- });
- }
- //------------------------------------------------
- //---------- CURRENCY ----------------------------
- //------------------------------------------------
- function Currency(currency){
- this.currency = currency;
- this.toNumber = function(text){
- if(this.isNumeric(text))
- return parseFloat(text);
- return gformCleanNumber(text, this.currency["symbol_right"], this.currency["symbol_left"], this.currency["decimal_separator"]);
- };
- this.toMoney = function(number){
- if(!this.isNumeric(number))
- number = this.toNumber(number);
- if(number === false)
- return "";
- number = number + "";
- negative = "";
- if(number[0] == "-"){
- negative = "-";
- number = parseFloat(number.substr(1));
- }
- money = this.numberFormat(number, this.currency["decimals"], this.currency["decimal_separator"], this.currency["thousand_separator"]);
- var symbol_left = this.currency["symbol_left"] ? this.currency["symbol_left"] + this.currency["symbol_padding"] : "";
- var symbol_right = this.currency["symbol_right"] ? this.currency["symbol_padding"] + this.currency["symbol_right"] : "";
- money = negative + this.htmlDecode(symbol_left) + money + this.htmlDecode(symbol_right);
- return money;
- };
- this.numberFormat = function(number, decimals, dec_point, thousands_sep, padded){
- var padded = typeof padded == 'undefined';
- number = (number+'').replace(',', '').replace(' ', '');
- var n = !isFinite(+number) ? 0 : +number,
- prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
- sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
- s = '',
- toFixedFix = function (n, prec) {
- var k = Math.pow(10, prec);
- return '' + Math.round(n * k) / k;
- };
- if(decimals == '0') {
- s = ('' + Math.round(n)).split('.');
- } else
- if(decimals == -1) {
- s = ('' + n).split('.');
- } else {
- // Fix for IE parseFloat(0.55).toFixed(0) = 0;
- s = toFixedFix(n, prec).split('.');
- }
- if (s[0].length > 3) {
- s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
- }
- if(padded) {
- if ((s[1] || '').length < prec) {
- s[1] = s[1] || '';
- s[1] += new Array(prec - s[1].length + 1).join('0');
- }
- }
- return s.join(dec);
- }
- this.isNumeric = function(number){
- return gformIsNumber(number);
- };
- this.htmlDecode = function(text) {
- var c,m,d = text;
- // look for numerical entities "
- var arr=d.match(/&#[0-9]{1,5};/g);
- // if no matches found in string then skip
- if(arr!=null){
- for(var x=0;x<arr.length;x++){
- m = arr[x];
- c = m.substring(2,m.length-1); //get numeric part which is refernce to unicode character
- // if its a valid number we can decode
- if(c >= -32768 && c <= 65535){
- // decode every single match within string
- d = d.replace(m, String.fromCharCode(c));
- }else{
- d = d.replace(m, ""); //invalid so replace with nada
- }
- }
- }
- return d;
- };
- }
- function gformCleanNumber(text, symbol_right, symbol_left, decimal_separator){
- //converting to a string if a number as passed
- text = text + " ";
- //Removing symbol in unicode format (i.e. ᅜ)
- text = text.replace(/&.*?;/, "", text);
- //Removing symbol from text
- text = text.replace(symbol_right, "");
- text = text.replace(symbol_left, "");
- //Removing all non-numeric characters
- var clean_number = "";
- var is_negative = false;
- for(var i=0; i<text.length; i++){
- var digit = text.substr(i,1);
- if( (parseInt(digit) >= 0 && parseInt(digit) <= 9) || digit == decimal_separator )
- clean_number += digit;
- else if(digit == '-')
- is_negative = true;
- }
- //Removing thousand separators but keeping decimal point
- var float_number = "";
- for(var i=0; i<clean_number.length; i++)
- {
- var char = clean_number.substr(i,1);
- if (char >= '0' && char <= '9')
- float_number += char;
- else if(char == decimal_separator){
- float_number += ".";
- }
- }
- if(is_negative)
- float_number = "-" + float_number;
- return gformIsNumber(float_number) ? parseFloat(float_number) : false;
- }
- function gformGetDecimalSeparator(numberFormat){
- var s;
- switch (numberFormat){
- case 'currency' :
- var currency = new Currency(gf_global.gf_currency_config);
- s = currency.currency["decimal_separator"];
- break;
- case 'decimal_comma' :
- s = ',';
- break;
- default :
- s = "."
- }
- return s;
- }
- function gformIsNumber(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
- function gformIsNumeric(value, number_format){
- switch(number_format){
- case "decimal_dot" :
- var r = new RegExp("^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]+)?)$");
- return r.test(value);
- break;
- case "decimal_comma" :
- var r = new RegExp("^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]+)?)$");
- return r.test(value);
- break;
- }
- return false;
- }
- //------------------------------------------------
- //---------- MULTI-PAGE --------------------------
- //------------------------------------------------
- function gformDeleteUploadedFile(formId, fieldId, deleteButton){
- var parent = jQuery("#field_" + formId + "_" + fieldId);
- var fileIndex = jQuery(deleteButton).parent().index();
- parent.find(".ginput_preview").eq(fileIndex).remove();
- //displaying single file upload field
- parent.find("input[type=\"file\"]").removeClass("gform_hidden");
- //displaying post image label
- parent.find(".ginput_post_image_file").show();
- //clearing post image meta fields
- parent.find("input[type=\"text\"]").val('');
- //removing file from uploaded meta
- var files = jQuery.secureEvalJSON(jQuery('#gform_uploaded_files_' + formId).val());
- if(files){
- var inputName = "input_" + fieldId;
- var $multfile = parent.find("#gform_multifile_upload_" + formId + "_" + fieldId );
- if( $multfile.length > 0 ) {
- files[inputName].splice(fileIndex, 1);
- var settings = $multfile.data('settings');
- var max = settings.gf_vars.max_files;
- jQuery("#" + settings.gf_vars.message_id).html('');
- if(files[inputName].length < max)
- gfMultiFileUploader.toggleDisabled(settings, false);
- } else {
- files[inputName] = null;
- }
- jQuery('#gform_uploaded_files_' + formId).val(jQuery.toJSON(files));
- }
- }
- //------------------------------------------------
- //---------- PRICE -------------------------------
- //------------------------------------------------
- var _gformPriceFields = new Array();
- var _anyProductSelected;
- function gformIsHidden(element){
- return element.parents('.gfield').not(".gfield_hidden_product").css("display") == "none";
- }
- function gformCalculateTotalPrice(formId){
- if(!_gformPriceFields[formId])
- return;
- var price = 0;
- _anyProductSelected = false; //Will be used by gformCalculateProductPrice().
- for(var i=0; i<_gformPriceFields[formId].length; i++){
- price += gformCalculateProductPrice(formId, _gformPriceFields[formId][i]);
- }
- //add shipping price if a product has been selected
- if(_anyProductSelected){
- //shipping price
- var shipping = gformGetShippingPrice(formId)
- price += shipping;
- }
- //gform_product_total filter. Allows uers to perform custom price calculation
- if(window["gform_product_total"])
- price = window["gform_product_total"](formId, price);
- price = gform.applyFilters('gform_product_total', price, formId);
- //updating total
- var totalElement = jQuery(".ginput_total_" + formId);
- if(totalElement.length > 0){
- totalElement.next().val(price);
- totalElement.html(gformFormatMoney(price));
- }
- }
- function gformGetShippingPrice(formId){
- var shippingField = jQuery(".gfield_shipping_" + formId + " input[type=\"hidden\"], .gfield_shipping_" + formId + " select, .gfield_shipping_" + formId + " input:checked");
- var shipping = 0;
- if(shippingField.length == 1 && !gformIsHidden(shippingField)){
- if(shippingField.attr("type") && shippingField.attr("type").toLowerCase() == "hidden")
- shipping = shippingField.val();
- else
- shipping = gformGetPrice(shippingField.val());
- }
- return gformToNumber(shipping);
- }
- function gformGetFieldId(element){
- var id = jQuery(element).attr("id");
- var pieces = id.split("_");
- if(pieces.length <=0)
- return 0;
- var fieldId = pieces[pieces.length-1];
- return fieldId;
- }
- function gformCalculateProductPrice(form_id, productFieldId){
- var price = gformGetBasePrice(form_id, productFieldId);
- var suffix = "_" + form_id + "_" + productFieldId;
- //Drop down auto-calculating labels
- jQuery(".gfield_option" + suffix + ", .gfield_shipping_" + form_id).find("select").each(function(){
- var dropdown_field = jQuery(this);
- var selected_price = gformGetPrice(dropdown_field.val());
- var field_id = dropdown_field.attr("id").split("_")[2];
- dropdown_field.children("option").each(function(){
- var choice_element = jQuery(this);
- var label = gformGetOptionLabel(choice_element, choice_element.val(), selected_price, form_id, field_id);
- choice_element.html(label);
- });
- });
- //Checkboxes labels with prices
- jQuery(".gfield_option" + suffix).find(".gfield_checkbox").find("input").each(function(){
- var checkbox_item = jQuery(this);
- var id = checkbox_item.attr("id");
- var field_id = id.split("_")[2];
- var label_id = id.replace("choice_", "#label_");
- var label_element = jQuery(label_id);
- var label = gformGetOptionLabel(label_element, checkbox_item.val(), 0, form_id, field_id);
- label_element.html(label);
- });
- //Radio button auto-calculating lables
- jQuery(".gfield_option" + suffix + ", .gfield_shipping_" + form_id).find(".gfield_radio").each(function(){
- var selected_price = 0;
- var radio_field = jQuery(this);
- var id = radio_field.attr("id");
- var fieldId = id.split("_")[2];
- var selected_value = radio_field.find("input:checked").val();
- if(selected_value)
- selected_price = gformGetPrice(selected_value);
- jQuery(this).find("input").each(function(){
- var radio_item = jQuery(this);
- var label_id = radio_item.attr("id").replace("choice_", "#label_");
- var label_element = jQuery(label_id);
- var label = gformGetOptionLabel(label_element, radio_item.val(), selected_price, form_id, fieldId);
- label_element.html(label);
- });
- });
- jQuery(".gfield_option" + suffix).find("input:checked, select").each(function(){
- if(!gformIsHidden(jQuery(this)))
- price += gformGetPrice(jQuery(this).val());
- });
- var quantity = gformGetProductQuantity( form_id, productFieldId );
- //setting global variable if quantity is more than 0 (a product was selected). Will be used when calculating total
- if(quantity > 0)
- _anyProductSelected = true;
- price = price * quantity;
- price = Math.round(price * 100) / 100;
- return price;
- }
- function gformGetProductQuantity( formId, productFieldId ) {
- var quantity,
- quantityInput = jQuery( '#ginput_quantity_' + formId + '_' + productFieldId);
- if( quantityInput.length > 0 ) {
- quantity = ! gformIsNumber( quantityInput.val() ) ? 0 : quantityInput.val();
- } else {
- quantityElement = jQuery( '.gfield_quantity_' + formId + '_' + productFieldId);
- quantity = 1;
- if( quantityElement.find( 'select' ).length > 0 ) {
- quantity = quantityElement.find( 'select' ).val();
- } else if( quantityElement.find( 'input' ).length > 0 ) {
- quantity = quantityElement.find( 'input' ).val();
- }
- if( ! gformIsNumber( quantity ) )
- quantity = 0;
- }
- quantity = parseFloat( quantity );
- return quantity;
- }
- function gformGetBasePrice(formId, productFieldId){
- var suffix = "_" + formId + "_" + productFieldId;
- var price = 0;
- var productField = jQuery("#ginput_base_price" + suffix+ ", .gfield_donation" + suffix + " input[type=\"text\"], .gfield_product" + suffix + " .ginput_amount");
- if(productField.length > 0){
- price = productField.val();
- //If field is hidden by conditional logic, don't count it for the total
- if(gformIsHidden(productField)){
- price = 0;
- }
- }
- else
- {
- productField = jQuery(".gfield_product" + suffix + " select, .gfield_product" + suffix + " input:checked, .gfield_donation" + suffix + " select, .gfield_donation" + suffix + " input:checked");
- var val = productField.val();
- if(val){
- val = val.split("|");
- price = val.length > 1 ? val[1] : 0;
- }
- //If field is hidden by conditional logic, don't count it for the total
- if(gformIsHidden(productField))
- price = 0;
- }
- var c = new Currency(gf_global.gf_currency_config);
- price = c.toNumber(price);
- return price === false ? 0 : price;
- }
- function gformFormatMoney(text){
- if(!gf_global.gf_currency_config)
- return text;
- var currency = new Currency(gf_global.gf_currency_config);
- return currency.toMoney(text);
- }
- function gformFormatPricingField(element){
- if(gf_global.gf_currency_config){
- var currency = new Currency(gf_global.gf_currency_config);
- var price = currency.toMoney(jQuery(element).val());
- jQuery(element).val(price);
- }
- }
- function gformToNumber(text){
- var currency = new Currency(gf_global.gf_currency_config);
- return currency.toNumber(text);
- }
- function gformGetPriceDifference(currentPrice, newPrice){
- //getting price difference
- var diff = parseFloat(newPrice) - parseFloat(currentPrice);
- price = gformFormatMoney(diff);
- if(diff > 0)
- price = "+" + price;
- return price;
- }
- function gformGetOptionLabel(element, selected_value, current_price, form_id, field_id){
- element = jQuery(element);
- var price = gformGetPrice(selected_value);
- var current_diff = element.attr('price');
- var original_label = element.html().replace(/<span(.*)<\/span>/i, "").replace(current_diff, "");
- var diff = gformGetPriceDifference(current_price, price);
- diff = gformToNumber(diff) == 0 ? "" : " " + diff;
- element.attr('price', diff);
- //don't add <span> for drop down items (not supported)
- var price_label = element[0].tagName.toLowerCase() == "option" ? " " + diff : "<span class='ginput_price'>" + diff + "</span>";
- var label = original_label + price_label;
- //calling hook to allow for custom option formatting
- if(window["gform_format_option_label"])
- label = gform_format_option_label(label, original_label, price_label, current_price, price, form_id, field_id);
- return label;
- }
- function gformGetProductIds(parent_class, element){
- var classes = jQuery(element).hasClass(parent_class) ? jQuery(element).attr("class").split(" ") : jQuery(element).parents("." + parent_class).attr("class").split(" ");
- for(var i=0; i<classes.length; i++){
- if(classes[i].substr(0, parent_class.length) == parent_class && classes[i] != parent_class)
- return {formId: classes[i].split("_")[2], productFieldId: classes[i].split("_")[3]};
- }
- return {formId:0, fieldId:0};
- }
- function gformGetPrice(text){
- var val = text.split("|");
- var currency = new Currency(gf_global.gf_currency_config);
- if(val.length > 1 && currency.toNumber(val[1]) !== false)
- return currency.toNumber(val[1]);
- return 0;
- }
- function gformRegisterPriceField(item){
- if(!_gformPriceFields[item.formId])
- _gformPriceFields[item.formId] = new Array();
- //ignore price fields that have already been registered
- for(var i=0; i<_gformPriceFields[item.formId].length; i++)
- if(_gformPriceFields[item.formId][i] == item.productFieldId)
- return;
- //registering new price field
- _gformPriceFields[item.formId].push(item.productFieldId);
- }
- function gformInitPriceFields(){
- jQuery(".gfield_price").each(function(){
- var productIds = gformGetProductIds("gfield_price", this);
- gformRegisterPriceField(productIds);
- jQuery(this).find("input[type=\"text\"], input[type=\"number\"], select").change(function(){
- var productIds = gformGetProductIds("gfield_price", this);
- if(productIds.formId == 0)
- productIds = gformGetProductIds("gfield_shipping", this);
- jQuery(document).trigger('gform_price_change', [productIds, this]);
- gformCalculateTotalPrice(productIds.formId);
- });
- jQuery(this).find("input[type=\"radio\"], input[type=\"checkbox\"]").click(function(){
- var productIds = gformGetProductIds("gfield_price", this);
- if(productIds.formId == 0)
- productIds = gformGetProductIds("gfield_shipping", this);
- jQuery(document).trigger('gform_price_change', [productIds, this]);
- gformCalculateTotalPrice(productIds.formId);
- });
- });
- for(formId in _gformPriceFields){
- //needed when implementing for in loops
- if(!_gformPriceFields.hasOwnProperty(formId))
- continue;
- gformCalculateTotalPrice(formId);
- }
- }
- //-------------------------------------------
- //---------- PASSWORD -----------------------
- //-------------------------------------------
- function gformShowPasswordStrength(fieldId){
- var password = jQuery("#" + fieldId).val();
- var confirm = jQuery("#" + fieldId + "_2").val();
- var result = gformPasswordStrength(password, confirm);
- var text = window['gf_text']["password_" + result];
- jQuery("#" + fieldId + "_strength").val(result);
- jQuery("#" + fieldId + "_strength_indicator").removeClass("blank mismatch short good bad strong").addClass(result).html(text);
- }
- // Password strength meter
- function gformPasswordStrength(password1, password2) {
- var shortPass = 1, badPass = 2, goodPass = 3, strongPass = 4, mismatch = 5, symbolSize = 0, natLog, score;
- if(password1.length <=0)
- return "blank";
- // password 1 != password 2
- if ( (password1 != password2) && password2.length > 0)
- return "mismatch";
- //password < 4
- if ( password1.length < 4 )
- return "short";
- if ( password1.match(/[0-9]/) )
- symbolSize +=10;
- if ( password1.match(/[a-z]/) )
- symbolSize +=26;
- if ( password1.match(/[A-Z]/) )
- symbolSize +=26;
- if ( password1.match(/[^a-zA-Z0-9]/) )
- symbolSize +=31;
- natLog = Math.log( Math.pow(symbolSize, password1.length) );
- score = natLog / Math.LN2;
- if (score < 40 )
- return "bad";
- if (score < 56 )
- return "good";
- return "strong";
- }
- //----------------------------
- //------ LIST FIELD ----------
- //----------------------------
- var gfield_original_title = "";
- function gformAddListItem(element, max){
- if(jQuery(element).hasClass("gfield_icon_disabled"))
- return;
- var tr = jQuery(element).closest('tr');
- var clone = tr.clone();
- clone.find("input, select").val("").attr("tabindex", clone.find('input:last').attr("tabindex"));
- tr.after(clone);
- gformToggleIcons(tr.parent(), max);
- gformAdjustClasses(tr.parent());
- }
- function gformDeleteListItem(element, max){
- var tr = jQuery(element).parent().parent();
- var parent = tr.parent();
- tr.remove();
- gformToggleIcons(parent, max);
- gformAdjustClasses(parent);
- }
- function gformAdjustClasses(table){
- var rows = table.children();
- for(var i=0; i<rows.length; i++){
- var odd_even_class = (i+1) % 2 == 0 ? "gfield_list_row_even" : "gfield_list_row_odd";
- jQuery(rows[i]).removeClass("gfield_list_row_odd").removeClass("gfield_list_row_even").addClass(odd_even_class);
- }
- }
- function gformToggleIcons(table, max){
- var rowCount = table.children().length;
- if(rowCount == 1){
- table.find(".delete_list_item").css("visibility", "hidden");
- }
- else{
- table.find(".delete_list_item").css("visibility", "visible");
- }
- if(max > 0 && rowCount >= max){
- gfield_original_title = table.find(".add_list_item:first").attr("title");
- table.find(".add_list_item").addClass("gfield_icon_disabled").attr("title", "");
- }
- else{
- var addIcons = table.find(".add_list_item");
- addIcons.removeClass("gfield_icon_disabled");
- if(gfield_original_title)
- addIcons.attr("title", gfield_original_title);
- }
- }
- //-----------------------------------
- //------ CREDIT CARD FIELD ----------
- //-----------------------------------
- function gformMatchCard(id) {
- var cardType = gformFindCardType(jQuery('#' + id).val());
- var cardContainer = jQuery('#' + id).parents('.gfield').find('.gform_card_icon_container');
- if(!cardType) {
- jQuery(cardContainer).find('.gform_card_icon').removeClass('gform_card_icon_selected gform_card_icon_inactive');
- } else {
- jQuery(cardContainer).find('.gform_card_icon').removeClass('gform_card_icon_selected').addClass('gform_card_icon_inactive');
- jQuery(cardContainer).find('.gform_card_icon_' + cardType).removeClass('gform_card_icon_inactive').addClass('gform_card_icon_selected');
- }
- }
- function gformFindCardType(value) {
- if(value.length < 4)
- return false;
- var rules = window['gf_cc_rules'];
- var validCardTypes = new Array();
- for(type in rules) {
- //needed when implementing for in loops
- if(!rules.hasOwnProperty(type))
- continue;
- for(i in rules[type]) {
- if(!rules[type].hasOwnProperty(i))
- continue;
- if(rules[type][i].indexOf(value.substring(0, rules[type][i].length)) === 0) {
- validCardTypes[validCardTypes.length] = type;
- break;
- }
- }
- }
- return validCardTypes.length == 1 ? validCardTypes[0].toLowerCase() : false;
- }
- function gformToggleCreditCard(){
- if(jQuery("#gform_payment_method_creditcard").is(":checked"))
- jQuery(".gform_card_fields_container").slideDown();
- else
- jQuery(".gform_card_fields_container").slideUp();
- }
- //----------------------------------------
- //------ CHOSEN DROP DOWN FIELD ----------
- //----------------------------------------
- function gformInitChosenFields(fieldList, noResultsText){
- return jQuery(fieldList).each(function(){
- var element = jQuery(this);
- //only initialize once
- if( element.is(":visible") && element.siblings(".chosen-container").length == 0 ){
- var options = gform.applyFilters( 'gform_chosen_options', { no_results_text: noResultsText }, element );
- element.chosen( options );
- }
- });
- }
- //----------------------------------------
- //--- CURRENCY FORMAT NUMBER FIELD -------
- //----------------------------------------
- function gformInitCurrencyFormatFields(fieldList){
- jQuery(fieldList).each(function(){
- var $this = jQuery(this);
- $this.val( gformFormatMoney( jQuery(this).val() ) );
- }).change( function( event ) {
- jQuery(this).val( gformFormatMoney( jQuery(this).val() ) );
- });
- }
- //----------------------------------------
- //------ CALCULATION FUNCTIONS -----------
- //----------------------------------------
- var GFCalc = function(formId, formulaFields){
- this.patt = /{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/i;
- this.exprPatt = /^[0-9 -/*\(\)]+$/i;
- this.isCalculating = {};
- this.init = function(formId, formulaFields) {
- var calc = this;
- jQuery(document).bind("gform_post_conditional_logic", function(){
- for(var i=0; i<formulaFields.length; i++) {
- var formulaField = jQuery.extend({}, formulaFields[i]);
- calc.runCalc(formulaField, formId);
- }
- });
- for(var i=0; i<formulaFields.length; i++) {
- var formulaField = jQuery.extend({}, formulaFields[i]);
- this.runCalc(formulaField, formId);
- this.bindCalcEvents(formulaField, formId);
- }
- }
- this.runCalc = function(formulaField, formId) {
- var calcObj = this,
- field = jQuery('#field_' + formId + '_' + formulaField.field_id),
- formulaInput = jQuery('#input_' + formId + '_' + formulaField.field_id),
- previous_val = formulaInput.val(),
- formula = gform.applyFilters( 'gform_calculation_formula', formulaField.formula, formulaField, formId, calcObj ),
- expr = calcObj.replaceFieldTags( formId, formula, formulaField ).replace(/(\r\n|\n|\r)/gm,""),
- result = '';
- if(calcObj.exprPatt.test(expr)) {
- try {
- //run calculation
- result = eval(expr);
- } catch( e ) { }
- }
- // if result is postive infinity, negative infinity or a NaN, defaults to 0
- if( ! isFinite( result ) )
- result = 0;
- // allow users to modify result with their own function
- if( window["gform_calculation_result"] ) {
- result = window["gform_calculation_result"](result, formulaField, formId, calcObj);
- if( window.console )
- console.log( '"gform_calculation_result" function is deprecated since version 1.8! Use "gform_calculation_result" JS hook instead.' );
- }
- // allow users to modify result with their own function
- result = gform.applyFilters( 'gform_calculation_result', result, formulaField, formId, calcObj );
- // allow result to be custom formatted
- var formattedResult = gform.applyFilters( 'gform_calculation_format_result', false, result, formulaField, formId, calcObj );
- var numberFormat = gf_global.number_formats[formId][formulaField.field_id];
- //formatting number
- if( formattedResult !== false) {
- result = formattedResult;
- }
- else if( field.hasClass( 'gfield_price' ) || numberFormat == "currency") {
- result = gformFormatMoney(result ? result : 0);
- }
- else {
- var decimalSeparator = ".";
- var thousandSeparator = ",";
- if(numberFormat == "decimal_comma"){
- decimalSeparator = ",";
- thousandSeparator = ".";
- }
- result = gformFormatNumber(result, !gformIsNumber(formulaField.rounding) ? -1 : formulaField.rounding, decimalSeparator, thousandSeparator);
- }
- //If value doesn't change, abort.
- //This is needed to prevent an infinite loop condition with conditional logic
- if( result == previous_val )
- return;
- // if this is a calculation product, handle differently
- if(field.hasClass('gfield_price')) {
- formulaInput.text(result);
- jQuery('#ginput_base_price_' + formId + '_' + formulaField.field_id).val(result).trigger('change');
- gformCalculateTotalPrice(formId);
- } else {
- formulaInput.val(result).trigger('change');
- }
- }
- this.bindCalcEvents = function(formulaField, formId) {
- var calcObj = this;
- var formulaFieldId = formulaField.field_id;
- var matches = getMatchGroups(formulaField.formula, this.patt);
- calcObj.isCalculating[formulaFieldId] = false;
- for(var i in matches) {
- if(! matches.hasOwnProperty(i))
- continue;
- var inputId = matches[i][1];
- var fieldId = parseInt(inputId);
- var input = jQuery('#field_' + formId + '_' + fieldId).find('input[name="input_' + inputId + '"], select[name="input_' + inputId + '"]');
- if(input.prop('type') == 'checkbox' || input.prop('type') == 'radio') {
- jQuery(input).click(function(){
- calcObj.bindCalcEvent(inputId, formulaField, formId, 0);
- });
- } else
- if(input.is('select') || input.prop('type') == 'hidden') {
- jQuery(input).change(function(){
- calcObj.bindCalcEvent(inputId, formulaField, formId, 0);
- });
- } else {
- jQuery(input).keydown(function(){
- calcObj.bindCalcEvent(inputId, formulaField, formId);
- }).change(function(){
- calcObj.bindCalcEvent(inputId, formulaField, formId, 0);
- });
- }
- }
- }
- this.bindCalcEvent = function(inputId, formulaField, formId, delay) {
- var calcObj = this;
- var formulaFieldId = formulaField.field_id;
- delay = delay == undefined ? 345 : delay;
- if(calcObj.isCalculating[formulaFieldId][inputId])
- clearTimeout(calcObj.isCalculating[formulaFieldId][inputId]);
- calcObj.isCalculating[formulaFieldId][inputId] = window.setTimeout(function() {
- calcObj.runCalc(formulaField, formId);
- }, delay);
- }
- this.replaceFieldTags = function( formId, expr, formulaField ) {
- var matches = getMatchGroups(expr, this.patt);
- var origExpr = expr;
- for(i in matches) {
- if(! matches.hasOwnProperty(i))
- continue;
- var inputId = matches[i][1];
- var fieldId = parseInt(inputId);
- var columnId = matches[i][3];
- var value = 0;
- var input = jQuery('#field_' + formId + '_' + fieldId).find('input[name="input_' + inputId + '"], select[name="input_' + inputId + '"]');
- // radio buttons will return multiple inputs, checkboxes will only return one but it may not be selected, filter out unselected inputs
- if( input.length > 1 || input.prop('type') == 'checkbox' )
- input = input.filter(':checked');
- var isVisible = window['gf_check_field_rule'] ? gf_check_field_rule( formId, fieldId, true, '' ) == 'show' : true;
- if( input.length > 0 && isVisible ) {
- var val = input.val();
- val = val.split( '|' );
- if( val.length > 1 ) {
- value = val[1];
- } else {
- value = input.val();
- }
- }
- var numberFormat = gf_global.number_formats[formId][fieldId];
- if( ! numberFormat )
- numberFormat = gf_global.number_formats[formId][formulaField.field_id];
- var decimalSeparator = gformGetDecimalSeparator(numberFormat);
- value = gformCleanNumber( value, '', '', decimalSeparator );
- if( ! value )
- value = 0;
- expr = expr.replace( matches[i][0], value );
- }
- return expr;
- }
- this.init(formId, formulaFields);
- }
- function gformFormatNumber(number, rounding, decimalSeparator, thousandSeparator){
- if(typeof decimalSeparator == "undefined"){
- if(window['gf_global']){
- var currency = new Currency(gf_global.gf_currency_config);
- decimalSeparator = currency.currency["decimal_separator"];
- }
- else{
- decimalSeparator = ".";
- }
- }
- if(typeof thousandSeparator == "undefined"){
- if(window['gf_global']){
- var currency = new Currency(gf_global.gf_currency_config);
- thousandSeparator = currency.currency["thousand_separator"];
- }
- else{
- thousandSeparator = ",";
- }
- }
- var currency = new Currency();
- return currency.numberFormat(number, rounding, decimalSeparator, thousandSeparator, false)
- }
- function gformToNumber(text) {
- var currency = new Currency(gf_global.gf_currency_config);
- return currency.toNumber(text);
- }
- function getMatchGroups(expr, patt) {
- var matches = new Array();
- while(patt.test(expr)) {
- var i = matches.length;
- matches[i] = patt.exec(expr)
- expr = expr.replace('' + matches[i][0], '');
- }
- return matches;
- }
- //----------------------------------------
- //------ JAVASCRIPT HOOK FUNCTIONS -------
- //----------------------------------------
- var gform = {
- hooks: { action: {}, filter: {} },
- addAction: function( action, callable, priority, tag ) {
- gform.addHook( 'action', action, callable, priority, tag );
- },
- addFilter: function( action, callable, priority, tag ) {
- gform.addHook( 'filter', action, callable, priority, tag );
- },
- doAction: function( action ) {
- gform.doHook( 'action', action, arguments );
- },
- applyFilters: function( action ) {
- return gform.doHook( 'filter', action, arguments );
- },
- removeAction: function( action, tag ) {
- gform.removeHook( 'action', action, tag );
- },
- removeFilter: function( action, priority, tag ) {
- gform.removeHook( 'filter', action, priority, tag );
- },
- addHook: function( hookType, action, callable, priority, tag ) {
- if ( undefined == gform.hooks[hookType][action] ) {
- gform.hooks[hookType][action] = [];
- }
- var hooks = gform.hooks[hookType][action];
- if ( undefined == tag ) {
- tag = action + '_' + hooks.length;
- }
- gform.hooks[hookType][action].push( { tag:tag, callable:callable, priority:priority } );
- },
- doHook: function( hookType, action, args ) {
- // splice args from object into array and remove first index which is the hook name
- args = Array.prototype.slice.call(args, 1);
- if ( undefined != gform.hooks[hookType][action] ) {
- var hooks = gform.hooks[hookType][action], hook;
- //sort by priority
- hooks.sort(function(a,b){return a["priority"]-b["priority"]});
- for( var i=0; i<hooks.length; i++) {
- hook = hooks[i].callable;
- if(typeof hook != 'function')
- hook = window[hook];
- if ( 'action' == hookType ) {
- hook.apply(null, args);
- } else {
- args[0] = hook.apply(null, args);
- }
- }
- }
- if ( 'filter'==hookType ) {
- return args[0];
- }
- },
- removeHook: function( hookType, action, priority, tag ) {
- if ( undefined != gform.hooks[hookType][action] ) {
- var hooks = gform.hooks[hookType][action];
- for( var i=hooks.length-1; i>=0; i--) {
- if ((undefined==tag||tag==hooks[i].tag) && (undefined==priority||priority==hooks[i].priority)){
- hooks.splice(i,1);
- }
- }
- }
- }
- };
- //----------------------------------------
- //------ MULTIFILE UPLOAD FUNCTIONS ------
- //----------------------------------------
- (function (gfMultiFileUploader, $) {
- gfMultiFileUploader.uploaders = {};
- var strings = typeof gform_gravityforms != 'undefined' ? gform_gravityforms.strings : {};
- var imagesUrl = typeof gform_gravityforms != 'undefined' ? gform_gravityforms.vars.images_url : "";
- $(document).ready(function () {
- if((typeof adminpage !== 'undefined' && adminpage === 'toplevel_page_gf_edit_forms')|| typeof plupload == 'undefined'){
- $(".gform_button_select_files").prop("disabled", true);
- } else if (typeof adminpage !== 'undefined'){
- $(".gform_fileupload_multifile").each(function(){
- setup(this);
- });
- } else {
- $(document).bind('gform_post_render', function(e, formID){
- $("form#gform_" + formID + " .gform_fileupload_multifile").each(function(){
- setup(this);
- });
- var $form = $("form#gform_" + formID);
- if($form.length > 0){
- $form.submit(function(){
- var pendingUploads = false;
- $.each(gfMultiFileUploader.uploaders, function(i, uploader){
- if(uploader.total.queued>0){
- pendingUploads = true;
- return false;
- }
- });
- if(pendingUploads){
- alert(strings.currently_uploading);
- window["gf_submitting_" + formID] = false;
- return false;
- }
- });
- }
- });
- $(document).bind("gform_post_conditional_logic", function(e,formID, fields, isInit){
- if(!isInit){
- $.each(gfMultiFileUploader.uploaders, function(i, uploader){
- uploader.refresh();
- });
- }
- });
- }
- });
- function setup(uploadElement){
- var settings = $(uploadElement).data('settings');
- var uploader = new plupload.Uploader(settings);
- formID = uploader.settings.multipart_params.form_id;
- gfMultiFileUploader.uploaders[settings.container] = uploader;
- var formID;
- var uniqueID;
- uploader.bind('Init', function(up, params) {
- if(!up.features.dragdrop)
- $(".gform_drop_instructions").hide();
- var fieldID = up.settings.multipart_params.field_id;
- var maxFiles = parseInt(up.settings.gf_vars.max_files);
- var initFileCount = countFiles(fieldID);
- if(maxFiles > 0 && initFileCount >= maxFiles){
- gfMultiFileUploader.toggleDisabled(up.settings, true);
- }
- });
- gfMultiFileUploader.toggleDisabled = function (settings, disabled){
- var button = typeof settings.browse_button == "string" ? $("#" + settings.browse_button) : $(settings.browse_button);
- button.prop("disabled", disabled);
- }
- function addMessage(messagesID, message){
- $("#" + messagesID).prepend("<li>" + message + "</li>");
- }
- uploader.init();
- uploader.bind('FilesAdded', function(up, files) {
- var max = parseInt(up.settings.gf_vars.max_files),
- fieldID = up.settings.multipart_params.field_id,
- totalCount = countFiles(fieldID),
- disallowed = up.settings.gf_vars.disallowed_extensions,
- extension;
- if( max > 0 && totalCount >= max){
- $.each(files, function(i, file) {
- up.removeFile(file);
- return;
- })
- return;
- }
- $.each(files, function(i, file) {
- extension = file.name.split('.').pop();
- if($.inArray(extension, disallowed) > -1){
- addMessage(up.settings.gf_vars.message_id, file.name + " - " + strings.illegal_extension);
- up.removeFile(file);
- return;
- }
- if ((file.status == plupload.FAILED) || (max > 0 && totalCount >= max)){
- up.removeFile(file);
- return;
- }
- var size = typeof file.size !== 'undefined' ? plupload.formatSize(file.size) : strings.in_progress;
- var status = '<div id="'
- + file.id
- + '" class="ginput_preview">'
- + file.name
- + ' (' + size + ') <b></b> '
- + '<a href="javascript:void(0)" title="' + strings.cancel_upload + '" onclick=\'$this=jQuery(this); var uploader = gfMultiFileUploader.uploaders.' + up.settings.container + ';uploader.stop();uploader.removeFile(uploader.getFile("' + file.id +'"));$this.after("' + strings.cancelled + '"); uploader.start();$this.remove();\'>' + strings.cancel + '</a>'
- + '</div>';
- $('#' + up.settings.filelist).prepend(status);
- totalCount++;
- });
- up.refresh(); // Reposition Flash
- var formElementID = "form#gform_" + formID;
- var uidElementID = "input:hidden[name='gform_unique_id']";
- var uidSelector = formElementID + " " + uidElementID;
- var $uid = $(uidSelector);
- if($uid.length==0){
- $uid = $(uidElementID);
- }
- uniqueID = $uid.val();
- if('' === uniqueID){
- uniqueID = generateUniqueID();
- $uid.val(uniqueID);
- }
- if(max > 0 && totalCount >= max){
- addMessage(up.settings.gf_vars.message_id, strings.max_reached)
- gfMultiFileUploader.toggleDisabled(up.settings, true);
- }
- up.settings.multipart_params.gform_unique_id = uniqueID;
- up.start();
- });
- uploader.bind('UploadProgress', function(up, file) {
- var html = file.percent + "%";
- $('#' + file.id + " b").html(html);
- });
- uploader.bind('Error', function(up, err) {
- if(err.code === plupload.FILE_EXTENSION_ERROR){
- var extensions = typeof up.settings.filters.mime_types != 'undefined' ? up.settings.filters.mime_types[0].extensions /* plupoad 2 */ : up.settings.filters[0].extensions;
- addMessage(up.settings.gf_vars.message_id, err.file.name + " - " + strings.invalid_file_extension + " " + extensions);
- } else if (err.code === plupload.FILE_SIZE_ERROR) {
- addMessage(up.settings.gf_vars.message_id, err.file.name + " - " + strings.file_exceeds_limit);
- } else {
- var m = "<li>Error: " + err.code +
- ", Message: " + err.message +
- (err.file ? ", File: " + err.file.name : "") +
- "</li>";
- addMessage(up.settings.gf_vars.message_id, m);
- }
- $('#' + err.file.id ).html('');
- up.refresh(); // Reposition Flash
- });
- uploader.bind('FileUploaded', function(up, file, result) {
- var response = $.secureEvalJSON(result.response);
- if(response.status == "error"){
- addMessage(up.settings.gf_vars.message_id, file.name + " - " + response.error.message);
- $('#' + file.id ).html('');
- return;
- }
- var html = '<strong>' + file.name + '</strong>';
- var formId = up.settings.multipart_params.form_id;
- var fieldId = up.settings.multipart_params.field_id;
- html = "<img "
- + "class='gform_delete' "
- + "src='" + imagesUrl + "/delete.png' "
- + "onclick='gformDeleteUploadedFile(" + formId + "," + fieldId + ", this);' "
- + "alt='"+ strings.delete_file + "' "
- + "title='" + strings.delete_file
- + "' /> "
- + html;
- $('#' + file.id ).html(html);
- var fieldID = up.settings.multipart_params["field_id"];
- if(file.percent == 100){
- if(response.status && response.status == 'ok'){
- addFile(fieldID, response.data);
- } else {
- addMessage(up.settings.gf_vars.message_id, strings.unknown_error);
- }
- }
- });
- function getAllFiles(){
- var selector = '#gform_uploaded_files_' + formID,
- $uploadedFiles = $(selector), files;
- files = $uploadedFiles.val();
- files = '' === files ? {} : $.parseJSON(files);
- return files;
- }
- function getFiles(fieldID){
- var allFiles = getAllFiles();
- var inputName = getInputName(fieldID);
- if(typeof allFiles[inputName] == 'undefined')
- allFiles[inputName] = [];
- return allFiles[inputName];
- }
- function countFiles(fieldID){
- var files = getFiles(fieldID);
- return files.length;
- }
- function addFile(fieldID, fileInfo){
- var files = getFiles(fieldID);
- files.unshift(fileInfo);
- setUploadedFiles(fieldID, files);
- }
- function setUploadedFiles(fieldID, files){
- var allFiles = getAllFiles();
- var $uploadedFiles = $('#gform_uploaded_files_' + formID);
- var inputName = getInputName(fieldID);
- allFiles[inputName] = files;
- $uploadedFiles.val($.toJSON(allFiles));
- }
- function getInputName(fieldID){
- return "input_" + fieldID;
- }
- // fixes drag and drop in IE10
- $("#" + settings.drop_element).on({
- "dragenter": ignoreDrag,
- "dragover": ignoreDrag
- });
- function ignoreDrag( e ) {
- e.preventDefault();
- }
- }
- function generateUniqueID() {
- return 'xxxxxxxx'.replace(/[xy]/g, function (c) {
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : r & 0x3 | 0x8;
- return v.toString(16);
- });
- }
- }(window.gfMultiFileUploader = window.gfMultiFileUploader || {}, jQuery));
- //----------------------------------------
- //------ GENERAL FUNCTIONS -------
- //----------------------------------------
- function gformInitSpinner( formId, spinnerUrl ) {
- if( typeof spinnerUrl == 'undefined' || ! spinnerUrl )
- spinnerUrl = gform.applyFilters( "gform_spinner_url", gf_global.spinnerUrl, formId );
- jQuery('#gform_' + formId).submit(function () {
- if (jQuery('#gform_ajax_spinner_' + formId).length == 0) {
- jQuery('#gform_submit_button_' + formId + ', #gform_wrapper_' + formId + ' .gform_next_button')
- .after('<img id="gform_ajax_spinner_' + formId + '" class="gform_ajax_spinner" src="' + spinnerUrl + '" alt="" />');
- }
- });
- }
- /*============================================
- Stripe
- ==============================================*/
- (function(){var e,t,n,r,i,s={}.hasOwnProperty,o=function(e,t){function r(){this.constructor=e}for(var n in t)s.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e},u=this;this.Stripe=function(){function e(){}return e.version=2,e.endpoint="https://api.stripe.com/v1",e.setPublishableKey=function(t){return e.key=t,e.utils.validateProtocol(e.key)},e._corsGateAmount=0,e._corsGate=function(){return Math.random()<this._corsGateAmount},e._transport=typeof window!="undefined"&&window!==null&&e._corsGate()&&"XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest?"cors":"jsonp",e.request=function(t){return t.data.payment_user_agent?t.data.payment_user_agent=""+t.data.payment_user_agent+" ("+e.stripejs_ua+")":t.data.payment_user_agent=e.stripejs_ua,this._transport==="cors"?this.xhr(t):this.ajaxJSONP(t)},e.complete=function(t,n){return function(r,i,s){var o;if(r!=="success")return o=Math.round((new Date).getTime()/1e3),(new Image).src="https://q.stripe.com?event=stripejs-error&type="+r+"&key="+e.key+"×tamp="+o+"&payment_user_agent="+encodeURIComponent(e.stripejs_ua),typeof t=="function"?t(500,{error:{code:r,type:r,message:n}}):void 0}},e}.call(this),e=this.Stripe,this.Stripe.token=function(){function t(){}return t.validate=function(e,t){if(!e)throw t+" required";if(typeof e!="object")throw t+" invalid"},t.formatData=function(t,n){return e.utils.isElement(t)&&(t=e.utils.paramsFromForm(t,n)),e.utils.underscoreKeys(t),t},t.create=function(t,n){return t.key||(t.key=e.key||e.publishableKey),e.utils.validateKey(t.key),e.request({url:""+e.endpoint+"/tokens",data:t,method:"POST",success:function(e,t){return typeof n=="function"?n(t,e):void 0},complete:e.complete(n,"A network error has occurred, and you have not been charged. Please try again."),timeout:4e4})},t.get=function(t,n){if(!t)throw"token required";return e.utils.validateKey(e.key),e.request({url:""+e.endpoint+"/tokens/"+t,data:{key:e.key},success:function(e,t){return typeof n=="function"?n(t,e):void 0},complete:e.complete(n,"A network error has occurred loading data from Stripe. Please try again."),timeout:4e4})},t}.call(this),this.Stripe.card=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return o(n,t),n.tokenName="card",n.whitelistedAttrs=["number","cvc","exp_month","exp_year","name","address_line1","address_line2","address_city","address_state","address_zip","address_country"],n.createToken=function(t,r,i){var s;return r==null&&(r={}),e.token.validate(t,"card"),typeof r=="function"?(i=r,r={}):typeof r!="object"&&(s=parseInt(r,10),r={},s>0&&(r.amount=s)),r[n.tokenName]=e.token.formatData(t,n.whitelistedAttrs),e.token.create(r,i)},n.getToken=function(t,n){return e.token.get(t,n)},n.validateCardNumber=function(e){return e=(e+"").replace(/\s+|-/g,""),e.length>=10&&e.length<=16&&n.luhnCheck(e)},n.validateCVC=function(t){return t=e.utils.trim(t),/^\d+$/.test(t)&&t.length>=3&&t.length<=4},n.validateExpiry=function(t,n){var r,i;return t=e.utils.trim(t),n=e.utils.trim(n),/^\d+$/.test(t)?/^\d+$/.test(n)?1<=t&&t<=12?(n.length===2&&(n<70?n="20"+n:n="19"+n),n.length!==4?!1:(i=new Date(n,t),r=new Date,i.setMonth(i.getMonth()-1),i.setMonth(i.getMonth()+1,1),i>r)):!1:!1:!1},n.luhnCheck=function(e){var t,n,r,i,s,o;r=!0,i=0,n=(e+"").split("").reverse();for(s=0,o=n.length;s<o;s++){t=n[s],t=parseInt(t,10);if(r=!r)t*=2;t>9&&(t-=9),i+=t}return i%10===0},n.cardType=function(e){return n.cardTypes[e.slice(0,2)]||"Unknown"},n.cardBrand=function(e){return n.cardType(e)},n.cardTypes=function(){var e,t,n,r;t={};for(e=n=40;n<=49;e=++n)t[e]="Visa";for(e=r=50;r<=59;e=++r)t[e]="MasterCard";return t[34]=t[37]="American Express",t[60]=t[62]=t[64]=t[65]="Discover",t[35]="JCB",t[30]=t[36]=t[38]=t[39]="Diners Club",t}(),n}.call(this,this.Stripe.token),this.Stripe.bankAccount=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return o(n,t),n.tokenName="bank_account",n.whitelistedAttrs=["country","routing_number","account_number"],n.createToken=function(t,r,i){return r==null&&(r={}),e.token.validate(t,"bank account"),typeof r=="function"&&(i=r,r={}),r[n.tokenName]=e.token.formatData(t,n.whitelistedAttrs),e.token.create(r,i)},n.getToken=function(t,n){return e.token.get(t,n)},n.validateRoutingNumber=function(t,r){t=e.utils.trim(t);switch(r){case"US":return/^\d+$/.test(t)&&t.length===9&&n.routingChecksum(t);case"CA":return/\d{5}\-\d{3}/.test(t)&&t.length===9;default:return!0}},n.validateAccountNumber=function(t,n){t=e.utils.trim(t);switch(n){case"US":return/^\d+$/.test(t)&&t.length>=1&&t.length<=17;default:return!0}},n.routingChecksum=function(e){var t,n,r,i,s,o;r=0,t=(e+"").split(""),o=[0,3,6];for(i=0,s=o.length;i<s;i++)n=o[i],r+=parseInt(t[n])*3,r+=parseInt(t[n+1])*7,r+=parseInt(t[n+2]);return r!==0&&r%10===0},n}.call(this,this.Stripe.token),this.Stripe.bitcoinReceiver=function(){function t(){}return t._whitelistedAttrs=["amount","currency","email","description"],t.createReceiver=function(t,n){var r;return e.token.validate(t,"bitcoin_receiver data"),r=e.token.formatData(t,this._whitelistedAttrs),r.key=e.key||e.publishableKey,e.utils.validateKey(r.key),e.request({url:""+e.endpoint+"/bitcoin/receivers",data:r,method:"POST",success:function(e,t){return typeof n=="function"?n(t,e):void 0},complete:e.complete(n,"A network error has occurred while creating a Bitcoin address. Please try again."),timeout:4e4})},t.getReceiver=function(t,n){var r;if(!t)throw"receiver id required";return r=e.key||e.publishableKey,e.utils.validateKey(r),e.request({url:""+e.endpoint+"/bitcoin/receivers/"+t,data:{key:r},success:function(e,t){return typeof n=="function"?n(t,e):void 0},complete:e.complete(n,"A network error has occurred loading data from Stripe. Please try again."),timeout:4e4})},t._activeReceiverPolls={},t._clearReceiverPoll=function(e){return delete t._activeReceiverPolls[e]},t._pollInterval=1500,t.pollReceiver=function(e,t){if(this._activeReceiverPolls[e]!=null)throw"You are already polling receiver "+e+". Please cancel that poll before polling it again.";return this._activeReceiverPolls[e]={},this._pollReceiver(e,t)},t._pollReceiver=function(e,n){t.getReceiver(e,function(r,i){var s,o;if(t._activeReceiverPolls[e]==null)return;return r===200&&i.filled?(t._clearReceiverPoll(e),typeof n=="function"?n(r,i):void 0):r>=400&&r<500?(t._clearReceiverPoll(e),typeof n=="function"?n(r,i):void 0):(s=r===500?5e3:t._pollInterval,o=setTimeout(function(){return t._pollReceiver(e,n)},s),t._activeReceiverPolls[e].timeoutId=o)})},t.cancelReceiverPoll=function(e){var n;n=t._activeReceiverPolls[e];if(n==null)throw"You are not polling receiver "+e+".";n["timeoutId"]!=null&&clearTimeout(n.timeoutId),t._clearReceiverPoll(e)},t}.call(this),t=["createToken","getToken","cardType","validateExpiry","validateCVC","validateCardNumber"];for(r=0,i=t.length;r<i;r++)n=t[r],this.Stripe[n]=this.Stripe.card[n];typeof module!="undefined"&&module!==null&&(module.exports=this.Stripe),typeof define=="function"&&define("stripe",[],function(){return u.Stripe})}).call(this),function(){var e=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};this.Stripe.utils=function(){function r(){}var t,n;return n=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,r.trim=function(e){return e===null?"":(e+"").replace(t,"")},r.parseJSON=function(e){var t,r,i,s;if((s=window.JSON)!=null?s.parse:void 0)return window.JSON.parse(e+"");r=void 0,t=null,i=Stripe.utils.trim(e+"");if(i&&!Stripe.utils.trim(i.replace(n,function(e,n,i,s){return r&&n&&(t=0),t===0?e:(r=i||n,t+=!s-!i,"")})))return Function("return "+i)();throw new Error("Invalid JSON: "+e)},r.serialize=function(e,t,n){var r,i;t==null&&(t=[]);for(r in e)i=e[r],n&&(r=""+n+"["+r+"]"),typeof i=="object"?this.serialize(i,t,r):t.push(""+r+"="+encodeURIComponent(i));return t.join("&").replace(/%20/g,"+")},r.underscore=function(e){return(e+"").replace(/([A-Z])/g,function(e){return"_"+e.toLowerCase()}).replace(/-/g,"_")},r.underscoreKeys=function(e){var t,n,r;r=[];for(t in e)n=e[t],delete e[t],r.push(e[this.underscore(t)]=n);return r},r.isElement=function(e){return typeof e!="object"?!1:typeof jQuery!="undefined"&&jQuery!==null&&e instanceof jQuery?!0:e.nodeType===1},r.paramsFromForm=function(t,n){var r,i,s,o,u,a,f,l,c,h;n==null&&(n=[]),typeof jQuery!="undefined"&&jQuery!==null&&t instanceof jQuery&&(t=t[0]),s=t.getElementsByTagName("input"),u=t.getElementsByTagName("select"),a={};for(f=0,c=s.length;f<c;f++){i=s[f],r=this.underscore(i.getAttribute("data-stripe"));if(e.call(n,r)<0)continue;a[r]=i.value}for(l=0,h=u.length;l<h;l++){o=u[l],r=this.underscore(o.getAttribute("data-stripe"));if(e.call(n,r)<0)continue;o.selectedIndex!=null&&(a[r]=o.options[o.selectedIndex].value)}return a},r.validateProtocol=function(e){var t;if(!e||typeof e!="string")return;if(/_live_/g.test(e)&&window.location.protocol!=="https:"&&((t=window.console)!=null?t.warn:void 0)!=null)return window.console.warn("You are using Stripe.js in live mode over an insecure connection. This is considered unsafe. Please conduct live requests only on sites served over https. For more info, see https://stripe.com/help/ssl")},r.validateKey=function(e){if(!e||typeof e!="string")throw new Error("You did not set a valid publishable key. Call Stripe.setPublishableKey() with your publishable key. For more info, see https://stripe.com/docs/stripe.js");if(/\s/g.test(e))throw new Error("Your key is invalid, as it contains whitespace. For more info, see https://stripe.com/docs/stripe.js");if(/^sk_/.test(e))throw new Error("You are using a secret key with Stripe.js, instead of the publishable one. For more info, see https://stripe.com/docs/stripe.js")},r}()}.call(this),function(){var e,t=[].slice;e=(new Date).getTime(),this.Stripe.ajaxJSONP=function(n){var r,i,s,o,u,a;return n==null&&(n={}),s="sjsonp"+ ++e,u=document.createElement("script"),i=null,r=function(e){var t;return e==null&&(e="abort"),clearTimeout(i),(t=u.parentNode)!=null&&t.removeChild(u),s in window&&(window[s]=function(){}),typeof n.complete=="function"?n.complete(e,a,n):void 0},a={abort:r},u.onerror=function(){return a.abort(),typeof n.error=="function"?n.error(a,n):void 0},window[s]=function(){var e;e=1<=arguments.length?t.call(arguments,0):[],clearTimeout(i),u.parentNode.removeChild(u);try{delete window[s]}catch(r){window[s]=void 0}return typeof n.success=="function"&&n.success.apply(n,e),typeof n.complete=="function"?n.complete("success",a,n):void 0},n.data||(n.data={}),n.data.callback=s,n.method&&(n.data._method=n.method),u.src=n.url+"?"+Stripe.utils.serialize(n.data),o=document.getElementsByTagName("head")[0],o.appendChild(u),n.timeout>0&&(i=setTimeout(function(){return a.abort("timeout")},n.timeout)),a}}.call(this),function(){var e,t,n,r,i,s,o,u,a,f={}.hasOwnProperty;t={contentType:"application/x-www-form-urlencoded",accept:{json:"application/json"}},o=/^(20\d|1223)$/,s="invalid_json_response",r=function(e,t,n){return function(){if(e._aborted)return n("aborted");if(e.request&&e.request.readyState===4)return e.request.onreadystatechange=function(){},o.test(e.request.status)?t(e.request,e.request.status):(t(e.request,e.request.status),n("response_code"))}},u=function(e,n){var r,i,s;i=n.headers||{},i.Accept||(i.Accept=t.accept.json),i["Content-Type"]||(i["Content-Type"]=t.contentType),s=[];for(r in i){if(!f.call(i,r))continue;"setRequestHeader"in e?s.push(e.setRequestHeader(r,i[r])):s.push(void 0)}return s},a=function(e,t){return/\?/.test(e)?e+"&"+t:e+"?"+t},n=function(e,t){var n,i,s,o,f,l,c,h;return f=this.o,o=(f.method||"GET").toUpperCase(),l=f.url,s=(c=f.data)!=null?c.key:void 0,n=Stripe.utils.serialize(f.data),i=void 0,o==="GET"&&n&&(l=a(l,n),n=null),h=new XMLHttpRequest,h.open(o,l,!0),u(h,f),h.onreadystatechange=r(this,e,t),h.send(n),h},e=function(e){return this.o=e,i.apply(this,arguments)},i=function(e){var t,r,i,o=this;return this.url=e.url,this.timeout=null,this._successHandler=function(){},this._errorHandlers=[],this._completeHandlers=[],e.timeout&&(this.timeout=setTimeout(function(){return o.abort()},e.timeout)),e.success&&(this._successHandler=function(){return e.success.apply(e,arguments)}),e.error&&this._errorHandlers.push(function(){return e.error.apply(e,arguments)}),e.complete&&this._completeHandlers.push(function(){return e.complete.apply(e,arguments)}),t=function(t){var n;e.timeout&&clearTimeout(o.timeout),o.timeout=null,n=[];while(o._completeHandlers.length>0)n.push(o._completeHandlers.shift()("success",t,e));return n},i=function(e,n){var i;i=e.responseText;if(i)try{e=Stripe.utils.parseJSON(i)}catch(u){r(s)}return o._successHandler(e,n),t(e)},r=function(e){var n,r;r=o.request,n=r.responseText;if(n)try{r=Stripe.utils.parseJSON(n)}catch(i){e=s}while(o._errorHandlers.length>0)o._errorHandlers.shift()(r,e);return t(r)},this.request=n.call(this,i,r)},e.prototype={abort:function(){return this._aborted=!0,this.request.abort()}},this.Stripe.xhr=function(t){return new e(t)}}.call(this),function(){var e=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};this.Stripe.validator={"boolean":function(e,t){if(t!=="true"&&t!=="false")return"Enter a boolean string (true or false)"},integer:function(e,t){if(!/^\d+$/.test(t))return"Enter an integer"},positive:function(e,t){if(!(!this.integer(e,t)&&parseInt(t,10)>0))return"Enter a positive value"},range:function(t,n){var r;if(r=parseInt(n,10),e.call(t,r)<0)return"Needs to be between "+t[0]+" and "+t[t.length-1]},required:function(e,t){if(e&&(t==null||t===""))return"Required"},year:function(e,t){if(!/^\d{4}$/.test(t))return"Enter a 4-digit year"},birthYear:function(e,t){var n;n=this.year(e,t);if(n)return n;if(parseInt(t,10)>2e3)return"You must be over 18";if(parseInt(t,10)<1900)return"Enter your birth year"},month:function(e,t){if(this.integer(e,t))return"Please enter a month";if(this.range([1,2,3,4,5,6,7,8,9,10,11,12],t))return"Needs to be between 1 and 12"},choices:function(t,n){if(e.call(t,n)<0)return"Not an acceptable value for this field"},email:function(e,t){if(!/^[^@<\s>]+@[^@<\s>]+$/.test(t))return"That doesn't look like an email address"},url:function(e,t){if(!/^https?:\/\/.+\..+/.test(t))return"Not a valid url"},usTaxID:function(e,t){if(!/^\d{2}-?\d{1}-?\d{2}-?\d{4}$/.test(t))return"Not a valid tax ID"},ein:function(e,t){if(!/^\d{2}-?\d{7}$/.test(t))return"Not a valid EIN"},ssnLast4:function(e,t){if(!/^\d{4}$/.test(t))return"Not a valid last 4 digits for an SSN"},ownerPersonalID:function(e,t){var n;n=function(){switch(e){case"CA":return/^\d{3}-?\d{3}-?\d{3}$/.test(t);case"US":return!0}}();if(!n)return"Not a valid ID"},bizTaxID:function(e,t){var n,r,i,s,o,u,a,f;u={CA:["Tax ID",[/^\d{9}$/]],US:["EIN",[/^\d{2}-?\d{7}$/]]},o=u[e];if(o!=null){n=o[0],s=o[1],r=!1;for(a=0,f=s.length;a<f;a++){i=s[a];if(i.test(t)){r=!0;break}}if(!r)return"Not a valid "+n}},zip:function(e,t){var n;n=function(){switch(e.toUpperCase()){case"CA":return/^[\d\w]{6}$/.test(t!=null?t.replace(/\s+/g,""):void 0);case"US":return/^\d{5}$/.test(t)||/^\d{9}$/.test(t)}}();if(!n)return"Not a valid zip"},bankAccountNumber:function(e,t){if(!/^\d{1,17}$/.test(t))return"Invalid bank account number"},usRoutingNumber:function(e){var t,n,r,i,s,o,u;if(!/^\d{9}$/.test(e))return"Routing number must have 9 digits";s=0;for(t=o=0,u=e.length-1;o<=u;t=o+=3)n=parseInt(e.charAt(t),10)*3,r=parseInt(e.charAt(t+1),10)*7,i=parseInt(e.charAt(t+2),10),s+=n+r+i;if(s===0||s%10!==0)return"Invalid routing number"},caRoutingNumber:function(e){if(!/^\d{5}\-\d{3}$/.test(e))return"Invalid transit number"},routingNumber:function(e,t){switch(e.toUpperCase()){case"CA":return this.caRoutingNumber(t);case"US":return this.usRoutingNumber(t)}},phoneNumber:function(e,t){var n;n=t.replace(/[^0-9]/g,"");if(n.length!==10)return"Invalid phone number"},bizDBA:function(e,t){if(!/^.{1,23}$/.test(t))return"Statement descriptors can only have up to 23 characters"},nameLength:function(e,t){if(t.length===1)return"Names need to be longer than one character"}}}.call(this),function(){this.Stripe.stripejs_ua="stripe.js/d24d225"}.call(this);
- /*============================================
- Stripe - Front-end
- ==============================================*/
- window.GFStripe = null;
- (function($){
- GFStripe = function( args ) {
- for( var prop in args ) {
- if( args.hasOwnProperty( prop ) )
- this[prop] = args[prop];
- }
- this.form = null;
- this.init = function() {
- if( ! this.isCreditCardOnPage() )
- return;
- var GFStripeObj = this;
- Stripe.setPublishableKey( this.apiKey );
- // initialize spinner
- if( ! this.isAjax )
- gformInitSpinner( this.formId );
- // bind Stripe functionality to submit event
- $( '#gform_' + this.formId ).submit( function( event ){
- event.preventDefault();
- var form = $(this),
- ccInputPrefix = 'input_' + GFStripeObj.formId + '_' + GFStripeObj.ccFieldId + '_',
- cc = {
- number: form.find( '#' + ccInputPrefix + '1' ).val(),
- exp_month: form.find( '#' + ccInputPrefix + '2_month' ).val(),
- exp_year: form.find( '#' + ccInputPrefix + '2_year' ).val(),
- cvc: form.find( '#' + ccInputPrefix + '3' ).val(),
- name: form.find( '#' + ccInputPrefix + '5').val()
- };
- GFStripeObj.form = form;
- Stripe.card.createToken( cc, function( status, response ) {
- GFStripeObj.responseHandler( status, response );
- } );
- } );
- };
- this.responseHandler = function( status, response ) {
- var form = this.form,
- ccInputPrefix = 'input_' + this.formId + '_' + this.ccFieldId + '_',
- ccInputSuffixes = [ '1', '2_month', '2_year', '3', '5' ],
- cardType = false;
- // remove "name" attribute from credit card inputs
- for( var i = 0; i < ccInputSuffixes.length; i++ ) {
- var input = form.find( '#' + ccInputPrefix + ccInputSuffixes[i] );
- if( ccInputSuffixes[i] == '1' ) {
- var ccNumber = $.trim( input.val() ),
- cardType = gformFindCardType( ccNumber );
- if( typeof this.cardLabels[cardType] != 'undefined' )
- cardType = this.cardLabels[cardType];
- form.append( $( '<input type="hidden" name="stripe_credit_card_last_four" />' ).val( ccNumber.slice( -4 ) ) );
- form.append( $( '<input type="hidden" name="stripe_credit_card_type" />' ).val( cardType ) );
- }
- input.attr( 'name', null );
- }
- // append stripe.js response
- form.append( $( '<input type="hidden" name="stripe_response" />' ).val( $.toJSON( response ) ) );
- // submit the form
- form.get(0).submit();
- }
- this.isLastPage = function() {
- var targetPageInput = $( '#gform_target_page_number_' + this.formId );
- if( targetPageInput.length > 0 )
- return targetPageInput.val() == 0;
- return true;
- }
- this.isCreditCardOnPage = function() {
- var currentPage = this.getCurrentPageNumber();
- // if current page is false or no credit card page number, assume this is not a multi-page form
- if( ! this.ccPage || ! currentPage )
- return true;
- return this.ccPage == currentPage;
- }
- this.getCurrentPageNumber = function() {
- var currentPageInput = $( '#gform_source_page_number_' + this.formId );
- return currentPageInput.length > 0 ? currentPageInput.val() : false;
- }
- this.init();
- }
- })(jQuery);
|