/*

 * Funções Uteis

 */
/**
 * Função que retorna a String com os parametros que se encontram numa form
 * 
 * @param formname
 *            nome do form que se está a fazer submit
 * 
 */
function buildURLFormParameters(formName) {
    var i = 0;
    var parametros = "";
    var elementos = document.getElementById(formName).elements;

    for (i = 0; i < elementos.length; i++) {
        var tempParam = null;
        var tipo = elementos[i].type;
        // Radio Buttons
        if (tipo == "radio") {
            if (elementos[i].checked == true) {
                tempParam = "&" + elementos[i].name + "=" + elementos[i].value;
            } else {
                tempParam = "";
            }
        }
        // Check Boxes
        else if (tipo == "checkbox") {
            if (elementos[i].checked == true) {
                tempParam = "&" + elementos[i].name + "=" + elementos[i].checked;
            } else {
                tempParam = "&" + elementos[i].name + "=" + "false";
            }
        } else if (tipo == "submit" || tipo == "reset") {
            tempParam = "";
        }
        // Outros Casos
        else {
            if (elementos[i].id)
                tempParam = "&" + elementos[i].id + "=";
            else if (elementos[i].name)
                tempParam = "&" + elementos[i].name + "=";
            tempParam += elementos[i].value;
        }
        parametros += tempParam;
    }
    return parametros;
}

function undef(v) {
    return (typeof v == 'undefined');
}

function getFormField(idName, formObj) {

    if (!undef(formObj)) {

        return formObj.elements[idName];

    } else {

        return document.getElementById(idName);

    }
}

function getFormFieldValue(name, formObj) {

    var field = getFormField(name, formObj);

    if (!undef(field)) {

        return getFieldValue(field);

    }

    return "";

}

function setFormFieldValue(name, value, formObj) {

    var field = getFormField(name, formObj);

    if (!undef(field)) {

        setFieldValue(field, value);

    }

}

function setFieldValue(field, value) {

    if (field instanceof Array) {

        // radio group

        var defaultRadio = field[0];

        for ( var i in field) {

            if (field[i].value == value) {

                field[i].checked = true;

                return;

            }

            if (field[i].defaultChecked) {

                defaultRadio = field[i];

            }

        }

        defaultRadio.checked = true;

    } else if (isFieldType(field, "radio")) {

        field.checked = (value == field.value);

    } else if (isFieldType(field, "checkbox")) {

        field.checked = value;

    } else if (isFieldType(field, "select-one")) {

        for ( var i = 0; i < field.options.length; i++) {

            if (field.options[i].value == value) {

                field.options[i].selected = true;

                break;

            }

        }

    } else if (field.length) {

        for ( var i = 0; i < field.length; i++) {

            setFieldValue(field[i], value);

        }

    } else {

        field.value = value;

    }

}

function getFieldValue(field) {

    if (field instanceof Array) {

        // radio group

        for ( var i in field) {

            if (field[i].checked) {

                return field[i].value;

            }

        }

        return "";

    } else if (isFieldType(field, "checkbox")) {

        return field.checked;

    } else if (isFieldType(field, "select-one")) {

        if (field.selectedIndex >= 0 && field.options[field.selectedIndex]) {

            return field.options[field.selectedIndex].value;

        } else {

            return "";

        }

    } else {

        return field.value;

    }

}

function isFieldType(field, type) {

    return (field.type && (field.type == type));

}

function setEnableFields(fieldsIds, enable, formObj) {

    for ( var i = 0; i < fieldsIds.length; i++) {

        setEnable(fieldsIds[i], enable);

    }

}

function setEnable(fieldId, toEnable, formObj) {

    var field = getFormField(fieldId, formObj);

    if (isFieldType(field, "checkbox") || isFieldType(field, "radio") || isFieldType(field, "select-one")) {

        field.disabled = (!toEnable);

    } else {

        field.readOnly = (!toEnable);

    }

    // field.className = (toEnable ? "class1" : "class2");

}

function getAllFieldsID(formObj) {

    var elements = formObj.elements;

    var elemsID = new Array();

    for ( var i = 0; i < elements.length; i++) {

        if (elements[i].id != "") {

            elemsID.push(elements[i].id);

        } else {

            elemsID.push(elements[i].name);

        }

    }

    return elemsID;

}

function clearAllFields(formObj) {

    if (!undef(formObj)) {

        clearFieldsById(getAllFieldsID(formObj), formObj);

    } else {

        clearFieldsById(getAllFieldsID(document.forms[0]));

    }

}

function clearFieldsById(fieldsIdName, formObj) {

    for ( var i = 0, j = fieldsIdName.length; i < j; i++) {

        var field = getFormField(fieldsIdName[i], formObj);

        if (!undef(field)) {

            if (isFieldType(field, "password") || isFieldType(field, "text"))

                setFieldValue(field, "");

            if (isFieldType(field, "select"))

                setFieldValue(field, 0);

            setFieldValue(field, "");

        }

    }

}

function buildParamtersForForm(formObj) {

    return buildParamtersBaseOnFields(getAllFieldsID(formObj), formObj);

}

function buildParamtersBaseOnFields(fieldNames, formObj) {

    return buildParamtersString(collectFieldValues(fieldNames, formObj), fieldNames);

}

function buildParamters(fieldNames, parameterNames, formObj) {

    return buildParamtersString(collectFieldValues(fieldNames, formObj), parameterNames);

}

function collectFieldValues(fieldNames, formObj) {

    var fieldValues = new Array(fieldNames.length);

    for ( var i = 0; i < fieldNames.length; i++) {

        fieldValues[i] = getFormFieldValue(fieldNames[i], formObj);

    }

    return fieldValues;

}

function buildParamtersString(parameterValues, parameterNames) {

    if (parameterValues.length != parameterNames.length) {

        alert("Problem in buildParamters function!!");

    }

    var strParameter = "";

    for ( var i = 0; i < parameterValues.length; i++) {

        strParameter += "&" + parameterNames[i] + "=" + parameterValues[i];

    }

    return strParameter;

}

/**
 * 
 * Encontra um elemento num array
 * 
 * 
 * 
 * @param (String/int)
 *            value
 * 
 * @param (Array)
 *            array
 * 
 * 
 * 
 * retorna a posição em que o elemento se encontra no array, -1 se não encontrar
 * 
 */

function findInArray(value, array) {

    return findInArrayFrom(value, array, 0);

}

/**
 * 
 * Encontra um elemento num array, a partir de certa posicao
 * 
 * 
 * 
 * @param (String/int)
 *            value
 * 
 * @param (Array)
 *            array
 * 
 * @param (int)
 *            pos
 * 
 * 
 * 
 * retorna a posição em que o elemento se encontra no array, -1 se não encontrar
 * 
 */

function findInArrayFrom(value, array, pos) {

    if (pos > array.length) {

        return -1;

    } else {

        for ( var i = pos; i < array.length; i++) {

            if (array[i] == value) {

                return i;

            }

        }

        return -1;

    }

}

/**
 * 
 * Encontra um elemento num array multidimensional numa certa coluna
 * 
 * 
 * 
 * @param (String/int)
 *            value
 * 
 * @param (Array)
 *            array
 * 
 * @param (Int)
 *            coluna
 * 
 * 
 * 
 * retorna a posição em que o elemento se encontra no array, -1 se não encontrar
 * 
 */

function findInArrayCol(value, array, col) {

    return findInArrayColFrom(value, array, col, 0);

}

/**
 * 
 * Encontra um elemento numa coluna do array , a partir de certa posicao
 * 
 * 
 * 
 * @param (String/int)
 *            value
 * 
 * @param (Array)
 *            array
 * 
 * @param (int)
 *            col
 * 
 * @param (int)
 *            pos
 * 
 * 
 * 
 * retorna a posição em que o elemento se encontra no array, -1 se não encontrar
 * 
 */

function findInArrayColFrom(value, array, col, pos) {

    if (pos > array.length) {

        return -1;

    } else {

        for ( var i = pos; i < array.length; i++) {

            if (array[i][col] == value) {

                return i;

            }

        }

        return -1;

    }

}

/**
 * 
 * remove do array elementos duplicados no arrayToCheck para determinada coluna
 * 
 * 
 * 
 * @param (Array)
 *            array
 * 
 * @param (Array)
 *            array
 * 
 * @param (int)
 *            col
 * 
 * 
 * 
 * retorna o novo array
 * 
 */

function removeFromArrayDuplicates(arrayToRemove, arrayToCheck, colToCheck) {

    var arrayToReturn = arrayToRemove;

    for ( var i = 0; i < arrayToCheck.length; i++) {

        var pos = findInArrayCol(arrayToCheck[i][colToCheck], arrayToReturn, colToCheck);

        if (pos != -1) {

            arrayToReturn = removeFromArray(pos, arrayToReturn);

        }

    }

    return arrayToReturn;

}

/**
 * 
 * remove do array a posicao indicada
 * 
 * 
 * 
 * @param (Array)
 *            array
 * 
 * @param (int)
 *            pos
 * 
 * 
 * 
 * retorna o novo array
 * 
 */

function removeFromArray(pos, array) {

    var j = 0;

    var aTmp = null;

    var size = array.length;

    if (size > 1) {

        aTmp = new Array(size - 1);

        for ( var i = 0; i < size; i++) {

            if (i != pos) {

                aTmp[j] = array[i];

                j++;

            }

        }

    } else {

        aTmp = new Array();

    }

    return aTmp;

}

/**
 * 
 * insere no array o elemento indicado
 * 
 * 
 * 
 * @param object
 *            value
 * 
 * @param (Array)
 *            array
 * 
 * @param (int)
 *            pos
 * 
 * 
 * 
 * retorna o novo array
 * 
 */

function insertPosInArray(value, pos, srcArray) {

    var size = srcArray.length + 1;

    var newArray = new Array(size);

    for ( var i = 0; i < size; i++) {

        if (i < pos) {

            newArray[i] = srcArray[i];

        } else if (i > pos) {

            newArray[i] = srcArray[i - 1];

        } else {

            newArray[i] = value;

        }

    }

    return newArray;

}

function printArray(array, msg) {

    var size = array.length;

    var printMsg = "";

    if (msg != null) {

        printMsg += (msg + "\n");

    }

    for ( var i = 0; i < size; i++) {

        printMsg += i + " - " + array[i] + "\n";

    }

    alert(printMsg);

}

// ////////////////////////// SELECT BOXES

/**
 * 
 * Limpa o conteudo da select box indicada.
 * 
 */

function emptySelectBox(selectObj) {
    while (selectObj.length > 0) {
        selectObj.options[0] = null;
    }
}

// VALIDAÇÕES

/**
 * 
 * Verifica se e um codigo UNICODE de um algarismo
 * 
 * @param key
 *            Codigo a validar
 * 
 * @return true caso seja um algarismo
 * 
 */

function keyIsNumber(key) {

    return (key >= 48 && key <= 57);

}

var validChars = "()- +/";

function ckeckKeyPressIsFoneNumber(obj, event) {

    var key = window.event ? event.keyCode : event.which;

    if (key == 0) {

        return true;

    }

    var chValue = String.fromCharCode(key);

    if ((!keyIsNumber(key)) && (validChars.indexOf(chValue) == -1) && key != 8) {

        event.returnValue = false;

        return false;

    }

}

/**
 * 
 * Function: hide()
 * 
 * @param: (Object) obj
 * 
 * Esconde um objecto div
 * 
 */

function hide(obj) {

    if (parseInt(navigator.appVersion) >= 5 || navigator.appVersion.indexOf["MSIE 5"] != -1) {

        obj.style.display = "none";

        obj.style.visibility = "hidden";

    }

}

/**
 * 
 * Function: show()
 * 
 * @param: (Object) obj
 * 
 * Mostra um objecto div
 * 
 */

function show(obj) {

    if (parseInt(navigator.appVersion) >= 5 || navigator.appVersion.indexOf["MSIE 5"] != -1) {

        obj.style.display = "";

        obj.style.visibility = "visible";

    }

}

/**
 * 
 * Function: isVisible()
 * 
 * @param: (Object) obj
 * 
 * Devolve true se o objecto está visivel
 * 
 */

function isVisible(obj) {

    if (parseInt(navigator.appVersion) >= 5 || navigator.appVersion.indexOf["MSIE 5"] != -1) {

        return obj.style.display == "" && obj.style.visibility == "visible";

    } else {

        return false;

    }

}

/**
 * 
 * Methods to operate XML nodes
 * 
 * 
 * 
 */

function getNodeListFromXML(xmlValue, tagName) {

    if (!undef(xmlValue.getElementsByTagName(tagName))) {

        return xmlValue.getElementsByTagName(tagName)[0];

    }

    return null;

}

function getAttributeFromNodeList(nodeList, attName, listPosition) {

    if (!undef(nodeList.childNodes) && (listPosition < nodeList.childNodes.length)) {

        return nodeList.childNodes[listPosition].getAttribute(attName);

    }

    return "";

}

function getAttributeFromXML(xmlValue, tagName, attName, listPosition) {

    var nodeList = getNodeListFromXML(xmlValue, tagName);

    if (!undef(nodeList)) {

        return getAttributeFromNodeList(nodeList, attName, listPosition);

    }

    return "";

}

// ///////////////////////////////////////////

var EVENT_LOAD = "load";

var EVENT_CLICK = "click";

var EVENT_LOAD = "load";

/*
 * 
 * Adds an event to an object.
 * 
 * 
 * 
 * obj - The object to add the event handling to.
 * 
 * eventName - The event name to be processed.
 * 
 * func - The function that will handle the event.
 * 
 */

function addEvent(obj, eventName, func) {

    // try{

    if (obj.addEventListener) {

        obj.addEventListener(eventName, func, true);

        return true;

    } else if (obj.attachEvent) {

        return obj.attachEvent("on" + eventName, func);

    } else {

        return false;

    }

    // } catch(err){

    // // Traps any error that may occurr. Returns false if any error occur

    // return false;

    // }

}
