var validator = ({
   valClasses: ["firstname","lastname","email","city","company","address","phone","empty","number","zip", "selected","checked", "populated", "zipFile", "imageFile", "tooLong"],
   currErrs: 0,
   maxLength: 0,
   init: function(){
      var forms = $("form");
      var submitString = "";
      
      // prevent the enter button from submitting the form(s)
      $("input[type='text']").keypress(function(ev){
         if(ev.keyCode == 13){
            return false;
         }
      });
      
      forms.each(function(){
         if($(this).attr('id') == "logout"){return}
         var formName = $(this).attr("name");
         var formEls = $("input, select, textarea",$(this));
         var isValid = false;
         var msg = "";
         
         var submit = $("#submit");
         
         $(submit).unbind("click");
         
         $(submit).bind("click",function(ev){
            ev.preventDefault();
            validator.currErrs = 0;
            
            $(".error").remove();
            
            if($(".req").length == 0){
               // no need to run validation if there are no required elements
               isValid = true;
            }
            
            formEls.each(function(){
               if($(this).hasClass("req")){
                  
                  // check to see if element is invisible,
                  // or if it's ancestors are; if so, exit 
                  // validation for this el
                  var walker = $(this).parents();
                  var notVis = false;
                  walker.each(function(){
                     if($(this).css("display") == "none"){notVis = true;}
                  });
                  
                  if(notVis){return}
                  
                  for(i=0;i<validator.valClasses.length;i++){                  
                     if($(this).hasClass(validator.valClasses[i])){
                        var callString = validator.valClasses[i];
                        var fc = callString.substring(0,1).toUpperCase();
                        callString = "is" + fc + callString.substring(1,callString.length);
                        // eval is evil, I'm evil, bla bla
                        eval("isValid = validator." + callString + "(this);");

                        if(isValid == false){
                           switch(validator.valClasses[i]){
                           	  case "firstname":
                                 msg = "Please enter your first name.";
                              break;
                              case "lastname":
                                 msg = "Please enter your last name.";
                              break;
                              case "email":
                                 msg = "Please enter a valid email address.";
                              break;
                              case "city":
                                 msg = "Please enter your city.";
                              break;
                              case "company":
                                 msg = "Please enter your company's name.";
                              break;
                              case "address":
                                 msg = "Please enter your street address.";
                              break;
                              case "phone":
                                 msg = "Please enter your phone number.";
                              break;
                              case "empty":
                                 msg = "Please provide a value for this field.";
                              break;
                              case "number":
                                 msg = "Please enter a number.";
                              break;
                              case "zip":
                                 msg = "Please enter zip.";
                              break;
                              case "selected":
                                 msg = "Select State.";
                              break;
                              case "checked":
                                 msg = "Please select at least one option.";
                              break;
                              case "populated":
                                 msg = "Please enter some content.";
                              break;
                              case "zipFile":
                                 msg = "Please select a file to upload.";
                              break;
                              case "imageFile":
                                 msg = "Please select an image file (jpeg/jpg/gif/png) to upload.";
                              break;
                              case "tooLong":
                                 msg = "This field has a maximum length of " + validator.maxLength + " characters.  Please edit your copy.";
                              break;
                              default:
                                 // shouldn't ever get here
                              break;
                           }

                        	var error = "<div class=\"error\"><span class=\"arrow\"></span><div>" + msg + "</div></div>";
                        	if(validator.valClasses[i] == "populated"){
                              validator.error($(this).next(),error);
                        	}else{
                              validator.error(this,error);
                        	}

                           var errs = $(".error");
                           var insErr = $(errs).get(errs.length - 1);

                           $(this).bind("focus",function(){

                              $(insErr).animate({
                                 opacity: 0
                              });

                           });


                        }


                     }

                  }


               }

            });
            
            if(isValid == true && validator.currErrs == 0){
               //$(submit).trigger("click");
               $(forms).submit();
            }else{
               var errs = $(".error").get(0);
               //$.scrollTo( errs, 300);
               
            }
            
            
         });
         
         
      });
      
      
   },
   isFirstname: function(el){
      if($(el).attr("value").length < 0 || $(el).attr("value") == "First Name"){
         return false;
      }else{
         return true;
      }
   },
   isLastname: function(el){
      if($(el).attr("value").length < 0 || $(el).attr("value") == "Last Name"){
         return false;
      }else{
         return true;
      }
   },
   isEmail: function(el){
      var filter = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$/;
      if($(el).attr("value").length < 0 || filter.test($(el).attr("value")) == false){
         return false;
      }else{
         return true;
      }
   },
   isCity: function(el){
      if($(el).attr("value").length < 0 || $(el).attr("value") == "City"){
         return false;
      }else{
         return true;
      }
   },
   isCompany: function(el){
      if($(el).attr("value").length < 0 || $(el).attr("value") == "Business Name"){
         return false;
      }else{
         return true;
      }
   },
   isAddress: function(el){
      if($(el).attr("value").length < 0 || $(el).attr("value") == "Street Address #1"){
         return false;
      }else{
         return true;
      }
   },
   isPhone: function(el){
      if($(el).attr("value").length < 3 || $(el).next().attr("value").length < 3 || $(el).next().next().attr("value").length < 4){
         return false;
      }else{
         if((validator.isNumber($(el)) == false || validator.isNumber($(el).next()) == false || validator.isNumber($(el).next().next()) == false)){
            return false;
         }else{
            return true;
         }
      }
   },
   isEmpty: function(el){
      if($(el).attr("value").length > 0){
         return true;
      }else{
         return false;
      }
   },
   isNumber: function(el){
      var value = $(el).attr("value");
      if (value == null || !value.toString().match(/^[-]?\d*\.?\d*$/)) return false;
      return true;
   },
   isZip: function(el){
      var value = $(el).attr("value");
      if (value == null || !value.toString().match(/^[-]?\d*\.?\d*$/)) return false;
      return true;
   },
   isSelected: function(el){
		
      if($("option:selected",$(el)).attr("value") != 0 && $("option:selected",$(el)).attr("value") != ""){
         return true;
      }else{
         return false;
      }
      
   },
   isChecked: function(el){
      if($(el).attr("selected") == "selected"){
         return true;
      }else{
         return false;
      }
   },
   isPopulated: function(el){

     var frame = $("iframe",$(el).next()).contents().find("body").text();
     
     if(frame.length > 1){
        return true;
     }else{
        return false;
     }
      
   },
   isZipFile: function(el){
      // check if this is a zip file
      if(!/(\.zip)$/i.test(el.value)) {
   		return false;
   	}else{
   	   return true;
	   }
   },
   isImageFile: function(el){
      // check if this is an image/video file
      if(!/(\.png|\.gif|\.jpg|\.jpeg|\.flv)$/i.test(el.value)) {
   		return false;
   	}else{
   	   return true;
	   }
   },
   isTooLong: function(el){
      var frame = $("iframe",$(el)).contents().find("body").text();
      
      // get our character count limit
      var names = $(el).attr("class");
      
      names = names.split(" ");
      
      $(names).each(function(){
         if(this.indexOf("length") != -1){
            validator.maxLength = parseFloat(this.split("length")[1]);
         }
      });
      
      if(frame.length <= validator.maxLength){
         return true;
      }else{
         return false;
      }
      
   },
	error: function(dd,error){

		var offset = $(dd).offset();
		var ddWidth = $(dd).width();
      var ieOffset = 0;
      if(!jQuery.support.boxModel){
         ieOffset = 15;
      }
		
		$(dd).parent().append(error);
		
		var errors = $(".error");
		
		var cErr = $(errors).get(errors.length-1);
		
		$(cErr).css({
			//left: (offset.left - 135),
			left: (offset.left + ddWidth/2 - 200),
			top: -9,
			opacity: 0
		}).animate({
			opacity: 1
		});
		
		validator.currErrs++;
		
	},
	scrollTo: function(item){
		$.scrollTo(item);
	}	   
});