common = {
	FormInfo: new Object(),
	submitted: new Array(),
	
	submitOnce: function(obj,plsWait,ajax,beforeSubmit,afterSubmit) { 
		newSubm=document.createElement("input");
		newSubm.setAttribute('type','hidden');	
		if (obj.tagName.toLowerCase() == 'input' && obj.type.toLowerCase() == 'button') {
			newSubm.setAttribute('name',obj.getAttribute('name'));	
			newSubm.setAttribute('value',obj.value);
		} else {
			newSubm.setAttribute('name',obj.getAttribute('name'));	
			newSubm.setAttribute('value',obj.value);
		}
		if (plsWait) {
			if (typeof plsWait == 'string') {
				if (obj.tagName.toLowerCase() == 'button') {
					oldVal = obj.innerHTML;
					obj.innerHTML = plsWait;
				} else {
					oldVal = obj.value;
					obj.value = plsWait;
				}
			} else if (typeof plsWait == 'object') {
				plsWait();
			}
		}
		
		this.submitted = Array(obj, plsWait, oldVal, ajax, beforeSubmit, afterSubmit);
		obj.parentNode.appendChild(newSubm);	
		st = obj;
		for (;;) {
			st = st.parentNode;
			if (st.tagName.toLowerCase() == 'form') break;
		}
		submitNow = true;
		form = st.getAttribute('name');
		if ($(form+'_haserrors')) $(form+'_haserrors').style.display = 'none';

		if (beforeSubmit) {
			submitNow = beforeSubmit();
			// register the 'before check'
			common.FormInfo[form].__internal_beforechecked = true;
		}
			
		submitNow2 = this.processCheck(form);
		
		if (submitNow && submitNow2) {
			// no errors were found, now submit the form
			// according to it's method
			
			// hide all error messages 
			for (var field in common.FormInfo[form]) {
				//console.log('chk='+field);
				conds = common.FormInfo[form][field];
				for (i=0;i<conds.length;i++) {
					oName = 'errmsg:'+conds[i]['fieldid'];
					if ($(oName)) $(oName).style.display='none';
				}
			}
			func = '';
			// show 'please wait' message
			if (typeof show_please_wait != 'undefined') show_please_wait();
			if (ajax) {
				obj.disabled = true;
				//console.log('['+st.id+']');
				
				var url = root_url+ajax;
				var data = Form.serialize($(st.id));
				
				if (st.method == 'get') url+='?'+data;
				var myAjax = new Ajax.Request(
					url, {
						method: st.method,
						postBody: data,
						//onCreate: (func2 ? func2 : ajaxProcess(element)),
						onComplete: (func ? func : this.resetForSubmit(form))
					}
				); 		
			} else  {
				st.submit();
				obj.disabled = true;
			}
		} else {
			// erors were found during javaScript checks
			if ($(form+'_haserrors')) $(form+'_haserrors').style.display = '';
			obj.disabled = false;
			if (plsWait) {
				if (typeof plsWait == 'string') {
					if (obj.tagName.toLowerCase() == 'button') {
						obj.innerHTML = oldVal;
					} else {
						obj.value = oldVal;
					}
				} 
			}			
		}
	},	
	outputSizeOf: function(e) {
		
	},
	resetForSubmit: function(form) {
		o = this.submitted;
		obj = o[0]; plsWait = o[1];
		oldVal = o[2]; ajax = o[3]; 
		beforeSubmit = o[4]; afterSubmit = o[5]; 

		obj.disabled = false;
		if (plsWait) {
			if (typeof plsWait == 'string') {
				if (obj.tagName.toLowerCase() == 'button') {
					obj.innerHTML = oldVal
				} else {
					obj.value = oldVal
				}
			} else if (typeof plsWait == 'object') {
//				plsWait();
			}
		}
	},
	
	registerForm: function(form, field, condition) {
		common.FormInfo[form] = new Object();
		common.FormInfo[form].__internal_submitted = false;
		common.FormInfo[form].__internal_beforechecked = false;
		common.FormInfo[form].__internal_checked = false;
	},
	
	registerCheck: function(form, field, fieldId, condition) {
		if (typeof common.FormInfo[form][field] == 'undefined') {
			common.FormInfo[form][field] = new Array();
		}
		common.FormInfo[form][field].push(condition);
	},
	
	processCheck: function(form) {
		//return true; // remove 
		var errCnt = 0;
		for (var field in common.FormInfo[form]) {
			//console.log('chk='+field);
			conds = common.FormInfo[form][field];
			for (i=0;i<conds.length;i++) {
				if(this.processFieldCheck(form,field,conds[i])) {
					// returns True on errors
					errCnt+=1;
				}
			}
		}
		common.FormInfo[form].__internal_checked = true;
		return (errCnt == 0 ? true : false);
	},
	
	processFieldCheck: function(form,field,cond) {
		//console.log('form='+form+',field='+field+', fid='+cond);

		pars = cond['params']; 
		var setErr = false;
		
		// object holding the error message
		oName = 'errmsg:'+cond['fieldid'];
		if (pars['field']) oName = 'errmsg:'+pars['field']; 
		
		
		fieldObj = document.forms[form].elements[field];
		if (!fieldObj) fieldObj = $(field);
		
		if (!fieldObj) return false; 
		
		fieldValue = (fieldObj 
			? (fieldObj.value ? fieldObj.value  
				: (fieldObj.options 
					? fieldObj.options[fieldObj.selectedIndex].value 
					: '')
				)
			: null);
		if (typeof fieldValue == 'undefined') fieldValue = 0;
		
		
		// maximum length
		if (pars['max']) {
			if (fieldValue.length > pars['max']) setErr = true;
		}
		// maximum length
		if (pars['min'] || pars['must']) {
			if (pars['must']) pars['min'] = 1;
			if (fieldValue.length < pars['min']) setErr = true;
		}
		// true must
		if (pars['tmust']) {
			if (this.trim(fieldValue).length < 1) setErr = true;
		}
		
		// eq, geq, gt, leq, lt
		if (pars['eq'] && fieldValue != pars['eq']) setErr = true;
		if (pars['geq'] && fieldValue < pars['geq']) setErr = true;
		if (pars['gt'] && parseInt(fieldValue) <= parseInt(pars['gt'])) setErr = true;
		if (pars['leq'] && fieldValue > pars['leq']) setErr = true;
		if (pars['lt'] && fieldValue >= pars['lt']) setErr = true;


		//if (pars['gt']) console.log('scheisse');

		
		// specific value (out of an array of values)
		if (pars['value'] || pars['values']) {
			v = pars['value'] || pars['values'];
			var setErr = true;
			for (j=0,j2=v.length;j<j2;j++) {
				if (v[j] == fieldValue) {
					setErr = false;
					break;
				} 
			} 
		}
		// email address
		if (pars['email'] || pars['mail']) {
			pattern = /^[a-zA-Z0-9._\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,4}$/;
			setErr = (pattern.test(fieldValue) ? false : true);
		}
		// correspond/equality test (checks if form value equals to another)
		// very good for confirmation (e.g. confirm email) test
		if (pars['correspond'] || pars['eq']) {
			field2 = pars['correspond'] || pars['eq'];
		
			fieldObj2 = document.forms[form].elements[field2];
			if (!fieldObj2) fieldObj2 = $(field2);
			
			fieldValue2 = (fieldObj2 
				? (fieldObj2.value ? fieldObj2.value  
					: (fieldObj2.options 
						? fieldObj2.options[fieldObj2.selectedIndex].value 
						: '')
					)
				: null);

			if (typeof fieldValue == 'undefined') fieldValue = 0;						
			setErr = (fieldValue != fieldValue2); 
		}
		// see if checkbox is marked
		if (pars['mustcheck']) {
			//console.log('mustBeChecked('+fieldValue+')');
			if (!fieldObj.checked) setErr = true;
		}
		
		
		
		//console.log('seting err'+setErr);
		if (setErr) {
			if ($(oName)) $(oName).style.display = '';
			//else console.log('missing field "'+'errmsg:'+cond['fieldid']+'"');
		} else  {
			if ($(oName) && cond['status'] != 1) {
				$(oName).style.display = 'none';
			}
			//else console.log('missing field "'+'errmsg:'+cond['fieldid']+'"');
		}
		return setErr;
	},
	
	
	submitAjaxForm: function(form, method, url) {
		var url = root_url+url;
		var myAjax = new Ajax.Request(
			url, {
				method: 'post',
				postBody: (document.forms[element+'_form'] ? Form.serialize(document.forms[element+'_form']) : par),
				onCreate: (func2 ? func2 : ajaxProcess(element)),
				onComplete: (func ? func : ajaxFinished(element))
			}
		); 
	},
	
	renewCaptcha: function(field) {
		if (show_please_wait) show_please_wait();
		var url = root_url+'community/ajax/captcha.php';
		var myAjax = new Ajax.Request(
			url, {
				method: 'get',
				onComplete: function(a) {
					 $(field).innerHTML = a.responseText;
					 if (hide_please_wait) hide_please_wait();
					}
			}
		); 		
	},
	
	
	updateToken: function(form, token) {
		upd = 0;
		if ($(form+'_form_token')) { $(form+'_form_token').value = token; upd = 1; } 
		if ($(form+'_action_token')) { $(form+'_action_token').value = token; upd = 2; }
		//alert(upd);
	},
	
	trim: function(s) {
		while (s.substring(0,1) == ' ') {
			s = s.substring(1,s.length);
		}
		while (s.substring(s.length-1,s.length) == ' ') {
			s = s.substring(0,s.length-1);
		}
		return s;
	},

	last:0
};


