DynaFaces.Tx = {};
DynaFaces.Tx.config = {};
DynaFaces.Tx.fire = function(ajaxTxId, sourceElement) {
    if (typeof sourceElement == 'undefined') {
        sourceElement = null;
    }
    var options = DynaFaces.Tx.config[ajaxTxId];
    if (typeof options == 'undefined' || options == null) {
        throw new Error('unknown Ajax Transaction: ' + ajaxTxId);
    }
    var localOptions = {};
    for (var option in options) {
        localOptions[option] = options[option];
    }
    if (typeof localOptions.inputs != 'undefined' && localOptions.inputs != null) {
        //based on the localOptions.inputs array, get an array of all child elements that accept input
        var idArray = DynaFaces.Tx._getAllInputAcceptingChildIdArray(localOptions.inputs);
        localOptions.inputs = idArray.join();
    }
    localOptions.execute = localOptions.execute.join();
    localOptions.render = localOptions.render.join();
    DynaFaces.fireAjaxTransaction(sourceElement, localOptions);
}
DynaFaces.Tx._getAllInputAcceptingChildIdArray = function(parentIdArray) {
    var map = {};
    for (var i = 0; i < parentIdArray.length; i++) {
        var element = document.getElementById(parentIdArray[i]);
        if (element == null) {
            continue;
        }
        DynaFaces.Tx._putInputAcceptingIdsRecursively(element, map);
    }
    var allInputAcceptingChildIdArray = [];
    for (var key in map) {
        allInputAcceptingChildIdArray.push(key);
    }
    return allInputAcceptingChildIdArray;
}
DynaFaces.Tx._putInputAcceptingIdsRecursively = function(element, map) {
    var isInputAccepting = false;
    var nodeName = element.nodeName;
    if (nodeName != null) {
        nodeName = nodeName.toLowerCase();
        if (nodeName.indexOf('input') == 0) {
            isInputAccepting = true;
/* include button elements, too, since fireAjaxTransaction is not automatically sending the sourceElement's name/value pair as a request parameter.
 * e.g., DynaFaces.fireAjaxTransaction(sourceElement, localOptions);
            var typeAttribute = element.getAttribute('type');
            if (typeAttribute == 'text' || 
                typeAttribute == 'password' ||
                typeAttribute == 'checkbox' ||
                typeAttribute == 'radio' ||
                typeAttribute == 'hidden') {
            }
*/
        }
        else if (nodeName.indexOf('textarea') == 0) {
            isInputAccepting = true;
        }
        else if (nodeName.indexOf('select') == 0) {
            isInputAccepting = true;
        }
    }
    if (isInputAccepting == true) {
        map[element.id] = null;
    }
    if (element.hasChildNodes()) {
	for (var i = 0; i < element.childNodes.length; i++) {
            DynaFaces.Tx._putInputAcceptingIdsRecursively(element.childNodes[i], map);
	}
    }
}
DynaFaces.Tx._fire = function(ajaxTxId, sourceElement, defaultBehavior) {
    if (typeof defaultBehavior == 'undefined') {
        defaultBehavior = false;
    }
    DynaFaces.Tx.fire(ajaxTxId, sourceElement);
    if (defaultBehavior) {
        return;
    }
    var agent = navigator.userAgent;
    var isIE = agent.indexOf('Opera') == -1 && agent.indexOf('compatible') > -1 && agent.indexOf('MSIE') > -1;
    if (isIE) {
        if (typeof window.event != 'undefined' && window.event != null) {
            window.event.returnValue = false;
        }
    }
    else {
        var event = DynaFaces.Tx._fire.caller.caller.arguments[0];
        if (typeof event != 'undefined' && event != null) {
            event.preventDefault();
        }
    }
}
