/**
 * ***************************************************************************
 * Javascript Library 
 *
 * Functions to improve the useablity of javascript
 *
 * @author Lorne Taylor
 * @revised 2007-02-27
 * ****************************************************************************
 */

/**
 * Set default values for function parameters. In JS it is not possible to assign 
 * a default value to function parameters.
 * @param str|int|array|bool value
 * @param str|int|array|bool default
 * @return string
 */
function init(value, default_value)
{
    if (value == undefined) {
        return default_value;
    } else {
        return value;
    }
}

/**
 * Get a reference to a DOM element by ID. This establishes a reference to both
 * the elements object properties and style properties.
 * @param string|object ref 
 */
function getElement(ref)
{
    var element = null;
    if (typeof(ref) == 'object') {
        return ref; 
    }
    else if (document.getElementById) {
        element = document.getElementById(ref);
    }
    else if (document.all) {
        element = document.all[ref];
    }
    else if (document.layers) {
        element = document.layers[ref];
    }

    // if element is defined 
    if (element) {
        return element;
    } else {
        return false;
    }
}

function setObj(ref, prop, value)
{
    var element = getElement(ref);
    if (element != null && prop != undefined && value != undefined) {
        element[prop] = value;
    } else {
        return false;   
    }
}

function getObj(ref, prop)
{
    var element = getElement(ref);
    if (element != null && prop != undefined) {
        return element[prop];
    } else {
        return element;
    }
}

function setStyle(ref, prop, value)
{
    var element = getElement(ref);
    if (element != null && prop != undefined && value != undefined) {
        element.style[prop] = value;
    } else {
        return false;
    }
}

function getStyle(ref, prop)
{
    var element = getElement(ref);
    if (element != null && prop != undefined) {
        return element.style[prop];
    } else {
        return element.style;
    }
}

/**
 * ********************************************************
 *  OBJECT FUNCTIONS
 *
 */  
   
var CACHE_HIGHLIGHT_CLASS_ID = new Object;
function setHighLightClass(ID, VALUE, ON_APPEND, CACHE_ID)
{
    // toggle previous element off
    setObj(CACHE_HIGHLIGHT_CLASS_ID[CACHE_ID], 'className', VALUE);
    // toggle new element on 
    setObj(ID, 'className', VALUE + ON_APPEND); 
    CACHE_HIGHLIGHT_CLASS_ID[CACHE_ID] = ID;
}
function setHighLight(A, B, C, D) { setHighLightClass(A,B,C,D); }
    
function setValue(ref, value)
{
    setObj(ref, 'value', value);
}

/**
 * ********************************************************
 *  STYLE FUNCTIONS (DHTML)
 *
 * Most CSS attributes are represented as properties in the Style object.      
 * For non hyphenated attributes, the property is identical, while 
 * for hyphenated attributes, drop the hyphen and 
 * capitalize the first letter following it.
 *
 * Examples:
 * color =	color
 * padding =	padding
 * background-color  =	backgroundColor
 * border-top-width =	borderTopWidth
 */  

function toggleVis(ID, LABEL_HIDDEN, LABEL_VISIBLE)
{
    if (getStyle(ID, 'visibility') == 'hidden') {
        setStyle(ID, 'visibility', 'visible');
        setStyle(ID, 'display', 'block');
        if (LABEL_VISIBLE != undefined) {
            ID = ID + 'ToggleSwitch';
            replaceLabel(ID, LABEL_VISIBLE);
        } 
    } else {
        setStyle(ID, 'visibility', 'hidden');
        setStyle(ID, 'display', 'none');
        if (LABEL_HIDDEN != undefined) {
            ID = ID + 'ToggleSwitch';
            replaceLabel(ID, LABEL_HIDDEN);
        } 

    }
}

function replaceLabel(ID, LABEL)
{
    var OBJ = getObj(ID); 
    if (OBJ) {
        if (OBJ.childNodes[0]) {
            OBJ.childNodes[0].nodeValue = LABEL;
        } else if (OBJ.value) {
            OBJ.value = LABEL;
        } else { //if (button.innerHTML)
            OBJ.innerHTML = LABEL;
        }
    }
}
/**
 * ********************************************************
 *  FORM CONTROL FUNCTIONS
 *
 */

function clearForm(ID)
{
    var FORM = getElement(ID);
    if (FORM) {
        for(i=0; i<FORM.length; i++) {
            var ELEMENT = FORM.elements[i];
            if (ELEMENT.type == 'submit' || ELEMENT.type == 'reset' || ELEMENT.type == 'button' || ELEMENT.type == 'hidden') {
                continue;
            } else {
                ELEMENT.value = '';
            }
        }
    }
    return false;
}

function clickOnce(ID)
{
    var BUTTON = getElement(ID);
    if (BUTTON) {
        if (document.all || document.getElementById) {
            BUTTON.disabled = true;
        } else {
            BUTTON.onclick = null;
            BUTTON.value = 'clicked';
        }
    }
    return true;
}

function confirmSubmit(MSG)
{
    var MSG = init(MSG, 'Are you sure?');
    if (confirm(MSG)) {
        return true;
    } else {
        return false;
    }
}
 
/* Puts all the selected elements from a multi-select box into CSV
 * and puts it in a form control
 * @param DOM obj form 
 * @param string NAME - name of multi-select control
 */
function getSelected(form, NAME) {
    NAME = init(NAME, 'SELECTED');
    MULTI_SELECT = form.elements[NAME];
    if (MULTI_SELECT == undefined) {
        return false;
    } else if (MULTI_SELECT.options.length == 0) {
        return false;
    } else {
        var VALUES = '';
        for (i=0; i<MULTI_SELECT.length; i++) {
            MULTI_SELECT.options[i].selected;
            VALUES = VALUES + MULTI_SELECT.options[i].value;

            // add a comma if not at the end
            if (i != (MULTI_SELECT.length-1)) {
                VALUES = VALUES + ',';
            }
        }
        MULTI_SELECT.form.elements[NAME + '_VALUES'].value = VALUES;
    } 
}

//  RADIO & CHECKBOX
function toggleChecked(ID)
{
    var ELEMENT = getElement(ID);
    if (ELEMENT) {
        ELEMENT.click();
    }
}
function checkRadio(A) {toggleChecked(A);}
function checkBox(A) {toggleChecked(A);}

function setChecked(ID, FORCE_CLICK)
{
    FORCE_CLICK = init(FORCE_CLICK, false);
    var ELEMENT = getElement(ID);
    if (ELEMENT) {
        if (ELEMENT.checked == undefined || ELEMENT.checked == false) {
            ELEMENT.click();
        } else if (FORCE_CLICK == true) {
            ELEMENT.click();    
        }
    }
}


function toggleDisabled(ID)
{
    var ELEMENT = getElement(ID);
    if (ELEMENT) {
        if (document.all || document.getElementById) {
            if (ELEMENT.disabled === true) {
                ELEMENT.disabled = false;
            } else {
                ELEMENT.disabled = true;
            }
        } else {
            if (ELEMENT.onclick !== null) {
                ELEMENT.onclick = null;
            }
        }
    }
}

/**
 * ********************************************************
 *  STRING FUNCTIONS
 *
 */

function autoTab(id, next_id)
{
    var element = getElement(id);
    var length = element.value.length;
    var max_length = element.getAttribute('maxlength');
    if (length == max_length) {
        var next_element = getObj(next_id);
        next_element.focus();
    }
}  
 
function padNum(ID)
{
    var ELEMENT = getElement(ID);
    var STR = ELEMENT.value.split('');
    if (ELEMENT.value.length == 1) {
        ELEMENT.value = '0' + ELEMENT.value;
    }
}  

function strUpperCase(ELEMENT, START, LENGTH)
{
    var START = init(START, 0);
    var LENGTH = init(LENGTH, ELEMENT.value.length);
    var UPPER_CASE = ELEMENT.value.substr(START, LENGTH);
    UPPER_CASE = UPPER_CASE.toUpperCase();
    var NO_CHANGE  = ELEMENT.value.substr(LENGTH);
    ELEMENT.value = UPPER_CASE + NO_CHANGE;
}
function strtoupper(A,B,C) { strUpperCase(A,B,C); }

