// FISFormValidator Version 0.84
// FISolution 
// 3. Januar 2009 14:02:48
// Uses mootools-beta-1.2b1-compatible.js
 

var setUploadDone = function(upload_id, func) {
	$$('form').each(function(form) {
		if(form.uploadId && form.uploadId == upload_id) {
			form.upload_done();
			if(func) func();
			closeCenterBox();
			return;
		}
	});
}
var setValidationError = function(upload_id, valid_id) {
	$$('form').each(function(form) {
		if(form.uploadId && form.uploadId == upload_id) {
			for(var h = 0; h < form.FISFV.fields.length; h++) {
				var field = form.FISFV.fields[h];
				for(var i = 0; i < field.validations.length; i++) {
					for(var j = 0; j < field.validations[i].length; j++) {
						if(field.validations[i][j].id == valid_id) {
							field.validations[i][j].showError(false);
							return;
						}
					}
				}
			}
			return;
		}
	});
}
var resetErrorMessages = function(upload_id) {
	$$('form').each(function(form) {
		if(form.uploadId && form.uploadId == upload_id) {
			var errorField = $(form.id + '_errorfield');
			if(!errorField) return;
			var ul = errorField.getChildren('ul')[0];
			ul.getChildren().each(function(c) { c.remove(); });
			errorField.setStyle('display', 'none');			
		}
	});
}

var setErrorMessage = function(upload_id, message) {
	$$('form').each(function(form) {
		if(form.uploadId && form.uploadId == upload_id) {
			var errorField = $(form.id + '_errorfield');
			if(!errorField) alert(message);
			errorField.setStyle('display', 'block');
			var ul = errorField.getChildren('ul')[0];
			new Element('li').setHTML(message).inject(ul);
		}
		return;
	});
}


var setSuccessfulUpload = function(upload_id, form_name, html) {
	$$('form').each(function(form) {
		if(form.uploadId && form.uploadId == upload_id) {
			for(var h = 0; h < form.FISFV.fields.length; h++) {
				var field = form.FISFV.fields[h];
				if(field.name == form_name) { 
					for(var i = 0; i < field.validations.length; i++) {
						for(var j = 0; j < field.validations[i].length; j++) {
							field.validations[i][j].showError(true);
						}
					}
					var div = new Element('div').setHTML(html).injectAfter(field);
					if(!field.removed) field.remove();
					field.removed = true;
					break;
				}
			}
		}
	});
}


		
var FISFViframecounter = 0;
var FISFV = new Class({
	// Optionen Implementieren
	Implements : [Options],
	
	// Default Optionen setzen
	options : {
		
	},
	form: null,
	fields: null,
	validations: null,
	
	// init
	initialize: function(formId, options) {
		// optionen übernehmen
		this.setOptions(options);
		
		this.fields = new Array();
		this.validations = new Array();
		
		this.form = $(formId);
		this.form.FISFV = this;
		this.form.addEvent('submit', function(e) {
			var status = true;
			for(var i = 0; i < this.fields.length; i++) {
				status = this.fields[i].validate() && status;
			}
			if(status) { 
				var use_controlled = false;
				for(var i = 0; i < this.fields.length; i++) {
					if(this.fields[i].type && this.fields[i].type == 'file' && this.fields[i].value.trim() != '') {
						use_controlled = true;
						break;
					}	
				}
				if(false) {
					new Event(e).stop();
					this.form.sendControlled();
				}
				return true;
			}
			new Event(e).stop();
		}.bind(this));
		
		FISFViframecounter++;
		this.form.sendControlled = function() {
			var debug = false;
			
			var iframecounter = 0;
			var status = new Element('div', {id: 'progressbar'});
			var progressUrl = '/ajax/uploadprogress.php';
				
			this.form.setAttribute('action', '/upload_receaver.php?anticache=' + Math.round(Math.random() * 10000000)); 
			
			var div = new Element('div');
			var span = new Element('div', {'class': "uploadprogress_caption"}).setHTML('Uploadvorgang wird durchgeführt');
			span.inject(div);
			status.inject(div);
			if(!debug) showCenterBox(div, 500, 60, true);
				
			var started = 0;
			var start = new Date().getTime() / 1000;
			var waitUntil = -1;
			var upload_speed = 0;
			
			this.form.uploadId = Math.round(Math.random() * 10000000);
			this.form.percent = 0;
			
			if(!status.sd) {
				status.sd = new Element('div', {
					'class': 'progressbar_percent',
					'styles': {
						position: 'absolute',
						left: 0,
						top: 0
					}
				});
				status.sd.inject(status);
			}
			status.sd.setStyle('color', 'green');
			status.sd.setHTML('...initialisiere Upload...');
			
			if(!status.si) {
				status.si = new Element('div', {
					'class': 'progressbar_bar',
					'styles': {
						width: 0
					}
				});
				status.si.inject(status);
			}
			status.si.setStyle('width', "0%");
			status.setStyle('display', 'block');
			
			if(!this.form.uploadIframe) {
				this.form.uploadIframe = new Element('iframe', {
					'name': "upload_iframe_" + FISFViframecounter,
					'styles': {
						'width': 300,
						'height': 200,
						'display': (!debug ? 'none' : '')
					},
					'src': ''
				});
				this.form.uploadIframe.injectBefore(this.form);
				this.form.target = this.form.uploadIframe.name;
			}
			
			if(!this.form.uploadField) {
				this.form.uploadField = new Element('input', {
					'name': 'UPLOAD_IDENTIFIER',
					'type': 'hidden'
				});
				this.form.uploadField.injectBefore(this.form.getChildren()[0]);
			}
			this.form.uploadField.value = this.form.uploadId;
			
			this.form.upload_done = function() {
				status.si.setTo(100);
				status.setStyle('display', 'none');
			}
			var ajaxCounter = 0; 
			var last_percent = 0;
			status.si.setTo = function(percent, init) {
				var now = new Date().getTime() / 1000;
				upload_speed = (percent - last_percent) / (now - start);
				start = now;
				last_percent = percent;
					
				if(percent < this.form.percent && !init) {
					if(upload_speed != 0) waitUntil = now + ((this.form.percent - percent) / upload_speed); 
				}
				else if(init) {
					$('status').setStyle('display', 'block');
				}
				else {
					waitUntil = -1;
					this.form.percent = percent;
				}						
			}.bind(this)
			
			this.form.readAjaxStatus = function() {
				
				if(this.form.percent == 100) return;
				new Ajax(progressUrl + '?id=' + this.form.uploadId + '&started=' + started + '&anticache=' + ajaxCounter, {
					method: 'get', 
					evalScripts: false, 
					onSuccess: function(response) {
						var now = new Date();
						if(response == 'DONE') {
							status.sd.setHTML('... Verarbeitung, bitte warten ...');
							status.sd.setStyle('text-decoration', 'blink');
							return;
						}
						else if(response == 'FNE') {
							status.sd.setHTML('... bitte warten ...');
							status.sd.setStyle('text-decoration', 'blink');
						}
						else {
							started = 1;
							var f = parseFloat(response);
							status.si.setTo(f);
						}
						var timeout = (ajaxCounter++) / 10 * 1000 + 1000;
						window.setTimeout(this.form.readAjaxStatus, timeout);
					}.bind(this)
				}).request();
			}.bind(this);
			
			status.si.interval = window.setInterval(function() {
				var now = new Date().getTime() / 1000;
				if(upload_speed > 0 && now >= waitUntil) {
					var speed = upload_speed;
					this.form.percent = this.form.percent + speed / 10;
					if(this.form.percent >= 100) {
						status.sd.setHTML('... Verarbeitung, bitte warten ...');
						status.sd.setStyle('text-decoration', 'blink');
						window.clearInterval(status.si.interval);
					}
					status.si.setStyle('width', this.form.percent + "%");
					status.sd.setStyle('color', this.form.percent < 50 ? 'green' : 'white');
					status.sd.setHTML(Math.round(this.form.percent) + " %");
				}									
			}.bind(this), 100);
			
			window.setTimeout(function() { this.form.submit() }.bind(this), 100);
			window.setTimeout(this.form.readAjaxStatus, 300);
			//this.form.statusIframe.src = '/ajax/uploadprogress.php?id=' + this.form.uploadId;					
		}.bind(this);
		
	},
	registerField: function(id) {
		var field = $(id);
		field.validations = new Array();
		field.addValidations = function(validationsArray) {
			field.validations[field.validations.length] = validationsArray;
		}
		field.validate = function() {
			if(!field.setEvents) {
				var tag = field.tagName.toString().toLowerCase().trim();
				if(tag == 'input' && (field.type == 'radio' || field.type == 'checkbox')) {
					field.addEvent('click', function() { field.validate(); });
					field.addEvent('change', function() { field.validate(); });		
				}
				else {
					field.addEvent('keyup', function() { field.validate(); });
					field.addEvent('change', function() { field.validate(); });	
				}
				field.setEvents = true;
			}
			var err_i = -1;
			var err_j = -1;
			for(var i = 0; i < field.validations.length; i++) {
				// DIESE HIER ALLE "UND"-VERKNÜPFT
				var or_res = (field.validations[i].length == 0);
				var tmp_err_j = -1;
				for(var j = 0; j < field.validations[i].length; j++) {
					// DIE HIER ALLE "ODER"-VERKNÜPFT
					var tmp_res = field.validations[i][j].validate(field);
					if(!tmp_res && tmp_err_j == -1) tmp_err_j = j;
					or_res = or_res || tmp_res;
				}
				if(err_i == -1 && !or_res && tmp_err_j != -1) {
					err_i = i;
					err_j = tmp_err_j;
				}
			}
			for(var i = 0; i < field.validations.length; i++) {
				for(var j = 0; j < field.validations[i].length; j++) {
					field.validations[i][j].showError(true);
				}
			}
			if(err_i > -1) {
				field.validations[err_i][err_j].showError(false);
			}
			return err_i == -1;
			
		}.bind(this);
		field.errorDiv = false;
		field.pendingErrors = new Array();
		field.setMessage = function(validation, valid) {
			if(valid) {
				if(this.errorDiv && this.errorDiv.validatorId == validation.id) {
					this.errorDiv.remove();
					this.errorDiv = false;
					
					if(this.pendingErrors.length > 0) {
						var tmp = this.pendingErrors;
						var err = this.pendingErrors[0];
						this.pendingErrors = new Array();
						for(var i = 1; i < tmp.length; i++) {
							this.pendingErrors[i - 1] = tmp[i];
						}
						this.setMessage(err, false);
					}
				}
				return;
			}
			if(!this.errorDiv) {
				var behind = field;
				var tag = field.tagName.toString().toLowerCase().trim();
				if(tag == 'input' && (field.type == 'checkbox' || field.type == 'radio')) {
					$$('label').each(function(label) {
						if(label.getAttribute('for') == field.id) {
							behind = label;
						}
					});
				}
				var pos = behind.getPosition();
				this.errorDiv = new Element('div', {
					'class': 'FV_error_display_top',
					'styles': {
						position: 'absolute',
						left: pos.x + behind.offsetWidth + 5,
						top: pos.y
					}
				});
				this.errorDiv.validatorId = validation.id;
				var inner = new Element('div' , {
					'class': 'FV_error_display',
					'styles': {
						overflow: 'hidden'
					}
				});
				inner.setHTML(validation.errorMsg).inject(this.errorDiv);
				this.errorDiv.injectAfter(behind);
				return;
			}
			else if(this.errorDiv.validatorId != validation.id) {
				for(var i = 0; i < this.pendingErrors.length; i++) {
					if(this.pendingErrors[i] == validation) {
						return;
					}
				}
				this.pendingErrors[this.pendingErrors.length] = validation;			
			}
			
		}
		this.fields[this.fields.length] = field;
	},
	addValidation: function(id, validationArray) {
		var field = $(id);
		field.addValidations(validationArray);
	}
});

var FISFValidation = new Class({
	id: 0,
	errorMsg: null, 
	expects: null,
	option: null,
	displayAt: null,
	field: null,
	initialize: function(id, field_id, expects, option, errorMsg, displayAt) {
		this.field = $(field_id);
		this.id = id;
		this.expects = expects;
		this.option = option;
		this.errorMsg = errorMsg;
		if(this.errorMsg.trim() == '') this.errorMsg = 'expects ' + expects
		this.displayAt = displayAt;
		
		if(expects == 'zip') {
			if($(option)) {
				var setZipLength = function() {
					var state = $(option).getValue();
					var maxLength = 5;
					if(false) maxLength = 5;
					else if(state == "A") maxLength = 4;
					else if(state == "B") maxLength = 4;
					else if(state == "CH") maxLength = 4;
					else if(state == "CZ") maxLength = 5;
					else if(state == "D") maxLength = 5;
					else if(state == "DK") maxLength = 4;
					else if(state == "F") maxLength = 5;
					else if(state == "I") maxLength = 5;
					else if(state == "GB") maxLength = 8;
					else if(state == "L") maxLength = 4;
					else if(state == "NL") maxLength = 7;
					else if(state == "PL") maxLength = 6;
					else if(state == "SK") maxLength = 5;
					this.field.maxLength = maxLength;
					this.field.value = this.field.value.substr(0, maxLength);					
				}.bind(this);
				$(option).addEvent('change', function() {
					setZipLength();
				});
				setZipLength();
			}
			else {
				this.field.maxLength = 5;
			}
		}
		
	},
	showError: function(valid) {
		var obj = this.displayAt ? this.displayAt : this.field;
		obj.setMessage(this, valid);
	},
	validate: function() {
		var field = this.field;
		var tag = field.tagName.toString().toLowerCase().trim();
		var value = field.getValue().toString().trim();
		if(tag == 'input' && field.type == 'file') {
			value = field.value.trim();
		}
		if(tag == 'input' && field.type == 'checkbox') {
			if(this.expects != 'checked') {
				return false;	
			}
			else {
				return field.checked;
			}
		}
		else if(tag == 'input' && field.type == 'radio') {
			value = field.value.trim();
			if(this.expects == 'value' && value == this.option) {
				return field.checked;
			}
			else {
				return false;
			}		
		}
		
		
		switch(this.expects) {
			case 'url':
				return value.test(/^((https?|ftp):\/\/|www\.)[a-z0-9_\.-]+\.[a-z]{2,4}/i);
			case 'email':
				return value.test(/^.+@.+\.[a-z]{2,6}$/i);
			
			case 'integer':
				return value.test(/^\d+$/);
			case 'float':
				return value.test(/^(-?)\d+((\.|,)\d+)?$/);
			
			case 'notnull':
				return value.test(/./);
			case 'null':
				return value.test(/^$/);
			
			case 'preg':
				return value.test(this.option);
			
			case 'zip':
				var state = $(this.option);
				if(state) state = state.getValue();
				
				if(!state || state == 'D' || state == 'CZ' || state == 'F' || state == 'SK' || state == 'I') {
					return value.test(/^\d{5}$/);
				}
				else if(state == 'A' || state == 'B' || state == 'CH' || state == 'DK' || state == 'L') {
					return value.test(/^\d{4}$/);
				}
				else if(state == 'PL') {
					return value.test(/^\d{2}\-\d{3}$/);
				}
				else if(state == 'NL') {
					return value.test(/^\d{4} [A-Z]{2}$/g);
				}
				else if(state == 'GB') {
					return value.test(/^[A-Z](\d|\d{2}|\d[A-Z]|[A-Z]\d{1,2}|[A-Z]\d[A-Z]) \d[A-Z]{2}$/g);
				}
				else {
					return true;
				}
				
			case 'same':
				var other = $(this.option);
				if(!other) return true;
				if(other.validate && !other.validate()) return true;
				var otherValue = other.getValue().toString().trim();
				return (value == otherValue);
			
			case 'greater':
				if(!value.test(/^(-?)\d+(\.\d+)?$/)) return false;
				return (parseFloat(value) > this.option);
			case 'greater_equal':
				if(!value.test(/^(-?)\d+(\.\d+)?$/)) return false;
				return (parseFloat(value) >= this.option);
			case 'smaller':
				if(!value.test(/^(-?)\d+(\.\d+)?$/)) return false;
				return (parseFloat(value) < this.option);
			case 'smaller_equal':
				if(!value.test(/^(-?)\d+(\.\d+)?$/)) return false;
				return (parseFloat(value) < this.option);
			case 'minlength':
				return (value.length >= this.option);
			case 'maxlength':
				return (value.length <= this.option);
			case 'value':
				return (value == this.option);
			
			case 'file':
				return value.test(/./);
			case 'image':
				return value.test(/\.(jpe?g|png|gif)$/i);
			case 'mp3':
				return value.test(/\.(mp3)$/i);
			case 'pdf':
				return value.test(/\.(pdf)$/i);
			case 'filesizemax':
				return true;
				
			case 'germandate':
				var s = value.split(/\./);
				if(s.length != 3) return false;
				var d = s[0];
				var m = s[1];
				var y = s[2];
				if(!d.test(/^\d+$/)) return false;
				if(!m.test(/^\d+$/)) return false;
				if(!y.test(/^\d+$/)) return false;
				d = d * 1;
				m = m * 1;
				y = y * 1;
				if(y < 100 && y > 70) {
					y = y + 1900;
				}
				if(y < 100) {
					y = y + 2000;
				}
				if(y < 1000) return false;
				var date = new Date();
				date.setDate(d);
				date.setMonth(m-1);
				date.setDate(d);
				date.setFullYear(y);
				var d2 = parseInt(date.getDate());
				var m2 = parseInt(date.getMonth()) + 1;
				var y2 = parseInt(date.getYear());
				if(y2 < 200) y2 += 1900;
				return (d2 == d && m2 == m && y2 == y);
				
			case 'function': 
				if(this.option) {
					return this.option(value, this);	
				}
				alert("FNF");
				return false;
		}
		return false;
	}
});
