﻿// requires yui.dom

if (typeof(ARK) === 'undefined')
	var ARK = {};

if (!console) {
    var console = {log: function(){}};
}


ARK.forms = {
	tests: {
		required: function(v) {return (v!=null && v.length>0)},
		'valid-number': function(v) {return (!isNaN(v))},
		'valid-email': function(v) {return (/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v))},
		'valid-date': function(v) {return (/\d{4}-\d{2}-\d{2}$/.test(v))},
		'valid-time': function(v) {return (/\d{2}:\d{2}[\.:]\d{2}$/.test(v))}

	},
	messages: {
		required: 'Ovo polje je obavezno unijeti!',
		'valid-email': 'Napišite ispravan e-mail!',
		'valid-number': 'Napišite ispravan broj!',
		'valid-date': 'Napišite ispravan datum (GGGG-MM-DD)!',
		'valid-time': 'Napišite ispravno vrijeme (HH:MM:SS ili MM:SS.ss)!'
	},

	form: null,
	fields: null,
	isValid: null,

	validate: function(obj, submitFn) {
		var errs;
		this.form = null; this.fields = null; this.isValid = true;


		// single element
		if (this.isFormElement(obj)) {
			this.fields = obj;
			errs = YAHOO.util.Dom.getElementsByClassName('error','span', this.fields.parentNode)[0];

			if (errs!=null)
				this.fields.parentNode.removeChild(errs);
		}
		// form
		else if (obj.nodeName.toLowerCase()=='form') {
			this.form = obj;
			this.fields = YAHOO.util.Dom.getElementsBy(this.isFormElement, '', obj);
			errs = YAHOO.util.Dom.getElementsByClassName('error','span', obj);

			for (a in errs)
				errs[a].parentNode.removeChild(errs[a]);
			for (a in this.fields) {
				if (YAHOO.util.Dom.hasClass(this.fields[a], 'invalid'))
					YAHOO.util.Dom.removeClass(this.fields[a], 'invalid');
			}
		}
		// nothing important
		else
			return false;

		// check fields for tests and invalidate if failed
		for (i in this.fields) {
			for (test in this.tests) {
				if ((YAHOO.util.Dom.hasClass(this.fields[i], 'required') || this.fields[i].value!='') && YAHOO.util.Dom.hasClass(this.fields[i], test) && !this.tests[test](this.fields[i].value))
					this.invalidate(this.fields[i], test);
			}
		}

		// submit if valid
		if (this.isValid && this.form!=null) {
			if (submitFn) {
				submitFn();
			}
			else
				this.form.submit();
		}
	},


	invalidate: function (field, test) {
		this.isValid = false;

		if (!YAHOO.util.Dom.hasClass(field, 'invalid'))
			YAHOO.util.Dom.addClass(field, 'invalid');

		var err = document.getElementById(field.id+'_err');

		// first error on field - create new error container
		if (err==null) {
			err = document.createElement('span');
			err.className = 'error';
			err.innerHTML = this.messages[test];
			err.id = field.id+'_err';

			YAHOO.util.Dom.generateId(err, 'err');
			YAHOO.util.Dom.setStyle (err , 'opacity', 0)

			YAHOO.util.Dom.insertAfter(err, field);

			if (YAHOO.util.Anim) {
				var anim = new YAHOO.util.Anim(document.getElementById(err.id), {opacity: {to:1}}, 1);  
				anim.animate(); 
			}
			else
				YAHOO.util.Dom.setStyle(document.getElementById(err.id) , 'opacity', 1);
		}
		// not the first error - just append the message
		else if (err.innerHTML.indexOf(this.messages[test])<0)
			err.innerHTML += "<br/>"+this.messages[test];
	},

	isFormElement: function(el) {
		if ((el.nodeName.toLowerCase() == 'input' && el.type.toLowerCase()!='button' && el.type.toLowerCase()!='submit')
		 	|| el.nodeName.toLowerCase() == 'select' || el.nodeName.toLowerCase() == 'textarea')
	 		return true;
	 	else
	 		return false;
	}
}