/* ==================================================
 * Module:  scripts.js
 * Created: 16/01/2007
 * Author:  Colin Orr
 * ================================================== */

//==================================================
//  Determine the Browser and version
//==================================================
function Browser() 
{
    //  Initialise the properties
    this.isIE = false;
    this.isNS = false;
    this.version = null;
    
    //  Find the user agent containing the browser details
    var userAgent = navigator.userAgent;

    //  Check for the browser type and version
    var type = "MSIE";
    var index = userAgent.indexOf(type);
    if (index >= 0) 
    {
        this.isIE = true;
        this.version = parseFloat(userAgent.substr(index + type.length));
        return;
    }
    
    type = "Netscape6/";
    index = userAgent.indexOf(type);
    if (index >= 0) 
    {
        this.isNS = true;
        this.version = parseFloat(userAgent.substr(index + type.length));
        return;
    }
    
    //  Treat any other "Gecko" browser as NS 6.1
    type = "Gecko";
    index = userAgent.indexOf(type);
    if (index >= 0) 
    {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

//==================================================
//  Create a global variable for the current browser
//==================================================
var browser = new Browser();

//==================================================
//  Disables the given button
//==================================================
function bmeDisableButton(button)
{
    button.disabled = true;
}

//==================================================
//  Prints the contents of the given element
//==================================================
function bmePrint(element)
{
    //  Build a printer friendly page containing the given element
    var printPage = window.open("", "", "toolbar=no,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes,width=300,height=200,top=0,left=0");
    printPage.document.write("<html><head>");
    
    //  Add the current title
    var title = document.getElementsByTagName("title");
    printPage.document.write(bmeOuterHTML(title));
            
    //  Add any stylesheet links
    var stylesheets = document.getElementsByTagName("link");
    printPage.document.write(bmeOuterHTML(stylesheets));
            
    printPage.document.write("</head>");
            
    //  Open the body tag with scripts necessary to print and close the form
    printPage.document.write("<body onload=\"window.print(); window.close();\"><form>");
            
    //  Add the current element
    printPage.document.write(bmeOuterHTML(element));
            
    //  Close the document
    printPage.document.write("</form></body></html>");
    printPage.document.close();
}

//==================================================
//  Gets the outer HTML code for the element
//==================================================
function bmeOuterHTML(element)
{
    //  Try to retrieve using the outerHTML property
    if(element.outerHTML) return element.outerHTML;

    //  Generate the outer HTML
    var html = "";

    //  Check if an individual element have been given
    if(element.tagName)
    {            
        //  Generate the outer HTML
        html = "<" + element.tagName;

        //  Add any attributes
        for(var i=0; i<element.attributes.length; i++)
        {
            html += " " + element.attributes[i].name + "=\"" + element.attributes[i].value + "\"";
        }
        html += ">";

        //  Add the content
        html += element.innerHTML;

        //  Close the tag
        html += "</" + element.tagName + ">";
    }
    else if(element.length)
    {
        //  If it's a collection of elements, recursively build the HTML
        for(var i=0; i<element.length; i++)
        {
            html += bmeOuterHTML(element[i]);
        }
    }
    
    return html;
}

//==================================================
//  Centers a popup window in the screen
//==================================================
function bmePopUpCenter(table, position)
{
    //  Find the left and top coordinates for the center
    var left = (document.body.clientWidth / 2) - (table.offsetWidth / 2);
    var top = (document.body.clientHeight / 2) - (table.offsetHeight / 2);
    if(0 > left) left = 5;
    if(0 > top) top = 5;
    
    //  Set the coordinates and persist the value
    table.style.left = left;
    table.style.top = top;
    position.value= parseInt(left) +";"+ parseInt(top);
}

//==================================================
//  Drag and drop methods for a popup window
//==================================================

// Global object to hold the drag information
var dragObject = new Object();

dragObject.element = null;
dragObject.position = null;
dragObject.startX = 0;
dragObject.startY = 0;
dragObject.startLeft = 0;
dragObject.startTop = 0;

//==================================================
//  Starts a drag for the given element
//==================================================
function bmeDragStart(event, element, position) 
{
    // Find the element to be dragged
    if(element) dragObject.element = element;
    else
    {
        //  If no element is given, use the current one
        if(browser.isIE) dragObject.element = window.event.srcElement;
        else if (browser.isNS) dragObject.element = event.target;
        
        //  If the current element is a text node, use it's parent.
        if (dragObject.element.nodeType == 3) 
        {
            dragObject.element = dragObject.element.parentNode;
        }
    }
    
    // Set the hidden field for position
    dragObject.position = position;
    
    // Get cursor position with respect to the page
    if(browser.isIE)
    {
        dragObject.startX = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
        dragObject.startY = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }
    else if(browser.isNS)
    {
        dragObject.startX = event.clientX + window.scrollX;
        dragObject.startY = event.clientY + window.scrollY;
    }

    // Save starting positions of the element
    dragObject.startLeft = parseInt(dragObject.element.style.left, 10);
    dragObject.startTop = parseInt(dragObject.element.style.top, 10);
    
    if (isNaN(dragObject.startLeft)) dragObject.startLeft = 0;
    if (isNaN(dragObject.startTop)) dragObject.startTop  = 0;
    
    // Capture mousemove and mouseup events on the page
    if (browser.isIE) 
    {
        document.attachEvent("onmousemove", bmeDragGo);
        document.attachEvent("onmouseup", bmeDragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    else if (browser.isNS) 
    {
        document.addEventListener("mousemove", bmeDragGo, true);
        document.addEventListener("mouseup", bmeDragStop, true);
        event.preventDefault();
    }
}

//==================================================
//  Moves the object while it's being dragged
//==================================================
function bmeDragGo(event) 
{
    var x = 0;
    var y = 0;
    
    // Get cursor position with respect to the page
    if (browser.isIE) 
    {
        x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }
    
    if (browser.isNS) 
    {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    
    // Move drag element by the same amount the cursor has moved
    dragObject.element.style.left = (dragObject.startLeft + x - dragObject.startX) + "px";
    dragObject.element.style.top = (dragObject.startTop  + y - dragObject.startY) + "px";
    
    // Stop the event from bubbling
    if (browser.isIE) 
    {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    else if (browser.isNS) event.preventDefault();
}

//==================================================
//  Releases mouse event handlers used during the 
//  drag and updates the position
//==================================================
function bmeDragStop(event) 
{
    // Stop capturing mousemove and mouseup events
    if (browser.isIE) 
    {
        document.detachEvent("onmousemove", bmeDragGo);
        document.detachEvent("onmouseup", bmeDragStop);
    }
    else if (browser.isNS) 
    {
        document.removeEventListener("mousemove", bmeDragGo, true);
        document.removeEventListener("mouseup", bmeDragStop, true);
    }
    
    if(dragObject.position) 
    {
        dragObject.position.value= parseInt(dragObject.element.style.left) +";"+ parseInt(dragObject.element.style.top);
    }
}

//==================================================
//  Date box event handlers
//==================================================
function bmeDateBox_KeyDown(dateBox) 
{ 
    //  Check whether 'ctrl' has been held down
    if(!event.ctrlKey) return; 
    
    if(68 == event.keyCode || 84 == event.keyCode) 
    {
        //  't' or 'd' has been entered so use the current date
        dateBox.value = bmeDateBoxFormat(new Date());
    } 
    else if(107 == event.keyCode || 38 == event.keyCode || 39 == event.keyCode) 
    {
        //  Cursor up or '+' has been entered so add a day
        dateBox.value = bmeDateBoxFormat(new Date(bmeDateBoxParse(dateBox.value).getTime() + 1*24*60*60*1000)); 
    }
    else if(109 == event.keyCode || 37 == event.keyCode || 40 == event.keyCode) 
    {
        //  Cursor down or '-' has been entered so subtract a day
        dateBox.value = bmeDateBoxFormat(new Date(bmeDateBoxParse(dateBox.value).getTime() - 1*24*60*60*1000));
    }
    
    dateBox.focus(); 
    dateBox.select(); 
}

function bmeDateBox_Change(dateBox) 
{ 
    if(dateBox.value.toLowerCase() == "t" || dateBox.value.toLowerCase() == "d" ) 
    {
        //  't' or 'd' has been entered so use the current date
        dateBox.value = bmeDateBoxFormat(new Date()); 
    }
    else if(dateBox.value.substring(0,1) == "+" && dateBox.value.length > 1)
    { 
        //  Add the number of days entered into the field
        var daysAdded = parseInt(dateBox.value.substring(1, dateBox.value.length)); 
        dateBox.value = bmeDateBoxFormat(new Date((new Date()).getTime() + daysAdded*24*60*60*1000)); 
    } 
    else if(dateBox.value.substring(0,1) == "-" && dateBox.value.length > 1)
    { 
        //  Subtract the number of days entered into the field
        var daysSubtracted = parseInt(dateBox.value.substring(1, dateBox.value.length)); 
        dateBox.value = bmeDateBoxFormat(new Date((new Date()).getTime() - daysSubtracted*24*60*60*1000)); 
    } 
}
    
//==================================================
//  Formats the date correctly
//==================================================
function bmeDateBoxFormat(date) 
{ 
    var year = date.getFullYear(); 
    var month = date.getMonth() + 1; 
    var day = date.getDate(); 
    var yearString = new String(year); 
    var monthString = new String(month); 
    var dayString = new String(day); 
    if(monthString.length == 1) monthString = "0" + monthString; 
    if(dayString.length == 1) dayString = "0" + dayString; 
    
    return dayString +"/"+ monthString +"/"+ yearString; 
}

//==================================================
//  Parses the given value to a date
//==================================================
function bmeDateBoxParse(dateString) 
{ 
    var dateParts = dateString.split('/'); 
    var date = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]); 
    if("NaN" == date) date = new Date(); 
    return date; 
}

//==================================================
//  Selects the list items given
//==================================================
function bmeListSelect(table, selection) 
{ 
    for(var i=0; i<table.rows.length; i++) 
    { 
        var rowCurrent = table.rows[i]; 
        
        if(0 < rowCurrent.cells.length && rowCurrent.cells[0].tagName.toLowerCase() == "td") 
        { 
            var selected = (rowCurrent.cells[0].childNodes[0].checked); 
            for(var j=1; j<rowCurrent.cells.length; j++) 
            { 
                var cellCurrent = rowCurrent.cells[j]; 
                if(selected) cellCurrent.className = "bmeListSelected"; 
                else cellCurrent.className = "bmeListCell"; 
            } 
            if(selected) selection.value = rowCurrent.cells[0].childNodes[0].value; 
        } 
    } 
}

//==================================================
//  Resizes the list to provide scrolling
//==================================================
function bmeListResize(inner, outer) 
{ 
    inner.style.position = "absolute"; 
    if(outer.offsetWidth > 2) inner.style.width = outer.offsetWidth - 2; 
    if(outer.offsetHeight > 2) inner.style.height = outer.offsetHeight - 2; 
}

//==================================================
//  Attaches an event to the given object
//==================================================
function bmeListAddEvent(elementObject, eventName, functionObject) 
{ 
    if(document.addEventListener) 
    { 
        window.addEventListener(eventName, functionObject, false); 
    } 
    else if(document.attachEvent) 
    { 
        if(0 != eventName.indexOf("on")) eventName = "on" + eventName; 
        elementObject.attachEvent(eventName, functionObject); 
    } 
}

//==================================================
//  Scrolls the list to the current position
//==================================================
function bmeListScroll(div, position)
{ 
    position.value = div.scrollLeft +","+ div.scrollTop;
}