
/*
    @author Jeff

    Add the trim method to the String class.
*/

String.prototype.trim = function() {
    // Strip leading and trailing white-space
    return this.replace(/^\s*|\s*$/g, "");
}


/*
    @author Jeff

    Add a replace all function to the String class to
    extend the replace that is already there.
*/
String.prototype.replaceAll = function(find, repl){
    var i = this.indexOf(find);
    var value = this;

    while( i > -1){
        value = value.replace(find, repl);
        i = value.indexOf(find, i + repl.length);
    }

    return value;
}
        
/*
    @author Jeff

    Scroll to the bottom of a scrollable div
*/
function scrollBottom(div){
    var objDiv = document.getElementById(div);
    objDiv.scrollTop = objDiv.scrollHeight;
}

var hD="0123456789ABCDEF";
function decToHex(dec){

    var hex = hD.substr(dec & 15,1);

    while(dec > 15){
        dec >>= 4;
        hex = hD.substr(dec & 15,1) + hex;
    }

    return hex;
}

function hexToDec(hex){
    return parseInt(hex,16);
}

var STEPS = 200;

function fadeElement(id, start_red, start_green, start_blue, goal_red, goal_green, goal_blue){
    var red_difference = goal_red - start_red;
    var green_difference = goal_green - start_green;
    var blue_difference = goal_blue - start_blue;

    var red_step = red_difference / STEPS;
    var green_step = green_difference / STEPS;
    var blue_step = blue_difference / STEPS;

    var lock = document.getElementById(id + "_lock");
    var lockVal = parseInt(lock.value) + 1;
    lock.value = lockVal;
    
    privateFadeText(id, red_step, green_step, blue_step, goal_red, goal_green, goal_blue, start_red, start_green, start_blue, lockVal);
}

function privateFadeText(row_id, red_step, green_step, blue_step, goal_red, goal_green, goal_blue, current_red, current_green, current_blue, lockVal){
    row = document.getElementById(row_id);
    var lock = document.getElementById(row_id + "_lock");
    
    if(parseInt(current_red) != goal_red && parseInt(current_green) != goal_green && parseInt(current_blue) != goal_blue) { //If color is not the goal yet
        if(lockVal == parseInt(lock.value)){
            new_red = current_red + red_step;
            new_green = current_green + green_step;
            new_blue = current_blue + blue_step;

            row.style.backgroundColor = "#" + decToHex(parseInt(new_red)) + decToHex(parseInt(new_green)) + decToHex(parseInt(new_blue));
            setTimeout("privateFadeText('" + row_id + "'," + red_step + "," + green_step + "," + blue_step + "," + goal_red + "," + goal_green + "," + goal_blue + "," + new_red + "," + new_green + "," + new_blue + "," + lockVal + ")" ,15); 
        }        
    }else{
        // Set the color to the goal to account for roundoff errors, sometimes you will get an RGB value
        // that is one off at the end.
        row.style.backgroundColor = "#" + decToHex(goal_red) + decToHex(goal_green) + decToHex(goal_blue);        
        lock.value = '0';
    }
}


//Old Common stuff
function isDefined(val){
    return !(typeof(window[val]) == "undefined");
}

function showElement(id){
    element = document.getElementById(id);
    if (document.all){
        element.style.display = "block"; //IE4+ specific code
    }else {
        element.style.display = ""; //Netscape and Mozilla
    }
}

function hideElement(id){
    element = document.getElementById(id);
    element.style.display = "none";
}

function showHideElement(id){
    element = document.getElementById(id);
    if(element.style.display == "none"){
        showElement(id);
    }else{
        hideElement(id);
    }
}

function toggleRows(elm) {
    var rows = document.getElementsByTagName("tr");
    elm.style.backgroundImage = "url(/images/folder-closed.gif)";
    var newDisplay = "none";
    var thisID = elm.parentNode.parentNode.parentNode.id + "-";
    // Are we expanding or contracting? If the first child is hidden, we expand
    for (var i = 0; i < rows.length; i++) {
        var r = rows[i];
        
        if (matchStart(r.id, thisID, true)) {
            if (r.style.display == "none") {
                if (document.all){
                    newDisplay = "block"; //IE4+ specific code
                }else {
                    newDisplay = "table-row"; //Netscape and Mozilla
                }
                elm.style.backgroundImage = "url(/images/folder-open.gif)";
            }
            break;
        }
    }
 
    // When expanding, only expand one level.  Collapse all desendants.
    var matchDirectChildrenOnly = (newDisplay != "none");

    for (var j = 0; j < rows.length; j++) {
        var s = rows[j];
        if (matchStart(s.id, thisID, matchDirectChildrenOnly)) {
            s.style.display = newDisplay;
            var cell = s.getElementsByTagName("td")[0];
            var tier = cell.getElementsByTagName("div")[0];
        }
    }
}

function matchStart(target, pattern, matchDirectChildrenOnly) {
    var pos = target.indexOf(pattern);
    if (pos != 0){
        return false;
    }
    
    if (!matchDirectChildrenOnly) {
        return true;
    }
    
    if (target.slice(pos + pattern.length, target.length).indexOf("-") >= 0) 
        return false;
    
    return true;
}

function collapseAllRows() {
    var rows = document.getElementsByTagName("tr");
    for (var j = 0; j < rows.length; j++) {
        var r = rows[j];
        if (r.id.indexOf("-") >= 0) {
            r.style.display = "none";    
        }
    }
}

function showHideFloatingLayer(elm){
    var floatingLayer = document.getElementById(elm);
    var className = floatingLayer.getAttribute("class");
    
    if(className == "drsElement"){
        hideFloatingLayer(elm);
    }else{
        showFloatingLayer(elm);
    }
}

function showFloatingLayer(elm){
    floatingLayer = document.getElementById(elm);
    floatingLayer.setAttribute("class", "drsElement");
    floatingLayer.setAttribute("className", "drsElement");
}

function hideFloatingLayer(elm){
    floatingLayer = document.getElementById(elm);
    floatingLayer.setAttribute("class", "HiddenFloatingDiv");
    floatingLayer.setAttribute("className", "HiddenFloatingDiv");
}

function displayMessage(xmlMessage){
    var msgTxt = xmlMessage.xml.firstChild.nodeValue;
    displayTextMessage(msgTxt);
}

function displayTextMessage(msgTxt){
    var textDisplay = document.getElementById("messageText");
    textDisplay.innerHTML = msgTxt;
    showFloatingLayer("messageFloatingLayer");
}

function  messageOK(){
    hideFloatingLayer("messageFloatingLayer");
}

function formatSpeed(spd){
    var returnVal = spd.toFixed(2) + " km/hr";
    return returnVal;    
}

function formatDistance(dist){
    var returnVal = (dist/1000.0).toFixed(2) + " km";
    return returnVal;
}

function formatSeconds(seconds){
    var minutes = parseInt(seconds / 60);
    seconds = seconds % 60;//correct
    var hours = minutes / 60;
    minutes = minutes % 60;//correct
    var days = parseInt(hours / 24);
    hours = parseInt(hours % 24);
    
    if(minutes < 10){
        minutes = "0" + minutes;
    }    
    if(seconds < 10){
        seconds = "0" + seconds;
    }
    
    var returnVal = hours + ":" + minutes + ":" + seconds;
    if(days > 0){        
        returnVal = days + " days " + returnVal; 
    } 

    return returnVal;
}

function formatMiliseconds(miliseconds){
    var seconds = miliseconds / 1000;
    return seconds + " s";
}

function isIE(){
    return navigator.appName == "Microsoft Internet Explorer";
}

function toggleVisible(toToggle){    
    hideAll();

    leftImage = document.getElementById(toToggle+'LeftImage');
    rightImage = document.getElementById(toToggle+'RightImage');
    cell = document.getElementById(toToggle+'TitleCell');

    leftImage.src='/images/tab-left-on.gif';
    rightImage.src='/images/tab-right-on.gif';

    cell.style.backgroundColor='#2F4899';
    cell.className='TabTitle';

    currentStyle = document.getElementById(toToggle).style;
    if( currentStyle.display == 'none' )
        currentStyle.display = '';
    else
        currentStyle.display = 'none';
}