if ((top.DynamicFormInit == "undefined") || (top.DynamicFormInit != true))
{
	/**
	*
	* CommonBaseFormData CLASS definition.
	*
	*/
	
	function CommonBaseFormData(){
		this.label = "";
		this.description = "";
	}

	CommonBaseFormData.prototype.getDescription = function (){
		return this.description;
	}

	CommonBaseFormData.prototype.setDescription = function (_description){
		this.description = _description;
	}

	CommonBaseFormData.prototype.getLabel = function (){
			return this.label;
	}

	CommonBaseFormData.prototype.setLabel = function (_label){
		this.label = _label;
	}

	/**
	*
	* Field CLASS definition.
	*
	*/

	function Field(_id){
		this.id = _id;
		this.inputType = "";//textarea, list, radio, checkbox
		this.group = null;
		this.listValues = new Array();
		this.value = "";
		this.attribute = "";
		this.line = null;
		this.segment = null;
		this.hasBeenRenderedValue = false;
		this.requiredValue = false;
		this.checkedValue = false;
		this.properties = "#size=26#max=35#onchange=javascript:stripCharsNotInField(this , lowercaseLetters+uppercaseLetters+whitespace);";
	}
	Field.prototype = new CommonBaseFormData();
	Field.prototype.constructor = Field;

	Field.prototype.setHasBeenRendered = function (val){
		this.hasBeenRenderedValue = val;
	}

	Field.prototype.hasBeenRendered = function (){
		return this.hasBeenRenderedValue;
	}

	Field.prototype.getID = function (){
		return this.id;
	}

	Field.prototype.getAttribute = function () {
		return this.attribute;
	}

	Field.prototype.setAttribute = function (att) {
		this.attribute = att;
	}

	Field.prototype.getGroup = function () {
			return this.group;
	}

	Field.prototype.setGroup = function (group) {
			this.group = group;
			this.group.addMember(this);
	}

	Field.prototype.getLine = function () {
			return this.line;
	}

	Field.prototype.setLine = function (group) {
			this.line = group;
			this.line.addMember(this);
	}

	Field.prototype.getSegment = function () {
			return this.segment;
	}

	Field.prototype.setSegment = function (group) {
			this.segment = group;
			this.segment.addMember(this);
	}

	Field.prototype.getInputType = function () {
			return this.inputType;
	}

	Field.prototype.setInputType = function (_inputType) {
			this.inputType = _inputType;
	}

	Field.prototype.getListValues = function () {
			return this.listValues;
	}

	Field.prototype.addListValue = function (value) {
			this.listValues[this.listValues.length] = value;
	}
	
	Field.prototype.sortListValues = function () {
			this.listValues.sort();
	}

	Field.prototype.required = function (){
			return this.requiredValue;
	}

	Field.prototype.setRequired = function (val){
			this.requiredValue = val;
	}

	Field.prototype.getChecked = function (){
			return this.checkedValue;
	}

	Field.prototype.setChecked = function (val){
			this.checkedValue = val;
	}

	Field.prototype.getValue = function (){
			return this.value;
	}

	Field.prototype.setValue = function (val){
			this.value = val;
	}

	Field.prototype.setProperties = function (prop){
			this.properties = prop;
	}

	Field.prototype.getProperty = function (prop){
		var pos = this.properties.indexOf("#"+prop);
		if(pos == -1){
			return "";
		}
		pos = this.properties.indexOf('=',pos);
		var pos2 = this.properties.indexOf('#',pos);
		if(pos2 == -1){
			pos2 = this.properties.length;
		}
		return this.properties.substring(pos+1,pos2); 
	}

	/**
	*
	* Group CLASS definition.
	*
	*/

	function Group(){
		this.members = new Array();
	}
	Group.prototype = new CommonBaseFormData();
	Group.prototype.constructor = Group;

	Group.prototype.addMember = function (member){
			this.members[this.members.length] = member;
	}

	Group.prototype.getMembers = function (){
			return this.members;
	}

	/**
	*
	* DynamicForm COMPONENT CLASS definition.
	*
	*/

	function DynamicForm(){
		this.attributeMapping = new Array();
		this.requiredFields = new Array();
	}
	
	DynamicForm.prototype.buildForm = function (group){
		var name = group.getLabel();
		var members = group.getMembers();
		var len = members.length;
		var form = "<form name=\""+name+"Form\" id=\""+name+"Form\" method=\"post\" onsubmit=\"return false;\"><table class=\"form\" ><tbody>";
		var field;
		
		for(var i=0; i<len; i++){
			field = members[i];
			if( !field.hasBeenRendered() ) {
				if( field.getSegment() != null) {
				    form = form + this.renderSegment(field.getSegment());
				} else if( field.getLine() != null ) {
					form = form + this.renderLine(field.getLine());
				} else {
					form = form + "<tr>" + this.renderCell(field, true) + "</tr>";
				}
			}
		}
		form = form + "</tbody></table></form>";
		top.dynamicFormHandler.addAttributes(this.attributeMapping);
		return form;
	}

	DynamicForm.prototype.renderSegment = function (segment){
		var members = segment.getMembers();
		var len = members.length;
		var form="<tr ><td colspan=2><table class=\"form\" border=\"1\"><tr><td>"+ segment.getLabel()+"</td></tr><tr><td><table class=\"form\">";
	    	for(var i=0;i<len;i++){
			field = members[i];
			if(!field.hasBeenRendered()){
				if(field.getLine() != null){
					form = form + this.renderLine(field.getLine());
				} else {
					form = form + "<tr>" + this.renderCell(field,true) + "</tr>";
				}
			}
		}
		form = form + "</table></td></tr></table></td><tr>";
		return form;
	}

	DynamicForm.prototype.renderLine = function (line){
		var members = line.getMembers();
		var len = members.length;
		var form = "<tr><td>"+this.renderGroupLabel(line)+"</td><td>";
		for(var i=0;i<len;i++){
			field = members[i];
			if(!field.hasBeenRendered()){
			    form = form + " " + this.renderCell(field,false);
			}
		}
		form = form + "</td></tr>";
		return form;
	}

	DynamicForm.prototype.renderCell = function (field, includeTDTags){
		var form = "";
		if(includeTDTags) {
			if(field.getInputType() == "textarea"){
				form = form + "<td>" + this.renderLabel(field) + "</td>" + "<td>" + this.renderTextArea(field) + "</td>";
			} else if(field.getInputType() == "list"){
				form = form + "<td>" + this.renderLabel(field) + "</td>" + "<td>" + this.renderList(field) + "</td>";
			} else if(field.getInputType() == "password"){
				form = form + "<td>" + this.renderPassword(field) + "</td>";
			} else if(field.getInputType() == "button"){
				form = form + "<td>" + this.renderButton(field) + "</td>";
			} else if(field.getInputType() == "radio"){
				form = form + "<td width=\"5%\">" + this.renderRadio(field) + "</td>" + "<td  width=\"95%\" align=\"left\">" + this.renderLabel(field)+"</td>";   				
			} else if(field.getInputType() == "checkbox"){
				form = form + "<td width=\"5%\">" + this.renderCheckbox(field) + "</td>" + "<td  width=\"95%\" align=\"left\">"+ this.renderLabel(field)+"</td>";   				
			} else if(field.getInputType() == "text"){
				form = form + "<td colspan=\"2\" align=\"left\">" + this.renderText(field) +"</td>";
			}
		} else {
			if(field.getInputType() == "textarea"){
				form = form + " " + this.renderLabel(field) + " " + this.renderTextArea(field);
			} else if(field.getInputType() == "list"){
				form = form + " " + this.renderLabel(field) + " " + this.renderList(field);
			} else if(field.getInputType() == "password"){
				form = form + " " + this.renderPassword(field);
			} else if(field.getInputType()=="button"){
				form = form + " " +this.renderButton(field);
			} else if(field.getInputType()=="radio"){
				form = form + " " + this.renderRadio(field) + " " + this.renderLabel(field);   				
			} else if(field.getInputType()=="checkbox"){
				form = form + " " + this.renderCheckbox(field) + " " + this.renderLabel(field);   				
			} else if(field.getInputType() == "text"){
				form = form + " " + this.renderText(field);
			}
		}
		field.setHasBeenRendered(true);
		this.attributeMapping[field.getAttribute()]=field.getID();
		if(field.required())
		{
			this.requiredFields[this.requiredFields.length] = field.getID();
		}
		return form;
	}

	DynamicForm.prototype.renderText = function (field){
		return field.getLabel();
	}

	DynamicForm.prototype.renderLabel = function (field){
		return "<label for=\""+field.getID()+"\">"+field.getLabel()+ (field.required() ? "*" :"") + "</label>";
	}

	DynamicForm.prototype.renderGroupLabel = function (group){
		return "<label for=\""+group.getLabel()+"\">"+group.getLabel()+ "</label>";
	}

	DynamicForm.prototype.renderTextArea = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		return "<input type=\"text\" id=\""+field.getID()+"\" name=\""+field.getID()+"\" maxlength=\""+field.getProperty("max")+"\" size=\""+field.getProperty('size')+"\" value=\"" + field.getValue() + "\" onchange=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "',this.value,'datachange')\"\">";
	}

	DynamicForm.prototype.renderPassword = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		return "<input type=\"password\" id=\""+field.getID()+"\" name=\""+field.getID()+"\" maxlength=\""+field.getProperty("max")+"\" size=\""+field.getProperty('size')+"\" value=\"\" onchange=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "',this.value,'datachange')\"\">";
	}

	DynamicForm.prototype.renderPassword = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		return "<input type=\"password\" id=\""+field.getID()+"\" name=\""+field.getID()+"\" maxlength=\""+field.getProperty("max")+"\" size=\""+field.getProperty('size')+"\" value=\"\" onchange=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "',this.value,'datachange')\"\">";
	}

	DynamicForm.prototype.renderButton = function(field){
		return ButtonActionManager.buttonRenderer.renderButton(field.getAttribute(),field.getLabel());
	}

	DynamicForm.prototype.renderList = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		var form = "<select id=\""+field.getID()+"\" name=\""+field.getID()+"\" onchange=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "',this.options[this.selectedIndex].text,'datachange')\"\">";
		var len = field.getListValues().length;
		var values = field.getListValues();
		var selected;
		for(var i=0;i<len;i++){
			selected = '';
			if (field.getValue() == values[i]) {
				selected = 'selected';
			}
			form=form+"<option value=\""+ values[i]+"\"" + selected + ">"+values[i]+"</option>\n";
		}
		form = form+"</select>"
		return form;
	}

	DynamicForm.prototype.renderRadio = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		var checked = '';
		if(field.getChecked() == true) { 
			checked = 'checked'
		}
		return "<input type=\"radio\" id=\""+field.getID()+"\" name=\""+field.getAttribute()+"\" value=\"" + field.getID() + "\" onclick=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "', this.value, 'datachange')\" " + checked + "></input>";
	}

	DynamicForm.prototype.renderCheckbox = function (field){
		this.attributeMapping[field.getAttribute()] = field.getID();
		var checked = '';
		if(field.getChecked() == true) { 
			checked = 'checked'
		}
		return "<input type=\"checkbox\" id=\""+field.getID()+"\" name=\""+field.getAttribute()+"\" value=\"" + field.getID() + "\" onclick=\"DynamicFormActionManager.doFormAction('" + field.getAttribute() + "', this.value, 'datachange')\" " + checked + "></input>";
	}

	DynamicForm.prototype.checkRequired = function(){
		var element,inputtype;
		for (var i=0;i<this.requiredFields.length;i++)
		{
			element = document.getElementById(this.requiredFields[i]);
			if(element != null){
				if( element instanceof 'HTMLInputElement'){
					if (element.type=='text'){
						if(element.value.length<=0){
							return false;
						}
					} else if(element.type == 'radio'){
						if(!element.checked){
							return false;
						}
					}
				}else if(element instanceof 'HTMLSelectElement'){
					if (element.selectedIndex < 0){
						return false;
					}
				}
			}
		}
		return true;
	}

	/**
	*
	* DynamicForm ACTION MANAGER definition.
	*
	* Handles user gestures
	*
	*/

	function DynamicFormActionManager(){}
	
	DynamicFormActionManager.handlerList = new Array();
	DynamicFormActionManager.register = function (handler){
		DynamicFormActionManager.handlerList[DynamicFormActionManager.handlerList.length] = handler; 
	}
	
	DynamicFormActionManager.doFormAction = function(attribute,value,action){
		var len = DynamicFormActionManager.handlerList.length;
		var handler;
		for(var i=0;i<len;i++){
			DynamicFormActionManager.handlerList[i].doFormAction(attribute,action,value);
		}
	}

	/**
	*
	* DynamicForm EVENT MANAGER definition.
	*
	* Handles component updates
	*
	*/

	function DynamicFormEventManager(){
		this.xmlWrapper = new XmlWrapper();
		this.attributeMappings = new Array();
	}

	DynamicFormEventManager.prototype.handle = function(publisher, eventName, attributeId, payLoad) {
		payLoad = this.xmlWrapper.unWrapXml(payLoad);
		var id = this.attributeMappings[attributeId];
		var element = Component.getDocument().getElementById(id);

		if(eventName == 'datachange') {
			element.value=payLoad;
		} else if(eventName == 'disablefield') {
			element.disabled = true;
		} else if(eventName == 'enablefield'){
			element.disabled = false;

		} else if(eventName == 'addattribute'){
			this.addAttribute(payLoad);
		} else if(eventName == 'addoption'){
			element[element.length] = new Option(payLoad[0], payLoad[1], payLoad[2]);
			if ( payLoad.length > 2 ) {
				element[element.length - 1].selected = payLoad[2];
			}
		} else if(eventName == 'removealloptions'){
			while (element.length > 0) {
				element.options[element.length - 1] = null;
			}
		} else if(eventName == 'selectoption'){
			for (var i = 0; i < element.options.length; i ++) {
				if ( element.options[i].text == payLoad ) {
					element.options[i].selected = true;
				}
				else {
					element.options[i].selected = false;
				}
			}
		} else if(eventName == 'radiocheck'){
			element.checked = true;
		} else if(eventName == 'checkfield'){
			element.checked = true;
		} else if(eventName == 'uncheckfield'){
			element.checked = false;
		}
	}

	DynamicFormEventManager.prototype.addAttributes = function(attributes){
		for(attr in attributes){
			this.attributeMappings[attr] = attributes[attr];
		}
	}
	DynamicFormEventManager.prototype.addAttribute = function(attribute){
		this.attributeMappings[attribute] = attribute;
	}

	top.dynamicFormHandler = new DynamicFormEventManager();
	top.eventService.subscribe("DynamicForm","datachange","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","enablefield","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","disablefield","-",top.dynamicFormHandler);

	top.eventService.subscribe("DynamicForm","addattribute","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","addoption","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","removealloptions","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","selectoption","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","radiocheck","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","checkfield","-",top.dynamicFormHandler);
	top.eventService.subscribe("DynamicForm","uncheckfield","-",top.dynamicFormHandler);

	//////////////////////////////////////

	top.DynamicFormInit = true;
}
