  var emailReg = new RegExp(/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/);
  var numReg = new RegExp(/^[0-9]/);
  var cvvReg = new RegExp(/^[0-9]{3,4}$/);
  var nameReg = new RegExp(/^[\w]+[\s]+[\w]*.?[\s]*[\w]+$/);
  var athlete = [];

  var etc = [];
  etc.clean = true;
  etc.locked = false;
  formulate = function(formSel) {
    $(formSel)
    .find('[class*=vd]').each(function() {
      var vdtypes = getTypes($(this));
      if (vdtypes) {
        len = vdtypes.length;
        for (i=0;i<len;i++) {
          var vdtype = vdtypes[i];
          $(this).change(function() { vFormat(this,vdtype); }).keyup(function(e) { getFormat(this,vdtype,e); }).addClass('x_fc');
          switch (vdtype) {
            case "ph":
              $(this).attr('maxlength', '14').attr('size','14');
              break;
          }
        }
        addMsg(this);
      }
    })
    .end()
    .submit(function() {
      $('.vd_error').hide();
      etc.clean = true;
      etc.focus = null;
      $(this).find('.x_fc').each(function() {
        var vdtypes = getTypes($(this));
        var len = vdtypes.length;
        for (i=0;i<len;i++) {
          var vdtype = vdtypes[i];
          this.value = this.value.trim();
          switch (vdtype) {
            case 'req':
              if (this.value == "") {
                showMsg($(this).attr('name'));
                i=999;
              }
              break;
            case 'em':
              if (!emailReg.test(this.value)) {
                showMsg($(this).attr('name'),' * invalid email.');
              }
              break;
            case 'num':
              if (!numReg.test(this.value)) {
                showMsg($(this).attr('name'),' * invalid format.');
              }
              break;
            case 'cvv':
              if (!cvvReg.test(this.value)) {
                showMsg($(this).attr('name'),' * invalid format.');
              }
              break;
            case 'name':
              if (!nameReg.test(this.value)) {
                showMsg($(this).attr('name'),' * "First Last".');
              }
              break;
          }
        }
      });
      if (!etc.clean) {
        $('[name="'+etc.focus+'"]').focus().select();
        return false;
      }
    });
  };

  function getTypes(obj) {
    var vdtypes = null;
    var list = $(obj).attr('class').split(" ");
    var len = list.length;
    for (i=0;i<len;i++) {
      if (list[i].indexOf("vd-") >= 0) {
        cl = list[i].substring(3,list[i].length);
        vdtypes = cl.split("-");

        return vdtypes;
      }
    }
    return null;
  };

  function addMsg(obj,msg) {
    if (!msg) { msg = " * required."; }
    $(obj).after("<span class='vd_error' for='"+obj.name+"' id='"+obj.name+"'>"+msg+"</span>");
  };

  function showMsg(id,msg) {
    etc.clean = false;
    if (!msg) { msg = " * required."; }
    $('span[id="'+id+'"]').html(msg).show().shake();
    if (etc.focus == null) {
      etc.focus = id;
    }
  };

  function vFormat(obj,type) {
    var val;
    switch (type) {
      case "ph":
        if (obj.value!="") {
          val = obj.value.stripPunctuation();
          var a=val.substring(0,3);
          var b=val.substring(3,6);
          var c=val.substring(6,10);
          if(a.length>0) val="("+a;
          if (b!=""||a.length==3){
            val=val+") "+b;
          }
          if (c!=""||b.length==3){
            val=val+"-"+c;
          }
          obj.value = val;
        }
        break;
    }
  };

  function getFormat(obj,type,e) {
    switch (type) {
      case "ph":
        if (checkNumber(e)) {
          vFormat(obj,type);
        } else {
          obj.value = obj.value.stripLetters();
        }
    }
  };
  
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
  }

  String.prototype.stripPunctuation = function() {
    return this.replace( /[~`\.,;!@#\$%\^\*&\+=<>"\/:\?'\|\(\)\[\]_\-\\\s]/g, '');
  };

  String.prototype.stripLetters = function() {
    return this.replace( /[A-Za-z]/g, '');
  };

  function checkNumber(e){
    // detect last key pressed. if not a number, then dont do anything.
    var key = e.keyCode;
    return ((key>47 && key<58)||(key>95&&key<106))
  };

  $.fn.shake = function (repeat) {
    return this.each(function() {
      $(this).animate( { marginLeft:"10px" }, 50 )
      .animate( { marginLeft:"0px" } , 50 )
      .animate( { marginLeft:"5px"}, 80 )
      .animate( { marginLeft:"0px" } , 120 );
    })
  };

  function setupDonate() {
    $('.acoff').attr('autocomplete','off');
    
    $('.donate_btn').hover(
      function() {
        $('.donate_btn').css('background','#333333');
        $(this).css('background','#3f3f3f');
      },
      function() {
        $(this).css('background','#333333');
      }
    );

    var d = new Date().getFullYear();
    var options = "<option selected='selected' value='"+(d)+"'>"+(d)+"</option>";
    for (i=1;i<12;i++) {
      options += "<option value='"+(d+i)+"'>"+(d+i)+"</option>";
    }
    $('[name="exp_year"]').html(options);

    $('#ccs img').click(function() {
      $('#cardType').val(this.id.substr(2)).change();
    });
    $('#cardType').change(function() {
      var activeCard = $(this).val();
      $('#ccs img').each(function() {
        if (this.id != 'cc'+activeCard && activeCard != "") {
          $(this).fadeTo('fast',.2);
        } else {
          $(this).fadeTo(0,1);
        }
      });
    });

    if (athlete.length>0 && athlete[0]!="") {
      $('#athlete').val(athlete[0]);
      // $('#athlete').val(athlete[0]).attr('disabled','disabled');
    }
    // PANE 1
    $('#frmAmnt')
      .submit(function() {
        $('#amnt_err').hide();
        amnt = $('[name="btn_amount"]:checked').val();
        if (amnt == 'other') {
          amnt = parseFloat($('#other').val().replace(/[A-Za-z]|\$|,/g,''));
        }
        if (amnt <= 0 || amnt == undefined || isNaN(amnt)) {
          showMsg('amnt_err','Please select how much you would like to donate.');
        } else {
          $('#frmType #amnt').val(amnt).formatCurrency({symbol:''});
          $('#ppf #amount').val(amnt).formatCurrency({symbol:''});
          showPane(1);
        }
        return false;
      })
      .find('.donate_btn')
      .click(function(e) {
        $this = $(this);
        $('#amnt_err').hide();
        $('.dactive').removeClass('dactive');
        $this.addClass('dactive');
        $('#'+this.id.substr(1)).click();
        if ($this.find('input').length > 0) {
          $this.find('input').focus().select();
        }
        return false;
      });

    // PANE 2
    formulate($('#frmType'));
    $('#frmType')
      .submit(function() {
        var expDate = new Date();
        expDate.setFullYear($('[name="exp_year"]').val(),$('[name="exp_month"]').val());
        var today = new Date();
        if (today > expDate) {
          showMsg('exp_year',' * please enter a future date.');
          return false; // UNCOMMENT TO HALT ON DATE ERROR.
        }
        if (etc.clean) {  // UNCOMMENT TO HALT ON ERRORS.
          $('#frmRvw').find('span[id]').each(function() {
            $(this).html($('#frmType [name="'+this.id.substr(2)+'"]').val());
          });
          $('#r_amnt').prepend('$');
          showPane(2);
        } // UNCOMMENT TO HALT ON ERRORS.
          return false;
      })
      .find('.back').click(function() {
        showPane(0);
      });

    // PANE 3
    $('#frmRvw').submit(function() {
      if (!etc.locked && etc.clean) { // UNCOMMENT TO HALT ON ERRORS.
        etc.locked = true;
        $('#warning').slideUp('fast');
        $('#loader').show();
        $.ajax({
          type: "POST",
          url: "/submit.php",
          data: $('#frmType').serialize()+'&'+$('#frmRvw').serialize(),
          dataType: 'json',
          cache: false,
          success: function(msg) {
            switch (msg.status) {
              case 'err':
                eval(msg.js);
                break;
              case 'warning':
                  $('#warning').html(msg.msg).slideDown('fast');
                break;
              case 'ok':
                  $('.content').html(msg.msg);
                break;
            }
          },
          error: function() {
            var err = "There was an error communicating with the server.<br />Your card has not been charged.<br />  Please try again.";
            $('#warning').html(err).slideDown('fast');
          },
          complete: function() {
            $('#loader').hide();
            etc.locked = false;
          }
        });
      }
      return false;
    })
    .find('.back').click(function() {
      showPane(1);
      $('#warning').slideUp('fast');
    });
  };

  function showPane(show) {
    $('#pane_'+show+' form').css('visibility','visible');
    $('#pane_holder').animate({left:-(show*500)},500, function() {
      $('#pane_holder .pane[id!="pane_'+show+'"] form').css('visibility','hidden');
    });
  }

  function setupFAQ() {
    $('div#faq_list .answer').hide();
    $('div#faq_list .faq_btn').show();

    var activeClick = null;
    $('div#faq_list .faq').css('cursor','pointer').click(function() {

      $('div#faq_list [class="answer"][id!="a'+this.id+'"]').slideUp(300);

      $(this).find('.answer').slideToggle(300);
    });
  };
  
  function setupAthlete() {
  var div;
    $('div.athlete_pic').each(function() {
      div = $(this);
      $(this).find('h4 a').each(function() {
        var href = $(this).attr('href');
        $(div).css('cursor','pointer').click(function() {
          window.location = href;
        });
      });
    });
  }

(function($){$.formatCurrency={};$.formatCurrency.regions=[];$.formatCurrency.regions[""]={symbol:"$",positiveFormat:"%s%n",negativeFormat:"(%s%n)",decimalSymbol:".",digitGroupSymbol:",",groupDigits:true};
$.fn.formatCurrency=function(destination,settings){if(arguments.length==1&&typeof destination!=="string"){settings=destination;destination=false
}var defaults={name:"formatCurrency",colorize:false,region:"",global:true,roundToDecimalPlace:2,eventOnDecimalsEntered:false};defaults=$.extend(defaults,$.formatCurrency.regions[""]);
settings=$.extend(defaults,settings);if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}settings.regex=generateRegex(settings);
return this.each(function(){$this=$(this);var num="0";num=$this[$this.is("input, select, textarea")?"val":"html"]();if(num.search("\\(")>=0){num="-"+num
}if(num===""){return}if(isNaN(num)){num=num.replace(settings.regex,"");if(num===""){return}if(settings.decimalSymbol!="."){num=num.replace(settings.decimalSymbol,".")
}if(isNaN(num)){num="0"}}var numParts=String(num).split(".");var isPositive=(num==Math.abs(num));var hasDecimals=(numParts.length>1);var decimals=(hasDecimals?numParts[1].toString():"0");
var originalDecimals=decimals;num=Math.abs(numParts[0]);if(settings.roundToDecimalPlace>=0){decimals=parseFloat("1."+decimals);decimals=decimals.toFixed(settings.roundToDecimalPlace);
if(decimals.substring(0,1)=="2"){num=Number(num)+1}decimals=decimals.substring(2)}num=String(num);if(settings.groupDigits){for(var i=0;i<Math.floor((num.length-(1+i))/3);
i++){num=num.substring(0,num.length-(4*i+3))+settings.digitGroupSymbol+num.substring(num.length-(4*i+3))}}if((hasDecimals&&settings.roundToDecimalPlace==-1)||settings.roundToDecimalPlace>0){num+=settings.decimalSymbol+decimals
}var format=isPositive?settings.positiveFormat:settings.negativeFormat;var money=format.replace(/%s/g,settings.symbol);money=money.replace(/%n/g,num);
var $destination=$([]);if(!destination){$destination=$this}else{$destination=$(destination)}$destination[$destination.is("input, select, textarea")?"val":"html"](money);
if(hasDecimals&&settings.eventOnDecimalsEntered){$destination.trigger("decimalsEntered",originalDecimals)}if(settings.colorize){$destination.css("color",isPositive?"black":"red")
}})};$.fn.toNumber=function(settings){var defaults=$.extend({name:"toNumber",region:"",global:true},$.formatCurrency.regions[""]);settings=jQuery.extend(defaults,settings);
if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}settings.regex=generateRegex(settings);return this.each(function(){var method=$(this).is("input, select, textarea")?"val":"html";
$(this)[method]($(this)[method]().replace(settings.regex,""))})};$.fn.asNumber=function(settings){var defaults=$.extend({name:"asNumber",region:"",parse:true,parseType:"Float",global:true},$.formatCurrency.regions[""]);
settings=jQuery.extend(defaults,settings);if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}settings.regex=generateRegex(settings);
settings.parseType=validateParseType(settings.parseType);var method=$(this).is("input, select, textarea")?"val":"html";var num=$(this)[method]();
num=num?num:"";num=num.replace(settings.regex,"");if(!settings.parse){return num}if(num.length==0){num="0"}if(settings.decimalSymbol!="."){num=num.replace(settings.decimalSymbol,".")
}return window["parse"+settings.parseType](num)};function getRegionOrCulture(region){var regionInfo=$.formatCurrency.regions[region];if(regionInfo){return regionInfo
}else{if(/(\w+)-(\w+)/g.test(region)){var culture=region.replace(/(\w+)-(\w+)/g,"$1");return $.formatCurrency.regions[culture]}}return null}function validateParseType(parseType){switch(parseType.toLowerCase()){case"int":return"Int";
case"float":return"Float";default:throw"invalid parseType"}}function generateRegex(settings){var symbol=settings.symbol.replace("$","\\$").replace(".","\\.");
return new RegExp(symbol+"|[^\\d"+settings.decimalSymbol+"-]","g")}})(jQuery);

