if (typeof sld === 'undefined') {
	var sld = {};
}

/**
 *	Ajaxify - Enables ajax calls for all .ajaxify elements
 */

sld.ajaxify = (function($) {
	
	var init, util, callbacks;
	
	util = {
		
		/**
		 * Tests for data type by constructor name
		 * 
		 * @param {Array|String} types
		 * @param {Array|Boolean|Date|Math|Number|String|RegExp|Object|HTMLElement} data
		 */
		'type' : function(types, data) {
			var match = false;
			var test = function(type) {
				switch(type) {
					case 'Object':
						if (typeof data === 'object' && data.length == undefined && data != null) match = true;
					case 'HTMLElement':
						if (data.tagName) match = true;
					default:
						if (data.constructor && data.constructor.toString().indexOf(type) !== -1) match = true;		
				}
			}
			if (typeof types === 'string') test(types);
			else for (var i = 0; i < types.length && !match; i++) test(types[i]);
			return match;
		},
	
		'generateData' : function(el) {
			var data = {};
		
			if ($(el).is('form')) {
				data = $(el).serialize();
			}
			
			return data;
		},
		
		'configureAjaxCall' : function(el) {
			
			var data = util.generateData(el);
			var url = $(el).attr('href') || $(el).attr('action');
			var method = $(el).attr('method') || 'GET';

			$.ajax({
				'url' : url,
				'data' : data,
				'type' : method,
				'complete' : function(xhr) {
					xhr.method = this.type;
					var _this = this;
					
					var url = '';
					var parts = _this.url.split('/');
					for (var i = 1; i < parts.length; i++) {
						if (parts[i] != '' && !/\d/.test(parts[i])) url += '/' + parts[i];
					}
					
					callbacks.execute(xhr, url);
				}
			});
		}
	};
	
	callbacks = {
		'collection' : {},
		'add' : function(cb, url) {
			if (!this.collection[url]) this.collection[url] = [cb];
			else this.collection[url].push(cb);
		},
		'remove' : function(cb, url) {
			
		},
		'execute' : function(data, url) {
			for (var cb in this.collection[url]) {
				if (util.type('Function', this.collection[url][cb])) this.collection[url][cb](data);
			}
		}
	};
	
	init = function() {		
		
		$('a.ajaxify').live('click', function(e) {
			e.preventDefault();
			sld.app.globalEvent = e;
			util.configureAjaxCall(this);
		});
		
		$('form.ajaxify').live('submit', function(e) {
			e.preventDefault();
			sld.app.globalEvent = e;
			util.configureAjaxCall(this);
		});
	};
	
	// START
	$(document).ready(init);
	
	return {
		'addCallback' : function(fn, url) {
			callbacks.add(fn, url);
		}
	};
})(jQuery);
