//getElementById() + cache
function getter(){
	getter_cache = {};

	//Get element by id
    this.get = function(id){
		if(getter_cache[id]){
			return getter_cache[id];
		}
		getter_cache[id] = document.getElementById( id );
		return getter_cache[id];
	}

	//Clear cache
	this.clear_cache = function(){
		for(var id in getter_cache)
			getter_cache[id] = undefined;
	}
}

function toggle_display(id, flag, getter_obj){
	var el = getter_obj && getter_obj.get ? getter_obj.get( id ) : document.getElementById( id );
	if(!el)
		return false;
	el.style.display = flag ? '' : 'none';
	return true;
}

//Input length tracker
function set_track(el, ml){
	if(el.addEventListener){
		el.addEventListener('change', get_track_func(el, ml), true);
		el.addEventListener('keyup', get_track_func(el, ml), true);
	}
	else if(el.attachEvent){
		el.attachEvent('onchange', get_track_func(el, ml));
		el.attachEvent('onkeyup', get_track_func(el, ml));
	}
	(get_track_func(el, ml))();
}
function get_track_func(el, ml){
	return function(){
		if(el.value == undefined)
			return;
		var len = el.value.length;
		var track = _.get(el.id + '_track');
		track.getElementsByTagName('span')[0].innerHTML = len;
		track.getElementsByTagName('div')[0].style.width = (len > ml ? 100 : Math.round(100 * len / ml)) + '%';
		if(len > ml)
			track.className = 'tracker overflow';
		else
			track.className = 'tracker';
	}
}

//Color table rows if table class="zebra"
function zebra(){
	var tables = document.getElementsByTagName('TABLE');
	var i = 0, l = tables.length;
    var trs, j, l2, cur;
	for(; i < l; i++){
		if(/\bzebra\b/.test(tables[i].className)){
			trs = tables[i].getElementsByTagName('tr');
			cur = 0;
			for(j = 0, l2 = trs.length; j < l2; j++){
				if(/*trs[j].parentNode.tagName == 'THEAD' || */trs[j].parentNode.tagName == 'TFOOT')
					continue;
				trs[j].className += ' zebra_line' + ((cur % 2) + 1)
				cur++;
			}
		}
	}
}

//Make links with class="external" open in new window
function externals(){
	var i, l, as = document.getElementsByTagName('A');
	for(i = 0, l = as.length; i < l; i++){
		if(as[i].className.indexOf('external') != -1)
			as[i].onclick = function(){ window.open(this.href); return false; }
	}
}

function p_ajax(url, el_id){
	if(!_.get(el_id))
		return;
	url += (url.indexOf('?') == -1 ? '?' : '&') + 'r=' + Math.random();
	var span = _.get(el_id).appendChild(document.createElement('SPAN'));
	var scrpt = span.appendChild(document.createElement('SCRIPT'));
	scrpt.src = url;
}