var Handlers = Handlers || {};

var SIV = function() {
	// private SIV functions
	var useResponse = function(json, status, handler) {
		if(handler) {
			handler.apply(this, [(json.success == 'true' ? true : false), json.data]);
		}
	}

	// return the public interface
	return {
		idSeed : 0,
		
	    id : function(el, prefix){
			var el = el ? $(el).get(0) : false;
	        prefix = prefix || "infused-gen";
	        var id = prefix + (++this.idSeed);
	        return el ? (el.id ? el.id : (el.id = id)) : id;
	    },
		
		addHandlers : function(methods) {
			$.extend(Handlers, methods);
		},
		
		decode : function(json) {
			
			return eval("(" + json + ")");
		},
		
		ajaxCall : function(options) {
			if(!options || !(options.module || options.url))
				return false;
			
			if(typeof options.params == 'string') {				
				var params = options.params;
			} else if(options.params && options.params.length > 0) {
				var params = options.params.join('/');
			}

			var url  = options.url || '/' + options.module + '/'
					+ (options.controller ? options.controller + '/' : 'index/')
					+ (options.action ? options.action + '/' : 'index/')
					+ (params ? params : '');

			if(options.form) {
				if(typeof(options.form) == 'string') {
					var formData = $('#' + options.form).serialize();
				} else if($(options.form).length == 1) {
					var formData = $(options.form).serialize();
				} else {
					var formData = [];
					$.each(options.form, function() {
						formData.push($('#' + this).serialize());
					})
					formData = formData.join('&');					
				}			
			}
			
			var postData = options.postData ? jQuery.param(options.postData) : '';		
			var data = (formData ? (formData + '&') : '') + postData;
			
			if(options.postQuery) {
				data = data + '&' + options.postQuery;
			}

			var handlerFn = (typeof options.handler == 'string')
				? Handlers[options.handler]
				: (
					(typeof options.handler == 'function')
						? options.handler
						: false
				);
			
			$.ajax({
				url: url,
				success: function(data, statusText, XMLHttpRequest){
					useResponse(data, statusText, handlerFn)
				},
				dataType: 'json',
				data: data || null,
				type: data ? 'POST' : 'GET'
			});
		}
	}
}();
$.extend(Function.prototype, {
	createCallback : function(/*args...*/){
		// make args available, in function below
		var args = arguments;
		var method = this;
		return function() {
			return method.apply(window, args);
		};
    },
	
    createDelegate : function(obj, args, appendArgs){
        var method = this;
	
        return function() {
			
            var callArgs = args || arguments;
			console.log(callArgs);
            if(appendArgs === true){
                callArgs = Array.prototype.slice.call(arguments, 0);
                callArgs = callArgs.concat(args);
            }else if(typeof appendArgs == "number"){
                callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
                var applyArgs = [appendArgs, 0].concat(args); // create method call params
                Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
            }
            return method.apply(obj || window, callArgs);
        };
    }
});

$.fn.extend({
	
	getId : function(sep) {
		sep = sep || '-';
		return this[0].id.substr(this[0].id.lastIndexOf('-')+1);
	},
	getLead: function(sep) {
		sep = sep || '-';
		return this[0].id.substr(0,this[0].id.indexOf('-'));
	},
	
	findParent : function(expr, maxDepth, returnEl) {
        var p = this[0], b = document.body, depth = 0;
        maxDepth = maxDepth || 50;
        while(p && p.nodeType == 1 && depth < maxDepth && p != b) {
            if($(p).is(expr)){
                return returnEl ? p : $(p);
            }
            depth++;
            p = p.parentNode;
        }
        return null;		
	},

	
      center: function(){return this.each(function(){$(this).css({position:'absolute'});var leftPos=($(window).width()-$(this).outerWidth())/2+$(window).scrollLeft();var topPos=($(window).height()-$(this).outerHeight())/2+$(window).scrollTop();if(topPos<0)topPos=0;if(leftPos<0)leftPos=0;$(this).css({left:leftPos+'px',top:topPos+'px',zIndex:'1000'});});},
	  exists: function(){
	  	return jQuery(this).length > 0
	  }
	  
});




