function lazyTooltip(self, nr) {
	// if wz_tooltip not loaded
	if (!window.Tip) {
		return
	}
	var CACHE_DICT = arguments.callee.CACHE_DICT
	//var self = this;
	if (!(nr in CACHE_DICT)) {
		$(self).observe('mouseout', function() {
			this.out = true;
		})
		CACHE_DICT[nr] = false
		new Ajax.Request('/members/'+nr+'/tooltip/ajax/', {
            onSuccess: function(resp) {
			    CACHE_DICT[nr] = resp.responseText;
			    if (!self.out) {
			    	Tip(CACHE_DICT[nr] + ' ', DELAY, 0);
			    }
			},
            onFailure: function(resp) {
            	CACHE_DICT[nr] = undefined
                document.documentElement.innerHTML = resp.responseText
            }
		})
    }
    else if (CACHE_DICT[nr]) {
    	return Tip(CACHE_DICT[nr]);
    }    
}
// member tooltips cacheing container
lazyTooltip.CACHE_DICT = {}


function init_controls_tooltips(){

	var form_helper = new (function() {
		var self = this;
		
		var layer = $('id_form_helper');
		var parent_top = parseInt(layer.parentNode.offsetTop)
		
		function getTopPos() {
			var top = parseInt(window.pageYOffset || document.documentElement.scrollTop ||
			                   document.body.scrollTop || 0) - parent_top;
			return top > 0 ? top + 15 : 0;
		}
		function keepFixed() {
			return new Effect.Move(layer, {y: getTopPos(), mode: 'absolute' });
		}
		
		self.setText = function(text) {
			layer.innerHTML = text;
		}
		self.show = function() {
			layer.style.top = getTopPos() + 'px';
			Event.observe(window, 'scroll', keepFixed);
			Event.observe(window, 'resize', keepFixed);
			Effect.Appear(layer, { duration: 0.3 });
		}
		self.hide = function() {
			Event.stopObserving(window, 'scroll', keepFixed);
			Event.stopObserving(window, 'resize', keepFixed);
			layer.hide();
		}
		
	})()
	
	var controls = $$('input, select, textarea');
	
	controls.each(
	    function(control) {
			if (!control.readAttribute('id')) {
				return false;
			}
	        control.rel_id = control.readAttribute('id').replace(
	        	/^(\w+)_(\d+|year|month|day|hour|minute)$/, '$1') + '_help_text';
	        	
	        if ($(control.rel_id)) {
	        	control.observe('focus', function() {
	        		form_helper.setText($(this.rel_id).innerHTML)
	        		form_helper.show()	
	        	});
	        	control.observe('blur', function() {
	        		form_helper.hide()
	        	});
	        	
	        	control.observe('mouseover', function() {
	        		if (!window.Tip) {
	        			return
	        		}
	        		TagToTip(this.rel_id, BALLOON, true, WIDTH,200);
	        	});              
	        }           
	    }
	)
};


/**
 * Fires AJAX validation for every form element with classname 'validate'
 * wchich doesn't have enctype attribute equal to "multipart/form-data"
 * (don't serve files)
 */
Event.observe(window, 'load', function() {
	// loop used for form serialization fix
	$$('input[type=submit], input[type=image]').each(function(elem) {
		Event.observe(elem, 'click', function() {
			this.form.btnPressed = this
		}, false);
	});

	$$('form.validate').each(function(frm) {
		//if (frm.readAttribute('enctype') != "multipart/form-data") {
		if (!Form.getInputs($(frm), 'file').length) {	
			Event.observe(frm, 'submit', processForm, false);
		}
	}, false);
}, false);

/** 
 * Prototype's serialization function fix
 * (use this function instead of the one provided by prototype)
 */
function serialize(form, getHash) {
	var elements = Form.getElements(form);
	if (form.btnPressed) {
		elements = elements.findAll(function(elem) { 
			return elem == form.btnPressed || 
			(elem.type != "submit" && elem.type != "image" && elem.type != "reset"); 
		})
	}
	return Form.serializeElements(elements, getHash);
}

function makeValuesDefault(frm) {
	Form.getElements(frm).each(function(elem) {
		if (/select.*/.test(elem.type)) {
			var options = elem.getElementsByTagName("option")
			for (var i = 0; i < options.length; i++) {
				if (options[i].defaultSelected != options[i].selected) {
					options[i].defaultSelected = options[i].selected
				}
			}
		} else if (elem.type == 'radio' || elem.type == 'checkbox') {
			if (elem.checked != elem.defaultChecked) {
				elem.defaultChecked = elem.checked
			}
		} else {
			if (elem.defaultValue != elem.value) {
				elem.defaultValue = elem.value
			}
		}
	})
}


/**
 * form processing function for AJAX validation
 */
function processForm(event) {
	// variable assign used in closures
	frm = this;
	if (frm.btnPressed && /cancel|preview/.test(frm.btnPressed.name)) {
			return true;
	}
	
	makeValuesDefault(frm)
	
	function handleFunction(req) {
		
		var errors = eval('(' + req.responseText + ')');
		
		if (errors.messages) {
			var msg = errors.messages
			var ul = new Element("ul")
			var elem = $("message-items")
			for (var i = 0; i < msg.length; i++) {
				ul.insert(new Element('li').update(msg[i]))
			}
			elem.innerHTML = ""
			elem.insert(ul)
			$("messages").show()
			window.location.href = "#messages"
		}
		
		// redirect the page if needed
		if (errors.redirect) {
			window.location = errors.redirect;
		}
		
		// clear all previous error massages
		var divs = frm.getElementsByTagName("div"), div;
		for (var i = 0; i < divs.length; i++) {
			div = $(divs[i]);
			if (/id_\w+_errors/.test(div.id)) {
				div.innerHTML = '';
			}
		}
		
		var ul, li, elem;
		// creates and inserts error massages
		for (var key in errors) {
			ul = new Element('ul', {'class': 'errorlist'});
			for(i = 0; i < errors[key].length; i++) {
				li = new Element('li').update(errors[key][i]);
				ul.insert(li);
			}
			elem = $("id_" + key + "_errors");
			if (elem != null) {
				elem.insert(ul);
			}
		}
	}

	post_ajax_form(frm, handleFunction)
	
	Event.stop(event);
    return false;
}


function disableForm(frm) {
	frm.disabled_elems = [];
	var elems = frm.getElements();
	for (var i = 0; i < elems.length; i++) {
		if (!elems[i].disabled) {
			frm.disabled_elems.push(elems[i]);
			elems[i].disabled = true;
		}
	}
}

function enableForm(frm) {
	if (!frm.disabled_elems || !frm.disabled_elems.length) {
		return false;
	}
	for (var i = 0; i < frm.disabled_elems.length; i++) {
		frm.disabled_elems[i].disabled = false;
	}
}


function post_ajax_form(frm, handle_fn) {
	var url = frm.action;
	var params = serialize(frm, true);
	
	// freezes the whole form 
	disableForm(frm); //Form.disable(frm);
	
	args = {
		method: 'post',
		parameters: params,
		onSuccess: handle_fn,
		onFailure: function(resp){
			try {
				document.documentElement.innerHTML = resp.responseText;
			} catch(e) {
				document.body.innerHTML = resp.responseText;
			}
		},
		onComplete: function(req) {
			// unfreezes the form on request complete
			enableForm(frm); //Form.enable(frm);
		}
	}
	if (typeof handle_fn == "function") {
		args.onSuccess = handle_fn
	}
	var ajax = new Ajax.Request(url, args);
}


/**
 *	hide message box (used by auth system)
 */
function hide_messages() {
	var messages = $('messages');
	if (messages) {
		messages.hide();
	}
	return false
}


function move_registers(frm, target_name) {
	var inputs = $(frm).getInputs("checkbox"), row
	for (var i = 0; i < inputs.length; i++) {
		inputs[i].disabled = false;
		if (inputs[i].checked) {
			row = $('regist_' + inputs[i].value)
			if (row) {
				$(target_name).appendChild(row.remove())
			}
		}
	}
}


function move_to_waitings(frm) {
	post_ajax_form(frm, function() {
		move_registers(frm, 'waitings_list')
	})
    return false;
}


function move_to_participants(frm) {
	post_ajax_form(frm, function() {
		move_registers(frm, 'participants_list')
	})
    return false;
}