function $(o){return typeof(o) == 'string' ? document.getElementById(o) : o;}
function $c(c, context){
	context = context || document;
	var nodes = context.getElementsByTagName('*'),
	    node,
		i = 0,
		results = [];
	c = ' ' + c + ' ';
	while(node = nodes[i++]){
		if(node.className && (' ' + node.className + ' ').indexOf(c) != -1){
			results[results.length] = node;
		}
	}
	return results;
}
function var_dump(exp, depth, level){
	switch(typeof(exp)){
		case 'number': return exp;
		case 'string': return "'" + exp + "'";
		case 'boolean': return exp ? 'true' : 'false';
		case 'function': return 'function';
		case 'object':
			var depth = depth || 1;
				level = level || 0;
			if(level > depth){
				return 'recursion';
			}
			for(tab = ''; tab.length < level; tab += ' ');
			var brace = (exp.constructor == Array ? '[]' : '{}'),
				res = tab + brace[0] + '\n';
			for(i in exp){
				res += tab + ' ' + i + ': ' + 
					//~ var_dump(
						exp[i],
						//~ depth,
						//~ level + 1
					//~ )
					+ "<br>\n";
			}
			res += tab + brace[1];
			return res;
	}
	return 'undefined';
}

var query = {
	'get':function(param, d){
		var match = window.location.href.match(new RegExp('(\?|&|/)' + param + '=([^&/]+)'));
		return (match && match[2]) || d;
	}
}

String.prototype.trim = function(){
	var s = this.replace(/^\s+/, ''),
	    i = s.length;
	while(s.charAt(--i) == ' ');
	return s.slice(0, i + 1);
}
Object.extend = function(dst, src){
	for(var p in src){
		dst[p] = src[p];
	}
}
if(!Array.prototype.indexOf){
	Array.prototype.indexOf = function(needle){
		for(var i = 0, ii = this.length; i < ii; i++){
			if(this[i] == needle){
				return i;
			}
		}
		return -1;
	}
}
Array.has = function(haystack, needle){
	return haystack.indexOf(needle) >= 0 ? true : false;
}
Math.sqr = function(x){
	return x * x;
}

function each(collection, callback){
	for(var i = 0, ii = collection.length; i < ii; i++){
		callback(collection[i]);
	}
}

function class_has(o, c){return (' ' + o.className + ' ').indexOf(' ' + c + ' ') > -1;}
function class_add(o, c){if(!class_has(o, c))o.className += ' ' + c;}
function class_delete(o, c){o.className = (' ' + o.className + ' ').replace(' ' + c + ' ', ' ').trim();}
function class_toggle(o, c){class_has(o,c) ? class_delete(o,c) : class_add(o,c);}
function class_set(o, c, flag){(flag ? class_add : class_delete)(o, c);}

function event_add(o, e, f, b){
	o.addEventListener
		? o.addEventListener(e, f, b || false)
		: o.attachEvent('on' + (o.type == 'checkbox' && e == 'change' ? 'click' : e), function(){return f.call(o, window.event);});
}
function event_fire(o,e){
	var event;
	if(document.createEvent){
		event = document.createEvent("HTMLEvents");
		event.initEvent("dataavailable", true, true);
	}else{
		event = document.createEventObject();
		event.eventType = "ondataavailable";
	}
	event.eventName = e;
	//~ alert(e);
	if(document.createEvent){
		o.dispatchEvent(event);
	}else{
		o.fireEvent(event.eventType, event);
	}
}
var Builder = {
	node:function(o, a){
		o = document.createElement(o); // Builder.selector(o);
		for(var i in a){
			switch(i){
				case 'style':
					for(var j in a[i]) o.style[j] = a[i][j];
					break;
				case 'class':
					o.className=a[i];
					break;
				case 'events':
					for(var j in a[i]) event_add(o, j, a[i][j]);
					break;
				default:
					o.setAttribute(i, a[i], true);
			}
		}
		for(var i = 2; i < arguments.length; i++){
			var t = arguments[i];
			o.appendChild((typeof t == 'object') ? t : Builder.text(t));
		}
		return o;
	},
	text:function(t){
		return document.createTextNode(t);
	},
	selector:function(s){
		s = s.split(/\s+/);
		for(var root, prev, m, o, i = 0, ii = s.length; i < ii; i++){
			m = s[i].match(/(\w+)(?:#([\w\d_-]+))?((?:\.[\w\d_-]+)*)/);
			if(m[1]){
				o = document.createElement(m[1]);
				if(m[2]){
					o.id = m[2];
				}
				if(m[3]){
					o.className = m[3].substr(1).replace('.', ' ');
				}
				if(!root){
					root = o;
				}else{
					prev.appendChild(o);
				}
				prev = o;
			}
		}
		return root;
	}
}
var _ = Builder.node;
var $s = Builder.selector;