// ===============================================================================================
// NAVIGATION CONTROL
// ===============================================================================================

//Toggles the display of the clicked image in the navigation control and its associated elements
function toggleNavNode(img)
{
    var isCollapsed = (img.src.indexOf('collapsed') > -1);

    if (isCollapsed) {       
        //Hide all ULs
        var allULs = getTopLevelUL(img).getElementsByTagName('UL');
        for (var i = 0; i < allULs.length; i++) {
            allULs[i].style.display = 'none';
        }

        //Set all images to 'collapsed' mode
        var allIMGs = getTopLevelUL(img).getElementsByTagName('IMG');
        for (var i = 0; i < allIMGs.length; i++) {
            allIMGs[i].src = allIMGs[i].src.replace('expanded', 'collapsed');
            allIMGs[i].alt = 'expand';
        }

        //Show the actual UL selected
        getAssociatedUL(img).style.display = 'block';

        //Loop up through parent elements showing all ULs and setting all images to 'expanded' mode on the way    
        var element = img;       
        while (element.parentNode.tagName != 'DIV') {
            element = element.parentNode;
            
            if (element.tagName == 'UL') {
                element.style.display = 'block';
            } 
            
            if (element.tagName == 'LI') {
                var elImg = element.getElementsByTagName('IMG')[0];
                elImg.src = elImg.src.replace('collapsed', 'expanded');
                elImg.alt = 'collapse';
            }         
        }
    }
    else {
        //Set image to 'collapsed' mode
        img.src = img.src.replace('expanded', 'collapsed');
        img.alt = 'expand';

        //Hide the actual UL selected
        getAssociatedUL(img).style.display = 'none';
    }
}

//Returns the UL associated with the clicked image
function getAssociatedUL(img)
{
    return img.parentNode.getElementsByTagName('UL')[0];
}

//Returns the top level UL of the navigation control
function getTopLevelUL(img)
{
    var element = img;
    while (element.parentNode.tagName != 'DIV') {
        element = element.parentNode;
    }
    return element;
}

// ===============================================================================================
// USER INTERACTION
// ===============================================================================================

//Gets current contents of the clipboard
function clipboardText() { return window.clipboardData.getData("Text"); }

//Get the key code from an event
function keyCodeValue(e) { if (e == null) { return null } else { return window.event ? e.keyCode : e.which; } }

//Key code functions
function keyCodeIsNumber(keyCode) { return (keyCode > 47 && keyCode < 58); }
function keyCodeIsComma(keyCode) { return (keyCode == 44); }
function keyCodeIsFullStop(keyCode) { return (keyCode == 46); }
function keyCodeIsForwardSlash(keyCode) { return (keyCode == 47); }

function keyCodeAllowedForInteger(keyCode) { return (keyCodeIsNumber(keyCode)); }
function keyCodeAllowedForNumber(keyCode) { return (keyCodeIsNumber(keyCode) || keyCodeIsFullStop(keyCode) || keyCodeIsComma(keyCode)); }
function keyCodeAllowedForDate(keyCode) { return (keyCodeIsNumber(keyCode) || keyCodeIsForwardSlash(keyCode)); }

function onlyAllowIntegerOnKeyPress(e)
{ if (!keyCodeAllowedForInteger(keyCodeValue(e))) { cancelKeyPress(e); } }

function onlyAllowNumberOnKeyPress(e)
{ if (!keyCodeAllowedForNumber(keyCodeValue(e))) { cancelKeyPress(e); } }

function onlyAllowDateOnKeyPress(e)
{ if (!keyCodeAllowedForDate(keyCodeValue(e))) { cancelKeyPress(e); } }

function onlyAllowIntegerOnPaste(obj, e)
{
    var newText = clipboardText();
    var pasteAllowed = true;
    for (i = 0; i < newText.length; i++) {
        if (!keyCodeAllowedForInteger(newText.charCodeAt(i))) { pasteAllowed = false; break; }
    }
    if (!pasteAllowed) { cancelEventBubble(e); cancelReturnValue(e); }
}

function onlyAllowNumberOnPaste(obj, e)
{
    var newText = clipboardText();
    var pasteAllowed = true;
    for (i = 0; i < newText.length; i++) {
        if (!keyCodeAllowedForNumber(newText.charCodeAt(i))) { pasteAllowed = false; break; }
    }
    if (!pasteAllowed) { cancelEventBubble(e); cancelReturnValue(e); }
}

function onlyAllowDateOnPaste(obj, e)
{
    var newText = clipboardText();
    var pasteAllowed = true;
    for (i = 0; i < newText.length; i++) {
        if (!keyCodeAllowedForDate(newText.charCodeAt(i))) { pasteAllowed = false; break; }
    }
    if (!pasteAllowed) { cancelEventBubble(e); cancelReturnValue(e); }
}

//Cancel the current event and bubbling
function cancelEventBubble(e)
{
    if (e != null) {
        if (e.stopPropagation) { e.stopPropagation(); }
        else { e.cancelBubble = true; }
    }
}

function cancelReturnValue(e)
{
    if (e != null) {
        if (e.preventDefault) { e.preventDefault(); }
        else { e.returnValue = false; }
    }
}

//Cancel key press event unless backspace, tab or enter
function cancelKeyPress(e)
{
    var key = keyCodeValue(e);
    if (key != 8 && key != 9 && key != 0 && key != 13) { cancelEventBubble(e); cancelReturnValue(e); }
}

//Click button
function clickElement(elementID, e)
{
    var element = document.getElementById(elementID);
    if (element != null) {
        cancelKeyPress(e);

        var doClick = true;

        if (element.enabled && element.enabled == false) { doClick = false; }
        if (element.disabled && element.disabled == true) { doClick = false; }

        if (doClick) {
            if (document.createEvent) {
                if (element.href && element.href.indexOf("__doPostBack('") != -1) {
                    //LinkButton, do PostBack
                    eval(element.href);
                } else {
                    //Button, raise click event
                    var evt = document.createEvent("MouseEvents");
                    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    element.dispatchEvent(evt);
                }
            }
            else if (element.click) {
                element.click();
            }
        }
    }
}

//Check if browser is Internet Explorer
function isIE() { return (navigator.appName.indexOf("Microsoft") != -1) || (navigator.appName.indexOf("MSIE") != -1); }

//Click a button if a certain key is pressed
function clickButtonOnKeypress(buttonID, keyCode, formID, e)
{
    var key = keyCodeValue(e);
    if (key == keyCode) {
        if (isIE()) {
            var form = document.getElementById(formID);
            if (form != null)
            { window.external.AutoCompleteSaveForm(form); }
        }
        clickElement(buttonID, e);
    }
}

// ===============================================================================================
// MISCELLANEOUS
// ===============================================================================================

//Updates the 'total' column on the spares page when the quantity is altered
function calculateTotal(txtQuantity, lblPrice, lblTotalID)
{
    var quantity = parseFloat(txtQuantity.value);
    var price = parseFloat(document.getElementById(lblPrice).innerHTML);
    var lblTotal = document.getElementById(lblTotalID);

    lblTotal.innerHTML = roundNumberAsString(quantity * price, 2);
}

//Rounds a number to a specified amount of decimal places
function roundNumber(num, dec)
{
    var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
    return result;
}

//Rounds a number to a specified amount of decimal places and returns as a string which always contains that amount of decimal places
function roundNumberAsString(num, dec)
{
    var result = new String(roundNumber(num, dec));
    var decPointPos = result.indexOf('.');
    var currDecPlaces = 0;

    if (decPointPos >= 0) {
        currDecPlaces = result.length - decPointPos - 1;
    }
    else {
        result = result + '.';
    }

    for (var i = currDecPlaces; i < dec; i++) {
        result = result + '0';
    }

    return result;
}

//Refreshes machine cascading dropdown after populating its context key field
function getMachines(ddlMachineType, rbnShowAllID)
{
    var showAll = (document.getElementById(rbnShowAllID).checked) ? 1 : 0;
    var cddMachine = $find(cddMachineID); //This ID variable is added to the page via the code-behind and an inline script block

    if (!cddMachine) return;

    cddMachine.set_contextKey(ddlMachineType.value + '|' + showAll);
    cddMachine._onParentChange(false); //This will cause cascading dropdown to refresh (reload from database)
}

//Confirm submit success, and then request if user wishes to clear down order
function showSubmitConfirm(btnRemoveAllID)
{
    if (confirm('Order has been successfully submitted.\n\nClick \'OK\' to clear down your order, or \'Cancel\' to keep it on screen.')) {
        var btnRemoveAll = document.getElementById(btnRemoveAllID);
        if (document.createEvent) {
            eval(btnRemoveAll.href);
        }
        else if (btnRemoveAll.click) {
            btnRemoveAll.click();
        }
    }
}

//Shows a message in a modal pop-up from the master page
function showMessagePopUp(title, message, showHome, delay)
{
    var messagePopUp = $find('mpeMessageBehaviour');

    if (!messagePopUp) return;
    
    document.getElementById('spnMessageTitle').innerHTML = title;
    document.getElementById('divMessageBody').innerHTML = message;

    if (showHome) {
        document.getElementById('divMessageClose').style.display = 'none';
        document.getElementById('divMessageHome').style.display = 'block';
    }
    else {
        document.getElementById('divMessageClose').style.display = 'block';
        document.getElementById('divMessageHome').style.display = 'none';
    }

    if (delay) {
        setTimeout(function() { messagePopUp.show(); }, 250);
    }
    else {
        messagePopUp.show();
    }
}

//Shows the async waitscreen
function showWaitScreen()
{
    var waitScreen = $find('mpeWaitScreenBehaviour');
    if (waitScreen) waitScreen.show();
}

//Hides the async waitscreen
function hideWaitScreen()
{
    var waitScreen = $find('mpeWaitScreenBehaviour');
    if (waitScreen) waitScreen.hide();
}

//Select and focus on a textbox
function selectAndFocusTextbox(txtBoxId)
{
    setTimeout(function()
    {
        var txtBox = document.getElementById(txtBoxId);
        if (txtBox && txtBox.select && txtBox.focus) {
            txtBox.select();
            txtBox.focus();
        }
    }, 250);
}

var tickerSpeed = 2; //Speed of news ticker scroll effect

//Scroll the news ticker area
function scrollTicker()
{
    var divTickerInner = document.getElementById('divTickerInner');
    var divTickerInnerLeft = parseInt(divTickerInner.style.left);
    var lblTicker = document.getElementById('spnTickerText');

    divTickerInner.style.left = (divTickerInnerLeft > (-10 - lblTicker.offsetWidth)) ? divTickerInnerLeft - tickerSpeed + 'px' : '910px';
}

//Pauses or re-starts ticker when mouse is hovered over or leaves ticker area respectively
function pauseTicker(isOver)
{
    tickerSpeed = (isOver) ? 0 : 2;
}

//Re-size footer area and start news ticker (if available) when the page loads
window.onload = function() { if (document.getElementById('divTickerInner')) setInterval('scrollTicker()', 30); }

//Hides an element
function hide(element)
{
    if (typeof (element) == 'string') element = document.getElementById(element);
    if (element) element.style.display = 'none';
}

//Shows an element
function show(element)
{
    if (typeof (element) == 'string') element = document.getElementById(element);
    if (element) element.style.display = 'block';
}