var Fse; if (!Fse) Fse = {};

if( !Fse.FormManager ) Fse.FormManager = {};

if( !Fse.FormManager._defaultInvalidFormatMessages ) {

    var defaultMessages = [];;

    defaultMessages["url"] = "Please enter a valid URL in the standard form\ni.e. http://www.fsenablers.com";
    defaultMessages["integer"] = "Please enter a numeric value without decimal points\ni.e.4256";
    defaultMessages["date"] = "Please enter a valid date using the MM/DD/YYYY form\n i.e. Enter June 1st 2007 as 06/01/2007.";
    defaultMessages["decimal"] = "Please enter a numeric.\ni.e. 4680.27";
    defaultMessages["email"] = "Please enter a properly formatted email address.\ni.e. contactname@companyname.com"

    Fse.FormManager._defaultInvalidFormatMessages = defaultMessages;
    
};

Fse.FormManager.ValidationResult = function( oField, iValidationStatus ) {
    this.field = oField;
    this.validationStatus = iValidationStatus;
};

Fse.FormManager.ValidationStatus = {};
Fse.FormManager.ValidationStatus.OK = 0;
Fse.FormManager.ValidationStatus.REQUIRED = 1;
Fse.FormManager.ValidationStatus.INVALID = 2;

// Fse.FormManager._reEmail = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/; // doesn't allow dashes in email address
Fse.FormManager._reEmail = /^(?:[\w-]+\.?)*[\w-]+@(?:[\w-]+\.)+\w+$/; // allows dashes in email address 
Fse.FormManager._reDecimal = /^-?\$?(,?\d?)+\.?\d*$/;
Fse.FormManager._reInteger = /^-?\$?(,?\d?)+$/;
Fse.FormManager._reEmptyString = /^[ \t\n\x0B\f\r]*$/;
Fse.FormManager._reStringMeat = /(^[ \t\n\x0B\f\r]*)(.+[^ \t\b\x0B\f\r])([ \t\n\x0B\f\r]*$)/;
Fse.FormManager._reDate = /(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/(19|20\d\d)/;
Fse.FormManager._reURL = /^http:\/\//;
Fse.FormManager._reURL = /^https?:\/\/([-\w\.]+)+(:\d+)?(:\w+)?(@\d+)?(@\w+)?([-\w\.]+)(\/([\w\/_\.]*(\?\S+)?)?)?/;
Fse.FormManager.submit = function( oForm, bPerformSubmit ) {

    if( bPerformSubmit == undefined ) {
        bPerformSubmit = false;
    }
    
    var aPreValidated = Fse.FormManager.onPreValidate( oForm );
    
	var bSubmit = true;
	var aResults = new Array();
	var aGroupFields = new Array();
	var iProcessedCount = 0;
	var iSkippedCount = 0;
	for( var fieldIdx = 0; fieldIdx < oForm.elements.length; fieldIdx++ ) {
		if( oForm.elements[fieldIdx].nodeType == 1 ) {
		    if( aPreValidated[ oForm.elements[fieldIdx].name] ) {
		        // skip validation on any preValidated fields
		        iSkippedCount++;
		        continue;
		    }
		    if( oForm.elements[fieldIdx].type == "hidden" ) {
		    	// skip validation on any hidden fields
		        iSkippedCount++;
		    	continue;
		    }
		    if( oForm.elements[fieldIdx].disabled ) {
                // skip validation on any disabled fields
		        iSkippedCount++;
                continue;		        
		    }
			iProcessedCount++;
					    
		    var iValidationStatus = Fse.FormManager.ValidationStatus.OK;
		    if( oForm.elements[fieldIdx].type != "radio" ) {
                var oMessageElement = Fse.FormManager.getMessageElement( oForm.elements[fieldIdx] );
                if( oMessageElement ) {
                    oMessageElement.innerHTML = "";
                }
                var oLabelElement = Fse.FormManager.getLabelElement(  oForm.elements[fieldIdx] );
                if( oLabelElement ) {
                    oLabelElement.style.color = "";
                }
		        if( oForm.elements[fieldIdx].type == "text" ) {
		            // eliminate bogus whitespace
                    var aResult = oForm.elements[fieldIdx].value.match( Fse.FormManager._reStringMeat );
                    if( aResult ) {
                        oForm.elements[fieldIdx].value = aResult[2];
                    }
		        }
    		    iValidationStatus = Fse.FormManager.checkField( oForm.elements[fieldIdx] );
    		    aResults.push( new Fse.FormManager.ValidationResult( oForm.elements[fieldIdx], iValidationStatus));
    			if( iValidationStatus != Fse.FormManager.ValidationStatus.OK ) {
	       			bSubmit = false;
    			}
		    } else {
		        
		        if( aGroupFields[oForm.elements[fieldIdx].name] == undefined ) {
                    var oMessageElement = Fse.FormManager.getMessageElement( oForm.elements[fieldIdx] );
                    if( oMessageElement ) {
                        oMessageElement.innerHTML = "";
                    }
    		        var oGroupField = Fse.FormManager.getGroupField( oForm.elements[fieldIdx] );
    		        aGroupFields[oGroupField.name]=oGroupField;
    		        iValidationStatus = Fse.FormManager.checkGroupField( oGroupField );
        		    aResults.push( new Fse.FormManager.ValidationResult( oForm.elements[fieldIdx], iValidationStatus));
        			if( iValidationStatus != Fse.FormManager.ValidationStatus.OK ) {
    	       			bSubmit = false;
        			}
		        }
		    }
		}
	}

	if( ! bSubmit ) {
	    for( var idx in aResults ) {
            if( aResults[idx].validationStatus != Fse.FormManager.ValidationStatus.OK )	{
                var sMessage = "Validation Error";
                var oMessageElement = Fse.FormManager.getMessageElement( aResults[idx].field );
                var oLabelElement = Fse.FormManager.getLabelElement( aResults[idx].field );
                var oLabelElementClass = Fse.FormManager.getFseAttribute( oForm, "notifyclass" );
                switch( aResults[idx].validationStatus ) {
                    case Fse.FormManager.ValidationStatus.REQUIRED : {
                        sMessage = Fse.FormManager.getFseAttribute( aResults[idx].field, "message" );
                        if( sMessage == undefined ) {

                            var sFormat = Fse.FormManager.getFseAttribute( aResults[idx].field, "format" );
                            if( sFormat ) {
                                sMessage = Fse.FormManager._defaultInvalidFormatMessages[sFormat];
                                if( sMessage ){
                                    sMessage = "Required field missing.\n"+sMessage;
                                }
                            }
                            if( sMessage == undefined ) {
                                sMessage = "Required field missing";
                            }
                        }
                    }
                    break;
                    
                    case Fse.FormManager.ValidationStatus.INVALID : {
                        sMessage = Fse.FormManager.getFseAttribute( aResults[idx].field, "message" );
                        if( sMessage == undefined ) {
                            
                            var sFormat = Fse.FormManager.getFseAttribute( aResults[idx].field, "format" );
                            if( sFormat ) {
                                sMessage = Fse.FormManager._defaultInvalidFormatMessages[sFormat];
                            }
                            if( sMessage == undefined ) {
                                sMessage = "Invalid format";
                            }
                        }
                    }
                    break;
                }
                if( oLabelElement ) {
				  if(oLabelElementClass){
				    Spry.Utils.addClassName( oLabelElement, oLabelElementClass );
				  }else{
					 oLabelElement.style.color="red";
				  }
                }
                if( oMessageElement ) {
                    oMessageElement.innerHTML = sMessage;                    
                } else {
                    alert( sMessage );
                }
                aResults[idx].field.focus();
                if( aResults[idx].field.type == "text" ) {
                    
                }
                var myVar = 1;
                break;                
            }
	    }
	}
	
	if( bSubmit ) {
	    bSubmit = Fse.FormManager.onPostValidate( oForm );
	}

	if( bSubmit ) {
		// cleanse numeric (fse:format = integer or fse:format = decimal) data
		for( var fIdx = 0; fIdx < oForm.elements.length; fIdx++ ) {
			var oField = oForm.elements[fIdx];
			var sFormat = Fse.FormManager.getFseAttribute( oField, "format" );
			if( oField.type == "text" && ( sFormat == "integer" || sFormat == "decimal" ) && oField.value ) {
				oField.value = Fse.FormManager.cleanseNumericValue( oField.value );
			}
		}
	}
	
	if( bSubmit && bPerformSubmit ) {
	    oForm.submit();
	}
	return bSubmit;
};

Fse.FormManager.onPreValidate = function( oForm ) {
    var onPreValidateHandler = Fse.FormManager.getFseAttribute( oForm, "onprevalidate" );
    if( onPreValidateHandler ) {
        return Fse.FormManager._getHandler(onPreValidateHandler)(oForm);
    } else {
        return new Array();
    }
};

Fse.FormManager.onPostValidate = function( oForm ) {
    var onPostValidateHandler = Fse.FormManager.getFseAttribute( oForm, "onpostvalidate" );
    if( onPostValidateHandler ) {
        return Fse.FormManager._getHandler(onPostValidateHandler)(oForm);
    } else {
        return true;
    }
};

Fse.FormManager._getHandler = function( sHandlerName ) {
    // parse handler name to handle namespaces
    var aParts = sHandlerName.split( "." );
    var fnHandler = window;
    for( var px = 0; px < aParts.length; px++ ) {
        fnHandler = fnHandler[aParts[px]];     
    }
    return fnHandler;   
};


Fse.FormManager.getMessageElement = function( oField ) {

    var oMessageElement;    
    var sElementId = Fse.FormManager.getFseAttribute( oField, "messageelementid" );
    if( sElementId != undefined ) {
        oMessageElement = document.getElementById( sElementId );
    } else {
        oMessageElement = document.getElementById( oField.name + "_message" );
    }
    return oMessageElement;
};

Fse.FormManager.getLabelElement = function( oField ) {

    var oLabelElement;    
    var sElementId = Fse.FormManager.getFseAttribute( oField, "labelelementid" );
    if( sElementId != undefined ) {
        oLabelElement = document.getElementById( sElementId );
    } else {
        oLabelElement = document.getElementById( oField.name + "_label" );
    }
    return oLabelElement;
};


Fse.FormManager.checkField = function( oField ) {
    var iValidationStatus = Fse.FormManager.ValidationStatus.OK;
    var sCustomValidator = Fse.FormManager.getFseAttribute( oField, "validator" );
    if( ! sCustomValidator ) {
   		iValidationStatus = Fse.FormManager.checkSingleField( oField );
    } else {
        iValidationStatus = window[sCustomValidator]( oField );
    }
    return iValidationStatus;
};


Fse.FormManager.validateField = function( oField ) {

	var bValid = true;	
	var iValidationStatus = Fse.FormManager.checkField( oField );
	if( iValidationStatus != Fse.FormManager.ValidationStatus.OK ) {
		alert( Fse.FormManager.getErrorMessage( oField, iValidationStatus ));	
		oField.focus();
		bValid = false;	
	}
	
	return bValid;
};

Fse.FormManager.getErrorMessage = function( oField, iValidationStatus ) {

	var sMessage = "Validation Error";

	switch( iValidationStatus ) {
	    case Fse.FormManager.ValidationStatus.REQUIRED : {
	        sMessage = Fse.FormManager.getFseAttribute( oField, "message" );
	        if( sMessage == undefined ) {
	
	            var sFormat = Fse.FormManager.getFseAttribute( oField, "format" );
	            if( sFormat ) {
	                sMessage = Fse.FormManager._defaultInvalidFormatMessages[sFormat];
	                if( sMessage ){
	                    sMessage = "Required field missing.\n"+sMessage;
	                }
	            }
	            if( sMessage == undefined ) {
	                sMessage = "Required field missing";
	            }
	        }
	    }
	    break;
	    
	    case Fse.FormManager.ValidationStatus.INVALID : {
	        sMessage = Fse.FormManager.getFseAttribute( oField, "message" );
	        if( sMessage == undefined ) {
	            
	            var sFormat = Fse.FormManager.getFseAttribute( oField, "format" );
	            if( sFormat ) {
	                sMessage = Fse.FormManager._defaultInvalidFormatMessages[sFormat];
	            }
	            if( sMessage == undefined ) {
	                sMessage = "Invalid format";
	            }
	        }
	    }
	    break;
	
	}
	
	return sMessage;
	
};

Fse.FormManager.getFseAttribute = function( oField, sAttributeName ) {

	var vValue;
	var sRawValue = oField.getAttribute( "fse:" + sAttributeName );
	if( sRawValue != undefined ) {
		if( sAttributeName == "required" ) {
			vValue = Boolean( sRawValue );
		} else if ( sAttributeName == "minimumlength" ) {
		    vValue = Number( sRawValue );
		} else if ( sAttributeName == "maximumlength" ) {
		    vValue = Number( sRawValue );
		} else {
			vValue = sRawValue;
		}
	}
	return vValue;
};

Fse.FormManager.checkGroupField = function( oGroupField ) {
    var iValidationStatus = Fse.FormManager.ValidationStatus.OK;
    if( oGroupField.required ) {
        iValidationStatus = Fse.FormManager.ValidationStatus.REQUIRED;
        for( var idx=0; idx < oGroupField.fields.length; idx++ ){
            if( oGroupField.fields[idx].checked ) {
                iValidationStatus = Fse.FormManager.ValidationStatus.OK;
                break;
            }
        }
    }
    return iValidationStatus;
};

Fse.FormManager.checkSingleField = function( oInputField ) {
	var iValidationStatus = Fse.FormManager.ValidationStatus.OK;
	
	var fseRequired = Fse.FormManager.getFseAttribute( oInputField, "required" );
	var reEmpty;
	var sEmpty = Fse.FormManager.getFseAttribute( oInputField, "empty" );
	if( sEmpty != undefined ) {
        reEmpty = new RegExp( "^" + sEmpty + "$");
	} else {
	    reEmpty = Fse.FormManager._reEmptyString;
	}
	if( reEmpty.test( oInputField.value ) == false ) {
    	var fseFormat = Fse.FormManager.getFseAttribute( oInputField, "format" );
    	if( ! fseFormat ) {
    	    fseFormat = "string";
    	}
        if( fseFormat == "email" ) {
            if( ! Fse.FormManager._reEmail.test( oInputField.value ) ) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            }
        } else if ( fseFormat == "date" ) {
            if( ! Fse.FormManager.checkDate( oInputField.value )) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            }
        } else if ( fseFormat == "decimal" ) {
            if( ! Fse.FormManager._reDecimal.test( oInputField.value ) ) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            } else {
                iValidationStatus = Fse.FormManager.checkNumericRange( oInputField );
            }
        } else if ( fseFormat == "integer" ) {
            if( ! Fse.FormManager._reInteger.test( oInputField.value ) ) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            } else {
                iValidationStatus = Fse.FormManager.checkNumericRange( oInputField );
            }
        } else if ( fseFormat == "url" ) {
            if( ! Fse.FormManager.checkURL( oInputField.value )) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            }
        } else if ( fseFormat == "string" ) {
            iValidationStatus = Fse.FormManager.ValidationStatus.OK;
            var iMinLength = Fse.FormManager.getFseAttribute( oInputField, "minimumlength" );
            if( iMinLength != undefined ) {
                if( oInputField.value.length < iMinLength ) {
                    iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
                }
            }
    	} else {
            // treat as regular expression
            var reCustom = new RegExp( fseFormat );
            if( ! reCustom.test( oInputField.value ) ) {
                iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
            }
        }
	} else {
    	if( fseRequired ) {
       	    iValidationStatus = Fse.FormManager.ValidationStatus.REQUIRED;
    	}
	}
	return iValidationStatus;
};

Fse.FormManager.cleanseNumericValue = function( sValue ) {
	
	var reCleanse = /\$|,/g;
	return sValue.replace( reCleanse, "" );
};

Fse.FormManager.checkNumericRange = function( oField ) {

    var iValidationStatus = Fse.FormManager.ValidationStatus.OK;
    var nMinimum = Fse.FormManager.getFseAttribute( oField, "minvalue" );
    if( nMinimum != undefined ) {
        if( Fse.FormManager._reDecimal.test( nMinimum ) && (oField.value - nMinimum < 0) ) {
            iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
        }
    }

    /* skip the max check if we have already failed */    
    if( iValidationStatus != Fse.FormManager.ValidationStatus.OK ) {
        return iValidationStatus;
    }
    
    var nMaximum = Fse.FormManager.getFseAttribute ( oField, "maxvalue" );
    if( nMaximum != undefined ) {
        if( Fse.FormManager._reDecimal.test( nMaximum ) && ( nMaximum - oField.value < 0 )) {
            iValidationStatus = Fse.FormManager.ValidationStatus.INVALID;
        }
    }
    
    return iValidationStatus;
    
};

Fse.FormManager.getGroupField = function( oField ) {
    
    var oGroup = new Object();
    oGroup.name = oField.name;
    oGroup.required = false;
    oGroup.fields = new Array();
    
    var aElements = document.getElementsByName( oGroup.name );
    for( var idx = 0; idx < aElements.length; idx++ ) {
        var oFieldToCheck = aElements[idx];
        // on the same form?
        if( oFieldToCheck.form != undefined && oFieldToCheck.form == oField.form ) {
            oGroup.fields.push( oFieldToCheck );
            if( oFieldToCheck.getAttribute( "fse:required") == "true" ) {
                oGroup.required = true;
            }
        }
    }
    
    return oGroup;
}

Fse.FormManager.checkURL = function( sValueToText ) {
    return Fse.FormManager._reURL.test( sValueToText );    
};

Fse.FormManager.checkDate = function( sValueToTest ) {

    // do preliminary format check
    if( ! Fse.FormManager._reDate.test( sValueToTest ) ) {
        return false;
    }

    
    // change these for other date formats - currently uses mm/dd/yyyy
    var sDatePartDelimeter = "\/";
    var iMonth = 0; 
    var iDay = 1;
    var iYear = 2; 
    var bValid = true;
    
    var dtValueToTest;
    var aDate;
    try {
        aDate = sValueToTest.split( sDatePartDelimeter );  
        dtValueToTest = new Date(aDate[iYear], aDate[iMonth] - 1, aDate[iDay]);
        if ( isNaN(dtValueToTest) ) {
            bValid = false;
        }
    } catch (e) {
        bValid = false;
    }
    
    // if the date conversion succeeded, check its the actual date that was input
    // (e.g. it will accept 31/2/2003 but will change it to 3/3/2003)
    if (bValid) {
        if (aDate[iYear] != dtValueToTest.getFullYear()) {
            bValid = false;
        }
        if (aDate[iMonth] != 1 + dtValueToTest.getMonth()) {
            bValid = false;
        }
        if (aDate[iDay] != dtValueToTest.getDate()) {
            bValid = false;
        }
    }

    return bValid;
};

Fse.FormManager.updateCharsLeft = function ( oFieldToUpdate ) {
    var iMaxLength = oFieldToUpdate.getAttribute( "fse:maximumlength" );
    if( iMaxLength ) {
        var iCurrentLength = oFieldToUpdate.value.length;
        var sStatusFieldName = oFieldToUpdate.name + "_charsleft";
        var oCharsLeft = document.getElementById( sStatusFieldName );
		if( iCurrentLength > iMaxLength ){
			str = oFieldToUpdate.value;
			oFieldToUpdate.value = str.substring(0,iMaxLength);
		}
        if( oCharsLeft ) {
            var iCharsLeft = iMaxLength - iCurrentLength;
			if(oCharsLeft.type == 'text'){
				oCharsLeft.value = iCharsLeft;
			} else {
   	            oCharsLeft.innerHTML = iCharsLeft;
			}
        }
    }
};

Fse.FormManager.checkFieldLength = function( oFieldToCheck ) {
    var bOk = true;
    var iMaxLength = oFieldToCheck.getAttribute( "fse:maximumlength" );
    if( iMaxLength ) {
        var iCurrentLength = oFieldToCheck.value.length;
        if( iCurrentLength >= iMaxLength ) {
            bOk = false;
        }
    }
    return bOk;
};


Fse.FormManager.registerForm = function( sForm ) {
	
	var oForm = document.forms[sForm];
	for( var fieldIdx = 0; fieldIdx < oForm.elements.length; fieldIdx++ ) {

		if( oForm.elements[fieldIdx].nodeType == 1 ) {
			
			if( oForm.elements[fieldIdx].type == "select-one" ) {
				var oSelect = oForm.elements[fieldIdx];
				var sSrc = Fse.FormManager.getFseAttribute( oSelect, "src" );
				if( sSrc != undefined ) {
					
					var sLoadMessage = Fse.FormManager.getFseAttribute( oSelect, "load-message" );
					if( sLoadMessage == undefined ) {
						sLoadMessage = "loading...";
					}
					
					// found fse:src - setup load on demand
					Fse.EventManager.addEventHandler( oSelect, "mousedown", 
						function () {
							Fse.FormManager._loadSelect( oSelect, sSrc, sLoadMessage );
						}
					);
					
					
				} else {
					// no fse:src - skip it
				}
			}
		}
	}
	
};


Fse.FormManager._loadSelect = function( oSelect, sSrc, sLoadMessage ) {

	if( oSelect.fseLoaded == undefined && ! oSelect.fseLoading ) {

		oSelect.fseLoading = true;

		var sSrcURL;
		if( false ) {
			sSrcURL = sSrc + "&jso=oSelect";
			//sSrc.search( "\?" )
		} else {
			sSrcURL = sSrc + "?jso=oSelect";
		}

		var oCurrentOption = oSelect.options[oSelect.selectedIndex];
		var sSaveText = oCurrentOption.text;
		oCurrentOption.text = sLoadMessage;

		try {
			
			var callback = function( oRequest ) {

				if( oRequest.xhRequest.status == "200" ) {
					eval( oRequest.xhRequest.responseText );
					var iOptionCount = oSelect_options.length;
					for( var idx = 0; idx < iOptionCount; idx++ ) {
						var _oOption = document.createElement( "option" );
						_oOption.appendChild( document.createTextNode( oSelect_options[idx].text ));
						_oOption.setAttribute( "value", oSelect_options[idx].value );
						oSelect.appendChild( _oOption );
					}
					oSelect.fseLoading = false;
					oSelect.fseLoaded = true;
				} else {
					alert( "Status: " + oRequest.xhRequest.status );
				}
				
				oCurrentOption.text = sSaveText;
				
			};
			
			Spry.Utils.loadURL( "GET", sSrcURL, true, callback );    
			
		} catch( exception ) {
			alert( exception.description );
		}
		
		
		
	}	
	
};


if( !Fse.FlexFields ) Fse.FlexFields = {};

Fse.FlexFields.addAnother = function( iFieldId, iMax ) {

	var oFieldNode = document.getElementById( "field_" + iFieldId + "_1" );
	var oAddAnotherNode = document.getElementById( "field_" + iFieldId + "_add_another" );
	if( oFieldNode && oAddAnotherNode) {

		var bInsert = false;

		var oLastFieldNode = oAddAnotherNode.parentNode.parentNode;
		if( oLastFieldNode.nextSibling ) {
			bInsert = true;
		} else {
			bInsert = false;
		}

		var iCurrentCount = oAddAnotherNode.getAttribute( "currentCount" ) * 1;
		var iNewCount = iCurrentCount + 1;
		
		oAddAnotherNode.parentNode.removeChild( oAddAnotherNode );
		var oNewFieldNode = oFieldNode.cloneNode( true );
		
		/* adjust as necessary to support new fieldIndex */
		var sNewId = oNewFieldNode.getAttribute( "id" ); 
		sNewId = sNewId.replace( /\d*$/, iNewCount );
		oNewFieldNode.setAttribute( "id", sNewId );
		
		var sOldName = oNewFieldNode.getAttribute( "nameToUse" );
		var sNewName = sOldName.replace( /\d*$/, iNewCount  );
		
		var reOldName = new RegExp( sOldName );
		oNewFieldNode.setAttribute( "nameToUse", sNewName );
		
		for( var idx = 0; idx < oNewFieldNode.childNodes.length; idx++ ) {
	
			var oNode = oNewFieldNode.childNodes[idx];
			if( oNode.nodeType == 1) {

				// look at elements
				var sNewId = oNode.getAttribute( "id" );
				if( sNewId ) {
					sNewId = sNewId.replace( reOldName, sNewName );
					oNode.setAttribute( "id", sNewId );
				}
				
				var sRawLabel = oNode.getAttribute( "rawLabel" );
				if( sRawLabel ) {
					var sNewLabel = sRawLabel.replace( /\${index}/, iNewCount );
					oNode.innerHTML = sNewLabel;
				}
				
				for( var ndx = 0; ndx < oNode.childNodes.length; ndx++ ) {
					
					oInnerNode = oNode.childNodes[ndx];
					// only elements
					if( oInnerNode.nodeType == 1 ) {
						
						var _sNewId = oInnerNode.getAttribute( "id" );
						if( _sNewId ) {
							_sNewId = _sNewId.replace( reOldName, sNewName );
							oInnerNode.setAttribute( "id", _sNewId );
						}

						var _sNewName = oInnerNode.getAttribute( "name" );
						if( _sNewName ) {
							_sNewName = _sNewId.replace( reOldName, sNewName );
							oInnerNode.setAttribute( "name", _sNewName );
						}
						
						var sType = oInnerNode.getAttribute( "type" );
						if( sType && sType == "text" ) {
							oInnerNode.value = "";
						}
						
						if( oInnerNode.nodeName == "TEXTAREA") {
							oInnerNode.innerHTML = "";
						}
						
						// && oInnerNode.getAttribute( "class" ) == "chars-left"
						if( oInnerNode.nodeName == "SPAN" ) {
							oInnerSpan = oInnerNode.firstChild;
							while( oInnerSpan && oInnerSpan.nodeName != "SPAN" ) {
								oInnerSpan = oInnerSpan.nextSibling;
							}
							if( oInnerSpan ) {
								var _sNewId = oInnerSpan.getAttribute( "id" );
								if( _sNewId ) {
									_sNewId = _sNewId.replace( reOldName, sNewName );
									oInnerSpan.setAttribute( "id", _sNewId );
									oInnerSpan.innerHTML = oInnerSpan.getAttribute( "maxLength" );
								} 
							}
						}
					
					}
					
				}
				
			}			
			
		}
		
		if( bInsert ) {
			oLastFieldNode.parentNode.insertBefore( oNewFieldNode, oLastFieldNode.nextSibling );
		} else {
			oLastFieldNode.parentNode.appendChild( oNewFieldNode );
		}		

		if( iNewCount < iMax ) {

			oAddAnotherNode.setAttribute( "currentCount", iNewCount );
		
			if( oNewFieldNode.lastChild.nodeType == 3) {
				/* firefox views the white space between the elements as a text node */
				oNewFieldNode.lastChild.previousSibling.appendChild( oAddAnotherNode );
			} else {
				oNewFieldNode.lastChild.appendChild( oAddAnotherNode );
			}
		
		}
	}
	
};

