var CatCompas = new Class.create({
	
	//Смещение активной области от левого края вюпорта
	dx: 0,
	
	// Смещение активной области от верхнего края вьюпорта
	dy: 0,
	
	// Ширина активной области компаса
	wi: 0,
	
	//Высота активной области компаса
	he: 0,
	
	//Квадрат радиуса окружности
	sqr: 0,
	
	//Радиус окружности
	r: 183,
	
	//текущий сектор. 0 - вне окружности
	currentSector: 0,
	
	//постоянно выделенный сектор. 0 - по дефолту ничего не выделяем
	alwaysSelected: 0,
	
	initialize: function(currentSector) {
		if (currentSector>0 && currentSector<4) {
			this.alwaysSelected=currentSector;
		}
		this.recalculatePositions();
		this.wi = $('navigation-map').getWidth();
		this.he = $('navigation-map').getHeight();
		
		Event.observe(window,"resize",this.recalculatePositions.bindAsEventListener(this));
		
		$('navigation-map').observe("mousemove",this.calculateDirection.bindAsEventListener(this));
		$('navigation-map').observe("mouseout",this.turnOffLight.bindAsEventListener(this));
		$('navigation-map').observe("click",this.gotoLink.bindAsEventListener(this));
		
		this.sqr = Math.pow(this.r,2);
		
		$('order').observe('click', function(event) {$('call-window').show();this.showCall('call-window');Event.stop(event);}.bindAsEventListener(this));
		this.showCall('call-window');

	},
	showCall: function(element) {
				vp = document.viewport;
				voff=  vp.getScrollOffsets()[1]+(vp.getHeight()/2)+ $(element).getHeight()/2*(-1);
				hoff=  vp.getScrollOffsets()[0]+(vp.getWidth()/2)+ $(element).getWidth()/2*(-1);
				$(element).setStyle({top:voff+'px',left:hoff+'px'});
	},
	calculateDirection: function(ev) {
		x = ev.pageX-this.dx;
		y = -ev.pageY+this.dy+this.he;
		
		if (this.insideTopSemicircle(x,y)) {
			//если до этого были вне окружности
			if (this.currentSector==0) {
				$('navigation-map').setStyle({cursor:'pointer'});
			}
			sector = this.whatSector(x,y);
			
			//сектор сменился
			if (sector!=this.currentSector) {
				$('bg-receiver').className="pos"+sector;
				this.currentSector=sector;
			}
		} else {
			$('navigation-map').setStyle({cursor:'default'});
			this.currentSector=0;
			this.turnOffLight();
		}
	},
	
	turnOffLight: function() {
		if (this.alwaysSelected>0) {
			$('bg-receiver').className="pos"+this.alwaysSelected;
		} else {
			$('bg-receiver').className='';
		}
		this.currentSector = this.alwaysSelected;
	},
	
	gotoLink: function() {
		var cs = this.currentSector; 
		new Effect.Pulsate("bg-receiver",{duration: 0.2,pulses:2,afterFinish:function(){
			link = $("nav-link-"+cs).getAttribute('href');
			window.location.href=link;
		}});
			
	},
	
	/**
	 * Вычисляет смещения компаса относительно вьюпорта (вызывается в конструкторе, и при ресайзе)
	 */
	recalculatePositions: function() {
		this.dx = $('navigation-map').cumulativeOffset()[0];
		this.dy = $('navigation-map').cumulativeOffset()[1];
		//console.log(this.dy);
	},
	
	/**
	 * Принадлежит ли координата верхней полуокружности
	 */
	insideTopSemicircle: function(x,y) {
		if (y<0) {
			return false;
		}
		return Math.pow(x-this.r,2)+Math.pow(y,2)<this.sqr;
	},
	
	/**
	 * Определяет в каком из секторов находится курсор
	 */
	whatSector: function(x,y) {
		a = Math.atan2(y,-x+this.r)*180/Math.PI;
		return (a<60)? 1 : (a<126)? 2 : 3;
	}
});


var HotOperator = new Class.create({

	currentMoover: null,
	
	viewportWidth: null,
	
	currentMooverWidth: 0,
	
	initialize: function() {
		click = this.clickToChanger.bindAsEventListener(this);
		$$('#hot-block-selector .hot-rubric-chooser').each(function(el){
			el.observe('click',click);
		});	
		this.currentMoover = $$('.hot-list-changer')[0];
		this.currentMooverWidth = this.currentMoover.getWidth();
		this.viewportWidth = $('moover-container-wrapper').getWidth();
		
		this.bindSlider();
	},
	
	clickToChanger: function(ev) {
		element = ev.element(".hot-rubric-chooser");
		li = element.up('li');
		
		if (li.hasClassName('selected')) {
			return true;
		}
		
		
		li.addClassName('selected');
		
		li.siblings().each(function(sibling){
			sibling.removeClassName("selected");
		});
		
		
		id = parseInt(element.getAttribute('rel').replace(/^([^\d_]+_)/,''));
		this.activateBlock(id);
		
	},
	
	activateBlock: function(id) {
		if (activated = $('h-l-c-'+id)) {
			activated.show();
			activated.siblings().each(function(el){el.hide();});
			this.currentMoover = activated;
			this.currentMooverWidth = activated.getWidth();
			
			if (this.currentMooverWidth<this.viewportWidth) {
				$('hot-slider').hide();
			} else {
				$('hot-slider').show();
			}
		}
	},
	 
	bindSlider: function() {
		
		slideFu = this.slideTo.bind(this);
		
		hotSlider = new Control.Slider($('hot-slider').down('.handle'), $('hot-slider'), {
			range: $R(0, 100),
			sliderValue: 0,
			onSlide: slideFu,
			onChange: slideFu
		});
		
		if (this.currentMooverWidth<this.viewportWidth) {
			$('hot-slider').hide();
		} else {
			$('hot-slider').show();
		}
		
	},
	
	slideTo: function(percent) {
		this.currentMoover.setStyle({
			'marginLeft': (this.viewportWidth-this.currentMooverWidth)*percent/100+'px'
		});
	}
});


var BasesDistOperator = new Class.create({
	
	slider: null,
	
	distValues: ['Любая','Рядом с городом','До 50 км.','В области','За пределами области'],
	
	ranges: [null,0,15,50,150], //ы-ыы
	
	lastValue: 0, 
	
	rangeCache: [],
	
	initialize: function() {
		
		sl = $('dist-slider');
		
		this.initCostCache();
		
		slideHandler = this.slideTo.bind(this);
		
		range = $R(0,4);
		this.slider = new Control.Slider($('dist-slider').down('.handle'),$('dist-slider'),{
			 range: range,
			 values: range,
			 onSlide: slideHandler,
			 onChange: slideHandler
		});
	},
	
	initCostCache: function() {
		cc = this.rangeCache;
		$$('#bases-list-body span.filter_dist_value').each(function(el){
			cc[cc.length]={'element':el.up('tr.base-container'),'range':parseInt(el.innerHTML)};
		});
	},
	
	slideTo: function(value) {
		$('dist-slider-value').update(this.distValues[value]);
		this.updateTableWhith(value);
		this.lastValue=value;
	},
	
	
	updateTableWhith: function(value) {
		if (this.lastValue!=value) {
		
			min = this.ranges[value];
			max = this.ranges[value+1] || 20000;
			
			this.rangeCache.each(function(el){
				el.element[(((el.range<min || el.range>max) && min!=null)? 'add' : 'remove')+'ClassName']('not-in-distance-range');
			});
		}
		
		count = $$('.bases-list tbody tr:not([class~=not-in-distance-range]):not([class~=not-in-price-range])').length;
		$("totalresult").update(count);
		
	}
});


var BasesPriceSlider = new Class.create({
	
	priceCache: [],

	initialize: function(min,max,step) {
		
		element = $('price_slider');
		min = parseInt(min);
		max = parseInt(max);
		
		range = [];
		range[range.length]=min;
		
		$R(min+1,max-1).each(function(el){
			if (!(el%50)) {
				range[range.length]=el;
			}
		});
		range[range.length]=max;
		
		slide = this.slideTo.bind(this);
		update = this.updateTableWhith.bind(this);
		this.constuctPriceCahce();
		
		var slider = null;
		
		slider = new Control.Slider(element.select('.handle'), element, {
			range: $R(0, max),
			values: range,
			sliderValue: [min,max],
			spans: ["price_slider_span"],
			
			onSlide: function(values) {
				element.setStyle({cursor:'w-resize'});	
				slide(values);
			},
			
			onChange: function(values) {
				slide(values);
				update(values);
				element.setStyle({cursor:'default'});	
			}
		});
		
		$('price_to').observe("change",function(){
			val = $('price_to').value;
			slider.setValue(val,1);
		});
		$('price_from').observe("change",function(){
			val = $('price_from').value;
			slider.setValue(val,0);
		});
		
		
	},
	
	constuctPriceCahce: function() {
		
		cc = this.priceCache;
		$$('#bases-list-body span.filter_price_value').each(function(el){
			cc[cc.length]={'element':el.up('tr.base-container'),'range':parseInt(el.innerHTML)};
		});
	},
	
	slideTo: function(values) {
		$('price_from').value = values[0];
		$('price_to').value = values[1];
		
	},
	
	updateTableWhith: function(values) {
		this.priceCache.each(function(el){
			el.element[((el.range<values[0] || el.range>values[1])? 'add' : 'remove')+'ClassName']('not-in-price-range');
		});
		
		
		count = $$('.bases-list tbody tr:not([class~=not-in-distance-range]):not([class~=not-in-price-range])').length;
		$("totalresult").update(count);
		
		
	}
	
	
});


function bindSliders() {
	if ($('price_slider') && slider_price_max_value && slider_price_min_value) {
		slider = new BasesPriceSlider(slider_price_min_value,slider_price_max_value,50);
	}
	
	if ($('hot-slider')) {
		operator = new HotOperator();
	}
	
	if ($('dist-slider')) {
		dist = new BasesDistOperator();
	}
	
	return;
}



function bindTreatmentFilter() {
	var f;
	if (!(f=$('filter-form'))) {
		return false;
	}
	sub=f.getInputs("submit")[0];
	
	sub.onclick=function(){
		res = f.serialize(true);
		
		dis = res['dis']==0? "all" : res['dis'];
		reg = res['region']==0? "_" : res['region'];
		
		url = '/russia/treatment/';
		if (dis=="all" && reg=="_") {
			url+="all.html";
		} else {
			url+=reg+'/'+'disease.'+dis+'.html';
		}
		window.location.href=url;		
		return false;
	}
}


bindJaxLists = function() {
	
	 var self = this;
	 
	 this.cache = new Hash(),
	 
	 
	 this.putText = function(link,el) {
	 	
	 	inserter = this.cache.get(url,el);
	 	
	 	if (inserter != undefined) {
		 	if (inserter.visible()) {
		 		new Effect.SlideUp(inserter);
		 	//	q.hide();
		 	} else {
		 		new Effect.SlideDown(inserter);
		 	//	q.show();
		 	}
	 	} else {
	 	
		 	new Ajax.Request(url,{
				onSuccess: function(transport) {
					upper = el.up(".jax-list-item");
					
				//	ins = new Element("div",{'class':'inserter','style':'display: none;'});
				//	wr = new Element("div").setStyle({overflow:'hidden',"width":"100%"}).update('<div></div>'+transport.responseText);
					
				//	ins.appendChild(wr);
					
					ins = new Element("div",{'class':'inserter','style':'display: none;'}).update('<div></div>'+transport.responseText+'<div style="clear: both;"></div>');
					
					upper.parentNode.insertBefore(ins,upper.nextSibling);
					
					new Effect.SlideDown(ins);
					this.cache.set(url,ins);
					/*isn=new Insertion.After(upper,'<div class="inserter">'++'</div>');
					*/
				}
			});
	 	}
	 },
	 
	 
	
	 $$('.jax-list a.jax-button').each(function(el){
		el.observe('click',function(ev){
			el = Event.element(ev);
			url = el.getAttribute('href').replace(/\.html$/,".jax");
			self.putText.bind(self)(url,el);
			
			Event.stop(ev);
		});
	});
}



var compas = null;

Event.observe(window,"load",function(){
	compas = new CatCompas(currentCompasSector);
	bindTreatmentFilter();
	bindSliders();
	bindJaxLists();
	fixateTable();
});

function fixateTable() {
	tables = $$("#content table");
	
	
	tables.each(function(table){
		
		if (table.getWidth() > table.up(".column-content").getWidth()) {
			linkus = new Element('span');
			linkus.addClassName('show-table');
			linkus.update("Показать таблицу");
			vr = new Element('div');
			Insertion.Before(table,vr);
			Insertion.Before(vr,linkus);
			$(table).setStyle({backgroundColor: 'white'});
			//vr.appendChild(table.cloneNode(true));
			table.hide();
			
			Event.observe(linkus,'click',showWrapperAll.bindAsEventListener(null,vr,table,linkus));
		}
	});
	
	
}

function showWrapperAll(event,wrapper,table,link) {
	
	if (table.hasClassName('nowshow')) {
		wrapper.setStyle({height:0});
		table.hide();
		table.removeClassName('nowshow');
		link.update('Показать таблицу');
		return;
	}
	
	//wrapper.absolutize();
	table.show();
	table.absolutize();
	table.setStyle({left: 'auto'});
	table.addClassName('nowshow');
	wrapper.setStyle({height:table.getHeight()+'px'});
	link.update('Скрыть таблицу');
	
}















