$(document).ready(function(){
	// Message when loading
	$.fn.loadWithEffect.defaults.message = 'Nahrávam...';
	// Message if a loading error occurs
	$.fn.loadWithEffect.defaults.errorMessage = 'Chyba pri nahrávaní';
	// Retry link text
	$.fn.loadWithEffect.defaults.retry = 'Skúsiť znovu';
	// Cancel link text
	$.fn.loadWithEffect.defaults.cancel = 'Zrušiť';
	
	$.fn.adsform_load = function(target,action,paramObj,callback){
		$(target).loadWithEffect(action,paramObj,function(responseText, textStatus, XMLHttpRequest){
			depe = $.extend(depe, $.fn.adsform_depe(target));
			$(this).adsform();
			$(this).applyTemplateSetup();
			if(callback && typeof(callback == 'function')){
				callback();
			}
		});
	}
	$.fn.adsform_click = function() {
		$('form.ads_form .ads_submit').live('click',function(){
			var form = $(this.form);
			var paramObj = {};
			
			var label = $(this).text(); 
			$(this).text('');
			var val = $(this).val();
			$(this).text(label);
			
			if(!val){
				var target = '';
				var path = '';
			}else{
				var parts = val.split('#');
				var path = parts[0];
				var target = (parts.length == 2) ? parts[1] : '';
			}
			
			var action = path ? path : form.attr('action');
			$.each(form.serializeArray(), function(_, kv) {
				paramObj[kv.name] = kv.value;
			});
			if(target){
				target = '#' + target;
				$.fn.adsform_load(target,action,paramObj);
			}
		});
	}
	
	$('form.ads_form .ads_validate').live('click',function(){
		var form = $(this.form);
		var paramObj = {};
		
		var label = $(this).text(); 
		$(this).text('');
		var val = $(this).val();
		$(this).text(label);
		
		if(!val){
			var target = '';
			var path = '';
		}else{
			var parts = val.split('#');
			var path = parts[0];
			var target = (parts.length == 2) ? parts[1] : '';
		}
		
		var action = path ? path : form.attr('action');
		$.each(form.serializeArray(), function(_, kv) {
			paramObj[kv.name] = kv.value;
		});
		if(target){
			target = '#' + target;
			$.fn.adsform_load(target,action,paramObj);
		}
	});
	
	$.fn.adsform_depe = function(target){
		var scope = (target != '') ? 'form.ads_form' : target + ' form.ads_form';
		
		var out = {};
		$(scope).each(function(){
			out[$(this)] = $.parseJSON($(this).find('.ads_dependencies').text());
		});
		return out;
	}
	
	$.fn.adsform = function(target){
		//var scope = (target != '') ? 'select, input, textarea' : target + ' select, ' + target + ' input, ' + target + ' textarea';
		var scope = !target ? document.body : target;
		
		//$(scope).find('select, input, textarea').each(function() {
		//	$(this).unbind()
		//})
		
		$(scope).find('select, input, textarea').each(function() {
			var attr = $(this).attr('ads_dep');
			var nameq  = $(this).attr('name');
			if(typeof(attr) != 'undefined' && $.trim(attr) != ''){
				var action;
				switch($(this).get(0).tagName.toLowerCase()) {
					case 'select': 
						action = 'change'; 
						break;
					case 'input': 
						switch($(this).attr('type')) {
							case 'text':
								action = 'blur';
								break;
							case 'hidden':
								action = 'change';
								break;
							default:
								action = 'click';
						}
						break;
					default: action = 'blur'; break;
				}
				//alert($(this).attr('name'));
				//console.log(action)
				$(this).unbind(action);
				//console.log($(this).data('events'))
				
				/*
				console.log($(this).data('events'))
				
				test = $(this).data('events')
				if (typeof (test) !== 'undefined') {
					$.each(test, function(i, o) {
						//console.log(i)
						//console.log(o)
						
						if (i == action) {
							//console.log('som tu')
							//return true
						}
					})
				}
				$(this).unbind(action)
				console.log($(this).data('events'))
				console.log('-----------------------')
				*/
				$(this).bind(action, function() {
					//alert('Binding ' + action + ' to ' + $(this).attr('name'));
					var form = this.form;
					var deps = $(this).attr('ads_dep');
					var actt = $(this);
					//alert(deps + '\n' + deps.split(",").join('\n'));
					$.each(deps.split(","), function(key, val){
						var dname = $.trim(val);
						var cond = depe[$(form)][dname].condition.toLowerCase();
						
						//alert(cond);
						var glue = (cond.substring(cond.length-2, cond.length) == 'or') ? ' || ' : ' && ';
						var condition = [];
						var inputs = {};
						$.each(depe[$(form)][dname].expressions,function(index,value){
							var flds = $(form).find('[name=' + value[0] +']');
							if (flds.length > 0) {
								//alert(flds.first().val());
								switch(flds.get(0).tagName.toLowerCase()) {
									case 'select':
										var vala = flds.first().val();
										break;
									default:
										switch(flds.first().attr('type')) {
											case 'radio':
												var vala = $(form).find('input[name$='+value[0]+']:checked').val();
												break;
											case 'checkbox':
												var vala = $(form).find('input[name$='+value[0]+']:checked').val();
												vala = (vala == 'on') ? 1:0;
												break;
											default:
												var vala = flds.first().val();
										}
								}
							}
							inputs[value[0]] = vala;
							value1 = value[1] ? value[1] : '';
							condition.push('"'+vala+'"=="'+value1+'"');
						});
						condition = '('+condition.join(glue)+')';
						//alert(condition);
						if(cond.substring(0,3) == 'not') {
							condition = '(!' + condition + ')';
						}
						//console.log(dname + '|' + cond + '|' + condition + '|' +  (eval(condition)));
						if (eval(condition)) {
							// show dependent elements on met dependency
							//alert(depe[$(form)][dname]);
							if(depe[$(form)][dname].type == 'dynamic') {
								inputs.dname = dname;
								var data = $.param(inputs);
								var uri = $(form).find('input[name$="ads_ajax_link"]').attr('value') + data;
								
								$.getJSON(uri, function(result) {
									var pyro = [];
									if (result) {
										$.each(result, function(key, val) {
											$(form).find('#' + key).each(function(){
												$(this).empty();
												switch($(this).get(0).tagName.toLowerCase()){
													case 'select':
														var opts = [];
														for(var i=0; i < val.length; i++) {
															var sel = val[i][2] == true ? ' selected="selected"' : '';
															opts.push('<option value="'+val[i][0]+'"'+sel+'>'+val[i][1]+'</option>');
														}
														$(this).html(opts.join("\n"));
														break;
													default:
														$(this).attr('value',val);
												}
											});
											pyro.push(key);
										});
									}
									// adding further field names to arra of fields to be fired
									$.each(depe[$(form)][dname].dependants,function(index,value){
										pyro.push(value);
										$(form).find('#fld_' + value).show();
									});
									
									// processing all fields in pyro array while making sure dependency is not fired twice
									var fired_deps = [];
									$.each(pyro,function(key,val){
										$(form).find('#' + val).each(function(){
											var fld = $(this);
											var attr = $(this).attr('ads_dep');
											if(typeof(attr) != 'undefined') {
												attr = $.trim(attr);
												//console.log('Field ' + val + ' has dependency ' + attr);
												//if(attr != '' && attr != dname && !($.inArray(attr,fired_deps) < 0)){
												//console.log('Kua ' + ($.inArray(attr,fired_deps) < parseInt(0)));
												$.each(attr.split(","), function(key, dep){
													if(dep != '' && dep != dname && ($.inArray(dep,fired_deps) < parseInt(0))){
														//console.log('Adding ' + attr + ' to fired dependencies');
														fired_deps.push(dep);
														fld.trigger('change');
													}
												});
											}
										});
									});
									//console.log('Fireing fields: ' + pyro.join(','));
									//console.log('Fired deps: ' + fired_deps.join(','));
								});
							} else {
								$.each(depe[$(form)][dname].dependants,function(index,value){
									//console.log('Processing static dependency ' + dname);
									$(form).find('#fld_' + value).show();
									$(form).find('#' + value).each(function(){
										//console.log('Found field ' + value);
										var fld = $(this);
										var attr = $(this).attr('ads_dep');
										//console.log('Field ' + value + ' has defined dependency ' + attr);
										if(typeof(attr) != 'undefined'){
											$.each(attr.split(","), function(key, dep){
												if ($.trim(dep) != '') {
													//console.log('Triggering change on field ' + fld.attr('name'));
													fld.trigger('change');
												}
											});
										}
									});
								});
							}
						} else {
							// hide dependent elements on dependency not met
							// traversing the dependency tree from the changed element and hiding everything bellow.
							var tohide = [];
							$.each(depe[$(form)][dname].dependants,function(index,value){
								tohide.push(value);
							});
							$.each(tohide, function(index,value) {
								$(form).find('#' + value).each(function(){
									var attr = $(this).attr('ads_dep');
									if(typeof(attr) != 'undefined' && $.trim(attr) != ''){
										$.each(attr.split(','),function(key,val){
											$.each(depe[$(form)][$.trim(val)].dependants,function(k,v){
												tohide.push(v);
											});
										});
									}
								});
							});
							$.each(tohide,function(index,value){
								$(form).find('#fld_' + value).hide();
							});
						}
					});
				});
			}
		});
		$(".ads_multirow").each(function(){
			$(this).parent().append("<textarea rows='"+$(this).attr("rel")+"' class='"+$(this).attr("class").replace("ads_multirow", "")+"' id="+$(this).attr("id")+" disabled='disabled'>"+$(this).val()+"</textarea>");
			$(this).hide();
		});
	}
	
	var depe = $.extend({}, $.fn.adsform_depe());
	
	$.fn.adsform();
	$.fn.adsform_click();
	
	window.setInterval(function() {
		$('form.ads_table .ads_reload').each(function() {
			$(this).trigger('click');
		});
	}, 30000);
});
