function ok(){

var app = (function()
{
	if( navigator.appVersion.match(/MSIE 6./) )
	{
		var holder = document.createElement( 'div' );
			holder.id = 'update-message';
		
		holder.innerHTML = "Для нормального отображения сайта нужна более новая версия браузера, пожалуйста <a href='http://www.microsoft.com/rus/windows/internet-explorer/'>обновите</a> или установите другой (<a href='http://www.mozilla.com/ru/'>Firefox</a>, <a href='http://www.opera.com/'>Opera</a>, <a href='http://www.google.com.ua/chrome'>Google Chrome</a>). Простите за неудобства.";
		
		holder.style.left = ( document.body.offsetWidth - 444 ) / 2 + 'px';
		
		var p = document.createElement( 'p' );
			p.className = 'plink';
			p.innerHTML = 'закрыть';
			p.onclick = function()
			{
				holder.parentNode.removeChild( holder );
			}
		holder.appendChild( p );
		
		document.body.appendChild( holder );
		
		//document.body.appendChild( holder );
	}	
	
})()	
	
	if( document.getElementById( 'pt' ) ) products_catalogue();
	
	if( document.message ) message();
	
	if( document.getElementById( 'map' ) ) createVisicomMap();
	
function products_catalogue()
{	
	Number.prototype.addSpaces = function()
	{
		var str = this + '';
		
		var count = 0;
		var out = '';
			
		for( var i = 1; i <= str.length; i++)
		{
			if (count % 3 == 0) 
				out = ' ' + out;
			out = str.charAt(str.length - i) + out;
			count++;
		}
		return out;
	}
	
	function windowGeometry( what )
	{
		var geometry = [];
		
		if( window.innerWidth ) // W3C
		{ 
			geometry['width']  = function(){ return window.innerWidth };
			geometry['height'] = function(){ return window.innerHeight };
			geometry['scroll'] = function(){ return window.pageYOffset };
		}		
		else // IE
		{
			geometry['width']  = function(){ return document.documentElement.clientWidth };
			geometry['height'] = function(){ return document.documentElement.clientHeight };
			geometry['scroll'] = function(){ return document.documentElement.scrollTop };
		}
		
		return geometry[ what ]();
	}
		
	
	var pt = new Pt(  );	//	Pt - Products table
	
	function Pt(  )
	{
		//var holder = node;
		
		var data = new Data();		
		
		var ptSwitch = new PtSwitch( data );
	}
	
	function Data(  )
	{
		var holder = document.getElementById( 'pt-data' )
		remove_text_nodes( holder );
		
		var head = document.getElementById( 'pt-head' );
		remove_text_nodes( head );
		
		//	получить названия колонок из шапки
		var title = [];
		for( var i = 0; i < head.childNodes.length; i++ )
			title.push( head.childNodes[i].className );
		
		this.getTitles = function()
		{
			var out = [];
			
			for( var i = 0; i < title.length; i++ )
				out.push( title[i] )
			
			return out;
		}
		
		
		//	добавлялка пробелов между цифрами в числе
		var spacesInNumber = function ( value )
		{
			//	Добавлялка пробелов между каждым 3 знаком числа (это для цены)
			//	str - строка для удаления
			
			var str = value + '';
			
			var count = 0;
			var out = '';
				
			for( var i = 1; i <= str.length; i++)
			{
				if (count % 3 == 0) 
					out = ' ' + out;
				out = str.charAt(str.length - i) + out;
				count++;
			}
			return out;
		}
				
		//	преобразовывалка нужных данных (из ячейки) в нужный тип
		var dataView = function( string, type )
		{
			//	string - строка
			//	type - тип, которому она соответствует (цена, грузоподъемность и т.д.)
			//	!!! возвращает строку, число или массив
			
			var val;
			
			switch( type )
			{
				//case 'id': val = '<a href="#' + string + '">' + string + '</a>';
				//break;
				case 'capacity': val = string.replace(/\./, ',');
				break;				
				case 'lift_height': val = string.replace(/\./, ',');
				break;
				case 'free_lift': val = string == 'есть' ? '<span class="icon-yes"></span>' : '';
				break;
				case 'price': val = spacesInNumber( string );
				break;
				
				default: val = string;			
			}
			
			return val;
		}
		
		//	преобразовывалка нужных данных (из ячейки)  в нужный вид
		var dataFormat = function( node, type )
		{
			//	string - строка
			//	type - тип, которому она соответствует (цена, грузоподъемность и т.д.)
			//	!!! возвращает строку
						
			if( node.getElementsByTagName('span').length )
			{
				var val = {};
				var k, v;
				for( var i = 0; i < node.getElementsByTagName('span').length; i++ )
				{
					k = node.getElementsByTagName('span')[i].className;
					v = parseFloat( node.getElementsByTagName('span')[i].innerHTML );
							
					val[k] = v;
				}
				
				
				//txt = '';    for( var k in val )    txt += k + ": " + val[k] + "\n";    alert( txt );
				
				
			}
			else
			{
				var val;
				var str = node.innerHTML;
				
				switch( type )
				{
					case 'id': 			val = parseFloat( str ); 
					break;						
					case 'capacity': 	val = parseFloat( str );
					break;					
					case 'lift_height': val = parseFloat( str );
					break;					
					case 'year': 		val = parseFloat( str );
					break;					
					case 'price': 		val = parseFloat( str );
					break;					
					case 'free_lift': 	val = str ? 'вагон-контейнер' : '';					
					break;					
					case 'stock': 		val = str == 'на складе' ? 'в наличии' : '';
					break;
					
					default: 			val = str;
				}
				
				if( typeof(val) == 'number' && isNaN(val) ) val = 0;
				
			}
			
			return val;
		}
		
		
		var Display = function(){}		
		Display.prototype.all = function()
		{
			for( var i in this )
				if( !this[i] )
					return false;
			return true;
		}
		
		
		var storage = [];
		
		var temp;	
		while( holder.firstChild )
		{			
			holder.firstChild.val = {};
			holder.firstChild.display = new Display();			
			
			for( var c = 0; c < holder.firstChild.childNodes.length; c++ )
			{
				temp = holder.firstChild.childNodes[c];
				
				holder.firstChild.val[ title[c] ] = dataFormat( temp, title[c] );
				
				holder.firstChild.childNodes[c].className = title[c];
				
				temp.innerHTML = dataView( temp.innerHTML, title[c] )
				
				holder.firstChild.display[ title[c] ] = true;
				
				
					
				
			}
			
			//txt = '';   for( var p in holder.firstChild.val )    txt += p + ": " + holder.firstChild.val[p] + "\n";    alert( txt );
			
			
			
			holder.firstChild.dataline = document.createElement( 'div' );
			while( holder.firstChild.firstChild )
			{	
				holder.firstChild.dataline.appendChild
				(
					holder.firstChild.removeChild( holder.firstChild.firstChild )
				);
			}
			holder.firstChild.appendChild( holder.firstChild.dataline )			
			holder.firstChild.dataline.className = 'dataline';
			
									//	_ , т.к. появляются нерешенные бока с прокруткой
			holder.firstChild.dataline._id = holder.firstChild.val.id;
			
			holder.firstChild.dataline.onclick = function()
			{
				showCurrent( this._id )
			};
			
			
			switch( holder.firstChild.val.type )
			{
				case 'вилочный погрузчик': holder.firstChild.group = 'forklift';
				break;
				case 'навесное оборудование': holder.firstChild.group = 'attachment';
				break;
				default: holder.firstChild.group = 'misc';
			}
			
			storage.push( holder.removeChild(  holder.firstChild ) )
		}
		
		
		this.getGroupById = function( id )
		{
			for( var i = 0; i < storage.length; i++ )
				if( storage[i].val.id == id )
					return storage[i].group;
		}
		
		this.switchGroup = function( group )
		{
			while( holder.firstChild )
			{
				storage.push( holder.removeChild( holder.firstChild ) )
			}
			
			
			var temp_storage = [];
			var temp;
			while( storage.length )
			{
				temp = storage.pop()
				
				temp.group == group
				? holder.appendChild( temp )
				: temp_storage.push( temp )
			}
			storage = temp_storage;
		}
		
		
		this.sort = function( col, order )
		{
			//alert( holder.childNodes.length )
			if( order == 'down' )
			{
				for( var k = 0; k < holder.childNodes.length - 1; k++ )
					for( var i = 0; i < holder.childNodes.length - 1; i++ )
					{
						//alert( holder.childNodes[i].nodeType )
						if( holder.childNodes[i].val[col] > holder.childNodes[i + 1].val[col] )
							holder.insertBefore( holder.childNodes[i + 1], holder.childNodes[i] );
					}
			}
			else
			{
				for( var k = 0; k < holder.childNodes.length - 1; k++ )
					for( var i = 0; i < holder.childNodes.length - 1; i++ )
						if( holder.childNodes[i].val[col] < holder.childNodes[i + 1].val[col] )
							holder.insertBefore( holder.childNodes[i + 1], holder.childNodes[i] );
			}
		}
		
		//this.sort( 'lift_height', 'up' )
		
		
		this.resetFilters = function()
		{
			for( var i = 0; i < holder.childNodes.length; i++ )
			{
				for( var d in holder.childNodes[i].display )
					if( holder.childNodes[i].display.hasOwnProperty( d ) )
					{
						holder.childNodes[i].display[d] = true;
						holder.childNodes[i].style.display = ''
					}
						
			}
		}
		
		this.filter = function( type, value )
		{
			/*
				type - название колонки по которой фильтруются данные
				value - значение от фильтра, бывает разных типов
					- (select)   просто строковое значение
					- {slider}   массив с минимальным[0] и максимальным[1] значениями 
					- (checkbox) массив со строковым[0] и булевым[1] значениями
			*/
			
			
			var group = (function()
			{
				if( type == 'type' || type == 'brand' || type == 'attachment_type' )
					return 'select';
				
				if ( type == 'engine' )
					return 'checkbox';
				
				if( type == 'stock' || type == 'free_lift' )
					return 'checkbox2';
					
				if( type == 'capacity' || type == 'lift_height' || type == 'year' || type == 'price' )
					return 'slider';				
			})()
			
			switch( group )
			{
				case 'select':
				{
					if( value == 'все' )
					{
						for( var i = 0; i < holder.childNodes.length; i++ )
							holder.childNodes[i].display[type] = true
					}
					else
					{
						for( var i = 0; i < holder.childNodes.length; i++ )
							holder.childNodes[i].val[type] == value 
							? holder.childNodes[i].display[type] = true
							: holder.childNodes[i].display[type] = false
					}	
				}
				break;
				
				case 'checkbox':
				{
					for( var i = 0; i < holder.childNodes.length; i++ )
						if( holder.childNodes[i].val[type] == value[0] )
							holder.childNodes[i].display[type] = value[1];
				}
				break;
				
				case 'checkbox2':
				{
					if( value[1] )
					{
						for( var i = 0; i < holder.childNodes.length; i++ )
						{
							holder.childNodes[i].val[type] == value[0]
							? holder.childNodes[i].display[type] = true
							: holder.childNodes[i].display[type] = false
						}
					}
					else
					{
						for( var i = 0; i < holder.childNodes.length; i++ )
						{
							holder.childNodes[i].display[type] = true;
						}
					}
				}
				break;
				
				case 'slider':
				{
					
					for( var i = 0; i < holder.childNodes.length; i++ )
					{
						//alert( value[0] + ' > ' + holder.childNodes[i].val[type] + ' > ' + value[1] )
						
						if
						(
							holder.childNodes[i].val[type] >= value[0] && 
							holder.childNodes[i].val[type] <= value[1]
						)
						{							
							
							holder.childNodes[i].display[type] = true;
						}
						else
						{
							holder.childNodes[i].display[type] = false;
						}
					}
				}
				break;
			}
			
		
			
			
			for( var i = 0; i < holder.childNodes.length; i++ )
			{
				holder.childNodes[i].display.all()
				? holder.childNodes[i].style.display = ''
				: holder.childNodes[i].style.display = 'none';
			}
		}
		
		//this.filter( 'price', [3000, 13000] );
		
		
		
		this.getFilterValues = function( colname )
		{
			var arr = [];
			
			//	получить массив из колонки
			for( var i = 0; i < holder.childNodes.length; i++ )
				arr.push( holder.childNodes[i].val[colname] );
			
			//	поудалять пустые элементы
			var arr_new = [];
			var tmp;
			while( arr.length )
			{
				tmp = arr.pop()
				if( tmp )
					arr_new.push( tmp )
			}
			
			//	отсортировать
			if( typeof( arr_new[0] ) == 'number' )
			{
				var as_number = function( a, b ){ return a - b };
				arr_new.sort( as_number );
			}
			else
				arr_new.sort();
			
			//	поудалять одинаковые элементы
			arr = [];
			for( var i = 0; i < arr_new.length; i++ )
			{
				if( arr_new[i] != arr_new[i+1] )
					arr.push( arr_new[i] )
			}
			
			return arr;
		}
		
		
		//alert( this.getFilterValues( 'attachment_type' ) );
		
		var lastShowed;
		var showCurrent = function( id )
		{			
			for( var i = 0; i < holder.childNodes.length; i++ )
			{
				if( holder.childNodes[i].val.id == id )
				{
					if( holder.childNodes[i].current )
					{
						holder.childNodes[i].current.show();
					}
					else
					{						
						holder.childNodes[i].current = Current( holder.childNodes[i] );
						holder.childNodes[i].appendChild( holder.childNodes[i].current );
					}
					//holder.childNodes[i].dataline.style.display = 'none';
					
					if( lastShowed )						
						lastShowed.dataline.style.backgroundColor = '';
					
					lastShowed = holder.childNodes[i];
					lastShowed.dataline.style.backgroundColor = '#e1e1e1';
					
					break;
				}
			}
		}
		
		this.showCurrent = function( id )
		{
			showCurrent( id )
		}
		
		
	}
	
	function Head( data )
	{
		var holder = document.getElementById( 'pt-head' );
		remove_text_nodes( holder );
		
		
		for( var i = 0; i < holder.childNodes.length; i++ )
		{
			holder.childNodes[i].p = holder.childNodes[i].firstChild;
			
			//	сортировка по 'грузоподъемности' типа по умолчанию
			if( holder.childNodes[i].className == 'capacity' )
			{
				//	узел с выбранным типом сортировки
				var selected_node = holder.childNodes[i];
					
				//	курсорчик
				var pointer = document.createElement( 'span' );
					
				//	
				data.sort( 'capacity', 'down' )
				selected_node.appendChild( pointer );
				selected_node.select = 'sort-down';
				pointer.className = 'sort-down';
			}
				
			if( holder.childNodes[i].className != 'attachment' )
			{
				holder.childNodes[i].p.style.cursor = 'pointer';
					
				holder.childNodes[i].p.onclick = function()
				{					
					//	перемещение курсорчика, когда переключается тип сортировки
					pointer = this.parentNode.appendChild( selected_node.removeChild(pointer) );
					
					//alert( pointer );
					
					//	установка подтипа сортировки (вверх/вниз) в undefined
					//	при переключении между типами сортировки
					if( selected_node.className != this.parentNode.className ) 
						selected_node.select = undefined;
						
					selected_node = this.parentNode;
					
					//	установка подтипа сортировки (вверх/вниз) и выполнение нужной сортирвки
					if( this.parentNode.select == 'sort-up' || this.parentNode.select == undefined )
					{
						//	запуск сортировки по убыванию по определенному типу
						data.sort( this.parentNode.className, 'down' );
							
						this.parentNode.select = pointer.className = 'sort-down';
					}
					else
					{
						//	запуск сортировки по возрастанию по определенному типу
						data.sort( this.parentNode.className, 'up' );
						
						this.parentNode.select = pointer.className = 'sort-up';
					}
				}
			}
				
		}
		
		
		this.makeFilters = function( cols_array )
		{
			for( var i = 0; i < holder.childNodes.length; i++ )
				if( holder.childNodes[i].filter )
				{
					holder.removeChild( holder.childNodes[i].filter.indicator );
					holder.removeChild( holder.childNodes[i].filter );
					holder.childNodes[i].filter = null;
				}
			
			var needed_cols = [];			
			while( cols_array.length )
				needed_cols[ cols_array.pop() ] = true;
			
			
			var col;
			for( var i = 0; i < holder.childNodes.length; i++ )
			{
				col = holder.childNodes[i].className;
				
				if( needed_cols[ col ] )
				{					
					if( col == 'type' || col == 'attachment_type' || col == 'brand'	)
						holder.childNodes[i].filter = new FilterSelect( data, col );
					
					if( col == 'capacity' || col == 'lift_height' || col == 'year' || col == 'price' )
						holder.childNodes[i].filter = new FilterSlider( data, col );
						
					if( col == 'engine' || col == 'free_lift' || col == 'stock' )
						holder.childNodes[i].filter = new FilterCheckBox( data, col );
				}				
				
				if( holder.childNodes[i].filter )
				{				
					holder.appendChild( holder.childNodes[i].filter );
					
					//	буковка, включается кокда используется фильтр
					holder.childNodes[i].filter.indicator = document.createElement( 'div' );
					holder.childNodes[i].filter.indicator.className = 'filter-indicator';
					holder.childNodes[i].filter.indicator.innerHTML = 'ф';					
					holder.appendChild( holder.childNodes[i].filter.indicator );
					
					with( holder.childNodes[i] )
					{						
						filter.indicator.style.left = (offsetLeft + offsetWidth - 9) + 'px';
						filter.indicator.style.display = 'none';
					}
					
					//	расположение фильтров
					if( col == 'price' || col == 'stock' )
						with( holder.childNodes[i] )
							filter.style.right =  954 - offsetLeft - offsetWidth / 2 + 'px';
					else
						with( holder.childNodes[i] )
							filter.style.left = offsetLeft + (offsetWidth / 2 + 12) + 'px';
					
					
					holder.childNodes[i].filter.style.display = 'none';
					
					holder.childNodes[i].onmouseover = function()
					{
						this.filter.style.display = '';				
					}
					holder.childNodes[i].onmouseout = function()
					{
												
						this.filter.style.display = 'none';
						//this.style.zIndex = '';
					}
					
					holder.childNodes[i].filter.onmouseover = function(  )
					{
						this.style.display = '';
					}
					
					holder.childNodes[i].filter.onmouseout = function()
					{
						
						if( !this.className.match(/filter-select/) )
						{
							this.style.display = 'none';
						}
						
					}
				}
				
			}
			
			
		}
		
	}
	
	function PtSwitch( data )
	{
		var holder = document.createElement( 'p' );		
		document.getElementById( 'pt-title' ).appendChild( holder )
		
		
		var group = {};
		
		if( location.pathname == '/attachment' )
		{
			group.attachment = 'Навесное оборудование';
		}
		else
		{
			group.misc = 'Другие типы техники';
			group.forklift = 'Вилочные погрузчики';			
		}
		/*
		var group = 
		{
			forklift: 	'Вилочные погрузчики',
			misc: 		'Другие типы техники',
			attachment: 'Навесное оборудование'
		};
		*/		
		var show_group =
		{
			forklift:	[ 'id', 'brand', 'engine', 'capacity', 'lift_height', 'free_lift', 'year', 'price', 'stock' ],
			misc:		[ 'type', 'brand', 'engine', 'capacity', 'lift_height', 'year', 'price', 'stock' ],
			attachment: [ 'id', 'attachment_type', 'capacity', 'attachment', 'price', 'stock' ],
			
			getCols: function( group_name )
			{
				var out = [];
				
				for( var i = 0; i < this[ group_name ].length; i++ )
					out.push( this[ group_name ][i] )
				
				return out;
			},
			
			getColsToHide: function ( group_name )
			{
				//	получить названия всех колонок
				var a = data.getTitles();	
				
				//	получить названия колонок для отображения
				var r = this.getCols( group_name )					
				
				var boof = [], r_temp, a_temp;
				
				while( r.length )
				{
					r_temp = r.pop();
					
					while( a.length )
					{
						a_temp = a.pop();
						
						if( r_temp != a_temp )
							boof.push( a_temp );
					}
					a = boof;
					boof = [];
				}
				
				return a;
			},
			
			getSelectorsToHide: function( group_name )
			{
				var colNames = this.getColsToHide( group_name )
				
				var out = [];
				
				for( var i in colNames )
				{
					if( colNames.hasOwnProperty( i ) )
					{
						out.push( '#pt-head .' + colNames[i] );
						out.push( '#pt-data .' + colNames[i] );
					}
					
				}				
								
				return out;
			}
		}
		
		var inf = document.createElement( 'i' );
			inf.innerHTML = 'Для информации о товаре нажмите на строке таблицы';
			inf.className = 'tp-help';
			
			
			holder.appendChild( inf );
		
		var span = {};			
		for( var i in group )
		{
			span[i] = document.createElement( 'span' );
			
			if( i == 'attachment' ) span[i].style.display = 'none';
			
			span[i].group = i;
			span[i].innerHTML = group[i];
			span[i].onclick = function()
			{
				selected.className = '';
				
				ptStylesheet.display(  show_group.getSelectorsToHide( this.group )  );
				
				data.switchGroup( this.group );
				
				this.className = 'selected';
				selected = this;
				
				data.resetFilters();
				
				//show_group.getColsToHide( this.group )
				
				head.makeFilters( show_group.getCols( this.group ) );
				
				
			}
			holder.appendChild( span[i] );
		}
		
		var ptStylesheet = new PtStylesheet();			
		
		var id = window.location.hash.substr(1);
		//id = 54;		
		
		if( id )
		{
			// определить группу по id
			var group_from_url = data.getGroupById( id );
			
		}
		
		//	если id нет или нет такого товара нет в каталоге,
		//	то group_from_url будет равен undefined
		if( group_from_url == undefined )
		{
			// чтобы не создавался current
			id = false;
			// определить группу по pathname
			var path = location.pathname.split('/');				
			
			group_from_url = path[ path.length - 1 ];
			
			//	неправильного pathname быть не может, т.к. зависит от
			//	сервера, который выдаст 404
			
			if( group_from_url == 'attachment' )
			{
				group_from_url = 'attachment';
			}
			else
			{
				group_from_url = 'forklift';
			}
			
			//	тестовое
			//group_from_url = 'forklift';
		}
		
	
		//	установить отображение нужных колонок колонок
		ptStylesheet.display(  show_group.getSelectorsToHide( group_from_url )  );			
		
		//	забить из storage в pt-data нужные childNodы
		data.switchGroup( group_from_url );
			
		//	обработать шапку
		var head = new Head( data );
		
		//	создать фильтры
		head.makeFilters( show_group.getCols( group_from_url ) );
		
		//	в самой главной переключалке указать выбранную группу	
		var selected = span[group_from_url];
		selected.className = 'selected';
		
		// если есть id создать current, прокрутить страницу
		if( id )
		{
			data.showCurrent( id );
			//setTimeout( function(){ window.scrollTo( 0, 0 ) }, 1000 );
		}
		
		/*
		ptStylesheet.display(  show_group.getSelectorsToHide('forklift')  );			
		
		data.switchGroup( 'forklift' );
			
		
		var head = new Head( data );
		
		
		head.makeFilters( show_group.getCols( 'forklift' ) );
			
		var selected = span['forklift'];
		selected.className = 'selected';
		*/
	}
	
	function FilterSelect( data, type )
	{
		var holder = document.createElement( 'div' );
			holder.className = 'filter-select';
		
		var select = document.createElement( 'select' );
			holder.appendChild( select );
		
		
			
		var options = data.getFilterValues( type );
		
		options.unshift( 'все' );
		
		for( i in options )
		{
			if( options.hasOwnProperty(i) )
			{
				try{		select.add( new Option( options[i], options[i] ), null )	}
				catch(e){	select.add( new Option( options[i], options[i] ) )			}	// IE
			}
		}
		
		select.onchange = function()
		{
			data.filter( type, this.options[ this.selectedIndex ].value );
			
			//	отображалка буквы ф - типа фильтр используется
			this.options[ this.selectedIndex ].value == 'все'
			? holder.indicator.style.display = 'none'
			: holder.indicator.style.display = '';
			
			
			holder.style.display = 'none';
			
		}
		
		//document.body.appendChild( holder )
		return holder;
	}
	
	function FilterSlider( data, type )
	{				
		var holder = document.createElement( 'div' );
			holder.className = 'filter-slider';		
		
		var options = data.getFilterValues( type );
		
		var values =
		{
			min: options[0],
			max: options[ options.length - 1 ]
		}
		
		values.mid = ( values.min + values.max ) / 2;
		
		var k = (values.max - values.min) / 20;
				
		var f2 = document.createElement( 'div' );
		var f1 = document.createElement( 'div' );
			holder.appendChild( f2 );
			holder.appendChild( f1 );
		
		var numbers = document.createElement( 'div' );
		var min = document.createElement( 'div' );			
		var mid = document.createElement( 'div' );
		var max = document.createElement( 'div' );			
			min.appendChild( document.createTextNode( values.min ) );
			
			type == 'year' || type == 'price'
			? mid.appendChild( document.createTextNode( values.mid.toFixed(0) ) )
			: mid.appendChild( document.createTextNode( values.mid.toFixed(1) ) );
			
			max.appendChild( document.createTextNode( values.max ) );			
			f1.appendChild( numbers );
			numbers.appendChild( min );
			numbers.appendChild( mid );
			numbers.appendChild( max );
		
		var meter = document.createElement( 'div' );			
		var m1 = document.createElement( 'div' );			
		var m2 = document.createElement( 'div' );
			f1.appendChild( meter );
			meter.appendChild( m1 );
			meter.appendChild( m2 );
		
		var pointer = document.createElement( 'div' );
		holder.left = document.createElement( 'div' );
		holder.right = document.createElement( 'div' );
		
		holder.left.onmousedown  = function( event ){ drag( event, this ) }
		holder.right.onmousedown = function( event ){ drag( event, this ) }
		
		holder.line = document.createElement( 'div' );
			f1.appendChild( pointer );
			pointer.appendChild( holder.left );
			pointer.appendChild( holder.right );
			pointer.appendChild( holder.line );
		
		holder.left.p  = document.createElement( 'span' );
		holder.right.p = document.createElement( 'span' );
		holder.left. p.appendChild( document.createTextNode( values.min ) );
		holder.right.p.appendChild( document.createTextNode( values.max ) );
		
		var labels = {};
		switch( type )
		{
			case 'year':
			{
				labels.from = 'с';
				labels.to = 'по';
			}
			break;
			case 'capacity':
			{
				labels.from = 'от';
				labels.to = 'до';
				labels.unit = 'тонн';
			}
			break;
			case 'lift_height':
			{
				labels.from = 'от';
				labels.to = 'до';
				labels.unit = 'метров';
			}
			break;
			case 'price':
			{
				labels.from = 'от';
				labels.to = 'до';
				labels.unit = 'у.е.';
			}
			break;
		}
		
		
		f2.appendChild( document.createTextNode( labels.from + ' ' ) );
		f2.appendChild( holder.left.p );
		f2.appendChild( document.createTextNode( ' ' + labels.to + ' ' ) );
		f2.appendChild( holder.right.p );
		if( labels.unit )
			f2.appendChild( document.createTextNode( ' ' + labels.unit ) );
		
		
		f1.className = 'f1';
		f2.className = 'f2';
		
		numbers.className = 'numbers';
		min.className = 'min';
		mid.className = 'mid';
		max.className = 'max';
		
		meter.className = 'meter';
		m1.className = 'm1';
		m2.className = 'm2';
		
		pointer.className = 'pointer';
		holder.left.className = 'left';
		holder.right.className = 'right';
		holder.line.className = 'line';
		
		
		
		holder.left. val = 0;
		holder.right.val = 200;
		holder.line. val = 200;
		
		
		holder.left. style.left  = 0 + 'px';		
		holder.right.style.right = 0 + 'px';		
		holder.line. style.left  = 0 + 'px';
		holder.line. style.width = 198 + 'px';
		
		
		holder.left.filterVal = values.min;
		holder.right.filterVal = values.max;

		var drag = function( event, elementToDrag )
		{
			//var elementToDrag = this;
			
			var event = event || window.event;
							
			// Координаты мыши (в оконных координатах)
			// в точке, откуда начинается перемещение элемента
			var startX = event.clientX;		
			
			// Начальная позиция (в координатах документа) перетаскиваемого элемента.
	        // Поскольку elementToDrag позиционируется в абсолютных
	        // координатах, предполагается, что его свойство offsetParent
	        // ссылается на элемент body документа.
			var origX =
			{
				left:  elementToDrag.offsetLeft,
				right: elementToDrag.offsetLeft + elementToDrag.offsetWidth
			};
			
			
			// Несмотря на то, что координаты исчисляются в различных системах
	        // координат, мы можем вычислить разницу между ними и использовать
	        // ее в функции moveHandler(). Этот прием будет работать,
	        // потому что при перетаскивании документ не прокручивается.
	        
	        
			// Зарегистрировать обработчики событий mousemove и mouseup,
	        // которые последуют вслед за событием mousedown.
	        if ( document.addEventListener )
			{
				// WC3
	            document.addEventListener("mousemove", moveHandler, true);
	            document.addEventListener("mouseup", upHandler, true);
			}
			else if (document.attachEvent)
			{
				// IE5+
	            elementToDrag.setCapture();
	            elementToDrag.attachEvent("onmousemove", moveHandler);
	            elementToDrag.attachEvent("onmouseup", upHandler);
	            
				// Интерпретировать событие потери перехвата как событие mouseup.
	            elementToDrag.attachEvent("onlosecapture", upHandler);
			}
			else
			{
				// IE4
				var oldmovehandler = document.onmousemove; // Используется в upHandler()
	            var olduphandler = document.onmouseup;
				document.onmousemove = moveHandler;
	            document.onmouseup = upHandler;
			}
			
			// Событие обработано, необходимо прервать его дальнейшее распространение.
	        if (event.stopPropagation) event.stopPropagation(); // DOM уровня 2
	        else event.cancelBubble = true; // IE
	        
			// Теперь необходимо предотвратить выполнение действия по умолчанию.
	        if (event.preventDefault) event.preventDefault(); // DOM уровня 2
	        else event.returnValue = false; // IE
	        
			/**
	        * Следующий обработчик перехватывает события mousemove в процессе
	        * перетаскивания элемента. Он отвечает за перемещение элемента.
	        **/
			
			function moveHandler(e)
			{
	        	if (!e) e = window.event; // Модель событий IE
	            
				holder.style.display = '';
							
				var position = Math.round( (e.clientX - ( startX - origX[elementToDrag.className] )) /10 ) * 10;				
				
				//	ограничение на минимальное и максимальное положение ползунка
				if( position < 0 )   position = 0;
				if( position > 200 ) position = 200;				
				
				holder[ elementToDrag.className ].val = position;
				
				
				//	ограничение на минимальное расстояние между ползунками
				if( (holder.right.val - holder.left.val) < 20 )
				{
					if( elementToDrag.className == 'left' )
						holder.left.val = holder.right.val - 20;
					
					if( elementToDrag.className == 'right' )
						holder.right.val = holder.left.val + 20;
				}				
				position = holder[ elementToDrag.className ].val;
				
				
				/*
				document.getElementById( 'position' ).innerHTML = position;				
				document.getElementById( 'test-el' ).innerHTML = 
					'delta: ' + (filter.right.val - filter.left.val) + ' >= 20 ' + '<br>' +
					'left: ' + filter.left.val + ' >= 0' + '<br>' +
					'right: ' + filter.right.val + ' <= 200';
				*/
				
					
					
					elementToDrag.filterVal = values.min + position * k / 10;
					
					
					type == 'year' || type == 'price'
					? elementToDrag.p.innerHTML = elementToDrag.filterVal.toFixed(0)
					: elementToDrag.p.innerHTML = elementToDrag.filterVal.toFixed(1);
					
					
					
					
					
					holder.line.val = holder.right.val - holder.left.val - 2;
					
					
					
					holder.left. style.left = holder.left. val + 'px';					
					holder.right.style.left = holder.right.val - 12 + 'px';
					
					
					holder.line.style.left  = holder.left.val + 'px';					
					holder.line.style.width = holder.line.val + 'px';
					
			
				
				
				
				
				//document.getElementById( 'test-el' ).innerHTML = holder.line.style.width;
				
				
				
				// И прервать дальнейшее распространение события.
	            if (e.stopPropagation) e.stopPropagation(); // DOM уровня 2
	            else e.cancelBubble = true; // IE
			}
			
			/**
	        * Этот обработчик перехватывает заключительное событие mouseup,
	        * которое возникает в конце операции перетаскивания.
	        **/
	        function upHandler(e)
			{				
				if (!e) e = window.event; // Модель событий IE
		        
				// Отменить регистрацию перехватывающих обработчиков событий.
		        if (document.removeEventListener)
				{
					// Модель событий DOM
		            document.removeEventListener("mouseup", upHandler, true);
		            document.removeEventListener("mousemove", moveHandler, true);
				}
		        else if (document.detachEvent)
				{
					// Модель событий IE 5+
		            elementToDrag.detachEvent("onlosecapture", upHandler);
		            elementToDrag.detachEvent("onmouseup", upHandler);
		            elementToDrag.detachEvent("onmousemove", moveHandler);
		            elementToDrag.releaseCapture();
				}
				else
				{
					// Модель событий IE 4
		            // Восстановить первоначальные обработчики, если они были
		            document.onmouseup = olduphandler;
		            document.onmousemove = oldmovehandler;
				}
		        // И прервать дальнейшее распространение события.
		        if (e.stopPropagation) e.stopPropagation( ); // DOM уровня 2
		        else e.cancelBubble = true; // IE
		        
				
				
				
				data.filter( type, [holder.left.filterVal, holder.right.filterVal] );
				
				
				holder.left.filterVal == values.min && holder.right.filterVal == values.max
				? holder.indicator.style.display = 'none'
				: holder.indicator.style.display = '';
				
			}
		}
		//document.body.appendChild( holder );
		
		
		
		return holder;		
	}
	
	function FilterCheckBox( data, type )
	{
		var holder = document.createElement( 'div' );
			holder.className = 'filter-checkbox';
		
		var options = data.getFilterValues( type );
		
		var label, checkbox = [], label_id;
		for( var i = 0 ; i < options.length; i++ )
		{
			label = document.createElement( 'label' );
			label_id = Math.random();
			label.htmlFor = label_id;
			
			checkbox[i] = document.createElement( 'input' );
			checkbox[i].type = 'checkbox';
			checkbox[i].id = label_id;
			checkbox[i].value = options[i];
			
			type == 'stock' || type == 'free_lift'
			? checkbox[i].defaultChecked = false
			: checkbox[i].defaultChecked = true;
			
			label.appendChild( checkbox[i] );
			label.appendChild( document.createTextNode(options[i]) );
			
			holder.appendChild( label );
			
			checkbox[i].onclick = function()
			{
				data.filter( type, [ this.value, this.checked ] );
				
				switch( type )
				{
					case 'engine':
					{
						holder.indicator.style.display = 'none';
						for( var i = 0; i < checkbox.length; i++ )
						{
							if( !checkbox[i].checked )
							{
								holder.indicator.style.display = '';
								break;
							}
						}
					}
					break;
					case 'free_lift':
					{
						this.checked
						? holder.indicator.style.display = ''
						: holder.indicator.style.display = 'none';
					}
					break;
					case 'stock':
					{
						this.checked
						? holder.indicator.style.display = ''
						: holder.indicator.style.display = 'none';
					}
					break;
				}
			}
		}
		
		//document.body.appendChild( holder );
		
		return holder;
	}
		
	function remove_text_nodes( node )
	{
		//	Удалялка текстовых узлов DOM, все браузеры кроме IE
		//	не универсальная - только для head и data
		//	node - узел для чистки
		
		var erase = [];
		for( var i = 0; i < node.childNodes.length; i++ )
		{
			if( node.childNodes[i].nodeType == 1 )
			{
				for( var j = 0; j < node.childNodes[i].childNodes.length; j++ )
				{
					if( node.childNodes[i].childNodes[j].nodeType == 1 )
					{
						for( var k = 0; k < node.childNodes[i].childNodes[j].childNodes.length; k++ )
							if( node.childNodes[i].childNodes[j].nodeType != 1 )
								erase.push( node.childNodes[i].childNodes[j].childNodes[k] );
					}
					else
					{
						erase.push( node.childNodes[i].childNodes[j] );
					}
				}					
			}
			else
				erase.push( node.childNodes[i] );
		}
		for( var i = 0; i < erase.length; i++ )
			erase[i].parentNode.removeChild( erase[i] );
	}
	
	function PtStylesheet()
	{
		var ss = document.styleSheets[0];		
		var rules = ss.cssRules ? ss.cssRules : ss.rules;
		
		var index;
		
		/* обязательно сделать чтобы при создании объекта,
		 * т.е. инициализации функции сразу же проверялся адрес и
		 * и применялся нужный вид
		 * */		
		
		var insert = function( selectors )
		{
			//var selectors = array_of_selectors;			
			var properties = 'display: none';			
			
			if( ss.insertRule )
			{
				var ins = selectors.join( ', ' ) + '{' + properties + '}';
				index = ss.insertRule( ins, rules.length )
			}
			else
			{
				index = [];
				for( var i in selectors )
				{
					if( selectors.hasOwnProperty(i) )
					{
						index.push( rules.length )
						ss.addRule( selectors[i], properties );
					}
					
				}
			}			
			//return index;
		}
		
		var remove = function( index )
		{
			if( typeof(index) == 'number' ) ss.deleteRule( index )
			else
				do{ ss.removeRule(index.pop()) } 
				while (index.length)
		};
				
		this.display = function( selectors )
		{
			//var selectors = hide_group.out( what )
			
			if( index ) remove( index )			
			insert( selectors )
		}		
	}
	
	function Current( node )
	{
		var val = node.val;
		
		var holder = document.createElement( 'div' );
			holder.className = 'current'		
		
			holder.style.top = ( windowGeometry('height') - 531 ) / 2 + windowGeometry('scroll') + 'px';
			holder.style.left = ( document.body.offsetWidth - 956 ) / 2 + 'px';
		
		holder.show = function()
		{
			this.style.display = '';
			this.style.top = ( windowGeometry('height') - 531 ) / 2 + windowGeometry('scroll') + 'px';
			this.style.left = ( document.body.offsetWidth - 956 ) / 2 + 'px';
			
			
		}
		
		var closer = document.createElement( 'a' );
			closer.className = 'current-close';
			closer.onclick = function()
			{
				holder.style.display = 'none';
				node.dataline.style.display = '';
			}
			
		var current_img = document.createElement( 'div' );
			current_img.className = 'current-img';
		
		
		var img = [];
		
		img[0] = new Image;
		img[0].src = '/products/img/' + val.id + '_1.jpg';
		img[0].className = 'current-img-big';
		current_img.appendChild( img[0] );
		
		var selected;
		
		var when_load = function( i )
		{
			
				
				if( i == 1 )
				{
					img[i].className = 'current-img-preview-select';
					selected = img[i];
				}
				else
				{
					img[i].className = 'current-img-preview';
				}
				
				current_img.appendChild( img[i] );
				
				
				img[i].onclick = function()
				{
					selected.className = 'current-img-preview';
					
					img[0].src = this.src;
						
					this.className = 'current-img-preview-select';
					selected = this;
				}
				
				load( i+1 )
		}
			
		var load = function( i )
		{
			img[i] = new Image;
			
			img[i].src = '/products/img/' + val.id + '_' + i + '.jpg';
			
			img[i].i = i;
			
			if( img[i].height )		//	для IE - ато какие-то проблемы с onload
			{
				when_load( i );
			}
			else					//	для остальных
			{
				img[i].onload = function()
				{
					when_load( i );
				}
			}
			
			
			
			
		}	
		load( 1 );
		
		
		
		
		
	
		

		
		
		var current_tab_holder = document.createElement( 'div' );
			current_tab_holder.innerHTML = CurrentTab( val );
			
		var clear_div = document.createElement( 'div' );
			clear_div.style.clear = 'both';
			
		
		holder.appendChild( closer )
		holder.appendChild( current_img );
		holder.appendChild( current_tab_holder );
		holder.appendChild( clear_div );		
		
		
		/*
		var pp = '<pre>';
		for( var i in val )
			pp += i + ": " + val[i] + "\n";
		
		pp += '</pre>';		
		holder.innerHTML = pp;
		*/
				
		return holder;		
	}
		
	function CurrentTab( product )
	{
		var ch =
		{
			year: 			'Год выпуска',
			capacity: 		['Грузоподъемность', 'т' ],
			lift_height: 	['Высота подъема', 'м' ],
			engine: 		'Двигатель',
			transmission: 	'КПП',
			free_lift: 		'Свободный ход каретки',
			ridding: 		'Навесное оборудование',
			tyre: 			'Шины',
			hours: 			['Наработка', 'м.ч' ],
			height: 		['Габаритная высота', 'м' ],
			mast: 			'Мачта',
			additional: 	'Диполнительно',
			price: 			['Цена', 'у.е.' ],
			rotation:		'Угол поворота',
			volume:			'Объем'
		}		
		
		
		var l = [];
		
		l.push( '<table class="current-tab">' );	
			l.push( '<thead>' );
				l.push( '<tr>' );
					l.push( '<td colspan="2" class="current-tab-head">' );
						l.push( '<p>' );
						if( product.brand ) l.push( product.brand + ' ' )
						if( product.model ) l.push( product.model )
						l.push( '</p>' );
					l.push( '</td>' )
				l.push( '</tr>' );
				l.push( '<tr>' );
					l.push( '<td class="current-tab-c1">№</td>' )
					l.push( '<td class="current-tab-c2">' + product.id + '</td>' )
				l.push( '</tr>' );
			l.push( '</thead>' );		
			l.push( '<tbody>' );
			
			for( var i in ch )
			{
				if( product[i] )
				{
					l.push( '<tr' + ( i == 'price' ? ' class="current-tab-price"' : '' ) + '>' );
						
						l.push( '<td>' );
							typeof(ch[i]) != 'string'
							? l.push( ch[i][0] )
							: l.push( ch[i] )
						l.push( '</td>' );						
						l.push( '<td>');
							switch( i )
							{
								case 'price': l.push( product[i].addSpaces() )
								break;
								case 'free_lift': l.push( '<div class="icon-yes"></div>' )
								break;
								default : l.push( product[i] )
							}
							if( typeof(ch[i]) != 'string' ) l.push( ' ' + ch[i][1] );
						l.push( '</td>' );
						
					l.push( '</tr>' );
				}
			}
			
			l.push( '</tbody>' );	
		l.push( '</table>' );
		
		return l.join('');
	}
}

function message()
{
	var form = document.message;
		form.style.display = 'none';
	
	var submit = document.getElementById( 'submit-butt' )
	
	var shower = document.getElementById( 'about-message' );
		shower.onclick = function()
		{
			//alert( document.message.style.display )
			with( document.message.style )
				display = display == '' ? 'none' : ''			
		}
		
	submit.onclick = function()
	{
		var x = document.createTextNode( '*' );		
		submit.insertBefore( x, submit.firstChild );		
		
		var blink_x = setInterval( function(){x.nodeValue = x.nodeValue == '*' ? '' : '*'}, 200 );
		
		var f =
		{
			name: form.name.value,
			contacts: form.contacts.value,
			text: form.text.value
		}
		
		var txt = [];
		for( var i in f )
			txt.push( i + '=' + encodeURIComponent( f[i] ) );		
		
		var str = '/message?' + txt.join('&');	
		
		var xmlhttpreq = (function()
		{
			var xmlhttp;
			try
			{
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (E)
				{
					xmlhttp = false;
				}
			}
			if( !xmlhttp && typeof XMLHttpRequest != 'undefined' )
			{
				xmlhttp = new XMLHttpRequest();
			}
			return xmlhttp;
		})()
		
		xmlhttpreq.open( 'GET', str, true );
		
		xmlhttpreq.onreadystatechange = function()
		{
			if (xmlhttpreq.readyState != 4) return
						
			clearInterval( blink_x )
			submit.removeChild( x )
			
			if( xmlhttpreq.status == 200 && xmlhttpreq.responseText == 'saved' )
				submit.innerHTML = 'Сообщение отправлено';
			else
				submit.innerHTML = 'Сообщение не отправлено';
			
			//submit.onclick = null;
			submit.id = null;
		};
		
		xmlhttpreq.send( null );
	}
		
}

function createVisicomMap()
{	
	var marker;
						
	var map = new VMap( document.getElementById('map') );
	var point = {lng: 30.6474, lat: 46.3160};
	map.center( point, 15 );
						
	// Создание маркера
	var marker = new VMarker({lng: 30.6469, lat: 46.3184});
						
	//marker.draggable(true);

	// Всплывающая подсказка
	marker.hint('Баутек');
	// Задаем заголовок и текст информационного окна
	//$marker.info('Привет, Мир!');
	// Добавляем маркер на карту
	map.add( marker );
	// Перерисовка карты
	map.repaint();
	
}


}


