/////////////////////////
function dynamic_last_row (table, event, row_class) {
/////////////////////////

    var lastRow = table.rows.length;

    var srcRow = event.target || event.srcElement;
    while(srcRow && (srcRow.tagName != 'TR')) {
        srcRow = srcRow.parentNode;
        }
    if(srcRow) {
        clicked_row = srcRow.rowIndex;
        }
    if(clicked_row != lastRow - 1) return;

    // set position to the previous to last row (innerHTML == null => MSIE fix)
    do {
        srcRow = srcRow.previousSibling;
        } while(srcRow.innerHTML == null || srcRow.tagName != 'TR');
    clicked_row = srcRow.rowIndex;

    // insert new row just before the last row in the table
    var trgRow = table.insertRow(lastRow - 1);

    if(srcRow.className)
        trgRow.className = srcRow.className;
    if(row_class)
        trgRow.className = row_class;
    if(srcRow.style && srcRow.style.cssText)
        trgRow.style.cssText = srcRow.style.cssText;
    // make copy of prototype row visible
    if(srcRow.style && srcRow.style.display == 'none')
        trgRow.style.display = '';

    for(var i = 0; i < srcRow.childNodes.length; i++) {
        var s = srcRow.childNodes[i];
        var element;
        switch(s.nodeType) {
            case 1: element = document.createElement('td');
                    if(s.childNodes.length > 0) {
                        for( var k = 0; k < s.childNodes.length; k++) {
                            if( s.childNodes[k].nodeType == 1 ) 
                                _formtools_rename( s.childNodes[k], 
                                                   trgRow.rowIndex);
                            }
                        }
                    break;
            case 3: element = document.createTextNode('');
                    break;
            }
        trgRow.appendChild(element);
        }

    for( var i = 0; i < srcRow.childNodes.length; i++) {
        var s = srcRow.childNodes[i];
        var t = trgRow.childNodes[i];
        if(s.className)
            t.className = s.className;
        if(s.style && s.style.cssText)
            t.style.cssText = s.style.cssText;

        switch(s.nodeType) {
            case 1: t.innerHTML = s.innerHTML;
                    t.align = s.align;
                    t.setAttribute( 'colspan', s.getAttribute('colspan'));
                    for( var k = 0; k < t.childNodes.length; k++) {
                        if( t.childNodes[k].nodeType == 1 ) {
                            // wipe all child elements
                            _formtools_reset_content( t.childNodes[k] );
                            }
                        else {
                            // wipe plain table data cell content
                            if( t.childNodes[k].data) 
                                t.childNodes[k].data = '';
                            }
                        }
                    break;
            case 3: 
                    t.nodeValue = s.nodeValue;
                    break;
            }
        }
    }

//////////////////////////
function _formtools_rename ( element, new_index)  {
//////////////////////////

    var id   = element.getAttribute('id');
    var name = element.getAttribute('name');
    
    // increase row index on element names if element name ends with a digit
    if(id) {
        var m = id.match(/^(.*?)(\d+)/);
        if(m && m[2]) {
            id = m[1] + new_index;
            }
        }
    element.setAttribute('id', id);

    // increase row index on element names if element name ends with a digit
    if(name) {
        var m = name.match(/^(.*?)(\d+)$/);
        if(m && m[2]) {
            name = m[1] + new_index;
            }
        }
    element.setAttribute('name', name);

    //alert(element.getAttribute('id')+'/'+element.getAttribute('name'));
    }

/////////////////////////////////
function _formtools_reset_content ( element ) {
/////////////////////////////////

    //alert( element.value );

    strType = element.getAttribute('type');

    // based on type, go and wipe...
    switch ( strType ) {
        case 'checkbox' :
            element.checked = false;
            // increase row index on special case "checkbox_indexNN" values
            if(element.value) {
                var value = element.value;
                var m = value.match(/^checkbox_index(\d+)$/);
                if(m && m[1]) {
                    var index = m[1];
                    index++;
                    var name = 'checkbox_index' + index;
                    element.value = name;
                    break;
                    }
                }
        case 'radio' :
            element.checked = false;
            break;
        case 'text' :
        case 'password' :
            element.value = '';
            break;
        default :
        switch ( element.type ) {
            case "select-one": 
            case "select-multiple":
                element.selectedIndex = 0;
                break;
            }
        }
    }

