function help() {
	win = open("http://cmshelp.ignatio.eu",'openBigWin','width=780,height=600,toolbar=no,menubar=no,scrollbars=yes,copyhistory=no,status=yes,resizable=yes,toolbar=no,location=yes,scrolling=yes');
	posY = screen.availHeight;
	posX = screen.availWidth;
	win.moveTo((posX/2)-400,(posY/2)-300);
	win.focus();
	return false;
}


var addMenu = {
	elements : Array(),
	
	toggle : function (id, forced, link) {
		if (link)
			link.blur();
		var item = addMenu.find(id);
		if (!item) {
			addMenu.add(id);
			item = addMenu.find(id);
		}
		if (item) {
			if (!item.clicked && !forced) {
				new Effect.SlideDown(id, {duration:0.75, afterFinish : function () {
					coreHelper.bringToView(id);
				}});
				item.clicked = true;
			} else  {
				if (item.clicked) {
					if (forced) {
						new Effect.SlideUp(id, {duration:0.1});
					} else {
						new Effect.SlideUp(id, {duration:0.25});
					}
					item.clicked = false;
				}
			}
		}
	},
	
	find: function (id) {
  		var i = 0;
  		for(i=0;i<addMenu.elements.length;i++) {
  			if (this.elements[i].id == id) {
  				return addMenu.elements[i];
  			}
  		}
  		return null;
  	},
  	
  	add : function (id) {
  		addMenu.elements.push( {id:id, clicked:false});
  	}
}

var relationManager = {
	elements : [],
	question_delete : "",
	delete_ok : "",
	delete_cancel : "",
	text_no_data : "",
	link_delete : "",
	link_add : "",
	text_no_further_data : "",
	text_no_data : "",
	reload_search_on_add : true,
	
	list : function(id) {
		var item = relationManager.find(id);
		if (item && !item.locked) {
			var opt = {
				asynchronous:1,
	        	onComplete: function(request) {
	        		relationManager.parseResult(id, request.responseText);
		        }
			};
			item.locked = true;
			new Ajax.Request(relationManager.getURL(item, "action=list" + item.parameter+ "&from_id=" + item.from_id), opt);
		}
	},
	
	getURL : function (item, str_query) {
		if (str_query.indexOf("?") > -1) {
			return item.url + str_query;
		} else {
			return item.url + "?" + str_query;
		}
	},
	
	register : function(id, from_id, url, start_values, tpl_list, tpl_disabled_list, tpl_result, parameter) {
		relationManager.elements.push( {id:id, from_id:from_id, url:url, start_values:start_values, tpl_list:tpl_list, tpl_disabled_list:tpl_disabled_list, tpl_result:tpl_result, parameter:parameter});
	},
	
	parseResult : function (id, result) {
		try {
			json = result.evalJSON(true);
			if (json) {
				var item = relationManager.find(id);
				if (item) {
					var list = $(id + "_list");
					Element.setStyle(list, {display:'none'});
					if (json.length > 0) {
						var items = "";
						var t = new Template(item.tpl_list, /(^|.|\r|\n)(\{\{(.*?)\}\})/);
						var dt = new Template(item.tpl_disabled_list, /(^|.|\r|\n)(\{\{(.*?)\}\})/);
						for (i=0; i< json.length; i++) {
							group = json[i];
							var data = {
								var_item_title: group.name, 
								var_item_link: relationManager.link_delete,
								var_events: ' onclick="relationManager.removeConfirm(\'' + id + '\', ' + group.id + ', this);return false;"'
							};
							if (group.active) {
								items += t.evaluate(data);
							} else {
								items += dt.evaluate(data);
							}
	  					}
	  					
	  					list.innerHTML = "<ul>" + items +"</ul>";
					} else {
						list.innerHTML = "<ul><li>" + relationManager.text_no_data + "</li></ul>";
					}
					item.locked = false;
					list.show();
				}
			}
    	} catch (e) {
    		alert(e);
    	}
	},
	
	removeConfirm : function (id, group_id, link) {
		var newHTML = "";
		newHTML += relationManager.question_delete + " ";
		newHTML += '<a href="#" onclick="relationManager.clearConfirm(\''+id+'\', this);return false;" title="' + relationManager.delete_cancel + '">' +relationManager.delete_cancel+ '</a> / ';
		newHTML += '<a href="#" onclick="relationManager.remove(\''+id+'\', '+ group_id +');return false;" title="' + relationManager.delete_ok + '">' +relationManager.delete_ok+ '</a>';
		relationManager.elements[relationManager.findKey(id)].oldHTML = relationManager.changeFirstSpan(link.parentNode.parentNode, newHTML);
	},
	
	changeFirstSpan : function (node, str_new_content) {
		var str_out = "";
		for(var i=0;i<node.childNodes.length;i++) {
			if (node.childNodes[i].nodeName.toLowerCase() == "span") {
				str_out = node.childNodes[i].innerHTML;
				node.childNodes[i].innerHTML = str_new_content;
				break;
			}
		}
		return str_out;
	},
	
	clearConfirm : function(id, link) {
		relationManager.changeFirstSpan(link.parentNode.parentNode, relationManager.elements[relationManager.findKey(id)].oldHTML);
	},
	
	parseSearchResult : function (id, result) {
		try {
			json = result.evalJSON(true);
			if (json) {
				var item = relationManager.find(id);
				if (item) {
					var result = $(id + "_result");
					Element.setStyle(result, {display:'none'});
					if (json.length > 0) {
						var items = "";
						var t = new Template(item.tpl_result, /(^|.|\r|\n)(\{\{(.*?)\}\})/);
						var dt = new Template(item.tpl_disabled_list, /(^|.|\r|\n)(\{\{(.*?)\}\})/);
						for (i=0; i< json.length; i++) {
							group = json[i];
							var data = {
								var_item_title: group.name, 
								var_item_link: relationManager.link_add,
								var_events: ' onclick="relationManager.add(\'' + id + '\', ' + group.id + ', this);return false;"'
							};
							if (group.active) {
								items += t.evaluate(data);
							} else {
								items += dt.evaluate(data);
							}
	  					}
	  					result.innerHTML = "<ul>" + items +"</ul>";
					} else {
						result.innerHTML = "<ul><li>" + relationManager.text_no_further_data + "</li></ul>";
					}
					item.locked = false;
					Element.setStyle(result, {display:'block'});
					coreHelper.bringToView(result);
				}
			} else {
				result.innerHTML = "<ul><li>" + relationManager.text_no_further_data + "</li></ul>";
			}
    	} catch (e) {
    		alert(e);
    	}
	},
	
	showAddList : function (id) {
		var item = relationManager.find(id);
		if (item && !item.locked) {
			var opt = {
				asynchronous:1,
	        	onComplete: function(request) {
	        		relationManager.parseSearchResult(id, request.responseText);
		        }
			};
			item.locked = true;
			new Ajax.Request(relationManager.getURL(item, "action=search" + item.parameter+ "&from_id=" + item.from_id), opt);
		}
	},
	
	remove : function(id, to_id) {
		var item = relationManager.find(id);
		if (item && !item.locked) {
			var opt = {
				asynchronous:1,
	        	onComplete: function(request) {
	        		relationManager.parseResult(id, request.responseText);
	        		Element.setStyle(id + "_result", {display:'none'});
		        }
			};
			item.locked = true;
			new Ajax.Request(relationManager.getURL(item, "action=delete" + item.parameter+ "&from_id=" + item.from_id + "&to_id=" + to_id), opt);
		}
	},
	
	add : function(id, to_id, link) {
		var item = relationManager.find(id);
		if (item) {
			var opt = {
				asynchronous:1,
	        	onComplete: function(request) {
	        		relationManager.parseResult(id, request.responseText);
	        		if (relationManager.reload_search_on_add) {
	        			relationManager.showAddList(id);
	        		} else {
	        			var ul = $(link.parentNode.parentNode.parentNode);
	        			var li = $(link.parentNode.parentNode);
	        			if (li) {
		        			li.remove();
		        			if (!ul.down("li")) {
	    	    				$(id + "_result").innerHTML = "<ul><li>" + relationManager.text_no_further_data + "</li></ul>";
	        				}
	        			}
	        		}
		        }
			};
			item.locked = true;
			new Ajax.Request(relationManager.getURL(item, "action=add" + item.parameter+ "&from_id=" + item.from_id + "&to_id=" + to_id), opt);
		}
	},
	
	find: function (id) {
  		var i = 0;
  		for(i=0;i<relationManager.elements.length;i++) {
  			if (this.elements[i].id == id) {
  				return relationManager.elements[i];
  			}
  		}
  		return null;
  	},
  	
  	findKey : function (id) {
  		var i = 0;
  		for(i=0;i<relationManager.elements.length;i++) {
  			if (this.elements[i].id == id) {
  				return i;
  			}
  		}
  		return 0;
  	}
	
}

var popupConfirm = Class.create();
popupConfirm.prototype = {
	lang : "en",
	title : "",
	question : "",
	cancel : "",
	ok : "",
	className : "",
	initialize : function() {},
	
	show : function (url) {
		if (url != "") {
			
			curtain = Builder.node('div', {id: 'curtain'});
			curtain = $(curtain);
			curtain.setStyle({opacity:0.6, display:'block', height: getPageDimensions().pageHeight + 'px'});
			document.body.appendChild(curtain);
			
			overlay = Builder.node('div', {id: 'ignatio_overlay'});
			overlay = $(overlay);
			
			if (this.className != "") {
				confirm_container = Builder.node('div', {id: 'confirm_container', className:this.className});
			} else {
				confirm_container = Builder.node('div', {id: 'confirm_container'});
			}
			
			confirm_container = $(confirm_container);
			
			confirm_container.appendChild(Builder.node('h1', {}, this.title));
			confirm_container.appendChild(Builder.node('p', {}, this.question));
			
			button_container = Builder.node('div');
			button_container.appendChild(Builder.node('a', {href:'#', onclick:"new popupConfirm().hide('" + url + "');return false;", className:'ok ok_' + this.lang }, this.ok));
			button_container.appendChild(Builder.node('a', {href:'#', onclick:"new popupConfirm().hide('');return false;", className:'cancel cancel_' + this.lang },  this.cancel));
			
			button_container.appendChild(Builder.node('br', {className:'clear'}));
			
			confirm_container.appendChild(button_container);
			overlay.appendChild(confirm_container);
			
			document.body.appendChild(overlay);
			
			overlay.setStyle({display:'block'});
			Position.absolutize(overlay);
			
			var int_top = (getPageDimensions().windowHeight/2) - (overlay.getHeight() / 2);
			var int_left = (getPageDimensions().windowWidth/2) - (overlay.getWidth() / 2);
			var corr_width = overlay.getWidth()+1;
			var scroll_y = getPageDimensions().scrollY;
			int_top += scroll_y;
			
			overlay.setStyle({top: int_top + 'px', width: corr_width + 'px', left: int_left + 'px'});
		}
	},
	
  	hide: function (url) {
  		if ($('ignatio_overlay')) $('ignatio_overlay').remove();
  		if (url) {
  			finish = function() {
  				document.location.href = url;
  			}
  		} else {
  			finish = function () {
  				if ($('curtain')) $('curtain').remove();
  			}
  		}
  		new Effect.Fade('curtain', { duration : 0.4, afterFinish : finish });
  	}
}

var ajaxContainer = Class.create();
ajaxContainer.prototype = {
	url : "",
	width : "",
	height : "",
	className : "",
	loading : "",
	close : "",
	
	initialize : function() {},
	
	show : function () {
		if (this.url != "") {
			
			curtain = Builder.node('div', {id: 'curtain'});
			curtain = $(curtain);
			curtain.setStyle({opacity:0.6, display:'block', height: getPageDimensions().pageHeight + 'px'});
			document.body.appendChild(curtain);
			
			overlay = Builder.node('div', {id: 'ignatio_overlay'});
			overlay = $(overlay);
			
			if (this.className != "") {
				ajax_container = $(Builder.node('div', {id: 'ajax_container', className:this.className}));
			} else {
				ajax_container = $(Builder.node('div', {id: 'ajax_container'}));
			}
			if (this.width != "") {
				ajax_container.setStyle({'width': this.width});
			}
			
			if (this.height != "") {
				ajax_container.setStyle({'height': this.height});
			}
			
			ajax_container.appendChild(Builder.node('a', {href:'#', onclick:"return new ajaxContainer().hide();", className:'close' }, this.close));
			
			
			ajax_content = Builder.node('div', {id: 'ajax_content'});
			ajax_loader = Builder.node('div', {id: 'ajax_loader'}, this.loading);
			ajax_content.appendChild(ajax_loader);
			
			ajax_container.appendChild(ajax_content);
			overlay.appendChild(ajax_container);
			
			document.body.appendChild(overlay);
			
			overlay.setStyle({display:'block'});
			Position.absolutize(overlay);
			
			var int_top = (getPageDimensions().windowHeight/2) - (overlay.getHeight() / 2);
			var int_left = (getPageDimensions().windowWidth/2) - (overlay.getWidth() / 2);
			var corr_width = overlay.getWidth()+1;
			var scroll_y = getPageDimensions().scrollY;
			int_top += scroll_y;
			
			overlay.setStyle({top: int_top + 'px', width: corr_width + 'px', left: int_left + 'px'});
			
			new Ajax.Updater('ajax_content', this.url);
			
		}
		return false;
	},
	
	/*	
	*/
  	
  	hide: function() {
  		if ($('ignatio_overlay')) $('ignatio_overlay').remove();
		finish = function () {
			if ($('curtain')) $('curtain').remove();
  		}
  		new Effect.Fade('curtain', { duration : 0.4, afterFinish : finish });
  		return false;
  	},
  	
  	post : function(id) {
  		if ($(id)) {
  			var options = {
  				'method': 'post', 
  				'parameters' : $(id).serialize(true),
  				'evalScripts' : true
  			}
  			new Ajax.Updater('ajax_content', this.url, options);
  		}
  		return false;
  	}
}

var coreHelper = {
	activateFormProgress : function (name, url, id) {
		var container = $("progress_container_" + name);
		
		if (container) {
			var form = $(name);
			if (form) {
				form.style.display  = 'none';
			}
			container.show();
			new Ajax.PeriodicalUpdater("progress_" + name, url + 'form_progress.php?id=' + id, { method: 'post', frequency: 1, decay: 1.25}); 
		}
	},

	updateSelect : function (id, arr_data, value_row, title_row, active_element) {
		var select = $(id);
		if (select && arr_data.isJSON()) {
			try {
				arr_data = arr_data.evalJSON();
				//clear list
				select.childElements().each(function(option){
					option.remove();
				});
				arr_data.each(function(row) {
					var row_elements = $H(row);
	 				select.appendChild(Builder.node('option', {'value':row_elements.get(value_row)}, row_elements.get(title_row)));
				});
				select.childElements().each(function(option){
					if (option.value == active_element) {
						option.selected = "selected";
					}
				});
			} catch (e) { }
		}
	}, 
	
	updateSelectCreateOption : function (value, title, checked) {
		var options = {
			'value' : value
		}
		if (checked) {
			options.selected = "selected";
		}
		return Builder.node('option', options, title);
	},
	
	bringToView : function (id) {
		var element = $(id);
		if (element) {
			
			var dimensions = element.getDimensions();
			var offsets = element.cumulativeOffset();
			
			if (((offsets.top + 25 + dimensions.height) - getPageDimensions().scrollY) >= getPageDimensions().windowHeight - 5) {
				var offset = (getPageDimensions().windowHeight - dimensions.height - 25) * -1;
				new Effect.ScrollTo(element, {'offset' : offset});
			}
		}
	}
}
