﻿// JScript File
var bridgeConfigurationCount = 0;
var previousBuildType = "";
var previousInterchange = "";
var previousAlignment = "";
var previousCrosssection = "";
var previousRank = "";
var previousScore = "";
var aspnetPrefix = "ctl00_ContentPlaceHolder1_";

//sadly, a global variable to keep track of whether or not all conditions have been met before
// submitting the AJAX request to build that bridge
var cancelAsynch = true;

//clears the text from the Search text box when user clicks inside it -- onFocus event
function clearText(textBox) 
{ 
	if(textBox.value.toUpperCase() == "SEARCH THIS SITE:")
	textBox.value = "";
}

//places the default text back into Search box when user leaves the text box -- onBlur event
function resetText(textBox) 
{
	if(textBox.value == "")
	    textBox.value = "Search this site:";
}
    
function ShowHideSpan(id)
{
	if (document.getElementById(id + "span").style.display=="block")
	{
		document.getElementById(id + "span").style.display="none";
	}
	else
	{
		document.getElementById(id + "span").style.display="block";
	}
}

function ShowSpan(id)
{
    var span = document.getElementById(id);
    if (span)
    {
        if (span.style.display != "block")
            span.style.display = "block";
        span.blur();
    }
}

function ShowHide(id)
{
	var element = document.getElementById(id);
	if (element)
	{
	    if (element.style.display=="block")
	    {
		    element.style.display="none";
	    }
	    else
	    {
		    element.style.display="block";
	    }
    }
}

//Clears text from and set focus to the text box with the given textbox id
function clearTextbox(textboxID) {
    var textbox = document.getElementById(textboxID);
    if (textbox) {
        textbox.value = "";
        textbox.focus();
    }
    return false;
}

// I have combined multiple functions into one function. This function is called
//  when the 'clear' button is clicked. 
// In addition to clearing text from all text boxes on the form except the Search text box,
//  this function also hides the Validation Div (the div that holds validations error messages)
//  and hides the results label. 
function clearAllTextBoxes(validationDivId) {
    var inputs = document.getElementsByTagName('input');
    
    //clears all text boxes
    for (var i=0; i<inputs.length;i++)
    {
        if (inputs[i].type == "text")
            if (inputs[i].id != "txtSearch")
                inputs[i].value = "";
    }
    
    //.NET creates a textarea element for multiline text boxes so
    // check for those just in case
    var textareas = document.getElementsByTagName('textarea');
    for (var i=0; i<textareas.length;i++)
    {
        textareas[i].value = "";
    }
    
    var test = document.getElementById(validationDivId);
    test.style.display = "none";
    
    //this is an asp:label control that describes the result of the submit operation.
    var resultText = document.getElementById("ctl00_ContentPlaceHolder1_result");
    if (resultText)
        resultText.style.display = "none";

    return false;
}

//does some requirement checking before submitting the asynch call to get bridge data. If
// requirement check fails, then global variable is set to cancel the asynch call.
function buildABridge() 
{
    if (getTextInBuildTypeSpan().length == 1) {
        alert('You must select a Rehab/Replace option before you can build the bridge.');
        showBABdiv('buildTypeDiv');
        cancelAsynch = true;
        return false;
    }
    if (!isOptionSelected("intersectionSelected", "Interchange", "intersectionDiv")) {
        cancelAsynch = true;
        return false;
    }    
    if (!isOptionSelected("alignmentSelected", "Alignment", "alignmentDiv")){
        cancelAsynch = true;
        return false;
    }
    if (!isOptionSelected("crosssectionSelected", "Cross-Section", "crosssectionDiv")){
        cancelAsynch = true;
        return false;
    }
    
    //we made it this far so set global variable to OK the Asynch call.
    cancelAsynch = false;
 }
 
 function processBuildABridgeResponse() { 
    //on the first configuration, do nothing to 'Previous' table; just add to the count. Otherwise.....
    if (bridgeConfigurationCount > 0)
    {
        addCurrentConfigToPreviousConfig();
    }
    
    //we have already populated the 'PreviousConfig' table so we can
    //reset the values of 'previous' to what is the current alternative
    previousBuildType = getTextInBuildTypeSpan();
    previousInterchange = getIntersection();
    previousAlignment = getAlignment();
    previousCrosssection = getCrosssection();
    previousRank = getTextFromServerSideLabel('lblRank');
    previousScore = getTextFromServerSideLabel('lblTotalScore') + ' out of 100';;
    bridgeConfigurationCount++   
    
    document.getElementById('ctl00_ContentPlaceHolder1_btnBuildABridge').setAttribute('disabled', 'disabled');
}

//take the results that are in the 'current alternative' table and insert them at the
// top of the 'Previous alternatives' table. This keeps a running record of alternatives
// and scores that the user has selected.
function addCurrentConfigToPreviousConfig()
{
    var previousTable = document.getElementById('tablePreviousConfig');
    
    if (!previousTable)
    {
        alert('Could not find the PreviousConfig table');
        return;
    }
    
    //the first time through, remove the row that says "no previous configs"
    if (bridgeConfigurationCount == 1)
        previousTable.deleteRow(0);
        
    //insert the 'Count' row
    var row = previousTable.insertRow(0);

    var oneCell = row.insertCell(0);
    oneCell.setAttribute('colSpan', '4'); 
    oneCell.style.fontWeight = 'bold';
    oneCell.style.textAlign = 'left';
    oneCell.style.paddingLeft = '0px';
    var textNode = document.createTextNode("Alternative " + bridgeConfigurationCount);
    oneCell.appendChild(textNode);
    
    //add in the remaining rows in reverse order
    row = previousTable.insertRow(1); 
    oneCell = row.insertCell(0);
    oneCell.setAttribute('colSpan', '4');
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.paddingBottom = '5px';
    var textNode = document.createTextNode("Rank: " + previousRank);
    oneCell.appendChild(textNode);
    
    row = previousTable.insertRow(1); 
    oneCell = row.insertCell(0);
    oneCell.setAttribute('colSpan', '4');
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.paddingTop = '7px';
    var textNode = document.createTextNode("Score: " + previousScore);
    oneCell.appendChild(textNode);
    
    row = previousTable.insertRow(1);
    oneCell = row.insertCell(0);
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.width = '40%';
    var italics = document.createElement('i')
    italics.appendChild(document.createTextNode("Build Type:"));
    oneCell.appendChild(italics);
    oneCell.appendChild(document.createElement('br'));
    oneCell.appendChild(document.createTextNode(previousBuildType));
    
    oneCell = row.insertCell(1);
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.width = '20%';
    italics = document.createElement('i');
    italics.appendChild(document.createTextNode("Interchange:"));
    oneCell.appendChild(italics);
    oneCell.appendChild(document.createElement('br'));
    oneCell.appendChild(document.createTextNode(previousInterchange));
    
    oneCell = row.insertCell(2);
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.width = '17%';
    italics = document.createElement('i')
    italics.appendChild(document.createTextNode("Alignment:"));
    oneCell.appendChild(italics);
    oneCell.appendChild(document.createElement('br'));
    oneCell.appendChild(document.createTextNode(previousAlignment));
    
    oneCell = row.insertCell(3);
    oneCell.setAttribute('className', 'previousConfig');
    oneCell.style.width = '23%';
    italics = document.createElement('i');
    italics.appendChild(document.createTextNode("Cross-section:"));
    oneCell.appendChild(italics);
    oneCell.appendChild(document.createElement('br'));
    oneCell.appendChild(document.createTextNode(previousCrosssection));
}

function insertAfter(parent, newElement, referenceElement){
  parent.insertBefore(newElement, referenceElement.nextSibling);
} 

/* Client-side access to querystring name=value pairs
	Version 1.2.3
	22 Jun 2005
	Adam Vandenberg
*/
function QueryString(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=QueryString_get
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length)

	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])

		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name
		
		this.params[name] = value
	}
}

function QueryString_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	
	var value=this.params[key];
	if (value==null) value=default_;
	
	return value;
}

//reads the query string of a URL to determine the place on a page
// where the page should open to, and then opens the div located
// at that area. Method is used on BuildABridge to navigate back
// to bridgeconcepts and open a particular div. By default all the
// relevant divs are closed so clicking of them will open them up.
function navigateToHashAndOpen()
{
    var qs = new QueryString();
    var cmd = qs.get('cmd','nothing there');
    var link;
    
    if (cmd != 'nothing there')
    {
        link = document.getElementById(cmd + 'link');        
        if (link){
            eval(link.onclick());  
        }       
    }
}

//toggle disabled state of rehab check boxes
function ToggleCheckbox(disabled)
{
    var detour = document.getElementById(aspnetPrefix + 'chkDetour');
    if (detour)
    {
        if (disabled == true) 
        {
            detour.checked = false;
        }
        if (detour.disabled != disabled) {
            detour.disabled = disabled;
            //another weird artifact from ASP.NET; see
            //http://will.id.au/blog/archive/2005/02/17/enabling-disabling-aspnet-checkbox-using-javascript
            detour.parentNode.disabled = disabled;
        }
    }
}

function buildTypeSelected()
{
    document.getElementById('ctl00_ContentPlaceHolder1_btnBuildABridge').removeAttribute('disabled'); 
    
    var textNode = "";
    var hiddenBuildTpye = document.getElementById(aspnetPrefix + 'hiddenBuildType');
    var buildTypeSpan = document.getElementById('buildTypeSelected');
    
    if (buildTypeSpan)
    {   
        if (document.getElementById(aspnetPrefix + 'optReplace').checked){
            textNode = document.createTextNode('Replace existing');
            hiddenBuildTpye.value = 'Replace';
        } else if (document.getElementById(aspnetPrefix + 'optRehab').checked){
            var text = "";
            if (document.getElementById(aspnetPrefix + 'chkDetour').checked)
                    text = " with detour bridge"
            textNode = document.createTextNode('Rehabilitate existing' + text); 
            hiddenBuildTpye.value = 'Rehab'; 
        } else if (document.getElementById(aspnetPrefix + 'optNewExisting').checked) {
            textNode = document.createTextNode('Rehabilitate existing for bike/ped use only, and build new for vehicles');
            hiddenBuildTpye.value = 'Rehab_Replace';
        } else {
            alert('Please select a Rehab/Replace option.');
            return;
        }
        var currentNode = buildTypeSpan.firstChild;
        buildTypeSpan.replaceChild(textNode, currentNode);
        clearYourScores();   
    }
  
    //just changed the Rehab/Replace option which sets some restrictions on the options for crosssection and alignment
    // so need to clear those option selections
    unselectAllRadioButtons();
    textNode = document.createTextNode('    ');
    var theSpan = document.getElementById('intersectionSelected');
    var currentNode = theSpan.firstChild;
    theSpan.replaceChild(textNode, currentNode); 
    
    textNode = document.createTextNode('     ');
    theSpan = document.getElementById('alignmentSelected');
    currentNode = theSpan.firstChild;
    if (currentNode)
        theSpan.replaceChild(textNode, currentNode); 
    
    textNode = document.createTextNode('     ');
    theSpan = document.getElementById('crosssectionSelected');
    currentNode = theSpan.firstChild;
    if (currentNode)
        theSpan.replaceChild(textNode, currentNode); 
    
    document.getElementById('buildTypeDiv').style.display='none';
}

//add the interchange selection
function intersectionSelected(){
    
    document.getElementById('ctl00_ContentPlaceHolder1_btnBuildABridge').removeAttribute('disabled');
    
    var imgNode = "";
    var hiddenInterchange = document.getElementById(aspnetPrefix + 'hiddenInterchange');
    var intersectionSpan = document.getElementById('intersectionSelected');
    if (intersectionSpan)
    {   
        imgNode = document.createElement('img');
        imgNode.setAttribute('height', '83px')
        imgNode.setAttribute('width', '83px')
        if (document.getElementById(aspnetPrefix + 'optRoundabout').checked) {
            hiddenInterchange.value = "Roundabout";
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/roundabout_small.gif' );
        } else if (document.getElementById(aspnetPrefix + 'optSignalized').checked) {
            hiddenInterchange.value = "Signalized";
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/signalized_small.gif');
        } else{ 
             alert('Please select an intersection type');
            return;
        }
        var currentNode = intersectionSpan.firstChild;
        intersectionSpan.replaceChild(imgNode, currentNode);   
    }
    clearYourScores();
    document.getElementById('intersectionDiv').style.display='none';
}

//add the alignment selection
function alignmentSelected() {
    
    document.getElementById('ctl00_ContentPlaceHolder1_btnBuildABridge').removeAttribute('disabled');
    
    var imgNode = "";
    var hiddenAlignment = document.getElementById(aspnetPrefix + 'hiddenAlignment');
    var alignmentSpan = document.getElementById('alignmentSelected');
    if (alignmentSpan)
    {   
        imgNode = document.createElement('img');
        imgNode.setAttribute('height', '83px')
        imgNode.setAttribute('width', '117px')
        if (document.getElementById(aspnetPrefix + 'optBlue').checked) {
            hiddenAlignment.value = 'Blue';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/blue.jpg' );
        } else if (document.getElementById(aspnetPrefix + 'optPink').checked) {
            hiddenAlignment.value = 'Pink';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/pink.jpg');
        } else if (document.getElementById(aspnetPrefix + 'optPurple').checked) {
            hiddenAlignment.value = 'Purple';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/purple.jpg');
        } else if (document.getElementById(aspnetPrefix + 'optTeal').checked) {
            hiddenAlignment.value = 'Teal';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/teal.jpg');
        } else if (document.getElementById(aspnetPrefix + 'optYellow').checked) {
            hiddenAlignment.value = 'Yellow';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/yellow.jpg');
        } else {
            alert('Please select an alignment type');
            return;
        }
        var currentNode = alignmentSpan.firstChild;
        alignmentSpan.replaceChild(imgNode, currentNode);   
    }
    clearYourScores();
    document.getElementById('alignmentDiv').style.display='none';
}

//add the cross section selection
function crosssectionSelected() {
   document.getElementById('ctl00_ContentPlaceHolder1_btnBuildABridge').removeAttribute('disabled');
   
    var imgNode = "";
    var hiddenCrosssection = document.getElementById(aspnetPrefix + 'hiddenCrosssection');
    var crosssectionSpan = document.getElementById('crosssectionSelected');
    if (crosssectionSpan)
    {   
        imgNode = document.createElement('img');
        if (document.getElementById(aspnetPrefix + 'optI31').checked) {
            hiddenCrosssection.value = 'I';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/31.gif' );
        } else if (document.getElementById(aspnetPrefix + 'optM43').checked) {
            hiddenCrosssection.value = 'M';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/M43.gif');
        } else if (document.getElementById(aspnetPrefix + 'optA53').checked) {
            hiddenCrosssection.value = 'A';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/A53.gif');
        } else if (document.getElementById(aspnetPrefix + 'optAprime53').checked) {
            hiddenCrosssection.value = 'Aprime';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/Aprime53.gif');
        } else if (document.getElementById(aspnetPrefix + 'optK57').checked) {
            hiddenCrosssection.value = 'K';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/57.gif');
        } else if (document.getElementById(aspnetPrefix + 'optN57').checked) {
            hiddenCrosssection.value = 'N';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/N57.gif');
        } else if (document.getElementById(aspnetPrefix + 'optL57').checked) {
            hiddenCrosssection.value = 'L';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/L.gif');
        } else if (document.getElementById(aspnetPrefix + 'optC64').checked) {
            hiddenCrosssection.value = 'C';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/64.gif');
        } else if (document.getElementById(aspnetPrefix + 'optCprime68').checked) {
            hiddenCrosssection.value = 'Cprime';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/68.gif');
        } else if (document.getElementById(aspnetPrefix + 'optD75').checked) {
            hiddenCrosssection.value = 'D';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/75.gif');
        } else if (document.getElementById(aspnetPrefix + 'optE77').checked) {
            hiddenCrosssection.value = 'E';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/77.gif');
        } else if (document.getElementById(aspnetPrefix + 'optF80').checked) {
            hiddenCrosssection.value = 'F';
            imgNode.setAttribute('src', 'img/BuildABridge/thumbnails/80.gif');
        } else {
        
            alert('Please select an cross-section type');
            return;
        }
        var currentNode = crosssectionSpan.firstChild;
        crosssectionSpan.replaceChild(imgNode, currentNode);   
    }
    clearYourScores();
    document.getElementById('crosssectionDiv').style.display='none';
}

//select the radio button of interest, but only if its not
// currently disabled
function selectRadio(radioButton) {
    var element = document.getElementById(aspnetPrefix + radioButton);
    if (element) {
        if (element.disabled == false)
            element.checked = true;
    }
}

//show and position the named div, but hide all other BAB divs
function showBABdiv(divName){

    var buildTypeDiv = document.getElementById('buildTypeDiv');
	var intersectionDiv = document.getElementById('intersectionDiv');
	var alignmentDiv = document.getElementById('alignmentDiv');
	var crosssectionDiv = document.getElementById('crosssectionDiv');
	
	if (buildTypeDiv) {
	    if (divName == 'buildTypeDiv') {
	        buildTypeDiv.style.position = "absolute";
	        buildTypeDiv.style.marginTop = "0px";
	        buildTypeDiv.style.marginLeft = "35px";
            buildTypeDiv.style.display = "block";
         }
	     else if (buildTypeDiv.style.display == "block")
	        buildTypeDiv.style.display = "none";
    }
    if (intersectionDiv) {
        if (divName == 'intersectionDiv') {
            if (getTextInBuildTypeSpan().length == 1) {
                alert('You must first select a Rehab/Replace option.');
                showBABdiv('buildTypeDiv');
                return;
            }
            intersectionDiv.style.position = "absolute";
            intersectionDiv.style.marginTop = "0px";
            intersectionDiv.style.marginLeft = "160px";
            intersectionDiv.style.display = "block";
	    } else if (intersectionDiv.style.display == "block")
	        intersectionDiv.style.display = "none";
    }
    if (alignmentDiv) {
        if (divName == 'alignmentDiv') {
            if (getTextInBuildTypeSpan().length == 1) {
                alert('You must select a Rehab/Replace option before selecting an alignment.');
                showBABdiv('buildTypeDiv');
                return;
            }
            setAlignmentsEnabled();
            alignmentDiv.style.position = "absolute";
            alignmentDiv.style.marginTop = "0px";
            alignmentDiv.style.marginLeft = "80px";
            alignmentDiv.style.display = "block";
	    } else if (alignmentDiv.style.display == "block")
	        alignmentDiv.style.display = "none";
    }
    if (crosssectionDiv) {
        if (divName == 'crosssectionDiv'){
            if (getTextInBuildTypeSpan().length == 1) {
                alert('You must select a Rehab/Replace option before selecting a cross-section.');
                showBABdiv('buildTypeDiv');
                return;
            }
            setCrosssectionsEnabled();
            crosssectionDiv.style.position = "absolute";
            crosssectionDiv.style.marginTop = "0px";
            crosssectionDiv.style.marginLeft = "75px";
            crosssectionDiv.style.display = "block";
	    } else if (crosssectionDiv.style.display == "block")
	        crosssectionDiv.style.display = "none";
	}
}

function getTextInBuildTypeSpan() {
    var textNode = document.getElementById('buildTypeSelected');
    if (textNode)
        return textNode.firstChild.nodeValue;
    else 
        return "ERROR";
}

//availability of alignment options depends on which Rehab/Replace option is selected. Set 
// alignments disabled/enabled based on currently selected Rehab/Replace option
// The radio buttons are serverside generated and have the weird ASPNET names & ids. 
function setAlignmentsEnabled() {
    var buildType = getBuildType();
    var optBlue = document.getElementById(aspnetPrefix + 'optBlue');
    var optPink = document.getElementById(aspnetPrefix + 'optPink');
    var optPurple = document.getElementById(aspnetPrefix + 'optPurple');
    var optTeal = document.getElementById(aspnetPrefix + 'optTeal');
    var optYellow = document.getElementById(aspnetPrefix + 'optYellow');
    
    if (buildType == "REHAB" || buildType == "TRUSS") {
        optBlue.setAttribute('disabled', 'disabled');
        optBlue.setAttribute('title', 'The blue alignment is not available for rehabilitation.');
        document.getElementById('imgBlue').src = "img/BuildABridge/Blue_screen.jpg";
        optPink.setAttribute('disabled', 'disabled');
        optPink.setAttribute('title', 'The pink alignment is not available for rehabilitation.');
        document.getElementById('imgPink').src = "img/BuildABridge/Pink_screen.jpg";
        optPurple.setAttribute('disabled', 'disabled');
        optPurple.setAttribute('title', 'The purple alignment is not available for rehabilitation.');
        document.getElementById('imgPurple').src = "img/BuildABridge/Purple_screen.jpg";
        optTeal.setAttribute('disabled', 'disabled');
        optTeal.setAttribute('title', 'The teal alignment is not available for rehabilitation.');
        document.getElementById('imgTeal').src = "img/BuildABridge/Teal_screen.jpg";
        optYellow.removeAttribute('disabled');
        optYellow.removeAttribute('title');
        document.getElementById('imgYellow').src = "img/BuildABridge/Yellow.jpg";
    } else if (buildType == "REPLACE" || buildType == "NEWEXISTING"){
        optBlue.removeAttribute('disabled');
        optBlue.removeAttribute('title');
        document.getElementById('imgBlue').src = "img/BuildABridge/Blue.jpg";
        optPink.removeAttribute('disabled');
        optPink.removeAttribute('title');
        document.getElementById('imgPink').src = "img/BuildABridge/Pink.jpg";
        optPurple.removeAttribute('disabled');
        optPurple.removeAttribute('title');
        document.getElementById('imgPurple').src = "img/BuildABridge/Purple.jpg";
        optTeal.removeAttribute('disabled');
        optTeal.removeAttribute('title');
        document.getElementById('imgTeal').src = "img/BuildABridge/Teal.jpg";
        if (buildType == "NEWEXISTING") {
            optYellow.setAttribute('disabled', 'disabled');
            optYellow.setAttribute('title', 'The Yellow alignment is not available for rehab and replace.');
            document.getElementById('imgYellow').src = "img/BuildABridge/Yellow_screen.jpg";
        } else {
            optYellow.removeAttribute('disabled');
            optYellow.removeAttribute('title');
            document.getElementById('imgYellow').src = "img/BuildABridge/Yellow.jpg";
        }
    } 
}

//availability of cross-section options depends on which Rehab/Replace option is selected. Set 
// cross-sections disabled/enabled based on currently selected Rehab/Replace option
// The radio buttons are serverside generated and have the weird ASPNET names & ids. 
function setCrosssectionsEnabled() {
    var buildType = getBuildType();
    
    var i31 = document.getElementById(aspnetPrefix + 'optI31');
    var m43 = document.getElementById(aspnetPrefix + 'optM43');
    var a53 = document.getElementById(aspnetPrefix + 'optA53');
    var aPrime53 = document.getElementById(aspnetPrefix + 'optAprime53');
    var k57 = document.getElementById(aspnetPrefix + 'optK57');
    var n57 = document.getElementById(aspnetPrefix + 'optN57');
    var l57 = document.getElementById(aspnetPrefix + 'optL57');
    var c64 = document.getElementById(aspnetPrefix + 'optC64');
    var cPrime68 = document.getElementById(aspnetPrefix + 'optCprime68');
    var d75 = document.getElementById(aspnetPrefix + 'optD75');
    var e77 = document.getElementById(aspnetPrefix + 'optE77');
    var f80 = document.getElementById(aspnetPrefix + 'optF80');
    
    if (buildType == "REHAB") {
        i31.removeAttribute('disabled');
        i31.removeAttribute('title');
        document.getElementById('imgI31').src = "img/BuildABridge/31.gif";
        m43.setAttribute('disabled', 'disabled');
        m43.setAttribute("title", "Cross-section \"M\" is not available for rehabiliation.");
        document.getElementById('imgM43').src = "img/BuildABridge/M43_gray.gif";
        a53.removeAttribute('disabled');
        a53.removeAttribute('title');
        document.getElementById('imgA53').src = "img/BuildABridge/53.gif";
        aPrime53.setAttribute('disabled', 'disabled');
        aPrime53.setAttribute("title", "Cross-section \"A\'\" is not available for rehabiliation.");
        document.getElementById('imgAprime53').src = "img/BuildABridge/53_gray.gif";
        k57.setAttribute('disabled', 'disabled');
        k57.setAttribute("title", "Cross-section \"K\" is not available for rehabiliation.");
        document.getElementById('imgK57').src = "img/BuildABridge/57_gray.gif";
        n57.setAttribute('disabled', 'disabled');
        n57.setAttribute("title", "Cross-section \"N\" is not available for rehabiliation.");
        document.getElementById('imgN57').src = "img/BuildABridge/N57_gray.gif";
        l57.removeAttribute('disabled');
        l57.removeAttribute('title');
        document.getElementById('imgL57').src = "img/BuildABridge/L.gif";
        c64.setAttribute('disabled', 'disabled');
        c64.setAttribute("title", "Cross-section \"C\" is not available for rehabiliation.");  
        document.getElementById('imgC64').src = "img/BuildABridge/64_gray.gif";
        cPrime68.setAttribute('disabled', 'disabled');
        cPrime68.setAttribute("title", "Cross-section \"C\'\" is not available for rehabiliation."); 
        document.getElementById('imgCprime68').src = "img/BuildABridge/68_gray.gif";
        d75.setAttribute('disabled', 'disabled');
        d75.setAttribute("title", "Cross-section \"D\" is not available for rehabiliation.");  
        document.getElementById('imgD75').src = "img/BuildABridge/75_gray.gif";
        e77.setAttribute('disabled', 'disabled');
        e77.setAttribute("title", "Cross-section \"E\" is not available for rehabiliation.");
        document.getElementById('imgE77').src = "img/BuildABridge/77_gray.gif";
        f80.setAttribute('disabled', 'disabled');
        f80.setAttribute("title", "Cross-section \"F\" is not available for rehabiliation.");
        document.getElementById('imgF80').src = "img/BuildABridge/80_gray.gif";
    } else if (buildType == "REPLACE") {
        i31.setAttribute('disabled', 'disabled');
        i31.setAttribute("title", "Cross-section \"I\" is not available for bridge replacement.");
        document.getElementById('imgI31').src = "img/BuildABridge/31_gray.gif";
        m43.setAttribute('disabled', 'disabled');
        m43.setAttribute("title", "Cross-section \"M\" is not available for bridge replacement.");
        document.getElementById('imgM43').src = "img/BuildABridge/M43_gray.gif";
        a53.setAttribute('disabled', 'disabled');
        a53.setAttribute("title", "Cross-section \"A\" is not available for bridge replacement.");
        document.getElementById('imgA53').src = "img/BuildABridge/53_gray.gif";
        aPrime53.removeAttribute('disabled');
        aPrime53.removeAttribute('title');
        document.getElementById('imgAprime53').src = "img/BuildABridge/53.gif";
        k57.removeAttribute('disabled');
        k57.removeAttribute('title');
        document.getElementById('imgK57').src = "img/BuildABridge/57.gif";
        n57.setAttribute('disabled', 'disabled');
        n57.setAttribute("title", "Cross-section \"N\" is not available for bridge replacement.");
        document.getElementById('imgN57').src = "img/BuildABridge/N57_gray.gif";
        l57.setAttribute('disabled', 'disabled');
        l57.setAttribute("title", "Cross-section \"L\" is not available for bridge replacement.");
        document.getElementById('imgL57').src = "img/BuildABridge/L_gray.gif";
        c64.removeAttribute('disabled');
        c64.removeAttribute('title');  
        document.getElementById('imgC64').src = "img/BuildABridge/64.gif";
        cPrime68.removeAttribute('disabled');
        cPrime68.removeAttribute('title'); 
        document.getElementById('imgCprime68').src = "img/BuildABridge/68.gif";
        d75.removeAttribute('disabled');
        d75.removeAttribute('title');  
        document.getElementById('imgD75').src = "img/BuildABridge/75.gif";
        e77.removeAttribute('disabled');
        e77.removeAttribute('title');
        document.getElementById('imgE77').src = "img/BuildABridge/77.gif";
        f80.removeAttribute('disabled');
        f80.removeAttribute('title');
        document.getElementById('imgF80').src = "img/BuildABridge/80.gif";
    } else if (buildType == 'NEWEXISTING') {
        i31.setAttribute('disabled', 'disabled');
        i31.setAttribute("title", "Cross-section \"I\" is not available for rehab & replace.");
        document.getElementById('imgI31').src = "img/BuildABridge/31_gray.gif";
        m43.removeAttribute('disabled');
        m43.removeAttribute('title');
        document.getElementById('imgM43').src = "img/BuildABridge/M43.gif";
        a53.setAttribute('disabled', 'disabled');
        a53.setAttribute("title", "Cross-section \"A\" is not available for rehab & replace.");
        document.getElementById('imgA53').src = "img/BuildABridge/53_gray.gif";
        aPrime53.setAttribute('disabled', 'disabled');
        aPrime53.setAttribute("title", "Cross-section \"A\'\" is not available for rehab & replace.");
        document.getElementById('imgAprime53').src = "img/BuildABridge/53_gray.gif";
        k57.setAttribute('disabled', 'disabled');
        k57.setAttribute("title", "Cross-section \"K\" is not available for rehab & replace.");
        document.getElementById('imgK57').src = "img/BuildABridge/57_gray.gif";
        n57.removeAttribute('disabled');
        n57.removeAttribute('title');
        document.getElementById('imgN57').src = "img/BuildABridge/N57.gif";
        l57.setAttribute('disabled', 'disabled');
        l57.setAttribute("title", "Cross-section \"L\" is not available for rehab & replace.");
        document.getElementById('imgL57').src = "img/BuildABridge/L_gray.gif";
        c64.setAttribute('disabled', 'disabled');
        c64.setAttribute("title", "Cross-section \"C\" is not available for rehab & replace.");  
        document.getElementById('imgC64').src = "img/BuildABridge/64_gray.gif";
        cPrime68.setAttribute('disabled', 'disabled');
        cPrime68.setAttribute("title", "Cross-section \"C\'\" is not available for rehab & replace."); 
        document.getElementById('imgCprime68').src = "img/BuildABridge/68_gray.gif";
        d75.setAttribute('disabled', 'disabled');
        d75.setAttribute("title", "Cross-section \"D\" is not available for rehab & replace.");  
        document.getElementById('imgD75').src = "img/BuildABridge/75_gray.gif";
        e77.setAttribute('disabled', 'disabled');
        e77.setAttribute("title", "Cross-section \"E\" is not available for rehab & replace.");
        document.getElementById('imgE77').src = "img/BuildABridge/77_gray.gif";
        f80.setAttribute('disabled', 'disabled');
        f80.setAttribute("title", "Cross-section \"F\" is not available for rehab & replace.");
        document.getElementById('imgF80').src = "img/BuildABridge/80_gray.gif";
    }
}

//return the buildTpye selected by the user, ie - which Rehab/Replace option raido button is selected.
function getBuildType() {
    var buildType = "ERROR";
    
    if (document.getElementById(aspnetPrefix + 'optReplace').checked)
        buildType = "REPLACE";    
    else if (document.getElementById(aspnetPrefix + 'optRehab').checked)
        buildType = "REHAB"; 
    else if (document.getElementById(aspnetPrefix + 'optNewExisting').checked)
        buildType = "NEWEXISTING"; 
    
    return buildType;
}

//uncheck all the radio buttons except the 'buildType' selection
function unselectAllRadioButtons() {
    var inputElments = document.getElementsByTagName('input');
    var element;
    var i;
    
    for (i=0; i<inputElments.length; i++) {
        element = inputElments[i];
        if (element.type == "radio") {
            if (element.name.indexOf("crosssection") > -1 || 
                    element.name.indexOf("alignment") > -1 || 
                    element.name.indexOf("intersection") > -1) {
                element.checked = false;
            }
        }
    }
}
//test to see what type of node is in the given span. if there is a text node there, it means
// that the user has not made a selection. If an element node (which is an img) is there,
// then the user has made a selection.
function isOptionSelected(spanName, displayName, divName) {
    var rVal = false;
    //this gets the first node that is inside of the span.
    var node = document.getElementById(spanName).firstChild;

    if (node.nodeType == 3) { //3 is a text node
        alert("You must select one " + displayName + " before you can build the bridge.");
        showBABdiv(divName);
    } else if (node.nodeType == 1) {//1 is an element node 
        rVal = true;
    }   
    return rVal;
}

//when starting a new configuration , ie changing any of the four variables, we need to clear the scores
// of the previous alternatives.
function clearYourScores() {  
    var labels = new Array('lblAesthetics','lblBikePed','lblQualOfLife',
                            'lblVehicles','lblConstruction','lblEnvironment','lblMaterial',
                            'lblMassTransit','lblSeismic','lblCost','lblTotalScore','lblRank',
                            'lblDisplaced', 'lblLifeTimeCost');
    var spanNode;
    var i;
    
    for (i=0;i<labels.length;i++) {
        spanNode = document.getElementById(aspnetPrefix + labels[i]);
        if (spanNode) {
            if (spanNode.hasChildNodes()) {
                spanNode.innerHTML = '';
                //spanNode.firstChild.nodeValue = '';
            }
        }
    } 
}

//find out which intersection the user selected by getting at the source name of the image
// that got put in the 'intersectionSelected' span.
function getIntersection() {
    
    var rVal = "";
    var img = document.getElementById('intersectionSelected').firstChild;
   
    if (img) {
        if (img.src.indexOf('signalized') > -1)
            rVal = "Signalized";
        else if (img.src.indexOf('roundabout') > -1)
            rVal = "Roundabout";    
    } 
    
    return rVal;
}

function getAlignment() {
    
    var rVal = "";
    var img = document.getElementById('alignmentSelected').firstChild;
   
    if (img) {
        if (img.src.indexOf('blue') > -1)
            rVal = "Blue";
        else if (img.src.indexOf('pink') > -1)
            rVal = "Pink"; 
        else if (img.src.indexOf('purple') > -1)
            rVal = "Purple"; 
        else if (img.src.indexOf('yellow') > -1)
            rVal = "Yellow"; 
        else if (img.src.indexOf('teal') > -1)
            rVal = "Teal";    
    } 
    
    return rVal;
}

function getCrosssection() {
    var rVal = "";
    var img = document.getElementById('crosssectionSelected').firstChild;
   
    if (img) {
        if (img.src.indexOf('31.gif') > -1)
            rVal = "I (31 feet)";
        else if (img.src.indexOf('M43.gif') > -1)
            rVal = "M (43 feet)"; 
        else if (img.src.indexOf('A53.gif') > -1)
            rVal = "A (53 feet)"; 
        else if (img.src.indexOf('Aprime53.gif') > -1)
            rVal = "A\' (53 feet)"; 
        else if (img.src.indexOf('57.gif') > -1)
            rVal = "K (57 feet)";    
        else if (img.src.indexOf('N57.gif') > -1)
            rVal = "N (57 feet)"; 
        else if (img.src.indexOf('L.gif') > -1)
            rVal = "L (57 feet)"; 
        else if (img.src.indexOf('64.gif') > -1)
            rVal = "C (64 feet)"; 
        else if (img.src.indexOf('68.gif') > -1)
            rVal = "C\' (68 feet)";    
        else if (img.src.indexOf('75.gif') > -1)
            rVal = "D (75 feet)"; 
        else if (img.src.indexOf('77.gif') > -1)
            rVal = "E (77 feet)"; 
        else if (img.src.indexOf('80.gif') > -1)
            rVal = "F (80 feet)"; 
    } 
    return rVal;
}

//get the text contained with in a server-side generated label. Have to add the asp.net
// prefix to the client name.
function getTextFromServerSideLabel(labelName) {
    var label = document.getElementById(aspnetPrefix + labelName);
    var rVal = "";
    
    if (label) {
        if (labelName == 'lblTotalScore')
            rVal = label.firstChild.nodeValue;
        else if (labelName == 'lblRank') {
            //text of rank label:
            //<b>Rank</b>: Your bridge ranked <b>xxx out of 124</b> (lower number is more favorable).
            // there ends up being 3 child nodes. we want the second node (firstChild.nextSibling) and
            // the third node (lastChild)
            // We want the string between 'ranked ' and ' (lower'
            
            //var start = label.lastChild.previousSibling.firstChild.nodeValue.indexOf('ranked ') + 7;
            
            //rVal = label.lastChild.previousSibling.firstChild.nodeValue.substring(start);
            rVal = label.lastChild.previousSibling.firstChild.nodeValue  
        }
    }
    return rVal;
}

function showHideBABHeaderText() {
    ShowHide('headerTextDiv');
    var link = document.getElementById('babHeaderText');
    if (link.firstChild.nodeValue == "(hide text...)")
        link.firstChild.nodeValue = "(show text...)";
    else
        link.firstChild.nodeValue = "(hide text...)";
}

function findElement(id) {
   var object = null;
   if( document.layers ) {   
    object = document.layers[id];
   } else if( document.all ) {
    object = document.all[id];
   } else if( document.getElementById ) {
    object = document.getElementById(id);
   }
   return object;
}
