(function($) {

	$.setContext = function(/* fn, context, arg1, arg2, ... */) {
	    var args = $.makeArray(arguments),
	        fn = args.shift(),
	        context = args.shift();
	    return function() { fn.apply(context, $.makeArray(arguments).concat([this].concat(args))); };
	};
	
})(jQuery);

(function($) {
	
	$.fn.axisify = function(oParams) {
		
		var jEl = this;
		
		var params = $.extend({
			start : 0,
			end : 100,
			orientation : 'x'
		},oParams);
		
		function getCoordinate(value) {
			
			if(value == "min") {
				value = params.start;
			} else if(value == "max") {
				value = params.end;
			}
			
			var axisLength = (params.orientation == 'y')
				? jEl.height()
				: jEl.width();
			
			var ratio = (value-params.start)/(params.end-params.start);
			return axisLength*ratio;
		}
		
		this.getCoordinate = getCoordinate;
		
		return this;
	}
	
})(jQuery);

(function($) {

	var createNameMapping = { className : 'class' }
	var selfClosingTags = {'br':0,'input':0,'area':0,'base':0,'basefont':0,'hr':0,'img':0,'link':0,'meta':0}
	$.create = function(type,attr,contents, parent) {
		var attrString = [];
		for(var i in attr) { 
			attrString.push([(createNameMapping[i] || i),'="',attr[i],'"'].join('')); 
		}
		var el;
		if(type in selfClosingTags) {
			el = $(["<",type," ",attrString.join(' ')," />"].join(''));
		} else {
			el = $(["<",type," ",attrString.join(' '),"></",type,">"].join(''));
		}
		var contents = (contents instanceof Array) ? contents : [contents];
		for(var i=0; i<contents.length; i++) {
			el.append(contents[i]);
		}
		if(parent) {
			var parent = (parent instanceof $) ? parent : $(parent); 
			parent.append(el); 
		}
		return el;
	}
})(jQuery);
