
		function var_dump(obj) {
			if (arguments.length > 1) {
				exclude = 1;
			} else {
				exclude = 0;
			}

			var rtn = '';
			for (var i in obj) {
				if (exclude == 0 || (exclude == 1 && i != 'outerText' && i != 'innerText' && i != 'innerHTML' && i != 'outerHTML')) {
					rtn += i + ' [' + obj[i] + "] ";
				}
			}
			alert(rtn);
		}

		function showtab(tabnum) {
			if (tabnum > 0 && tabnum <= numtabs) {
				if (tabnum != currtab) {
					var tmp = document.getElementById('tab' + currtab);
					tmp.className = "hidden";
				}
				var tabref = document.getElementById('tab' + tabnum);
				tabref.className = "visible";
				switchtab(currtab, tabnum);
			} else if (numtabs > 0) {
				var tabref = document.getElementById('tab1');
				tabref.className = "visible";
			}
		}

		function switchtab(from, to) {
			var tabimg;
			var tab;
			var tab_cell;
			var tab_link;

			for (var i=1; i<=numtabs; i++) {

				tab      = document.getElementById('tab_' + i);
				tabimg   = document.getElementById('tab' + i + '_img');
				tab_cell = document.getElementById('tab' + i + '_c');
				tab_link = document.getElementById('tab' + i + '_a');

				if (i == to) {
					tab_cell.className = 'tabsel';
					tab_link.className = 'tabsel';
				} else {
					tab_cell.className = 'tabdes';
					tab_link.className = 'tabdes';
				}

				if ((i - 1) == to) {
					tab.className = 'des_tab_sl';
					tabimg.src    = admin_basedir + '/img/tabs/grey_sel_tab_rjoin.gif';
				} else if (i == 1) {
					if (i == to) {
						tab.className = 'sel_tab_l';
						tabimg.src    = admin_basedir + '/img/tabs/grey_sel_tab_1.gif';
					} else {
						tab.className = 'des_tab_l';
						tabimg.src    = admin_basedir + '/img/tabs/grey_des_tab_1.gif';
					}
				} else {
					if (i == to) {
						tab.className = 'sel_tab_n';
						tabimg.src    = admin_basedir + '/img/tabs/grey_sel_tab_ljoin.gif';
					} else {
						tab.className = 'des_tab_n';
						tabimg.src    = admin_basedir + '/img/tabs/grey_des_tab_join.gif';
					}
				}
			}

			var tabend     = document.getElementById('tabend');
			var tabend_img = document.getElementById('tabend_img');
			if (to == numtabs) {
				tabend.className = 'sel_tabend';
				tabend_img.src = admin_basedir + "/img/tabs/grey_sel_tab_n.gif";
			} else {
				tabend.className  = 'des_tabend';
				tabend_img.src    = admin_basedir + "/img/tabs/grey_des_tab_n.gif";
			}

			currtab = to;
		}

		function row_on(id) {
			var obj = document.getElementById(id);
			obj.oldbgcolor = obj.style.backgroundColor;
			obj.style.backgroundColor = "#fae003";
			obj.style.cursor = "hand";
		}

		function row_off(id) {
			obj = document.getElementById(id);
			obj.style.backgroundColor = obj.oldbgcolor;
		}

		function pg_go(pg) {

			if (arguments.length > 1 && arguments[1].length > 0) {
				var elems = arguments[1];
				var tmp = new Array();

				for (var i=0; i++; i<elems.length) {
					tmp = elems.split("|");
					document.getElementById(tmp[0]).value = tmp[1];
				}

			}

			document.getElementById('pg_' + tabidx).value = pg;
			formSubmit();
			frm.submit();
		}

		function load(id) {


			add_input (utilfrm.id, 'hidden', 'cmd', true);
			utilfrm.cmd.value = 'load';

			add_input (utilfrm.id, 'hidden', 'id', true);
			utilfrm.id.value  = id;

			var action = (arguments.length > 1 ? arguments[1] : document.location);

			utilfrm.action = action;
			formSubmit(utilfrm);
			document.getElementById('currtab').value = '1';
			utilfrm.submit();

		}

		function blank() {
			return;
		}

		function setcmd(cmd, id) {

			frm.cmd.value = cmd;
			frm.id.value  = id;

			var action = (arguments.length > 2 ? arguments[2] : "");

			frm.action = action;
			formSubmit();
			frm.submit();
		}

		function add_input (par, type, name) {

			var add_br = false;
			if (arguments.length > 3) {
				add_br = arguments[3];
			}

			var tmp = document.getElementById(par);
			par = tmp;

			if (add_br !== false) {
				var br = document.createElement("br");
				par.appendChild(br);
			}

			var input = document.createElement("input");
			input.type      = type;
			input.id        = name;
			input.name      = name;

			return par.appendChild(input);

		}

		function add_filebox (name, parent) {
			var elems = document.getElementById(parent).childNodes;
			var numchildren = 0;

			for (var i=0; i<elems.length; i++) {
				if (elems[i].type == 'file') {
					numchildren += 1;
				}
			}

			var newobj = add_input (parent, 'file', name + '_' + numchildren, true);
			newobj.className = 'txt';

			document.getElementById('num_attachments').value = (numchildren + 1);

		}


		function UnModified(disableElems) {

			var changed_elems = 0;
			for (i=0; i<frm.elements.length; i++) {
				elem = frm.elements[i];

				if (elem.name == 'sitenav' || elem.name.substring(0,5) == "dummy") continue;

				switch(elem.type) {
					case "text":

						unchanged = (elem.defaultValue == elem.value);
						break;

					case "textarea":

						unchanged = (elem.defaultValue == elem.value);
						break;

					case "select-one":
						for (n=0; n<elem.options.length; n++) {
							unchanged = (elem.options[n].defaultSelected == elem.options[n].selected);
							if (unchanged == false) {
								n = elem.options[n].length;
							}
						}
						break;

					case "select-multiple":
						for (n=0; n<elem.options.length; n++) {
							unchanged = (elem.options[n].defaultSelected == elem.options[n].selected);
							if (unchanged == false) {
								n = elem.options[n].length;
							}
						}
						break;

					case "checkbox":
						// checkboxes suck
//						unchanged = (elem.defaultChecked == elem.checked);
//						break;

					case "file":
					case "hidden":
					case "submit":
					case "button":
						unchanged = null;
						break;

					default:
						unchanged = true;
				}

				if (unchanged == false) {
					changed_elems++;
				} else if (unchanged == true && disableElems == 1) {
					elem.disabled = unchanged;
				}

			}
			return (changed_elems > 0 ? changed_elems : false);

		}

		function jsaction(cmd) {

			// if, at some stage, we want to re-enable prompting, then comment the next line out
			eval('rtn = ' + cmd + ';');
			return true;

			haschanged = UnModified(0);
			var areyousure = true;

			if (haschanged != false) {
				areyousure = confirm('Changes have been made to this page.\nClick \'Cancel\' and then save your changes,\nor click \'OK\' to discard those changes.');
			}

			if (areyousure == true) {
				return rtn;
			} else {
				return false;
			}

		}

		function content_goto (id, where) {
			var newwin = 0;
			if (arguments.length > 2) {
				newwin = arguments[2]
			}
			linkto(where + id, newwin);
		}

		function goBack(where) {

			if (historylen > 0) {
				var tmp = window.location.href;
				window.location.href = tmp + (tmp.indexOf("?") > 0 ? '&' : '?') + 'b=1';
			} else {
				window.location.href = admin_basedir;
			}
			return false;
		}

		function gohome() {
			window.location.href = admin_basedir;
			return false;
		}

		function doreload() {
			window.location.href = currpg + (currtab > 1 ? (window.location.search.length > 1 ? "&" : '') + 'currtab=' + currtab : '');
			return false;
		}

		function sb_action(src_id, dest_id, all) {

			var src  = document.getElementById(src_id);
			var dest = document.getElementById(dest_id);
			var opt;

			if (src.options.length > 0) {
				for (var i=0; i<src.options.length; i++) {
					if (all == 1 || src.options[i].selected == true) {
						opt = new Option;
						opt.value = src.options[i].value;
						opt.text = src.options[i].text;

						dest.options[dest.options.length] = opt;
						src.options[i] = null;
						i--;
					}
				}
			}
		}

		function sb_onsubmit(box_id) {

			var src  = document.getElementById(box_id);
			if (src.disabled == true) {
				src.disabled = false;
			}

			if (src.options.length > 0) {
				for (var i=0; i<src.options.length; i++) {
					src.options[i].selected = true;
				}
			}

		}

		function showJournalSearch(type, ref) {
			// '{$_REQUEST["form_type"]}', 'form_ref'
			var textbox = document.getElementById(ref + 'dummy');
			var idfield = document.getElementById(ref + 'id');

			var type = document.getElementById('form_type');

			if (type.value == 'ep') {
				// show the find-an-epsiode window
				var tgt = "episodelist.php?cb=journalSearchReturn&ref=" + ref + "&id=" + idfield.value;
			} else {
				// show the find-a-client window
				var tgt = "clientlist.php?cb=journalSearchReturn&ref=" + ref + "&id=" + idfield.value;
			}
			var newwin = window.open(tgt, 'journalsearch', 'height=400,innerheight=400,width=600,innerwidth=600,resizable=yes,scrollbars=yes');
			newwin.focus();
		}

		function journalSearchReturn(ref, idval, dispval) {
			alert('called');
			var textbox = document.getElementById(ref + 'dummy');
			var idfield = document.getElementById(ref + 'id');
		}

		function GuestimateAge(date) {

			// date = (string) "month day, year hours:minutes:seconds";

			var currdate = new Date();
			var dob      = new Date(date);

			var currsecs = currdate();
			var dobsecs  = dob();

			// get the seconds between now and the date supplied
			var diff = (currsecs - dobsecs);

			// turn these seconds into years (secs per day * days per week * weeks per year)
			var years = Math.floor(diff / (86400 * 7 * 52));

		}
