function MGForm (formID) {
	this.erreport = {
		errtype: "alert",
		errmsg: "Some errors occured:\n"
	};
	
	this.labelsearch = "0";
	
	// Get the form if formID is set then use the form id if not get the first form
	this.theform = (formID) ? document.getElementById(formID) : document.forms[0];
	
	// Set instance property formelem to elements of the form
	this.formelem = this.theform.elements;
}


MGForm.prototype.validate = function (validObj) {
	// Create errors array
	var errors = new Array();
	
	if(validObj instanceof Array) {
		for(var j = 0; reqArr = validObj[j]; j++) {
			if(!this.validateField(this.formelem[reqArr])) {
				errors.push({
					name: reqArr,
					id: this.formelem[reqArr].id,
					error: reqArr+" is not set."
				});
			}
		}
	} else if (validObj instanceof Object) {
		
		for(var reqProp in validObj.required) {
			if(!this.validateField(this.formelem[reqProp], validObj.required[reqProp]) && validObj.error[reqProp]) {
				errors.push({
					name: reqProp,
					id: this.formelem[reqProp].id,
					error: validObj.error[reqProp]
				});
			}
		}
	}
	
	if(errors.length > 0) {
		this.reportError(errors);
		
		return false;
	} else {
		return true;
	}
}


MGForm.prototype.reportError = function (errArr) {
	var errstart, errend, errmsg = this.erreport.errmsg;
	
	switch(this.erreport.errtype) {
		case "alert":
			errstart = "- ";
			errend = "\n";
		break;
	}
	
	for(var i = 0; i < errArr.length; i++) {
		errmsg+= errstart + errArr[i].error + errend;
	}
	
	alert(errmsg);
}


MGForm.prototype.validateField = function (fieldObj, fieldType) {
	// If fieldType is not set work out type
	if(!fieldType) { 
		switch (fieldObj.type) {
			case "text":
				fieldType = "str";
			break;
			case "select-one":
				fieldType = "select";
			break;
			case "checkbox":
				fieldType = "checkbox";
			break;
			// Radio buttons type is undefined
			default:
				fieldType = "radio";
			break;
		}
	}
	
	
	// Str validation
	if(fieldType.indexOf("str") != -1) {
		if(fieldObj.value) {
			return true;
		}
		
		return false;
	}
	
	// Integer validation
	if(fieldType.indexOf("int") != -1) {
		if(range = fieldType.split(":")[1]) {
			if(fieldObj.value > parseInt(range.split("-")[0]) && fieldObj.value < parseInt(range.split("-")[1])) {
				return true;
			} else {
				return false;
			}
		} else {
			return !isNaN(parseInt(fieldObj.value));
		}
	}
	
	// Decimal validation
	if(fieldType.indexOf("dec") != -1) {
		if(places = fieldType.split(":")[1]) {
			var pattern = new RegExp("[0-9]{"+places.split(".")[0]+"}\.[0-9]{"+places.split(".")[1]+"}");
		} else {
			var pattern = new RegExp("[0-9]\.[0-9]");
		}
		
		return pattern.test(fieldObj.value);
	}
	
	// Email validation
	if(fieldType.indexOf("email") != -1) {
		var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;;
			
		return pattern.test(fieldObj.value);
	}
	
	// Radio validation
	if(fieldType.indexOf("radio") != -1) {
		var checkedvalue, posvalues;
			
		for(var i = 0; i < fieldObj.length; i++) {
			if(fieldObj[i].checked)
				checkedvalue = fieldObj[i].value;
		}
		
		if(checkedvalue) {
			if(posvalues = fieldType.split(":")[1]) {
				posvalues = posvalues.split(",");
				
				for(var i = 0; i < posvalues.length; i++) {
					if(posvalues[i] == checkedvalue)
						return checkedvalue;
						
					return false;
				}
			}
			
			return checkedvalue;
		}
		
		return false;
	}
	
	// Select validation
	if(fieldType.indexOf("select") != -1) {
		/*var posvalues;

		if(posvalues = fieldType.split(":")[1]) {
			posvalues = posvalues.split(",");
			for(var i = 0; i < posvalues.length; i++) {
				if(fieldObj.value == posvalues[i])*/
					return fieldObj.value;
		/*	}		
		}
		
		return false;*/
	}
	
	// Checkbox validation
	if(fieldType.indexOf("checkbox") != -1) {
		if(fieldObj.checked) {
			return true;
		}
		
		return false;
	}
}