jQuery.fn.ajaxOn = jQuery.ajaxOn = function(settings) {

	if (!settings) settings = {};

	var _def = {

		request: {
			type: 'GET'
		},
		response: {
			dataType: 'json'
		},
		handlers: {
			_complete: function(xhr, ts, et) {
				//alert('complete! '+ts);
			},
			_error: function(xhr, ts, et) {
				alert('error! '+ts);
			},
			_default: function(data, handler, settings) {

				if (settings.runtime.w) {
					settings.runtime.w.html(data.content);
				} else {
					if (settings.modal) {
						$('.jqmWindow').remove();
						
						w = $('<div>').addClass('jqmWindow').jqm().appendTo($('body'));
						w.jqmShow();
						w.html(data.content);
						settings.runtime.w = w;
					}
				}

				if (!settings.modal) {
					if (settings.when && typeof(settings.when) == 'object') {
						if (settings.when[ handler ]) {
							switch(typeof(settings.when[ handler ])) {
								case 'string':
									$(settings.when[ handler ]).html(data.content);
									break;
								case 'object':
									obj = settings.when[ handler ];
									if (obj.before) obj.before(settings);

									
									if (obj.action) {
										obj.action(settings, data);
									} else {
										dom = $(data.content);

										if (obj.position == 'replace') {
											$(obj.element).before(dom).remove();
										} else {
											dom[ (obj.position + 'To') ]($(obj.element)).css('display', 'none');
											$(dom).slideDown(600);
										}
									}
									/*
									if (settings.runtime.w) {
												$(settings.runtime.w).effect("transfer", { to: $(dom) }, 500, function() {
													$(dom).effect("pulsate", { times: 1 }, 500);

												});
									}
									*/

									//$(obj.element)[ obj.position ](data.content);
									if (obj.after) obj.after(settings);
									break;
							}
						}
					} else {
						$(settings.when).html(data.content);
					}
				}
			}
		},
		when: {},
		before: function(settings) {
			/*
			Shadowbox.open({
        		player:     'html',
		        title:      'Welcome',
		        content:    '',
		        width:      450,
		        height:     450
		    });
		    */
		},
		runtime: {}
	}

	var action = function(_settings, def) {

		var current = $.extend(true, {}, _def);
		current = $.extend(true, current, def);

		if (!_settings) _settings = {};
		current = _settings.select?$.extend(true, current, _settings[ _settings.select() ]):$.extend(true, current, _settings);

		send = null;
		if (current.data) {
			switch(typeof(current.data)) {
				case 'function':
					send = current.data();
					break;
				default:
					send = current.data;
					break;
			}
		}

		if (current.before) current.before(current);

		$.ajax({

			type: current.request.type,
	        url: current.url,
	        dataType: current.response.dataType,
	        data: send,
	        success: function(data, textStatus){
	        	if (data.viewVars && data.viewVars.status) {
	        		fn = data.viewVars.status;
	        		handler = fn;
	        	}
	        	else {
	        		fn = '_default';
	        		handler = null;
	        	}

	        	if (current.handlers[ fn ]) current.handlers[ fn ](data, handler, current);
	        	else current.handlers._default(data, handler, current);

	      	},
	      	complete: function(xhr, ts, et) {
	      		current.handlers._complete(xhr, ts, et);
	      		if (current.after) current.after(current);
	      	},
	      	error: function(xhr, ts, et) {
	      		current.handlers._error(xhr, ts, et);
	      	}
		});
	}

	if (typeof(this) == 'function') {
		defaults = {};
		return action(settings, defaults);
	}
	
	return this.each(function(){

		switch(this.tagName) {
			case 'A':
				_event = 'click';
			break;

			case 'FORM':
				_event = 'submit';
			break;
		}

		if (settings.event) _event = settings.event;

		$(this)[ _event ](function() {
			switch(this.tagName) {
				case 'A':
					defaults = {
						url: this.href,
						data: null,
						request: {
							type: 'GET'
						}
					};
				break;

				case 'FORM':
					defaults = {
						url: this.action,
						data: $(this).serialize(),
						request: {
							type: this.method?this.method:'GET'
						}
					};
				break;
			}

			action(settings, defaults);
			return false;
		});
	});
}

