// ==== /work/units/unitDiscounts/unitDiscounts.js ==== 
function initunitDiscounts() {	
	if (tinyMCE) {
		tinyMCE.init({
			// General options
			mode : "exact",
			elements : "text",
			theme : "advanced",
		plugins : "style,advimage",

		// Theme options
		theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,",
		theme_advanced_buttons2 : "bullist,numlist,|,undo,redo,|,image,cleanup,code",
		theme_advanced_buttons3 : "",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_resizing : true,

		// Style formats
		style_formats : [
			{title : 'Bold text', inline : 'b'},
			{title : 'Red text', inline : 'span', styles : {color : '#ff0000'}},
			{title : 'Red header', block : 'h1', styles : {color : '#ff0000'}},
			{title : 'Example 1', inline : 'span', classes : 'example1'},
			{title : 'Example 2', inline : 'span', classes : 'example2'},
			{title : 'Table styles'},
			{title : 'Table row 1', selector : 'tr', classes : 'tablerow1'}
		],

		formats : {
			alignleft : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'left'},
			aligncenter : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'center'},
			alignright : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'right'},
			alignfull : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'full'},
			bold : {inline : 'span', 'classes' : 'bold'},
			italic : {inline : 'span', 'classes' : 'italic'},
			underline : {inline : 'span', 'classes' : 'underline', exact : true},
			strikethrough : {inline : 'del'}
		}
	});
	}
}

function add_skidki(obj,id){
	var div = document.createElement('DIV');
	div.innerHTML = '<div><form  method="POST" onsubmit="sendPostData(this,\'change_discounts.php\'); return false;">Заголовок<br />\n\
					<input type="text" name="title"><br />\n\
					<input type="hidden" name="new_id" value="'+id+'">\n\
					Текст<textarea name="text" cols="50" rows="10"></textarea>\n\
					<input type="submit" name="OK" value="OK">\n\
					</form><button onclick="dell_skidki(this);">Удалить</button></div>';
	obj.parentNode.appendChild(div);
}

function dell_skidki(obj){
	obj.parentNode.style.display = 'none';
}// ---- /work/units/unitDiscounts/unitDiscounts.js ---- 
// ==== /work/units/top/top.js ==== 
//Глобальные переменные
var topSpace, baner, topLine, globalLocationHelp;

//Создаёт глобальный объект(в нём div)
function initLocationInMap(obj){
   globalLocationHelp = obj;
}

//Отображает контент
function showRegLocation () {
	globalLocationHelp.show();

	regCatalogForm.reset();
	regCatalogForm.style.display = 'block';
	regCatalogInfo.style.display = 'none';
	return false;
}

function closeRegLocation () {
	globalLocationHelp.hide();
}

function createTop(obj){
  topSpace = obj;
	addHideAllFunction(hideTop);
	addShowAllFunction(showTop);
}

function hideTop() {
	topSpace.style.display = 'none';
}

function showTop() {
	topSpace.style.display = 'block';
}


function top_line(obj){
  topLine = obj;
  setTopLinePosition();
  addResizeEvent(setTopLinePosition);

}

function setTopLinePosition() {
  if(getScreenWidth() > 950){
     topLine.style.width = getScreenWidth() + 'px';
     topLine.style.height = '61px';
  }
	
}

function createBaner(obj){
  baner = obj;
	addHideAllFunction(hideBaner);
	addShowAllFunction(showBaner);
}

function hideBaner() {
	baner.style.display = 'none';
}

function showBaner() {
	baner.style.display = 'block';
}
// ---- /work/units/top/top.js ---- 
// ==== /work/units/outdoorAdvertising/outdoorAdvertising.js ==== 
function addOutdoorAdvertising(){
	var array = window.name.split(',');
	if(array[0] == 'initAddAdvertising'){
		mapPlaceDiv.ondblclick = function (e){
			var xy = searchXYmap();
		var html  = '<div style="width: 225px" class="addAdvertisingObjectInMap">\n\
					<h4>Добавить объект в указанную точку?</h4>\n\
					<form name="addXY" "return false;">\n\
					<input type="hidden" name="object_id" value="'+array[1]+'">\n\
					<input type="hidden" name="x" value="'+xy[0]+'">\n\
					<input type="hidden" name="y" value="'+xy[1]+'">\n\
					<input type="hidden" name="title" value="'+array[2]+'">\n\
					</form>\n\
					<center><button onclick="add();">Добавить</button>\n\
					<button onclick="del();">Отмена</button></center>\n\
					</div>';
			mainDiv = document.createElement('DIV'), contentDiv = document.createElement('DIV');
			mainDiv.style.background = "#CACACA";
			mainDiv.style.height = "100%";
			mainDiv.style.left = "0";
			mainDiv.style.position = "absolute";
			mainDiv.style.top = "0";
			mainDiv.style.width = "100%";
			mainDiv.style.Zindex = "998";
			mainDiv.style.opacity = "0.5";
			contentDiv.className = "content";
			contentDiv.style.width = '225px';
			var reg = /<div\s+style=.width:\s+(\d+)/
			if(reg.exec(html)){
				var arr = reg.exec(html);
				contentDiv.innerHTML = html;
				contentDiv.style.left = Math.round(getScreenWidth()/2 - (arr[1]/2)) + 'px';
				contentDiv.style.top = Math.round(getScreenHeight()/2 - ((getScreenHeight()/2)/2)) + 'px';
			}else{
				contentDiv.innerHTML = html;
				contentDiv.style.left = Math.round(getScreenWidth()/2) + 'px';
			}


			document.body.appendChild(mainDiv);
			document.body.appendChild(contentDiv);


		}
	}
	
}

//Расчёт координат на карте!!!
function searchXYmap(){
var xy = new Array();
		var center = mapController.searchCenterCell();
		var raito = Math.pow(mapController.getOptions().scaleStep, mapController.getOptions().currentScale - 1);
		xy.push(raito * (Math.floor(mousePos.x - center.x)));
		xy.push(raito * (Math.floor(mousePos.y - center.y)));
		return xy;
}

function add(){
	var x = document.addXY.x.value;
	var y = document.addXY.y.value;
	var object_id = document.addXY.object_id.value;
	var title = document.addXY.title.value;
	getUrl('/scripts/addLabelForAdvertising.php?x='+x+'&y='+y+'&object_id='+object_id+'&title='+title, function (){});
	window.name = 'deinitAddAdvertising,,';
	location = 'http://' +location.hostname+ '/outdoor_advertising.htm';
    del();
}

function del(){
	document.body.removeChild(mainDiv);
	document.body.removeChild(contentDiv);
	delete mainDiv;
	delete contentDiv;
	opacityMain = 0;
	opacityDiv = 0;
}

//Создаёт форму
function createFormAdvertising(obj,id,name){
	if(replaceBackgroundSelect()){
			obj.parentNode.style.background = '#2966BB';
	}
	getUrl('scripts/returnFormAdvertising.php?mode='+obj.getAttribute('value')+'&id='+id,outFormAdvertising);
}

//Выводит форму
function outFormAdvertising(a,b,result){
		var edit = document.getElementById('bilEdit');
		edit.innerHTML = result;
}

//Добавляет объект в базу
function addAdvertisingObject(parent_id){
	resetSelect();
	replaceBackgroundSelect();
	var values = document.advertising;
	replaceOpacityMessage(insMsgInObj('bilEdit', '<h3><center>Объект добавлен в базу</center></h3>'), 9);
	getUrlWithObject('scripts/add_object_advertising.php?name='+
		values.name.value+'&type_id=6&parent_id='+
		parent_id+'&ratio_width='+
		values.ratio_width.value+'&ratio_height='+
		values.ratio_height.value+'&size='+
		values.size.value+'&number_sides='+
    values.number_sides.value+'&additional_information='+
		values.additional_information.value+'&status='+
		values.status.value+'&value='+
		values.value.value+'&address='+
		values.address.value+'&area_id='+
		values.area_id.value+'&view='+
		values.view.value,insertRealtyAdvertising,{id:parent_id, name:values.name.value});

}

//Сохраняет отредактированные данные
function editAdvertisingObject(id){
	var values = document.advertising;
	replaceOpacityMessage(insMsgInObj('bilEdit','<h3><center>Изменения сохранены</center></h3>'), 9);
	getUrlWithObject('scripts/edit_object_advertising.php?id='+id+'&name='+
		values.name.value+'&ratio_width='+
		values.ratio_width.value+'&ratio_height='+
		values.ratio_height.value+'&number_sides='+
    values.number_sides.value+'&size='+
		values.size.value+'&additional_information='+
		values.additional_information.value+'&status='+
		values.status.value+'&value='+
		values.value.value+'&address='+
		values.address.value+'&area_id='+
		values.area_id.value,replaceThisNameAdvertising, {name: values.name.value});

}

//Изменяет прозрачность сообщения
function replaceOpacityMessage(obj, opacity){
	if(opacity > 0){
		obj.style.opacity = '0.'+opacity;
		opacity--;
		setTimeout(replaceOpacityMessage, 100, obj, opacity);
	} else if(opacity == 0){
		obj.innerHTML = '';
		obj.style.opacity = '1';
		return;
	}
}


//Меняет цвет фона всех селектов с классом "select_advertising" на белый
function replaceBackgroundSelect(){
	var array = document.getElementsByTagName('select');
	for(var i = 0; i < array.length; i++){
		if(array[i].className == 'select_advertising'){
			array[i].style.background = '#fff';
		}
	}
	return true;
}

//Сброс всех форм у которых селекты имеют класс "select_advertising"
function resetSelect(){
	var array = document.getElementsByTagName('select');
	for(var i = 0; i < array.length; i++){
		if(array[i].className == 'select_advertising'){
			array[i].parentNode.reset();
		}
	}
}

//Замена имени объекта в дереве в реальном времени
function replaceThisNameAdvertising(a, b, result, params){
			for(var i = 0; i < thisObjectAdvertising.childNodes.length; i++){
				if(thisObjectAdvertising.childNodes[i].className == 'menuEstIco2'){
					thisObjectAdvertising.childNodes[i].innerHTML = params.name;
				}
			}
}


function insMsgInObj(id,message){
     var obj = document.getElementById(id);
	 obj.innerHTML = message;
	 return obj;
}

function deletObjectAdvertising(id){
	getUrl('/scripts/deletObjectAdvertising.php?id=' + id, function (){});
}



// ---- /work/units/outdoorAdvertising/outdoorAdvertising.js ---- 
// ==== /work/units/about/about.js ==== 
var
	About;
	

function initAbout (obj) {
	About = obj;
}

function echoAbout(){
	About.show();
    return false;
}

function closeAbout(){
	About.hide();
    return false;
}// ---- /work/units/about/about.js ---- 
// ==== /work/units/unitJob/unitJob.js ==== 
function initunitJob() {
//	if (tinyMCE) {
		tinyMCE.init({
			// General options
			mode : "exact",
			elements : "text",
			theme : "advanced",
		plugins : "style,advimage",

		// Theme options
		theme_advanced_buttons1 : "forecolor,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontsizeselect",
		theme_advanced_buttons2 : "bullist,numlist,|,undo,redo,|,cleanup,code",
		theme_advanced_buttons3 : "",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_resizing : true,

		// Style formats
		style_formats : [
			{title : 'Bold text', inline : 'b'},
			{title : 'Red text', inline : 'span', styles : {color : '#ff0000'}},
			{title : 'Red header', block : 'h1', styles : {color : '#ff0000'}},
			{title : 'Example 1', inline : 'span', classes : 'example1'},
			{title : 'Example 2', inline : 'span', classes : 'example2'},
			{title : 'Table styles'},
			{title : 'Table row 1', selector : 'tr', classes : 'tablerow1'}
		],

		formats : {
			alignleft : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'left'},
			aligncenter : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'center'},
			alignright : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'right'},
			alignfull : {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes : 'full'},
			bold : {inline : 'span', 'classes' : 'bold'},
			italic : {inline : 'span', 'classes' : 'italic'},
			underline : {inline : 'span', 'classes' : 'underline', exact : true},
			strikethrough : {inline : 'del'}
		}
	});
//	}
}


//Выводит форму ввода вакансии и дерево каталога для назначения метки
function addJobToField(id){
	var form = '<form name="addJobTolabel">\n\
				Заголовок<br />\n\
				<input type="text" name="title"><br />\n\
				Текст<br />\n\
				<textarea cols="50" rows="10" name="content"></textarea>\n\
				</form><button onclick="addJob('+id+');">Добавить вакансию</button>';
	var div = document.getElementById('bilEdit');
	div.innerHTML = form;
	var div2 = document.getElementById('addJob');
	div2.innerHTML = '';
	createTreeAdminForJob(div2);
}

function AddToJobField(){
	getUrl('scripts/add_field_to_job.php?name=' + document.AddFieldToJob.add_field_to_job.value + '&type_id=3&parent_id=' + rootJobId + '&child_count=1', function (){});
}

//Добавляет модуль вакансий к метке и помещает метку в рубрику
function addJob(id){
	var values = document.addJobTolabel;
	var result = '<div>' + values.title.value + '<br />' + values.content.value + '</div>';
	getUrlWithObject('scripts/add_job_to_object.php?object_id=' + jobid + '&parent_id=' + id + '&label_id=' + joblid + '&text=' + result, insertJob, {id:id, lid:joblid});
}

//Сохраняет отредактированные данные вакансий
function uotEditFormJob(a, b, result){
	var div = document.getElementById('bilEdit');
	div.innerHTML = result;
	var div2 = document.getElementById('addJob');
	div2.innerHTML = '';
	initunitJob();
}// ---- /work/units/unitJob/unitJob.js ---- 
// ==== /work/units/unitEstate/edit_nedv.js ==== 
var globalNedvRegHelp, regNedvForm, regNedvInfo,
estOp = 1, estObj = 1, // определяеют текущий тип операции и объекта в поиске
addEstOp = 1, addEstObj = 1; // определяеют текущий тип операции и объекта в форме добавления заявки
estFormCashe = new Array(), addEstFormCashe = new Array(), // кеш для подгружаемых форм
estateAdminMode = false;


function initNedvRegHelp (obj) {
	globalNedvRegHelp = obj;
}

function closeRegNedvForm () {
	globalNedvRegHelp.hide();
}

function initRegNedvForm (obj) {
	regNedvForm = obj;
}

// вывод сообщения о сохранении заявки
function initRegNedvInfo (obj) {
	regNedvInfo = obj;
}



//Отображает окно модерирования новой заявки
function showTmpEstate(id){
	getUrl('/scripts/edit_nedv.htm?id='+id, showDiv);
}

//Удаляет новую заявку из БД и скрывает ссылку на нее
function delTmpEstate(id){
	closeKeywordsForm();
	getUrl('/scripts/del_tmp_estate.php?id='+id, function() {});
	get('d'+id).style.display = 'none';
}

function delEstate(lid){
	getUrl('/scripts/del_estate.php?lid='+lid, function() {});
}

// выводит окно добавления недвижимости при клике на "Добавить объект" в админке
function showDivAdminEstate(a, b, html) {
	showDiv(a, b, html);
	estateAdminMode = true;
	var selectOp = get('operationType').value = addEstOp;
	var selectObj = get('selectRealtyTypes').value = addEstObj;
	selectOp = 'selected';
	selectObj = 'selected';
	selectHtmlEstAdd();
	var form = get('addEstForm');
	var regNedvInfoDiv = get('regNedvInfo');
	createFormValidator(form);
}

// выводит окно добавления недвижимости при клике на "Добавить объект" в дереве админке
function showDivAdminObjEstate(a, b, html) {
	html = html.split('|');
	addEstOp = parseInt(html[0]);
	addEstObj = parseInt(html[1]);
	getUrl('scripts/nedv_admin_form.htm', showDivAdminEstate)
}

// выбор режима отправки пост запроса
function estateFormMode(form){
	if(estateAdminMode){
		sendPostDataEst(form, 'save_estate.php?admin_estate', insertRealtyObject); //после отправки вызывает функцию insertRealtyObject
		closeKeywordsForm(); //закрыть окно
	}else{
		sendPostData(form, 'save_estate.php', true, regNedvInfo); //после отправки выводит сообщение в объект regNedvInfo
	}
}
/////////////////////
// Одобрение заявки
/////////////////////

function sendPostDataEst (form, script, cb) {
	var
		inputs = form.getElementsByTagName('input'),
		textareas = form.getElementsByTagName('textarea'),
		selects = form.getElementsByTagName('select'),
		params = {},
		url = pagePath + '/scripts/' + script,
		i;
	for (i = 0; i < inputs.length; i++ ) {
		switch (inputs[i].type) {
			case'checkbox':
				params[inputs[i].name] = inputs[i].checked;
				break;
			case 'radio':
				if (inputs[i].checked) {
					params[inputs[i].name] = inputs[i].value;
				}
				break;
			default:
				params[inputs[i].name] = inputs[i].value;
				break;
		}
	}
	for (i = 0; i < textareas.length; i++ ) {
		params[textareas[i].name] = textareas[i].value;
	}
	for (i = 0; i < selects.length; i++ ) {
		params[selects[i].name] = selects[i].value;
	}
	getUrl(url, cb, 'POST', params);
	return false;
}



function addTmpEstate(form, id, parent_id, address){
	sendPostDataEst(form, 'save_estate.php?admin_estate', insertRealtyObject);
	get('d'+id).style.display = 'none';
	closeKeywordsForm();
}


// Изменение текущего типа объекта
function chngEstObj(select){
	estObj = select.value;
}
function chngEstOp(val){
	estOp = val;
}

// Подгрузка формы

// Колбэк ф-ция срабатывающая после запроса от selectHtmlEst
function estShowFrm(a,b,respons){
	get('estExtLoad').innerHTML = respons; // отобразить на странице
	estFormCashe[estOp + '-' + estObj] = respons; /// добавить в кеш
}

// Функция направляет запрос к пхп скрипту, генерирующему дополнительные поля поиска (с учетом типа операции и обекта)
// также скрывает и отображает див с выбором "Срока аренды"
function selectHtmlEst(){
	if(estOp == 1){
		get('rentSearchField').style.display = 'none';
		get('cost_suf').innerHTML = '(руб)';
	}else{
		get('rentSearchField').style.display = 'block';
		get('cost_suf').innerHTML = '(руб/мес)';
	}
	var key = estOp + '-' + estObj;
	// проверка нет ли (op,obj) в кеше
	if(typeof(estFormCashe[key]) !== 'undefined'){ // аналогично isset()
		get('estExtLoad').innerHTML = estFormCashe[key];
	}else{
		get('estExtLoad').innerHTML = '<img src="images/load.gif" style="margin-left: 97px;position: absolute;">';
		getUrl('scripts/search_est_form.php?operation=' + estOp + '&object=' + estObj, estShowFrm);
	}
}

// Ф-ция ищет в диве estateSearch все поля ввода и формирует из их имен и значений строку для гет запроса
function estFormValues(){
	var
	form = get('estateSearch'),
	inputs = form.getElementsByTagName('input'),
	selects = form.getElementsByTagName('select'),
	result = new Array();

	for (var i = 0; i < inputs.length; i++ ){
		switch (inputs[i].type) {
			case'checkbox':
				if (inputs[i].checked) {
					result[result.length] = inputs[i].name + '=' + inputs[i].value;
				}
				break;
			case 'radio':
				if (inputs[i].checked) {
					result[result.length] = inputs[i].name + '=' + inputs[i].value;
				}
				break;
			default:
				result[result.length] = inputs[i].name + '=' + inputs[i].value;
				break;
		}
	}
	for (i = 0; i < selects.length; i++ ) {
		result[result.length] = selects[i].name + '=' + selects[i].value;
	}
	return '?'+result.join('&');
}





// Изменение текущего типа объекта
function chngAddEstObj(select){
	addEstObj = select.value;
}

function chngAddEstOp(val){
	addEstOp = val.value;
	if(addEstOp == 1){
		get('cost_suf_add').innerHTML = '(руб)';
	}else{
		 get('cost_suf_add').innerHTML = '(руб/мес)';
	}
}

// Подгрузка формы

// Колбэк ф-ция срабатывающая после запроса от selectHtmlEst
function addEstShowFrm(a,b,respons){
	get('addEstExtLoad').innerHTML = respons; // отобразить на странице
	addEstFormCashe[addEstOp + '-' + addEstObj] = respons; /// добавить в кеш
}

// Функция направляет запрос к php скрипту, генерирующему дополнительные поля поиска (с учетом типа операции и обекта)
// также скрывает и отображает div с выбором "Срока аренды"
function selectHtmlEstAdd(){
	var key = addEstOp + '-' + addEstObj;
	// проверка нет ли (op-obj) в кеше
	if(typeof(addEstFormCashe[key]) !== 'undefined'){ // аналогично isset() в php
		get('addEstExtLoad').innerHTML = addEstFormCashe[key];
	}else{
		get('addEstExtLoad').innerHTML = '<img src="images/load.gif" style="margin-left: 97px;position: absolute;"><br/><br/>';
		getUrl('scripts/add_est_form.php?operation=' + addEstOp + '&object=' + addEstObj, addEstShowFrm);
	}
}
// ---- /work/units/unitEstate/edit_nedv.js ---- 
// ==== /work/units/system/math.js ==== 
function signum(number) {
	if (number < 0) return -1;
	return 1;
}

function multiplyMatr(matrixA, matrixB) {
	var rowsA = matrixA.length;
	var rowsB = matrixB.length; // == colsA
	var colsB = matrixB[0].length;
	var matrixC = new Array(rowsA);
	var i;

	for (i=0; i < rowsA; i++) {
		matrixC[i] = new Array(colsB);
	}

	for (var k=0; k < colsB; k++) {
		for (i=0; i < rowsA; i++) {
			var temp = 0;
			for (var j=0; j < rowsB; j++) {
				temp = parseFloat(temp) + matrixA[i][j] * matrixB[j][k];
			}
			matrixC[i][k] = temp;
		}
	}
	return matrixC;
}
// ---- /work/units/system/math.js ---- 
// ==== /work/units/system/classExtend.js ==== 
// ---- /work/units/system/classExtend.js ---- 
// ==== /work/units/system/sizes.js ==== 
function getSize (object) {
	if (object)	{
		return { width : object.offsetWidth, height : object.offsetHeight }
	} else {
		return false;
	}
}

function mouseCoords (event) {
	event = event || window.event;
	if (event.pageX || event.pageY) {
		return {x:event.pageX, y:event.pageY};
	}
	return { x:event.clientX + document.body.scrollLeft - document.body.clientLeft, y:event.clientY + document.body.scrollTop  - document.body.clientTop };
}

function getMouseOffset(target, event) {
	event = event || window.event;

	var docPos    = getPosition( target );
	var mousePos  = mouseCoords( event );
	return { x:mousePos.x - docPos.x, y:mousePos.y - docPos.y };
}

function getPosition (target) {
	var left = 0;
	var top  = 0;

	while (target.offsetParent) {
		left  += target.offsetLeft;
		top   += target.offsetTop;
		target = target.offsetParent;
	}
	left += target.offsetLeft;
	top  += target.offsetTop;
	return { x:left, y:top };
}

function getPositionFromParent(target, parent) {
	var left = 0;
	var top  = 0;
	while (target.parentNode) {
		if (target == parent) {
			left  -= getPosition(target).x;
			top   -= getPosition(target).y;
			return { x:left, y:top };
		}
		else
		{
			left  += getPosition(target).x;
			top   += getPosition(target).y;
		}
		target = target.parentNode;
	}
	return { x:left, y:top };
}
// ---- /work/units/system/sizes.js ---- 
// ==== /work/units/system/ajaxCall.js ==== 
function getXmlHttp () {
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (ee) { } }
	if (typeof XMLHttpRequest != 'undefined') { return new XMLHttpRequest(); }
	return false;
}

function getUrl(url, cb, method, params) {
	method = method || 'GET';
	var http = getXmlHttp();
	var params_str = '';
	http.open(method, url);
	if (method != 'GET') {
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", params.length);
		http.setRequestHeader("Connection", "close");
		
		for (var i in params) {
			if (params[i].replace) {
				params_str += i + '=' + params[i].replace(/&/gi, "amp;") + '&';
			} else {
				params_str += i + '=' + params[i] + '&';
			}
		}
	} else {params_str = null}
	http.onreadystatechange = function() { if (http.readyState == 4) { cb(http.status, http.getAllResponseHeaders(), http.responseText); }; };
	http.send(params_str);
}

function getUrlWithObject(url, cb, obj, method, params) {
	method = method || 'GET';
	var http = getXmlHttp();
	var params_str = '';
	http.open(method, url);
	if (method != 'GET') {
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", params.length);
		http.setRequestHeader("Connection", "close");

		for (var i in params) {
			if (params[i].replace) {
				params_str += i + '=' + params[i].replace(/&/gi, "amp;") + '&';
			} else {
				params_str += i + '=' + params[i] + '&';
			}
		}
	} else {params_str = null}
	http.onreadystatechange = function() { if (http.readyState == 4) { cb(http.status, http.getAllResponseHeaders(), http.responseText, obj); }; };
        http.send(params_str);
}

function ajaxBoolReply (Status, Headers, Text) {
	if (Text == '[TRUE]')	{
		return true;
	} else if (Text == '[FALSE]')	{
		return false;
	} else {
		return null;
	}
}
// ---- /work/units/system/ajaxCall.js ---- 
// ==== /work/units/system/asyncLoad.js ==== 
var fileLoadedFromFrame = false;

var uploadPrefix = 'uploadFrame';
var frameArray = Array();


function isFileForm(obj) {return (obj.nodeType == 1) && isClass(obj, 'fileForm');}
function isUploadFiles(obj) {return (obj.nodeType == 1) && isClass(obj, 'uploadFiles');}
function isFileInput(obj) {return (obj.nodeType == 1) && (obj.type.toLowerCase()=='file');}

function findFileFormContainer(obj) {
	var children = obj.childNodes;
	for (var i = 0; i < children.length; i++) {if (isFileForm(children[i])) { return children[i]; } }
	return false;
}

function findUploadFilelist(obj) {
	var children = obj.childNodes;
	for (var i = 0; i < children.length; i++) { if (isUploadFiles(children[i])) { return children[i]; } }
	return false;
}

function findFileInput(obj) {
	var children = obj.childNodes;
	for (var i = 0; i < children.length; i++) { if (isFileInput(children[i])) { return(children[i]); } }
	return false;
}

function initFileForm(obj, fileList) {
	var forms = obj.getElementsByTagName('form');	
	for (var i = 0; i < forms.length; i++) {
		var fileInput  = findFileInput(forms[i]);
		fileInput.formSender = forms[i];
		if (fileList) {
			fileInput.fileContainer  = fileList;
		}
		fileInput.onchange = fileUpload;
		var iframe = createEmptyIframe();
		obj.appendChild(iframe);
		forms[i].target = iframe.id;
		forms[i].frame = iframe;
	}
}

function fileUpload() {
	var form  = this.formSender;
	if (this.fileContainer) {
		var file  = addFileToList(this.value, this.fileContainer);
	}
	var frame = form.frame;
	frame.file = file;
	submitForm(form);
}

function addFileToList(filename, fileList) {
	var uls = fileList.getElementsByTagName('UL');
	if (uls.length == 0) {
		var ul = document.createElement('UL');
		fileList.appendChild(ul);
	}
	else {
		var ul = uls[0];
	}
	var li = document.createElement('LI');
	li.innerHTML = filename;
	ul.appendChild(li);
	return {list: ul, file: li};
}

function submitForm(obj) {
	obj.submit();
}

function createEmptyIframe() {
	var iframe  = document.createElement('IFRAME');
	iframe.id   = uploadPrefix + frameArray.length;
	iframe.name = iframe.id;
	iframe.onload = frameLoaded;
	frameArray[frameArray.length] = iframe;
	return iframe;
}

function frameLoaded() {
	if (this.file) {
		this.file.list.removeChild(this.file.file);
		fileLoadedFromFrame = true;
	}
}

function createAsyncLoad(obj) {	
	var fileFormContainer = findFileFormContainer(obj);
	var uploadFileList    = findUploadFilelist(obj);
	if (fileFormContainer) {
		initFileForm(fileFormContainer, uploadFileList);
	}
}
// ---- /work/units/system/asyncLoad.js ---- 
// ==== /work/units/system/interface.js ==== 
// JavaScript Document

function isInterfaceButton(obj) { return (obj.nodeType == 1) && isClass(obj, 'interfaceButton'); }
function isInterfaceDummy (obj) { return (obj.nodeType == 1) && isClass(obj, 'interfaceDummy'); }

function findCascadeButton(obj, object) {
	var children = object.childNodes;
	for (var i = 0; i < children.length; i++) {
		if (children[i].childNodes.length != 0) findCascadeButton(obj, children[i]);
		if (isInterfaceButton(children[i])) {obj.rollButton = children[i]; return;}
	}
}

function findCascadeDummy(obj, object) {
	var children = object.childNodes;
	for (var i = 0; i < children.length; i++) {
		if (children[i].childNodes.length != 0) findCascadeDummy(obj, children[i]);
		if (isInterfaceDummy(children[i])) {obj.dummy = children[i]; return;}
	}
}

function setButton(obj) {
	obj.onclick = function() {swapInterface(this.parent)}
}

function setDummy(obj) {
	obj.onclick = function() {swapDummy(this.parent)}
}

function initCascade(obj) {
	findCascadeButton(obj, obj);
	findCascadeDummy (obj, obj);
	if ((obj.rollButton) && (obj.dummy)) {
		var rollButton = obj.rollButton;
		var dummy      = obj.dummy;
		rollButton.parent = obj;
		dummy.parent      = obj;
		addClass (dummy, 'disabled');
		setButton(rollButton);
		setDummy (dummy);
	}
}

function swapInterface(obj) {
	addClass(obj, 'disabled');
	delClass(obj.dummy, 'disabled')
}

function swapDummy(obj) {
	addClass(obj.dummy, 'disabled');
	delClass(obj, 'disabled')
}
// ---- /work/units/system/interface.js ---- 
// ==== /work/units/system/global.js ==== 
function get (id) {
	return document.getElementById(id);
}
// ---- /work/units/system/global.js ---- 
// ==== /work/units/system/scene.js ==== 
function getHighestZIndex(elem) {
	var elems = document.getElementsByTagName(elem);
	var highest = 0;
	for (var i = 0; i < elems.length; i++) {
		var zindex=document.defaultView.getComputedStyle(elems[i],null).getPropertyValue("z-index");
      	if ((zindex > highest) && (zindex != 'auto')) {
      		highest = zindex;
		}
	}
	return highest;
}

// ---- /work/units/system/scene.js ---- 
// ==== /work/units/system/scroller.js ==== 
// JavaScript Document
function attachMouseScroller(obj, callback) {
	var closeupHandler = function() {
		var scrollerEvent = arguments[0] || window.event,
			targetElement = scrollerEvent.target || scrollerEvent.srcElement;
		if ((targetElement.parentNode.scroll) || (targetElement.scroll)) {
			callback(arguments[0]);
		}		
	}
	if (obj.addEventListener) {
		obj.addEventListener('DOMMouseScroll', closeupHandler, false);
		obj.addEventListener('mousewheel', closeupHandler, false);
	} else {
		obj.attachEvent('onmousewheel', closeupHandler);
	}
}// ---- /work/units/system/scroller.js ---- 
// ==== /work/units/system/utils.js ==== 

function getCookie(cookieName) {
	var cookie = " " + document.cookie;
	var search = " " + cookieName + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) {
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	if (setStr == "NaN") {setStr = '10';}
	return(setStr);
}

function isInteger(s) {
  return (s.toString().search(/^-?[0-9]+$/) == 0);
}

function showDiv(a, b, html) {
	var mainDiv = document.createElement('DIV'),
		contentDiv = document.createElement('DIV');
	mainDiv.className = "fon";
	contentDiv.className = "content";
	var reg = /<div\s+style=.width:\s+(\d+)/
	if(reg.exec(html)){
		var arr = reg.exec(html);
		contentDiv.innerHTML = html;
		contentDiv.style.left = Math.round(getScreenWidth()/2 - (arr[1]/2)) + 'px';
	}else{
		contentDiv.innerHTML = html;
		contentDiv.style.left = Math.round(getScreenWidth()/2) + 'px';
	}
	contentDiv.style.top = 10 + 'px';
	mainDiv.onclick = function (){
		document.body.removeChild(mainDiv);
		document.body.removeChild(contentDiv);
	}
	document.body.appendChild(mainDiv);
	document.body.appendChild(contentDiv);
}

function replaceDiv(a, b, html){
 	var div = findChildFromClass(document.body,'content');
	div.innerHTML = html;
}

function getScreenHeight(){
	var height = document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
	return height;
}

function getScreenWidth(){
	var width = document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
	return width;
}
// ---- /work/units/system/utils.js ---- 
// ==== /work/units/system/RaphaelCompiled.js ==== 
/*
 * Raphael 1.2.1 - JavaScript Vector Library
 *
 * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
//window.Raphael=(function(){var a=/[, ]+/,z=document,ab=window,h={was:"Raphael" in ab,is:ab.Raphael},Y=function(){if(Y.is(arguments[0],"array")){var e=arguments[0],E=p[ax](Y,e.splice(0,3+Y.is(e[0],W))),aA=E.set();for(var S=0,aB=e[j];S<aB;S++){var R=e[S]||{};({circle:1,rect:1,path:1,ellipse:1,text:1,image:1}[F](R.type))&&aA[c](E[R.type]().attr(R));}return aA;}return p[ax](Y,arguments);},ar={},u=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup"],aa="",X=" ",F="hasOwnProperty",az="prototype",o="setAttribute",ao="appendChild",ax="apply",j="length",ae="join",r="split",au="concat",c="push",J=parseFloat,v=parseInt,ap=Math.pow,al=Math.min,d=Math.max,C=Math.round,av=/^(?=[\da-f]$)/,W="number",af="toString",g={"clip-rect":"0 0 10e9 10e9",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},L={"clip-rect":"csv",cx:W,cy:W,fill:"colour","fill-opacity":W,"font-size":W,height:W,opacity:W,path:"path",r:W,rotation:"csv",rx:W,ry:W,scale:"csv",stroke:"colour","stroke-opacity":W,"stroke-width":W,translation:"csv",width:W,x:W,y:W},aq="replace";Y.version="1.2.1";Y.type=(ab.SVGAngle||z.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML");Y.svg=!(Y.vml=Y.type=="VML");Y._id=0;Y._oid=0;Y.fn={};Y.is=function(i,e){e=(e+aa).toLowerCase();return((e=="object"||e=="undefined")&&typeof i==e)||(i==null&&e=="null")||Object[az][af].call(i)[aq](/^\[object\s+|\]$/gi,aa).toLowerCase()==e;};Y.setWindow=function(e){ab=e;z=ab.document;};var ah=function(e){if(Y.vml){ah=V(function(S){var aA;try{var i=new ActiveXObject("htmlfile");i.write("<body>");i.close();aA=i.body;}catch(aC){aA=createPopup().document.body;}var R=aA.createTextRange();aA.style.color=S;var aB=R.queryCommandValue("ForeColor");aB=((aB&255)<<16)|(aB&65280)|((aB&16711680)>>>16);return"#"+("000000"+aB[af](16)).slice(-6);});}else{var E=z.createElement("i");E.className="Rapha\u00ebl colour picker";E.style.cssText="display:none";z.body[ao](E);ah=V(function(i){E.style.color=i;return z.defaultView.getComputedStyle(E,aa).getPropertyValue("color");});}return ah(e);};Y.hsb2rgb=V(function(aE,aC,aI){if(Y.is(aE,"object")&&"h" in aE&&"s" in aE&&"b" in aE){aI=aE.b;aC=aE.s;aE=aE.h;}var S,aA,aJ;if(aI==0){return{r:0,g:0,b:0,hex:"#000"};}if(aE>1||aC>1||aI>1){aE/=255;aC/=255;aI/=255;}var aB=~~(aE*6),aF=(aE*6)-aB,R=aI*(1-aC),E=aI*(1-(aC*aF)),aK=aI*(1-(aC*(1-aF)));S=[aI,E,R,R,aK,aI,aI][aB];aA=[aK,aI,aI,E,R,R,aK][aB];aJ=[R,R,aK,aI,aI,E,R][aB];S*=255;aA*=255;aJ*=255;var aG={r:S,g:aA,b:aJ},e=(~~S)[af](16),aD=(~~aA)[af](16),aH=(~~aJ)[af](16);e=e[aq](av,"0");aD=aD[aq](av,"0");aH=aH[aq](av,"0");aG.hex="#"+e+aD+aH;return aG;},Y);Y.rgb2hsb=V(function(e,i,aC){if(Y.is(e,"object")&&"r" in e&&"g" in e&&"b" in e){aC=e.b;i=e.g;e=e.r;}if(Y.is(e,"string")){var aE=Y.getRGB(e);e=aE.r;i=aE.g;aC=aE.b;}if(e>1||i>1||aC>1){e/=255;i/=255;aC/=255;}var aB=d(e,i,aC),E=al(e,i,aC),S,R,aA=aB;if(E==aB){return{h:0,s:0,b:aB};}else{var aD=(aB-E);R=aD/aB;if(e==aB){S=(i-aC)/aD;}else{if(i==aB){S=2+((aC-e)/aD);}else{S=4+((e-i)/aD);}}S/=6;S<0&&S++;S>1&&S--;}return{h:S,s:R,b:aA};},Y);Y._path2string=function(){var R=aa,aB;for(var E=0,S=this[j];E<S;E++){for(var e=0,aA=this[E][j];e<aA;e++){R+=this[E][e];e&&e!=aA-1&&(R+=",");}E!=S-1&&(R+=X);}return R[aq](/,(?=-)/g,aa);};function V(R,i,e){function E(){var S=Array[az].splice.call(arguments,0,arguments[j]),aB=S[ae]("\u25ba"),aA=E.cache=E.cache||{},aC=E.count=E.count||[];if(aA[F](aB)){return e?e(aA[aB]):aA[aB];}aC[j]>=1000&&delete aA[aC.shift()];aC[c](aB);aA[aB]=R[ax](i,S);return e?e(aA[aB]):aA[aB];}return E;}Y.getRGB=V(function(e){if(!e||!!((e+aa).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}e=e+aa;if(e=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1}[F](e.substring(0,2))))&&(e=ah(e));var aA,E,R,aD,aB=e.match(/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i);if(aB){if(aB[2]){aD=v(aB[2].substring(5),16);R=v(aB[2].substring(3,5),16);E=v(aB[2].substring(1,3),16);}if(aB[3]){aD=v(aB[3].substring(3)+aB[3].substring(3),16);R=v(aB[3].substring(2,3)+aB[3].substring(2,3),16);E=v(aB[3].substring(1,2)+aB[3].substring(1,2),16);}if(aB[4]){aB=aB[4][r](/\s*,\s*/);E=J(aB[0]);R=J(aB[1]);aD=J(aB[2]);}if(aB[5]){aB=aB[5][r](/\s*,\s*/);E=J(aB[0])*2.55;R=J(aB[1])*2.55;aD=J(aB[2])*2.55;}if(aB[6]){aB=aB[6][r](/\s*,\s*/);E=J(aB[0]);R=J(aB[1]);aD=J(aB[2]);return Y.hsb2rgb(E,R,aD);}if(aB[7]){aB=aB[7][r](/\s*,\s*/);E=J(aB[0])*2.55;R=J(aB[1])*2.55;aD=J(aB[2])*2.55;return Y.hsb2rgb(E,R,aD);}aB={r:E,g:R,b:aD};var i=(~~E)[af](16),S=(~~R)[af](16),aC=(~~aD)[af](16);i=i[aq](av,"0");S=S[aq](av,"0");aC=aC[aq](av,"0");aB.hex="#"+i+S+aC;return aB;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},Y);Y.getColor=function(i){var E=this.getColor.start=this.getColor.start||{h:0,s:1,b:i||0.75},e=this.hsb2rgb(E.h,E.s,E.b);E.h+=0.075;if(E.h>1){E.h=0;E.s-=0.2;E.s<=0&&(this.getColor.start={h:0,s:1,b:E.b});}return e.hex;};Y.getColor.reset=function(){delete this.start;};Y.parsePathString=V(function(e){if(!e){return null;}var E={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=[];if(Y.is(e,"array")&&Y.is(e[0],"array")){i=ac(e);}if(!i[j]){(e+aa)[aq](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(S,R,aC){var aB=[],aA=R.toLowerCase();aC[aq](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(aE,aD){aD&&aB[c](+aD);});while(aB[j]>=E[aA]){i[c]([R][au](aB.splice(0,E[aA])));if(!E[aA]){break;}}});}i[af]=Y._path2string;return i;});var H=V(function(aF){if(!aF){return{x:0,y:0,width:0,height:0};}aF=w(aF);var aC=0,aB=0,R=[],E=[];for(var S=0,aE=aF[j];S<aE;S++){if(aF[S][0]=="M"){aC=aF[S][1];aB=aF[S][2];R[c](aC);E[c](aB);}else{var aA=ag(aC,aB,aF[S][1],aF[S][2],aF[S][3],aF[S][4],aF[S][5],aF[S][6]);R=R[au](aA.min.x,aA.max.x);E=E[au](aA.min.y,aA.max.y);}}var e=al[ax](0,R),aD=al[ax](0,E);return{x:e,y:aD,width:d[ax](0,R)-e,height:d[ax](0,E)-aD};}),ac=function(aB){var R=[];if(!Y.is(aB,"array")||!Y.is(aB&&aB[0],"array")){aB=Y.parsePathString(aB);}for(var E=0,S=aB[j];E<S;E++){R[E]=[];for(var e=0,aA=aB[E][j];e<aA;e++){R[E][e]=aB[E][e];}}R[af]=Y._path2string;return R;},O=V(function(S){if(!Y.is(S,"array")||!Y.is(S&&S[0],"array")){S=Y.parsePathString(S);}var aF=[],aH=0,aG=0,aK=0,aJ=0,R=0;if(S[0][0]=="M"){aH=S[0][1];aG=S[0][2];aK=aH;aJ=aG;R++;aF[c](["M",aH,aG]);}for(var aC=R,aL=S[j];aC<aL;aC++){var e=aF[aC]=[],aI=S[aC];if(aI[0]!=aI[0].toLowerCase()){e[0]=aI[0].toLowerCase();switch(e[0]){case"a":e[1]=aI[1];e[2]=aI[2];e[3]=aI[3];e[4]=aI[4];e[5]=aI[5];e[6]=+(aI[6]-aH).toFixed(3);e[7]=+(aI[7]-aG).toFixed(3);break;case"v":e[1]=+(aI[1]-aG).toFixed(3);break;case"m":aK=aI[1];aJ=aI[2];default:for(var aB=1,aD=aI[j];aB<aD;aB++){e[aB]=+(aI[aB]-((aB%2)?aH:aG)).toFixed(3);}}}else{e=aF[aC]=[];if(aI[0]=="m"){aK=aI[1]+aH;aJ=aI[2]+aG;}for(var aA=0,E=aI[j];aA<E;aA++){aF[aC][aA]=aI[aA];}}var aE=aF[aC][j];switch(aF[aC][0]){case"z":aH=aK;aG=aJ;break;case"h":aH+=+aF[aC][aE-1];break;case"v":aG+=+aF[aC][aE-1];break;default:aH+=+aF[aC][aE-2];aG+=+aF[aC][aE-1];}}aF[af]=Y._path2string;return aF;},0,ac),n=V(function(S){if(!Y.is(S,"array")||!Y.is(S&&S[0],"array")){S=Y.parsePathString(S);}var aE=[],aG=0,aF=0,aJ=0,aI=0,R=0;if(S[0][0]=="M"){aG=+S[0][1];aF=+S[0][2];aJ=aG;aI=aF;R++;aE[0]=["M",aG,aF];}for(var aC=R,aK=S[j];aC<aK;aC++){var e=aE[aC]=[],aH=S[aC];if(aH[0]!=(aH[0]+aa).toUpperCase()){e[0]=(aH[0]+aa).toUpperCase();switch(e[0]){case"A":e[1]=aH[1];e[2]=aH[2];e[3]=aH[3];e[4]=aH[4];e[5]=aH[5];e[6]=+(aH[6]+aG);e[7]=+(aH[7]+aF);break;case"V":e[1]=+aH[1]+aF;break;case"H":e[1]=+aH[1]+aG;break;case"M":aJ=+aH[1]+aG;aI=+aH[2]+aF;default:for(var aB=1,aD=aH[j];aB<aD;aB++){e[aB]=+aH[aB]+((aB%2)?aG:aF);}}}else{for(var aA=0,E=aH[j];aA<E;aA++){aE[aC][aA]=aH[aA];}}switch(e[0]){case"Z":aG=aJ;aF=aI;break;case"H":aG=e[1];break;case"V":aF=e[1];break;default:aG=aE[aC][aE[aC][j]-2];aF=aE[aC][aE[aC][j]-1];}}aE[af]=Y._path2string;return aE;},null,ac),ay=function(i,R,e,E){return[i,R,e,E,e,E];},an=function(i,R,aB,S,e,E){var aA=1/3,aC=2/3;return[aA*i+aC*aB,aA*R+aC*S,aA*e+aC*aB,aA*E+aC*S,e,E];},y=function(aK,be,aT,aR,aL,aF,aA,aJ,bd,aM){var S=Math.PI,aQ=S*120/180,e=S/180*(+aL||0),aX=[],aU,ba=V(function(bf,bi,i){var bh=bf*Math.cos(i)-bi*Math.sin(i),bg=bf*Math.sin(i)+bi*Math.cos(i);return{x:bh,y:bg};});if(!aM){aU=ba(aK,be,-e);aK=aU.x;be=aU.y;aU=ba(aJ,bd,-e);aJ=aU.x;bd=aU.y;var E=Math.cos(S/180*aL),aH=Math.sin(S/180*aL),aZ=(aK-aJ)/2,aY=(be-bd)/2;aT=d(aT,Math.abs(aZ));aR=d(aR,Math.abs(aY));var R=aT*aT,a2=aR*aR,a4=(aF==aA?-1:1)*Math.sqrt(Math.abs((R*a2-R*aY*aY-a2*aZ*aZ)/(R*aY*aY+a2*aZ*aZ))),aO=a4*aT*aY/aR+(aK+aJ)/2,aN=a4*-aR*aZ/aT+(be+bd)/2,aE=Math.asin((be-aN)/aR),aD=Math.asin((bd-aN)/aR);aE=aK<aO?S-aE:aE;aD=aJ<aO?S-aD:aD;aE<0&&(aE=S*2+aE);aD<0&&(aD=S*2+aD);if(aA&&aE>aD){aE=aE-S*2;}if(!aA&&aD>aE){aD=aD-S*2;}}else{aE=aM[0];aD=aM[1];aO=aM[2];aN=aM[3];}var aI=aD-aE;if(Math.abs(aI)>aQ){var aP=aD,aS=aJ,aG=bd;aD=aE+aQ*(aA&&aD>aE?1:-1);aJ=aO+aT*Math.cos(aD);bd=aN+aR*Math.sin(aD);aX=y(aJ,bd,aT,aR,aL,0,aA,aS,aG,[aD,aP,aO,aN]);}aI=aD-aE;var aC=Math.cos(aE),bc=Math.sin(aE),aB=Math.cos(aD),bb=Math.sin(aD),a0=Math.tan(aI/4),a3=4/3*aT*a0,a1=4/3*aR*a0,a9=[aK,be],a8=[aK+a3*bc,be-a1*aC],a7=[aJ+a3*bb,bd-a1*aB],a5=[aJ,bd];a8[0]=2*a9[0]-a8[0];a8[1]=2*a9[1]-a8[1];if(aM){return[a8,a7,a5][au](aX);}else{aX=[a8,a7,a5][au](aX)[ae](",")[r](",");var aV=[];for(var a6=0,aW=aX[j];a6<aW;a6++){aV[a6]=a6%2?ba(aX[a6-1],aX[a6],e).y:ba(aX[a6],aX[a6+1],e).x;}return aV;}},A=V(function(i,e,aN,aL,aA,S,aC,aB,aH){var aF=ap(1-aH,3)*i+ap(1-aH,2)*3*aH*aN+(1-aH)*3*aH*aH*aA+ap(aH,3)*aC,aD=ap(1-aH,3)*e+ap(1-aH,2)*3*aH*aL+(1-aH)*3*aH*aH*S+ap(aH,3)*aB,aJ=i+2*aH*(aN-i)+aH*aH*(aA-2*aN+i),aI=e+2*aH*(aL-e)+aH*aH*(S-2*aL+e),aM=aN+2*aH*(aA-aN)+aH*aH*(aC-2*aA+aN),aK=aL+2*aH*(S-aL)+aH*aH*(aB-2*S+aL),aG=(1-aH)*i+aH*aN,aE=(1-aH)*e+aH*aL,R=(1-aH)*aA+aH*aC,E=(1-aH)*S+aH*aB;return{x:aF,y:aD,m:{x:aJ,y:aI},n:{x:aM,y:aK},start:{x:aG,y:aE},end:{x:R,y:E}};}),ag=V(function(i,e,R,E,aL,aK,aH,aE){var aJ=(aL-2*R+i)-(aH-2*aL+R),aG=2*(R-i)-2*(aL-R),aD=i-R,aB=(-aG+Math.sqrt(aG*aG-4*aJ*aD))/2/aJ,S=(-aG-Math.sqrt(aG*aG-4*aJ*aD))/2/aJ,aF=[e,aE],aI=[i,aH],aC=A(i,e,R,E,aL,aK,aH,aE,aB>0&&aB<1?aB:0),aA=A(i,e,R,E,aL,aK,aH,aE,S>0&&S<1?S:0);aI=aI[au](aC.x,aA.x);aF=aF[au](aC.y,aA.y);aJ=(aK-2*E+e)-(aE-2*aK+E);aG=2*(E-e)-2*(aK-E);aD=e-E;aB=(-aG+Math.sqrt(aG*aG-4*aJ*aD))/2/aJ;S=(-aG-Math.sqrt(aG*aG-4*aJ*aD))/2/aJ;aC=A(i,e,R,E,aL,aK,aH,aE,aB>0&&aB<1?aB:0);aA=A(i,e,R,E,aL,aK,aH,aE,S>0&&S<1?S:0);aI=aI[au](aC.x,aA.x);aF=aF[au](aC.y,aA.y);return{min:{x:al[ax](0,aI),y:al[ax](0,aF)},max:{x:d[ax](0,aI),y:d[ax](0,aF)}};}),w=V(function(aK,aF){var S=n(aK),aG=aF&&n(aF),aH={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},aB=function(aL,aM){var i,aN;if(!aL){return["C",aM.x,aM.y,aM.x,aM.y,aM.x,aM.y];}!(aL[0] in {T:1,Q:1})&&(aM.qx=aM.qy=null);switch(aL[0]){case"M":aM.X=aL[1];aM.Y=aL[2];break;case"A":aL=["C"][au](y[ax](0,[aM.x,aM.y][au](aL.slice(1))));break;case"S":i=aM.x+(aM.x-(aM.bx||aM.x));aN=aM.y+(aM.y-(aM.by||aM.y));aL=["C",i,aN][au](aL.slice(1));break;case"T":aM.qx=aM.x+(aM.x-(aM.qx||aM.x));aM.qy=aM.y+(aM.y-(aM.qy||aM.y));aL=["C"][au](an(aM.x,aM.y,aM.qx,aM.qy,aL[1],aL[2]));break;case"Q":aM.qx=aL[1];aM.qy=aL[2];aL=["C"][au](an(aM.x,aM.y,aL[1],aL[2],aL[3],aL[4]));break;case"L":aL=["C"][au](ay(aM.x,aM.y,aL[1],aL[2]));break;case"H":aL=["C"][au](ay(aM.x,aM.y,aL[1],aM.y));break;case"V":aL=["C"][au](ay(aM.x,aM.y,aM.x,aL[1]));break;case"Z":aL=["C"][au](ay(aM.x,aM.y,aM.X,aM.Y));break;}return aL;},E=function(aL,aM){if(aL[aM][j]>7){aL[aM].shift();var aN=aL[aM];while(aN[j]){aL.splice(aM++,0,["C"][au](aN.splice(0,6)));}aL.splice(aM,1);aI=d(S[j],aG&&aG[j]||0);}},R=function(aP,aO,aM,aL,aN){if(aP&&aO&&aP[aN][0]=="M"&&aO[aN][0]!="M"){aO.splice(aN,0,["M",aL.x,aL.y]);aM.bx=0;aM.by=0;aM.x=aP[aN][1];aM.y=aP[aN][2];aI=d(S[j],aG&&aG[j]||0);}};for(var aD=0,aI=d(S[j],aG&&aG[j]||0);aD<aI;aD++){S[aD]=aB(S[aD],aH);E(S,aD);aG&&(aG[aD]=aB(aG[aD],e));aG&&E(aG,aD);R(S,aG,aH,e,aD);R(aG,S,e,aH,aD);var aC=S[aD],aJ=aG&&aG[aD],aA=aC[j],aE=aG&&aJ[j];aH.x=aC[aA-2];aH.y=aC[aA-1];aH.bx=J(aC[aA-4])||aH.x;aH.by=J(aC[aA-3])||aH.y;e.bx=aG&&(J(aJ[aE-4])||e.x);e.by=aG&&(J(aJ[aE-3])||e.y);e.x=aG&&aJ[aE-2];e.y=aG&&aJ[aE-1];}return aG?[S,aG]:S;},null,ac),l=V(function(aE){var aD=[];for(var aA=0,aF=aE[j];aA<aF;aA++){var e={},aC=aE[aA].match(/^([^:]*):?([\d\.]*)/);e.color=Y.getRGB(aC[1]);if(e.color.error){return null;}e.color=e.color.hex;aC[2]&&(e.offset=aC[2]+"%");aD[c](e);}for(var aA=1,aF=aD[j]-1;aA<aF;aA++){if(!aD[aA].offset){var E=J(aD[aA-1].offset||0),R=0;for(var S=aA+1;S<aF;S++){if(aD[S].offset){R=aD[S].offset;break;}}if(!R){R=100;S=aF;}R=J(R);var aB=(R-E)/(S-aA+1);for(;aA<S;aA++){E+=aB;aD[aA].offset=E+"%";}}}return aD;}),Z=function(){var E,i,S,R,e;if(Y.is(arguments[0],"string")||Y.is(arguments[0],"object")){if(Y.is(arguments[0],"string")){E=z.getElementById(arguments[0]);}else{E=arguments[0];}if(E.tagName){if(arguments[1]==null){return{container:E,width:E.style.pixelWidth||E.offsetWidth,height:E.style.pixelHeight||E.offsetHeight};}else{return{container:E,width:arguments[1],height:arguments[2]};}}}else{if(Y.is(arguments[0],W)&&arguments[j]>3){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}return false},aj=function(e,E){var i=this;for(var R in E){if(E[F](R)&&!(R in e)){switch(typeof E[R]){case"function":(function(S){e[R]=e===i?S:function(){return S[ax](i,arguments);};})(E[R]);break;case"object":e[R]=e[R]||{};aj.call(this,e[R],E[R]);break;default:e[R]=E[R];break;}}}};if(Y.svg){ar.svgns="http://www.w3.org/2000/svg";ar.xlink="http://www.w3.org/1999/xlink";var C=function(e){return +e+(~~e===e)*0.5;};var I=function(aA){for(var E=0,R=aA[j];E<R;E++){if(aA[E][0].toLowerCase()!="a"){for(var e=1,S=aA[E][j];e<S;e++){aA[E][e]=C(aA[E][e]);}}else{aA[E][6]=C(aA[E][6]);aA[E][7]=C(aA[E][7]);}}return aA;};var am=function(E,e){if(e){for(var i in e){if(e[F](i)){E[o](i,e[i]);}}}else{return z.createElementNS(ar.svgns,E);}return false};Y[af]=function(){return"Your browser supports SVG.\nYou are running Rapha\u00ebl "+this.version;};var m=function(e,R){var i=am("path");R.canvas&&R.canvas[ao](i);var E=new ad(i,R);E.type="path";M(E,{fill:"none",stroke:"#000",path:e});return E;};var b=function(R,aI,e){var aF="linear",aC=0.5,aA=0.5,aK=R.style;aI=(aI+aa)[aq](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aL,i,aM){aF="radial";if(i&&aM){aC=J(i);aA=J(aM);if(ap(aC-0.5,2)+ap(aA-0.5,2)>0.25){aA=Math.sqrt(0.25-ap(aC-0.5,2))+0.5;}}return aa;});aI=aI[r](/\s*\-\s*/);if(aF=="linear"){var aB=aI.shift();aB=-J(aB);if(isNaN(aB)){return null;}var S=[0,0,Math.cos(aB*Math.PI/180),Math.sin(aB*Math.PI/180)],aH=1/(d(Math.abs(S[2]),Math.abs(S[3]))||1);S[2]*=aH;S[3]*=aH;if(S[2]<0){S[0]=-S[2];S[2]=0;}if(S[3]<0){S[1]=-S[3];S[3]=0;}}var aE=l(aI);if(!aE){return null;}var E=am(aF+"Gradient");E.id="r"+(Y._id++)[af](36);aF=="radial"?am(E,{fx:aC,fy:aA}):am(E,{x1:S[0],y1:S[1],x2:S[2],y2:S[3]});e.defs[ao](E);for(var aD=0,aJ=aE[j];aD<aJ;aD++){var aG=am("stop");am(aG,{offset:aE[aD].offset?aE[aD].offset:!aD?"0%":"100%","stop-color":aE[aD].color||"#fff"});E[ao](aG);}am(R,{fill:"url(#"+E.id+")",opacity:1,"fill-opacity":1});aK.fill=aa;aK.opacity=1;aK.fillOpacity=1;return 1;};var B=function(i){var e=i.getBBox();am(i.pattern,{patternTransform:Y.format("translate({0},{1})",e.x,e.y)});};var M=function(aG,aP){var aJ={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},aL=aG.node,aH=aG.attrs,aD=aG.rotate(),aA=function(aW,aV){aV=aJ[(aV+aa).toLowerCase()];if(aV){var aT=aW.attrs["stroke-width"]||"1",aR={round:aT,square:aT,butt:0}[aW.attrs["stroke-linecap"]||aP["stroke-linecap"]]||0,aU=[];var aS=aV[j];while(aS--){aU[aS]=aV[aS]*aT+((aS%2)?1:-1)*aR;}am(aL,{"stroke-dasharray":aU[ae](",")});}};J(aD)&&aG.rotate(0,true);for(var aK in aP){if(aP[F](aK)){if(!(aK in g)){continue;}var aI=aP[aK];aH[aK]=aI;switch(aK){case"href":case"title":case"target":var aN=aL.parentNode;if(aN.tagName.toLowerCase()!="a"){var R=am("a");aN.insertBefore(R,aL);R[ao](aL);aN=R;}aN.setAttributeNS(aG.paper.xlink,aK,aI);break;case"clip-rect":var i=(aI+aa)[r](a);if(i[j]==4){aG.clip&&aG.clip.parentNode.parentNode.removeChild(aG.clip.parentNode);var E=am("clipPath"),aM=am("rect");E.id="r"+(Y._id++)[af](36);am(aM,{x:i[0],y:i[1],width:i[2],height:i[3]});E[ao](aM);aG.paper.defs[ao](E);am(aL,{"clip-path":"url(#"+E.id+")"});aG.clip=aM;}if(!aI){var aO=z.getElementById(aL.getAttribute("clip-path")[aq](/(^url\(#|\)$)/g,aa));aO&&aO.parentNode.removeChild(aO);am(aL,{"clip-path":aa});delete aG.clip;}break;case"path":if(aI&&aG.type=="path"){aH.path=I(n(aI));am(aL,{d:aH.path});}break;case"width":aL[o](aK,aI);if(aH.fx){aK="x";aI=aH.x;}else{break;}case"x":if(aH.fx){aI=-aH.x-(aH.width||0);}case"rx":if(aK=="rx"&&aG.type=="rect"){break;}case"cx":aL[o](aK,C(aI));aG.pattern&&B(aG);break;case"height":aL[o](aK,aI);if(aH.fy){aK="y";aI=aH.y;}else{break;}case"y":if(aH.fy){aI=-aH.y-(aH.height||0);}case"ry":if(aK=="ry"&&aG.type=="rect"){break;}case"cy":aL[o](aK,C(aI));aG.pattern&&B(aG);break;case"r":if(aG.type=="rect"){am(aL,{rx:aI,ry:aI});}else{aL[o](aK,aI);}break;case"src":if(aG.type=="image"){aL.setAttributeNS(aG.paper.xlink,"href",aI);}break;case"stroke-width":aL.style.strokeWidth=aI;aL[o](aK,aI);if(aH["stroke-dasharray"]){aA(aG,aH["stroke-dasharray"]);}break;case"stroke-dasharray":aA(aG,aI);break;case"rotation":aD=aI;aG.rotate(aI,true);break;case"translation":var aB=(aI+aa)[r](a);aG.translate((+aB[0]+1||2)-1,(+aB[1]+1||2)-1);break;case"scale":var aB=(aI+aa)[r](a);aG.scale(+aB[0]||1,+aB[1]||+aB[0]||1,+aB[2]||null,+aB[3]||null);break;case"fill":var S=(aI+aa).match(/^url\(['"]?([^\)]+)['"]?\)$/i);if(S){var E=am("pattern"),aF=am("image");E.id="r"+(Y._id++)[af](36);am(E,{x:0,y:0,patternUnits:"userSpaceOnUse"});am(aF,{x:0,y:0});aF.setAttributeNS(aG.paper.xlink,"href",S[1]);E[ao](aF);var aQ=z.createElement("img");aQ.style.cssText="position:absolute;left:-9999em;top-9999em";aQ.onload=function(){am(E,{width:this.offsetWidth,height:this.offsetHeight});am(aF,{width:this.offsetWidth,height:this.offsetHeight});z.body.removeChild(this);ar.safari();};z.body[ao](aQ);aQ.src=S[1];aG.paper.defs[ao](E);aL.style.fill="url(#"+E.id+")";am(aL,{fill:"url(#"+E.id+")"});aG.pattern=E;aG.pattern&&B(aG);break;}if(!Y.getRGB(aI).error){delete aP.gradient;delete aH.gradient;if(!Y.is(aH.opacity,"undefined")&&Y.is(aP.opacity,"undefined")){aL.style.opacity=aH.opacity;am(aL,{opacity:aH.opacity});}if(!Y.is(aH["fill-opacity"],"undefined")&&Y.is(aP["fill-opacity"],"undefined")){aL.style.fillOpacity=aH["fill-opacity"];am(aL,{"fill-opacity":aH["fill-opacity"]});}}else{if((aG.type in {circle:1,ellipse:1}||(aI+aa).charAt(0)!="r")&&b(aL,aI,aG.paper)){aH.gradient=aI;aH.fill="none";break;}}case"stroke":aL.style[aK]=Y.getRGB(aI).hex;aL[o](aK,Y.getRGB(aI).hex);break;case"gradient":(aG.type in {circle:1,ellipse:1}||(aI+aa).charAt(0)!="r")&&b(aL,aI,aG.paper);break;case"opacity":case"fill-opacity":if(aH.gradient){var e=z.getElementById(aL.getAttribute("fill")[aq](/^url\(#|\)$/g,aa));if(e){var aC=e.getElementsByTagName("stop");aC[aC[j]-1][o]("stop-opacity",aI);}break;}default:aK=="font-size"&&(aI=v(aI,10)+"px");var aE=aK[aq](/(\-.)/g,function(aR){return aR.substring(1).toUpperCase();});aL.style[aE]=aI;aL[o](aK,aI);break;}}}t(aG,aP);J(aD)&&aG.rotate(aD,true);};var f=1.2;var t=function(e,S){if(e.type!="text"||!("text" in S||"font" in S||"font-size" in S||"x" in S||"y" in S)){return;}var aE=e.attrs,E=e.node,aG=E.firstChild?v(z.defaultView.getComputedStyle(E.firstChild,aa).getPropertyValue("font-size"),10):10;if("text" in S){while(E.firstChild){E.removeChild(E.firstChild);}var R=(S.text+aa)[r]("\n");for(var aA=0,aF=R[j];aA<aF;aA++){var aC=am("tspan");aA&&am(aC,{dy:aG*f,x:aE.x});aC[ao](z.createTextNode(R[aA]));E[ao](aC);}}else{var R=E.getElementsByTagName("tspan");for(var aA=0,aF=R[j];aA<aF;aA++){aA&&am(R[aA],{dy:aG*f,x:aE.x});}}am(E,{y:aE.y});var aB=e.getBBox(),aD=aE.y-(aB.y+aB.height/2);aD&&isFinite(aD)&&am(E,{y:aE.y+aD});};var ad=function(i,e){var R=0,E=0;this[0]=i;this.id=Y._oid++;this.node=i;i.raphael=this;this.paper=e;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};};ad[az].rotate=function(i,e,R){if(this.removed){return this;}if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][ae](X);}return this._.rt.deg;}var E=this.getBBox();i=(i+aa)[r](a);if(i[j]-1){e=J(i[1]);R=J(i[2]);}i=J(i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}(R==null)&&(e=null);this._.rt.cx=e;this._.rt.cy=R;e=e==null?E.x+E.width/2:e;R=R==null?E.y+E.height/2:R;if(this._.rt.deg){this.transformations[0]=Y.format("rotate({0} {1} {2})",this._.rt.deg,e,R);this.clip&&am(this.clip,{transform:Y.format("rotate({0} {1} {2})",-this._.rt.deg,e,R)});}else{this.transformations[0]=aa;this.clip&&am(this.clip,{transform:aa});}am(this.node,{transform:this.transformations[ae](X)});return this;};ad[az].hide=function(){!this.removed&&(this.node.style.display="none");return this;};ad[az].show=function(){!this.removed&&(this.node.style.display="");return this;};ad[az].remove=function(){this.node.parentNode.removeChild(this.node);for(var e in this){delete this[e];}this.removed=true;};ad[az].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return H(this.attrs.path);}if(this.node.style.display=="none"){this.show();var R=true;}var aC={};try{aC=this.node.getBBox();}catch(aA){}finally{aC=aC||{};}if(this.type=="text"){aC={x:aC.x,y:Infinity,width:0,height:0};for(var E=0,S=this.node.getNumberOfChars();E<S;E++){var aB=this.node.getExtentOfChar(E);(aB.y<aC.y)&&(aC.y=aB.y);(aB.y+aB.height-aC.y>aC.height)&&(aC.height=aB.y+aB.height-aC.y);(aB.x+aB.width-aC.x>aC.width)&&(aC.width=aB.x+aB.width-aC.x);}}R&&this.hide();return aC;};ad[az].attr=function(){if(this.removed){return this;}if(arguments[j]==1&&Y.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(arguments[j]==1&&Y.is(arguments[0],"array")){var e={};for(var i in arguments[0]){if(arguments[0][F](i)){e[arguments[0][i]]=this.attrs[arguments[0][i]];}}return e;}if(arguments[j]==2){var E={};E[arguments[0]]=arguments[1];M(this,E);}else{if(arguments[j]==1&&Y.is(arguments[0],"object")){M(this,arguments[0]);}}return this;};ad[az].toFront=function(){!this.removed&&this.node.parentNode[ao](this.node);return this;};ad[az].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);}return this;};ad[az].insertAfter=function(e){if(this.removed){return this;}if(e.node.nextSibling){e.node.parentNode.insertBefore(this.node,e.node.nextSibling);}else{e.node.parentNode[ao](this.node);}return this;};ad[az].insertBefore=function(e){if(this.removed){return this;}var i=e.node;i.parentNode.insertBefore(this.node,i);return this;};var D=function(i,e,aA,S){e=C(e);aA=C(aA);var R=am("circle");i.canvas&&i.canvas[ao](R);var E=new ad(R,i);E.attrs={cx:e,cy:aA,r:S,fill:"none",stroke:"#000"};E.type="circle";am(R,E.attrs);return E;};var ai=function(E,e,aC,i,aA,aB){e=C(e);aC=C(aC);var S=am("rect");E.canvas&&E.canvas[ao](S);var R=new ad(S,E);R.attrs={x:e,y:aC,width:i,height:aA,r:aB||0,rx:aB||0,ry:aB||0,fill:"none",stroke:"#000"};R.type="rect";am(S,R.attrs);return R;};var U=function(i,e,aB,aA,S){e=C(e);aB=C(aB);var R=am("ellipse");i.canvas&&i.canvas[ao](R);var E=new ad(R,i);E.attrs={cx:e,cy:aB,rx:aA,ry:S,fill:"none",stroke:"#000"};E.type="ellipse";am(R,E.attrs);return E;};var k=function(E,aB,e,aC,i,aA){var S=am("image");am(S,{x:e,y:aC,width:i,height:aA,preserveAspectRatio:"none"});S.setAttributeNS(E.xlink,"href",aB);E.canvas&&E.canvas[ao](S);var R=new ad(S,E);R.attrs={x:e,y:aC,width:i,height:aA,src:aB};R.type="image";return R;};var K=function(i,e,aA,S){var R=am("text");am(R,{x:e,y:aA,"text-anchor":"middle"});i.canvas&&i.canvas[ao](R);var E=new ad(R,i);E.attrs={x:e,y:aA,"text-anchor":"middle",text:S,font:g.font,stroke:"none",fill:"#000"};E.type="text";M(E,E.attrs);return E;};var aw=function(i,e){this.width=i||this.width;this.height=e||this.height;this.canvas[o]("width",this.width);this.canvas[o]("height",this.height);return this;};var p=function(){var R=Z[ax](null,arguments),E=R&&R.container,i=R.x,aC=R.y,S=R.width,e=R.height;if(!E){throw new Error("SVG container not found.");}ar.canvas=am("svg");var aB=ar.canvas;ar.width=S||512;ar.height=e||342;aB[o]("width",ar.width);aB[o]("height",ar.height);if(E==1){aB.style.cssText="position:absolute;left:"+i+"px;top:"+aC+"px";z.body[ao](aB);}else{if(E.firstChild){E.insertBefore(aB,E.firstChild);}else{E[ao](aB);}}E={canvas:aB};for(var aA in ar){if(ar[F](aA)){E[aA]=ar[aA];}}aj.call(E,E,Y.fn);E.clear();E.raphael=Y;return E;};ar.clear=function(){var e=this.canvas;while(e.firstChild){e.removeChild(e.firstChild);}(this.desc=am("desc"))[ao](z.createTextNode("Created with Rapha\u00ebl"));e[ao](this.desc);e[ao](this.defs=am("defs"));};ar.remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var e in this){delete this[e];}};}if(Y.vml){var ak=function(aJ){var aG=/[ahqtv]/ig,aB=n;(aJ+aa).match(aG)&&(aB=w);aG=/[clmz]/g;if(aB==n&&!(aJ+aa).match(aG)){var E={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},S=/([clmz]),?([^clmz]*)/gi,aA=/-?[^,\s-]+/g;var aF=(aJ+aa)[aq](S,function(aK,aM,i){var aL=[];i[aq](aA,function(aN){aL[c](C(aN));});return E[aM]+aL;});return aF;}var aH=aB(aJ),R,aF=[],e;for(var aD=0,aI=aH[j];aD<aI;aD++){R=aH[aD];e=(aH[aD][0]+aa).toLowerCase();e=="z"&&(e="x");for(var aC=1,aE=R[j];aC<aE;aC++){e+=C(R[aC])+(aC!=aE-1?",":aa);}aF[c](e);}return aF[ae](X);};Y[af]=function(){return"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl "+this.version;};var m=function(e,aA){var R=T("group");R.style.cssText="position:absolute;left:0;top:0;width:"+aA.width+"px;height:"+aA.height+"px";R.coordsize=aA.coordsize;R.coordorigin=aA.coordorigin;var E=T("shape"),i=E.style;i.width=aA.width+"px";i.height=aA.height+"px";E.coordsize=this.coordsize;E.coordorigin=this.coordorigin;R[ao](E);var S=new ad(E,R,aA);S.isAbsolute=true;S.type="path";S.path=[];S.Path=aa;e&&M(S,{fill:"none",stroke:"#000",path:e});aA.canvas[ao](R);return S;};var M=function(aE,aI){aE.attrs=aE.attrs||{};var aG=aE.node,aJ=aE.attrs,aB=aG.style,R,aN=aE;for(var aC in aI){if(aI[F](aC)){aJ[aC]=aI[aC];}}aI.href&&(aG.href=aI.href);aI.title&&(aG.title=aI.title);aI.target&&(aG.target=aI.target);if(aI.path&&aE.type=="path"){aJ.path=aI.path;aG.path=ak(aJ.path);}if(aI.rotation!=null){aE.rotate(aI.rotation,true);}if(aI.translation){R=(aI.translation+aa)[r](a);aE.translate(R[0],R[1]);}if(aI.scale){R=(aI.scale+aa)[r](a);aE.scale(+R[0]||1,+R[1]||+R[0]||1,+R[2]||null,+R[3]||null);}if("clip-rect" in aI){var e=(aI["clip-rect"]+aa)[r](a);if(e[j]==4){e[2]=+e[2]+(+e[0]);e[3]=+e[3]+(+e[1]);var aD=aG.clipRect||z.createElement("div"),aM=aD.style,aA=aG.parentNode;aM.clip=Y.format("rect({1}px {2}px {3}px {0}px)",e);if(!aG.clipRect){aM.position="absolute";aM.top=0;aM.left=0;aM.width=aE.paper.width+"px";aM.height=aE.paper.height+"px";aA.parentNode.insertBefore(aD,aA);aD[ao](aA);aG.clipRect=aD;}}if(!aI["clip-rect"]){aG.clipRect&&(aG.clipRect.style.clip=aa);}}if(aE.type=="image"&&aI.src){aG.src=aI.src;}if(aE.type=="image"&&aI.opacity){aG.filterOpacity=" progid:DXImageTransform.Microsoft.Alpha(opacity="+(aI.opacity*100)+")";aB.filter=(aG.filterMatrix||aa)+(aG.filterOpacity||aa);}aI.font&&(aB.font=aI.font);aI["font-family"]&&(aB.fontFamily='"'+aI["font-family"][r](",")[0][aq](/^['"]+|['"]+$/g,aa)+'"');aI["font-size"]&&(aB.fontSize=aI["font-size"]);aI["font-weight"]&&(aB.fontWeight=aI["font-weight"]);aI["font-style"]&&(aB.fontStyle=aI["font-style"]);if(aI.opacity!=null||aI["stroke-width"]!=null||aI.fill!=null||aI.stroke!=null||aI["stroke-width"]!=null||aI["stroke-opacity"]!=null||aI["fill-opacity"]!=null||aI["stroke-dasharray"]!=null||aI["stroke-miterlimit"]!=null||aI["stroke-linejoin"]!=null||aI["stroke-linecap"]!=null){aG=aE.shape||aG;var aH=(aG.getElementsByTagName("fill")&&aG.getElementsByTagName("fill")[0]),aK=false;!aH&&(aK=aH=T("fill"));if("fill-opacity" in aI||"opacity" in aI){var i=((+aJ["fill-opacity"]+1||2)-1)*((+aJ.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);aH.opacity=i;}aI.fill&&(aH.on=true);if(aH.on==null||aI.fill=="none"){aH.on=false;}if(aH.on&&aI.fill){var E=aI.fill.match(/^url\(([^\)]+)\)$/i);if(E){aH.src=E[1];aH.type="tile";}else{aH.color=Y.getRGB(aI.fill).hex;aH.src=aa;aH.type="solid";if(Y.getRGB(aI.fill).error&&(aN.type in {circle:1,ellipse:1}||(aI.fill+aa).charAt(0)!="r")&&b(aN,aI.fill)){aJ.fill="none";aJ.gradient=aI.fill;}}}aK&&aG[ao](aH);var S=(aG.getElementsByTagName("stroke")&&aG.getElementsByTagName("stroke")[0]),aL=false;!S&&(aL=S=T("stroke"));if((aI.stroke&&aI.stroke!="none")||aI["stroke-width"]||aI["stroke-opacity"]!=null||aI["stroke-dasharray"]||aI["stroke-miterlimit"]||aI["stroke-linejoin"]||aI["stroke-linecap"]){S.on=true;}(aI.stroke=="none"||S.on==null||aI.stroke==0||aI["stroke-width"]==0)&&(S.on=false);S.on&&aI.stroke&&(S.color=Y.getRGB(aI.stroke).hex);var i=((+aJ["stroke-opacity"]+1||2)-1)*((+aJ.opacity+1||2)-1);i<0&&(i=0);i>1&&(i=1);S.opacity=i;aI["stroke-linejoin"]&&(S.joinstyle=aI["stroke-linejoin"]||"miter");S.miterlimit=aI["stroke-miterlimit"]||8;aI["stroke-linecap"]&&(S.endcap={butt:"flat",square:"square",round:"round"}[aI["stroke-linecap"]]||"miter");aI["stroke-width"]&&(S.weight=(J(aI["stroke-width"])||1)*12/16);if(aI["stroke-dasharray"]){var aF={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};S.dashstyle=aF[aI["stroke-dasharray"]]||aa;}aL&&aG[ao](S);}if(aN.type=="text"){var aB=aN.paper.span.style;aJ.font&&(aB.font=aJ.font);aJ["font-family"]&&(aB.fontFamily=aJ["font-family"]);aJ["font-size"]&&(aB.fontSize=aJ["font-size"]);aJ["font-weight"]&&(aB.fontWeight=aJ["font-weight"]);aJ["font-style"]&&(aB.fontStyle=aJ["font-style"]);aN.node.string&&(aN.paper.span.innerHTML=(aN.node.string+aa)[aq](/</g,"&#60;")[aq](/&/g,"&#38;")[aq](/\n/g,"<br>"));aN.W=aJ.w=aN.paper.span.offsetWidth;aN.H=aJ.h=aN.paper.span.offsetHeight;aN.X=aJ.x;aN.Y=aJ.y+C(aN.H/2);switch(aJ["text-anchor"]){case"start":aN.node.style["v-text-align"]="left";aN.bbx=C(aN.W/2);break;case"end":aN.node.style["v-text-align"]="right";aN.bbx=-C(aN.W/2);break;default:aN.node.style["v-text-align"]="center";break;}}};var b=function(e,aC){e.attrs=e.attrs||{};var aD=e.attrs,aF=e.node.getElementsByTagName("fill"),aA="linear",aB=".5 .5";e.attrs.gradient=aC;aC=(aC+aa)[aq](/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,function(aH,aI,i){aA="radial";if(aI&&i){aI=J(aI);i=J(i);if(ap(aI-0.5,2)+ap(i-0.5,2)>0.25){i=Math.sqrt(0.25-ap(aI-0.5,2))+0.5;}aB=aI+X+i;}return aa;});aC=aC[r](/\s*\-\s*/);if(aA=="linear"){var E=aC.shift();E=-J(E);if(isNaN(E)){return null;}}var S=l(aC);if(!S){return null;}e=e.shape||e.node;aF=aF[0]||T("fill");if(S[j]){aF.on=true;aF.method="none";aF.type=(aA=="radial")?"gradientradial":"gradient";aF.color=S[0].color;aF.color2=S[S[j]-1].color;var aG=[];for(var R=0,aE=S[j];R<aE;R++){S[R].offset&&aG[c](S[R].offset+X+S[R].color);}aF.colors.value=aG[j]?aG[ae](","):"0% "+aF.color;if(aA=="radial"){aF.focus="100%";aF.focussize=aB;aF.focusposition=aB;}else{aF.angle=(270-E)%360;}}return 1;};var ad=function(S,aB,e){var aA=0,E=0,i=0,R=1;this[0]=S;this.id=Y._oid++;this.node=S;S.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=aB;this.paper=e;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};};ad[az].rotate=function(i,e,E){if(this.removed){return this;}if(i==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][ae](X);}return this._.rt.deg;}i=(i+aa)[r](a);if(i[j]-1){e=J(i[1]);E=J(i[2]);}i=J(i[0]);if(e!=null){this._.rt.deg=i;}else{this._.rt.deg+=i;}E==null&&(e=null);this._.rt.cx=e;this._.rt.cy=E;this.setBox(this.attrs,e,E);this.Group.style.rotation=this._.rt.deg;return this;};ad[az].setBox=function(aA,aB,S){if(this.removed){return this;}var E=this.Group.style,aC=(this.shape&&this.shape.style)||this.node.style;aA=aA||{};for(var aD in aA){if(aA[F](aD)){this.attrs[aD]=aA[aD];}}aB=aB||this._.rt.cx;S=S||this._.rt.cy;var aG=this.attrs,aJ,aI,aK,aF;switch(this.type){case"circle":aJ=aG.cx-aG.r;aI=aG.cy-aG.r;aK=aF=aG.r*2;break;case"ellipse":aJ=aG.cx-aG.rx;aI=aG.cy-aG.ry;aK=aG.rx*2;aF=aG.ry*2;break;case"rect":case"image":aJ=+aG.x;aI=+aG.y;aK=aG.width||0;aF=aG.height||0;break;case"text":this.textpath.v=["m",C(aG.x),", ",C(aG.y-2),"l",C(aG.x)+1,", ",C(aG.y-2)][ae](aa);aJ=aG.x-C(this.W/2);aI=aG.y-this.H/2;aK=this.W;aF=this.H;break;case"path":if(!this.attrs.path){aJ=0;aI=0;aK=this.paper.width;aF=this.paper.height;}else{var aE=H(this.attrs.path);aJ=aE.x;aI=aE.y;aK=aE.width;aF=aE.height;}break;default:aJ=0;aI=0;aK=this.paper.width;aF=this.paper.height;break;}aB=(aB==null)?aJ+aK/2:aB;S=(S==null)?aI+aF/2:S;var R=aB-this.paper.width/2,aH=S-this.paper.height/2;if(this.type=="path"||this.type=="text"){(E.left!=R+"px")&&(E.left=R+"px");(E.top!=aH+"px")&&(E.top=aH+"px");this.X=this.type=="text"?aJ:-R;this.Y=this.type=="text"?aI:-aH;this.W=aK;this.H=aF;(aC.left!=-R+"px")&&(aC.left=-R+"px");(aC.top!=-aH+"px")&&(aC.top=-aH+"px");}else{(E.left!=R+"px")&&(E.left=R+"px");(E.top!=aH+"px")&&(E.top=aH+"px");this.X=aJ;this.Y=aI;this.W=aK;this.H=aF;(E.width!=this.paper.width+"px")&&(E.width=this.paper.width+"px");(E.height!=this.paper.height+"px")&&(E.height=this.paper.height+"px");(aC.left!=aJ-R+"px")&&(aC.left=aJ-R+"px");(aC.top!=aI-aH+"px")&&(aC.top=aI-aH+"px");(aC.width!=aK+"px")&&(aC.width=aK+"px");(aC.height!=aF+"px")&&(aC.height=aF+"px");var aL=(+aA.r||0)/(al(aK,aF));if(this.type=="rect"&&this.arcsize!=aL&&(aL||this.arcsize)){var e=T(aL?"roundrect":"rect");e.arcsize=aL;this.Group[ao](e);this.node.parentNode.removeChild(this.node);this.node=e;this.arcsize=aL;this.attr(this.attrs);}}return false};ad[az].hide=function(){!this.removed&&(this.Group.style.display="none");return this;};ad[az].show=function(){!this.removed&&(this.Group.style.display="block");return this;};ad[az].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return H(this.attrs.path);}return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H};};ad[az].remove=function(){this.node.parentNode.removeChild(this[0]);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var e in this){delete this[e];}this.removed=true;};ad[az].attr=function(){if(this.removed){return this;}if(arguments[j]==1&&Y.is(arguments[0],"string")){if(arguments[0]=="translation"){return this.translate();}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}return this.attrs[arguments[0]];}if(this.attrs&&arguments[j]==1&&Y.is(arguments[0],"array")){var e={};for(var E=0,R=arguments[0][j];E<R;E++){e[arguments[0][E]]=this.attrs[arguments[0][E]];}return e;}var S;if(arguments[j]==2){S={};S[arguments[0]]=arguments[1];}arguments[j]==1&&Y.is(arguments[0],"object")&&(S=arguments[0]);if(S){if(S.text&&this.type=="text"){this.node.string=S.text;}M(this,S);if(S.gradient&&({circle:1,ellipse:1}[F](this.type)||(S.gradient+aa).charAt(0)!="r")){b(this,S.gradient);}this.setBox(this.attrs);}return this;};ad[az].toFront=function(){!this.removed&&this.Group.parentNode[ao](this.Group);return this;};ad[az].toBack=function(){if(this.removed){return this;}if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);}return this;};ad[az].insertAfter=function(e){if(this.removed){return this;}if(e.Group.nextSibling){e.Group.parentNode.insertBefore(this.Group,e.Group.nextSibling);}else{e.Group.parentNode[ao](this.Group);}return this;};ad[az].insertBefore=function(e){!this.removed&&e.Group.parentNode.insertBefore(this.Group,e.Group);return this;};var D=function(i,e,aC,aA){var S=T("group"),aB=T("oval"),E=aB.style;S.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";S.coordsize=i.coordsize;S.coordorigin=i.coordorigin;S[ao](aB);var R=new ad(aB,S,i);R.type="circle";M(R,{stroke:"#000",fill:"none"});R.attrs.cx=e;R.attrs.cy=aC;R.attrs.r=aA;R.setBox({x:e-aA,y:aC-aA,width:aA*2,height:aA*2});i.canvas[ao](S);return R;};var ai=function(i,aC,aB,aD,R,e){var S=T("group"),E=T(e?"roundrect":"rect"),aE=(+e||0)/(al(aD,R));E.arcsize=aE;S.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";S.coordsize=i.coordsize;S.coordorigin=i.coordorigin;S[ao](E);var aA=new ad(E,S,i);aA.type="rect";M(aA,{stroke:"#000"});aA.arcsize=aE;aA.setBox({x:aC,y:aB,width:aD,height:R,r:+e});i.canvas[ao](S);return aA;};var U=function(e,aD,aC,E,i){var S=T("group"),R=T("oval"),aB=R.style;S.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";S.coordsize=e.coordsize;S.coordorigin=e.coordorigin;S[ao](R);var aA=new ad(R,S,e);aA.type="ellipse";M(aA,{stroke:"#000"});aA.attrs.cx=aD;aA.attrs.cy=aC;aA.attrs.rx=E;aA.attrs.ry=i;aA.setBox({x:aD-E,y:aC-i,width:E*2,height:i*2});e.canvas[ao](S);return aA;};var k=function(i,e,aD,aC,aE,R){var S=T("group"),E=T("image"),aB=E.style;S.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";S.coordsize=i.coordsize;S.coordorigin=i.coordorigin;E.src=e;S[ao](E);var aA=new ad(E,S,i);aA.type="image";aA.attrs.src=e;aA.attrs.x=aD;aA.attrs.y=aC;aA.attrs.w=aE;aA.attrs.h=R;aA.setBox({x:aD,y:aC,width:aE,height:R});i.canvas[ao](S);return aA;};var K=function(i,aD,aC,aE){var S=T("group"),R=T("shape"),aB=R.style,aF=T("path"),e=aF.style,E=T("textpath");S.style.cssText="position:absolute;left:0;top:0;width:"+i.width+"px;height:"+i.height+"px";S.coordsize=i.coordsize;S.coordorigin=i.coordorigin;aF.v=Y.format("m{0},{1}l{2},{1}",C(aD),C(aC),C(aD)+1);aF.textpathok=true;aB.width=i.width;aB.height=i.height;E.string=aE+aa;E.on=true;R[ao](E);R[ao](aF);S[ao](R);var aA=new ad(E,S,i);aA.shape=R;aA.textpath=aF;aA.type="text";aA.attrs.text=aE;aA.attrs.x=aD;aA.attrs.y=aC;aA.attrs.w=1;aA.attrs.h=1;M(aA,{font:g.font,stroke:"none",fill:"#000"});aA.setBox();i.canvas[ao](S);return aA;};var aw=function(E,e){var i=this.canvas.style;this.width=J(E||this.width);this.height=J(e||this.height);i.width=this.width+"px";i.height=this.height+"px";i.clip="rect(0 "+this.width+"px "+this.height+"px 0)";this.coordsize=this.width+X+this.height;return this;};z.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!z.namespaces.rvml&&z.namespaces.add("rvml","urn:schemas-microsoft-com:vml");var T=function(e){return z.createElement("<rvml:"+e+' class="rvml">');};}catch(P){var T=function(e){return z.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var p=function(){var R=Z[ax](null,arguments),i=R.container,aE=R.height,aF,E=R.width,aD=R.x,aC=R.y;if(!i){throw new Error("VML container not found.");}var aA={},aB=aA.canvas=z.createElement("div"),S=aB.style;E=J(E)||512;aE=J(aE)||342;aA.width=E;aA.height=aE;aA.coordsize=E+X+aE;aA.coordorigin="0 0";aA.span=z.createElement("span");aA.span.style.cssText="position:absolute;left:-9999px;top:-9999px;padding:0;margin:0;line-height:1;display:inline;";aB[ao](aA.span);S.cssText=Y.format("width:{0}px;height:{1}px;position:absolute;clip:rect(0 {0}px {1}px 0)",E,aE);if(i==1){z.body[ao](aB);S.left=aD+"px";S.top=aC+"px";i={style:{width:E,height:aE}};}else{i.style.width=E;i.style.height=aE;if(i.firstChild){i.insertBefore(aB,i.firstChild);}else{i[ao](aB);}}for(var e in ar){if(ar[F](e)){aA[e]=ar[e];}}aj.call(aA,aA,Y.fn);aA.clear=function(){aB.innerHTML=aa;};aA.raphael=Y;return aA;};ar.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var e in this){delete this[e];}};}if({"Apple Computer, Inc.":1,"Google Inc.":1}[navigator.vendor]){ar.safari=function(){var e=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){e.remove();});};}else{ar.safari=function(){};}var Q=(function(){if(z.addEventListener){return function(S,E,i,e){var R=function(aA){return i.call(e,aA);};S.addEventListener(E,R,false);return function(){S.removeEventListener(E,R,false);return true;};};}else{if(z.attachEvent){return function(aA,R,E,i){var S=function(aB){return E.call(i,aB||ab.event);};aA.attachEvent("on"+R,S);var e=function(){aA.detachEvent("on"+R,S);return true;};if(R=="mouseover"){aA.attachEvent("onmouseenter",S);return function(){aA.detachEvent("onmouseenter",S);return e();};}else{if(R=="mouseout"){aA.attachEvent("onmouseleave",S);return function(){aA.detachEvent("onmouseleave",S);return e();};}}return e;};}}return false})();for(var N=u[j];N--;){(function(e){ad[az][e]=function(i){if(Y.is(i,"function")){this.events=this.events||{};this.events[e]=this.events[e]||{};this.events[e][i]=this.events[e][i]||[];this.events[e][i][c](Q(this.shape||this.node,e,i,this));}return this;};ad[az]["un"+e]=function(i){var E=this.events;E&&E[e]&&E[e][i]&&E[e][i][j]&&E[e][i].shift()()&&!E[e][i][j]&&delete E[e][i];return this;};})(u[N]);}ad[az].hover=function(i,e){return this.mouseover(i).mouseout(e);};ar.circle=function(e,E,i){return D(this,e||0,E||0,i||0);};ar.rect=function(e,S,i,E,R){return ai(this,e||0,S||0,i||0,E||0,R||0);};ar.ellipse=function(e,R,E,i){return U(this,e||0,R||0,E||0,i||0);};ar.path=function(e){e&&!Y.is(e,"string")&&!Y.is(e[0],"array")&&(e+=aa);return m(Y.format[ax](Y,arguments),this);};ar.image=function(R,e,S,i,E){return k(this,R||"about:blank",e||0,S||0,i||0,E||0);};ar.text=function(e,E,i){return K(this,e||0,E||0,i||aa);};ar.set=function(e){arguments[j]>1&&(e=Array[az].splice.call(arguments,0,arguments[j]));return new G(e);};ar.setSize=aw;ad[az].scale=function(aJ,aI,R,E){if(aJ==null&&aI==null){return{x:this._.sx,y:this._.sy,toString:function(){return this.x+X+this.y;}};}aI=aI||aJ;!+aI&&(aI=aJ);var aN,aL,aM,aK,aZ=this.attrs;if(aJ!=0){var aG=this.getBBox(),aD=aG.x+aG.width/2,aA=aG.y+aG.height/2,aY=aJ/this._.sx,aX=aI/this._.sy;R=(+R||R==0)?R:aD;E=(+E||E==0)?E:aA;var aF=~~(aJ/Math.abs(aJ)),aC=~~(aI/Math.abs(aI)),aQ=this.node.style,a1=R+(aD-R)*aF*aY,a0=E+(aA-E)*aC*aX;switch(this.type){case"rect":case"image":var aE=aZ.width*aF*aY,aP=aZ.height*aC*aX,aH=aZ.r*al(aY,aX),aB=a1-aE/2,S=a0-aP/2;this.attr({width:aE,height:aP,x:aB,y:S,r:aH});break;case"circle":case"ellipse":this.attr({rx:aZ.rx*aY,ry:aZ.ry*aX,r:aZ.r*al(aY,aX),cx:a1,cy:a0});break;case"path":var aS=O(aZ.path),aT=true;for(var aV=0,aO=aS[j];aV<aO;aV++){var aR=aS[aV];if(aR[0].toUpperCase()=="M"&&aT){continue;}else{aT=false;}if(Y.svg&&aR[0].toUpperCase()=="A"){aR[aS[aV][j]-2]*=aY;aR[aS[aV][j]-1]*=aX;aR[1]*=aY;aR[2]*=aX;aR[5]=+(aF+aC?!!+aR[5]:!+aR[5]);}else{for(var aU=1,aW=aR[j];aU<aW;aU++){aR[aU]*=(aU%2)?aY:aX;}}}var e=H(aS),aN=a1-e.x-e.width/2,aL=a0-e.y-e.height/2;aS[0][1]+=aN;aS[0][2]+=aL;this.attr({path:aS});break;}if(this.type in {text:1,image:1}&&(aF!=1||aC!=1)){if(this.transformations){this.transformations[2]="scale("[au](aF,",",aC,")");this.node[o]("transform",this.transformations[ae](X));aN=(aF==-1)?-aZ.x-(aE||0):aZ.x;aL=(aC==-1)?-aZ.y-(aP||0):aZ.y;this.attr({x:aN,y:aL});aZ.fx=aF-1;aZ.fy=aC-1;}else{this.node.filterMatrix=" progid:DXImageTransform.Microsoft.Matrix(M11="[au](aF,", M12=0, M21=0, M22=",aC,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");aQ.filter=(this.node.filterMatrix||aa)+(this.node.filterOpacity||aa);}}else{if(this.transformations){this.transformations[2]=aa;this.node[o]("transform",this.transformations[ae](X));aZ.fx=0;aZ.fy=0;}else{this.node.filterMatrix=aa;aQ.filter=(this.node.filterMatrix||aa)+(this.node.filterOpacity||aa);}}aZ.scale=[aJ,aI,R,E][ae](X);this._.sx=aJ;this._.sy=aI;}return this;};Y.easing_formulas={linear:function(e){return e;},"<":function(e){return ap(e,3);},">":function(e){return ap(e-1,3)+1;},"<>":function(e){e=e*2;if(e<1){return ap(e,3)/2;}e-=2;return(ap(e,3)+2)/2;},backIn:function(i){var e=1.70158;return i*i*((e+1)*i-e);},backOut:function(i){i=i-1;var e=1.70158;return i*i*((e+1)*i+e)+1;},elastic:function(E){if(E==0||E==1){return E;}var i=0.3,e=i/4;return ap(2,-10*E)*Math.sin((E-e)*(2*Math.PI)/i)+1;},bounce:function(R){var i=7.5625,E=2.75,e;if(R<(1/E)){e=i*R*R;}else{if(R<(2/E)){R-=(1.5/E);e=i*R*R+0.75;}else{if(R<(2.5/E)){R-=(2.25/E);e=i*R*R+0.9375;}else{R-=(2.625/E);e=i*R*R+0.984375;}}}return e;}};var x={length:0},at=function(){var aD=+new Date;for(var aO in x){if(aO!="length"&&x[F](aO)){var aT=x[aO];if(aT.stop){delete x[aO];x[j]--;continue;}var aB=aD-aT.start,aM=aT.ms,aL=aT.easing,aP=aT.from,aI=aT.diff,R=aT.to,aH=aT.t,aK=aT.prev||0,aC=aT.el,S=aT.callback,aJ={},E;if(aB<aM){var aA=Y.easing_formulas[aL]?Y.easing_formulas[aL](aB/aM):aB/aM;for(var aN in aP){if(aP[F](aN)){switch(L[aN]){case"number":E=+aP[aN]+aA*aM*aI[aN];break;case"colour":E="rgb("+[s(C(aP[aN].r+aA*aM*aI[aN].r)),s(C(aP[aN].g+aA*aM*aI[aN].g)),s(C(aP[aN].b+aA*aM*aI[aN].b))][ae](",")+")";break;case"path":E=[];for(var aR=0,aG=aP[aN][j];aR<aG;aR++){E[aR]=[aP[aN][aR][0]];for(var aQ=1,aS=aP[aN][aR][j];aQ<aS;aQ++){E[aR][aQ]=+aP[aN][aR][aQ]+aA*aM*aI[aN][aR][aQ];}E[aR]=E[aR][ae](X);}E=E[ae](X);break;case"csv":switch(aN){case"translation":var aF=aI[aN][0]*(aB-aK),aE=aI[aN][1]*(aB-aK);aH.x+=aF;aH.y+=aE;E=aF+X+aE;break;case"rotation":E=+aP[aN][0]+aA*aM*aI[aN][0];aP[aN][1]&&(E+=","+aP[aN][1]+","+aP[aN][2]);break;case"scale":E=[+aP[aN][0]+aA*aM*aI[aN][0],+aP[aN][1]+aA*aM*aI[aN][1],(2 in R[aN]?R[aN][2]:aa),(3 in R[aN]?R[aN][3]:aa)][ae](X);break;case"clip-rect":E=[];var aR=4;while(aR--){E[aR]=+aP[aN][aR]+aA*aM*aI[aN][aR];}break;}break;}aJ[aN]=E;}}aC.attr(aJ);aC._run&&aC._run.call(aC);}else{(aH.x||aH.y)&&aC.translate(-aH.x,-aH.y);R.scale&&(R.scale=R.scale+aa);aC.attr(R);Y.is(S,"function")&&S.call(aC);delete x[aO];x[j]--;aC.in_animation=null;}aT.prev=aB;}}Y.svg&&ar.safari();x[j]&&setTimeout(at);},s=function(e){return e>255?255:(e<0?0:e);};ad[az].animateWith=function(i,E,e,S,R){x[i.id]&&(E.start=x[i.id].start);return this.animate(E,e,S,R);};ad[az].onAnimation=function(e){this._run=e||null;return this;};ad[az].animate=function(R,e,aF,aL){if(Y.is(aF,"function")||!aF){aL=aF||null;}var aG={},aH={},aI={};for(var aE in R){if(R[F](aE)){if(L[F](aE)){aG[aE]=this.attr(aE);(aG[aE]==null)&&(aG[aE]=g[aE]);aH[aE]=R[aE];switch(L[aE]){case"number":aI[aE]=(aH[aE]-aG[aE])/e;break;case"colour":aG[aE]=Y.getRGB(aG[aE]);var aC=Y.getRGB(aH[aE]);aI[aE]={r:(aC.r-aG[aE].r)/e,g:(aC.g-aG[aE].g)/e,b:(aC.b-aG[aE].b)/e};break;case"path":var E=w(aG[aE],aH[aE]);aG[aE]=E[0];aH[aE]=E[1];aI[aE]=[];for(var aB=0,aK=aG[aE][j];aB<aK;aB++){aI[aE][aB]=[0];for(var S=1,aD=aG[aE][aB][j];S<aD;S++){aI[aE][aB][S]=(aH[aE][aB][S]-aG[aE][aB][S])/e;}}break;case"csv":var aJ=(R[aE]+aa)[r](a),aA=(aG[aE]+aa)[r](a);switch(aE){case"translation":aG[aE]=[0,0];aI[aE]=[aJ[0]/e,aJ[1]/e];break;case"rotation":aG[aE]=(aA[1]==aJ[1]&&aA[2]==aJ[2])?aA:[0,aJ[1],aJ[2]];aI[aE]=[(aJ[0]-aG[aE][0])/e,0,0];break;case"scale":R[aE]=aJ;aG[aE]=(aG[aE]+aa)[r](a);aI[aE]=[(aJ[0]-aG[aE][0])/e,(aJ[1]-aG[aE][1])/e,0,0];break;case"clip-rect":aG[aE]=(aG[aE]+aa)[r](a);aI[aE]=[];var aB=4;while(aB--){aI[aE][aB]=(aJ[aB]-aG[aE][aB])/e;}break;}aH[aE]=aJ;}}}}this.stop();this.in_animation=1;x[this.id]={start:R.start||+new Date,ms:e,easing:aF,from:aG,diff:aI,to:aH,el:this,callback:aL,t:{x:0,y:0}};++x[j]==1&&at();return this;};ad[az].stop=function(){delete x[this.id];delete this.in_animation;return this;};ad[az].translate=function(e,E){if(e==null){return{x:this._.tx,y:this._.ty};}this._.tx+=+e;this._.ty+=+E;switch(this.type){case"circle":case"ellipse":this.attr({cx:+e+this.attrs.cx,cy:+E+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+e+this.attrs.x,y:+E+this.attrs.y});break;case"path":var i=O(this.attrs.path);i[0][1]+=+e;i[0][2]+=+E;this.attr({path:i});break;}return this;};ad[az][af]=function(){return"Rapha\u00ebl\u2019s object";};Y.ae=x;var G=function(e){this.items=[];this[j]=0;if(e){for(var E=0,R=e[j];E<R;E++){if(e[E]&&(e[E].constructor==ad||e[E].constructor==G)){this[this.items[j]]=this.items[this.items[j]]=e[E];this[j]++;}}}};G[az][c]=function(){var S,e;for(var E=0,R=arguments[j];E<R;E++){S=arguments[E];if(S&&(S.constructor==ad||S.constructor==G)){e=this.items[j];this[e]=this.items[e]=S;this[j]++;}}return this;};G[az].pop=function(){delete this[this[j]--];return this.items.pop();};for(var q in ad[az]){if(ad[az][F](q)){G[az][q]=(function(e){return function(){for(var E=0,R=this.items[j];E<R;E++){this.items[E][e][ax](this.items[E],arguments);}return this;};})(q);}}G[az].attr=function(E,aB){if(E&&Y.is(E,"array")&&Y.is(E[0],"object")){for(var e=0,aA=E[j];e<aA;e++){this.items[e].attr(E[e]);}}else{for(var R=0,S=this.items[j];R<S;R++){this.items[R].attr[ax](this.items[R],arguments);}}return this;};G[az].animate=function(aA,E,aD,aC){(Y.is(aD,"function")||!aD)&&(aC=aD||null);var e=this.items[j],R=e,aB=this,S;aC&&(S=function(){!--e&&aC.call(aB);});this.items[--R].animate(aA,E,aD||S,S);while(R--){this.items[R].animateWith(this.items[e-1],aA,E,aD||S,S);}return this;};G[az].insertAfter=function(E){var e=this.items[j];while(e--){this.items[e].insertAfter(E);}};G[az].getBBox=function(){var e=[],aB=[],E=[],S=[];for(var R=this.items[j];R--;){var aA=this.items[R].getBBox();e[c](aA.x);aB[c](aA.y);E[c](aA.x+aA.width);S[c](aA.y+aA.height);}e=al[ax](0,e);aB=al[ax](0,aB);return{x:e,y:aB,width:d[ax](0,E)-e,height:d[ax](0,S)-aB};};Y.registerFont=function(i){if(!i.face){return i;}this.fonts=this.fonts||{};var R={w:i.w,face:{},glyphs:{}},E=i.face["font-family"];for(var aB in i.face){if(i.face[F](aB)){R.face[aB]=i.face[aB];}}if(this.fonts[E]){this.fonts[E][c](R);}else{this.fonts[E]=[R];}if(!i.svg){R.face["units-per-em"]=v(i.face["units-per-em"],10);for(var S in i.glyphs){if(i.glyphs[F](S)){var aA=i.glyphs[S];R.glyphs[S]={w:aA.w,k:{},d:aA.d&&"M"+aA.d[aq](/[mlcxtrv]/g,function(aC){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[aC]||"M";})+"z"};if(aA.k){for(var e in aA.k){if(aA[F](e)){R.glyphs[S].k[e]=aA.k[e];}}}}}}return i;};ar.getFont=function(aD,aE,E,S){S=S||"normal";E=E||"normal";aE=+aE||{normal:400,bold:700,lighter:300,bolder:800}[aE]||400;var aA=Y.fonts[aD];if(!aA){var R=new RegExp("(^|\\s)"+aD[aq](/[^\w\d\s+!~.:_-]/g,aa)+"(\\s|$)","i");for(var e in Y.fonts){if(Y.fonts[F](e)){if(R.test(e)){aA=Y.fonts[e];break;}}}}var aB;if(aA){for(var aC=0,aF=aA[j];aC<aF;aC++){aB=aA[aC];if(aB.face["font-weight"]==aE&&(aB.face["font-style"]==E||!aB.face["font-style"])&&aB.face["font-stretch"]==S){break;}}}return aB;};ar.print=function(aF,aE,aC,E,aJ){var aA=this.set(),aD=(aC+aa)[r](aa),e=0,aI=aa,S;Y.is(E,"string")&&(E=this.getFont(E));if(E){S=(aJ||16)/E.face["units-per-em"];for(var aB=0,aG=aD[j];aB<aG;aB++){var R=aB&&E.glyphs[aD[aB-1]]||{},aH=E.glyphs[aD[aB]];e+=aB?(R.w||E.w)+(R.k&&R.k[aD[aB]]||0):0;aH&&aH.d&&aA[c](this.path(aH.d).attr({fill:"#000",stroke:"none",translation:[e,0]}));}aA.scale(S,S,0,aE).translate(aF,(aJ||16)/2);}return aA;};Y.format=function(E){var i=Y.is(arguments[1],"array")?[0][au](arguments[1]):arguments,e=/\{(\d+)\}/g;E&&Y.is(E,"string")&&i[j]-1&&(E=E[aq](e,function(S,R){return i[++R]==null?aa:i[R];}));return E||aa;};Y.ninja=function(){var E=ab.Raphael,i;if(h.was){ab.Raphael=h.is;}else{try{delete ab.Raphael;}catch(R){ab.Raphael=i;}}return E;};Y.el=ad[az];return Y;})();
/*
 * Raphael 1.5.2 - JavaScript Vector Library
 *
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://raphaeljs.com/license.html) license.
 */
(function(){function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g<h;g++){var i=b[g]||{};c[f](i.type)&&e[L](d[i.type]().attr(i))}return e}return bV[m](a,arguments)}a.version="1.5.2";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g=document,h=window,i={was:Object[e][f].call(h,"Raphael"),is:h.Raphael},j=function(){this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in g,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v="join",w="length",x=r[e].toLowerCase,y=Math,z=y.max,A=y.min,B=y.abs,C=y.pow,D=y.PI,E="number",F="string",G="array",H="toString",I="fill",J=Object[e][H],K={},L="push",M=/^url\(['"]?([^\)]+?)['"]?\)$/i,N=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,O={"NaN":1,Infinity:1,"-Infinity":1},P=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,Q=y.round,R="setAttribute",S=parseFloat,T=parseInt,U=" progid:DXImageTransform.Microsoft",V=r[e].toUpperCase,W={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:"10px \"Arial\"","font-family":"\"Arial\"","font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},X={along:"along",blur:E,"clip-rect":"csv",cx:E,cy:E,fill:"colour","fill-opacity":E,"font-size":E,height:E,opacity:E,path:"path",r:E,rotation:"csv",rx:E,ry:E,scale:"csv",stroke:"colour","stroke-opacity":E,"stroke-width":E,translation:"csv",width:E,x:E,y:E},Y="replace",Z=/^(from|to|\d+%?)$/,$=/\s*,\s*/,_={hs:1,rg:1},ba=/,?([achlmqrstvxz]),?/gi,bb=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,bc=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,bd=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,be=function(a,b){return a.key-b.key};a.type=h.SVGAngle||g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bf=g.createElement("div"),bg;bf.innerHTML="<v:shape adj=\"1\"/>";bg=bf.firstChild;bg.style.behavior="url(#default#VML)";if(!(bg&&typeof bg.adj=="object"))return a.type=null;bf=null}a.svg=!(a.vml=a.type=="VML");j[e]=a[e];k=j[e];a._id=0;a._oid=0;a.fn={};a.is=function(a,b){b=x.call(b);if(b=="finite")return!O[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||J.call(a).slice(8,-1).toLowerCase()==b};a.angle=function(b,c,d,e,f,g){{if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return((h<0)*180+y.atan(-i/-h)*180/D+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)}};a.rad=function(a){return a%360*D/180};a.deg=function(a){return a*180/D%360};a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,G)){var e=b.length;while(e--)if(B(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};function bh(){var a=[],b=0;for(;b<32;b++)a[b]=(~(~(y.random()*16)))[H](16);a[12]=4;a[16]=(a[16]&3|8)[H](16);return"r-"+a[v]("")}a.setWindow=function(a){h=a;g=h.document};var bi=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>");e.close();d=e.body}catch(a){d=createPopup().document.body}var f=d.createTextRange();bi=bm(function(a){try{d.style.color=r(a)[Y](c,p);var b=f.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b[H](16)).slice(-6)}catch(a){return"none"}})}else{var h=g.createElement("i");h.title="Raphaël Colour Picker";h.style.display="none";g.body[l](h);bi=bm(function(a){h.style.color=a;return g.defaultView.getComputedStyle(h,p).getPropertyValue("color")})}return bi(b)},bj=function(){return"hsb("+[this.h,this.s,this.b]+")"},bk=function(){return"hsl("+[this.h,this.s,this.l]+")"},bl=function(){return this.hex};a.hsb2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b){d=b.b;c=b.s;b=b.h;e=b.o}return a.hsl2rgb(b,c,d/2,e)};a.hsl2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b){d=b.l;c=b.s;b=b.h}if(b>1||c>1||d>1){b/=360;c/=100;d/=100}var f={},g=["r","g","b"],h,i,j,k,l,m;if(c){d<0.5?h=d*(1+c):h=d+c-d*c;i=2*d-h;for(var n=0;n<3;n++){j=b+1/3*-(n-1);j<0&&j++;j>1&&j--;j*6<1?f[g[n]]=i+(h-i)*6*j:j*2<1?f[g[n]]=h:j*3<2?f[g[n]]=i+(h-i)*(2/3-j)*6:f[g[n]]=i}}else f={r:d,g:d,b:d};f.r*=255;f.g*=255;f.b*=255;f.hex="#"+(16777216|f.b|f.g<<8|f.r<<16).toString(16).slice(1);a.is(e,"finite")&&(f.opacity=e);f.toString=bl;return f};a.rgb2hsb=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=f;{if(g==f)return{h:0,s:0,b:f,toString:bj};var k=f-g;i=k/f;b==f?h=(c-d)/k:c==f?h=2+(d-b)/k:h=4+(b-c)/k;h/=6;h<0&&h++;h>1&&h--}return{h:h,s:i,b:j,toString:bj}};a.rgb2hsl=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=(f+g)/2,k;if(g==f)k={h:0,s:0,l:j};else{var l=f-g;i=j<0.5?l/(f+g):l/(2-f-g);b==f?h=(c-d)/l:c==f?h=2+(d-b)/l:h=4+(b-c)/l;h/=6;h<0&&h++;h>1&&h--;k={h:h,s:i,l:j}}k.toString=bk;return k};a._path2string=function(){return this.join(",")[Y](ba,"$1")};function bm(a,b,c){function d(){var g=Array[e].slice.call(arguments,0),h=g[v]("►"),i=d.cache=d.cache||{},j=d.count=d.count||[];if(i[f](h))return c?c(i[h]):i[h];j[w]>=1000&&delete i[j.shift()];j[L](h);i[h]=a[m](b,g);return c?c(i[h]):i[h]}return d}a.getRGB=bm(function(b){if(!b||!(!((b=r(b)).indexOf("-")+1)))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(_[f](b.toLowerCase().substring(0,2))||b.charAt()=="#")&&(b=bi(b));var c,d,e,g,h,i,j,k=b.match(N);if(k){if(k[2]){g=T(k[2].substring(5),16);e=T(k[2].substring(3,5),16);d=T(k[2].substring(1,3),16)}if(k[3]){g=T((i=k[3].charAt(3))+i,16);e=T((i=k[3].charAt(2))+i,16);d=T((i=k[3].charAt(1))+i,16)}if(k[4]){j=k[4][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);k[1].toLowerCase().slice(0,4)=="rgba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100)}if(k[5]){j=k[5][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsla"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g};k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1);a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a);a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=0.075;if(b.h>1){b.h=0;b.s-=0.2;b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})}return c.hex};a.getColor.reset=function(){delete this.start};a.parsePathString=bm(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,G)&&a.is(b[0],G)&&(d=bo(b));d[w]||r(b)[Y](bb,function(a,b,e){var f=[],g=x.call(b);e[Y](bc,function(a,b){b&&f[L](+b)});if(g=="m"&&f[w]>2){d[L]([b][n](f.splice(0,2)));g="l";b=b=="m"?"l":"L"}while(f[w]>=c[g]){d[L]([b][n](f.splice(0,c[g])));if(!c[g])break}});d[H]=a._path2string;return d});a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,l=C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-y.atan((m-o)/(n-p))*180/D;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bn=bm(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bw(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a[w];g<h;g++){f=a[g];if(f[0]=="M"){b=f[1];c=f[2];d[L](b);e[L](c)}else{var i=bv(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[n](i.min.x,i.max.x);e=e[n](i.min.y,i.max.y);b=f[5];c=f[6]}}var j=A[m](0,d),k=A[m](0,e);return{x:j,y:k,width:z[m](0,d)-j,height:z[m](0,e)-k}}),bo=function(b){var c=[];if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);for(var d=0,e=b[w];d<e;d++){c[d]=[];for(var f=0,g=b[d][w];f<g;f++)c[d][f]=b[d][f]}c[H]=a._path2string;return c},bp=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=b[0][1];e=b[0][2];f=d;g=e;h++;c[L](["M",d,e])}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=x.call(l[0])){k[0]=x.call(l[0]);switch(k[0]){case"a":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]-d).toFixed(3);k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1];g=l[2];default:for(var m=1,n=l[w];m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[];if(l[0]=="m"){f=l[1]+d;g=l[2]+e}for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o]}var q=c[i][w];switch(c[i][0]){case"z":d=f;e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2];e+=+c[i][q-1]}}c[H]=a._path2string;return c},0,bo),bq=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=+b[0][1];e=+b[0][2];f=d;g=e;h++;c[0]=["M",d,e]}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=V.call(l[0])){k[0]=V.call(l[0]);switch(k[0]){case"A":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]+d);k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d;g=+l[2]+e;default:for(var m=1,n=l[w];m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f;e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i][w]-2];g=c[i][c[i][w]-1];default:d=c[i][c[i][w]-2];e=c[i][c[i][w]-1]}}c[H]=a._path2string;return c},null,bo),br=function(a,b,c,d){return[a,b,c,d,c,d]},bs=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bt=function(a,b,c,d,e,f,g,h,i,j){var k=D*120/180,l=D/180*(+e||0),m=[],o,p=bm(function(a,b,c){var d=a*y.cos(c)-b*y.sin(c),e=a*y.sin(c)+b*y.cos(c);return{x:d,y:e}});if(j){G=j[0];H=j[1];E=j[2];F=j[3]}else{o=p(a,b,-l);a=o.x;b=o.y;o=p(h,i,-l);h=o.x;i=o.y;var q=y.cos(D/180*e),r=y.sin(D/180*e),t=(a-h)/2,u=(b-i)/2,x=t*t/(c*c)+u*u/(d*d);if(x>1){x=y.sqrt(x);c=x*c;d=x*d}var z=c*c,A=d*d,C=(f==g?-1:1)*y.sqrt(B((z*A-z*u*u-A*t*t)/(z*u*u+A*t*t))),E=C*c*u/d+(a+h)/2,F=C*-d*t/c+(b+i)/2,G=y.asin(((b-F)/d).toFixed(9)),H=y.asin(((i-F)/d).toFixed(9));G=a<E?D-G:G;H=h<E?D-H:H;G<0&&(G=D*2+G);H<0&&(H=D*2+H);g&&G>H&&(G=G-D*2);!g&&H>G&&(H=H-D*2)}var I=H-G;if(B(I)>k){var J=H,K=h,L=i;H=G+k*(g&&H>G?1:-1);h=E+c*y.cos(H);i=F+d*y.sin(H);m=bt(h,i,c,d,e,0,g,K,L,[H,J,E,F])}I=H-G;var M=y.cos(G),N=y.sin(G),O=y.cos(H),P=y.sin(H),Q=y.tan(I/4),R=4/3*c*Q,S=4/3*d*Q,T=[a,b],U=[a+R*N,b-S*M],V=[h+R*P,i-S*O],W=[h,i];U[0]=2*T[0]-U[0];U[1]=2*T[1]-U[1];{if(j)return[U,V,W][n](m);m=[U,V,W][n](m)[v]()[s](",");var X=[];for(var Y=0,Z=m[w];Y<Z;Y++)X[Y]=Y%2?p(m[Y-1],m[Y],l).y:p(m[Y],m[Y+1],l).x;return X}},bu=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,y:C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h}},bv=bm(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+y.sqrt(j*j-4*i*k))/2/i,n=(-j-y.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}i=f-2*d+b-(h-2*f+d);j=2*(d-b)-2*(f-d);k=b-d;l=(-j+y.sqrt(j*j-4*i*k))/2/i;n=(-j-y.sqrt(j*j-4*i*k))/2/i;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}return{min:{x:A[m](0,p),y:A[m](0,o)},max:{x:z[m](0,p),y:z[m](0,o)}}}),bw=bm(function(a,b){var c=bq(a),d=b&&bq(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1];b.Y=a[2];break;case"A":a=["C"][n](bt[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x));d=b.y+(b.y-(b.by||b.y));a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x));b.qy=b.y+(b.y-(b.qy||b.y));a=["C"][n](bs(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1];b.qy=a[2];a=["C"][n](bs(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](br(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](br(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](br(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](br(b.x,b.y,b.X,b.Y));break}return a},h=function(a,b){if(a[b][w]>7){a[b].shift();var e=a[b];while(e[w])a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1);k=z(c[w],d&&d[w]||0)}},i=function(a,b,e,f,g){if(a&&b&&a[g][0]=="M"&&b[g][0]!="M"){b.splice(g,0,["M",f.x,f.y]);e.bx=0;e.by=0;e.x=a[g][1];e.y=a[g][2];k=z(c[w],d&&d[w]||0)}};for(var j=0,k=z(c[w],d&&d[w]||0);j<k;j++){c[j]=g(c[j],e);h(c,j);d&&(d[j]=g(d[j],f));d&&h(d,j);i(c,d,e,f,j);i(d,c,f,e,j);var l=c[j],o=d&&d[j],p=l[w],q=d&&o[w];e.x=l[p-2];e.y=l[p-1];e.bx=S(l[p-4])||e.x;e.by=S(l[p-3])||e.y;f.bx=d&&(S(o[q-4])||f.x);f.by=d&&(S(o[q-3])||f.y);f.x=d&&o[q-2];f.y=d&&o[q-1]}return d?[c,d]:c},null,bo),bx=bm(function(b){var c=[];for(var d=0,e=b[w];d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex;g[2]&&(f.offset=g[2]+"%");c[L](f)}for(d=1,e=c[w]-1;d<e;d++){if(!c[d].offset){var h=S(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++){if(c[j].offset){i=c[j].offset;break}}if(!i){i=100;j=e}i=S(i);var k=(i-h)/(j-d+1);for(;d<j;d++){h+=k;c[d].offset=h+"%"}}}return c}),by=function(b,c,d,e){var f;if(a.is(b,F)||a.is(b,"object")){f=a.is(b,F)?g.getElementById(b):b;if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}}else return{container:1,x:b,y:c,width:d,height:e}},bz=function(a,b){var c=this;for(var d in b){if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[m](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{};bz.call(this,a[d],b[d]);break;default:a[d]=b[d];break}}},bA=function(a,b){a==b.top&&(b.top=a.prev);a==b.bottom&&(b.bottom=a.next);a.next&&(a.next.prev=a.prev);a.prev&&(a.prev.next=a.next)},bB=function(a,b){if(b.top===a)return;bA(a,b);a.next=null;a.prev=b.top;b.top.next=a;b.top=a},bC=function(a,b){if(b.bottom===a)return;bA(a,b);a.next=b.bottom;a.prev=null;b.bottom.prev=a;b.bottom=a},bD=function(a,b,c){bA(a,c);b==c.top&&(c.top=a);b.next&&(b.next.prev=a);a.next=b.next;a.prev=b;b.next=a},bE=function(a,b,c){bA(a,c);b==c.bottom&&(c.bottom=a);b.prev&&(b.prev.next=a);a.prev=b.prev;b.prev=a;a.next=b},bF=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}};a.pathToRelative=bp;if(a.svg){k.svgns="http://www.w3.org/2000/svg";k.xlink="http://www.w3.org/1999/xlink";Q=function(a){return+a+(~(~a)===a)*0.5};var bG=function(a,b){if(b)for(var c in b)b[f](c)&&a[R](c,r(b[c]));else{a=g.createElementNS(k.svgns,a);a.style.webkitTapHighlightColor="rgba(0,0,0,0)";return a}};a[H]=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bH=function(a,b){var c=bG("path");b.canvas&&b.canvas[l](c);var d=new bN(c,b);d.type="path";bK(d,{fill:"none",stroke:"#000",path:a});return d},bI=function(a,b,c){var d="linear",e=0.5,f=0.5,h=a.style;b=r(b)[Y](bd,function(a,b,c){d="radial";if(b&&c){e=S(b);f=S(c);var g=(f>0.5)*2-1;C(e-0.5,2)+C(f-0.5,2)>0.25&&(f=y.sqrt(0.25-C(e-0.5,2))*g+0.5)&&f!=0.5&&(f=f.toFixed(5)-0.00001*g)}return p});b=b[s](/\s*\-\s*/);if(d=="linear"){var i=b.shift();i=-S(i);if(isNaN(i))return null;var j=[0,0,y.cos(i*D/180),y.sin(i*D/180)],k=1/(z(B(j[2]),B(j[3]))||1);j[2]*=k;j[3]*=k;if(j[2]<0){j[0]=-j[2];j[2]=0}if(j[3]<0){j[1]=-j[3];j[3]=0}}var m=bx(b);if(!m)return null;var n=a.getAttribute(I);n=n.match(/^url\(#(.*)\)$/);n&&c.defs.removeChild(g.getElementById(n[1]));var o=bG(d+"Gradient");o.id=bh();bG(o,d=="radial"?{fx:e,fy:f}:{x1:j[0],y1:j[1],x2:j[2],y2:j[3]});c.defs[l](o);for(var q=0,t=m[w];q<t;q++){var u=bG("stop");bG(u,{offset:m[q].offset?m[q].offset:q?"100%":"0%","stop-color":m[q].color||"#fff"});o[l](u)}bG(a,{fill:"url(#"+o.id+")",opacity:1,"fill-opacity":1});h.fill=p;h.opacity=1;h.fillOpacity=1;return 1},bJ=function(b){var c=b.getBBox();bG(b.pattern,{patternTransform:a.format("translate({0},{1})",c.x,c.y)})},bK=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=c.rotate(),k=function(a,b){b=e[x.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b[w];while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bG(h,{"stroke-dasharray":g[v](",")})}};d[f]("rotation")&&(j=d.rotation);var m=r(j)[s](b);if(m.length-1){m[1]=+m[1];m[2]=+m[2]}else m=null;S(j)&&c.rotate(0,true);for(var n in d){if(d[f](n)){if(!W[f](n))continue;var o=d[n];i[n]=o;switch(n){case"blur":c.blur(o);break;case"rotation":c.rotate(o,true);break;case"href":case"title":case"target":var t=h.parentNode;if(x.call(t.tagName)!="a"){var u=bG("a");t.insertBefore(u,h);u[l](h);t=u}n=="target"&&o=="blank"?t.setAttributeNS(c.paper.xlink,"show","new"):t.setAttributeNS(c.paper.xlink,n,o);break;case"cursor":h.style.cursor=o;break;case"clip-rect":var y=r(o)[s](b);if(y[w]==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var z=bG("clipPath"),A=bG("rect");z.id=bh();bG(A,{x:y[0],y:y[1],width:y[2],height:y[3]});z[l](A);c.paper.defs[l](z);bG(h,{"clip-path":"url(#"+z.id+")"});c.clip=A}if(!o){var B=g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g,p));B&&B.parentNode.removeChild(B);bG(h,{"clip-path":p});delete c.clip}break;case"path":c.type=="path"&&bG(h,{d:o?i.path=bq(o):"M0,0"});break;case"width":h[R](n,o);if(i.fx){n="x";o=i.x}else break;case"x":i.fx&&(o=-i.x-(i.width||0));case"rx":if(n=="rx"&&c.type=="rect")break;case"cx":m&&(n=="x"||n=="cx")&&(m[1]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"height":h[R](n,o);if(i.fy){n="y";o=i.y}else break;case"y":i.fy&&(o=-i.y-(i.height||0));case"ry":if(n=="ry"&&c.type=="rect")break;case"cy":m&&(n=="y"||n=="cy")&&(m[2]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"r":c.type=="rect"?bG(h,{rx:o,ry:o}):h[R](n,o);break;case"src":c.type=="image"&&h.setAttributeNS(c.paper.xlink,"href",o);break;case"stroke-width":h.style.strokeWidth=o;h[R](n,o);i["stroke-dasharray"]&&k(c,i["stroke-dasharray"]);break;case"stroke-dasharray":k(c,o);break;case"translation":var C=r(o)[s](b);C[0]=+C[0]||0;C[1]=+C[1]||0;if(m){m[1]+=C[0];m[2]+=C[1]}cz.call(c,C[0],C[1]);break;case"scale":C=r(o)[s](b);c.scale(+C[0]||1,+C[1]||+C[0]||1,isNaN(S(C[2]))?null:+C[2],isNaN(S(C[3]))?null:+C[3]);break;case I:var D=r(o).match(M);if(D){z=bG("pattern");var E=bG("image");z.id=bh();bG(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});bG(E,{x:0,y:0});E.setAttributeNS(c.paper.xlink,"href",D[1]);z[l](E);var F=g.createElement("img");F.style.cssText="position:absolute;left:-9999em;top-9999em";F.onload=function(){bG(z,{width:this.offsetWidth,height:this.offsetHeight});bG(E,{width:this.offsetWidth,height:this.offsetHeight});g.body.removeChild(this);c.paper.safari()};g.body[l](F);F.src=D[1];c.paper.defs[l](z);h.style.fill="url(#"+z.id+")";bG(h,{fill:"url(#"+z.id+")"});c.pattern=z;c.pattern&&bJ(c);break}var G=a.getRGB(o);if(G.error)if((({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper)){i.gradient=o;i.fill="none";break}else{delete d.gradient;delete i.gradient;!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bG(h,{opacity:i.opacity});!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bG(h,{"fill-opacity":i["fill-opacity"]})}G[f]("opacity")&&bG(h,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(o);h[R](n,G.hex);n=="stroke"&&G[f]("opacity")&&bG(h,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity});break;case"gradient":(({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bG(h,{"stroke-opacity":o>1?o/100:o});case"fill-opacity":if(i.gradient){var H=g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g,p));if(H){var J=H.getElementsByTagName("stop");J[J[w]-1][R]("stop-opacity",o)}break}default:n=="font-size"&&(o=T(o,10)+"px");var K=n[Y](/(\-.)/g,function(a){return V.call(a.substring(1))});h.style[K]=o;h[R](n,o);break}}}bM(c,d);m?c.rotate(m.join(q)):S(j)&&c.rotate(j,true)},bL=1.2,bM=function(b,c){if(b.type!="text"||!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y")))return;var d=b.attrs,e=b.node,h=e.firstChild?T(g.defaultView.getComputedStyle(e.firstChild,p).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=r(c.text)[s]("\n");for(var j=0,k=i[w];j<k;j++)if(i[j]){var m=bG("tspan");j&&bG(m,{dy:h*bL,x:d.x});m[l](g.createTextNode(i[j]));e[l](m)}}else{i=e.getElementsByTagName("tspan");for(j=0,k=i[w];j<k;j++)j&&bG(i[j],{dy:h*bL,x:d.x})}bG(e,{y:d.y});var n=b.getBBox(),o=d.y-(n.y+n.height/2);o&&a.is(o,"finite")&&bG(e,{y:d.y+o})},bN=function(b,c){var d=0,e=0;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.paper=c;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!c.bottom&&(c.bottom=this);this.prev=c.top;c.top&&(c.top.next=this);c.top=this;this.next=null},bO=bN[e];bN[e].rotate=function(c,d,e){if(this.removed)return this;if(c==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}var f=this.getBBox();c=r(c)[s](b);if(c[w]-1){d=S(c[1]);e=S(c[2])}c=S(c[0]);d!=null&&d!==false?this._.rt.deg=c:this._.rt.deg+=c;e==null&&(d=null);this._.rt.cx=d;this._.rt.cy=e;d=d==null?f.x+f.width/2:d;e=e==null?f.y+f.height/2:e;if(this._.rt.deg){this.transformations[0]=a.format("rotate({0} {1} {2})",this._.rt.deg,d,e);this.clip&&bG(this.clip,{transform:a.format("rotate({0} {1} {2})",-this._.rt.deg,d,e)})}else{this.transformations[0]=p;this.clip&&bG(this.clip,{transform:p})}bG(this.node,{transform:this.transformations[v](q)});return this};bN[e].hide=function(){!this.removed&&(this.node.style.display="none");return this};bN[e].show=function(){!this.removed&&(this.node.style.display="");return this};bN[e].remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=true};bN[e].getBBox=function(){if(this.removed)return this;if(this.type=="path")return bn(this.attrs.path);if(this.node.style.display=="none"){this.show();var a=true}var b={};try{b=this.node.getBBox()}catch(a){}finally{b=b||{}}if(this.type=="text"){b={x:b.x,y:Infinity,width:0,height:0};for(var c=0,d=this.node.getNumberOfChars();c<d;c++){var e=this.node.getExtentOfChar(c);e.y<b.y&&(b.y=e.y);e.y+e.height-b.y>b.height&&(b.height=e.y+e.height-b.y);e.x+e.width-b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};bN[e].attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,F)){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(c==null&&a.is(b,G)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][n](j[k]));this.attrs[k]=j[k];for(var m in l)l[f](m)&&(j[m]=l[m])}bK(this,j);return this};bN[e].toFront=function(){if(this.removed)return this;this.node.parentNode[l](this.node);var a=this.paper;a.top!=this&&bB(this,a);return this};bN[e].toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);bC(this,this.paper);var a=this.paper}return this};bN[e].insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode[l](this.node);bD(this,a,this.paper);return this};bN[e].insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b);bE(this,a,this.paper);return this};bN[e].blur=function(a){var b=this;if(+a!==0){var c=bG("filter"),d=bG("feGaussianBlur");b.attrs.blur=a;c.id=bh();bG(d,{stdDeviation:+a||1.5});c.appendChild(d);b.paper.defs.appendChild(c);b._blur=c;bG(b.node,{filter:"url(#"+c.id+")"})}else{if(b._blur){b._blur.parentNode.removeChild(b._blur);delete b._blur;delete b.attrs.blur}b.node.removeAttribute("filter")}};var bP=function(a,b,c,d){var e=bG("circle");a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"};f.type="circle";bG(e,f.attrs);return f},bQ=function(a,b,c,d,e,f){var g=bG("rect");a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"};h.type="rect";bG(g,h.attrs);return h},bR=function(a,b,c,d,e){var f=bG("ellipse");a.canvas&&a.canvas[l](f);var g=new bN(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"};g.type="ellipse";bG(f,g.attrs);return g},bS=function(a,b,c,d,e,f){var g=bG("image");bG(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"});g.setAttributeNS(a.xlink,"href",b);a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b};h.type="image";return h},bT=function(a,b,c,d){var e=bG("text");bG(e,{x:b,y:c,"text-anchor":"middle"});a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:W.font,stroke:"none",fill:"#000"};f.type="text";bK(f,f.attrs);return f},bU=function(a,b){this.width=a||this.width;this.height=b||this.height;this.canvas[R]("width",this.width);this.canvas[R]("height",this.height);return this},bV=function(){var b=by[m](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var i=bG("svg");d=d||0;e=e||0;f=f||512;h=h||342;bG(i,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:f,height:h});if(c==1){i.style.cssText="position:absolute;left:"+d+"px;top:"+e+"px";g.body[l](i)}else c.firstChild?c.insertBefore(i,c.firstChild):c[l](i);c=new j;c.width=f;c.height=h;c.canvas=i;bz.call(c,c,a.fn);c.clear();return c};k.clear=function(){var a=this.canvas;while(a.firstChild)a.removeChild(a.firstChild);this.bottom=this.top=null;(this.desc=bG("desc"))[l](g.createTextNode("Created with Raphaël"));a[l](this.desc);a[l](this.defs=bG("defs"))};k.remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a)}}if(a.vml){var bW={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},bX=/([clmz]),?([^clmz]*)/gi,bY=/ progid:\S+Blur\([^\)]+\)/g,bZ=/-?[^,\s-]+/g,b$=1000+q+1000,b_=10,ca={path:1,rect:1},cb=function(a){var b=/[ahqstv]/ig,c=bq;r(a).match(b)&&(c=bw);b=/[clmz]/g;if(c==bq&&!r(a).match(b)){var d=r(a)[Y](bX,function(a,b,c){var d=[],e=x.call(b)=="m",f=bW[b];c[Y](bZ,function(a){if(e&&d[w]==2){f+=d+bW[b=="m"?"l":"L"];d=[]}d[L](Q(a*b_))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e[w];h<i;h++){f=e[h];g=x.call(e[h][0]);g=="z"&&(g="x");for(var j=1,k=f[w];j<k;j++)g+=Q(f[j]*b_)+(j!=k-1?",":p);d[L](g)}return d[v](q)};a[H]=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};bH=function(a,b){var c=cd("group");c.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";c.coordsize=b.coordsize;c.coordorigin=b.coordorigin;var d=cd("shape"),e=d.style;e.width=b.width+"px";e.height=b.height+"px";d.coordsize=b$;d.coordorigin=b.coordorigin;c[l](d);var f=new bN(d,c,b),g={fill:"none",stroke:"#000"};a&&(g.path=a);f.type="path";f.path=[];f.Path=p;bK(f,g);b.canvas[l](c);return f};bK=function(c,d){c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.r!=h.r)&&c.type=="rect",m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);if(k){h.path=cc(h.x,h.y,h.width,h.height,h.r);c.X=h.x;c.Y=h.y;c.W=h.width;c.H=h.height}d.href&&(e.href=d.href);d.title&&(e.title=d.title);d.target&&(e.target=d.target);d.cursor&&(i.cursor=d.cursor);"blur"in d&&c.blur(d.blur);if(d.path&&c.type=="path"||k)e.path=cb(h.path);d.rotation!=null&&c.rotate(d.rotation,true);if(d.translation){j=r(d.translation)[s](b);cz.call(c,j[0],j[1]);if(c._.rt.cx!=null){c._.rt.cx+=+j[0];c._.rt.cy+=+j[1];c.setBox(c.attrs,j[0],j[1])}}if(d.scale){j=r(d.scale)[s](b);c.scale(+j[0]||1,+j[1]||+j[0]||1,+j[2]||null,+j[3]||null)}if("clip-rect"in d){var o=r(d["clip-rect"])[s](b);if(o[w]==4){o[2]=+o[2]+ +o[0];o[3]=+o[3]+ +o[1];var q=e.clipRect||g.createElement("div"),t=q.style,u=e.parentNode;t.clip=a.format("rect({1}px {2}px {3}px {0}px)",o);if(!e.clipRect){t.position="absolute";t.top=0;t.left=0;t.width=c.paper.width+"px";t.height=c.paper.height+"px";u.parentNode.insertBefore(q,u);q[l](u);e.clipRect=q}}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=p)}c.type=="image"&&d.src&&(e.src=d.src);if(c.type=="image"&&d.opacity){e.filterOpacity=U+".Alpha(opacity="+d.opacity*100+")";i.filter=(e.filterMatrix||p)+(e.filterOpacity||p)}d.font&&(i.font=d.font);d["font-family"]&&(i.fontFamily="\""+d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g,p)+"\"");d["font-size"]&&(i.fontSize=d["font-size"]);d["font-weight"]&&(i.fontWeight=d["font-weight"]);d["font-style"]&&(i.fontStyle=d["font-style"]);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){e=c.shape||e;var v=e.getElementsByTagName(I)&&e.getElementsByTagName(I)[0],x=false;!v&&(x=v=cd(I));if("fill-opacity"in d||"opacity"in d){var y=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);y=A(z(y,0),1);v.opacity=y}d.fill&&(v.on=true);if(v.on==null||d.fill=="none")v.on=false;if(v.on&&d.fill){var B=d.fill.match(M);if(B){v.src=B[1];v.type="tile"}else{v.color=a.getRGB(d.fill).hex;v.src=p;v.type="solid";if(a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||r(d.fill).charAt()!="r")&&bI(m,d.fill)){h.fill="none";h.gradient=d.fill}}}x&&e[l](v);var C=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],D=false;!C&&(D=C=cd("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])C.on=true;(d.stroke=="none"||C.on==null||d.stroke==0||d["stroke-width"]==0)&&(C.on=false);var E=a.getRGB(d.stroke);C.on&&d.stroke&&(C.color=E.hex);y=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+E.o+1||2)-1);var F=(S(d["stroke-width"])||1)*0.75;y=A(z(y,0),1);d["stroke-width"]==null&&(F=h["stroke-width"]);d["stroke-width"]&&(C.weight=F);F&&F<1&&(y*=F)&&(C.weight=1);C.opacity=y;d["stroke-linejoin"]&&(C.joinstyle=d["stroke-linejoin"]||"miter");C.miterlimit=d["stroke-miterlimit"]||8;d["stroke-linecap"]&&(C.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var G={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};C.dashstyle=G[f](d["stroke-dasharray"])?G[d["stroke-dasharray"]]:p}D&&e[l](C)}if(m.type=="text"){i=m.paper.span.style;h.font&&(i.font=h.font);h["font-family"]&&(i.fontFamily=h["font-family"]);h["font-size"]&&(i.fontSize=h["font-size"]);h["font-weight"]&&(i.fontWeight=h["font-weight"]);h["font-style"]&&(i.fontStyle=h["font-style"]);m.node.string&&(m.paper.span.innerHTML=r(m.node.string)[Y](/</g,"&#60;")[Y](/&/g,"&#38;")[Y](/\n/g,"<br>"));m.W=h.w=m.paper.span.offsetWidth;m.H=h.h=m.paper.span.offsetHeight;m.X=h.x;m.Y=h.y+Q(m.H/2);switch(h["text-anchor"]){case"start":m.node.style["v-text-align"]="left";m.bbx=Q(m.W/2);break;case"end":m.node.style["v-text-align"]="right";m.bbx=-Q(m.W/2);break;default:m.node.style["v-text-align"]="center";break}}};bI=function(a,b){a.attrs=a.attrs||{};var c=a.attrs,d,e="linear",f=".5 .5";a.attrs.gradient=b;b=r(b)[Y](bd,function(a,b,c){e="radial";if(b&&c){b=S(b);c=S(c);C(b-0.5,2)+C(c-0.5,2)>0.25&&(c=y.sqrt(0.25-C(b-0.5,2))*((c>0.5)*2-1)+0.5);f=b+q+c}return p});b=b[s](/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-S(g);if(isNaN(g))return null}var h=bx(b);if(!h)return null;a=a.shape||a.node;d=a.getElementsByTagName(I)[0]||cd(I);!d.parentNode&&a.appendChild(d);if(h[w]){d.on=true;d.method="none";d.color=h[0].color;d.color2=h[h[w]-1].color;var i=[];for(var j=0,k=h[w];j<k;j++)h[j].offset&&i[L](h[j].offset+q+h[j].color);d.colors&&(d.colors.value=i[w]?i[v]():"0% "+d.color);if(e=="radial"){d.type="gradientradial";d.focus="100%";d.focussize=f;d.focusposition=f}else{d.type="gradient";d.angle=(270-g)%360}}return 1};bN=function(b,c,d){var e=0,f=0,g=0,h=1;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=c;this.paper=d;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null};bO=bN[e];bO.rotate=function(a,c,d){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}a=r(a)[s](b);if(a[w]-1){c=S(a[1]);d=S(a[2])}a=S(a[0]);c!=null?this._.rt.deg=a:this._.rt.deg+=a;d==null&&(c=null);this._.rt.cx=c;this._.rt.cy=d;this.setBox(this.attrs,c,d);this.Group.style.rotation=this._.rt.deg;return this};bO.setBox=function(a,b,c){if(this.removed)return this;var d=this.Group.style,e=this.shape&&this.shape.style||this.node.style;a=a||{};for(var g in a)a[f](g)&&(this.attrs[g]=a[g]);b=b||this._.rt.cx;c=c||this._.rt.cy;var h=this.attrs,i,j,k,l;switch(this.type){case"circle":i=h.cx-h.r;j=h.cy-h.r;k=l=h.r*2;break;case"ellipse":i=h.cx-h.rx;j=h.cy-h.ry;k=h.rx*2;l=h.ry*2;break;case"image":i=+h.x;j=+h.y;k=h.width||0;l=h.height||0;break;case"text":this.textpath.v=["m",Q(h.x),", ",Q(h.y-2),"l",Q(h.x)+1,", ",Q(h.y-2)][v](p);i=h.x-Q(this.W/2);j=h.y-this.H/2;k=this.W;l=this.H;break;case"rect":case"path":if(this.attrs.path){var m=bn(this.attrs.path);i=m.x;j=m.y;k=m.width;l=m.height}else{i=0;j=0;k=this.paper.width;l=this.paper.height}break;default:i=0;j=0;k=this.paper.width;l=this.paper.height;break}b=b==null?i+k/2:b;c=c==null?j+l/2:c;var n=b-this.paper.width/2,o=c-this.paper.height/2,q;d.left!=(q=n+"px")&&(d.left=q);d.top!=(q=o+"px")&&(d.top=q);this.X=ca[f](this.type)?-n:i;this.Y=ca[f](this.type)?-o:j;this.W=k;this.H=l;if(ca[f](this.type)){e.left!=(q=-n*b_+"px")&&(e.left=q);e.top!=(q=-o*b_+"px")&&(e.top=q)}else if(this.type=="text"){e.left!=(q=-n+"px")&&(e.left=q);e.top!=(q=-o+"px")&&(e.top=q)}else{d.width!=(q=this.paper.width+"px")&&(d.width=q);d.height!=(q=this.paper.height+"px")&&(d.height=q);e.left!=(q=i-n+"px")&&(e.left=q);e.top!=(q=j-o+"px")&&(e.top=q);e.width!=(q=k+"px")&&(e.width=q);e.height!=(q=l+"px")&&(e.height=q)}};bO.hide=function(){!this.removed&&(this.Group.style.display="none");return this};bO.show=function(){!this.removed&&(this.Group.style.display="block");return this};bO.getBBox=function(){if(this.removed)return this;if(ca[f](this.type))return bn(this.attrs.path);return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H}};bO.remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=true};bO.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(this.attrs&&c==null&&a.is(b,G)){var g,h={};for(e=0,g=b[w];e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;if(c!=null){i={};i[b]=c}c==null&&a.is(b,"object")&&(i=b);if(i){for(var j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][n](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.node.string=i.text);bK(this,i);i.gradient&&(({circle:1,ellipse:1})[f](this.type)||r(i.gradient).charAt()!="r")&&bI(this,i.gradient);(!ca[f](this.type)||this._.rt.deg)&&this.setBox(this.attrs)}return this};bO.toFront=function(){!this.removed&&this.Group.parentNode[l](this.Group);this.paper.top!=this&&bB(this,this.paper);return this};bO.toBack=function(){if(this.removed)return this;if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);bC(this,this.paper)}return this};bO.insertAfter=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[a.length-1]);a.Group.nextSibling?a.Group.parentNode.insertBefore(this.Group,a.Group.nextSibling):a.Group.parentNode[l](this.Group);bD(this,a,this.paper);return this};bO.insertBefore=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[0]);a.Group.parentNode.insertBefore(this.Group,a.Group);bE(this,a,this.paper);return this};bO.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(bY,p);if(+b!==0){this.attrs.blur=b;c.filter=d+q+U+".Blur(pixelradius="+(+b||1.5)+")";c.margin=a.format("-{0}px 0 0 -{0}px",Q(+b||1.5))}else{c.filter=d;c.margin=0;delete this.attrs.blur}};bP=function(a,b,c,d){var e=cd("group"),f=cd("oval"),g=f.style;e.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";e.coordsize=b$;e.coordorigin=a.coordorigin;e[l](f);var h=new bN(f,e,a);h.type="circle";bK(h,{stroke:"#000",fill:"none"});h.attrs.cx=b;h.attrs.cy=c;h.attrs.r=d;h.setBox({x:b-d,y:c-d,width:d*2,height:d*2});a.canvas[l](e);return h};function cc(b,c,d,e,f){return f?a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",b+f,c,d-f*2,f,-f,e-f*2,f*2-d,f*2-e):a.format("M{0},{1}l{2},0,0,{3},{4},0z",b,c,d,e,-d)}bQ=function(a,b,c,d,e,f){var g=cc(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b;h.Y=i.y=c;h.W=i.width=d;h.H=i.height=e;i.r=f;i.path=g;h.type="rect";return h};bR=function(a,b,c,d,e){var f=cd("group"),g=cd("oval"),h=g.style;f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";f.coordsize=b$;f.coordorigin=a.coordorigin;f[l](g);var i=new bN(g,f,a);i.type="ellipse";bK(i,{stroke:"#000"});i.attrs.cx=b;i.attrs.cy=c;i.attrs.rx=d;i.attrs.ry=e;i.setBox({x:b-d,y:c-e,width:d*2,height:e*2});a.canvas[l](f);return i};bS=function(a,b,c,d,e,f){var g=cd("group"),h=cd("image");g.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";g.coordsize=b$;g.coordorigin=a.coordorigin;h.src=b;g[l](h);var i=new bN(h,g,a);i.type="image";i.attrs.src=b;i.attrs.x=c;i.attrs.y=d;i.attrs.w=e;i.attrs.h=f;i.setBox({x:c,y:d,width:e,height:f});a.canvas[l](g);return i};bT=function(b,c,d,e){var f=cd("group"),g=cd("shape"),h=g.style,i=cd("path"),j=i.style,k=cd("textpath");f.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";f.coordsize=b$;f.coordorigin=b.coordorigin;i.v=a.format("m{0},{1}l{2},{1}",Q(c*10),Q(d*10),Q(c*10)+1);i.textpathok=true;h.width=b.width;h.height=b.height;k.string=r(e);k.on=true;g[l](k);g[l](i);f[l](g);var m=new bN(k,f,b);m.shape=g;m.textpath=i;m.type="text";m.attrs.text=e;m.attrs.x=c;m.attrs.y=d;m.attrs.w=1;m.attrs.h=1;bK(m,{font:W.font,stroke:"none",fill:"#000"});m.setBox();b.canvas[l](f);return m};bU=function(a,b){var c=this.canvas.style;a==+a&&(a+="px");b==+b&&(b+="px");c.width=a;c.height=b;c.clip="rect(0 "+a+" "+b+" 0)";return this};var cd;g.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!g.namespaces.rvml&&g.namespaces.add("rvml","urn:schemas-microsoft-com:vml");cd=function(a){return g.createElement("<rvml:"+a+" class=\"rvml\">")}}catch(a){cd=function(a){return g.createElement("<"+a+" xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")}}bV=function(){var b=by[m](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,i=b.y;if(!c)throw new Error("VML container not found.");var k=new j,n=k.canvas=g.createElement("div"),o=n.style;h=h||0;i=i||0;f=f||512;d=d||342;f==+f&&(f+="px");d==+d&&(d+="px");k.width=1000;k.height=1000;k.coordsize=b_*1000+q+b_*1000;k.coordorigin="0 0";k.span=g.createElement("span");k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";n[l](k.span);o.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d);if(c==1){g.body[l](n);o.left=h+"px";o.top=i+"px";o.position="absolute"}else c.firstChild?c.insertBefore(n,c.firstChild):c[l](n);bz.call(k,k,a.fn);return k};k.clear=function(){this.canvas.innerHTML=p;this.span=g.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[l](this.span);this.bottom=this.top=null};k.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a);return true}}var ce=navigator.userAgent.match(/Version\\x2f(.*?)\s/);navigator.vendor=="Apple Computer, Inc."&&(ce&&ce[1]<4||navigator.platform.slice(0,2)=="iP")?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});h.setTimeout(function(){a.remove()})}:k.safari=function(){};var cf=function(){this.returnValue=false},cg=function(){return this.originalEvent.preventDefault()},ch=function(){this.cancelBubble=true},ci=function(){return this.originalEvent.stopPropagation()},cj=(function(){{if(g.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,g=function(e){if(o&&u[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++){if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g];e.originalEvent=i;e.preventDefault=cg;e.stopPropagation=ci;break}}return c.call(d,e)};a.addEventListener(e,g,false);return function(){a.removeEventListener(e,g,false);return true}};if(g.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.event;a.preventDefault=a.preventDefault||cf;a.stopPropagation=a.stopPropagation||ch;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return true};return f}}})(),ck=[],cl=function(a){var b=a.clientX,c=a.clientY,d=g.documentElement.scrollTop||g.body.scrollTop,e=g.documentElement.scrollLeft||g.body.scrollLeft,f,h=ck.length;while(h--){f=ck[h];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX;c=j.clientY;(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();b+=e;c+=d;f.move&&f.move.call(f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cm=function(b){a.unmousemove(cl).unmouseup(cm);var c=ck.length,d;while(c--){d=ck[c];d.el._drag={};d.end&&d.end.call(d.end_scope||d.start_scope||d.move_scope||d.el,b)}ck=[]};for(var cn=t[w];cn--;)(function(b){a[b]=bN[e][b]=function(c,d){if(a.is(c,"function")){this.events=this.events||[];this.events.push({name:b,f:c,unbind:cj(this.shape||this.node||g,b,c,d||this)})}return this};a["un"+b]=bN[e]["un"+b]=function(a){var c=this.events,d=c[w];while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind();c.splice(d,1);!c.length&&delete this.events;return this}return this}})(t[cn]);bO.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)};bO.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};bO.drag=function(b,c,d,e,f,h){this._drag={};this.mousedown(function(i){(i.originalEvent||i).preventDefault();var j=g.documentElement.scrollTop||g.body.scrollTop,k=g.documentElement.scrollLeft||g.body.scrollLeft;this._drag.x=i.clientX+k;this._drag.y=i.clientY+j;this._drag.id=i.identifier;c&&c.call(f||e||this,i.clientX+k,i.clientY+j,i);!ck.length&&a.mousemove(cl).mouseup(cm);ck.push({el:this,move:b,end:d,move_scope:e,start_scope:f,end_scope:h})});return this};bO.undrag=function(b,c,d){var e=ck.length;while(e--)ck[e].el==this&&(ck[e].move==b&&ck[e].end==d)&&ck.splice(e++,1);!ck.length&&a.unmousemove(cl).unmouseup(cm)};k.circle=function(a,b,c){return bP(this,a||0,b||0,c||0)};k.rect=function(a,b,c,d,e){return bQ(this,a||0,b||0,c||0,d||0,e||0)};k.ellipse=function(a,b,c,d){return bR(this,a||0,b||0,c||0,d||0)};k.path=function(b){b&&!a.is(b,F)&&!a.is(b[0],G)&&(b+=p);return bH(a.format[m](a,arguments),this)};k.image=function(a,b,c,d,e){return bS(this,a||"about:blank",b||0,c||0,d||0,e||0)};k.text=function(a,b,c){return bT(this,a||0,b||0,r(c))};k.set=function(a){arguments[w]>1&&(a=Array[e].splice.call(arguments,0,arguments[w]));return new cC(a)};k.setSize=bU;k.top=k.bottom=null;k.raphael=a;function co(){return this.x+q+this.y}bO.resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};bO.scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:co};b=b||a;!(+b)&&(b=a);var e,f,g,h,i=this.attrs;if(a!=0){var j=this.getBBox(),k=j.x+j.width/2,l=j.y+j.height/2,m=B(a/this._.sx),o=B(b/this._.sy);c=+c||c==0?c:k;d=+d||d==0?d:l;var r=this._.sx>0,s=this._.sy>0,t=~(~(a/B(a))),u=~(~(b/B(b))),x=m*t,y=o*u,z=this.node.style,A=c+B(k-c)*x*(k>c==r?1:-1),C=d+B(l-d)*y*(l>d==s?1:-1),D=a*t>b*u?o:m;switch(this.type){case"rect":case"image":var E=i.width*m,F=i.height*o;this.attr({height:F,r:i.r*D,width:E,x:A-E/2,y:C-F/2});break;case"circle":case"ellipse":this.attr({rx:i.rx*m,ry:i.ry*o,r:i.r*D,cx:A,cy:C});break;case"text":this.attr({x:A,y:C});break;case"path":var G=bp(i.path),H=true,I=r?x:m,J=s?y:o;for(var K=0,L=G[w];K<L;K++){var M=G[K],N=V.call(M[0]);{if(N=="M"&&H)continue;H=false}if(N=="A"){M[G[K][w]-2]*=I;M[G[K][w]-1]*=J;M[1]*=m;M[2]*=o;M[5]=+(t+u?!(!(+M[5])):!(+M[5]))}else if(N=="H")for(var O=1,P=M[w];O<P;O++)M[O]*=I;else if(N=="V")for(O=1,P=M[w];O<P;O++)M[O]*=J;else for(O=1,P=M[w];O<P;O++)M[O]*=O%2?I:J}var Q=bn(G);e=A-Q.x-Q.width/2;f=C-Q.y-Q.height/2;G[0][1]+=e;G[0][2]+=f;this.attr({path:G});break}if(this.type in{text:1,image:1}&&(t!=1||u!=1))if(this.transformations){this.transformations[2]="scale("[n](t,",",u,")");this.node[R]("transform",this.transformations[v](q));e=t==-1?-i.x-(E||0):i.x;f=u==-1?-i.y-(F||0):i.y;this.attr({x:e,y:f});i.fx=t-1;i.fy=u-1}else{this.node.filterMatrix=U+".Matrix(M11="[n](t,", M12=0, M21=0, M22=",u,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}else if(this.transformations){this.transformations[2]=p;this.node[R]("transform",this.transformations[v](q));i.fx=0;i.fy=0}else{this.node.filterMatrix=p;z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}i.scale=[a,b,c,d][v](q);this._.sx=a;this._.sy=b}return this};bO.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale;delete a.translation;return this.paper[this.type]().attr(a)};var cp={},cq=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cp[m],o,p;!n&&(cp[m]=n={data:[]});n.timer&&clearTimeout(n.timer);n.timer=setTimeout(function(){delete cp[m]},2000);if(j!=null){var q=cq(b,c,d,e,f,g,h,i);l=~(~q)*10}for(var r=0;r<l+1;r++){if(n.data[j]>r)p=n.data[r*l];else{p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l);n.data[r]=p}r&&(k+=C(C(o.x-p.x,2)+C(o.y-p.y,2),0.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cr=function(b,c){return function(d,e,f){d=bw(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M"){g=+i[1];h=+i[2]}else{j=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);k+=["C",m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k;k=["M",m.x,m.y+"C",m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]][v]();n+=j;g=+i[5];h=+i[6];continue}if(!b&&!c){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j;g=+i[5];h=+i[6]}k+=i}l.end=k;m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1);m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cs=cr(1),ct=cr(),cu=cr(0,1);bO.getTotalLength=function(){if(this.type!="path")return;if(this.node.getTotalLength)return this.node.getTotalLength();return cs(this.attrs.path)};bO.getPointAtLength=function(a){if(this.type!="path")return;return ct(this.attrs.path,a)};bO.getSubpath=function(a,b){if(this.type!="path")return;if(B(this.getTotalLength()-b)<"1e-6")return cu(this.attrs.path,a).end;var c=cu(this.attrs.path,b,1);return a?cu(c,a).end:c};a.easing_formulas={linear:function(a){return a},"<":function(a){return C(a,3)},">":function(a){return C(a-1,3)+1},"<>":function(a){a=a*2;if(a<1)return C(a,3)/2;a-=2;return(C(a,3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==0||a==1)return a;var b=0.3,c=b/4;return C(2,-10*a)*y.sin((a-c)*(2*D)/b)+1},bounce:function(a){var b=7.5625,c=2.75,d;if(a<1/c)d=b*a*a;else if(a<2/c){a-=1.5/c;d=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;d=b*a*a+0.9375}else{a-=2.625/c;d=b*a*a+0.984375}return d}};var cv=[],cw=function(){var b=+(new Date);for(var c=0;c<cv[w];c++){var d=cv[c];if(d.stop||d.el.removed)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;if(e<g){var r=h(e/g);for(var s in i)if(i[f](s)){switch(X[s]){case"along":o=r*g*j[s];k.back&&(o=k.len-o);var t=ct(k[s],o);m.translate(j.sx-j.x||0,j.sy-j.y||0);j.x=t.x;j.y=t.y;m.translate(t.x-j.sx,t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y);break;case E:o=+i[s]+r*g*j[s];break;case"colour":o="rgb("+[cy(Q(i[s].r+r*g*j[s].r)),cy(Q(i[s].g+r*g*j[s].g)),cy(Q(i[s].b+r*g*j[s].b))][v](",")+")";break;case"path":o=[];for(var u=0,x=i[s][w];u<x;u++){o[u]=[i[s][u][0]];for(var y=1,z=i[s][u][w];y<z;y++)o[u][y]=+i[s][u][y]+r*g*j[s][u][y];o[u]=o[u][v](q)}o=o[v](q);break;case"csv":switch(s){case"translation":var A=r*g*j[s][0]-l.x,B=r*g*j[s][1]-l.y;l.x+=A;l.y+=B;o=A+q+B;break;case"rotation":o=+i[s][0]+r*g*j[s][0];i[s][1]&&(o+=","+i[s][1]+","+i[s][2]);break;case"scale":o=[+i[s][0]+r*g*j[s][0],+i[s][1]+r*g*j[s][1],2 in k[s]?k[s][2]:p,3 in k[s]?k[s][3]:p][v](q);break;case"clip-rect":o=[];u=4;while(u--)o[u]=+i[s][u]+r*g*j[s][u];break}break;default:var C=[].concat(i[s]);o=[];u=m.paper.customAttributes[s].length;while(u--)o[u]=+C[u]+r*g*j[s][u];break}n[s]=o}m.attr(n);m._run&&m._run.call(m)}else{if(k.along){t=ct(k.along,k.len*!k.back);m.translate(j.sx-(j.x||0)+t.x-j.sx,j.sy-(j.y||0)+t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y)}(l.x||l.y)&&m.translate(-l.x,-l.y);k.scale&&(k.scale+=p);m.attr(k);cv.splice(c--,1)}}a.svg&&m&&m.paper&&m.paper.safari();cv[w]&&setTimeout(cw)},cx=function(b,c,d,e,f){var g=d-e;c.timeouts.push(setTimeout(function(){a.is(f,"function")&&f.call(c);c.animate(b,g,b.easing)},e))},cy=function(a){return z(A(a,255),0)},cz=function(a,b){if(a==null)return{x:this._.tx,y:this._.ty,toString:co};this._.tx+=+a;this._.ty+=+b;switch(this.type){case"circle":case"ellipse":this.attr({cx:+a+this.attrs.cx,cy:+b+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+a+this.attrs.x,y:+b+this.attrs.y});break;case"path":var c=bp(this.attrs.path);c[0][1]+=+a;c[0][2]+=+b;this.attr({path:c});break}return this};bO.animateWith=function(a,b,c,d,e){for(var f=0,g=cv.length;f<g;f++)cv[f].el.id==a.id&&(b.start=cv[f].start);return this.animate(b,c,d,e)};bO.animateAlong=cA();bO.animateAlongBack=cA(1);function cA(b){return function(c,d,e,f){var g={back:b};a.is(e,"function")?f=e:g.rot=e;c&&c.constructor==bN&&(c=c.attrs.path);c&&(g.along=c);return this.animate(g,d,f)}}function cB(a,b,c,d,e,f){var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;function m(a){return((i*a+h)*a+g)*a}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(B(f)<b)return e;j=(3*i*e+2*h)*e+g;if(B(j)<0.000001)break;e=e-f/j}c=0;d=1;e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(B(f-a)<b)return e;a>f?c=e:d=e;e=(d-c)/2+c}return e}return n(a,1/(200*f))}bO.onAnimation=function(a){this._run=a||0;return this};bO.animate=function(c,d,e,g){var h=this;h.timeouts=h.timeouts||[];if(a.is(e,"function")||!e)g=e||null;if(h.removed){g&&g.call(h);return h}var i={},j={},k=false,l={};for(var m in c)if(c[f](m)){if(X[f](m)||h.paper.customAttributes[f](m)){k=true;i[m]=h.attr(m);i[m]==null&&(i[m]=W[m]);j[m]=c[m];switch(X[m]){case"along":var n=cs(c[m]),o=ct(c[m],n*!(!c.back)),p=h.getBBox();l[m]=n/d;l.tx=p.x;l.ty=p.y;l.sx=o.x;l.sy=o.y;j.rot=c.rot;j.back=c.back;j.len=n;c.rot&&(l.r=S(h.rotate())||0);break;case E:l[m]=(j[m]-i[m])/d;break;case"colour":i[m]=a.getRGB(i[m]);var q=a.getRGB(j[m]);l[m]={r:(q.r-i[m].r)/d,g:(q.g-i[m].g)/d,b:(q.b-i[m].b)/d};break;case"path":var t=bw(i[m],j[m]);i[m]=t[0];var u=t[1];l[m]=[];for(var v=0,x=i[m][w];v<x;v++){l[m][v]=[0];for(var y=1,z=i[m][v][w];y<z;y++)l[m][v][y]=(u[v][y]-i[m][v][y])/d}break;case"csv":var A=r(c[m])[s](b),B=r(i[m])[s](b);switch(m){case"translation":i[m]=[0,0];l[m]=[A[0]/d,A[1]/d];break;case"rotation":i[m]=B[1]==A[1]&&B[2]==A[2]?B:[0,A[1],A[2]];l[m]=[(A[0]-i[m][0])/d,0,0];break;case"scale":c[m]=A;i[m]=r(i[m])[s](b);l[m]=[(A[0]-i[m][0])/d,(A[1]-i[m][1])/d,0,0];break;case"clip-rect":i[m]=r(i[m])[s](b);l[m]=[];v=4;while(v--)l[m][v]=(A[v]-i[m][v])/d;break}j[m]=A;break;default:A=[].concat(c[m]);B=[].concat(i[m]);l[m]=[];v=h.paper.customAttributes[m][w];while(v--)l[m][v]=((A[v]||0)-(B[v]||0))/d;break}}}if(k){var G=a.easing_formulas[e];if(!G){G=r(e).match(P);if(G&&G[w]==5){var H=G;G=function(a){return cB(a,+H[1],+H[2],+H[3],+H[4],d)}}else G=function(a){return a}}cv.push({start:c.start||+(new Date),ms:d,easing:G,from:i,diff:l,to:j,el:h,t:{x:0,y:0}});a.is(g,"function")&&(h._ac=setTimeout(function(){g.call(h)},d));cv[w]==1&&setTimeout(cw)}else{var C=[],D;for(var F in c)if(c[f](F)&&Z.test(F)){m={value:c[F]};F=="from"&&(F=0);F=="to"&&(F=100);m.key=T(F,10);C.push(m)}C.sort(be);C[0].key&&C.unshift({key:0,value:h.attrs});for(v=0,x=C[w];v<x;v++)cx(C[v].value,h,d/100*C[v].key,d/100*(C[v-1]&&C[v-1].key||0),C[v-1]&&C[v-1].value.callback);D=C[C[w]-1].value.callback;D&&h.timeouts.push(setTimeout(function(){D.call(h)},d))}return this};bO.stop=function(){for(var a=0;a<cv.length;a++)cv[a].el.id==this.id&&cv.splice(a--,1);for(a=0,ii=this.timeouts&&this.timeouts.length;a<ii;a++)clearTimeout(this.timeouts[a]);this.timeouts=[];clearTimeout(this._ac);delete this._ac;return this};bO.translate=function(a,b){return this.attr({translation:a+" "+b})};bO[H]=function(){return"Raphaël’s object"};a.ae=cv;var cC=function(a){this.items=[];this[w]=0;this.type="set";if(a)for(var b=0,c=a[w];b<c;b++){if(a[b]&&(a[b].constructor==bN||a[b].constructor==cC)){this[this.items[w]]=this.items[this.items[w]]=a[b];this[w]++}}};cC[e][L]=function(){var a,b;for(var c=0,d=arguments[w];c<d;c++){a=arguments[c];if(a&&(a.constructor==bN||a.constructor==cC)){b=this.items[w];this[b]=this.items[b]=a;this[w]++}}return this};cC[e].pop=function(){delete this[this[w]--];return this.items.pop()};for(var cD in bO)bO[f](cD)&&(cC[e][cD]=(function(a){return function(){for(var b=0,c=this.items[w];b<c;b++)this.items[b][a][m](this.items[b],arguments);return this}})(cD));cC[e].attr=function(b,c){if(b&&a.is(b,G)&&a.is(b[0],"object"))for(var d=0,e=b[w];d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items[w];f<g;f++)this.items[f].attr(b,c);return this};cC[e].animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items[w],g=f,h,i=this,j;e&&(j=function(){!(--f)&&e.call(i)});d=a.is(d,F)?d:j;h=this.items[--g].animate(b,c,d,j);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,b,c,d,j);return this};cC[e].insertAfter=function(a){var b=this.items[w];while(b--)this.items[b].insertAfter(a);return this};cC[e].getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items[w];e--;){var f=this.items[e].getBBox();a[L](f.x);b[L](f.y);c[L](f.x+f.width);d[L](f.y+f.height)}a=A[m](0,a);b=A[m](0,b);return{x:a,y:b,width:z[m](0,c)-a,height:z[m](0,d)-b}};cC[e].clone=function(a){a=new cC;for(var b=0,c=this.items[w];b<c;b++)a[L](this.items[b].clone());return a};a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c][L](b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=T(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d[Y](/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a};k.getFont=function(b,c,d,e){e=e||"normal";d=d||"normal";c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!a.fonts)return;var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b[Y](/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)){if(h.test(i)){g=a.fonts[i];break}}}var j;if(g)for(var k=0,l=g[w];k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j};k.print=function(c,d,e,f,g,h,i){h=h||"middle";i=z(A(i||0,1),-1);var j=this.set(),k=r(e)[s](p),l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox.split(b),q=+o[0],t=+o[1]+(h=="baseline"?o[3]-o[1]+ +f.face.descent:(o[3]-o[1])/2);for(var u=0,v=k[w];u<v;u++){var x=u&&f.glyphs[k[u-1]]||{},y=f.glyphs[k[u]];l+=u?(x.w||f.w)+(x.k&&x.k[k[u]]||0)+f.w*i:0;y&&y.d&&j[L](this.path(y.d).attr({fill:"#000",stroke:"none",translation:[l,0]}))}j.scale(n,n,q,t).translate(c-q,d-t)}return j};a.format=function(b,c){var e=a.is(c,G)?[0][n](c):arguments;b&&a.is(b,F)&&e[w]-1&&(b=b[Y](d,function(a,b){return e[++b]==null?p:e[b]}));return b||p};a.ninja=function(){i.was?h.Raphael=i.is:delete Raphael;return a};a.el=bO;a.st=cC[e];i.was?h.Raphael=a:Raphael=a})()// ---- /work/units/system/RaphaelCompiled.js ---- 
// ==== /work/units/system/css.js ==== 
function addClass (obj, className) {
	if (!isClass(obj, className)) {
		obj.className += ' '+className;
	}
}

function delClass (obj, className) {
	if (isClass(obj, className)) {
		var Str = obj.className;
		Str = Str.replace(className, '');
		Str = Str.replace(/\s+/g, ' ');
		Str = Str.replace(/^\s+|\s+$/g,''); 
		obj.className = Str;
	}
}

function isClass (obj, className) {
	if (obj.className) {
		return obj.className.indexOf(className) != -1;
	} else {
		return false;
	}
}

function reflectClass (obj, className) {
	if (isClass(obj, className)) {
		delClass(obj, className);
	} else {
		addClass(obj, className);
	}
}

function findChildFromClass (parent, className) {
	if (!parent) { return false; }
	if (parent.nodeType != 1) { return false; }

	var items = parent.childNodes;
	for (var i = 0; i < items.length; i++) { if (isClass(items[i], className)) { return items[i]; } }
	return false;
}

function findChildsFromClass (parent, className) {
	var result = new Array;
	if (!parent) { return result; }
	if (parent.nodeType != 1) { return result; }

	var items = parent.childNodes;
	for (var i = 0; i < items.length; i++) { if (isClass(items[i], className)) { result[result.length] = items[i]; } }
	return result;
}

function findChildFromClassImmersing (parent, className) {
	if (!parent) { return false; }
	if (parent.nodeType != 1) { return false; }

	var items = new Array;
	for (var j = 0; j < parent.childNodes.length; j++) { items[items.length] = parent.childNodes[j]; }
	var item = false;
	for (var i = 0; i < items.length; i++) {
		item = items[i];
		if (isClass(item, className)) { return item; }
		if (item.nodeType == 1) { for (var j = 0; j < item.childNodes.length; j++) { items[items.length] = item.childNodes[j] ; } }
	}
	return false;
}

function findChildsFromClassImmersing (parent, className) {
	var result = new Array;
	if (!parent) { return result; }
	if (parent.nodeType != 1) { return result; }

	var items = new Array;
	for (var j = 0; j < parent.childNodes.length; j++) { items[items.length] = parent.childNodes[j]; }
	var item = false;
	for (var i = 0; i < items.length; i++) {
		item = items[i];
		if (isClass(item, className)) { result[result.length] = item; }
		if (item.nodeType == 1) { for (var j = 0; j < item.childNodes.length; j++) { items[items.length] = item.childNodes[j] ; } }
	}
	return result;
}

function findChildFromClassRecursive (parent, className) {
	if (!parent) { return false; }
	if (parent.nodeType != 1) { return false; }

	var items = parent.childNodes;
	for (var i = 0; i < items.length; i++) {
		item = items[i];
		if (isClass(item, className)) { return item; }
		if (item.nodeType == 1) {
			item = findChildFromClassRecursive(item, className);
			if (item) { return item; }
		} 
	}
	return false;
}

function findChildsFromClassRecursive (parent, className) {
	var result = new Array;
	if (!parent) { return result; }
	if (parent.nodeType != 1) { return result; }

	var items = parent.childNodes;
	for (var i = 0; i < items.length; i++) {
		item = items[i];
		if (isClass(item, className)) { result[result.length] = item; }
		if (item.nodeType == 1) {
			childs = findChildsFromClassRecursive(item, className);
			for (var j = 0; j < childs.length; j++) { result[result.length] = childs[i]; }
		} 
	}
	return result;
}

// ---- /work/units/system/css.js ---- 
// ==== /work/units/system/url.js ==== 
function getPagePath () {
	var my_href       = window.location.href,
		pagePattern   = /\/[^\/]*$/;
	if (pagePattern.test(my_href)) {
		my_href = my_href.replace(pagePattern,'');
	}
	return my_href;
}

function getUrlcoord() {
	var varibleString = window.location.href.split('#');
	varibleString = varibleString[1];
	var coord = {s:'', x:'', y:''}, start;

	if (varibleString) {		
		start = varibleString.search(/s/i) + 1;		
		coord.s = parseInt(varibleString.substr(start));

		start = varibleString.search(/x/i) + 1;
		coord.x = parseInt(varibleString.substr(start));

		start = varibleString.search(/y/i) + 1;
		coord.y = parseInt(varibleString.substr(start));
	}
	 
	return coord;
}

function getUrlOpenObject() {
	var varibleString = window.location.href.split('#');
	varibleString = varibleString[1];
	var pagePath = getPagePath(), url, start, objects;

	if (varibleString) {
		start = varibleString.search(/l/i) + 1;		
		objects = varibleString.substr(start);		
		url = [pagePath, '/scripts/object_labels_children.php?object_str=', objects].join("");
		getUrlWithObject(url, showMapObjects, {tree: null, noTeleport: true});
	}
}

function saveInUrl(name, nextName, value, hrefStr) {
	var varibleString = hrefStr.split('#'),
		href = varibleString[0];
		varibleString = varibleString[1];
	var start, finish, strStart, strFinish;
	
	if (varibleString) {
		start = varibleString.indexOf(name);
		finish = varibleString.indexOf(nextName);
		if (start == -1) {
			strStart = varibleString.substr(0);
		} else {
			strStart = varibleString.substr(0, start);
		}		
		if (finish != -1) {
			strFinish = varibleString.substr(finish);
		} else {
			strFinish = '';
		}
		hrefStr = href + '#' + strStart + name + value + strFinish;
	} else {
		hrefStr = href + '#' + name + value;
	}
	return hrefStr;
}
// ---- /work/units/system/url.js ---- 
// ==== /work/units/system/xml.js ==== 
// JavaScript Document

var XML = {};

/**
* Создает новый объект Document. При отсутствии аргументов создает пустой
* документ. Если указан корневой тег, документ будет содержать единственный
* корневой тег. Если корневой тег имеет префикс пространства имен, второй аргумент
* должен содержать URLадрес, идентифицирующий это пространство имен.
*/
XML.newDocument = function(rootTagName, namespaceURL) {
	if (!rootTagName) rootTagName = "";
	if (!namespaceURL) namespaceURL = "";
	if (document.implementation && document.implementation.createDocument) {
		// Способ создания в соответствии со стандартом W3C
		return document.implementation.createDocument(namespaceURL, rootTagName, null);
	}
	else { // Способ, специфичный для IE
		// Создать пустой документ как ActiveXобъект.
		// Если корневой элемент не определен, на этом создание
		// документа можно считать законченным
		var doc = new ActiveXObject("MSXML2.DOMDocument");
		// Если корневой элемент определен, инициализировать документ
		if (rootTagName) {
			// Проверить наличие префикса пространства имен
			var prefix = "";
			var tagname = rootTagName;
			var p = rootTagName.indexOf(':');
			if (p != 1) {
				prefix = rootTagName.substring(0, p);
				tagname = rootTagName.substring(p+1);
			}
			// Если пространство имен определено, должен быть префикс пространства имен.
			// Если пространство имен не определено, необходимо удалить
			// существующий префикс
			if (namespaceURL) {
				if (!prefix) prefix = "a0"; // Используется в Firefox
			}
			else prefix = "";
			// Создать корневой элемент (с необязательным пространством
			// имен) в виде текстовой строки
			var text = "<" + (prefix?(prefix+":"):"") + tagname + (namespaceURL?(" xmlns:" + prefix + '="' + namespaceURL +'"'):"") +"/>";
			// И преобразовать текст в пустой документ
			doc.loadXML(text);
		}
		return doc;
	}
};

XML.load = function(url) {
	// Создать пустой документ с помощью функции, определенной ранее
	var xmldoc = XML.newDocument();
	xmldoc.async = false; // Загрузка выполняется синхронно
	xmldoc.load(url); // Загрузить и проанализировать
	return xmldoc; // Вернуть документ
};

XML.loadXML = function(xmlString) {
	// Создать пустой документ с помощью функции, определенной ранее
	var xmldoc = XML.newDocument();
	xmldoc.async = false; // Загрузка выполняется синхронно
	xmldoc.loadXML(xmlString); // Загрузить и проанализировать
	return xmldoc; // Вернуть документ	
}

XML.parse = function(text) {
	if (typeof DOMParser != "undefined") {return (new DOMParser()).parseFromString(text, "application/xml");}
	else if (typeof ActiveXObject != "undefined") {
		var doc = XML.newDocument();
		doc.loadXML(text); // Выполнить синтаксический
		return doc; // Вернуть документ
	}
	else {
		var url = "data:text/xml;charset=utf8," + encodeURIComponent(text);
		var request = new XMLHttpRequest();
		request.open("GET", url, false);
		request.send(null);
		return request.responseXML;
	}
};// ---- /work/units/system/xml.js ---- 
// ==== /work/units/system/onload.js ==== 

var onloadHandlers  = Array();
var resizeHandlers  = Array();
var mouseupHandlers = Array();
var wheelHandlers   = Array();
var afterMapScaleHandlers = Array();
var afterMapDragHandlers = Array();
var dragHandlers    = Array();
var hideAllHandlers  = Array();
var showAllHandlers  = Array();

function savePosition () {
	var d = new Date(),
		t = parseInt(d.getTime()) + (2*24*60*60*1000),
		center = mapController.searchCenterCell();
	d = new Date(t);
	document.cookie = ['scale=', mapController.getScale(), ';expires=', d.toString(), ';path=/'].join("");
	document.cookie = ['x=', center.x, ';expires=', d.toString(), ';path=/'].join("");
	document.cookie = ['y=', center.y, ';expires=', d.toString(), ';path=/'].join("");

	var href = saveInUrl('s', 'x', mapController.getScale(), window.location.href);
	href = saveInUrl('x', 'y', center.x, href);
	href = saveInUrl('y', 'l', center.y, href);
	window.location.href = href;
	/*var url = window.location.href.split('#')[0];
	url = [url, '#s',mapController.getScale(), 'x', center.x, 'y', center.y].join('');
	window.location.href = url;*/

}

function addOnloadEvent(newFunc) {
	onloadHandlers[onloadHandlers.length] = newFunc;
}

function addMouseUpEvent(newFunc) {
	mouseupHandlers[mouseupHandlers.length] = newFunc;
}

function addResizeEvent(newFunc) {
	resizeHandlers[resizeHandlers.length] = newFunc;
}

function addWheelEvent(newFunc) {
	wheelHandlers[wheelHandlers.length] = newFunc;
}

function addAfterMapScale(newFunc) {
	afterMapScaleHandlers[afterMapScaleHandlers.length] = newFunc;
}

function addAfterMapDrag(newFunc) {
	afterMapDragHandlers[afterMapDragHandlers.length] = newFunc;
}

function addDragEvent(newFunc) {
	dragHandlers[dragHandlers.length] = newFunc;
}

function addHideAllFunction(newFunc) {
	hideAllHandlers[hideAllHandlers.length] = newFunc;
}

function addShowAllFunction(newFunc) {
	showAllHandlers[showAllHandlers.length] = newFunc;
}

function globalOnLoad () {
	for (var i = 0; i < onloadHandlers.length; i++) {
		onloadHandlers[i]();
	}
	var wall = 	get('whiteCurtain');
	if (wall) {wall.style.display='none';}
	//	get('whiteCurtain2').style.display='none'; а две завесы-то зачем?
//	setTimeout("get('whiteCurtain').style.display='none';",2000);
	//скрытие занавеса ,после выполнения всех скриптов
}

function globalOnResize () {
	for (var i = 0; i < resizeHandlers.length; i++) {
		resizeHandlers[i]();
	}
}

function globalOnMouseUp () {	
	for (var i = 0; i < mouseupHandlers.length; i++) {
		mouseupHandlers[i]();
	}
}

function globalOnWheel(wheelDelta, event) {
	for (var i = 0; i < wheelHandlers.length; i++) {
		wheelHandlers[i](wheelDelta, event);
	}
}

function afterMapScale() {
	for (var i = 0; i < afterMapScaleHandlers.length; i++) {
		afterMapScaleHandlers[i]();
	}
	//myLog(mapController.getOptions().currentScale);
}

function afterMapDrag() {
	if (goDrag) {
		savePosition();
		for (var i = 0; i < afterMapDragHandlers.length; i++) {
			afterMapDragHandlers[i]();
		}
	}
}

var blockAllDrag = false;
function globalDrag(event) {
	for (var i = 0; i < dragHandlers.length; i++) {
			dragHandlers[i](event);
	}
}

var mousePosOld = null;
var mousePos    = null;

function mouseMove(event) {
	event = event || window.event;
	if (!mousePosOld) {
		mousePosOld = mouseCoords(event);
		mousePos = mousePosOld;
	}
	else {
		mousePosOld = mousePos;
		mousePos = mouseCoords(event);
	}
	if (!blockAllDrag) {
		globalDrag(event);
	}
	else {
		blockAllDrag(event);
	}
}

function mouseWheelCallback() {
	this.callbacks   = [];
	this.addCallback = function(callback, params) {this.callbacks[this.callbacks.length] = {callback : callback, params : params || false};};
	this.activate    = function(paramA, paramB, paramC) {for (var i = 0; i < this.callbacks.length; i++) {
			this.callbacks[i].callback(paramA, paramB, paramC, this.callbacks[i].params);
		}
	};
}
var mouseWheelStack = new mouseWheelCallback();

function mouseWheel() {
	var scrollerEvent = arguments[0] || window.event,
		targetElement = scrollerEvent.target || scrollerEvent.srcElement,
		wheelDelta    = 0,
		mouseOffset   = mouseCoords(scrollerEvent);
	if (scrollerEvent.wheelDelta) {
		wheelDelta = scrollerEvent.wheelDelta / 120;
	} else if (scrollerEvent.detail) {
		wheelDelta = -scrollerEvent.detail / 3;
	}
	if (mouseWheelStack) {mouseWheelStack.activate(wheelDelta, mouseOffset, targetElement);}
}

function hideAll(hider) {
	var i,
		napr = findChildFromClass(hider, 'forward');

	if (napr) {
		for (i = 0; i < hideAllHandlers.length; i++) {
			hideAllHandlers[i]();
		}
	} else {
		for (i = 0; i < showAllHandlers.length; i++) {
			showAllHandlers[i]();
		}
	}
}

window.onload   = globalOnLoad;
document.onmousemove = function(event) {event = event || window.event; mouseMove(event);};
window.onresize = globalOnResize;
document.onmouseup = globalOnMouseUp;
// ---- /work/units/system/onload.js ---- 
// ==== /work/units/security/security.js ==== 
 
var email_pattern = /^\s*\w+@\w+\.\w+\s*$/;

function checkEmail (obj, cb) {
	var url = 'http:\x2F\x2Fcreator/map/scripts/email.php?email='+field.value;
	
	if (email_pattern.test(obj.value)) {
		getUrl(url, function(a,b,c) { cb(ajaxBoolReply(a, b, c)); } );
	} else { cb(false); }
}

function checkPassword (obj, depend, cb) {
	var url = 'http:\x2F\x2Fcreator/map/scripts/login.php?email=' + depend.value + '&password=' + obj.value;		

	if (email_pattern.test(depend.value)) {
		getUrl(url, function(a,b,c) { cb(ajaxBoolReply(a, b, c)); } );
	} else { cb(false); }
}

function changeStatus (obj, status) {
	setCheckStatusClass(obj, status, 'statusOk', 'statusNone', 'statusFail');
}

function changeStatusLoginInput (obj, status) {
	setCheckStatusClass(obj, status, 'inputOk', 'inputNone', 'inputFail');
}

function changeSubmit (obj, status) {
	setCheckStatusClass(obj, status, 'submitOk', 'submitNone', 'submitFail');
}
// ---- /work/units/security/security.js ---- 
// ==== /work/units/security/form.js ==== 
var checkInterval = null;
var groupArray = Array;


function makeCheckable (fieldArray) {
	var i,j;
	var field,submitButton;
	
	for (i = 0; i < fieldArray.length; i++) {
		groupArray[fieldArray[i].name] = Array();
		for (j = 0; j < fieldArray[i].fields.length; j++) {
			field = get(fieldArray[i].fields[j].id);
			
			groupArray[fieldArray[i].name][j] = field;
			
			if (fieldArray[i].fields[j].linkId) { field.linkId = fieldArray[i].fields[j].linkId; }
			
			field.statusId = fieldArray[i].fields[j].status;
			field.group = fieldArray[i].name;
			field.check = false;
			field.onkeyup = function() { checkField(this,1800); };
			field.onblur = function() { checkField(this,1); };
		}
		
		if (fieldArray[i].submitId) {
			submitButton = get(fieldArray[i].submitId);
			submitButton.clickable = false;
			submitButton.onclick = function() { if (!this.clickable) { return false; }; return true; };
			groupArray[fieldArray[i].name]['submit'] = submitButton;
		}
	}
}

function checkGroup (groupId) {
	window.status = groupId;
	var i;
	for (i = 0; i<groupArray[groupId].length; i++) {
		if (!groupArray[groupId][i].check) {
			groupArray[groupId]['submit'].className = 'submitInactive';
			return false;
		}
	}
	groupArray[groupId]['submit'].className = 'submit';
	groupArray[groupId]['submit'].clickable = true;
	return true;
}
/*
function checkEmail (field,linkId) {
	var pattern = /^\s*\w+@\w+\.\w+\s*$/;
	var url = 'http:\x2F\x2Fcreator/map/scripts/email.php?email='+field.value;
	var statusBar = get(field.statusId);
	
	if (pattern.test(field.value)) {
		var bool = false;
		
		getUrl(url, function(a,b,c) {
							 			bool = ajaxReply(a,b,c);
										if (bool) {
											statusBar.className = 'statusOk';
											if (linkId) {
												var linkedField = get(linkId);
												checkPassword(linkedField,field);
											}
											field.check = true;
											checkGroup(field.group);
										} else {
											statusBar.className = 'statusFail';
											field.className = 'inputFail';
											field.check = false;
											checkGroup(field.group);
										}	
									});
	} else {
		field.className = 'inputFail';
		field.check = false;
		statusBar.className = 'statusFail';
	}

	clearInterval(checkInterval);
}

function checkPassword (passwordField, linkField) {
		var url = 'http:\x2F\x2Fcreator/map/scripts/login.php?email=' + linkField.value + '&password=' + passwordField.value;		
		getUrl(url, function(a,b,c) {
							 			bool = ajaxReply(a,b,c);
										if (bool) {
											if (!linkField.check) {
												checkField(linkField);
											}
											
											passwordField.check = true;
											checkGroup(passwordField.group);
										} else {
											passwordField.className = 'inputFail';
											passwordField.check = false;
											checkGroup(passwordField.group);
										}	
									});
}
*/
function ajaxReply (Status, Headers, Text) {
	if (Text == '[TRUE]') {
		return true;
	} else {
		return false;
	}
}

function checkField (object, interval) {
	var statusBar;
	
	if (object.statusId) {
		statusBar = object.statusId;
		statusBar.className = 'status';
	}

	object.className = 'checkableInput';
	
	if (object.type == 'text') {
		if (checkInterval) {
			clearInterval(checkInterval);
		}
		if (object.linkId) {
			checkInterval = window.setInterval(function () { checkEmail(object,object.linkId);},interval);
		} else {
			checkInterval = window.setInterval(function () { checkEmail(object);},interval);
		}
	}
	
	if (object.type == 'password') {
		var linkField = get(object.linkId);
		checkPassword(object, linkField)
	}
	
}
function openHelpPannel() {
	if (globalLoginHelp) {
		if (globalLoginHelp.style.display == 'block') {
			globalLoginHelp.hide();
		}
		else {
			globalLoginHelp.show();
		}
	}
}
function initHelperButton(obj) {
	if (obj) {
		obj.onclick = openHelpPannel;
	}
}
// ---- /work/units/security/form.js ---- 
// ==== /work/units/javalog/javascript.js ==== 
function myLog(str) {
	var logDiv        = get('log'),
		newLogDiv     = document.createElement('div'),
		newLogContent = document.createTextNode(str);
	if (logDiv) {
		if (!logDiv.style.zIndex) {logDiv.style.zIndex = 1000;}
		newLogDiv.appendChild(newLogContent);
		logDiv.appendChild(newLogDiv);
	}
}
// ---- /work/units/javalog/javascript.js ---- 
// ==== /work/units/mapviewer/mapSystem.js ==== 
// JavaScript Document
var goDrag = false,
	redrawInterval = false,
	imageDummy,
	mapController,
	newCells = false;

function mapOptions() {
	var coord = getUrlcoord();
	this.name         = 'mapOptions';
	this.cellWidth    = 250;
	this.cellHeight   = 250;
	this.defaultScale = coord.s;
	if (!isInteger(this.defaultScale)) {
		this.defaultScale = parseInt(getCookie('scale'),10);
		if (!isInteger(this.defaultScale)) {
			this.defaultScale = 7;
		}
	}

	this.scaleStep    = 1.3;
	this.zoomInLimit  = -4;
	this.zoomOutLimit = 11;
	this.minX = -6730;
	this.minY = -6590;
	this.maxX = 8990;
	this.maxY = 6800;
	this.xyLimited = false;
	this.outerCellsX  = 1;
	this.outerCellsY  = 1;
	this.cellsX       = null;
	this.cellsY       = null;
	this.xOffset      = 0;
	this.yOffset      = 0;
	this.redrawTiming = 600;
	this.moveLeftLimit   = -50;
	this.moveRightLimit  = -350;
	this.moveTopLimit    = -50;
	this.moveBottomLimit = -350;
	this.getScale = function() {return this.currentScale;};
	this.getStep  = function() {return this.scaleStep;};
	this.getOption = function(optionName) {
		if (this.hasOwnProperty(optionName)) {
			return this[optionName];
		}
		return false;
	};
}

function objectInherit(parentObject, childObject) {
	var i      = 0,
		result = {};
	for (i in parentObject) {if (parentObject.hasOwnProperty(i)) {result[i] = parentObject[i];}}
	for (i in childObject) {if (childObject.hasOwnProperty(i)) {result[i] = childObject[i];}}
	return result;
}

function mapViewerController(domNode, mapOptions) {
	var resultObject = {
		rootNode	   : domNode,
		getRoot        : function() {return this.rootNode || false;},
		rootSize       : null,
		getSize        : function() {if (this.getRoot()) {this.rootSize = getSize(this.getRoot()); return true;} else {return false;}},
		tableWidth     : null,
		tableHeight    : null,
		currentScale   : mapOptions.defaultScale,
		decreaseScale  : function() {if (this.scaleLimits(-1)) {this.currentScale--; return this.currentScale;} else {return false;}},
		increaseScale  : function() {if (this.scaleLimits(1)) {this.currentScale++; return this.currentScale;} else {return false;}},
		scaleLimits    : function(move) {if ((this.currentScale + move > this.zoomOutLimit) || (this.currentScale + move < this.zoomInLimit)) {return false;} return true;},
		countCells     : function() {
							this.cellsX  = Math.floor(this.rootSize.width  / this.cellWidth);
							this.cellsX += (2 * this.outerCellsX);
							this.cellsY  = Math.floor(this.rootSize.height / this.cellHeight);
							this.cellsY += (2 * this.outerCellsY);
						},
		countTableSize : function() {this.tableWidth = this.cellsX * this.cellWidth; this.tableHeight = this.cellsY * this.cellHeight;},		
		recountViewer  : function() {
							if (this.getSize()) {							
								this.countCells();
								this.countTableSize();
							}
						},
		setOffset : function () {
			var coord = getUrlcoord();
			var ofX = parseInt(coord.x, 10),
				ofY = parseInt(coord.y, 10);
			if (!isInteger(ofX)) {ofX = parseInt(getCookie('x'), 10);}
			if (!isInteger(ofY)) {ofY = parseInt(getCookie('y'), 10);}
			if (!isInteger(ofX)) {
				ofX = this.rootSize.width / 2;
			}
			if (!isInteger(ofY)) {
				ofY = this.rootSize.height / 2;
			}

			this.xOffset = -Math.floor(ofX / this.cellWidth) + Math.floor((this.rootSize.width / 2) / this.cellWidth) - 1;
			this.yOffset = -Math.floor(ofY / this.cellHeight) + Math.floor((this.rootSize.height / 2)/ this.cellHeight) - 1;
			if (ofY > 0) {
				this.yOffset++;
			}
			if (ofX > 0) {
				this.xOffset++;
			}
		}
	};
	resultObject = objectInherit(mapOptions, resultObject);
	resultObject.recountViewer();
	resultObject.setOffset();
	return resultObject;
}

function mapImageCellFactory(x, y, cssX, cssY, scale, pagePath, domHolder) {
	var resultObject = {
		x           : x,
		y           : y,
		setX        : function(x) {
			this.x = x;
			this.imageObject.style.visibility = 'hidden';
			this.imageObject.src = this.createUrl();
			this.loaded = false;
			this.onLoadImage();
		},
		setY        : function(y) {
			this.y = y;
			this.stopped = false;
			this.imageObject.style.visibility = 'hidden';
			this.imageObject.src = this.createUrl();
			this.loaded = false;
			this.onLoadImage();
		},
		setXY       : function(x, y) {
			this.x = x;
			this.y = y;
			this.imageObject.src = this.createUrl();
			this.loaded = false;
			this.onLoadImage();
		},
		cssX        : cssX,
		cssY        : cssY,
		setCssX     : function(x) {
			this.cssX = x;
			this.imageObject.style.left = x + 'px';
		},
		setCssY     : function(y) {
			this.cssY = y;
			this.imageObject.style.top = y + 'px';
		},
		getRoot     : function() {return domHolder;},
		scale       : scale,
		setScale    : function(scale) {
			this.scale = scale;
			this.imageObject.style.visibility = 'hidden';
			this.imageObject.src = this.createUrl();
			this.loaded = false;
			this.onLoadImage();
		},
		getScale    : function() {return this.scale;},
		getPagePath : function() {return pagePath;},
		createUrl   : function() {return ['/mapcell/mapcell', this.getScale(), 's', this.x, 'x', this.y, 'y', '.png'].join("") || false;},
		imageObject : new Image(),
		loading     : false,
		loaded      : false,
		stopped     : false,
		onLoadImage : function() {var caller = this; this.imageObject.onload = function() {caller.loaded = true; this.style.visibility = 'visible';};},
		loadImage   : function() {
						var url   = this.createUrl();
						if (url) {
							if (!this.stopped) {
								this.loading = true;
								this.imageObject.setAttribute("style", "-moz-user-select:none;");
								this.imageObject.style.left = this.cssX + 'px';
								this.imageObject.style.top  = this.cssY + 'px';
								if(getCookie('mapCellReview')){
									this.imageObject.style.border = '1px solid #000';
								}
								this.imageObject.src        = url;
								this.imageObject.style.visibility = 'hidden';
								this.getRoot().appendChild(this.imageObject);
							} else {
								this.imageObject.style.visibility = 'hidden';
								this.imageObject.src = url;
							}
							this.onLoadImage();
						}
					  },
		resizeImage : function(width, height, offsetX, offsetY) {
			this.imageObject.style.width  = width  + 'px';
			this.imageObject.style.height = height + 'px';
			this.setCssX(this.cssX - offsetX);
			this.setCssY(this.cssY - offsetY);
		},
		changeSizeAndScale : function(width, height, offsetX, offsetY, scale) {
			this.resizeImage(width, height, offsetX, offsetY);
			this.setScale(scale);
		},
		stopLoading : function() {
			if (!this.loaded) {
				this.imageObject.onload = function() {return false;};
				this.stopped            = true;
				this.imageObject.src    = imageDummy.src;
				this.loaded             = false;
			}
		},
		continueLoading : function() {
			if (this.stopped) {
				this.stopped = false;
				this.imageObject.style.visibility = 'visible';
				this.loadImage();
			}
		}
	};
	return resultObject;
}

function mapTableFactory(cellsX, cellsY, outerX, outerY, width, height, rootObject, xOffset, yOffset, scale, cellWidth, cellHeight) {
	var resultObject = {
		scale       : scale,
		getScale    : function() {return this.scale;},
		cellsX      : cellsX,
		cellsY      : cellsY,
		getOuterX   : function() {return outerX;},
		getOuterY   : function() {return outerY;},
		width       : width,
		height      : height,
		me          : null,
		imageMatrix : [],
		getRoot     : function() {return rootObject;},
		getCellWidth  : function() {return cellWidth;},
		getCellHeight : function() {return cellHeight;},
		createTableStructure : function() {
					var holder   = document.createElement('DIV'),
						matrix   = [],
						pagePath = getPagePath(),
						width    = this.getCellWidth(),
						height   = this.getCellHeight(),
						i, j;
					for (i = 0; i < this.cellsY; i++) {
						for (j = 0; j < this.cellsX; j++) {
							if (!matrix[i]) {matrix[i] = [];}
							matrix[i][j] = mapImageCellFactory(-(Math.round(cellsX / 2) - j - 1 - xOffset), -(Math.round(cellsY / 2) - i - 1 - yOffset), (j - this.getOuterX()) * width, (i - this.getOuterY()) * height, this.getScale(), pagePath, holder);
						}
					}
					holder.style.left = '0px';
					holder.style.top  = '0px';
					holder.onselectstart = function() {return false;};
					this.imageMatrix = matrix;
					return {root: holder, cells: matrix};
		},
		fillTableStructure : function(structure) {
			if (structure.cells) {if (structure.cells[0]) {this.recursiveLoad(structure.cells, Math.round(structure.cells.length / 2), Math.round(structure.cells[0].length / 2));}}
			return structure.root;
		},
		recursiveLoad : function(matrix, i, j) {
			if (matrix[i]) {
				if (matrix[i][j]) {
					if (!matrix[i][j].loading) {
						matrix[i][j].loadImage();
						this.recursiveLoad(matrix, i - 1, j - 1);
						this.recursiveLoad(matrix, i - 1, j);
						this.recursiveLoad(matrix, i - 1, j + 1);
						this.recursiveLoad(matrix, i + 1, j - 1);
						this.recursiveLoad(matrix, i + 1, j);
						this.recursiveLoad(matrix, i - 1, j + 1);
						this.recursiveLoad(matrix, i, j - 1);
						this.recursiveLoad(matrix, i, j + 1);
					}
				}
			} else {return false;}
		},
		createMe : function() {
			this.me = this.fillTableStructure(this.createTableStructure());
			this.getRoot().appendChild(this.me);
		},
		getLeftBorder : function() {
			return this.imageMatrix[0][0].cssX + parseInt(this.getRoot().style.left, 10) + parseInt(this.me.style.left, 10);
		},
		getTopBorder : function() {
			return this.imageMatrix[0][0].cssY + parseInt(this.getRoot().style.top, 10) + parseInt(this.me.style.top, 10);
		},
		jumpOsX : function(offsetX) {
			var i,j, move, currentObject,
				width  = this.getCellWidth();
			if (signum(offsetX) < 0) {
				for (i = 0; i < this.cellsY; i++) {
					currentObject = this.imageMatrix[i][0];
					currentObject.imageObject.style.visibility = 'hidden';
					currentObject.setCssX(this.imageMatrix[0][this.imageMatrix[0].length - 1].cssX + width);
					currentObject.setX(this.imageMatrix[0][this.imageMatrix[0].length - 1].x + 1);
				}
				for (i = 0; i < this.cellsY; i++) {
					move = this.imageMatrix[i][0];
					for (j = 1; j < this.imageMatrix[i].length; j++) {this.imageMatrix[i][j - 1] = this.imageMatrix[i][j];}
					this.imageMatrix[i][this.imageMatrix[i].length - 1] = move;
				}
			} else {
				for (i = 0; i < this.cellsY; i++) {
					currentObject = this.imageMatrix[i][this.imageMatrix[i].length - 1];
					currentObject.imageObject.style.visibility = 'hidden';
					currentObject.setCssX(this.imageMatrix[i][0].cssX - width);
					currentObject.setX(this.imageMatrix[i][0].x - 1);
				}
				for (i = 0; i < this.cellsY; i++) {
					move = this.imageMatrix[i][this.imageMatrix[i].length - 1];
					for (j = this.imageMatrix[i].length - 2; j >= 0; j--) {this.imageMatrix[i][j + 1] = this.imageMatrix[i][j];}
					this.imageMatrix[i][0] = move;
				}
			}
		},
		jumpOsY : function(offsetY) {
			var i,j, move, currentObject,
				height = this.getCellHeight();
			if (signum(offsetY) < 0) {
				for (j = 0; j < this.cellsX; j++) {
					currentObject = this.imageMatrix[0][j];
					currentObject.imageObject.style.visibility = 'hidden';
					currentObject.setCssY(this.imageMatrix[this.imageMatrix.length - 1][j].cssY + height);
					currentObject.setY(this.imageMatrix[this.imageMatrix.length - 1][0].y + 1);
				}
				move = this.imageMatrix[0];
				for (i = 0; i < this.imageMatrix.length - 1; i++) {this.imageMatrix[i] = this.imageMatrix[i + 1];}
				this.imageMatrix[this.imageMatrix.length - 1] = move;
			} else {
				for (j = 0; j < this.cellsX; j++) {
					currentObject = this.imageMatrix[this.imageMatrix.length - 1][j];
					currentObject.imageObject.style.visibility = 'hidden';
					currentObject.setCssY(this.imageMatrix[0][j].cssY - height);
					currentObject.setY(this.imageMatrix[0][j].y - 1);
				}
				move = this.imageMatrix[this.imageMatrix.length - 1];
				for (i = this.imageMatrix.length - 1; i > 0; i--) {this.imageMatrix[i] = this.imageMatrix[i-1];}
				this.imageMatrix[0] = move;
			}
		},
		scaleTable : function(step, toScale, coords) {
			var ratio      = Math.pow(step, toScale - this.getScale()),
				cellWidth  = this.getCellWidth(),
				cellHeight = this.getCellHeight(),
				oldWidth   = parseInt(this.imageMatrix[0][0].imageObject.style.width, 10)  || cellWidth,
				oldHeight  = parseInt(this.imageMatrix[0][0].imageObject.style.height, 10) || cellHeight,
				rootObject = this.me,
				root = this.getRoot(),
				rootl = parseInt(root.style.left, 10),
				roott = parseInt(root.style.top, 10),
				rootLeft   = parseInt(rootObject.style.left, 10),
				rootTop    = parseInt(rootObject.style.top, 10),
				width  = Math.round(cellWidth / ratio),
				height = Math.round(cellHeight / ratio),
				moveX  = oldWidth  - width,
				moveY  = oldHeight - height,
				mouseRatioX = (oldWidth  * this.cellsX) / (coords.x - this.imageMatrix[0][0].cssX - rootLeft - rootl),
				mouseRatioY = (oldHeight * this.cellsY) / (coords.y - this.imageMatrix[0][0].cssY - rootTop - roott),
				moveRootX   = ((oldWidth  * this.cellsX) / mouseRatioX) - ((width  * this.cellsX) / mouseRatioX),
				moveRootY   = ((oldHeight * this.cellsY) / mouseRatioY) - ((height * this.cellsY) / mouseRatioY),
				newRootLeft = Math.round(rootLeft + moveRootX),
				newRootTop  = Math.round(rootTop  + moveRootY),
				i, j;
			for (i = 0; i < this.imageMatrix.length; i++) {
				for (j = 0; j < this.imageMatrix[i].length; j++) {
					if (j === 0) {if (i === 0) {this.imageMatrix[i][j].resizeImage(width, height, 0, 0);} else {this.imageMatrix[i][j].resizeImage(width, height, 0, moveY * i);}}
					else {if (i === 0) {this.imageMatrix[i][j].resizeImage(width, height, moveX * j, 0);} else {this.imageMatrix[i][j].resizeImage(width, height, moveX * j, moveY * i);}}
				}
			}
			rootObject.style.left = newRootLeft + 'px';
			rootObject.style.top  = newRootTop  + 'px';
		},
		resizeTable : function (tableOptions) {
			if (this.cellsX < tableOptions.cellsX) {
				this.cellsX = tableOptions.cellsX;
				this.width  = tableOptions.tableWidth;
			}
			if (this.cellsY < tableOptions.cellsY) {
				this.cellsY = tableOptions.cellsY;
				this.height = tableOptions.tableHeight;
			}
		},
		imagesToSizeAndScale : function(width, height, scale) {
			var oldWidth   = parseInt(this.imageMatrix[0][0].imageObject.style.width, 10)  || cellWidth,
				oldHeight  = parseInt(this.imageMatrix[0][0].imageObject.style.height, 10) || cellHeight,
				moveX  = oldWidth  - width,
				moveY  = oldHeight - height,
				i, j;
			for (i = 0; i < this.imageMatrix.length; i++) {
				for (j = 0; j < this.imageMatrix[i].length; j++) {
					if (j === 0) {if (i === 0) {this.imageMatrix[i][j].changeSizeAndScale(width, height, 0, 0, scale);} else {this.imageMatrix[i][j].changeSizeAndScale(width, height, 0, moveY * i, scale);}}
					else {if (i === 0) {this.imageMatrix[i][j].changeSizeAndScale(width, height, moveX * j, 0, scale);} else {this.imageMatrix[i][j].changeSizeAndScale(width, height, moveX * j, moveY * i, scale);}}
				}
			}
		},
		stopLoading : function() {
			var i,j;
			for (i = 0; i < this.cellsY; i++) {
				for (j = 0; j < this.cellsX; j++) {
					if (this.imageMatrix[i][j]) {
						this.imageMatrix[i][j].stopLoading();
					}
				}
			}
		},
		continueLoading : function() {
			var i,j, newCell, flag = false;
			for (i = 0; i < this.cellsY; i++) {
				flag = false;
				if (!this.imageMatrix[i]) { this.imageMatrix[i] = []; flag = true}
				for (j = 0; j < this.cellsX; j++) {
					if (this.imageMatrix[i][j]) {
						this.imageMatrix[i][j].continueLoading();
					} else {
						if (flag) {
							newCell = {x: this.imageMatrix[i-1][j].x, y: this.imageMatrix[i-1][j].y + 1, cssX: this.imageMatrix[i-1][j].cssX, cssY: this.imageMatrix[i-1][j].cssY + this.getCellHeight()}
						} else {
							newCell = {x: this.imageMatrix[i][j-1].x + 1, y: this.imageMatrix[i][j-1].y, cssX: this.imageMatrix[i][j-1].cssX + this.getCellWidth(), cssY: this.imageMatrix[i][j-1].cssY}
						}
						this.imageMatrix[i][j] = mapImageCellFactory(newCell.x,
																     newCell.y,
																     newCell.cssX,
																     newCell.cssY,
																     this.scale, getPagePath(), this.me);
						this.imageMatrix[i][j].loadImage();
					}
				}
			}
		},
		calculateLoadingProgress : function() {
			var i,j, loaded = 0, total = this.cellsX * this.cellsY;
			for (i = 0; i < this.cellsY; i++) {for (j = 0; j < this.cellsX; j++) {if (this.imageMatrix[i][j]) {if (this.imageMatrix[i][j].loaded) {loaded++;}}}}
			return loaded / total;
		},
		setZIndex : function(zIndex) {
			this.me.style.zIndex = zIndex;
		},
		hideMe : function() {this.getRoot().style.visibility = 'hidden' ;},
		showMe : function() {this.getRoot().style.visibility = 'visible';}
	};
	resultObject.createMe();
	return resultObject;
}

function mapTableController(optionsObject) {
	var resultObject = {
		getOptions : function() {return optionsObject;},
		tableSwapper : {
			counter : 0,
			checkCounter : function() {
				if (this.counter >= 2) {return false;}
				return true;
			},
			foreground : null,
			background : null,
			addObject  : function(object) {
				if (!this.checkCounter()) {return false;}
				else {
					if (this.foreground) {this.background = object; this.swapObjects();} else {this.foreground = object; this.foreground.setZIndex(2);}
					this.counter++;
				}
			},
			swapObjects : function() {
				var swap = this.foreground;
				this.foreground = this.background;
				this.background = swap;
				this.foreground.setZIndex(2);
				this.background.setZIndex(1);
			}
		},
		tables     : {},
		addTable   : function(scale) {
			if (!this.tables[scale]) {
				var mapOptions = this.getOptions();
				this.tables[scale] = mapTableFactory(mapOptions.cellsX, mapOptions.cellsY, mapOptions.outerCellsX, mapOptions.outerCellsY, mapOptions.tableWidth, mapOptions.tableHeight, mapOptions.getRoot(), mapOptions.xOffset, mapOptions.yOffset, scale, mapOptions.cellWidth, mapOptions.cellHeight);
				this.tableSwapper.addObject(this.tables[scale]);
			}
			return this.tables[scale];
		},
		offsetX : 0,
		offsetY : 0,
		controlDragOffset : function() {
			var mapOptions = this.getOptions(),
				left  = null,
				top   = null,
				table = this.tables[mapOptions.currentScale] || false;
			if (table) {
				left = table.getLeftBorder();
				top  = table.getTopBorder();
				if (left > mapOptions.moveLeftLimit) {
					newCells = true;
					while (left > mapOptions.moveLeftLimit)   {table.jumpOsX(1);  left = table.getLeftBorder();}
				}
				if (left < mapOptions.moveRightLimit) {
					newCells = true;
					while (left < mapOptions.moveRightLimit)  {table.jumpOsX(-1); left = table.getLeftBorder();}
				}
				if (top  > mapOptions.moveTopLimit) {
					newCells = true;
					while (top  > mapOptions.moveTopLimit)    {table.jumpOsY(1);  top  = table.getTopBorder();}
				}
				if (top  < mapOptions.moveBottomLimit) {
					newCells = true;
					while (top  < mapOptions.moveBottomLimit) {table.jumpOsY(-1); top  = table.getTopBorder();}
				}
			}
		},
		scaleMap : function(delta, mouseCoords, target, controller) {
			var mapOptions = controller.getOptions() || false,
				currentScale = true,
				i;
			if (mapOptions) {
				if (delta < 0) {currentScale = mapOptions.increaseScale();} else {currentScale = mapOptions.decreaseScale();}
				if (currentScale !== false) {
					for (i in controller.tables) {
						if (controller.tables.hasOwnProperty(i)) {
							controller.tables[i].stopLoading();
							controller.tables[i].scaleTable(mapOptions.scaleStep, currentScale, mouseCoords);
						}
					}
				}
			}
			if (controller.tables[currentScale]) {
				controller.tables[currentScale].resizeTable(controller.getOptions());
				controller.tables[currentScale].continueLoading();
				if (controller.tables[currentScale] === controller.tableSwapper.background) {controller.tableSwapper.swapObjects();}
				controller.controlDragOffset();
			}
			if (redrawInterval) {
				window.clearInterval(redrawInterval);
			}
			redrawInterval = window.setInterval(function() {controller.redrawMap(); window.clearInterval(redrawInterval); redrawInterval = false;}, mapOptions.redrawTiming);
			afterMapScale();
		},
		redrawMap : function() {
			var mapOptions = this.getOptions(),
				center     = this.searchCenterCell(),
				newTable, newCenter, tableRoot;
			if (this.tableSwapper.checkCounter()) {
				newTable  = this.addTable(mapOptions.currentScale);
				newCenter = this.searchCenterCell(newTable);
				tableRoot = newTable.me;
				tableRoot.style.left = center.x - newCenter.x + 'px';
				tableRoot.style.top  = center.y - newCenter.y + 'px';
				this.controlDragOffset();
			} else {
				this.flipTables(mapOptions.currentScale);
			}
			savePosition();
		},
		flipTables : function(scale) {
			if (this.tableSwapper.foreground.calculateLoadingProgress() >= this.tableSwapper.background.calculateLoadingProgress()) {this.tableSwapper.swapObjects();}
			var foreground = this.tableSwapper.foreground,
				center     = this.searchCenterCell(this.tableSwapper.background),
				newCenter;
			foreground.imagesToSizeAndScale(250, 250, scale);
			newCenter = this.searchCenterCell(foreground);

			foreground.me.style.left = [parseInt(foreground.me.style.left, 10) + center.x - newCenter.x, 'px'].join("");
			foreground.me.style.top  = [parseInt(foreground.me.style.top, 10)  + center.y - newCenter.y, 'px'].join("");

			delete this.tables[foreground.getScale()];
			foreground.scale = scale;
			this.tables[scale] = foreground;
			this.controlDragOffset();
		},
		searchCenterCell : function(fromTable) {
			var table  = fromTable || this.tableSwapper.foreground,
				mapOptions = this.getOptions(),
				left   = table.getLeftBorder(),
				top    = table.getTopBorder(),
				cell   = table.imageMatrix[0][0],
				width  = parseInt(cell.imageObject.style.width, 10)  || mapOptions.cellWidth,
				height = parseInt(cell.imageObject.style.height, 10) || mapOptions.cellHeight;
			return {x: left - cell.x * width, y: top  - cell.y * height};
		},
    //Перемещает к метке на карте
		teleportMapXY  : function(x, y) {
			//при недостатке аргументов ,считаем что все происходящее -большая ошибка и идем в центр координат
			if ((!x) || (!y)) { x = 0; y = 0;} else {
            var
              mapOptions = this.getOptions(),
              matrix = this.tableSwapper.foreground.imageMatrix,
              i, j,centerX,centerY,nullX,nullY,cellW,cellH,maxCellsX,maxCellsY,
              //вычисляем коэффициент приближения
              ratio = Math.pow(mapOptions.scaleStep, mapOptions.currentScale - 1);
              cellW = Math.floor(mapOptions.cellWidth*ratio);
              cellH = Math.floor(mapOptions.cellHeight*ratio);

              maxCellsX = mapOptions.cellsX;//+mapOptions.outerCellsX*2;
              maxCellsY = mapOptions.cellsY;//+mapOptions.outerCellsY*2;
              //вычисляем координаты центральной клетки(в текущей системе координат)
              //заплаточное решение ,только для первой четверти координатной сетки(X+ Y+)
              centerX = Math.floor(x/cellW);
              centerY = Math.floor(y/cellH);
              //вычисляем координаты левой вверхней клетки(в текущей системе координат)
              nullX = centerX-Math.floor(maxCellsX / 2);
              nullY = centerY-Math.floor(maxCellsY / 2);
              //заполняем матрицу
            for (i = 0; i < maxCellsY; i++) {
              for (j = 0; j <  maxCellsX; j++) {
                matrix[i][j].setXY(nullX+j,nullY+i);
              }
            }
      mapOptions.xOffset=0;
      mapOptions.yOffset=0;
      //mapOptions.rootNode.offsetLeft=0;
      //mapOptions.rootNode.offsetTop=0;
      //			this.tableSwapper.foreground.jumpOsX(-1);
      //			this.tableSwapper.foreground.jumpOsY(-1);
      //this.recountMap();
      //			var root = this.getRoot();

      //			root.style.left = 0;
      //			root.style.top  = 0;

      //			this.tableSwapper.foreground.me.offsetParent.offsetTop=0;

            //mapOptions.setOffset();
            savePosition();
      }
      
		},
		moveMapXY : function(x, y) {
			var root = this.getRoot();
			root.style.left = [parseInt(root.style.left) + x, 'px'].join("");
			root.style.top  = [parseInt(root.style.top) + y, 'px'].join("");
			this.controlDragOffset();
		},
		dragOffset : null,
		dragMap : function(event) {
			var mapOption = this.getOptions(),
				root = mapOption.getRoot(),
				ratio = Math.pow(mapOption.scaleStep, this.getScale() - 1),
				l = root.style.left, t=root.style.top;
			if (!this.dragOffset) {this.dragOffset = getMouseOffset(root, event);}

			root.style.left = [mousePos.x - this.dragOffset.x, 'px'].join("");
			root.style.top  = [mousePos.y - this.dragOffset.y, 'px'].join("");
			if (this.xyLimited) {
				var center = this.searchCenterCell(),
					minX = mapOption.minX / ratio - mapOption.rootSize.width / 2,
					minY = mapOption.minY / ratio - mapOption.rootSize.height / 2,
					maxX = mapOption.maxX / ratio - mapOption.rootSize.width / 2,
					maxY = mapOption.maxY / ratio - mapOption.rootSize.height / 2;

				if ((-center.x < minX) && (parseInt(root.style.left) > parseInt(l))) {
					root.style.left = l; goDrag = false;
				}
				if ((-center.x > maxX) && (parseInt(root.style.left) < parseInt(l))) {
					root.style.left = l; goDrag = false;
				}
				if ((-center.y < minY) && (parseInt(root.style.top) > parseInt(t))) {
					root.style.top = t; goDrag = false;
				}
				if ((-center.y > maxY) && (parseInt(root.style.top) < parseInt(t))) {
					root.style.top = t; goDrag = false;
				}
			}
			this.controlDragOffset();
		},
		recountMap : function (){
			optionsObject.rootNode.style.width = '100%';
			optionsObject.rootNode.style.height = '100%';
			optionsObject.recountViewer();
			for (var i in this.tables) { var search = i;}
			this.tables[search].resizeTable(optionsObject);
			this.tables[search].continueLoading();
		},
		afterMapDrag : function() {this.dragOffset = false;},
		getScale  : function() {return this.getOptions().currentScale;},
		getStep   : function() {return this.getOptions().scaleStep;},
		getOption : function(optionName) {
			var mapOptions = this.getOptions();
			if (mapOptions.hasOwnProperty(optionName)) {
				return mapOptions[optionName];
			}
			return false;
		},
		getRoot : function() {
			var mapOptions = this.getOptions();
			return mapOptions.getRoot();
		}
	};
	return resultObject;
}

function addGlobalEvents(object, controller) {
	addDragEvent(function(event) {if (goDrag) {controller.dragMap(event);}});
	object.onmousedown = function() {goDrag = !goDrag;};
	addMouseUpEvent(function() { afterMapDrag(); goDrag = false; controller.afterMapDrag();});
}

mapController = new mapOptions();

function initMap(rootObject) {
	var coord = getUrlcoord();
	rootObject.style.height = getSize(rootObject.parentNode.parentNode).height + 'px';
	var params   = new mapOptions(),
		moveLeft = coord.x,
		moveTop  = coord.y;
	if (!isInteger(moveLeft)) {moveLeft = parseInt(getCookie('x'), 10) || 0;}
	if (!isInteger(moveTop)) {moveTop = parseInt(getCookie('y'), 10) || 0;}

	moveLeft = moveLeft % params.cellWidth,
	moveTop  = moveLeft % params.cellHeight;
	delete mapController;
	mapController = mapTableController(mapViewerController(rootObject, params));
	rootObject.style.position = 'absolute';
	rootObject.style.left     = moveLeft + 'px';
	rootObject.style.top      = moveTop + 'px';
	//Attaching events
	//addGlobalEvents(rootObject, mapController);
	mouseWheelStack.addCallback(mapController.scaleMap, mapController);
	//attachMouseScroller(rootObject, mouseWheel);
	mapController.addTable(params.defaultScale);
	addResizeEvent(function(){mapController.recountMap()});

	imageDummy = new Image();
	imageDummy.src = '/images/spacer.gif';
}
// ---- /work/units/mapviewer/mapSystem.js ---- 
// ==== /work/units/mapviewer/mapCore.js ==== 
/*//MAP PLACEMENT//////

// Ссылка на div в котором размещается карта
var globalMapPlacement = null;

// Координаты прямоугольника div в котором размещена карта
var globalMapPlacementLeft    = 0;
var globalMapPlacementTop     = 0;
var globalMapPlacementRight   = null;
var globalMapPlacementBottom  = null;

//CELLS/////////////

// Количество ячеек по горизонтали и вертикали
var globalCellsX = null;
var globalCellsY = null;

// Размеры ячеек
var globalCellW  = 250;
var globalCellH  = 250;

// Количество ячеек запаса по краям
var globalMaxOuterCellsX = 2;
var globalMaxOuterCellsY = 2;

//TABLES////////////

// Массив таблиц (карт в разном масштабе)
var globalTables = Array();

// Ширина и высота таблицы с неизменным масштабом
var globalTableSizeW   = null;
var globalTableSizeH   = null;

//COORDINATES///////

// Смещение координат (в ячейках) при создании первой таблицы
var globalOffsetX = 0;
var globalOffsetY = 0;

//SCALES////////////
// Изначальный масштаб карты
var globalDefaultScale = parseInt(getCookie('scale'));
if (!globalDefaultScale) {
	globalDefaultScale = 7;
}

// Шаг масштабирования
var globalScaleStep    = 1.3;

// Ограничители масштабирования
var globalZoomInLimit  = -4;
var globalZoomOutLimit = 14;

//DRAG/////////////

// Флаг перетаскивания
var goDrag = false;

//WHEEL EVENTS///////

// Флаг прокрутки колеса мыши
var wheelMove = true;
var mapMove;
var mapMoveInterval;

// Флаг перехода карты к новым клеткам
var newCells = false;

//============== INITIALISING MAP MODULE =================//

// Устанавливает объект в котором отображается карта и инициализирует параметры
function setPlacement(object){
	document.onmouseup   = mouseUp;
	object.onmousedown   = function(event) {event = event || window.event; getTablesOffsets(event); mouseDown();};
	addDragEvent(dragMap);
	addResizeEvent(recountMap);

	globalMapPlacement = object;
	addWheelEvent(wheelEvent);
	globalMapPlacement.onmousewheel = function (event) {event = event || window.event;};
	if (countCells( globalMapPlacement )) {
		globalOffsetX = -Math.floor(parseInt(getCookie('x')) / globalCellW) + Math.floor((screen.width / 2) / globalCellW) - 1;
		globalOffsetY = -Math.floor(parseInt(getCookie('y')) / globalCellH) + Math.floor((screen.height / 2)/ globalCellH) - 1;
		if (parseInt(getCookie('y')) > 0) {
			globalOffsetY++;
		}
		if (parseInt(getCookie('x')) > 0) {
			globalOffsetX++;
		}
		if (!globalOffsetX) {
			globalOffsetX = 0;
		}
		if (!globalOffsetY) {
			globalOffsetY = 0;
		}			
		var table = createTable(parseInt(getCookie('x'))%250, parseInt(getCookie('y'))%250);		
		globalMapPlacement.appendChild(table);
		addTableToArray(table);
		var callback = function (event) {event = event || window.event; wheel(event);};
		attachMouseScroller(object, callback);
	}
	checkTablePosition(table);
}


function initMapPlacement () {
	setPlacement(get('mapHolder'));
}

addOnloadEvent(initMapPlacement);

// Считает сколько нужно ячеек таблице для заполнения области просмотра
function countCells(object) {
	var size = getSize(object);
	if (size) {
		//Вычисляем количество отображаемых на странице клеток
		globalCellsX = Math.floor( size.width  / globalCellW );
		if ( size.width % globalCellW > 0 ) globalCellsX++;
		globalCellsY = Math.floor( size.height / globalCellH );
		if ( size.height % globalCellH > 0 ) globalCellsY++;
		
		//Устанавливаем параметры размера таблицы
		globalTableSizeW  = globalCellW * globalCellsX;
		globalTableSizeH  = globalCellH * globalCellsY;
		
		globalMapPlacementRight  = size.width;
		globalMapPlacementBottom = size.height;		
		
		return true;
	} else {
		return false;
	}
}

//============= CREATING MAP ===============//

// Создает таблицы в заданных координатах и указанным масштабом
function createTable(left, top, scale) {
	//Создаем начальные элементы таблицы
	var table = document.createElement('TABLE');
	var tbody = document.createElement('TBODY');

	//Устанавливаем параметры масштабов
	table.startScale   = scale || globalDefaultScale;
	table.resizedScale  = table.startScale;
	table.previousScale = table.startScale;
	table.mouseOffset = { x:0 ,y:0 };

	var i,j;
	
	//Создаем строки таблицы
	for ( i = 0; i < globalCellsY; i++ ) {
		var row = document.createElement('TR');
		
		//Создаем столбцы таблицы
		for ( j = 0; j < globalCellsX; j++ ) {
			var td = document.createElement('TD');
			td.x     = -( Math.round( globalCellsX / 2 ) - j - 1 - globalOffsetX);
			td.y     = -( Math.round( globalCellsY / 2 ) - i - 1 - globalOffsetY);
			td.scale = table.startScale;
			//Создаем строки таблицы
			loadImage(td, table);
			row.appendChild( td );
		}
		tbody.appendChild( row );
	}
	table.appendChild(tbody);
	
	//Устанавливаем координаты таблицы
	// TODO: Проверить работу двух нижеследующих функций
	if (left) {
		table.style.left = ( left + 'px' );
	} else {
		table.style.left = '0px'
	}

	if (top) {
		table.style.top  = ( top  + 'px' );
	} else {
		 table.style.top  = '0px';
	}
	
	
	table.style.width  = globalTableSizeW + 'px';
	table.style.height = 'auto';

	table.cellsX = globalCellsX;
	table.cellsY = globalCellsY;
	table.className = 'normalTable';
	
	makeDraggable( table );
	
	return table;
}

function loadImage(cell, table) {
	var image = new Image();
	image.loaded = false;
	image.table = table;
	var spacer = document.createElement('IMG');
	spacer.src = 'images/spacer.gif';
	spacer.onselectstart = dummy;
	spacer.disabled = true;
	spacer.onmousedown = dummy;
	image.src = [getPagePath(), '/mapcell/mapcell', cell.scale, 's', cell.x, 'x', cell.y, 'y', '.png'].join("");
	image.cell = cell;
	image.style.display = 'none';
	image.spacer = spacer;
	image.onload = function (){
		this.loaded = true;
		this.spacer.style.display = 'none';
		this.style.display = 'block';
		checkLoadProgress(this.table);
	};
	cell.appendChild(image);
	cell.appendChild(spacer);
	cell.image = image;
	cell.spacer = spacer;
}

//=========== TABLE ARRAY OPERATIONS ===========//

function searchCenterCell (object) {
	var left = parseInt(object.style.left);
	var top  = parseInt(object.style.top );
	
	var width = Math.round( parseInt( object.style.width ) / object.cellsX );
	
	var tbody = object.childNodes[0];
	var rows  = tbody.childNodes;
	
	var td    = rows[0].childNodes[0]; 
	
	return {x: left - td.x * width, y: top  - td.y * width };
}

// Функция, добавляющая таблицу в конец рабочего массива
function addTableToArray( table ) {
	var index = globalTables.length;
	globalTables[ index ] = table;
	table.index = index;
}

// Функция, добавляющая таблицу в рабочую область
function placeTable( table ) {
	addTableToArray( table );
	globalMapPlacement.appendChild( table );
}

//========== TRANSFORM OPERATIONS ==========//

function scaleTablesToScale(scale) {
	for (var i = 0; i < globalTables.length; i++) {
		scaleController(globalTables[i], scale, null, true);
	}
}

//Функция, контролирующая масштаб таблицы
function scaleController( table, newScale, event, bool) {
	event = event || window.event;
		//Проверка допустимых значений масштаба
		if (( newScale >= globalZoomInLimit ) && ( newScale <= globalZoomOutLimit )) {
			//Проверка, на наличие уже объявленного процесса скалирования
			if ( !table.interval ) {
				//Назначение таблице класса css для масштабирования
				table.className = 'scaleTable';
				
				//Установка новых масштабов как для таблицы, так и для модуля в целом.
				table.previousScale = table.resizedScale;
				table.resizedScale  = newScale;
				globalDefaultScale  = newScale;
				
				//Вычисление координат мыши
				if (!event) {var mouseOffset = {x:Math.round(getSize(globalMapPlacement).width / 2), y:Math.round(getSize(globalMapPlacement).height / 2)};} else {var mouseOffset = mouseCoords( event );}
				var afterFunction;
				
				afterFunction = function ( table ) {
					checkTablePosition( table );
					placeTable( table );
					afterMapScale();					
				};
				if (table.startScale == newScale) {
					//deleteTablesAfter(table.index);
					scaleMap( table, mouseOffset.x, mouseOffset.y, afterFunction, true);
					//continueLoad(table);
				} else {
					stopLoad( table );
					//Запуск процедуры масштабирования
					scaleMap( table, mouseOffset.x, mouseOffset.y, afterFunction, bool);
				}
				
				//Запуск процедуры динамического изменения таблицы			
				//if (table.resizedScale == table.startScale) { checkTablePosition( table ); }
		}
	}
}

//Функция, масштабирующая таблицу
function scaleMap( table, x, y, afterFunction, bool ) {
	//Вычисление коэффициентов масштабирования (новый, старый)
	var ratio    = Math.pow( globalScaleStep, - table.startScale + table.resizedScale  );
	var oldRatio = Math.pow( globalScaleStep, - table.startScale + table.previousScale );
	
	//Вычисление текущей позиции таблицы
	var tableLeft  = parseInt( table.style.left );
	var tableTop  = parseInt( table.style.top  );
	
	//Вычисление новых значений ширины таблицы
	var newTableWidth  = Math.round( table.cellsX * globalCellW / ratio );
	var newTableHeight = Math.round( table.cellsY * globalCellH / ratio );
	
	//Вычисление старых значений ширины таблицы
	var oldTableWidth  = Math.round( table.cellsX * globalCellW / oldRatio );
	
	//Вычисление координат курсора относительно таблицы
	var positionMouseFromTableX = x - tableLeft;
	var positionMouseFromTableY = y - tableTop;
	
	//Вычисление координат курсора относительно новой отмасштабированной таблицы
	var newPositionMouseFromTableX = positionMouseFromTableX * oldRatio / ratio;
	var newPositionMouseFromTableY = positionMouseFromTableY * oldRatio / ratio;
	
	//Вычисление новых координат курсора относительно дисплея
	var newPositionTableFromDisplayX = x - newPositionMouseFromTableX;
	var newPositionTableFromDisplayY = y - newPositionMouseFromTableY;
	
	//Вычисление изменений координат
	var moveLeft = newPositionTableFromDisplayX - tableLeft;
	var moveTop  = newPositionTableFromDisplayY - tableTop ;

	//Вычисление изменений размера
	var scaleW = newTableWidth  - oldTableWidth;
	
	//Установка в 0 итератора таблицы
	table.iterator = 0;
	
	//Подключение функции изменения масштаба с задержкой 1 милисекунда
	table.interval = setInterval (function() { delayedScale( table, tableLeft, tableTop, moveLeft, moveTop, oldTableWidth, scaleW, afterFunction, bool ); },1);
}

//Функция, реализующая масштабирование с задержкой
function delayedScale( table, tableLeft, tableTop, moveLeft, moveTop, oldTableWidth, scaleW, afterFunction, bool) {
	//Установка количества итераций
	var iterations = 2;

	table.iterator ++;
	//Вычисление коэффициента изменения смещений масштаба и позиции
	var ratio = table.iterator / iterations;
	
	//Применение новых координат
	table.style.left = tableLeft + Math.round( moveLeft * ratio ) + 'px';
	table.style.top  = tableTop  + Math.round( moveTop  * ratio ) + 'px';
	//Применение новых размеров
	table.style.width  = oldTableWidth  + Math.round( scaleW * ratio ) + 'px';
	
	//Проверка окончания масштабирования
	if ( table.iterator == iterations ) {
		//Очистка итератора
		table.iterator = 0;
		//Очистка задержки вызова
		window.clearInterval( table.interval );
		
		if ( table.index == globalTables.length - 1 )
		{
			reloadStreets();
			if (bool)
			{
				var tableCenter    = searchCenterCell( table );
				var newTable       = createTable(0,0,table.resizedScale);
				var newTableCenter = searchCenterCell( newTable );
				
				newTable.style.left = tableCenter.x - newTableCenter.x + 'px';
				newTable.style.top  = tableCenter.y - newTableCenter.y + 'px';
				afterFunction( newTable );
			} else {
				afterFunction( table );
			}
		}
		table.interval = null;
	}
}

//============ EVENTS =============//

//Функция, следит за событиями скроллера мыши
function wheel(event) {
	var wheelDelta = 0;
	var mouseOffset = mouseCoords(event);
	event = event || window.event;
	
	if (event.wheelDelta) {
		wheelDelta = event.wheelDelta/120;
	} else if (event.detail) {
		wheelDelta = -event.detail/3;
	}
	globalOnWheel(wheelDelta, event);
}

function wheelEvent(wheelDelta, event) {
	if (wheelDelta > 0) {
		var i;
		var bool = true;
		//Скроллер заействован на увеличение
		//Всем таблицам, находящимся в рабочей области (в массиве существующих таблиц) следует изменить масштаб
		for (i = 0; i <  globalTables.length; i++) {
			scaleController( globalTables[i], globalTables[i].resizedScale - 1, event, true);
		}
	} else {
		var i;
		for (i = 0; i < globalTables.length; i++) {
			//Вызов функции, реализующей масштабирование и последующие действия
			scaleController( globalTables[i], globalTables[i].resizedScale + 1, event, true);
		}
	}
}

//=========== DRAG ==============//


function dragMap() {
	if (goDrag) {
		var i;
		//Прверка на необходимость реализации перетаскивания
		for (i = 0; i < globalTables.length; i++) {
			//Установка координат
			globalTables[i].style.top   = mousePos.y - globalTables[i].mouseOffset.y + 'px';
			globalTables[i].style.left  = mousePos.x - globalTables[i].mouseOffset.x + 'px';
			//Прверка на необходимость динамической подгрузки таблицы
			if ( globalTables[i].startScale == globalTables[i].resizedScale ) {
				checkTablePosition(globalTables[i]);
			}			
		}
	}
}

function makeDraggable(dragItem) { 
	// Задел будущим поколениям
}

function mouseUp() {
	goDrag = false;
	afterMapDrag();
}

function mouseDown() {
	goDrag = true;
}

function getTablesOffsets( event ) {
	event        = event || window.event;
	var i;
	
	for (i = 0; i < globalTables.length; i++)	{
		globalTables[i].mouseOffset = getMouseOffset( globalTables[i], event);
	}
}

//========= DYNAMIC UPLOAD OPERATIONS ===========//

function checkTablePosition( table ) {
	table.className = 'normalTable';
	var tableLeft   = parseInt( table.style.left );
	var tableTop    = parseInt( table.style.top );
	var tableRight  = table.cellsX * globalCellW + tableLeft;
	var tableBottom = table.cellsY * globalCellH + tableTop;
	
	if ( tableLeft > globalMapPlacementLeft ) {
		var i;
		var tbody     = table.childNodes[0];
		newCells = true;
		while ( tableLeft > globalMapPlacementLeft ) {
		
			var tableRows = tbody.childNodes;
			
			for (i = 0; i < tableRows.length; i++) {	
				var firstTd = tableRows[i].childNodes[0];
				var x = firstTd.x;
				var y = firstTd.y;
				
				var cell = document.createElement('TD');
				cell.scale = table.resizedScale;
				cell.x = x - 1;
				cell.y = y;			
				
				loadImage( cell, table );
				tableRows[i].insertBefore(cell, tableRows[i].childNodes[0]);
			}
			
			table.cellsX ++;
			
			table.style.width   = table.cellsX * globalCellW + 'px';
			tableLeft           = tableLeft - globalCellW;
			table.style.left    = tableLeft + 'px';
			table.mouseOffset.x = table.mouseOffset.x + globalCellW;
			
		}
	}
	
	if ( tableTop > globalMapPlacementTop ) {
		var i;
		var tbody     = table.childNodes[0];
		newCells = true;
		while ( tableTop > globalMapPlacementTop ) {
			var firstRow  = tbody.childNodes[0];
			var firstTd   = firstRow.childNodes[0];
			
			var x = firstTd.x;
			var y = firstTd.y;
			
			var row = document.createElement('TR');
			
			for ( i = 0; i < table.cellsX; i++ ) {
				
				var cell = document.createElement('TD');
				cell.scale = table.resizedScale;
				cell.x = x + i;
				cell.y = y - 1;	
				loadImage( cell, table );
				row.appendChild( cell );
			}
			tbody.insertBefore( row, firstRow );
			
			tableTop            = tableTop - globalCellH;
			table.style.top     = tableTop + 'px';
			table.mouseOffset.y = table.mouseOffset.y + globalCellH;
			table.cellsY ++;
		}
	}
	
	if ( tableBottom < globalMapPlacementBottom ) {
		var i;
		var tbody     = table.childNodes[0];
		newCells = true;		
		while ( tableBottom < globalMapPlacementBottom ) {
			var lastRow   = tbody.childNodes[ tbody.childNodes.length - 1 ];
			var firstTd   = lastRow.childNodes[0];
			
			var x = firstTd.x;
			var y = firstTd.y;
			
			var row = document.createElement('TR');
			
			for ( i = 0; i < table.cellsX; i++ ) {
				
				var cell = document.createElement('TD');
				cell.scale = table.resizedScale;
				cell.x = x + i;
				cell.y = y + 1;	
				loadImage( cell, table );
				row.appendChild( cell );
			}
			
			table.cellsY ++;
			tableBottom = tableBottom + globalCellH;
			tbody.appendChild( row, firstRow );
		}
	}
	
	if ( tableRight < globalMapPlacementRight ) {		
		var i;
		var tbody     = table.childNodes[0];
		var tableRows = tbody.childNodes;
		newCells = true;		
		while ( tableRight < globalMapPlacementRight )
		{
			for (i = 0; i < tableRows.length; i++) {	
				var lastTd = tableRows[i].childNodes[ tableRows[i].childNodes.length - 1 ];
				var x = lastTd.x;
				var y = lastTd.y;
				
				var cell = document.createElement('TD');
				cell.scale = table.resizedScale;
				cell.x = x + 1;
				cell.y = y;
				
				loadImage( cell, table );
				tableRows[i].appendChild( cell );
			}
			
			table.cellsX++;
			tableRight = tableRight + globalCellW; 
			table.style.width  = table.cellsX * globalCellW + 'px';
		}
	}
	
	if ( tableLeft < globalMapPlacementLeft - globalMaxOuterCellsX * globalCellW ) {
		newCells = true;
		while ( tableLeft < globalMapPlacementLeft - globalMaxOuterCellsX * globalCellW ) {
			var tbody = table.childNodes[0];
			var rows  = tbody.childNodes; 
			var i;
			table.style.width = ( table.cellsX - 1 ) * globalCellW + 'px';
			for ( i = 0; i < rows.length; i++ ) {
				firstTd = rows[i].childNodes[0];
				
				var image  = firstTd.childNodes[ firstTd.childNodes.length - 1 ];
				//firstTd.image.src  = '';
				//firstTd.spacer.src = '';
				//firstTd.removeChild(firstTd.image);
				//firstTd.removeChild(firstTd.spacer);
				delete firstTd.image;
				rows[i].removeChild(firstTd);
				
			}
			table.cellsX--;
			table.style.left = tableLeft + globalCellW + 'px';
			tableLeft = tableLeft + globalCellW;
			table.mouseOffset.x = table.mouseOffset.x - globalCellW;
		}
	}

	if ( tableRight > globalMapPlacementRight + globalMaxOuterCellsX * globalCellW ) {
		newCells = true;
		while ( tableRight > globalMapPlacementRight + globalMaxOuterCellsX * globalCellW )
		{
			var tbody = table.childNodes[0];
			var rows  = tbody.childNodes; 
			var i;
			table.style.width = (table.cellsX - 1) * globalCellW + 'px';
			
			for ( i = 0; i < rows.length; i++ ) {
				var lastTd = rows[i].childNodes[ rows[i].childNodes.length - 1];
				//lastTd.image.src = '';
				//lastTd.image.spacer.src = '';
				lastTd.removeChild(lastTd.spacer);
				lastTd.removeChild(lastTd.image);
				rows[i].removeChild(lastTd);
			}
			table.cellsX--;
			tableRight = tableRight - globalCellW;
		}
	}
	
	if ( tableTop < globalMapPlacementTop - globalMaxOuterCellsY * globalCellH ) {
		newCells = true;
		while ( tableTop < globalMapPlacementTop - globalMaxOuterCellsY * globalCellH ) {
			var tbody    = table.childNodes[0];
			var firstRow = tbody.childNodes[0];
			
			for ( i = 0; i < firstRow.childNodes.length; i++ ) {
				var td = firstRow.childNodes[i];
				var image  = td.childNodes[ td.childNodes.length - 1 ];
				//td.image.src = '';
				//td.spacer.src = '';
				td.removeChild(td.image);
				td.removeChild(td.spacer);				
				firstRow.removeChild(td);
			}
			
			tbody.removeChild(firstRow);
			table.cellsY--;
			table.style.top = tableTop + globalCellH + 'px';
			tableTop = tableTop + globalCellH;
			table.mouseOffset.y = table.mouseOffset.y - globalCellH;
		}
	}
	
	if ( tableBottom > globalMapPlacementBottom + globalMaxOuterCellsY * globalCellH )
	{
		newCells = true;
		while ( tableBottom > globalMapPlacementBottom + globalMaxOuterCellsY * globalCellH )
		{
			var tbody   = table.childNodes[0];
			var lastRow = tbody.childNodes[ tbody.childNodes.length - 1];

			for ( i = 0; i < lastRow.childNodes.length; i++ ) {
				
				var td = lastRow.childNodes[i];
				//td.image.src  = '';
				//td.spacer.src = '';
				td.removeChild(td.image);
				td.removeChild(td.spacer);
				lastRow.removeChild(td);
			}

			tbody.removeChild(lastRow);
			table.cellsY--;
			tableBottom = tableBottom - globalCellH;
		}
	}
	
}

//========= WINDOW RESIZING ==========//
function recountMap()
{
	var previousMapPlacementRight  = globalMapPlacementRight;
	var previousMapPlacementBottom = globalMapPlacementBottom;
	
	countCells(globalMapPlacement);

	for (i = 0; i < globalTables.length; i++) {
		//Прверка на необходимость динамической подгрузки таблицы
		if ( globalTables[i].startScale == globalTables[i].resizedScale ) {
			moveMapByGoldenRatio( globalTables[i], previousMapPlacementRight, previousMapPlacementBottom );
			checkTablePosition( globalTables[i] );
		}			
		
	}	
}

function moveMapByGoldenRatio( table, oldRight, oldBottom ) {
	var moveLeft = Math.round(oldRight  - oldRight  * 0.618) - Math.round(globalMapPlacementRight  - globalMapPlacementRight  * 0.618);
	var moveTop  = Math.round(oldBottom - oldBottom * 0.618) - Math.round(globalMapPlacementBottom - globalMapPlacementBottom * 0.618);
	
	table.style.left = parseInt( table.style.left ) - moveLeft + 'px';
	table.style.top  = parseInt( table.style.top  ) - moveTop  + 'px';
}

//========= TRASH COLLECTING ==========//
function stopLoad( table )
{
	var tbody = table.childNodes[0];
	var rows  = tbody.childNodes;
	var i,j;
	for ( i = 0; i < rows.length; i++ )
	{
		var tds = rows[i].childNodes;
		for ( j = 0; j < tds.length; j++ )
		{
			var image = tds[j].image;
			if ( !image.loaded )
			{
				image.src = '';
				image.style.display = 'none';
				image.spacer.style.display = 'block';
			}
		}
	}
}

function continueLoad( table )
{
	var tbody = table.childNodes[0];
	var rows  = tbody.childNodes;
	var i,j;
	for ( i = 0; i < rows.length; i++ )
	{
		var tds = rows[i].childNodes;
		for ( j = 0; j < tds.length; j++ )
		{
			var image = tds[j].image;
			if ( !image.loaded )
			{
				var cell = image.cell;
				cell.removeChild(cell.image);
				cell.removeChild(cell.spacer);				
				loadImage(image.cell, table);
			}
		}
	}
}

function checkLoadProgress( table )
{
		var tbody = table.childNodes[0];
		var rows  = tbody.childNodes;
		var i,j;
		var loadedCount = 0;
		for ( i = 0; i < rows.length; i++ )
		{
			var tds = rows[i].childNodes;
			for ( j = 0; j < tds.length; j++ )
			{
				if ( tds[j].image.loaded ) {
					loadedCount++;
				}
			}
		}
		if ((loadedCount / ( table.cellsX * table.cellsY ) ) > 0.8)
		{
			deleteTablesBeforeLast();
		}
}

function deleteTable(index)
{
	var i;
	deleteTableStructure( globalTables[index] );
	globalMapPlacement.removeChild( globalTables[index] );
	for ( i = index; i < globalTables.length - 1; i++ )
	{
		globalTables[i] = globalTables[i + 1];
		globalTables[i].index--;
	}
	globalTables.pop();	
}

function deleteTablesBeforeLast()
{
	var i;
	for ( i = 0; i < globalTables.length - 1; i++ )
	{
		globalMapPlacement.removeChild( globalTables[i] );
	}
	var lastTable = globalTables[globalTables.length - 1];
	globalTables = Array();
	globalTables[0] = lastTable;
	lastTable.index = 0;
}

function deleteTableStructure( table )
{
	var tbody = table.childNodes[0];
	var rows  = tbody.childNodes;
	var i,j;
	for ( i = 0; i < rows.length; i++ )
	{
		var tds = rows[i].childNodes;
		for ( j = 0; j < tds.length; j++ )
		{
			var image  = tds[j].childNodes[0];
			var spacer = tds[j].childNodes[1];
			
			image.src  = '';
			spacer.src = '';
			
			image.onload = function() {return false};
			tds[j].removeChild(image);
			tds[j].removeChild(spacer);
			rows[i].removeChild(tds[j]);
		}
		tbody.removeChild( rows[i] );
	}
	//table.removeChild(tbody);
	//globalMapPlacement.removeChild(table);
	
}

function deleteTablesAfter( index )
{
	var i;
	for ( i = index + 1; i < globalTables.length; i++ ) {	
		deleteTableStructure( globalTables[i] );
		globalMapPlacement.removeChild( globalTables[i] );
		wheelMove = false;
	}
	globalTables = globalTables.slice( 0, index + 1);
}

function moveMapToXY(x, y, cb) {
	var centerCoord = searchCenterCell(globalTables[globalTables.length - 1]),
		placementCenter = getSize(globalMapPlacement) || false;
	
	if (placementCenter) {
		mapMove = {x: Math.round(placementCenter.width  / 2) - centerCoord.x - x, y:Math.round(placementCenter.height / 2) - centerCoord.y - y, step: 1, callback: cb}
		animateMapMove();
	}
	//mapMoveInterval = window.setInterval(animateMapMove, 10);
}

function animateMapMove() {
	for (var i = 0; i < globalTables.length; i++) {
		if ((mapMove.x) && (mapMove.y)) {
			var left     = parseInt(globalTables[i].style.left),
				top      = parseInt(globalTables[i].style.top);
				move     = {x: parseInt(mapMove.x), y:parseInt(mapMove.y)}
			if ((typeof(move.x) == 'number') && (typeof(move.y) == 'number')) {				
				var offsetLeft = left + move.x,
					offsetTop  = top  + move.y;
				globalTables[i].style.left = offsetLeft + 'px';
				globalTables[i].style.top  = offsetTop  + 'px';
			}
		}
	}
	window.clearInterval(mapMoveInterval);
	mapMoveInterval = null;
	mapMove.callback();
	mapMove = null;
	for (var i = 0; i < globalTables.length; i++)
		checkTablePosition(globalTables[i]);
}*/
// ---- /work/units/mapviewer/mapCore.js ---- 
// ==== /work/units/accordion/accordion.js ==== 
// Стили аккордиона
var accordionIconsClass = 'accordionIcons'; // Аккордион находится в режиме иконок (иконки выстроены в линию)
var accordionHideLeftClass = 'accordionHideLeft'; // Аккордион находится в cвернутом режиме

// Элемент аккордиона
var accordionItemClass = 'accordionItem', // Контейнер включающий все части элемента аккордиона
    accordionIconClass = 'accordionIcon', // Иконка элемента
    accordionHeadClass = 'accordionHead', // Заголовок элемента
    accordionBodyClass = 'accordionBody', // Тело элемента
    accordionHelpClass = 'accordionHelp'; // Дополнительный сегмент элемента	

// Стили элементов аккордиона
var accordionSelectClass  = 'accordionSelect';  // Этот элемент сейчас выбран (развернут)
var accordionDefaultClass = 'accordionDefault'; // Этот элемент выбран по умолчанию

// Инструментальная панель аккордина
var accordionTabsClass = 'accordionTabs'; // Собственно панель
var accordionHideClass = 'accordionHide'; // Кнопка сокрытия заголовков (перевод в режим иконок)
var accordionTurnLeftClass = 'accordionTurnLeft'; // Кнопка сокрытия аккордиона (сворачиваем все влево)
var accordionLeftShevronClass = 'leftShevron'; // Левая Кнопка сокрытия аккордиона (сворачиваем все влево)
var accordionRightShevronClass = 'rightShevron';// Правая Кнопка сокрытия аккордиона (сворачиваем все влево)

var accordionHelpOffset = 77; // разница между высотой body и helper-a

// Массив всех аккордионов
var accordions = new Array();
var accordionHelps = new Array();

function accordionSelectedItem (accordion) {
	var result = accordion.selectItem;
	if (!result) { result = findChildFromClass(accordion, accordionDefaultClass); }
	if (!result) { result = findChildFromClass(accordion, accordionItemClass); }
	return result;
}

function repositionAccordionIcons (accordion) {
	var selectItem = accordionSelectedItem(accordion);
	var tabsItem = findChildFromClass(accordion, accordionTabsClass);
	var tabsHide = findChildFromClass(tabsItem, accordionHideClass);
	var tabsHead = findChildFromClass(tabsItem, accordionHeadClass);
	var tabsTurnLeft = findChildsFromClass(accordion, accordionTurnLeftClass);

	var leftShevron = findChildFromClass(accordion, accordionLeftShevronClass);	
	var rightShevron = findChildFromClass(accordion, accordionRightShevronClass);
	
	// Размещаем выбранный элемент	
	var selectIcon = findChildFromClass(selectItem, accordionIconClass);
	var selectHead = findChildFromClass(selectItem, accordionHeadClass);
	var selectBody = findChildFromClass(selectItem, accordionBodyClass);
	var selectHelp = findChildsFromClass(selectItem, accordionHelpClass);

	var accordionLeft = 0;
	var i;
	for (i = 0; i < tabsTurnLeft.length; i++) {
		var arrow = findChildFromClass(tabsTurnLeft[i], 'back');
		delClass(arrow, 'back');
		addClass(arrow, 'forward');
	}
	if (leftShevron) {
		leftShevron.style.height = accordion.offsetHeight - 4 + 'px';
		accordionLeft = leftShevron.offsetWidth;
	}
	accordion.style.width = '';

	var maxHelperWidth = 0;
	if (selectHead) { selectHead.style.display = 'block'; }
	if (selectBody) { selectBody.style.display = 'block'; }
	for (i = 0; i < selectHelp.length; i++) {
		if (selectHelp[i]) {
			if ((selectHelp[i].displaySave) && (!selectHelp[i].isPrev)) {				
				selectHelp[i].style.display = selectHelp[i].displaySave;
				if ((maxHelperWidth < selectHelp[i].offsetWidth) && (selectHelp[i].displaySave == 'block')) {maxHelperWidth = selectHelp[i].offsetWidth}
			} else {
				selectHelp[i].style.display = 'none';
			}
			selectHelp[i].style.height = (accordion.offsetHeight + accordionHelpOffset) + 'px';
		}
	}

	if (rightShevron) {
		if (maxHelperWidth == 0) {
			rightShevron.style.left = accordion.offsetWidth +  accordionLeft + 2 + 'px';
		} else {
			rightShevron.style.left = accordion.offsetWidth +  accordionLeft + maxHelperWidth + 'px';
		}
		rightShevron.style.top = Math.round((accordion.offsetHeight - rightShevron.offsetHeight - accordionHelpOffset) /2) + 'px';
	}

	var bodyHeight = accordion.offsetHeight;
	if (selectHead) { bodyHeight -= selectHead.offsetHeight; }
	if (tabsHide)   { bodyHeight -= tabsHide.offsetHeight; }
	var bodyTop = 0;
	if (selectHead) { bodyTop += selectHead.offsetHeight; }

	var HeadLeft = accordionLeft;
	if (selectIcon) {
		HeadLeft += selectIcon.offsetWidth;
		selectIcon.style.cursor = 'auto';
		selectIcon.style.top  = '0px';
		selectIcon.style.left = accordionLeft + 'px';
	}

	if (selectHead) {
		selectHead.style.top = '0px';
		selectHead.style.left = HeadLeft + 'px';
	}

	if (selectBody) {
		selectBody.style.left = accordionLeft + 'px';
		selectBody.style.top = bodyTop + 'px';
		selectBody.style.height = bodyHeight + 'px';
	}

	// Размещаем инструментальную панель
	var tabsTop = bodyHeight;
	if (selectHead) {
		tabsHead.style.display = 'block';
		tabsTop += selectHead.offsetHeight;
	}
	if (tabsHide) {
		tabsHide.style.top = tabsTop+'px';
		tabsHide.style.left = accordionLeft + 'px';
	}
		if (tabsHead) {
		tabsHead.style.top = tabsTop+'px';
		tabsHead.style.left = tabsHide.offsetLeft + tabsHide.offsetWidth + 'px';
	}

	// Размещаем остальные элементы
	var iconLeft = accordionLeft+2;
	if (tabsHide) { iconLeft += tabsHide.offsetWidth; }
	var items = findChildsFromClass(accordion, accordionItemClass);
	for (i = 0; i < items.length; i++) {
		xxitem = items[i];
		if (xxitem != selectItem) {
			var itemIcon = findChildFromClass(xxitem, accordionIconClass);
			if (itemIcon) {
				itemIcon.style.top     = tabsTop+'px';
				itemIcon.style.left    = iconLeft+'px';
				iconLeft += itemIcon.offsetWidth;
			}			
			var itemHead = findChildFromClass(xxitem, accordionHeadClass);
			if (itemHead) { itemHead.style.display = 'none'; }
			var itemBody = findChildFromClass(xxitem, accordionBodyClass);
			if (itemBody) { itemBody.style.display = 'none'; }
			var itemHelp = findChildsFromClass(xxitem, accordionHelpClass);
			for (var j = 0; j < itemHelp.length; j++) {
//				itemHelp.displaySave = itemHelp.style.display;
				itemHelp[j].style.display = 'none';
			}
		}
	}
}

function repositionAccordionHide (accordion) {
	var selectItem = accordionSelectedItem(accordion);	
	var tabsItem = findChildFromClass(accordion, accordionTabsClass);
	var tabsHide = findChildFromClass(tabsItem, accordionHideClass);
	var tabsHead = findChildFromClass(tabsItem, accordionHeadClass);
	var items = findChildsFromClass(accordion, accordionItemClass);
	var tabsTurnLeft = findChildsFromClass(accordion, accordionTurnLeftClass);

	var leftShevron = findChildFromClass(accordion, accordionLeftShevronClass);
	var rightShevron = findChildFromClass(accordion, accordionRightShevronClass);
	
	// Размещаем выбранный элемент
	var selectIcon = findChildFromClass(selectItem, accordionIconClass);
	var selectHead = findChildFromClass(selectItem, accordionHeadClass);
	var selectBody = findChildFromClass(selectItem, accordionBodyClass);
	var selectHelp = findChildsFromClass(selectItem, accordionHelpClass);

	var i;
	var accordionLeft = 0;
	for (i = 0; i < tabsTurnLeft.length; i++) {
		var arrow = findChildFromClass(tabsTurnLeft[i], 'forward');
		delClass(arrow, 'forward');
		addClass(arrow, 'back');
	}
	if (leftShevron) {
		leftShevron.style.height = accordion.offsetHeight - 4 + 'px';
		accordionLeft = leftShevron.offsetWidth;
	}

	if (rightShevron) {
		rightShevron.style.left = accordionLeft + 'px';
		rightShevron.style.top = Math.round((accordion.offsetHeight - rightShevron.offsetHeight - accordionHelpOffset) /2) + 'px';
	}

	accordion.style.width = accordionLeft + selectIcon.offsetWidth + 'px';
	var bodyHeight = accordion.offsetHeight;
	if (tabsHide)   { bodyHeight -= tabsHide.offsetHeight; }
	for (var i = 0; i < items.length; i++) {
		xxitem = items[i];
			var itemHead = findChildFromClass(xxitem, accordionHeadClass);
			if (itemHead) {itemHead.style.display = 'none';}
			var itemIco = findChildFromClass(xxitem, accordionIconClass);
			if (itemIco) {
				bodyHeight -= itemIco.offsetHeight;
				itemIco.style.display = 'block';
			}
			var itemBody = findChildFromClass(xxitem, accordionBodyClass);
			if (itemBody) { itemBody.style.display = 'none'; }
			var itemHelp = findChildFromClass(xxitem, accordionHelpClass);
			if (itemHelp) {itemHelp.style.display = 'none';}
	}

	var bodyTop = 0;
	if (selectIcon) {
		selectIcon.style.display = 'block';
		selectIcon.style.cursor = 'pointer';
		bodyTop += selectIcon.offsetHeight;
		selectIcon.style.top  = '0px';
		selectIcon.style.left = accordionLeft + 'px';
	}

	if (selectBody) {
		selectBody.style.display = 'none';
	}

	if (selectHead) { selectHead.style.display = 'none'; }
	for (i = 0; i < selectHelp.length; i++) { selectHelp[i].style.display = 'none'; }

	// Размещаем инструментальную панель
	var tabsTop = accordion.offsetHeight;
	if (tabsHead) {
		tabsHead.style.display = 'none';
	}
	if (tabsHide) {
		tabsTop -= tabsHide.offsetHeight;
		tabsHide.style.top     = tabsTop + 'px';
		tabsHide.style.left    = accordionLeft + 'px';
	}

	var headTop = bodyHeight;
	if (selectIcon) { headTop += selectIcon.offsetHeight; }
	for (i = 0; i < items.length; i++) {
		xxitem = items[i];
		if (xxitem != selectItem) {
			var itemIcon = findChildFromClass(xxitem, accordionIconClass);
			if (itemIcon) {
				itemIcon.style.top     = headTop+'px';
				itemIcon.style.left    = accordionLeft + 'px';
				headTop += itemIcon.offsetHeight;
			}
		}

	}
}


function repositionAccordionLines (accordion) {
	var selectItem = accordionSelectedItem(accordion);
	var tabsItem = findChildFromClass(accordion, accordionTabsClass);
	var tabsHide = findChildFromClass(tabsItem, accordionHideClass);
	var tabsHead = findChildFromClass(tabsItem, accordionHeadClass);
	var items = findChildsFromClass(accordion, accordionItemClass);
	var tabsTurnLeft = findChildsFromClass(accordion, accordionTurnLeftClass);

	var leftShevron = findChildFromClass(accordion, accordionLeftShevronClass);
	var rightShevron = findChildFromClass(accordion, accordionRightShevronClass);

	// Размещаем выбранный элемент	
	var selectIcon = findChildFromClass(selectItem, accordionIconClass);
	var selectHead = findChildFromClass(selectItem, accordionHeadClass);
	var selectBody = findChildFromClass(selectItem, accordionBodyClass);
	var selectHelp = findChildsFromClass(selectItem, accordionHelpClass);

	var i;
	var accordionLeft = 0;
	for (i = 0; i < tabsTurnLeft.length; i++) {
		var arrow = findChildFromClass(tabsTurnLeft[i], 'back');
		delClass(arrow, 'back');
		addClass(arrow, 'forward');
	}
	if (leftShevron) {		
		leftShevron.style.height = accordion.offsetHeight - 4 + 'px';
		accordionLeft = leftShevron.offsetWidth;
	}
	
	accordion.style.width = '';
	var maxHelperWidth = 0;
	
	if (selectHead) { selectHead.style.display = 'block'; }
	if (selectBody) { selectBody.style.display = 'block'; }
	for (i = 0; i < selectHelp.length; i++) {
		if (selectHelp[i]) {
			if ((selectHelp[i].displaySave) && (!selectHelp[i].isPrev)) {
				selectHelp[i].style.display = selectHelp[i].displaySave;
				if ((maxHelperWidth < selectHelp[i].offsetWidth) && (selectHelp[i].displaySave == 'block')) {maxHelperWidth = selectHelp[i].offsetWidth}
			} else {
				selectHelp[i].style.display = 'none';
			}
			
			selectHelp[i].style.height = (accordion.offsetHeight + accordionHelpOffset) + 'px';
		}
	}

	if (rightShevron) {
		if (maxHelperWidth == 0) {
			rightShevron.style.left = accordion.offsetWidth +  accordionLeft + 2 + 'px';
		} else {
			rightShevron.style.left = accordion.offsetWidth +  accordionLeft + maxHelperWidth + 'px';
		}
		rightShevron.style.top = Math.round((accordion.offsetHeight - rightShevron.offsetHeight - accordionHelpOffset) /2) + 'px';
	}
	var bodyHeight = accordion.offsetHeight;
	if (tabsHead)   {
		tabsHead.style.display = 'block';
		bodyHeight -= tabsHead.offsetHeight;
	}
	
	for (i = 0; i < items.length; i++) {
		xxitem = items[i];
		var itemHead = findChildFromClass(xxitem, accordionHeadClass);
		if (itemHead) {	
			itemHead.style.display = 'block';
			bodyHeight -= itemHead.offsetHeight;
		}
	}
	var bodyTop = 0;
	if (selectHead) { bodyTop += selectHead.offsetHeight; }

	var HeadLeft = accordionLeft-2;

	if (selectIcon) {
		HeadLeft += selectIcon.offsetHeight;
		selectIcon.style.cursor = 'auto';
		selectIcon.style.top  = '0px';
		selectIcon.style.left = accordionLeft + 'px';
	}

	if (selectHead) {
		selectHead.style.top     = '0px';
		selectHead.style.left	 = HeadLeft + 'px';
	}

	if (selectBody) {
		selectBody.style.left    = accordionLeft+'px';
		selectBody.style.top     = bodyTop+'px';
		selectBody.style.height  = bodyHeight+'px';
	}

	// Размещаем инструментальную панель
	var tabsTop = accordion.offsetHeight;
	if (tabsHead)   { 
		tabsHead.style.display = 'block';
		tabsTop -= tabsHead.offsetHeight;
		tabsHead.style.top     = tabsTop+'px';
		tabsHead.style.left    = HeadLeft+'px';
	}
	if (tabsHide) {
		tabsHide.style.top     = tabsTop+'px';
		tabsHide.style.left    = accordionLeft + 'px';
	}

	// Размещаем остальные элементы
	var headTop = bodyHeight;
	if (selectHead) { headTop += selectHead.offsetHeight; }
	for (i = 0; i < items.length; i++) {			
		xxitem = items[i];
		if (xxitem != selectItem) {
			var itemIcon = findChildFromClass(xxitem, accordionIconClass);
			if (itemIcon) {
				itemIcon.style.top     = headTop+'px';
				itemIcon.style.left    = accordionLeft + 'px';
			}
			itemHead = findChildFromClass(xxitem, accordionHeadClass);
			if (itemHead) {
				itemHead.style.top     = headTop + 'px';
				itemHead.style.left    = HeadLeft + 'px';
				headTop += itemHead.offsetHeight;
			}
			var itemBody = findChildFromClass(xxitem, accordionBodyClass);
			if (itemBody) { itemBody.style.display = 'none'; }
			var itemHelp = findChildsFromClass(xxitem, accordionHelpClass);
			for (var j = 0; j < itemHelp.length; j++) {
//				itemHelp.displaySave = itemHelp.style.display;
				itemHelp[j].style.display = 'none';
			}
		}
	}

}

function repositionAccordion (accordion) {
	if (isClass(accordion, accordionHideLeftClass)) {
		repositionAccordionHide(accordion);
	} else {
		if (isClass(accordion, accordionIconsClass)) {
			repositionAccordionIcons(accordion);
		} else {
			repositionAccordionLines(accordion);
		}
	}
}

function clickAccordionItem (accordion, accordionItem) {	
	delClass(accordion, accordionHideLeftClass);
	if (accordion.selectItem == accordionItem) {
		delClass(accordion, accordionHideLeftClass);
		repositionAccordion(accordion);
		return true;
	}
	delClass(accordion.selectItem, accordionSelectClass);
	accordion.selectItem = accordionItem;
	addClass(accordion.selectItem, accordionSelectClass);
	repositionAccordion(accordion);
	// Вызываем функцию привязанную к ветке
	var func = accordionItem.getAttribute('clickfunction');
	if (func) { window[func](); }
}

function repositionAccordions () {	
	for (var i = 0; i < accordions.length; i++) { repositionAccordion(accordions[i]); }
}

function clickAccordionTurnLeft (accordion) {
	reflectClass(accordion, accordionHideLeftClass);
	repositionAccordion(accordion);
}
function clickAccordionHide (accordion) {
	delClass(accordion, accordionHideLeftClass)
	reflectClass(accordion, accordionIconsClass);
	repositionAccordion(accordion);
}


function createAccordion (accordion) {
	var defaultAccordionItem = findChildFromClass(accordion, accordionDefaultClass);
	if (!defaultAccordionItem) { defaultAccordionItem = findChildFromClass(accordion, accordionItemClass); }
	accordion.selectItem = defaultAccordionItem;
	addClass(accordion.selectItem, accordionSelectClass);
	var items = findChildsFromClass(accordion, accordionItemClass);
	for (var i = 0; i < items.length; i++) {		
		var accordionItem = items[i];
		var accordionHead = findChildFromClass(accordionItem, accordionHeadClass);
		if (accordionHead) {
			accordionHead.accordion = accordion;
			accordionHead.accordionItem = accordionItem;
			accordionHead.onclick = function () { clickAccordionItem(this.accordion, this.accordionItem); };
		}
		var accordionIcon = findChildFromClass(accordionItem, accordionIconClass);
		if (accordionIcon) {			
			accordionIcon.accordion = accordion;
			accordionIcon.accordionItem = accordionItem;
			accordionIcon.onclick = function () { clickAccordionItem(this.accordion, this.accordionItem); };
		}
		var accordionHelp = findChildsFromClass(accordionItem, accordionHelpClass);
		for (var j = 0; j < accordionHelp.length; j++) {
			accordionHelp[j].show = accordionShowHelp;
			accordionHelp[j].hide = accordionHideHelp;
			accordionHelp[j].accordion = accordion;			
			accordionHelps[accordionHelps.length] = accordionHelp[j];
		}
	}
	if ((unitItem = findChildsFromClass(accordion, accordionTurnLeftClass)) !== false) {
		for (i = 0; i < unitItem.length; i++) {
			unitItem[i].accordion = accordion;
			unitItem[i].onclick = function () { clickAccordionTurnLeft(this.accordion); };
		}
	}
	if ((unit = findChildFromClass(accordion, accordionTabsClass)) !== false) {
		if ((unitItem = findChildFromClass(unit, accordionHideClass)) !== false) {
			unitItem.accordion = accordion;
			unitItem.onclick = function () { clickAccordionHide(this.accordion); };
		}	
		if ((unitItem = findChildFromClass(unit, accordionHeadClass)) !== false) {
			unitItem.accordion = accordion;
			unitItem.onclick = function () { clickAccordionHide(this.accordion); };
		}
	}
	accordions[accordions.length] = accordion;
	addResizeEvent(repositionAccordions);
	repositionAccordion(accordion);
}

function accordionShowHelp() {
	if (isClass(this.accordion, accordionHideLeftClass)) {
		delClass(this.accordion, accordionHideLeftClass);
		repositionAccordion(this.accordion);
	}
	var rightShevron = findChildFromClass(this.accordion, accordionRightShevronClass);
	this.prevAccordion = false;
	this.isPrev = false;
	for (var i = 0; i < accordionHelps.length; i++) {
		if (accordionHelps[i].style.display == 'block') {
			accordionHelps[i].style.display = 'none';
			this.prevAccordion = accordionHelps[i];
			accordionHelps[i].isPrev = true;
		}
	}
	this.style.display = 'block';
	this.displaySave   = 'block';
	var firstChild     = this.childNodes[0] || false;
	if (firstChild) {
		if (firstChild.offsetWidth > 300) {
			this.style.width = firstChild.offsetWidth + 4 + 'px';
		}
	}
	if (rightShevron) {
		rightShevron.oldLeft = this.offsetLeft + 'px';
		rightShevron.style.left = this.offsetLeft + this.offsetWidth + 'px';
	}
}

function accordionHideHelp() {
	var rightShevron = findChildFromClass(this.accordion, accordionRightShevronClass);
	if ((!this.isPrev) && (rightShevron)) {
		if(rightShevron.oldLeft){
			rightShevron.style.left = rightShevron.oldLeft;
		}
	}

	this.style.display = 'none';
	this.displaySave   = 'none';
	if (this.prevAccordion) {
		this.prevAccordion.show();
		this.prevAccordion = false;
	}
}

function registerHelp(obj) {	
}
// ---- /work/units/accordion/accordion.js ---- 
// ==== /work/units/accordion/initHelpers.js ==== 
var globalLoginHelp   = false,
	globalCatalogHelp = false;

function initLoginHelp(obj) {
	globalLoginHelp = obj;
}// ---- /work/units/accordion/initHelpers.js ---- 
// ==== /work/units/navigator/navigator.js ==== 
var
	navigatorPanel;
function createNavigator(obj) {
	navigatorPanel = obj	
	setNavigatorPosition();
	addResizeEvent(setNavigatorPosition);
}
//Устанавливает высоту блока навигатора !!!
function setNavigatorPosition() {	
	navigatorPanel.style.height = mapController.getOptions().rootSize.height - 235 + 'px';
}

//Удаляет все метки модулей каталога и событий, закрывает все окна, очищает адресную строку.
function delAllLabel() {
	if (objectSystem) {
		for (var i in objectSystem.labels) {
			hideObjectLabels(i);
		}
	}
	rootNavigatorHTML.innerHTML = '';
	globalCatalogHelp.innerHTML = '';
	//globalEvent.innerHTML = '';
	globalEventHelp.innerHTML = '';
	for(var i = 0; i < accordionHelps.length; i++){
		accordionHelps[i].hide();
	}
	createTree(rootNavigatorHTML);
	initCatalogHelp(globalCatalogHelp);
	createEventTree(globalEvent);
	initEventHelp(globalEventHelp);
	clearLabelUrl();
	//Удаляем все vip метки
	delAllVip();
}
// ---- /work/units/navigator/navigator.js ---- 
// ==== /work/units/search/autocomplete.js ==== 
/*************************************************************
*                                                            *
*   Модуль автозаполнения																		 *
*                                                            *
*       Copyright (c) 2009 - 2010 ЗАО "Альма IT"             *
*       Отдел разработки программного обеспечения            *
*                                                            *
*  Разработчик: Герасимов М. В.                              *
*  Модифицирован: 29 июля 2010																*
*                                                            *
*************************************************************/


function actb(obj, url, delimiter){
// Функция для создания автозаполняемых полей
//		obj				- указатель на автозаполняемое поле
//		url				- урл скрипта гененирующего список автозаполнения в формате "эл-т списка №1|эл-т списка №2"
//		delimiter - массив разделителей ключевых слов в поле ввода

	/* ---- Public Variables ---- */
	this.actb_timeOut = -1;								// Таймаут в мс (-1: без таймаута)
	this.actb_lim = 7;										// Кол-во выводимых эл-тов автозаполнения (-1: все). Также нужно менять LIMIT в PHP скрипте.
	this.actb_firstText = true;						// should the auto complete be limited to the beginning of keyword?
	this.actb_mouse = true;								// Кликабельные варианты
	this.actb_delimiter = delimiter;			// Разделитель ключевых слов, можно указать пустой массив
	this.actb_startcheck = 1;							// Показать варианты после этого количества введенных символов
	/* ---- Public Variables ---- */

	/* --- Styles --- */
	this.actb_bgColor = '#FFFFFF';
	this.actb_textColor = '#767676';
	this.actb_hColor = '#2966BB';
	this.actb_fFamily = 'Verdana';
	this.actb_fSize = '11px';
	this.actb_hStyle = 'text-decoration:underline;';
	/* --- Styles --- */

	/* ---- Private Variables ---- */
	var actb_delimwords = new Array();
	var actb_cdelimword = 0;
	var actb_delimchar = new Array();
	var actb_display = false;
	var actb_pos = 0;
	var actb_total = 0;
	var actb_curr = null;
	var actb_rangeu = 0;
	var actb_ranged = 0;
	var actb_bool = new Array();
	var actb_pre = 0;
	var actb_toid;
	var actb_tomake = false;
	var actb_getpre = "";
	var actb_mouse_on_list = 1;
	var actb_kwcount = 0;
	var actb_caretmove = false;
	this.actb_keywords = new Array(); //массив эл-тов списка автозаполнения
	/* ---- Private Variables---- */
	
	var actb_self = this;

	actb_curr = obj;

	addEvent(actb_curr,"focus",actb_setup);
	function actb_setup(){
		addEvent(actb_curr,"keyup",actb_ajax);
		addEvent(document,"keydown",actb_checkkey);
		addEvent(actb_curr,"blur",actb_clear);
		addEvent(document,"keydown",actb_keypress);
	}

	function actb_clear(evt){
		if (!evt) evt = event;
		removeEvent(actb_curr,"keyup",actb_ajax);
		removeEvent(document,"keydown",actb_checkkey);
		removeEvent(actb_curr,"blur",actb_clear);
		removeEvent(document,"keydown",actb_keypress);
		actb_removedisp();
	}
	function actb_parse(n){
		if (actb_self.actb_delimiter.length > 0){
			var t = actb_delimwords[actb_cdelimword].trim().addslashes();
			var plen = actb_delimwords[actb_cdelimword].trim().length;
		}else{
			var t = actb_curr.value.addslashes();
			var plen = actb_curr.value.length;
		}
		var tobuild = '';
		var i;

		if (actb_self.actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}
		var p = n.search(re);
				
		for (i=0;i<p;i++){
			tobuild += n.substr(i,1);
		}
		tobuild += "<font style='"+(actb_self.actb_hStyle)+"'>"
		for (i=p;i<plen+p;i++){
			tobuild += n.substr(i,1);
		}
		tobuild += "</font>";
		for (i=plen+p;i<n.length;i++){
			tobuild += n.substr(i,1);
		}
		return tobuild;
	}
	function actb_generate(){
		if (document.getElementById('tat_table')){
			actb_display = false;
			document.body.removeChild(document.getElementById('tat_table'));
		}
		if (actb_kwcount == 0){
			actb_display = false;
			return;
		}
		a = document.createElement('table');
		a.cellSpacing='1px';
		a.cellPadding='2px';
		a.style.position='absolute';
		a.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft(actb_curr) + "px";
		a.style.zIndex = 1000; //поверх всего
		a.style.backgroundColor=actb_self.actb_bgColor;
		a.id = 'tat_table';		
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_self.actb_mouse){
			a.onmouseout = actb_table_unfocus;
			a.onmouseover = actb_table_focus;
		}
		var counter = 0;
		for (i=0;i<actb_self.actb_keywords.length;i++){
			if (actb_bool[i]){
				counter++;
				r = a.insertRow(-1);
				if (first && !actb_tomake){
					r.style.backgroundColor = actb_self.actb_hColor;
					first = false;
					actb_pos = counter;
				}else if(actb_pre == i){
					r.style.backgroundColor = actb_self.actb_hColor;
					first = false;
					actb_pos = counter;
				}else{
					r.style.backgroundColor = actb_self.actb_bgColor;
				}
				r.id = 'tat_tr'+(j);
				c = r.insertCell(-1);
				c.style.color = actb_self.actb_textColor;
				c.style.fontFamily = actb_self.actb_fFamily;
				c.style.fontSize = actb_self.actb_fSize;
				c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
				c.id = 'tat_td'+(j);
				c.setAttribute('pos',j);
				if (actb_self.actb_mouse){
					c.style.cursor = 'pointer';
					c.onclick=actb_mouseclick;
					c.onmouseover = actb_table_highlight;
				}
				j++;
			}
			if (j - 1 == actb_self.actb_lim && j < actb_total){
				r = a.insertRow(-1);
				r.style.backgroundColor = actb_self.actb_bgColor;
				c = r.insertCell(-1);
				c.style.color = actb_self.actb_textColor;
				c.style.fontFamily = 'arial narrow';
				c.style.fontSize = actb_self.actb_fSize;
				c.align='center';
				replaceHTML(c,'\\/');
				if (actb_self.actb_mouse){
					c.style.cursor = 'pointer';
					c.onclick = actb_mouse_down;
				}
				break;
			}
		}
		actb_rangeu = 1;
		actb_ranged = j-1;
		actb_display = true;
		if (actb_pos <= 0) actb_pos = 1;
	}
	function actb_remake(){
		document.body.removeChild(document.getElementById('tat_table'));
		a = document.createElement('table');
		a.cellSpacing='1px';
		a.cellPadding='2px';
		a.style.position='absolute';
		a.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft(actb_curr) + "px";
		a.style.backgroundColor=actb_self.actb_bgColor;
		a.id = 'tat_table';
		if (actb_self.actb_mouse){
			a.onmouseout= actb_table_unfocus;
			a.onmouseover=actb_table_focus;
		}
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_rangeu > 1){
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_self.actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_self.actb_textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = actb_self.actb_fSize;
			c.align='center';
			replaceHTML(c,'/\\');
			if (actb_self.actb_mouse){
				c.style.cursor = 'pointer';
				c.onclick = actb_mouse_up;
			}
		}
		for (i=0;i<actb_self.actb_keywords.length;i++){
			if (actb_bool[i]){
				if (j >= actb_rangeu && j <= actb_ranged){
					r = a.insertRow(-1);
					r.style.backgroundColor = actb_self.actb_bgColor;
					r.id = 'tat_tr'+(j);
					c = r.insertCell(-1);
					c.style.color = actb_self.actb_textColor;
					c.style.fontFamily = actb_self.actb_fFamily;
					c.style.fontSize = actb_self.actb_fSize;
					c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
					c.id = 'tat_td'+(j);
					c.setAttribute('pos',j);
					if (actb_self.actb_mouse){
						c.style.cursor = 'pointer';
						c.onclick=actb_mouseclick;
						c.onmouseover = actb_table_highlight;
					}
					j++;
				}else{
					j++;
				}
			}
			if (j > actb_ranged) break;
		}
		if (j-1 < actb_total){
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_self.actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_self.actb_textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = actb_self.actb_fSize;
			c.align='center';
			replaceHTML(c,'\\/');
			if (actb_self.actb_mouse){
				c.style.cursor = 'pointer';
				c.onclick = actb_mouse_down;
			}
		}
	}
	function actb_goup(){
		if (!actb_display) return;
		if (actb_pos == 1) return;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos--;
		if (actb_pos < actb_rangeu) actb_moveup();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list=0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	function actb_godown(){
		if (!actb_display) return;
		if (actb_pos == actb_total) return;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos++;
		if (actb_pos > actb_ranged) actb_movedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list=0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	function actb_movedown(){
		actb_rangeu++;
		actb_ranged++;
		actb_remake();
	}
	function actb_moveup(){
		actb_rangeu--;
		actb_ranged--;
		actb_remake();
	}

	/* Mouse */
	function actb_mouse_down(){
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos++;
		actb_movedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
		actb_curr.focus();
		actb_mouse_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list=0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	function actb_mouse_up(evt){
		if (!evt) evt = event;
		if (evt.stopPropagation){
			evt.stopPropagation();
		}else{
			evt.cancelBubble = true;
		}
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos--;
		actb_moveup();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
		actb_curr.focus();
		actb_mouse_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list=0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	function actb_mouseclick(evt){
		if (!evt) evt = event;
		if (!actb_display) return;
		actb_mouse_on_list = 0;
		actb_pos = this.getAttribute('pos');
		actb_penter();
	}
	function actb_table_focus(){
		actb_mouse_on_list = 1;
	}
	function actb_table_unfocus(){
		actb_mouse_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list = 0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	function actb_table_highlight(){
		actb_mouse_on_list = 1;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos = this.getAttribute('pos');
		while (actb_pos < actb_rangeu) actb_moveup();
		while (actb_pos > actb_ranged) actb_movedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list = 0;
			actb_removedisp();
		},actb_self.actb_timeOut);
	}
	/* ---- */

	function actb_insertword(a){
		if (actb_self.actb_delimiter.length > 0){
			str = '';
			l=0;
			for (i=0;i<actb_delimwords.length;i++){
				if (actb_cdelimword == i){
					prespace = postspace = '';
					gotbreak = false;
					for (j=0;j<actb_delimwords[i].length;++j){
						if (actb_delimwords[i].charAt(j) != ' '){
							gotbreak = true;
							break;
						}
						prespace += ' ';
					}
					for (j=actb_delimwords[i].length-1;j>=0;--j){
						if (actb_delimwords[i].charAt(j) != ' ') break;
						postspace += ' ';
					}
					str += prespace;
					str += a;
					l = str.length;
					if (gotbreak) str += postspace;
				}else{
					str += actb_delimwords[i];
				}
				if (i != actb_delimwords.length - 1){
					str += actb_delimchar[i];
				}
			}
			actb_curr.value = str;
			setCaret(actb_curr,l);
		}else{
			actb_curr.value = a;
		}
		actb_mouse_on_list = 0;
		actb_removedisp();
	}
	function actb_penter(){
		if (!actb_display) return;
		actb_display = false;
		var word = '';
		var c = 0;
		for (var i=0;i<=actb_self.actb_keywords.length;i++){
			if (actb_bool[i]) c++;
			if (c == actb_pos){
				word = actb_self.actb_keywords[i];
				break;
			}
		}
		actb_insertword(word);
		l = getCaretStart(actb_curr);
	}
	function actb_removedisp(){
		if (actb_mouse_on_list==0){
			actb_display = 0;
			if (document.getElementById('tat_table')){
				document.body.removeChild(document.getElementById('tat_table'));
			}
			if (actb_toid) clearTimeout(actb_toid);
		}
	}
	function actb_keypress(e){	
		if (actb_caretmove) stopEvent(e);
		return !actb_caretmove;
	}
	function actb_checkkey(evt){
		if (!evt) evt = event;
		a = evt.keyCode;
		caret_pos_start = getCaretStart(actb_curr);
		actb_caretmove = 0;
		switch (a){
			case 38:
				actb_goup();
				actb_caretmove = 1;
				return false;
				break;
			case 40:
				actb_godown();
				actb_caretmove = 1;
				return false;
				break;
			case 39: case 9:
				if (actb_display){
					actb_caretmove = 1;
					actb_penter();
					return false;
				}else{
					return true;
				}
				break;
			default:
				setTimeout(function(){
					actb_tocomplete(a)
					},350); // setTimeout нужна чтобы скрипт успел заргузить варианты выбора
				break;
		}
	}
	function actb_ajax(evt){
		if (!evt) evt = event;
		if (evt.keyCode < 45 && evt.keyCode != 0 && evt.keyCode != 8){
		}else{
			getUrl(url+this.value, get_array_autocompl);
		}
	}

	// call back func
	function get_array_autocompl(a,b,responseText){
		this.actb_keywords = responseText.split('|'); // массив ключевых слов полученный от пхп скрипта
	}

	function actb_tocomplete(kc){
		if (kc == 38 || kc == 40 || kc == 13) return;
		var i;
		if (actb_display){
			var word = 0;
			var c = 0;
			for (var i=0;i<=actb_self.actb_keywords.length;i++){
				if (actb_bool[i]) c++;
				if (c == actb_pos){
					word = i;
					break;
				}
			}
			actb_pre = word;
		}else{
			actb_pre = -1
			};

		if (actb_curr.value == ''){
			actb_mouse_on_list = 0;
			actb_removedisp();
			return;
		}
		if (actb_self.actb_delimiter.length > 0){
			caret_pos_start = getCaretStart(actb_curr);
			caret_pos_end = getCaretEnd(actb_curr);

			delim_split = '';
			for (i=0;i<actb_self.actb_delimiter.length;i++){
				delim_split += actb_self.actb_delimiter[i];
			}
			delim_split = delim_split.addslashes();
			delim_split_rx = new RegExp("(["+delim_split+"])");
			c = 0;
			actb_delimwords = new Array();
			actb_delimwords[0] = '';
			for (i=0,j=actb_curr.value.length;i<actb_curr.value.length;i++,j--){
				if (actb_curr.value.substr(i,j).search(delim_split_rx) == 0){
					ma = actb_curr.value.substr(i,j).match(delim_split_rx);
					actb_delimchar[c] = ma[1];
					c++;
					actb_delimwords[c] = '';
				}else{
					actb_delimwords[c] += actb_curr.value.charAt(i);
				}
			}

			var l = 0;
			actb_cdelimword = -1;
			for (i=0;i<actb_delimwords.length;i++){
				if (caret_pos_end >= l && caret_pos_end <= l + actb_delimwords[i].length){
					actb_cdelimword = i;
				}
				l+=actb_delimwords[i].length + 1;
			}
			var ot = actb_delimwords[actb_cdelimword].trim();
			var t = actb_delimwords[actb_cdelimword].addslashes().trim();
		}else{
			var ot = actb_curr.value;
			var t = actb_curr.value.addslashes();
		}
		if (ot.length == 0){
			actb_mouse_on_list = 0;
			actb_removedisp();
		}
		if (ot.length < actb_self.actb_startcheck) return this;
		if (actb_self.actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			//Change
			if (ot.indexOf(" ")>-1){
				var re = new RegExp(t, "i");
			}else{
				var re = new RegExp("^" + t, "i");
			}
		//End Change
		}

		actb_total = 0;
		actb_tomake = false;
		actb_kwcount = 0;

		for (i=0;i<actb_self.actb_keywords.length;i++){
			actb_bool[i] = false;



			//Change
			if (ot.indexOf(" ")>-1){
				if (re.test(actb_self.actb_keywords[i])){
					actb_total++;
					actb_bool[i] = true;
					actb_kwcount++;
					if (actb_pre == i) actb_tomake = true;
				}
			}else{
				var testArray = new Array();
				testArray = actb_self.actb_keywords[i].split(" ");

				for (test=0;test<testArray.length;test++){
					if (re.test(testArray[test])){
						actb_bool[i] = true;
					}
				}
				if (actb_bool[i])
				{
					actb_total++;
					actb_kwcount++;
					if (actb_pre == i) actb_tomake = true;
				}
			}
		//End Change


		}

		if (actb_toid) clearTimeout(actb_toid);
		if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){
			actb_mouse_on_list = 0;
			actb_removedisp();
		},actb_self.actb_timeOut);
		actb_generate();
	}
	return this;
}


/* Event Functions */

// Добавить событие в данный объект
// event_name ссылается на триггер события, например, клик мыши
// func_name - function callback
function addEvent(obj,event_name,func_name){
	if (obj.attachEvent){
		obj.attachEvent("on"+event_name, func_name);
	}else if(obj.addEventListener){
		obj.addEventListener(event_name,func_name,true);
	}else{
		obj["on"+event_name] = func_name;
	}
}

// Удаляет событие из объекта
function removeEvent(obj,event_name,func_name){
	if (obj.detachEvent){
		obj.detachEvent("on"+event_name,func_name);
	}else if(obj.removeEventListener){
		obj.removeEventListener(event_name,func_name,true);
	}else{
		obj["on"+event_name] = null;
	}
}

// Stop an event from bubbling up the event DOM
function stopEvent(evt){
	evt || window.event;
	if (evt.stopPropagation){
		evt.stopPropagation();
		evt.preventDefault();
	}else if(typeof evt.cancelBubble != "undefined"){
		evt.cancelBubble = true;
		evt.returnValue = false;
	}
	return false;
}

// Get the obj that starts the event
function getElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.currentTarget;
	}
}
// Get the obj that triggers off the event
function getTargetElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.target;
	}
}
// For IE only, stops the obj from being selected
function stopSelect(obj){
	if (typeof obj.onselectstart != 'undefined'){
		addEvent(obj,"selectstart",function(){ return false;});
	}
}

/*    Caret Functions     */

// Get the end position of the caret in the object. Note that the obj needs to be in focus first
function getCaretEnd(obj){
	if(typeof obj.selectionEnd != "undefined"){
		return obj.selectionEnd;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(obj);
		}catch(e){
			var Lp=obj.createTextRange();
		}
		Lp.setEndPoint("EndToEnd",M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}
// Get the start position of the caret in the object
function getCaretStart(obj){
	if(typeof obj.selectionStart != "undefined"){
		return obj.selectionStart;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(obj);
		}catch(e){
			var Lp=obj.createTextRange();
		}
		Lp.setEndPoint("EndToStart",M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}
// sets the caret position to l in the object
function setCaret(obj,l){
	obj.focus();
	if (obj.setSelectionRange){
		obj.setSelectionRange(l,l);
	}else if(obj.createTextRange){
		m = obj.createTextRange();
		m.moveStart('character',l);
		m.collapse();
		m.select();
	}
}
// sets the caret selection from s to e in the object
function setSelection(obj,s,e){
	obj.focus();
	if (obj.setSelectionRange){
		obj.setSelectionRange(s,e);
	}else if(obj.createTextRange){
		m = obj.createTextRange();
		m.moveStart('character',s);
		m.moveEnd('character',e);
		m.select();
	}
}

/*    Escape function   */
String.prototype.addslashes = function(){
	return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};
/* --- Escape --- */

/* Offset position from top of the screen */
function curTop(obj){
	toreturn = 0;
	while(obj){
		toreturn += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return toreturn;
}
function curLeft(obj){
	toreturn = 0;
	while(obj){
		toreturn += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return toreturn;
}
/* ------ End of Offset function ------- */

/* Types Function */

// is a given input a number?
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

/* Object Functions */

function replaceHTML(obj,text){
	while(el = obj.childNodes[0]){
		obj.removeChild(el);
	};
	obj.appendChild(document.createTextNode(text));
}
// ---- /work/units/search/autocomplete.js ---- 
// ==== /work/units/search/search.js ==== 
var globalSearchHelp;

function initSearchHelp(obj) {
	globalSearchHelp = obj;
	initSelectGroup(globalSearchHelp);
	//добавляем автозаполнение
	actb(document.getElementById('addressSearchId'), '/scripts/acomplit_addr.php?text=',new Array());
	actb(document.getElementById('catalogSearchId'), '/scripts/acomplit_org.php?text=',new Array());
	actb(document.getElementById('searchKwordsId'), '/scripts/acomplit_key.php?text=',new Array(','));
}

function searchFieldOnBlur (field, fieldValue) {
	if(field.value == ''){
		field.style.color = '#A9A9A9';
		field.value = fieldValue;
	}else{
		field.style.color = '#767676';
	}
}

function searchFieldOnFocus (field, fieldValue) {
	if(field.value == fieldValue){
		field.style.color = '#767676';
		field.value = '';
	}
}

function showGeoObject (a, b, reply) {
	var xmlDoc = XML.parse(reply),
	    root = xmlDoc.documentElement || false;
	if (root) {
		var childNodes = root.childNodes;
		for (var i = 0; i < childNodes.length; i++) {
			if (childNodes[i].nodeType == 1) {
				var
					mapOption = mapController.getOptions(),
					minx = childNodes[i].getAttribute('minx'),
					miny = childNodes[i].getAttribute('miny'),
					maxx = childNodes[i].getAttribute('maxx'),
					maxy = childNodes[i].getAttribute('maxy'),
					mapx = childNodes[i].getAttribute('mapx'),
					mapy = childNodes[i].getAttribute('mapy'),
					adr  = childNodes[i].getAttribute('name'),
					id  = childNodes[i].getAttribute('object_id'),
					base = Math.log(1.3),
					s ,
					x = (parseInt(maxx, 10) + parseInt(minx, 10))/2,
					y = (parseInt(maxy, 10) + parseInt(miny, 10))/2;
				if ((maxx - minx) > (maxy - miny)){
					s = Math.log((maxx - minx)/mapOption.rootSize.width)/base;
				} else {
					s = Math.log((maxy - miny)/mapOption.rootSize.height)/base;
				}
				if (s < mapOption.zoomInLimit) {s = mapOption.zoomInLimit}
				if (s > mapOption.zoomOutLimit) {s = mapOption.zoomOutLimit}
				mapOption.currentScale = Math.ceil(s);				
				mapController.redrawMap();				
				mapController.teleportMapXY(x, y);
				showAllMapObjects();				
				createStreetHint(id, adr, {x: mapx, y:mapy});
			}
		}
	}
}

//класс формы поиска
//требует ,чтобы поля были помечены специальным атрибутом "stype"
function TsearchForm(obj)
{
	this.rootObj	= obj;//главный наш обьект(форма или див)
	this.button		= null;//кнопочка отправки запроса поиска
	this.searchType = obj.getAttribute('searchType');//кнопочка отправки запроса поиска
	this.inp		= new Array();//поля поиска

	//ищем все нужные нам чайлды
/*нехай сами нас ищут!
for(var i=0;i<obj.childNodes.length;i++)
	{
		if(obj.childNodes[i].attributes!=null)
		{
			var type = obj.childNodes[i].attributes.getNamedItem('stype');

			if (type != null){type=type.value};

			if (type == 'inp')
			{
				this.inp[this.inp.length] = obj.childNodes[i];
			}
			else if(type == 'button')
			{
				this.button = obj.childNodes[i];
			}
		}
	}
	*/

	this.removeSearchLoading = function (interval) {
		window.clearInterval(interval);
		this.button.src = '/images/find.gif';
		this.button.style.cursor = 'pointer';
	}
	
	this.addField = function(obj)
	{
		this.inp[this.inp.length]=obj;
		obj.searchForm = this;
	}
	//инициализация кнопочки отправки
	this.setButton = function(obj)
	{
		this.button = obj;
		this.button.searchForm = this;
		this.button.load = 1;
		this.button.onclick = function(){this.searchForm.search();} ;
	}

	this.search = function () {
		if (this.button.load == 1) {
			this[this.searchType]();
			this.button.load = 0;
			if (this.button.src == getPagePath() + '/images/find.gif') {
				this.button.src = '/images/expand_loading.gif';
			}
			this.button.style.cursor = 'auto';
			var caller = this;
			var timeout = window.setInterval(function() {caller.removeSearchLoading(timeout);}, 40000);
		}
	}

	this.searchEnter = function(event) {
		if (event.keyCode) {
			if (event.keyCode == 13) {
				this.search();
			}
		}
	}

	this.searchFirm = function () {
		var pagePath = getPagePath(),
				url      = '/scripts/catalog_search.php',
				argument = this.getSendedString();
		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: helpNavigatorFirm, node: null, free: true, searchForm: this, helper:globalSearchHelp});
	}

	this.searchStreet = function () {
		var pagePath = getPagePath(),
				url      = '/cgi/street_list',
				argument = this.getSendedString();

		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: helpNavigatorStreet, node: null, free: true, searchForm: this, helper:globalSearchHelp});
}

	this.searchKeywords = function () {
		var pagePath = getPagePath(),
				url      = '/scripts/search_for_keywords.php',
				argument = this.getSendedString();
		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: helpNavigatorFirm, node: null, free: true, searchForm: this, helper:globalSearchHelp});
}

//Поиск наружной рекламы
	this.searchAdvertising = function () {
	var pagePath = getPagePath(),
				url      = '/scripts/search_for_advertising.php',
				argument = this.getSendedString();
		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: helpNavigatorAdvertising, node: null, free: true, searchForm: this, helper:globalAdvertisingHelp});
}

	//возвращает строку ,которая потом уйдет в скрипт поиска
	this.getSendedString = function()
	{
		var result=new Array();
		for(var i=0;i<this.inp.length;i++)
		{			
			if ((this.inp[i].value != '') && (this.inp[i].value != null) 
				//&& (this.inp[i].type == 'label')
				&& (this.inp[i].type != 'radio') && (this.inp[i].type != 'checkbox')  
				|| (this.inp[i].checked == null || this.inp[i].checked == true ))
			{
				result[result.length] = this.inp[i].name + "=" + this.inp[i].value;

			}
		}
		return '?'+result.join('&');
	}

}

//цепляет модуль поиска к какому-то обьекту,например к форме ,или диву
function applySearch(obj)
{
	obj.searchForm = new TsearchForm(obj);
}
//цепляет функцию обработки одного поля ввода
function applySearchField(obj)
{	
	var curObj = obj;
	while(curObj.parentNode != null)
	{
		if(curObj.searchForm!=null)
		{
			curObj.searchForm.addField(obj);
			obj.onkeyup = function(event) {event = event || window.event;curObj.searchForm.searchEnter(event)};
			break;
		}
		curObj = curObj.parentNode;
	}
}

//цепляет функцию обработки кнопки начала поиска
function applySearchButton(obj)
{
	var curObj = obj;
	while(curObj.parentNode != curObj)
	{
		if(curObj.searchForm!=null)
		{
			curObj.searchForm.setButton(obj);
			break;
		}
		curObj = curObj.parentNode;
	}
}

// Однократно срабатывает при открытии вкладки "Недвижимость"
function activateRealtySearch(){
	get('realtySearchLeftColumn').style.display="block";//заплатка, нужна чтобы "белый занавес" не рсколбашивало под ие-6
	selectHtmlEst();//
}

function closeKeywordsForm(){
	var content = findChildFromClass(document.body,'content');
	var fon = findChildFromClass(document.body,'fon');
	document.body.removeChild(content);
	document.body.removeChild(fon);
}
//
 function realtySearch() {
		var pagePath = getPagePath(),
				url = '/scripts/search_estate.php',
				argument = estFormValues();
		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: helpNavigatorRealty, node: null, free: true, searchForm: {button:{load:0},removeSearchLoading:function(){}}, helper:globalRealtyHelp});
	}
// ---- /work/units/search/search.js ---- 
// ==== /work/units/streetSelector/streetSelector.js ==== 
var pagePath = getPagePath();
var helpDiv = Array();
var streetInput;
var streetInTitle;
var flag = true;
var goToStreetId;
var selectStreetName;
var goToStreetButton;
var streetEnterTimer;

function setHelpDiv(obj) {
	helpDiv[helpDiv.length] = obj;
}

function setStreetInput(obj) {
	streetInput = obj;
}

function setStreetInTitle(obj) {
	streetInTitle = obj;
}
function setGoToStreetButton(obj) {
	obj.onclick = function () {setStreet(goToStreetId)};
	obj.style.display = "none";
	goToStreetButton = obj;
}

function sendHelpSelect(name){
	var url = pagePath + '/cgi/street_list_all?text=' + name;
	getUrl(url, fillHelpDiv);
}

function getHelpSelect(name) {
	window.clearTimeout(streetEnterTimer);
	streetEnterTimer = window.setTimeout(function (){sendHelpSelect(name)}, 500);
}


function setStreet(id) {
	var url = pagePath + '/cgi/street_list_all?id=' + id;
	getUrl(url, function (){});
}


function fillText(name, id){
	goToStreetButton.style.display = "inline";
	streetInput.value = name;
	selectStreetName = name;
	for (var i = 0; i<helpDiv.length; i++) {
		helpDiv[i].innerHTML = '';
	}
	if (name.length > 22) {
		name = '...'+name.substr(name.length-19, 19);
	} 
	streetInTitle.innerHTML = name;
	goToStreetId = id;
}

function createHelpList(street) {
	for (var i = 0; i<helpDiv.length; i++) {
		var span = document.createElement('SPAN');
		span.innerHTML = street.getAttribute('name');
		span.onclick = function () {goToStreetId = street.getAttribute('id'); fillText(street.getAttribute('name'),goToStreetId); streets.selectPath(goToStreetId,street.getAttribute('name'), true);};
		helpDiv[i].appendChild(span);
	}
}

function clearObject(obj) {
	var children = obj.childNodes;
	for (var i = 0; i < children.length; i++) {
		obj.removeChild(children[i]);
	}
}
	
function fillHelpDiv(a, b, reply) {
	for (var i = 0; i<helpDiv.length; i++) {
		helpDiv[i].innerHTML = '';
		helpDiv[i].style.width = streetInput.style.width;
	}
	goToStreetButton.style.display = "none";	
	var xmlDoc = XML.parse(reply);
	if (xmlDoc.documentElement){
		var root = xmlDoc.documentElement;
		var replyNodes = root.childNodes;
		if (replyNodes.length != 0) {
			for (var i = 0; i < replyNodes.length; i++) {
				if (replyNodes[i].nodeType == 1) {
					createHelpList(replyNodes[i]);
				}
			}
		}
	}	
}

// ---- /work/units/streetSelector/streetSelector.js ---- 
// ==== /work/units/buildingSelector/buildTemplate.js ==== 
var buildingTemplates = {length: 0};
var buildNewPosition, buildTemplateDiv;
var buildScale;
var propMasht;

function getTemplateList(obj) {
	buildTemplateDiv = obj;
	var url = pagePath + '/scripts/build_template_list.php';
	addMouseUpEvent(mouseUpBuilding);
	getUrlWithObject(url, showBuildTemplate, obj);
}

function showBuildTemplate(a, b, reply, obj) {
	var table = document.createElement('TABLE'),
		tr,td;
	var xmlDoc = XML.parse(reply);
	if (xmlDoc.documentElement){
		var root = xmlDoc.documentElement;
		var replyNodes = root.childNodes;
		if (replyNodes.length != 0) {
			var j = 0;
			for (var i = 0; i < replyNodes.length; i++) {
				if (replyNodes[i].nodeType == 1) {
					if (j % 1 == 0) {
						tr = document.createElement('TR');
						table.appendChild(tr);
					}
					td = document.createElement('TD');
					var buildingTemp = parseTemplate(replyNodes[i]);
					var btBlock = createBtBlock(buildingTemp);
					td.appendChild(btBlock);
					buildingTemplates[buildingTemp.id] = buildingTemp;
					buildingTemplates.length++;
					tr.appendChild(td);
					j++;
				}
			}
		}
	}
	obj.appendChild(table);
}

function parseTemplate(node) {
	var id   = node.getAttribute('id');
	var src  = node.getAttribute('src')
	var preview = node.getAttribute('preview');
	var width  = node.getAttribute('width');
	var height = node.getAttribute('height');
	var click = node.getAttribute('click');
	var name = node.getAttribute('name');
	return {id: id, src: src, preview: preview, width: width, height: height, click: click, name: name};
}

function selectTemlate (id) {	
	var center = mapController.searchCenterCell();
	if (selectedLineBuilding) {
		buildingTemplates[id].click++;
		changeBuildingTemplateInBase(id, {click: buildingTemplates[id].click})
		var building = streets.buildings[selectedLineBuilding];
		building.type = id;
		if (id == 0) {
			building.visual.remove();		
			building.drawMe(center);
			building.changeStatus('selectedStreet');
		} else {
			building.visual.remove();
			building.drawMe(center);
			building.changeStatus('selectedStreet');
		}
		changeBuildingInBase(selectedLineBuilding, {type: id})
	}
}

function createBtBlock (obj) {
	var div   = document.createElement('DIV');
	var divOut   = document.createElement('DIV');
	var preview = document.createElement('IMG');
	var name = document.createElement('SPAN');
	if (obj.preview) {
		preview.src = getPagePath() + obj.preview;
		preview.onclick = function () {selectTemlate(obj.id)};
		div.appendChild(preview);
	}
	name.innerHTML = obj.name;	
	div.className = 'buildTemplateBG';
	divOut.appendChild(div);
	divOut.appendChild(name);
	return divOut;
}

function addBuildHelpers(build) {
	var position = build.visual.getBBox();
	var helperWidth = 8;
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 't'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'b'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'l'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'r'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'tl'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'tr'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'bl'));
	build.visual.push(createBuildScaleHelper(position, helperWidth, build, 'br'));
}

function createBuildScaleHelper(position, width, build, type) {
	var helper, cursor;
	switch (type) {
		case 't' : helper = streets.canvas.rect(position.x, position.y - width / build.sy,position.width, width / build.sy); cursor = "n-resize"; break;
		case 'b' : helper = streets.canvas.rect(position.x, parseInt(position.height) + parseInt(position.y), position.width, width/ build.sy); cursor = "s-resize"; break;
		case 'l' : helper = streets.canvas.rect(position.x - width / build.sx, position.y, width / build.sx, position.height); cursor = "w-resize"; break;
		case 'r' : helper = streets.canvas.rect(parseInt(position.x) + parseInt(position.width), position.y, width / build.sx, position.height); cursor = "e-resize"; break;
		case 'tl' : helper = streets.canvas.rect(position.x - width / build.sx, position.y - width / build.sy, width / build.sx, width / build.sy); cursor = "nw-resize"; break;
		case 'tr' : helper = streets.canvas.rect(parseInt(position.x) + parseInt(position.width), position.y - width / build.sy, width / build.sx, width / build.sy); cursor = "ne-resize"; break;
		case 'bl' : helper = streets.canvas.rect(position.x - width / build.sx, parseInt(position.y) + parseInt(position.height), width / build.sx, width / build.sy); cursor = "sw-resize"; break;
		case 'br' : helper = streets.canvas.rect(parseInt(position.x) + parseInt(position.width), parseInt(position.y) + parseInt(position.height), width / build.sx, width / build.sy); cursor = "se-resize"; break;
	}
	helper.attr({fill: '#9cf', 'opacity':0.3});
	helper.node.style.cursor = cursor;
	helper.building = build;
	helper.mousedown(function() {buildNewPosition = {x:0, y:0};
			                     buildScale = this.building;
								 buildScale.startCoords = mousePos;
								 helperDownType = type;
								 blockAllDrag = scaleBuildMath;
								 var transformCenterX = buildScale.visual.getBBox().x + buildScale.visual.getBBox().width  / 2;
								 var transformCenterY = buildScale.visual.getBBox().y + buildScale.visual.getBBox().height / 2;
							     tg = (mousePos.y - transformCenterY) / (mousePos.x - transformCenterX)});
	return helper;
}

function scaleBuildMath() {
	var offsetX = mousePos.x - mousePosOld.x;
	var offsetY = mousePos.y - mousePosOld.y;

	buildNewPosition.x += offsetX;
	buildNewPosition.y += offsetY;

	var transformCenterX = buildScale.visualCenter().x;
	var transformCenterY = buildScale.visualCenter().y;
	var b = Math.sqrt((buildScale.startCoords.x - transformCenterX) * (buildScale.startCoords.x - transformCenterX) +
		              (buildScale.startCoords.y - transformCenterY) * (buildScale.startCoords.y - transformCenterY));
	var c = Math.sqrt((buildScale.startCoords.x + buildNewPosition.x - transformCenterX) * (buildScale.startCoords.x + buildNewPosition.x - transformCenterX) +
		               (buildScale.startCoords.y + buildNewPosition.y - transformCenterY) * (buildScale.startCoords.y + buildNewPosition.y - transformCenterY));
	var a = Math.sqrt((buildNewPosition.x) * (buildNewPosition.x) +
		               (buildNewPosition.y) * (buildNewPosition.y));

	var cosa = (b*b + c*c - a*a)/(2*b*c);
	var dx = (buildScale.startCoords.x + buildNewPosition.x - transformCenterX);
	var dy = (buildScale.startCoords.y + buildNewPosition.y - transformCenterY);
	var tgn = dy/dx
	var alfa;
	if (((tgn - tg) * dx *  (buildScale.startCoords.x-transformCenterX)) <= 0)  {
		alfa = 360 - Math.acos(cosa)/Math.PI*180;
	}else {
		alfa = Math.acos(cosa)/Math.PI*180;
	}


	if ((helperDownType == 't') ||
		(helperDownType == 'b') )
	{
		if (propMasht.checked) {
			scaleBuild(c/b, transformCenterX, transformCenterY);
		} else {
			scaleBuildY(c/b, transformCenterX, transformCenterY);
		}
	} else {
		if ((helperDownType == 'l') ||
		    (helperDownType == 'r')) {
			if (propMasht.checked) {
			scaleBuild(c/b, transformCenterX, transformCenterY);
		} else {
			scaleBuildX(c/b, transformCenterX, transformCenterY);
		}
		} else {
			rotateBuild(alfa, transformCenterX, transformCenterY);
		}
	}
}

function rotateBuild(alfa, xc, yc) {
	rotAlf = alfa;
	buildScale.visual.rotate(parseInt(buildScale.angle) + alfa, xc, yc);
	buildScale.newScale = buildScale.startScale
}

function scaleBuildX(k, xc, yc) {
	k = buildScale.sx * k;
	buildScale.newSx = 	k;
	buildScale.visual.scale(k, buildScale.sy, xc, yc);
	rotAlf = 0;
	buildScale.newSy = buildScale.sy;
}

function scaleBuildY(k, xc, yc) {	
	k = buildScale.sy * k;
	buildScale.newSy = k;
	buildScale.visual.scale(buildScale.sx, k, xc, yc);
	rotAlf = 0;
	buildScale.newSx = buildScale.sx;
}

function scaleBuild(k, xc, yc) {
	var ky = buildScale.sy * k,
		kx = buildScale.sx * k;
	buildScale.newSy = ky;
	buildScale.newSx = kx;
	buildScale.visual.scale(kx, ky, xc, yc);
	rotAlf = 0;
}

function mouseUpBuilding() {
	blockAllDrag = false;	
	if (buildScale) {
		if (!buildScale.newSx) {buildScale.newSx = buildScale.sx}
		if (!buildScale.newSy) {buildScale.newSy = buildScale.sy}
		buildScale.sx = buildScale.newSx;
		buildScale.sy = buildScale.newSy;
		buildScale.angle = parseInt(buildScale.angle) + rotAlf;
		if (buildScale.angle > 360) {buildScale.angle -= 360}	

		changeBuildingInBase(buildScale.id, {sx: buildScale.newSx, sy: buildScale.newSy, angle: buildScale.angle, segAngle: buildScale.segAngle})
		buildScale.visual.remove();
		buildScale.drawMe(mapController.searchCenterCell());

		buildScale = null;
	}
}

function changeBuildingInBase(id, data) {	
	var url = pagePath + '/scripts/change_building.php?id='+id;
	if (data.sx) {url = url + '&scale_x=' + data.sx}
	if (data.sy) {url = url + '&scale_y=' + data.sy}
	if (data.angle) {url = url + '&angle=' + (data.angle - data.segAngle)}
	if (data.type) {url = url + '&type=' + data.type}
	getUrlWithObject(url, function() {}, id);
}

function changeBuildingTemplateInBase(id, data) {
	var url = pagePath + '/scripts/change_building_template.php?id='+id;
	if (data.click) {url = url + '&click=' + data.click}
	getUrl(url, function() {});
}

function initPropMasht(obj) {
	propMasht = obj;
}

function filterTemplate(event, input) {
	event = event || window.event;
	if (event.keyCode == 13) {
		var url = pagePath + '/scripts/build_template_list.php?text=' + input.value;
		buildingTemplates = {length: 0};
		buildTemplateDiv.innerHTML = '';
		getUrlWithObject(url, showBuildTemplate, buildTemplateDiv);
	}
}// ---- /work/units/buildingSelector/buildTemplate.js ---- 
// ==== /work/units/buildingSelector/buildingSelector.js ==== 
var selectedBuilding,
	selectedSegment;

var selector = function(container, structure) {
	this.container = container;
	this.structure = structure;
	this.selected  = Array();
	this.fieldList = {};
	this.parseStructure = function() {
		if (this.structure) {
			for (var i = 0; i < this.structure.length; i++) {
				if (this.structure[i].type == 'input') {
					this.createInput(this.structure[i], this.container);
				}
			}
		}
	};
	this.createInput = function(inputStructure, container) {
		var fragment = document.createDocumentFragment(),
			input    = document.createElement('INPUT'),
			spacer   = document.createElement('BR'),
			helpers  = Array();
		if (input.fieldName = inputStructure['name']) {
			for (var key in inputStructure) {
				if (key == 'baseName')     input.baseName     = inputStructure[key];
				if (key == 'header')       var header         = inputStructure[key];
				if (key == 'className')    input.className    = inputStructure[key];
				if (key == 'updateScript') input.updateScript = inputStructure[key];
				if (key == 'value')        input.value        = inputStructure[key];
				if (key == 'button') {
					var button  = document.createElement('INPUT');
					button.type = 'button';
					button.core = this;
					button.linkedField = input;
					for (var buttonKey in inputStructure[key]) {
						if (buttonKey == 'value'    ) button.value = inputStructure[key][buttonKey];
						if (buttonKey == 'behaviour') {
							var behaviour = inputStructure[key][buttonKey].split(', ');
							for (var i = 0; i < behaviour.length; i++){
								switch (behaviour[i]) {
									case 'selector': this.behaviourSelector(button, inputStructure[key].globalVar, input.fieldName); break;
									case 'changer' : this.behaviourChanger(button, input.fieldName); break;
								}
							}
						}
						if (buttonKey == 'name') button.name = inputStructure[key][buttonKey];
					}
					helpers[helpers.length] = button;
					input.helper = button;
				}
			}
			var headline = document.createElement('SPAN');
				headline.innerHTML = header;
			fragment.appendChild(headline);
			fragment.appendChild(spacer);		
			fragment.appendChild(input);
			input.refill = function(string) {input.value = string;}
			for (var i = 0; i < helpers.length; i++) {
				fragment.appendChild(helpers[i]);
			}
			fragment.appendChild(spacer);	
			container.appendChild(fragment);
			this.fieldList[input.fieldName] = input;
		}
	};
	this.behaviourSelector = function(object, globalVar, name) {
		var updateEvent = function() {
				var params   = this.core.selected[globalVar] || {};
				var baseName = object.linkedField.baseName || name;
				params[name] = object.linkedField.value;
				this.core.selected[globalVar] = params;
				var baseName = object.linkedField.baseName || name;
				var callbackParams = {};
				callbackParams[name] = {name: baseName, value: object.linkedField.value};
				object.linkedField.updateScript(callbackParams);
			};							
		object.onclick  = updateEvent;
		object.reselect = updateEvent;
	};
	this.behaviourChanger = function(object, name) {		
		var updateEvent = function() {
				var baseName = object.linkedField.baseName || name;							
				var callbackParams = {};
				callbackParams[name] = {name: baseName, value: object.linkedField.value};
				object.linkedField.updateScript(callbackParams);
			};
		object.onclick  = updateEvent;
		object.reselect = updateEvent;
	};
	this.initContainer = function() {
		if (this.container) {
			this.parseStructure();
		}
	};
	this.changeField = function(arguments) {
		if (arguments) {
			for (var i in this.fieldList) {
				if ((arguments[i]) || (arguments[i] == 0)) {this.fieldList[i].refill(arguments[i]);}
			}
		}
	};
	this.changeFields = function(arguments) {
		if (arguments) {
			for (var i in this.fieldList) {
				if ((arguments[i]) || (arguments[i] == 0)) {this.fieldList[i].refill(arguments[i]);}
				else {this.fieldList[i].refill('');}
			}
		} else {for (var i in this.fieldList) {this.fieldList[i].refill('');}}
	};
}

function selectBuilding(obj) {
	var structure = Array(
						  {type: 'input',
						   className: 'normalInput',
						   header :'номер здания:',
						   value:'',
						   name: "number",
						   baseName: "number",
						   updateScript: changeBuilding,
						   button: {value: 'выбор', behaviour: 'selector', globalVar: 'selectedBuilding'}
						  },						  
						  {type: 'input',
						   className: 'bigInput',
						   header :'x:',
						   value:'',
						   name: "mapX",
						   baseName: "map_x", 
						   updateScript: changeBuilding,
						   button: {value: 'задать', behaviour: 'changer'}
						  },
						  {type: 'input',
						   className: 'bigInput',
						   header :'y:',
						   value:'',
						   name: "mapY",
						   baseName: "map_y", 
						   updateScript: changeBuilding,
						   button: {value: 'задать', behaviour: 'changer'}
						  },
						  {type: 'input',
						   className: 'bigInput',
						   header :'важность:',
						   value:'',
						   name: "importance",
						   baseName: "importance",
						   updateScript: changeBuilding,
						   button: {value: 'задать', behaviour: 'changer'}
						  }
						 );
	selectedBuilding = new selector(obj, structure);
	selectedBuilding.initContainer();
}

function selectSegment(obj) {
	var structure = Array(						
						  {type: 'input',
						   className: 'smallInput',
						   header :'важность:',
						   value:'',
						   name: "importance",
						   baseName: "importance",
						   updateScript: changeSegment,
						   button: {value: 'задать', behaviour: 'changer'}
						  },						
						  {type: 'input',
							className: 'bigInput',
							header:"улица: ",
							name: "name",
							value:''
						  },
						  {type: 'input',
						   className: 'bigInput hidden',
						   header :'номер о',
						   value:'',
						   name: "streetId",
						   baseName: "object_id",
						   updateScript: changeSegment,
						   button: {value: 'поменять', behaviour: 'changer'}
						  }
						 );
	selectedSegment = new selector(obj, structure);
	selectedSegment.initContainer();
}

function changeBuilding(params) {
	if (selectedLineBuilding) {
		var pagePath  = getPagePath(),
			urlString = '?id=' + selectedLineBuilding + '&';
		for (var i in params) {urlString += params[i].name + '=' + params[i].value + '&';}
		var url = pagePath + '/scripts/change_building.php' + urlString.substr(0,urlString.length - 1);
		getUrl(url, function(){});
		if (streets) {
			var building = streets.getBuildingById(selectedLineBuilding),
				mapCenter = mapController.searchCenterCell(),
				change    = false;
			for (var i in params) {if ((building[i]) || (building[i] == 0)) {if (building[i] != params[i].value) {building[i] = params[i].value; change = true;}}}
			if (change) {
				building.deleteMe();
				building.x = building.real(building.mapX);
				building.y = building.real(building.mapY);
				building.drawMe(mapCenter);
				building.selectMe();				
			}
		}
	}
}

function changeSegment(params) {
	if (selectedLineSegment) {
		var pagePath  = getPagePath(),
			urlString = '?id=' + selectedLineSegment + '&';
		for (var i in params) {urlString += params[i].name + '=' + params[i].value + '&';}
		var url = pagePath + '/scripts/change_segment.php' + urlString.substr(0,urlString.length - 1);
		getUrl(url, function(){});
		if (streets) {
			var segment = streets.segments[selectedLineSegment],
				change    = false;
			for (var i in params) {if ((segment[i]) || (segment[i] == 0)) {if (segment[i] != params[i].value) {segment[i] = params[i].value; change = true;}}}
			if (change) {
				segment.deleteMe();
				segment.drawMe(segment.getEdgeCoords());
				segment.selectMe();
				getUrl(url, function(){});
			}
		}
	}
}// ---- /work/units/buildingSelector/buildingSelector.js ---- 
// ==== /work/units/segmentOptions/segmentOptions.js ==== 
var impSel;

function setImpSelect(obj) {
	impSel = obj;
}

function changeSegmentImp(imp) {
	if (selectedLineSegment) {
		var url = getPagePath() + '/scripts/set_segment_opt.php?importance=' + imp + '&segment_id=' + selectedLineSegment;
		getUrl(url, function (){});
	}
}
// ---- /work/units/segmentOptions/segmentOptions.js ---- 
// ==== /work/units/labels/labels.js ==== 
function addLabel(id,typeId) {
	var url = '/scripts/add_label.php?object_id=' + id;
	var unitName = '';
	switch (typeId) {
		case 1:unitName = 'unitEstate';
			break;
		case 2:unitName = 'unitEstate';
			break;
		case 3:unitName = 'unitContact';
			break;
		case 5:unitName = 'unitEvent';
			break;
		default:
			break;
	}

	getUrlWithObject(url, showContactUnit, {object_id: id, unitName:unitName})
}

function showContactUnit(a, b, label_id, params) {
	var url = ['/scripts/',params.unitName,'.htm?id=', label_id, '&object_id=', params.object_id].join("");
	getUrl(url, showDiv);
}
// ---- /work/units/labels/labels.js ---- 
// ==== /work/units/mapadmin/map_admin.js ==== 
var opacityMain = 0, opacityDiv = 0;
function selectAdminRegim(regim){
	var html;
	switch(regim){
		case 1:html ='<div style="width: 260px;" class="selectLink">\n\
						<a href="/statistic.htm">Статистика каталога</a> | \n\
						<a href="/statistic_site.htm">Статистика сайта</a>\n\
						</div>';break;
		case 2:html ='<div style="width: 755px;" class="selectLink">\n\
						<a href="/catalog_admin.htm">Редактор каталога</a> | \n\
						<a href="/event_admin.htm">Редактор событий</a> | \n\
						<a href="/estate_admin.htm">Редактор недвижимости</a> | \n\
						<a href="/vip_string.htm">Редактор Vip-строки</a> | \n\
						<a href="/outdoor_advertising.htm">Редактор наружной рекламы</a>\n\
						</div>';break;
		case 3:html ='<div style="width: 290px;" class="selectLink">\n\
						<a href="/reg_catalog_admin.htm">Заявки на каталог</a> | \n\
						<a href="#">Заявки на недвижимость</a>\n\
						</div>';break;
	}
	mainDiv = document.createElement('DIV'), contentDiv = document.createElement('DIV');
	mainDiv.style.background = "#CACACA";
	mainDiv.style.height = "100%";
	mainDiv.style.left = "0";
	mainDiv.style.position = "absolute";
	mainDiv.style.top = "0";
	mainDiv.style.width = "100%";
	mainDiv.style.Zindex = "998";
	contentDiv.className = "content";
	var reg = /<div\s+style=.width:\s+(\d+)/
	if(reg.exec(html)){
		var arr = reg.exec(html);
		contentDiv.innerHTML = html;
		contentDiv.style.left = Math.round(getScreenWidth()/2 - (arr[1]/2)) + 'px';
		contentDiv.style.top = Math.round(getScreenHeight()/2 - ((getScreenHeight()/2)/2)) + 'px';
	}else{
		contentDiv.innerHTML = html;
		contentDiv.style.left = Math.round(getScreenWidth()/2) + 'px';
	}
	mainDiv.onclick = function (){
		document.body.removeChild(mainDiv);
		document.body.removeChild(contentDiv);
		delete mainDiv;
		delete contentDiv;
		opacityMain = 0;
		opacityDiv = 0;
	}
	document.body.appendChild(mainDiv);
	document.body.appendChild(contentDiv);
	plavnoMain();
	plavnoDiv();
		//var menu = document.getElementById('menu');
		//menu.innerHTML = '';
		//menu.innerHTML = html;
}

function plavnoMain(){
	mainDiv.style.opacity = '0.'+opacityMain;
	if(opacityMain < 6){
		opacityMain++;
		setTimeout(plavnoMain, 50);
	}
	
}

function plavnoDiv(){
	contentDiv.style.opacity = '0.'+opacityDiv;
	if(opacityDiv < 9){
		opacityDiv++;
		setTimeout(plavnoDiv, 50);
	}

}


function SetCookie(cookieName,cookieValue,nDays) {
	var today = new Date();
	var expire = new Date();
	 if (nDays==null || nDays==0) nDays=1;
	 expire.setTime(today.getTime() + 3600000*24*nDays);
	 document.cookie = cookieName+"="+escape(cookieValue)
					 + ";expires="+expire.toGMTString();
}

  function getCookie(name) {
	  var start = document.cookie.indexOf( name + "=" );
	  var len = start + name.length + 1;
	  if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
	  return null;
	  }
	  if ( start == -1 ) return null;
	  var end = document.cookie.indexOf( ';', len );
	  if ( end == -1 ) end = document.cookie.length;
	  return unescape( document.cookie.substring( len, end ) );
  }

function deleteCookie(name, pat, domain) {
	if (getCookie(name)) {
		document.cookie = name + "=" +
		((pat) ? "; path=" + pat : "") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-70 00:00:01 GMT"
	}

}

function SetUnsetCell(){
	if(getCookie('mapCellReview')){
		deleteCookie('mapCellReview');
	}else{
		 SetCookie('mapCellReview','1',1)
	}
}

function SetCellCheckbox(){
	if(getCookie('mapCellReview')){
		var input = document.getElementById('setUnset');
		input.checked = true;
	}else{
		var input = document.getElementById('setUnset');
		input.checked = false;
	}
}

// ---- /work/units/mapadmin/map_admin.js ---- 
// ==== /work/units/mapPlace/mapPlace.js ==== 
var objectSystem = null;
var mapPlaceDiv;
var streetHint = {};
function mapObjectFactory(id, containerId, name, address, ico, color, width, height, background, coords, canvas) {
	var myId         = id,
		myContainer  = containerId,
		myName		 = name,
		myAddress	 = address,
		myIco        = ico,
		myColor		 = color,
		myWidth		 = width,
		myHeight	 = height,		
		myBackground = background,
		mapCoords = coords.split(", "),

		resultObject = {
		myCanvas	  : canvas,
		getId         : function() {return myId;},
		getContainer  : function() {return myContainer;},
		getIco        : function() {return myIco;},
		getColor	  : function() {return myColor;},
		getWidth	  : function() {return myWidth;},
		getHeight	  : function() {return myHeight;},
		getName       : function() {return myName;},
		getAddress	  : function() {return myAddress;},
		getBackground : function() {return myBackground;},
		getCanvas	  : function() {return this.myCanvas;},
		realCoord     : function(currentScale, scaleStep, coord) {return coord / Math.pow(scaleStep, currentScale);},
		screenCoord   : function(currentScale, scaleStep, coord) {return coord * Math.pow(scaleStep, currentScale);},
		displayCoords : {},
		getBBox       : function() {if (this.visible) {this.displayCoords = this.visible.getBBox();}},
		bounce        : function() {
			var BBox;
			if (this.visible) {
				BBox = this.visible.getBBox();
				this.visible.animate({width: 80, height: 80, opacity: 0}, 0);
				this.visible.animate({width: BBox.width, height: BBox.height, opacity: 1}, 350, "bounce");
			}
		},
		visible : false,
		x : mapCoords[0],
		y : mapCoords[1]
	};
	return resultObject;
}

function mapObjectSystem(canvas, canvasRoot) {
	var myCanvas = canvas,
		resultObject = {
		getCanvas : function() {return myCanvas;},
		getRoot   : function() {return canvasRoot;},
		objects   : {},
		labels: {},
		addObject : function(groupId, objectId, object) {
			var objectGroup = {length :0};
			object.hint = 'new';
			if (!this.objects[groupId]) {
				objectGroup[objectId] = object;
				objectGroup.length = 1;
			}
			else {
				objectGroup = this.objects[groupId];
				objectGroup[objectId] = object;
				objectGroup.length++;
			}
			this.objects[groupId] = objectGroup;
			var objectLabels = {};

			if (this.labels[objectId]) {
				objectLabels = this.labels[objectId];				
			}
			objectLabels[object.getId()] = object;
			object.flag = true;
			this.labels[objectId] = objectLabels;		
		},
		delObject : function(objectId) {
			var center = mapController.searchCenterCell();
			if (this.labels[objectId]) {
				for (var i in this.labels[objectId]) {
					var groupId = this.labels[objectId][i].getContainer();
							if(this.labels[objectId][i].visible){
							this.labels[objectId][i].visible.remove();
							if (this.labels[objectId][i].hint) {
								this.labels[objectId][i].canvas.remove();
								mapPlaceDiv.removeChild(this.labels[objectId][i].hint);
								this.labels[objectId][i].hint = false;
							}

							delete this.objects[groupId][objectId];
							this.objects[groupId].length--;

							this.drawMapObjectGroup(groupId, {center: center, caller: this, pagePath: getPagePath()});
							}
				}
				delete this.labels[objectId];
			}

		},
		delLabel : function (label) {			
			var center = mapController.searchCenterCell();
			var label_id = label.object.getId();

			this.objects[label.groupId][label.objectId].visible.remove();
			this.objects[label.groupId][label.objectId].visible = false;
			if (this.objects[label.groupId][label.objectId].hint) {
				this.objects[label.groupId][label.objectId].canvas.remove();
				mapPlaceDiv.removeChild(this.objects[label.groupId][label.objectId].hint);
			}
			delete this.labels[label.objectId][label_id];

			delete this.objects[label.groupId][label.objectId];			
			this.objects[label.groupId].length--;
			if (this.objects[label.groupId].length == 0) {
				delete this.objects[label.groupId];
			} else {
				this.drawMapObjectGroup(label.groupId, {center: center, caller: this, pagePath: getPagePath()});
			}
		},
		cycleObjects : function(callBack, params) {
			for (var i in this.objects) {
				var mapObjectArray = Array();
				for (var j in this.objects[i]) {
					mapObjectArray[mapObjectArray.length] = this.objects[i][j];
				}
				callBack(mapObjectArray, params);
			}
		},
		drawMapObjectGroup : function (groupId, params) {
			var center   = params.center || false,
				caller   = params.caller || false,
				pagePath = params.pagePath || false;
			if ((center) && (caller) && (pagePath)) {
				var canvas   = caller.getCanvas(),
					j = 1,
					kol = 1,
					objectGroup = caller.objects[groupId],
					angle = 2 * Math.PI,//2 * Math.PI / objectGroup.length,
					r = 10,
					n = 0;
					for (var i in objectGroup) {
						if ((objectGroup.hasOwnProperty(i)) && (i != 'length')){
							var mapObject = objectGroup[i],
								ico       = pagePath + mapObject.getIco(),
								scale     = mapController.getScale(),
								scaleStep = mapController.getStep(),
								x = Math.round(center.x + mapObject.realCoord(scale - 1, scaleStep, mapObject.x)),
								y = Math.round(center.y + mapObject.realCoord(scale - 1, scaleStep, mapObject.y)),
								coordX = x - Math.round(mapObject.getWidth() / 2) + Math.round(Math.cos(angle*j)*r*n),
								coordY = y - Math.round(mapObject.getHeight() / 2)  + Math.round(Math.sin(angle*j)*r*n),
								newPoint = canvas.image(ico, coordX, coordY, mapObject.getWidth(), mapObject.getHeight());							
								/*if (!newPoint.animated) {
									newPoint.animate({y: coordY + 10}, 500, "bounce");
									newPoint.animated = true;
								}*/
							newPoint.node.label = mapObject;
							newPoint.node.objectId = i;
              //При наведении куказателя на метку показывает облако с инфой
							newPoint.node.onmouseover = function () {
								if (boardSystemObject.checkAvailableId(this.label.getId())) {
									createHint(this.label);
								}
							}

              //При снятии указателя с метки убирает облако с инфой
							newPoint.node.onmouseout = function () {
								if (this.label.hint) {
									this.label.canvas.remove();
									mapPlaceDiv.removeChild(this.label.hint);
									this.label.hint = false;
								}
							}
              
              //При нажатии на метку правой кнопкой мыши выводит окно метки с инфой
							newPoint.node.onmousedown = function () {
								if (boardSystemObject.checkAvailableId(this.label.getId())) {
									if (mapObject.flag) {
										var url = getPagePath() + '/scripts/create_button.php?id=' + this.label.getId() + '&object_id=' + this.objectId;
										this.label.flag = false;
										getUrlWithObject(url, create_button, {label: this.label, obj: mapPlaceDiv, x: x + 40, y: y - 100, labelId:this.label.getId(), objectId: this.objectId});

										this.label.canvas.remove();
										mapPlaceDiv.removeChild(this.label.hint);
										this.label.hint = false;
									}
								} else {
									boardSystemObject.deleteDataBoard(this.label.getId());
								}
								blockAllDrag = dummy;
							}
							newPoint.node.onmouseup = function () {blockAllDrag = false;}
							newPoint.node.style.cursor = 'pointer';

							if (mapObject.visible) {								
								mapObject.visible.remove(canvas);
							}
							mapObject.visible = newPoint;
							mapObject.getBBox();
//Скрываем облачко метки если она не новая
							if (params.hideAllHint && (mapObject.hint) && (mapObject.hint.toString() != 'new')) {
               mapObject.canvas.remove();
								mapPlaceDiv.removeChild(mapObject.hint);
								mapObject.hint = false;
              }
//if(globalObjectId == mapObject.getId()){
//  mapObject.hint = 'new';
//}
							if ((!params.newHint) && (params.hideAllHint)) {mapObject.hint = false;}
              //Если метка новая, то выводим облачко
							if (mapObject.hint) {
								createHint(mapObject);
							}


              
							j++;
							kol++;
							if (j * angle >= 2*Math.PI) {
								n = n + 2;
								var ost = objectGroup.length - kol + 1,
									ostAngle	= 2 * Math.PI / ost,
									roundAngle	= Math.acos((n*n - 2)/(n*n));
								angle = Math.max(ostAngle, roundAngle);
								j = 0;
							}
						}
					}
				
			}
		},		
		drawObjects : function(hideAllHint, newHint) {
			hideAllHint = hideAllHint || false;
			var center = mapController.searchCenterCell(),
				labels = '0';
			for (var i in this.objects) {
				this.drawMapObjectGroup(i, {center: center, caller: this, pagePath: getPagePath(), hideAllHint: hideAllHint, newHint: newHint});
			}
			for (var i in this.labels) {
				labels += ',' + i;
			}			
			window.location.href = saveInUrl('l', 'noSTR', labels, window.location.href);
		},
		translateLabel : function(objectArray, params) {
			if (objectArray) {
				for (var i = 0; i < objectArray.length; i++) {
					if (objectArray[i].visible) {
						objectArray[i].visible.translate(params.dx, params.dy);
						objectArray[i].getBBox();
						if (objectArray[i].hint) {
							objectArray[i].hint.style.left = parseInt(objectArray[i].hint.style.left) + params.dx + 'px';
							objectArray[i].hint.style.top = parseInt(objectArray[i].hint.style.top) + params.dy + 'px';
						}
					}
				}
			}
		},
		translateLabels : function(dx, dy) {
			this.cycleObjects(this.translateLabel, {dx: dx, dy: dy});
			reloadLinks();
		},
		resizeCanvas : function() {
			var root = this.getRoot();			
			this.getCanvas().remove();			
			myCanvas = new Raphael(root, root.offsetWidth, root.offsetHeight);
			for (var i in this.labels) {
				for (var j in this.labels[i]) {
					this.labels[i][j].myCanvas = myCanvas;
				}
			}
		}
	};
	return resultObject;
}


function dragMapObjects() {	
	if (goDrag) {
		if (objectSystem) {
			objectSystem.translateLabels(mousePos.x - mousePosOld.x, mousePos.y - mousePosOld.y);
		}
		for (var i in streetHint) {
			if (streetHint[i]) {
				streetHint[i].div.style.left = parseInt(streetHint[i].div.style.left, 10) + (mousePos.x - mousePosOld.x) + 'px';
				streetHint[i].div.style.top = parseInt(streetHint[i].div.style.top, 10) + (mousePos.y - mousePosOld.y) + 'px';
			}
		}
	}
}
function createLabel(xmlNode) {
	var id        = xmlNode.getAttribute("id") || false,
		objectId  = xmlNode.getAttribute("mapObjectId") || false,
		coords    = xmlNode.getAttribute("coords") || false,
		ico       = xmlNode.getAttribute("ico") || false,
		color     = xmlNode.getAttribute("color") || false,
		width     = xmlNode.getAttribute("width") || false,
		height    = xmlNode.getAttribute("height") || false,
		name      = xmlNode.getAttribute("name") || false,
		address   = xmlNode.getAttribute("address") || false,
		bgIco     = xmlNode.getAttribute("backgroundIco") || false,
		groupId   = xmlNode.getAttribute("buildId") || false;
		if ((id) && (coords) && (ico) && (groupId)) {
			return {groupId: groupId, objectId: objectId, object:mapObjectFactory(id, groupId, name, address, ico, color, width, height, bgIco, coords, objectSystem.getCanvas())}
		} else {
			return false;
		}
}
function addLabelOnMap(label) {
	if (!objectSystem.labels[label.objectId]) {
		objectSystem.addObject(label.groupId, label.objectId, label.object);
	} else {
		if (!objectSystem.labels[label.objectId][label.object.getId()]) {
			objectSystem.addObject(label.groupId, label.objectId, label.object);
		}
	}
}

function placePoint(xmlNode) {
	var label = createLabel(xmlNode),
		scale     = mapController.getScale(),
		scaleStep = mapController.getStep(),
		ratio	  = Math.pow(scaleStep, scale - 1),
		center    = mapController.searchCenterCell();
	
	if (label) {
		addLabelOnMap(label);
		var s2 = Math.pow((center.x + label.object.x/ratio), 2) + Math.pow((center.y + label.object.y/ratio), 2);
		return {groupId: label.groupId, objectId: label.objectId, s: s2, x: label.object.x, y: label.object.y, center: center};
	} else {
		return false;
	}
}

function initMapPlace(obj) {	
	addDragEvent(dragMapObjects);
	var dataCanvas = new Raphael(obj, obj.offsetWidth, obj.offsetHeight);
	mapPlaceDiv = obj;
	/*mapPlaceDiv.style.width = mapController.getOptions().getRoot().offsetWidth;
	mapPlaceDiv.style.height = mapController.getOptions().getRoot().offsetHeight;*/
	mapPlaceDiv.scroll = true;	
	addGlobalEvents(mapPlaceDiv, mapController);
	objectSystem = mapObjectSystem(dataCanvas, obj);
	attachMouseScroller(obj, mouseWheel);
	addResizeEvent(resizeCanvas);
	addAfterMapScale(showAllMapObjects);
	addAfterMapDrag(showAllMapObjects);
	getUrlOpenObject();
}

//Создаёт облоко с инфой
function createHint(label) {
	var name = label.getName(),
		adr = label.getAddress();		
	if ((label.hint) && (label.hint.toString() != 'new')) {
		label.canvas.remove();
		mapPlaceDiv.removeChild(label.hint);
	}
	var position   = label.displayCoords;
	var textLength = Math.max(name.length * 8, adr.length * 6);
	label.hint = document.createElement('div');
	label.hint.className = "popupHelp";
	label.hint.style.left = parseInt(position.x) + parseInt(position.width) + 'px';
	label.hint.style.top = position.y - 65 + 'px';
	label.hint.style.width = textLength + 70 + 'px';
	label.hint.style.height = 65 + 'px';
	mapPlaceDiv.appendChild(label.hint);
	label.canvas = new Raphael(label.hint, label.hint.offsetWidth, label.hint.offsetHeight);	
	var svgSting   = "M 0,65 l 08,-25 000,-10 c 0,-30 10,-30 30,-30 l " + textLength + ",0 c 30,0 30,10 30,30 l 0,0 c 0,30 -10,30 -30,30 l -"+parseInt(textLength + 20)+",0 z";
	var hint = label.canvas.path(svgSting).attr({fill:'#FFF', 'stroke-width':'1', 'stroke':'#cccccc'});	
	var hintParams = hint.getBBox();
	var hintText   = label.canvas.text(hintParams.x + (hintParams.width / 2),hintParams.y + (hintParams.height / 2) - 3, name + "\n" + adr).attr({"font-size":"15", "fill":"#727272"});
}

function delStreetHint(id) {
	if (streetHint[id]) {
		streetHint[id].canvas.remove();
		mapPlaceDiv.removeChild(streetHint[id].div);
		streetHint[id] = false;
	}
}
function createAllStreetHint() {	
	for (var i in streetHint) {
		if (streetHint[i]) {
			createStreetHint(i, streetHint[i].name, streetHint[i].position)
		}
	}
}

function createStreetHint(id, name, position) {	
	delStreetHint(id);	
	streetHint[id] = {name: name, position: position, canvas: null, div: null};	
	var textLength = name.length * 8,
	    center = mapController.searchCenterCell(),
		raito = Math.pow(mapController.getOptions().scaleStep, mapController.getOptions().currentScale - 1),
	    x = center.x + position.x / raito,
	    y = center.y + position.y / raito;
	
	streetHint[id].div = document.createElement('div');
	streetHint[id].div.className = "popupHelp";
	streetHint[id].div.style.left = x + 'px';
	streetHint[id].div.style.top = y - 65 + 'px';
	streetHint[id].div.style.width = textLength + 70 + 'px';
	streetHint[id].div.style.height = 65 + 'px';
	mapPlaceDiv.appendChild(streetHint[id].div);
	streetHint[id].canvas = new Raphael(streetHint[id].div, streetHint[id].div.offsetWidth, streetHint[id].div.offsetHeight);
	var svgSting   = "M 0,65 l 08,-25 000,-10 c 0,-30 10,-30 30,-30 l " + textLength + ",0 c 30,0 30,10 30,30 l 0,0 c 0,30 -10,30 -30,30 l -"+parseInt(textLength + 20)+",0 z";
	var hint = streetHint[id].canvas.path(svgSting).attr({fill:'#FFF', 'stroke-width':'1', 'stroke':'#cccccc'});
	var hintParams = hint.getBBox();
	var hintText   = streetHint[id].canvas.text(hintParams.x + (hintParams.width / 2), hintParams.y + (hintParams.height / 2) - 3, name).attr({"font-size":"15", "fill":"#727272"});
}

function showAllMapObjects(hideAllHint, newHint) {
	if (objectSystem) {
		objectSystem.drawObjects(hideAllHint, newHint);
		reloadLinks();
	}
	createAllStreetHint();
}

function resizeCanvas() {
	if (objectSystem) {
		objectSystem.resizeCanvas();
	}
	showAllMapObjects();
}

function hideObjectLabels(objectId) {
	if (objectSystem) {		
		if (objectSystem.labels[objectId]) {
			if (boardSystemObject) {
				for (var i in objectSystem.labels[objectId]) {
					boardSystemObject.deleteDataBoard(i);
				}
			}
			objectSystem.delObject(objectId);
		}
	}	
}

function hideLabel(label) {
	if (objectSystem) {
		if (objectSystem.labels[label.objectId]) {			
			if (boardSystemObject) {				
				boardSystemObject.deleteDataBoard(label.object.getId());
			}			
		}
		objectSystem.delLabel(label);
	}
}

function dummy() {return false;}

//Переводит к метке на карте
function goToLabel(object_id, id) {
	var label = objectSystem.labels[object_id][id];
	mapController.teleportMapXY(label.x, label.y);
	showAllMapObjects(true);
}

function clearLabelUrl() {
	var labels = '0';
	if (objectSystem) {
		for (var i in objectSystem.labels) {
		   labels += ','+i;
		}
	}
	window.location.href = saveInUrl('l', 'end', labels, window.location.href);
}// ---- /work/units/mapPlace/mapPlace.js ---- 
// ==== /work/units/mapPlace/dataBoards.js ==== 
function raphaelObjectSet(system) {
	this.objects = Array();
	this.push = function(object) {
		this.objects[this.objects.length] = object;
	}
	this.toFront = function() {
		for (var i = 0; i < this.objects.length; i++) {
			this.objects[i].toFront();
		}
	}
	this.translate = function(x, y) {
		for (var i = 0; i < this.objects.length; i++) {
			this.objects[i].translate(x, y);
		}
	}
}

function recordFactory() {
	
}

function boardFactory(obj, x, y, id, innerHtml, zIndex, system, linkedObject, buttons) {
	var resultObject = {
			buttons : buttons,
			getRoot : function() {return obj;},
			getId   : function() {return id;},
			getHtml : function() {return innerHtml;},
			getButtons : function() {return this.buttons;},
			canvas    : null,
			getCanvas : function() {return this.canvas;},
			getSystem : function() {return system;},
			getLink   : function() {return linkedObject;},
			x : x,
			y : y,
			boardCanvas : false,
			helperRoot  : false,
			getHelperRoot : function() {if (this.helperRoot) {return this.helperRoot;}return false;},
			closeCollection : false,
			drawMe : function(zIndex) {
				var div           = document.createElement('DIV'),
					contentDiv    = document.createElement('DIV'),
					padding       = 5,
					buttonOffset  = 15,
					doublePadding = padding * 2,
					cornerSmooth  = 19;
				this.helperRoot = div;
				contentDiv.className = "mainContent";
				div.system = this;
				div.className = "helperDiv";
				div.style.left = x + 'px';
				div.style.top  = y + 'px';
				contentDiv.innerHTML = this.getHtml();
				contentDiv.style.zIndex = zIndex;
				contentDiv.onmousedown = function () {blockAllDrag = dummy;}
				contentDiv.onmouseup = function () {blockAllDrag = false;}
				div.appendChild(contentDiv);
				obj.appendChild(div);
				var size = getSize(div),
					canvasDiv = document.createElement('DIV');
					contentDiv.style.width = (size.width - 50)+'px';
				var	buttons = this.getButtons();
				canvasDiv.className = 'canvas';
				canvasDiv.style.height = contentDiv.offsetHeight + 65 + 'px';
				canvasDiv.style.width = contentDiv.offsetWidth + 65 + (20 * buttons.length) + 'px';
				canvasDiv.style.zIndex = zIndex - 1;
				
				div.appendChild(canvasDiv);
				this.canvas = new Raphael(canvasDiv, canvasDiv.offsetWidth, canvasDiv.offsetHeight);				
				div.style.width = size.width + buttonOffset * (buttons.length - 1) + 2 * doublePadding + 'px';
				for (var i = 0; i < buttons.length; i++) {
					this.buttonStack[i + 1] = this.createButton(padding, size, cornerSmooth, buttons[i], buttonOffset, i);
				}
				this.getCanvas().rect(doublePadding, doublePadding, size.width + buttonOffset * (buttons.length - 1) + padding, size.height - doublePadding, cornerSmooth).attr({fill:'#000', 'stroke-width':'0', 'opacity':0.1}).toBack();
				
				var board   = this.getCanvas().rect(padding, padding,size.width - doublePadding, size.height - doublePadding, cornerSmooth).attr({fill:'#FFF', 'stroke-width':'1', "stroke":"#cccccc"});
				this.closeCollection = this.createCloseButton(size.width - cornerSmooth - 2, cornerSmooth + 2, this.getCanvas());
				div.childNodes[0].style.zIndex = zIndex;
				this.changeZIndex(zIndex);
				
				board.node.style.cursor = "move";
				board.content = contentDiv;
				this.buttonStack[0] = board;
				var callback    = this.toFront,
					system      = this.getSystem(),
					object      = this,
					buttons     = this.buttonStack,
					closeButton = this.closeCollection;
				board.node.onclick     = function() {
						callback(div.childNodes[0], canvasDiv, system, object);
						for (var i = buttons.length - 1; i >= 0; i--) {
							buttons[i].toFront();
							if (buttons[i].previousState) {
								buttons[i].attr(buttons[i].previousState);
							}
							if (buttons[i].value) {
								buttons[i].value.toFront();
							}
							if (buttons[i].content) {
								buttons[i].content.style.display = 'none';
								buttons[i].node.style.cursor = 'pointer';

							}
						}
						board.node.style.cursor = "move";
						board.toFront();
						if (closeButton) {
							closeButton.toFront();
							if (closeButton.offset) {
								closeButton.translate(-closeButton.offset, 0);
								closeButton.offset = 0;
							}
						}
						board.content.style.display = 'block';
					};
				board.node.onmousedown = function() {blockAllDrag = function() {dragDataBoards(div);};};
				board.dataHelper = div;				
				this.drawLink(div);
			},
			createButton      : function(padding, size, cornerSmooth, buttonParams, buttonOffset, ratio) {
				var canvas    = this.getCanvas(),
					offset    = buttonOffset * (ratio + 1),
					newButton = canvas.rect(padding + offset, padding, size.width - (padding * 2), size.height - (padding * 2), cornerSmooth).attr({fill:buttonParams.color, 'stroke-width':'0'}),
					value     = canvas.text(size.width + offset - buttonOffset + 2, size.height / 2, buttonParams.value).attr({'font-size': 11, 'fill':'#FFFFFF'}).rotate(-90),
					buttons   = this.buttonStack,
					callerSystem    = this;
				newButton.toBack();
				newButton.content = document.createElement("DIV");
				newButton.content.className = "content";
				newButton.content.style.display = 'none';
				newButton.node.style.cursor = 'pointer';
				newButton.content.onmousedown = function () {blockAllDrag = dummy};
				this.helperRoot.appendChild(newButton.content);
				newButton.previousState = {fill : buttonParams.color, 'stroke-width' : '0'};
				newButton.value = value;
				newButton.value.node.style.cursor = 'pointer';
				newButton.node.onmousedown = function() {blockAllDrag = function() {dragDataBoards(callerSystem.getHelperRoot());};};
				newButton.value.node.onmousedown = newButton.node.onmousedown;
				newButton.node.onclick = function() {					
					getUrlWithObject('scripts/create_button_content.htm?id='+buttonParams.id+'&object_id='+buttonParams.objectId, create_button_content, newButton.content);
					newButton.content.style.height = (size.height - 60)+'px';
					newButton.content.style.width = (size.width - 50)+'px';
					for (var i = 0; i < buttons.length; i++) {
						buttons[i].toFront();
						if (buttons[i].previousState) {
							buttons[i].attr(buttons[i].previousState);
						}
						if (buttons[i].content) {
							buttons[i].content.style.display = 'none';
							buttons[i].node.style.cursor = 'pointer';
							canvas.text(15, size.height / 2, 'О компаннии').attr({'font-size': 11, 'fill':'#000'}).rotate(-90);
						}
					}
					newButton.node.style.cursor = 'move';
					newButton.attr({fill:'#FFF', 'stroke-width' : '1', "stroke" : "#cccccc"}).toFront();
					if (callerSystem.closeCollection) {
						callerSystem.closeCollection.toFront();
						var lastOffset = callerSystem.closeCollection.offset || false;
						if ((!lastOffset) && !(lastOffset === 0)) {
							callerSystem.closeCollection.translate(offset, 0);
							callerSystem.closeCollection.offset = offset;
						} else {
							var newOffset = offset - callerSystem.closeCollection.offset;
							callerSystem.closeCollection.translate(newOffset, 0);
							callerSystem.closeCollection.offset = offset;
						}
					}
					newButton.content.style.display = "block"
				};
				newButton.value.node.onclick = newButton.node.onclick;
				return newButton;
			},
			buttonStack : Array(),
			createCloseButton : function(x, y, canvas) {
				var circle = canvas.circle(x, y, 10).attr({fill:'#FFF', 'stroke-width':'2', 'stroke':'#ccc'});
				circle.lineLeft  = canvas.path(["M", (x - 4), ",", (y - 4), " l 8,8  z", " M", (x - 4), ",", (y + 4), " l 8,-8 z"].join("")).attr({'stroke-width':'2', 'stroke':'#CCC'});
				var hiddenCircle = canvas.circle(x, y, 10).attr({fill:'#FFF', 'stroke-width':'2', 'stroke':'#ccc', 'opacity':0});
				hiddenCircle.node.style.cursor = "pointer";
				hiddenCircle.node.onmouseover  = function() {circle.animate({'fill':'#ccc'},300);circle.lineLeft.animate({'stroke':'#575757'},300);};
				hiddenCircle.node.onmouseout   = function() {circle.animate({'fill':'#FFF'},300);circle.lineLeft.animate({'stroke':'#CCC'},300);};
				var caller = this;
				hiddenCircle.node.onclick = function() {caller.deleteMe();};
				var collection = new raphaelObjectSet();
					collection.push(circle);
					collection.push(circle.lineLeft);
					collection.push(hiddenCircle);
				return collection;
			},
			toFront : function(helper, content, system, object) {
				var zIndex = system.getMaxHighestZIndex();
				helper.style.zIndex  = zIndex;
				content.style.zIndex = zIndex - 1;
				object.changeZIndex(zIndex);
			},
			drawLink : function(object) {
				if (object) {
					var linkedObject = this.getLink(),
						size     = getSize(object),
						position = getPosition(object),
						params   = linkedObject.displayCoords,
						color	 = linkedObject.getColor(),
						path     = ["M", params.x + (params.width / 2)," ", params.y + (params.width / 2),"L",position.x + (size.width / 2)," ", position.y + (size.height / 2)].join(""),
						visualLink = linkedObject.getCanvas().path(path).attr({'stroke-width':'4', 'stroke':color, 'stroke-dasharray':'.'}).toBack();
					this.visualLink = visualLink;
				}
			},
			redrawLink : function() {
				if (this.visualLink) {
					this.visualLink.remove();
					this.visualLink = false;
					this.drawLink(this.getHelperRoot());
				}
			},
			visualLink : false,
			zIndex     : false,
			getZIndex  : function() {return this.zIndex;},
			changeZIndex : function(zIndex) {this.zIndex = zIndex;},
			deleteMe : function() {
				var myRoot     = this.getRoot(),
					helperRoot = this.getHelperRoot(),
					objectLink = this.visualLink;
				if ((myRoot) && (helperRoot) && (objectLink)) {
					myRoot.removeChild(helperRoot);
					objectLink.remove();
					this.deleted = true;
					this.getSystem().deleteFromObject(this.getId());
				}
			},
			deleted : false
		};
		resultObject.drawMe(zIndex);
		return resultObject;
}

function boardSystem() {
	var resultObject = {
			dataBoards : {},
			checkAvailableId : function(id) {
				if (!this.dataBoards[id]) {return true;}
				else {
					if (this.dataBoards[id].deleted) {delete this.dataBoards[id];return true;}
					return false;
				}
			},
			addDataBoard : function(id, board) {
					if (!this.dataBoards[id]) {this.dataBoards[id] = board;} else {return false;}
				},
			getMaxHighestZIndex : function() {
				var maxZIndex = 1;
				for (var i in this.dataBoards) {
					if (this.dataBoards[i].getZIndex()) {
						if (maxZIndex < this.dataBoards[i].getZIndex()) {maxZIndex = this.dataBoards[i].getZIndex();}
					}
				}
				return maxZIndex + 2;
			},
			deleteFromObject : function(id) {
				if (this.dataBoards[id]) {
					delete this.dataBoards[id];
				}
			},
			deleteDataBoard : function (id) {
				if (this.dataBoards[id]) {
					this.dataBoards[id].deleteMe();
					delete this.dataBoards[id];
				}
			},
			redrawLinks : function() {
				for (var i in this.dataBoards) {
					if (this.dataBoards[i].visualLink) {
						this.dataBoards[i].redrawLink();
					}
				}
			}
		};
	return resultObject;
}

function drawDataBoard(a, b, reply, params) {
	var buttons = Array();
	if (boardSystemObject) {
		var html   = reply,
			coords = params.label.visible.getBBox();
		if (boardSystemObject.checkAvailableId(params.label.getId())) {
			var board = boardFactory(params.obj, params.x, params.y , params.label.getId(), html, boardSystemObject.getMaxHighestZIndex(), boardSystemObject, params.label, params.buttons);
			boardSystemObject.addDataBoard(params.label.getId(), board);
		}
		else {
			boardSystemObject.deleteDataBoard(params.label.getId());
		}
		params.label.flag = true;
	}
}

function dragDataBoards(div) {
	div.style.left = parseInt(div.style.left) + (mousePos.x - mousePosOld.x) + 'px';
	div.style.top  = parseInt(div.style.top ) + (mousePos.y - mousePosOld.y) + 'px';
	if (div.system) {
		div.system.redrawLink();
	}
}

function reloadLinks() {
	if (boardSystemObject) {
		boardSystemObject.redrawLinks();
	}
}

var boardSystemObject = boardSystem();

function create_button(a, b, reply, params){
	var array = Array();
	var xmlDoc = XML.parse(reply), root = xmlDoc.documentElement || false;
	for(var i = 0; i < root.childNodes.length; i++){
		if (root.childNodes[i].nodeType == 1) {
			array[array.length] = {value: root.childNodes[i].getAttribute('value'), color: root.childNodes[i].getAttribute('color'), id: root.childNodes[i].getAttribute('id'), objectId: params.objectId};
		}
	}
	params.buttons = array;
	var url = getPagePath() + '/scripts/dataHelper.html?id=' + params.labelId + '&object_id=' + params.objectId;
	getUrlWithObject(url, drawDataBoard, params);
	
}

function create_button_content(a, b, reply,content){

	content.innerHTML = reply;
}// ---- /work/units/mapPlace/dataBoards.js ---- 
// ==== /work/units/mapPlace/mapData.js ==== 
var
	dataDivArray = Array(),
	mapPlaceDiv;

function getMapPlace(obj) {
	mapPlaceDiv = obj;
	mapPlaceDiv.onmouseup   = function() {blockAllDrag = null;};
}

function createDataElement(x, y, obj, helper) {
	var
		div     = document.createElement('DIV'),
		data    = document.createElement('DIV'),
		header  = document.createElement('SPAN'),
		content = document.createElement('SPAN');
		
	div.style.left = x + 'px';
	div.style.top  = y + 'px';
	div.style.zIndex = 1;
	div.helper     = helper;
	header.innerHTML  = obj.name;
	header.className = 'header';
	content.innerHTML = obj.HTMLcontent;
	
	div.onclick     = function() {var index = getHighestZIndex('DIV'); this.style.zIndex = parseInt(index) + 1;}
	div.onmousedown = function() {dragHelper = this.helper; blockAllDrag = dragHelperOnCanvas;};
	div.onmouseup   = function() {blockAllDrag = null;};
	
	createDivBackground(div, helper);
	data.appendChild(header);
	data.appendChild(content);
	div.appendChild(data);
	mapPlaceDiv.appendChild(div);
	
	div.setAttribute('datadivid', obj.id);
	dataDivArray[dataDivArray.length] = div;
}

function createDivBackground(obj, canvasHelper) {
	obj.canvas = new Raphael(obj, '100%', '100%');
	var helper = obj.canvas.rect(0,0,290,290,20).attr({fill:'#FFF', 'stroke-width':'1', "stroke":"#cccccc"}).toFront();
	createCloseButton(270, 19, canvasHelper, obj);
}


function hideDataElement(id) {
	var
		div,
		i = 0,
		f = false;

	while ((!f) && (i < dataDivArray.length)) {		
		if (dataDivArray[i].getAttribute('datadivid') == id) {
			div = dataDivArray[i];
			f = true
		} else {
			i++;
		}
	}

	dataDivArray.splice(i, 1);
	mapPlaceDiv.removeChild(div);

}

function createCloseButton(x, y, helper, obj) {
	helper.closeButton = obj.canvas.set();
	var circle = obj.canvas.circle(x, y, 10).attr({fill:'#FFF', 'stroke-width':'2', 'stroke':'#ccc'});
	circle.lineLeft  = obj.canvas.path("M" + (x - 4) + "," + (y - 4) +" l 8,8 z" ).attr({'stroke-width':'2', 'stroke':'#CCC'});
	circle.lineRight = obj.canvas.path("M" + (x - 4) + "," + (y + 4) +" l 8,-8 z").attr({'stroke-width':'2', 'stroke':'#CCC'});
	var hiddenCircle = obj.canvas.circle(x, y, 10).attr({fill:'#FFF', 'stroke-width':'2', 'stroke':'#ccc', 'opacity':0});
	hiddenCircle.node.style.cursor = "pointer";
	hiddenCircle.node.onmouseover = function() {circle.animate({'fill':'#ccc'},300); circle.lineLeft.animate({'stroke':'#575757'},300); circle.lineRight.animate({'stroke':'#575757'},300)};
	hiddenCircle.node.onmouseout  = function() {circle.animate({'fill':'#FFF'},300); circle.lineLeft.animate({'stroke':'#CCC'},300); circle.lineRight.animate({'stroke':'#CCC'},300)};
	hiddenCircle.node.onclick     = function() {hideDataElement(helper.image.id); var element = removeHelperById(helper.image.id); element.line.remove(); element.remove();};
	helper.closeButton.push(circle);
	helper.closeButton.push(circle.lineLeft );
	helper.closeButton.push(circle.lineRight);
	helper.closeButton.push(hiddenCircle);
}

function dragDataElement(dx, dy, id) {
	var
		div,
		i = 0,
		f = false;

	while ((!f) && (i < dataDivArray.length)) {
		if (dataDivArray[i].getAttribute('datadivid') == id) {
			div = dataDivArray[i];
			f = true;
		} else {
			i++;
		}
	}

	div.style.left = parseInt(div.style.left) + dx + 'px';
	div.style.top = parseInt(div.style.top) + dy + 'px';
}

function none(){}

function loadUnitInf(id, button, unit) {	
	var url = getPagePath() + '/scripts/' + unit + '.htm?id=' + id,
		div = findChildFromClass(button.parentNode.parentNode.parentNode.parentNode, 'infModul'),
		oldSelect = findChildFromClass(button.parentNode, 'select');
	delClass(oldSelect, 'select');
	addClass(button, 'select');

	getUrlWithObject(url, insertInf, {div: div, unit: unit})
}

function insertInf(a, b, reply, params) {
	params.div.innerHTML = reply;
	if (window['init' + params.unit]) {
		window['init' + params.unit]();
	}
}// ---- /work/units/mapPlace/mapData.js ---- 
// ==== /work/units/mapNav/mapNav.js ==== 
var
	scaleScroll,
	mapNavDiv;

function setNavPosition() {	
	mapNavDiv.style.left = mapController.getOptions().rootSize.width - 40 + 'px';	
}

function initMapNav(obj) {	
	mapNavDiv = obj;	
	setNavPosition();
	addResizeEvent(setNavPosition);
}

function mapNavMinus(obj){
	obj.onclick = function () {
		mouseWheelStack.activate(-1, {x: mapController.getOptions().rootSize.width /2, y: mapController.getOptions().rootSize.height /2}, mapPlaceDiv);
	}
}

function mapNavPlus(obj){
	obj.onclick = function () {
		mouseWheelStack.activate(+1, {x: mapController.getOptions().rootSize.width /2, y: mapController.getOptions().rootSize.height /2}, mapPlaceDiv);
	}
}
function moveScroll () {	
	var mapOptions = mapController.getOptions();
	scaleScroll.style.top = Math.floor((scaleScroll.parentNode.offsetHeight-13) * (mapOptions.currentScale - mapOptions.zoomInLimit)/ (mapOptions.zoomOutLimit - mapOptions.zoomInLimit)) + 'px';
}

function dragScroll () {
	var bar = scaleScroll.parentNode,
		mapOptions = mapController.getOptions();	
	scaleScroll.style.top = mousePos.y - parseInt(bar.parentNode.offsetTop, 10) - bar.offsetTop - scaleScroll.offsetHeight / 2  + 'px';
	if (parseInt(scaleScroll.style.top, 10) < 0) {	scaleScroll.style.top = 0 + 'px';}
	if (parseInt(scaleScroll.style.top, 10) > (bar.offsetHeight - scaleScroll.offsetHeight - 2)) {
		scaleScroll.style.top =  bar.offsetHeight - scaleScroll.offsetHeight - 2 + 'px';
	}
	scaleScroll.newScale = mapOptions.zoomInLimit + (parseInt(scaleScroll.offsetTop,10)) * (mapOptions.zoomOutLimit - mapOptions.zoomInLimit) / (bar.offsetHeight - 13);	
	mapController.tables[mapOptions.currentScale].scaleTable(mapOptions.scaleStep, scaleScroll.newScale, {x: mapController.getOptions().rootSize.width /2, y: mapController.getOptions().rootSize.height /2})
}
function setNewScale () {	
	if ((scaleScroll.newScale !== false) && (mapController.getOptions().currentScale != Math.ceil(scaleScroll.newScale))) {
		mapController.getOptions().currentScale = Math.ceil(scaleScroll.newScale);
		mapController.redrawMap();
		scaleScroll.newScale = false;
	}
}

function mapNavScroll(obj) {
	scaleScroll = obj;
	scaleScroll.newScale = false;
	moveScroll();
	addAfterMapScale(moveScroll);
	addMouseUpEvent(setNewScale);
	obj.onmousedown = function () {
		blockAllDrag = dragScroll;
	};
	obj.onmouseup = function () {		
		blockAllDrag = false;
	}
}	

function mapNavBar(obj) {	
	obj.onmousedown = function () {
		blockAllDrag = dragScroll;
	}
	obj.onmouseup = function () {
		blockAllDrag = false;
	}
}

function noDrag(obj) {
	obj.onmousedown = function () {
		blockAllDrag = dummy;
	}
	obj.onmouseup = function () {
		blockAllDrag = false;
	}
}

function showITContact () {	
	var pagePath = getPagePath(),
	    url = [pagePath, '/scripts/object_labels.php?object_id=4139'].join("");
		getUrlWithObject(url, showIt, {tree: null});
	return false;
}

function showIt (a, b, reply, params) {
	showMapObjects(a, b, reply, params);
	var url = getPagePath() + '/scripts/dataHelper.htm?id=2598',
	    label = objectSystem.labels[4139][2598];
	getUrlWithObject(url, drawDataBoard, {label: label, obj: mapPlaceDiv, x: mapController.getOptions().rootSize.width/2 - 150, y: 50});

	//selectedGroup.appendChild();
}

function showRegCatalogForm () {
	window.onkeypress = closeRegCatalogFormEsc;
  globalLocationHelp.hide();
	globalCatalogRegHelp.show();

	regCatalogForm.reset();
	regCatalogForm.style.display = 'block';
	regCatalogInfo.style.display = 'none';
	return false;
}



function showRegNedvForm () {
  globalLocationHelp.hide();
	globalNedvRegHelp.show();
	regNedvForm.reset();
	regNedvForm.style.display = 'block';
	regNedvInfo.style.display = 'none';
	selectHtmlEstAdd();
	return false;
}// ---- /work/units/mapNav/mapNav.js ---- 
// ==== /work/units/admin_navigator/navigator.js ==== 
var AdminNavigator = null;

function initAdminNavigator (adminNavigator) {
	AdminNavigator = adminNavigator;
}

function adminNavigatorSelectedMode () {
	if (AdminNavigator) {return AdminNavigator.selectItem.getAttribute('mode');} else {return false;}
}
// ---- /work/units/admin_navigator/navigator.js ---- 
// ==== /work/units/patternAdmin/patternAdmin.js ==== 
var
globalPatternHelp,
pattern = {},
bodyColor = {},
borderColor = {};

function insertInHelp(a, b, replay) {
	globalPatternHelp.innerHTML = replay;
}

function deactiveDiv() {
	streetDiv.style.visibility ='hidden';
	raphaelDiv.style.visibility ='hidden';
}


function initPaintTableButton (obj){	
	obj.onclick = function () {		
		switch (globalPatternHelp.mode) {
			case 'hide':
				globalPatternHelp.show();
				globalPatternHelp.mode = 'tableAdmin';
				break;
			case 'tableAdmin':
				globalPatternHelp.hide();
				globalPatternHelp.mode = 'hide';
				break;
			default:
				globalPatternHelp.mode = 'tableAdmin';
				break;
		}
		if (globalPatternHelp.mode != 'hide') {
			globalPatternHelp.style.width = '950px';
			getUrl(getPagePath() + '/scripts/patternTable.htm', insertInHelp);
		}
	}
}

function initImportanceAdminButton (obj){	
	obj.onclick = function () {
		switch (globalPatternHelp.mode) {
			case 'hide':
				globalPatternHelp.show();
				globalPatternHelp.mode = 'importanceAdmin';
				break;
			case 'importanceAdmin':
				globalPatternHelp.hide();
				globalPatternHelp.mode = 'hide';
				break;
			default:
				globalPatternHelp.mode = 'importanceAdmin';
				break;
		}
		if (globalPatternHelp.mode != 'hide') {
			getUrl(getPagePath() + '/scripts/importanceAdmin.htm', insertInHelp)
			globalPatternHelp.style.width = '600px';
		}
	}
}

function initColorAdminButton (obj){
	obj.onclick = function () {
		switch (globalPatternHelp.mode) {
			case 'hide':
				globalPatternHelp.show();
				globalPatternHelp.mode = 'colorAdmin';
				break;
			case 'colorAdmin':
				globalPatternHelp.hide();
				globalPatternHelp.mode = 'hide';
				break;
			default:
				globalPatternHelp.mode = 'colorAdmin';
				break;
		}
		if (globalPatternHelp.mode != 'hide') {
			globalPatternHelp.style.width = '770px';
			getUrl(getPagePath() + '/scripts/colorAdmin.htm', insertInHelp);
		}
	}
}

function initPatternAdminButton (obj){
	obj.onclick = function () {
		switch (globalPatternHelp.mode) {
			case 'hide':
				globalPatternHelp.show();
				globalPatternHelp.mode = 'patternAdmin';
				break;
			case 'patternAdmin':
				globalPatternHelp.hide();
				globalPatternHelp.mode = 'hide';
				break;
			default:
				globalPatternHelp.mode = 'patternAdmin';
				break;
		}
		if (globalPatternHelp.mode != 'hide') {
			globalPatternHelp.style.width = '900px';
			getUrl(getPagePath() + '/scripts/patternAdmin.htm', insertInHelp);
		}
	}
}

function initOtrisovka (obj){
	obj.onclick = function () {
		switch (globalPatternHelp.mode) {
			case 'hide':
				globalPatternHelp.show();
				globalPatternHelp.mode = 'Otrisovka';
				break;
			case 'Otrisovka':
				globalPatternHelp.hide();
				globalPatternHelp.mode = 'hide';
				break;
			default:
				globalPatternHelp.mode = 'Otrisovka';
				break;
		}
		if (globalPatternHelp.mode != 'hide') {
			getUrl(getPagePath() + '/scripts/otrisovka.htm', insertInHelp)
			globalPatternHelp.style.width = '600px';
		}
	}
}

function initPatternHelp(obj) {
	globalPatternHelp = obj;
	globalPatternHelp.mode = 'hide';	
}

function initPatternTable(obj) {
	var	trs = obj.getElementsByTagName('TR');
	for (var i = 0; i < trs.length; i++) {
		var	tds = trs[i].getElementsByTagName('TD');
		for (var j = 0; j < tds.length; j++) {
			var	input = tds[i].getElementsByTagName('INPUT');
			if (input[0]) { pattern[i] = {}; pattern[i][j] = input[0];}
			if (input[1]) { bodyColor[i] = {}; bodyColor[i][j] = input[1];}
			if (input[2]) { borderColor[i] = {}; borderColor[i][j] = input[2];}
		}
	}
}


function refreshHelp (a, b, replay) {	
	if (replay) {
		switch (globalPatternHelp.mode) {
			case 'patternAdmin':
				getUrl(getPagePath() + '/scripts/patternAdmin.htm', insertInHelp);
				break;
			case 'importanceAdmin':
				getUrl(getPagePath() + '/scripts/importanceAdmin.htm', insertInHelp)
				break;
			case 'colorAdmin':
				getUrl(getPagePath() + '/scripts/colorAdmin.htm', insertInHelp)
				break;
			default:
				break;
		}
	}
}
function addOptions (url, fields, parEl) {
	for (var j = 0; j < fields.length; j++) {
		if ((fields[j].parentNode == parEl) || (fields[j].parentNode.parentNode == parEl)) {
			if (hasAttribute(fields[j], 'scale')) {url += 'scale=' + fields[j].getAttribute('scale') + '&'}
			url = [url, fields[j].name, '=', fields[j].value, '&'].join('');
		}
	}
	return url;
}

function editPatternElement (script, parent, parnetTag) {
	parnetTag = parnetTag || 'tr';
	var	
		tr = parent.getElementsByTagName(parnetTag),
		url = [getPagePath(), '/scripts/', script, '?'].join('');	
	for (var i = 0; i < tr.length; i++) {		
		if ((tr[i].nodeType == 1) && (hasAttribute(tr[i], 'el_id'))) {
			var	input = tr[i].getElementsByTagName('input');
			var	textarea = tr[i].getElementsByTagName('textarea');
			var	select = tr[i].getElementsByTagName('select');
			url = addOptions (url, input, tr[i]);
			url = addOptions (url, textarea, tr[i]);
			url = addOptions (url, select, tr[i]);
			url += 'old_id=' + tr[i].getAttribute('el_id');
			getUrl(url, function () {});
			url = [getPagePath(), '/scripts/', script, '?'].join('');
		}
	}
	refreshHelp('', '', 1);
}

function enableBorderColor(obj) {
	var impBorderColor = findChildFromClass(obj.parentNode.parentNode, 'borderColor').childNodes[0];
	if (obj.checked) {obj.value = 1} else {obj.value = 0}
	impBorderColor.disabled = !obj.checked
}

function loadPatternOptions (a, b, repaly, obj) {
	var optionDiv = findChildFromClass(obj.parentNode, 'patternOption');
	optionDiv.innerHTML = repaly;
}

function changePatternOptions (obj) {
	var
		id = obj.parentNode.parentNode.getAttribute('el_id'),
		url = [getPagePath(), '/scripts/patternOptions.htm?type_id=', obj.value, '&id=', id].join('');
	getUrlWithObject(url, loadPatternOptions, obj)
}

function paintMap() {
	var url = getPagePath() + '/scripts/paintMap.php';
	getUrl(url, function () {});
}

function paintSquare(w, h) {	
	var center = mapController.searchCenterCell(),
		mapOptions = mapController.getOptions(),
		ratio = Math.pow(mapOptions.scaleStep, mapOptions.currentScale - 1),
		map_x1 = Math.floor(-center.x * ratio),
		map_y1 = Math.floor(-center.y * ratio),
		map_x2 = Math.ceil(-center.x * ratio + w * ratio),
		map_y2 = Math.ceil(-center.y * ratio + h * ratio),
		scale = mapOptions.currentScale,
		url = [getPagePath(), '/scripts/paintSquare.php?map_x1=',
		       map_x1, '&map_y1=', map_y1, '&map_x2=', map_x2, '&map_y2=', map_y2, '&scale=', (scale-1), '&max_scale=', scale].join('');	
	getUrl(url, function () {});
}// ---- /work/units/patternAdmin/patternAdmin.js ---- 
// ==== /work/units/streetAdmin/streetAdmin.js ==== 
var 
	streetCanvas,
	streets,
	pagePath = getPagePath,
	createdPoints  = new Array(),
	createdStreets,
	blockCreator = true,
	streetEdit   = true,
	currentPoint,
	streetDiv,
	mapMoved = false;

//активация редактора улиц при переключение на него
function activeStreetDiv() {
		streetDiv.style.visibility ='visible';
		raphaelDiv.style.visibility='visible';
		reloadStreets();
		hideHelper();
		hideAllWaferHelper = true;
}

//Инициализация редактора улиц
function initStreetAdmin(obj) {	
	addDragEvent(dragStreets);
	streetCanvas = new Raphael(obj, '100%', '100%');
	streetDiv = obj;
	streetDiv.scroll = true;
	attachMouseScroller(obj, mouseWheel);
	obj.onclick    = createNewStreet;
	window.onkeyup = function(event) {event = event || window.event; keyboardEvents(event)};	
	addResizeEvent(reloadStreets);
	addAfterMapScale(reloadStreets);
	streetDiv.style.visibility ='hidden';
	addGlobalEvents(streetDiv, mapController);
}

function reloadStreets() {
	var mode = adminNavigatorSelectedMode();
	newCells = false;
	if ((mode == 'street') || (mode == 'segment') || (mode == 'point') || (mode == 'building')) {
		if (streets) {
			streetCanvas.remove();
			streetCanvas = new Raphael(streetDiv, '100%', '100%');
			streets = null;
		}
		showFromBase(streetDiv);
	}
}

function showFromBase(obj) {
	if (obj) {
		var mode = adminNavigatorSelectedMode(),
			objects = 'streetSegments streetPoints';
		if (!mode) {objects = 'streetSegments streetPoints';} else {
			if (mode == 'building') {objects = 'streetBuildings';}
		}
		if (obj.style.visibility != 'hidden') {
			var center = mapController.searchCenterCell(),
				size = getSize(obj);
				url = ['canvasCenterX=', center.x, '&canvasCenterY=', center.y, '&scale=', mapController.getScale(), '&canvasWidth=', size.width, '&canvasHeight=', size.height, '&objects=', objects].join("");
			streets = new polyLine(streetCanvas);
			getUrl(getPagePath() + '/cgi/show_visible?' + url, showVisible);
		}
	}
}

function showVisible(a,b,reply) {
	var xmlDoc = XML.parse(reply),
		pointsArray = Array();
	var root = xmlDoc.documentElement,
	    replyNodes    = root.childNodes,
		pointsArray    = Array(),
		segmentsArray  = Array(),
		buildingsArray = Array();
	for (var i = 0; i < replyNodes.length; i++) {
		if (replyNodes[i].nodeType == 1) {
			if (replyNodes[i].nodeName == 'streetPoint') {
				var
					id	= replyNodes[i].getAttribute('id'),
					x	= replyNodes[i].getAttribute('x'),
					y	= replyNodes[i].getAttribute('y');
				pointsArray[pointsArray.length] = {id:id, x:x, y:y};
			}
			if (replyNodes[i].nodeName == 'streetSegment') {
				var
					id	     = replyNodes[i].getAttribute('id'),
					start    = replyNodes[i].getAttribute('start').split(', '),
					end      = replyNodes[i].getAttribute('end').split(', '),
					startId  = replyNodes[i].getAttribute('startId'),
					endId    = replyNodes[i].getAttribute('endId'),
					streetId = replyNodes[i].getAttribute('objectId'),
					name     = replyNodes[i].getAttribute('name'),
					importance  = replyNodes[i].getAttribute('importance');
				segmentsArray[segmentsArray.length] = {id:id, start: start, end: end, startId: startId, endId: endId, name: name, streetId: streetId, importance: importance};
			}
			if (replyNodes[i].nodeName == 'streetBuilding') {
				var
					id	     = replyNodes[i].getAttribute('id'),
					x        = replyNodes[i].getAttribute('x'),
					y        = replyNodes[i].getAttribute('y'),
					number   = replyNodes[i].getAttribute('number'),
					streetId = replyNodes[i].getAttribute('objectId'),
					streetName = replyNodes[i].getAttribute('name_street'),
					sx   = replyNodes[i].getAttribute('ScaleX'),
					sy   = replyNodes[i].getAttribute('ScaleY'),
					segAngle = -replyNodes[i].getAttribute('angleS') * 180/ Math.PI,
					angle   = -replyNodes[i].getAttribute('angle') * 180/ Math.PI + segAngle,
					type   = replyNodes[i].getAttribute('type');
					if (streetName == 'чекистов') {
						myLog(streetName +', '+number + '  ' + replyNodes[i].getAttribute('angle')+ '  ' + segAngle);
						myLog(streetName +', '+number + '  ' + angle);
					}
				buildingsArray[buildingsArray.length] = {id:id, x:x, y:y, number: number, streetId: streetId, streetName: streetName,
				                                         sx: sx, sy: sy, angle: angle, type: type, segAngle: segAngle};
			}
		}
	}
	streets.addPoints(pointsArray);
	streets.addSegments(segmentsArray);
	streets.addBuildings(buildingsArray);
	streets.showAll(mapController.searchCenterCell());
}

function keyboardEvents(event) {
	if (event.keyCode) {
		if (event.keyCode == 46) {
			streets.keyboardEvent(event.keyCode);
		}
	}
}

function dragStreets() {
	if ((goDrag) && (streets)) {
		mapMoved = true;
		blockCreator = true; streets.dragMe();
	} else {
		if (newCells) {
			newCells = false;
		}
		if (mapMoved) {
			reloadStreets();
			mapMoved = false;			
		}
	}	
}

function createNewStreet() {
	if ((!blockCreator) && (streetEdit) && (selectedLinePath)) {
		var center   = mapController.searchCenterCell(),
			xClick   = mousePos.x - center.x,
			yClick   = mousePos.y - center.y,
			ratio    = Math.pow(mapController.getStep(), mapController.getScale() - 1),
			realX    = xClick * ratio,
			realY    = yClick * ratio,
			mode = adminNavigatorSelectedMode();
		switch (mode) {
			case 'building':
				if (selectedBuilding) {
					if (selectedBuilding.selected['selectedBuilding'].number) {
						var number = selectedBuilding.selected['selectedBuilding'].number,
							width  = false || selectedBuilding.selected['selectedBuilding'].width,
							height = false || selectedBuilding.selected['selectedBuilding'].height;
						var url = [pagePath, '/scripts/addBuilding.php?map_x=', realX, '&map_y=', realY, '&object_id=', goToStreetId, '&number=', number, '&width=', width, '&height=', height].join("");
						getUrlWithObject(url, streets.creator, {caller: streets, x: realX, y: realY, center: center, number: number, streetId: goToStreetId, sx:1, sy:1, angle:0, type:0});
					}
				}
			break;
			case 'segment':
				break;
			default:
				var url = pagePath + '/scripts/add_point.php?map_x=' + realX + '&map_y=' + realY;
				getUrlWithObject(url, streets.creator, {caller: streets, x: realX, y: realY, center: center});
			break;
		}
	} else {blockCreator = false;}
}
// ---- /work/units/streetAdmin/streetAdmin.js ---- 
// ==== /work/units/streetAdmin/mapObjects.js ==== 
//Ссылка на перетаскиваемую точку
var dragPoint,
    selectedLinePath     = false,
	selectedLineSegment  = false,
	selectedLinePoint    = false,
	selectedLineBuilding = false,
	activeObserver = Array(),
	pointToDrag   = false,
	buildingToDrag = false,
	segmentToDrag = false;
	var arraySegment = new Array();
//Класс svgObject, описывающий основные свойства стилей svg объекта и методов работы с ними
function svgObject() {
	this.status             = 'inactive';
	this.selected           = false;
	this.activeStyle        = {};
	this.inactiveStyle      = {};
	this.selectedStyle      = {};
	this.activeHoverStyle   = {};
	this.inactiveHoverStyle = {};
	this.selectedHoverStyle = {};
	this.animateInterval    = 300;
	this.changeStyle	   = function(svgObject, style) {svgObject.attr(style);};
	this.setStyle          = function(activeStyle, inactiveStyle, activeHoverStyle, inactiveHoverStyle, selectedStyle, selectedHoverStyle) {
		if (activeStyle  ) {this.activeStyle   = activeStyle;}
		if (inactiveStyle) {this.inactiveStyle = inactiveStyle;}
		if (selectedStyle) {this.selectedStyle = selectedStyle;}
		if (activeHoverStyle  ) {this.activeHoverStyle   = activeHoverStyle;}
		if (inactiveHoverStyle) {this.inactiveHoverStyle = inactiveHoverStyle;}
		if (selectedHoverStyle) {this.selectedHoverStyle = selectedHoverStyle;}
	};
	this.getStylePrefix = function() {return this.selected || this.status;};
	this.highlightMe = function(hover) {
		if (!pointToDrag) {
			this.visual.attr(this[this.getStylePrefix() + hover + 'Style']);
			if (hover == 'Hover') {
				if (this.name) {
					var offset = this.name.length * 7;
					this.hint = this.canvas.text(mousePos.x + offset, mousePos.y, this.name).attr({'fill': '#F00', 'font-size' : 14, 'font-weight' : 600});
				}
			}
			else {if (this.hint) {this.hint.remove();}this.hint = false;}
		}
	};
	this.changeStatus = function(newStatus) {
		this.status = newStatus;
		this.visual.attr(this[this.getStylePrefix() + 'Style']);
	};
	//Выделяем
	this.selectMe = function() {
//		arraySegment.push(this);
		this.selected = 'selected';
		this.visual.attr(this[this.getStylePrefix() + 'Style']);
	};
	//Девыделяем
	this.deselectMe = function() {
		this.selected = false;
		this.visual.attr(this[this.getStylePrefix() + 'Style']);
	};
	this.dummy = function() {return false;};
	
	this.dragMe = function() {
		if (this.visual) {
			this.visual.translate(mousePos.x - mousePosOld.x, mousePos.y - mousePosOld.y);
		}
	};
	this.deleteMe = function() {this.visual.remove();if (this.hint) {this.hint.remove();this.hint = false;}};
}

function svgPoint() {
	this.activeStyle        = {'fill':'#bfda37','stroke-width':1,'stroke':'#FFF'};
	this.inactiveStyle      = {'fill':'#424242','stroke-width':1,'stroke':'#FFF'};
	this.selectedStyle      = {'fill':'#F00'};
	this.activeHoverStyle   = {'fill':'#000'};
	this.inactiveHoverStyle = {'fill':'#FFF','stroke-width':1};
	this.selectedHoverStyle = {'fill':'#FF0'};
	this.width  = 7;
	this.height = 7;
	this.showMe = function(screenX, screenY) {
		var x = screenX - (this.width  / 2);
		var y = screenY - (this.height / 2);
		return ['M ', x, ',', y, ' l ', this.width, ',', 0, ' l ', 0, ',', this.height, ' l ', -this.width, ',', 0, ' z '].join("");
	};
	this.drawMe = function(mapCenter) {
			this.visual = this.canvas.path(this.showMe(mapCenter.x + this.x, mapCenter.y + this.y)).attr(this[this.status + 'Style']);
			this.visual.node.style.cursor = 'pointer';
			this.visual.node.caller = this;
			this.visual.node.onclick     = this.clickMe;
			this.visual.node.onmouseover = this.mouseOverMe;
			this.visual.node.onmouseout  = this.mouseOutMe;
			this.visual.node.onmousedown = this.mouseDownMe;
			this.visual.node.onmouseup   = this.mouseUpMe;
		};
	this.visualCenter = function() {var params = this.visual.getBBox();return {x: params.x + (this.width / 2), y: params.y + (this.height / 2)};};
	this.mouseOverMe = function() {this.caller.highlightMe('Hover');};
	this.mouseOutMe  = function() {this.caller.highlightMe('');};
	this.mouseDownMe = function() {this.caller.line.mouseDownPoint(this.caller);};
	this.mouseUpMe   = function() {this.caller.line.mouseUpPoint(this.caller);};
	this.clickMe     = function() {this.caller.line.clickPoint(this.caller.id);};
	
}

function svgBuilding() {
	this.activeStyle        = {'fill':'#bfda37', 'stroke-width':0.8, 'stroke':'#FFF'};
	this.inactiveStyle      = {'fill':'#424242', 'stroke-width':0.8, 'stroke':'#FFF', 'font-size':9};
	this.selectedStyle      = {'fill':'#F00', 'stroke':'#FFF'};
	this.activeHoverStyle   = {'fill':'#000', 'stroke':'#FFF'};
	this.inactiveHoverStyle = {'fill':'#FFF','stroke-width':0.8, 'stroke':'#000'};
	this.selectedHoverStyle = {'fill':'#FF0'};
	this.selectedStreetStyle = {'fill':'#D0D'};
	this.width  = 0;
	this.height = 0;
	this.showMe = function(screenX, screenY) {
		var x = screenX - (this.width  / 2);
		var y = screenY - (this.height / 2);
		return ['M ', x, ',', y, ' l ', this.width, ',', 0, ' l ', 0, ',', this.height, ' l -', this.width, ',', 0, ' z '].join("");
	};
	this.drawMe = function(mapCenter) {		
		this.visual = this.canvas.set();
		var text = this.canvas.text(mapCenter.x + this.x, mapCenter.y + this.y, this.number).attr(this[this.status + 'Style']);
		this.visual.push(text);
		text.node.style.cursor = 'pointer';
		text.node.caller = this;
		text.node.onclick     = this.clickMe;
		text.node.onmouseover = this.mouseOverMe;
		text.node.onmouseout  = this.mouseOutMe;
		text.node.onmousedown = this.mouseDownMe;
		text.node.onmouseup   = this.mouseUpMe;
		var template = buildingTemplates[this.type];
		if (!(this.type) || (this.type == 0) || !(template)) {
			this.width  = text.getBBox().width  + 3;
			this.height = text.getBBox().height + 3;
			var path = this.canvas.path(this.showMe(mapCenter.x + this.x, mapCenter.y + this.y)).attr(this[this.status + 'Style']).toBack();
			this.visual.push(path);
			path.node.style.cursor = 'pointer';
			path.node.caller = this;
			path.node.onclick     = this.clickMe;
			path.node.onmouseover = this.mouseOverMe;
			path.node.onmouseout  = this.mouseOutMe;
			path.node.onmousedown = this.mouseDownMe;
			path.node.onmouseup   = this.mouseUpMe;
		} else {
			var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);
			var w = template.width,
				h = template.height,
				x = this.x + mapCenter.x - w / (2 * ratio),
				y = this.y + mapCenter.y - h / (2 * ratio),
				tmpImg = this.canvas.image(template.src, x, y, w / ratio, h / ratio).toBack();
			this.visual.push(tmpImg);
			var visCent = this.visualCenter();
			addBuildHelpers(this);
			tmpImg.node.style.cursor = 'pointer';
			tmpImg.node.caller = this;
			tmpImg.node.onclick     = this.clickMe;
			tmpImg.node.onmouseover = this.mouseOverMe;
			tmpImg.node.onmouseout  = this.mouseOutMe;
			tmpImg.node.onmousedown = this.mouseDownMe;
			tmpImg.node.onmouseup   = this.mouseUpMe;
			this.visual.rotate(this.angle, visCent.x, visCent.y);
			this.visual.scale(this.sx, this.sy,  visCent.x, visCent.y);
		}
	};

	this.dragMe = function () {
		if (this.visual) {
			if ((this.type) && (this.type != 0)) {
				this.visual.rotate(this.angle, this.visualCenter().x, this.visualCenter().y);
			}
			this.visual.translate(mousePos.x - mousePosOld.x, mousePos.y - mousePosOld.y);
		}
	}
	this.visualCenter = function() {var params = this.visual.getBBox();return {x: params.x + (params.width / 2), y: params.y + (params.height / 2)};};
	this.mouseOverMe = function() {this.caller.highlightMe('Hover');};
	this.mouseOutMe  = function() {this.caller.highlightMe('');};
	this.mouseDownMe = function() {this.caller.line.mouseDownBuilding(this.caller);};
	this.mouseUpMe   = function() {this.caller.line.mouseUpBuilding(this.caller);};
	this.clickMe     = function() {this.caller.line.clickBuilding(this.caller.id);};
	
}

function svgSegment() {
	this.activeStyle        = {'stroke':'#bfda37','stroke-width':3};
	this.inactive1Style     = {'stroke':'#0A0','stroke-width':3};
	this.inactive2Style     = {'stroke':'#70F','stroke-width':3};
	this.inactive3Style     = {'stroke':'#472929','stroke-width':3};
	this.inactive4Style     = {'stroke':'#F77','stroke-width':3};
	this.inactive5Style     = {'stroke':'#DBCB16','stroke-width':3};
	this.inactive6Style     = {'stroke':'#71D3EC','stroke-width':3};
	this.inactive7Style     = {'stroke':'#98450E','stroke-width':3};
	this.inactive8Style     = {'stroke':'#98450E','stroke-width':3};
	this.inactive127Style   = {'stroke':'#A0CF1A','stroke-width':3};
	this.selectedStyle      = {'stroke':'#F00','stroke-width':3};
	this.activeHoverStyle   = {'stroke':'#000'};
	this.inactiveHoverStyle = {'stroke':'#767676','stroke-width':4};
	this.selectedHoverStyle = {};
	this.showMe = function(startX, startY, endX, endY) {
		return ['M ', startX, ',', startY, ' l ', endX - startX, ',', endY - startY, ' z '].join("");
	};
	this.drawMe = function(coords) {
		
		var prefix  = this.selected || this.status;
		this.visual = this.canvas.path(this.showMe(coords.start.x, coords.start.y, coords.end.x, coords.end.y)).attr(this[prefix + 'Style']);
		this.visual.toBack();
		this.visual.node.style.cursor = 'pointer';
		this.visual.node.caller  = this;
		this.visual.node.onclick = this.clickMe;
		this.visual.node.onmouseover = this.mouseOverMe;
		this.visual.node.onmouseout  = this.mouseOutMe;
		this.visual.node.onmousedown = this.mouseDownMe;
		this.visual.node.onmouseup   = this.mouseUpMe;
		
	};
	this.redrawMe = function(coords) {
		this.deleteMe();
		this.drawMe(coords);
	};
	this.clickMe     = function() {this.caller.line.clickSegment(this.caller);};
	this.mouseOverMe = function() {this.caller.highlightMe('Hover');};
	this.mouseOutMe  = function() {this.caller.highlightMe('');};
	this.mouseDownMe = function() {this.caller.line.mouseDownSegment(this.caller);};
	this.mouseUpMe   = function() {this.caller.line.mouseUpSegment(this.caller);};
}

function observer(id) {
	this.id = id;
	this.segments = Array();
	this.active = function() {
			for (var i = 0; i < this.segments.length; i++) {
				this.segments[i].redrawMe(this.segments[i].getEdgeCoords());
			}
		};
	this.findSegment = function(id) {
			for (var i = 0; i < this.segments.length; i++) {
				if (this.segments[i].id == id) {return this.segments[i];}
			}
			return false;
		};
	
}

function point(x, y, id, canvas, line) {
	//Ссылка на Raphael canvas	
	this.canvas = canvas;
	//Методы для получения ккординат
	this.real        = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord / ratio;};
	this.screenReal  = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord * ratio;};
	//Установка координат
	this.x = this.real(x);
	this.y = this.real(y);
	this.id     = id;
	this.mapX   = x;
	this.mapY   = y;
	this.line   = line;
}

function building(x, y, id, streetId, number, streetName, sx, sy, angle, segAngle, type, canvas, line) {
	//Ссылка на Raphael canvas
	this.canvas = canvas;
	this.number = number;
	//Методы для получения ккординат
	this.real        = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord / ratio;};
	this.screenReal  = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord * ratio;};
	//Установка координат
	this.x = this.real(x);
	this.y = this.real(y);
	this.streetId   = streetId;
	this.streetName = streetName;
	this.id     = id;
	this.mapX   = x;
	this.mapY   = y;	
	this.sx   = sx || 0.5;
	this.sy   = sy || 0.5;
	this.angle = angle;
	this.type = type;
	this.line = line;
	this.segAngle = segAngle;
}

function lineSegment(startPoint, endPoint, id, streetId, canvas, line, name, importance) {
	this.startPoint = startPoint;
	this.endPoint   = endPoint;
	this.streetId   = streetId;
	this.canvas     = canvas;
	this.id         = id;
	this.line       = line;
	this.name       = name;
	this.importance = importance;
	this.status         = 'inactive' + importance;
	this.getEdgeCoords = function() {
		var start = this.startPoint.visualCenter();
		var end   = this.endPoint.visualCenter();
		return {start:{x: start.x, y: start.y}, end: {x: end.x, y: end.y}};
	};
}

function polyLine(canvas) {
	this.real        = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord / ratio;};
	this.screenReal  = function(coord) {var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);return coord * ratio;};	
	//Ссылка на Raphael canvas
	this.canvas = canvas;
	//Массив точек линии
	this.points    = {};
	//Массив дополнительных объектов типа "здание"
	this.buildings = {};
	//Массив сегментов
	this.segments  = {};
	//Массив наблюдателей
	this.observers = {};
	this.addPoint = function(x, y, id) {
			var pointFromArray    = this.getPointById(id),
			    newPoint          = pointFromArray || new point(x, y, id, this.canvas, this),
			    observerFromArray = this.getObserverById(id),
			    newObserver       = observerFromArray || new observer(id);
			if (!observerFromArray) {this.observers[id] = newObserver;}
			if (!pointFromArray   ) {this.points[id]    = newPoint;}
			return newPoint;
		};
	this.addBuilding = function(x, y, id, streetId, number, streetName, sx, sy, angle, type, segAngle)   {
			var buildingFromArray = this.getBuildingById(id),
			    newBuilding       = buildingFromArray || new building(x, y, id, streetId, number, streetName, sx, sy, angle, segAngle, type, this.canvas, this);
			if (!buildingFromArray) {this.buildings[id] = newBuilding;}
			return newBuilding;
		};
	this.addPoints       = function(pointArray)     {for (var i = 0; i < pointArray.length; i++) {this.addPoint(pointArray[i].x, pointArray[i].y, pointArray[i].id);}};
	this.addBuildings    = function(buildingsArray) {
		for (var i = 0; i < buildingsArray.length; i++) {
			this.addBuilding(buildingsArray[i].x, buildingsArray[i].y, buildingsArray[i].id, buildingsArray[i].streetId, buildingsArray[i].number, buildingsArray[i].streetName,
		                     buildingsArray[i].sx, buildingsArray[i].sy, buildingsArray[i].angle, buildingsArray[i].type, buildingsArray[i].segAngle);
		}
	};
	this.getPointById    = function(id) {if (this.points[id])    {return this.points[id];}return false;};
	this.getBuildingById = function(id) {if (this.buildings[id]) {return this.buildings[id];}return false;};
	this.getSegmentById  = function(id) {if (this.segments[id])  {return this.segments[id];}return false;};
	this.getObserverById = function(id) {if (this.observers[id]) {return this.observers[id];}return false;};	
	this.addSegment      = function(startId, startX, startY, endId, endX, endY, id, streetId, name, importance) {
		var startPoint    = this.addPoint(startX, startY, startId),
		    endPoint      = this.addPoint(endX, endY, endId),
			startObserver = this.getObserverById(startId),
			endObserver   = this.getObserverById(endId),
			newSegment    = new lineSegment(startPoint, endPoint, id, streetId, this.canvas, this, name, importance);
		this.segments[id] = newSegment;
		startObserver.segments[startObserver.segments.length] = newSegment;
		endObserver.segments[endObserver.segments.length]     = newSegment;
		return newSegment;
	};
	this.addSegments  = function(segmentsArray) {
		for (var i = 0; i < segmentsArray.length; i++) {
			this.addSegment(segmentsArray[i].startId, segmentsArray[i].start[0], segmentsArray[i].start[1], segmentsArray[i].endId, segmentsArray[i].end[0], segmentsArray[i].end[1], segmentsArray[i].id, segmentsArray[i].streetId, segmentsArray[i].name, segmentsArray[i].importance);}
		};
	this.showPoints   = function(mapCenter) {
			for (var i in this.points) {
				this.points[i].drawMe(mapCenter);
				if (selectedLinePoint) {
					if (i == selectedLinePoint) {this.points[i].selectMe();}
				}
			}
		};
	this.showSegments = function() {
			for (var i in this.segments) {
				this.segments[i].drawMe(this.segments[i].getEdgeCoords());
				if (this.segments[i].streetId == selectedLinePath) {this.segments[i].changeStatus('active');}
				if (selectedLineSegment) {
					if (i == selectedLineSegment) {this.segments[i].selectMe();}
				}
			}
		};
	this.showBuildings = function(mapCenter) {
			for (var i in this.buildings) {
				if (this.buildings[i].streetId == selectedLinePath) {
					this.buildings[i].drawMe(mapCenter);
					this.buildings[i].changeStatus('selectedStreet');					
				} 
			}
		};
	this.showAll      = function(mapCenter) {
		this.showPoints(mapCenter);this.showSegments();this.showBuildings(mapCenter);
	};
	this.clickSegment = function(segment) {
		var mode = adminNavigatorSelectedMode();
		switch (mode) {
			case 'street' :this.selectPath(segment.streetId);break;
			case 'segment':this.selectSegment(segment.id);break;
			case 'point'  :this.splitSegmentCall(segment.id);break;
		}
	};
	this.selectPoint = function(id) {
		if (selectedLinePoint) {if (selectedLinePoint == id) {selectedLinePoint = false;} else {selectedLinePoint = id;}} else {selectedLinePoint = id;}
		for (var i in this.points) {
			if (i == id) {if (!this.points[i].selected) {this.points[i].selectMe();} else {this.points[i].deselectMe();}}
			else {this.points[i].deselectMe();}
		}
		myLog('x=' + this.points[id].mapX + 'y=' + this.points[id].mapY);
	};
	this.selectBuilding = function(id) {
		if (selectedLineBuilding) {
			this.buildings[selectedLineBuilding].deselectMe();
			selectedBuilding.changeFields(false);
			if (selectedLineBuilding == id) {selectedLineBuilding = false;} else {selectedLineBuilding = id;}
		} else {selectedLineBuilding = id;}
		if (selectedLineBuilding) {
			selectedBuilding.changeFields(this.buildings[selectedLineBuilding]);			
			fillText(this.buildings[selectedLineBuilding].streetName, this.buildings[selectedLineBuilding].streetId);
			selectedLinePath = this.buildings[selectedLineBuilding].streetId;
			this.buildings[selectedLineBuilding].selectMe();
		}
		if (selectedLineBuilding) {
			this.selectBuildingOnStreet(this.buildings[selectedLineBuilding].streetId);
		}		
	};
	this.selectSegment = function(id) {
		if (selectedLineSegment) {
			if (selectedLineSegment == id) {selectedLineSegment = false;} else {selectedLineSegment = id;}
		} else {
			selectedLineSegment = id;
		}
		if (selectedLineSegment) {
		}
		for (i in this.segments) {
			if (i == id) {if (!this.segments[i].selected) {this.segments[i].selectMe();} else {this.segments[i].deselectMe();}}
			else {this.segments[i].deselectMe();}
		}
		selectedSegment.changeFields(this.segments[selectedLineSegment]);
		if (selectedLinePath) {
			selectedSegment.changeField({streetId: goToStreetId});
		}
	};

	this.clickPoint   = function(id) {
		var mode = adminNavigatorSelectedMode();
		if (mode == 'street') {
			if ((selectedLinePath) && (selectedLinePoint)) {
				var newPoint      = this.getPointById(id);
				var startObserver = this.getObserverById(selectedLinePoint);
				var endObserver   = this.getObserverById(newPoint.id);
				var bool = false;
				
				for (var i = 0; i < startObserver.segments.length; i++) {
					bool = endObserver.findSegment(startObserver.segments[i].id);
					if (bool) {break;}
				}
				if (!bool) {
					if (selectedLineSegment) {
						var url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&importance=', this.segments[selectedLineSegment].importance, '&object_id=', selectedLinePath].join("");
						getUrlWithObject(url, this.createSegment, {caller: this, endPoint:newPoint, importance: this.segments[selectedLineSegment].importance});
					} else {
						var url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&object_id=', selectedLinePath].join("");
						getUrlWithObject(url, this.createSegment, {caller: this, endPoint:newPoint});
					}
				}
				else {this.selectPoint(id);}
			}
			else {this.selectPoint(id);}
		}
		else {this.selectPoint(id);}
	};
	this.clickBuilding  = function(id) {
		var mode = adminNavigatorSelectedMode();
		if (mode == 'building') {this.selectBuilding(id)}
	};
	this.selectPath = function(id, foreign) {
		if (selectedLinePath) {
			if (selectedLinePath == id) {selectedLinePath = '';} else {selectedLinePath = id;}
		} else {selectedLinePath = id;}
		var name = '';
		for (var i in this.segments) {
			if (this.segments[i].streetId == id) {if (this.segments[i].status != 'active') {this.segments[i].changeStatus('active');name = this.segments[i].name;} else {this.segments[i].changeStatus('inactive' + this.segments[i].importance);}}
			else {this.segments[i].changeStatus('inactive' + this.segments[i].importance);}
		}
		if (selectedSegment){selectedSegment.changeField({streetId: goToStreetId});}
		if (!foreign) {fillText(name, selectedLinePath || id);}		
	};
	
	this.mouseDownBuilding = function(building) {
		blockCreator = true;
		var mode = adminNavigatorSelectedMode();
		if (mode == 'building') {buildingToDrag = building;blockAllDrag = this.dragBuilding;}
	};
	this.mouseDownPoint = function(point) {
		blockCreator = true;
		var mode = adminNavigatorSelectedMode();
		if (mode == 'point') {
			pointToDrag = point;
			activeObserver[activeObserver.length] = this.getObserverById(point.id);
			blockAllDrag = this.dragPoint;
		}
	};
	this.mouseDownSegment = function(segment) {
		blockCreator = true;
		var mode = adminNavigatorSelectedMode();
		if (mode == 'segment') {
			segmentToDrag = segment; 
			activeObserver[activeObserver.length] = this.getObserverById(segment.startPoint.id);
			activeObserver[activeObserver.length] = this.getObserverById(segment.endPoint.id);
			blockAllDrag = this.dragSegment;
		}
	};
	this.recountPoint = function(point) {
			var center      = mapController.searchCenterCell(),
			    pointCenter = point.visualCenter(),
				startMapX = point.mapX,
				startMapY = point.mapY;
			
			point.mapX = point.screenReal(pointCenter.x - center.x);
			point.mapY = point.screenReal(pointCenter.y - center.y);

			if ((Math.abs(startMapX - point.mapX) > 0.5) || (Math.abs(startMapY - point.mapY) > 0.5)) {
				var url = [pagePath, '/scripts/chang_point.php?map_x=', point.mapX, '&map_y=', point.mapY, '&point_id=', point.id].join("");
				getUrl(url, function(){});
			}
		};

	this.recountBuilding = function(building) {
			var center      = mapController.searchCenterCell(),
			    buildingCenter = building.visualCenter(),
				startMapX = building.mapX,
				startMapY = building.mapY;				

			building.mapX = building.screenReal(buildingCenter.x - center.x);			
			building.mapY = building.screenReal(buildingCenter.y - center.y);
			building.x = building.real(building.mapX);
			building.y = building.real(building.mapY);
			if ((Math.abs(startMapX - building.mapX) > 0.5) || (Math.abs(startMapY - building.mapY) > 0.5)) {
				var url = [pagePath, '/scripts/change_building.php?', 'id=', building.id, '&map_x=', building.mapX, '&map_y=', building.mapY, '&number=', building.number].join("");
				getUrl(url, function(){});
			}
		};
	this.mouseUpPoint = function(point) {
		activeObserver = Array();
		if (pointToDrag) {
			pointToDrag.line.recountPoint(pointToDrag);
		}
		pointToDrag = false;
	};
	this.mouseUpBuilding = function(building) {
		if (buildingToDrag) {
			buildingToDrag.line.recountBuilding(buildingToDrag);
		}
		buildingToDrag = false;
	};
	this.mouseUpSegment = function(segment) {
			activeObserver = Array();
			if (segmentToDrag) {
				segmentToDrag.line.recountPoint(segmentToDrag.startPoint);
				segmentToDrag.line.recountPoint(segmentToDrag.endPoint);
				segmentToDrag = false;
			}
		};	
	this.dragPoint    = function() {if (pointToDrag)    {pointToDrag.dragMe();for (var i = 0; i < activeObserver.length; i++) {activeObserver[i].active();}}};
	this.dragBuilding = function() {if (buildingToDrag) {buildingToDrag.dragMe();}};
	this.dragSegment = function() {
		if (segmentToDrag) {
//			for(var x = 0; x < arraySegment.length; x++){
//				arraySegment[x].startPoint.dragMe();
//				arraySegment[x].endPoint.dragMe();
//			}
			segmentToDrag.startPoint.dragMe();
			segmentToDrag.endPoint.dragMe();
			for (var i = 0; i < activeObserver.length; i++) {
				activeObserver[i].active();
			}
		}
	};
	this.deletePoint = function(id) {
		if (selectedLinePoint) {selectedLinePoint = false;}
		var segmentsToDelete = Array();
		activeObserver = Array();
		for (var i in this.segments) {if ((this.segments[i].startPoint.id == id) || (this.segments[i].endPoint.id == id)) {segmentsToDelete[segmentsToDelete.length] = i;this.segments[i].deleteMe();delete this.segments[i];}}
		if (this.points[id]) {this.points[id].deleteMe();delete this.points[id];}
		for (i in this.observers) {
			if (this.observers[i].id == id) {delete this.observers[i];}
			else {
				for (var j = 0; j < this.observers[i].segments.length;) {
					var bool = false;
					for (var z = 0; z < segmentsToDelete.length; z++) {if (this.observers[i].segments[j].id == segmentsToDelete[z]) {bool = true;break;}}
					if (bool) {this.observers[i].segments.splice(j,1);} else {j++;}
				}
			}
		}
		var url = pagePath + '/scripts/del_streetElement.php?point_id=' + id;
		getUrl(url, function(){});
	};
	this.deleteBuilding = function(id) {
		if (selectedLineBuilding) {selectedLineBuilding = false;}
		if (this.buildings[id]) {this.buildings[id].deleteMe();delete this.buildings[id];}		
		var url = pagePath + '/scripts/delete_building.php?id=' + id;
		getUrl(url, function(){});
	};

	this.deleteSegment = function(id, fromArray) {
		activeObserver = Array();
		if (selectedLineSegment) {selectedLineSegment = false;}
		var segment = this.getSegmentById(id);
		if (this.segments[id]) {this.segments[id].deleteMe();delete this.segments[id];}
		for (var i in this.observers) {
			for (var j = 0; j < this.observers[i].segments.length;) {
				if (this.observers[i].segments[j].id == id) {
					this.observers[i].segments.splice(j,1);
				}
				else {j++;}
			}
			i++;
		}
		var url = pagePath + '/scripts/del_streetElement.php?segment_id=' + id;
		getUrl(url, function(){});		
	};
	
	this.splitSegmentCall = function(id) {
		var center = mapController.searchCenterCell(),
			mapX   = this.screenReal(mousePos.x - center.x),
			mapY   = this.screenReal(mousePos.y - center.y),
			url = [pagePath, '/scripts/split_segment.php?segmentId=', id, '&map_x=', mapX, '&map_y=', mapY].join("");
		getUrlWithObject(url, this.splitSegment, {caller: this, x: mapX, y: mapY, id:id, mapCenter: center});
			
	};
	this.splitSegment = function (a, b , reply, params) {
		activeObserver = Array();
		var xmlDoc  = XML.parse(reply),
			segment = params.caller.getSegmentById(params.id),
			root    = xmlDoc.documentElement,
			nodes   = root.childNodes,
			pointId = false,
			startId = false,
			endId   = false;
		params.caller.deleteSegment(segment.id, true);			
		for (var i = 0; i < nodes.length; i++) {
			if (nodes[i].nodeType == 1) {
				if (nodes[i].nodeName == 'point')    {pointId = nodes[i].getAttribute('id');}
				if (nodes[i].nodeName == 'segments') {startId = nodes[i].getAttribute('startId');endId = nodes[i].getAttribute('endId');}
			}
		}
		var newPoint = false;
		if (pointId) {
			newPoint = params.caller.addPoint(params.x, params.y, pointId);
			newPoint.drawMe(params.mapCenter);
		}
		if ((startId) && (endId) && (newPoint)) {
			var firstSegment  = params.caller.addSegment(segment.startPoint.id, segment.startPoint.x, segment.startPoint.y, newPoint.id, newPoint.x, newPoint.y, startId, segment.streetId, segment.name);
				firstSegment.drawMe(firstSegment.getEdgeCoords());
			var secondSegment = params.caller.addSegment(newPoint.id, newPoint.x, newPoint.y, segment.endPoint.id, segment.endPoint.x, segment.endPoint.y, endId, segment.streetId, segment.name);
				secondSegment.drawMe(secondSegment.getEdgeCoords());
			if (selectedLinePath)    {if (segment.streetId == selectedLinePath) {firstSegment.changeStatus('active');secondSegment.changeStatus('active');}}
		}
		if (selectedLineSegment) {selectedLineSegment = false;}
	};
	this.dragMe = function() {
		var i;
		for (i in this.points)   {this.points[i].dragMe();}
		for (i in this.segments) {this.segments[i].dragMe();}
		for (i in this.buildings) {this.buildings[i].dragMe();}
	};
	this.keyboardEvent = function(keyCode) {
		var mode = adminNavigatorSelectedMode();
		switch (mode) {
			case 'point'   :if ((selectedLinePoint) && (keyCode == 46))   {this.deletePoint(selectedLinePoint);}break;
			case 'segment' :if ((selectedLineSegment) && (keyCode == 46)) {this.deleteSegment(selectedLineSegment);}break;
			case 'building' :if ((selectedLineBuilding) && (keyCode == 46)) {this.deleteBuilding(selectedLineBuilding);}break;
		}
	};
	this.selectBuildingOnStreet = function (streetId) {
		for (var i in this.buildings) {
			if (this.buildings[i].streetId == streetId) {
				this.buildings[i].changeStatus('selectedStreet');
			} else {
				this.buildings[i].changeStatus('inactive');
			}
		}
	};

	this.creator = function(a, b, reply, params) {
		if (selectedLinePath) {
			var mode = adminNavigatorSelectedMode(),
				url = false;

				switch (mode) {
					case 'segment' :
						var newPoint = params.caller.addPoint(params.x, params.y, reply);
						newPoint.drawMe(params.center);
						if (selectedLinePoint) {
							if (selectedLineSegment) {
								url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&importance=', params.caller.segments[selectedLineSegment].importance, '&object_id=', selectedLinePath].join("");
								getUrlWithObject(url, params.caller.createSegment, {caller: params.caller, endPoint:newPoint, importance: params.caller.segments[selectedLineSegment].importance});
							} else {
								url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&object_id=', selectedLinePath].join("");
								getUrlWithObject(url, params.caller.createSegment, {caller: params.caller, endPoint:newPoint});
							}							
						} else {params.caller.clickPoint(newPoint.id);}break;
					case 'street' :
						var	newPoint = params.caller.addPoint(params.x, params.y, reply);
							newPoint.drawMe(params.center);					
						if (selectedLinePoint) {
							if (selectedLineSegment) {
								url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&importance=', params.caller.segments[selectedLineSegment].importance, '&object_id=', selectedLinePath].join("");
								getUrlWithObject(url, params.caller.createSegment, {caller: params.caller, endPoint:newPoint, importance: params.caller.segments[selectedLineSegment].importance});
							} else {
								url = [pagePath, '/scripts/add_segment.php?start_point_id=', selectedLinePoint, '&end_point_id=', newPoint.id, '&object_id=', selectedLinePath].join("");
								getUrlWithObject(url, params.caller.createSegment, {caller: params.caller, endPoint:newPoint});
							}
						} else {params.caller.clickPoint(newPoint.id);}break;
					case 'building' :
						var newBuilding = params.caller.addBuilding(params.x, params.y, reply, params.streetId, params.number, selectStreetName);
						newBuilding.drawMe(params.center);
						newBuilding.changeStatus('selectedStreet');
						var number = parseInt(params.number) + 2;
						selectedBuilding.changeFields({number: number});
						selectedBuilding.selected['selectedBuilding'].number = number;
						selectedBuilding.fieldList['number'].focus();
						break;
				}
		}
	};
	this.createSegment = function(a, b, reply, params) {
		params.importance = params.importance || 1;
		var currentPoint = params.caller.getPointById(selectedLinePoint),
		    newSegment   = params.caller.addSegment(currentPoint.id, currentPoint.x, currentPoint.y, params.endPoint.id, params.endPoint.x, params.endPoint.y, reply, selectedLinePath, selectStreetName, params.importance);
		newSegment.drawMe(newSegment.getEdgeCoords());
		newSegment.changeStatus('active');
		params.caller.clickPoint(params.endPoint.id);
	};
}

var svgClass = new svgObject();
svgPoint.prototype    = svgClass;
svgSegment.prototype  = svgClass;
svgBuilding.prototype = svgClass;
var svgPointClass    = new svgPoint(),
    svgSegmentClass  = new svgSegment(),
	svgBuildingClass = new svgBuilding();
point.prototype       = svgPointClass;
building.prototype    = svgBuildingClass;
lineSegment.prototype = svgSegmentClass;// ---- /work/units/streetAdmin/mapObjects.js ---- 
// ==== /work/units/logoLine/logoLine.js ==== 
var logoLine, bottomLink, logoCarusel, leftArrow, rightArrow,
	runLeftInt, caruselStop,
	runRightInt, iterCount = 0;

function initLogoLine(obj) {
	logoLine = obj;
	addResizeEvent(setLogoLinePosition);
	addHideAllFunction(hideLogoLine);
	addShowAllFunction(showLogoLine);
}

function hideLogoLine() {
	logoLine.style.display = 'none';
}

function showLogoLine() {
	logoLine.style.display = 'block';
}

function setLogoLinePosition() {
	logoLine.style.width = mapController.getOptions().rootSize.width - 260 + 'px';
	logoLine.style.top = mapController.getOptions().rootSize.height - 50 + 'px';
	if (logoCarusel.offsetWidth + 80 < logoLine.offsetWidth) {
		logoCarusel.style.left = 0 + 'px';
		leftArrow.style.display = 'none';
		rightArrow.style.display = 'none';
	} else {
		logoCarusel.style.left = 32 + 'px';
		leftArrow.style.display = 'block';
		rightArrow.style.display = 'block';
	}
}

function initBottomLink(obj) {
	bottomLink = obj;
	addResizeEvent(setBottomLinkPosition);
	setBottomLinkPosition();
}

function setBottomLinkPosition() {	
	bottomLink.style.top = mapController.getOptions().rootSize.height - 25 + 'px';	
}


function initLeftArrow(obj) {
	leftArrow = obj;
	obj.onmousedown = function () {		
		caruselStop = false;
		if (runLeftInt) {window.clearInterval(runLeftInt);}
		if (runRightInt) {window.clearInterval(runRightInt);}
		runLeftInt = window.setInterval(caruselRunLeft, 25);
	}
	obj.onmouseup = function () {
		caruselStop = true;
	}
}

function initRightArrow(obj) {
	rightArrow = obj;
	obj.onmousedown = function () {
		caruselStop = false;
		if (runLeftInt) {window.clearInterval(runLeftInt);}
		if (runRightInt) {window.clearInterval(runRightInt);}
		runRightInt = window.setInterval(caruselRunRight, 25);
	}
	obj.onmouseup = function () {
		caruselStop = true;
	}
	setLogoLinePosition();
}

function initLogoCarusel(obj) {
	logoCarusel = obj;
	logoCarusel.style.left = '40px';
}

function caruselRunLeft() {
	var d = 5,
		kol = 100 / d;
	if (parseInt(logoCarusel.offsetWidth) -(40 - parseInt(logoCarusel.style.left)) - d < logoLine.offsetWidth - 80) {
		caruselStop = true;
		iterCount = kol;
	}
	if (iterCount < kol) {
		logoCarusel.style.left =  parseInt(logoCarusel.style.left) - d + 'px';
		iterCount++;
	} else {
		iterCount = 0;
		if (caruselStop) {
			window.clearInterval(runLeftInt);			
		}
	}
}

function caruselRunRight() {
	var d = 5,
		kol = 100 / d;
	if (parseInt(logoCarusel.style.left) + d > 40) {
		caruselStop = true;
		iterCount = kol;
	}
	if (iterCount < kol) {
		logoCarusel.style.left = parseInt(logoCarusel.style.left) + d + 'px';
		iterCount++;
	} else {
		iterCount = 0;
		if (caruselStop) {
			window.clearInterval(runRightInt);			
		}
	}	
}

function openLabel(id) {
	var pagePath = getPagePath(),
		url = [pagePath, '/scripts/object_labels_children.php?object_id=', id].join("");
		getUrlWithObject(url, showNewLabel, {tree: null});
	return false;
}

function showNewLabel(a, b, replay, params) {
	showMapObjects(a, b, replay, params);	
	//parseTreeList(a, b, replay, {tree: null, rootObject: selectedGroup}); //нужно писать отдельную функцию
}

//Выполняет показ или скрытие вип меток(этот метод запускается всегда при клике, найти его запуск можно в navigator_finder.js)
function Carusel(obj,parent_id){
			if(typeof(viplogos) == 'undefined'){
				viplogos = new Array();
			}
			if(obj.className == 'Node ExpandLoading' || obj.className == 'Node ExpandOpen'){
				getUrlWithObject('/scripts/carusel.php?parent_id='+parent_id,outCarusel,{parent_id: parent_id});
			}
			if(obj.className == 'Node ExpandClosed'){
					getUrlWithObject('/scripts/searchLogoForDel.php?parent_id='+parent_id,searchLogo,{parent_id: parent_id});
			}
}

//Выводит метку(используется в Carusel)
function outCarusel(a, b, replay,params){
	//Выдираловка id
	var exp = /id="(\d+)"/
	//Если вернулось хоть что-то
	if(replay){
		var vipArray = replay.split('&');
		for(var i = 0; i < vipArray.length; i++){
			//Выводим
			var span = document.createElement('SPAN');
			var div = document.getElementById('carusel');
			var array = exp.exec(vipArray[i]);
			span.innerHTML = vipArray[i];
			//Собственно id текущей метки
			span.id = array[1];
			viplogos.push(span);
			div.appendChild(span);
		}
		//Переопределяем длинну вип строки
		setLogoLinePosition();
	}

}

//Скрывает метку(используется в Carusel)
function searchLogo(a, b, replay,params){
	if(viplogos.length > 0){
		//Получаем массив всех object_id от php скрипта идущих от текущего парента
		var array = replay.split(',');
					for(var i = 0; i < viplogos.length; i++){
								for(var x = 0; x < array.length; x++){
									if(typeof(viplogos[i]) == 'undefined'){
										break;
									}
									if(viplogos[i].id == array[x]){
										var obj = viplogos[i];
										var parent = obj.parentNode;
										//Удаляем метку
										parent.removeChild(obj);
										viplogos.splice(i,1);
										x = 0;
									}
								}
			}
			//Переопределяем длинну вип строки
			setLogoLinePosition();
	}
}

//Удаляет все vip метки
function delAllVip(){
	if(typeof(viplogos) != 'undefined'){
			for(var i = 0; i < viplogos.length; i++){
			var obj = viplogos[i];
			var parent = obj.parentNode;
			//Удаляем метку
			parent.removeChild(obj);
		}
		delete viplogos;
		//Переопределяем длинну вип строки
		setLogoLinePosition();
	}
}

function editVip(a, b, replay){
	var div = document.getElementById('logoVip');
	div.innerHTML = '';
	div.innerHTML = replay;

}

function setVip(){
	getUrl('/scripts/setVip.php?vip=true', showDiv);
}

function reloadVip(id){
	getUrl('/scripts/edit_vip.php?id='+id, editVip);
}
// ---- /work/units/logoLine/logoLine.js ---- 
// ==== /work/units/wafer/wafer.js ==== 
var pagePath = getPagePath();
var imageArray = Array();
var imageListBuilt = false;
var changOpacityId = null;
var dragPlz;

function hideHelper() {
	for (var i = 0; i < imageArray.length; i++) {
		if ((imageArray[i].canvasImage) && (imageArray[i].status == 'show')) {
			imageArray[i].objectCollection.hide();
			imageArray[i].canvasImage.show();
		}
	}
	return false;
}

function showHelper() {
	for (var i = 0; i < imageArray.length; i++) {
		if ((imageArray[i].canvasImage) && (imageArray[i].status == 'show')) {
			imageArray[i].objectCollection.show();
		}
	}
	return false;
}

function getFileList(obj) {
	clearFileList(obj); fileRequest(obj);
	window.setInterval(function () {fileUpdateRequest(obj)}, 1000);
}

function inImageArray(id) {
	for (var i = 0; i < imageArray.length; i++) {
		if(imageArray[i].id == id) return true;
	}
	return false;
}

function createFileBlock(imageProperties) {
	var table   = document.createElement('TABLE');
	var tbody   = document.createElement('TBODY');
	var row     = document.createElement('TR');
	var cell    = document.createElement('TD');
	var preview = document.createElement('IMG');
	var fileHeader = document.createElement('SPAN');
	var links   = createFileLinks(imageProperties);
	var transpBar = createTransparent(imageProperties);
	if (imageProperties.preview) {preview.src = pagePath + imageProperties.preview; cell.appendChild(preview);}
	fileHeader.className = 'header';
	fileHeader.innerHTML = imageProperties.name;
	
	cell.appendChild(fileHeader);
	cell.appendChild(links.del);
	cell.appendChild(transpBar);
	cell.appendChild(links.place);
	row.appendChild(cell);
	tbody.appendChild(row);
	table.appendChild(tbody);
	return table;
}

function changOpasity(id, val){
	var image = findImageById(id);
	image.transparency = parseFloat(image.transparency) + val;
	if (image.transparency > 1) {image.transparency = 1}
	if (image.transparency < 0) {image.transparency = 0}
	updateImageById(image);
	changeImageInBase(id, {transparency: image.transparency});
	if (image.canvasImage) {
		image.canvasImage.attr({'opacity': image.transparency});
	}
}

function createTransparent (imageProperties) {
	var transpBar = document.createElement('SPAN');
	var transpH = document.createElement('IMG');
	var transpL = document.createElement('IMG');
	transpH.src = '/images/U2.jpg';
	transpL.src = '/images/U3.jpg';
	transpH.onclick = function () {changOpasity(imageProperties.id, 0.1)};
	transpL.onclick = function () {changOpasity(imageProperties.id, -0.1)};
	transpBar.appendChild(transpH);
	transpBar.appendChild(transpL);
	return transpBar;
}


function createFileLinks(imageProperties) {
	var delLink   = document.createElement('SPAN');
	var placeLink = document.createElement('SPAN');
	delLink.className = 'link delete';
	delLink.innerHTML = 'delete';
	delLink.fileId    = imageProperties.id;
	delLink.onclick   = deleteFile;
	placeLink.className = 'link';
	placeLink.fileId    = imageProperties.id;
	switch (imageProperties.status) {
		case '':
			placeLink.innerHTML = 'place';
			placeLink.onclick   = placeFileToCanvas;
		break;
		case 'new': 
			placeLink.innerHTML = 'place';
			placeLink.onclick   = placeFileToCanvas;
		break;
		case 'show':
			placeLink.innerHTML = 'hide';
			placeLink.onclick   = hideFileFromCanvas;
		break;
		case 'hide':
			placeLink.innerHTML = 'show';
			placeLink.onclick   = showImagePlacedOnCanvas;
		break;
	}
	return {del: delLink, place: placeLink};
}

function deleteFile() {
	fileDeleteRequest(this.fileId);
}

function placeFileToCanvas() {
	var image = findImageById(this.fileId);
	this.innerHTML = 'hide';
	this.onclick = hideFileFromCanvas;
	placeImage(image);
}

function hideFileFromCanvas() {
	this.innerHTML = 'show';
	var image = findImageById(this.fileId);
	this.onclick   = showImagePlacedOnCanvas;
	hideImage(image);
}

function showImagePlacedOnCanvas() {
	this.innerHTML = 'hide';
	var image = findImageById(this.fileId);
	this.onclick   = hideFileFromCanvas;
	showImage(image);
}

function clearFileList(obj) {
	var children = obj.childNodes;
	for (var i = 0; i < children.length; i++) {
		obj.removeChild(children[i]);
	}
}

function addFileBlock(obj, block) {
	obj.appendChild(block)
}

function insertFileBlock(obj, block) {
	var first = obj.childNodes[0];
	obj.insertBefore(block, first);
}

function fileUpdate(a,b,reply,obj) {
	var xmlDoc = XML.parse(reply);
	if (xmlDoc.documentElement){
		var root = xmlDoc.documentElement;
		var replyNodes = root.childNodes;
		if (replyNodes.length != 0) {
			for (var i = 0; i < replyNodes.length; i++) {
				if (replyNodes[i].nodeType == 1) {
					var imageProperties = parseImage(replyNodes[i]);
					if (!inImageArray(imageProperties.id)) {
						var fileBlock = createFileBlock(imageProperties);
						insertFileBlock(obj, fileBlock);
						imageProperties.fileBlock = fileBlock;
						imageProperties.object    = obj;
						imageArray[imageArray.length] = imageProperties;
					}
				}
			}
		}
	}	
}

function parseImage(image) {
	var stringMaxLength = 12;
	var id   = image.getAttribute('id');
	var name = image.getAttribute('name');
	if (name.length > stringMaxLength) {name = name.substr(0,stringMaxLength) + '...'};
	var src  = image.getAttribute('src')
	var preview = image.getAttribute('preview');
	var status  = image.getAttribute('status');
	var position = image.getAttribute('position');
	var transformPoint = image.getAttribute('transform_point');
	var matrix = image.getAttribute('matrix');
	var scale  = image.getAttribute('scale');
	var rotate = image.getAttribute('rotate');
	var transparency = image.getAttribute('transparency');
	var width  = image.getAttribute('width');
	var height = image.getAttribute('height');
	return {id:id, name:name, src:src, preview:preview, status:status, position:position, transformCoords:transformPoint, matrix:matrix, scale:scale, rotate:rotate, transparency:transparency, width: width, height: height};
}

function parseList(a,b,reply,obj) {
	var xmlDoc = XML.parse(reply);
	if (xmlDoc.documentElement){
		var root = xmlDoc.documentElement;
		var replyNodes = root.childNodes;
		if (replyNodes.length != 0) {
			for (var i = 0; i < replyNodes.length; i++) {
				if (replyNodes[i].nodeType == 1) {
					var imageProperties = parseImage(replyNodes[i]);
					var fileBlock = createFileBlock(imageProperties);
					addFileBlock(obj, fileBlock);
					imageProperties.fileBlock = fileBlock;
					imageProperties.object    = obj;
					imageArray[imageArray.length] = imageProperties;
				}
			}
		}
	}
	imageListBuilt = true;
}

function fileRequest(obj) {
	var url = pagePath + '/scripts/wafer_list.php';
	getUrlWithObject(url, parseList, obj);
}

function fileDeleteRequest(id) {
	var url = pagePath + '/scripts/del_wafer.php?id='+id;
	getUrlWithObject(url, deleteFileAsync, id);
}

function deleteFileAsync(a,b,reply,id) {
	if (reply == '[OK]') {
		var image = findImageById(id);
		if (image) {
			if (image.objectCollection) {
				image.objectCollection.remove();
			}
			image.object.removeChild(image.fileBlock);
		}
	}
}

function findImageById(id) {
	for (var i = 0; i < imageArray.length; i++) {
		if (imageArray[i].id == id) return imageArray[i];
	}
	return false;
}

function updateImageById(image) {
	for (var i = 0; i < imageArray.length; i++) { if (imageArray[i].id == image.id) { imageArray[i] = image; return true; } }
	return false;
}

function fileUpdateRequest(obj) {
	if (fileLoadedFromFrame) {
		var url = pagePath + '/scripts/wafer_list.php';
		getUrlWithObject(url, fileUpdate, obj);
		fileLoadedFromFrame = false;
	}
}
// ---- /work/units/wafer/wafer.js ---- 
// ==== /work/units/raphaelCanvas/raphaelCanvas.js ==== 
var canvas;
var loadInterval;
var imageDrag;
var imageCenterDrag;
var raphaelDiv;
var imageScale;
var scaleKof = 1;
var rotAlf = 0;
var tg;
var hideAllWaferHelper;
var helperDownType;
var startScale = mapController.getScale();

function matrixToString (matrix) {
	var s = '';
	for (var i = 0; i < matrix.length; i++){
		for (var j = 0; j < matrix[i].length; j++){
			s += matrix[i][j] + ',';
		}
		s = s.substring(0, s.length-1);
		s += ';';
	}
	s = s.substring(0, s.length-1);
	return s;
}

function activeWaferDiv () {
	streetDiv.style.visibility='hidden';
	raphaelDiv.style.visibility='visible';
	showHelper();
	hideAllWaferHelper = false;
}

//Initialise Canvas
function initMapAdminCanvas(obj) {
	addDragEvent(dragAll);
	var size   = getSize(obj);
	canvas = new Raphael(obj, '100%', '100%');
	canvas.centerX = Math.round(size.width  / 2);
	canvas.centerY = Math.round(size.height / 2);
	canvas.size = size;
	obj.onmousedown   = function( event ) { event = event || window.event; getTablesOffsets( event ); mouseDown(); };	
	var callback = function ( event ) { event = event || window.event; wheel( event )};
	obj.onmousedown   = function(event) {event = event || window.event; getTablesOffsets( event ); mouseDown();};
	obj.scroll = true;
	addGlobalEvents(obj, mapController);
	attachMouseScroller(obj, mouseWheel);
	loadInterval = window.setInterval(checkImagesToDisplay,100);
	addMouseUpEvent(mouseUpOnCanvas);
	addResizeEvent(scaleAll);
	addAfterMapScale(scaleAll);
	raphaelDiv = obj;
}


function checkImagesToDisplay() {	
	if (imageListBuilt && mapController) {
		window.clearInterval(loadInterval);
		loadInterval = null;
		loadAll();
	}
}

function loadAll() {
	for (var i = 0; i < imageArray.length; i++) {
		showImageOnCanvas(imageArray[i]);
		if ((hideAllWaferHelper) && (imageArray[i].status == 'show')) {
			imageArray[i].objectCollection.hide();
			imageArray[i].canvasImage.show();
		}
	}	
}

function showImageOnCanvas(image) {
	if (image.status == 'show') {
		var newImage = createCanvasImage(image);
		updateImageById(newImage);
	}	
}

function createCanvasImage(image, x, y) {
	var mapCenter = mapController.searchCenterCell();
	var ratio     = Math.pow(mapController.getStep(), mapController.getScale() - 1);
	if ((x) && (y)) {
		image.scale = 1;
		image.rotate = 0;

		var imagePosX = (x - mapCenter.x) * ratio;
		var imagePosY = (y - mapCenter.y) * ratio;
		image.position = imagePosX + ', ' + imagePosY;
		image.matrix = matrixToString([[image.scale, 0, 0], [0, image.scale, 0], [0, 0, 1]]);
	}
	image.status = 'show';
	image.startScale = image.scale;

	if (image.matrix.indexOf(';') != -1) {
		image.matrix = image.matrix.split(';');
		for (var i = 0; i < image.matrix.length; i++){
			image.matrix[i] = image.matrix[i].split(',');
		}
	}
	var centerPoint = [[0],[0],[1]];
	centerPoint = multiplyMatr(image.matrix, centerPoint);


	var position = image.position.split(', ');

	image.centerPosition = {x:mapCenter.x + (parseInt(position[0]) + centerPoint[0][0]) / ratio,
		                    y:mapCenter.y + (parseInt(position[1]) + centerPoint[1][0]) / ratio};

	image.canvasPosition = {x:mapCenter.x + (parseInt(position[0]) + centerPoint[0][0] - image.width * image.scale / 2) / ratio,
		                    y:mapCenter.y + (parseInt(position[1]) + centerPoint[1][0] - image.height* image.scale / 2) / ratio};

	image.canvasImage = canvas.image(getPagePath()+image.src, image.canvasPosition.x, image.canvasPosition.y, image.width * image.scale / ratio, image.height * image.scale / ratio);
	setImageStyle(image);
	setImageFunctions(image);
	image.objectCollection = canvas.set();
	image.objectCollectionForRotate = canvas.set();
	image.objectCollection.push(image.canvasImage);
	image.objectCollectionForRotate.push(image.canvasImage);
	addImageHelpers(image);
	image.canvasImage.node.scroll = true;
	image.objectCollectionForRotate.rotate(image.rotate, image.centerPosition.x, image.centerPosition.y);	
	return image;
}

function setImageStyle(image) {
	image.canvasImage.attr({'opacity': image.transparency});
	image.canvasImage.node.style.cursor = "move";
}

function setImageFunctions(image) {
	image.canvasImage.mousedown(function() {imageDrag = image; image.objectCollection.toFront(); blockAllDrag = dragImage;});
}

function dragImage() {
	var ratio   = Math.pow(mapController.getStep(), mapController.getScale() - 1);
	var offsetX = mousePos.x - mousePosOld.x;
	var offsetY = mousePos.y - mousePosOld.y;
	if (!imageDrag.imageNewPosition) {imageDrag.imageNewPosition = {x:0, y:0};}
	imageDrag.imageNewPosition.x += offsetX * ratio;
	imageDrag.imageNewPosition.y += offsetY * ratio;

	var iamgeCenterX = imageDrag.center.getBBox().x + imageDrag.center.getBBox().width  / 2;
	var imageCenterY = imageDrag.center.getBBox().y + imageDrag.center.getBBox().height / 2;	
	imageDrag.objectCollectionForRotate.rotate(imageDrag.rotate, iamgeCenterX, imageCenterY);
	var transformCenterX = imageDrag.transformCenter.getBBox().x + imageDrag.transformCenter.getBBox().width  / 2;
	var transformCenterY = imageDrag.transformCenter.getBBox().y + imageDrag.transformCenter.getBBox().height / 2;
	imageDrag.transformCenter.rotate(imageDrag.rotate, transformCenterX, transformCenterY);

	imageDrag.objectCollection.translate(offsetX, offsetY);
}

function dragImageCenter() {
	var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);
	imageCenterDrag.offsetX += (mousePos.x - mousePosOld.x) * ratio;
	imageCenterDrag.offsetY += (mousePos.y - mousePosOld.y) * ratio;

	var iamgeCenterX = imageCenterDrag.image.transformCenter.getBBox().x + imageCenterDrag.image.transformCenter.getBBox().width  / 2;
	var imageCenterY = imageCenterDrag.image.transformCenter.getBBox().y + imageCenterDrag.image.transformCenter.getBBox().height / 2;
	imageCenterDrag.rotate(0, iamgeCenterX, imageCenterY);

	imageCenterDrag.translate(mousePos.x - mousePosOld.x, mousePos.y - mousePosOld.y);
}

function stopImageCenterDrag() {
	var image = imageCenterDrag.image;
	var translateMatrix = [[1, 0, -imageCenterDrag.offsetX], [0, 1, -imageCenterDrag.offsetY], [0, 0, 1]]

	var position = image.position.split(', ');
	var ofsetX = parseInt(position[0]) + imageCenterDrag.offsetX;
	var ofsetY = parseInt(position[1]) + imageCenterDrag.offsetY;
	image.matrix = multiplyMatr(translateMatrix, image.matrix);
	updateImageById(image);

	changeImageInBase(imageCenterDrag.image.id, {matrix: matrixToString(image.matrix), position: ofsetX + ', ' + ofsetY});
	imageCenterDrag.offsetX = 0;
	imageCenterDrag.offsetY = 0;
}

function changeImageCoordinates() {
	blockAllDrag = false; 
	var position = imageDrag.position.split(', ');
	var imageNewPositionX = parseInt(position[0]) + imageDrag.imageNewPosition.x;
	var imageNewPositionY = parseInt(position[1]) + imageDrag.imageNewPosition.y;
	imageDrag.imageNewPosition = {x: 0, y: 0};
	var id = imageDrag.id;
	imageDrag.position = imageNewPositionX + ', ' + imageNewPositionY;
	updateImageById(imageDrag);
	changeImageInBase(imageDrag.id, {position: imageDrag.position});
	imageDrag = null;
}

//DATABASE
function changeImageInBase(id, data) {
	var url = pagePath + '/scripts/change_wafer.php?id='+id;
	if (data.name) {url = url + '&name=' + data.name}
	if (data.status) {url = url + '&status=' + data.status}
	if (data.position) {url = url + '&position=' + data.position}
	if (data.transform_point) {url = url + '&transform_point=' + data.transform_point}
	if (data.matrix) {url = url + '&matrix=' + data.matrix}
	if (data.transparency) {url = url + '&transparency=' + data.transparency}
	if (data.width) {url = url + '&width=' + data.width}
	if (data.height) {url = url + '&height=' + data.height}
	if (data.scale) {url = url + '&scale=' + data.scale}
	if (data.rotate) {url = url + '&rotate=' + data.rotate}
	getUrlWithObject(url, changeImageData, id);
}

function changeImageData(a,b,reply,id) {
}

function dragAll() {
	if (goDrag) {
		scaleAll();
	}
}

function scaleAll() {	
	for (var i = 0; i < imageArray.length; i++) {		
		if (imageArray[i].status == 'show') {
		//	myLog(imageArray[i].name);
			imageArray[i].objectCollection.remove();			
			imageArray[i].matrix = matrixToString(imageArray[i].matrix);
			showImageOnCanvas(imageArray[i])
			if ((hideAllWaferHelper) && (imageArray[i].status == 'show')) {
				imageArray[i].objectCollection.hide();
				imageArray[i].canvasImage.show();
			}
		}		
	}
}

//VIEW
function hideImage(image) {
	var imageToHide = findImageById(image.id);
	if (imageToHide.objectCollection) {
		imageToHide.objectCollection.remove();
	}
	imageToHide.status = 'hide';
	updateImageById(imageToHide);
	changeImageInBase(imageToHide.id,{status:'hide'});
}

function showImage(image) {	
	var imageToShow = createCanvasImage(image);	
	updateImageById(imageToShow);
	changeImageInBase(imageToShow.id,{status:'show'});
}

function placeImage(image) {
	image = createCanvasImage(image, canvas.centerX + 155, canvas.centerY);
	updateImageById(image);
	changeImageInBase(image.id,{status:'show', position: image.position, scale: image.scale, matrix: matrixToString(image.matrix)});
}

function addImageHelpers(image) {
	var ratio = Math.pow(mapController.getStep(), mapController.getScale() - 1);
	var transformPosition = image.position.split(', ');
	image.transformCenter = createImageRegistrationCenter(transformPosition[0] /ratio, transformPosition[1]/ratio, image);
	image.objectCollection.push(image.transformCenter);

	var position = {x:image.canvasPosition.x, y:image.canvasPosition.y, width: image.width * image.scale / ratio, height: image.height * image.scale / ratio};
	var helperWidth = 8;
	image.objectCollection.push(image.t  = createImageScaleHelper(position, helperWidth, image, 't'));
	image.objectCollection.push(image.b  = createImageScaleHelper(position, helperWidth, image, 'b'));
	image.objectCollection.push(image.l  = createImageScaleHelper(position, helperWidth, image, 'l'));
	image.objectCollection.push(image.r  = createImageScaleHelper(position, helperWidth, image, 'r'));
	image.objectCollection.push(image.tl = createImageScaleHelper(position, helperWidth, image, 'tl'));
	image.objectCollection.push(image.tr = createImageScaleHelper(position, helperWidth, image, 'tr'));
	image.objectCollection.push(image.bl = createImageScaleHelper(position, helperWidth, image, 'bl'));
	image.objectCollection.push(image.br = createImageScaleHelper(position, helperWidth, image, 'br'));
	image.objectCollectionForRotate.push(image.t);image.objectCollectionForRotate.push(image.b);
	image.objectCollectionForRotate.push(image.l);image.objectCollectionForRotate.push(image.r);
	image.objectCollectionForRotate.push(image.tl);image.objectCollectionForRotate.push(image.tr);
	image.objectCollectionForRotate.push(image.bl);image.objectCollectionForRotate.push(image.br);


}

function setHelperStyle(helper) {helper.attr({fill: '#9cf', 'opacity':1});}

function createImageRegistrationCenter(x, y, image) {
	var mapCenter 	  = mapController.searchCenterCell();

	image.center =  canvas.circle(image.centerPosition.x, image.centerPosition.y,1);
	image.objectCollection.push(image.center);
	image.objectCollectionForRotate.push(image.center);
	var registrationCenter = canvas.circle(image.centerPosition.x, image.centerPosition.y,1);
	//var registrationCenter = canvas.circle(mapCenter.x + x,
	//                                       mapCenter.y + y,1).attr({fill: '#9cf', stroke: '#000', 'stroke-width': 1});
	registrationCenter.image = image;
	registrationCenter.node.style.cursor = "pointer";
	registrationCenter.mousedown(function() {imageCenterDrag = this; imageCenterDrag.offsetX = 0;imageCenterDrag.offsetY = 0; blockAllDrag = dragImageCenter;});
	registrationCenter.mouseup(stopImageCenterDrag);
	return registrationCenter;
}

function createImageScaleHelper(position, width, image, type) {
	switch (type) {
		case 't' : var helper = canvas.rect(position.x, position.y - width,position.width, width); var cursor = "n-resize"; break;
		case 'b' : var helper = canvas.rect(position.x, parseInt(position.height) + parseInt(position.y), position.width, width); var cursor = "s-resize"; break;
		case 'l' : var helper = canvas.rect(position.x - width, position.y, width, position.height); var cursor = "w-resize"; break;
		case 'r' : var helper = canvas.rect(parseInt(position.x) + parseInt(position.width), position.y, width, position.height); var cursor = "e-resize"; break;
		case 'tl' : var helper = canvas.rect(position.x - width, position.y - width, width, width); var cursor = "nw-resize"; break;
		case 'tr' : var helper = canvas.rect(parseInt(position.x) + parseInt(position.width), position.y - width, width, width); var cursor = "ne-resize"; break;
		case 'bl' : var helper = canvas.rect(position.x - width, parseInt(position.y) + parseInt(position.height), width, width); var cursor = "sw-resize"; break;
		case 'br' : var helper = canvas.rect(parseInt(position.x) + parseInt(position.width), parseInt(position.y) + parseInt(position.height), width, width); var cursor = "se-resize"; break;
	}
	setHelperStyle(helper);
	helper.node.style.cursor = cursor;
	helper.image = image;	
	helper.mousedown(function() {imageNewPosition = {x:0, y:0};
	                             imageScale = this.image;
								 helperDownType = type;
								 imageScale.startCoords = mousePos;
								 imageScale.direction = type;
								 blockAllDrag = scaleImageMath;
								 var transformCenterX = imageScale.transformCenter.getBBox().x + imageScale.transformCenter.getBBox().width  / 2;
								 var transformCenterY = imageScale.transformCenter.getBBox().y + imageScale.transformCenter.getBBox().height / 2;
							     tg = (mousePos.y - transformCenterY) / (mousePos.x - transformCenterX)});
	return helper;
}

function scaleImageMath() {

	var offsetX = mousePos.x - mousePosOld.x;
	var offsetY = mousePos.y - mousePosOld.y;
	
	imageNewPosition.x += offsetX;
	imageNewPosition.y += offsetY;

	var transformCenterX = imageScale.transformCenter.getBBox().x + imageScale.transformCenter.getBBox().width  / 2;
	var transformCenterY = imageScale.transformCenter.getBBox().y + imageScale.transformCenter.getBBox().height / 2;
	var b = Math.sqrt((imageScale.startCoords.x - transformCenterX) * (imageScale.startCoords.x - transformCenterX) +
		              (imageScale.startCoords.y - transformCenterY) * (imageScale.startCoords.y - transformCenterY));
	var c = Math.sqrt((imageScale.startCoords.x + imageNewPosition.x - transformCenterX) * (imageScale.startCoords.x + imageNewPosition.x - transformCenterX) +
		               (imageScale.startCoords.y + imageNewPosition.y - transformCenterY) * (imageScale.startCoords.y + imageNewPosition.y - transformCenterY));
	var a = Math.sqrt((imageNewPosition.x) * (imageNewPosition.x) +
		               (imageNewPosition.y) * (imageNewPosition.y));

	var cosa = (b*b + c*c - a*a)/(2*b*c);
	var dx = (imageScale.startCoords.x + imageNewPosition.x - transformCenterX);
	var dy = (imageScale.startCoords.y + imageNewPosition.y - transformCenterY);
	var tgn = dy/dx
	var alfa;
	if (((tgn - tg) * dx *  (imageScale.startCoords.x-transformCenterX)) <= 0)  {
		alfa = 360 - Math.acos(cosa)/Math.PI*180;
	}else {
		alfa = Math.acos(cosa)/Math.PI*180;
	}

//var alfa =  Math.acos(cosa)/Math.PI*180;
	if ((helperDownType == 't') ||
		(helperDownType == 'b') ||
		(helperDownType == 'l') ||
		(helperDownType == 'r'))
	{
		scaleImage(c/b, transformCenterX, transformCenterY);
	} else {
		rotateImage(alfa, transformCenterX, transformCenterY);
	}
}

function rotateImage(alfa, xc, yc) {	
	rotAlf = alfa;
	imageScale.objectCollectionForRotate.rotate(parseInt(imageScale.rotate) + alfa, xc, yc);
	imageScale.newScale = imageScale.startScale
}

function scaleImage(k, xc, yc) {
	var iamgeCenterX = imageScale.center.getBBox().x + imageScale.center.getBBox().width  / 2;
	var imageCenterY = imageScale.center.getBBox().y + imageScale.center.getBBox().height / 2;
	imageScale.objectCollectionForRotate.rotate(imageScale.rotate, iamgeCenterX, imageCenterY);
	scaleKof = k;
	k = imageScale.scale * k / imageScale.startScale;
	imageScale.newScale = k * imageScale.startScale;
	imageScale.objectCollection.scale(k, k, xc, yc);
	rotAlf = 0;
}

function mouseUpOnCanvas() {
	blockAllDrag = false;
	if (imageScale) {
		imageScale.scale = imageScale.newScale;
		imageScale.rotate = parseInt(imageScale.rotate) + rotAlf;
		if (imageScale.rotate > 360) {imageScale.rotate -= 360}
		var alfa = imageScale.rotate*Math.PI/180;
		var transformCenter = {x: imageScale.transformCenter.getBBox().x + imageScale.transformCenter.getBBox().width  / 2,
			                   y: imageScale.transformCenter.getBBox().y + imageScale.transformCenter.getBBox().height / 2};

		var imageCenter = {x: imageScale.center.getBBox().x + imageScale.center.getBBox().width  / 2,
			               y: imageScale.center.getBBox().y + imageScale.center.getBBox().height / 2};
		var c = Math.cos(alfa), s = Math.sin(alfa);
		var position = {x: transformCenter.x - imageCenter.x, y:transformCenter.y - imageCenter.y};
		var matrix = multiplyMatr([[scaleKof, 0, 0], [0, scaleKof, 0], [0, 0, 1]], [[1, 0, -position.x], [0, 1, -position.y], [0, 0, 1]]);
			matrix = multiplyMatr([[c, -s, 0], [s, c, 0], [0, 0, 1]], matrix);
			matrix = multiplyMatr([[1, 0, position.x], [0, 1, position.y], [0, 0, 1]], matrix);
		imageScale.matrix = multiplyMatr(matrix, imageScale.matrix);
		imageScale.matrix = matrixToString(imageScale.matrix);

		changeImageInBase(imageScale.id, {matrix: imageScale.matrix, scale: imageScale.scale, rotate: imageScale.rotate})
		imageScale.objectCollection.remove();
		imageScale = createCanvasImage(imageScale);
		updateImageById(imageScale);
		imageScale = null;
	}
	if (imageDrag) {
		changeImageCoordinates();
	}
}
// ---- /work/units/raphaelCanvas/raphaelCanvas.js ---- 
// ==== /work/units/navigator_finder/navigator_finder.js ==== 
var	rootNavigator, rootNavigatorHTML,
	helpNavigatorFirm,
	helpNavigatorStreet,
	rootNavigatorRealty, globalRealtyHelp, helpNavigatorRealty, rootRealty = 8178, treeArray  = Array(),//Дерево недвижимости
	rootNavigatorJob, globalJobHelp, rootJobId = 49106,//дерево вакансий
	rootNavigatorDiscount, globalDiscountHelp,//дерево акция и скидок
	relaxRootNavigator,//дерево отдыха
	rootNavigatorEvent,globalEventHelp, globalEvent,//дерево событий
	rootOutdoorAdvertising, globalAdvertisingHelp, helpNavigatorAdvertising, //дерево наружной рекламы
	rootAdvertising = 48130;//Корень дерева наружной рекламы(пишем такой же ID корня как и созданный в БД)
var syear, smonth, sday, pyear, pmonth, pday, globalHelpers = new Array();
var globalAllTree = new Array(); //Массив для деревьев - групп с одинаковыми названиями(нужен для принудительной очистки через оющую функцию "снять всё")
var greentreeId; //сохраняются ИД объектов дерева зелёного
var globalObjectId;
var testAr = new Array();
//Создаем порождающую фабрику объектов (ФАБРИЧНУЮ ФУНКЦИЮ БЛИН!!!), имеющих древовидную структуру
function treeFactory(id, root, parent, helper, params, adminMode) {
	//Определяем приватную переменную переменную domRoot, содержащую корень текущего дерева
	var domRoot   = root,
		header    = params.headerNode || false,
		outerRoot = params.outerRoot  || false,
		//Определяем глобальную переменную
		result  = {
			getAdminMode : function() {return adminMode || false;},
			clickAction  : false,
			deleted      : false,
			getId        : function() {return id;},
			getRoot      : function() {return domRoot;},
			getHeader    : function() {return header;},
			getHelper    : function() {return helper;},
			getOuterRoot : function() {return outerRoot;},
			outerHTML    : null,
			getOuterHTML : function()     {return this.outerHTML;},
			setOuterHTML : function(html) {if (this.outerHTML) {this.outerHTML += html;} else {this.outerHTML = html;}},
			addChild   : function(id, child) {this.children[id] = child;},
			getChild   : function(id) {if (this.children[id]) {return this.children[id];} else {return false;}},
			displayMe  : function() {
				if (this.name) {
					if (this.type) {
						this[this.type + 'Visual']();
					}
				}
			},
			createAdminNodeHeader: function() {
				if(params.stat){															 // AdminNodeHeader для дерева статистики в админке
					var header = document.createElement('NOBR'),
					NameCategory = document.createElement('SPAN'),
					buttonIp = document.createElement('INPUT');
					buttonIp.value = "Статистика по IP";
					buttonIp.type = 'button';
					buttonIp.parent = this;
					buttonIp.onclick = function () {
						getUrl('/scripts/review_ip.php?id='+id, reviewIpFunc);
					};
					NameCategory.innerHTML = this.name;
					header.appendChild(NameCategory);
					header.appendChild(buttonIp);
					return header;
				}else if(params.vip){
					var header = document.createElement('NOBR'),
					NameCategory = document.createElement('SPAN'),
					nbsp         = document.createElement('SPAN'),
					buttonVip = document.createElement('INPUT');
					nbsp.innerHTML = '&nbsp;&nbsp;';
					buttonVip.value = "VIP";
					buttonVip.type = 'button';
					buttonVip.parent = this;
					buttonVip.onclick = function () {
						getUrl('/scripts/edit_vip.php?id='+id, editVip);
					};
					NameCategory.innerHTML = this.name;
					header.appendChild(NameCategory);
					if(buttonVip.parent.lid){
						header.appendChild(nbsp);
						header.appendChild(buttonVip);
					}
					return header;
				//Для наружной рекламы
				} else if(params.advertising){
						return nodeHeaderToAdvertising(this);
				} else if(params.estate){
					// AdminNodeHeader для дерева недвижимости в админке
					return nodeHeaderToRealty(this);
				} else if(params.Job){
					//Для дерева вакансий в админке
					return nodeHeaderToJob(this);
				} else if(params.addJob){
					//Для добавления вакансий к организациям
					return addJobToOrganization(this);
				} else if(params.sectionСatalog){
          //Для выбора раздела каталога
					return selectSectionСatalog(this);
        } else {
					header = document.createElement('NOBR');
					var delButton = document.createElement('IMG'),
						input = document.createElement('INPUT'),
						keywords = document.createElement('INPUT'),
						editLabel = document.createElement('INPUT'),
						button = document.createElement('INPUT');

					input.value = this.name;
					input.onclick = dummy;
					delButton.src = '/images/denied.gif';
					delButton.parent = this;
					delButton.onclick = function () {
						this.parent.deleteMe();
					}
					this.editor = input;
					button.value = "Добавить метку";
					button.type = 'button';
					button.parent = this;
					button.onclick = function () {
						//addLabel(this.parent.getId(),this.parent.typeId);
            selectTypeContact(this.parent.getId());
					};
					this.editor = keywords;
					keywords.value = "Ключевые слова";
					keywords.type = 'button';
					keywords.parent = this;
					keywords.onclick = function () {
						 getUrl('/scripts/keywords.htm?id='+this.parent.getId(), showDiv);
					};
					this.editor = editLabel;
					editLabel.value = "Редактировать";
					editLabel.type = 'button';
					editLabel.parent = this;
					editLabel.onclick = function () {
						if(this.parent.lid){
							getUrl('/scripts/dataHelper.html?id='+this.parent.lid+'&object_id='+this.parent.getId(), editLabelinAdmin);
						}
					};

					this.editor = input;
					header.appendChild(input);
					header.appendChild(delButton);
					if(button.parent.lid == false){
						header.appendChild(button);
					}
					header.appendChild(keywords);
					if(editLabel.parent.lid != false){
						header.appendChild(editLabel);
					}
					return header;
				}
			},
			showOpenedNode : function(openScript) {
				var li = document.createElement('LI'),
					expand    = document.createElement('DIV'),
					content   = document.createElement('DIV'),
					container = document.createElement('UL'),
					leaf      = document.createElement('DIV'),
					num       = document.createElement('SPAN'),
          selector  = document.createElement('INPUT'),
					header;
          selector.type = 'checkbox';
          selector.className = 'SelectorButton';
          selector.style.display = 'none';
				if (this.getAdminMode()) {
					header = this.createAdminNodeHeader(); //возвращает header с элементами управления деревом (кнопками инпутами и тд)
				}else {
					header = document.createElement('SPAN');
					header.innerHTML  = this.name;
				}
				container.className = "Container";
				expand.className    = "Expand";
				if (this.logoIco) {
					var img = document.createElement('img');
					img.src = this.logoIco;
					expand.appendChild(img);
					expand.style.backgroundImage = 'none';
				}
				leaf.className = "leaf";
				if (this.parent.parent == null ) {
					header.className  = "header";
					content.className = "Content";
					leaf.style.backgroundImage = 'none';
				} else {
					content.className = "subTree";
					header.className  = "subHeader";
				}
				if(params.stat){
						if(document.getElementById('syear')){
							syear = document.getElementById('syear').value;
						}else{
							syear = '';
						}
						if(document.getElementById('smonth')){
							smonth = document.getElementById('smonth').value;
						}else{
							smonth = '';
						}
						if(document.getElementById('sday')){
							sday = document.getElementById('sday').value;
						}else{
							sday = '';
						}
						if(document.getElementById('eyear')){
							pyear = document.getElementById('eyear').value;
						}else{
							pyear = '';
						}
						if(document.getElementById('emonth')){
							pmonth = document.getElementById('emonth').value;
						}else{
							pmonth = '';
						}
						if(document.getElementById('eday')){
							pday = document.getElementById('eday').value;
						}else{
							pday = '';
						}
						getUrlWithObject('/scripts/review_statistic.php?id='+id+'&syear='+syear+'&smonth='+smonth+'&sday='+sday+'&eyear='+pyear+'&emonth='+pmonth+'&eday='+pday, reviewStatForObject, num);
					}
					if (params.estate && params.lid){
						expand.className = '';
						content.className = 'contentEst';
					}
					//Скрывает плюсики у листьев
					if (params.advertising && this.parent.getId() != rootAdvertising){
						expand.className = '';
						content.className = 'contentEst';
					}
					//Скрывает плюсики у меток каталога, предназначенного для выбора организаций
					if (params.addJob && this.lid && params.child_count == 0){
						expand.className = '';
						content.className = 'contentEst';
					}
          //Скрывает плюсики у листьев дерева вакансий
          if (params.Job && this.lid){
						expand.className = '';
						content.className = 'contentEst';
					}
          //Скрывает плюсики у разделов каталога предназдаченного для выбора раздела зелёного
          if(params.sectionСatalog && this.parent.getId() != 1){
            expand.className = '';
						content.className = 'contentEst';
          }
				content.appendChild(num);
				content.appendChild(header);
				li.className = "Node ExpandClosed";
				li.appendChild(leaf);
        //Добавляем атрибут ID(нужен для раскрытия каталога через сообщения зелёного чувака)
        expand.setAttribute('id', id);
				this.expand = expand;
				this.opennedScript = openScript;
				li.appendChild(expand);
				li.appendChild(content);
       

				li.appendChild(container);
				li.parent = this;
        //Если это группа с одинаковыми названиями, то добавляем selectorButton'ы
//         if(openScript == 'object_group.php'){
//          container.appendChild(selector);
//          li.parent.selector = selector;
//          this.addCheckbox(selector);
//           addSelButton(container, this);
//        }

        
				this.outerHTML = li;
				this.setChildRoot(container);
				return li;
			},
			treeVisual : function() {
				var rootElement = this.getRoot();
				rootElement.appendChild(this.showOpenedNode('object_list.php'));
			},
			listVisual : function() {
				var rootElement = this.getOuterRoot(),
					li = document.createElement('LI'),
					expand    = document.createElement('DIV'),
					content   = document.createElement('DIV'),
					leaf      = document.createElement('DIV'),
					header    = document.createElement('SPAN');
			if (this.child_count > 1) {
					var node = this.showOpenedNode('object_group.php');
          leaf.className = "leafCheck";
          rootElement.appendChild(node);
			} else {
					expand.className  = "leaf";
					content.className = "SelectorButton";
					//content.tree = this;
					this.addCheckbox(content);
          header.className = "SelectorButton ListHead";
					header.tree = this;
          header.link = true;
					header.innerHTML = this.name;
          header.style.cursor = "pointer";
					if (this.getId() == 0) {this.selector.disabled = true;content.style.cursor = 'auto';}
					content.appendChild(header);
					li.className = "Node ExpandLeaf";
					li.appendChild(expand);
					li.appendChild(content);
					li.parent = this;
					rootElement.appendChild(li);
					this.setOuterHTML(li);
				}
			}
      ,
			geoObjectVisual : function () {
				this.listVisual();
			},
			labelVisual : function () {
				this.listVisual();
			},
			addCheckbox: function(rootElement) {
					var checkbox = document.createElement('INPUT');
					checkbox.type = 'checkbox';
					checkbox.className = 'SelectorButton';
					rootElement.appendChild(checkbox);
					checkbox.tree = this;
          checkbox.check = true;
					if (this.getStatus()) {checkbox.checked = "checked";}
					this.selector = checkbox;
				},
			children   : {},
			parent     : parent,
			childRoot  : domRoot,
			listsId		: {},
			getChildRoot : function() {return this.childRoot;},
			getOuterChildRoot : function() {return this.outerChildRoot;},
			setChildRoot : function(newRoot) {this.childRoot = newRoot;},
			selected     : false,
			selector     : null,
			getStatus    : function() {return this.selected;},
			invertStatus : function() {this.selected = !this.selected;},
			setStatus    : function(status) {this.selected = status;},
			selectSubtrees : function() {
				for (var i in this.children) {
					this.children[i].selectMe();
					this.children[i].selectSubtrees();
				}
			},
			deselectSubtrees : function() {
				for (var i in this.children) {
					this.children[i].deselectMe();
					this.children[i].deselectSubtrees();
				}
			},
			deleteMe : function() {
				this.parent.getChildRoot().removeChild(this.getOuterHTML());
				var url = '/scripts/delete_object.php?id=' + this.getId();
				getUrl(url, function () {});
			},
			deleteOuterNods : function() {
            for (var i in this.children) {

            if (this.children[i].getOuterHTML()) {
              if (this.children[i].deleted.toString() == 'false') {
                this.children[i].deleted = true;
                var root   = this.children[i].getOuterRoot(),
                  header = this.children[i].getHeader();
                if (root) {
                  root.removeChild(this.children[i].getOuterHTML());
                }
                if (header) {
                  root.removeChild(header);
                  root.removeChild(this.selector);
                }
                 
                // Создание группы отмеченных меток (удаление производится функцией unselectGroup). Сдесь не переходят в отмеченные метки в группах хелпера(this.children[i].type != 'label')
                if ((this.children[i].getStatus().toString() == 'true') && (this.children[i].type != 'tree')) {
                 
                    this.getHelper().selectedGroup.appendChild(this.children[i].getOuterHTML());
                    if (this.children[i].selector) {
                      this.children[i].selector.checked = true;
                    }
                  if(this.children[i].type != 'label'){
                      this.getHelper().selectedGroup.style.display = 'block';
                    }
                }
              }
            }
              this.children[i].deleteOuterNods();

          }
			},
			deleteAndHide : function () {
        if(this.type == 'list'){
          globalHelpers.push(this);
        }
				this.deleteOuterNods()
				if (this.getHelper().getElementsByTagName('SPAN').length == 0) {
					this.getHelper().hide();
				}
			},
			showOuterNods : function() {
				var firstElement = false;
				for (var i in this.children) {
					if (this.children[i].getOuterHTML()) {
						this.children[i].deleted = false;
						var root   = this.children[i].getOuterRoot(),
							header = this.children[i].getHeader();
							helper = this.getHelper();
						if (root) {
							if (!firstElement) {firstElement = this.children[i].getOuterHTML()}
							root.appendChild(this.children[i].getOuterHTML());
						}
						if (header) {
							root.insertBefore(this.selector, firstElement);
							root.insertBefore(header, firstElement);
						}
						if (helper.selectedGroup.getElementsByTagName('LI').length == 0) {
							helper.selectedGroup.style.display = 'none';
						}
					}
					if (this.children[i].clickAction) {
						this.children[i].showOuterNods();
					}
				}
				if ((helper.displaySave == 'none') && (helper.getElementsByTagName('LI').length != 0)) {

					helper.show();
				}
			},
			selectMe : function() {
				this.setStatus(true);
				if (this.selector) {
					this.selector.checked = "checked";
				}
			},
			deselectMe : function() {
				this.setStatus(false);
				if (this.selector) {
					this.selector.checked = "";
				}
			},
			clickSelector : function() {
				if (this.selector) {
					this.invertStatus();
					if (this.getStatus()) {if (this.selectSubtrees) {this.selectSubtrees();}} else {if (this.deselectSubtrees) {this.deselectSubtrees();}}
				}
			},
			addEditors : function() {
				if (this.getAdminMode()) {
					if(!params.stat && !params.estate && !params.vip && !params.advertising && !params.Job && !params.addJob && !params.sectionСatalog){
						var editorPannel = document.createElement('DIV'),
							editor       = document.createElement('INPUT'),
							button       = document.createElement('INPUT'),
							saveButton   = document.createElement('INPUT'),
							text         = document.createElement('SPAN'),
							fragment     = document.createDocumentFragment(),
							childRoot    = this.childRoot,
							tree         = this,
							firstChild   = childRoot.childNodes[0];
						editorPannel.className = 'navigatorEditor';
						button.type      = 'button';
						button.value     = 'добавить';
						button.className = 'button';
						saveButton.type  = 'button';
						saveButton.value = 'Сохранить';
						saveButton.className = 'button';
						text.innerHTML   = 'Добавить раздел';
						editorPannel.appendChild(editor);
						editorPannel.appendChild(button);
						childRoot.insertBefore(editorPannel, firstChild);
						childRoot.insertBefore(saveButton, null);
						button.onclick = function() {
							var url = ['/scripts/add_object.php?parent_id=', tree.getId(), '&name=', editor.value, '&type_id=', tree.typeId].join('');
							getUrlWithObject(url, insertChild, {tree:tree, editor:editor, childRoot:childRoot, fragment:fragment});
						};
						saveButton.onclick = function() {
							for (var i in tree.children) {
								if (tree.children[i].editor) {
									tree.children[i].name = tree.children[i].editor.value;
									var url = ['/scripts/edit_object.php?id=', i, '&name=', tree.children[i].editor.value].join('');
									getUrlWithObject(url, function () {});
								}
							}
						};
					// условие при выполнение которого отображается кнопка "добавить объект" в дереве недвижимости
					}else if (params.estate && !params.lid &&  this.getId() &&
										this.getId() != 48137 && this.getId() != 48138 && this.getId() != 48139 && this.getId() != 48151){
						addEditorsToRealty(this);
					} else if (params.advertising && this.getId() != rootAdvertising){
						addEditorsToAdvertising(this);
					// условие при выполнение которого отображается кнопка "добавить вакансию в рубрику" в дереве вкансий
          } else if (params.Job){
            addEditorsToJob(this, params.labels, params.child_count);
					}
				}
			}
		};
		for (var i in params) {if (!result[i]) {result[i] = params[i];}}
		result.displayMe();
	return result;
}

function createPrimaryNodes(object) {
	var primaryContainer = document.createElement('UL');
	primaryContainer.className = "Container FirstContainer";
	primaryContainer.container = primaryContainer;
	object.appendChild(primaryContainer);
	return primaryContainer;
}

function removeLoading(senderNode, interval) {
	window.clearInterval(interval);
	if (isClass(senderNode, 'ExpandLoading')) {
		var expression =  /(^|\s)(ExpandLoading)(\s|$)/;
		senderNode.className = senderNode.className.replace(expression, '$1' + 'ExpandOpen' + '$3');
		if ((senderNode.parent) && (senderNode.parent.color)){senderNode.childNodes[2].style.backgroundColor = senderNode.parent.color;}
	}
}

function parseTreeListNode(node, tree) {
	if (tree) {
		var id   = node.getAttribute('id'),
			lid   = node.getAttribute('lid') || false,
			address   = node.getAttribute('address') || false,
			name = node.getAttribute('name'),
      labels = node.getAttribute('labels'),
      child_count = node.getAttribute('child_count'),
			logoIco = node.getAttribute('logoIco') || false,
			color = node.getAttribute('color') || false;
      tree.addChild(id, treeFactory(id, tree.getChildRoot(), tree, tree.getHelper(), {name: name, address:address, type: 'tree',  logoIco: logoIco, color: color, selected: tree.getStatus(), unit:tree.unit, stat:tree.stat, vip:tree.vip, advertising:tree.advertising, Job:tree.Job, sectionСatalog: tree.sectionСatalog, addJob:tree.addJob, estate:tree.estate, typeId:tree.typeId, lid: lid, labels: labels, child_count: child_count}, tree.getAdminMode()));
	}
}

function parseObjectNode(node, tree, header, subHeader, outerRoot) {
	var helper = tree.getHelper() || globalCatalogHelp;
	if (tree) {
		var id   = node.getAttribute('id'),
      lid =  node.getAttribute('lid'),
			name = node.getAttribute('name'),
			labels = node.getAttribute('labels'),
      child_count = node.getAttribute('child_count'),
			buttons    = document.createElement('SPAN'),
			closeButton = document.createElement('IMG'),
			nameHeader = document.createElement('SPAN'),
			nameSubHeader,
			logoIco = node.getAttribute('logoIco') || false,
			type = node.tagName,
			label = false;
			closeButton.src = "/images/closeCategory.png";
			closeButton.className = "closeCategory"
			closeButton.onclick = function () {
      tree.deleteAndHide();
			tree.outerHTML.className = "Node ExpandClosed";
			//При закрытии на крестик не забываем удалить vip метки(если они есть)
			Carusel(tree.outerHTML,tree.getId());
        tree.clickAction = false;
			}

		switch (type) {
			case 'street':type = 'geoObject';break;
			case 'label':
				type = 'label';
				label = createLabel(node);
				name = name + '<br/><i>' + node.getAttribute('address') + '</i>';
				break;
			default:type = 'list';break;
		}

		if (accordionHelps) {
			var place     = helper;
			if (place.style.display == 'none') {
				place.show();
				place.onclick = function() {treeToggle(arguments[0]);};
			}
			var container = outerRoot,
				span = false;
			if (header) {
				tree.addCheckbox(container);
				tree.selector.style.display = "none";
				addSelButton(buttons, tree);

				if (id == 0) {
					tree.selector.disabled = true;
					tree.selector.style.display = 'none';//где-то ручками назначается стиль ,поэтому данная фича -НЕ РАБОТАЕТ!
//					tree.style.display = 'none';
				}
				span = document.createElement('SPAN');
				span.appendChild(buttons);
				nameHeader.innerHTML = '<br/>' + tree.name;
				span.appendChild(nameHeader);

				span.appendChild(closeButton);
				span.className = 'header';
				container.appendChild(span);

				if (0&&subHeader) { // убрано!
					nameSubHeader = document.createElement('SPAN');
					nameSubHeader.innerHTML = '<br/>' + subHeader;
					nameSubHeader.className = 'subHeader';
					container.appendChild(nameSubHeader);
				}


				place.insertBefore(container, tree.getHelper().selectedGroup.nextSibling);
			} else if (0&&subHeader) {
				nameSubHeader = document.createElement('SPAN');
				nameSubHeader.innerHTML = '<br/>' + subHeader;
				nameSubHeader.className = 'subHeader';
				helper.getElementsByTagName('UL')[0].appendChild(nameSubHeader);
			}
			tree.addChild(id, treeFactory(id, tree.getChildRoot(), tree, tree.getHelper(), {name: name, type: type, logoIco: logoIco, selected: tree.getStatus(), headerNode: span, outerRoot: container, unit: tree.unit, labels:labels, label:label, lid: lid, child_count: child_count}, tree.getAdminMode()));
		}
	}
}

function addSelButton(header, tree) {
	var	selAll = document.createElement('a'),
		deselAll = document.createElement('a');
  var className = 'link';
   if(tree.type == 'list'){
      className = 'group';
    }
	if (tree != helpNavigatorStreet) {
		selAll.innerHTML = 'отметить&nbsp;все';
		selAll.href = '#';
		selAll.className = className;
		selAll.onclick = function () {
      //Если это группа с одинаковыми названеиями меток, добавляем это дерево в глобальный массив
      if(tree.type == 'list'){
        globalAllTree.push(tree);
      }
			tree.selected = false;
			tree.selector.click();
			tree.selector.checked = true;
			return false;
		};
		header.appendChild(selAll);
	}
	deselAll.href = '#';
	deselAll.innerHTML = 'снять&nbsp;всe';
	deselAll.className = className;
	deselAll.onclick = function () {
    //При клике по очистке основного дерева - очищаем все деревья из глобального массива
    if(tree.type == 'tree'){
      if(globalAllTree.length > 0){
          for(var x = 0; x < globalAllTree.length; x++){
          globalAllTree[x].selected = true;
          globalAllTree[x].selector.click();
          globalAllTree[x].selector.checked = false;
          for (var i in globalAllTree[x].children) {
            hideObjectLabels(i);
            delStreetHint(i);
          }
          clearLabelUrl();
        }
      }
      //Чистим массив
      globalAllTree.length = 0;
    }
		tree.selected = true;
		tree.selector.click();
		tree.selector.checked = false;
		for (var i in tree.children) {
			hideObjectLabels(i);
			delStreetHint(i);
		}
		clearLabelUrl();
		return false;
	};
	header.appendChild(deselAll);

	if ((tree == helpNavigatorStreet) || (tree == helpNavigatorFirm)) {
		var releas = document.createElement('a');
		releas.href = '#';
		releas.innerHTML = '<br/>очистить&nbsp;результаты';
		releas.className = 'link';
		releas.onclick = function () {
			tree.selected = true;
			tree.selector.click();
			tree.selector.checked = false;
			tree.deleteAndHide();
			for (var i in tree.children) {
				hideObjectLabels(i);
				delStreetHint(i);
			}
			clearLabelUrl();
			return false;
		};
		header.appendChild(releas)
	}
}

function parseTreeList(a, b, reply, params) {
	var rootTree  = params.tree, senderNode = params.node,
		firstList =  false,
		subHeader = false,
		rootObject = false;
	if (params.free) {
		params.searchForm.button.load++;
		rootTree.deleteAndHide();
		for (var i in rootTree.children) {delete rootTree.children[i];}
		rootTree.selected = false;
	}
	if (rootTree) {
		var xmlDoc = XML.parse(reply),
			root = xmlDoc.documentElement || false;
		if (root) {
			var childNodes = root.childNodes;
			for (var i = 0; i < childNodes.length; i++) {
				if (childNodes[i].nodeType == 1) {
					if (childNodes[i].nodeName == 'list') {parseTreeListNode(childNodes[i], rootTree);}
					if (childNodes[i].nodeName == 'label') {parseObjectNode(childNodes[i], rootTree, false, false, rootTree.childRoot);}
					if ( childNodes[i].nodeName == 'groupLabel') {
						subHeader = childNodes[i].getAttribute('name');
					}
					if ((childNodes[i].nodeName == 'mapObject')||(childNodes[i].nodeName == 'street')
						) {
						if (!firstList) {
							firstList = true;
							rootObject = document.createElement('UL');
							rootObject.style.marginBottom = '13px';
							rootObject.style.margin = '0px';
							rootObject.style.padding = '0px';
							parseObjectNode(childNodes[i], rootTree, firstList, subHeader, rootObject);
						} else {
							parseObjectNode(childNodes[i], rootTree, false, subHeader,rootObject);
						}
						subHeader = false;
					}
				}
			}
		}
		params.tree.addEditors();
		if (senderNode) {var interval = window.setInterval(function() {removeLoading(senderNode, interval);}, 500);}

		if ((params.free) && (params.searchForm.button.load == 1)) {var timeout = window.setInterval(function() {params.searchForm.removeSearchLoading(timeout);}, 500);}
	}
}

function getList(tree, id, node, adminMode) {
	adminMode = adminMode || false;
	var openScript = tree.opennedScript || 'object_list.php';
	if (tree) {
		var pagePath = getPagePath(),
			url      = '/scripts/' + openScript,
			argument = '';
		if (adminMode) {url = '/scripts/object_list_admin.php'}
		if ((id) || (id === 0)) {argument = '?id=' + id;}
		if (tree.unit) {argument += '&unit_name=' + tree.unit}
		getUrlWithObject([pagePath, url, argument].join(""), parseTreeList, {tree: tree, node: node});
	}
}

function treeToggle(event) {
	event = event || window.event;
	var clickedElem = event.target || event.srcElement;
	if ((isClass(clickedElem, 'Expand') || isClass(clickedElem, 'Content') || ((clickedElem.tagName == 'IMG') && (isClass	(clickedElem, 'closeCategory') === false)) ||
		isClass(clickedElem, 'header') || isClass(clickedElem, 'subTree') || isClass(clickedElem, 'subHeader')) && (clickedElem.nodeName !== 'INPUT'))  {

		var node = clickedElem.parentNode;
		if (isClass(clickedElem, 'header') || isClass(clickedElem, 'subHeader')  || (clickedElem.tagName == 'IMG')) {
			node = node.parentNode;
		}
		if (!isClass(node, 'ExpandLoading')) {
			var newClass = null;
			if (!node.visited) {newClass = isClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandLoading';}
			else {newClass = isClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen';}
			if (node.parent.color) {
				if (newClass == 'ExpandOpen') {
					node.childNodes[2].style.backgroundColor = node.parent.color;
				}
				if(newClass == 'ExpandClosed') {
					node.childNodes[2].style.backgroundColor = '#fff';
				}
			}
			var expression =  /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/;
			node.className = node.className.replace(expression, '$1'+newClass+'$3');
			if (!node.visited) {getList(node.parent, node.parent.getId(), node, node.parent.getAdminMode());node.visited = true;}
			node.parent.clickAction = !node.parent.clickAction;
			if (!node.parent.clickAction) {node.parent.deleteAndHide();} else {node.parent.showOuterNods();}
		}
	}
    if(typeof(node) != 'undefined'){
		Carusel(node,node.parent.getId());
	}

	if ((isClass(clickedElem, 'SelectorButton')) && (clickedElem.tree.selector.disabled.toString() == 'false')) {
		if (clickedElem.tree) {
      //РАзделяем
      if(clickedElem.check){
        clickedElem.tree.clickSelector();
      } else if(clickedElem.link){
        if(!clickedElem.tree.selector.checked){
          clickedElem.tree.clickSelector();
          globalObjectId = clickedElem.tree.lid;
        } else {
          
          
        }

     }
			
			if (clickedElem.tree.type) {
				var url = '',
					pagePath = getPagePath(),
					object   = clickedElem.tree,
					status   = object.getStatus();
				if (object.type == 'tree'/* || object.type == 'list'*/) {
					if (status.toString() == 'true') {
						if (object.getId()) {
							url = [pagePath, '/scripts/object_children.php?id=', object.getId()].join("");
							getUrlWithObject(url, showMapObjects, {tree: clickedElem.tree});
						} else {
							var flag = false;
							for(var i in clickedElem.tree.children) {
								url = [pagePath, '/scripts/object_labels.php', '?object_id=', i].join("");
								getUrlWithObject(url, showMapObjects, {tree: clickedElem.tree, noTeleport: flag});
								if (!flag) {flag = true}
							}
						}
					} else {
						for(var i in clickedElem.tree.listsId) {
							hideObjectLabels(i);
						}
						clearLabelUrl();
					}
				}
				if (object.type == 'list') {
					if (status.toString() == 'true') {
						object.selector.checked = true;
						url = [pagePath, '/scripts/object_labels.php', '?object_id=', object.getId()].join("");
						getUrlWithObject(url, showMapObjects, {tree: clickedElem.tree});
					} else {
						object.selector.checked = false;
						hideObjectLabels(object.getId());
						clearLabelUrl();
						if (object.outerHTML.parentNode == this.getHelper().selectedGroup) {
							this.getHelper().selectedGroup.removeChild(object.outerHTML);
						}
						if (this.getHelper().selectedGroup.getElementsByTagName('LI').length == 0) {
							this.getHelper().selectedGroup.style.display = 'none';
							if (this.getHelper().getElementsByTagName('LI').length == 0) {
								this.getHelper().hide();
							}
						}
					}
				}
				if (object.type == 'label') {
					/*if (status.toString() == 'true') {
						object.selector.checked = true;
						addLabelOnMap(object.label);
						mapController.teleportMapXY(object.label.object.x, object.label.object.y);
						showAllMapObjects(true, true);
					} else {
						object.selector.checked = false;
						hideLabel(object.label);
						objectSystem.delObject(object.label.objectId);
						clearLabelUrl();
					}*/
					if (status.toString() == 'true') {
            if(globalAllTree.length == 0){
              globalAllTree.push(clickedElem.tree);
            } else {
              for(var i = 0; i < globalAllTree.length; i++){
                if(globalAllTree[i] == clickedElem.tree){
                  } else {
                    globalAllTree.push(clickedElem.tree);
                  }
              }
            }
            //Если это группа с одинаковыми названеиями меток, добавляем это дерево в глобальный массив
           // globalAllTree.push(clickedElem.tree);
            
						object.selector.checked = true;
						url = [pagePath, '/scripts/object_labels.php', '?object_id=', object.getId()].join("");
						getUrlWithObject(url, showMapObjects, {tree: clickedElem.tree});
					} else {
						object.selector.checked = false;
						hideObjectLabels(object.getId());
						clearLabelUrl();
						if (object.outerHTML.parentNode == this.getHelper().selectedGroup) {
							this.getHelper().selectedGroup.removeChild(object.outerHTML);
						}
						if (this.getHelper().selectedGroup.getElementsByTagName('LI').length == 0) {
							this.getHelper().selectedGroup.style.display = 'none';
							if (this.getHelper().getElementsByTagName('LI').length == 0) {
								this.getHelper().hide();
							}
						}
					}
				}
				if (object.type == 'geoObject') {
					if (status.toString() == 'true') {
						object.selector.checked = true;
						url = [pagePath, '/scripts/geo_object_search.php', '?object_id=', object.getId()].join("");
						getUrl(url, showGeoObject);
					} else {
						object.selector.checked = false;
						delStreetHint(object.getId());
					}
				}
			}
		}
	}
}

//Удаление группы меток
function unselectGroup(helper) {
	var children = helper.selectedGroup.childNodes,
		j = children.length;
	for (var i = j-1; i >= 0; i--) {
		if (children[i].nodeType == 1) {
			if (children[i].tagName == 'LI') {
				if(children[i].parent.selector){
					children[i].parent.selector.checked = false;
				}
				children[i].parent.setStatus(false);
				hideObjectLabels(children[i].parent.getId());delStreetHint(children[i].parent.getId());
				helper.selectedGroup.removeChild(children[i]);
			}
		}
	}
	clearLabelUrl();
		helper.selectedGroup.childNodes[0].childNodes[0].checked = true;
		helper.selectedGroup.style.display = 'none';
		if (helper.getElementsByTagName('SPAN').length == 0) {
		helper.hide();
	}

}
//Инициализация подложки хелпера каталога
function initCatalogHelp(obj) {
	globalCatalogHelp = obj;
	initSelectGroup(globalCatalogHelp);
}

//Инициализация подложки для группы отмеченных
function initSelectGroup(obj) {
	var span = document.createElement('div'),
		checkbox = document.createElement('INPUT');

	checkbox.type = 'checkbox';
	span.appendChild(checkbox);
	span.onclick =function () {unselectGroup(obj)};

	obj.selectedGroup = document.createElement('div');
	obj.selectedGroup.className = "selectedGroup";
	obj.selectedGroup.style.display = 'none';

	span.className = 'header';
	span.innerHTML += 'Отмеченные';

	obj.selectedGroup.appendChild(span);
	obj.appendChild(obj.selectedGroup);
	obj.selectedGroup.childNodes[0].childNodes[0].checked = false;
}

function createTree(obj) {
	rootNavigatorHTML = obj;
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		helpNavigatorFirm = treeFactory(null, createPrimaryNodes(obj), null, globalSearchHelp, {}, false);
		helpNavigatorFirm.name = "Результаты поиска по каталогу";
		helpNavigatorFirm.type = 'tree';
		helpNavigatorStreet = treeFactory(null, createPrimaryNodes(obj), null, globalSearchHelp, {}, false);
		helpNavigatorStreet.name = "Результаты поиска по географическим объектам";
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, globalCatalogHelp, {}, false);
		getList(rootNavigator,1);
	}
}

function createTreeStat(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {stat: true}, true);
		getList(rootNavigator, 1, null, true);
	}
}

function createTreeVip(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {vip: true}, true);
		getList(rootNavigator, 1, null, true);
	}
}

//Создаёт дерево каталога в админке
function createTreeAdmin(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {typeId:3}, true);
		getList(rootNavigator, 1, null, true);
	}
}

function createRelaxTreeAdmin(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		relaxRootNavigator = treeFactory(47302, createPrimaryNodes(obj), null, null, {typeId:4}, true);
		getList(relaxRootNavigator, 47302, null, true);
	}
}

//Создаёт дерево для событий(О городе) в админке
function createEventTreeAdmin(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigatorEvent = treeFactory(48175, createPrimaryNodes(obj), null, null, {typeId:5}, true);
		getList(rootNavigatorEvent, 48175, null, true);
	}
}

// недвижимость
function createRealtyTree(obj) {
	var handler = function() {treeToggle(arguments[0]);};
	obj.onclick = handler;
	helpNavigatorRealty = treeFactory(null, createPrimaryNodes(obj), null, globalRealtyHelp, {}, false);
	helpNavigatorRealty.name = "Результаты поиска по каталогу недвижимости";
	helpNavigatorRealty.type = 'tree';
	rootNavigatorRealty = treeFactory(null, createPrimaryNodes(obj), null, globalRealtyHelp, {}, false);
	getList(rootNavigatorRealty,rootRealty);
}

function createDiscountTree(obj) {
	var handler = function() {treeToggle(arguments[0]);};
	obj.onclick = handler;
	rootNavigatorDiscount = treeFactory(null, createPrimaryNodes(obj), null, globalDiscountHelp, {unit: 'discounts'}, false);
	getList(rootNavigatorDiscount,1);
}

//Создаёт дерево для Событий(О городе)
function createEventTree(obj) {
	var handler = function() {treeToggle(arguments[0]);};
	obj.onclick = handler;
	rootNavigatorEvent = treeFactory(null, createPrimaryNodes(obj), null, globalEventHelp, {}, false);
	getList(rootNavigatorEvent,48175);
}

//Создаёт дерево транспорта в админке
function adminTransport(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigatorTransport  = treeFactory(3, createPrimaryNodes(obj), null, null, {typeId:3}, true);
		getList(rootNavigatorTransport , 3, null, true);
	}
}

function createTreeGallary(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigatorGallary = treeFactory(47269, createPrimaryNodes(obj), null, null, {typeId:6, gallary: true}, true);
		getList(rootNavigatorGallary, 47269, null, true);
	}
}

//Создаёт дерево для Транспорта
function createTransport(obj) {
	var handler = function() {treeToggle(arguments[0]);};
	obj.onclick = handler;
	rootNavigatorTransport = treeFactory(null, createPrimaryNodes(obj), null, globalTransportHelp, {}, false);
	getList(rootNavigatorTransport, 3);
}

//Вывод метки(меток) на карту и телепортирует
function showMapObjects(a, b, reply, params) {
	var xmlDoc = XML.parse(reply), root = xmlDoc.documentElement || false,
		minimum = false, xm, ym,
		children = root.childNodes,
		labelCount = 0;
          for (var i = 0; i < children.length; i++) {
        if (children[i].nodeType == 1) {
          if (children[i].nodeName == 'label') {
            labelCount++;
            var ids = placePoint(children[i]);
            if (!(minimum) || (minimum > ids.s)) {
              minimum = ids.s;
              xm		= ids.x;
              ym		= ids.y;
            }
            if ((params.tree) && (!params.tree.listsId[ids.objectId])) {
              params.tree.listsId[ids.objectId] = ids.objectId;
            }
          }
        }
      }

      if (!params.noTeleport) {
        if((typeof(xm) !== 'undefined') && (typeof(ym) !== 'undefined')){
          mapController.teleportMapXY(xm, ym);}
      }
      var newHint = true;
      if (labelCount > 5) {newHint = false}
      
      params.noHideHint = params.noHideHint || false;
      showAllMapObjects(!params.noHideHint, newHint);
	
}

function insertChild(a, b, replay, params) {
	var
		id         = replay,
		newTree    = treeFactory(id, params.fragment, params.tree,  params.tree.getHelper(), {name: params.editor.value, type: 'tree',  logoIco: '', color: '', selected: params.tree.getStatus(), unit: params.tree.unit, typeId:params.tree.typeId, gallary:params.tree.gallary}, params.tree.getAdminMode()),
		firstChild = params.childRoot.childNodes[1] || false;
	params.tree.addChild(id, newTree);
	if (firstChild) {
		params.childRoot.insertBefore(newTree.getRoot(), firstChild);
	} else {
		params.childRoot.appendChild(newTree.getRoot());
	}
	newTree.getRoot = function() {return params.childRoot;};
	params.editor.value = '';
}

function initRealtyHelp(obj) {
	globalRealtyHelp = obj;
	initSelectGroup(globalRealtyHelp);
}

function initJobHelp(obj) {
	globalJobHelp = obj;
	initSelectGroup(globalJobHelp);
}

function initDiscountHelp(obj) {
	globalDiscountHelp = obj;
	initSelectGroup(globalDiscountHelp);
}

function initEventHelp(obj) {
	globalEventHelp = obj;
	initSelectGroup(globalEventHelp);
}
function initAdvertisingHelp(obj) {
	globalAdvertisingHelp = obj;
	initSelectGroup(globalAdvertisingHelp);
}
function reviewStatForObject(a,b,reply,num){
	var span  = document.createElement('SPAN');
	num.innerHTML = reply;

}

function reviewIpFunc(a,b,reply){
	var div = document.getElementById('ipStat');
	div.style.height = (getScreenHeight() - 10)+'px';
	div.innerHTML = reply;

}

function clickIp(ip){
	getUrl('/scripts/reviewAllObjectForIp.php?ip='+ip, reviewAllObjectForIp);
}

//Просмотр статистики по IP
function reviewAllObjectForIp(a,b,reply){
	var div = document.getElementById('ipStatForObject');
	div.style.height = (getScreenHeight() - 10)+'px';
	div.innerHTML = reply;
}

function editLabelinAdmin(a,b,reply){
	var labelEdit = document.getElementById('labelEdit');
	labelEdit.innerHTML = '';
	labelEdit.innerHTML = reply;

}

// дерево для "Редактор недвижимости" в админке
function createRealtyTreeAdmin(obj) {
	var handler = function() {treeToggle(arguments[0]);};
	obj.onclick = handler;
	rootNavigatorRealty = treeFactory(null, createPrimaryNodes(obj), null, null, {estate: true}, true);
	getList(rootNavigatorRealty,rootRealty);
}

//Дерево вакансий в админке
function createAdminUnitJob(obj){
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigatorJob = treeFactory(rootJobId, createPrimaryNodes(obj), null, null, {Job: true, addJob: true}, true);

		getList(rootNavigatorJob, rootJobId, null, true);


	}
}

//Дерево вакансий
function createUnitJob(obj){
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
	    rootNavigatorJob = treeFactory(null, createPrimaryNodes(obj), null, globalJobHelp, {}, false);
		getList(rootNavigatorJob,rootJobId);
	}
}

//Создаёт дерево каталога для добавления вакансий к огранизациям
function createTreeAdminForJob(obj) {
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {addJob: true}, true);
		getList(rootNavigator, 1, null, true);
	}
}

// Дерево наружной рекламы в админке
function createAdminOutdoorAdvertising(obj){
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootOutdoorAdvertising = treeFactory(rootAdvertising, createPrimaryNodes(obj), null, null, {advertising: true}, true);

		getList(rootOutdoorAdvertising, rootAdvertising, null, true);


	}
}

// Дерево наружной рекламы
function createOutdoorAdvertising(obj){
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		helpNavigatorAdvertising = treeFactory(null, createPrimaryNodes(obj), null, globalAdvertisingHelp, {}, false);
		helpNavigatorAdvertising.name = "Результаты поиска по каталогу";
		helpNavigatorAdvertising.type = 'tree';
	    rootOutdoorAdvertising = treeFactory(null, createPrimaryNodes(obj), null, globalAdvertisingHelp, {}, false);
		getList(rootOutdoorAdvertising,rootAdvertising);
	}
}

//Добавляет меню "Добавить объект" к дереву недвижимости (в админке)
function addEditorsToRealty(tree){
	treeArray[tree.getId()] = tree; // глобальный массив с созданными деревьями
	var editorPannel = document.createElement('DIV'),
			fragment     = document.createDocumentFragment();
	editorPannel.innerHTML		= '<p><img src="/images/r_add.png"> Добавить объект</img></p>';
	editorPannel.className		= 'navigatorEditor';
	editorPannel.style.cursor = 'pointer';
	tree.childRoot.insertBefore(editorPannel, tree.childRoot.childNodes[0]);
	editorPannel.onclick = function(){getUrl('/scripts/est_obj_id_info.php?id=' + tree.getId(), showDivAdminObjEstate);};
}


function addEditorsToAdvertising(tree){
	treeArray[tree.getId()] = tree; // глобальный массив с созданными деревьями
	var editorPannel = document.createElement('DIV'),
	fragment     = document.createDocumentFragment();
	editorPannel.innerHTML = '<form onsubmit="return false;"><select class="select_advertising">\n\
									<option selected>Добавить объект из списка</option>\n\
									<option onclick="createFormAdvertising(this,'+tree.getId()+');" value="bg2">Бигборд</option>\n\
                  <option onclick="createFormAdvertising(this,'+tree.getId()+');" value="blb">Билборд</option>\n\
                  <option onclick="createFormAdvertising(this,'+tree.getId()+');" value="trv">Тривижин</option>\n\
							  </select></form>';
	editorPannel.className		= 'navigatorEditor';
	editorPannel.style.cursor = 'pointer';
	if(tree.parent.getId() == rootAdvertising){
		tree.childRoot.insertBefore(editorPannel, tree.childRoot.childNodes[0]);
	}

}

function addEditorsToJob(tree, labels, child_count){
	treeArray[tree.getId()] = tree; // глобальный массив с созданными деревьями
	var editorPannel = document.createElement('DIV'),
	fragment     = document.createDocumentFragment(),
  addrubbutton = document.createElement('BUTTON'),
  addrubtext = document.createElement('INPUT');
	addrubbutton.innerHTML = 'Добавить рубрику';
  addrubbutton.style.background = '#444';
  addrubbutton.style.color = '#fff';
  addrubbutton.onclick = function () {AddJobField(addrubtext.value, tree.getId());}
  addrubtext.type = 'text';
  addrubtext.setAttribute('add_field_to_job', '');
	editorPannel.innerHTML = '<div style="color: #000" onclick="addJobToField('+tree.getId()+')"> >>Добавить вакансию в рубрику<< </div>';
	editorPannel.className		= 'navigatorEditor';
	editorPannel.style.cursor = 'pointer';
  //Если не корень и не метка
  myLog(child_count + '/' + labels)
  if(tree.getId() != rootJobId && !tree.lid){
    //Если колличество потомков больше либо равно 1 и нет меток, то выводим поле добавления рубрики
    if(child_count >= 1 && labels == 'false'){
      tree.childRoot.insertBefore(addrubtext, tree.childRoot.childNodes[0]);
      tree.childRoot.insertBefore(addrubbutton, tree.childRoot.childNodes[1]);
    //Если колличество потомков равно 0 и нет меток, то выводим поле добавления рубрики и метки
    } else if(child_count == 0 && labels == 'false'){
      tree.childRoot.insertBefore(addrubtext, tree.childRoot.childNodes[0]);
      tree.childRoot.insertBefore(addrubbutton, tree.childRoot.childNodes[1]);
      tree.childRoot.insertBefore(editorPannel, tree.childRoot.childNodes[2]);
    //Если колличество потомков больше либо равно 1 и это только метки, то выводим поле добавления метки
    } else if(child_count >= 1 && labels == 'true'){
      tree.childRoot.insertBefore(editorPannel, tree.childRoot.childNodes[0]);
    }
    //Если корень
  } else if(tree.getId() == rootJobId){
      tree.childRoot.insertBefore(addrubtext, tree.childRoot.childNodes[0]);
      tree.childRoot.insertBefore(addrubbutton, tree.childRoot.childNodes[1]);
  }
    
	

}

//Меню для объекта недвижимости
function nodeHeaderToRealty(tree){
	var header	 = document.createElement('DIV'),
	NameCategory = document.createElement('SPAN');
	// если у объекта есть id метки - считаем его листом, если нет - веткой
	if(tree.lid){
		var	zeroEst = document.createElement('IMG'),//заплатка, нужна чтобы меню не съезжало лесенкой
		oneEst = document.createElement('IMG'),
		twoEst = document.createElement('IMG');
		zeroEst.src			= '/images/b_blank.png';
		zeroEst.className = 'menuEstIco3';
		oneEst.src			= '/images/b_edit.png';
		oneEst.title		= 'Изменить';
		oneEst.className = 'menuEstIco';
		oneEst.onclick	= function(){getUrl('/scripts/unitEstate.htm?id=' + tree.lid, showDiv);};
		twoEst.src			= '/images/denied.gif';
		twoEst.title		= 'Удалить';
		twoEst.className = 'menuEstIco';
		twoEst.onclick	= function(){
			delEstate(tree.lid);
			tree.deleteMe();
		};
		NameCategory.innerHTML = tree.address;
		NameCategory.className = 'menuEstIco2';
		header.appendChild(NameCategory);
		header.appendChild(zeroEst);
		header.appendChild(oneEst);
		header.appendChild(twoEst);
	}else{
		NameCategory.innerHTML = tree.name;
		header.appendChild(NameCategory);
	}
	return header;
}


function nodeHeaderToAdvertising(tree){
	var header	 = document.createElement('DIV'),
	NameCategory = document.createElement('SPAN');
	// если у объекта parent id не основной корень - считаем его листом, если нет - веткой
	if(tree.parent.getId() != rootAdvertising){
		var	zeroEst = document.createElement('IMG'),//заплатка, нужна чтобы меню не съезжало лесенкой
		oneEst = document.createElement('IMG'),
		edit = document.createElement('IMG'),
		twoEst = document.createElement('IMG');
		edit.src            = '/images/b_edit.png';
		edit.title          = 'Редактировать';
		edit.className      = 'menuEstIco';
		zeroEst.src			= '/images/b_blank.png';
		zeroEst.className = 'menuEstIco3';
		oneEst.src			= '/images/add_adv.png';
		oneEst.title		= 'Добавить на карту';
		oneEst.className = 'menuEstIco';
		oneEst.onclick	= function(){
			location = 'http://' +location.hostname;
			window.name = 'initAddAdvertising,'+tree.getId()+','+tree.name;
		}
		edit.onclick    = function (){
			getUrl('/scripts/dataHelper.html?id=' +tree.lid+ '&object_id=' + tree.getId(), outFormAdvertising);
			thisObjectAdvertising = this.parentNode;
		}
		twoEst.src			= '/images/denied.gif';
		twoEst.title		= 'Удалить';
		twoEst.className = 'menuEstIco';
		twoEst.onclick	= function(){
			tree.deleteMe();
			deletObjectAdvertising(tree.getId());
			replaceOpacityMessage(insMsgInObj('bilEdit', '<h3><center>Объект удалён</center></h3>'), 9);
		};
		NameCategory.innerHTML = tree.name;
		NameCategory.className = 'menuEstIco2';
		header.appendChild(NameCategory);
		header.appendChild(zeroEst);
		if(tree.lid == false){
			header.appendChild(oneEst);
		}
		header.appendChild(edit);
		header.appendChild(twoEst);
	}else{
		NameCategory.innerHTML = tree.name;
		header.appendChild(NameCategory);
	}
	return header;
}

//Определяет вид дерева вакансий в админке
function nodeHeaderToJob(tree){
	var header	 = document.createElement('DIV'),
	NameCategory = document.createElement('SPAN'),
  del = document.createElement('IMG');
  del.src			= '/images/denied.gif';
		del.title		= 'Удалить';
		del.className = 'menuEstIco';
  if(tree.parent.getId() != rootJobId && tree.lid){
		var edit = document.createElement('IMG');
    var	zeroEst = document.createElement('IMG');//заплатка, нужна чтобы меню не съезжало лесенкой
		zeroEst.src			= '/images/b_blank.png';
		zeroEst.className = 'menuEstIco3';
		edit.src            = '/images/b_edit.png';
		edit.title          = 'Редактировать';
		edit.className      = 'menuEstIco';
		edit.onclick    = function (){
			getUrl('scripts/edit_job.php?label_id=' + tree.lid, uotEditFormJob);
		}
		
		del.onclick	= function(){
      //Удаляем вакансию
      tree.parent.getChildRoot().removeChild(tree.getOuterHTML());
			getUrl('scripts/del_job_modul_1.php?id=' + tree.lid + '&object_id=' + tree.getId() + '&parent_id=' + tree.parent.getId(), function (){})
		};
		NameCategory.innerHTML = tree.name;
		NameCategory.className = 'menuEstIco2';
		header.appendChild(NameCategory);
    header.appendChild(zeroEst);
		header.appendChild(edit);
		header.appendChild(del);
	}else{
    del.onclick	= function(){
      var istrue = confirm('Удалить ' + tree.name + '?');
      if(istrue){
        tree.deleteMe();
      }
      
		};
    header.appendChild(del);
		NameCategory.innerHTML = tree.name;
		header.appendChild(NameCategory);
	}
	return header;
}

//Позоляет выбрать метку из каталога, в которую нужно поместить вакансию
function addJobToOrganization(tree){
	var header	 = document.createElement('DIV'),
	NameCategory = document.createElement('SPAN');
	if(tree.parent.getId() != 1 && tree.lid){
		header.onclick = function (){
			if(document.getElementById('selectedJob')){
				var selectedJob = document.getElementById('selectedJob');
				selectedJob.style.background = '#fff';
				selectedJob.removeAttribute('id');
				header.style.background = '#000';
				header.setAttribute('id', 'selectedJob');
				jobid = tree.getId();
				joblid = tree.lid;
			}else{
				header.style.background = '#000';
				header.setAttribute('id', 'selectedJob');
				jobid = tree.getId();
				joblid = tree.lid;
			}
		}
		NameCategory.innerHTML = tree.name;
		NameCategory.className = 'menuEstIco2';
		header.appendChild(NameCategory);
	}else{
		NameCategory.innerHTML = tree.name;
		header.appendChild(NameCategory);
	}
	return header;
}

//Добавляет новый объект к дереву ненвижимости
function insertRealtyObject(a, b, result){
	result = result.split('|');
	var parent_id = parseInt(result[0]), label_id = parseInt(result[1]), address = result[2];
	var tree = treeArray[parent_id];
	var fragment = document.createDocumentFragment();
	var	newTree = treeFactory(parent_id, fragment, tree,  null, {name: address, address: address, type: 'tree', estate: true, lid: label_id}, tree.getAdminMode());
	tree.childRoot.appendChild(newTree.getRoot());
}

//Добавляет новый объект к дереву наружной рекламы
function insertRealtyAdvertising(a,b,result,obj){
	var tree = treeArray[obj.id];
	var fragment = document.createDocumentFragment();
	var	newTree = treeFactory(result, fragment, tree,  null, {name:obj.name, type: 'tree', advertising: true, lid: false}, tree.getAdminMode());
	tree.childRoot.appendChild(newTree.getRoot());
}

//Добавляет новый объект к дереву вакансий
function insertJob(a,b,result,obj){
  var array = result.split('$');
	var tree = treeArray[obj.id];
	var fragment = document.createDocumentFragment();
	var	newTree = treeFactory(array[1], fragment, tree,  null, {name:array[0], type: 'tree', Job: true, lid: array[2]}, tree.getAdminMode());
	tree.childRoot.appendChild(newTree.getRoot());
}



//------------------Работаем с "зелёными" сообщениями в админке )) -------------------------------------//

// Дерево выбора метки, для вывода на карту при клике по ссылке в информационном облачке зелёного чувака
function createTreeForOutLabelFromGreenMessage(obj){
  obj.innerHTML = '';
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
    //Здесь мы используем такой же параметр как и в вакансиях, для того чтобы вывести нужный вид дерева, дабы не писать лишний код
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {addJob: true}, true);
		getList(rootNavigator, 1, null, true);
	}
}

// Дерево выбора раздела каталога, для его раскрытия при клике по ссылке в облаке зелёного
function createTreeForOpenCatFromGreenMessage(obj){
  obj.innerHTML = '';
	if (obj) {
		var handler = function() {treeToggle(arguments[0]);};
		obj.onclick = handler;
		rootNavigator = treeFactory(1, createPrimaryNodes(obj), null, null, {sectionСatalog: true}, true);
		getList(rootNavigator, 1, null, true);
	}
}

//Внешний вид дерева выбора раздела каталога
function selectSectionСatalog(tree){
  var header	 = document.createElement('DIV'),
	NameCategory = document.createElement('SPAN');
	if(tree.parent.getId() != 1){
		header.onclick = function (){
			if(document.getElementById('selectedJob')){
				var selectedJob = document.getElementById('selectedJob');
				selectedJob.style.background = '#fff';
				selectedJob.removeAttribute('id');
				header.style.background = '#000';
				header.setAttribute('id', 'selectedJob');
				greentreeId = tree.parent.getId() + '|' + tree.getId();
			}else{
				header.style.background = '#000';
				header.setAttribute('id', 'selectedJob');
				greentreeId = tree.parent.getId() + '|' + tree.getId();
			}
		}
		NameCategory.innerHTML = tree.name;
		NameCategory.className = 'menuEstIco2';
		header.appendChild(NameCategory);
	}else{
		NameCategory.innerHTML = tree.name;
		header.appendChild(NameCategory);
	}
	return header;
}
//----------------------------------------------------------------------------------------------------//// ---- /work/units/navigator_finder/navigator_finder.js ---- 
// ==== /work/units/check_form/form_check.js ==== 
function setCheckStatusClass (obj, status, statusOk, statusNone, statusFail) {
	if (status == 'ok')	{
		delClass(obj, statusFail);
		delClass(obj, statusNone);
		addClass(obj, statusOk);
	}	else if (status == 'none')	{
		delClass(obj, statusFail);
		delClass(obj, statusOk);
		addClass(obj, statusNone);
	}	else if (status == 'fail')	{
		delClass(obj, statusOk);
		delClass(obj, statusNone);
		addClass(obj, statusFail);
	}
}
// ---- /work/units/check_form/form_check.js ---- 
// ==== /work/units/unitContact/unitContact.js ==== 
function delLink(id, button) {
	getUrl(getPagePath() + '/scripts/del_link.php?id=' + id, function() {});
	button.parentNode.parentNode.removeChild(button.parentNode);
}// ---- /work/units/unitContact/unitContact.js ---- 
// ==== /work/units/unitText/text.js ==== 
function initunitText() {
	if (tinyMCE) {		
		tinyMCE.init({
			// General options
			mode : "exact",
			elements : "text",
			theme : "advanced",
		plugins : "style,advimage",

		// Theme options
		theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,removeformat,|bullist,numlist,|,forecolor,backcolor",
		theme_advanced_buttons2 : "fontselect,fontsizeselect,|,undo,redo,|,image,cleanup,code",
		theme_advanced_buttons3 : "",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",		
		theme_advanced_resizing : true
	});
	}
}// ---- /work/units/unitText/text.js ---- 
// ==== /work/units/unitFiles/unitFiles.js ==== 
function delFile(id, button) {
	getUrl(getPagePath() + '/scripts/del_file.php?id=' + id, function() {});
	button.parentNode.parentNode.parentNode.removeChild(button.parentNode.parentNode);
}// ---- /work/units/unitFiles/unitFiles.js ---- 
// ==== /work/units/unitGalary/unitGalary.js ==== 
function delGalaryFile(id, button) {
	getUrl(getPagePath() + '/scripts/del_galary_file.php?id=' + id, function() {});
	button.parentNode.parentNode.parentNode.removeChild(button.parentNode.parentNode);
}

function showImageHint(obj,textId,imgId) {
	tooltip(obj,obj.parentNode.parentNode,get(textId),obj.getAttribute('alt'));
	tooltip(obj,obj,get(imgId),'<img src="images/strelka.png">');
}

function outImageHint(obj){
	hidetip(obj);
}

function showFullImage(obj,unit_id,id,ext) {
	var text = obj.getAttribute('alt');
	var height = getScreenHeight();
	getUrl('/scripts/return_full_image.php?id='+id+'&unit_id='+unit_id+'&ext='+ext+'&text='+text+'&height='+height, showDiv);
}

function previous_image(obj,unit_id,id,ext,text){
	var height = getScreenHeight();
	getUrl('/scripts/return_full_image.php?id='+id+'&unit_id='+unit_id+'&ext='+ext+'&text='+text+'&height='+height, replaceDiv);
}

function next_image(obj,unit_id,id,ext,text){
	var height = getScreenHeight();
	getUrl('/scripts/return_full_image.php?id='+id+'&unit_id='+unit_id+'&ext='+ext+'&text='+text+'&height='+height, replaceDiv);
}

function closeFullImage(){
	var content = findChildFromClass(document.body,'content');
	var fon = findChildFromClass(document.body,'fon');
	document.body.removeChild(content);
	document.body.removeChild(fon);
}

// ---- /work/units/unitGalary/unitGalary.js ---- 
// ==== /work/units/unitVideo/video.js ==== 
//v1.7
// Flash Player Version Detection
// Detect Client Browser type
// Copyright 2005-2008 Adobe Systems Incorporated.  All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
function ControlVersion()
{
	var version;
	var axo;
	var e;
	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}
	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");

			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful.

			// default to the first public version
			version = "WIN 6,0,21,0";
			// throws if AllowScripAccess does not exist (introduced in 6.0r47)
			axo.AllowScriptAccess = "always";
			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}
	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}
	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}
	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}

	return version;
}
// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;

	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}
	return flashVer;
}
// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];
        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}
function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?');
  else
    return src + ext;
}
function AC_Generateobj(objAttrs, params, embedAttrs)
{
  var str = '';
  if (isIE && isWin && !isOpera)
  {
    str += '<object ';
    for (var i in objAttrs)
    {
      str += i + '="' + objAttrs[i] + '" ';
    }
    str += '>';
    for (var i in params)
    {
      str += '<param name="' + i + '" value="' + params[i] + '" /> ';
    }
    str += '</object>';
  }
  else
  {
    str += '<embed ';
    for (var i in embedAttrs)
    {
      str += i + '="' + embedAttrs[i] + '" ';
    }
    str += '> </embed>';
  }
  return str;
}
function AC_FL_RunContent(){
  var ret =
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  return AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_SW_RunContent(){
  var ret =
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  return AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();
    switch (currArg){
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblclick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
      case "id":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace":
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}

function loadUnitVideo(id, button) {
	var div = findChildFromClass(button.parentNode.parentNode.parentNode.parentNode, 'infModul'),
		oldSelect = findChildFromClass(button.parentNode, 'select');
	delClass(oldSelect, 'select');
	addClass(button, 'select');

	div.innerHTML = '<div class="unitVideo">' + AC_FL_RunContent(
		'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
		'width', '435',
		'height', '180',
		'src', '/flash/video-player',
		'quality', 'best',
		'pluginspage', 'http://www.adobe.com/go/getflashplayer',
		'align', 'middle',
		'play', 'true',
		'loop', 'true',
		'scale', 'showall',
		'wmode', 'transparent',
		'devicefont', 'false',
		'id', 'video-player',
		'bgcolor', '#ffffff',
		'name', 'video-player',
		'menu', 'true',
		'allowFullScreen', 'true',
		'allowScriptAccess','sameDomain',
		'movie', '/flash/video-player',
		'salign', '',
		'FlashVars', 'id_video=' + id
		) + '</div>'; //end AC code
}

function delVideoFile(id, button) {
	getUrl(getPagePath() + '/scripts/del_video_file.php?id=' + id, function() {});
	button.parentNode.parentNode.parentNode.removeChild(button.parentNode.parentNode);
}// ---- /work/units/unitVideo/video.js ---- 
// ==== /work/units/formValidator/tooltips.js ==== 
// JavaScript Document

//Показывает подсказку
/*Аргументы:
	obj      - объект, вызывающий появление подсказки
	parent   - объект, относительно которого будет вычисляться смещение подсказки
	location - объект, в котором будет находиться подсказка
	hint     - текст подсказки
*/
function tooltip(obj,parent,location,hint)
{	
	var tip = location;
	var x,y;
	var hintText = document.createElement('span');
	
	hintText.innerHTML = hint;
	
	if (tip.innerTip) {
		tip.removeChild(tip.innerTip);
	}
	tip.appendChild(hintText);
	tip.innerTip = hintText;
	
	tip.style.display = 'block';
	if (y = getOffset(obj,parent).y)
	{
		tip.style.top = parseInt(y) + 24 + 'px';
	}
	if(!obj.tip){
		obj.tip = new Array();
	}
	obj.tip.push(tip);
	
}

//Скрывает подсказку
/*Аргументы:
	obj - объект, вызвавший появление подсказки
*/
function hidetip(obj)
{
	var i;
	for(i = 0; i < obj.tip.length; i++){
		obj.tip[i].style.display = 'none';
	}
	obj.tip = null;
	
}


//Вычисляет координаты объекта относительно его предка
/*Аргументы:
	obj    - объект, координаты которого вычисляются
	parent - объект, относительно которого будет вычисляться координаты 
*/
function getOffset(obj,parent)
{
	var left = 0; 
	var top  = 0;	
	while (obj.offsetParent)
	{ 
		left += obj.offsetLeft; 
		top  += obj.offsetTop; 
		obj  = obj.offsetParent;
		if (obj == parent) return {x:left, y:top}
	}
	return false;
}// ---- /work/units/formValidator/tooltips.js ---- 
// ==== /work/units/formValidator/formValidator.js ==== 
var NS = "http://www.infomap.ru/meta",
clientStatusVisualisator = {
	defaultCorrect : function() {return true; },
	defaultError   : function() {return false;},
	correctField   : function() {this.className = 'inputPass';},
	errorField     : function() {this.className = 'inputFail';},
	correctButton  : function() {this.className = 'submit'; this.onclick = null;},
	errorButton    : function() {this.className = 'submitInactive'; this.onclick = dummy;},
	attachHandlers : function(node, correctHandlerName, errorHandlerName) {
		node.correct = this[correctHandlerName] || this.defaultCorrect;
		node.error   = this[errorHandlerName]   || this.defaultError;
	}
};

function inputGetValue(node) {	
	switch (node.type) {
		case 'text'		: return node.value;
		case 'password'	: return node.value;
		case 'radio'	: return node.checked;
		case 'checkbox'	: return node.checked;
	}
}

function localValidatorSystem(obj, priority, parentSystem, correctHandlerName, errorHandlerName) {
	var resultObject = {
		getDomParent          : function() {return obj;},
		getValidationPriority : function() {return priority;},
		getParentSystem       : function() {return parentSystem || false;},
		validators            : [],
		attachValidator       : function(validator) {this.validators[this.validators.length] = validator;},
		validate              : function(value) {
									for (var i = 0; i < this.validators.length; i++) {
										this.validators[i].validateCall(value);
									}
									if (this.getParentSystem()) {
										this.getParentSystem().validate();
									}
								},
		getValidationStatus   : function() {
									for (var i = 0; i < this.validators.length; i++) {if (!this.validators[i].validatorStatus) {return false;}}
									return true;
								},
		majorPriority         : function(bool) {
									return bool;
								},
		optionalPriority      : function(bool) {
									return true;
								}
	};
	clientStatusVisualisator.attachHandlers(obj, correctHandlerName, errorHandlerName);
	return resultObject;
}

function validationSystemFactory(rootObject, loyality) {
	var resultObject = {
		getDomRoot         : function() {return rootObject || false;},
		getLoyality        : function() {return loyality;},
		nodes              : {},
		addSubmitButton    : function(node) {this.submitButton = node; if ((this.getLoyality() === 'strict') && (this.submitButton.error)) {this.submitButton.error();}},
		submitButton       : null,
		externalValidators : [],
		addExternalValidator: function (validator) {if (validator) { this.externalValidators[this.externalValidators.length] = validator;} },
		registerNode       : function(node, name) {
								node.externalStatus = true;
								node.getValue = function() {
									return inputGetValue(this);
								};
								if (this.nodes[name]) {
									if (this.nodes[name] instanceof Array) {this.nodes[name][this.nodes[name].length] = node;}
									else {
										var newStructure = [this.nodes[name], node];
										this.nodes[name] = newStructure;
									}
								}
								else {this.nodes[name] = node;}
							},
		validate           : function() {
								var validationStatus = true,
									i, j;
								for (i = 0; i < this.externalValidators.length; i++) {
									validationStatus = validationStatus && this.externalValidators[i].validate();
								}
								for (i in this.nodes) {
									if (this.nodes[i] instanceof Array) {
										for (j = 0; j < this.nodes[i].length; j++) {											
											if (!this.nodes[i][j].validator.getValidationStatus() || !this.nodes[i][j].externalStatus) {
												if (this.nodes[i][j].validator.getValidationPriority() == 'major') {
													validationStatus = false;
												}
												this.nodes[i][j].error();
											} else {this.nodes[i][j].correct();}
										}
									} else {
										if (!this.nodes[i].validator.getValidationStatus() || !this.nodes[i].externalStatus){											
											if (this.nodes[i].validator.getValidationPriority() == 'major') {
												validationStatus = false;
											}
											this.nodes[i].error();
										} else {this.nodes[i].correct();}
									}
								}								
								if (this.getLoyality() === 'strict') {if (this.submitButton) {if (validationStatus) {this.submitButton.correct();} else {this.submitButton.error();}}}
							}
	};
	return resultObject;
}

function validateRegular(string, expression) {	
	return expression.test(string);
}

function validateCheck(value) {	
	return value;
}

function testMatch(nodes) {
	var val = nodes[0].value,
		result = true, i;
	for (i = 1; i < nodes.length; i++) {result = result && (nodes[i].value === val);}
	return result;
}

function singleValidatorFactory(type) {
	var resultValidator = {
			validateFunc    : null,
			validateCall    : function(string) {
				if (this.validateFunc) {
					this.validatorStatus = this.validateFunc(string, this.validateParams);
				}
				return this.validatorStatus;
			},
			validatorStatus : false,
			validateParams  : null
		},
		validateFunc   = function() {return true;},
		validateParams = null;
	switch (type) {
		case 'email'    : validateFunc = validateRegular; validateParams = /^(\s*\w+@\w+\.\w+\s*)*$/; break;
		case 'phone'    : validateFunc = validateRegular; validateParams = /^[0-9,\-,+,(,), ]*$/; break;
		case 'nonEmpty' : validateFunc = validateRegular; validateParams = /.+/; break;
		case 'testCheck' : validateFunc = validateCheck; break;
	}
	resultValidator.validateFunc   = validateFunc;
	resultValidator.validateParams = validateParams;
	return resultValidator;
}

function extarnalValidatorFactory(type, nodes) {
	var flag = true, i, resultValidator, validateFunc;
	for (i = 0; i < nodes.length; i++) {		
		if (!nodes[i]) {
			flag = false;
		}
	}
	if (flag) {
		resultValidator = {
			validateFunc	: null,
			nodes			: nodes,
			validate		: function() {
				if (this.validateFunc) {
					this.validatorStatus = this.validateFunc(this.nodes);
				}
				for (i = 0; i < nodes.length; i++) {					
					this.nodes[i].externalStatus = this.validatorStatus;					
				}
				return this.validatorStatus;
			},
			validatorStatus : false
		};
		validateFunc   = function() {return true;};
		if (type === 'match') {
			validateFunc = testMatch;
		}
		resultValidator.validateFunc   = validateFunc;
		return resultValidator;
	} else {
		return false;
	}
}

function parseClientEvents(node, root, events) {
	var
		handler = function() {node.validator.validate(node.getValue());},
		focusHandler = handler,
		blurHandler = handler,
		i;
	if (hasAttribute(node, 'hint')) {		
		focusHandler = function() {
			tooltip(node, root, get('tooltip'), node.getAttribute('hint'));
			node.validator.validate(node.getValue());
		};
		blurHandler = function() {
			hidetip(node);
			node.validator.validate(node.getValue());
		};
	}
	
	for (i = 0; i < events.length; i++) {
		switch (events[i]) {
			case 'blur'    : node.onblur  = handler; break;
			case 'focus'   : node.onfocus = focusHandler; break;
			case 'reflect' : node.onkeyup = blurHandler; break;
			case 'click'   : node.onclick = handler; break;
		}
	}
}

function hasAttribute(node, attrName) {return node.getAttribute(attrName) != null;}

function recursiveParse(node, root, system) {
	var i, nodeName, nodesName, events, validators, priority, nodes = [], children;
	if ((system) && (node)) {
		if ((hasAttribute(node, 'metaValidate')) && (hasAttribute(node, 'name'))) {
			nodeName = node.getAttribute("name") || false;
			if (nodeName) {
				system.registerNode(node, nodeName);
				if (hasAttribute(node, 'metaValidatorType')) {
					validators = node.getAttribute('metaValidatorType').split(', ');
					if (!node.validator) {
						priority   = node.getAttribute('metaValidatorPriority') || 'optional';
						node.validator = localValidatorSystem(node, priority, system, node.getAttribute('metaClientCorrect') || false, node.getAttribute('metaClientError') || false);
					}
					for (i = 0; i < validators.length; i++) {						
						node.validator.attachValidator(singleValidatorFactory(validators[i]));
					}
				}

				if (hasAttribute(node, 'metaValidatorMatch')) {
					nodesName = node.getAttribute('metaValidatorMatch').split(', ');
					nodes[0] = node;
					for (i = 0; i < nodesName.length; i++) {									
						nodes[nodes.length] = system.nodes[nodesName[i]] || false;						
					}
					system.addExternalValidator(extarnalValidatorFactory('match', nodes));
				}

				if (hasAttribute(node, 'metaClientEvent')) {
					events = node.getAttribute('metaClientEvent').split(', ');
					parseClientEvents(node, root, events);
				}
			}
		} else {
			if (hasAttribute(node, 'hint')) {
				if (node.tagName === 'INPUT') {
					node.onfocus = function () {
						tooltip(node, root, get('tooltip'), node.getAttribute('hint'))
					};
					node.onblur = function () {
						hidetip(node)
					};
				} else {
					node.onmouseover = function () {
						tooltip(node, root, get('tooltip'), node.getAttribute('hint'))
					};
					node.onmouseout = function () {
						hidetip(node)
					};
				}
			}
		}
		if (node.type === 'submit') {
			clientStatusVisualisator.attachHandlers(node, node.getAttribute('metaClientCorrect') || false, node.getAttribute('metaClientError') || false);
			system.addSubmitButton(node);
		}
		children = node.childNodes || false;
		if ((children) && (children.length > 0)) {
			for (i = 0; i < children.length; i++) {
				if (children[i].nodeType === 1) {
					recursiveParse(children[i], root, system);
				}
			}		
		}
	}
}

function createFormValidator(obj) {
	var system   = validationSystemFactory(obj, obj.getAttribute('metaSubmitLoyality') || 'loyal');

	if (obj.childNodes) {
		recursiveParse(obj.childNodes[0], obj.childNodes[0], system);
	}
}

function sendPostData (form, script, needMsg, info) {
	needMsg = needMsg || false;
	var
		inputs = form.getElementsByTagName('input'),
		textareas = form.getElementsByTagName('textarea'),
		selects = form.getElementsByTagName('select'),
		params = {},
		url = pagePath + '/scripts/' + script,
		i;
	for (i = 0; i < inputs.length; i++ ) {
		switch (inputs[i].type) {
			case'checkbox':
				params[inputs[i].name] = inputs[i].checked;
				break;
			case 'radio':
				if (inputs[i].checked) {
					params[inputs[i].name] = inputs[i].value;
				}
				break;
			default:
				params[inputs[i].name] = inputs[i].value;
				break;
		}
	}
	for (i = 0; i < textareas.length; i++ ) {
		params[textareas[i].name] = textareas[i].value;
		if (tinyMCE) {
			if ((textareas[i].id) && (tinyMCE.get(textareas[i].id))) {
				params[textareas[i].name] = tinyMCE.get(textareas[i].id).getContent();
			}
		}
	}
	for (i = 0; i < selects.length; i++ ) {
		params[selects[i].name] = selects[i].value;
	}
	if (needMsg) {
		//getUrl(url, showFormMessage, 'POST', params);
		getUrlWithObject(url, showFormMessage, {form: form, info: info}, 'POST', params)
	} else {
		getUrl(url, function() {}, 'POST', params);
	}
	return false;
}// ---- /work/units/formValidator/formValidator.js ---- 
// ==== /work/units/formValidator/jsCalcPrice.js ==== 
function TCalcForm(obj)
{
	this.rootObj	= obj;//главный наш обьект(форма или див)
	this.sum		= 0;// общая сумма
	this.sumField	= null;//Поле в котором выводится ИТОГО:
	this.inp		= new Array();//поля по которым идет подсчет

	this.addField = function(obj)
	{
		this.inp[this.inp.length]=obj;
		obj.price = obj.getAttribute('price');
		obj.calcForm = this;
		
		var caller = this;
		obj.onkeyup = function () {caller.calcAllSum()};
		obj.onmouseup = function () {caller.calcAllSum()};
		obj.onchange = function () {caller.calcAllSum()};
	}
	//инициализация поля общей суммы
	this.setSumField = function(obj)
	{
		this.sumField = obj;
		this.sumField.searchForm = this;
		this.calcAllSum();// SumField должен быть последним. иначе не все посчитаются.
		this.sumField.innerHTML = this.sum;
	}
	this.calcAllSum = function () {		
		this.sum = 0;
		for (var i = 0; i < this.inp.length; i++ ) {			
			if ((this.inp[i].type == 'text') || (this.inp[i].type == 'hidden') || (this.inp[i].tagName == 'SELECT')) {
				this.sum = parseInt(this.sum) + parseInt(this.inp[i].value) * this.inp[i].price;
			}
			if ((this.inp[i].type == 'checkbox') || (this.inp[i].type == 'radio')) {
				if (this.inp[i].checked) {
					this.sum = parseInt(this.sum) + parseInt(this.inp[i].price);
				}
			}
		}
		this.sumField.innerHTML = this.sum
    //Инпут хидден с суммой
    document.getElementById('prise').value = this.sum;
	}
}

//цепляет модуль поиска к какому-то обьекту,например к форме ,или диву
function createPriceCalc(obj)
{
	obj.calcForm = new TCalcForm(obj);
}
//цепляет функцию обработки одного поля ввода
function applyCalcField(obj)
{
	var curObj = obj;
	while(curObj.parentNode != null)
	{
		if(curObj.calcForm != null)
		{
			curObj.calcForm.addField(obj);
			break;
		}
		curObj = curObj.parentNode;
	}
}

//цепляет функцию обработки кнопки начала поиска
function applyCalcSum(obj)
{
	var curObj = obj;
	while(curObj.parentNode != curObj)
	{
		if(curObj.calcForm!=null)
		{
			curObj.calcForm.setSumField(obj);

			break;
		}
		curObj = curObj.parentNode;
	}
}
// ---- /work/units/formValidator/jsCalcPrice.js ---- 
// ==== /work/units/registrationForm/registrationForm.js ==== 
//Отображает нужный блок и скрывает остальные
function radio_onclick(mode){
	switch(mode){
		case 1:var div1 = document.getElementById('1');
					div1.style.display = 'block';
					var div2 = document.getElementById('2');
					div2.style.display = 'none';
					var div3 = document.getElementById('3');
					div3.style.display = 'none';break;
		case 2:var div2 = document.getElementById('2');
					div2.style.display = 'block';
					var div3 = document.getElementById('3');
					div3.style.display = 'none';
					var div1 = document.getElementById('1');
					div1.style.display = 'none';break;
		case 3:var div3 = document.getElementById('3');
					div3.style.display = 'block';
					var div1 = document.getElementById('1');
					div1.style.display = 'none';
					var div2 = document.getElementById('2');
					div2.style.display = 'none';break;
	}
}

//Получает все поля формы и отправляет их скрипту
function registerUser(){
	var script = 'register_user.php';
	var form = document.registration;
	var
		inputs = form.getElementsByTagName('input'),
		textareas = form.getElementsByTagName('textarea'),
		selects = form.getElementsByTagName('select'),
		params = {},
		url = '/scripts/' + script,
		i;
	for (i = 0; i < inputs.length; i++ ) {
		switch (inputs[i].type) {
			case'checkbox':
				params[inputs[i].name] = inputs[i].checked;
				break;
			case 'radio':
				if (inputs[i].checked) {
					params[inputs[i].name] = inputs[i].value;
				}
				break;
			default:
				params[inputs[i].name] = inputs[i].value;
				break;
		}
	}
	for (i = 0; i < textareas.length; i++ ) {
		params[textareas[i].name] = textareas[i].value;
		if (tinyMCE) {
			if ((textareas[i].id) && (tinyMCE.get(textareas[i].id))) {
				params[textareas[i].name] = tinyMCE.get(textareas[i].id).getContent();
			}
		}
	}
	for (i = 0; i < selects.length; i++ ) {
		params[selects[i].name] = selects[i].value;
	}
		getUrl(url, registrationResult, 'POST', params);
	return false;
	
}

//Проверка логина на занятость
function verifyLogin(){
	getUrl('scripts/verify_login.php?login='+document.getElementById('userlogin').value,returnLogin);
}

//Функция обратного вызова. Выводит результат проверки логина
function returnLogin(a,b,result){
	var div = document.getElementById('status1');
	var input = document.getElementById('userlogin');
	var array = result.split(',');
	input.className = array[1];
	div.innerHTML = '';
	div.innerHTML = array[0];
}

//Результат регистрации
function registrationResult(a,b,result){
	if(result == 1){
		var divreg = document.getElementById('registartionForm');
		divreg.innerHTML = '';
		divreg.innerHTML = 'Спасибо за регистрацию';
	} else {
		//document.registration.reset();
		var div = document.getElementById('resultRegistration');
		var divreg = document.getElementById('registartionForm');
		div.innerHTML = '';
		div.innerHTML = result;
		divreg.scrollTop = 0;
	}
	
}// ---- /work/units/registrationForm/registrationForm.js ---- 
// ==== /work/units/regCatalogForm/adminRegCatalog.js ==== 
var
	adminRegCatalogDiv;
function initAdminRegCatalogDiv (obj) {	
	adminRegCatalogDiv = obj;
}

function reloadReqList(a, b, replay) {
	adminRegCatalogDiv.innerHTML = replay;
}

function delReq(id) {
	getUrl(pagePath + '/scripts/delReq.php?id=' + id, function(){});
	getUrl(pagePath + '/scripts/adminRegCatalog.htm', reloadReqList);
}

function openReq(id) {
	getUrl(pagePath + '/scripts/openReq.htm?id=' + id, reloadReqList);
}

function enableSubCategoryAdmin (select) {
	var selects = select.parentNode.parentNode.parentNode.getElementsByTagName('SELECT');
	for (var i = 0; i < selects.length; i++) {
		if (selects[i].name == 'subCategory') {
			subCategorySelect = selects[i];
		}
	}
	if (select.value == -1) {
		subCategorySelect.disabled = true;
		subCategorySelect.innerHTML = '';
	} else {
		var url = [pagePath, '/scripts/subCategory.php?parent_id=', select.value].join('');
		getUrl(url, fillsubCategorySelect);
	}
}

function insertInCatalog(id) {
	getUrl(getPagePath() + '/scripts/insert_in_catalog.php?id=' + id, function () {});
}// ---- /work/units/regCatalogForm/adminRegCatalog.js ---- 
// ==== /work/units/regCatalogForm/regCatalogForm.js ==== 
var
	globalCatalogRegHelp,
	biznesTable, regCatalogInfo, regCatalogForm,
	tinyMCE, dopInfTable, tarifInp, labelPrice;
	
function initCatalogRegHelp (obj) {
	globalCatalogRegHelp = obj
}

function initRegCatalogForm (obj) {
	regCatalogForm = obj;
}

function initRegCatalogInfo (obj) {
	regCatalogInfo = obj;
}

function initSubCategory (obj) {
	obj.disabled = true;
	subCategorySelect = obj;
}

function fillsubCategorySelect (a, b, replay) {	
	subCategorySelect.disabled = false;
	subCategorySelect.innerHTML = '';
	var xmlDoc = XML.parse(replay), root = xmlDoc.documentElement || false,
		children = root.childNodes;
	for (var i = 0; i < children.length; i++) {
		if (children[i].nodeType == 1) {
			var option = document.createElement('option');
				option.innerHTML = children[i].getAttribute('name');
				option.value = children[i].getAttribute('value');
			subCategorySelect.appendChild(option);
		}
	}
	//subCategorySelect.innerHTML = replay;
}

function enableSubCategory (select) {
	if (select.value == -1) {
		subCategorySelect.disabled = true;
		subCategorySelect.innerHTML = '';
	} else {
		var url = [pagePath, '/scripts/subCategory.php?parent_id=', select.value].join('');
		getUrl(url, fillsubCategorySelect);
	}
}

function initBiznesTable (obj) {
	obj.style.display = 'none';
	biznesTable = obj;
}

function showBiznesTable () {
	biznesTable.style.display = 'block';
	tarifInp.value = 2;
	labelPrice.price = 100;
	tarifInp.calcForm.calcAllSum();
}

function initDopInfTable(obj) {
	dopInfTable = obj;
}

function initTarif(obj) {
	tarifInp = obj;
}

function initlabelPrice(obj) {
	labelPrice = obj;
}

function hideBiznesTable () {	
	biznesTable.style.display = 'none';
	var inputs = dopInfTable.getElementsByTagName('INPUT');
	for (var i = 0; i<inputs.length; i++) {
		inputs[i].value = 0;
	}
	tarifInp.value = 1;
	//labelPrice.setAttribute('price', '50');
	labelPrice.price = 50;
	tarifInp.calcForm.calcAllSum();
}

function closeRegCatalogForm () {
	globalCatalogRegHelp.hide();
}

function showFormMessage(a, b, replay, params) {
	params.form.style.display = 'none';
	params.info.style.display = 'block';
	params.info.innerHTML = replay;
	params.info.style.textAlign = "center";
}

function closeRegCatalogFormEsc () {
		event = event || window.event;
		if(event.keyCode == 27){
			globalCatalogRegHelp.hide();
		}
}

function goToPay () {
  //Редирект на форму оплаты(временно отключён)
	//window.open('https://www.liqpay.com/?do=clickNbuy&preorder=7846fdc172f539a1d67ca9ca70c63c43091bb195', '_blank');
}// ---- /work/units/regCatalogForm/regCatalogForm.js ---- 
// ==== /work/units/calendar/calendar.js ==== 
// JavaScript Document
function calendarFactory(obj) {
	var resultObject = {
		getRootObject : function() {return obj;},
		months        : ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
		days          : ["пн", "вт", "ср", "чт", "пт", "сб", "вс"],
		currentDate   : new Date(),
		currentYear   : null,
		currentMonth  : null,
		daysPerMonth  : null,
		firstday      : null,
		calendarRoot  : null,
		yearOffset    : 0,
		monthOffset   : 0,
		recountDates  : function() {
							this.currentYear   = this.currentDate.getFullYear();
							this.currentYear  += this.yearOffset;
							this.currentMonth  = this.currentDate.getMonth();
							this.currentMonth += this.monthOffset;
							this.firstday      = ((new Date(this.currentYear, this.currentMonth, 1)).getDay() + 6) % 7;
							this.daysPerMonth  = [31, (((this.currentYear % 4) === 0 ) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31];
						},
		createTable   : function() {
							if (this.getRootObject()) {
								var fragment = document.createDocumentFragment(),
									table    = document.createElement('TABLE'),
									tbody    = document.createElement('TBODY'),
									row      = document.createElement('TR'),
									left     = document.createElement('IMG'),
									right    = document.createElement('IMG'),
									month    = document.createElement('SPAN'),
									year     = document.createElement('SPAN'),
									today    = {day: this.currentDate.getUTCDate(), month: this.currentDate.getMonth(), year: this.currentDate.getFullYear()},
									td, i;
								td = document.createElement('TD');
								td.setAttribute('colSpan', 7);
								td.className = 'calendarHeader';
								left.src  = getPagePath() + '/images/calendarLeftArrow.gif';
								right.src = getPagePath() + '/images/calendarRightArrow.gif';
								
								var caller    = this;								
								left.onclick  = function() {caller.subtractMonth(); caller.redraw();};
								right.onclick = function() {caller.addMonth(); caller.redraw();};
								
								td.appendChild(left);
								month.innerHTML = ['&nbsp;<strong>', this.months[this.currentMonth],'</strong>&nbsp;'].join("");
								td.appendChild(month);
								td.appendChild(right);
								year.innerHTML += ['&nbsp;', this.currentYear,'г.&nbsp;'].join("");
								td.appendChild(year);								
								
								
								
								row.appendChild(td);
								tbody.appendChild(row);
								row = document.createElement('TR');
								row.className = 'calendarDateRow';
								for (i = 0; i < this.days.length; i++) {
									td = document.createElement('TD');
									td.innerHTML = '<span>' + this.days[i] + '</span>';
									row.appendChild(td);
								}
								tbody.appendChild(row);
								row = document.createElement('TR');
								for (i = -this.firstday; i < this.daysPerMonth[this.currentMonth] + Math.ceil((this.daysPerMonth[this.currentMonth] + this.firstday) / 7) * 7 - (this.daysPerMonth[this.currentMonth] + this.firstday); i++) {
									td = document.createElement('TD');
									td.className = 'dateCell';
									if ((i >= 0) && (i < this.daysPerMonth[this.currentMonth])) {
										td.innerHTML = ['<span>', i + 1, '</span>'].join("");
										
										td.className += ' thisMonth';
										if ((this.currentMonth === today.month) && (this.currentYear === today.year) && (i + 1 === today.day)) {
											td.className += ' today';
										}
										else {
											var rand = Math.random()*3;
											if (rand > 1) {td.className += ' hasEvent';}
											if (rand > 2) {td.className += ' hasSpecialEvent';}
										}
									}
									row.appendChild(td);
									if (((i + this.firstday + 1) % 7 === 0) && (i + this.firstday !== 0)) {
										tbody.appendChild(row);
										row = document.createElement('TR');
									}
								}
								tbody.appendChild(row);
								table.appendChild(tbody);
								fragment.appendChild(table);
								this.getRootObject().appendChild(fragment);
								this.calendarRoot = table;
							}
						},
		create        : function() {
							this.recountDates();
							this.createTable();
						},
		destroy       : function() {
							this.getRootObject().removeChild(this.calendarRoot);
						},
		redraw        : function() {
							this.destroy();
							this.create();
						},
		subtractMonth : function() {
							if (this.monthOffset === 0) {
								this.yearOffset--;
								this.monthOffset = 11;
							} else {
								this.monthOffset--;
							}
						},
		addMonth      : function() {
							if (this.monthOffset === 11) {
								this.yearOffset++;
								this.monthOffset = 0;
							} else {
								this.monthOffset++;
							}
							myLog(this.monthOffset);
						}
	};
	resultObject.create();
}// ---- /work/units/calendar/calendar.js ---- 

