var naviTreeManager= new function () {
	var _t = this;
	var selector;
	var controller;
	var tree;
	var groupTree;
	var contentpane;
	var imageUploadDialog;
	var inviteMemberDialog;
	var clipboard;
	this.menuAction;
	var protoHost = location.protocol+'//'+location.host;
	this.init = function () {
		selector = dojo.widget.byId('naviTreeSelector');
		controller = dojo.widget.byId('naviTreeController');
		tree = dojo.widget.byId('naviTree');
		groupTree = dojo.widget.byId('naviGroupTree');
		contentpane = dojo.widget.byId('contentpane');
		if(contentpane) {
			contentpane.onDownloadStart = function (e) {e.returnValue=false;};
		}
		createImageUploadDialog();
		// createInviteMemberDialog();
		this.oldNodeType = 'page';
		this.oldNodeId=0;
		dojo.event.kwConnect({
			srcObj: contentpane, 
			srcFunc: 'onLoad',
			targetObj: this, 
			targetFunc: 'scrollContentpane',
			once: true});
	};
	this.selectDefaultPage = function () {
		var defaultPage;
		var pages = dojo.widget.byId('notebook.0').children;
		if (defaultPage = pages[pages.length-1]) {
			selector.select(defaultPage);
		}
	};
	selectDefaultMemberPage = function (memberNode) {
		var pages = memberNode.children;
		if (pages.length) {
			selector.select(pages[pages.length-1]);
		} else {
			selector.select(memberNode);
		}
	}
	this.deferredTreeHandler = function (res) {
		if (res instanceof dojo.Deferred) {
			res.addCallbacks (
				function(res) {},
				function(err) {dojo.debug("error");dojo.debugShallow(err);}
			);
		}
	};
	this.editTreeDone = function(node) {
		if (node) {
			var title=node.title.replace(/<br>/, '');
			var parentNode = node.parent;
			var ids;
			var newNode;
			
			if (_t.menuAction == 'naviContextMenuRename') {
				ids = node.objectId.split('.');
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action="+_t.menuAction+"&nodeType="+ids[0]+'&nodeId='+ids[1]+'&title='+title,
					load: function (type, data, evt) {
						selector.deselectAll();
						var d = controller.refreshChildren(node.parent);
						d.addCallback(function () {
							newNode = dojo.widget.byId(node.objectId);
							selector.select(newNode)});
						_t.invalidateContentpane();
						d.addCallback(function () {
							_t.updateContentpane({node:newNode})});
						d.addCallback(stopProgressIndicator);
					},
					error: function(type, error){},
					mimetype: "text/plain"
				});
			} else if (_t.menuAction == 'naviContextMenuDelete') {
				ids = node.objectId.split('.');
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action="+_t.menuAction+"&nodeType="+ids[0]+'&nodeId='+ids[1]+'&title='+title,
					load: function (type, data, evt) {
						var d = controller.refreshChildren(parentNode);
						selector.deselectAll();
						if (ids[0]=='page') {
							d.addCallback(_t.selectDefaultPage);
							d.addCallback(stopProgressIndicator);
						} else {
							d.addCallback(function() {
								selector.select(parentNode);});
							d.addCallback(function () {
								_t.invalidateContentpane();
								_t.updateContentpane({node:parentNode})});
							d.addCallback(stopProgressIndicator);
						}
					},
					error: function(type, error){},
					mimetype: "text/plain"
				});
			} else if (_t.menuAction=='naviContextMenuNewNote') {
				// new
				var newNode;
				ids = node.objectId.split('.');
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action="+_t.menuAction+"&nodeType="+ids[0]+'&nodeId='+ids[1]+'&title='+title,
					load: function (type, data, evt) {
						selector.deselectAll();
						var d = controller.refreshChildren(node);

						d.addCallback(function () {
							newNode = dojo.widget.byId(data.objectId);
							selector.select(newNode)});
						_t.invalidateContentpane();
						d.addCallback(function () {
							if (newNode) {
								_t.updateContentpane({node:newNode});
							}
						d.addCallback(stopProgressIndicator);
						});
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
			} else if (_t.menuAction=='naviContextMenuNewImage') {
				// new
				createImageUploadDialog(node.objectId);
			} else {
				// new
				var newNode;
				ids = parentNode.objectId.split('.');
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action="+_t.menuAction+"&nodeType="+ids[0]+'&nodeId='+ids[1]+'&title='+title,
					load: function (type, data, evt) {
						selector.deselectAll();
						var d = controller.refreshChildren(parentNode);
						d.addCallback(function () {
							newNode = dojo.widget.byId(data.objectId);
							selector.select(newNode)});
						_t.invalidateContentpane();
						d.addCallback(function () {
							if (newNode) {
								_t.updateContentpane({node:newNode});
							}
						d.addCallback(stopProgressIndicator);
						});
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
			}
		}
		dojo.event.topic.unsubscribe('naviTreeController/editLabelFinish', _t, 'editTreeDone');
		
	};
	this.bindMenu = function (controller, menuPrefix) {
		var _t = this;
		dojo.event.topic.subscribe(menuPrefix+'NewPage/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'NewNote/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'NewSeqTray/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'NewImage/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Rename/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Delete/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Copy/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Paste/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Refresh/engage', function(menuItem) {
			var node = menuItem.getTreeNode();
			var nodeIds = node.objectId.split('.');
			controller.refreshChildren(node);
			_t.invalidateContentpane();
			_t.updateContentpane({node:node});
		});
	};
	
	this.bindGroupMenu = function (controller, menuPrefix) {
		dojo.event.topic.subscribe(menuPrefix+'Invite/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Accept/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Delete/engage', menuItemHandler);
		dojo.event.topic.subscribe(menuPrefix+'Refresh/engage', function(menuItem) {
			var node = menuItem.getTreeNode();
			controller.refreshChildren(node);
		});
		dojo.event.topic.subscribe(menuPrefix+'Reload/engage', function(menuItem) {
			var node = menuItem.getTreeNode();
			controller.refreshChildren(node);
			_t.refreshContentpane();
		});
	}
	this.unbindMenu = function (controller, menuPrefix) {
	};
	
	this.triggerTreeAction = function (nodeId, action) {
		var node = dojo.widget.byId(nodeId);
		if (node) {
			treeAction(node, action);
		}
	}
	
	this.refreshNodeById = function (nodeId) {
		var node;
		var d=null;
		if (node=dojo.widget.byId(nodeId)) {
			d=controller.refreshChildren(node);
			d.addCallback (function() {
				controller.expandToLevel(node,2);
				selector.deselectAll();
				selector.select(node);
			});
			contentpane.refresh();
		}
		return d;
	};
	this.openNotebookPane = function () {
		if(!dojo.widget.byId('myNoteBookPane').selected) {
    		dojo.widget.byId('accordionMain').selectChildCustom(
	  			dojo.widget.byId('myNoteBookPane')
    		);
  		}	 
	}
	this.updateChildNode = function (pageNodeId, childNodeId) {
		var pageNode;
		if (pageNode = dojo.widget.byId(pageNodeId)) {
			selector.deselectAll();
			var d=controller.refreshChildren(pageNode);
			d.addCallback (function () {
				return controller.expandToLevel(pageNode, 2);
			});
			d.addCallback(function() {
				var childNode = dojo.widget.byId(childNodeId);
				selector.select(childNode);
				//_t.updateContentpane ({node: childNode});
			});
		}
	};
	this.refreshContentpane = function() {
		contentpane.refresh();
	};
	this.updateTree = function (node) {
		var newNode;
		selector.deselectAll();
		startProgressIndicator();
		var d = controller.refreshChildren(node.parent);
		d.addCallback(function () {
			newNode = dojo.widget.byId(node.objectId);
			selector.select(newNode)});
		this.invalidateContentpane();
		d.addCallback(function () {
			_t.updateContentpane({node:newNode})});
		d.addCallback(stopProgressIndicator);
	};
	this.updateContent = function (node) {
		startProgressIndicator();
		this.updateContentpane(node);
	};
	this.updateNewNode = function (nodeId) {
		if (selector.selectedNodes.length > 0) {
			var d=controller.refreshChildren(getPageNode(selector.selectedNodes[0]));
			d.addCallback(function() {
				var node = {'node': null};
				node['node'] = dojo.widget.byId(nodeId);
				_t.invalidateContentpane();
				_t.updateContentpane(node);
			});
		}
	};
	this.invalidateContentpane = function () {
		this.oldNodeType = '';
		this.oldNodeId = 0;
	};
	this.updateContentpane = function (node) {
		node = node.node;
		var currNodeIds = node.objectId.split('.');
		var currDomNode = dojo.byId(currNodeIds[0]+currNodeIds[1]);
		var pageNode = getPageNode(node);
		var d;
		var xx = node.title.search(/-\(Accepting Invitation/i);
		if ((currNodeIds[0]=='member') && (node.title.search(/-\(Accepting Invitation \?\)/i) != -1)) {
			_t.groupAcceptInvitation(node.objectId);
			nodeTitle = node.title;
			node.setTitle(nodeTitle.replace (/-\(Accepting Invitation \?\)/i, ''));
			return;
		}
		if (pageNode) {
			var ids = pageNode.objectId.split('.');
			if (this.oldNodeType != ids[0] || this.oldNodeId != ids[1]) {
				var contentpane = dojo.widget.byId('contentpane');
				this.setAnchorNode (node.objectId);
				var url = '/rightcontent/content_load.php'+'?nodeType='+ids[0]+'&nodeId='+ids[1];
				dojo.widget.byId('contentpane').setUrl(url);
//				dojo.widget.byId('contentpane').setUrl('/rightcontent/content_load.php'+'?nodeType='+ids[0]+'&nodeId='+ids[1]);
//			contentpane.setUrl('/rightcontent/page_load.php');
//				contentpane.refresh();
				this.oldNodeType = ids[0];
				this.oldNodeId = ids[1];
			} else {
				// scroll it
				if (currDomNode) dojo.html.scrollIntoView(currDomNode);
				stopProgressIndicator();
//				if (currDomNode) currDomNode.scrollIntoView();
			}
		} else {
			if (currDomNode) dojo.html.scrollIntoView(currDomNode);
			stopProgressIndicator();
//			if (currDomNode) currDomNode.scrollIntoView();
		}
		if (currNodeIds[0]=='page') {
//			controller.refreshChildren(node);
			controller.expandToLevel(node,2);
		}
		return d;
	};
	this.setAnchorNode = function (objectId) {
		this.anchorNodeObjectId=objectId;
	};
	this.scrollContentpane = function () {
		if (this.anchorNodeObjectId) {
			var ids = this.anchorNodeObjectId.split('.');
			if (anchorNode=dojo.byId(ids[0]+ids[1])) {
				dojo.html.scrollIntoView(anchorNode);
			}
		}
		stopProgressIndicator();
	};
	this.inviteMember = function () {
		var nodeId = document.inviteMemberForm.nodeObjectId.value;
		var noShare = document.inviteMemberForm.noShare.value;
		var key = document.inviteMemberForm.key.value;
		var ids = nodeId.split('.');
		var node = dojo.widget.byId(nodeId);
		dojo.io.bind ( {
			url: protoHost+"/ajax/groups.php?action=naviGroupContextMenuInvite&nodeType="+ids[0]+'&nodeId='+ids[1]+'&noShare='+noShare+'&key='+key,
			load: function (type, data, evt) {
				var d = controller.refreshChildren(node);
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: "text/html",
			formNode: dojo.byId ('inviteMemberForm')
		});
	};
	this.uploadImage = function () {
		var nodeId = document.uploadImageForm.nodeObjectId.value;
		var ids = nodeId.split('.');
		var node = dojo.widget.byId(nodeId);
		dojo.io.bind ( {
			url: protoHost+"/ajax/navigate.php?action=naviContextMenuNewImage&nodeType="+ids[0]+'&nodeId='+ids[1],
			load: function (type, data, evt) {
				var d = controller.refreshChildren(node);
				if (isCurrentNode(node)) {
					selector.select(node);
					_t.invalidateContentpane();
					_t.updateContentpane({node:node});
				}
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: "text/html",
			formNode: dojo.byId ('uploadImageForm')
		});
		imageUploadDialog.hide();
		
	};
	this.destroyImageUploadDialog = function () {
		dojo.widget.byId('uploadImageDialog').destroy();
	};		
	function isCurrentNode (node) {
		var pageNode = getPageNode(node);
		if (pageNode) {
			var ids = pageNode.objectId.split('.');
			if (_t.oldNodeType == ids[0] && _t.oldNodeId == ids[1]) {
				return true;
			}
		}
		return false;
	}
			

	function menuItemHandler (menuItem) {
		var node = menuItem.getTreeNode();
		treeAction (node, menuItem.widgetId);
	};
	this.createNewPage = function (nodeId) {
				var _t=this;
				ids = nodeId.split('.');
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action=naviContextMenuNewPage&nodeType="+ids[0]+'&nodeId='+ids[1]+'&title=New Page',
					load: function (type, data, evt) {
						var node = dojo.widget.byId(nodeId);
						var newNode = node.tree.createNode({title: 'New Page', objectId:data.objectId, widgetId:data.objectId});
						node.addChild(newNode, 0);
						newNode = dojo.widget.byId(data.objectId);
						_t.invalidateContentpane();
						if (newNode) {
							dojo.event.kwConnect({srcObj:dojo.widget.byId('contentpane'), srcFunc:'onLoad', targetObj:_t, targetFunc:'editPageTitle', once: true});
							_t.updateContentpane({node:newNode});
						}
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
	};
	this.editPageTitle = function () {
			dojo.event.kwDisconnect({srcObj:dojo.widget.byId('contentpane'), srcFunc:'onLoad', targetObj:_t, targetFunc:'editPageTitle', once: true});
			var title = dojo.byId('Title');
			keyListener(0, function(){dojo.byId('Title').blur();});
			title.className='inputfieldEdit';
			title.readOnly=false;
			title.focus();
	};
	function treeAction (node, action) {
		_t.menuAction = action;
		switch (action) {
			case 'naviContextMenuNewPage':
			case 'naviContextMenuNewSeqTray':
				dojo.event.topic.subscribe(controller.widgetId+'/editLabelFinish', _t, 'editTreeDone');
				var d = controller.createAndEdit(node, 0);
				break;
			case 'naviContextMenuNewNote':
				_t.editTreeDone(node);
				break;
			case 'naviContextMenuNewImage':
				showImageUploadDialog(node.objectId);
				break;
			case 'naviContextMenuRename':
				dojo.event.topic.subscribe(controller.widgetId+'/editLabelFinish', _t, 'editTreeDone');
				controller.editLabelStart(node);
				break;
			case 'naviContextMenuDelete':
				if (confirm('Proceed with the deletion ?')) {
					_t.editTreeDone(node);
					controller.destroyChild(node);
				}
				break;
			case 'naviContextMenuCopy':
				clipboard = node;
				break;
			case 'naviContextMenuPaste':
				paste (node, clipboard);
				break;
			case 'naviGroupContextMenuInvite':
				_t.showInviteMemberDialog(node.objectId);
				break;
			case 'naviGroupContextMenuAccept':
				_t.groupAcceptInvitation(node.objectId);
				break;
			case 'naviGroupContextMenuDelete':
				if (confirm('Proceed with the deletion ?')) {
					var parentNode = node.parent;
					ids = node.objectId.split('.');
					startProgressIndicator();
					dojo.io.bind ( {
						url: protoHost+"/ajax/groups.php?action="+_t.menuAction+"&nodeType="+ids[0]+'&nodeId='+ids[1],
						load: function (type, data, evt) {
							var d = controller.refreshChildren(parentNode);
							selector.deselectAll();
							d.addCallback(_t.selectDefaultPage);
							d.addCallback(stopProgressIndicator);
						},
						error: function(type, error){},
						mimetype: "text/plain"
					});
				}
				break;
		}
	};
	this.groupAcceptInvitation = function (nodeId) {
				var newNode;
				var node = dojo.widget.byId(nodeId);
				ids = nodeId.split('.');
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/groups.php?action="+'naviGroupContextMenuAccept'+"&nodeType="+ids[0]+'&nodeId='+ids[1],
					load: function (type, data, evt) {
						selector.deselectAll();
						var d = controller.refreshChildren(node);
						d.addCallback(function () {
							selectDefaultMemberPage(node);
						});
						d.addCallback(stopProgressIndicator);
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
	}
	function getPageNode (node) {
		while (node) {
			var ids = node.objectId.split('.');
			if (ids[0]=='page') {
				return node;
			}
			node = node.parent;
			if (node.isTree) {
				return null;
			}
		}
		return null;
	};
	function paste (target, src) {
		srcNodeIds = src.objectId.split('.');
		targetNodeIds = target.objectId.split('.');
		if (targetNodeIds[0]=='page' && srcNodeIds[0]=='seqTray') {
				startProgressIndicator();
				dojo.io.bind ( {
					url: protoHost+"/ajax/navigate.php?action="+_t.menuAction+"&nodeType="+targetNodeIds[0]+'&nodeId='+targetNodeIds[1]+"&srcNodeType="+srcNodeIds[0]+'&srcNodeId='+srcNodeIds[1],
					load: function (type, data, evt) {
						selector.deselectAll();
						var d = controller.refreshChildren(target);
						d.addCallback(function () {
							newNode = dojo.widget.byId(data.objectId);
							selector.select(newNode)});
						_t.invalidateContentpane();
						d.addCallback(function () {
							if (newNode) {
								_t.updateContentpane({node:newNode});
							}
						d.addCallback(stopProgressIndicator);
						});
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
		}
	};
	function showImageUploadDialog(nodeObjectId) {
		document.uploadImageForm.nodeObjectId.value = nodeObjectId;
		imageUploadDialog.show();
		setTimeout(function(){dojo.byId('uploadImageCaption').focus()},100);
	}
	function createImageUploadDialog () {
		var srcNode = document.createElement('div');
		srcNode.id='imageUploadDialog';
		srcNode.style.display = 'none';
		srcNode.innerHTML = "<form id='uploadImageForm' name='uploadImageForm' method='POST' enctype='multipart/form-data' onsubmit='naviTreeManager.uploadImage();return false;'><input type='hidden' name='nodeObjectId' value=''><table><tbody><tr><td colspan='2'>Upload image file</td></tr><tr><td>Caption:</td><td><input type='text' name='caption' id='uploadImageCaption'></td></tr><tr><td>Location:</td><td><input type='file' name='imageFile'></td></tr><tr><td colspan='2' align='center'><input type='submit' name='upload' value='Ok'><input type='button' id='cancelUpload' value='Cancel'></td></tr></tbody></table></form>";
		document.body.appendChild(srcNode);
		imageUploadDialog = dojo.widget.createWidget("Dialog", {widgetId:'uploadImageDialog',bgColor:"black",bgOpacity:"0.2", closeNode:'cancelUpload', focusElement:'uploadImageCaption'}, srcNode);
	}
	/*
	this.showInviteMemberDialog = function (nodeObjectId) {
		document.inviteMemberForm.nodeObjectId.value = nodeObjectId;
		inviteMemberDialog.show();
		setTimeout(function(){dojo.byId('inviteMemberEmail').focus()},100);
	}
	function createInviteMemberDialog () {
		var nickname = dojo.byId('nickname').innerHTML;
		var subject = nickname + ' invites you to view his/her DNASIS SmartNote';
		var body = "You have been invited to view my DNASIS SmartNote sequence analysis notebook.\n To view my notebook, click the link below to register: \n\n<a href='"+location.protocol+"//"+location.host+"/register.php.'>SmartNote Registration</a> \n\nThank you,\n"+nickname+
"\n\nThis is a post-only mailing. Replies to this message are not monitored or answered.";
		var srcNode = document.createElement('div');
		srcNode.id='inviteMemberDialog';
		srcNode.innerHTML = "<form id='inviteMemberForm' name='inviteMemberForm' method='POST' enctype='multipart/form-data' onsubmit='naviTreeManager.inviteMember();return false;'><input type='hidden' name='nodeObjectId' value=''><table><tbody><tr><td colspan='2'>Invitation</td></tr><tr><td>Email address:</td><td><input type='text' name='email' id='inviteMemberEmail' size='50'></td></tr><tr><td>Suject:</td><td><input type='text' name='subject' id='inviteMemberSubject' value='"+subject+"' size='50'></td></tr><tr><td>Message:</td><td><textarea cols='50' rows='20' name='body' id='inviteMemberBody'>"+body+"</textarea></td></tr><tr><td colspan='2' align='center'><input type='submit' name='invite' value='Ok'><input type='button' id='cancelInvite' value='Cancel'></td></tr></tbody></table></form>";
		document.body.appendChild(srcNode);
		inviteMemberDialog = dojo.widget.createWidget("Dialog", {widgetId:'inviteMemberDialog',bgColor:"black",bgOpacity:"0.2", closeNode:'cancelInvite', focusElement:'inviteMemberEmail'}, srcNode);
	}
	*/
}

var myDialog = new function () {
	var myDialog;
	
	this.create = function () {
		var srcNode = document.createElement('div');
		srcNode.id='myDialog';
		srcNode.style.display = 'none';
		srcNode.innerHTML = "<form id='myDialogForm' name='myDialogForm' method='POST' enctype='multipart/form-data'><div id='myDialogText'><span id='myDialogText'></span></div><div id='myDialogButton'><input type='submit' id='submitMyDialog' name='submitMyDialog' value='Ok'><input type='button' id='cancelMyDialog' value='Cancel'></div></form>";
		document.body.appendChild(srcNode);
		myDialog = dojo.widget.createWidget("Dialog", {widgetId:'myDialog',title:'Smartnote', bgColor:"black",bgOpacity:"0.2", closeNode:'cancelMyDialog', focusElement:'submitMyDialog'}, srcNode);
	}
	
	this.show = function(title, msg, btn1Label, btn2Label, submitHandler) {
		dojo.byId('myDialogText').innerHTML = msg;
		dojo.byId('submitMyDialog').value = btn1Label;
		dojo.byId('cancelMyDialog').value = btn2Label;
		dojo.byId('myDialogForm').onsubmit = function() {submitHandler(); myDialog.hide();return false;};
		myDialog.title=title;
		myDialog.show();
	}
	
	this.hide = function () {
		myDialog.hide();
	}
}
	
var treeSearchManager = new function () {
	var _t = this;
	var protoHost = location.protocol+'//'+location.host;
	var selector;
	var navicontent;
	var children;
	this.init = function () {
		navicontent = dojo.widget.byId('navicontent');
		if(navicontent) {
			children = navicontent.children;
		}
		selector = dojo.widget.byId('naviTreeSelector');
		//this.hideSearch();
	}; 
	this.submitSearch = function () {
		startProgressIndicator();
		dojo.io.bind ( {
			url: protoHost+"/ajax/search.php?searchterms="+encodeURIComponent(document.treeSearch.treeSearchText.value),
			load: function (type, data, evt) {
				if (data) {
					processResults(data);
				}
				stopProgressIndicator();
			},
			error: function(type, error){stopProgressIndicator();},
			mimetype: "text/json"
		});
	};
	function processResults (data) {
		var resultcontent='';
		for (var resultset in data) {
			resultcontent += '<b>'+resultset+'</b><br />';
			if (data[resultset].length == 0) {
				resultcontent += 'No result found<br />';
			} else {
				resultcontent += '<ol>';
				for (var result in data[resultset]) {
					resultcontent += '<li><div><a onClick="treeSearchManager.selectPage(\''+data[resultset][result].objectId+'\');">'+data[resultset][result].name+'</a></div><div>'+data[resultset][result].description+'</div></li>';
				}
				resultcontent += '</ol>';
			}
		}
		dojo.byId('searchresults').innerHTML = resultcontent;
		//if (children[1].sizeShare < 5) {
		//	_t.showSearch();
		//}
	}
	this.selectPage = function (objectId) {
		var page = dojo.widget.byId(objectId);
		if (page) {
			naviTreeManager.invalidateContentpane();
			dojo.html.scrollIntoView(page.domNode);
			selector.deselectAll();
			selector.select(page);
		}
	}
	/*
	this.hideSearch = function () {
		children[0].sizeShare=100;
		children[1].sizeShare=0;
		children[1].setContent = '';
		children[1].hide();
		navicontent._layoutPanels();
		navicontent.sizers[0].style.display='none';
		document.treeSearch.treeSearchText.value = '';
	};
	this.showSearch = function () {
		if (children[1].sizeShare < 5) {
			children[0].sizeShare=49;
			children[1].sizeShare=49;
			navicontent._layoutPanels();
			children[1].show();
			navicontent.sizers[0].style.display='block';
		}
	}
	*/	
};

var mySequenceManager = new function () {
	var mySequenceDialog;
	var _t = this;
	this.init = function () {
		createMySequenceDialog ();
	};
	function createMySequenceDialog () {
        //dojo.require("dojo.widget.FloatingPane");
		var srcNode = document.createElement('div');
		srcNode.id='mySequencePane';
		//srcNode.innerHTML = "<table dojoType='filteringTable' id='sequenceTable' multiple='true' alternateRows='true'><thead><tr><th field='checkbox' dataType='html'></th><th field='Accession' dataType='String'>Accession</th><th field='Name' dataType='String'>Name</th><th field='Length' dataType='Number'>Length</th></tr></thead></table><input type='button' value='Close' id='closeSequence' />";
		srcNode.innerHTML = '';
		srcNode.style.width = Math.round(dojo.body().clientWidth * 0.8) + "px";
		srcNode.style.height= Math.round(dojo.body().clientHeight * 0.8) + "px";
		srcNode.style.top = Math.round(dojo.body().clientHeight * 0.12) + "px";
		srcNode.style.left = Math.round(dojo.body().clientWidth * 0.2) + "px";
		srcNode.style.display = 'none';
		document.body.appendChild(srcNode);
		mySequenceDialog=dojo.widget.createWidget("FloatingPane", {widgetId:'mySequencePane',title:'DNASIS - SmartNote', cacheContent:false, constrainToContainer:true, bgColor:'black', bgOpacity:'0.2', executeScripts:true, extractContent:false, adjustPaths:false, resizable:true, displayCloseAction:false}, srcNode);
		mySequenceDialog.onDownloadStart = function (e) {e.returnValue=false;};
		mySequenceDialog.hide();
		mySequenceDialog.setContent('<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"><br><i>thinking...</i></div>');
	};
	this.stopProgressIndicator = function () {
		stopProgressIndicator();
	};
	/*
	function createMySequenceDialog() {
		var srcNode = document.createElement('div');
		srcNode.id='mySequenceDialog';
		srcNode.innerHTML = "";
		//srcNode.innerHTML = "<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"></div>";
		//srcNode.innerHTML = '';
		//srcNode.style.width="600px";
		//srcNode.style.height="300px";
		//srcNode.style.top="200px";
		//srcNode.style.left="200px";
		document.body.appendChild(srcNode);
		mySequenceDialog = dojo.widget.createWidget("Dialog", {widgetId:'mySequenceDialog', cacheContent:false, bgColor:"black",bgOpacity:"0.2"}, srcNode);
		mySequenceDialog.onDownloadStart = function (e) {e.returnValue=false;};
		mySequenceDialog.domNode.style.zIndex=50;
		mySequenceDialog.bg.style.zIndex=49;	
	}
	*/
	this.analyze = function (/*myform*/cart, url, loadUrl, fileupload, doCheck) {
		if (!cart.hasSeqs() && doCheck) {
			alert("Please select sequences.");
		} else {
			//myform.acc.value='new';
			cart.setAcc("new");
			
			// for backward compatibility.
			// create a form element to feed to 'submitSequenceEditForm' method.
			var myform = cart.emulateMySequenceForm();
			var pageid = myform.pageid.value;
			
			var d = this.submitSequenceEditForm(myform, url, null, fileupload);
			d.addCallback (function (data) {
				//naviTreeManager.refreshNodeById('page.'+myform.pageid.value);
				naviTreeManager.refreshNodeById('page.'+pageid);
				mySequenceManager.loadContent(loadUrl+'?trayid='+data.trayid);});
		}
	};
	this.setContent = function (content) {
		mySequenceDialog.setContent(content);
		mySequenceDialog.show();
	};
	this.loadAndSubmit = function (url, autofire, elementId) {
		//mySequenceDialog.setContent('<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"><br><i>thinking...</i></div>');
		//startProgressIndicator();
		//mySequenceDialog.addOnLoad (stopProgressIndicator);
		if (autofire) {
			loadAndSubmit(url, autofire, elementId);
		} else {
			this.loadContent(url);
		}
		//mySequenceDialog.refresh();
		/*
		
		mySequenceDialog.domNode.style.width="600px";
		mySequenceDialog.domNode.style.height="350px";
		mySequenceDialog.domNode.style.top="200px";
		mySequenceDialog.domNode.style.left="200px";
		mySequenceDialog.domNode.style.overflow = "auto";
		*/

		//d.addCallback(_t.show);
		urchinTracker(url);
	};
	function loadAndSubmit (url, autofire, elementId) {
		var protoHost = location.protocol+'//'+location.host;
		mySequenceDialog.show();
		if (autofire=='batchmode') {
			mySequenceDialog.addOnLoad(function () {autoSubmit();});
		} else {
			// js tool
			mySequenceDialog.addOnLoad(function () {autoClick(elementId);});
		}
		var d=mySequenceDialog.setUrl(protoHost+url);
		urchinTracker(url);
	};
	
	function getForm() {
		var forms=mySequenceDialog.domNode.getElementsByTagName('form');
		if (forms) {
			return forms[0];
		} else {
			return null;
		}
	}
	
	function autoClick(elementId) {
		if (document.getElementById(elementId).onclick) {
			document.getElementById(elementId).onclick();
		}
		mySequenceDialog.hide();
	}
	
	function autoSubmit () {
		submitFormToolQueue(getForm(),0); 
		mySequenceDialog.hide();
	}
	
	this.loadContent = function (url) {
		mySequenceDialog.setContent('<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"><br><i>thinking...</i></div>');
		//startProgressIndicator();
		//mySequenceDialog.addOnLoad (stopProgressIndicator);
		loadContent(url);
		//mySequenceDialog.refresh();
		/*
		
		mySequenceDialog.domNode.style.width="600px";
		mySequenceDialog.domNode.style.height="350px";
		mySequenceDialog.domNode.style.top="200px";
		mySequenceDialog.domNode.style.left="200px";
		mySequenceDialog.domNode.style.overflow = "auto";
		*/

		//d.addCallback(_t.show);
		urchinTracker(url);
	};
	function loadContent (url) {
		var protoHost = location.protocol+'//'+location.host;
		mySequenceDialog.show();
		var d=mySequenceDialog.setUrl(protoHost+url);
		urchinTracker(url);
	};
	this.onDataToggle = function (obj) {
		/*
		if (obj) {
			var id = obj.Id;
			var row = this.store.getByKey(id);
			var src = this.store.getDataByKey(id);
			var inputTag = this.getRow(obj).cells[0].childNodes[0];
			var inputTagId = inputTag.getAttribute("id");
			var seqId = inputTag.getAttribute("seqpid");

			if (row.isSelected) {
				//src.checkbox = checkCheckbox(src.checkbox);
				inputTag.setAttribute('checked','checked');
//				this.domNode.rows[id].cells[0].childNodes[0].setAttribute('checked','checked');				this.store.update(src, 'checkbox', checkCheckbox(src.checkbox));

                // add a selected sequence to the list.
                var accession = inputTag.getAttribute("accession");
                getCart().add(seqId, accession, callbackToSync, true);
			} else {
				//src.checkbox = uncheckCheckbox(src.checkbox);
				//console.log(dojo.render.html.ie);
				if (dojo.render.html.ie) {
					inputTag.checked=false;
				} else {
					inputTag.removeAttribute('checked');
				}
//				this.domNode.rows[id].cells[0].childNodes[0].removeAttribute('checked');
//				this.store.update(src, 'checkbox', checkCheckbox(src.checkbox));
//
				// delete a selected sequence from the list.
                getCart().remove(seqId, true);
			}
		}
		//this.render();
		*/
	};
	this.onDataSelect = function (obj) {
		alert("onDataSelect");
		var id = obj.Id;
		var row = this.store.getByKey(id);
		var src = this.store.getDataByKey(id);
		this.getRow(obj).cells[0].childNodes[0].setAttribute('checked','checked');
//		this.store.update(src, 'checkbox', checkCheckbox(src.checkbox));
//			this.domNode.rows[id].cells[0].childNodes[0].setAttribute('checked','checked');
		//this.render();
	};
	this.onDataUnselect = function (obj) {
		alert("onDataUnselect");
		var id = obj.Id;
		var row = this.store.getByKey(id);
		var src = this.store.getDataByKey(id);
		if (dojo.render.html.ie) {
			this.getRow(obj).cells[0].childNodes[0].checked=false;
		} else {
			this.getRow(obj).cells[0].childNodes[0].removeAttribute('checked');
		}
//		this.store.update(src, 'checkbox', checkCheckbox(src.checkbox));
//			this.domNode.rows[id].cells[0].childNodes[0].removeAttribute('checked');
		//this.render();
	};
	function checkCheckbox (checkbox) {
		if (checkbox.search(/checked='checked'/) == -1) {
			return checkbox.replace(/<input/, "<input checked='checked'");
		} else {
			return checkbox;
		}
	};
	function uncheckCheckbox (checkbox) {
		if (checkbox.search(/checked='checked'/) != -1) {
			return checkbox.replace(/checked='checked'/, '');
		} else {
			return checkbox;
		}
	}; 
	this.show = function () {
		hideAllDialogs();
		mySequenceDialog.show();
	};
	this.close = function () {
		mySequenceDialog.hide();
		setTimeout('',2000);
		
		
		//mySequenceDialog.setContent('<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"><br><i>thinking...</i></div>');
	};
	this.submitSequenceEditForm = function(form, url, loadUrl, fileupload) {
		var d = new dojo.Deferred();
		dojo.io.bind ( {
			url: url,
			load: function (type, data, evt) {
				if (fileupload && data) {
					data = dojo.json.evalJson(data.firstChild.lastChild.firstChild.data);
				} 
				if (data) updateStatusMessage(data.status, data.errMessage);
				if (loadUrl) {
					loadContent(loadUrl);
				}
				naviTreeManager.invalidateContentpane();
				naviTreeManager.refreshContentpane();
				d.callback(data);
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: (fileupload)?"text/html":"text/json",
			formNode: form
		});
		//mySequenceDialog.setContent('<div style="position: absolute;  top: 40%; left: 50%;"><img src="/images/progress.gif"><br><i>thinking...</i></div>');
		return d;
	};
	this.submitSequenceDelete = function(url, aobj) {
		//var toggleEvent = this.onDataToggle;
		//this.onDataToggle = undefined; 
		var table = dojo.widget.byId("sequenceTable");
		var d = new dojo.Deferred();
		dojo.io.bind ( {
			url: url,
			load: function (type, data, evt) {
				if (data) updateStatusMessage(data.status, data.errMessage);
				var trobj = aobj.parentNode;
				while(!trobj.tagName.match(/tr/i)) {
					trobj = trobj.parentNode;
				}
				var trId = trobj.getAttribute("value");
				dojo.lfx.combine (
                	dojo.lfx.highlight(trobj, [230, 180, 180], 400) ,
                    dojo.lfx.fadeHide(trobj, 400, null, function() {
                        	trobj.parentNode.removeChild(trobj);
							table.store.removeDataByIndex(trId);
                    }) 
                ).play();
                document.getElementById("totalSeqs").innerHTML = (document.getElementById("totalSeqs").innerHTML) - 1;
				d.callback(data);
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: "text/json"
		});
		//this.onDataToggle = toggleEvent;
		return d;
	};
	this.submitSearch = function (e, st, p, url){
		var keynum;
		var keychar;
		var numcheck;
	
		if(window.event) // IE
		{
			keynum = e.keyCode;
		} 
		else if(e.which) // Netscape/Firefox/Opera
		{
			keynum = e.which;
		}

		if( keynum == 13 ) {
			if( p == "s" )
				this.loadContent(url+'?st='+st);
			document.onkeyup = null;
		}
	};
	
	this.copySelectedArticles = function (div) {
		var newDiv = document.createElement('div');
		newDiv.innerHTML = dojo.byId(div).innerHTML;
		var rows = newDiv.getElementsByTagName('tr');
		var cell;
		var index;
		for (index = 0; index < rows.length; index++) {
			cell=rows[index].getElementsByTagName('input')[0];
			if (cell && !cell.checked) {
				rows[index].style.display = "none";
			}
		}
		return newDiv;
	};
	this.printDiv = function(div) {
		pw=window.open("about:blank", "Articles", 'width=700, height=500, scrollbars=yes, resizable=yes');
		pw.document.open();
		var text = this.copySelectedArticles(div).innerHTML;
		var content = "<html><head><link rel='stylesheet' type='text/css' href='/css/smartnote.css'></link><style type='text/css'>.relatedArticles, .articleCheckbox{display:none;}</style><script type='text/javascript'>function step1(){setTimeout('step2()',10);}function step2(){window.print();window.close();}</scr"+"ipt></head><body onLoad='step1()'>"+text+"</body></html>";
		pw.document.write(content);
		pw.document.close();
	};
	this.showArticle = function(pmid) {
		pw=window.open("http://www.ncbi.nlm.nih.gov/pubmed/"+pmid, "Articles", 'width=700, height=500, scrollbars=yes, resizable=yes');
	};
	this.emailArticle = function (div) {
		//pw=window.open("about:blank", "Articles", 'width=800, height=500, scrollbars=yes, resizable=yes');
		//pw.document.open();
		var text = this.copySelectedArticles(div).innerHTML;
		var articleTable = "<link rel='stylesheet' type='text/css' href='"+location.protocol+'//'+location.host+"/css/smartnote.css'></link><style type='text/css'>.relatedArticles, .articleCheckbox{display:none;}</style>"+text;
		var emails= '' +
        '<div>'+
            "<button class='floatright' onclick='mySequenceManager.close();'>Cancel</button>"+
            "<button class='floatright' onclick='mySequenceManager.sendEmailArticle();'>Done</button>"+
        "</div>"+
		"<div>"+
            "<form id='emailArticlesForm' name='emailArticlesForm' method='POST' enctype='multipart/form-data' action='/leftcontent/emailArticles.php'>"+
                "<table><tbody>"+
                    "<tr><td colspan='2'>PubMed Articles</td>"+
                    "</tr><tr><td>Email address:</td><td><input type='text' name='email' id='emailArticlesEmail' size='70' value=''></td>"+
                    "</tr><tr><td>Subject:</td><td><input type='text' name='subject' id='emailArticlesSubject' value='"+dojo.byId('nickname').innerHTML+" invites you to view these articles' size='70'></td>"+
                    "</tr><tr><td>Message:</td><td><textarea cols='55' rows='15' name='body' id='emailArticlesBody'>"+
"These articles may be of interest to you. Please take a look.\n\n"+

"If you have not registered yet, please click the link below to register and start using SmartNote:\n"+
                    
"<a href='http://smartnote.miraibio.com/register.php'>SmartNote Registration</a>\n\n"+

"Thank you,\n"+
dojo.byId('nickname').innerHTML+"\n\n"+


"This is a post-only mailing. Replies to this message are not monitored or answered.</textarea></td>"+
                "</table>"+
                "<br /> <br />"+
                "<div id='articles'>"+articleTable+"\n\n"+"<input name='articleTable' type='hidden' value=''>"+
                "</div>"+
            "</form>"+
        "</div>";
		
		var content = "<html><head></head><body>"+emails+"</body></html>";
		this.setContent(emails);
		dojo.byId('emailArticlesForm').articleTable.value = articleTable;
		//pw.document.write(content);
		//pw.document.close();
		
	};
	this.submitForm = function (formID, url) {
			form = dojo.byId(formID);
			dojo.io.bind ( {
				url: url,
				load: function (type, data, evt) {
				},
				error: function(type, error){dojo.debug(error.message);},
				mimetype: "text/json",
				formNode: form
			});
	};
	this.sendEmailArticle = function () {
		if (dojo.byId('emailArticlesEmail').value) {
			this.submitForm('emailArticlesForm','/leftcontent/emailArticles.php');
			this.close();
			return false;
		} else {
			alert ('Please enter email addresses separated by semicolon.');
			return false;
		}
	};
	this.saveArticle = function () {
			var articlecheckboxes = document.getElementsByName('articlelist[]');
			var articles = '';
			var index;
			for (index=0; index<articlecheckboxes.length; index++) {
				if (articlecheckboxes[index].checked) {
					if (articles != '') articles += ';';
					articles += articlecheckboxes[index].value;
				}
			}
				dojo.io.bind ( {
					url: '/leftcontent/articles.php?action=savearticles&articles='+articles,
					load: function (type, data, evt) {
						naviTreeManager.updateNewNode(data.objectId);
					},
					error: function(type, error){},
					mimetype: "text/json"
				});
			//this.loadContent('/leftcontent/articles.php?action=savearticles&articles='+articles);
			this.close();
	};
};
var myFriendsManager = new function () {
	var myFriendsDialog;
	var _t = this;
	this.init = function () {
		createMyFriendsDialog ();
	};
	function createMyFriendsDialog () {
        //dojo.require("dojo.widget.FloatingPane");
		var srcNode = document.createElement('div');
		srcNode.id='myFriendsPane';
		//srcNode.innerHTML = "<table dojoType='filteringTable' id='sequenceTable' multiple='true' alternateRows='true'><thead><tr><th field='checkbox' dataType='html'></th><th field='Accession' dataType='String'>Accession</th><th field='Name' dataType='String'>Name</th><th field='Length' dataType='Number'>Length</th></tr></thead></table><input type='button' value='Close' id='closeSequence' />";
		srcNode.innerHTML = '';
		srcNode.style.width = Math.round(dojo.body().clientWidth * 0.8) + "px";
		srcNode.style.height = Math.round(dojo.body().clientHeight * 0.8) + "px";
		srcNode.style.top = Math.round(dojo.body().clientHeight * 0.1) + "px";
		srcNode.style.left = Math.round(dojo.body().clientWidth * 0.1) + "px";
		srcNode.style.display = 'none';
		document.body.appendChild(srcNode);
		myFriendsDialog=dojo.widget.createWidget("FloatingPane", {widgetId:'myFriendsPane',title:'Invite friends', cacheContent:false, scriptSeparation:false, constrainToContainer:true, executeScripts:true, extractContent:false, adjustPaths:false, resizable:true, displayCloseAction:false}, srcNode);
		myFriendsDialog.onDownloadStart = function (e) {e.returnValue=false;};
		myFriendsDialog.hide();
	}
	
	/*
	function createMySequenceDialog() {
		var srcNode = document.createElement('div');
		srcNode.id='mySequenceDialog';
		srcNode.innerHTML = "";
		//srcNode.innerHTML = '';
		//srcNode.style.width="600px";
		//srcNode.style.height="300px";
		//srcNode.style.top="200px";
		//srcNode.style.left="200px";
		document.body.appendChild(srcNode);
		mySequenceDialog = dojo.widget.createWidget("Dialog", {widgetId:'mySequenceDialog', cacheContent:false, bgColor:"black",bgOpacity:"0.2"}, srcNode);
		mySequenceDialog.onDownloadStart = function (e) {e.returnValue=false;};
		mySequenceDialog.domNode.style.zIndex=50;
		mySequenceDialog.bg.style.zIndex=49;
	}
	*/
	this.onDataToggle = function (obj) {
		if (obj) {
			var id = obj.Id;
			var row = this.store.getByKey(id);
			var src = this.store.getDataByKey(id);
			if (row.isSelected) {
				this.getRow(obj).cells[0].childNodes[0].setAttribute('checked','checked');
			} else {
				if (dojo.render.html.ie) {
					this.getRow(obj).cells[0].childNodes[0].checked=false;
				} else {
					this.getRow(obj).cells[0].childNodes[0].removeAttribute('checked');
				}
			}
		}
	}
	this.onDataSelect = function (obj) {
		var id = obj.Id;
		var row = this.store.getByKey(id);
		var src = this.store.getDataByKey(id);
		this.getRow(obj).cells[0].childNodes[0].setAttribute('checked','checked');
	}
	this.onDataUnselect = function (obj) {
		var id = obj.Id;
		var row = this.store.getByKey(id);
		var src = this.store.getDataByKey(id);
		if (dojo.render.html.ie) {
			this.getRow(obj).cells[0].childNodes[0].checked=false;
		} else {
			this.getRow(obj).cells[0].childNodes[0].removeAttribute('checked');
		}
	}
	this.loadContent = function (url) {
		var fullurl = /http/i;
		if (!fullurl.test(url)) {
			var protoHost = location.protocol+'//'+location.host;
			var d=myFriendsDialog.setUrl(protoHost+url);
		} else {
			myFriendsDialog.setUrl(url);
		}
		//mySequenceDialog.refresh();
		/*
		mySequenceDialog.domNode.style.width="600px";
		mySequenceDialog.domNode.style.height="350px";
		mySequenceDialog.domNode.style.top="200px";
		mySequenceDialog.domNode.style.left="200px";
		mySequenceDialog.domNode.style.overflow = "auto";
		*/

		myFriendsDialog.show();
		//d.addCallback(_t.show);
	}
	this.show = function () {
		hideAllDialogs();
		myFriendsDialog.show();
	}
	this.close = function () {
		myFriendsDialog.hide();
	}
	this.getFriendsEmail = function () {
		//var protoHost = location.protocol+'//'+location.host;
		//var d=mySequenceDialog.setUrl(protoHost+url);
		
		var friendemail=document.forms['emailaccount'].emailaddress.value;
		var accountname=document.forms['emailaccount'].accountname.value;
		var accountdomain=document.forms['emailaccount'].accountdomain.value;
		var accountpassword=document.forms['emailaccount'].accountpassword.value;
		//var noShare=document.forms['emailaccount'].noShare.value;
		var noShare = '';
		if (document.forms['emailaccount'].noShare.checked) {
			noShare = 1;
		}
		else noShare = 0;
		//alert('noShare: '+noShare);
		if (friendemail!='') {
			this.loadContent('/leftcontent/myFriends.php?action=sendemail&email='+friendemail+'&noShare='+noShare);
			return;
		}
		if ((friendemail=='')&&(accountname=='')&&(accountdomain<0)&&(accountpassword==0)) {
			alert('Please fill out the form before you continue.')
			return;
		}
		if (accountname == '') {
			alert('Please enter email name.');
			return;
		}
		if (accountdomain < 0) {
			alert ('Please select an email domain name.');
			return;
		}
		if (accountpassword == '') {
			alert ('Please enter account password.');
			return;
		}
		this.loadContent('/leftcontent/myFriends.php?action=emaillist&accountname='+accountname+'&accountdomain='+accountdomain+'&accountpassword='+accountpassword+'&noShare='+noShare);
		return;
	}
	this.submitEmailList = function () {
			var emailcheckboxes = document.getElementsByName('emaillist[]');
			var noShare = document.getElementById('noShare').value;
			var friendemails = '';
			var index;
			for (index=0; index<emailcheckboxes.length; index++) {
				if (emailcheckboxes[index].checked) {
					if (friendemails != '') friendemails += ';';
					friendemails += emailcheckboxes[index].value;
				}
			}
			this.loadContent('/leftcontent/myFriends.php?action=sendemail&email='+friendemails+'&noShare='+noShare);
	}
};

var resizeManager = new function () {
	/*var headerSize = 126;*/
	var headerSize = 156;
	var footerSize = 14;
  	var myWidth = 0, myHeight = 0;
  	
 	
  	
  	this.resize = function () {
  		var newWidth, newHeight;
  		if( typeof( window.innerWidth ) == 'number' ) {
    	//Non-IE
    		newWidth = window.innerWidth;
    		newHeight = window.innerHeight;
  		} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    		//IE 6+ in 'standards compliant mode'
    		newWidth = document.documentElement.clientWidth;
    		newHeight = document.documentElement.clientHeight;
  		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    		//IE 4 compatible
    		newWidth = document.body.clientWidth;
    		newHeight = document.body.clientHeight;
  		}
  		if (myHeight != newHeight) {
  			document.getElementById('outerContainer').style.height = (newHeight - headerSize-footerSize)+'px';
  			dojo.widget.byId('mainContainer').checkSize();
  		}
  		if (document.styleSheets) {
  			var myRules = document.styleSheets[0].cssRules?document.styleSheets[0].cssRules:document.styleSheets[0].rules;
  			for (var i=0; i < myRules.length; i++) {
  				if (myRules[i].selectorText == '#mainContainer #contentpane #org_div2') {
  					myRules[i].style.height = (dojo.byId('mainContainer').clientHeight - 34)+'px';
  					break;
  				}
  			}
  		}
  			
  			
  		myHeight = newHeight;
  		myWidth = newWidth;
  		//document.getElementById('org_div2').style.height=(dojo.byId("contentpane").height-34)+'px';
  	};
  	
}


function addDojoMethods () {
  	// set isFF property
  	if (dojo.render.html.mozilla) {
  		dojo.isFF = parseFloat(dojo.render.html.UA.split("Firefox/")[1]) || undefined;
  	}
  	dojo.isSafari = dojo.render.html.safari;
  	dojo.isIE = dojo.render.html.ie;
    var gcs;
    if(dojo.isSafari){
		gcs = function(/*DomNode*/node){
        	var s;
        	if(node instanceof HTMLElement){
        		var dv = node.ownerDocument.defaultView;
            	s = dv.getComputedStyle(node, null);
            	if(!s && node.style){
            		node.style.display = "";
                	s = dv.getComputedStyle(node, null);
            	}
        	}
         	return s || {};
        };
    }else if(dojo.isIE){
        gcs = function(node){
        	// IE (as of 7) doesn't expose Element like sane browsers
        	return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {};
        	};
    }else{
        gcs = function(node){
            return node instanceof HTMLElement ? node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
        };
    }
    dojo.getComputedStyle = gcs;
    if(!dojo.isIE){
    	dojo._toPixelValue = function(element, value){
                        // style values can be floats, client code may want
                        // to round for integer pixels.
                        return parseFloat(value) || 0;
        };
	}else{
        dojo._toPixelValue = function(element, avalue){
        	if(!avalue){ return 0; }
                        // on IE7, medium is usually 4 pixels
            if(avalue=="medium"){ return 4; }
                        // style values can be floats, client code may
                        // want to round this value for integer pixels.
            if(avalue.slice && (avalue.slice(-2)=='px')){ return parseFloat(avalue); }
            with(element){
            	var sLeft = style.left;
                var rsLeft = runtimeStyle.left;
                runtimeStyle.left = currentStyle.left;
                try{
                                        // 'avalue' may be incompatible with style.left, which can cause IE to throw
                                        // this has been observed for border widths using "thin", "medium", "thick" constants
                                        // those particular constants could be trapped by a lookup
                                        // but perhaps there are more
                	style.left = avalue;
                    avalue = style.pixelLeft;
                }catch(e){
                	avalue = 0;
                }
                style.left = sLeft;
                runtimeStyle.left = rsLeft;
            }
         	return avalue;
         }	
    }

    dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
                //      summary:
                //              returns an object with properties useful for noting the border
                //              dimensions.
                //
                //              * l/t = the sum of left/top border (respectively)
                //              * w = the sum of the left and right border
                //              * h = the sum of the top and bottom border
                //
                //              The w/h are used for calculating boxes.
                //              Normally application code will not need to invoke this
                //              directly, and will use the ...box... functions instead.
		var ne = "none",
            s = computedStyle||gcs(n),
            bl = (s.borderLeftStyle != ne ? dojo._toPixelValue(n, s.borderLeftWidth) : 0),
            bt = (s.borderTopStyle != ne ? dojo._toPixelValue(n, s.borderTopWidth) : 0);
        return {
                        l: bl,
                        t: bt,
                        w: bl + (s.borderRightStyle!=ne ? dojo._toPixelValue(n, s.borderRightWidth) : 0),
                        h: bt + (s.borderBottomStyle!=ne ? dojo._toPixelValue(n, s.borderBottomWidth) : 0)
		};
	}
    dojo._isBodyLtr = function(){
		//FIXME: could check html and body tags directly instead of computed style?  need to ignore case, accept empty values
		return !("_bodyLtr" in dojo) ?
                        dojo._bodyLtr = gcs(dojo.body()).direction == "ltr" :
                        dojo._bodyLtr; // Boolean
	}


  	dojo.html.scrollIntoView = function (node) {
  		node = dojo.byId(node);
		var body = node.ownerDocument.body;
		var html = body.parentNode;
		if(dojo.isFF == 2 || node == body || node == html){ // FF2 is perfect, too bad FF3 is not
			node.scrollIntoView(false); // short-circuit to native if possible
			return;
		}
		var rtl = !dojo._isBodyLtr();
		var strict = dojo.doc.compatMode != 'BackCompat'; // not the same as !dojo.isQuirks
		var scrollRoot = (strict && !dojo.isSafari)? html : body;
 
 
		function addPseudoAttrs(element){
			var parent = element.parentNode;
			var offsetParent = element.offsetParent;
			if(offsetParent == null){ // process only 1 of BODY/HTML
				element = scrollRoot;
				offsetParent = html;
				parent = null;
			}
			// all the V/H object members below are to reuse code for both directions
			element._offsetParent = (offsetParent == body)? scrollRoot : offsetParent;
			element._parent = (parent == body)? scrollRoot : parent;
			element._start = { H:element.offsetLeft, V:element.offsetTop };
			element._scroll = { H:element.scrollLeft, V:element.scrollTop };
			element._renderedSize = { H: element.offsetWidth, V: element.offsetHeight };
			var bp = dojo._getBorderExtents(element);
			element._borderStart = { H:bp.l, V:bp.t };
			element._borderSize = { H:bp.w, V:bp.h };
			element._clientSize = (element._offsetParent == html && dojo.isSafari && strict)? { H:html.clientWidth, V:html.clientHeight } : { H:element.clientWidth, V:element.clientHeight };
			element._scrollBarSize = { V: null, H: null };
			for(var dir in element._scrollBarSize){ // for both x and y directions
				var scrollBar = element._renderedSize[dir] - element._clientSize[dir] - element._borderSize[dir];
				element._scrollBarSize[dir] = (element._clientSize[dir] > 0 && scrollBar >= 15 && scrollBar <= 17)? scrollBar : 0; // sanity check
			}
			element._isScrollable = { V: null, H: null };
			for(dir in element._isScrollable){ // for both x and y directions
				var otherDir = dir=="H"? "V" : "H";
				element._isScrollable[dir] = element == scrollRoot || element._scroll[dir] || element._scrollBarSize[otherDir];
			}
		}
 
 
		var parent = node;
		while(parent != null){
			addPseudoAttrs(parent);
			var next = parent._parent;
			if(next){
				next._child = parent;
			}
			parent = next;
		}
		for(var dir in scrollRoot._renderedSize){ scrollRoot._renderedSize[dir] = Math.min(scrollRoot._clientSize[dir], scrollRoot._renderedSize[dir]); }
		var element = node;
		while(element != scrollRoot){
			parent = element._parent;
			if(parent.tagName == "TD"){
				var table = parent._parent._parent._parent; // point to TABLE
				if(table._offsetParent == element._offsetParent && parent._offsetParent != element._offsetParent){
					parent = table; // child of TD has the same offsetParent as TABLE, so skip TD, TR, and TBODY (ie. verticalslider)
				}
			}
			// check if this node and its parent share the same offsetParent
			var startIsRelative = element == scrollRoot || (parent._offsetParent != element._offsetParent);
 
 
			for(dir in element._start){ // for both x and y directions
				var otherDir = dir=="H"? "V" : "H";
				if(rtl && dir=="H" && (dojo.isSafari || dojo.isIE) && parent._clientSize.H > 0){ // scroll starts on the right
					var delta = parent.scrollWidth - parent._clientSize.H;
					if(delta > 0){ parent._scroll.H -= delta; } // match FF3 which has cool negative scrollLeft values
				}
				if(dojo.isIE && parent._offsetParent.tagName == "TABLE"){ // make it consistent with Safari and FF3 and exclude the starting TABLE border of TABLE children
					parent._start[dir] -= parent._offsetParent._borderStart[dir];
					parent._borderStart[dir] = parent._borderSize[dir] = 0;
				}
				if(parent._clientSize[dir] == 0){ // TABLE on Safari3/FF3, and TBODY on IE6/7
					parent._renderedSize[dir] = parent._clientSize[dir] = parent._child._clientSize[dir];
					if(rtl && dir=="H"){ parent._start[dir] -= parent._renderedSize[dir]; }
				}else{
					parent._renderedSize[dir] -= parent._borderSize[dir] + parent._scrollBarSize[dir];
				}
				parent._start[dir] += parent._borderStart[dir];
 
 
				// underflow = visible gap between parent and this node taking scrolling into account
				// if negative, part of the node is obscured by the parent's beginning and should be scrolled to become visible
				var underflow = element._start[dir] - (startIsRelative? 0 : parent._start[dir]) - parent._scroll[dir];
				// if positive, number of pixels obscured by the parent's end
				var overflow = underflow + element._renderedSize[dir] - parent._renderedSize[dir];
				var scrollAmount, scrollAttr = (dir=="H")? "scrollLeft" : "scrollTop";
				// see if we should scroll forward or backward
				var reverse = (dir=="H" && rtl); // flip everything
				var underflowScroll = reverse? -overflow : underflow;
				var overflowScroll = reverse? -underflow : overflow;
				if(underflowScroll <= 0){
					scrollAmount = underflowScroll;
				}else if(overflowScroll <= 0){
					scrollAmount = 0;
				}else if(underflowScroll < overflowScroll){
					scrollAmount = underflowScroll;
				}else{
					scrollAmount = overflowScroll;
				}
				var scrolledAmount = 0;
				if(scrollAmount != 0){
					var oldScroll = parent[scrollAttr];
					parent[scrollAttr] += reverse? -scrollAmount : scrollAmount; // actually perform the scroll
					scrolledAmount = parent[scrollAttr] - oldScroll; // in case the scroll failed
					underflow -= scrolledAmount;
					overflowScroll -= reverse? -scrolledAmount : scrolledAmount;
				}
				parent._renderedSize[dir] = element._renderedSize[dir] + parent._scrollBarSize[dir] - 
					// check for isScrollable since a nonscrolling parent could be smaller than the child but the child is fully visible
					((parent._isScrollable[dir] && overflowScroll > 0)? overflowScroll : 0); // only show portion of the parent
				parent._start[dir] += (underflow >= 0 || !parent._isScrollable[dir])? underflow : 0;
			}
			element = parent; // now see if the parent needs to be scrolled as well
		}
		//highlightElement(node);
  	}
}



	
dojo.addOnLoad(function() {

	addDojoMethods();	// add some 
 	if (!dojo.render.html.ie60) {
		resizeManager.resize();
		if( window.addEventListener ) {
  			window.addEventListener('resize',resizeManager.resize,false);
		} else if( document.addEventListener ) {
  			document.addEventListener('resize',resizeManager.resize,false);
		} else {
			window.onresize = resizeManager.resize;
		}
	}
	//myMenu.init();
	myDialog.create();
	naviTreeManager.init();
	treeSearchManager.init();
	mySequenceManager.init();
	myFriendsManager.init();
	var selector = dojo.widget.byId('naviTreeSelector');
	var controller = dojo.widget.byId('naviTreeController');
	var tree = dojo.widget.byId('naviTree');
	var groupTree = dojo.widget.byId('naviGroupTree');
	if(selector) {
		dojo.event.topic.subscribe(selector.eventNames['select'], naviTreeManager, 'updateContent');
	}
	var naviTreeController = dojo.widget.byId('naviTreeController');
	if(naviTreeController) {
		naviTreeManager.bindMenu(naviTreeController,'naviContextMenu');
		naviTreeManager.bindGroupMenu(naviTreeController,'naviGroupContextMenu');
		naviTreeController.expandToLevel(groupTree, 2);
		var d=naviTreeController.expandToLevel(tree, 1);
		d.addCallback(naviTreeManager.selectDefaultPage);
	}
	myMessage.init();
	myJobQueue.init();
//	if (firstPage=dojo.widget.byId('naviRootNode').children[0]) {
//		selector.select(firstPage);
//	}
    setTimeout(function(){polling.init();}, 1000);

});

dojo.addOnUnload(function() {
	var selector = dojo.widget.byId('naviTreeSelector');
	if (selector) {
		dojo.event.topic.unsubscribe(selector.eventNames['select'], naviTreeManager, 'updateContentpane');
	}
});

function hideAllDialogs () {
	mySequenceManager.hide();
	myFriendsManager.hide();
}

function updateStatusMessage (msgType, msg) {
	myMessage.add(msgType, msg);
}

function clearStatusMessage (msg) {
/*
	dojo.byId('statusmessage').innerHTML = '';
*/
	//myMessage.clear();
}

function highlightElement (element) {
	setTimeout (function () {flashBorder(element, element.style.border, "3px solid red", 6);}, 0);
}
	
function flashBorder (element, origStyle, newStyle, count) {
	if (count--) {
		element.style.border = newStyle;
		setTimeout (function () {flashBorder(element, newStyle, origStyle, count);}, 250);
	}
}

var myMessage = new function () {
	var select;
	var options;
	
	this.init = function () {
		this.select = dojo.byId('statusmessage');
		if(this.select) {
			this.options = this.select.getElementsByTagName('option');
		}
	}
	this.add = function (msgType, msg) {
		var text;
		var action;
		switch (msgType) {
			case 'error':
				msgTypeDisp = 'Error: ';
				break;
			case 'warning':
				msgTypeDisp = 'Warning: ';
				break;
			case 'ok':
				msgTypeDisp = '';
				break;
			case 'misc':
				msgTypeDisp = '';
				break;
			default:
				msgTypeDisp = '';
				msg='';
				break;
		}
		if (msg instanceof Object) {
			action = msg.action;
			text = msg.text;
		} else {
			// plain text message
			action = '';
			text = msg;
		}
		this.addToList (msgTypeDisp+text, action);
	}
	this.addToList = function (msg, action) {
		var index;
		for (index=this.options.length-1; index > 0; index--) {
			this.options[index].innerHTML = this.options[index-1].innerHTML;
			this.options[index].value = this.options[index-1].value;
			this.options[index].style.color = this.options[index-1].style.color;
		}
		this.options[0].innerHTML = msg;
		if (action != '') {
			this.options[0].style.color = "#333399";
		} else {
			this.options[0].style.color = "#333333";
		}
		this.options[0].value = action;
		this.show();
	}
	this.show = function () {
		this.select.selectedIndex = 0;
		if (this.options[0].innerHTML != '') {
			this.select.style.color = this.options[0].style.color;
		}
	}
	this.doAction = function (event) {
		var node;
		if (event.clientX > (this.select.offsetLeft+this.select.offsetWidth-20)) return true;
		if (this.options[this.select.selectedIndex].value != '') {
			// navigate to this location
			nodes=this.options[this.select.selectedIndex].value.split('-');
			naviTreeManager.updateChildNode(nodes[0], nodes[1]);
//			var d = naviTreeManager.refreshNodeById (nodes[0]);
//			d.addCallback(function() {
//							childnode = dojo.widget.byId(nodes[1]);
//							naviTreeManager.updateContentpane({node:childnode})
//			});
		}
		naviTreeManager.refreshContentpane();
		this.show();
	}
	this.clear = function () {
		this.select.selectedIndex = -1;
	}
}

var myJobQueue = new function () {
	var _t = this;
	this.init = function () {
		setTimeout (_t.updateQueue, 5000);
	};
	this.createSeqTray = function (seqs) {
		var pids = [];
		for(pid in getCart().getSelectedSequences()) {
			pids.push(pid);
		}
		var d = new dojo.Deferred();
		dojo.io.bind ({
			url: "/ajax/createSeqTray.php",
        	load: function(type, data, event) {
            	d.callback(data);
        	},
        	mimetype: 'text/json',
        	method: 'post',
        	error: function(type, error){ dojo.debug(error.message); },
        	content: { 'pids': pids.join(",") }
		});
		return d;
	};
	this.submitToQueue = function (theform, trayid) {
		var actionUrl = theform.action;
		theform.action='/queuejob.php?toolUrl='+actionUrl;
		urchinTracker('/queuejob.php?toolUrl='+actionUrl);
		var d = new dojo.Deferred();
		dojo.io.bind ( {
			url: theform.action,
			load: function (type, data, evt) {
				var d=naviTreeManager.refreshNodeById('seqTray.'+trayid);
				d.addCallback (function () {
					var resultNode;
					if (data.nodeId && (resultNode = dojo.widget.byId(data.nodeId))) {
						naviTreeManager.invalidateContentpane();
						naviTreeManager.updateContentpane({node: resultNode});
					}
					d.callback(true);
				});
				if (data) {
					if (data.errMessage) {
						for (var index=0; index < data.errMessage.length; index++) {
							updateStatusMessage (data.status, data.errMessage[index]);
						}
					}
					//myMenu.buildMenu(data.recentTools);
				}
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: "text/json",
			formNode: theform
		});
		return d;
	}
	this.updateQueue = function () {
		dojo.io.bind ( {
			url: "/notifyjob.php",
			load: function (type, data, evt) {
				if (data) {
					for (var index=0; index < data.errMessage.length; index++) {
						updateStatusMessage (data.status, data.errMessage[index]);
					}
				}
				if (data.action) {
					//alert(data.trayid);
					naviTreeManager.refreshNodeById('seqTray.'+data.trayid);
    				dojo.widget.byId('toast').setContent("<a href='#' onclick='myMessage.doAction(\""+data.action+"\");'>"+data.toolused+"</a>",'message',10000);
    				dojo.widget.byId('toast').show();					
				}
				setTimeout (_t.updateQueue, 6000);
			},
			error: function(type, error){dojo.debug(error.message);},
			mimetype: "text/json"
		});
	}
}
	
	

function startProgressIndicator () {
	clearStatusMessage();
	document.getElementById("load").style.visibility = "visible";
}
function stopProgressIndicator () {
	document.getElementById("load").style.visibility = "hidden";
}
function doNothing () {
	return false;
}

