//toggle diplay of an object on the page by ID
function toggleDisplayDomElement(element) {
    var dom_element = YAHOO.util.Dom.get(element);

    if(dom_element.style.display == 'none') {
        dom_element.style.display = 'block';
    } else {
        dom_element.style.display = 'none';
    }
}

function loadStore(url) {
    var dsXHR = new YAHOO.util.XHRDataSource(url);
    return dsXHR;
}

/* 
* unescapeHtml JS built-in function cannot handle more than 4k at a time
* this function breaks it up into 4k chunks, unescapes and returns full string
*/
function unescapeEditorHtml(str) {
    
    var len = str.length;
    
    var numParts = Math.ceil(len / 4000);
    
    var out = "";
    
    for( var i=0; i < numParts; i++ ) {
        var sub = str.substr((i * 4000), 4000);
        
        out += sub.unescapeHtml();
    }
    
    return out;
}

function isArray(testObject) {   
    return testObject && !(testObject.propertyIsEnumerable('length')) && typeof testObject === 'object' && typeof testObject.length === 'number';
}

function refreshPage() {
    history.go(0);
}

function inArray(arr, val) {
    for (var i in arr) {
        if (arr[i] === val) return i;
    }
    return -1;
}

function getCheckedRadioButton(radios_group) {
    for (var ctr = 0; ctr < radios_group.length; ctr++) {
        if(radios_group[ctr].checked == true) {
            return radios_group[ctr].value;
        }
    }
    
    return false;
}

function setRadioButtonGroup(grp, val) {
    if(!grp)
        return;
    var radioLength = grp.length;
    if(radioLength == undefined) {
        grp.checked = (grp.value == val.toString());
        return;
    }
    for(var i = 0; i < radioLength; i++) {
        grp[i].checked = false;
        if(grp[i].value == val.toString()) {
            grp[i].checked = true;
        }
    }
}

//checks to see if user hit enter key - returns boolean
function checkEnterKey(e) {
    var characterCode;

    if (e) {
        if(e.which){ //if which property of event object is supported (NN4)
           characterCode = e.which; //character code is contained in NN4's which property
        } else {
           characterCode = e.keyCode; //character code is contained in IE's keyCode property
        }

        if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
           return true;
        } else {
           return false;
        }
    } else {
        return false;
    }
}

function setDropdownValue(s, v) {
    if (typeof s != 'undefined') {
        for ( var i = 0; i < s.options.length; i++ ) {
            if ( s.options[i].value == v ) {
                s.options[i].selected = true;
                return;
            }
        }
    }
}

function setCheckbox(field,value) {
    if (value == 1) {
        field.checked = true;
    } else {
        field.checked = false;
    }
}

function getCheckbox(field) {
    if (field.checked) {
        return 1;
    } else {
        return 0;
    }
}

/*
Uses: Flash objects always render on highest layer. When popping modal window, it is partially hidden behind flash objects.
Params:
    hideObj - id value of dom object
    objType - ex. div, table or * for all
    scope   - scope targets a dom node as the top of a tree to search. Ex. search everything inside div id = pageBodyContent
*/
function hideDomObjects(hideObj, objType, scope) {
    YAHOO.util.Dom.getElementsByClassName(hideObj,objType,scope,
        function (el) {
            YAHOO.util.Dom.setStyle(el,'visibility','hidden');
        }
    )
}

/*
Uses: Flash objects always render on highest layer. When popping modal window, it is partially hidden behind flash objects.
Params:
    hideObj - id value of dom object
    objType - ex. div, table or * for all
    scope   - scope targets a dom node as the top of a tree to search. Ex. search everything inside div id = pageBodyContent
*/
function showDomObjects(hideObj, objType, scope) {
    YAHOO.util.Dom.getElementsByClassName(hideObj,objType,scope,
        function (el) {
            YAHOO.util.Dom.setStyle(el,'visibility','visible');
        }
    )
}

function resetScroll(id) {
    document.getElementById(id).scrollTop = 0;
}

//moving items between two lists
function assignBetweenLists(m1,m2) {
    var m1 = YAHOO.util.Dom.get(m1);
    var m2 = YAHOO.util.Dom.get(m2);
    
    var m1len = m1.length;
    
    //log ids that were moved
    var ids = new Array();
    
    for (i=0; i<m1len; i++) {
        if (m1.options[i].selected == true) {
            m2len = m2.length;
            m2.options[m2len]= new Option(m1.options[i].text);
            m2.options[m2len].value = m1.options[i].value;
            
            //log id that was moved
            ids[ids.length] = m1.options[i].value;
        }
    }
    for (i = (m1len -1); i>=0; i--) {
        if (m1.options[i].selected == true) {
            m1.options[i] = null;
        }
    }
    
    return ids;
}

//pass in reference to select list, not just the id
function removeSelectedListItems(ref) {
    
    var len = ref.length;
    
    for (i=0; i < len; i++) {
        if (ref.options[i].selected == true)
            ref.remove(i);
    }
}

//pass in reference to select list, not just the id
function getSelectedListItems(ref) {
    
    var len = ref.length;
    
    var ids = new Array();
    
    for (i=0; i < len; i++) {
        if (ref.options[i].selected == true)
            ids[ids.length] = ref.options[i].value;
    }
    
    return ids;
}

function getListItems(m1) {
    var ids = new Array();
    
    for (i=0; i < m1.length; i++) {
        ids[ids.length] = m1.options[i].value;
    }
    
    return ids;
}

function clearList(elSel,ignore) {
    /* prevents deletion of default values */
    if (!ignore) ignore = 0;
    if (elSel) {
        for (var i = elSel.length - 1; i>=ignore; i--) {
            elSel.remove(i);
        }
    }
}

function loadSelectList(listRef, optionId, optionText) {
    var elOptNew = document.createElement('option');
    elOptNew.text = optionText;
    elOptNew.value = optionId;
    
    try {
        listRef.add(elOptNew, null); // standards compliant; doesn't work in IE
    }
    catch(ex) {
        listRef.add(elOptNew); // IE only
    }
}

// only works for select lists
function reorderList(list_id,direction) {
    var list = YAHOO.util.Dom.get(list_id);
    var selectedItem = list.selectedIndex;

    if (selectedItem == -1) {
        alert("Please select an option to move.");
        return;
    }

    var inc;
    if (direction == "up") {
        inc = -1;
    } else {
        inc = 1;
    }

    if ((selectedItem + inc) < 0 || (selectedItem + inc) > (list.options.length-1)) {
        return;
    }

    var selectedValue = list.options[selectedItem].value;
    var selectedText = list.options[selectedItem].text;
    var selectedIndex = list.options[selectedItem].index + 1;
    selectedText = selectedText.slice(selectedText.indexOf("-"));

    var previousValue = list.options[selectedItem + inc].value;
    var previousText = list.options[selectedItem + inc].text;
    var previousIndex = list.options[selectedItem + inc].index + 1;
    previousText = previousText.slice(previousText.indexOf("-"));

    list.options[selectedItem].value = previousValue;
    list.options[selectedItem].text = (previousIndex - inc) + " " + previousText;

    list.options[selectedItem + inc].value = selectedValue;
    list.options[selectedItem + inc].text = (selectedIndex + inc) + " " + selectedText;

    list.selectedIndex = selectedItem + inc;
}

//decode strings encoded in PHP via HTMLENTITIES
String.prototype.unescapeHtml = function () {
    var temp = document.createElement("div");
    temp.innerHTML = this;
    var result = temp.childNodes[0].nodeValue;
    temp.removeChild(temp.firstChild)
    return result;
}

function addslashes(str) {
	str=str.replace(/\\/g,'\\\\');
	str=str.replace(/\'/g,'\\\'');
	str=str.replace(/\"/g,'\\"');
	str=str.replace(/\0/g,'\\0');
    return str;
}

function stripslashes(str) {
	str=str.replace(/\\'/g,'\'');
	str=str.replace(/\\"/g,'"');
	str=str.replace(/\\0/g,'\0');
	str=str.replace(/\\\\/g,'\\');
	return str;
}

/************************************************************
    FORM VALIDATION
************************************************************/

function isValidFilename(str) {
    var re = /^[\w\-]+(\.(php|gif|jpe?g|docx?|pdf|txt|ppt|psd|bmp|tif?f))?$/
    
    if (re.test(str)) {
        return true;
    }
    
    return false;
}

function isValidSiteFilename(str) {
    var re = /^[\w\-]+(\.php)?$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isValidEmail(str) {
    var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
    
    if (re.test(str)) {
        return true;
    }
    
    return false;
}

function isValidPhone(str) {    
    
    var stripped = str.replace(/[\(\)\.\-\ ]/g, '');
    
    var re = /^\d{10}$/
    
    if (re.test(stripped)) {
        return true;
    }
    
    return false;
}

function isValidZip(str) {
    var re = /^\d{5}$/
    
    if (re.test(str)) {
        return true;
    }
    
    return false;
}

function isValidUrl(str) {
    //for our purposes, regular expression demands http:// or https:// at beginning of url
    //  followed by 1 or more groups of: valid hostname chars followed by "."
    //    (hostname labels can be between 1 and 63 chars)
    //  followed by 2 or more alphanumeric chars (top level domain names: com, net, etc.)
    //  followed by optional group, beginning with only \ or ?
    //    and followed by chars expected to be found in directory structures or parameter strings.

    var re = /^https?:\/\/([a-zA-Z0-9\-\(\)\,]{1,63}\.)+[a-zA-Z0-9\-\(\)\,]{2,63}([?\/][\w\-#\/?!=%&\.\,:;\(\)\[\]]*)?\s*$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isValidVanityUrl(str) {
    var re = /^[^ \*"']+$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isPercentage(str) {
    var re = /^(\d{0,5})(\.\d{1,2})?$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isMonetaryValue(str) {
    var re = /^(\d{0,10})(\.\d{1,2})?$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isLargeMonetaryValue(str) {
    var re = /^(\d{0,20})(\.\d{1,2})?$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isNumber(str) {
    var re = /^\d+(\.\d+)?$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isInteger(str) {
    var re = /^\d+$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isAlphaNumeric(str) {
    var re= /^\w+$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function isEmptyField(str) {
    var re = /^\s*$/

    if (re.test(str)) {
        return true;
    }

    return false;
}

function numbersOnly(e) {
    var key;
    var keychar;

    if (window.event)
       key = window.event.keyCode;
    else if (e)
       key = e.which;
    else
       return true;
    keychar = String.fromCharCode(key);

    // control keys & decimal
    if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) || (keychar == ".") ) {
       return true;

    // numbers
    } else if ((("0123456789").indexOf(keychar) > -1)) {
       return true;

    } else {
       return false;
    }
}

function validateRadioButtonGroup(btn) {
    var cnt = -1;
    for (var i=btn.length-1; i > -1; i--) {
        if (btn[i].checked) {cnt = i; i = -1;}
    }
    if (cnt > -1) return btn[cnt].value;
        else return null;
}

function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');

    if(isNaN(num)) num = "0";

    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    cents = num%100;
    num = Math.floor(num/100).toString();

    if(cents<10) cents = "0" + cents;

    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+','+
        num.substring(num.length-(4*i+3));
    
    return (((sign)?'':'-') + '$' + num + '.' + cents);
}
