/**
 * Раширение функциональности Application до требования сайта Работа+ и его зеркал
 * Дополнительно функционал может добавляться/изменяться зеркалом(Application.UI)
 * Dependencies: prototypejs.org;1.6
 */

Application.load = function(){
	// CAPTCHA reloading
	$$('a.js-captcha').each(function(el){
		el.observe('click', function(ev){
			Application.System.reloadCaptcha();
		});
	});
	// popups
	$$('a.popup').each(function(link){
		var href = link.readAttribute('href');
		link.setAttribute('href', 'javascript:;');
		link.observe('click', function(event){
			var e = Event.element(event);
			new Ajax.Request(href, {
				method: 'post',
				onComplete: function(request){
					var re1 = new RegExp('<!--:title:(.*?):-->', 'ig');
					var title = e.text;
					if(re1.test(request.responseText)){
						title = RegExp.$1;
					}
					var win = new Window({
						width:640,
						height:480,
						zIndex: 100,
						resizable: false,
						title: title,
						draggable:true,
						minimizable:false,
						maximizable: false,
						closable:true
					});
					win.getContent().innerHTML = request.responseText;
					win.toFront();
					win.setDestroyOnClose();
					win.showCenter(true);
				}
			});
			return false;
		});
	});
	// "Send resume" dynamic form
	$$('a.sendmail').each(function(element){
		element.observe('click', function(event){
			var element = Event.element(event);
			var re = new RegExp('^sendmail([0-9]+)$');
			if(re.test(element.id)){
				var win = new Window({
					width: 600,
					height: 400,
					zIndex: 100,
					resizable: false,
					title: 'Отправка резюме работодателю',
					draggable: false,
					minimizable: false,
					maximizable: false,
					closable: true
				});
				win.setDestroyOnClose();
				win.setAjaxContent('/sendmail/', {
					method: 'get',
					parameters: 'id=' + RegExp.$1
				}, true, true);
				Event.stop(event);
			}
		});
	});
	// Forms validators
	$$('form.validate').each(function(el){
		// в форме может быть input с name="id" поэтому readAttribute
		new Validation(el.readAttribute('id'), {
			immediate: true
		});
	});
	// "Back" links
	$$('a.back').each(function(e){
		e.observe('click', function(event){
			history.go(-1);
		});	
	});
	// Jobs menu
	if($('category-job-container')){
		$('typeSwither1').observe('click', function(e){
			Application.UI.chType(1);
		});
		$('typeSwither2').observe('click', function(e){
			Application.UI.chType(0);
		});
		Application.UI.chType(Application.jobMenuType);
	}
	// Articles menu
	if($('category-articles-container')){
		Application.UI.initArticlesCategoryMenu(Application.articlesTopCategory);
	}
	// Trainings menu
	if($('category-trainings-container')){
		Application.UI.initTrainingsCategoryMenu(Application.trainingsTopCategory);
	}
	// Отписка от рассылок
	Try.these(function(){
		$('unsibscribe-confirm-container').observe('click', function(event){
			var target = Event.element(event);
			if(target.tagName.toLowerCase() == 'input'){
				var e = $('unsibscribe-confirm-because-text');
				if(target.id == 'because'){
					e.show();
					e.focus();
				}else{
					e.hide();
				}
			}							
		});
	});
	// menu folding
	$$('a.link_on').each(function(element){
		var re = new RegExp("^fold-([a-z0-9_-]+)");
		Element.classNames(element).each(function(className){
			if(re.test(className)){
				var id = RegExp.$1;
				element.observe('click', function(event){
					target = Event.element(event);
					$(id).toggle();
					var expiry = new Date();
					expiry.setTime(expiry.getTime() + 24*60*60*1000);
					document.cookie = 'fold' + id + '=' + escape($(id).style.display) + '; expires=' + expiry.toGMTString() + '; path=/';
				});
			}
		});
	});
	// City suggestion
	Try.these(function(){
		var _ = [];
		for(var i = 0; i<menu_jobcities.length; i++){
			if(menu_jobcities[i].marked == 0){
				_.push(menu_jobcities[i].title);
			}
		}
		new Autocompleter.Local('city_add', 'city_add_autocomplete', _, {partialSearch: true, choices: 8});
		$$('div.autocomplete').each(function(element){
			element.observe('mouseover', function(event){
				var element = Event.element(event);
				element.style.cursor = 'pointer';
			});
		});
		$('city').observe('change', function(event){
			var element = Event.element(event);
			if(element.value != '' ||  parseInt(element.value) > 0){
				$('city_add').value = '';
			}
		});
	});
	// HideOnFirstClick
	Event.observe(window, 'click', function(event){
		$$('.honfc').each(function(el){
			el.remove();
		});
	});
	// subcategory container filling
	var e = $('catSelect');
	if(e){
		var type = 0;
		e.classNames().each(function(e){
			if(/^category-(1|2|3)/.test(e)){
				type = parseInt(RegExp.$1);
			}
		});
		e.observe('change', function(event){
			var type = 0;
			var element = Event.element(event);
			element.classNames().each(function(className){
				if(/^category-(1|2|3)/.test(className)){
					type = parseInt(RegExp.$1);
				}
			});
			makeCategories(element.value, type);
		});
		var element = $('catSelect');
		if(element){
			makeCategories(element.value, type);
		}
	}
	// AJAX: события на кнопки статус/удалить/обновить/ для вакансиии/резюме/тренинги/рассылки (по селекторам)
	// 2do: есть идентичные блоки в которых отличается только bridge - можно уменьшить размер файла
	$$('table.grid').each(function(el){
		switch(true){
			case el.hasClassName('grid-subscribes'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// смена статуса
						$A(Selector.findChildElements(el, ['a.status'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								var el = Event.element(ev);
								var classNames = el.classNames().toString();
								var id = classNames.match(/id-([0-9]+)/)[1];
								if(match && el.hasClassName('id-' + id)){
									Application.AJAX.make({bridge: "Subscribes", action: "changeStatus", id: id});
								}
							});
						});
						// удаление
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(!confirm('Действительно удалить?')){
									Event.stop(ev);
									return false;
								}
								// Опрос при удалении последней подписки
								try{
									var el = $$('form table.grid-subscribes a.del');
									if(el.length == 1 && $('unsibscribe-confirm')){
										Effect.SlideUp($('form_1'));
										Effect.SlideDown($('unsibscribe-confirm'));
									}
								}catch(e){}
								var el = Event.element(ev);
								var classNames = el.classNames().toString();
								var id = classNames.match(/id-([0-9]+)/)[1];
								if(match && el.hasClassName('id-' + id)){
									Application.AJAX.make({bridge: "Subscribes", action: "removeById", id: id});
								}
							});
						});						
					}
				});
			break;
			case el.hasClassName('grid-stored-vacancy'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// удалить из сохраненных вакансий
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(confirm('Удалить?')){
									Application.AJAX.make({bridge: "Vacancy", action:"removeFromStored", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
								}
							});
						});
					}
				});
			break;
			case el.hasClassName('grid-stored-resume'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// кнопка: удалить
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(confirm('Действительно удалить?')){
									Application.AJAX.make({bridge: "Resume", action: "removeFromStored", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
								}
							});
						});
					}
				});
			break;
			case el.hasClassName('grid-vacancy'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// кнопка: изменить статус
						$A(Selector.findChildElements(el, ['a.status'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								Application.AJAX.make({bridge: "Vacancy", action: "changeStatus", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
							});
						});
						// кнопка: удалить
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(confirm('Действительно удалить?')){
									Application.AJAX.make({bridge: "Vacancy", action: "delete", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
								}
							});
						});
						// кнопка: продлить срок публикации
						$A(Selector.findChildElements(el, ['a.refresh'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								Application.AJAX.make({bridge: "Vacancy", action: "updateAddDate", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
							});
						});
					}
				});
			break;
			case el.hasClassName('grid-resume'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// кнопка: изменить статус
						$A(Selector.findChildElements(el, ['a.status'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								Application.AJAX.make({bridge: "Resume", action: "changeStatus", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
							});
						});
						// кнопка: удалить
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(confirm('Действительно удалить?')){
									Application.AJAX.make({bridge: "Resume", action: "delete", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
								}
							});
						});
						// кнопка: продлить срок публикации
						$A(Selector.findChildElements(el, ['a.refresh'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								Application.AJAX.make({bridge: "Resume", action: "updateAddDate", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
							});
						});
					}
				});
			break;
			case el.hasClassName('grid-trainings'):
				$A(el.getElementsByTagName('tr')).each(function(el){
					var match = el.id.match(/^tr([0-9]+)$/);
					if(match){
						// кнопка: изменить статус
						$A(Selector.findChildElements(el, ['a.status'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								Application.AJAX.make({bridge: "Trainings", action: "changeStatus", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
							});
						});
						// кнопка: удалить
						$A(Selector.findChildElements(el, ['a.del'])).each(function(el){
							el.addClassName('id-' + match[1]);
							el.observe('click', function(ev){
								if(confirm('Действительно удалить?')){
									Application.AJAX.make({bridge: "Trainings", action: "delete", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
								}
							});
						});
					}
				});				
			break;
			case el.hasClassName('grid-searchprofile'):
			break;
		}
	});
	// Grids checkboxes
	$$('table.grid input[type=checkbox]').each(function(el){
		if(el.value != '' && el.name != ''){
			el.observe('click', function(ev){
				var el = Event.element(ev);
				var parentNode = el.parentNode;
				while(parentNode){
					if(parentNode.tagName.toLowerCase() == 'tr'){
						if(el.checked){
							Element.addClassName(parentNode, 'checked');
						}else{
							Element.removeClassName(parentNode, 'checked');
						}
						break;
					}
					parentNode = parentNode.parentNode;
				}
			});
		}
	});
	// AJAX: добавить вакансию в сохраненные
	$$('div.javascript-ajax-vacancy a.add').each(function(el){
		el.observe('click', function(ev){
			Application.AJAX.make({bridge: "Vacancy", action: "addToStored", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
		});
	});
	// AJAX: добавить резюме в сохраненные
	$$('div.javascript-ajax-resume a.add').each(function(el){
		el.observe('click', function(ev){
			Application.AJAX.make({bridge: "Resume", action: "addToStored", id: Application.System.getIdFromElementClassNames(Event.element(ev))});
		});
	});
	// Форма быстрого поиска: перелючение разделов поиска
	$$('form#search_form input[name=type]').each(function(e){
		e.observe('click', function(ev){
			var el = Event.element(ev);
			$('search_form').action = $('x_search').href = '/' + el.value + '/search/';
		});
	});
	// Форма регистрации пользователя: переключение типа регистрируемого аккаунта
	$$('form#formRegister input[name=role]').each(function(e){
		if(!e.checked){
			e.observe('click', function(e){
				window.location = '/register/' + Event.element(e).value + '/';
			});
		}
	});
	// Node comments
	if($('comment-form')){
		Application.System.attachCommentsAJAX($('comment-form').nNodeId.value);
	}
	Application.UI.citySelection(true);
};
// ----------------------------------------------------------------------------
Application.System = {
	getIdFromElementClassNames: function(el){
		var classNames = el.classNames().toString();
		var id = classNames.match(/id-([0-9]+)/)[1];
		if(id && el.hasClassName('id-' + id)){
			return id;
		}
		return false;
	},
	reloadCaptcha: function(){
		$('captcha').src = '/captcha.gif?' + Math.round((Math.random() * (10000000 - 1)));
	},
	attachCommentsAJAX: function(nNodeId){
		$$('form#comment-form div.pager a').each(function(e, i, c){
			var match = e.href.match(/\/([0-9]+)\.html$/);
			e.observe('click', function(e){
				Application.AJAX.make({
					bridge:	'Comments',
					action:	'getByNodeId',
					id: 	nNodeId,
					page:	match[1]
				});
				Event.stop(e);
			});
		});	
	}
};
// ----------------------------------------------------------------------------
// AJAX functionality
Application.AJAX = {
	removeCheckedVacancies: function(){
		if(confirm('Вы действительно желаете удалить выбранные вакансии?!?')){
			var nodes = this._getCheckedNodes();
			nodes.each(function(node){
				node.checked = false;
				Application.AJAX.make({bridge: "Vacancy", action: "delete", id: node.value});
			});
			$('all').checked = false;
			if(nodes.length == 0){
				fAlertUnchecked();
			}else{
				//$('count_vacancy').innerHTML = parseInt(nodes.total) - parseInt(nodes.length);
			}
		}
	},
	switchCheckedVacancies: function(){
		var nodes = this._getCheckedNodes();
		nodes.each(function(node){
			node.checked = false;
			Application.AJAX.make({bridge: "Vacancy", action: "changeStatus", id: node.value});
		});
		$('all').checked = false;
		
	},
	updateCheckedVacancies: function(){
		var nodes = this._getCheckedNodes();
		nodes.each(function(node){
			node.checked = false;
			Application.AJAX.make({bridge: "Vacancy", action: "updateAddDate", id: node.value});
			
		});
		$('all').checked = false;
		
	},
	_getCheckedNodes: function(){
		var checkboxes = Form.getElements('form_1');
		var count = 0;
		var hasChecked = false;
		var nodes = new Array(); 
		checkboxes.each(function(node){
			if(node.name == 'item[]'){
				if(true == node.checked){
					nodes.push(node);
				}
				count++;
			}
		});
		nodes.total = count;
		
		return nodes;
	},
	make: function(params, onComplete){
		new Ajax.Request('/', {
			method: 'post',
			parameters: Hash.toQueryString(params),
			onComplete: function(request){
				//var method = 'on' + (params.bridge + '-' + params.action).camelize();
				Application.UI['on' + (params.bridge + '-' + params.action).camelize()](params, request.responseText.evalJSON());
			}
		});
	}
};
// ----------------------------------------------------------------------------
// Функци под конкретный внешний вид/скин(DOM, CSS)
Application.UI = {
	// "City"<->"Other city"
	citySelection: function(firstCall){
		var cityAddSelector = $$('input[name=city_add]')[0];
		if(cityAddSelector){
			var citySelector = $$('select[name=city]');
			if(citySelector.length >= 2){
				citySelector = citySelector[1];
			}
			if(citySelector.selectedIndex > 0 && cityAddSelector.value !== ''){
				cityAddSelector.value = '';
			}else if(cityAddSelector.value !== ''){
				var value = cityAddSelector.value.toLowerCase();
				var found = false;
				for(var i=0, j = citySelector.options.length; i<j; i++){
					if(value == citySelector.options[i].value.toLowerCase()){
						citySelector.selectedIndex = i;
						cityAddSelector.value = '';
						citySelector.focus();
						found = true;
						break;
					}
				}
				if(!found){
					citySelector.selectedIndex = 0;
				}
			}
			if(firstCall && cityAddSelector){
				cityAddSelector.observe('keyup', function(ev){
					var el = Event.element(ev);
					if(el.value.length > 0){
						var citySelector = $$('select[name=city]');
						if(citySelector.length >= 2){
							citySelector = citySelector[1];
						}
						citySelector.selectedIndex = 0;					
					}
					Application.UI.citySelection(false);
				});
				citySelector.observe('change', function(ev){
					Application.UI.citySelection(false);
				});
			}
		}		
	},
	setFold: function(){
		var scope = $$('a.link_on');
		scope.each(function(element){
			Element.classNames(element).each(function(className){
				var match = className.match(/^fold-([a-z0-9-]+)/);
				if(match){
					var mn = new RegExp("fold" + match[1] + "=(none|block)?", "i");
					var it = document.cookie.match(mn);
					if(it){
						$(match[1]).style.display = it[1]==''?'block':it[1];
					}
				}
			});
		});
	},
	checkElement: function(id){
		$(id).checked = !$(id).checked;
	},
	chType: function(flag){
		Application.jobCategoryId = Application.jobCategoryId ? Application.jobCategoryId : 0;
		Application.UI.showNavigation(flag, Application.jobCategoryId);
		if(flag){
			$('subName').innerHTML = 'Резюме';
			$('typeSwither1').innerHTML = 'Резюме';
			$('typeSwither2').innerHTML = '<a href="javascript:;">Вакансии</a>';
			Element.addClassName('typeSwither1', 'active');
			Element.removeClassName('typeSwither2', 'active');
		}else{
			$('subName').innerHTML = "Вакансии";
			$('typeSwither1').innerHTML = '<a href="javascript:;">Резюме</a>';
			$('typeSwither2').innerHTML = 'Вакансии';
			Element.removeClassName('typeSwither1', 'active');
			Element.addClassName('typeSwither2', 'active');
		}	
	},
	showNavigation: function(type, pid){
		$('loader').show();
		var object = false;
		if(pid > 0){
			for(var i=0; i<menu_job.length; i++){
				if(menu_job[i].id == pid){
					for(var j=0; j<menu_job[i].els.length; j++){
						menu_job[i].els[j].cache = type==1 ? menu_job[i].els[j].total_r : menu_job[i].els[j].total_v;
					}
					object = menu_job[i];
					break;
				}
			}
		}else{
			object = new Object();
			object.id = 0;
			object.title = '';
			object.els = new Array();
			for(var i=0; i<menu_job.length; i++){
				var el = new Object();
				el.cache 	= type==1 ? menu_job[i].total_r : menu_job[i].total_v;
				el.id		= menu_job[i].id;
				el.title	= menu_job[i].title;
				el.is_new	= typeof menu_job[i].is_new != 'undefined' ? menu_job[i].is_new : 0;
				object.els.push(el);
			}
		}
		Application.UI.makeJobCategoryMenu(object, type);
		$('loader').hide();
		return false;	
	},
	makeJobCategoryMenu: function(objList, type){
		var fileName = type ? "resume" : "vacancy";
		var container = $('category-job-container');
		$A(container.childNodes).each(function(child){
			container.removeChild(child);
		});

		$A(objList.els).each(function(category){
			var li = $(document.createElement('li'));
			var span = document.createElement('span');
			span.appendChild(document.createTextNode(category.cache));
			var anchor = document.createElement('a');
			anchor.appendChild(document.createTextNode(category.title));
			if(objList.id == 0){
				anchor.onclick = function(x){
					return function(){
						return Application.UI.showNavigation(type, x); 
					};
				}(category.id);
			}
			anchor.href = '/' + fileName + '/' + category.id + '/';
			if(category.is_new){
				anchor.appendChild(Builder.node('img', {
					src: '/application/skin/default/images/new.gif',
					alt: '',
					width: 26,
					height: 12
				}));
				//li.addClassName('new');
			}
			li.appendChild(span);
			li.appendChild(anchor);
			container.appendChild(li);
		});

		/*
		var fileName = type ? "resume" : "vacancy";
		var container = $('category-job-container');
		container.innerHTML = '';
		$A(objList.els).each(function(category){
			container.appendChild(Builder.node('li',[
				Builder.node('span', category.cache),
				Builder.node('a', {href: '/' + fileName + '/' + category.id + '/'}, category.title)
			]));
		});
		*/
		var subCat = $('category-job-subcat');
		if(objList.id > 0){
			var li = document.createElement('li');
			var anchor = document.createElement('a');
			li.className = "ae";

			anchor.appendChild(document.createTextNode("вернуться к списку рубрик"));
			anchor.onclick = function(event){
				Application.jobCategoryId = 0;
				return Application.UI.showNavigation(type, 0);
			};
			anchor.href="javascript:;";
			
			li.appendChild(anchor);
			container.appendChild(li);
			
			var title = subCat.getElementsByTagName('a')[0]; //и не дай Бог кто-то поставить еще одну ссылку до этой в id=category!!!
			title.href = '/' + fileName + '/' + objList.id + '/';
			title.innerHTML = objList.title;
			subCat.show();
		}else{
			subCat.hide();
		}	
	},
	initArticlesCategoryMenu: function(pid){
		var object = false;
		if(menu_publications){
			for(var i=0; i<menu_publications.length;i++){
				if(menu_publications[i].id == pid){
					var objList = menu_publications[i];
					if(menu_publications[i].els){
						var found = false;
						for(var j=0; j<menu_publications[i].els.length; j++){
							if(menu_publications[i].els[j].count>0){
								found = true;
								break;
							}						
						}
						if(!found){
							objList = false;
						}
					}
					break;
				}
			}
			if(!objList){
				objList = new Object();
				objList.id = 0;
				objList.title = '';
				objList.els = new Array();
				for(var i=0; i<menu_publications.length; i++){
					if(menu_publications[i].count > 0){
						var el = new Object();
						el.count 	= menu_publications[i].count;
						el.id		= menu_publications[i].id;
						el.title	= menu_publications[i].title;
						el.childs	= false;
						el.selected	= menu_publications[i].id == pid;
						if(menu_publications[i].els){
							for(var j=0; j<menu_publications[i].els.length; j++){
								if(menu_publications[i].els[j].count>0){
									el.childs = true;
									break;
								}						
							}
						}
						objList.els.push(el);
					}
				}
			}
		}
		if(objList){
			Application.UI.makeArticlesCategoryMenu(objList);
		}
	},
	makeArticlesCategoryMenu: function(objList){
		var fileName = 'articles';
		var holder = $('category-articles-container');
		holder.innerHTML = '';
		var bHasArticlesInSubgroup = false;
		for(var i = 0; i < objList.els.length; i++){
			if(!objList.els[i] || objList.els[i].count<=0){
				continue;
			}
			with(document){
				var newLi = createElement('li');
				var newSpan = createElement('span');
				var newA = createElement('a');
				Element.extend(newA);
			}

			newSpan.innerHTML = objList.els[i].count;
			newA.innerHTML = objList.els[i].title;

			if (objList.id == 0) {
				if(objList.els[i].childs){
					newA.onclick = function (x){
						return function () { 
							Application.UI.initArticlesCategoryMenu(x);
							return false;
						};
					}(objList.els[i].id);
				}
			}

			newA.href = '/' + fileName + '/' + objList.els[i].id + '/';
			
			if(objList.els[i].selected){
				newA.addClassName('selected');
			}

			newLi.appendChild(newSpan);
			newLi.appendChild(newA);

			holder.appendChild(newLi);
		}

		//добавляет/убирает доп сведения при переключении на подрубрику/список (это все до конца функции)
		var subCat = $('category-articles-subcat');
		if (objList.id) {
			var title = subCat.getElementsByTagName('a')[0];
			title.href = '/' + fileName + '/' + objList.id + '/';
			title.innerHTML = objList.title;
			subCat.show();
		} else {
			subCat.hide();
		}

		if(objList.id){
			with(document){
				var newLi = createElement('li');
				var newA = createElement('a');
			}
			newLi.className = "ae";
			newLi.style.cursor = "pointer";
			newA.innerHTML = "вернуться к списку рубрик";
			newA.onclick = function(){ 
				Application.UI.initArticlesCategoryMenu(0);
				return false; 
			};
			newLi.appendChild(newA);
			holder.appendChild(newLi);
		}	
	},
	initTrainingsCategoryMenu: function(pid){
		var back = true;
		var fileName = "trainings";
		var container = $('category-trainings-container');
		var objList = new Object();
		for(var i=0; i<menu_trainings.length; i++){
			if(menu_trainings[i].id == pid){
				objList = menu_trainings[i];
				$('c1').innerHTML = menu_trainings[i].title;
				break;
			}
		}

		if(!objList.els){
			back = false;
			objList.els = new Array();
			for(var i=0; i<menu_trainings.length; i++){
				var el = new Object();
				el.count 	= menu_trainings[i].count;
				el.id		= menu_trainings[i].id;
				el.title	= menu_trainings[i].title;
				objList.els.push(el);
			}
		}

		container.innerHTML = "";

		for(var i = 0; i < objList.els.length; i++){
			if (!objList.els[i]){
				continue;
			}
			with(document){
				var li = createElement('li');
				var span = createElement('span');
				var anchor = createElement('a');
			}
			span.appendChild(document.createTextNode(objList.els[i].count));
			anchor.appendChild(document.createTextNode(objList.els[i].title));
			if (!back) {
				anchor.onclick = function(x){
					return function(){
						Application.UI.initTrainingsCategoryMenu(x);
						return false;
					};
				}(objList.els[i].id);
			}

			anchor.href = '/' + fileName + '/' + objList.els[i].id + '/';

			li.appendChild(span);
			li.appendChild(anchor);

			container.appendChild(li);
		}

		//добавляет/убирает доп сведения при переключении на подрубрику/список (это все до конца функции)
		var subCat = $('category-trainings-subcat');
		if (objList.id) {
			var title = subCat.getElementsByTagName('a')[0]; //и не дай Бог кто-то поставить еще одну ссылку до этой в id=category!!!
			title.href = '/' + fileName + '/' + objList.id + '/';
			subCat.show();
		}else{
			subCat.hide();
		}

		if(back){
			with(document){
				var li = createElement('li');
				var anchor = createElement('a');
			}

			li.className = "ae";

			anchor.innerHTML = "вернуться к списку рубрик";
			anchor.href = "javascript:;";
			anchor.onclick = function () { 
				Application.UI.initTrainingsCategoryMenu(0);
				return ; 
			};
			li.appendChild(anchor);
			container.appendChild(li);
		}
	},
	pager: function(container, count, page, limit, slider, template){
		if(count < limit){
			$(container).hide();
		}else{
			var pages	= Math.ceil(count/limit);
			var slide	= Math.ceil(page/slider);
			var slides	= Math.ceil(pages/slider);
			var innerHTML = '';
			if(slide>1){
				innerHTML += '<a href="' + template.replace("%page%", ((slide-1)*slider)) + '">&laquo;</a>';
			}
			var j = Math.min(pages, slide*slider);
			var t = slide*slider;
			var i = (slide - 1)*slider + 1;
			for(; i <= j; i++) {
				if (i == page){
					innerHTML += '<div class="active' + (i <= j && page == pages ? ' lastPage timer' : '') + '">' + i + '</div>';
				}else{
					innerHTML += '<a href="' + template.replace('%page%', i) + '">' + i + '</a>';
				}
			}
			if(slide < slides){
				innerHTML += '<a href="' + template.replace("%page%", slide*slider+1) + '">&raquo;</a>';
			}
			$(container).innerHTML = innerHTML;
		}
	},
	onCommentsGetByNodeId: function(params, json){
		try{
			var container = $$('form#comment-form ul.comments')[0];
			container.innerHTML = '';
			$A(json.aResult.records).each(function(e){
				var commentNode = Builder.node('div');
				commentNode.innerHTML = e.comment;
				var el = Builder.node('li', [
				    Builder.node('div', {className:'block info'}, [
						Builder.node('span', {className:'num'}, ' '),
						Builder.node('span', e.created + ' | '),
						Builder.node('b', e.author)
					]),
					commentNode
				]);
				container.appendChild(el);
			});
		}catch(e){
			window.dump(e);
		}
		Application.UI.pager($('pages'), json.aResult.count, params.page, json.aResult.limit, 10, '/comments/' + params.id + '/%page%.html');
		Application.System.attachCommentsAJAX(params.id);
		$('comments-counter').innerHTML = '(' + json.aResult.count + ')';
		// If last page - check for new comments every 5 minuts
		var finalPage = $$('form#comment-form div.lastPage');
		if(finalPage[0]){
			if(finalPage[0].hasClassName('timer')){
				finalPage[0].removeClassName('timer');
				window.setTimeout(function(){
					var finalPage = $$('form#comment-form div.lastPage');
					if(finalPage[0]){
						if(!finalPage[0].hasClassName('timer')){
							Application.AJAX.make({
								bridge:	'Comments',
								action:	'getByNodeId',
								id: 	params.id,
								page:	params.page
							});
						}
					}
				}, 300*1000);
			}
		}
	},
	onSubscribesChangeStatus: function(params, json){
		if(!json.isError && json.aResult){
			var node = $('s' + json.aRequest.id);
			$('tr' + json.aRequest.id).toggleClassName('deleted');
			node.toggleClassName('off');
			node.toggleClassName('on');
		}
	},
	onSubscribesRemoveById: function(params, json){
		if(false == json.isError && true==json.aResult){
			Element.remove('tr' + json.aRequest.id);
			var n = parseInt($('idSubscribesCount').innerHTML);
			if(n && n>0){
				$('idSubscribesCount').innerHTML = n-1;
			}
		}		
	},
	onVacancyAddToStored: function(params, json){
		if(false == json.isError){
			$('idStoredVacancyCount').innerHTML = json.aResult.count;
			$$('div.javascript-ajax-vacancy a.id-' + json.aRequest.id).each(function(el){
				el.remove();
			});
		}
	},
	onVacancyRemoveFromStored: function(params, json){
		if(false == json.isError){
			$('idStoredVacancyCount').innerHTML = json.aResult.count;
			Element.remove('tr' + json.aRequest.id);
			// ? Скрыть таблицу если нет строк
		}
	},
	onVacancyChangeStatus:  function(params, json){
		if(!json.isError && json.aResult){
			var el = $('s' + json.aRequest.id);
			el.toggleClassName('on');
			el.toggleClassName('off');
			el.removeClassName('checked');
			var tr = $('tr' + json.aRequest.id);
			el.hasClassName('on') ? tr.removeClassName('deleted') : tr.addClassName('deleted');
			tr.removeClassName('checked');
		}
	},
	onVacancyUpdateAddDate: function(params, json){
		if(!json.isError && json.aResult){
			$('pt' + json.aRequest.id).innerHTML = json.aResult['published_till'];
			$('u' + json.aRequest.id).remove();
			$('tr' + json.aRequest.id).removeClassName('deleted');
			$('tr' + json.aRequest.id).removeClassName('checked');
			var el = $('s' + json.aRequest.id);
			el.removeClassName('off');
			el.addClassName('on');
			$('tr' + id).removeClassName('checked');
		}else if(json.aResult){
			switch(json.iError){
				case 1<<1:{
					try{
						var div = document.createElement('div');
						div = Element.extend(div);
						var duplicates = new Array();
						for(var i =0; i < json.aResult[1].length; i++){
							duplicates.push('<a href="/vacancy/' + json.aResult[1][i] + '.html">' + json.aResult[1][i] + '</a>');
						}
						div.innerHTML = div.innerHTML + 'Вакансия ' + json.aRequest.id + ' не может быть обновлена, т.к. схожа с одной из ранее добавленных (' + duplicates.join(', ') + ')';
						$('javascript-error').appendChild(div);
						$('javascript-error').show();
					}catch(ex){
						alert(ex);
					}
				}break;
			}
		}
	},
	onVacancyDelete: function(params, json){
		if(false == json.isError){
			$A(json.aRequest.id.split(',')).each(function(id){
				Element.remove('tr' + id);
				$('idVacancyCount').innerHTML = parseInt($('idVacancyCount').innerHTML)-1;			
			});
		}
	},
	onResumeAddToStored: function(params, json){
		if(false == json.isError){
			$('idStoredResumeCount').innerHTML = json.aResult.count;
			$$('div.javascript-ajax-resume a.id-' + json.aRequest.id).each(function(el){
				el.remove();
			});
		}
	},
	onResumeRemoveFromStored: function(params, json){
		if(false == json.isError){
			$('idStoredResumeCount').innerHTML = json.aResult.count;
			$('tr' + json.aRequest.id).remove();
		}
	},
	onResumeDelete: function(params, json){
		if(false == json.isError){
			$('tr' + json.aRequest.id).remove();
			$('count_resume').innerHTML = fCheckRecordSet();
		}
	},
	onResumeUpdateAddDate: function(params, json){
		if(false == json.isError){
			$('d' + json.aRequest.id).innerHTML = json.aResult;
			Element.remove($('r' + json.aRequest.id));
			Element.removeClassName($('tr' + json.aRequest.id), 'deleted');
		}	
	},
	onResumeChangeStatus: function(params, json){
		if(false == json.isError){
			$('tr' + json.aRequest.id).className = json.aResult==true ? '' : 'deleted';
			var el = $('s' + json.aRequest.id);
			el.toggleClassName('on');
			el.toggleClassName('off');
		}	
	},
	onRemoveSearchProfile: function(params, json){
		if(false == json.isError){
			Element.remove('tr' + json.aRequest.id);
			if(json.aResult.count==0){
				Element.remove('SearchProfiles');
				$('isEmpty').show();
			}
			if(json.count==10){
				$('addNew').hide();
			}else{
				if(json.count<10){
					$('addNew').show();
				}
			}
			$('idSearchProfilesCount').innerHTML = json.aResult.count;
		}				
	}, 
	onResumeRemoveSearchProfile: function(params, json){
		Application.UI.onRemoveSearchProfile(params, json);
	},
	onVacancyRemoveSearchProfile: function(params, json){
		Application.UI.onRemoveSearchProfile(params, json);
	},
	onTrainingsChangeStatus: function(params, json){
		if(false == json.isError && json.aResult==true){
			var tr = $('tr' + json.aRequest.id);
			var node = $('s' + json.aRequest.id);
			node.toggleClassName('off');
			node.toggleClassName('on');
			node.hasClassName('on') ? tr.removeClassName('deleted') : tr.addClassName('deleted');
			tr.removeClassName('checked');
		}
	},
	onTrainingsDelete: function(params, json){
		if(false == json.isError && true==json.aResult){
			Element.remove('tr' + json.aRequest.id);
			$('count').innerHTML = fCheckRecordSet();
		}
	}
};

function makeCategories(id, type){
	var categories = false;
	var childs = false;
	id = parseInt(id);
	switch(parseInt(type)){
		case 3:
			categories = menu_trainings;
		break;
		default:
			categories = typeof(menu_job) != 'undefined' ? menu_job : false;
		break;
	}
	if(id == 0){
		childs = [];
	}else if(id > 0){
		for(var i=0; i<categories.length; i++){
			if(parseInt(categories[i].id) == id){
				childs = categories[i].els;
				break;
			}
		}
	}
	if(childs){
		try{
			with($('categories_title')){
				hide();
				with($('categories')){
					innerHTML = '';
					var checked = $A( typeof posted_cats !== 'undefined' ? posted_cats : []);
					for(var i = 0; i < childs.length; ++i){
						appendChild(Builder.node('div', [
							Builder.node('input', {
								type: 'checkbox',
								id: 'ch' + childs[i]['id'],
								value: childs[i]['id'],
								name: 'cat_id[]',
								className: 'checkbox'
							}), Builder.node('label', childs[i]['title'])]));
						$('ch' + childs[i]['id']).checked = checked.indexOf(parseInt(childs[i]['id'])) >= 0;
					}
				}
				if(childs.length > 0){
					show();
				}
			}
			if(Request.cat_id){
				for(var i = 0; i < Request.cat_id.length; i++){
					$('ch' + Request.cat_id[i]).checked = true;
				}
			}
		}catch(e){}
	}
};
FastInit.addOnLoad(Application.load);