			// extend basic prototype functions
			Object.extend(Element, {
				isPositioned: function(element) {
					return $(element).style.position = 'relative';
				},
				
				togglePosition: function() {
					for (var i = 0; i < arguments.length; i++) {
						var element = $(arguments[i]);
						Element[Element.isPositioned(element) ? 'makePositioned' : 'undoPositioned'](element);
					}
				}
			});
		   
		  

		    function getElementsByClass(searchClass,node,tag) {
		            var classElements = new Array();
		            if ( node == null )
		                    node = document;
		            if ( tag == null )
		                   tag = '*';
		            var els = node.getElementsByTagName(tag);
		            var elsLen = els.length;
		            var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		            for (i = 0, j = 0; i < elsLen; i++) {
		                   if ( pattern.test(els[i].className) ) {
		                           classElements[j] = els[i];
		                           j++;
		                  }
		           }
		           return classElements;
		   }

		  
			// which DD is showing now? this is the form object
			var currentDD = null;
			var currentTW = null;

			// close all dropdowns
			function hideAll (target) {
				if (currentDD != null) currentDD.style.display = 'none';
				//allNodes = document.getElementsByClassName(target);
				//for(i = 0; i < allNodes.length; i++) {
				//    allNodes[i].style.display='none';
				//		}
				}
			
			function unPositionAll (target) {
				if (currentTW != null) currentTW.style.display = 'none';
				}
			
			// build and toggle simple dropdown
			function toggleSimple (item) {
				if (currentDD != null) currentDD.style.display = 'none';
				if ($(item).style.display == "none") {
					$(item).style.display = "block";
				}
				else {
					$(item).style.display = "none";
				}
				
				//Element.toggle(item);
				currentDD = document.getElementById(item);
			}

			// build and toggle grid dropdown
			function toggleDD (item,whichContents,contentTarget,subTarget) {
				if (document.getElementById(item).style.display == 'none'){
					hideAll('codedropdown'); 
					
				// build dropdown
				var finalTarget = document.getElementById(contentTarget);
				var contents = '<select class="code" size="' + whichContents.length + '" multiple="true" name="thiscode" onchange="populateStatus(this.value, \'' + contentTarget + '\');">';
				for(i = 0; i < whichContents.length; i++) {
					contents = contents + '<option value="' + whichContents[i][0] + '">' + whichContents[i][0] + ' - ' + whichContents[i][1] + '</option>';
					}
				var contents = contents + '</select>';
				// populate parent with dropdown contents
				document.getElementById(item).innerHTML=contents;
				
				// document.getElementById(item).style.zIndex = 99999;                
                // get all the guys with class='togglerwrapper'
                document.getElementById(item).parentNode.style.zIndex = 6000;
                document.getElementById(item).style.zIndex = 6000;
                
                items = document.getElementsByClassName('dropdownwrapper','multigrid');
                
              	var i=0;
     		
                items.each(function(element){
               			// if the item different from the element from which the click event was started - restart zIndex
                		if(element != $(item).parentNode){
                			element.style.zIndex = 0;
                   	 	}
                   	 
                 });
              	
				// toggle dropdown
				
				}
				Element.toggle(item);
				currentDD = document.getElementById(item);
				}
			
			function toggleTW (item) {
				if (document.getElementById(item).style.position == 'relative'){
//					unPositionAll('togglerwrapper');
					}
				Element.togglePosition(item);
				currentTW = document.getElementById(item);
				}
			
			// populate textfield
			function populateStatus (finalvalue,element) {
				//alert('finalvalue = ' + finalvalue + ' | element = ' + element);
				document.getElementById(element).value = finalvalue;
				Element.hide(element+'input');
				}

			// populate textfield
			function populateStatusOld (element,contents,subElement) {
				document.getElementById(element).value=contents;
				if (subElement != 'undefined') {
					document.getElementById(subElement).innerHTML=contents;
					}
				Element.hide(element+'input');
				}

			// confirm deletion	
			function deleteConfirm (deletionTarget) {
				return deleteConfirmMsg(deletionTarget, "Are you sure you want to delete this?");
			}			
			
			function deleteConfirmMsg(deletionTarget, msg) {
				var element = document.getElementById(deletionTarget);
				var originalStyle = element.style.background;
				element.style.background='#ffffc3';
				var result = confirm(msg);
				if (!result) {
					// restore original style
					element.style.background = originalStyle;
				}
				return result;
			}
			
			// confirm deletion	
			function removeConfirm (groupName, formID, nameOfCheckboxes) {
				// TODO need to highlight or list the affected sites
				
				var form = document.getElementById(formID);
				var count = form.elements.length;
				var anyChecked = false;
				var originalStyle = new Object();
			    for (i=0; i < count; i++) {
			    	var e = form.elements[i];
			    	if ((e.name == nameOfCheckboxes) && (e.type == "checkbox") && (e.checked == true)) {
			    		anyChecked = true;
			    		var element = document.getElementById(e.id);
			    		originalStyle[e.id] = element.style.background;
			    		element.style.background='#ffffc3';
			    	}
				}
				if (!anyChecked) {
					alert('Please select the nest sites you wish to remove from ' + groupName + '.');
					return false;
				}
		
				var result = confirm('Are you sure you want to remove the selected nest site(s) from ' + groupName + '? \n\n The nest sites will not be deleted, just removed.');
				if (!result) {
					for(var key in originalStyle) {
						var element = document.getElementById(key);
						element.style.background = originalStyle[key];
					}
				}
				return result;
			}
			
			// toggle elements by class	
			function toggleElements (elementClass,elementParent) {
				
				allElements = document.getElementsByClassName(elementClass,elementParent);
				for(i = 0; i < allElements.length; i++) {
				    Element.toggle(allElements[i]);
				}
			}

			// add a row to multigrid
			/*
			function addRow (targetTable,rowContentSource) {
				rowFinalSource = document.getElementsByClassName(rowContentSource);
			    rowUltraFinalSource = rowFinalSource[0].innerHTML;
				new Insertion.Bottom(targetTable,rowUltraFinalSource)
				}
			*/
		
			function submitForm(formID, hiddenCmdName, cmdValue) {
				var form = document.getElementById(formID);
				form[hiddenCmdName].value = cmdValue;
				form.submit();
			}
						
			function submitSortForm(formName, hiddenCmdName, cmdValue, hiddenColumnName, columnValue) {
				var form = document[formName];
				form[hiddenCmdName].value = cmdValue;
				form[hiddenColumnName].value = columnValue;
				form.submit();
			}
			
			function notImplemented() {
				alert('This feature is not yet implemented.');
			}
			
			function setAllCheckBoxes(formID, nameOfPrototypeCheckbox, nameOfCheckboxes) {
				var form = document.getElementById(formID);
				
				var count = form.elements.length;
				var myChecked = form[nameOfPrototypeCheckbox].checked;
			    for (i=0; i < count; i++) {
			    	var e = form.elements[i];
			    	if ((e.name == nameOfCheckboxes) && (e.type == "checkbox")) {
			    		e.checked = myChecked;
			    	}
				}
			}

			// Cancel the search for species by name			
			function cancelSpeciesSearch(searchCriteriaName, matchesDivName, selectListName) {
				// unselect any selected match
				var selectList = document.getElementById(selectListName);
				selectList.selectedIndex = -1;
				
				// hide the results div
				var matchesDiv = document.getElementById(matchesDivName);
				Element.toggle(matchesDiv);
				
				// hide the search string
				var searchBox = document.getElementById(searchCriteriaName);
				searchBox.value = null;
			}

			function setFocus(target) {
				hideAll('codedropdown');
				Element.addClassName(target,'focused');
				target.select();
			}

			function killFocus(target) {
				Element.removeClassName(target,'focused');
			}

			function focusGrid(targetItem) {
				$(targetItem).focus();
			}

			function hideSpeciesList(originalSpeciesListDivName) {
				var originalSpeciesListDiv = document.getElementById(originalSpeciesListDivName);
				Element.toggle(originalSpeciesListDiv);
			}
			
			// Cancel the search for species by name			
			function cancelSpeciesSearch2(searchCriteriaName, resultResultsDivName, searchResultsSelectListName, originalSpeciesListDivName) {
			
				var originalSpeciesListDiv = document.getElementById(originalSpeciesListDivName);
				Element.toggle(originalSpeciesListDiv);
			
				// unselect any selected match from the search results
				var searchResultsSelectList = document.getElementById(searchResultsSelectListName);
				if (searchResultsSelectList)
					searchResultsSelectList.selectedIndex = -1;
				
				// hide the species search results div
				var resultResultsDiv = document.getElementById(resultResultsDivName);
				Element.toggle(resultResultsDiv);
				
				// hide the search string
				var searchBox = document.getElementById(searchCriteriaName);
				searchBox.value = null;
			}				
			
			
			function glossaryPop(url) {
			    w = window.open(url, "Glossary", "toolbar=no,status=yes,width=400,height=300,directories=no,scrollbars=no,location=no,resizable=yes,menubar=no");
			    w.focus();
			}

			function checkChange(targetElement, toggleElement, focusElement) {
				var focus_value = $(focusElement).value;
				var target_value = $(targetElement).value;
				if (target_value || focus_value) {
					Element.show(toggleElement);
					$(focusElement).focus();
				} else {
					Element.hide(toggleElement);
				}
			}

			function messagefocus(whichtarget) {
				$(whichtarget).focus();
			}
			