// Javascript form control functions
function clearForm(ref)
{
    var obj = getObj(ref);
    if (obj) {
        for(i=0; i<obj.length; i++) {
            var elem = obj.elements[i];
            // do not clear the value of buttons and hidden form elements
            if (elem.type == 'submit' || elem.type == 'reset' || elem.type == 'button' || elem.type == 'hidden') {
                continue;
            } else {
                elem.value = '';
            }
        }
    }
    return false;
}
function clickOnce(ref)
{
    var obj = getObj(ref);
    if (obj) {
        if (document.all || document.getElementById) {
            obj.disabled = true;
        } else {
            obj.onclick = null;
            obj.value = 'clicked';
        }
    }
    return true;
}
function confirmSubmit(msg)
{
    var msg = init(msg, 'Are you sure?');
    if (confirm(msg)) {
        return true;
    } else {
        return false;
    }
}
//  RADIO & CHECKBOX
function toggleChecked(ref)
{
    var obj = getObj(obj);
    if (obj) {
        obj.click();
    }
}
function checkRadio(a) {toggleChecked(a);}
function checkBox(a) {toggleChecked(a);}
function setChecked(ref)
{
    var obj = getObj(ref);
    if (obj) {
        if (obj.checked == undefined) {
            obj.click();
        }
    }
}
function toggleDisabled(ref)
{
    var obj = getObj(ref);
    if (obj) {
        if (document.all || document.getElementById) {
            if (obj.disabled === true) {
                obj.disabled = false;
            } else {
                obj.disabled = true;
            }
        } else {
            if (obj.onclick !== null) {
                obj.onclick = null;
            }
        }
    }
}
/* 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;
    } 
}
 */
/* ****************************************************************************
 * Base javascript library 
 *
 * Functions to improve the useablity of javascript
 *
 * @author Lorne Taylor
 * @revised 2007-05-28
 * ****************************************************************************
 */
/**
 * 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 (typeof(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 elem = null;
    if (typeof(ref) == 'object') {
        return ref; 
    }
    else if (document.getElementById) {
        elem = document.getElementById(ref);
    }
    else if (document.all) {
        elem = document.all[ref];
    }
    else if (document.layers) {
        elem = document.layers[ref];
    }
    // if element is defined 
    if (elem) {
        return elem;
    } else {
        return false;
    }
}
function setObj(ref, prop, value)
{
    var elem = getElement(ref);
    if (elem != null && prop != undefined && value != undefined) {
        elem[prop] = value;
    } else {
        return false;   
    }
}
function getObj(ref, prop)
{
    var elem = getElement(ref);
    if (elem != null && prop != undefined) {
        return elem[prop];
    } else {
        return elem;
    }
}
function setStyle(ref, prop, value)
{
    var elem = getElement(ref);
    if (elem != null && prop != undefined && value != undefined) {
        elem.style[prop] = value;
    } else {
        return false;
    }
}
function getStyle(ref, prop)
{
    var elem = getElement(ref);
    if (elem != null && prop != undefined) {
        return elem.style[prop];
    } else {
        return elem.style;
    }
}
/*
	Standards Compliant Rollover Script
	Author : Daniel Nolan
	http://www.bleedingego.co.uk/webdev.php
*/
function initRollovers() {
	if (!document.getElementById) return
	var sFlag = '_o';	
	var aPreLoad = new Array();
	var sTempSrc;
	var aImages = document.getElementsByTagName('img');
	for (var i = 0; i < aImages.length; i++) {		
		if (aImages[i].className == 'imgover') {
			var src = aImages[i].getAttribute('src');
			var ftype_start = src.lastIndexOf('.');
			var ftype = src.substring(ftype_start, src.length);
			// does src already have _o appended to filename
			if (src.substring((ftype_start-2), ftype_start) != sFlag) { 
				var hsrc = src.replace(ftype, sFlag+ftype);
			} else {
				var hsrc = src;
			}
			aImages[i].setAttribute('hsrc', hsrc);
			aPreLoad[i] = new Image();
			aPreLoad[i].src = hsrc;
			aImages[i].onmouseover = function() {
				sTempSrc = this.getAttribute('src');
				this.setAttribute('src', this.getAttribute('hsrc'));
			}	
			aImages[i].onmouseout = function() {
				if (!sTempSrc) sTempSrc = this.getAttribute('src').replace(sFlag+ftype, ftype);
				this.setAttribute('src', sTempSrc);
			}
		}
	}
}
window.onload = initRollovers;
// Javascript string functions
function autoTab(ref, next_ref)
{
    var obj = getObj(ref);
    var len = obj.value.length;
    var max_len = obj.getAttribute('maxlength');
    if (len == max_len) {
        var next_elem = getObj(next_ref);
        next_elem.focus();
    }
}  
function padNum(ref)
{
    var obj = getElement(ref);
    //var str = obj.value.split('');
    if (obj.value.length == 1) {
        obj.value = '0' + obj.value;
    }
}  
function strUpperCase(ref, start, len)
{
    var obj   = getObj(ref); 
    var start = init(start, 0);
    var len   = init(len, obj.value.length);
    var uc    = obj.value.substr(start, len);
    uc = uc.toUpperCase();
    var str   = obj.value.substr(len);
    obj.value = uc + str;
}
function strtoupper(a,b,c) { strUpperCase(a,b,c); }
/**
 * ********************************************************
 *  JAVASCRIPT 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 the hyphen.
 *
 * Examples:
 * color = color
 * padding = padding
 * background-color = backgroundColor
 * border-top-width = borderTopWidth
 */  
function toggleVis(ref, label_hid, label_vis)
{
    if (getStyle(ref, 'visibility') == 'hidden') {
        setStyle(ref, 'visibility', 'visible');
        setStyle(ref, 'display', 'block');
        if (label_vis != undefined) {
            ref += 'ToggleSwitch';
            setLabel(ref, label_vis);
        } 
    } else {
        setStyle(ref, 'visibility', 'hidden');
        setStyle(ref, 'display', 'none');
        if (label_hid != undefined) {
            ref += 'ToggleSwitch';
            setLabel(ref, label_hid);
        } 
    }
}
function setLabel(ref, label)
{
    var obj = getObj(ref); 
    if (obj) {
        if (obj.childNodes[0]) {
            obj.childNodes[0].nodeValue = label;
        } else if (obj.value) {
            obj.value = label;
        } else if (obj.innerHTML) {
            obj.innerHTML = label;
        }
    }
}
