function custom_alert(msg, title) {				
	alert_box = $('custom_alert');
	
	if(!alert_box) {			
		alert_box 		= new Element('div', { className: 'custom_alert', id: 'custom_alert' });
		alert_body 		= new Element('div', { id: 'alert_body' });
		alert_header	= new Element('div', { id: 'alert_header', onclick: '$("custom_alert").hide(); '});
		alert_content	= new Element('div', { id: 'alert_content' });
		
		alert_box.insert(alert_body);
		alert_body.insert(alert_header);
		alert_body.insert(alert_content);
		
		document.body.appendChild(alert_box);		
	}	
	
	title = !title ? 'Message' : title;
	$('alert_header').update(title);
	
	$('alert_content').innerHTML 	= msg;
	
	center_box(alert_box);
	
	if( !$('custom_alert').visible() ) $('custom_alert').show();
}

alt_items = new Array();
function alt(a) {
	if(alt_items[a])
		alt_items[a]++;
	else
		alt_items[a] = 1;
	
	return alt_items[a] % 2 ? 'alt' : '';
}

function form_update() {
	args 	= form_update.arguments;
	url		= args[0];
	frm 	= args[1];	
	cb		= args[2];
	
	f = function(o) {
		xmlDoc 		= m_xml.create_doc(o.responseText);
		items 		= xmlDoc.getElementsByTagName('item');	
		
		// if there are results, only need the first
		for(x = 0; x < items.length && x < 1; x++) {
			for(y = 0; y < items[x].childNodes.length; y++) {
				cn = items[x].childNodes[y];	
				tn = cn.tagName; 				// tag name
				vl = m_xml.get_text(items[x], tn);		// tag value	
				
				if(frm.elements[tn])
					$(frm.elements[tn]).setValue(vl);
			}
		}	

		if(cb && typeof cb == 'function')
			cb(items);
	}

	search_values = '';
	for(x = 3; x < args.length; x++)
		search_values = '&' + args[x] + '=' + escape($F(args[x]));
	
	new Ajax.Request(url + search_values, {   
		method: 'get',   
		onSuccess: f
	});	
}

function overlay(close_id) { 
	ovr = $('tboverlay');
	
	if(!ovr) {
		ovr = Builder.node('div', { id: 'tboverlay' }, '');
		document.body.appendChild(ovr);
	}
	
	ovr.onclick = function() { 
		$('tboverlay').hide();
		
		if(close_id)
			$(close_id).hide() 
	};
	
	ovr.show();
	
	return ovr;
}

function center_box(id, pos) {
	window_dimensions	= document.viewport.getDimensions(); 
	scroll_offsets 		= document.viewport.getScrollOffsets();	
	
	$(id).setStyle({
		position: 	'absolute',
		zIndex: 	'1001',
		left:		scroll_offsets.left 	+ 	(window_dimensions.width 	- 	$(id).getWidth()) 	/ 2 	+ 'px',
		top:		scroll_offsets.top 		+ 	(window_dimensions.height 	- 	$(id).getHeight()) 	/ 2		+ 'px'
	});		

	switch(pos) {
		case 'fixed':
			$(id).setStyle({
				position: 	'fixed',
				left:		(window_dimensions.width 	- 	$(id).getWidth()) 	/ 2 	+ 'px',
				top: 		(window_dimensions.height 	- 	$(id).getHeight()) 	/ 2		+ 'px'
			});
		break;
	}
}	

function bind_forms() {
	$$('form.bind_ajax').each(function(elt) { bind_form(elt) });
}

function bind_form(frm) {
	if(typeof frm.onsubmit == 'function') {
		callback = frm.getAttribute('onsubmit');
		frm.onsubmit = function() { }
		frm.setAttribute('callback', callback);
	}	
		
	Event.observe(frm, 'submit', function(event) {
		elt = Event.element(event);
		
		if(JSV.Validate.checkForm(event))
			form_handler(elt);		
				
		Event.stop(event);
		
		return false;		
	});
}

// ajax submits a form to it's action
function form_handler(frm, callback) {
	f = function(o) {	
		xmlDoc 		= m_xml.create_doc(o.responseText);
		
		id			= m_xml.get_text(xmlDoc, 'id');
		message 	= m_xml.get_text(xmlDoc, 'message');
		title		= m_xml.get_text(xmlDoc, 'title');
		redirect	= m_xml.get_text(xmlDoc, 'redirect');
		delay		= m_xml.get_text(xmlDoc, 'wait');	
				
		if(redirect && delay)
			setTimeout("window.location='" + redirect + "'", parseInt(delay) * 1000);
			
		if(message)
			custom_alert(message, title ? title : 'Form Submission');					
		
		if(id && frm.elements['id'])
			frm.elements['id'].value = id;		
		
		if(frm.getAttribute('callback')) {
			cb = frm.getAttribute('callback');
			
			if(window.execScript) 
				window.execScript(cb); 
			else
				eval(cb);
		}
		
		if(callback && typeof callback == 'function')
			callback(o);
	}
		
	new Ajax.Request(frm.getAttribute('action') + '?j=' + ut(), { postBody: $(frm).serialize(), method: 'post', onSuccess: f }); 	
}

function loader(ptr, limg, lmsg) {
	w = ptr.measure('padding-box-width');
	h = ptr.measure('padding-box-height');
	
	ldr = Builder.node('div', { 
		className: 'loader',
		style: 'width: ' + w + 'px; height: ' + h + 'px'
	}, [
		Builder.node('img', { src: limg }),
		Builder.node('msg', lmsg)
	]);	
	
	ptr.getElementsBySelector('div.loader').invoke('remove');
	
	$(ptr).appendChild(ldr);
	
	return ldr;
}

function dbg(t) {
	d = $('dbg');
	
	if(!d) {
		d = Builder.node('div', { id: 'dbg', onclick: "this.innerHTML=''", style: 'z-index: 999; position: absolute; bottom: 5px; left: 5px; width: 600px; padding: 4px; background-color: white; border: 1px solid red' });
		document.body.appendChild(d);
	}
	
	d.innerHTML += t.replace(/</g,"&lt;").replace(/>/g,"&gt;") + '<hr>';
}

function ut() {
	var foo = new Date;
	var unixtime_ms = foo.getTime();
	var unixtime = parseInt(unixtime_ms / 1000); 
	return unixtime;
}
