//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';
	}
}