function checkMail(e) {
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if(filter.test(e))
		return true;
	else
		return false;
}

function toggle_display(e) {
	o = document.getElementById(e);
	if(!o)
		o = e;
	if(o.style.display == '') {	
		o.style.display = 'none';
		return false;
	} else {
		o.style.display = '';
		return true;
	}
}

function toggle_class(ptr, c) {
	v = ptr.className;	
	
	if(v.indexOf(c) < 0)
		add_class(ptr, c);
	else
		remove_class(ptr, c);
}

function add_class(ptr, c) {
	v = ptr.className;	
	
	if(v.indexOf(c) < 0)
		ptr.className += ' ' + c;	
}

function remove_class(ptr, c) {
	v = ptr.className;
	
	if(v.indexOf(c) > -1) {
		f = c;
		v = v.replace(f,'');
		ptr.className = v;
	}
}

hl_objs = [];
function toggle_highlight(obj, cat, c) {
	if(document.getElementById(obj))
		n_obj = document.getElementById(obj);
	else
		n_obj = obj;
		
	if(hl_objs[cat])
		add_class(hl_objs[cat], c);
		
	add_class(n_obj, c);
	hl_objs[cat] = n_obj;
}

function fill_junk(f) {
	frm = document.forms[f];
	for(x = 0; x < frm.elements.length; x++) {
		e = frm.elements[x];
		if(e.type == 'text')
			e.value = '1';
		if(e.type == 'checkbox' || e.type == 'radio')
			e.checked = true;
	}
	
	frm = document.getElementsByTagName('select');
	for(x = 0; x < frm.length; x++)
		frm[x].selectedIndex = 1;
}

function find_pos(element) {
    var left = 0;
    var top = 0;
	
    if (element != null) {
        // Try because sometimes errors on offsetParent after DOM changes.
        try {
            while (element.offsetParent) {
                left += element.offsetLeft;
                if (element.offsetParent.scrollLeft) {left -= element.offsetParent.scrollLeft; }
    	        top += element.offsetTop;
                if (element.offsetParent.scrollTop) { top -= element.offsetParent.scrollTop; }
                element = element.offsetParent;
            }
		} catch (e) {
			// Do nothing
		}
    	
        // Add the top element left offset and the windows left scroll and subtract the body's client left position.
        left += element.offsetLeft + document.body.scrollLeft - document.body.clientLeft + 7;
    	
        // Add the top element topoffset and the windows topscroll and subtract the body's client top position.
        top += element.offsetTop + document.body.scrollTop - document.body.clientTop;
	}

   // return {x:left, y:top};    
   return [left, top];
}

// returns the ascii keycode of a keyup/down event
function get_character(e) {
	var characterCode;
	if(e && e.which) {
		e = e;
		characterCode = e.which;
	} else {
		e = event;
		characterCode = e.keyCode;
	}
	
	return characterCode;
}

// best for things that repeat blindly.  you could unset the spin_funcs index...
spin_id 	= false;
spin_count 	= 0;
spin_wait	= 1000;
spin_funcs 	= new Array();
function spin_timer(t, s) {
	if(spin_id == false || (!t && !s))
		spin_id = setTimeout('spin_timer()', spin_wait);
			
	if(!spin_funcs[t]) {
		spin_funcs[t] 		= new Array();
		spin_funcs[t][0] 	= s * 1000;
		spin_funcs[t][1] 	= false;
		eval(t);
	}
		
	for(t in spin_funcs) {
		interval 	= spin_funcs[t][0];
		last_ran	= spin_funcs[t][1];
		if(last_ran + interval == spin_count) {
			eval(t);
			spin_funcs[t][1] = spin_count;
		}
	}
	
	spin_count += spin_wait;
}

function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function tc(ptr, c) {
	toggle_class(ptr, c);
}

function foo(o) { }

function td(e) {
	toggle_display(e);
}

function de(i) {
	return document.getElementById(i);
}

function cancel_menu() {
	var queue = Effect.Queues.get('menu');
	queue.each(function(effect) { effect.cancel(); });
}

current_menu 	= false;
delayed_close 	= false;
function toggle_menu_show(p, id) {
	sb = $('sub_menu_' + id);
	
	delayed_close = false;
	
	Effect.Queues.get('menu').interval = 1;
	
	if(sb && $(p).descendantOf('top_menu_' + id) && !sb.visible()) {
		if(current_menu != id) {
			//cancel_menu();
			Effect.BlindDown(sb, { duration: 0.5, queue: 'end', scope: 'menu' }); 
		}
		
		if(current_menu && current_menu != id) {
			Effect.BlindUp($('sub_menu_' + current_menu), { duration: 0.3, queue: 'end', scope: 'menu' }); 
		}
		
		current_menu = id;
	}
	
	if(!sb)
		toggle_menu_hide();
}

function toggle_menu_hide() {
	// && $('sub_menu_' + current_menu).visible()
	if(delayed_close != false)
		return;
		
	if(current_menu) {
		Effect.BlindUp($('sub_menu_' + current_menu), { duration: 0.3, queue: 'end', scope: 'menu' }); 		
	}
	
	current_menu = false;
}

function dbg(i) {
	if($('dbg'))
		$('dbg').innerHTML += i + '<br>';
}

function check_hover_div(mEvent) {
	// Internet Explorer
	if (mEvent.srcElement)
		on_menu(mEvent, 'linkPopup', mEvent.srcElement);

	// Netscape and Firefox
	else if (mEvent.target)
		on_menu(mEvent, 'linkPopup', mEvent.target);
}

function on_menu(myEvent, id, myElement) {	
	e = myElement;
	while(e.parentNode && (e.id == null || e.id == '')) {
		e = e.parentNode;
	}
	
	if(e.id == null || e.id == '' || e.id.indexOf('menu') < 0)
		toggle_menu_hide();
}

var IE = document.all ? true : false;	
	
if (!IE) {
	document.captureEvents(Event.MOUSEMOVE);
	document.onmousemove = check_hover_div;
} else 
	document.onmousemove = function() { check_hover_div(event); }	
