/* Validator Class Constructor */
function Validator(formName, formFields, vtype){
	/* Regular Expression Formats */
	
	this.RegFormats = $H({
		"alpha"   : /^[a-zA-Z\.\-]*$/,
		"alphanum": /^\w+$/,
		"unsigned": /^\d+$/,
		"integer" : /^[\+\-]?\d*$/,
		"real"    : /^[\+\-]?\d*\.?\d*$/,
		//"email"   : /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/,
		"email"   : /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/,
		"phone"   : /^[\d\.\s\-]+$/,
		"base-url": /^(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|tv|us|ca|uk|gen.tr|web.tr|com.tr|org.tr|gov.tr|edu.tr)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$/
	});
	///^([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/
	/* Error Messages */
	this.ErrorMessages = $H({
		"alpha"   : "Sadece alfa karakterleri kullanabilirsiniz!",
		"alphanum": "Sadece rakam ve harf kullanabilirsiniz!",
		"unsigned": "Sadece pozitif numerik değerler kullanabilirsiniz!",
		"integer" : "Sadece tamsayı değerler kullanabilirsiniz!",
		"real"    : "Sadece reel sayı değerler kullanabilirsiniz!",
		"email"   : "Girmiş olduğunuz  değer geçerli değildir!",
		"phone"   : "Girmiş olduğunuz değer geçerli değildir!",
		"required_select" : "En az birini seçmelisiniz!",
		"required_check" : "Bu seçeneği boş bırakmayınız",
		"required_fill" : "Bu alanı boş bırakmayınız!",
		"base-url": "Lütfen geçerli bir adres giriniz!"
	});
	
	this.Error = new Hash();
	this.FormName = formName;
	this.ExaminedFields = formFields;
	this.DisplayElement = null;
	if(vtype == null) vtype = "animate";
	this.DefaultErrorType = vtype;
	
	if(this.DefaultErrorType != "alert"){
		_root = this;
		var init_func = function(){
			_root.ExaminedFields.each(function(pair){
				var field = document.forms[_root.FormName][pair.key] || $(pair.key);
				if(!field) alert("Field not found. (" +pair.key+ ")");
				if(field.type == "file"){
					field.onblur = function(){
						_root.Run(_root.DefaultErrorType, pair.key);
					}
				}
				
				if(field.type == "checkbox" || field.type == "file"){
					field.onchange = function(){
						_root.Run(_root.DefaultErrorType, pair.key);
					}
				}else if(field != "[object NodeList]"){
					field.onblur = function(){
						_root.Run(_root.DefaultErrorType, pair.key);
						
					}
				}
			});
			
			document.forms[_root.FormName].onreset = function(){
				_root.Error = new Hash();
				_root.ExaminedFields.each(function(pair){
					if($("ErrorMsg_" + pair.key)) $("ErrorMsg_" + pair.key).remove();
				});
				if($(_root.DisplayElement)) $(_root.DisplayElement).innerHTML = "";
			}
		}
		if (window.addEventListener){
			window.addEventListener('onload', init_func, false); 
		} else if (window.attachEvent){
			window.attachEvent('onload', init_func);
		}
	}
}

Validator.prototype.ExamineFCK = function(fieldName, attributes){
	var required = (attributes.get("r")) ? attributes.get("r") : false;
	var fck_obj = FCKeditorAPI.GetInstance(fieldName);
	fck_val = fck_obj.GetXHTML(true);
	/* CONTROL IF REQUIRED */
	if(required == true && fck_val == ""){
		this.Error.set(fieldName, this.ErrorMessages.get("required_fill"));
		return;
	}
	
	return;
}

/* FORM ERROR REPORTS */
Validator.prototype.ExamineElement = function(fieldName, attributes){
	if(attributes.get("fck")) return this.ExamineFCK(fieldName, attributes);
	var frm = document.forms[this.FormName];
	var field = (!frm[fieldName]) ? $(fieldName) : frm[fieldName];
	var value = field.value;
	
	var required = (attributes.get("r")) ? attributes.get("r") : false;
	var format = (attributes.get("f")) ? attributes.get("f") : null;
	var minChars = (attributes.get("mn")) ? attributes.get("mn") : null;
	var maxChars = (attributes.get("mx")) ? attributes.get("mx") : null;
	var matchField = (attributes.get("mf")) ? attributes.get("mf") : null;
	var label = (attributes.get("l")) ? attributes.get("l") : fieldName;
	this.ExaminedFields.get(fieldName).l = label;
	
	
	/* WHETHER THE FIELD IS A CHECKBOX OR RADIO */
	if((field == "[object NodeList]" && field.length != undefined && !field.options) && required == true){
		for(i=0; i<field.length; i++){
			if(field[i].checked == true){
				var broken = true;
				break;
			}
		}
		if(!broken){
			this.Error.set(fieldName, label + ": " + this.ErrorMessages.get("required_check"));
			return;
		}
	}
	
	if(field.type == "checkbox"){
		if(required == true && field.checked == false){
			this.Error.set(fieldName, label + ": " + this.ErrorMessages.get("required_check"));
			return;
		}
	}
	
	/* CONTROL IF REQUIRED */
	if(required == true && value == ""){
		this.Error.set(fieldName, this.ErrorMessages.get("required_fill"));
		return;
	}
	/* FORMAT CONTROL */
	if(format != null){
		if(value != "" && !this.RegFormats.get(format).test(value)){
			this.Error.set(fieldName, this.ErrorMessages.get(format));
			return;
		}
	}
	/* MINIMIM CHARACTER NUMBER CONTROL */
	if(minChars != null){
		if(!isNaN(value) && (format == "integer" || format == "unsigned")){
			if(value < maxChars)
				this.Error.set(fieldName,"Girmiş olduğunuz değer en az " + minChars + " olmalıdır!");
		}else{
			if(value != "" && value.length < minChars)
				this.Error.set(fieldName,"Girmiş olduğunuz değer minimum " + minChars + " karakter olmalıdır!");
		}
		return;

	}
	/* MAXIMUM CHARACTER NUMBER CONTROL */
	if(maxChars != null){
		if(!isNaN(value) && (format == "integer" || format == "unsigned"))
			if(value > maxChars)
				this.Error.set(fieldName, "Girmiş olduğunuz değer en fazla " + maxChars + " olabilir!");
		else
			if(value != "" && value.length > maxChars)
				this.Error.set(fieldName, "Girmiş olduğunuz değer maksimum " + maxChars + " karakter olabilir!");
		return;
		
	}
	/* FIELD MATCH CONTROL */
	if(matchField != null){
		var matchValue = $F(frm[matchField]);
		if(value != matchValue){
			this.Error.set(fieldName, "Girmiş olduğunuz değer " + matchField + " alanıyla uyuşmuyor!");
			return;
		}
	}
}

/* DISPLAY ERRORS */
Validator.prototype.Run = function(type, field){
	var _root = this;
	var frm = document.forms[this.FormName];
	
	if(field == null){
		this.ExaminedFields.each(function(pair){
			_root.ExamineElement(pair.key, pair.value);
		});
	}else{
		this.ExamineElement(field, this.ExaminedFields.get(field));
	}
	
	type = (type == null) ? "alert" : type;
	var errorContent = "";
	
	switch(type){
		case "alert":
			if(this.Error.values().length > 0){
				this.Error.each(function(pair){
					var subject = _root.ExaminedFields.get(pair.key).l + ": ";
					if(pair.value.indexOf(subject) != -1) val = pair.value.replace(subject, "");
					else val = pair.value;
					errorContent += subject + val + "\n";
				});
				alert(errorContent);
				this.Error = new Hash( {} );
				return false;
			}
		break;
		
		case "own":
		
			if(field == null){
				this.ExaminedFields.each(function(pair){
					if($("ErrorMsg_" + pair.key)) $("ErrorMsg_" + pair.key).remove();
				});
			}else{
				if($("ErrorMsg_" + field)) $("ErrorMsg_" + field).remove();
			}
			var x = 0;
			if(this.Error.values().length > 0){
				this.Error.each(function(pair){
					x++;
					var parentElement = $(pair.key).up();
					if(x == 1){
						oo = $(pair.key).cumulativeOffset();
						so = $(pair.key).cumulativeScrollOffset();
						if(so[1] > oo[1]){
							$(pair.key).up().scrollTo();	
						}
					}
					var contentDiv = document.createElement("div");
					Element.extend(contentDiv);
					contentDiv.id = "ErrorMsg_" + pair.key;
					contentDiv.addClassName("ErrorMsg");
					contentDiv.style.width = "350px";
					contentDiv.innerHTML = pair.value;
					parentElement.appendChild(contentDiv);
					
					_root.Error.unset(pair.key);
				});
				this.Error = new Hash( {} );
				return false;
			}
		break;
		
		case "animate":
			var errorFields = [];
			var status = true;
			var x = 0;
			if(this.Error.values().length > 0){
				this.Error.each(function(pair){
					errorFields.push(pair.key);
					x++;
					if($("ErrorMsg_" + pair.key)) {
						_root.Error.unset(pair.key);
						$("ErrorMsg_" + pair.key).innerHTML = pair.value;
						return;
					}
					var parentElement = $(pair.key).up();
					if(x == 1){
						oo = $(pair.key).cumulativeOffset();
						so = $(pair.key).cumulativeScrollOffset();
						if(so[1] > oo[1]){
							$(pair.key).up().scrollTo();	
						}
					}
					var contentDiv = document.createElement("div");
					Element.extend(contentDiv);
					contentDiv.id = "ErrorMsg_" + pair.key;
					contentDiv.addClassName("ErrorMsg");
					contentDiv.style.width = "250px";
					contentDiv.innerHTML = pair.value;
					contentDiv.hide();
					parentElement.appendChild(contentDiv);
					Effect.Appear(contentDiv,{duration:0.7});
					
					_root.Error.unset(pair.key);
				});
				
				this.Error = new Hash();
				status = false;
			}
			
			if(field == null){
				this.ExaminedFields.each(function(pair){
					if(errorFields.indexOf(pair.key) == -1 && $("ErrorMsg_" + pair.key) != undefined){
						var field = pair.key;
						Effect.Fade($("ErrorMsg_" + pair.key),{duration:0.7});
					}
				});
			}else{
				if(errorFields.indexOf(field) == -1 && $("ErrorMsg_" + field))
						Effect.Fade($("ErrorMsg_" + field),{duration:0.7,afterFinish:function(){$("ErrorMsg_" + field).remove()}});
			}
			return status;
		break;		
		
		default:
			if(this.Error.values().length > 0){
				this.Error.each(function(pair){
					errorContent += _root.ExaminedFields.get(pair.key).l + " : " +  pair.value + "<br>";
				});
				var errorElement = $(type);
				errorElement.innerHTML = errorContent;
				_root.DisplayElement = errorElement;
				this.Error = new Hash();
				return false;
			}
		break;
	}
	
	return true;
}
