M = {
	init: function() {
		M.setFormValidation();
		M.setDeleteConfirm();
	},
	setDeleteConfirm: function() {
		var all = document.getElementsByTagName('a'),
			all_len = all.length,
			cnt = 0;
		for(cnt = 0; cnt < all_len; cnt++) {
			if(all[cnt].className.indexOf('delete') !== -1) {
				M.addEvent(all[cnt], 'click', 
					function(e){
						var all_title = 'Are you sure you want to do this?',
							el = e.target || e.srcElement;
						if(el.title != '') {
							all_title = el.title;
						}
						if(!confirm(all_title)){
							e.preventDefault; e.returnValue = false;
						}
					}
				);
			}
		}
	},
	setFormValidation: function() {
		var all = document.getElementsByTagName('form'),
			all_len = all.length,
			all_cnt = 0,
			cur = false,
			fields = [],
			fields_len = 0,
			fields_cnt = 0;
		for(all_cnt; all_cnt < all_len; all_cnt++) {
			cur = all[all_cnt];
			fields = cur.elements;
			fields_len = fields.length;
			for(fields_cnt = 0; fields_cnt < fields_len; fields_cnt++) {
				M.addEvent(fields[fields_cnt], 'blur', M.doFieldValidation);
			}
			M.addEvent(cur, 'submit', M.doFormValidation);
		}
	},
	doFormValidation: function(e) {
		var el, elm, elm_len, elm_cnt = 0, valid = true;
		try {
			if(e.nodeName) {
				el = e;
			} else {
				el = e.target || e.srcElement
			}
		} catch(err) {
			el = e.target || e.srcElement
		}
		elm = el.elements;
		elm_len = elm.length;
		for(elm_cnt = 0; elm_cnt < elm_len; elm_cnt++) {
			valid = !M.doFieldValidation(elm[elm_cnt]) && valid;
		}
		if(!valid) {
			try {
				e.preventDefault();
				e.returnValue = false;
				alert('Please correct the errors on the form and try to submit again.');
			} catch(err) {}
		}
	},
	doFieldValidation: function(e) {
		var el,
			val = [],
			val_len = 0,
			val_cnt = 0,
			hasError = false,
			ref_el = false,
			err_msg = '';
		try {
			if(e.nodeName) {
				el = e;
			} else {
				el = e.target || e.srcElement
			}
		} catch(err) {
			el = e.target || e.srcElement
		}
		if(el.className.indexOf('validate-') !== -1) {
			val = el.className.match(/validate-(.*?)( |$)/);
			val = val[1];
			val = val.split('-');
			val_len = val.length;
			el.parentNode.className = el.parentNode.className.replace(/m-error/g, '');
			for(val_cnt = 0; val_cnt < val_len; val_cnt++) {
				switch(val[val_cnt]) {
					case 'string':
						if(el.value.length < 1) {
							hasError = true;
							err_msg = 'Enter a value for ';
						}
					break;
					case 'email':
						if(!el.value.match(/.*?@.*?\..*?/)) {
							hasError = true;
							err_msg = 'Enter a valid ';
						}
					break;
					case 'confirm':
						val_cnt++;
						ref_el = document.getElementById(val[val_cnt]);
						if(ref_el && ref_el.value != el.value) {
							hasError = true;
							err_msg = 'Non-matching value for ';
						}
					break;
					case 'datetime':
						if(!el.value.match(/^\d?\d\/\d?\d\/\d\d\d\d \d?\d:\d\d [AaPp][Mm]$/)) {
							hasError = true;
							err_msg = 'Enter a valid datetime value (MM/DD/YYYY HH:MM AM) for ';
						}
					break;
				}
			}
			if(hasError) {
				el.parentNode.className += ' m-error';
				if(el.parentNode.getElementsByTagName('span').length > 0) {
					el.parentNode.getElementsByTagName('span')[0].innerHTML = err_msg;
				} else {
					el.parentNode.insertBefore(M.createElement('span', {'class': 'm-error', 'innerHTML': err_msg}), el.parentNode.firstChild);
				}
			}
		}
		return hasError;
	},
	addEvent: function(el, evnt, meth) {
		if(!el) {
			return false;
		}
		if(window.addEventListener) {
			el.addEventListener(evnt, meth, false);
		} else if(window.attachEvent) {
			el.attachEvent('on' + evnt, meth);
		}
	},
	createElement: function(el, attributes) {
		var key;
		el = document.createElement(el);
		if(!attributes) {
			attributes = {};
		}
		for(key in attributes) {
			switch(key) {
				default:
					el.setAttribute(key, attributes[key]);
				break;
				case 'class':
				case 'className':
					el.className = attributes[key];
				break;
				case 'id':
					el.id = attributes[key];
				break;
				case 'innerHTML':
					el.innerHTML = attributes[key];
				break;
			}
		}
		return el;
	}
}

M.init();