text: /*! RSVP scripts */
  /* _______________ jQuery Form Plugin ________________ */
  /*!
   * jQuery Form Plugin
   * version: 3.51.0-2014.06.20
   * Requires jQuery v1.5 or later
   * Copyright (c) 2014 M. Alsup
   * Examples and documentation at: http://malsup.com/jquery/form/
   * Project repository: https://github.com/malsup/form
   * Dual licensed under the MIT and GPL licenses.
   * https://github.com/malsup/form#copyright-and-license
   */
  ! function(e) {
      "use strict";
      "function" == typeof define && define.amd ? define(["jquery"], e) : e("undefined" != typeof jQuery ? jQuery : window.Zepto)
  }(function(e) {
      "use strict";
  
      function t(t) {
          var r = t.data;
          t.isDefaultPrevented() || (t.preventDefault(), e(t.target).ajaxSubmit(r))
      }
  
      function r(t) {
          var r = t.target,
              a = e(r);
          if (!a.is("[type=submit],[type=image]")) {
              var n = a.closest("[type=submit]");
              if (0 === n.length) return;
              r = n[0]
          }
          var i = this;
          if (i.clk = r, "image" == r.type)
              if (void 0 !== t.offsetX) i.clk_x = t.offsetX, i.clk_y = t.offsetY;
              else if ("function" == typeof e.fn.offset) {
              var o = a.offset();
              i.clk_x = t.pageX - o.left, i.clk_y = t.pageY - o.top
          } else i.clk_x = t.pageX - r.offsetLeft, i.clk_y = t.pageY - r.offsetTop;
          setTimeout(function() {
              i.clk = i.clk_x = i.clk_y = null
          }, 100)
      }
  
      function a() {
          if (e.fn.ajaxSubmit.debug) {
              var t = "[jquery.form] " + Array.prototype.join.call(arguments, "");
              window.console && window.console.log ? window.console.log(t) : window.opera && window.opera.postError && window.opera.postError(t)
          }
      }
      var n = {};
      n.fileapi = void 0 !== e("<input type='file'/>").get(0).files, n.formdata = void 0 !== window.FormData;
      var i = !!e.fn.prop;
      e.fn.attr2 = function() {
          if (!i) return this.attr.apply(this, arguments);
          var e = this.prop.apply(this, arguments);
          return e && e.jquery || "string" == typeof e ? e : this.attr.apply(this, arguments)
      }, e.fn.ajaxSubmit = function(t) {
          function r(r) {
              var a, n, i = e.param(r, t.traditional).split("&"),
                  o = i.length,
                  s = [];
              for (a = 0; o > a; a++) i[a] = i[a].replace(/\+/g, " "), n = i[a].split("="), s.push([decodeURIComponent(n[0]), decodeURIComponent(n[1])]);
              return s
          }
  
          function o(a) {
              for (var n = new FormData, i = 0; i < a.length; i++) n.append(a[i].name, a[i].value);
              if (t.extraData) {
                  var o = r(t.extraData);
                  for (i = 0; i < o.length; i++) o[i] && n.append(o[i][0], o[i][1])
              }
              t.data = null;
              var s = e.extend(!0, {}, e.ajaxSettings, t, {
                  contentType: !1,
                  processData: !1,
                  cache: !1,
                  type: u || "POST"
              });
              t.uploadProgress && (s.xhr = function() {
                  var r = e.ajaxSettings.xhr();
                  return r.upload && r.upload.addEventListener("progress", function(e) {
                      var r = 0,
                          a = e.loaded || e.position,
                          n = e.total;
                      e.lengthComputable && (r = Math.ceil(a / n * 100)), t.uploadProgress(e, a, n, r)
                  }, !1), r
              }), s.data = null;
              var c = s.beforeSend;
              return s.beforeSend = function(e, r) {
                  r.data = t.formData ? t.formData : n, c && c.call(this, e, r)
              }, e.ajax(s)
          }
  
          function s(r) {
              function n(e) {
                  var t = null;
                  try {
                      e.contentWindow && (t = e.contentWindow.document)
                  } catch (r) {
                      a("cannot get iframe.contentWindow document: " + r)
                  }
                  if (t) return t;
                  try {
                      t = e.contentDocument ? e.contentDocument : e.document
                  } catch (r) {
                      a("cannot get iframe.contentDocument: " + r), t = e.document
                  }
                  return t
              }
  
              function o() {
                  function t() {
                      try {
                          var e = n(g).readyState;
                          a("state = " + e), e && "uninitialized" == e.toLowerCase() && setTimeout(t, 50)
                      } catch (r) {
                          a("Server abort: ", r, " (", r.name, ")"), s(k), j && clearTimeout(j), j = void 0
                      }
                  }
                  var r = f.attr2("target"),
                      i = f.attr2("action"),
                      o = "multipart/form-data",
                      c = f.attr("enctype") || f.attr("encoding") || o;
                  w.setAttribute("target", p), (!u || /post/i.test(u)) && w.setAttribute("method", "POST"), i != m.url && w.setAttribute("action", m.url), m.skipEncodingOverride || u && !/post/i.test(u) || f.attr({
                      encoding: "multipart/form-data",
                      enctype: "multipart/form-data"
                  }), m.timeout && (j = setTimeout(function() {
                      T = !0, s(D)
                  }, m.timeout));
                  var l = [];
                  try {
                      if (m.extraData)
                          for (var d in m.extraData) m.extraData.hasOwnProperty(d) && l.push(e.isPlainObject(m.extraData[d]) && m.extraData[d].hasOwnProperty("name") && m.extraData[d].hasOwnProperty("value") ? e('<input type="hidden" name="' + m.extraData[d].name + '">').val(m.extraData[d].value).appendTo(w)[0] : e('<input type="hidden" name="' + d + '">').val(m.extraData[d]).appendTo(w)[0]);
                      m.iframeTarget || v.appendTo("body"), g.attachEvent ? g.attachEvent("onload", s) : g.addEventListener("load", s, !1), setTimeout(t, 15);
                      try {
                          w.submit()
                      } catch (h) {
                          var x = document.createElement("form").submit;
                          x.apply(w)
                      }
                  } finally {
                      w.setAttribute("action", i), w.setAttribute("enctype", c), r ? w.setAttribute("target", r) : f.removeAttr("target"), e(l).remove()
                  }
              }
  
              function s(t) {
                  if (!x.aborted && !F) {
                      if (M = n(g), M || (a("cannot access response document"), t = k), t === D && x) return x.abort("timeout"), void S.reject(x, "timeout");
                      if (t == k && x) return x.abort("server abort"), void S.reject(x, "error", "server abort");
                      if (M && M.location.href != m.iframeSrc || T) {
                          g.detachEvent ? g.detachEvent("onload", s) : g.removeEventListener("load", s, !1);
                          var r, i = "success";
                          try {
                              if (T) throw "timeout";
                              var o = "xml" == m.dataType || M.XMLDocument || e.isXMLDoc(M);
                              if (a("isXml=" + o), !o && window.opera && (null === M.body || !M.body.innerHTML) && --O) return a("requeing onLoad callback, DOM not available"), void setTimeout(s, 250);
                              var u = M.body ? M.body : M.documentElement;
                              x.responseText = u ? u.innerHTML : null, x.responseXML = M.XMLDocument ? M.XMLDocument : M, o && (m.dataType = "xml"), x.getResponseHeader = function(e) {
                                  var t = {
                                      "content-type": m.dataType
                                  };
                                  return t[e.toLowerCase()]
                              }, u && (x.status = Number(u.getAttribute("status")) || x.status, x.statusText = u.getAttribute("statusText") || x.statusText);
                              var c = (m.dataType || "").toLowerCase(),
                                  l = /(json|script|text)/.test(c);
                              if (l || m.textarea) {
                                  var f = M.getElementsByTagName("textarea")[0];
                                  if (f) x.responseText = f.value, x.status = Number(f.getAttribute("status")) || x.status, x.statusText = f.getAttribute("statusText") || x.statusText;
                                  else if (l) {
                                      var p = M.getElementsByTagName("pre")[0],
                                          h = M.getElementsByTagName("body")[0];
                                      p ? x.responseText = p.textContent ? p.textContent : p.innerText : h && (x.responseText = h.textContent ? h.textContent : h.innerText)
                                  }
                              } else "xml" == c && !x.responseXML && x.responseText && (x.responseXML = X(x.responseText));
                              try {
                                  E = _(x, c, m)
                              } catch (y) {
                                  i = "parsererror", x.error = r = y || i
                              }
                          } catch (y) {
                              a("error caught: ", y), i = "error", x.error = r = y || i
                          }
                          x.aborted && (a("upload aborted"), i = null), x.status && (i = x.status >= 200 && x.status < 300 || 304 === x.status ? "success" : "error"), "success" === i ? (m.success && m.success.call(m.context, E, "success", x), S.resolve(x.responseText, "success", x), d && e.event.trigger("ajaxSuccess", [x, m])) : i && (void 0 === r && (r = x.statusText), m.error && m.error.call(m.context, x, i, r), S.reject(x, "error", r), d && e.event.trigger("ajaxError", [x, m, r])), d && e.event.trigger("ajaxComplete", [x, m]), d && !--e.active && e.event.trigger("ajaxStop"), m.complete && m.complete.call(m.context, x, i), F = !0, m.timeout && clearTimeout(j), setTimeout(function() {
                              m.iframeTarget ? v.attr("src", m.iframeSrc) : v.remove(), x.responseXML = null
                          }, 100)
                      }
                  }
              }
              var c, l, m, d, p, v, g, x, y, b, T, j, w = f[0],
                  S = e.Deferred();
              if (S.abort = function(e) {
                      x.abort(e)
                  }, r)
                  for (l = 0; l < h.length; l++) c = e(h[l]), i ? c.prop("disabled", !1) : c.removeAttr("disabled");
              if (m = e.extend(!0, {}, e.ajaxSettings, t), m.context = m.context || m, p = "jqFormIO" + (new Date).getTime(), m.iframeTarget ? (v = e(m.iframeTarget), b = v.attr2("name"), b ? p = b : v.attr2("name", p)) : (v = e('<iframe name="' + p + '" src="' + m.iframeSrc + '" />'), v.css({
                      position: "absolute",
                      top: "-1000px",
                      left: "-1000px"
                  })), g = v[0], x = {
                      aborted: 0,
                      responseText: null,
                      responseXML: null,
                      status: 0,
                      statusText: "n/a",
                      getAllResponseHeaders: function() {},
                      getResponseHeader: function() {},
                      setRequestHeader: function() {},
                      abort: function(t) {
                          var r = "timeout" === t ? "timeout" : "aborted";
                          a("aborting upload... " + r), this.aborted = 1;
                          try {
                              g.contentWindow.document.execCommand && g.contentWindow.document.execCommand("Stop")
                          } catch (n) {}
                          v.attr("src", m.iframeSrc), x.error = r, m.error && m.error.call(m.context, x, r, t), d && e.event.trigger("ajaxError", [x, m, r]), m.complete && m.complete.call(m.context, x, r)
                      }
                  }, d = m.global, d && 0 === e.active++ && e.event.trigger("ajaxStart"), d && e.event.trigger("ajaxSend", [x, m]), m.beforeSend && m.beforeSend.call(m.context, x, m) === !1) return m.global && e.active--, S.reject(), S;
              if (x.aborted) return S.reject(), S;
              y = w.clk, y && (b = y.name, b && !y.disabled && (m.extraData = m.extraData || {}, m.extraData[b] = y.value, "image" == y.type && (m.extraData[b + ".x"] = w.clk_x, m.extraData[b + ".y"] = w.clk_y)));
              var D = 1,
                  k = 2,
                  A = e("meta[name=csrf-token]").attr("content"),
                  L = e("meta[name=csrf-param]").attr("content");
              L && A && (m.extraData = m.extraData || {}, m.extraData[L] = A), m.forceSync ? o() : setTimeout(o, 10);
              var E, M, F, O = 50,
                  X = e.parseXML || function(e, t) {
                      return window.ActiveXObject ? (t = new ActiveXObject("Microsoft.XMLDOM"), t.async = "false", t.loadXML(e)) : t = (new DOMParser).parseFromString(e, "text/xml"), t && t.documentElement && "parsererror" != t.documentElement.nodeName ? t : null
                  },
                  C = e.parseJSON || function(e) {
                      return window.eval("(" + e + ")")
                  },
                  _ = function(t, r, a) {
                      var n = t.getResponseHeader("content-type") || "",
                          i = "xml" === r || !r && n.indexOf("xml") >= 0,
                          o = i ? t.responseXML : t.responseText;
                      return i && "parsererror" === o.documentElement.nodeName && e.error && e.error("parsererror"), a && a.dataFilter && (o = a.dataFilter(o, r)), "string" == typeof o && ("json" === r || !r && n.indexOf("json") >= 0 ? o = C(o) : ("script" === r || !r && n.indexOf("javascript") >= 0) && e.globalEval(o)), o
                  };
              return S
          }
          if (!this.length) return a("ajaxSubmit: skipping submit process - no element selected"), this;
          var u, c, l, f = this;
          "function" == typeof t ? t = {
              success: t
          } : void 0 === t && (t = {}), u = t.type || this.attr2("method"), c = t.url || this.attr2("action"), l = "string" == typeof c ? e.trim(c) : "", l = l || window.location.href || "", l && (l = (l.match(/^([^#]+)/) || [])[1]), t = e.extend(!0, {
              url: l,
              success: e.ajaxSettings.success,
              type: u || e.ajaxSettings.type,
              iframeSrc: /^https/i.test(window.location.href || "") ? "javascript:false" : "about:blank"
          }, t);
          var m = {};
          if (this.trigger("form-pre-serialize", [this, t, m]), m.veto) return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"), this;
          if (t.beforeSerialize && t.beforeSerialize(this, t) === !1) return a("ajaxSubmit: submit aborted via beforeSerialize callback"), this;
          var d = t.traditional;
          void 0 === d && (d = e.ajaxSettings.traditional);
          var p, h = [],
              v = this.formToArray(t.semantic, h);
          if (t.data && (t.extraData = t.data, p = e.param(t.data, d)), t.beforeSubmit && t.beforeSubmit(v, this, t) === !1) return a("ajaxSubmit: submit aborted via beforeSubmit callback"), this;
          if (this.trigger("form-submit-validate", [v, this, t, m]), m.veto) return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"), this;
          var g = e.param(v, d);
          p && (g = g ? g + "&" + p : p), "GET" == t.type.toUpperCase() ? (t.url += (t.url.indexOf("?") >= 0 ? "&" : "?") + g, t.data = null) : t.data = g;
          var x = [];
          if (t.resetForm && x.push(function() {
                  f.resetForm()
              }), t.clearForm && x.push(function() {
                  f.clearForm(t.includeHidden)
              }), !t.dataType && t.target) {
              var y = t.success || function() {};
              x.push(function(r) {
                  var a = t.replaceTarget ? "replaceWith" : "html";
                  e(t.target)[a](r).each(y, arguments)
              })
          } else t.success && x.push(t.success);
          if (t.success = function(e, r, a) {
                  for (var n = t.context || this, i = 0, o = x.length; o > i; i++) x[i].apply(n, [e, r, a || f, f])
              }, t.error) {
              var b = t.error;
              t.error = function(e, r, a) {
                  var n = t.context || this;
                  b.apply(n, [e, r, a, f])
              }
          }
          if (t.complete) {
              var T = t.complete;
              t.complete = function(e, r) {
                  var a = t.context || this;
                  T.apply(a, [e, r, f])
              }
          }
          var j = e("input[type=file]:enabled", this).filter(function() {
                  return "" !== e(this).val()
              }),
              w = j.length > 0,
              S = "multipart/form-data",
              D = f.attr("enctype") == S || f.attr("encoding") == S,
              k = n.fileapi && n.formdata;
          a("fileAPI :" + k);
          var A, L = (w || D) && !k;
          t.iframe !== !1 && (t.iframe || L) ? t.closeKeepAlive ? e.get(t.closeKeepAlive, function() {
              A = s(v)
          }) : A = s(v) : A = (w || D) && k ? o(v) : e.ajax(t), f.removeData("jqxhr").data("jqxhr", A);
          for (var E = 0; E < h.length; E++) h[E] = null;
          return this.trigger("form-submit-notify", [this, t]), this
      }, e.fn.ajaxForm = function(n) {
          if (n = n || {}, n.delegation = n.delegation && e.isFunction(e.fn.on), !n.delegation && 0 === this.length) {
              var i = {
                  s: this.selector,
                  c: this.context
              };
              return !e.isReady && i.s ? (a("DOM not ready, queuing ajaxForm"), e(function() {
                  e(i.s, i.c).ajaxForm(n)
              }), this) : (a("terminating; zero elements found by selector" + (e.isReady ? "" : " (DOM not ready)")), this)
          }
          return n.delegation ? (e(document).off("submit.form-plugin", this.selector, t).off("click.form-plugin", this.selector, r).on("submit.form-plugin", this.selector, n, t).on("click.form-plugin", this.selector, n, r), this) : this.ajaxFormUnbind().bind("submit.form-plugin", n, t).bind("click.form-plugin", n, r)
      }, e.fn.ajaxFormUnbind = function() {
          return this.unbind("submit.form-plugin click.form-plugin")
      }, e.fn.formToArray = function(t, r) {
          var a = [];
          if (0 === this.length) return a;
          var i, o = this[0],
              s = this.attr("id"),
              u = t ? o.getElementsByTagName("*") : o.elements;
          if (u && !/MSIE [678]/.test(navigator.userAgent) && (u = e(u).get()), s && (i = e(':input[form="' + s + '"]').get(), i.length && (u = (u || []).concat(i))), !u || !u.length) return a;
          var c, l, f, m, d, p, h;
          for (c = 0, p = u.length; p > c; c++)
              if (d = u[c], f = d.name, f && !d.disabled)
                  if (t && o.clk && "image" == d.type) o.clk == d && (a.push({
                      name: f,
                      value: e(d).val(),
                      type: d.type
                  }), a.push({
                      name: f + ".x",
                      value: o.clk_x
                  }, {
                      name: f + ".y",
                      value: o.clk_y
                  }));
                  else if (m = e.fieldValue(d, !0), m && m.constructor == Array)
              for (r && r.push(d), l = 0, h = m.length; h > l; l++) a.push({
                  name: f,
                  value: m[l]
              });
          else if (n.fileapi && "file" == d.type) {
              r && r.push(d);
              var v = d.files;
              if (v.length)
                  for (l = 0; l < v.length; l++) a.push({
                      name: f,
                      value: v[l],
                      type: d.type
                  });
              else a.push({
                  name: f,
                  value: "",
                  type: d.type
              })
          } else null !== m && "undefined" != typeof m && (r && r.push(d), a.push({
              name: f,
              value: m,
              type: d.type,
              required: d.required
          }));
          if (!t && o.clk) {
              var g = e(o.clk),
                  x = g[0];
              f = x.name, f && !x.disabled && "image" == x.type && (a.push({
                  name: f,
                  value: g.val()
              }), a.push({
                  name: f + ".x",
                  value: o.clk_x
              }, {
                  name: f + ".y",
                  value: o.clk_y
              }))
          }
          return a
      }, e.fn.formSerialize = function(t) {
          return e.param(this.formToArray(t))
      }, e.fn.fieldSerialize = function(t) {
          var r = [];
          return this.each(function() {
              var a = this.name;
              if (a) {
                  var n = e.fieldValue(this, t);
                  if (n && n.constructor == Array)
                      for (var i = 0, o = n.length; o > i; i++) r.push({
                          name: a,
                          value: n[i]
                      });
                  else null !== n && "undefined" != typeof n && r.push({
                      name: this.name,
                      value: n
                  })
              }
          }), e.param(r)
      }, e.fn.fieldValue = function(t) {
          for (var r = [], a = 0, n = this.length; n > a; a++) {
              var i = this[a],
                  o = e.fieldValue(i, t);
              null === o || "undefined" == typeof o || o.constructor == Array && !o.length || (o.constructor == Array ? e.merge(r, o) : r.push(o))
          }
          return r
      }, e.fieldValue = function(t, r) {
          var a = t.name,
              n = t.type,
              i = t.tagName.toLowerCase();
          if (void 0 === r && (r = !0), r && (!a || t.disabled || "reset" == n || "button" == n || ("checkbox" == n || "radio" == n) && !t.checked || ("submit" == n || "image" == n) && t.form && t.form.clk != t || "select" == i && -1 == t.selectedIndex)) return null;
          if ("select" == i) {
              var o = t.selectedIndex;
              if (0 > o) return null;
              for (var s = [], u = t.options, c = "select-one" == n, l = c ? o + 1 : u.length, f = c ? o : 0; l > f; f++) {
                  var m = u[f];
                  if (m.selected) {
                      var d = m.value;
                      if (d || (d = m.attributes && m.attributes.value && !m.attributes.value.specified ? m.text : m.value), c) return d;
                      s.push(d)
                  }
              }
              return s
          }
          return e(t).val()
      }, e.fn.clearForm = function(t) {
          return this.each(function() {
              e("input,select,textarea", this).clearFields(t)
          })
      }, e.fn.clearFields = e.fn.clearInputs = function(t) {
          var r = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;
          return this.each(function() {
              var a = this.type,
                  n = this.tagName.toLowerCase();
              r.test(a) || "textarea" == n ? this.value = "" : "checkbox" == a || "radio" == a ? this.checked = !1 : "select" == n ? this.selectedIndex = -1 : "file" == a ? /MSIE/.test(navigator.userAgent) ? e(this).replaceWith(e(this).clone(!0)) : e(this).val("") : t && (t === !0 && /hidden/.test(a) || "string" == typeof t && e(this).is(t)) && (this.value = "")
          })
      }, e.fn.resetForm = function() {
          return this.each(function() {
              ("function" == typeof this.reset || "object" == typeof this.reset && !this.reset.nodeType) && this.reset()
          })
      }, e.fn.enable = function(e) {
          return void 0 === e && (e = !0), this.each(function() {
              this.disabled = !e
          })
      }, e.fn.selected = function(t) {
          return void 0 === t && (t = !0), this.each(function() {
              var r = this.type;
              if ("checkbox" == r || "radio" == r) this.checked = t;
              else if ("option" == this.tagName.toLowerCase()) {
                  var a = e(this).parent("select");
                  t && a[0] && "select-one" == a[0].type && a.find("option").selected(!1), this.selected = t
              }
          })
      }, e.fn.ajaxSubmit.debug = !1
  });
  
  
  /* _______________  Validation Plugin ________________ */
  
  /*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
   * http://jqueryvalidation.org/
   * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
  ! function(a) {
      "function" == typeof define && define.amd ? define(["jquery"], a) : a(jQuery)
  }(function(a) {
      a.extend(a.fn, {
          validate: function(b) {
              if (!this.length) return void(b && b.debug && window.console && console.warn("Nothing selected, can't validate, returning nothing."));
              var c = a.data(this[0], "validator");
              return c ? c : (this.attr("novalidate", "novalidate"), c = new a.validator(b, this[0]), a.data(this[0], "validator", c), c.settings.onsubmit && (this.on("click.validate", ":submit", function(b) {
                  c.settings.submitHandler && (c.submitButton = b.target), a(this).hasClass("cancel") && (c.cancelSubmit = !0), void 0 !== a(this).attr("formnovalidate") && (c.cancelSubmit = !0)
              }), this.on("submit.validate", function(b) {
                  function d() {
                      var d, e;
                      return c.settings.submitHandler ? (c.submitButton && (d = a("<input type='hidden'/>").attr("name", c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)), e = c.settings.submitHandler.call(c, c.currentForm, b), c.submitButton && d.remove(), void 0 !== e ? e : !1) : !0
                  }
                  return c.settings.debug && b.preventDefault(), c.cancelSubmit ? (c.cancelSubmit = !1, d()) : c.form() ? c.pendingRequest ? (c.formSubmitted = !0, !1) : d() : (c.focusInvalid(), !1)
              })), c)
          },
          valid: function() {
              var b, c, d;
              return a(this[0]).is("form") ? b = this.validate().form() : (d = [], b = !0, c = a(this[0].form).validate(), this.each(function() {
                  b = c.element(this) && b, d = d.concat(c.errorList)
              }), c.errorList = d), b
          },
          rules: function(b, c) {
              var d, e, f, g, h, i, j = this[0];
              if (b) switch (d = a.data(j.form, "validator").settings, e = d.rules, f = a.validator.staticRules(j), b) {
                  case "add":
                      a.extend(f, a.validator.normalizeRule(c)), delete f.messages, e[j.name] = f, c.messages && (d.messages[j.name] = a.extend(d.messages[j.name], c.messages));
                      break;
                  case "remove":
                      return c ? (i = {}, a.each(c.split(/\s/), function(b, c) {
                          i[c] = f[c], delete f[c], "required" === c && a(j).removeAttr("aria-required")
                      }), i) : (delete e[j.name], f)
              }
              return g = a.validator.normalizeRules(a.extend({}, a.validator.classRules(j), a.validator.attributeRules(j), a.validator.dataRules(j), a.validator.staticRules(j)), j), g.required && (h = g.required, delete g.required, g = a.extend({
                  required: h
              }, g), a(j).attr("aria-required", "true")), g.remote && (h = g.remote, delete g.remote, g = a.extend(g, {
                  remote: h
              })), g
          }
      }), a.extend(a.expr[":"], {
          blank: function(b) {
              return !a.trim("" + a(b).val())
          },
          filled: function(b) {
              return !!a.trim("" + a(b).val())
          },
          unchecked: function(b) {
              return !a(b).prop("checked")
          }
      }), a.validator = function(b, c) {
          this.settings = a.extend(!0, {}, a.validator.defaults, b), this.currentForm = c, this.init()
      }, a.validator.format = function(b, c) {
          return 1 === arguments.length ? function() {
              var c = a.makeArray(arguments);
              return c.unshift(b), a.validator.format.apply(this, c)
          } : (arguments.length > 2 && c.constructor !== Array && (c = a.makeArray(arguments).slice(1)), c.constructor !== Array && (c = [c]), a.each(c, function(a, c) {
              b = b.replace(new RegExp("\\{" + a + "\\}", "g"), function() {
                  return c
              })
          }), b)
      }, a.extend(a.validator, {
          defaults: {
              messages: {},
              groups: {},
              rules: {},
              errorClass: "error",
              validClass: "valid",
              errorElement: "label",
              focusCleanup: !1,
              focusInvalid: !0,
              errorContainer: a([]),
              errorLabelContainer: a([]),
              onsubmit: !0,
              ignore: ":hidden",
              ignoreTitle: !1,
              onfocusin: function(a) {
                  this.lastActive = a, this.settings.focusCleanup && (this.settings.unhighlight && this.settings.unhighlight.call(this, a, this.settings.errorClass, this.settings.validClass), this.hideThese(this.errorsFor(a)))
              },
              onfocusout: function(a) {
                  this.checkable(a) || !(a.name in this.submitted) && this.optional(a) || this.element(a)
              },
              onkeyup: function(b, c) {
                  var d = [16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225];
                  9 === c.which && "" === this.elementValue(b) || -1 !== a.inArray(c.keyCode, d) || (b.name in this.submitted || b === this.lastElement) && this.element(b)
              },
              onclick: function(a) {
                  a.name in this.submitted ? this.element(a) : a.parentNode.name in this.submitted && this.element(a.parentNode)
              },
              highlight: function(b, c, d) {
                  "radio" === b.type ? this.findByName(b.name).addClass(c).removeClass(d) : a(b).addClass(c).removeClass(d)
              },
              unhighlight: function(b, c, d) {
                  "radio" === b.type ? this.findByName(b.name).removeClass(c).addClass(d) : a(b).removeClass(c).addClass(d)
              }
          },
          setDefaults: function(b) {
              a.extend(a.validator.defaults, b)
          },
          messages: {
              required: "This field is required.",
              remote: "Please fix this field.",
              email: "Please enter a valid email address.",
              url: "Please enter a valid URL.",
              date: "Please enter a valid date.",
              dateISO: "Please enter a valid date ( ISO ).",
              number: "Please enter a valid number.",
              digits: "Please enter only digits.",
              creditcard: "Please enter a valid credit card number.",
              equalTo: "Please enter the same value again.",
              maxlength: a.validator.format("Please enter no more than {0} characters."),
              minlength: a.validator.format("Please enter at least {0} characters."),
              rangelength: a.validator.format("Please enter a value between {0} and {1} characters long."),
              range: a.validator.format("Please enter a value between {0} and {1}."),
              max: a.validator.format("Please enter a value less than or equal to {0}."),
              min: a.validator.format("Please enter a value greater than or equal to {0}.")
          },
          autoCreateRanges: !1,
          prototype: {
              init: function() {
                  function b(b) {
                      var c = a.data(this.form, "validator"),
                          d = "on" + b.type.replace(/^validate/, ""),
                          e = c.settings;
                      e[d] && !a(this).is(e.ignore) && e[d].call(c, this, b)
                  }
                  this.labelContainer = a(this.settings.errorLabelContainer), this.errorContext = this.labelContainer.length && this.labelContainer || a(this.currentForm), this.containers = a(this.settings.errorContainer).add(this.settings.errorLabelContainer), this.submitted = {}, this.valueCache = {}, this.pendingRequest = 0, this.pending = {}, this.invalid = {}, this.reset();
                  var c, d = this.groups = {};
                  a.each(this.settings.groups, function(b, c) {
                      "string" == typeof c && (c = c.split(/\s/)), a.each(c, function(a, c) {
                          d[c] = b
                      })
                  }), c = this.settings.rules, a.each(c, function(b, d) {
                      c[b] = a.validator.normalizeRule(d)
                  }), a(this.currentForm).on("focusin.validate focusout.validate keyup.validate", ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']", b).on("click.validate", "select, option, [type='radio'], [type='checkbox']", b), this.settings.invalidHandler && a(this.currentForm).on("invalid-form.validate", this.settings.invalidHandler), a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required", "true")
              },
              form: function() {
                  return this.checkForm(), a.extend(this.submitted, this.errorMap), this.invalid = a.extend({}, this.errorMap), this.valid() || a(this.currentForm).triggerHandler("invalid-form", [this]), this.showErrors(), this.valid()
              },
              checkForm: function() {
                  this.prepareForm();
                  for (var a = 0, b = this.currentElements = this.elements(); b[a]; a++) this.check(b[a]);
                  return this.valid()
              },
              element: function(b) {
                  var c = this.clean(b),
                      d = this.validationTargetFor(c),
                      e = !0;
                  return this.lastElement = d, void 0 === d ? delete this.invalid[c.name] : (this.prepareElement(d), this.currentElements = a(d), e = this.check(d) !== !1, e ? delete this.invalid[d.name] : this.invalid[d.name] = !0), a(b).attr("aria-invalid", !e), this.numberOfInvalids() || (this.toHide = this.toHide.add(this.containers)), this.showErrors(), e
              },
              showErrors: function(b) {
                  if (b) {
                      a.extend(this.errorMap, b), this.errorList = [];
                      for (var c in b) this.errorList.push({
                          message: b[c],
                          element: this.findByName(c)[0]
                      });
                      this.successList = a.grep(this.successList, function(a) {
                          return !(a.name in b)
                      })
                  }
                  this.settings.showErrors ? this.settings.showErrors.call(this, this.errorMap, this.errorList) : this.defaultShowErrors()
              },
              resetForm: function() {
                  a.fn.resetForm && a(this.currentForm).resetForm(), this.submitted = {}, this.lastElement = null, this.prepareForm(), this.hideErrors();
                  var b, c = this.elements().removeData("previousValue").removeAttr("aria-invalid");
                  if (this.settings.unhighlight)
                      for (b = 0; c[b]; b++) this.settings.unhighlight.call(this, c[b], this.settings.errorClass, "");
                  else c.removeClass(this.settings.errorClass)
              },
              numberOfInvalids: function() {
                  return this.objectLength(this.invalid)
              },
              objectLength: function(a) {
                  var b, c = 0;
                  for (b in a) c++;
                  return c
              },
              hideErrors: function() {
                  this.hideThese(this.toHide)
              },
              hideThese: function(a) {
                  a.not(this.containers).text(""), this.addWrapper(a).hide()
              },
              valid: function() {
                  return 0 === this.size()
              },
              size: function() {
                  return this.errorList.length
              },
              focusInvalid: function() {
                  if (this.settings.focusInvalid) try {
                      a(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus().trigger("focusin")
                  } catch (b) {}
              },
              findLastActive: function() {
                  var b = this.lastActive;
                  return b && 1 === a.grep(this.errorList, function(a) {
                      return a.element.name === b.name
                  }).length && b
              },
              elements: function() {
                  var b = this,
                      c = {};
                  return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function() {
                      return !this.name && b.settings.debug && window.console && console.error("%o has no name assigned", this), this.name in c || !b.objectLength(a(this).rules()) ? !1 : (c[this.name] = !0, !0)
                  })
              },
              clean: function(b) {
                  return a(b)[0]
              },
              errors: function() {
                  var b = this.settings.errorClass.split(" ").join(".");
                  return a(this.settings.errorElement + "." + b, this.errorContext)
              },
              reset: function() {
                  this.successList = [], this.errorList = [], this.errorMap = {}, this.toShow = a([]), this.toHide = a([]), this.currentElements = a([])
              },
              prepareForm: function() {
                  this.reset(), this.toHide = this.errors().add(this.containers)
              },
              prepareElement: function(a) {
                  this.reset(), this.toHide = this.errorsFor(a)
              },
              elementValue: function(b) {
                  var c, d = a(b),
                      e = b.type;
                  return "radio" === e || "checkbox" === e ? this.findByName(b.name).filter(":checked").val() : "number" === e && "undefined" != typeof b.validity ? b.validity.badInput ? !1 : d.val() : (c = d.val(), "string" == typeof c ? c.replace(/\r/g, "") : c)
              },
              check: function(b) {
                  b = this.validationTargetFor(this.clean(b));
                  var c, d, e, f = a(b).rules(),
                      g = a.map(f, function(a, b) {
                          return b
                      }).length,
                      h = !1,
                      i = this.elementValue(b);
                  for (d in f) {
                      e = {
                          method: d,
                          parameters: f[d]
                      };
                      try {
                          if (c = a.validator.methods[d].call(this, i, b, e.parameters), "dependency-mismatch" === c && 1 === g) {
                              h = !0;
                              continue
                          }
                          if (h = !1, "pending" === c) return void(this.toHide = this.toHide.not(this.errorsFor(b)));
                          if (!c) return this.formatAndAdd(b, e), !1
                      } catch (j) {
                          throw this.settings.debug && window.console && console.log("Exception occurred when checking element " + b.id + ", check the '" + e.method + "' method.", j), j instanceof TypeError && (j.message += ".  Exception occurred when checking element " + b.id + ", check the '" + e.method + "' method."), j
                      }
                  }
                  if (!h) return this.objectLength(f) && this.successList.push(b), !0
              },
              customDataMessage: function(b, c) {
                  return a(b).data("msg" + c.charAt(0).toUpperCase() + c.substring(1).toLowerCase()) || a(b).data("msg")
              },
              customMessage: function(a, b) {
                  var c = this.settings.messages[a];
                  return c && (c.constructor === String ? c : c[b])
              },
              findDefined: function() {
                  for (var a = 0; a < arguments.length; a++)
                      if (void 0 !== arguments[a]) return arguments[a];
                  return void 0
              },
              defaultMessage: function(b, c) {
                  return this.findDefined(this.customMessage(b.name, c), this.customDataMessage(b, c), !this.settings.ignoreTitle && b.title || void 0, a.validator.messages[c], "<strong>Warning: No message defined for " + b.name + "</strong>")
              },
              formatAndAdd: function(b, c) {
                  var d = this.defaultMessage(b, c.method),
                      e = /\$?\{(\d+)\}/g;
                  "function" == typeof d ? d = d.call(this, c.parameters, b) : e.test(d) && (d = a.validator.format(d.replace(e, "{$1}"), c.parameters)), this.errorList.push({
                      message: d,
                      element: b,
                      method: c.method
                  }), this.errorMap[b.name] = d, this.submitted[b.name] = d
              },
              addWrapper: function(a) {
                  return this.settings.wrapper && (a = a.add(a.parent(this.settings.wrapper))), a
              },
              defaultShowErrors: function() {
                  var a, b, c;
                  for (a = 0; this.errorList[a]; a++) c = this.errorList[a], this.settings.highlight && this.settings.highlight.call(this, c.element, this.settings.errorClass, this.settings.validClass), this.showLabel(c.element, c.message);
                  if (this.errorList.length && (this.toShow = this.toShow.add(this.containers)), this.settings.success)
                      for (a = 0; this.successList[a]; a++) this.showLabel(this.successList[a]);
                  if (this.settings.unhighlight)
                      for (a = 0, b = this.validElements(); b[a]; a++) this.settings.unhighlight.call(this, b[a], this.settings.errorClass, this.settings.validClass);
                  this.toHide = this.toHide.not(this.toShow), this.hideErrors(), this.addWrapper(this.toShow).show()
              },
              validElements: function() {
                  return this.currentElements.not(this.invalidElements())
              },
              invalidElements: function() {
                  return a(this.errorList).map(function() {
                      return this.element
                  })
              },
              showLabel: function(b, c) {
                  var d, e, f, g = this.errorsFor(b),
                      h = this.idOrName(b),
                      i = a(b).attr("aria-describedby");
                  g.length ? (g.removeClass(this.settings.validClass).addClass(this.settings.errorClass), g.html(c)) : (g = a("<" + this.settings.errorElement + ">").attr("id", h + "-error").addClass(this.settings.errorClass).html(c || ""), d = g, this.settings.wrapper && (d = g.hide().show().wrap("<" + this.settings.wrapper + "/>").parent()), this.labelContainer.length ? this.labelContainer.append(d) : this.settings.errorPlacement ? this.settings.errorPlacement(d, a(b)) : d.insertAfter(b), g.is("label") ? g.attr("for", h) : 0 === g.parents("label[for='" + h + "']").length && (f = g.attr("id").replace(/(:|\.|\[|\]|\$)/g, "\\$1"), i ? i.match(new RegExp("\\b" + f + "\\b")) || (i += " " + f) : i = f, a(b).attr("aria-describedby", i), e = this.groups[b.name], e && a.each(this.groups, function(b, c) {
                      c === e && a("[name='" + b + "']", this.currentForm).attr("aria-describedby", g.attr("id"))
                  }))), !c && this.settings.success && (g.text(""), "string" == typeof this.settings.success ? g.addClass(this.settings.success) : this.settings.success(g, b)), this.toShow = this.toShow.add(g)
              },
              errorsFor: function(b) {
                  var c = this.idOrName(b),
                      d = a(b).attr("aria-describedby"),
                      e = "label[for='" + c + "'], label[for='" + c + "'] *";
                  return d && (e = e + ", #" + d.replace(/\s+/g, ", #")), this.errors().filter(e)
              },
              idOrName: function(a) {
                  return this.groups[a.name] || (this.checkable(a) ? a.name : a.id || a.name)
              },
              validationTargetFor: function(b) {
                  return this.checkable(b) && (b = this.findByName(b.name)), a(b).not(this.settings.ignore)[0]
              },
              checkable: function(a) {
                  return /radio|checkbox/i.test(a.type)
              },
              findByName: function(b) {
                  return a(this.currentForm).find("[name='" + b + "']")
              },
              getLength: function(b, c) {
                  switch (c.nodeName.toLowerCase()) {
                      case "select":
                          return a("option:selected", c).length;
                      case "input":
                          if (this.checkable(c)) return this.findByName(c.name).filter(":checked").length
                  }
                  return b.length
              },
              depend: function(a, b) {
                  return this.dependTypes[typeof a] ? this.dependTypes[typeof a](a, b) : !0
              },
              dependTypes: {
                  "boolean": function(a) {
                      return a
                  },
                  string: function(b, c) {
                      return !!a(b, c.form).length
                  },
                  "function": function(a, b) {
                      return a(b)
                  }
              },
              optional: function(b) {
                  var c = this.elementValue(b);
                  return !a.validator.methods.required.call(this, c, b) && "dependency-mismatch"
              },
              startRequest: function(a) {
                  this.pending[a.name] || (this.pendingRequest++, this.pending[a.name] = !0)
              },
              stopRequest: function(b, c) {
                  this.pendingRequest--, this.pendingRequest < 0 && (this.pendingRequest = 0), delete this.pending[b.name], c && 0 === this.pendingRequest && this.formSubmitted && this.form() ? (a(this.currentForm).submit(), this.formSubmitted = !1) : !c && 0 === this.pendingRequest && this.formSubmitted && (a(this.currentForm).triggerHandler("invalid-form", [this]), this.formSubmitted = !1)
              },
              previousValue: function(b) {
                  return a.data(b, "previousValue") || a.data(b, "previousValue", {
                      old: null,
                      valid: !0,
                      message: this.defaultMessage(b, "remote")
                  })
              },
              destroy: function() {
                  this.resetForm(), a(this.currentForm).off(".validate").removeData("validator")
              }
          },
          classRuleSettings: {
              required: {
                  required: !0
              },
              email: {
                  email: !0
              },
              url: {
                  url: !0
              },
              date: {
                  date: !0
              },
              dateISO: {
                  dateISO: !0
              },
              number: {
                  number: !0
              },
              digits: {
                  digits: !0
              },
              creditcard: {
                  creditcard: !0
              }
          },
          addClassRules: function(b, c) {
              b.constructor === String ? this.classRuleSettings[b] = c : a.extend(this.classRuleSettings, b)
          },
          classRules: function(b) {
              var c = {},
                  d = a(b).attr("class");
              return d && a.each(d.split(" "), function() {
                  this in a.validator.classRuleSettings && a.extend(c, a.validator.classRuleSettings[this])
              }), c
          },
          normalizeAttributeRule: function(a, b, c, d) {
              /min|max/.test(c) && (null === b || /number|range|text/.test(b)) && (d = Number(d), isNaN(d) && (d = void 0)), d || 0 === d ? a[c] = d : b === c && "range" !== b && (a[c] = !0)
          },
          attributeRules: function(b) {
              var c, d, e = {},
                  f = a(b),
                  g = b.getAttribute("type");
              for (c in a.validator.methods) "required" === c ? (d = b.getAttribute(c), "" === d && (d = !0), d = !!d) : d = f.attr(c), this.normalizeAttributeRule(e, g, c, d);
              return e.maxlength && /-1|2147483647|524288/.test(e.maxlength) && delete e.maxlength, e
          },
          dataRules: function(b) {
              var c, d, e = {},
                  f = a(b),
                  g = b.getAttribute("type");
              for (c in a.validator.methods) d = f.data("rule" + c.charAt(0).toUpperCase() + c.substring(1).toLowerCase()), this.normalizeAttributeRule(e, g, c, d);
              return e
          },
          staticRules: function(b) {
              var c = {},
                  d = a.data(b.form, "validator");
              return d.settings.rules && (c = a.validator.normalizeRule(d.settings.rules[b.name]) || {}), c
          },
          normalizeRules: function(b, c) {
              return a.each(b, function(d, e) {
                  if (e === !1) return void delete b[d];
                  if (e.param || e.depends) {
                      var f = !0;
                      switch (typeof e.depends) {
                          case "string":
                              f = !!a(e.depends, c.form).length;
                              break;
                          case "function":
                              f = e.depends.call(c, c)
                      }
                      f ? b[d] = void 0 !== e.param ? e.param : !0 : delete b[d]
                  }
              }), a.each(b, function(d, e) {
                  b[d] = a.isFunction(e) ? e(c) : e
              }), a.each(["minlength", "maxlength"], function() {
                  b[this] && (b[this] = Number(b[this]))
              }), a.each(["rangelength", "range"], function() {
                  var c;
                  b[this] && (a.isArray(b[this]) ? b[this] = [Number(b[this][0]), Number(b[this][1])] : "string" == typeof b[this] && (c = b[this].replace(/[\[\]]/g, "").split(/[\s,]+/), b[this] = [Number(c[0]), Number(c[1])]))
              }), a.validator.autoCreateRanges && (null != b.min && null != b.max && (b.range = [b.min, b.max], delete b.min, delete b.max), null != b.minlength && null != b.maxlength && (b.rangelength = [b.minlength, b.maxlength], delete b.minlength, delete b.maxlength)), b
          },
          normalizeRule: function(b) {
              if ("string" == typeof b) {
                  var c = {};
                  a.each(b.split(/\s/), function() {
                      c[this] = !0
                  }), b = c
              }
              return b
          },
          addMethod: function(b, c, d) {
              a.validator.methods[b] = c, a.validator.messages[b] = void 0 !== d ? d : a.validator.messages[b], c.length < 3 && a.validator.addClassRules(b, a.validator.normalizeRule(b))
          },
          methods: {
              required: function(b, c, d) {
                  if (!this.depend(d, c)) return "dependency-mismatch";
                  if ("select" === c.nodeName.toLowerCase()) {
                      var e = a(c).val();
                      return e && e.length > 0
                  }
                  return this.checkable(c) ? this.getLength(b, c) > 0 : b.length > 0
              },
              email: function(a, b) {
                  return this.optional(b) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)
              },
              url: function(a, b) {
                  return this.optional(b) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)
              },
              date: function(a, b) {
                  return this.optional(b) || !/Invalid|NaN/.test(new Date(a).toString())
              },
              dateISO: function(a, b) {
                  return this.optional(b) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)
              },
              number: function(a, b) {
                  return this.optional(b) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)
              },
              digits: function(a, b) {
                  return this.optional(b) || /^\d+$/.test(a)
              },
              creditcard: function(a, b) {
                  if (this.optional(b)) return "dependency-mismatch";
                  if (/[^0-9 \-]+/.test(a)) return !1;
                  var c, d, e = 0,
                      f = 0,
                      g = !1;
                  if (a = a.replace(/\D/g, ""), a.length < 13 || a.length > 19) return !1;
                  for (c = a.length - 1; c >= 0; c--) d = a.charAt(c), f = parseInt(d, 10), g && (f *= 2) > 9 && (f -= 9), e += f, g = !g;
                  return e % 10 === 0
              },
              minlength: function(b, c, d) {
                  var e = a.isArray(b) ? b.length : this.getLength(b, c);
                  return this.optional(c) || e >= d
              },
              maxlength: function(b, c, d) {
                  var e = a.isArray(b) ? b.length : this.getLength(b, c);
                  return this.optional(c) || d >= e
              },
              rangelength: function(b, c, d) {
                  var e = a.isArray(b) ? b.length : this.getLength(b, c);
                  return this.optional(c) || e >= d[0] && e <= d[1]
              },
              min: function(a, b, c) {
                  return this.optional(b) || a >= c
              },
              max: function(a, b, c) {
                  return this.optional(b) || c >= a
              },
              range: function(a, b, c) {
                  return this.optional(b) || a >= c[0] && a <= c[1]
              },
              equalTo: function(b, c, d) {
                  var e = a(d);
                  return this.settings.onfocusout && e.off(".validate-equalTo").on("blur.validate-equalTo", function() {
                      a(c).valid()
                  }), b === e.val()
              },
              remote: function(b, c, d) {
                  if (this.optional(c)) return "dependency-mismatch";
                  var e, f, g = this.previousValue(c);
                  return this.settings.messages[c.name] || (this.settings.messages[c.name] = {}), g.originalMessage = this.settings.messages[c.name].remote, this.settings.messages[c.name].remote = g.message, d = "string" == typeof d && {
                      url: d
                  } || d, g.old === b ? g.valid : (g.old = b, e = this, this.startRequest(c), f = {}, f[c.name] = b, a.ajax(a.extend(!0, {
                      mode: "abort",
                      port: "validate" + c.name,
                      dataType: "json",
                      data: f,
                      context: e.currentForm,
                      success: function(d) {
                          var f, h, i, j = d === !0 || "true" === d;
                          e.settings.messages[c.name].remote = g.originalMessage, j ? (i = e.formSubmitted, e.prepareElement(c), e.formSubmitted = i, e.successList.push(c), delete e.invalid[c.name], e.showErrors()) : (f = {}, h = d || e.defaultMessage(c, "remote"), f[c.name] = g.message = a.isFunction(h) ? h(b) : h, e.invalid[c.name] = !0, e.showErrors(f)), g.valid = j, e.stopRequest(c, j)
                      }
                  }, d)), "pending")
              }
          }
      });
      var b, c = {};
      a.ajaxPrefilter ? a.ajaxPrefilter(function(a, b, d) {
          var e = a.port;
          "abort" === a.mode && (c[e] && c[e].abort(), c[e] = d)
      }) : (b = a.ajax, a.ajax = function(d) {
          var e = ("mode" in d ? d : a.ajaxSettings).mode,
              f = ("port" in d ? d : a.ajaxSettings).port;
          return "abort" === e ? (c[f] && c[f].abort(), c[f] = b.apply(this, arguments), c[f]) : b.apply(this, arguments)
      })
  });
  
  
  /* _______________  Custom Validation and Form Submission Script ________________ */
  jQuery.validator.addMethod('answercheck', function(value, element) {
      return this.optional(element) || /^\bblue\b$/.test(value); //
  }, "type the correct answer to the question (case matters)");
  
  // validate contact form
  $(function() {
      $('#rsvpform').validate({
          rules: {
              name: {
                  required: true,
                  minlength: 2
              },
              email: {
                  required: true,
                  email: true
              },
              attending: {
                  required: true
              },
              guests: {
                  required: true
              },
              answer: {
                  required: true,
                  answercheck: true
              }
          },
          messages: {
              name: {
                  required: "name is required",
                  minlength: "longer please"
              },
              email: {
                  required: "email required"
              },
              guests: {
                  required: "how many guests?",
              },
              answer: {
                  required: "please fill this in"
              }
          },
          submitHandler: function(form) {
              $('#spinner').show().html('<div class="heartbeat-loader"><span class="ti ti-heart ti-3x"></span></div>');
              $(".slide-panel").animate({
                  scrollTop: 0
              }, "slow");
              $(form).ajaxSubmit({
                  type: "POST",
                  data: $(form).serialize(),
                  url: "assets/rsvp/rsvpfunction.php",
                  success: function(responseText, statusText) {
                      $('#rsvpform :input').attr('disabled', 'disabled');
                      $('#rsvpform').fadeTo("slow", 0.15, function() {
                          $(this).find(':input').attr('disabled', 'disabled');
                          $(this).find('label').css('cursor', 'default');
                          $('#success').html(responseText);
                          $('#success').fadeIn();
                          $(".slide-panel").animate({
                              scrollTop: 0
                          }, "slow");
                          $('#spinner').fadeOut();
                      });
                  },
                  error: function(responseText, statusText) {
                      $('#rsvpform').fadeTo("slow", 0.15, function() {
                          $('#error').html(responseText);
                          $('#error').fadeIn();
                          $(".slide-panel").animate({
                              scrollTop: 0
                          }, "slow");
                      });
                  }
              });
          }
      });
  });
  
  
  /* _______________  Google Custom Settings for Map ________________ */
  if ($('#map-container').length) {
  
      $.fn.googleMap = function(address, options) {
  
          // ===== change map colors based on body class for theme color options (green, ivory, purple, gold) white is not named and is the default
          if ($('body').is('.green')) {
              var $hue = "#aad333";
              var $sat = "1";
          } else
          if ($('body').is('.ivory')) {
              var $hue = "#f8f5dc";
              var $sat = "1";
          } else
          if ($('body').is('.purple')) {
              var $hue = "#9c8fd0";
              var $sat = ".8";
          } else
          if ($('body').is('.gold')) {
              var $hue = "#f9e386";
              var $sat = "1";
          } else {
              var $hue = "#000000";
              var $sat = "-100";
          }
  
  
          // ===== styles 
          var styles = [{
              stylers: [{
                  hue: $hue
              }, {
                  saturation: $sat
              }, {
                  gamma: .8
              }]
          }, {
              featureType: "road",
              elementType: "geometry",
              stylers: [{
                  lightness: 20
              }, {
                  visibility: "simplified"
              }]
          }, {
              featureType: "road",
              elementType: "labels",
              stylers: [{
                  visibility: "simplified"
              }]
          }];
  
          var defaults = {
              lat: 44.081996,
              long: -123.0286928,
              zoom: 18,
              scrollwheel: false,
              mapTypeIds: [google.maps.MapTypeId.ROADMAP]
          };
          options = $.extend(defaults, options || {
              styles: styles
          });
  
          var center = new google.maps.LatLng(options.lat, options.long);
          var map = new google.maps.Map(this.get(0), $.extend(options, {
              center: center
          }));
  
  
          var infoContent = '<div id="content">' + $('#info-content').html() + '</div>';
          var infowindow = new google.maps.InfoWindow({
              content: infoContent
          });
  
          var geocoder = new google.maps.Geocoder();
          geocoder.geocode({
              address: address
          }, function(place, status) {
              if (status == google.maps.GeocoderStatus.OK && place.length) {
                  if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
                      map.setCenter(place[0].geometry.location);
                      var marker = new google.maps.Marker({
                          position: place[0].geometry.location,
                          map: map
                      });
  
                      google.maps.event.addListener(marker, 'click', function() {
                          infowindow.open(map, marker);
                      });
                      infowindow.open(map, marker);
  
                  }
              }
          });
      };
  
  
      // ===== center locator load and resize :: add the address 
      function googleMapCenter() {
  
          var location = $('#location').text();
          $('#map-container').googleMap(location);
  
      }
  
      $(window).load(googleMapCenter);
      $(window).resize(googleMapCenter);
  
  } // end if #container-map