function setupPage(){ hookUpActiveSearch(); hookUpTabs(); suppressPostbacks(); var url_params = getUrlParams(); if (url_params != null){ loadUrlParams(url_params); }else{ loadDefaults(); } resizeDivs(); window.onresize = function(){ resizeDivs(); }; } function getUrlParams(){ var window_location = window.location.href var param_pos = window_location.search(/\?/) if (param_pos > 0){ return(window_location.slice(param_pos, window_location.length)); }else{ return(null); } } function loadUrlParams(url_param){ //get the tabs var t = getTabs(); // now find our variables var s_params = /(\?)(a=.+?)(&)(name=.*)/; var results = url_param.match(s_params); url_anchor = results[2].replace(/a=/,''); if (url_anchor.match(/M.+/)){//load the methods tab and scroller content setActiveTabAndLoadContent(t[0]); }else{ if(url_anchor.match(/C.+/)){ //load the classes tab and scroller content setActiveTabAndLoadContent(t[1]); }else{ if (url_anchor.match(/F.+/)){//load the files tab setActiveTabAndLoadContent(t[2]); }else{ // default to loading the methods setActiveTabAndLoadContent(t[0]); } } } paramLoadOfContentAnchor(url_anchor + "_link"); } function updateUrlParams(anchor_id, name){ //Also setting the page title //window.document.title = name + " method - MerbBrain.com "; //updating the window location var current_href = window.location.href; //var m_name = name.replace("?","?"); var rep_str = ".html?a=" + anchor_id + "&name=" + name; var new_href = current_href.replace(/\.html.*/, rep_str); if (new_href != current_href){ window.location.href = new_href; } } //does as it says... function hookUpActiveSearch(){ var s_field = $('searchForm').getInputs('text')[0]; //var s_field = document.forms[0].searchText; Event.observe(s_field, 'keydown', function(event) { var el = Event.element(event); var key = event.which || event.keyCode; switch (key) { case Event.KEY_RETURN: forceLoadOfContentAnchor(getCurrentAnchor()); Event.stop(event); break; case Event.KEY_UP: scrollListToElementOffset(getCurrentAnchor(),-1); break; case Event.KEY_DOWN: scrollListToElementOffset(getCurrentAnchor(),1); break; default: break; } }); Event.observe(s_field, 'keyup', function(event) { var el = Event.element(event); var key = event.which || event.keyCode; switch (key) { case Event.KEY_RETURN: Event.stop(event); break; case Event.KEY_UP: break; case Event.KEY_DOWN: break; default: scrollToName(el.value); setSavedSearch(getCurrentTab(), el.value); break; } }); Event.observe(s_field, 'keypress', function(event){ var el = Event.element(event); var key = event.which || event.keyCode; switch (key) { case Event.KEY_RETURN: Event.stop(event); break; default: break; } }); //Event.observe(document, 'keypress', function(event){ // var key = event.which || event.keyCode; // if (key == Event.KEY_TAB){ // cycleNextTab(); // Event.stop(event); // } //}); } function hookUpTabs(){ var tabs = getTabs(); for(x=0; x < tabs.length; x++) { Event.observe(tabs[x], 'click', function(event){ var el = Event.element(event); setActiveTabAndLoadContent(el); }); //tabs[x].onclick = function (){ return setActiveTabAndLoadContent(this);}; //the prototype guys say this is bad.. } } function suppressPostbacks(){ Event.observe('searchForm', 'submit', function(event){ Event.stop(event); }); } function loadDefaults(){ var t = getTabs(); setActiveTabAndLoadContent(t[0]); //default loading of the first tab } function resizeDivs(){ var inner_height = 700; if (window.innerHeight){ inner_height = window.innerHeight; //all browsers except IE use this to determine the space available inside a window. Thank you Microsoft!! }else{ if(document.documentElement.clientHeight > 0){ //IE uses this in 'strict' mode inner_height = document.documentElement.clientHeight; }else{ inner_height = document.body.clientHeight; //IE uses this in 'quirks' mode } } $('rdocContent').style.height = (inner_height - 92) + "px";//Thankfully all browsers can agree on how to set the height of a div $('listScroller').style.height = (inner_height - 88) + "px"; } //The main function for handling clicks on the tabs function setActiveTabAndLoadContent(current_tab){ changeLoadingStatus("on"); var tab_string = String(current_tab.innerHTML).strip(); //thank you ProtoType! switch (tab_string){ case "classes": setCurrentTab("classes"); loadScrollerContent('fr_class_index.html'); setSearchFieldValue(getSavedSearch("classes")); scrollToName(getSavedSearch("classes")); setSearchFocus(); break; case "files": setCurrentTab("files"); loadScrollerContent('fr_file_index.html'); setSearchFieldValue(getSavedSearch("files")); scrollToName(getSavedSearch("files")); setSearchFocus(); break; case "methods": setCurrentTab("methods"); loadScrollerContent('fr_method_index.html'); setSearchFieldValue(getSavedSearch("methods")); scrollToName(getSavedSearch("methods")); setSearchFocus(); break; default: break; } changeLoadingStatus("off"); } function cycleNextTab(){ var currentT = getCurrentTab(); var tabs = getTabs(); if (currentT == "methods"){ setActiveTabAndLoadContent(tabs[1]); setSearchFocus(); }else{ if (currentT == "classes"){ setActiveTabAndLoadContent(tabs[2]); setSearchFocus(); }else{ if (currentT == "files"){ setActiveTabAndLoadContent(tabs[0]); setSearchFocus(); } } } } function getTabs(){ return($('groupType').getElementsByTagName('li')); } var Active_Tab = ""; function getCurrentTab(){ return Active_Tab; } function setCurrentTab(tab_name){ var tabs = getTabs(); for(x=0; x < tabs.length; x++) { if(tabs[x].innerHTML.strip() == tab_name) //W00t!!! String.prototype.strip! { tabs[x].className = "activeLi"; Active_Tab = tab_name; } else { tabs[x].className = ""; } } } //These globals should not be used globally (hence the getters and setters) var File_Search = ""; var Method_Search = ""; var Class_Search = ""; function setSavedSearch(tab_name, s_val){ switch(tab_name){ case "methods": Method_Search = s_val; break; case "files": File_Search = s_val; break; case "classes": Class_Search = s_val; break; } } function getSavedSearch(tab_name){ switch(tab_name){ case "methods": return (Method_Search); break; case "files": return (File_Search); break; case "classes": return (Class_Search); break; } } //These globals handle the history stack function setListScrollerContent(s){ $('listScroller').innerHTML = s; } function setMainContent(s){ $('rdocContent').innerHTML = s; } function setSearchFieldValue(s){ document.forms[0].searchText.value = s; } function getSearchFieldValue(){ return Form.Element.getValue('searchText'); } function setSearchFocus(){ document.forms[0].searchText.focus(); } var Anchor_ID_Of_Current = null; // holds the last highlighted anchor tag in the scroll lsit function getCurrentAnchor(){ return(Anchor_ID_Of_Current); } function setCurrentAnchor(a_id){ Anchor_ID_Of_Current = a_id; } //var Index_Of_Current = 0; //holds the last highlighted index //function getCurrentIndex(){ // return (Index_Of_Current); //} //function setCurrentIndex(new_i){ // Index_Of_Current = new_i; //} function loadScrollerContent(url){ var scrollerHtml = new Ajax.Request(url, { asynchronous: false, method: 'get', onComplete: function(method_data) { setListScrollerContent(method_data.responseText); } }); } //called primarily from the links inside the scroller list //loads the main page div then jumps to the anchor/element with id function loadContent(url, anchor_id){ var mainHtml = new Ajax.Request(url, { method: 'get', onLoading: changeLoadingStatus("on"), onSuccess: function(method_data) { setMainContent(method_data.responseText);}, onComplete: function(request) { changeLoadingStatus("off"); new jumpToAnchor(anchor_id); } }); } //An alternative function that also will stuff the index history for methods, files, classes function loadIndexContent(url, anchor_id, name, scope) { if (From_URL_Param == true){ var mainHtml = new Ajax.Request(url, { method: 'get', onLoading: changeLoadingStatus("on"), onSuccess: function(method_data) { setMainContent(method_data.responseText);}, onComplete: function(request) { changeLoadingStatus("off"); updateBrowserBar(name, anchor_id, scope); new jumpToAnchor(anchor_id);} }); From_URL_Param = false; }else{ updateUrlParams(anchor_id, name); } } function updateBrowserBar(name, anchor_id, scope){ if (getCurrentTab() == "methods"){ $('browserBarInfo').update("class/module: " + scope + "  method: " + name + " "); }else{ if(getCurrentTab() == "classes"){ $('browserBarInfo').update("class/module: " + scope + "::" + name + " "); }else{ $('browserBarInfo').update("file: " + scope + "/" + name + " "); } } } // Force loads the contents of the index of the current scroller list. It does this by // pulling the onclick method out and executing it manually. function forceLoadOfContent(index_to_load){ var scroller = $('listScroller'); var a_array = scroller.getElementsByTagName('a'); if ((index_to_load >= 0) && (index_to_load < a_array.length)){ var load_element = a_array[index_to_load]; var el_text = load_element.innerHTML.strip(); setSearchFieldValue(el_text); setSavedSearch(getCurrentTab(), el_text); eval("new " + load_element.onclick); } } function forceLoadOfContentAnchor(anchor_id){ var load_element = $(anchor_id); if (load_element != null){ var el_text = load_element.innerHTML.strip(); setSearchFieldValue(el_text); scrollToAnchor(anchor_id); setSavedSearch(getCurrentTab(), el_text); eval("new " + load_element.onclick); } } var From_URL_Param = false; function paramLoadOfContentAnchor(anchor_id){ From_URL_Param = true; forceLoadOfContentAnchor(anchor_id); } //this handles the up/down keystrokes to move the selection of items in the list function scrollListToElementOffset(anchor_id, offset){ var scroller = $('listScroller'); var a_array = scroller.getElementsByTagName('a'); var current_index = findIndexOfAnchor(a_array, anchor_id); if ((current_index >= 0) && (current_index < a_array.length)){ scrollListToAnchor(a_array[current_index + offset].id); setListActiveAnchor(a_array[current_index + offset].id); } } function findIndexOfAnchor(a_array, anchor_id){ var found=false; var counter = 0; while(!found && counter < a_array.length){ if (a_array[counter].id == anchor_id){ found = true; }else{ counter +=1; } } return(counter); } function scrollToName(searcher_name){ var scroller = $('listScroller'); var a_array = scroller.getElementsByTagName('a'); if (!searcher_name.match(new RegExp(/\s+/))){ //if searcher name is blank var searcher_pattern = new RegExp("^"+searcher_name, "i"); //the "i" is for case INsensitive var found_index = -1; var found = false; var x = 0; while(!found && x < a_array.length){ if(a_array[x].innerHTML.match(searcher_pattern)){ found = true; found_index = x; } else{ x++; } } // // an attempt at binary searching... have not given up on this yet... //found_index = binSearcher(searcher_pattern, a_array, 0, a_array.length); if ((found_index >= 0) && (found_index < a_array.length)){ scrollListToAnchor(a_array[found_index].id);//scroll to the item setListActiveAnchor(a_array[found_index].id);//highlight the item } }else{ //since searcher name is blank //scrollListToIndex(a_array, 0);//scroll to the item //setListActiveItem(a_array, 0);//highlight the item } } function scrollToAnchor(anchor_id){ var scroller = $('listScroller'); if ($(anchor_id) != null){ scrollListToAnchor(anchor_id); setListActiveAnchor(anchor_id); } } function getY(element){ var y = 0; for( var e = element; e; e = e.offsetParent)//iterate the offset Parents { y += e.offsetTop; //add up the offsetTop values } //for( e = element.parentNode; e && e != document.body; e = e.parentNode) // if (e.scrollTop) y -= e.scrollTop; //subtract scrollbar values return y; } //function setListActiveItem(item_array, active_index){ // // item_array[getCurrentIndex()].className = ""; // setCurrentIndex(active_index); // item_array[getCurrentIndex()].className = "activeA"; //setting the active class name //} function setListActiveAnchor(active_anchor){ if ((getCurrentAnchor() != null) && ($(getCurrentAnchor()) != null)){ $(getCurrentAnchor()).className = ""; } setCurrentAnchor(active_anchor); $(getCurrentAnchor()).className = "activeA"; } //handles the scrolling of the list and setting of the current index //function scrollListToIndex(a_array, scroll_index){ // if (scroll_index > 0){ // var scroller = $('listScroller'); // scroller.scrollTop = getY(a_array[scroll_index]) - 120; //the -120 is what keeps it from going to the top... // } //} function scrollListToAnchor(scroll2_anchor){ var scroller = $('listScroller'); scroller.scrollTop = getY($(scroll2_anchor)) - 120; } function jumpToAnchor(anchor_id){ var contentScroller = $('rdocContent'); var a_div = $(anchor_id); contentScroller.scrollTop = getY(a_div) - 80; //80 is the offset to adjust scroll point var a_title = $(anchor_id + "_title"); a_title.style.backgroundColor = "#222"; a_title.style.color = "#FFF"; a_title.style.padding = "3px"; // a_title.style.borderBottom = "2px solid #ccc"; //other attempts //a_div.className = "activeMethod"; //setting the active class name //a_div.style.backgroundColor = "#ffc"; //var titles = a_div.getElementsByClassName("title"); //titles[0].className = "activeTitle"; } function jumpToTop(){ $('rdocContent').scrollTop = 0; } function changeLoadingStatus(status){ if (status == "on"){ $('loadingStatus').show(); } else{ $('loadingStatus').hide(); } } //************* Misc functions (mostly from the old rdocs) *********************** //snagged code from the old templating system function toggleSource( id ){ var elem var link if( document.getElementById ) { elem = document.getElementById( id ) link = document.getElementById( "l_" + id ) } else if ( document.all ) { elem = eval( "document.all." + id ) link = eval( "document.all.l_" + id ) } else return false; if( elem.style.display == "block" ) { elem.style.display = "none" link.innerHTML = "show source" } else { elem.style.display = "block" link.innerHTML = "hide source" } } function openCode( url ){ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" ) } //this function handles the ajax calling and afterits loaded the jumping to the anchor... function jsHref(url){ //alert(url); var mainHtml = new Ajax.Request(url, { method: 'get', onSuccess: function(method_data) { setMainContent(method_data.responseText);} }); } //function comparePatterns(string, regexp){ // var direction = 0; // // // return (direction) //} ////returns the index of the element //function binSearcher(regexp_pattern, list, start_index, stop_index){ // //divide the list in half // var split_point = 0; // split_point = parseInt((stop_index - start_index)/2); // direction = comparePatterns(list[split_point].innerHTML, regexp_pattern); // if(direction < 0) // return (binSearcher(regexp_pattern, list, start_index, split_point)); // else // if(direction > 0) // return (binSearcher(regexp_pattern, list, split_point, stop_index)); // else // return(split_point); // //}