/* variables */

var reWhitespace = /^\s+$/;
var updateTimer;
var scrollTimer;
var barTimer;
var barUpdateSpeed = 1000;
var barMoveOb;
var scrollSpeed = 0.05;
var scrollTime = 50;
var obsize;
var numobs;
var sz;
var modpress = 0;
var in_drag = 0;
var moveTimer;
var mouseX = 0;
var mouseY = 0;
var windowUpdateSpeed = 500;
var windowScrollAmt = 80;
var makesortfunc;
var currentHoverClass = 'hover';
var deleteList = "0";
var anything_modified = 0;
var chart_modified = 0;
var person_modified = 0;
var current_chart_id = 0;
var current_chart_ver = 0;
var startnewuserid = 100000;
var currentnewuserid = 100000;
var containerlist;
var newPersonList = '';
var chartName = '';
var chartDescription = '';
var chartCity = '';
var chartState = '';
var chartCountry = '';
var chartIndustry = '';
var save_in_progress = 0;
var zoom_level = 3;
var modifyPersonList = '';
var fullscreen = 0;
var afterloadmap = 0;
var reallyDestroy = 0;
var postponesavedata = "";
var firstload = 1;
var hourglass_status = 0;
var last_stage = 0;
var load_stage = []; // same as new Array();


/* api funcs */

function isInteger(s) {
    for (var i = 0; i < s.length; i++) {
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) { return false; }
    }
    // All characters are numbers.
    return true;
}

function isEmpty(s) {
	return ((s === null) || (s.length === 0));
}

function isWhitespace (s) 
{   // Is s empty?
    return (isEmpty(s) || reWhitespace.test(s));
}

/* debug funcs */

function message(str) {
	if($('msgWin')) {
		$('msgWin').value = str + '\n' + $('msgWin').value; 
	}
}

/* cog funcs */

function firstTree(ob) {
	for(var i = 0; i < ob.childNodes.length; i++) {
		if(ob.childNodes[i].className) {
			cstr = ob.childNodes[i].id.toString();
			if(cstr.indexOf('item_') >= 0) {
				return ob.childNodes[i];
			}
		}
	}
	return 0;
}

function lastTree(ob) {
	var lastOb;
	for(var i = 0; i < ob.childNodes.length; i++) {
		if(ob.childNodes[i].className) {
			cstr = ob.childNodes[i].id.toString();
			if(cstr.indexOf('item_') >= 0) {
				lastOb = ob.childNodes[i];
			}
    	}
	}
	return lastOb;
}

function childrenz(ob) {
	var num = 0;
	var numValidChildren = 0;
	var cstr;

	for(var i = 0; i < ob.childNodes.length; i++) {
		if(ob.childNodes[i].className) {
			cstr = ob.childNodes[i].id.toString();
			if(cstr.indexOf('item_') >= 0) {
				numValidChildren++;
				num += childrenz(ob.childNodes[i]);
			}
		}
	}
	if(numValidChildren === 0) {
		num ++;
	}
	return num;
}

function set_modified(val) {
	if(anything_modified == val) {
		return;
	}
	anything_modified = val;

	if(anything_modified === 0){
		Effect.Appear($('version_tracker_container'), { queue: { scope:'tree', position:'end'} } );
		Effect.Fade($('save_btn'), { queue: { scope:'tree', position:'end'} } );
	} else {
		Effect.Fade($('version_tracker_container'), { queue: { scope:'tree', position:'end'} } );
		Effect.Appear($('save_btn'), { queue: { scope:'tree', position:'end'} } );
	}
}

function set_chart_modified(val) {
	chart_modified = val;
	if(chart_modified == 1 || person_modified == 1) {
		set_modified(1);
	} else {
		set_modified(0);
	}
}

function set_person_modified(val) {
	person_modified = val;
	if(chart_modified == 1 || person_modified == 1) {
		set_modified(1);
	} else {
		set_modified(0);
	}
}

function pageUpdate(who) {
	set_chart_modified(1);
	if(updateTimer) {
		clearTimeout(updateTimer);
	}
	updateTimer = setTimeout('updateMain()',700);
}

function get_hourglass() {
	return hourglass_status;
}

function set_hourglass(onoff) {
	if(onoff == 1) {
		hourglass_status++;
	} else {
		if(hourglass_status > 0) {
			hourglass_status--;
		} else {
			alert("hourglass status out of bounds");
			hourglass_status = 0;
		}
	}
	if(hourglass_status > 0) {
		document.body.style.cursor = "wait";
	} else {
		document.body.style.cursor = "default";
	}
	//  $('modifiedinfo').innerHTML = "status " + hourglass_status + " " + Date();
}

function changer(obid) {
	var ob = $(obid);
	var c = childrenz(ob);
	var place = " child";
	var tail = "";
	var idsolo = obid.toString().substring(obid.toString().indexOf('_') + 1);
	set_hourglass(1);
	if(!selectItemExists($('find_person'),idsolo)) {
		insertItem($('find_person'),idsolo,$('name_'+idsolo).innerHTML.toString().unescapeHTML());
	}
	ob.className = "tree cog"+c;
	for(var i = ob.childNodes.length - 1; i > 0; i--) {
		if(ob.childNodes[i].className) {
			if(i !== 0 && ob.childNodes[i].id.toString().indexOf("shell") >= 0) {
				ob.insertBefore(ob.childNodes[i],ob.firstChild);
			}
			cstr = ob.childNodes[i].id.toString();
			if(cstr.indexOf('item_') >= 0) {
				Sortable.destroy(ob.childNodes[i]);
				changer(ob.childNodes[i].id);
				makesortfunc(0, ob.childNodes[i]);
			}
		}
	}
	var ft = firstTree(ob.parentNode);
	if(ft && ft.nextSibling) {
		if(ft.id == obid)  {
			place = " sib_left";
		} else if(lastTree(ob.parentNode).id == obid) {
			place = " sib_right";
		} else {
			place = " sib_middle";
		}
	}

	if(!firstTree(ob)) {
		tail = " no_tail";
	}

	ob.firstChild.className = "cogshell" + place + tail;
	set_hourglass(0);
}

function toggle_unmapped() {
	var ob = $('ucontainer');
	if(ob.className == 'unmapped_container unmapped_closed') {
		ob.style.display = 'none';
		ob.className = 'unmapped_container unmapped_open';
		Effect.Appear(ob,{queue:{scope:'tree',position:'end'}});
	} else {
		ob.style.display = 'none';
		ob.className = 'unmapped_container unmapped_closed';
		Effect.Appear(ob,{queue:{scope:'tree',position:'end'}});
	}
}

function recalc_unmapped() {
	// if(document.all)
	//  obsize = 145;
	//  obsize = 145;
	// else
	//  obsize = 132;
	obsize = 114;
	numobs = 0;
	var obs = $('unused').childNodes;

	for(var i = 0; i < obs.length; i++) {
		if(obs[i].tagName == "DIV") {
			numobs ++;
		}
	}
	sz = (numobs * obsize);

	if(document.all) {
		sz += 20;
	}

	$('content').style.width = (sz) + "px";
	$('unmapped_num').innerHTML = "(" + numobs + ")";

	if(numobs === 0 && $('ucontainer').className == 'unmapped_container unmapped_open') {
		toggle_unmapped();
	}
}

function update_bar2() {
	if(document.all) {
		h = document.documentElement.clientHeight + document.documentElement.scrollTop;
		w = document.documentElement.scrollLeft;
		offsetmod = 48;
	} else {
		h = window.innerHeight + window.pageYOffset;
		w = window.pageXOffset;
		offsetmod = 60;
	}

	var theX = (h - offsetmod);

	if(barMoveOb) {
    	barMoveOb.cancel();
    }
	barMoveOb = new Effect.Move($('ucontainer'), { x: w, y: theX, duration: 0.2, mode: 'absolute', queue: {scope: 'bar_move', position: 'end' } });
}

function update_bar() {
	if(barTimer) {
		clear_timeout(barTimer);
	}
	setTimeout(update_bar2, barUpdateSpeed);
}

function resize_func() {
	barslider.trackLength = barslider.maximumOffset() - barslider.minimumOffset(); // + 35;
	barslider.handleLength = barslider.handles[0].offsetWidth;
	barslider.setValue(barslider.value);
	scrollSpeed = 1 / numobs;
	// $('main').style.height = Math.max((window.clientHeight - $('main').offsetTop - 230), 1) + 'px';
	$('chart_container').style.height = ($('item_0').getHeight() + 100) + 'px';
	update_bar();
}

function updateMain(hoff) {
	set_hourglass(1);
	var ob = $('item_0');
	var c = childrenz(ob);
	ob.className = "tree cogmap_chart cog"+c;
	Sortable.destroy($('item_0'));

	for(var i = ob.childNodes.length - 1; i > 0; i--) {
		if(ob.childNodes[i].className) {
			if(i !== 0 && ob.childNodes[i].id.toString().indexOf("shell") >= 0) {
				ob.insertBefore(ob.childNodes[i],ob.firstChild);
			}
			var cstr = ob.childNodes[i].id.toString();
			if(cstr.indexOf('item_') >= 0) {
				Sortable.destroy(ob.childNodes[i]);
				changer(ob.childNodes[i].id);
				makesortfunc(0, ob.childNodes[i]);
			}
		}
	}
	if(ob.childNodes.length < 2) {
		$('desc_0').innerHTML = '<h2>Here is how to get started:</h2><br /><br /><b>1)</b> Click "Add New Person" at the top of the page.<br/><br /><b>2)</b> Fill in some details for that person and hit "Save".<br /><br /><b>3)</b> Now your New Person box will have that person in it. Select that person with your mouse and drag that person here!<br /><br /><b>4)</b> Create some more people and drag them to who they report to. If they are top level people, drag them to the company name.';
		if($('ucontainer').className == 'unmapped_container unmapped_closed') {
			toggle_unmapped();
		}
	} else {
		$('desc_0').innerHTML = String.fromCharCode(160);
	}
  
	makesortfunc(1, $('item_0'));
	Sortable.destroy($('unused'));

	var unused = $('unused').childNodes;
	for(var i = 0; i < unused.length; i++) {
		var cstr = unused[i].id.toString();
		if(cstr.indexOf('item_') >= 0) {
			Sortable.destroy(unused[i]);
			unused[i].className = 'tree';
			makesortfunc(0, unused[i]);
		}
	}
	makesortfunc(1, $('unused'));
	recalc_unmapped();
	resize_func();
	sortSelect($('find_person'));
	//if(typeof(hoff) == "undefined" || hoff != 1) set_hourglass(0);
	set_hourglass(0);
}

function foo(obid) {
	changer(obid);
	makesortfunc(0,obid);
}


function chartvt_loaded(req) {
	if(req.responseText.length === 0) {
		$('version_tracker_container').style.display = 'none';
	} else {
		$('version_tracker_container').style.display = 'inline';
	}
	$('versions').innerHTML = req.responseText;
}

function repopulate_chartVT(id) {
	var post = 'chartID='+id.toString();
	var ajaxvtreq = new Ajax.Request('/chartvt_load.php',{method: 'post', parameters: post, onSuccess: chartvt_loaded });
}

function chartre_loaded(req) {
	if(req.responseText.length === 0) {
		$('reco_engine_container').style.display = 'none';
	} else {
		$('reco_engine_container').style.display = 'inline';
	}
	$('recos').innerHTML = req.responseText;
	if(! /Cogmap has no recommendations for this chart/.test(req.responseText)) {
		Effect.Appear($('recos'),{duration: 0.5}); //,{afterFinish: function(e){ $('version_tracker').className = "open"; }}
		$('reco_engine').className = "open";
		comment_open = 1;
	}
}

function repopulate_chartRE(id) {
	var post = 'chartID='+id.toString();
	var ajaxvtreq = new Ajax.Request('/chartre_load.php',{method: 'post', parameters: post, onSuccess: chartre_loaded });
}

function chartcomment_loaded(req) {
	if(req.responseText.length === 0) {
		$('comment_engine_container').style.display = 'none';
	} else {
		$('comment_engine_container').style.display = 'inline';
	}
	$('comments').innerHTML = req.responseText;
}

function repopulate_chartComment(id) {
	var post = 'chartID='+id.toString();
	var ajaxvtreq = new Ajax.Request('/chartcomment_load.php',{method: 'post', parameters: post, onSuccess: chartcomment_loaded });
}

function show_loading(onoff) {
	if(onoff == 1) {
		$('loadingthing').style.display = "block";
		$('chart_container').style.display = "none";
	} else {
		$('loadingthing').style.display = "none";
		$('chart_container').style.display = "block";
	}
}

function tree_loaded(req) {
	$('chart_container').innerHTML = "";
	$('unused').innerHTML = "";
	clearAll($('find_person'));
	eval(req.responseText);
	setTimeout(load_stage[0],25);
}

function loadmap(id, ver) {
	show_loading(1);
	set_hourglass(1);
	var post = 'chartID='+id.toString()+'&version='+ver.toString();
	var ajaxreq = new Ajax.Request('/tree_load.php',{method: 'post', parameters: post, onComplete: tree_loaded });
	current_chart_id = id;
//	current_chart_ver = ver;
	return false;
}

function set_zoom(x) {
	zoom_level = x;
	var ob = $('chart');
	ob.className = 'zoom_lvl_'+x;
	return false;
}

function zoom_1() {
	zoom_level = 1;
	var ob = $('chart');
	ob.className = 'zoom_lvl_1';
	return false;
}

function zoom_2() {
	zoom_level = 2;
	var ob = $('chart');
	ob.className = 'zoom_lvl_2';
	return false;
}

function zoom_3() {
	zoom_level = 3;
	var ob = $('chart');
	ob.className = 'zoom_lvl_3';
	return false;
}

function suggest_size() {
	//	var win = $('chart_container').scrollWidth;
	if(document.all) {
		var win = document.documentElement.clientWidth;
	} else {
		var win = window.innerWidth;
	}
	var chart = $('item_0').scrollWidth;
	var pct = win / chart;
	var newsize = 3;

	if(chart > 500) {
		if(pct <= 0.75) {
    		newsize = 2;
		}
		if(pct <= 0.45) {
			newsize = 1;
		}
		if(newsize != 3) {
			set_zoom(newsize);
			selectItem($('zoom'),newsize);
		}
	}
}

function tree_last_load() {
	repopulate_chartVT(current_chart_id);
	repopulate_chartRE(current_chart_id);
	repopulate_chartComment(current_chart_id);
	updateMain(1);
	sortSelect($('find_person'));
	show_loading(0);
	if(firstload == 1) {
		firstload = 0;
		suggest_size();
	}
	set_hourglass(0);
	if(afterloadmap !== 0) {
		afterloadmap();
		afterloadmap = 0;
	}
}

function cog_details(obid) {
	closepop();
	var height = 660;
	var width = 650;
	/*
		if(document.all)
		{
			var top = ((document.documentElement.clientHeight - (height - 90) ) / 2) + document.documentElement.scrollTop;
			var left = ((document.documentElement.clientWidth - width) / 2 ) + document.documentElement.scrollLeft;
		}
		else
		{
			var top = ((window.innerHeight - (height - 75) ) / 2) + window.pageYOffset;
			var left = ((window.innerWidth - width) / 2) + window.pageXOffset;
		}

		*/
	if(obid >= startnewuserid) {
		alert('This person has not been saved yet.');
	} else {
		boxhandle = new LITBox('/person_details_pop.php?id='+obid+'&n='+startnewuserid,{type:'window',overlay:true, height: height, width: width});
		// boxhandle = new LITBox('person_details_pop.php?id='+obid+'&n='+startnewuserid,{type:'window',overlay:true, height: height, width: width, top: top, left: left});
	}
	return false;
}

function makecog(fname, lname, desc, obid, parentid, ro) {
	var parent;
	var treeclass = 'tree';
	var idprefix = 'item_';
	var handleclass = ' handle';
	if(parentid == 'chart_container') {
		parent = 'chart_container';
		handleclass = '';
	} else if(parentid == "unused") { 
		parent = 'unused';
	} else {
		parent = 'item_' + parentid;
	}
/*
   	 if(ro == 1)
   	 {
   	  var edit_f = "location.href='sign_up.php'; return false"
   	  var unmap_f = "location.href='sign_up.php'; return false"
   	 }
   	 else
   	 { */
	var edit_f = 'return pop_edit_person(' + obid + ',\'' + fname + '\',\'' + lname + '\',\'' + desc + '\')';
	var unmap_f = 'return unmap_cog(\'item_'+obid+'\', 1)';
   	 //}

	// New prototype fixes a bug that caused $() to eval references as things other than objects in some situations
	// Need to write a function that tracks all of the elements that already exist to check for duplicates.
	// But this should never really happen anyway.
	//   	var existingob = $(idprefix + obid);
	//   	if(typeof(existingob) != 'undefined') {
	//      alert('' + typeof(existingob) + ' ' + obid + ' Duplicate COG\'s Exist. This shouldn\'t happen. try reloading this map.  If that does not fix it, save the map again and duplicates should disappear.');
	//    }

	var name = fname + " " + lname;

	var newDiv =
			Builder.node('div', {id: idprefix + obid, className: treeclass },
			[
				Builder.node('div', {id: 'shell_' + obid, className: 'cogshell'},
				[
   				Builder.node('div', {className: 'starter'}, String.fromCharCode(160)),
					Builder.node('div', {className: 'ender'}, String.fromCharCode(160)),
					Builder.node('div', {className: 'cog', ondblclick: 'document.zoom.zoom.options[0].selected = true; set_zoom(3); jump_to('+obid+')',title: unescape(desc) + ' -- Doubleclick to zoom and edit'},
					[
						Builder.node('div', {className: 'cogtop' + handleclass},
						[
							Builder.node('span', {id: 'name_' + obid}, unescape(name))
	//							Builder.node('a', {id: 'name_' + obid, href: 'profile.php?id='+obid}, name)
						]),
						Builder.node('div', {className: 'cogbottom'},
						[
							Builder.node('span', {id: 'desc_' + obid}, unescape(desc)),
							Builder.node('a', {className: 'details_icon', href: '#', onclick: 'return cog_details(' + obid + ')', title: 'View Details'},
							[
									Builder.node('span', 'details')
							]),
							Builder.node('a', {className: 'edit_icon', href: '#', onclick: edit_f, title: 'Edit Cog'},
							[
									Builder.node('span', 'edit')
							]),
							Builder.node('a', {className: 'unmap', href: '#', onclick: unmap_f, title: 'Unmap/Delete Cog'},
							[
								Builder.node('span','unmap')
							])
						])
					]),
   					Builder.node('div', {className: 'tail'}, String.fromCharCode(160)),
				])
			]);

//			newDiv.style.display = 'none';

	$(parent).appendChild(newDiv);

//			newDiv.style.display = '';
	//		Effect.Appear(newDiv.id,{queue:{scope:'tree',position:'end'},duration: 0.5});

}

function unmap_cog(obid, src) {
	var ob = $(obid);
	var idsolo = obid.toString().substring(obid.toString().indexOf('_') + 1);

	set_chart_modified(1);

	if(ob) {
		if(ob.parentNode.id == 'unused') {
			deleteList += "," + idsolo;
			reallyDestroy = 1;
			Sortable.destroy(ob);
			reallyDestroy = 0;
			Effect.DropOut(ob,{duration: 2.0, afterFinish: function(e){ $('unused').removeChild(ob); recalc_unmapped(); }});
			return false;
		}
		ob.style.display = 'none';
		$('unused').appendChild(ob);
		removeItem($('find_person'), idsolo);
		for(var i = 0; i < ob.childNodes.length; i++) {
			if(ob.childNodes[i].className) {
				if(i !== 0 && ob.childNodes[i].id.toString().indexOf("shell") >= 0) {
					ob.insertBefore(ob.childNodes[i],ob.firstChild);
				}
				var cstr = ob.childNodes[i].id.toString();
				if(cstr.indexOf('item_') >= 0) {
					unmap_cog(ob.childNodes[i].id, 0);
					--i;
				}
			}
		}
		ob.style.display = '';
		recalc_unmapped();
	}
	pageUpdate(obid);
	return false;
}

/* scrollbar */

function update(value) {
	//    var move = ($('window').offsetWidth + (numobs * obsize)) * value;
	//    var move = ((numobs * obsize)) * value;
	var move = ($('window').scrollWidth - $('window').offsetWidth )* value;
	$('content').style.left = -move + "px";
}

function scroll_stop() {
	if(scrollTimer) {
		clearTimeout(scrollTimer);
	}
}

function scroll_it(dir) {
	if(dir) {
		barslider.setValue(Math.min(barslider.value + scrollSpeed, 1));
	} else {
		barslider.setValue(Math.max(barslider.value - scrollSpeed, 0));
	}
	scrollTimer = setTimeout('scroll_it('+dir+')',scrollTime);
}

function scroll_left() {
	if(barslider.value > 0) {
		scrollTimer = setTimeout('scroll_it(0)',scrollTime);
	} else {
		scroll_stop();
	}
}

function scroll_right() {
	if(barslider.value < 1) {
		scrollTimer = setTimeout('scroll_it(1)',scrollTime);
	} else {
		scroll_stop();
	}
}

function toggle_fs() {
	if(fullscreen === 0) {
		Effect.Fade('header',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Fade('tabs',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Fade('sub_head',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Fade('buttons1',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Fade('ucontainer',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('fullscreen_msg',{queue:{scope:'tree',position:'end'},duration:0.25});
		fullscreen = 1;
	} else {
		Effect.Fade('fullscreen_msg',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('ucontainer',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('buttons1',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('sub_head',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('tabs',{queue:{scope:'tree',position:'end'},duration:0.25});
		Effect.Appear('header',{queue:{scope:'tree',position:'end'},duration:0.25});
		$('header').style.display = 'block';
		fullscreen = 0;
	}
}

/* switch modes */
function set_mode(m) {
	if(m === 0) {
		$('dragmode').innerHTML = 'Add Subordinate (TAB to add peer)';
		currentHoverClass = 'hover';
		modpress = 0;
	} else {
		$('dragmode').innerHTML = 'Add Peer (TAB to add subordinate)';
		currentHoverClass = 'sib_hover';
		modpress = 1;
	}
}

function toggle_mode() {
	if(modpress == 1) {
		set_mode(0);
		$('drag_type0').checked = true;
	} else {
		set_mode(1);
		$('drag_type1').checked = true;
	}
}



/* */

function getMousePosition(e) {
	if(document.all) {
		mouseY = Event.pointerY(e) - document.documentElement.scrollTop;
		mouseX = Event.pointerX(e) - document.documentElement.scrollLeft;
	} else {
		mouseY = Event.pointerY(e) - window.pageYOffset;
		mouseX = Event.pointerX(e) - window.pageXOffset;
	}
	// message(mouseX + ' ' + mouseY);
}

function set_dragging(val) {
	if(val == 1) {
		if(in_drag === 0) {
			Event.observe(document,'mousemove',getMousePosition,false);
			moveTimer = setTimeout('scrollWindow()',windowUpdateSpeed);
		}
	} else {
		Event.stopObserving(document,'mousemove',getMousePosition,false);
		clearTimeout(moveTimer);
	}
	in_drag = val;
}

function stopScrollWindow() {
	clearTimeout(moveTimer);
}

function scrollWindow() {
	if(in_drag) {
		if(document.all) {
			var h = document.documentElement.clientHeight;
			var w = document.documentElement.clientWidth;
		} else {
			var h = window.innerHeight;
			var w = window.innerWidth;
		}

		if(mouseY < 40) {
    		window.scrollBy(0, -windowScrollAmt);
		} else if(mouseY > h - 60) {
    		window.scrollBy(0, windowScrollAmt);
		}
		if(mouseX < 40) {
    		window.scrollBy(-windowScrollAmt, 0);
		} else if(mouseX > w - 60) {
    		window.scrollBy(windowScrollAmt, 0);
    	}
	 	moveTimer = setTimeout('scrollWindow()',windowUpdateSpeed);

//	 	message(mouseX + ' ' + mouseY + ' ' + h +  ' ' + w);
	} else {
		stopScrollWindow();
	}
}

/* */
function jump_to(obid) {
	var gotox, gotoy;
	//	var pos = Position.cumulativeOffset($('shell_'+obid));
	var pos = Position.cumulativeOffset($('name_'+obid));
	gotox = pos[0];
	gotoy = pos[1];
	if(document.all) {
		var jh = document.documentElement.clientHeight;
		var jw = document.documentElement.clientWidth;
	} else {
		var jh = window.innerHeight;
		var jw = window.innerWidth;
	}
	//	alert(gotox + ' ' + gotoy);
	window.scroll(gotox-(jw/2), gotoy-(jh/2));
	Effect.Pulsate('shell_'+obid);
}

/* */
function tree_notloggedin_saved(req) {
	save_in_progress = 0;
	var atxt;

	if(isInteger(req.responseText)) {
		set_chart_modified(0);
		set_person_modified(0);
		newPersonList = '';
		modifyPersonList = '';
		location.href = '/sign_up.php?cs=1&back=' + encodeURIComponent(window.location.href);
	} else {
		alert('DEBUG: ' + req.responseText);
		alert('There appears to be a problem temporarily saving the map.');
	}
}

function tree_saved(req) {
	save_in_progress = 0;
	var atxt;

	if(isInteger(req.responseText)) {
	//		atxt = 'Changes saved successfully.';
	//		if(req.responseText > current_chart_ver)
	//		 atxt += '  New map version: '+req.responseText;
	//		else
	//		 atxt += '  Chart version not changed.';
	//		atxt += '\nPress OK to reload map.';
	//		alert(atxt);
		set_chart_modified(0);
		set_person_modified(0);
		confirm_subwithsave();
		newPersonList = '';
		modifyPersonList = '';
		loadmap(current_chart_id,0);
		x = $('version_tracker');
		if(x.className == "closed") {
			version_tracker();
		}
	} else {
		// alert('DEBUG: ' + req.responseText);
		alert('Map not saved.  There appears to be a problem');
	}
}

function save_map() {

	if(postponesavedata === "") {
		if(1) {//notloggedin || notloggedin == 1 || confirm("Are you sure you want to save these changes ?"))
		//    if(notloggedin && notloggedin == 1) {
		//  alert("You are being redirected to the user sign up page.  If you have an account, please login, otherwise you may create a new account there.");
		//    }
			if(save_in_progress == 1) {
				alert('Sorry, a save is already in progress.  Please wait for the previous save to finish.');
				return false;
			} else {
				save_in_progress = 1;
			}

			var unusedlist = '';
			var postdata = '';
			var sections = document.getElementsByClassName('tree');
			sections.each(function(section) {
				var sectionID = section.id;
				if(sectionID != 'unused' && section.parentNode.id != 'unused') {
					var order = Sortable.serialize(sectionID);
					var chunk = Sortable.sequence(section);
					if(chunk !== "") {
						postdata += sectionID + '=' + chunk + '&';
					}
				}
			});
			// alert(postdata);
			unusedlist += Sortable.sequence($('unused'));
			postdata += 'chart_modified=' + chart_modified + '&';
			postdata += 'unusedList=' + unusedlist + '&';
			postdata += 'chartID=' + current_chart_id + '&';
			// postdata += 'deleteCogs=' + deleteList + '&';
			postdata += newPersonList;
			postdata += modifyPersonList;

			if(chartName !== '') {
				postdata += 'chartName=' + encodeURIComponent(chartName) + '&';
				postdata += 'chartDescription=' + encodeURIComponent(chartDescription) + '&';
				postdata += 'chartCity=' + encodeURIComponent(chartCity) + '&';
				postdata += 'chartState=' + encodeURIComponent(chartState) + '&';
				postdata += 'chartCountry=' + encodeURIComponent(chartCountry) + '&';
				postdata += 'chartIndustry=' + encodeURIComponent(chartIndustry) + '&';
			}

			if(postdata.length > 4096) {
				alert("Post data exceptionally large.  It's possible data loss might occur.");
			}

			if(notloggedin && notloggedin == 1) {
				var ajaxreq = new Ajax.Request('/tree_notloggedin_save.php',{method: 'post', parameters: 'chartID=' + current_chart_id + '&poststr='+encodeURIComponent(postdata), onComplete: tree_notloggedin_saved });
			} else {
				var ajaxreq = new Ajax.Request('/tree_save.php',{method: 'post', parameters: postdata, onComplete: tree_saved });
			}
		}
	} else {
		var ajaxreq = new Ajax.Request('/tree_save.php',{method: 'post', parameters: postponesavedata, onComplete: tree_saved });
		postponesavedata = "";
	}
	return false;
}

/* begin scriptaculous replacements */

/*
  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);

    if(!Element.isParent(dropon, element)) {
      var index;

      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;

      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }

      dropon.insertBefore(element, child);

      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },
*/

Sortable.onEmptyHover = function(element, dropon, overlap) {
	if(typeof(modpress) != 'undefined' && modpress == 1) {
		return Sortable.onHover(element, dropon, overlap);
	} else {
		try {
			return dropon.appendChild(element);
		} catch(err) {
			return $('item_0').appendChild(element);
		}
 	/*
  if(dropon.firstChild.nextSibling && typeof(dropon.firstChild.nextSibling) != 'undefined')
  {
  		try
  		{
		 if(document.all)
		  return dropon.insertBefore(element, dropon.firstChild);
		 else
		  return dropon.insertBefore(element, dropon.firstChild.nextSibling);
  		}
  		catch(err)
  		{
  			return $('item_0').appendChild(element);
  		}
  }
  else
  {
  	try
  	{
  	 return dropon.appendChild(element);
  	}
  	catch(err)
  	{
  		return $('item_0').appendChild(element);
  	}
  }
  */
	}
};

/*
  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return;

    if(!Sortable._marker) {
      Sortable._marker = $('dropmarker') || document.createElement('DIV');
      Element.hide(Sortable._marker);
      Element.addClassName(Sortable._marker, 'dropmarker');
      Sortable._marker.style.position = 'absolute';
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.style.left = offsets[0] + 'px';
    Sortable._marker.style.top = offsets[1] + 'px';

    if(position=='after')
      if(sortable.overlap == 'horizontal')
        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
      else
        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';

    Element.show(Sortable._marker);
  },
*/

Sortable.mark = function(dropon, position) {
	// mark on ghosting only
	var sortable = Sortable.options(dropon.parentNode);
	if(sortable && !sortable.ghosting) {
		return;
	}

	if(!Sortable._marker) {
		Sortable._marker = $('dropmarker') || document.createElement('DIV');
		Element.hide(Sortable._marker);
		Element.addClassName(Sortable._marker, 'dropmarker');
		Sortable._marker.style.position = 'absolute';
		document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
	}
	var offsets = Position.cumulativeOffset(dropon);
	Sortable._marker.style.left = offsets[0] + 'px';
	Sortable._marker.style.top = offsets[1] + 'px';

	if(position=='after') {
		if(sortable && sortable.overlap == 'horizontal') {
			Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
		} else {
			Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
		}
	}
    Element.show(Sortable._marker);
};

/*
  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },
*/

Sortable.onHover = function(element, dropon, overlap) {
	if(Element.isParent(dropon, element)) {
		return;
	}
	if(overlap > 0.33 && overlap < 0.66 && Sortable.options(dropon).tree) {
		return;
	} else if(overlap > 0.5) {
		//      Sortable.mark(dropon, 'before');
		if(dropon.previousSibling != element) {
			var oldParentNode = element.parentNode;
			element.style.visibility = "hidden"; // fix gecko rendering
			dropon.parentNode.insertBefore(element, dropon);
			//        if(dropon.parentNode!=oldParentNode)
			//          Sortable.options(oldParentNode).onChange(element);
			//        Sortable.options(dropon.parentNode).onChange(element);
		}
	} else {
		//      Sortable.mark(dropon, 'after');
		var nextElement = dropon.nextSibling || null;
		if(nextElement != element) {
			var oldParentNode = element.parentNode;
			element.style.visibility = "hidden"; // fix gecko rendering
			dropon.parentNode.insertBefore(element, nextElement);
			//        if(dropon.parentNode!=oldParentNode)
			//          Sortable.options(oldParentNode).onChange(element);
			//        Sortable.options(dropon.parentNode).onChange(element);
		}
	}
};

/*
  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);

      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(document, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
    message(this.drags.length);
  },
  */

Draggables.register = function(draggable) {
	for(i=0; i<Draggables.drags.length;i++) {
		if(Draggables.drags[i].element == draggable.element) {
			return;
		}
	}
	if(Draggables.drags.length === 0) {
		Draggables.eventMouseUp   = Draggables.endDrag.bindAsEventListener(Draggables);
		Draggables.eventMouseMove = Draggables.updateDrag.bindAsEventListener(Draggables);
		Draggables.eventKeypress  = Draggables.keyPress.bindAsEventListener(Draggables);

		Event.observe(document, "mouseup", Draggables.eventMouseUp);
		Event.observe(document, "mousemove", Draggables.eventMouseMove);
		Event.observe(document, "keypress", Draggables.eventKeypress);
	}
	Draggables.drags.push(draggable);
};

/*
  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(document, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },
*/

Draggables.unregister = function(draggable) {
	if(reallyDestroy == 1) {
		Draggables.drags = Draggables.drags.reject(function(d) { 
			return d==draggable;
		});
		if(this.drags.length === 0) {
			Event.stopObserving(document, "mouseup", this.eventMouseUp);
			Event.stopObserving(document, "mousemove", this.eventMouseMove);
			Event.stopObserving(document, "keypress", this.eventKeypress);
		}
	}
};

/*
  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || {});

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if((typeof containment == 'object') &&
        (containment.constructor == Array)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }

    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },
*/

Droppables.add = function(element) {
	for(i=0; i<Droppables.drops.length;i++) {
		if(Droppables.drops[i].element == element) {
			return;
		}
	}

	element = $(element);
	var options = Object.extend({
		greedy:     true,
		hoverclass: null,
		tree:       false
	}, arguments[1] || {});

	// cache containers
	if(options.containment) {
		options._containers = [];
		var containment = options.containment;
		if((typeof containment == 'object') && (containment.constructor == Array)) {
			containment.each( function(c) { 
				options._containers.push($(c));
			});
		} else {
			options._containers.push($(containment));
		}
	}

	if(options.accept) {
		options.accept = [options.accept].flatten();
	}

	Element.makePositioned(element); // fix IE
	options.element = element;
	this.drops.push(options);
};

/*
  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },
*/

Droppables.remove = function(element) {
	if(reallyDestroy == 1) {
		Droppables.drops = Droppables.drops.reject(function(d) { 
			return d.element==$(element); 
		});
	}
};

/*
  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode;
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },
*/

Droppables.isContained = function(element, drop) {
	for(var i = 0; i < drop._containers.length; i++) {
		if(drop._containers[i] == element.parentNode) {
			return true;
		}
	}
//  return drop._containers.detect(function(c) { return element.parentNode == c });
};

/*
  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect(
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },
*/

Droppables.isAffected = function(point, element, drop) {
    return ((drop.element!=element) && Position.within(drop.element, point[0], point[1]) );
};

/*
  show: function(point, element) {
    if(!this.drops.length) return;
    var affected = [];

    if(this.last_active) this.deactivate(this.last_active);
    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });

    if(affected.length>0) {
      drop = Droppables.findDeepestChild(affected);
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

      Droppables.activate(drop);
    }
  },
*/

Droppables.show = function(point, element) {
	if(!Droppables.drops.length) {
		return;
    }
	var affected = [];

	if(Droppables.last_active) {
		Droppables.deactivate(Droppables.last_active);
	}

	for(var i = 0; i < Droppables.drops.length; i++) {
		//message(i + ' ' + element.id + ' ' + Droppables.drops[i].element.id + ' ' + (Droppables.drops[i].element.id != "unused") + ' ' + (typeof(Droppables.drops[i].element.parentNode)) + ' ' + (Droppables.drops[i].element.parentNode && Droppables.drops[i].element.parentNode.id != 'unused' ));
		if(Droppables.drops[i].element.id != 'unused' && ((typeof(Droppables.drops[i].element.parentNode) == "undefined") || (Droppables.drops[i].element.parentNode && Droppables.drops[i].element.parentNode.id != 'unused' )) && Droppables.isAffected(point, element, Droppables.drops[i])) {
    		affected.push(Droppables.drops[i]);
    	}
    }

	if(affected.length > 0) {
		drop = Droppables.findDeepestChild(affected);
		Position.within(drop.element, point[0], point[1]);
		if(drop.onHover) {
			drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
		}
		Droppables.activate(drop);
	}
};

/*
  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },
*/

Droppables.deactivate = function(drop) {
	Element.removeClassName(drop.element, currentHoverClass);
	Droppables.last_active = null;
};

/*
  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },
*/

Droppables.activate = function(drop) {
	if(!(drop.element.id == 'item_0' && modpress == 1) ) {
		Element.addClassName(drop.element, currentHoverClass);
	}
	Droppables.last_active = drop;
};

/* end scriptaculous replacements */


function newPerson(firstName, lastName, title) {
	makecog(escape(firstName.toString()), escape(lastName.toString()), escape(title.toString()), currentnewuserid, 'unused', 0);
	containerlist += ',item_' + currentnewuserid.toString();
	Sortable.destroy($('unused'));
	makesortfunc(0, $('item_' + currentnewuserid));
	//maybe just loop over all id's instead of just this 1);
	makesortfunc(1, $('unused'));
	recalc_unmapped();

	newPersonList += 'nf' + currentnewuserid + '=' + encodeURIComponent(firstName.toString()) + '&';
	newPersonList += 'nl' + currentnewuserid + '=' + encodeURIComponent(lastName.toString()) + '&';
	newPersonList += 'nt' + currentnewuserid + '=' + encodeURIComponent(title.toString()) + '&';

	currentnewuserid ++;

	var ob = $('ucontainer');
	if(ob.className == 'unmapped_container unmapped_closed') {
		toggle_unmapped();
	}
}

function modifyPerson(id, firstName, lastName, title) {
	$('name_' + id).innerHTML = firstName + ' ' + lastName;
	$('desc_' + id).innerHTML = title;

	modifyPersonList += 'mf' + id + '=' + encodeURIComponent(firstName.toString()) + '&';
	modifyPersonList += 'ml' + id + '=' + encodeURIComponent(lastName.toString()) + '&';
	modifyPersonList += 'mt' + id + '=' + encodeURIComponent(title.toString()) + '&';
}


/* form stuff */
function pop_edit_person(id,fname,lname,title) {
	closepop();
    
	/* code to check for a recent edit/or it being a new guy and overwrite it */
	var pos = -1;
	var nf = '';
	var nl = '';
	var nt = '';
	var tmp;
	var modArr = modifyPersonList.split("&");
	var addons = '';

	if(id >= startnewuserid) {
		var key = 'nf' + id + '=';
		var newArr = newPersonList.split("&");

		for(var i = 0; i < newArr.length; i++) {
			pos = newArr[i].indexOf(key);
			if(pos != -1) {
				tmp = newArr[i].split("=");
				nf = tmp[1];
				tmp = newArr[i+1].split("=");
				nl = tmp[1];
				tmp = newArr[i+2].split("=");
				nt = tmp[1];
			}
		}
	}
	var key = 'mf' + id + '=';

	for(var i = 0; i < modArr.length; i++) {
		pos = modArr[i].indexOf(key);
		if(pos != -1) {
			tmp = modArr[i].split("=");
			nf = tmp[1];
			tmp = modArr[i+1].split("=");
			nl = tmp[1];
			tmp = modArr[i+2].split("=");
			nt = tmp[1];
		}
	}

	if(nf !== '') {
		fname = nf;
		lname = nl;
		title = nt;
	}

	if(!fname && !lname && !title) {
		fname = '';
		lname = '';
		title = '';
	}

	var height = 220;
	var width = 650;
	/*
		if(document.all)
		{
			var top = ((document.documentElement.clientHeight - (height - 90) ) / 2) + document.documentElement.scrollTop;
			var left = ((document.documentElement.clientWidth - width) / 2 ) + document.documentElement.scrollLeft;
		}
		else
		{
			var top = ((window.innerHeight - (height - 70) ) / 2) + window.pageYOffset;
			var left = ((window.innerWidth - width) / 2) + window.pageXOffset;
		}
	*/
	if(!id) {
		id = -1;
	}
	fname = unescape(fname);
	lname = unescape(lname);
	title = unescape(title);
	var str='';
	str+='<form name="edit_person_pop_form" method="POST" onsubmit="submit_edit_person_pop(); return false;">';
	str+='<div id="edit_pop" class="person_pop">';
	str+='<fieldset>';
	str+='<label>First Name<\/label>';
	str+='<input type="text" tabindex="1" name="firstName" maxlength="38" value="'+fname.replace(/"/g,'&quot;')+'" \/>';
	str+='<\/fieldset>';
	str+='<fieldset>';
	str+='<label>Last Name<\/label>';
	str+='<input type="text" tabindex="2" name="lastName" maxlength="38" value="'+lname.replace(/"/g,'&quot;')+'" \/>';
	str+='<\/fieldset>';
	str+='<fieldset>';
	str+='<label>Title<\/label>';
	str+='<input type="text" tabindex="3" name="title" maxlength="60" value="'+title.replace(/"/g,'&quot;')+'" \/>';
	str+='<\/fieldset>';
	str+='<div id="bottom_buttons">';
	str+='<a href="#" tabindex="4" class="button save_pop" style="margin: 10px 10px 0 0;" onclick="submit_edit_person_pop(); return false;"><span>Save<\/span><\/a>';
	str+='<a href="#" tabindex="5" class="button cancel_pop" style="margin: 10px 10px 0 0;" onclick="closepop(); return false;"><span>Cancel<\/span><\/a>';
	if(id < startnewuserid && id != -1) {
		str+='<a href="/person_edit.php?id='+id+'" tabindex="6" class="button adetails_pop" style="margin: 10px 0 0 0;"><span>Add\'l Details<\/span><\/a>';
	} else {
		str+='<a class="button" style="margin: 10px 0 0 0;">Once you save the map, come back here and add phone numbers, email and other details!<\/a>';
	}
	str+='<\/div>';
	str+='<\/div>';
	str+='<input type="hidden" name="personID" value="'+id+'" \/>';
	str+='<input type="submit" style="display: none;" \/>';
	str+='<\/form>';

	boxhandle = new LITBox(str,{type:'alert',overlay:true, width: width, height: height});
	// boxhandle = new LITBox('person_edit_pop.php?id='+id+'&n='+startnewuserid+addons,{type:'window',overlay:true, width: width, height: height, left: left, top: top});

	document.forms.edit_person_pop_form.firstName.focus();

	return false;
}

function submit_edit_person_pop() {
	var err = "";
	var frm = document.forms.edit_person_pop_form;

	if(isWhitespace(frm.lastName.value)) {
		err += "\nLast Name is blank";
	}
	if(isWhitespace(frm.firstName.value)) {
		err += "\nFirst Name is blank";
	}
	if(isWhitespace(frm.title.value)) {
		err += "\nTitle is blank";
	}

	if(err !== "") {
		alert("You must correct the following errors:\n"+err);
	} else {
		if(frm.personID.value == '-1') {
			newPerson(frm.firstName.value, frm.lastName.value, frm.title.value);
			set_chart_modified(1);
		} else {
			modifyPerson(frm.personID.value, frm.firstName.value, frm.lastName.value, frm.title.value);
			set_person_modified(1);
		}
		closepop();
	}
	return false;
}

function pop_edit_chart(id, ver) {
	closepop();
	var height = 660;
	var width = 650;
	/*
		if(document.all)
		{
			var top = ((document.documentElement.clientHeight - (height - 90) ) / 2) + document.documentElement.scrollTop;
			var left = ((document.documentElement.clientWidth - width) / 2 ) + document.documentElement.scrollLeft;
		}
		else
		{
			var top = ((window.innerHeight - (height - 70) ) / 2) + window.pageYOffset;
			var left = ((window.innerWidth - width) / 2) + window.pageXOffset;
		}
	*/
	boxhandle = new LITBox('/chart_edit_pop.php?id='+id+'&ver='+ver+'&chartName='+encodeURIComponent(chartName)+'&chartDescription='+encodeURIComponent(chartDescription)+'&chartCity='+encodeURIComponent(chartCity)+'&chartState='+encodeURIComponent(chartState)+'&chartCountry='+encodeURIComponent(chartCountry)+'&chartIndustry='+encodeURIComponent(chartIndustry),{type:'window',overlay:true, width: width, height: height});
	// boxhandle = new LITBox('chart_edit_pop.php?id='+id+'&ver='+ver,{type:'window',overlay:true, width: width, height: height, left: left, top: top});
	document.forms.edit_chart_pop_form.chartName.focus();
	return false;
}

function submit_edit_chart_pop() {
	var err = "";
	var frm = document.forms.edit_chart_pop_form;

	if(isWhitespace(frm.chartName.value)) {
		err += "\nChart Name is blank";
	}
	if(frm.chartName.value.length < 4) {
		err += "\nChart Name needs to be at least 4 characters long";
	}

	if(err !== "") {
		alert("You must correct the following errors:\n"+err);
		return false;
	} else {
		post = "name=" + encodeURIComponent(frm.chartName.value.toString());
		post += "&private=" + frm.chartprivate.value.toString();
		post += "&chartid=" +frm.chartid.value.toString();
		var ajaxreq = new Ajax.Request('/chart_name_check.php',{method: 'post', parameters: post, onComplete: 
		function(req) {
			if(req.responseText == 1) {
				alert("That chart name is not available");
				return false;
			} else {
				set_chart_modified(1);
				chartName = frm.chartName.value.toString();
				chartDescription = frm.chartDescription.value.toString();
				chartCity = frm.chartCity.value.toString();
				chartState = frm.chartState.value.toString();
				chartCountry = frm.chartCountry.value.toString();
				chartIndustry = frm.chartIndustry.value.toString();
				$('chartName').innerHTML = frm.chartName.value.toString().escapeHTML();
				$('name_0').innerHTML = frm.chartName.value.toString().escapeHTML();
				$('chartDescription').innerHTML = frm.chartDescription.value.toString().escapeHTML();
				$('chartCity').innerHTML = frm.chartCity.value.toString().escapeHTML();
				$('chartState').innerHTML = frm.chartState.value.toString().escapeHTML();
				$('chartCountry').innerHTML = frm.chartCountry.value.toString().escapeHTML();
				$('chartIndustry').innerHTML = frm.chartIndustry.value.toString().escapeHTML();
				closepop();
				if (frm.chartCity.value || frm.chartState.value || frm.chartCountry.value || frm.chartIndustry.value) {
					var modinfostring = "";
					modinfostring += frm.chartCity.value.toString().escapeHTML();
					if (frm.chartCity.value && frm.chartState.value) { 
						modinfostring += ", ";
					}
					modinfostring += frm.chartState.value.toString().escapeHTML();
					if ((frm.chartCity.value || frm.chartState.value) && frm.chartCountry.value) { 
						modinfostring += ", ";
					}
					modinfostring += frm.chartCountry.value.toString().escapeHTML();
					if ((frm.chartCity.value || frm.chartState.value || frm.chartCountry.value) && frm.chartIndustry.value) { 
						modinfostring += "&nbsp;&nbsp;&nbsp";
					}
					if (frm.chartIndustry.value) { 
						modinfostring += " NAICS: "+frm.chartIndustry.value.toString().escapeHTML(); 
					}
					$('modifiedinfo2').innerHTML = modinfostring;
				}
				return false;
      
			}  
		} 
	});
	}
}

function pop_add_comment(id) {
	closepop();
	var height = 220;
	var width = 650;
	boxhandle = new LITBox('/add_comment_pop.php?id='+id,{type:'window',overlay:true, width: width, height: height});
	document.forms.add_comment_pop_form.chartComment.focus();
	return false;
}

function show_unsub(req) {
	$('sub_container').style.display = 'none';
	$('unsub_container').style.display = 'inline';
}

function show_sub(req) {
	$('unsub_container').style.display = 'none';
	$('sub_container').style.display = 'inline';
}

function subscribe_map(chartid, userid) {
	var ajaxreq = new Ajax.Request('/chart_sub.php',{method: 'post', parameters: 'chartID=' + chartid + '&userID=' + userid, onComplete: function() { show_unsub(); } });
	return false;
}

function unsubscribe_map(chartid, userid) {
	var ajaxreq = new Ajax.Request('/chart_unsub.php',{method: 'post', parameters: 'chartID=' + chartid + '&userID=' + userid, onComplete: function() { show_sub(); } });
	return false;
}

function submit_add_comment_pop(id, userid) {
	var err = "";
	var frm = document.forms.add_comment_pop_form;

	if(isWhitespace(frm.chartComment.value)) {
		err += "\nChart comment is blank";
	}
	if(frm.chartComment.value.length < 4) {
		err += "\nChart comment needs to be at least 4 characters long";
	}

	if(err !== "") {
		alert("You must correct the following errors:\n"+err);
	} else {
		chartComment = encodeURIComponent(frm.chartComment.value.toString());
		closepop();
		var ajaxreq = new Ajax.Request('/add_comment_submit.php',{method: 'post', parameters: 'chartID='+id+'&chartComment=' + chartComment, onComplete: function() { repopulate_chartComment(id); subscribe_map(id, userid); } });
	}
	return false;
}

function submit_add_comment_static(id, userid) {
	var err = "";
	var frm = document.forms.add_comment_pop_form;

	if(isWhitespace(frm.chartComment.value)) {
		err += "\nChart comment is blank";
	}
 	if(frm.chartComment.value.length < 4) {
	 	err += "\nChart comment needs to be at least 4 characters long";
	}

	if(err != "") {
		alert("You must correct the following errors:\n"+err);
	} else {
		chartComment = encodeURIComponent(frm.chartComment.value.toString());
		var ajaxreq = new Ajax.Request('/add_comment_submit.php',{method: 'post', parameters: 'chartID='+id+'&chartComment=' + chartComment, onComplete: function() { subscribe_map(id, userid); window.location.reload(); } });
		frm.chartComment.value = "";
	}
	return false;
}

function pop_edit_access_chart(id, ver) {
	closepop();
	var height = 660;
	var width = 650;
	boxhandle = new LITBox('/chart_edit_access_pop.php?id='+id+'&ver='+ver,{type:'window',overlay:true, width: width, height: height});
	document.forms.edit_access_pop_form.addEmails.focus();
	return false;
}

function submit_edit_chart_access_pop(typeid,chartid) {
	if(typeid > 1) {
		var err = "";
		var frm = document.forms.edit_access_pop_form;
		var emailstoadd_array = frm.addEmails.value.split(";");
		var emailList = emailstoadd_array.join(",");
		emailstoadd_array = emailList.split("\n");
		emailList = emailstoadd_array.join(",");
		emailstoadd_array = emailList.split("\r");
		emailList = emailstoadd_array.join(",");
		emailstoadd_array = emailList.split(",");
		var checkTLD=1;
		var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
		var emailPat=/^(.+)@(.+)$/;
		var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
		var validChars="\[^\\s" + specialChars + "\]";
		var quotedUser="(\"[^\"]*\")";
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
		var atom=validChars + '+';
		var word="(" + atom + "|" + quotedUser + ")";
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
		var arLen=emailstoadd_array.length;
		for (var d=0, len=arLen; d<len; d++ ){
			if (emailstoadd_array[d] === "") {
				/** Email Check Function **/ 
				var emailStr = emailstoadd_array[d];
				emailStr = emailStr.replace(/^\s*/, '').replace(/\s*$/, '');
				var matchArray=emailStr.match(emailPat);
				/* Too many/few @'s or something; basically, this address doesn't
				even fit the general mould of a valid e-mail address. */
				if (matchArray===null) { 
					err += "\n" + emailStr + " seems incorrect (check @ and .'s)"; 
					var user = "";
					var domain = "";
				} else { 
					var user=matchArray[1]; 
					var domain=matchArray[2];
				}
				// Start by checking that only basic ASCII characters are in the strings (0-127).
				for (var i=0; i<user.length; i++) {
					if (user.charCodeAt(i)>127) { 
						err += "\n" + emailStr + " username contains invalid characters.";   
					}
				}

				for (var i=0; i<domain.length; i++) {
					if (domain.charCodeAt(i)>127) {
						err += "\n" + emailStr + " domain name contains invalid characters.";   
					}
				}

				// See if "user" is valid 

				if (user.match(userPat)===null) {
					err += "\n" + emailStr + " username doesn't seem to be valid.";
				}

				/* if the e-mail address is at an IP address (as opposed to a symbolic host name) make sure the IP address is valid. */

				var IPArray=domain.match(ipDomainPat);
				if (IPArray!==null) {
					// this is an IP address
					for (var j=1;j<=4;j++) {
						if (IPArray[j]>255) {
							err += "\n" + emailStr + " destination IP address is invalid!";
						}
					}
				}

				// Domain is symbolic name.  Check if it's valid.
   				var atomPat=new RegExp("^" + atom + "$");
				var domArr=domain.split(".");
				var len=domArr.length;
				for (var i=0;i<len;i++) {
					if (domArr[i].search(atomPat)==-1) {
						err += "\n" + emailStr + " domain name does not seem to be valid.";   
					}
				}

				/* domain name seems valid, but now make sure that it ends in a
				known top-level domain (like com, edu, gov) or a two-letter word,
				representing country (uk, nl), and that there's a hostname preceding 
				the domain or country. */

				if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
					err += "\n" + emailStr + " address must end in a well-known domain or two letter country.";
				}

				// Make sure there's a host name preceding the domain.
				if (len<2) {
					err += "\n" + emailStr + " address is missing a hostname!";
				}

				// If we've gotten this far, everything's valid!
			}
		}
		if(err !== "") {
			alert("You must correct the following errors:\n"+err);
			return false;
		} else {
			var ajaxreq = new Ajax.Request('/chart_access.php',{method: 'post', parameters: 'chartID=' + chartid + '&emaillist=' + frm.addEmails.value});  
		}
	} else {
		var strSel = "";
		for (var i=0; i < window.frames[0].document.forms.edit_access_pop_form.unallowedEmails.length; i++) {
			if (window.frames[0].document.forms.edit_access_pop_form.unallowedEmails[i].checked) {
				strSel = strSel + window.frames[0].document.forms.edit_access_pop_form.unallowedEmails[i].value + ",";
			}
		}
		var ajaxreq = new Ajax.Request('/chart_access.php',{method: 'post', parameters: 'chartID=' + chartid + '&unallowedemails=' + strSel});
	}
	closepop();
	return false;  
}

