register = {};
register.form = null;
register.elements = null;
register.ctrl = {};
register.init = function(form) {
	YAHOO.util.Event.onContentReady('page',function() {
		register.form = document.getElementById(form);
		register.form.setAttribute('onsubmit','return register.onsubmit();');
		register.elements = YAHOO.util.Selector.query('input,select', register.form);
		YAHOO.util.Dom.batch(register.elements,function(el) {
			register.ctrl[register.nameOf(el)] = el;
		});
//		for(n in register.form.elements(0)) {
//			alert(n);
//		}
//		var elements = [];
//		for(var i=0;i < register.form.elements.length;i++) {
//			elements[elements.length] = register.form.elements.item(i);
//		}
		//alert(register.form.elements.length);
		YAHOO.util.Dom.batch(register.elements,function(el) {
			YAHOO.util.Event.on(el,'change',function(e) {
				if(YAHOO.util.Event.getTarget(e).getAttribute('type')!='checkbox'){
					return register.onchange(YAHOO.util.Event.getTarget(e));
				}
				return register.onchange(YAHOO.util.Event.getTarget(e));
			});
			YAHOO.util.Event.on(el,'click',function(e) {
				if(YAHOO.util.Event.getTarget(e).getAttribute('type')=='checkbox'){
					return register.onchange(YAHOO.util.Event.getTarget(e));
				}
			});
			YAHOO.util.Event.on(el,'focus',function(e) {
				return register.onfocus(YAHOO.util.Event.getTarget(e));
			});
			YAHOO.util.Event.on(el,'blur',function(e) {
				return register.onblur(YAHOO.util.Event.getTarget(e));
			});
			//register.onchange(el);
		});
	});
}
register.root = function(el) {
	return YAHOO.util.Dom.getAncestorByClassName(el,'control');
}
//register.formElements = function(i) {
//	var arrReturn = YAHOO.util.Selector.query('input,select', register.form);
//	if(i) {
//		return arrReturn[i];
//	} else {
//		return arrReturn;
//	}
//}
register.valueOf = function(el) {
	var result = '';
	switch(el.tagName) {
		case 'SELECT':
			result +=el.options[el.selectedIndex].value;
			if(parseInt(result) == 0 && el.selectedIndex == 0) {result += '';}
			break;
		case 'INPUT':
			if(el.type == 'checkbox') {
				if(el.checked == true) result+='1';
				else result+='';
			} else {
				result = '' + el.value;
			}
			break;
	}
	return register.string(result);
}
register.string = function(value) {
	return (typeof value == 'string') ? value : new String(value);
}
register.filter = function(el,config) {
	var value = this.valueOf(el);
	if(config == undefined) {return true;}
	for(facet in config) {
		switch(facet) {
		case 'base':
			value = this.filter(el,config[facet]);
			break;
		case 'trim':
			switch(config[facet]) {
			case 'left':
				value = value.replace(/\s/,'');
			case 'right':
				value = value.replace(/\s/,'');
			case 'both':
				value = value.replace(/\s/,'');
			}
			break;
		case 'replace':
			value = value.replace(config[facet][0],config[facet][1]);
			break;
		case 'cleanup':
			var counter = 10;
			while(counter-- > 0) {
				search = value.search(config[facet]);
				if(search >= 0) {
					value = value.replace(config[facet],'');
				} else {
					break;
				}
			}
			break;
		case 'format':
			value = config[facet].exec(value);
			break;
		default:
			break;
		}
	}
	el.value = value;
	return value;
}
register.assert = function(el,config) {
	var value = this.valueOf(el);
	if(config == undefined) {return true;}
	//console.log(el,facet,value);
	for(facet in config) {
		//alert(el+facet+value);
		switch(facet) {
		case 'base':
			if(!this.assert(el,config[facet])) {return false;}
			break;
		case 'union': // valid if any match
			for(i in config[facet]) {
				if(this.assert(el,config[facet][i])) {break;}
			}
			return false;
			break;
		case 'length':
			if(value.length != config[facet]) {return false;}
			break;
		case 'minLength':
			if(value.length < config[facet]) {return false;}
			break;
		case 'maxLength':
			if(value.length > config[facet]) {return false;}
			break;
		case 'minValue':
			if(value < config[facet]) {return false;}
			break;
		case 'maxValue':
			if(value > config[facet]) {return false;}
			break;
		case 'pattern':
			if(!config[facet].test(value)){return false;}
			break;
		case 'callback':
			if(!config[facet].call(register,value)){return false;}
			break;
		case 'notempty':
			if(''+value.length == 0){return false;}
			break;
		default: // sub
			if(facet.charAt(0)=='_') { // metadata
				break;
			} else if(parseInt(facet) >= 0) { // sequence
				register.assert(el,config[facet]);
			}
			break;
		}
	}
	return true;
}
register.empty = function(el) {
	var value = this.valueOf(el);
	//alert(el.type+':'+value);
	if(value == false) {return true;}
	if(value == '') {return true;}
	if(value == 0) {return true;}
	if(value == null) {return true;}
	if(value == undefined) {return true;}
	return false;
}
register.required = function(el) {
	return YAHOO.util.Dom.hasClass(this.root(el),'required'); // && !YAHOO.util.Dom.getAncestorByClassName(this.root(el),'collapsed'
}
register.optional = function(el) {
	return !this.required(el);
}
register.flag = function(el,flag) {
	if(YAHOO.lang.isString(el)) {el = document.getElementById(el);}
	else if(!YAHOO.util.Dom.hasClass(el,'control')) {el = this.root(el);}
	YAHOO.util.Dom.addClass(el,flag);
}
register.unflag = function(el,flag) {
	if(YAHOO.lang.isString(el)) {el = document.getElementById(el);}
	else if(!YAHOO.util.Dom.hasClass(el,'control')) {el = this.root(el);}
	YAHOO.util.Dom.removeClass(el,flag);
}
register.status = function(el,flag) {
	el = this.root(el);
	// clear
	YAHOO.util.Dom.removeClass(el,'empty');
	YAHOO.util.Dom.removeClass(el,'error');
	YAHOO.util.Dom.removeClass(el,'valid');
	// set
	YAHOO.util.Dom.addClass(el,flag);
}

register.onfocus = function(el) {
	this.flag(el,'focus');
}
register.onblur = function(el) {
	this.unflag(el,'focus');
}
register.nameOf = function(el) {
	return el.getAttribute('name');
}
register.notify = function(el,handler) {
	if(handler) {
		handler.call(register,el);
	}
}

register.isError = function(o) {
	return YAHOO.util.Dom.hasClass(o,'error') || YAHOO.util.Dom.hasClass(YAHOO.util.Dom.getAncestorByClassName(o,'control'),'error');
}
register.isDisabled = function(o) {
	if(!YAHOO.util.Dom.hasClass(o,'control')) {
		o = YAHOO.util.Dom.getAncestorByClassName(o,'control');
	}
	var supercontrol = YAHOO.util.Dom.getAncestorByClassName(o,'control');
	if(YAHOO.util.Dom.hasClass(o,'disabled')) {
		return true;
	} else if(supercontrol) {
		return register.isDisabled(supercontrol);
	} else {
		return false;
	}
}
register.onsubmit = function() {
	YAHOO.util.Dom.batch(register.elements,function(el) {
		register.onchange(el);
	});

	//var submit = register.ctrl['tx_srfeuserregister_pi1[submit]'];
	for(i = 0;i < register.elements.length ; i++) {
		var o = register.elements[i];
		if(register.isDisabled(o)) {
			continue;
		}
		if(register.isError(o)) {
			//alert('errorAt:'+o.name);
			o.focus();
			return false;
		}
	}
	//alert('valid');
	//register.form.submit();
	return true;
}
register.onchange = function(el,silent) {
	this.sanitize(el);
	this.validate(el);
	if(silent != true) {
		this.notify(el,this.change[this.nameOf(el)]);
	}
}
register.sanitize = function(el) {
	this.filter(el,this.preparation[this.nameOf(el)]);
}
register.validate = function(el) {
	var restriction = this.restrict(el);
	if(this.empty(el)) {
		if(this.required(el)) {
			this.status(el,'error');
		} else {
			this.status(el,'empty')
		}
		return true;
	} else {
		restriction.notempty = true;
		if(!this.assert(el,restriction)) {
			this.status(el,'error');
			return false;
		} else {
			this.status(el,'valid');
			return true;
		}
	}
}
register.value = function(currentValue,defaultValue) {
	if(!defaultValue) {
		defaultValue = null;
	}
	if(currentValue == undefined){
		return defaultValue;
	} else {
		return currentValue;
	}
}
register.restrict = function(el) {
	return this.value(this.restriction[this.nameOf(el)],{});
}
















/******************* CONFIGURATION *******************/

/*Handle*/
register.change = {};
register.change["tx_sitechopin[DATA][self]"] = function(el) {
	if(el.checked) {
		YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('instytucja-other',null,register.form),function(o) {
			register.unflag(o,'disabled');
		});
		register.ctrl['FE[fe_users][tx_sitechopin_organizer]'].selectedIndex = 0;
		register.status(register.ctrl['FE[fe_users][tx_sitechopin_organizer]'],'empty');
		register.unflag(register.ctrl["FE[fe_users][tx_sitechopin_organizer]"],'required');
//		register.status(register.ctrl['FE[fe_users][tx_sitechopin_organizer]'],'valid');
	} else {
		YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('instytucja-other',null,register.form),function(o) {
			register.flag(o,'disabled');
		});
		register.flag(register.ctrl["FE[fe_users][tx_sitechopin_organizer]"],'required');
//
		//register.status(register.ctrl['FE[fe_users][tx_sitechopin_organizer]'],'error');
	}
}
register.change["FE[fe_users][tx_sitechopin_addevents]"] = function(el) {
	if(el.checked) {
		register.unflag('addevents-content','disabled');
	} else {
		register.flag('addevents-content','disabled');
	}
}
register.change["FE[fe_users][tx_sitechopin_organizer]"] = function(el) {
	if(el.selectedIndex == 0) {
		register.unflag('instytucja','disabled');
	} else {
		register.flag('instytucja','disabled');
		register.ctrl['tx_sitechopin[DATA][self]'].checked = false;
		YAHOO.util.Dom.batch(YAHOO.util.Dom.getElementsByClassName('instytucja-other',null,register.form),function(o) {
			register.flag(o,'disabled');
		});
	}
}
register.change['FE[fe_users][password]'] = function(el) {
	//register.status['FE[fe_users][password_again]'].value = '';
	register.status(register.ctrl['FE[fe_users][password_again]'],'error');
}

/*Sanitize*/
register.preparation = {};
register.preparation.general = {
	trim:'both'
};
register.preparation['tx_sitechopin[DATA][postcode]'] = {
	base:register.preparation.general,
	cleanup:/[^0-9]/i
}
register.preparation['tx_sitechopin[DATA][phone]'] = {
	base:register.preparation.general,
	cleanup:/(^\+)?[^0-9]+/i
}





/*Validate*/
register.restriction = {};
register.restriction.name = { /*datatype*/
	pattern:/^[^0-9]+/i,
	minLength:1
//	1:{pattern:/^(a-z0-9)*$/i},
//	2:{pattern:/[0-9]/i}
}
register.restriction['FE[fe_users][email]'] = {
	pattern:/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/
}
register.restriction['FE[fe_users][password]'] = {
	minLength:5
}
register.restriction['FE[fe_users][password_again]'] = {
	callback: function(value) {
		return this.valueOf(this.ctrl['FE[fe_users][password]']) == value;
	}
}
register.restriction['tx_sitechopin[DATA][name]'] = {
	base:register.restriction.name,
	minLength:2
}
register.restriction['tx_sitechopin[DATA][surname]'] = {
	base:register.restriction.name,
	minLength:2
}
register.restriction['tx_sitechopin[DATA][street]'] = {
	base:register.restriction.name
}
register.restriction['tx_sitechopin[DATA][nr1]'] = {
	pattern:/^[\d]*[ -]?[a-z]*$/i
},
register.restriction['tx_sitechopin[DATA][nr2]'] = {
	base:register.restriction['tx_sitechopin[DATA][nr1]']
}
register.restriction['tx_sitechopin[DATA][postcode]'] = {
	pattern:/[0-9]{5}/i
},
register.restriction['tx_sitechopin[DATA][city]'] = {
	base:register.restriction['tx_sitechopin[DATA][name]']
},
register.restriction['tx_sitechopin[DATA][phone]'] = {
	pattern:/^(\+)?([0-9 \-]*)$/i,
	minLength:9
}
register.init('form-register');

