/*Example: 
FormValid.init({
	formId: 'FormFormularObsah', // id formulare
	prvkyId:'.prvekFormulare', // obal prvku pro zobrazeni chyby
	textChyby: { 
		required: 'Tato položka je povinná.', 
		email: 'Byl špatně zadán email.', 
		url: 'Byla špatně zadána adresa.', 
		number: 'Bylo špatně zadáno číslo.', 
		date: 'Bylo špatně zadáno datum.', 
		time: 'Byl špatně zadán čas.'
	}, 
	e: event // povinny parametr
	priklady class pro validaci: 
		valid-r-ema -> povinny prvek s kontrolou emailu
		valid-url -> nepovinny prvek s kontrolou url
		valid-r -> povinny prvek
});
 */
(function(){
	var FormValid = this.FormValid = {};
	var args = {},
		fields = [];

	var init = FormValid.init = function (obj){
		core.zkopirujObjekt(obj, args);
		$('#'+obj.formId).find('.errmsg').remove();
		fields = core.getElem();
		fields = core.getClasses();
		control.vyberKontroly();
	};
	var view = {
		zobrazChybu: function(hlaska, element){
			var chyby = $(element).parents(args.prvkyId).children(".errmsg");
			if($(chyby[0]).text() != hlaska) { // zobrazi chybu pouze pokud uz nebyla zobrazena
				$(element).parents(args.prvkyId).append('<div class="errmsg">'+hlaska+'</div>');
			}	
			var idElement = $(element).attr('id');
			if(idElement != "") {
				document.getElementById(idElement).scrollIntoView();
			}
			if(args.e.preventDefault) {
				args.e.preventDefault();
			} else { // ie 
				args.e.returnValue = false;
			}
			FormValid.error = true;
		}
	};
	var control = {
		vyberKontroly: function(){
			var nameTag;
			for(var param in fields) {
				nameTag = fields[param]['obj'].tagName;
				if(nameTag == 'INPUT') {
					var typeTag = $(fields[param]['obj']).attr('type');

					if(typeTag == 'text') { // <input type="text" />
						// variables - rozbiti validace do pole, hodnota prvku a kontrola jestli ma validovat
						var validita = fields[param]['class'].split("-"),
							value = $(fields[param]['obj']).val(),
							kontrolaValid = true,
							required;
						// Zjisti jestli je required, pokud ano, tak ho zkontroluj, pokud ne, tak proved validitu.
						// Pokud je required i validita, tak proved prvni required.
						// Pokud je pouze validita, neni required a nic nevyplnil, tak nedelej validitu.
						
						if(validita.length == 3) { // valid-r-xxx
							var kontroluj = validita[2];
							if(kontroluj == 'tim') {
								var valueHod = $(fields[param]['obj']).val();
								var valueMin = $(fields[param]['obj']).next().next().val();
								required = this.required.time(valueHod, valueMin); // volani required
							} else {
								required = this.required.text(value); // volani required
							}
							if(!required) {
								view.zobrazChybu(args.textChyby.required, fields[param]['obj']);
							}
						} else { // valid-xxx
							if(validita[1] == 'r') { // valid-r
								required = this.required.text(value); // volani required
								if(!required) {
									view.zobrazChybu(args.textChyby.required, fields[param]['obj']);
								}
							} else { // valid-xxx
								var kontroluj = validita[1];
								if(kontroluj == 'tim') {
									var valueHod = $(fields[param]['obj']).val();
									var valueMin = $(fields[param]['obj']).next().next().val();
									if(valueHod.length == 0 && valueMin.length == 0) {
										kontrolaValid = false;
									}
								} else {
									if(value.length == 0){ // jestlize je delka 0, tak nekontroluj validitu prvku
										kontrolaValid = false;
									}
								}
							}
						}
						// validita
						if(kontroluj && kontrolaValid) {
							switch(kontroluj) {
								case 'ema':
									if (this.validita.email(value) == false) {
										view.zobrazChybu(args.textChyby.email, fields[param]['obj']);
									}
								break;
								case 'url':
									if (this.validita.url(value) == false) {
										view.zobrazChybu(args.textChyby.url, fields[param]['obj']);
									}
								break;
								case 'num':
									if (this.validita.number(value) == false) {
										view.zobrazChybu(args.textChyby.number, fields[param]['obj']);
									}
								break;
								case 'dat':
									if (this.validita.date(value) == false) {
										view.zobrazChybu(args.textChyby.date, fields[param]['obj']);
									}
								break;
								case 'tim':
									value = valueHod+':'+valueMin;
									if (this.validita.time(value) == false) {
										view.zobrazChybu(args.textChyby.time, fields[param]['obj']);
									}
								break;
							}
						}
						kontroluj = ""; // vycisti promennou "kontroluj" pro inputy v radku
					} else if(typeTag == 'radio'||typeTag == 'checkbox') { // <input type="radio" />||<input type="checkbox" />
						var nameAttr = $(fields[param]['obj']).attr('name');
						var required = this.required.radioCheckbox( $('input[name="'+nameAttr+'"]') );
						if(!required) {
							view.zobrazChybu(args.textChyby.required, fields[param]['obj']);
						} 
					}
				} else if(nameTag == 'SELECT') { // <select><option value=""></option></select>
					var option = fields[param]['obj'].getElementsByTagName('option'),
						value;
					for(var i = 0; i<option.length; i++) {
						value = $(option[i]).val();
						if(i==0) { // pokud prvni je prazdna a je vybrana, tak vyhod chybu.
							var required = this.required.select(value, option[i]);
							if(!required) {
								view.zobrazChybu(args.textChyby.required, fields[param]['obj']);
							}
						}
					}
				} else if(nameTag == 'TEXTAREA') { // <textarea></textarea>
					var required = this.required.text($(fields[param]['obj']).val()); // volani required
					if(!required) {
						view.zobrazChybu(args.textChyby.required, fields[param]['obj']);
					}
				}
			}
		},
		validita: {
			email: function(value) {
				var regObj = new RegExp('^([a-zA-Z0-9_-]+[.])*[a-zA-Z0-9_-]+@([a-zA-Z0-9_-]+[.])*[a-zA-Z0-9_-]+[.][a-zA-Z0-9]{2,4}$');
				return value.match(regObj) ? true : false;
			},
			url: function(value) {
				var regObj = new RegExp('^(((h|H)(t|T))(t|T)(p|P)((s|S)?)\\:\\/\\/)?((www|WWW)+\\.)+(([0-9]{1,3}){3}[0-9]{1,3}\\.|([\\w!~*\'()-]+\\.)*([\\w^-][\\w-]{0,61})?[\\w]\\.[a-zA-Z]{2,6})(:[0-9]{1,4})?((\\/*)|(\\/+[\\w!~*\'().;?:@&=+$,%#-]+)+\\/*)$');
				return value.match(regObj) ? true : false;
			},
			number: function(value) {
				var regObj = new RegExp('^[0-9]+$');
				return value.match(regObj) ? true : false;
			},
			date: function(value) {
				var regObj = new RegExp('^(0?[1-9]|[12][0-9]|3[01])[\.](0?[1-9]{1}|1[0-2])[\.]((2)\\d\\d\\d)$');
				return value.match(regObj) ? true : false;
			},
			time: function(value) {
				var regObj = new RegExp('^(0?[0-9]|[1][0-9]|2[0-3])[\:](0?[0-9]|[1-5][0-9])$');
				return value.match(regObj) ? true : false;
			}
		},
		required: {
			text: function(value) { // text + textarea
				if(value.length == 0) {
					return false;
				} else {
					return true;
				}
			},
			radioCheckbox: function(arr) {
				for(var i = 0; i<arr.length;i++) {
					if($(arr[i]).is(':checked')) {
						return true;
					}
				}
				return false;
			},
			select: function(value, option) {
				if(value.length == 0 && $(option).is(':selected')) {
					return false;
				}
				return true;
			},
			time: function(valueHod, valueMin) {
				if(valueHod.length == 0 || valueMin == 0){
					return false;
				} else {
					return true;
				}
			}
		}
	};
	var core = {
		getElem: function() {
			var formSelect = [];
			formSelect.input = document.getElementById(args.formId).getElementsByTagName('input');
			formSelect.textarea = document.getElementById(args.formId).getElementsByTagName('textarea');
			formSelect.select = document.getElementById(args.formId).getElementsByTagName('select');
			if(!args.formId || args.formId.length === 0) {
				formSelect.input = $(document.getElementsByTagName("form")[0].getElementsByTagName('input'));
				formSelect.textarea = $(document.getElementsByTagName("form")[0].getElementsByTagName('textarea'));
				formSelect.select = $(document.getElementsByTagName("form")[0].getElementsByTagName('select'));
			}
			return formSelect;
		},

		getClasses: function() {
			var count = 0,
				fieldsClass = [];

			for(var tags in fields){
				for(var i = 0; i<fields[tags].length; i++) {
					if(fields[tags][i].className) {
						var objArr = fields[tags][i].className.split(' ');
						for(var j = 0; j<objArr.length; j++) {
							// vsechny mozne tridy - regexp?
							if(objArr[j]=='valid-r'||objArr[j]=='valid-r-ema'||objArr[j]=='valid-r-url'||objArr[j]=='valid-r-num'||objArr[j]=='valid-r-dat'||objArr[j]=='valid-r-tim'||objArr[j]=='valid-ema'||objArr[j]=='valid-url'||objArr[j]=='valid-num'||objArr[j]=='valid-dat'||objArr[j]=='valid-tim'){
								fieldsClass[count] = {};
								fieldsClass[count]['obj'] = fields[tags][i];
								fieldsClass[count]['class'] = objArr[j];
								count = count+1;
							}
						}
					}
				}
			}
			return fieldsClass;
		},

		zkopirujObjekt: function(obj, objCopy) {
			if(typeof(obj) == 'object') {
				for(var item in obj) {
					var hodnota = obj[item];
					if(typeof(value) == 'object') {
						objCopy[item] = {};
						this.zkopirujObjekt(hodnota, objCopy);
					} else {
						objCopy[item] = hodnota;
					}
				}
			}
		}
	};
})();

