// New Media Web site user interface functions
// by John Bell and Jon
// version 1.9
// Modified by Jon to enable toggling of all preferences with one command.
// Note that dot syntax in function names is just a naming convention.

/* ______ Register News, Feed, and Extras (Basics/Prefs) display _______ */
teasers = new Object(); // Divs containing short descriptions of news stories.
feeds = new Object(); // Divs containing external RSS links.
extras = new Object() ; // Divs containing collapsible panels.
teasers.registry = new Array();
feeds.registry = new Array();extras.registry = new Array() ;

teasers.register = function(divName, newsType){
	if(!defined(teasers.registry[newsType])) teasers.registry[newsType] = new Array();
	teasers.registry[newsType].push(document.getElementById(divName));
	document.getElementById(divName).style.display="block";
}
feeds.register = function(divName){
	feeds.registry[divName] = document.getElementById(divName);
	document.getElementById(divName).style.display="block";
}
extras.register = function(divName, displayConditions){
    // yecch("REGISTERING " + divName + " AS " + displayConditions);
	if(!defined(extras.registry[displayConditions])) extras.registry[displayConditions] = new Array();
	extras.registry[displayConditions].push(document.getElementById(divName));
	document.getElementById(divName).style.display="block"; // OK?
	// yecch("DONE.")
}
/* ______ Toggle display of News and Feeds. _______ */
teasers.toggle = function(newsType){
	if(defined(teasers.registry[newsType])){
        // Toggle display of teasers.
		var divObject = teasers.registry[newsType][0];
		var displaySetting = divObject.style.display=="block" ? "none" : "block";
		for(var i=0; i<teasers.registry[newsType].length; i++){
			divObject = teasers.registry[newsType][i];
			divObject.style.display = displaySetting;
		}
		// Toggle display of story tallies.
		var tallyObject = document.getElementById("tally-" + newsType) ;
		tallyObject.className = tallyObject.className=="tally" ? "tally-ghost" : "tally" ;		
	}
	if(!defined(displaySetting)) var displaySetting = "none";
	return displaySetting;
}
feeds.toggle = function(feedName){
	feeds.registry[feedName].style.display = feeds.registry[feedName].style.display=="block" ? "none" : "block";
	return feeds.registry[feedName].style.display;
}

/* _______ Control Extras (Basics and Preferences) display _______ */
// Requires that the isLoggedIn and button flags be set in PHP.
// UPGRADE: Revised to call registries instead of all divs.
function initializeDefaultDisplays(argObj) {
    isLoggedIn = argObj.isLoggedIn ;
    if ( !defined(isLoggedIn) ) isLoggedIn = false; // Just a safeguard.
    // Go through all divs in the Extras registry, sorted by displayConditions (same as class names).
    /* --------- Div-based toggling --------- */ 
    // For each div, set initial displays of collapsible blocks, and
    // activate toggleDisplay when user clicks on header.
    if (extras.registry["content-collapsed-for-login"]) {
        for (var divNum=0; divNum<extras.registry["content-collapsed-for-login"].length; divNum++) {
            var divToCollapse = extras.registry["content-collapsed-for-login"][divNum] ;
            var togglerDiv = divToCollapse.parentNode.getElementsByTagName('div')[0] ;
            // Set rollover styles.
            togglerDiv.onmouseover = toggleStyleOver ;
            togglerDiv.onmouseout = toggleStyleBack ;
            // Set onclick behavior.
            togglerDiv.onclick = toggleDisplay ;
            // Set display based on login status.
            if ( isLoggedIn ) {
                divToCollapse.style.display="none";
            }
            else {
                divToCollapse.style.display="block";
            }
        }
    }
    if (extras.registry["content-collapsed-for-logout"]) {
        for (var divNum=0; divNum<extras.registry["content-collapsed-for-logout"].length; divNum++) {
            var divToCollapse = extras.registry["content-collapsed-for-logout"][divNum] ;
            var togglerDiv = divToCollapse.parentNode.getElementsByTagName('div')[0] ;
            // Set rollover styles.
            togglerDiv.onmouseover = toggleStyleOver ;
            togglerDiv.onmouseout = toggleStyleBack ;
            // Set onclick behavior.
            togglerDiv.onclick = toggleDisplay ;
            // Set display based on login status.
            if ( isLoggedIn ) {
                divToCollapse.style.display="block";
            }
            else {
                divToCollapse.style.display="none";
            }
        }
    }
    if (extras.registry["content-collapsed-for-all"]) {
        for (var divNum=0; divNum<extras.registry["content-collapsed-for-all"].length; divNum++) {
            var divToCollapse = extras.registry["content-collapsed-for-all"][divNum] ;
            var togglerDiv = divToCollapse.parentNode.getElementsByTagName('div')[0] ;
            // Set rollover styles.
            togglerDiv.onmouseover = toggleStyleOver ;
            togglerDiv.onmouseout = toggleStyleBack ;
            // Set onclick behavior.
            togglerDiv.onclick = toggleDisplay ;
            // Set display (independent of login status).
            divToCollapse.style.display="none";
        }
    }
    if (extras.registry["content-collapsed-for-none"]) {
        for (var divNum=0; divNum<extras.registry["content-collapsed-for-none"].length; divNum++) {
            var divToCollapse = extras.registry["content-collapsed-for-none"][divNum] ;
            var togglerDiv = divToCollapse.parentNode.getElementsByTagName('div')[0] ;
            // Set rollover styles.
            togglerDiv.onmouseover = toggleStyleOver ;
            togglerDiv.onmouseout = toggleStyleBack ;
            // Set onclick behavior.
            togglerDiv.onclick = toggleDisplay ;
            // Set display (independent of login status).
            divToCollapse.style.display="block";
        }
    }
    /* --------- Button-based toggling --------- */ 
    // Set initial displays of preferenced items.
    // Enable preference checkboxes."button-foo-on" is the default.    
    if (extras.registry["button-radio-on"]) {
        for (var divNum=0; divNum<extras.registry["button-radio-on"].length; divNum++) {
            var divToCollapse = extras.registry["button-radio-on"][divNum] ;
            var buttonContainer = divToCollapse.parentNode ;
            // Set rollover styles.
            buttonContainer.onmouseover = toggleButtonStyle ;
            buttonContainer.onmouseout = toggleButtonStyle ;
            if (! argObj.isButtonOn[buttonContainer.id] ) {
                toggleButton({ buttonContainerArg: buttonContainer, toggledOnLoad: true }) ;
            }
            // Set onclick behavior.
            buttonContainer.onclick = toggleButton ;
        }
    }
    if (extras.registry["button-checkbox-on"]) {
        for (var divNum=0; divNum<extras.registry["button-checkbox-on"].length; divNum++) {
            var divToCollapse = extras.registry["button-checkbox-on"][divNum] ;
            var buttonContainer = divToCollapse.parentNode ;
            // Set rollover styles.
            buttonContainer.onmouseover = toggleButtonStyle ;
            buttonContainer.onmouseout = toggleButtonStyle ;
            if (! argObj.isButtonOn[buttonContainer.id] ) {
                toggleButton({ buttonContainerArg: buttonContainer, toggledOnLoad: true }) ;
            }
            // Set onclick behavior.
            buttonContainer.onclick = toggleButton ;
        }
    }
}
// Header style toggling.
function toggleStyleOver() {
   // "this" is the toggler div.
    this.className = 'basics-header-over' ;
}
function toggleStyleBack() {
   // "this" is the toggler div.
    this.className = 'basics-header' ;
}
// Div display toggling.
function toggleDisplay() {
    // "this" is the toggler div.
    divSiblings = this.parentNode.getElementsByTagName('div') ;
    // Run through the siblings and see if any deserve toggling.
    for (var divNum = 0; divNum < divSiblings.length; divNum++ ) {
        if ( divSiblings[divNum].className == "content-collapsed-for-login" || divSiblings[divNum].className == "content-collapsed-for-logout"  || divSiblings[divNum].className == "content-collapsed-for-all" || divSiblings[divNum].className == "content-collapsed-for-none"  ) {
            // NOTE: For this test to work, you must set div displays to "block" via JS onload--not just in the stylesheet.
            if (divSiblings[divNum].style.display=="block") { // Putting divSiblings[divNum] option first prevents misfiring based on no display defined yet.
                divSiblings[divNum].style.display="none";
            }
            else {
                divSiblings[divNum].style.display="block";
            }
        }
    }
}
// Button effects.
function toggleButtonStyle() {
    // "this" is the parent of the button div.
    this.style.textDecoration = this.style.textDecoration=="underline"? "none" : "underline" ;
    this.style.cursor = "pointer" ;
    // this.style.color = "rgb(102,102,102)" ;
    /* Enable this code if you want the checkboxes and radio buttons to change on rollover.
    switch (  this.getElementsByTagName("div")[0].className  ) {
        case "button-radio-off":
             this.getElementsByTagName("div")[0].className  = "button-radio-on" ;
            break ;
        case "button-radio-on":
             this.getElementsByTagName("div")[0].className  = "button-radio-off" ;
            break ;
        case "button-checkbox-off":
             this.getElementsByTagName("div")[0].className  = "button-checkbox-on" ;
            break ;
        case "button-checkbox-on":
             this.getElementsByTagName("div")[0].className  = "button-checkbox-off" ;
            break ;        
    }
    */
}
function toggleButton(argObj) {
    // "this" is the window on load, then the div containing the button on click.
    // buttonContainerDiv.id is "trigger-foo".
    // The convoluted ifs prevent IE from choking on undefined argObj or argObj.toggledOnLoad
    if ( defined(argObj) ) { // Stupid IE kludge. I hate you, Bill!
        if (argObj.toggledOnLoad ) {
            var buttonContainerClass = argObj.buttonContainerArg.className ;
            var buttonDiv = argObj.buttonContainerArg.getElementsByTagName("div")[0] ;
            var fullId = argObj.buttonContainerArg.id ;
        }
        if ( !defined(argObj.toggledOnLoad) ) { // Passed after user clicks on preference. Repeated because of IE's choking on compound if.
            argObj.toggledOnLoad = false ;
            var buttonContainerClass = this.className ;
            var buttonDiv = this.getElementsByTagName("div")[0] ;
            var fullId = this.id ;    
        }
    }
    if ( !defined(argObj)) { // Passed after user clicks on preference.
        var buttonContainerClass = this.className ;
        var buttonDiv = this.getElementsByTagName("div")[0] ;
        var fullId = this.id ;
        var argObj = new Object() ;
        argObj.toggledOnLoad = false ;
    }
    // Trigger div ids look like "trigger-espresso", so trim off "trigger".
    var idToAdjust = fullId.substring(8) ;
    // Set buttons on or off.
    switch ( buttonDiv.className ) {
        case "button-checkbox-off" :
            buttonDiv.className = "button-checkbox-on" ;
            break ;
        case "button-checkbox-on" :
            buttonDiv.className = "button-checkbox-off" ;
            break ;
        case "button-radio-on" :
            buttonDiv.className = "button-radio-off" ;
            break ;
        case "button-radio-off" :
            buttonDiv.className = "button-radio-on" ;
            break ;
    }
    // Respond to style choices.
    switch ( buttonContainerClass ) {
        case "preferences-styles-block" :
            return false;
            /* Don't implement this until new stylesheets are in place.
            if ( idToAdjust == "espresso" ) {
                setActiveStyleSheet('default') ; 
                return false ;
            }
            else { // Enable when new stylesheets are ready.
                setActiveStyleSheet(idToAdjust) ; 
                return false ;
            }
            togglePreference(idToAdjust) ;
            */
        case "preferences-news-block" :
            var prefValue = teasers.toggle(idToAdjust) ;
            if (! argObj.toggledOnLoad ) togglePreference("news-display-"+idToAdjust, prefValue) ;
            break ;
        case "preferences-feed-block" :
            var prefValue = feeds.toggle(idToAdjust) ;
            if (! argObj.toggledOnLoad ) togglePreference("feed-display-"+idToAdjust, prefValue) ;
            break ;
    } // end switch
}
function togglePreference(prefName, prefValue) {
    // This function stores the user's preference for future sessions. DON'T CONFUSE WITH PLURAL.
    if(defined(x_setUserPref)){
	    x_setUserPref(prefName, prefValue, devnull);
    }
    window.status = "togglePreference has been called for id = " + prefName + " value = " + prefValue ;
}
preferencesOn = true ;
function togglePreferences() {
    // This function toggles whether preferences are used to display teasers. DON'T CONFUSE WITH SINGULAR.
    if (preferencesOn) {
        initializeDefaultDisplays({  isLoggedIn: true, isButtonOn: isButtonOnDefaults }) ;
        document.getElementById("preferences-panel").style.visibility = "hidden" ;
    }
    else {
        initializeDefaultDisplays({  isLoggedIn: true, isButtonOn: isButtonOnCustom }) ;    
        document.getElementById("preferences-panel").style.visibility = "visible" ;
    }
    preferencesOn = !preferencesOn ;
}
// UTILITIES.
function defined(obj){
	if(typeof obj != "undefined") return typeof obj;
	else return 0;
}

// DEBUG
function yecch(alertMessage) {
    if (   !confirm( alertMessage )   ) {
        document.body.innerHTML = "<span style='font-size: 40px; background-color: red;'>I'm outa here.</span>" ;
    }
}
function goPage(meaninglessArg) {
    alert("This option is not yet available.")
}
function yo() {alert('yo')}

function devnull(){};
