﻿// JScript File
var Language = null;

function getVars(colNum)
{    
    if (colNum != "C2")
    {
        colNum = "";
    }     
        
    // main form:
    fm = element("mainForm") ;
    spnLCOptions = element("spnLCOptions" + colNum);
    cbStrokeAdj = element("cbStrokeAdj" + colNum);  
    cbShockPads = element("cbShockPads" + colNum);    
    spnUCDistL = element("spnUCDistL" + colNum);
    spnUCWeightW = element("spnUCWeightW" + colNum);    
    spnUCNumberN = element("spnUCNumberN" + colNum);
    spnUCPressureP = element("spnUCPressureP" + colNum);
    spnUCOffsetR = element("spnUCOffsetR" + colNum);
    spnUCDistHp = element("spnUCDistHp" + colNum);
    spnUCDistHs = element("spnUCDistHs" + colNum);
    spnUCAngleA = element("spnUCAngleA" + colNum);
    spnUCFrictionF = element("spnUCFrictionF" + colNum);
    spnUCVelocityV = element("spnUCVelocityV" + colNum);
    spnUCTemperature = element("spnUCTemperature" + colNum);
    //spnUCCycleRate = element("spnUCCycleRate" + colNum);
    spnErrDistL = element("spnErrDistL" + colNum);
    
    // inputs:
    rbImperial = element("rbImperial" + colNum) ;
    rbMetric   = element("rbMetric" + colNum) ;    

    // visible/invisible based on feed (gravity vs conveyor)
    tableFrictionF   = element("tableFrictionF" + colNum) ;
    tableDistHp   = element("tableDistHp" + colNum) ;
    tableDistHs   = element("tableDistHs" + colNum) ;
    tableAngleA   = element("tableAngleA" + colNum) ;
    tableFrictionF   = element("tableFrictionF" + colNum) ;
    tableVelocityV   = element("tableVelocityV" + colNum) ;
    
    // output stuff:
    lbPartList = element("lbPartList" + colNum);
    cbShowFailed = element("cbShowFailed" + colNum);
    tabOuts = element("tabOuts" + colNum);
    
    lbPartList.name = lbPartList.id;
    
    // misc:
    divResults = element("divResults" + colNum);  
    divResultColumn = element("divResultColumn" + colNum);
    divResultsMsg = element("divResultsMsg" + colNum);
    divNotes = element("divNotes" + colNum);
    divInputs = element("divInputs" + colNum);
    divPartList = element("divPartList" + colNum);
    divRightCol = element("divRightCol");    
    // divForm = element("divForm");
        
    // options box:
    rbGravity  = element("rbGravity") ;
    rbConveyor = element("rbConveyor") ;
    cbLC  = element("cbLC") ;
    cb160 = element("cb160") ; 
    cbAutoCalc = element("cbAutoCalc");
    btnCalculate = element("btnCalculate");
    spnCalculate = element("spnCalculate");
    
    rbCompareMode = element("rbCompareMode");
    rbStandardMode = element("rbStandardMode");
    
    divNotes.style.whitespace = "normal"; // don't want nowrap here; it will look crazy.

    return;
}


// when the user clicks on the metric/imperial checkbox,
// convert everything to selected units
function UnitsChanged()
{
    // inputs:
    spnUCDistL.SetMetric(rbMetric.checked) ;
    spnUCWeightW.SetMetric(rbMetric.checked) ;
    spnUCPressureP.SetMetric(rbMetric.checked) ;
    spnUCOffsetR.SetMetric(rbMetric.checked) ;
    spnUCDistHs.SetMetric(rbMetric.checked) ;
    spnUCDistHp.SetMetric(rbMetric.checked) ;
    spnUCVelocityV.SetMetric(rbMetric.checked) ;
    spnUCAngleA.SetMetric(rbMetric.checked) ;
    spnUCTemperature.SetMetric(rbMetric.checked) ;
  
    InputChanged(); // recalculate based on new input values
    return;
}

function FilterSeriesClick()
{   
    // This functon is called when the checkboxes for LC or 160 are clicked. 
    // perform the necessary operations on 
    // the column 1 results- add/remove LC/160 escapements
    var colNum = "";
    getVars(colNum)
    FilterSeries(colNum);
    InputChanged();
    if (rbCompareMode.checked)
    {        
        // TO DO: make this better.
        // this solution is pretty far from ideal.
        // The problem is that due to the asynchronous nature this application (the A in AJAX,)
        // column 1 will not be completely updated by the time column two is being operated on.
        // So unless I delay the fillTwo() call, fillOne will not work properly.
        // Instead of waiting a full two seconds, I might be able to lock it with a boolean
        // and reduce the waiting time, but unless I do a radical overhaul of the program I don't
        // think there will be much more I can do at this time.
        window.setTimeout("fillColTwo();", 2500) ;
    }
    return;
}


function fillColTwo()
{
    colNum = "C2";
    getVars(colNum);
    FilterSeries(colNum);
    InputChanged();
}


// This function performs the required changes to the page when the user
// specifies to look only at LC or 160 escapements. Outputs are filtered,
// some fields are set visible/hidden, results are possibly recalculated.
function FilterSeries(colNum)
{         
    if (!cbLC.checked && !cb160.checked)
    {  
        divInputs.style.display = "none";
        divResultColumn.style.display = "none";
        lbPartList.innerHTML = "";
        lbPartList.style.display = "none";
        divPartList.style.display = "none";        
        var divSelectPls = element("divSelectPls");
        divSelectPls.style.display = "inline";
        divSelectPls.innerText = element("hidChooseEsc").value; // "Please select LC or 160 escapements"; 
    }
    else
    {   
        var divSelectPls = element("divSelectPls");
        divSelectPls.innerText = "";
        divSelectPls.style.display = "none";
        divInputs.style.display = "";
        divResultColumn.style.display = "";
       
        var divResultsMsg = element("divResultsMsg");
        divResultsMsg.style.display = "";
        divResultsMsg.innerHTML = element("hidCalcResults").value; // ".... calculating results. Please wait.";// translate
    }
    
    

    if (!cbLC.checked)
    {                  
        spnLCOptions.style.display = "none"; 
        dispExtRetTime = false;
    }
    else
    {
        spnLCOptions.style.display = ""; 
    }   
    
    if (!cb160.checked)
    {     
        dispRspTime = false; // if 160 isn't checked, don't show response time
    }
    
    
    if (cb160.checked)
    {
        set160Animation();
    }
    else if (cbLC.checked)
    {
        setLCAnimation();
    }

    InputChanged();    

    return;
}

// when buttons are pushed to check all series
function AllSeries()
{
    cbLC.checked = true;
    cb160.checked = true;
    FilterSeriesClick();
    return;
}
// when buttons are pushed to clear all series
function NoSeries()
{
    cbLC.checked = false;
    cb160.checked = false;
    FilterSeriesClick();
    
    return;
}



function changeAutoCalc()
{
    // display calculate button, or not.
    if (cbAutoCalc.checked) 
    {
        spnCalculate.style.display = "none";
        autoCalculate();
    }
    else
    {
        spnCalculate.style.display = "";
    }
    return;
}

// this function is called when we want to autocalculate something
function autoCalculate()
{
    if (cbAutoCalc.checked) // make sure autoCalculate checkbox is checked.
    {
        calculate();
    }
    return;
}

function calcButton()
{
    // check if compare mode
    if (rbCompareMode.checked)
    {   // this is a crappy way of doing it, but really, how often are people going to
        // turn off autocalc and do compare mode? At least it works.
        getVars('');
        calculate();
        setTimeout("getVars('C2');", 2000);    
        setTimeout("calculate();", 2500);
    }
    else
    {
        calculate();
    }
}

// this function is called when the calculate button is pressed,
// or it is called from autoCalculate function when checkbox is checked.
function calculate()
{       
    divResultsMsg.innerHTML = element("hidCalcResults").value; 
    busy = false ;

    if (needCalc)
    {
        StartCalc() ;
        return ;
    }

    // check selection status.
    // if items in list are selected, then after we refill listbox,
    // we want to recalculate sizing for those items.

    // we don't actually need to get a list of valid parts if 
    // we don't care if the displayed parts are valid or not.
    //if (!cbShowFailed.checked && (cbLC.checked || cb160.checked))
    if (cbLC.checked || cb160.checked)
    {
        ListEscapements();
    }
    
    return;
}


function ShowFailed()
{
    InputChanged();
}


function InputChanged() // when inputs are changed, recalculate.
{
    busy = false;
    divNotes.innerHTML = "";
    // storeData(); 
    
    if (busy)
    {
        needCalc = true ;
    }
    else
    {
        StartCalc() ;
    }   
    return; 
}


function setFilterFeedFields()
{
    // if gravity, get rid of conveyor fields,
    if (rbGravity.checked)
    {
        tableDistHp.style.display = "";
        tableDistHs.style.display = "";
        tableAngleA.style.display = "";
        tableFrictionF.style.display = "none";
        tableVelocityV.style.display = "none";
    }
    else
    { // conveyor, get rid of gravity fields    
        tableDistHp.style.display = "none";
        tableDistHs.style.display = "none";
        tableAngleA.style.display = "none";
        tableFrictionF.style.display = "";
        tableVelocityV.style.display = "";
    }    
    
    if (cb160.checked)
    {
        set160Animation();
    }    
    else if (cbLC.checked)
    {
        setLCAnimation();
    }
    
    
    return;

}

function calcC1()
{
    getVars("");   // set column one variables and move along as usual 
    getSelected();
    setFilterFeedFields();
    InputChanged();
    return;
}
function calcC2()
{
    getVars("C2");   // set column two variables and move along as usual 
    getSelected();
    setFilterFeedFields();
    InputChanged();
    return;
}

// This function performs the required changes to the page when the gravity/conveyor 
// feed type is modified- fields are visible/hidden and results are possibly recalculated.
function FilterFeedClick()
{         
    if (rbCompareMode.checked) // if compare mode, calculate C1 and C2:
    {
        calcC1();               
        window.setTimeout("calcC2();", 2000) ; // calculate column2 stuff
    }
    else // if standard mode, just calculate C1:
    {
        setFilterFeedFields();
        InputChanged();
    }  

    return;
}





function setActiveStyleSheet(title) 
{ 
    var i, a;
    for(i=0; (a = document.getElementsByTagName("link")[i]); i++) 
    {
        if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) 
        {
            a.disabled = true;
            if (a.getAttribute("title") == title)    
                a.disabled = false;
        }
    } 
    return;
}

// set to standard mode:
function standardMode()
{
    getVars("");
    element("rbStandardMode").checked="checked";
    setActiveStyleSheet("standard");    
    
    return;
}

// set to compare mode:
function compareMode()
{       
    element("rbCompareMode").checked="checked";
    // adjust page style to match compare page,
    // open a column2 within this page.
    divRightCol.style.display = "";    
    divResultsMsg.innerHTML = "";
    setActiveStyleSheet("compare");
    // fill column 2  
         
    getVars("C2");
    PageLoad(false, "C2");   
    // window.setTimeout("expand();", 2000) ;
    divInputs.style.width = "100%";
    
    return;
}

function selecting()
{
    if (cbLC.checked && cb160.checked)
    {
        for (var i=0; i <= lbPartList.options.length-1; i++) 
        {   
            if (lbPartList.options[i].selected) 
            { 
                if (lbPartList.options[i].value.indexOf("LCS") >= 0)
                {
                    setLCAnimation();
                }
                else
                {
                    set160Animation();
                }
                break;
            }
        }
    }
    
    dispRspTime = false, 
    dispExtRetTime = false; // reset these since LC/160 are no longer selected
    
    selectedOptions = new Array() ; // start fresh when selections change
    sizingCalc() ;    
    if (rbCompareMode.checked)
    {
        expand();
    }
}

function clearArrays()
{
    arrEscapement = new Array(),
    arrSeries = new Array(),
    arrStatus = new Array(),
    arrRodTorque = new Array(),
    arrExtendTime = new Array(),
    arrRetractTime = new Array(),
    arrResponseTime = new Array(),
    arrUnitWeight = new Array(),
    arrStaticLoad = new Array(),
    arrNewPartImpact = new Array(),
    arrStackTransferImpact = new Array(),
    arrCv = new Array(), 
    arrSCFM = new Array();
    return;
}

function sizingCalc()
{
    clearTabOuts();
    count = 0;
    
    clearArrays();
    
    for (var i=0; i <= lbPartList.options.length-1; i++) 
    {   
        if (lbPartList.options[i].selected && count < 3) 
        {   
            count++;
            // store as selected...
            selectedOptions.push(lbPartList.options[i].value);
            NextEscapementSelection(i); //  
        }
        else if (count >= 3)
        {
            lbPartList.options[i].selected = "";
        }
    }
    return;
}

// this function checks to see if anything valid is selected.
function selectStatus()
{
    var selIndex;
    var retVal = false;
    
    if (selectedOptions == null)
    {
        selectedOptions = new Array();
    }
    
    for (var i=0; i < selectedOptions.length; i++)
    {
        selIndex = indexOf(selectedOptions[i].valueOf());
        if (selIndex >= 0) // selected value is valid and in part list
        {
            retVal = true;
            break;
        }
    }
    
    return retVal;
}



function indexOf(selectedValue){
    // this function finds the index of an item in the listbox
    // based on its value. I don't think there's a pre-made function for this.
    // if it's in there more than once (it shouldn't be...), it will find the first instance.
    
    var indexOfValue = -1; // defaults to -1. if we find it, we set it then.
    var len = lbPartList.options.length;
    var i;

    for (i = 0; i < len; i++)
    {        
	    if (lbPartList.options[i].value.substr(0,6) == selectedValue.substr(0,6)) // only check substring- whole thing will have error message, if one exists.
	    {
	        indexOfValue = i;
	        break;
	    }	  
	}	        
    return indexOfValue;
}


function reselect()
{
// if any parts were selected before, we should select them now.
    if (selectedOptions != null)
    {
        for (i = 0; i < selectedOptions.length; i++)
        {
            j = indexOf(selectedOptions[i]);
        
            if (j >= 0)
            {
                try
                {
                lbPartList[j].selected = "selected";
                }
                catch(err)
                { // do nothing, but I get a wonderfully helpful "unspecified error" when this catch isn't here.
                }
            }
            
            // check if anything valid is selected:
            if (!selectStatus() && lbPartList[0] != null)
            {
                selectedOptions = new Array() ; // start fresh when selections change
                try
                {
                    lbPartList[0].selected = "selected"; // if nothing else is selected already, select the first one in list
                }
                catch(err)
                { // do nothing, but I get a wonderfully helpful "unspecified error" when this catch isn't here.
                }
            }
        }
    }
    else if (lbPartList[0] != null && !selectStatus())
    {
        selectedOptions = new Array() ; // start fresh when selections change
        try
        {
            lbPartList[0].selected = "selected"; // if nothing else is selected already, select the first one in list
        }
        catch(err)
        { // do nothing, but I get a wonderfully helpful "unspecified error" when this catch isn't here.
        }
    }    
}


    
// This function sends the data to the webservice and sends the results to
// another function for processing and display.
function NextEscapementSelection(selectedIndex)
{
    var pl = new SOAPClientParameters();
    
    var isGravityFeed = rbGravity.checked; // evaluates to true or false
    var isStrokeLengthAdj;
    var isShockpads;      
    var valTemperature;   
    
    selectedValue = lbPartList.options[selectedIndex].value;  
    
    if (cbLC.checked)
    {
        // if LC escapements checked, get stroke adjustment and shockpad status
        isStrokeLengthAdj = cbStrokeAdj.checked; 
        isShockpads = cbShockPads.checked; 
    }
    else
    {
        // without LC, these options don't exist, so they're always false.
        // They are hidden on the page but I think they could still be checked and throw everything off.
        isStrokeLengthAdj = false;
        isShockpads = false;
    }
        
    // these are the same regardless of feed type
	valDistL = spnUCDistL.ActualValue/spnUCDistL.ConvFact;
	valWeightW = spnUCWeightW.ActualValue/spnUCWeightW.ConvFact;
	valNumPartsN = parseInt(spnUCNumberN.ActualValue); // won't be a conversion factor for this
	valPressureP = spnUCPressureP.ActualValue/spnUCPressureP.ConvFact;
	valOffsetR = spnUCOffsetR.ActualValue/spnUCOffsetR.ConvFact;	
    valTemperature = spnUCTemperature.ActualValue;
    //valCycleRate = spnUCCycleRate.ActualValue/spnUCCycleRate.ConvFact;
    
    Escapement=  selectedValue; // this will send the currently selected item to the webservice
    
	isMetric = rbMetric.checked;

    // these are feed-type dependent:
	if (isGravityFeed) // if gravity is checked
	{   // if gravity, get gravity-only fields:
		valDistHp = spnUCDistHp.ActualValue/spnUCDistHp.ConvFact;
		valDistHs = spnUCDistHs.ActualValue/spnUCDistHs.ConvFact;
		valAngleA = spnUCAngleA.ActualValue/spnUCAngleA.ConvFact;
		// set conveyor-only variables to 0
		valFrictionF = 0;
		valVelocityV = 0;             
	}
	else
	{   // if conveyor, get conveyor-only fields:        
		valFrictionF = spnUCFrictionF.ActualValue/spnUCFrictionF.ConvFact;
		valVelocityV = spnUCVelocityV.ActualValue/spnUCVelocityV.ConvFact;
		// set gravity-only variables to 0
		valAngleA = 0;
		valDistHp = 0;
		valDistHs = 0;           
	}       
	
	var language = element("UserLanguageStorage").value;
	
    // add parameters to send to WebService
    pl.add("inEscapement", Escapement) ;
    pl.add("isGravity", isGravityFeed) ; 
    pl.add("inDistL", valDistL) ;
    pl.add("inWeightW", valWeightW) ;
    pl.add("inNumPartsN", valNumPartsN) ;
    pl.add("inPressureP", valPressureP) ;
    pl.add("inOffsetR", valOffsetR) ;    
    pl.add("inDistHp", valDistHp) ;
    pl.add("inDistHs", valDistHs) ;
    pl.add("inAngleA", valAngleA) ;
    pl.add("inFrictionF", valFrictionF) ;
    pl.add("inConveyorV", valVelocityV) ;    
    pl.add("isStrokeLengthAdjust", isStrokeLengthAdj) ;
    pl.add("isShockpads", isShockpads) ;
    pl.add("isMetric", isMetric);
    pl.add("inTemperature", valTemperature);
    //pl.add("inCycleRate", valCycleRate);
    pl.add("inLanguage", language);
      
    needCalc = false ;
    busy = true ;
    
    // get data from WebService and display it on webpage
    SOAPClient.invoke("EscapementService.asmx", "SizingCalc", pl, true, getSizingRslt) ;
    return;
}



 
// This function checks the return values from the WebService for errors.
// If it appears to have returned correctly, it will send the data to be
// parsed and used to populate the fields on the webpage.
function getSizingRslt(result){
	//if an error then get error details
	if(result.error)
	{
		var xfaultcode   = result.errorDetail.code;
		var xfaultstring = result.errorDetail.string;
		var xfaultsoap   = result.errorDetail.raw;
		txtNotes.innerHTML ="Error: " + " " + xfaultcode + " ; " + xfaultstring + " ; " + xfaultsoap;        
	}
	else
	{          
        divResultColumn.style.display = ""; 
        get_escapement_callback(result);        
	}
	return;
}






function get_escapement_callback(r) // r = results
{
    if (r)
    {
        count++;
      var
        warnColor = (r.strStatus == "Successful" ? "#aca" : (r.strStatus == "Marginal" ? "#dd9" : "#caa"))
        
        
        var escName;
        var escStatus = "";
        var iSep;        
       
        iSep = r.strSelected.indexOf(" - ");
        if (iSep > -1)
        {
            escName = r.strSelected.substring(0, iSep);
            escStatus = r.strSelected.substr(iSep);
        }
        else
        {
            escName = r.strSelected;
        }
        
        escapementCell = TextCell(" " +escName, warnColor),
        statTd = document.createElement("td"),
        serTd = document.createElement("td"),
        statImg = document.createElement("img"),
        serImg = document.createElement("img"),
        cadTd = document.createElement("td"),
        blankTd = document.createElement("td");


        // set language
        //----------------------------------------------------
        if (Language == null) {
            Language = element("UserLanguageStorage").value;
        }


   
        escapementCell.style.fontSize = "12px" ;
        escapementCell.style.fontWeight = "bold" ;
        SetRowCell(element("hidEscapement").value, escapementCell);



        // CAD Model/Quote:
        //----------------------------------------------------
        var divConfigCC = "";
        if (count > 2) {
            divConfigCC = "C" + count;
        }
        else {
            divConfigCC = "";
        }

        var AppColId = "";
        if (lbPartList.id == "lbPartList") {
            colNum = "";
            AppColId = "";
        }
        else {
            colNum = "C2";
            AppColId = "App2";
        }


        var divID = "divConfig" + AppColId + divConfigCC;
        var escString = escapementCell.innerHTML;
        var reqOptAdd = "";
        escString = escString.replace(/ /g, '');  // some of the part strings have spaces in them for some reason... strip that out.

        

        // adjust keyword per language...
        if (Language == "English") {
            var cadTitle = "CAD Model/Quote";
            var cadText = "Configure<br /> Now!";
        }
        else if (Language == "German") {
            var cadTitle = "CAD Model/Angebot";
            var cadText = "Jetzt<br /> konfigurieren!";
        }
        else if (Language == "Spanish") {
            var cadTitle = "Modelo Cad / Cotizar";
            var cadText = "Configurar<br /> Ahora!";
        }

        var googleV1 = "Escapement_Sizing";
        var googleV2 = "Click";
        var googleV3 = "CAD Config";

        var onMouseOver = "cadOver('" + AppColId + divConfigCC + "')";
        var onMouseOut = "cadOut('" + AppColId + divConfigCC + "')";
        var pageTracker = " javascript:pageTracker._trackEvent('" + googleV1 + "','" + googleV2 + "','" + googleV3 + "');";
        var callTrack = " googleTrack();";
        var configAction = "divConfig('" + AppColId + divConfigCC + "','','" + escString + "','" + r.strSeries + "');"
        var onClick = " onClick=" + callTrack + configAction;
        var onClickTrack = " onclick=" + pageTracker;

        
        var cellCAD = "<center><div id='" + divID + "'" + onClick + " class=detailsConfigButton onMouseOver=" + onMouseOver + " onMouseOut=" + onMouseOut + ">" +
                    "<span id='spnConfig'>" +
                    "<img id='imgConfig' style='display: block' src='../images/configuration_edit.png' alt='CAD Model/Quote' title='Complete option choices to get a CAD model and request a quote. Valid ordering data when red buttons change to green.'/>" +


                    "</span>" +
                "</div>" +
                "<label id='lblConfig' class='printSmall10'>" + cadText + "</label>" +
                "</center>";

        //cadTd.appendChild(document.createElement());
        cadTd.innerHTML = cellCAD;
        cadTd.style.backgroundColor = warnColor;


        if (Language == null) {
            Language = element("UserLanguageStorage").value;
        }

        // adjust lang input to correct name so the picky thing runs...
        if (Language == "English") {
            SetRowCell(cadTitle, cadTd);
        }
        else if (Language == "German") {
            SetRowCell(cadTitle, cadTd);
        }
        else if (Language == "Spanish") {
            SetRowCell(cadTitle, cadTd);
        }
        //----------------------------------------------------




        
        if (r.strSeries.match("LC"))
        {
            serImg.src = "images/LC.gif" ;
        }
        else if (r.strSeries.match("160"))
        {
            serImg.src = "images/160.gif" ;
        }
        
        serImg.className = "printSmall";
        serTd.appendChild(serImg) ;
        serTd.appendChild(document.createElement("br")) ;
        serTd.appendChild(document.createTextNode(" " + r.strSeries)) ;
        
        serTd.className = "serTd";
        serTd.style.backgroundColor = warnColor ;

        SetRowCell(element("hidSeries").value, serTd) ; // LC or 160
    
        statImg.src = (r.strStatus == "Successful" ? "images/traffic_green.gif" : "images/traffic_red.gif") ;
        statTd.appendChild(statImg) ;
        statTd.appendChild(document.createElement("br")) ;
        
        // statTd.appendChild(document.createTextNode(r.strStatus));
        
        var statLabel = document.createElement("label");
        
        var locStrStatus;
        
        // status text returned from the webservice is in english... so translate it now.
        if (r.strStatus == "Successful")
        {
            locStrStatus = element("hidSuccess").value;
        }
        else
        {
            locStrStatus = element("hidFailure").value;
        }
        
        statLabel.innerHTML = locStrStatus + escStatus;
        statLabel.style.fontSize = "xx-small";
        statTd.appendChild(statLabel) ;
        
        statTd.style.backgroundColor = warnColor ;
        statTd.className = "serTd";
        

        SetRowCell(element("hidStatus").value, statTd) ;
        
        blankTd1 =TextCell("", warnColor);
        blankTd2 =TextCell("", warnColor);
        
        
           
        // using UCs:         
        var errTxt;
        if (r.bTorqueOK)
        {
            errTxt = "";
        }
        else
        {
            errTxt = element("hidExRodTorque").value; // "Excessive Rod Torque";// translate
        }
        var rodTorqueTr = createOutputUC(element("hidRodTorque").value, "torque", r.dTorque, warnColor, "0", errTxt);// translate
    
        if (r.strSeries == "LC")
        {
            dispExtRetTime = true;
            
            var extendTimeTr = createOutputUC(element("hidExtendTime").value, "time", r.dExtendTime, warnColor, "1");// translate
            var retractTimeTr = createOutputUC(element("hidRetractTime").value, "time", r.dRetractTime, warnColor, "2");  // translate          
            var responseTimeTr = SetRowCell(element("hidResponseTime").value, blankTd1) ; // always create, sometimes display // translate
                        
            extendTimeTr.style.display = "";   // always display  
            retractTimeTr.style.display = "";  // always display
            
            if (dispRspTime)
            {
                responseTimeTr.style.display = "";        
            }
            else
            {
                responseTimeTr.style.display = "none";
            }
            
            var lblNote = document.createElement("label"); 
            divNotes.innerHTML = "";
            lblNote.innerHTML = element("hidTimeNote").value; //"Note: Extend and retract times can vary widely. These values are typical values. Please consult PHD, Inc. if cycle time is critical. ";// translate
            lblNote.style.fontSize = "10px";
            lblNote.style.whiteSpace = "normal";
            divNotes.appendChild(lblNote);
        }
        else // if 160
        {
            dispRspTime = true;
            var extendTimeTr = SetRowCell(element("hidExtendTime").value, blankTd1) ; // always create, sometimes display// translate
            var retractTimeTr = SetRowCell(element("hidRetractTime").value, blankTd2) ; // always create, sometimes display// translate
            
            var responseTimeTr = createOutputUC(element("hidResponseTime").value, "time", r.dResponseTime, warnColor, "3"); // translate           
            responseTimeTr.style.display = "";  // always display
            
            if (dispExtRetTime)
            {
                extendTimeTr.style.display = "";        
                retractTimeTr.style.display = ""; 
                divNotes.innerHTML = "";
                var lblNote = document.createElement("label"); 
                lblNote.innerHTML = element("hidTimeNote").value; // "Note: Extend and retract times can vary widely. These values are typical values. Please consult PHD, Inc. if cycle time is critical.";// translate
                lblNote.style.fontSize = "10px";
                lblNote.style.whiteSpace = "normal";
                divNotes.appendChild(lblNote);
            }
            else
            {
                extendTimeTr.style.display = "none";        
                retractTimeTr.style.display = "none"; 
                divNotes.innerHTML = "";
            }                     
        }
        divNotes.style.whitespace = "normal"; // don't want nowrap here; it will look crazy.
        
        var unitWeightTr = createOutputUC(element("hidUnitWeight").value, "weight", r.dUnitWeight, warnColor, "4");// translate
    
        var staticLoadTr = createOutputUC(element("hidStaticLoad").value, SorF(r.bStaticLoadOK), r.dStaticLoad, warnColor, "5");// translate
        var newPartImpactTr;
        var stackTransferImpactTr;
        
        if (r.bDistLOK)
        {
            newPartImpactTr = createOutputUC(element("hidNewPartImpact").value, SorF(r.bNewPartImpactOK), r.dNewPartImpact, warnColor, "6");// translate
            stackTransferImpactTr = createOutputUC(element("hidStackTransferImpact").value, SorF(r.bStackTransferImpactOK), r.dStackTransferImpact, warnColor, "7");// translate
        }
        else
        {
            newPartImpactTr = createOutputUC(element("hidNewPartImpact").value, SorF(r.bNewPartImpactOK), "N/A", warnColor, "6");// translate
            stackTransferImpactTr = createOutputUC(element("hidStackTransferImpact").value, SorF(r.bStackTransferImpactOK), "N/A", warnColor, "7");// translate
        }
        try
        {     
            var CvTr = createOutputUC("Cv", "Cv", r.dCv, warnColor, "8");// translate
            var SCFMTr = createOutputUC(element("hidFlowRate").value, "flowrate", r.dSCFM, warnColor, "9");// translate
        }
        catch(err)
        {
            // do nothing.
        }    
        
        // display error messages:
        // rodtorque, distL
           
        if (!r.bDistLOK)
        {  
            spnErrDistL.visible = true;
            spnErrDistL.style.display = "inline";
        }
        else
        {
            spnErrDistL.visible = false;
            spnErrDistL.style.display = "none";
        }
        
        if (!r.bTorqueOK)
        { // I guess nothing?
        }
        
        
        // fill arrays used for copy/print buttons:
        // arrays are cleared out before the webservice call 
        // (if multiple are selected, they are cleared, then the WebSvc is called several times.)
        // TO DO: I don't think these are still being used? But I'm not sure.
        arrEscapement.push(r.strSelected);
        arrSeries.push(r.strSeries) ;
        arrStatus.push(r.strStatus);
        arrRodTorque.push(r.dTorque);
        arrExtendTime.push(r.dExtendTime) ;
        arrRetractTime.push(r.dRetractTime) ;
        arrResponseTime.push(r.dResponseTime) ;
        arrUnitWeight.push(r.dUnitWeight);
        arrStaticLoad.push(r.bStaticLoadOK) ;
        arrNewPartImpact.push(r.bNewPartImpactOK);
        arrStackTransferImpact.push(r.bStackTransferImpactOK);
        arrCv.push(r.dCv);
        arrSCFM.push(r.dSCFM);
           
    } 
    tabOuts.style.display = "";   
    
    
    
    return;           
}







// function: focusin(input)
// parameter: input (object)
// The input parameter is the div object that contains whatever object has the focus.
// If the user clicks on the divRightCol (the compare column) then the getVars function
// will set all those variables to point at the column2 objects.
// Firefox appears to work with "onfocus" event, while IE needs "onfocusin"
// hooray for standards and consistency.
function focusin(input)
{
    var wasCol = activeCol;
    
    if (input.id == "divRightCol")
    {
        activeCol = "C2";
        colNum = "C2";           
    }
    else
    {
        activeCol = "";
        colNum = "";
    }
    getVars(colNum);  

    // set selected parts to the active column's selections.
    // this was added because of a bug- for example, if col1 had LCS132 selected
    // and col2 had LCS120 selected, clicking from col1 to col2 and changing a value
    // would cause col2 to magically select LCS132
    getSelected();
    
    return;
}

function getSelected()
{
    selectedOptions = new Array();
    count = 0;
        
    for (var i=0; i <= lbPartList.options.length-1; i++) 
    {   
        if (lbPartList.options[i].selected && count < 3) 
        {   
            count++;            
            // store as selected...
            selectedOptions.push(lbPartList.options[i].value);
        }
        else if (count >= 3)
        {
            lbPartList.options[i].selected = "";
        } 
    }
    if (count == 0) // if nothing selected, chose first one:
    {
        try
        {
            lbPartList.options[0].selected = true;
            selectedOptions.push(lbPartList.options[0].value);
        }
        catch(err)
        {}
    }    
   
    return;
}




function expand()
{     
    return;
}


function printData(col)
{
    var clipboardData = element("hidClipboardData.value").value; // "Data will be copied and formatted";
    var feedType;
    var units;
    
    var rows;
    var tabName = "tabOuts" + col;
    
    // for firefox. 
    var DistLUOM, WeightWUOM, NumberNUOM, 
        PressurePUOM, OffsetRUOM, DistHsUOM, 
        DistHpUOM, AngleAUOM, FrictionFUOM,
        VelocityVUOM, TemperatureUOM;
    
    // for firefox. 
    if (whichBrs() == "Firefox") 
    {
        DistLUOM = spnUCDistL.textContent, 
        WeightWUOM = spnUCWeightW.textContent, 
        NumberNUOM = spnUCNumberN.textContent, 
        PressurePUOM = spnUCPressureP.textContent, 
        OffsetRUOM = spnUCOffsetR.textContent, 
        DistHsUOM = spnUCDistHs.textContent, 
        DistHpUOM = spnUCDistHp.textContent, 
        AngleAUOM = spnUCAngleA.textContent, 
        FrictionFUOM = spnUCFrictionF.textContent,
        VelocityVUOM = spnUCVelocityV.textContent, 
        TemperatureUOM = spnUCTemperature.textContent;
    }
    else
    {
        DistLUOM = spnUCDistL.innerText, 
        WeightWUOM = spnUCWeightW.innerText, 
        NumberNUOM = spnUCNumberN.innerText, 
        PressurePUOM = spnUCPressureP.innerText, 
        OffsetRUOM = spnUCOffsetR.innerText, 
        DistHsUOM = spnUCDistHs.innerText, 
        DistHpUOM = spnUCDistHp.innerText, 
        AngleAUOM = spnUCAngleA.innerText, 
        FrictionFUOM = spnUCFrictionF.innerText,
        VelocityVUOM = spnUCVelocityV.innerText, 
        TemperatureUOM = spnUCTemperature.innerText;
    }
    
    rows = document.getElementById(tabName).rows.length;

    // inputs always the same:      
    // format the data in a way that will be printable/copyable.
    // copy to clipboard.

    if (rbGravity.checked)
    {
        feedType = element("lblGravity").Text; // translate
    }
    else
    {
        feedType = element("lblConveyor").Text; // translate
    }
         
    if (rbMetric.checked)
    {
        units = element("lblMetricUnits").innerText; ; //"Metric"; // translate
    }
    else
    {
        units = element("lblImperialUnits").innerText; // translate
    }
   
    clipboardData =  "==========================================<br />";
    clipboardData += "<b>" + element("hidInputData").value + ":"; 
    
    if (col == "C2")
    {
        clipboardData += " (" + element("hidCompareColumn").value + ") ";
    }
    
    clipboardData +=  "</b><br />";
    clipboardData +=  "==========================================<br />";
    clipboardData +=  element("lblShockPads").Text + ": " + (cbShockPads.checked?"Yes" : "No") + "<br />";
    clipboardData +=  element("lblStrokeLengthAdj").Text + ": " + (cbStrokeAdj.checked?"Yes" : "No") + "<br />";
    clipboardData +=  element("lblFeed").Text + ": " + feedType + "<br />";
    clipboardData +=  element("hidDesignType").Value + ": " + units + "<br />";
    clipboardData +=  element("lblDistL").Text + ": " + round(spnUCDistL.ActualValue,2) + " " + DistLUOM  + "<br />"; // use textContent?
    clipboardData +=  element("lblWeightW").Text + ": " + round(spnUCWeightW.ActualValue,2) + " " + WeightWUOM + "<br />";
    clipboardData +=  element("lblNumberN").Text + ": " + round(spnUCNumberN.ActualValue,2) + " " + NumberNUOM + "<br />";
    clipboardData +=  element("lblPressureP").Text + ": " + round(spnUCPressureP.ActualValue,2) + " " + PressurePUOM + "<br />";
    clipboardData +=  element("lblOffsetR").Text + ": " + round(spnUCOffsetR.ActualValue,2) + " " + OffsetRUOM + "<br />";
    
    if (rbGravity.checked)
    {
        clipboardData +=  element("lblDistHp").Text + ": " + round(spnUCDistHs.ActualValue,2) + " " + DistHsUOM + "<br />";
        clipboardData +=  element("lblDistHs").Text + ": " + round(spnUCDistHp.ActualValue,2) + " " + DistHpUOM + "<br />";
        clipboardData +=  element("lblAngleA").Text + ": " + round(spnUCAngleA.ActualValue,2) + " " + AngleAUOM + "<br />";
    }
    else // if conveyor:
    {
        clipboardData +=  element("lblFrictionF").Text + ": " + round(spnUCFrictionF.ActualValue,2) + " " + FrictionFUOM + "<br />";
        clipboardData +=  element("lblVelocityV").Text + ": " + round(spnUCVelocityV.ActualValue,2) + " " + VelocityVUOM + "<br />";
    }
    clipboardData +=  element("lblTemperature").Text + round(spnUCTemperature.ActualValue,2) + " " + TemperatureUOM + "<br />";            
    clipboardData +=  "<br />";
            
            clipboardData +=  "==========================================<br />";
            clipboardData +=  "<b>" + element("hidResults").value + ": </b><br />" ;
            clipboardData +=  "==========================================<br />";
            
        
        var len = arrEscapement.length; // tells how many columns there are.
        var cellData;
        var cellDataHTML;       
        
        var EscapementName = new Array();
        for (var i = 0; i < lbPartList.length; i++)
        {
            if (lbPartList.options[i].selected)
            {
                EscapementName.push(lbPartList.options[i].value);
            }
        } 
        
        // alert("EscapementName.length: " + EscapementName.length);
        len = EscapementName.length;
        
        for (var i = 0; i < len; i++)
        { 
            j = i+1; // indexes are a mish-mash.. ugh. some 0 based, some 1 based. fix it.
            if (j > 1)
                clipboardData += "------------------------------------------<br />";
                
            clipboardData += "<b>" + element("hidOutputSet").value + (j);
            if (col == "C2")
            {
                clipboardData += "a"; // indicate compare column
            }
            clipboardData += ":</b><br />";
            
            var name;
            name = document.getElementById(tabName).rows[0].cells[j].innerHTML;
            clipboardData += element("hidProductName").value + ": " + name + "<br />"; // was arrEscapement[i]
            // clipboardData += "Product Series: " + arrSeries[i]  + "<br />";
            
            cellData = document.getElementById(tabName).rows[3].cells;
            cellDataHTML = cellData[j].innerHTML;
            // alert("cellDataHTML: " + cellDataHTML); // debug info
            clipboardData += element("hidRodTorque").Value +": " + valueAndUOM(cellDataHTML) + "<br />";
            
            // jcw test 120706
            //cellData = document.getElementById(tabName).rows[4].cells[j].innerHTML;
            //alert("cellData: " + cellData);
            // end test

            if (name.indexOf("LC") > 0)
            {
                cellData = document.getElementById(tabName).rows[4].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidExtendTime").Value + ": " + valueAndUOM(cellDataHTML) + "<br />";
                
                cellData = document.getElementById(tabName).rows[5].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidRetractTime").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            }
            else
            {
                cellData = document.getElementById(tabName).rows[6].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidResponseTime").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            }
            
            cellData = document.getElementById(tabName).rows[7].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidUnitWeight").Value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            
            clipboardData += element("hidStaticLoad").value + ": " + document.getElementById(tabName).rows[8].cells[j].innerHTML + "<br />";
            clipboardData += element("hidNewPartImpact").value + ": " + document.getElementById(tabName).rows[9].cells[j].innerHTML + "<br />";
            clipboardData += element("hidStackTransferImpact").value + ": " + document.getElementById(tabName).rows[10].cells[j].innerHTML + "<br />";
            
            clipboardData += "Cv: " + document.getElementById(tabName).rows[11].cells[j].innerHTML+ "<br />";
            clipboardData += element("hidFlowRate").value + ": " + document.getElementById(tabName).rows[12].cells[j].innerHTML + "<br />";
            
            var statusCell = document.getElementById(tabName).rows[2].cells[j].innerHTML;
            var status;
            if (statusCell.indexOf("Success") > 0)
            {
                status = element("hidSuccess").Value;
            }
            else
            {
                status = element("hidFailure").Value;
            }
            
            clipboardData += element("hidStatus").Value + ": " + status+ "<br />";
            clipboardData += "<br /><br />";
            
        
        }
        
    clipboardData += element("hidTimeNote").value; // "NOTE: Extend and retract times are affected by many factors in your system (valves, piping, etc.) The times printed here represent typical times experienced and should be used as a rough guide only. Contact PHD, Inc. if response time is critical.";
    
    return clipboardData;
}

// TO DO: get rid of all that array crap, now that I know what I'm doing.


 function test55()
 {
    var len = lbPartList.length;
    for (var i = 0; i < len; i++)
    {
        alert(i + ": " + lbPartList.options[i].value);
    }
 
 return;
 }
 
 
 function copyData(col)
{
    var clipboardData = element("hidClipboardData").value; //"Data will be copied and formatted"; // translate
    var feedType;
    var units;
    
    var rows;
    var tabName = "tabOuts" + col;
    
    // for firefox. 
    var DistLUOM, WeightWUOM, NumberNUOM, 
        PressurePUOM, OffsetRUOM, DistHsUOM, 
        DistHpUOM, AngleAUOM, FrictionFUOM,
        VelocityVUOM, TemperatureUOM;
    
    // for firefox. 
    if (whichBrs() == "Firefox") 
    {
        DistLUOM = spnUCDistL.textContent, 
        WeightWUOM = spnUCWeightW.textContent, 
        NumberNUOM = spnUCNumberN.textContent, 
        PressurePUOM = spnUCPressureP.textContent, 
        OffsetRUOM = spnUCOffsetR.textContent, 
        DistHsUOM = spnUCDistHs.textContent, 
        DistHpUOM = spnUCDistHp.textContent, 
        AngleAUOM = spnUCAngleA.textContent, 
        FrictionFUOM = spnUCFrictionF.textContent,
        VelocityVUOM = spnUCVelocityV.textContent, 
        TemperatureUOM = spnUCTemperature.textContent;
    }
    else
    {
        DistLUOM = spnUCDistL.innerText, 
        WeightWUOM = spnUCWeightW.innerText, 
        NumberNUOM = spnUCNumberN.innerText, 
        PressurePUOM = spnUCPressureP.innerText, 
        OffsetRUOM = spnUCOffsetR.innerText, 
        DistHsUOM = spnUCDistHs.innerText, 
        DistHpUOM = spnUCDistHp.innerText, 
        AngleAUOM = spnUCAngleA.innerText, 
        FrictionFUOM = spnUCFrictionF.innerText,
        VelocityVUOM = spnUCVelocityV.innerText, 
        TemperatureUOM = spnUCTemperature.innerText;
    }
    
    rows = document.getElementById(tabName).rows.length;

    // inputs always the same:      
    // format the data in a way that will be printable/copyable.
    // copy to clipboard.

    if (rbGravity.checked)
    {
        feedType = element("lblGravity").innerText;
    }
    else
    {
        feedType = element("lblConveyor").innerText;
    }
         
    if (rbMetric.checked)
    {
        units = element("lblMetricUnits").innerText;
    }
    else
    {
        units = element("lblImperialUnits").innerText;
    }
   
    clipboardData =  "==========================================<br />";
    clipboardData += "<b>" + element("hidInputData").value + ":";
    
    if (col == "C2")
    {        
        clipboardData += " (" + element("hidCompareColumn").value + ") ";
    }
    
    clipboardData +=  "</b><br />";
    clipboardData +=  "==========================================<br />";
    clipboardData +=  element("lblShockPads").innerText + ": " + (cbShockPads.checked?"Yes" : "No") + "<br />";
    clipboardData +=  element("lblStrokeLengthAdj").innerText + ": " + (cbStrokeAdj.checked?"Yes" : "No") + "<br />";
    clipboardData +=  element("lblFeed").innerText + ": " + feedType + "<br />";
    clipboardData +=  element("hidDesignType").value + ": " + units + "<br />";
    clipboardData +=  element("lblDistL").innerText + ": " + round(spnUCDistL.ActualValue,2) + " " + DistLUOM  + "<br />"; // use textContent?
    clipboardData +=  element("lblWeightW").innerText + ": " + round(spnUCWeightW.ActualValue,2) + " " + WeightWUOM + "<br />";
    clipboardData +=  element("lblNumberN").innerText + ": " + round(spnUCNumberN.ActualValue,2) + " " + NumberNUOM + "<br />";
    clipboardData +=  element("lblPressureP").innerText + ": " + round(spnUCPressureP.ActualValue,2) + " " + PressurePUOM + "<br />";
    clipboardData +=  element("lblOffsetR").innerText + ": " + round(spnUCOffsetR.ActualValue,2) + " " + OffsetRUOM + "<br />";
    
    if (rbGravity.checked)
    {
        clipboardData +=  element("lblDistHp").innerText + ": " + round(spnUCDistHs.ActualValue,2) + " " + DistHsUOM + "<br />";
        clipboardData +=  element("lblDistHs").innerText + ": " + round(spnUCDistHp.ActualValue,2) + " " + DistHpUOM + "<br />";
        clipboardData +=  element("lblAngleA").innerText + ": " + round(spnUCAngleA.ActualValue,2) + " " + AngleAUOM + "<br />";
    }
    else // if conveyor:
    {
        clipboardData +=  element("lblFrictionF").innerText + ": " + round(spnUCFrictionF.ActualValue,2) + " " + FrictionFUOM + "<br />";
        clipboardData +=  element("lblVelocityV").innerText + ": " + round(spnUCVelocityV.ActualValue,2) + " " + VelocityVUOM + "<br />";
    }
    clipboardData +=  element("lblTemperature").innerText + round(spnUCTemperature.ActualValue,2) + " " + TemperatureUOM + "<br />";            
    clipboardData +=  "<br />";
            
            clipboardData +=  "==========================================<br />";
            clipboardData +=  "<b>" + element("hidResults").value + ": </b><br />" ;
            clipboardData +=  "==========================================<br />";
            
        
        var len = arrEscapement.length; // tells how many columns there are.
        var cellData;
        var cellDataHTML;       
        
        var EscapementName = new Array();
        for (var i = 0; i < lbPartList.length; i++)
        {
            if (lbPartList.options[i].selected)
            {
                EscapementName.push(lbPartList.options[i].value);
            }
        } 
        
        // alert("EscapementName.length: " + EscapementName.length);
        len = EscapementName.length;
        
        for (var i = 0; i < len; i++)
        { 
            j = i+1; // indexes are a mish-mash.. ugh. some 0 based, some 1 based. fix it.
            if (j > 1)
            {
                clipboardData += "------------------------------------------<br />";
            }
               
            clipboardData += "<b>" + element("hidOutputSet").value + " " + (j);
            if (col == "C2")
            {
                clipboardData += "a"; // indicate compare column
            }
            clipboardData += ":</b><br />";
            
            var name;
            name = document.getElementById(tabName).rows[0].cells[j].innerText;
            clipboardData += element("hidProductName").value + ": " + name + "<br />"; // was arrEscapement[i]            
            
            cellData = document.getElementById(tabName).rows[3].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidRodTorque").value + ": " + valueAndUOM(cellDataHTML) + "<br />";

            if (name.indexOf("LC") > 0)
            {
                cellData = document.getElementById(tabName).rows[4].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidExtendTime").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
                
                cellData = document.getElementById(tabName).rows[5].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidRetractTime").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            }
            else
            {
                cellData = document.getElementById(tabName).rows[6].cells;
                cellDataHTML = cellData[j].innerHTML;
                clipboardData += element("hidResponseTime").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            }
            
            cellData = document.getElementById(tabName).rows[7].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidUnitWeight").value + ": " + valueAndUOM(cellDataHTML) + "<br />";
            
            cellData = document.getElementById(tabName).rows[8].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidStaticLoad").value + ": " + value(cellData[j].innerHTML) +  document.getElementById(tabName).rows[8].cells[j].innerText + "<br />";
            
            cellData = document.getElementById(tabName).rows[9].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidNewPartImpact").value + ": " + value(cellData[j].innerHTML) +document.getElementById(tabName).rows[9].cells[j].innerText + "<br />";
            
            cellData = document.getElementById(tabName).rows[10].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidStackTransferImpact").value + ": " + value(cellData[j].innerHTML)  +document.getElementById(tabName).rows[10].cells[j].innerText + "<br />";
            
            cellData = document.getElementById(tabName).rows[11].cells;
            cellDataHTML = cellData[j].innerHTML;
            // alert("cellData: " + value(cellDataHTML));
             
            clipboardData += "Cv: "  + value(cellDataHTML) /*+ document.getElementById(tabName).rows[11].cells[j].innerText*/  + "<br />";
            
            cellData = document.getElementById(tabName).rows[12].cells;
            cellDataHTML = cellData[j].innerHTML;
            clipboardData += element("hidFlowRate").value + ": " + value(cellDataHTML) /*document.getElementById(tabName).rows[12].cells[j].innerHTML*/ + "<br />";
            
            var statusCell = document.getElementById(tabName).rows[2].cells[j].innerText;
            var status;
            if (statusCell.indexOf("Success") > 0)
            {
                status = element("hidSuccess").value;
            }
            else
            {
                status = element("hidFailure").value;
            }
            
            clipboardData += element("hidStatus").value + ": " + status+ "<br />";
            clipboardData += "<br /><br />";
            
        
        }
        
    clipboardData += element("hidTimeNote").value; // "NOTE: Extend and retract times are affected by many factors in your system (valves, piping, etc.) The times printed here represent typical times experienced and should be used as a rough guide only. Contact PHD, Inc. if response time is critical.";
    
    return clipboardData;
}

// parses out the cookie
function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

function divConfig(col, AppCol, sPickedPart, sSeries) {


    // set it to something if it is null (probably means initial load...)
    if (AppCol == null) {
        AppCol = '';
    }

    if (col == null) {
        col = '';
    }

    // read the series name picked and match it up with our product id from firebird
    var seriesId = getSeriesId(sSeries);

    // check if the user is logged into CAD already...
    var bIsAuthed = false;
    var uniqID = getCookie('UniqueID');
    if (uniqID != null && uniqID != "") {
        //alert('Welcome again ' + uniqID + '!');
        bIsAuthed = true;
    }

    // if they are already logged in and/or the cookie is set use it
    if (bIsAuthed) {
        //element('ifrConfig').src = "http://config.phdinc.com/configurePart.asp?product_id=" + seriesId + "&orderData=" + sPickedPart + "&fromSystem=Sizing";
        // popup method
        window.open('http://config.phdinc.com/configurePart.asp?product_id=' + seriesId + '&orderData=' + sPickedPart + "&fromSystem=Sizing", AppCol + 'configwindow' + col, 'width=850,height=800,scrollbars=1')

    } else {
        // user needs to auth first
        //element('ifrConfig').src = "http://user.phdinc.com/?siteId=cad&fromApp=sizing&goingTo=http://config.phdinc.com/configurePart.asp?product_id=" + seriesId + "&orderData=" + sPickedPart + "&fromSystem=Sizing";
        // popup method
        window.open('http://user.phdinc.com/?siteId=cad&fromApp=sizing&goingTo=http://config.phdinc.com/configurePart.asp?product_id=' + seriesId + '&orderData=' + sPickedPart + "&fromSystem=Sizing", AppCol + 'configwindow' + col, 'width=850,height=800,scrollbars=1')
    }

    // show the modal popup
    //$find("ConfMX").show();

    return;
}

function cadOver(divCC) {
    // changes the css of the CAD config button

    element('divConfig' + divCC).className = 'detailsConfigButtonOver';
    return;
}

function cadOut(divCC) {
    // changes the css of the CAD config button

    element('divConfig' + divCC).className = 'detailsConfigButton';
    return;
}

function googleTrack() {

    pageTracker._trackEvent('Escapement_Sizing', 'Click', 'CAD Config');

}

function getSeriesId(series) {
    var id;
    switch (series) {
        case "160":
            {
                id = "6";
                break;
            }
        case "LC":
            {
                id = "59";
                break;
            }
        default:
            {
                alert("Transfer to CAD not configured for this Series... contact PHD.");
                id = "";
                break;
            }
    }
    return id;
}
