$.expr[':'].icontains = function(obj, index, meta, stack){
return (obj.textContent || obj.innerText || jQuery(obj).text() || '').toLowerCase().indexOf(meta[3].toLowerCase()) >= 0;
};

Array.prototype.unique = function() {
	var a = [];
	var l = this.length;
	for(var i=0; i<l; i++) {
		for(var j=i+1; j<l; j++) {
			// If this[i] is found later in the array
			if (this[i] === this[j])
				j = ++i;
		}
		a.push(this[i]);
	}
	return a;
};

Array.prototype.intersect = function() {
	if (!arguments.length)
		return [];
	var a1 = this;
	var a = a2 = null;
	var n = 0;
	while(n < arguments.length) {
		a = [];
		a2 = arguments[n];
		var l = a1.length;
		var l2 = a2.length;
		for(var i=0; i<l; i++) {
			for(var j=0; j<l2; j++) {
				if (a1[i] === a2[j])
					a.push(a1[i]);
			}
		}
		a1 = a;
		n++;
	}
	return a.unique();
};

queryToObject = function(string){
	string = decodeURIComponent(string);
	if (string.charAt(0).match(/[?#]/)) string = string.substr(1);
	var object = {};
	var startIndex = 0;
	var endIndex = 0;
	var key = '';
	var value = '';
	while(string.indexOf('=', startIndex) != -1) {
		endIndex = string.indexOf('=', startIndex);
		key = string.substring(startIndex, endIndex);
		startIndex = endIndex + 1;
		endIndex = string.indexOf('&', startIndex);
		if (endIndex == -1) endIndex = string.length;
		value = string.substring(startIndex, endIndex);
		object[key] = value;
		startIndex = endIndex + 1;
	}
	return object;
}

eventDispatcher = function() { }
eventDispatcher.prototype = {
	listeners:{},
	addEventListener:function(eventName, listener){
		if (!this.listeners.hasOwnProperty(eventName))
			this.listeners[eventName] = [];
		this.listeners[eventName].push(listener);
	},
	removeEventListener:function(eventName, listener){
		if (this.listeners.hasOwnProperty(eventName)) {
			if (listener == 'all') {
				this.listeners[eventName] = [];
			} else {
				for (var i = 0; i < this.listeners[eventName].length; i++)
				{
					if (this.listeners[eventName][i] === listener) {
						this.listeners[eventName].splice(i, 1);
					}
				}
			}
		}
	},
	dispatchEvent:function(eventName, data){
		var z = this;
		if (z.listeners.hasOwnProperty(eventName)) {
			for (var i = 0; i < z.listeners[eventName].length; i++)
			{
				if (typeof z.listeners[eventName][i] === 'function') {
					z.listeners[eventName][i](data);;
				}
			}
		}
	}
}

