;(function($){
	var isURL = function(string){
		var string = string.toLowerCase();
		var url = false;
		if(string.charAt(0) == '/') url = true;
		if(string.substr(0, 3) == 'http') url = true;

		return url;
	}
					 
	$.fn.jformajax = function(settings) {
		var options = $.extend({}, $.fn.jformajax.defaults, settings);
		var container = this;

		//Extend
		$.extend(this, {	 
			blocked: false,
			
			init: function(){
				this.each(function(){
					if(!this.inputaction)
						this.inputaction = $(this).prepend('<input type="hidden" name="action" />');
					
					this.working = false;
					$(this).submit(container.submitHandler);							 
					container.links(this);
				});	
			},

			links: function(form){
				$('.jfa-switch', form).each(function(){
					this.form = form;
					this.container = container;
			
					$(this).click(container.switchHandler);
				});	
			},
		
			validate: function(){
				this.valid = true;
				if(!this.rel) return false;
				var validate_external = window[this.rel];
				if(!validate_external) return false;
				
				validate_external.call(this);
			},
		
			switchHandler: function(){
				if(container.working || $.fn.jformajax.blocked) return false;
				
				/* javascript validation */
				container.validate.call(this);
				if(!this.valid) return false;
				
				var action = this.href.split('#')[1];
				$.fn.jformajax.submitDo(this.form, action);
				return false;
			},
	
			submitHandler: function(){
				current = this;
				container.submitBefore.call(this);
				
				//http://malsup.com/jquery/form/#code-samples
				container.working = true;
				container.loading(true);
				return false;
			},
			
			ajaxDo: function(){
				$(current).ajaxSubmit({
					success: container.showResponse
				});
			},
			
			showResponse: function(responseText, statusText){
				if(isURL(responseText)){
					//url redirection
					document.location.href = responseText;
					return false;
				}
			
				$('.content', current).html(responseText);
				container.links(current);
				container.loading(false);
				container.working = false;
				
				container.submitAfter();
			},
			
			loading: function(action){
				var opacity = action==true ? 0.01 : 1;
				var callback = action==true ? container.ajaxDo : false;

				$('.content', current).animate({
					opacity:opacity															 
				}, callback);
			},
			
			isIE6: $.browser.msie && $.browser.version == 6,
			
			submitBefore: function(){
				if(container.isIE6)
					$('select', this).css('visibility', 'hidden');
			},
			
			submitAfter: function(){
				//
				
				if(options.callback)
					options.callback();
			}
		});

		//Initialize
		this.init();

		return this;
	}
	
	$.fn.jformajax.submitDo = function(form, action){
		$('input[name=action]', form).attr('value', action);
		$(form).submit();
	}
	
	$.fn.jformajax.defaults = {
		callback: false
	};	
})(jQuery);