// Prototype und PBE Konfliktbehebung
var $j = jQuery.noConflict();

// FormTool-Initialisierung nach Documentload
$j(document).ready(function () {	
	formtool.init();
});

/*** FormTool-Konstanten **********************************************/
var formtoolConstants = {
	//URL-Parts
	PROTOCOL: "",
	HOST: "",
	PORT: "",
	SSL_PORT: "443",
	PROJECT: "msp",
	SYSTEM: "cms",
	CONTROLLER: "jsformtool",
	CONTENT_CONTROLLER: "content",
	FORMTOOL_CONTROLLER: "formTool",
	OBM_SELF_SERVICE_CONTROLLER: "obmSelfService",
	MANDANT: "MSP",
	LANGUAGE: "de",
	PAGEID: "",
	//Elements
	ELEMENT_INPUT: "input",	
	ELEMENT_TEXTAREA: "textarea",	
	FORM_ELEMENT_PREFIX: "FormElement.",
	RESET_ELEMENT: ".resetelement",
	//Element-Types
	ELEMENT_TYPE_SELECT: "select",
	ELEMENT_TYPE_TEXTAREA: "textarea",
	ELEMENT_TYPE_TEXT: "text",
	ELEMENT_TYPE_RADIO: "radio",
	ELEMENT_TYPE_CHECKBOX: "checkbox",
	ELEMENT_TYPE_DIV: "div",
	ELEMENT_TYPE_FORM: "form",
	ELEMENT_TYPE_FIELDSET: "fieldset",
	//CSS
	CSS_SELECTOR: "autofill",
	CSS_HIDDEN_SELECTOR: "autofill_hidden",
	CSS_MANDATORY_SELECTOR: "dynmand",
	CSS_ADDITIONAL_FIELDS_SELECTOR: "addfields",
	CSS_CLASS_LABEL: "label",
	CSS_CLASS_LABEL_MANDATORY: "labelMandatory",
	ERROR_SELECTOR: "errorMsg",
	//Events
	EVENT_CHANGE: "change",
	EVENT_CLICK: "click",
	EVENT_KEY_UP: "keyup",
	EVENT_BLUR: "blur",
	//Paramters
	PARAMETER_TIME: "time",
	PARAMETER_ACTION: "action",
	PARAMETER_ELEMENT_ID: "elementId",
	PARAMETER_ELEMENT_NAME: "elementName",
	PARAMETER_ELEMENT_VALUE: "elementValue",
	
	DYNAMIC_CONTENT_HIDE_PREFIX: "_hide",
	DYNAMIC_CONTENT_ACCEPTED_EMPTY_CONTENT_M1: "-1",
	DYNAMIC_CONTENT_ACCEPTED_EMPTY_CONTENT_EMPTY: "empty",
	
	DYNAMIC_MANDATORY_ELEMENTS: "DynamicMandatories",
	OPTIONAL_ELEMENTS: "OptionalElements",
	
	/** PagingConstants */
	PAGE_PREFIX: "page",
	BREAD_CRUMP_PREFIX: "breadCrump",
	PAGE_SELECTOR: "tabCo",
	NAVI_SELECTOR: "navielement",
	NAVI_BACK_SELECTOR: "bSub",
	NAVI_NEXT_SELECTOR: "nSub",
	PAGE_TAB_SELECTOR: "tabBox"
	
};
/***********************************************************************/

/*** FormTool **********************************************************/
var formtool = {

	init: function() {
		try { formtool.checkActiveX() } catch(ex) { /*nothing*/ }
		try { formtool.pageing.handle(); }catch(ex) {/*nothing*/}	
		try { formtool.bindEvents(); }catch(ex) {/*nothing*/}
		try { formtool.dynamicMandatories.bindEvents(); }catch(ex) {/*nothing*/}
		try { formtool.additionalFields.bindEvents(); }catch(ex) {/*nothing*/}
		try { formtool.setUrl(); }catch(ex) {/*nothing*/}
		//try { formtool.checkHiddenElements(); }catch(ex) {/*nothing*/}
		try { formtool.dynamicMandatories.getMandatories(); }catch(ex) {/*nothing*/}	
		try { formtool.setHiddenClassName(); }catch(ex) {/* nothing */}
		try { formtool.handleSearchString() }catch(ex) {  /* nothing */ }	
	},
	
	hiddenElementsCheck: [],	
	url: "",
	doClear: true,
	fields: [
					 formtoolConstants.ELEMENT_INPUT,
					 formtoolConstants.ELEMENT_TYPE_SELECT,
					 formtoolConstants.ELEMENT_TEXTAREA
					],
	clickTypes: [
						   formtoolConstants.ELEMENT_TYPE_RADIO,
							 formtoolConstants.ELEMENT_TYPE_CHECKBOX	
						 	],
	detectedElements: [],	
	
	setHiddenClassName: function() {
		if (document.getElementsByName("hiddenclass").length > 0) {
			var hiddenclass = document.getElementsByName("hiddenclass")[0].value;
			if (hiddenclass && hiddenclass != "") {
				formtoolConstants.CSS_HIDDEN_SELECTOR = hiddenclass;
			}
		}
	},	
	
	 /* Liefert alle in "formtool.fields" enthaltenen Formularelementtypen
	 * und haengt ein "Change"-Event zum Aufruf von "formtool.getFurtherInformations" an
	 */
	bindEvents: function() {
		$j("." + formtoolConstants.CSS_SELECTOR).each(function (i, item) {
			if($j.inArray(item.tagName.toLowerCase(), formtool.fields) != -1) {
				if ($j.inArray(item.type.toLowerCase(), formtool.clickTypes) != -1) {
					$j(item).bind(formtoolConstants.EVENT_CLICK, function(){
						formtool.getFurtherInformations(item);
					});
				}else {
					$j(item).bind(formtoolConstants.EVENT_CHANGE, function(){
						formtool.getFurtherInformations(item);
					});
				}					
				formtool.detectedElements.push(item);
			}
		});		
	},
	
	/*
	 * generiert die URL fuer den XMLHTTPRequest
	 */
	setUrl: function() {
		formtool.url = "";
		if(formtool.detectedElements.length > 0) {						
			// ermittelt betroffenes Formtag
			$j("form").each(function (i, frmItem) {	
				if(formtool.isElementInForm(frmItem, formtool.detectedElements)) {
							
					// Document-Variablen lesen fuer PROTOCOL, HOST, PORT			
					formtoolConstants.PROTOCOL = window.location.protocol.replace(":","");
					formtoolConstants.HOST = window.location.host;
					if(window.location.host.indexOf(":") > 0) {
						formtoolConstants.HOST = window.location.host.substr(0, window.location.host.indexOf(":"));
					}
					if(window.location.port != "") {
						formtoolConstants.PORT = ":" + window.location.port;
					}						
					formtool.url = formtoolConstants.PROTOCOL + "://" + formtoolConstants.HOST + formtoolConstants.PORT;
					
					// Action-Attribut aus Formtag lesen
					var attrAction = frmItem.action.replace("formTool", formtoolConstants.CONTROLLER);	
						attrAction = attrAction.replace("ipVpnForm", formtoolConstants.CONTROLLER);
						attrAction = attrAction.replace("obmSelfService", formtoolConstants.CONTROLLER);
						attrAction = attrAction.replace("sessionBasedUserAware", formtoolConstants.CONTROLLER);
					if(attrAction.indexOf(formtoolConstants.PROTOCOL) == -1) {	
						formtool.url += attrAction;
					}else {
						attrAction = attrAction.replace("https", formtoolConstants.PROTOCOL);
						attrAction = attrAction.replace(formtoolConstants.PROTOCOL + "://", "");
						formtool.url = formtool.url + attrAction.substring(attrAction.indexOf("/"), attrAction.length);
						formtool.url = formtool.url.replace(":"+formtoolConstants.SSL_PORT, "");
						if(formtoolConstants.HOST.indexOf(formtoolConstants.WWW) != -1 && 
									formtool.url.indexOf(formtoolConstants.PROTOCOL+"://"+formtoolConstants.WWW) == -1) {
							formtool.url = formtool.url.replace(formtoolConstants.PROTOCOL+"://", formtoolConstants.PROTOCOL+"://"+formtoolConstants.WWW+".");
						}
					}
				}
			});
		}	
	},
	
	isElementInForm: function(frm, elements) {	
		var isInForm = false;

		$j.each(elements, function(i, element) {
			var formElements = $j("#" + frm.id + " " + element.tagName.toLowerCase());
			if($j.inArray(element, formElements) != -1) {
				isInForm = true;
			}
		});
		
		return isInForm;
	},
	
	/*
	 * generiert den Querystring für den XMLHTTPRequest
	 */
	getFurtherInformations: function(element) {
		if (formtool.checkForPreview() && element != undefined) {
			if (element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO &&
			!element.checked) {
				if (formtool.hiddenElementsCheck.length > 0) {
					var item = formtool.hiddenElementsCheck[0];
					formtool.hiddenElementsCheck.shift();
					formtool.getFurtherInformations(item);
				}	 
				return;
			}
			
			var elementValue = element.value;
			if(element.tagName && element.tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
				elementValue = formtool.getMultipleValue(element);
			}
			
			var timestamp = new Date();
			var parameters = [
												formtoolConstants.PARAMETER_TIME, 
												timestamp.getTime(), 
												formtoolConstants.PARAMETER_ACTION, 
												"extendedData", 
												formtoolConstants.PARAMETER_ELEMENT_ID, 
												element.id, 
												formtoolConstants.PARAMETER_ELEMENT_NAME, 
												element.name, 
												formtoolConstants.PARAMETER_ELEMENT_VALUE, 
												elementValue
											 ];
			if (element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_CHECKBOX &&
						!element.checked) {
				parameters = [
											formtoolConstants.PARAMETER_TIME, 
											timestamp.getTime(), 
											formtoolConstants.PARAMETER_ACTION, 
											"extendedData", 
											formtoolConstants.PARAMETER_ELEMENT_ID, 
											element.id, 
											formtoolConstants.PARAMETER_ELEMENT_NAME, 
											element.name, 
											formtoolConstants.PARAMETER_ELEMENT_VALUE, 
											""
										 ];
			}
			var encodedURI = encodeURI($j.serializeObject(parameters));
			if(formtool.url == "") {
				formtool.setUrl();
			}
			if (formtool.url != "") {
				formtool._doXHR(formtool.url, encodedURI);
			}
		}
	},	
	
	/*
	 * fuehrt einen JSON-XMLHTTPRequest anhand der uebergebenen 
	 * Parameter "url" und "parameters" aus
	 */
	_doXHR: function(url, parameters) {
		$j.getJSON (
			url, 
			parameters, 
			function(json, textStatus){
				formtool._handleResponse(json, parameters);
			}
		);
	},
	
	/*
	 * verarbeitet das von XMLHTTPRequest uebergebene JSON-Object
	 */
	_handleResponse: function(result, parameters) {
		// pruefen der Ausloesemethode zur Entscheidung der Folgeoperationen
		if(parameters.indexOf("extendedData") != -1) {
			var destFieldName;
			var destElement;
			var extendedData = [];
			var displayedFields = [];
			var counter = 0;
			
			for (var key in result) {
				var hidePrefix = false;
				// Zielelement selektieren
				destElement = formtool.getElement(key);
				var selectedAttr = undefined;
				if (destElement[0] && destElement[0].tagName && 
									destElement[0].tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
					$j.each(destElement[0].options, function(i, item) {
						if ($j(item).attr("selected")) {
							selectedAttr = $j(item).val();
						}
					});
				}
				
				destElement = $j.clearValues(destElement);
				extendedData = result[key];
				
				if(extendedData && extendedData.length > 0) {	
					var	z = 0;
					// erweiterte Informationen der Selectbox anhaengen
					$j.each(extendedData, function (i, item) {
						if(item.indexOf(formtoolConstants.DYNAMIC_CONTENT_HIDE_PREFIX) >= 0) {
							item = item.replace(formtoolConstants.DYNAMIC_CONTENT_HIDE_PREFIX, "");
							hidePrefix = true;
							formtool.doClear = false;
						}else {
							formtool.doClear = true;
						}
						if(destElement[0] && destElement[0].tagName && 
									destElement[0].tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
							var newOption = document.createElement("option");
								newOption.text = item;
								newOption.value = item;
							if (selectedAttr && selectedAttr == item) {
								$j(newOption)[0].selected = true;
								try {
									if (kiso) {
										kiso.verbandIndex = z;
									}
								}catch(e) {/* nothing */}
								try {
									if (kuzeformtool) {
										kuzeformtool.verbandIndex = z;
									}
								}catch(e) {/* nothing */}
							}
								
							try {
								destElement[0].add(newOption, null);	
							}catch(ex) {
								destElement[0].add(newOption);
							}	
							if(extendedData.length <= 1) {
								hidePrefix = true;
							}					
						}
						if (destElement[0] && destElement[0].tagName &&
									destElement[0].tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_TEXTAREA) {
						  if ($j(destElement).val() != "") {
			  				var value = $j(destElement).val();
								if(value.indexOf(formtoolConstants.DYNAMIC_CONTENT_HIDE_PREFIX) >= 0) {
									$j(destElement).val(item);
								}
						  }else {
						  	$j(destElement).val(item);
						  }
						}
						if(destElement[0] && destElement[0].type && 
									destElement[0].type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_TEXT) {	
						  if ($j(destElement).val() != "") {
			  				var value = $j(destElement).val();
								if(value.indexOf(formtoolConstants.DYNAMIC_CONTENT_HIDE_PREFIX) >= 0) {
									$j(destElement).val(item);
								}
						  }else {
						  	$j(destElement).val(item);
						  }
						}
						if($j.isObject(destElement)) {
							$j.each(destElement, function(i, el) {
								if(el.type && el.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO) {								
									if(el.value == item) {
										$j(el).attr("checked", true);
									}
								}
							});
						}
						z++;
					});
					if(!hidePrefix) {
						if ($j(destElement).attr("type") != "file") {
							displayedFields.push("field"+counter);
							displayedFields.push($j(destElement).attr("id"));
							counter++;
						}
					}
					try {
						if (kiso && kiso != undefined) {
							kiso.checkVerband();
						}
					}catch(e) {/* nothing */}
					try {
						if (kuzeformtool && kuzeformtool != undefined) {
							kuzeformtool.checkBranche();
						}
					}catch(e) {/* nothing */}
				}else {
					hidePrefix = true;
				}
				formtool.handleElementDisplay(destElement, hidePrefix);	
			}			
			
			formtool.getRequestedDateForExtendedFields(displayedFields);
			
			if (formtool.hiddenElementsCheck.length > 0) {
				var item = formtool.hiddenElementsCheck[0];
				formtool.hiddenElementsCheck.shift();
				formtool.getFurtherInformations(item);
			}			
		}else if(parameters.indexOf("FormBeanData") != -1) {
			for (var key in result) {
				if($j("#" + key).length > 0) {
					var elem = $j("#" + key)[0];
					var value = result[key];
					if(elem.tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
						for(var i=0;i<elem.options.length;i++) {
							if(elem.options[i].text == value) {
								elem.options[i].selected = true;
							}
						}
					}
					if(elem.tagName.toLowerCase() == formtoolConstants.ELEMENT_INPUT) {
						if(elem.type && elem.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_TEXT) {
							$j(elem).val(value);
						}
						if (elem.type &&
						(elem.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO ||
						 elem.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_CHECKBOX)) {
							if ($j(elem).val() == value) {
								$j(elem).attr("checked", true);
							}
						}
					}
					if($j(elem).hasClass(formtoolConstants.CSS_SELECTOR)) {
						formtool.getFurtherInformations(elem);
					}
				}
			}
			
			try {
				oom.pricing.collectProductOptions();
			}catch(ex) { /*nothing*/ }
			
		}
	},
	
	handleElementDisplay: function(elem, hide) {
		if (elem) {
			if ($j.isObject(elem)) {
				$j.each(elem, function(i, item){
					if (!hide) {
						formtool.showHiddenElement(item);
					}
					else {
						formtool.hideDestElement(item);
					}
				});
			}
			else {
				if (!hide) {
					formtool.showHiddenElement(elem);
				}
				else {
					formtool.hideDestElement(elem);
				}

			}
		}
	},
	
	getElement: function(fieldName) {
		var element = undefined;
		
		if(fieldName != undefined && fieldName != "") {			
			if($j("#id" + fieldName).length > 0) {
				element = $j("#id" + fieldName);
			}else {
				if (fieldName.indexOf("data[") == 0) {
					element = document.getElementsByName(fieldName);
				}
				else {
					element = document.getElementsByName("data[" + fieldName + "]");
				}
			}
		}
		return element;
	},
	
	/*
	 * setzt das uebergebene Element + Label und deren uebergeordnetes "TR"-Tag sichtbar
	 */
	showHiddenElement: function(element) {
		var par = formtool.getParent(element, ".element");
		var className = $j(par).attr("className");
		
		if (className != null && className.indexOf(formtoolConstants.CSS_HIDDEN_SELECTOR) != -1) {
			$j(par).removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
			$j(par).children(".label").children(".label").removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
			$j(par).children(".label").children(".labelMandatory").removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		}
		
		$j("#"+element.id+" + label").removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(element).removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(par).prev(".errorMsg").removeClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		
		try {
			formtool.addUsedExtendedElement(element);
		}catch(e) {/* Nothing */}
	},
	
	hideDestElement: function(element) {
		var par = formtool.getParent(element, ".element");
		
		$j(par).addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(par).children(".label").children(".label").addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(par).children(".label").children(".labelMandatory").addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		
		$j("#"+element.id+" + label").addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(element).addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		$j(par).prev(".errorMsg").addClass(formtoolConstants.CSS_HIDDEN_SELECTOR);
		
		if (formtool.doClear) {
			if (element.nodeName.toLowerCase() == formtoolConstants.ELEMENT_INPUT) {
				if (element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_TEXT) {
					if (element.id != 'idadditional_OrtHandelsregister' && element.id != 'idadditional_Handelsregisternummer') {
						$j(element).val("");
					}
				}
			}
			
			if (element.tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
				if (element.options.length > 1) {
					$j.clearValues(element);
				}
			}
		}
		
		try {
			formtool.removeUsedExtendedElement(element);
		}catch(e) {/* Nothing */}
	},
	
	checkForPreview: function() {
		try {
			if(formToolPreviewName) {
				return false;
			}
		} 
		catch (ex) {
			// nothing
		}
		return true;
	},
	
	getParent: function(childElement, par) {
		var searchElement = true;
		if(par.indexOf(".") == 0) {
			par = par.replace(".", "");
			searchElement = false;
		}
		
		var parents = $j(childElement).parents();
		for(var i=0;i<parents.length;i++) {
			if (searchElement) {
				if (parents[i].tagName && parents[i].tagName.toLowerCase() == par.toLowerCase()) {
					return parents[i];
				}
			}else {
				if ($j(parents[i]).attr("class") && $j(parents[i]).attr("class").indexOf(par) >= 0) {
					return parents[i];
				}
			}
		}
	},
	
	getMultipleValue: function(element) {
		var values = [];
		
		if (element.options) {
			for (i = 0; i < element.options.length; i++) {
				if (element.options[i].selected) {
					values.push(element.options[i].value);
				}
			}
		}else {
			values.push($j(element).val());	
		}
		
		return values;
	},
	
	addUsedExtendedElement: function(element) {
		var usedElements = document.getElementsByName("usedExtendedData")[0].value.split(",");
		var elementName = $j(element).attr("id");
		if (elementName != "") {
			elementName = elementName.substring(2, elementName.length);
			
			if (element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO) {
				var attrName = $j(element).attr("name");
				if (attrName.indexOf("data[") == 0) {
					elementName = attrName.substring(5, attrName.length-1);
				}
			}
			
			if ($j.inArray(elementName, usedElements) == -1) {
				usedElements.push(elementName);
				var newUsedElements = "";
				
				for (var i = 0; i < usedElements.length; i++) {
					newUsedElements += (newUsedElements != "" ? "," : "") + usedElements[i];
				}
				
				document.getElementsByName("usedExtendedData")[0].value = newUsedElements;
			}
		}
	},
	
	removeUsedExtendedElement: function(element) {
		var usedElements = document.getElementsByName("usedExtendedData")[0].value.split(",");
		var elementName= $j(element).attr("id");
		if(elementName != "") {
			elementName = elementName.substring(2, elementName.length);
			
			if (element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO) {
				var attrName = $j(element).attr("name");
				if (attrName.indexOf("data[") == 0) {
					elementName = attrName.substring(5, attrName.length-1);
				}
			}
			
			if($j.inArray(elementName, usedElements) != -1) {
				var newUsedElements = "";
				
				for(var i=0;i<usedElements.length;i++) {
					if(usedElements[i] != elementName) {
						newUsedElements += (newUsedElements != "" ? "," : "") + usedElements[i];
					}
				}
				
				document.getElementsByName("usedExtendedData")[0].value = newUsedElements;
			}
		}
	},
	
	checkActiveX: function() {
		var error = false;
		try {
			if($j.browser.msie) {
				var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
				if(xmlHttp == undefined) {
					error = true
				}
				xmlHttp = undefined;
			}
		}catch(e) {
			error = true			
		}
		
		if($j("#iderrorpage").length > 0 && error) {
			document.location.href = window.location.protocol + "//" + window.location.host + $j("#iderrorpage").val();
		}
	},
	
	reset: function(elem) {
		elem.form.reset();
		$j("." + formtoolConstants.CSS_SELECTOR).each(function (i, item) {
			formtool.getFurtherInformations(item);
		});
		formtool.dynamicMandatories.getMandatories();
	},
	
	handleSearchString: function() {
		var search = window.location.search.substring(1, window.location.search.length);
		if (search != "") {
			var keyValuePairs = search.split("&");
			for(var i in keyValuePairs) {
				var keyValuePair = keyValuePairs[i].split("=");
				if(keyValuePair && keyValuePair.length == 2) {
					if($j("#id" + keyValuePair[0]).length > 0) {
						var element = $j("#id" + keyValuePair[0])[0];
						if (element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_TEXT) {
							element.value = keyValuePair[1];
						}else if(element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_CHECKBOX ||
												element.type && element.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO) {
							if(element.value == keyValuePair[1]) {
								element.checked = true;
							}else {
								element.checked = false;
							}
						}else if (element.tagName && element.tagName.toLowerCase() == formtoolConstants.ELEMENT_TYPE_SELECT) {
							for(var j=0;j<element.options.length;j++) {								
								if(element.options[j].value == keyValuePair[1] || 
											element.options[j].text == keyValuePair[1]) {
									element.options[j].selected = true;
								}
							}
						}
					}
				}
			}
		}
	},
	
	checkHiddenElements: function() {
		if (formtool.checkForPreview()) {
			var j = 0;
			$j("." + formtoolConstants.CSS_SELECTOR).each(function(i, item){
				if ($j.inArray(item.tagName.toLowerCase(), formtool.fields) != -1) {
					formtool.hiddenElementsCheck[j] = item;
					j++;
				}
			});
			if (formtool.hiddenElementsCheck.length > 0) {
				var item = formtool.hiddenElementsCheck[0];
				formtool.hiddenElementsCheck.shift();
				formtool.getFurtherInformations(item);
			}	
		}		
	},
	
	isElementVisible: function(element) {
		var retVal = true;
		if (!$j.isObject(element)) {
			if ($j(elem).attr("class").indexOf(formtoolConstants.CSS_HIDDEN_SELECTOR) != -1) {
				retVal = false;
			}
		}else {
			$j.each(element, function(i, elem){
				if ($j(elem).attr("class").indexOf(formtoolConstants.CSS_HIDDEN_SELECTOR) != -1) {
					retVal = false;
				}
			});
		}
		return retVal;
	},
	
	getRequestedDateForExtendedFields: function(fields) {
		if(fields && fields.length > 0) {
			fields.push("action");
			fields.push("FormBeanData");
			var getParameter = encodeURI($j.serializeObject(fields));
			formtool._doXHR(formtool.url, getParameter);
		}
	},
	
	resetForm: function(obj) {
		if($j(obj)) {
			var form = formtool.getParent(obj, "form");
			if($j(form) && $j(form).length > 0) {
				var elements = $j(form)[0].elements;
				if(elements && elements.length > 0) {
					for(var i=0;i<elements.length;i++) {
						try {
							var element = elements[i];
							if (element.tagName) {
								switch (element.tagName.toLowerCase()) {
									case formtoolConstants.ELEMENT_INPUT:
										if (element.type) {
											if (element.type == formtoolConstants.ELEMENT_TYPE_TEXT) {
												$j(element).val("");
											}
											else 
												if (element.type == formtoolConstants.ELEMENT_TYPE_RADIO || element.type == formtoolConstants.ELEMENT_TYPE_CHECKBOX) {
													$j(element).attr("checked", false);
												}
										}
										break;
									case formtoolConstants.ELEMENT_TEXTAREA:
										$j(element).val("");
										break;
									case formtoolConstants.ELEMENT_TYPE_SELECT:
										$j(element)[0].selectedIndex = 0;
										break;
								}
							}
						}catch(e) {
							/*nuescht*/
						}
					}
					try {
						formtool.pageing.errorPages = [];
						$j("div.errorMsg").each(function(i, val) {
							(val.parentNode).removeChild(val);
						});
						
						$j("a.errorMsg").each(function(i, val) {
							$j(val).removeClass("errorMsg");
						});
					}catch(e) {
						/*nuescht*/
					}
				} 
			}
		}
	},

/*** FormTool.dynamicMandatories **********************************************/

	dynamicMandatories: {
		
		fields: [
					 		formtoolConstants.ELEMENT_TYPE_SELECT,
							formtoolConstants.ELEMENT_TYPE_TEXT,
							formtoolConstants.ELEMENT_TYPE_RADIO,
							formtoolConstants.ELEMENT_TYPE_CHECKBOX,
							formtoolConstants.ELEMENT_INPUT
						],
		
		bindEvents: function() {
			$j("." + formtoolConstants.CSS_MANDATORY_SELECTOR).each(function (i, item) {
				if($j.inArray(item.tagName.toLowerCase(), formtool.dynamicMandatories.fields) != -1) {
					if ($j.inArray(item.type.toLowerCase(), formtool.clickTypes) != -1) {
						$j(item).bind(formtoolConstants.EVENT_CLICK, function(){
							formtool.dynamicMandatories.getMandatories();
						});
					}else {
						$j(item).bind(formtoolConstants.EVENT_CHANGE, function(){
							formtool.dynamicMandatories.getMandatories();
						});
					}
					formtool.detectedElements.push(item);
				}
			});		
		},
		
		getMandatories: function() {
			if (formtool.checkForPreview()) {
				var timestamp = new Date();
				var parameters = [
													formtoolConstants.PARAMETER_TIME, 
													timestamp.getTime(),
													formtoolConstants.PARAMETER_ACTION, 
													"DynamicMandatories"
												 ];
				
				if ($j("." + formtoolConstants.CSS_MANDATORY_SELECTOR).length > 0) {
					$j("." + formtoolConstants.CSS_MANDATORY_SELECTOR).each(function(i, item){
						if ($j.inArray(item.tagName.toLowerCase(), formtool.dynamicMandatories.fields) != -1) {
							var setParameter = true;
							if (item.type && item.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO && !item.checked) {
								setParameter = false;
							}
							if (item.type && item.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_CHECKBOX && !item.checked) {
								setParameter = false;
							}
							
							if (setParameter) {
								var elementValue = formtool.getMultipleValue(item);
								parameters.push(item.name);
								parameters.push(elementValue);
							}
						}
					});
					
					var encodedURI = encodeURI($j.serializeObject(parameters));
					if (formtool.url == "") {
						formtool.setUrl();
					}
					if (formtool.url != "") {
						formtool.dynamicMandatories._doXHR(formtool.url, encodedURI);
					}
				}
			}
		},	
		
		_doXHR: function(url, parameters) {
			$j.getJSON (
				url, 
				parameters, 
				function(json, textStatus){
					formtool.dynamicMandatories._handleResponse(json, parameters);
				}
			);
		},
		
		_handleResponse: function(result, parameters) {
			if(parameters.indexOf("DynamicMandatories") != -1) {
				var mandatoryIdent = result["Mandatoryident"]; 
				
				for (var key in result) {
					if (key == formtoolConstants.DYNAMIC_MANDATORY_ELEMENTS) {
						var dynamicElements = result[key];					
						for (var element in dynamicElements) {
							var el = formtool.dynamicMandatories.getElement(dynamicElements[element]);
							var par = formtool.getParent(el, ".element");
							var label = $j(par).children(".label").children(".label");
							if(label && label.length > 0) {
								var text = $j(label).html().replace(mandatoryIdent, "")+mandatoryIdent;
								$j(label).html(text);
								$j(label).addClass(formtoolConstants.CSS_CLASS_LABEL_MANDATORY);
								$j(label).removeClass(formtoolConstants.CSS_CLASS_LABEL);		
							}							
						}
					}	
					if(key == formtoolConstants.OPTIONAL_ELEMENTS) {
						var optionalElements = result[key];
						for(var element in optionalElements) {
							var el = formtool.dynamicMandatories.getElement(optionalElements[element]);
							var par = formtool.getParent(el, ".element");
							var label = $j(par).children(".label").children("."+formtoolConstants.CSS_CLASS_LABEL_MANDATORY);
							if(label && label.length > 0) {
								var text = $j(label).html().replace(mandatoryIdent, "");
								$j(label).html(text);
								$j(label).removeClass(formtoolConstants.CSS_CLASS_LABEL_MANDATORY);
								$j(label).addClass(formtoolConstants.CSS_CLASS_LABEL);								
							}
						}
					}				
				}
			}
		},
		
		getElement: function(elementName) {
			if(elementName) {
				if($j(elementName).length > 0) {
					return $j(elementName)[0];
				}else {
					elementName = elementName.substring(1, elementName.length);
					if(document.getElementById(elementName) != undefined) {
						return document.getElementById(elementName);
					}else {
						elementName = elementName.substring(2, elementName.length);
						if(document.getElementsByName("data["+elementName+"]").length > 0) {
							return document.getElementsByName("data["+elementName+"]")[0];
						}
					}
				}				
			}
			return undefined;
		}
	
	},

/*** FormTool.paging **********************************************************/
/**
 * Behandelt die Paginierung des Formulartools
 */
	pageing: {
		errorPages: [],
		
		handle: function() {
			formtool.pageing.bindNaviEvents();
			formtool.pageing.getStartingPage();
		},
		
		/* Selektiert alle Buttons mit Klassennamen "navielement" und haengt ein 
		 * onClick-Event an zum Durschschalten der Seiten
	 	 */	
		bindNaviEvents: function() {
			var pages = $j("." + formtoolConstants.PAGE_SELECTOR);
			
			if (pages.length > 1) {
				$j.each(pages, function(i, page){
					var pageId = page.id.replace("tabCo-" + formToolId + "-", "");
					pageId = parseInt(pageId);
					
					$j("#" + page.id + " ." + formtoolConstants.NAVI_SELECTOR).each(function(l, button){
						if ($j(button).attr("className").indexOf(formtoolConstants.NAVI_BACK_SELECTOR) != -1) {
							if ((pageId) > 1) {
								$j(button).bind(formtoolConstants.EVENT_CLICK, function(){
									formtool.pageing.navigate(formToolId, pageId, false);
								});
								$j(button).removeClass("hiddenelement");
							}
						}
						if ($j(button).attr("className").indexOf(formtoolConstants.NAVI_NEXT_SELECTOR) != -1) {
							$j(button).bind(formtoolConstants.EVENT_CLICK, function(){
								formtool.pageing.navigate(formToolId, pageId, true);
							});
							$j(button).removeClass("hiddenelement");
						}
					});
				});
			}	
		},
		
		navigate: function(formToolId, pageId, forward) {
			var page = $j("#tabCo-"+formToolId+"-"+pageId)[0];
			var idx = $j.inArray(page, formtool.pageing.errorPages);
			var direction = forward ? 1 : -1;
			
			if (idx != -1) {		
				var nextIdx = idx+direction;
				if (nextIdx >= 0) {
					if (nextIdx < formtool.pageing.errorPages.length) {
						var nextErrorPage = formtool.pageing.errorPages[nextIdx];
						pageId = nextErrorPage.id.replace("tabCo-" + formToolId + "-", "");
						changeTab(formToolId, pageId);
						window.scrollTo(0, 100);
					}else {
						pageId += direction;
						changeTab(formToolId, pageId);
						window.scrollTo(0, 100);
					}
				}			
			}else {
				pageId += direction;
				changeTab(formToolId, pageId);
				window.scrollTo(0, 100);
			}			
		},
		
		/*
		 * ermittelt die Startseite der Formularseite. Ist abhaengig von enthaltenen
		 * Validierungs-Fehlermeldung
		 */
		getStartingPage: function() {
			var startingPageId = "1";
			var hasErrors = false;
			
			$j("." + formtoolConstants.PAGE_SELECTOR).each(function(i, page) {								
				var errors = $j("#" + page.id + " ." + formtoolConstants.ERROR_SELECTOR);
				if(errors != null && errors.length > 0) {
					if (!hasErrors) {
						startingPageId = page.id.replace("tabCo-" + formToolId + "-", "");
						hasErrors = true;
					}
					formtool.pageing.errorPages.push(page);
				}				
			});
			
			formtool.pageing.showTabs(startingPageId);
		},
		
		/*
		 * Baut die Tabbed-Navigation.
		 */
		showTabs: function(idx) {
			var pages = $j("." + formtoolConstants.PAGE_SELECTOR);
			if (pages.length > 1) {
				$j.each(pages, function(i, page){					
					var tabId = page.id.replace("tabCo", "tab");
					if ($j.inArray(page, formtool.pageing.errorPages) != -1) {						
						$j("#" + tabId + " a").addClass("errorMsg");
					}
				});
				changeTab(formToolId, idx);
			}
		}
		
	},
	
	additionalFields: {
		
		fields: [
					 		formtoolConstants.ELEMENT_TYPE_SELECT,
							formtoolConstants.ELEMENT_TYPE_RADIO,
							formtoolConstants.ELEMENT_TYPE_CHECKBOX,
							formtoolConstants.ELEMENT_INPUT
						],
		
		bindEvents: function() {
			$j("." + formtoolConstants.CSS_ADDITIONAL_FIELDS_SELECTOR).each(function (i, item) {
				if($j.inArray(item.tagName.toLowerCase(), formtool.additionalFields.fields) != -1) {
					if ($j.inArray(item.type.toLowerCase(), formtool.clickTypes) != -1) {
						$j(item).bind(formtoolConstants.EVENT_CLICK, function(){
							formtool.additionalFields.getFields();
						});
					}else {
						$j(item).bind(formtoolConstants.EVENT_CHANGE, function(){
							formtool.additionalFields.getFields();
						});
					}
					formtool.detectedElements.push(item);
				}
			});		
		},
		
		getFields: function() {
			if (formtool.checkForPreview()) {
				var timestamp = new Date();
				var parameters = [formtoolConstants.PARAMETER_TIME, timestamp.getTime(), formtoolConstants.PARAMETER_ACTION, "AdditionalFields"];
				
				if ($j("." + formtoolConstants.CSS_ADDITIONAL_FIELDS_SELECTOR).length > 0) {
					$j("." + formtoolConstants.CSS_ADDITIONAL_FIELDS_SELECTOR).each(function(i, item){
						if ($j.inArray(item.tagName.toLowerCase(), formtool.additionalFields.fields) != -1) {
							var setParameter = true;
							if (item.type && item.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_RADIO && !item.checked) {
								setParameter = false;
							}
							if (item.type && item.type.toLowerCase() == formtoolConstants.ELEMENT_TYPE_CHECKBOX && !item.checked) {
								setParameter = false;
							}
							
							if (setParameter) {
								var elementValue = formtool.getMultipleValue(item);
								parameters.push(item.name);
								parameters.push(elementValue);
							}
						}
					});
					
					var encodedURI = encodeURI($j.serializeObject(parameters));
					if (formtool.url == "") {
						formtool.setUrl();
					}
					if (formtool.url != "") {
						formtool.additionalFields._doXHR(formtool.url, encodedURI);
					}
				}
			}
		},
		
		_doXHR: function(url, parameters) {
			$j.getJSON (
				url, 
				parameters, 
				function(json, textStatus){
					formtool.additionalFields._handleResponse(json, parameters);
				}
			);
		},
		
		_handleResponse: function(result, parameters){
			if (parameters.indexOf("AdditionalFields") != -1) {
				for (var key in result) {
					var elems = [];
					if($j("#id" + key).length > 0) {
						elems.push($j("#id" + key)[0]);
					}else if(document.getElementsByName("data[" + key + "]").length > 0) {
						for(var i=0;i<document.getElementsByName("data[" + key + "]").length; i++) {
							elems.push(document.getElementsByName("data[" + key + "]")[i]);
						}
					}
					if(elems.length > 0) {
						for (var elem in elems) {
							if (result[key]) {
								formtool.showHiddenElement(elems[elem]);
							}
							else {
								formtool.hideDestElement(elems[elem]);
							}
						}
					}
				}
			}
		}
		
	}
};
/***********************************************************************/
