jQuery.fn.pbforms = function(options,callback){
    return this.each(function(){
		var that = this,
			form = $(this),
			popup = null,
			blackOut = null,
			closeButton = null,
			closeButtonOnclick = '',
			ajaxImg = new Image(),
			defaults = {
				ajax:1,
				referrer:document.referrer.replace('http://',''),
				action:form.attr('action'),
				method:form.attr('method'),
				encType:form.attr('enctype'),
				submit:form.find('input[type="submit"]'),
				fields:form.find(':input').not('input[type="submit"]'),
				success:'Thank you. Your information has been sent.',
				popup:false,
				trigger:null,
				showFormOnLoad:false,
				popupWidth:'600px',
				beforeSubmit:null,
				afterSubmit:null,
				afterCancel:null,
				closeButtonTracker:null
			};

		options = $.extend(defaults,options);

		this.showForm = showForm;
		this.hideForm = hideForm;

		form.prepend('<input type="hidden" name="referrer" value="'+options.referrer+'"/>');

		//Preload the loading image
		ajaxImg.src = 'http://assets.portlandbolt.com/images/ajax_load.gif';

		options.submit.parent().css('position','relative');

		if(options.popup){
			form.remove();
			form.removeAttr('class');
			if(options.closeButtonTracker){
				closeButtonOnclick = 'onclick="pageTracker._trackEvent('+options.closeButtonTracker+');"';
			}
			closeButton = $('<a class="closeButton" href="#"><img src="http://assets.portlandbolt.com/images/close_button.jpg" alt="Close" '+closeButtonOnclick+' /></a>');
			popup = $('<div class="popup"></div>');
			popup.append(closeButton);
			popup.hide().append(form);
			blackOut = $('<div class="blackOut"></div>');
			blackOut.hide();
			$('body').append(blackOut);
			$('body').append(popup);
			if(options.showFormOnLoad){
				showForm();
			}
			options.trigger.click(function(){
				that.showForm();
				return false;
			});
			closeButton.click(function(){
				that.hideForm();
				return false;
			});
		}

		form.submit(function(){

			var qs,actn,mthd,ok,enc = (options.encType) || 'application/x-www-form-urlencoded';
			if(options.beforeSubmit != null){
				ok = options.beforeSubmit.apply(that);
				if(!ok) return false;
			}
			options.fields.filter('.error').val('');

			if(options.ajax){
				qs = generateQuery();
				$.ajax({
					url: options.action,
					type: options.method,
					data: (qs),
					contentType:enc,
					beforeSend: function(){
						options.submit.after('<div class="ajax"><img src="http://assets.portlandbolt.com/images/ajax_load.gif"> Working...</div>');
					},
					error:function(){
						$('.ajax',options.form).remove();
						alert('There was an error with your submission.');
					},
					success: function(msg){
						$('.ajax',options.form).remove();
						if(msg){
							if(json.responseType === "success"){
								if(options.afterSubmit){
									options.afterSubmit.apply(that);
								}else{
									successMsg();
								}
							}else if(json.responseType === "error"){
								highlightInputs(json);
							}else if(json.responseType === "internalError"){
								alert("We're sorry. There seems to be a bug in this form. We have been notified of the problem and and are working to resolve it. \r\n\r\nIn the mean time, please call us at (800) 547-6758 or email us at sales@portlandbolt.com");
							}else if(json.responseType === "spamAttempt"){
								alert('Error: '+json.text);
							}else{
								alert('Unknown response');
							}
						}
					}
				});
				return false;
			}else{
				errors = validate();
				if(errors){
					highlightInputs(errors);
				}else{
					return true;
				}
				return false;
			}
		});

		this.onreset = function(){
			if(options.afterCancel){
				options.afterCancel.apply(that);
			}
		}

		function validate(){
			var response = {},
				validate = $('input[name="!validation"]',form).val(),
				email = /^[a-z0-9!#\$%&'\*\+-\/\=\?\^_\`\{\|\}~]{1,64}@[a-z0-9-\.]{1,255}\.([a-z]{2}\.)?[a-z]{2,6}$/i;

			validate = validate.split('|');

			for(i=0;i<validate.length;i++){
				var part = validate[i].split(':');
				validate[part[0]] = part[1].split(',');
			}

			for(var type in validate){
				switch(type){
					case 'required':
						//for(i=0;i<validate[type].length;i++){
						//	if(!$('input[name="'+validate[type][i]+'"]').val()){
						//		if(response.required){
						//			response.required.push(validate[type][i]);
						//		}else{
						//			response.required = [validate[type][i]];
						//		}
						//	}
						//}
					break;
					case 'email':
						for(i=0;i<validate[type].length;i++){
							if(!email.test($('input[name="'+validate[type][i]+'"]',form).val())){
								/*if(response.email){
									response.email.push(validate[type][i]);
								}else{
									response.email = [validate[type][i]];
								}*/
							}

							try{
								var value = $('input[name="'+validate[type][i]+'"]',form);
								console.log(value.val());
								console.log(email.test($('input[name="'+validate[type][i]+'"]',form).val()));
							}catch(e){}
						}
					break;
				}
			}

			if(response.required || response.email){
				response.responseType = 'error';
				return response;
			}
			return false;
		}

		function highlightInputs(errorObj){
			var input,err,scrollPosition = 10000,win = $(window);
			for(var type in errorObj){
				if(type != 'responseType'){
					for(j=0;j<errorObj[type].length;j++){
						input = options.fields.filter('[name="'+errorObj[type][j]+'"]');
						switch(type){
							case 'required':
								err = 'This field is required';
							break;
							case 'email':
								err = 'Email is invalid';
							break;
							default:
								err = 'There was an error';
							break;
						}
						input.addClass('error').val(err);
						input.bind('focus',function(){
							var that = $(this);
							that.removeClass('error').val('');
							that.blur(function(){
								$(that).unbind('focus');
							})
						});
						if(input.offset().top < scrollPosition){
							scrollPosition = input.offset().top;
						}
					}
				}
			}
			if(win.scrollTop() > scrollPosition || win.scrollTop + win.height() < scrollPosition){
				$('html, body').animate({scrollTop: scrollPosition - 25}, 500);
			}
		}

		function generateQuery() {
			var arr = {},str;
			options.fields = form.find(':input').not('input[type="submit"]');
			options.fields.each(function(i){
				var inp = $(this);
				if(inp.is('[type=checkbox]')){
					if(inp.is(':checked')){
						arr[inp.attr('name')] = inp.val();
					}else{
						arr[inp.attr('name')] = '';
					}
				}else{
					arr[inp.attr('name')] = inp.val();
				}
			});
			arr['ajax'] = options.ajax;
			arr['referrer'] = options.referrer;
			return arr;
		}

		function errorMsg(error){
			alert(error);
		}

		function successMsg(){
			var s = $('<div class="success"><p>'+options.success+'</p></div>'),
				l = $('<a href="#">Click to close</a>');
			options.fields.not(':hidden').each(function(i){
				$(this).val('');
			});
			s.css({display:'none'});
			if(form.css('position') != 'absolute'){
				form.css('position','relative');
			}
			s.append(l);
			form.append(s);
			s.slideDown('slow');
			l.click(function(){
				s.remove();
				s = null;
				l = null;
				return false;
			});
		}

		function showForm(){
			var top = ($(window).height()/2)-(popup.outerHeight()/2);
			blackOut.css({height:$(document).height()+'px',opacity:'0'}).show();
			$(blackOut).animate({
				opacity:'.7'
			});
			if(top < 0){
				top = 50;
			}
			popup.css('width',options.popupWidth)
			popup.css({top:top+'px',marginLeft:'-'+popup.outerWidth()/2+'px'})
			popup.show();
		}

		function hideForm(){
			popup.hide();
			$(blackOut).animate({
				opacity:'0'
			},'','',function(){
				$(this).hide();
			});
		}
	});
};
