function observeHover(element, className) {
    // A private function for handling mouse 'hovering'
    function handleHover(e) {
        // Check if mouse(over|out) are still within the same parent element
        var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;

        // Traverse up the tree
        while (p && p != element) try { p = p.parentNode; } catch(e) { p = element; }

        // If we actually just moused on to a sub-element, ignore it
        if (p == element) return false;

        // Execute the right function
        if (e.type == "mouseover") element.addClassName(className);
        else element.removeClassName(className);
        return true;
    }
    // Bind the function to the two event listeners
    Event.stopObserving(element, "mouseover", handleHover);
    Event.observe(element, "mouseover", handleHover);
    Event.stopObserving(element, "mouseout", handleHover);
    Event.observe(element, "mouseout", handleHover);
}


Behavior.register('li.track', function(element) {
        element.onclick = function() {
            $('trackCitationsContainer').toggle();
            return false;
        }
    }
);

Behavior.register('img.closePopup', function(element) {
        element.onclick = function() {
            $('trackCitationsContainer').hide();
            showSelects();
        }
    }
);

Behavior.register('img.closeJumpTo', function(element) {
        element.onclick = closeJumpToMenu;  /* defined in globalFunctions.js */
    }
);

Behavior.register('#inputImage_cancel', function(element) {
        element.onclick = function() {
            setObjDisplay(returnObjById('trackCitationsContainer'), 'none');
        }
    }
);

Behavior.register('#inputImage_go', function(element) {
		element.onclick = function() {
			var input = $('inputText_siteSearch');
			if (input && 
				(input.type == 'text') &&
				(input.value.replace(/^\s+|\s+$/g,'').length == 0)) 
			{
				alert("Enter search criteria.");
				return false;
			}
		}
	}
);

Behavior.register('#inputImage_search', function(element) {
		element.onclick = function() {
			var inputs = ['allWords', 'exactPhrase', 'atLeast', 'noneOfTheWords'];
			var valid = false;
			for (var i=0; i<inputs.length; i++) {
				var input = $(inputs[i]);
				valid |= input && 
						 (input.type == 'text') && 
						 (input.value.replace(/^\s+|\s+$/g,'').length > 0); 
			}
			if (! valid) {
				alert("Enter search criteria.");
				return false;
			}
		}
	}
);

Behavior.register('#modifySearchQueryLink', function(element) {
        element.onclick = function() {
            setObjDisplay(returnObjById('modifySearchContainer'), 'block');
            hideSelects();
        }
    }
);

Behavior.register('a.popupLink', function(element) {
        element.figInfo = function(figWidth, figHeight) {
            element.figDimension = {w:figWidth,h:figHeight};
            return false;
        }
        Event.observe(element, "click", function(event) {
            var w = 768;
            var h = 578;
            if (element.figDimension) {
                var d = element.figDimension;
                if (d.w) w = d.w + 230; // add sidebar width and some padding
                if (d.h) h = d.h + 280; // add top navigation an some space for captipn
                if (w > screen.width) w = screen.width; // do not make it bigger than the screen
                if (h > screen.height) h = screen.height;
            }
            /*setObjDisplay(returnObjById('figuresContainer'),'block');
                   hideSelects();*/
            if (document.body.id == "fullPopup") {
                // Is in popup already, reuse the window instead of opening new one with same name so we don't lose connection to original opener
                self.resizeTo(w, h);
                window.location = element.href;
            } else {
                var articlePopup = window.open(element.href, 'articlePopup', 'height=' + h + ',width=' + w + ',status=no,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes');
                if (articlePopup.focus) articlePopup.focus();
            }
            Event.stop(event);
            return false;
        }, false);
    }
);

Behavior.register('#ReturnToOpener', function(element) {
        element.onclick = function() {
            var href = element.href;
            if (href) {
                var opener = window.opener;
                if (opener && !opener.closed) {
                    opener.location.hash = href.substring(href.indexOf("#") + 1);
                } else {
                    // original window is closed, open new "full"
                    window.open(href, '_blank', 'status=yes,toolbar=yes,menubar=yes,location=yes');
                }
                self.close();
            }
        }
    }
);
//    'a.coverArt' : function(element) {
//        Event.observe(element, "click", function(event) {
//            var w = window.open(element.href, "CoverArt", 'height=490,width=560,status=no,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes');
//            if (w.focus) w.focus();
//            Event.stop(event);
//            return false;
//        });
///*
//		element.onclick = function() {
//			setObjDisplay(returnObjById('coverArtPopContainer'),'block');
//			hideSelects();
//		}
//*/
//	},
Behavior.register('a.coverArt_link', function(element) {
        element.onclick = function() {
            newWindow(element.href);
            return false;
        }
    }
);

Behavior.register('div.searchListToggleIconOpen', function(element) {
        element.onclick = function() {
            var listItems;
            if (navigator.userAgent.indexOf('MSIE')!=-1) {
                listItems = document.getElementsByClassName('selectContainer', this.parentNode);
            } else {
                listItems = this.parentNode.getElementsByClassName('selectContainer');
            }
            for (var i = 0; i < listItems.length; i++) {
                if ((listItems[i].style.display == '') || (listItems[i].style.display == 'block')) {
                    listItems[i].style.display = 'none';
                } else {
                    listItems[i].style.display = 'block';
                }
            }
            if (this.className == 'searchListToggleIconOpen') {
                this.className = 'searchListToggleIconClosed';
            } else {
                this.className = 'searchListToggleIconOpen';
            }
        }
    }
);

Behavior.register('div.searchListToggleIconClosed', function(element) {
        element.onclick = function() {
            var listItems;
            if (navigator.userAgent.indexOf('MSIE')!=-1) {
                listItems = document.getElementsByClassName('selectContainer', this.parentNode);
            } else {
                listItems = this.parentNode.getElementsByClassName('selectContainer');
            }
            for (var i = 0; i < listItems.length; i++) {
                if ((listItems[i].style.display == '') || (listItems[i].style.display == 'none')) {
                    listItems[i].style.display = 'block';
                } else {
                    listItems[i].style.display = 'none';
                }
            }
            if (this.className == 'searchListToggleIconOpen') {
                this.className = 'searchListToggleIconClosed';
            } else {
                this.className = 'searchListToggleIconOpen';
            }
        }
    }
);

Behavior.register('#alphabeticTab', function(element) {
        element.onclick = function() {
            if (this.parentNode.className == 'active') {
                //Element.removeClassName(this.parentNode, 'active');
                //setObjDisplay('searchCategoryList','none');
            } else {
                this.parentNode.className = 'alphabeticActive';
                setObjDisplay(returnObjById('searchAlphabeticList'), 'block');
                setObjDisplay(returnObjById('searchCategoryList'), 'none');
            }
            var sm = $('selectionMode');
            if (sm) {
				sm.value = 'alpha';
			}
        }
    }
);

Behavior.register('#searchAlphabeticList li input.alphaSelect', function(element) {
		element.onclick = function() {
			syncAlphaCatCbx(this, true);
			searchPub();
		}
	}
);

Behavior.register('#categoryTab', function(element) {
        element.onclick = function() {
            if (this.parentNode.className == 'active') {
                //Element.removeClassName(this.parentNode, 'active');
                //setObjDisplay('searchAlphabeticList','none');
            } else {
                this.parentNode.className = 'categoryActive';
                setObjDisplay(returnObjById('searchCategoryList'), 'block');
                setObjDisplay(returnObjById('searchAlphabeticList'), 'none');
            }
            var sm = $('selectionMode');
            if (sm) {
				sm.value = 'category';
			}
        }
    }
);

Behavior.register('#searchCategoryList li input.categorySelect', function(element) {
        element.onclick = function() {
            var arrCheckboxes;
            if (navigator.userAgent.indexOf('MSIE')!=-1) {
                arrCheckboxes = document.getElementsByClassName('checkbox', this.parentNode);
            } else {
                arrCheckboxes = this.parentNode.getElementsByClassName('checkbox');
            }
            this.checked = (!this.checked);
            var bIsChecked = this.checked;
            for (var i = 0; i < arrCheckboxes.length; i++) {
                arrCheckboxes[i].checked = (!bIsChecked);
                syncAlphaCatCbx(arrCheckboxes[i], false);
            }
            syncAlphaCatCbx(this, true);
            searchPub();
        }
    }
);

Behavior.register('#journal_collapsibleModule_articleContents', function(element) {
        var tree = $A($(element).getElementsByClassName("treeList")).first();
        if (tree && !tree.innerHTML && element.hide) element.hide();
    }
);

Behavior.register('.menu li', function(element) {
        observeHover(element, "hover");
    }
);

Behavior.register('.menu li.menuTrigger', function(element) {
        observeHover(element, "displayMenu");
    }
);

Behavior.register('#figureSearch', function(element) {
        element.onfocus_ThisMethodIsNotUsed = function() {
            if (window.FigureSearchHash) {
                Event.observe(element, "keyup", function() {
                    var v = window.FigureSearchHash[element.value];
                    if (typeof v != "undefined") {
                        if (v.indexOf("=") == 0) {
                            /* link to different popup */
                            var h = location.href;
                            var i = h.lastIndexOf("=");
                            h = h.substr(0, i) + v;
                            /* # at the end - image anchor should be appended */
                            if (v.indexOf("#") != -1) h += "img" + element.value;
                            location.href = h;
                        } else {
                            /* empty v is shortcut - key is the value */
                            if (v == '') v = element.value;
                            var e = $('img' + v);
                            if (e && e.focus) {
                                /* scroll to the image */
                                location.hash = e.id;
                                /* try to get focus back to the input field, does not work well */
                                element.focus();
                            }
                        }
                    }
                });
            }
        };
        var setParentVisibility = function(p) {
            // useful only for figure sets - hide whole figure set element when none of it's figures is visible
            if (p && p.parentNode.nodeName == 'LI') {
                var visible = p.visibleCount;
                p = $(p.parentNode);
                if (visible) p.show();
                else p.hide();
            }
        }
        var handler = function(param) {
            if (!window.figureLinks) {
                // init cache of figure/table links
                var hash = {};
                $A($('navigation').getElementsByTagName('li')).each(function (li) {
                    hash[li.getElementsByTagName("a")[0].title.toLowerCase()] = $(li);
                });
                window.figureLinks = $H(hash);
            }
            var v = element.value.toLowerCase();    // case insensitive
            var visible = "none";                   // values: "none", [the only visible element], "more"
            var p = false;
            window.figureLinks.each(function(entry) {
                var p2 = entry.value.parentNode;
                if (p2 != p) { // only when parent changes set it's visibility
                    setParentVisibility(p);
                    p = p2;
                    p.visibleCount = 0;
                }
                if (entry.key.indexOf(v) == -1) entry.value.hide();
                else {
                    entry.value.show();
                    visible = ("none" == visible) ? entry.value : "more";   // set the first visible element, or "more" for all other matches
                    p.visibleCount++;
                }
            });
            setParentVisibility(p); // set visibility for last group

            if ("none" == visible) {
                // none visible - show all again
                p = false;
                window.figureLinks.each(function(entry) {
                    var p2 = entry.value.parentNode;
                    if (p2 != p) {
                        p = p2;
                        p.visibleCount = 1;
                        setParentVisibility(p);
                    }
                    entry.value.show()
                });
            } else if ("more" != visible) {
                // it is the only one visible element - navigate to it's href
                window.location = visible.getElementsByTagName('a')[0].href;
            }
        };
        Event.observe(element, "keyup", function(event) {
            if (event.keyCode == 13) handler();                                // filter only on enter
            else if (event.keyCode == 27) { element.value = ''; handler(); }   // clear on escape
        });
        Event.observe('figureSearch_go', "click", handler);                    // click on the "Go" button
    }
);

Behavior.register('#articleListing_toc', function(element) {
        function changeAll() {
            var checked = element.checked;
            $(element.form).getInputs('checkbox', 'doi').each(function(cbx) {
                cbx.checked = checked;
            })
        }
        Event.observe(element, "change", changeAll, false);
        Event.observe(element, "click", changeAll); // for IE
    }
);

Behavior.register('a.supplementLink', function(element) {
		element.onclick = function() {
            var supplement = window.open(element.href, 'supplement', 'height=600,width=700,status=no,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes');
            supplement.focus();
            return false;
		}
    }
);

Behavior.register('.listOfIssues h3', function(element) {
        Event.observe(element, "click", function() {
            var group = element.up('li');
            if (group.hasClassName('collapsed')) {
                group.removeClassName('collapsed').addClassName('expanded');
            } else {
                group.removeClassName('expanded').addClassName('collapsed');
            }
        });
    }
);

Behavior.register('a.external', function(element) {
        Event.observe(element, "click", function(event) {
            window.open(element.href);
            Event.stop(event);
            return false;
        });
    }
);

Behavior.register('#commentaryDisclaimer a', function(element) {
        Event.observe(element, "click", function(event) {
            window.open(element.href, 'commentaryDisclaimer', 'width=450,height=220,status=no,toolbar=no,menubar=no,location=no,resizable=yes');
            Event.stop(event);
            return false;
        });
    }
);
