/*****************************************************************************
 * File: convenience.js
 * Author: Ryan Hughes <rjhughes at umich dot edu>
 * Licence: GPL, perhaps?  We'll think about that.
 * ---------------------------------------------------------------------------
 * What it does:
 *  Defines many js functions that I find useful in general web-app programs.
 *****************************************************************************/

function zebrastripe(evt)
{
    tbls = document.body.getElementsByTagName('TABLE');
    for( i=0; i<tbls.length; i++ ) {
	if( HasClass(tbls[i], "zebra") ) {
	    rz = tbls[i].rows;
	    for( j=0; j<rz.length; j++ ) {
		if( j%2==0 ) { AddClass(rz[j], "even"); }
		else	     { AddClass(rz[j], "odd");  }
	    } // for all the rows
	} // if it's a zebra table
    } // for all the tables

    return;
} // function zebrastripe
AttachEvent(window, 'load', zebrastripe);

ANCHOR='';
function focus_persistance(evt)
{
    elts = document.getElementsByTagName('INPUT');
    elts2 = document.getElementsByTagName('TEXTAREA');
    elts3 = document.getElementsByTagName('SELECT');

    for( i=0; i<elts.length; i++ ) {
			if( elts[i].type != 'submit' && elts[i].type != 'image' && 
					elts[i].type != 'button' && elts[i].type != 'hidden' )
			{
					ananch = document.createElement('A');
					ananch.name = elts[i].name;
					elts[i].parentNode.insertBefore(ananch, elts[i]);
					AttachEvent(elts[i], 'focus', focus_persistme, false);
			} // if it's something we should do
    } // for all the elts

    for( i=0; i<elts2.length; i++ ) {
			ananch = document.createElement('A');
			ananch.name = elts2[i].name;
			elts2[i].parentNode.insertBefore(ananch, elts2[i]);
			AttachEvent(elts2[i], 'focus', focus_persistme, false);
    } // for all the textareas
    for( i=0; i<elts3.length; i++ ) {
			ananch = document.createElement('A');
			ananch.name = elts3[i].name;
			elts3[i].parentNode.insertBefore(ananch, elts3[i]);
			AttachEvent(elts3[i], 'focus', focus_persistme, false);
    } // for all the selects

    // Now let's go to where we're supposed to go.
    if( ANCHOR ) { window.location += '#'+ANCHOR; }
} // function focus_persistance
//AttachEvent(window, 'load', focus_persistance, false);

function focus_persistme(evt)
{
    target = get_target(evt, window.event);

    anchors = document.getElementsByName('anchor');
    if( anchors.length > 0 && anchors[0].tagName=='INPUT' ) {
	anchors[0].value = target.name;
    } else {
	anch = document.createElement('input');
	target.parentNode.appendChild(anch);
	anch.type = 'hidden';
	anch.name = 'anchor';
	anch.value = target.name;
    } // if where to append it
} // function focus_persistme

function HasParent(elt, pt)
{
    for(here=elt; here; here=here.parentNode) { if(here==pt){return true;} }
    return false;
} // function HasParent

function clickmyradio_init(evt)
{
    var arr = ['input', 'textarea', 'select', '*'];
    for(t=0; t<arr.length; t++) {
	var elts = document.getElementsByTagName(arr[t]);
	for(var i=0; i<elts.length; i++) {
	    if( arr[t]=='*' && !HasClass(elts[i], 'input') ) { continue; }
	    if( HasClass(elts[i], 'clickmyradio') ) {
		if( arr[t]=='*' ) {
		    AttachEvent(elts[i], 'click', clickmyradio, false);
		} // if it's a pseudo-input
		AttachEvent(elts[i], 'focus', clickmyradio, false);
	    } // if it is one
	} // for all the elts
    } // for all the types of thingeys
} // function clickmyradio_init
AttachEvent(window, 'load', clickmyradio_init, false);

function clickmyradio(evt)
{
    var target = get_target(evt, window.event);

    var ok=false;
    var elt = target;
    while( !ok && elt != document.body ) {
	var elts = elt.getElementsByTagName('input');
	for( var i=0; i<elts.length; i++ ) {
	    if( elts[i].type=='radio' ) {
		elts[i].checked = true;
		ok=true;
	    } // if it's the one 
	} // for all the elts
	elt=elt.parentNode;
    } // while we haven't found it
} // function clickmyradio

function autoclick_init(evt)
{
	var eltss = [];
	eltss[0] = document.getElementsByTagName('INPUT');
	eltss[1] = document.getElementsByTagName('TEXTAREA');
	eltss[2] = document.getElementsByTagName('SELECT');
	var elts;
	var elt;

	var m; var i; var j;
	var pieces; var val;

	for( m=0; m<eltss.length; m++ ) {
		elts = eltss[m];
		for( i=0; i<elts.length; i++ ) {
			pieces = elts[i].className.split(' ');
			for( j=0; j<pieces.length; j++ ) {
				k_v = pieces[j].split('=');
				key = k_v[0];
				if( key == 'autoclick' ) {
						k_v.shift();
						val = k_v.join('=');
						elt = document.getElementById(val);
						elts[i].autoclick_target = elt;
						AttachEvent(elts[i], 'change', autoclick, false);
				} // if it's an autoclick one
			} // for all the pieces
		} // for all the elts
	} // for all the eltss
} // function autoclick_init
AttachEvent(window, 'load', autoclick_init, false);

function autoclick(evt)
{
	target = get_target(evt, window.event);
	
	if( target.autoclick_target.tagName == 'OPTION' ) {
		for( var elt = target.autoclick_target;
				elt.tagName != 'SELECT' && elt != document;
				elt = elt.parentNode ) { }
		for( var i=0; i<elt.options.length; i++ ) {
			if( elt.options[i] == target.autoclick_target ) {
				elt.selectedIndex = i;
			} // if it's the One
		} // for all the options
		MyFireEvent(elt, 'change');
	} // if it's an OPTION
	else {
		target.autoclick_target.click();
	} // else it's a clickable thing
} // function autoclick


function modal_dialog(contents, title, w, h, top, left)
{
    if(typeof title=="undefined"){title='';}
    if(typeof w=="undefined"){w='100px';}
    if(typeof h=="undefined"){h='100px';}
    if(typeof top=="undefined"){top='30%';}
    if(typeof left=="undefined"){left='30%';}

    var dialog = document.createElement('div');
    dialog.className = 'modal_dialog';
    dialog.style.width = w;
    dialog.style.height = h;
    dialog.style.top=top;
    dialog.style.left=left;
    var h1 = document.createElement('h1');
    var sp = document.createElement('span');
    sp.appendChild(document.createTextNode(title));
    h1.appendChild(sp);
    dialog.appendChild(h1);
    var close = document.createElement('div');
    close.appendChild(document.createTextNode('X'));
    h1.appendChild(close);

    AttachEvent(dialog, 'click', modal_catch_click, false);
    AttachEvent(document.body, 'click', modal_unclick, false);
    AttachEvent(close, 'click', modal_manual_close, false);

    var cnt = document.createElement('div');
    cnt.className = 'content';
    cnt.style.height = 
    dialog.appendChild(cnt);
    cnt.appendChild(contents);

    var forms = document.getElementsByTagName('form');
    if(forms.length > 0 ) {
	forms[0].appendChild(dialog);
    } else {
	document.body.appendChild(dialog);
    } // if there's a form to put it in or not
    document.modal_dialog = dialog;

    return dialog;
} // function modal_dialog
function modal_catch_click(evt)
{
    document.modal_click_caught = true;
} // function modal_catch_click
function modal_manual_close(evt)
{
    document.modal_dialog.parentNode.removeChild(document.modal_dialog);
    document.modal_dialog = false;
    document.modal_click_caught = undefined;
} // function modal_manual_close
function modal_unclick(evt)
{
    var was_submit = false;
    var target = get_target(evt, window.event);
    if( (target.tagName=='input' || target.tagName=='INPUT') &&
	target.type == 'submit' )
    { was_submit = true; }

    if( !document.modal_click_caught && document.modal_dialog && 
	typeof document.modal_click_caught!="undefined" && !was_submit ) 
    {
	modal_manual_close();
    } // if they clicked but not inside the box

    if( document.modal_dialog ) { document.modal_click_caught = false; }
} // function modal_unclick

