/* 
 * Dosia 2.0
 *
 * Dyskretny Otwarty Samodzialajacy Inicjator Ajaxa
 *
 */

var Dosia = new Object();

Dosia.getElementsByClassName = function(classname, node) {

	if(!node) {
		node = document.getElementsByTagName("body")[0];
	}
	var a = [];
	
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");

	for(var i=0,j=els.length; i<j; i++) {
		if(re.test(els[i].className))a.push(els[i]);
	}
	
	return a;
}

Dosia.Form = function(form) {

	if (typeof form == 'string') {
		form = $(form);
	}

	Dosia.DisplayLoader(true);

	form.request({		
		onComplete: function(transport){
			Dosia.DisplayLoader(false); Dosia.Run(transport.responseText);
		}
	});

}

Dosia.Run = function(code) {	
	eval(code);
}

Dosia.include = function(jsFile) {
	var script = document.createElement('script');
	script.type = 'text/javascript';
	script.src = jsFile;
	document.getElementsByTagName('head')[0].appendChild(script);
	return true;

}

Dosia.PostRequest = function(target, post) {


	Dosia.DisplayLoader(true);

	var url = target;
	new Ajax.Request(url, {
		method: 'post', parameters: 'data='+post,
		onSuccess: function(transport) {
			Dosia.DisplayLoader(false); Dosia.Run(transport.responseText);
			return transport.responseText;
		}
	});

}


Dosia.Request = function(target) {

	Dosia.DisplayLoader(true);

	var url = target;
	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			Dosia.DisplayLoader(false); Dosia.Run(transport.responseText);
			return transport.responseText;
		}
	});

}



Dosia.DisplayLoader = function(action) {
	if(action == true) {
		var div = new Element('div', {
			'class': 'DosiaDisplayLoaderContainer2',
			'id': 'DosiaDisplayLoaderContainer'
		});
		div.innerHTML = 'Proszę czekać ...';
		document.body.appendChild(div);



	} else {
		$('DosiaDisplayLoaderContainer').remove();
	}
}

Dosia.ShowMessageBox = function(event) {
	var element = Event.element(event);
	var x = Event.pointerX(event) + 20;
	var y = Event.pointerY(event);
	y += 10;
	var body = $$('body');
	var i = 0;
	while(element != body[0] && i < 10){
		if($(element.name + '_messageBox') != null){
			$(element.name + '_messageBox').style.top = y + 'px';
			$(element.name + '_messageBox').style.left = x + 'px';
			Element.show($(element.name + '_messageBox'));
			break;
		}else if($(element.id + '_messageBox') != null){
			$(element.id + '_messageBox').style.top = y + 'px';
			$(element.id + '_messageBox').style.left = x + 'px';
			Element.show($(element.id + '_messageBox'));
			break;
		}else if($(element.id.replace(/_divValidator/, "_messageBox")) != null){
			$(element.id.replace(/_divValidator/, "_messageBox")).style.top = y + 'px';
			$(element.id.replace(/_divValidator/, "_messageBox")).style.left = x + 'px';
			Element.show($(element.id.replace(/_divValidator/, "_messageBox")));
			break;
		}else if(Element.readAttribute(element,'for') != null && Element.readAttribute(element,'for').length > 0){
			$(Element.readAttribute(element,'for') + '_messageBox').style.top = y + 'px';
			$(Element.readAttribute(element,'for') + '_messageBox').style.left = x + 'px';
			Element.show($(Element.readAttribute(element,'for') + '_messageBox'));
			break;
		}
		else{
			element = Element.getOffsetParent(element);
			i++;
		}
	}
}

Dosia.HideMessageBox = function(event) {
	var element = Event.element(event);
	var body = $$('body');
	var i = 0;
	while(element != body[0] && i < 10){
		if($(element.name + '_messageBox') != null){
			Element.hide($(element.name + '_messageBox'));
			break;
		}else if($(element.id + '_messageBox') != null){
			Element.hide($(element.id + '_messageBox'));
			break;
		}else if($(element.id.replace(/_divValidator/, "_messageBox")) != null){
			Element.hide($(element.id.replace(/_divValidator/, "_messageBox")));
			break;
		}else if(Element.readAttribute(element,'for') != null && Element.readAttribute(element,'for').length > 0){
			Element.hide($(Element.readAttribute(element,'for') + '_messageBox'));
			break;
		}else{
			element = Element.getOffsetParent(element);
			i++;
		}
	}
	Element.show(element);
}

Dosia.executeJS = function(data) {
	var array, script, src, i;

	array = data.split('<script', 2000);

	if (array.length < 2) {
		return false;
	}

	i = 1;
	while ( i < array.length) {
		script = array[i].split('</script>', 2);
		src = script[0].split('src="', 2);

		if (src.length > 1) {
			src = src[1].split('"', 2);
			Dosia.include(src[0]);
		} else {
			script = script[0].split('>', 2);

			Dosia.Run(script[1]);
		}

		i++;
	}

	return true;
}

Dosia.ValidateForm = function(form) {
	Event.observe(form, 'submit', function(event) {
		var postBody = Form.serialize(form) + '&action=submit';
		var redirect = false;
		new Ajax.Request(form.action, {
			method : 'post',
			postBody : Form.serialize(form) + '&action=submit',
			onCreate : function() {
				Dosia.DisplayLoader(true);
				form.disable();
				var arr = $$('div.newValidator');
				for(var i = 0; i < arr.length; i++ ){
					arr[i].remove();
				}
				arr = $$('div.tabelaGlownaChmurki');
				for(var i = 0; i < arr.length; i++ ){
					arr[i].remove();
				}
			},
			onSuccess : function(transport) {
				form.enable();
				Dosia.DisplayLoader();
				var odp = transport.responseText.evalJSON();
				if(odp.success == true) {
					if(odp.redirect != null) {
						window.location = odp.redirect;
					}else {
						var odpDiv = new Element('div');
						var odpSpan = new Element('span');
						odpSpan.addClassName('state_ok');
						if(odp.msg != null){
							odpSpan.innerHTML = odp.msg;
						}else{
							odpSpan.innerHTML = 'Formularz został zaakceptowany';
						}
						odpDiv.insert(odpSpan);
						Element.insert(form, {
							'after' : odpDiv
						});
						form.hide();
					}
				} else {
					form.enable();
					for(i in odp.fields) {
						rmField = null;
						if($(odp.fields[i].field + '_divValidator')== null && form[odp.fields[i].field] != null){
							var rmField = form[odp.fields[i].field];
							var validDiv = Dosia.UpdateValidatorState(rmField.name + '_divValidator',rmField,'no');
							var msgMainContainer = new Element('div', {
								'class' : 'tabelaGlownaChmurki',
								'id' : rmField.name + '_messageBox'
								});
							var topBar = new Element('div', {
								'class' : 'tabelaGornaChmurki'
							});
							var bottomBar = new Element('div', {
								'class' : 'tabelaDolnaChmurki'
							});
							var msgContainer = new Element('div', {
								'class' : 'tabelaSrodkowaChmurki'
							});
							msgContainer.innerHTML = odp.fields[i].msg;
							msgMainContainer.insert(topBar).insert(msgContainer).insert(bottomBar);
							$('messages').insert(msgMainContainer);
							Element.hide(msgMainContainer);
							Event.observe(form[odp.fields[i].field],'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe(form[odp.fields[i].field],'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
							var arr = $$('label[for="' + rmField.name + '"]');
							var i = 0;
							for(i = 0; i < arr.length ; i++){
								Event.observe(arr[i],'mousemove', function(event){
									Dosia.ShowMessageBox(event)
									});
								Event.observe(arr[i],'mouseout', function(event){
									Dosia.HideMessageBox(event)
									});
							}
							Event.observe(validDiv,'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe(validDiv,'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
						}else if(form[odp.fields[i].field]!= null){
							var rmField = form[odp.fields[i].field];
							//                    		$(rmField.name + '_divValidator').removeClassName('state_load').removeClassName('state_ok').addClassName('state_no');
							var validDiv = Dosia.UpdateValidatorState(rmField.name + '_divValidator',rmField,'no');
							if($(rmField.name + '_messageBox') != null){
								Element.remove($(rmField.name + '_messageBox'));
							}
							var msgMainContainer = new Element('div', {
								'class' : 'tabelaGlownaChmurki',
								'id' : rmField.name + '_messageBox'
								});
							var topBar = new Element('div', {
								'class' : 'tabelaGornaChmurki'
							});
							var bottomBar = new Element('div', {
								'class' : 'tabelaDolnaChmurki'
							});
							var msgContainer = new Element('div', {
								'class' : 'tabelaSrodkowaChmurki'
							});
							msgContainer.innerHTML = odp.fields[i].msg;
							msgMainContainer.insert(topBar).insert(msgContainer).insert(bottomBar);
							$('messages').insert(msgMainContainer);
							Element.hide(msgMainContainer);
							Event.observe(form[odp.fields[i].field],'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe(form[odp.fields[i].field],'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
                        	
							Event.observe(validDiv,'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe(validDiv,'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
						}else if($(odp.fields[i].field) != null){
							var rmField = $(odp.fields[i].field);
							var validDiv = Dosia.UpdateValidatorState(rmField.id + '_divValidator',rmField,'no');
							if($(rmField.id + '_messageBox')){
								$(rmField.id + '_messageBox').remove();
							}
							var msgMainContainer = new Element('div', {
								'class' : 'tabelaGlownaChmurki',
								'id' : rmField.id + '_messageBox'
								});
							var topBar = new Element('div', {
								'class' : 'tabelaGornaChmurki'
							});
							var bottomBar = new Element('div', {
								'class' : 'tabelaDolnaChmurki'
							});
							var msgContainer = new Element('div', {
								'class' : 'tabelaSrodkowaChmurki'
							});
							msgContainer.innerHTML = odp.fields[i].msg;
							msgMainContainer.insert(topBar).insert(msgContainer).insert(bottomBar);
							$('messages').insert(msgMainContainer);
							Element.hide(msgMainContainer);
							Event.observe($(odp.fields[i].field),'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe($(odp.fields[i].field),'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
							for(element in $$('label[for=' + rmField.name + ']')){
								Event.observe(element,'mousemove', function(event){
									Dosia.ShowMessageBox(event)
									});
								Event.observe(element,'mouseout', function(event){
									Dosia.HideMessageBox(event)
									});
							}
							for(element in Element.childElements($(odp.fields[i].field))){
								Event.observe(element,'mousemove', function(event){
									Dosia.ShowMessageBox(event)
									});
								Event.observe(element,'mouseout', function(event){
									Dosia.HideMessageBox(event)
									});
							}
							Event.observe(validDiv,'mousemove', function(event){
								Dosia.ShowMessageBox(event)
								});
							Event.observe(validDiv,'mouseout', function(event){
								Dosia.HideMessageBox(event)
								});
						}
                    	
                    	
                    	
					}
                    
				}
			}
		});
		Event.stop(event);
	});
}


Dosia.UpdateValidatorState = function(validator_id,field,state){
	if($(validator_id) == null){
		var div = new Element('div', {
			'id' : validator_id,
			'class' : 'newValidator'
		});
		var left = Element.viewportOffset(field).left + field.getWidth() + document.viewport.getScrollOffsets().left - 3;
		var top = Element.viewportOffset(field).top + document.viewport.getScrollOffsets().top - 17;
		div.style.top = top + 'px';
		div.style.left = left + 'px';
		div.removeClassName('state_ok').removeClassName('state_no').removeClassName('state_load').addClassName('state_' + state);
		$('messages').insert(div);
	}else{
		var div = $(validator_id);
		div.removeClassName('state_ok').removeClassName('state_no').removeClassName('state_load').addClassName('state_' + state);
	}
	return div;
}

Dosia.HideAllValidators = function() {
	$$('div.newValidator').remove();
}


Dosia.ValidateField = function(field) {
	var action = field.form.action;
	var rmField = field;
	Event.observe(field, 'blur', function(){
		new Ajax.Request(action + '/field/' + field.name , {
			method : 'post',
			postBody : Form.Element.serialize(rmField),
			onCreate : function(transport) {
				Dosia.UpdateValidatorState(rmField.name + '_divValidator',field,'load');
				if($(field.name + '_messageBox') != null){
					$(field.name + '_messageBox').remove();
				}
				Event.stopObserving(rmField,'mousemove');
				Event.stopObserving(rmField,'mouseout');
			},
			onSuccess : function(transport) {
				var odp = transport.responseText.evalJSON();
				if(odp.success == true) {
					Dosia.UpdateValidatorState(rmField.name + '_divValidator',rmField,'ok');
				} else {
					var validDiv = Dosia.UpdateValidatorState(rmField.name + '_divValidator',rmField,'no');
					var msgMainContainer = new Element('div', {
						'class' : 'tabelaGlownaChmurki',
						'id' : rmField.name + '_messageBox'
						});
					var topBar = new Element('div', {
						'class' : 'tabelaGornaChmurki'
					});
					var bottomBar = new Element('div', {
						'class' : 'tabelaDolnaChmurki'
					});
					var msgContainer = new Element('div', {
						'class' : 'tabelaSrodkowaChmurki'
					});
					msgContainer.innerHTML = odp['fields'][field.name]['msg'];
					msgMainContainer.insert(topBar).insert(msgContainer).insert(bottomBar);
					$('messages').insert(msgMainContainer);
					Element.hide(msgMainContainer);
					Event.observe(rmField,'mousemove', function(event){
						Dosia.ShowMessageBox(event)
						});
					Event.observe(rmField,'mouseout', function(event){
						Dosia.HideMessageBox(event)
						});
					Event.observe(validDiv,'mousemove', function(event){
						Dosia.ShowMessageBox(event)
						});
					Event.observe(validDiv,'mouseout', function(event){
						Dosia.HideMessageBox(event)
						});
				}
			}
		})
	});
	
}

//state : no , ok, load, null
Dosia.AddToolTipToElement = function(rmField,message,state) {
	var ident = (rmField.name != null?rmField.name:rmField.id);
	if(state != null){
		var validDiv = Dosia.UpdateValidatorState(ident + '_divValidator',rmField,state);
		Event.observe(validDiv,'mousemove', function(event){
			Dosia.ShowMessageBox(event)
			});
		Event.observe(validDiv,'mouseout', function(event){
			Dosia.HideMessageBox(event)
			});
	}
	var msgMainContainer = new Element('div', {
		'class' : 'tabelaGlownaChmurki',
		'id' : ident + '_messageBox'
		});
	var topBar = new Element('div', {
		'class' : 'tabelaGornaChmurki'
	});
	var bottomBar = new Element('div', {
		'class' : 'tabelaDolnaChmurki'
	});
	var msgContainer = new Element('div', {
		'class' : 'tabelaSrodkowaChmurki'
	});
	msgContainer.innerHTML = message;
	msgMainContainer.insert(topBar).insert(msgContainer).insert(bottomBar);
	$('messages').insert(msgMainContainer);
	Element.hide(msgMainContainer);
	Event.observe(rmField,'mousemove', function(event){
		Dosia.ShowMessageBox(event)
		});
	Event.observe(rmField,'mouseout', function(event){
		Dosia.HideMessageBox(event)
		});
	
}

Event.observe(window, 'load', function(){
	var fields = document.getElementsByClassName('avf');
	var c = fields.length;
	for(i = 0; i < c; i++) {
		Dosia.ValidateField(fields[i]);
	}

	var forms = document.getElementsByClassName('avfo');
	c = forms.length;
	for(i = 0; i < c; i++) {
		Dosia.ValidateForm(forms[i]);
	}
});


Dosia.Action2Run = new Array();

Dosia.AddAction2Run = function(ident, func) {
	if (Dosia.Action2Run[ident] == undefined) {
		Dosia.Action2Run[ident] = new Array();
	}

	Dosia.Action2Run[ident][Dosia.Action2Run[ident].length] = func;
}

/**
 * Funkcja uruchamia akcje które mają się zdarzyć po uruchomieniu zdarzenia o
 * zadanym identyfikatorze
 */
Dosia.RunAction = function(ident) {

	if (ident == true) {
		for ( a in Dosia.Action2Run) {
			for (i = 0 ; i < a.length ; i++) {
				Dosia.Run(a[i]);
			}
		}
	} else if (Dosia.Action2Run[ident] != undefined) {
		for (i = 0 ; i < Dosia.Action2Run[ident].length ; i++) {
			Dosia.Run(Dosia.Action2Run[ident][i]);
		}
	}
}

Dosia.CheckAction = function(ident, action) {
	if (ident == true) {
		for ( a in Dosia.Action2Run) {
			for (i = 0 ; i < a.length ; i++) {
				if (a[i] == action)
					return true;
			}
		}
	} else if (Dosia.Action2Run[ident] != undefined) {
		for (i = 0 ; i < Dosia.Action2Run[ident].length ; i++) {
			if (Dosia.Action2Run[ident][i] == action)
				return true;
		}
	}

	return false;
}

