	var wyswietlane_rozklady={count:0};
	var glob_rozklady_cache={};
	var schowek;
	//alert(parseInt('8')*1);
	
	//funkcja do zarzadzania cache
	

function clearContent(){
			//czy to na pewno powinno byc tak robione? a moze jednak zrobic chowanie obiektow?
			$('#znalezione_wyniki > *').remove();
		}
		
		function renderContent(el,path){
			$('#znalezione_wyniki > div.loading').remove();
			$('#znalezione_wyniki').prepend(el);
			LastUsed.add(path);
			if(window.update_parent_height)window.update_parent_height();
		}
		
		function notFoundContent(type,nie_znaleziono,req){
			$('#znalezione_wyniki > div.loading').remove();
			$('#znalezione_wyniki').prepend('<div class="notfound">nie znaleziono '+(type=='przystanek'?'przystanku':(type=='linia'?'linii':'szukanej frazy'))+' '+nie_znaleziono+'</div>');
		}
		
		function otworzRozklady(rozklady){
			//console.log('otworzRozklady:[',rozklady,']');
			var zostaja={};
			if(rozklady){
				rozklady=rozklady.split(',');
				for(var i in rozklady){
					var k=rozklady[i];
					zostaja[k]=true;
					var el_id=DivMap.get(k);
					if(el_id && el_id.length){
						//console.log('otworzRozklady otwieram',k);
						for(var j in el_id)Rozklad.otworz(document.getElementById(el_id[j]));
					}
				}
			}
			for(var k in Rozklad.otwarte)
				if(zostaja[k] == undefined){
					var el_id=DivMap.get(k);
					if(el_id && el_id.length)
					{
						//console.log('otworzRozklady zamykam',k);
						for(var l in el_id)Rozklad.zamknij(document.getElementById(el_id[l]));
					}
				}
		}
		
		function getContent(type,req){
			//if(type=='szukaj' && !Mapa.loaded_script){setTimeout(function(){getContent(type,req);},700);return;};

			//console.log('getContent');
			clearContent();
			loading_sign().addMe('znalezione_wyniki');
			maintab('rozklady_i_polaczenia');
			//console.log(type,req);
			if(type=='przystanek' || type=='linia'){
				autobuser_api.zapytanie((req.linia?req.linia:req.zespol)+(req.rozklady?','+req.rozklady:''),
					function(data,status){ 
						if(req.linia && data.linie && data.linie[req.linia])
							renderContent(Linia.render(req.linia,data.linie[req.linia],req),req.hash);
						if(req.zespol && data.zespoly){
							if(data.zespoly[req.zespol])
								renderContent(Zespol.render(req.zespol,data.zespoly[req.zespol],req),req.hash);
						}if(req.rozklady && data.rozklady)
							otworzRozklady(req.rozklady);
						$("#rozklady_search").focus();
					},
					function(nie_znaleziono){
						notFoundContent(type,nie_znaleziono,req);
					});
			}
			else if(type=='szukaj'){
				Trasa._dataFunc(req,function(data){
					renderContent(Trasa.render(data,req),req.hash);
				});
			} 
		}
		
		
		LastUsed = {
			list:{'przystanek':[],'linia':[],'szukaj':[]},
			containers:
				{'przystanek':'#mojerozklady .last_used .przystanki',
				'linia':'#mojerozklady .last_used .linie',
				'szukaj':'#mojerozklady .last_used .polaczenia',
				'empty':'#mojerozklady .last_used .emptyinfo'},
			cookie_prefix:'lastused_',
			divider:'##',
			id:0,
			slots:5
		}
		
		LastUsed.init = function(){
		
			for(var k in this.list){
				var c=cookieJar.get(this.cookie_prefix+k);
				if(c.length){
					console.log(c);
					var elems=c.split(this.divider);
					for(var i=0;i<elems.length;i++){
						if(elems[i])this.add(k+'/'+elems[i],true);
					}
				}
			}
			//tutaj musimy odczytac ze schowka i wyswietlic
			//jezeli nie ma zadnych elementow to pokazujemy brak_elementow
		}
		
		LastUsed.add = function(path,dont_update_cookie){
			path=decodeURIComponent(path);
			var parts=path.split('/');
			var type=parts[0];
			parts.splice(type=='szukaj'?3:2);
			path=parts.join('/');
			
			var list=this.list[type];
			var cookielist=[];
			var newlist=[];
			
			for(var i=0,c=1; i<list.length;i++,c++){
				if(list[i][0]==path || c>=this.slots){
					var el = document.getElementById(list[i][1]);
					if(el)el.parentNode.removeChild(el);
					c--;
				} else {
					newlist.push(list[i]);
					var l=list[i][0].split('/');
					cookielist.push(l[1]+(l[0]=='szukaj'?'/'+l[2]:''));
				}
			}
			
			var id='lastused_'+(this.id++);
			cookielist.unshift(parts[1]+(type=='szukaj'?'/'+parts[2]:''));

			newlist.unshift([path,id]);
			this.list[type]=newlist;
			
			this.createEl(type,id,type=='szukaj'?parts[1]+' - '+parts[2]:parts[1],path);
			if(!dont_update_cookie){
				//zapisujemy cookie
				cookieJar.set(this.cookie_prefix+type,cookielist.join(this.divider),300);
			}
			if(newlist.length){
				$(this.containers[type]).show();
				$(this.containers.empty).hide();
			}
		}
		
		LastUsed.createEl = function(type,id,label,path){
			var href='http://'+AUTOBUSER_CONFIG.base_href+'#'+path;
			$('<a id="'+id+'" class="item" href="'+href+'">'+label+'</a>').click(function(){Page.load(path);return false;}).appendTo(this.containers[type]);
			//$(this.containers[type]).append;
		}
		
		
		Page = {current:'',
				current_parts:[],
				current_rozklady:''};

			
		Page.load_callback = function(hash){//HISTORY PLUGIN ZMIENIA THIS NA SWOJ OBIEKT
				var encoded_hash=hash;
				hash=decodeURIComponent(hash);

				var parts=hash.split('/');
				var req_type=parts[0];
				var rozklady=''
				if(req_type=='przystanek' || req_type=='linia'){
					hash=req_type+'/'+parts[1];
					if(parts[2])rozklady=parts[2];
					parts=[parts[0],parts[1]];
				}
				//console.log('Page.load_callback h:',hash,'P.c:',Page.current);
				if(hash==Page.current && hash!=''){
					if(rozklady!=Page.current_rozklady){
						Page.current_rozklady=rozklady;
						if(rozklady=='')otworzRozklady();//czyli tak naprawde zamknij wszystko
						else autobuser_api.zapytanie(rozklady,function(data,status){otworzRozklady(rozklady);});
						return;
					}
					else return;
				}
 
				Page.current=hash;
				Page.current_parts=parts;
				Page.current_rozklady=rozklady;
				
				if(req_type=='szukaj'){
					req={start:parts[1],stop:parts[2],minuty:parts[3] || Trasa.get_HM(5),swiateczny:dzien_swiateczny(),hash:encoded_hash};
					if((req.minuty=='przyjazd') && parts[4]){
						req.odjazdprzyjazd='przyjazd';
						req.minuty=parts[4];
					} else {req.odjazdprzyjazd='odjazd';}
					
					if(parts.length>=3){
						Trasa.setFormFields(req);
						getContent(req_type,req);
					}
				} 
				else if(req_type=='mapa'){
					maintab('mapa'); //zmieniamy zakladke, jezeli jest parts[1] to wyszukujemy, jezeli parts[1] to linia to pokazujemy trase
					$('#mapa_search').val(parts[1]);
					if(parts[1])Mapa.find_location(parts[1]);
				} 
				else if(req_type=='linia'){
					//linia/509/509:60945
					if(!is_linia(parts[1])){return;}//tutaj mamy jakis error
					req={linia:parts[1],rozklady:rozklady,hash:encoded_hash};	
					getContent(req_type,req);
					
				} 
				else if(req_type=='przystanek'){
					req={zespol:parts[1],rozklady:rozklady,hash:encoded_hash};
					getContent(req_type,req);
				}
				else if(hash=='')hash='rozklady_i_polaczenia';
				
				if(hash=='rozklady_i_polaczenia'){
					maintab('rozklady_i_polaczenia');
					clearContent();
					Schowek.inst.pokaz();
				}
				else Schowek.inst.schowaj();
				//if(hash=='rozklady' || hash=='mapa' || hash=='trasa' || hash=='rozklady_i_polaczenia')maintab(hash);
			}
			
		Page.load = function(hash) {
				//tutaj powinna byc obrobka hasha i decyzja czy ladujemy dalej
				//console.log('Page.load ',hash);
				$.history.load(hash);
				return false;
			}
			
		Page.load_rozklad = function(rozklad_key) {
				console.log('load_rozklad - this',this);
				if(this.current_rozklady==''){
					console.log('lr1');
					this.load(this.current+'/'+rozklad_key);
				}
				else if(this.current_rozklady==rozklad_key){
					console.log('lr2');
					this.load(this.current);
				}
				else if(this.current_rozklady.indexOf(rozklad_key)>-1){
					console.log('lr3');
					var cr=this.current_rozklady.split(',');
					var cr2=[];
					for(var i in cr)if(cr[i]!=rozklad_key)cr2.push(cr[i]);//delete cr[i];
					this.load(this.current+'/'+cr2.join(','));
				} else {
					console.log('lr4');
					this.load(this.current+'/'+this.current_rozklady+','+rozklad_key);
				}
			}
			
		Page.init = function() {
				$.history.init(this.load_callback);
			}
		
		
		HoverBox = {
			ico_dodaj:'gfx/button_do_moich_rozkladow.png',
			ico_dodany:'gfx/button_dodany.png',
			ico_usun:'gfx/button_usun.png',
			ico_mapa:'gfx/button_mapa.png',
			ico_link:'gfx/button_link.png',
			html:'<div id="hoverbox"><a id="hoverbox_dodaj">do moich przystankow</a> <a id="hoverbox_mapa" title="zobacz przystanek na mapie">mapa</a> <a id="hoverbox_link" class="inblock directlink" title="link bezpośredni, skopiuj lub przeciagnij na pulpit"><span>link bezposredni</span></a></div>',
			css:{'position':'absolute','width':'200px','height':'1em','padding':'2px','display':'none'}}
			
		HoverBox.init=function(){
				var self=this;
				
				//wszystkie callbacki i inne obiekty obslugi zdarzen, ktore maja miec dostep do obiektu w ktorym sa zadeklarowane tu HoverBox
				//musza byc zadeklarowane jako clousure zeby miec dostep do 'self', w innym wypadku nie mozna sie odwolac do hoverboxa inaczej
				//niz przez globalny obiekt HoverBox czyli do dupy (bo we wszystkich callbackach this zawsze wskazuje na obiekt ktory je wywoluje)
				
				var cb_beforeshow = function(el){
					var link=$(el).data('calledby');
					var key=link.linia+':'+link.id_przystanku;
					var is_in=Schowek.inst.available_keys[key];
					if(link){
						$('#hoverbox_dodaj > img').attr('src',is_in?self.ico_usun:self.ico_dodaj);//.attr('title',is_in?'usuń z moich przystanków':link.linia+' z przyst. '+link.nazwa+' w kierunku '+link.kierunek);
						$('#hoverbox_link').attr('href','http://'+AUTOBUSER_CONFIG.base_href+'#'+(link.z_przystanku?'przystanek/'+encodeURIComponent(link.nazwa):'linia/'+link.linia)+'/'+key);
						$('#hoverbox_link').html('<span>'+link.linia+' z '+link.nazwa+' -> '+link.kierunek+'</span>');
					}
				}
		
				var cb_dodaj_handler=function(){
					var link=$(this.parentNode).data('calledby');
					var key=link.linia+':'+link.id_przystanku;
					if(link){
						if(!Schowek.inst.available_keys[key]){
							if(Schowek.inst.dodaj_przystanek(link.linia,link.id_przystanku,link.nazwa,link.kierunek)){
								this.parentNode.reposition();
								$('img',this).attr('src',self.ico_dodany);
							}
						} else {
							Schowek.inst.usun(key);
							this.parentNode.close();
						}
					}
					return false;
				}
				
				var cb_link_handler=function(){
					copyLink(this);
					return false;
				}
		
				$(this.html).css(this.css).hovermenu({beforeshow:cb_beforeshow}).appendTo('body');
				$('#hoverbox_dodaj').html('<img src="'+this.ico_dodaj+'">').click(cb_dodaj_handler);
				$('#hoverbox_mapa').html('<img src="'+this.ico_mapa+'">').click(this.mapa_handler);
				//$('#hoverbox_link').html('<img src="'+this.ico_link+'">').click(cb_link_handler);
				$('#hoverbox_link').click(cb_link_handler);
			}
			
		HoverBox.mapa_handler=function(){
				var link=$(this.parentNode).data('calledby');
				if(link){
					Mapa.show_przystanek(link.id_przystanku); 
				}
				return false;
			}	
	
	MapIcons={
			przystanki:{},
			trasa:{},
			initialized:false,
			path:'mapicons/',
			
			init:function(){
				if(this.initialized)return;
				this.trasa['start']=this.make_icon(this.path+'trasa_start.png',27,23,13,22);
				this.trasa['koniec']=this.make_icon(this.path+'trasa_koniec.png',27,23,13,22);
				this.trasa['adres']=this.make_icon(this.path+'adres.png',27,23,13,22);
				for(var i=1;i<=5;i++)this.trasa['przesiadka'+i]=this.make_icon(this.path+'trasa_przesiadka'+i+'.png',27,23,13,22);
				this.initialized=true;
			},
			
			przystanek:function(nr){
				nr=nr+'';
				if(this.przystanki[nr]!=undefined)return this.przystanki[nr];
				this.przystanki[nr]=this.make_icon(this.path+nr+'.png',19,19,7,15);
				return this.przystanki[nr];
			},
			
			zaznaczony_przystanek:function(nr){
				var icon=new GIcon(this.przystanek(nr));
				icon.shadow=this.path+'red.png';
				icon.shadowSize=new GSize(19,19);
				return icon;
			},
			
			make_icon:function(image,width,height,ax,ay){
				var ico=new GIcon();
				ico.image=image;
				ico.iconSize=new GSize(width,height);
				ico.iconAnchor=new GPoint(ax,ay);
				return ico;
			}
		}
 
		
		function ProstaMapka(div,mapheight,def,zespoly,info){
			//div - container mapy
			//def - tablica trasa (poszczegolne numery zespolow trasy)
			//zespoly - tablica przystankow zespolu indeksowana numerami zespolow
			MapIcons.init();
			if(mapheight<300)mapheight=300;
			var map = new GMap2(div,{size:new GSize(AUTOBUSER_CONFIG.small_map_width,mapheight)});
			map.enableScrollWheelZoom();
      		map.disableDoubleClickZoom();
      		map.setCenter(new GLatLng(52.228405, 21.012446), 13);
      		map.przystanki_markers=[];
      		map.zespoly=[];
      		
      		var bounds=new GLatLngBounds();
      		var icon_offset=[0,1];
			if(zespoly[def[0]].geo)icon_offset[0]=1;
			if(zespoly[def[def.length-1]].geo)icon_offset[1]=2;
			
      		for(var i in def){
      			var p=zespoly[def[i]];
      			var ll=new GLatLng(parseFloat(p.lat),parseFloat(p.lon));
				if(p.geo)ll.myzoom=15;else ll.myzoom=16;
      			map.zespoly.push(ll);
      			
      			var ico='start';
      			if(i>icon_offset[0])ico='przesiadka'+(i-icon_offset[0]);
      			if(i==def.length-icon_offset[1])ico='koniec';
      			if(p.geo)ico='adres';
				
      			var zespol_marker=new GMarker(ll,{'title':'przystanek '+p.nazwa,'icon':MapIcons.trasa[ico],zIndexProcess:function(){return 1;}});
				
      			map.addOverlay(zespol_marker)
      			bounds.extend(ll)
      			for(var nrprzyst in p.mapa){
      				var przystanek_marker=new GMarker(new GLatLng(p.mapa[nrprzyst][0],p.mapa[nrprzyst][1]),{'clickable':false,'title':p.nazwa+' '+nrprzyst,'icon':MapIcons.przystanek(nrprzyst),zIndexProcess:function(){return 2;}});
      				map.przystanki_markers.push(przystanek_marker);
      				map.addOverlay(przystanek_marker);
      				przystanek_marker.hide();
      			}
      		}
      		
			//if(info.A.geo)map.addOverlay(new GMarker(new GLatLng(info.A.punkt[0],info.A.punkt[1]),{'title':info.A.adres}));
			//if(info.A.geo)map.addOverlay(new GMarker(new GLatLng(info.B.punkt[0],info.B.punkt[1]),{'title':info.B.adres}));
			map.line=new GPolyline(map.zespoly);
      		map.addOverlay(map.line);
			
			//GEvent.addListener(map,"moveend",function(){console.log('moveend');});
			//GEvent.addListener(map,"dragend",function(){map.removeOverlay(map.line);map.setCenter(map.getCenter());map.addOverlay(map.line);console.log('dragend');});
			
      		map.originalPosition=bounds.getCenter();
      		map.originalZoom=map.getBoundsZoomLevel(bounds);
      		map.resetZoom=function(){this.setCenter(this.originalPosition,this.originalZoom);}
      		map.zoomDetails=function(nr){if(nr<this.zespoly.length)this.setCenter(this.zespoly[nr],this.zespoly[nr].myzoom);}
      		map.resetZoom();
			
      		GEvent.addListener(map,"zoomend",function(oldzoom,newzoom){
					if((oldzoom>=14 && newzoom>=14) || (oldzoom<14 && newzoom<14))return;
      				for(var i in this.przystanki_markers){
      					m=this.przystanki_markers[i];
      					if(newzoom>=14)m.show();
      					else m.hide();
      				}
      		})
      		return map;
		}
		
		function span(class_name,content)
		{
			return '<span class="'+class_name+'">'+content+'</span>';
		}
		
		Trasa={
			cache:{},
			
			$:{
				'input_a':'#trasa_search_a',
				'input_b':'#trasa_search_b',
				'input_start':'#trasa_start',
				'input_odjazdprzyjazd':'#trasa_odjazdprzyjazd',
				'submit_link':'#trasa_form a.submit',
				'container':'#znalezione_wyniki'},
				
			dataFunc:function(data,callback){//funkcja ktora wysyla request do serwera, powinno sie nazywac dataRequest
				//loading_sign().prependMe('#znalezione_wyniki');
				var timeoffset=0;
				if(data.minuty && data.minuty.split(':').length>1)data.minuty=Trasa.HM2m(data.minuty);
				if(data.minuty=='za5min')timeoffset=5;
				if(data.minuty=='za10min')timeoffset=10;
				if(data.minuty=='za15min')timeoffset=15;
				if(data.minuty=='za20min')timeoffset=20;
				if(timeoffset>0)data.minuty=Trasa.HM2m(Trasa.get_HM(timeoffset));
				var cache_key='';
				for(var k in data)cache_key+=data[k];
				if(this.cache[cache_key]){
					callback(this.cache[cache_key]);
					return;
				}
				
				$.ajax({url:'polaczenia.php',data:data,dataType:'json',error:callback,
					success:function(data,status){
						Trasa.cache[cache_key]=data;
						callback(data,status);
					}
				});
			},
			
			dataHandler:function(data){//funkcja ktora przetwarza dane z serwera
				//$('div.loading',Trasa.$.container).remove();
				if(data == undefined)return;
				if(data.error != undefined){//to musi isc do Trasa.render
					alert(data.error);
					if(data.code=='A')Trasa.$.input_a.val('').focus();
					if(data.code=='B')Trasa.$.input_b.val('').focus();
				}
				else Trasa.render(data);
			},
			
			submitFunc:function(){
				var a=Trasa.$.input_a.val();
				var b=Trasa.$.input_b.val();

				if(a.length==0)Trasa.$.input_a.focus();
				else if(b.length==0)Trasa.$.input_b.focus();
				else {
					var odjazdprzyjazd=Trasa.$.input_odjazdprzyjazd.val();
					var minuty=Trasa.$.input_start.val();
					Trasa.dataFunc({'start':a,'stop':b,'odjazdprzyjazd':odjazdprzyjazd,'minuty':minuty,'swiateczny':dzien_swiateczny()},Trasa.dataHandler);
				}
				return false;
			},
			
			init:function(dataFunc){
				var key;
				for(key in Trasa.$)Trasa.$[key]=$(Trasa.$[key]);
				Trasa._dataFunc=Trasa.dataFunc;
				if(typeof dataFunc == 'function'){
					Trasa.dataFunc=dataFunc;
				}
				
				
				Trasa.$.input_a.autocomplete(nazwy_zespolow, {
					multiple: false,
					mustMatch: false,
					autoFill: true,
					width:200,
					tabFunc: function(v){Trasa.$.input_b.focus(); return false;},
					submitFunc: Trasa.submitFunc,
					max: 40
				});
				
				//Trasa.$.input_a.parent().eq(0).css({'position':'relative'});
				//console.log()
				//var p=Trasa.$.input_a.position();
				//var $inf=$('<div>test test test</div>').css({'position':'absolute','top':3+'px'}).appendTo(Trasa.$.input_a);//.parent().eq(0)
				
				/*
				var t='adres lub linia';
				
				if(!Trasa.$.input_a.val().length)Trasa.$.input_a.val(t)
				Trasa.$.input_a.blur(function(){if(!this.value)this.value=t})
				//Trasa.$.input_a.focus(function(){if($(this).val()==t)$(this).val('')})
				Trasa.$.input_a.bind('keydown, keypress, focus',function(){if(this.value==t){this.value='';});
				*/
				
				Trasa.$.input_b.autocomplete(nazwy_zespolow, {
					multiple: false,
					mustMatch: false,
					autoFill: true,
					width:200,
					tabFunc: function(v){Trasa.$.input_start.focus(); return false;},
					submitFunc: Trasa.submitFunc,
					max: 40
				});
				
				
				Trasa.$.input_odjazdprzyjazd.change(function(){
					var v=$(this).val();
					if(v=='odjazd' || v=='przyjazd')Trasa.$.input_start.show().focus();
					else Trasa.$.input_start.hide();
				});
				
				Trasa.$.input_odjazdprzyjazd.triggerHandler('change'); //odpalamy powyzsza funkcje
	
				Trasa.$.input_start.val(Trasa.get_HM(5)).bind("change",function(){
					if(Trasa.HM2m(Trasa.$.input_start.val())<0)Trasa.$.input_start.val(Trasa.get_HM(5))
				}).bind("keydown",function(event){
					if(event.keyCode==9){Trasa.$.input_a.focus();return false;}
					if(event.keyCode==13){Trasa.submitFunc();return false;}
				});
			
				Trasa.$.submit_link.bind("click",Trasa.submitFunc);
				
			},
			
			//#trasy div.opis_polaczenia {}
			//#trasy div.polaczenie (etykieta (odjazd,linie,zespol), zespol (nazwa (przyjazd), linie (linia..linia (odjazdy,czas)))
			
			render:function(data,req){
				//if(!Mapa.loaded_script){setTimeout(function(){Trasa.render(data);},500);return;}
				//MapIcons.init();
				//$('div.loading',Trasa.$.container).remove();
				if(data.trasy && !data.trasy.length){
					alert('Nie znaleziono połączenia o podanej godzinie');
					return false;
				}
				var content=createDOM('div.real_content');
				
				var opis_polaczenia='połączenie '+(data.info.A.geo?data.info.A.adres:data.info.A.nazwa_zespolu)+' - '+(data.info.B.geo?data.info.B.adres:data.info.B.nazwa_zespolu);
				
				for(var i=0;i<data.trasy.length;i++)
					this.render_trasy(data.trasy[i],data.zespoly,data.zapytanie,data.info).addMe(content);
				console.log('dane polaczen',data);
				return createDOM('div.trasy',[create_content_header(opis_polaczenia,req),content]);
				//if(window.update_parent_height)window.update_parent_height();
			},
			
			render_trasy:function(trasa,zespoly,zapytanie,info){
				var etykieta=[],start=0,czas=0,ostatnia_przesiadka={};
				var mapa_przesiadek=[];
				var div=createDOM('div.polaczenie { div.zespoly');//.addMe(container);
				var div_zespoly=div.wrapped_element;
				//tutaj dodajemy do trasy z info.A i info.B
				var virtualny_zespol_A=1;
				var virtualny_zespol_B=2;
				
				var przystanki_trasy=[];
				for(var zespol in trasa)przystanki_trasy.push(zespol);
				var polaczenie_bezposrednie = przystanki_trasy.length==2;
				
				if(info.A.geo){
					przystanki_trasy.unshift(virtualny_zespol_A);
					zespoly[virtualny_zespol_A]={geo:true,lat:info.A.punkt[0],lon:info.A.punkt[1],nazwa:info.A.adres,mapa:{}}
				}
				if(info.B.geo){
					przystanki_trasy.push(virtualny_zespol_B);
					zespoly[virtualny_zespol_B]={geo:true,lat:info.B.punkt[0],lon:info.B.punkt[1],nazwa:info.B.adres,mapa:{}}
				}
				
				var przesiadka=0;
				for(zespol in przystanki_trasy){
					zespol=przystanki_trasy[zespol];
					var nazwa_zespolu=zespoly[zespol].nazwa;
					if(nazwa_zespolu.split(' ')[0]=='METRO')nazwa_zespolu=nazwa_zespolu.substr(6);
					if(nazwa_zespolu.length>14)nazwa_zespolu=nazwa_zespolu.substr(0,13)+'.';
					
					if(!zespoly[zespol].geo)etykieta.push(span('zespol',nazwa_zespolu));
					var numer_ikony=przesiadka-(info.A.geo?1:0);
					var ikona_zespolu='';
					if(numer_ikony==0)ikona_zespolu='<img src="mapicons/trasa_start.png" title="przystanek startowy">';
					if(numer_ikony>0)ikona_zespolu='<img src="mapicons/trasa_przesiadka'+numer_ikony+'.png" title="przystanek, przesiadka '+przesiadka+'">';
					if(trasa[zespol]=='END')ikona_zespolu='<img src="mapicons/trasa_koniec.png" title="przystanek koncowy">';
					if(zespoly[zespol].geo)ikona_zespolu='<img src="mapicons/adres.png" title="adres">';//MapIcons.trasa['adres'].image;
					
					var div_zespol=createDOM('div.zespol { div.nazwa',{'html':ikona_zespolu+' '+zespoly[zespol].nazwa+' '+span('przyjazd',ostatnia_przesiadka.r?this.m2HM(ostatnia_przesiadka.r[0]+ostatnia_przesiadka[1]):'')}).addMe(div_zespoly);
					
					div_zespol.przesiadka=przesiadka++;
					mapa_przesiadek.push(zespol);
					if(trasa[zespol]=='END')continue;
					if(zespoly[zespol].geo)continue;

					var div_linie=createDOM('div.linie');
					var poprzedni_przystanek='';
					var posortowane=[];
					for(var l in trasa[zespol]){
						if(trasa[zespol][l]['best'])posortowane.unshift(l);
						else posortowane.push(l);
					}
					
					var etykieta_skladowa=[];
					var etykieta_najlepsza_linia='';
					for(var i in posortowane){
						var l=posortowane[i];
						var linia=trasa[zespol][l]
						if(linia.r==undefined)continue;
						var odjazdy=[];
						for(var o in linia.r)odjazdy.push(this.m2HM(linia.r[o]));
						
						if(linia.best){
							if(!start)start=linia.r[0];
							ostatnia_przesiadka=linia;

							if(l=='METRO'){
								l='Metro';
								linia[0]='';
								kierunek='';
								if(linia.kierunek==3282)kierunek=', kierunek Kabaty';
								if(linia.kierunek==6059)kierunek=', kierunek Młociny';
								var div_linia=createDOM('div.linia najlepsza_linia',{html:(numer_ikony>0?'przesiadka':'wsiadasz')+' w <b>'+l+'</b>'+kierunek+' ('+linia.stacje+' '+(linia.stacje>1?(linia.stacje>4?'stacji':'stacje'):'stacja')+')'}).addMe(div_linie);
							}
							else var div_linia=createDOM('div.linia najlepsza_linia',{html:(numer_ikony>0?'przesiadka':'wsiadasz')+' w <b>'+l+'</b> godz <b>'+span('odjazdy',odjazdy[0])+'</b>'+span('czas','('+linia[1]+'min)')+' przyst. <img src="mapicons/'+linia[0]+'.png"> '}).addMe(div_linie);
							//etykieta.push(span('linie',l));
							etykieta_najlepsza_linia=l;
						} else {
							var div_linia=createDOM('div.linia',{html:'lub '+l+', '+span('odjazdy',odjazdy[0])+span('czas','('+linia[1]+'min)')+' <img src="mapicons/'+(linia[0]!=poprzedni_przystanek?linia[0]:'empty')+'.png">'}).addMe(div_linie);
							etykieta_skladowa.push(l);
						}

						poprzedni_przystanek=linia[0];
					}
					etykieta.push((polaczenie_bezposrednie?'bezpośrednio ':'')+span('najlepsza_linia',etykieta_najlepsza_linia)+(etykieta_skladowa.length?span('linie',', '+etykieta_skladowa.slice(0,1).join(',')+(etykieta_skladowa.length>1?'..':'')):''));
					div_linie.addMe(div_zespol)
				}
				
				//var div_zespol=createDOM('div.zespol { div.nazwa=<img src="mapicons/trasa_koniec.png" title="przystanek koncowy"> '+zespoly[zapytanie.stop].nazwa+' '+span('przyjazd',this.m2HM(ostatnia_przesiadka.r[0]+ostatnia_przesiadka[1]))).addMe(div_zespoly);
				//div_zespol.przesiadka=przesiadka;
				
				//mapa_przesiadek.push({'lat':zespoly[zapytanie.stop].lat,'lon':zespoly[zapytanie.stop].lon,'title':zespoly[zapytanie.stop].nazwa});
				//mapa_przesiadek.push(zapytanie.stop);
				
				czas=ostatnia_przesiadka.r[0]+ostatnia_przesiadka[1];
				if(czas<start)czas+=1440;
				czas-=start;
				console.log('czas: ',ostatnia_przesiadka.r[0],ostatnia_przesiadka[1],start,czas);
				
				var etykieta_click=function(){
					//console.log(info);
					//var div=this.parentNode.parentNode;
					var mapka;
					if(!div.klikniete){
						var div_mapa=div.insertBefore(createDOM('div.mapa_trasy'),div.firstChild.nextSibling);// = insertAfter
					}
					
					if(div.widoczne_szczegoly){
						$('div.zespoly',div).css('display','none');
						$('div.mapa_trasy',div).css('display','none');
						div.widoczne_szczegoly=false;
					}else{
						$('div.zespoly',div).css('display','block');
						$('div.mapa_trasy',div).css('display','block');
						mapka=$(div).data('mapa');
						if(mapka)mapka.checkResize();
						//console.log(mapka);
						//alert($(div).height());
						div.widoczne_szczegoly=true;
					}
					
					if(!div.klikniete){
						//console.log($(div).height());
						mapka=ProstaMapka(div_mapa,$(div_zespoly).height(),mapa_przesiadek,zespoly,info);
						$(div).data('mapa',mapka);
						
						$('div.zespol',div).bind('mouseenter',function(){$(this).css({'font-weight':'normal','background-color':'yellow'}); mapka.zoomDetails(this.przesiadka);});
						$('div.zespol',div).bind('mouseleave',function(){$(this).css({'font-weight':'normal','background-color':'white'});});
						$(div).bind('mouseleave',function(){$('div.zespol',this).css({'font-weight':'normal','background-color':'white'}); mapka.resetZoom();});
			
						/*
						$('div.zespol',div).hover(
							function(){$(this).css({'font-weight':'normal','background-color':'yellow'}); mapka.zoomDetails(this.przesiadka); },
							function(){$(this).css({'font-weight':'normal','background-color':'white'}); mapka.resetZoom();  }
						);
						*/
						div.klikniete=true;
					}
					if(window.update_parent_height)window.update_parent_height();
					return false;
				}
				
				if(!info.A.geo)etykieta.shift(); //obcinamy pierwszy
				if(!info.B.geo)etykieta.pop(); //obcinamy ostatni
				
				createDOM('div.etykieta { a^zobacz szczegóły',{onclick:etykieta_click, html:span('odjazd',this.m2HM(start))+'-'+span('przyjazd',this.m2HM(start+czas))+etykieta.join('<img src="gfx/kierunek.gif"> ')+span('czas','('+czas+'min)')}).prependMe(div);
				
				//if($(div_zespoly).height()<310)$(div_zespoly).height(310);
				return div;
			},
			
			get_HM:function(add){
				var t=new Date();
				if(add==undefined)add=0;
				t.setMinutes(t.getMinutes()+add);
				var h=t.getHours();
				var m=t.getMinutes();
				if(h<10)h='0'+h;
				if(m<10)m='0'+m;
				return h+':'+m;
			},
			
			HM2m:function(hm){
				hm=hm.split(':');
				for(var i=0;i<=1;i++){
					if(hm[i].charAt(0)=='0')hm[i]=hm[i].substr(1);
					hm[i]=parseInt(hm[i]);
					if(isNaN(hm[i]) || hm[i]<0)return -1;
				}
				return hm[0]*60+hm[1];
			},
			
			m2HM:function(m){
				var h=Math.floor(m/60);
				var m=m-h*60;
				if(h>=24)h=h-24;
				if(h<10)h='0'+h;
				if(m<10)m='0'+m;
				return h+':'+m;
			},
			
			setFormFields:function(data){
				if(data.start)this.$.input_a.val(data.start);
				if(data.stop)this.$.input_b.val(data.stop);
			}
			
		}
	
	
	
	autobuser_api = {
		_url : "autobuser_api.php",
		cache:{},
		key_type:{},
		
		zapytanie : function(q,success,notfound,error){
			var qarr=q.split(',');
			var qarr2=[];
			var me=this;
			
			for(var i in qarr)
				if(!this.cache[qarr[i]])qarr2.push(qarr[i]);
			
			prepare_result=function(qarr,success){
				//ta funkcja zachowuje sie dziwnie
				//qarr i success musza byc przekazywane w parametrze bo domkniecie zawiera nowe wartosci
				//jezeli dwa razy pod rzad zostanie wywolane autobuser_api.zapytanie (wtedy pierwsze wywolanie jak dochodzi do tego miejsca
				//to juz ma wartosci tych zmiennych z drugiego wywolania)
				
				var newdata={};
				//console.log('4',qarr,me.cache);
				for(var i in qarr){
					var k=qarr[i];
					var t=me.key_type[k];
					
					//console.log('5',k,t);
					if(t){
						if(newdata[t] === undefined)newdata[t]={};
						newdata[t][k]=me.cache[k];
					}
				}
				//console.log('autobuser_api.prepare_result',qarr,newdata);
				success(newdata);
			}
			
			var success_handler=function(data,status){
				console.log('autobuser_api.zapytania',data);
				
				if(data)
					for(var restype in {'linie':'','zespoly':'','rozklady':''}){
						if(data[restype])
							for(var k in data[restype]){
								var changed_key=k;
								if(restype=='zespoly'){
									//problem!!! tutaj musimy przerobic cache
									//co innego idzie w requescie, co innego idzie w responsie! tj. 
									//request GARBATKA -> GARBATKA [KONIK NOWY]
									//request LESZNO [WARSZAWA] -> LESZNO
									for(var i=0;i<qarr.length;i++){
										if((k.indexOf(qarr[i])>-1) || (qarr[i].indexOf(k)>-1)){
											changed_key=qarr[i];
										}
									}
								}
								//console.log('autobuser_api.zapytania loop2: ',k,'-',restype,'-',data[restype][k]);
								me.cache[changed_key]=data[restype][k];
								me.key_type[changed_key]=restype;
							}
					}
				if(data.nie_znaleziono && typeof notfound=='function')notfound(data.nie_znaleziono);
				prepare_result(qarr,success);
			}
			
			if(qarr2.length){
				$.ajax({
					url:this._url,
					data:{"q":qarr2.join(',')},
					dataType:"json",
					success:success_handler,
					error:error
				});
			} else if(qarr.length)prepare_result(qarr,success);
			
		}
		
	}
	
	

	
	Schowek = makeClass(
		modHtmlBinder,modSetFromObj,
		{
			container:'#mojerozklady',
			html:{
				header:'.section_header',
				onetimeinfo:'.onetimeinfo',
				content:'.content',
				elements:'.elements',
				section_menu:'.section_menu',
				section_container:'.section_container'
			},
			cookie_name:'schowek2',
			scroll:true,
			ttl:999,
			divider:'###',
			
			etykiety:{},
			id_etykiety:0,
			available_keys:{}
		});
	
	Schowek.init = function(props){
		var self=this;
		this.setFrom(props);
		this.bindHtml();
		console.log(this.html);
		$('#dodaj_etykiete',this.html.section_menu).click(function(){self.dodaj_etykiete(false,true);return false;});
		$('#wersja_kieszonkowa',this.html.section_menu).click(function(){if(!(self._pobierz().length)){alert('Najpierw dodaj przystanki');return false;}else return true;});
		this.html.header.click(function(){self.przelacz();});
		this.html.elements.sortable({
			scroll:false,
			update:function(e,ui){
				var serialized=$(self.html.elements).sortable("toArray");
				for(var i=0;i<serialized.length;i++)if(serialized[i].indexOf('etykieta')==0)serialized[i]=self.etykiety[serialized[i]];
				self._ustaw(serialized.join(self.divider));
			}
		});
		 
		this._auto_update(true);//this!
		
		var schowek_data=this._pobierz();
		if(!schowek_data.length){this.html.onetimeinfo.show(); return;}
		
		loading_sign().addMe(this.html.elements);
		autobuser_api.zapytanie(schowek_data.split(this.divider).join(','),
			function(data,status){
				//console.log('schowek in callback');
				$('div.loading',self.html.elements).remove();
				schowek_data=schowek_data.split(self.divider);
				for(var i=0;i<schowek_data.length;i++){
					var key=schowek_data[i];
					if(!key.length)continue;
					
					if(key.indexOf('@')==0){
						self.dodaj_etykiete(key.substr(1),false);
						continue;
					}
					if(typeof data.rozklady[key]=='undefined')continue;
					var rozklad=data['rozklady'][key];
					//glob_rozklady_cache[key]=rozklad;
					self.available_keys[key]=true;
					self._create_przystanek(rozklad['linia'],rozklad['id_przystanku'],rozklad['nazwa'],rozklad['kierunek']);
				}
				self._update_odjazdy();
				$('a.przystanek',self.html.elements).hovermenuAttach('#hoverbox');
			}
		)
	};
	
	Schowek.przelacz = function(){
		if(this.html.section_container.is(':visible'))this.schowaj();
		else this.pokaz();
	}
	
	Schowek.schowaj = function(){
		this.html.section_container.hide();
		this.html.header.css('border-bottom','1px dotted gray');
		$('span.rozwin',this.html.header).show();
	}
		
	Schowek.pokaz = function(){
		this.html.section_container.show();
		this.html.header.css('border-bottom','none');
		$('span.rozwin',this.html.header).hide();
	}
	
	Schowek._auto_update=function(dont_fire,realthis){
		var self;
		if(realthis)self=realthis;
		else self=this;
		if(dont_fire!==true)self._update_odjazdy();		
		setTimeout(function(){self._auto_update(false,self)},30000);
	}
	
	Schowek._update_odjazdy = function(one){
		var today=new Date();
		$('div.element_schowka',this.html.elements).each(function(nr,me){
			var key=me.id;
			if(one && key!=one)return;
			if(key.indexOf('etykieta')==0)return;
			if(autobuser_api.cache[key] == undefined)return;
			var rozklad=autobuser_api.cache[key][(dzien_swiateczny()?'s':'p')];
			$('span.odjazdy',me).remove();
			if(!rozklad)createDOM('span.odjazdy=dziś nie kursuje &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;').prependMe(me);
			else{
				var najblizsze=Rozklad.najblizsze(rozklad,2);
				var ile_min=0;
				for(var i=0;(i<najblizsze.length) && (i<3);i++){
					ile_min=najblizsze[i]-(today.getHours()*60+today.getMinutes());
					najblizsze[i]=Rozklad.min_to_hm(ile_min);
					
					if(ile_min<7)najblizsze[i]='<span style="color:white; background-color:red;">'+najblizsze[i]+'</span>';
					else if(ile_min<11)najblizsze[i]='<span style="color:black;">'+najblizsze[i]+'</span>';
				}
				createDOM('span.odjazdy=odjazd za '+najblizsze.join(', ')).prependMe(me);
			}
		});
	}
	
	Schowek.dodaj_przystanek = function(linia,id_przystanku,nazwa,kierunek){
	//tutaj trzeba dodac opcje sprawdzania czy przystanek jest w cache, jak nie ma to pobieramy i robimy T._update_odjazdy(key)
		var schowek=this._pobierz().split(this.divider);
		var key=linia+':'+id_przystanku;
		var self=this;
		
		if($.inArray(key,schowek)==-1){
			this.available_keys[key]=true;
			$('span.dodano',this.html.section_header).fadeIn(300,function(){$('span.dodano',self.html.section_header).fadeOut(300)});
			schowek.push(key);
			this._ustaw(schowek.join(this.divider));
			$('a',this._create_przystanek(linia,id_przystanku,nazwa,kierunek)).hovermenuAttach('#hoverbox');
			autobuser_api.zapytanie(key,function(data,status){if(data.rozklady)self._update_odjazdy(key);});
			//T._update_odjazdy(key);
			this.html.elements.sortable("refresh");
			return true;
		}
		else alert('już dodane :)');
		return false;
	}
	
	Schowek.usun = function(key){
		this.available_keys[key]=false;
		var el=document.getElementById(key);
		if(el.parentNode)el.parentNode.removeChild(el);
		
		if(this.etykiety[key]){key=this.etykiety[key]; delete this.etykiety[key];}
		
		var schowek=this._pobierz().split(this.divider);
		var i=$.inArray(key,schowek);
		if(i>-1){
			schowek.splice(i,1);
			this._ustaw(schowek.join(this.divider));
		}
	}
	
	Schowek._pobierz = function(){return cookieJar.get(this.cookie_name);}
	Schowek._ustaw = function(wartosc){cookieJar.set(this.cookie_name,wartosc,this.ttl);}
	
	Schowek._create_przystanek = function(linia,id_przystanku,nazwa,kierunek){
		var key=linia+':'+id_przystanku;
		var nr_przystanku=String(id_przystanku).substr(4,2);
		
		var el=createDOM('div.element_schowka#'+key+' { a.przystanek^przystanek '+nazwa+' '+nr_przystanku+'=<b>'+linia+'</b>  '+nazwa+' <img src="gfx/kierunek.gif" style="position:relative; top:4px;"> '+kierunek,{var_id_przystanku:id_przystanku,var_linia:linia,var_usun_ze_schowka:true,var_pokaz_trase:true,var_pokaz_linie:true},function(){Rozklad.pokaz(this);return false;})
		
		//createDOM('span.odjazdy=dupa jasio').addMe(el);
		this.html.elements.append(el);
		//el.addMe();
		this.html.onetimeinfo.hide();
		return el;
	}
	
	Schowek.dodaj_etykiete = function(msg,openmode){
		var eid='etykieta'+this.id_etykiety;
		//alert(msg+' #'+eid);
		var self=this;
		var save_field=function(e){
					if(e==undefined)e=window.event;
					if(e.keyCode==13){
						if(this.value.length){
							var val=this.value;
							val=val.split(',').join('&#44;').split('@').join('');
							$('div.etykieta',this.parentNode.parentNode.parentNode).html(val).css('display','block');
							$(this.parentNode.parentNode).css('display','none');
							
							var schowek=self._pobierz().split(self.divider);
							var i=$.inArray(self.etykiety[this.id_etykiety],schowek);
							if(i>-1)schowek.splice(i,1,'@'+val);
							else schowek.push('@'+val);
							self._ustaw(schowek.join(self.divider));
							self.etykiety[this.id_etykiety]='@'+val;
						}
						return false;	
					}
					return true;
				}
		
		var el=createDOM('div.element_schowka#'+eid,[
			'div.edycja',{$display:openmode?'block':'none'},[
				'div.description=tekst etykiety (np. praca, dom, uczelnia, etc.):',
				'div.field',[
					'a.usun=usun',{var_id_etykiety:eid, onclick:function(){self.usun(this.id_etykiety);return false;}},
					'text',{var_id_etykiety:eid, onkeypress:save_field}]],
			'div.etykieta^kliknij aby edytować= '+(msg?msg:''),{var_id_etykiety:eid,$display:openmode?'none':'block',$cursor:'pointer',onclick:function(){this.style.display='none';$('div.edycja',this.parentNode).css('display','block');$('div.edycja input',this.parentNode).val(self.etykiety[this.id_etykiety].substr(1).split('&#44;').join(',')).focus();}}
		]);
		
		this.html.elements.append(el).sortable("refresh");
		
		if(openmode)$('div.field input',el).focus();
		if(msg)this.etykiety[eid]='@'+msg;
		this.id_etykiety++;
	}
	
//-------------------------------------------------------------------------------------------------
	
	
	var DivMap={
		dict:{},
		counter:0,
		reset:function(){
			this.dict={};
		},
		add:function(key){
			this.counter++;
			//if(this.dict[key]){console.log('duplicate key ',key,'=',this.dict[key],' new ',this.counter);}
			var r='divmap_'+this.counter;
			if(this.dict[key] == undefined)this.dict[key] = [];
			this.dict[key].push(r);
			return r;
		},
		get:function(key){
			return this.dict[key];
		}
	};
	
	var Linia={
		render:function(linia,arr_trasy,req){
			DivMap.reset();
			var content=createDOM('div.real_content');
			for(var klucz in arr_trasy){			
				var trasy=arr_trasy[klucz];
				if(trasy[0] && trasy[1]){
				//tutaj mamy zarowno powszednia jak i swiateczna
					createDOM('div.kierunek { div.trasy',create_tabs({'trasa w dni powszednie':Linia.trasa(trasy[0]),'trasa świąteczna':Linia.trasa(trasy[1])},dzien_swiateczny())).addMe(content);
				}
				else{
					createDOM('div.kierunek { div.trasy',Linia.trasa(trasy[0]?trasy[0]:trasy[1])).addMe(content);
				}
			}
			var typ_linii=(parseInt(linia)>0 && linia.length<3)?'tramwaj':'autobus';
			
			return createDOM('div.linia',[create_content_header(typ_linii+' <span class="nazwa_linii">'+linia+'</span>',req),content]);
		},
		
		trasa:function(opis_trasy){
				//var tytul=opis_trasy['poczatek_nazwa'];
				//if(opis_trasy['poczatek_miasto'].length)tytul+=' ('+opis_trasy['poczatek_miasto']+')';
			var tytul='kierunek '+opis_trasy['koniec_nazwa'];
				if(opis_trasy['koniec_miasto'].length)tytul+=' ('+opis_trasy['koniec_miasto']+')';
			var przystanki=opis_trasy.trasa
			var content=createDOM('div.trasa { h2='+tytul);
			var dojazd_txt='';
			var dojazd=0;
			
			for(var i=0,c=przystanki.nazwa.length;i<c;i++){
				//przystanki.id_przystanku[i]
				//opis_trasy.linia
				
				dojazd=dojazd+(przystanki.dojazd[i]?przystanki.dojazd[i]:0);
				dojazd_txt=(dojazd<10)?'0'+dojazd:dojazd;
				
				if((i==(c-1)))createDOM('div.przystanek_trasy=max. czas '+dojazd_txt+'min&nbsp;&nbsp;'+przystanki.nazwa[i]).addMe(content);
				else if(przystanki.id_przystanku[i]<1000)createDOM('div.przystanek_trasy='+dojazd_txt+'&nbsp;&nbsp;&nbsp;'+przystanki.nazwa[i]).addMe(content);
				else {
					var divid=DivMap.add(opis_trasy.linia+':'+przystanki.id_przystanku[i]);
					createDOM('div.przystanek_trasy='+dojazd_txt+'&nbsp;&nbsp;&nbsp; { a#'+divid+'^przystanek '+przystanki.id_przystanku[i]+'='+przystanki.nazwa[i],{var_id_przystanku:przystanki.id_przystanku[i],var_linia:opis_trasy.linia,var_nazwa:przystanki.nazwa[i],var_kierunek:opis_trasy['koniec_nazwa'],var_schowek:true,var_pokaz_linie:true},
						function(){Page.load_rozklad(this.linia+':'+this.id_przystanku);return false;}
					).addMe(content);
				}
			}
			$('div.przystanek_trasy > a',content).hovermenuAttach('#hoverbox');
			return content;
		}
		
	}
	
	var Zespol={
		render:function(zespol,arr_linie,req){
			DivMap.reset();
			var content=createDOM('div.real_content');
			var miasto=''
			for(var typ_linii in arr_linie){
				createDOM('h2='+typ_linii).addMe(content);
				var table=createDOM('table.linie { tbody').addMe(content).wrapped_element;
				for(var linia in arr_linie[typ_linii]){
					var pospieszna=((typ_linii=='autobusy') && ((linia.charAt(0)=='5') || (linia.charAt(0)=='4') || (linia.charAt(0)=='E')));
					var tr=createDOM('tr').addMe(table);
					createDOM('td.linia '+(pospieszna?' pospieszna':'')+' { a='+linia,{var_linia:linia,onclick:function(){Page.load('linia/'+this.linia);return false;}}).addMe(tr);
					var c=0;
					for(var kierunek in arr_linie[typ_linii][linia]){
						var dane=arr_linie[typ_linii][linia][kierunek];
						var divid=DivMap.add(linia+':'+dane.id_przystanku);
						c++;
						
						//console.log(zespol+' '+dane.nazwa+' '+dane.miasto);
						miasto=dane.miasto;
						createDOM(
							'td.kierunek { a.kierunek#'+divid+'^przystanek '+dane.id_przystanku+'='+kierunek,
							{var_id_przystanku:dane.id_przystanku,var_nazwa:dane.nazwa,var_kierunek:kierunek,var_linia:linia,var_schowek:true, var_pokaz_trase:true},
							function(){
								//Rozklad.pokaz(this);
								Page.load_rozklad(this.linia+':'+this.id_przystanku);
								return false;
							}
						).addMe(tr);
						//console.log(td.wrapped_element);
						//$(td.wrapped_element).hovermenuAttach('#hoverbox');
					}
					if(c<2)createDOM('td.kierunek=&nbsp;').addMe(tr);
				}
			}
			$('a.kierunek',content).hovermenuAttach('#hoverbox');
			//if(miasto!='')zespol=zespol+' ('+miasto+')';
			return createDOM('div.zespol',[create_content_header('przystanek '+zespol,req),content]);
		}
	}

	
	Rozklad={
		otwarte:{},
		
		pokaz:function(el,user_options){
			var options=el;//expand_object(user_options,{mapa:true});
			var dom_el=el.parentNode;
			options.mapa=true;
			if(options.id_przystanku==undefined || options.linia==undefined){alert('x');return;};
			var key=options.linia+':'+options.id_przystanku;
			
			if(!dom_el.widac_rozklad){
				loading_sign().addMe(dom_el);
				autobuser_api.zapytanie(key,function(data,status){
					Rozklad.render(data.rozklady[key],dom_el,options);
					dom_el.widac_rozklad=1;	
					Rozklad.otwarte[key]=dom_el;
				});
			}
			else{
				$('div.rozklad',dom_el).remove();
				dom_el.widac_rozklad=0;	
				Rozklad.otwarte[key]=undefined;
			}
		},
		 
		otworz:function(el){
			if(!el)return;
			var dom_el=el.parentNode;
			if(!dom_el)return;
			if(dom_el.widac_rozklad)return;
			var key=el.linia+':'+el.id_przystanku;
			loading_sign().addMe(dom_el);
			autobuser_api.zapytanie(key,function(data,status){
				Rozklad.render(data.rozklady[key],dom_el,el);
				dom_el.widac_rozklad=1;	
				Rozklad.otwarte[key]=dom_el;
			});
		},
		
		zamknij:function(el){
			var dom_el=el.parentNode;
			if(!dom_el.widac_rozklad)return;
			var key=el.linia+':'+el.id_przystanku;
			console.log('zamykam rozklady ',key);
			$('div.rozklad',dom_el).remove();
			dom_el.widac_rozklad=0;
			Rozklad.otwarte[key]=undefined;
		},
		
		render:function(data,dom_el,options){
			options=options || {};
			var numer_zespolu=data.numer;
			var numer_przystanku=String(data.id_przystanku).substr(4);
			var legenda='';
			var cmentarna=false;
			
			if(data.zmiany.length>1)legenda='<div class="legenda">'+data.zmiany.split('\n').join('<BR>')+'</div>';
			
			//dodaj_do_schowka(linia,id_przystanku,nazwa,kierunek)
			//linia,kierunek,id_przystanku,numer,numer_przystanku,nazwa,miasto
			
			if(data.linia.charAt(0)=='C'){options.schowek=false;cmentarna=true;}
			
			$('div.loading',dom_el).remove();
			var opcje=createDOM('ul.przystanek_trasy_opcje');
			//if(options.schowek)createDOM('li.dodaj_do_schowka { a^dodaj '+data.linia+' z przystanku '+data.nazwa+' '+numer_przystanku+' do moich przystanków=do moich przystanków',function(){schowek.dodaj_przystanek(data.linia,data.id_przystanku,data.nazwa,data.kierunek);return false;}).addMe(opcje);
			//if(options.usun_ze_schowka)createDOM('li.usun_ze_schowka { a^usuń z moich przystanków=usuń z moich przystanków',function(){schowek.usun(data.linia+':'+data.id_przystanku);return false;}).addMe(opcje);
			//if(options.mapa!==false)createDOM('li.zobacz_na_mapie { a^zobacz '+data.nazwa+' '+numer_przystanku+' na mapie=zobacz na mapie',function(){Mapa.show_przystanek(data.id_przystanku);return false;}).addMe(opcje);
			
			//if(data.linia.charAt(0)=='N')data.s=data.p;				
			var tabs_conf={};
			var tab_nr=dzien_swiateczny();
			
			if(!cmentarna){
				tabs_conf['dzień powszedni']='<div style="padding-top:5px;">'+data.nazwa+' '+numer_przystanku+'</div>'+Rozklad.odjazdy(data.p,0)+legenda;
				tabs_conf['świąteczny']='<div style="padding-top:5px;">'+data.nazwa+' '+numer_przystanku+'</div>'+Rozklad.odjazdy(data.s,1)+legenda;
			}else{
				tab_nr=0;
				var c=0;
				for(var x in data.p)c++;
				if(c>2){
					tab_nr=1;
					tabs_conf['sobota']='<div style="padding-top:5px;">'+data.nazwa+' '+numer_przystanku+'</div>'+Rozklad.odjazdy(data.p,1)+legenda;
					tabs_conf['niedziela']='<div style="padding-top:5px;">'+data.nazwa+' '+numer_przystanku+'</div>'+Rozklad.odjazdy(data.s,1)+legenda;
				} else
					tabs_conf['sobota i niedziela']='<div style="padding-top:5px;">'+data.nazwa+' '+numer_przystanku+'</div>'+Rozklad.odjazdy_cm(data)
			}
			
			if(options.pokaz_trase)tabs_conf['trasa linii '+data.linia]=function(el){Rozklad.trasa(el,data.linia,data.kierunek,data.kierunek_numer,data.nazwa);}//'trasa linii '+data.linia+' w kierunku '+data.kierunek;
			if(options.pokaz_linie)tabs_conf['inne linie']=function(el){Rozklad.linie(el,data.nazwa,data.linia);}
			
			dom_el.appendChild(createDOM('div.rozklad',[create_tabs(tabs_conf,tab_nr),opcje]));
			if(window.update_parent_height)window.update_parent_height();
		},
		
		odjazdy_cm:function(rozklady){
			var out_html='';
			for(var d in {'p':'','s':''}){
				if(d=='p')out_html+='<div>sobota:</div>';
				if(d=='s')out_html+='<div>niedziela:</div>';
				for(var odjazd_h in rozklady[d]){
					for(var odjazd_m in rozklady[d][odjazd_h]){
						out_html+='<div>'+odjazd_h+' : <span class="minuty">'+odjazd_m+'</span></div>';
					}}} 
			out_html+='<div class="legenda">Przybliżone godziny pierwszego i ostatniego kursu.<BR> Częstotliwość kursowania: 10-16 co 5min. do 10 i po 16 co 15min.</div>';
			return out_html;
		},
		
		odjazdy:function(rozklad,swiateczny){
			var out_html='';
			
			var najblizsze=[],pierwszy;
			if(!rozklad){
				if(swiateczny)out_html='<div>Nie kursuje w sobotę i święta</div>';
				else out_html='<div>Nie kursuje w dni powszednie</div>';
				return out_html;
			}
			
			if(dzien_swiateczny()==swiateczny){
				najblizsze=Rozklad.najblizsze(rozklad);
				pierwszy=Rozklad.min_to_hm(najblizsze[0]);
			}
			
			for(var odjazd_h in rozklad){
				out_html+='<div>'+odjazd_h+' : <span class="minuty">';
				var separator=(count_keys(rozklad[odjazd_h])>8)?' ':'&nbsp;&nbsp;';
				
				for(var odjazd_m in rozklad[odjazd_h]){
					var inf=rozklad[odjazd_h][odjazd_m];
					var niskopod=false;
					if(typeof inf == "object"){
						niskopod=true;
						inf=inf[1];
					}
					else if(inf=='0')inf='';
					else if(inf=='1'){
						inf='';
						niskopod=true;
					}

					var zaznacz=(pierwszy==odjazd_h+':'+odjazd_m);
					out_html+=(niskopod?'<u>':'')+(zaznacz?'<span class="najblizszy">':'')+odjazd_m+(zaznacz?'</span>':'')+(niskopod?'</u>':'')+inf+separator;
				}
				out_html+='</span></div>';
			}
	
			if(najblizsze.length){
				var today=new Date();
				for(var i=0;(i<najblizsze.length) && (i<4);i++)najblizsze[i]=Rozklad.min_to_hm(najblizsze[i]-(today.getHours()*60+today.getMinutes()));
				out_html='<div class="najblizszy_info">odjazd za '+najblizsze.join(', ')+'</div>'+out_html;	
			}
			else {
				if(swiateczny)out_html='<div class="najblizszy_info">dziś obowiązuje powszedni!</div>'+out_html;
				else out_html='<div class="najblizszy_info">dziś obowiązuje świąteczny!</div>'+out_html;
			}
			
			return out_html;
		},
		
		linie:function(dom_el,nazwa,linia){
			loading_sign().addMe(dom_el);
			autobuser_api.zapytanie(nazwa,function(data,status){
				dom_el.innerHTML='';
				//alert(data.zespoly);
				if(!data.zespoly)return;
				if(!data.zespoly[nazwa])return;
				var cont=createDOM('div.inne_linie=z przystanków ',{$padding_top:'5px'},['a= '+nazwa,{var_nazwa:nazwa,onclick:function(){Page.load('przystanek/'+this.nazwa);return false;}}]);
				for(var typ_linii in data.zespoly[nazwa])
				{
					//tutaj dodajemy info o typie
					createDOM('div.typ='+typ_linii).addMe(cont);
					for(var l in data.zespoly[nazwa][typ_linii])
					{
						var ekspres=(parseInt(l)>399) || (l.indexOf('E')==0);
						createDOM('div.nazwa { a='+l,{var_linia:l,$font_weight:'bold',$color:ekspres?'red':'black'},function(){Page.load('linia/'+this.linia);return false;}).addMe(cont);
					}
				}
				cont.addMe(dom_el);
				dom_el.content_aquired=true;
				if(window.update_parent_height)window.update_parent_height();
			});
		},
		
		trasa:function(dom_el,linia,kierunek,kierunek_numer,poczatek)
		{
			loading_sign().addMe(dom_el);
			//console.log(linia+' aktualny przystanek:'+poczatek+' to:'+kierunek);
			if(kierunek.indexOf('  ')==kierunek.length-4)kierunek=kierunek.substr(0,kierunek.length-4);
			
			autobuser_api.zapytanie(linia,function(data,status)
			{
				dom_el.innerHTML='';
				if(!data.linie)return;
				var trasa=null;
				for(var k in data.linie[linia])
				{
					if(data.linie[linia][k][1])trasa=data.linie[linia][k][dzien_swiateczny()];
					else trasa=data.linie[linia][k][0];	
					//console.log('\t #'+k+' | from:'+trasa.poczatek_nazwa+' to:'+trasa.koniec_nazwa);
					if(trasa.koniec_numer==kierunek_numer)break;
				}
				//console.log('\t znaleziono to:'+trasa.koniec_nazwa);
				if(!trasa)return;
				//dom_el.innerHTML='z przystanku '+poczatek+':';
				//createDOM('div.nazwa_przystanku=
				var przystanki=trasa.trasa;
				var dojazd=0,dojazd_txt='--&nbsp;&nbsp;&nbsp;&nbsp;',byl_poczatek=false;
				for(var i=0,c=przystanki.nazwa.length;i<c;i++)
				{
					if(poczatek==przystanki.nazwa[i])byl_poczatek=true;
					var numer=String(przystanki.id_przystanku[i]).substr(0,4);
					
					if(i==(c-1))createDOM('div.przystanek_trasy=max. czas '+dojazd_txt+'min &nbsp;&nbsp;'+przystanki.nazwa[i]).addMe(dom_el);
					else if(przystanki.id_przystanku[i]<1000)createDOM('div.przystanek_trasy='+dojazd_txt+'&nbsp;&nbsp;&nbsp;'+przystanki.nazwa[i]).addMe(dom_el);
					else createDOM('div.przystanek_trasy='+dojazd_txt+'&nbsp;&nbsp;&nbsp; { a='+przystanki.nazwa[i],{var_nazwa:przystanki.nazwa[i],var_numer:numer,var_linia:linia,$font_weight:(poczatek==przystanki.nazwa[i])?'bold':'normal'},function(){Page.load('przystanek/'+this.nazwa);return false;}).addMe(dom_el);
					
					if(byl_poczatek)
					{
						dojazd=dojazd+(przystanki.dojazd[i]?przystanki.dojazd[i]:0);
						dojazd_txt=((dojazd<10)?'0'+dojazd:dojazd);
					}
				}
				dom_el.content_aquired=true;
				if(window.update_parent_height)window.update_parent_height();
			});
		},
		
		min_to_hm: function(m){
			var h=Math.floor(m/60);
			return h+':'+(((m-h*60)<10)?'0':'')+(m-h*60);	
		},
		
		najblizsze: function(rozklad,ilosc,today){
			if(!today)today=new Date();
			if(!ilosc)ilosc=3;
			var godzina_hm=today.getHours()*60+today.getMinutes();
			//var godzina_hm=15*60+30;
			
			var najblizsze=[];
			var najblizsze_plus24=[];
			var ilosc_plus24=ilosc,ilosc_req=ilosc;
			var nocny=(rozklad['23']!=undefined && rozklad['1']!=undefined);

			
			if(nocny){
				var add_to_end={};
				for(var rozklad_h in rozklad)
					if(parseInt(rozklad_h)>20){
						add_to_end[rozklad_h]=rozklad[rozklad_h];
						delete rozklad[rozklad_h];	
					}
				for(var rozklad_h in add_to_end)rozklad[rozklad_h]=add_to_end[rozklad_h];
			}
			
			for(var rozklad_h in rozklad){
				rozklad_h=parseInt(rozklad_h);
				for(var rozklad_m in rozklad[rozklad_h]){
					var korekta_nocna=(nocny && (rozklad_h<20))?24*60:0;
					var rozklad_hm=rozklad_h*60+((rozklad_m.charAt(0)=='0')?parseInt(rozklad_m.charAt(1)):parseInt(rozklad_m));
					var rozklad_hm_plus24=24*60+rozklad_hm;
					
					if(((rozklad_hm)>godzina_hm) && (ilosc>0)){najblizsze.push(rozklad_hm);ilosc--;}
					if((rozklad_hm_plus24>godzina_hm) && (ilosc_plus24>0)){najblizsze_plus24.push(rozklad_hm_plus24);ilosc_plus24--;}
					if(!ilosc)break;
				}
				if(!ilosc)break;
			}
			
			var c=najblizsze.length;
			if(!c)return najblizsze_plus24;
			if(c<ilosc_req)for(var i=0;i<(ilosc_req-c);i++)najblizsze.push(najblizsze_plus24[i]);
			return najblizsze;
		}
	}
	
	
	var Mapa = {
		api_key:'ABQIAAAAmQ4orA7gOoUrlczwOZY_BBSzAR49PxF1BjjtD8Pw3vmca3LlARTJNInTC6aSWwnVkRSrUFQW3tN-aQ',
		gmap:null,
		initialized:false,
		loaded_script:false,
		geocoder:null,
		icons:[],
		cache:{},
		current_markers:[],
		_delayed_show_przystanek:false,
		_delayed_find_location:false,
		load_script:function(){
			Mapa.init();
			return 0;
			/*
			loading_sign().addMe("gmap");
			var script = document.createElement("script");
     	script.setAttribute("src", "http://maps.google.com/maps?file=api&v=2.x&sensor=false&key="+Mapa.api_key+"&c&async=2&callback=Mapa.init");
      script.setAttribute("type", "text/javascript");
      document.documentElement.firstChild.appendChild(script);
			*/
		},
		
		init:function()
		{
			if(!Mapa.loaded_script){setTimeout(Mapa.init,1000);return;}
			//alert('skipping big map');
			//return;
			var map_width=780;
			if(AUTOBUSER_CONFIG)map_width=AUTOBUSER_CONFIG.map_width;
			
			var map = new GMap2(document.getElementById("gmap"),{size:new GSize(map_width,600)});
			Mapa.gmap = map;
			Mapa.reset();
			
      		map.enableScrollWheelZoom();
      		map.disableDoubleClickZoom(); 
      		map.addControl(new GLargeMapControl());
      		
      		Mapa.geocoder = new GClientGeocoder();
      		MapIcons.init();
		    GEvent.addListener(map,"moveend", Mapa._moveend_handler);
		    Mapa.initialized=true;
		    if(Mapa._delayed_show_przystanek!==false)
		    {
		    	Mapa.show_przystanek(Mapa._delayed_show_przystanek);
		    	Mapa._delayed_show_przystanek=false;
		    }
			if(Mapa._delayed_find_location!==false)
			{
				Mapa.find_location(Mapa._delayed_find_location);
		    	Mapa._delayed_find_location=false;
			}
		},
		
		_fix_after_zoom:function(){
			var fake_lat=Mapa.gmap.getCenter().lat()+0.00001;
			var fake_lng=Mapa.gmap.getCenter().lng()+0.00001;
			Mapa.gmap.panTo(new GLatLng(fake_lat,fake_lng));
		},
		
		 _fix_getBounds:function(){
			var b=Mapa.gmap.getBounds();
			var c=Mapa.gmap.getCenter();
			var m=1000000;
			var Clng=Math.floor(c.lng()*m);
			var diff=Math.floor(b.getCenter().lng()*m)-Clng;
			if(Math.abs(diff)<=1)return b;
			var SWlng=Math.floor(b.getSouthWest().lng()*m);
			var NElng=Math.floor(b.getNorthEast().lng()*m);
			if(diff<0){
				//NElng - poprawna wartosc ale zle miejsce
				SWlng=NElng-((NElng-Clng)*2)
				//zamieniamy stronami
				t=NElng
				NElng=SWlng
				SWlng=t
			} else if(diff>0){
				//SWlng - poprawna
				NElng=SWlng+((Clng-SWlng)*2)
			}
			return new GLatLngBounds(new GLatLng(b.getSouthWest().lat(),SWlng/m,true),new GLatLng(b.getNorthEast().lat(),NElng/m,true));
		 },
		 
		debug_moveend_handler:function()
		{
			//var log=$('div#footer');
            var b = Mapa._fix_getBounds();
			var msg='';
			var prec=4;
			var res={};
			//console.log(b);
			//res.NElat=b.getNorthEast().lat().toFixed(prec);
			res.NElng=b.getNorthEast().lng().toFixed(prec);
			//res.SWlat=b.getSouthWest().lat().toFixed(prec);
			res.SWlng=b.getSouthWest().lng().toFixed(prec);
			//res.CNTlat=b.getCenter().lat().toFixed(prec);
			res.CNTlng=b.getCenter().lng().toFixed(prec);
			res.CNT2lng=Mapa.gmap.getCenter().lng().toFixed(prec);
			
			res.LNG_diff=(res.NElng-res.SWlng).toFixed(prec);
			res.CNT_diff=(res.CNTlng-res.CNT2lng).toFixed(prec);
			for(var i in res)msg+='<span style="color:gray;">'+i+'</span> : '+res[i]+', ';
			console.log(res);
			$('div#footer').prepend('<DIV>'+msg+'</DIV>');
			//log.innerHTML=msg+'<BR>'+log.innerHTML;
          
		},
		
		_moveend_handler:function() 
		{			    
			    //Mapa.debug(Mapa.bounds());
			    var map=Mapa.gmap;
			    var bnd=Mapa.bounds();
			    var cntr=Mapa.gmap.getCenter();
			    var sektory=[],sektory_do_pobrania=[];
			    var zoom=map.getZoom(); //(jezeli < 15 to czyscimy wszystkie przystanki)
			    //Mapa.debug(zoom+' '+cntr.lat()+'/'+cntr.lng());
			    if(zoom<15)
			    { 
				    map.clearOverlays();
				    Mapa.current_markers=[];
				    $('#map_zoom_info').css('visibility','visible');
				    return;
				}
			    $('#map_zoom_info').css('visibility','hidden');
			    //$('div#footer').html("<a href='http://maps.google.com/?ie=UTF8&ll="+bnd[10]+","+bnd[11]+"&z="+zoom+"' target='newwindow'>maptest</a>");
				//console.log(bnd)
			    for(var lat=bnd[4];lat<=bnd[6];lat++)
			    	for(var lng=bnd[5];lng<=bnd[7];lng++)
			    	{
				    	var snr=(lat*10000+lng)+'';
				    	sektory.push(snr);
				    	if(Mapa.cache[snr]==undefined)sektory_do_pobrania.push(snr);
			    	}
			    //console.log({'sektory':sektory.length,'do pobrania':sektory_do_pobrania.length});
			    //Mapa.debug('z'+zoom+': '+sektory);
			    
			    if(sektory_do_pobrania.length)
				    $.ajax({
						url:"autobuser_api.php",
						data:{"s":sektory_do_pobrania.join(',')},
						dataType:"json",
						success:function(data,status)
								{
									if(data.przystanki)
										for(var przystanek_id in data.przystanki)
										{
											var przystanek=data.przystanki[przystanek_id];
											przystanek.przystanek_id=przystanek_id+'';
											przystanek.numer_przystanku=przystanek.przystanek_id.substr(4);
											przystanek.sektor+='';
											if(Mapa.cache[przystanek.sektor]==undefined)Mapa.cache[przystanek.sektor]=[przystanek];
											else Mapa.cache[przystanek.sektor].push(przystanek);
											//Mapa.debug(przystanek.sektor+' '+przystanek.przystanek_id+' '+przystanek.nazwa);
										}
									Mapa._show_sectors(sektory);
								}
					});
				else Mapa._show_sectors(sektory);
			    
		},
		
		_show_sectors:function(sectors)
		{
			var bounds=Mapa._fix_getBounds();
			var current=[];
			var m,point,przystanek,numer;
			
			for(var i=0;i<Mapa.current_markers.length;i++)
			{
				m=Mapa.current_markers[i];
				if(!bounds.contains(m.getPoint()))//m.getLatLng()
				{
					Mapa.gmap.removeOverlay(m);
					Mapa.current_markers[i]=null;
				}
				else current.push(m);
			}
			
			for(var i=0; i<sectors.length;i++)
			{
				var sector=sectors[i];
				if(Mapa.cache[sector]==undefined)continue;
				for(var j=0;j<Mapa.cache[sector].length;j++)
				{
					przystanek=Mapa.cache[sector][j];
					point=new GLatLng(przystanek.lat,przystanek.lon);
					if(bounds.contains(point))
					{
						//trzeba sprawdzic czy juz nie jest wyswietlany w Mapa.current_markers;
						m=Mapa._create_przystanek_marker(przystanek,false);
						current.push(m);
					}
				}
			}
			Mapa.current_markers=current;
		},
		
		_create_przystanek_marker:function(przystanek,selected)
		{
			var icon=selected?MapIcons.zaznaczony_przystanek(przystanek.numer_przystanku):MapIcons.przystanek(przystanek.numer_przystanku);
			var m=new GMarker(new GLatLng(przystanek.lat,przystanek.lon),{title:przystanek.nazwa+' '+przystanek.numer_przystanku+', linie: '+przystanek.linie,icon:icon});//,icon:icon
			m.nazwa=przystanek.nazwa;
			m.przystanek_id=przystanek.przystanek_id;
			m.numer=przystanek.numer;
			//GEvent.addListener(m,"click",function(){ajax_szukaj_linie_zespoly('ZESPOL'+String(this.numer),false);maintab('rozklady');});
			GEvent.addListener(m,"click",function(){Page.load('przystanek/'+this.nazwa);});
			Mapa.gmap.addOverlay(m);
			return m;
		},
		
		show_przystanek:function(show_przystanek_id)
		{
			maintab('mapa');

			var zespol;
			if(show_przystanek_id.length>4)zespol=show_przystanek_id.substr(0,4);
			else {zespol=show_przystanek_id;show_przystanek_id=false;}
			
			if(!Mapa.initialized){Mapa._delayed_show_przystanek=show_przystanek_id;return;}
			
			$.ajax({
						url:"autobuser_api.php",
						data:{"z":zespol},
						dataType:"json",
						success:function(data,status)
								{
									var m,point,lat=0,lng=0,counter=0,przystanek,icon;
									if(!data.przystanki){return;}

									GEvent.clearListeners(Mapa.gmap,"moveend");
									Mapa.gmap.clearOverlays();
				   					Mapa.current_markers=[];
				   					
									for(var przystanek_id in data.przystanki)
									{
										przystanek=data.przystanki[przystanek_id];
										if(przystanek.lat=='0' || przystanek.lat=='')continue;
										przystanek.przystanek_id=przystanek_id+'';
										przystanek.numer_przystanku=przystanek.przystanek_id.substr(4);
										
										counter++;
										lat+=parseFloat(przystanek.lat);
										lng+=parseFloat(przystanek.lon);
										m=Mapa._create_przystanek_marker(przystanek,przystanek.przystanek_id==show_przystanek_id);
										Mapa.current_markers.push(m);
									}
										
									Mapa.gmap.setCenter(new GLatLng(lat/counter,lng/counter),16);
									GEvent.addListener(Mapa.gmap,"moveend", Mapa._moveend_handler);
								}
			});
			
			
			
		},
		
		bounds:function(prec)
		{
			var b=Mapa._fix_getBounds();
			var res=[];
			
			if(prec==undefined)prec=6;
			var pow=Math.pow(10,prec);
			
			//lat -> x (West,East) ok. 52.xxx (rosnie w prawo, tj. na wschod)
			//lng -> y (South,North) ok 21.xxx (rosnie do gory, tj. na polnoc)
			
			res[0]=b.getSouthWest().lat().toFixed(prec);
			res[1]=b.getSouthWest().lng().toFixed(prec);
			res[2]=b.getNorthEast().lat().toFixed(prec);
			res[3]=b.getNorthEast().lng().toFixed(prec);
			
			res[0]=b.getSouthWest().lat();
			res[1]=b.getSouthWest().lng();
			res[2]=b.getNorthEast().lat();
			res[3]=b.getNorthEast().lng();
			

			pow=100;
			res[4]=Math.floor(res[0]*pow);
			res[5]=Math.floor(res[1]*pow);
			res[6]=Math.floor(res[2]*pow);
			res[7]=Math.floor(res[3]*pow);
			
			res[8]=res[6]-res[4];
			res[9]=res[7]-res[5];
			
			res[10]=b.getCenter().lat();
			res[11]=b.getCenter().lng();
			
			return res;
		},
		
		set_zoom:function()
		{
			if(Mapa.gmap)Mapa.gmap.setZoom(15);
			Mapa._fix_after_zoom();
		},
		
		reset:function()
		{
			Mapa.gmap.setCenter(new GLatLng(52.228405, 21.012446), 13);	
		},
		
		find_location:function(address)
		{
			if(!Mapa.initialized){Mapa._delayed_find_location=address;return;}
			if(address.split(',').length==1)address=address+',warszawa';
			address = address+',mazowieckie,polska';
      		Mapa.geocoder.getLocations(address, Mapa._add_location);
		},
		
		_add_location:function(response)
		{
			if (!response || response.Status.code != 200) {
        		alert("Nie znaleziono adresu");
        		return;
     		 } 
     		 
	       	var  place = response.Placemark[0];
	        var point = new GLatLng(place.Point.coordinates[1],
	                            place.Point.coordinates[0]);
	        console.log(place.Point.coordinates);
	        var marker = new GMarker(point,{title:'Adres: '+place.address});
	        Mapa.gmap.setCenter(point, 16);
	        Mapa.gmap.addOverlay(marker);
			Mapa._fix_after_zoom();
	        //setTimeout(function(){Mapa.gmap.removeOverlay(marker);},15000);
			
		},
		
		debug:function(msg)
		{
			var d=document.createElement('div');
			var inf=document.getElementById("mapinfo");
			d.innerHTML=msg;
			if(inf.hasChildNodes())inf.insertBefore(d,inf.firstChild);
			else inf.appendChild(d);
		}
		
	}
	
	
	
	
	function create_content_header(label,req)
	{
		var href=AUTOBUSER_CONFIG.base_href+'#'+req.hash;
		
		var div=createDOM('div.real_content_header');
		createDOM('div.section_header='+label).addMe(div);
		createDOM('div.section_menu { a.inblock directlink^link bezposredni, skopiuj lub przeciagnij na pulpit!=<span>'+label+'</span>',{href:'http://'+href,onclick:function(){copyLink(this);return false;}}).addMe(div);
		return div;
		//bez opcji
		return createDOM('div.real_content_header',['div.options',
			['div.schowaj^schowaj=schowaj',{onclick:
			function(){
				var el=this.parentNode.parentNode.parentNode;
				$('div.real_content',el).css('display','none');
				$('div.schowaj',el).css('display','none');
				$('div.pokaz',el).css('display','block');
				if(window.update_parent_height)window.update_parent_height();
				return false;
			}},
			'div.pokaz^pokaż=pokaz',{$display:'none',onclick:
			function(){
				var el=this.parentNode.parentNode.parentNode;
				$('div.real_content',el).css('display','block');
				$('div.schowaj',el).css('display','block');
				$('div.pokaz',el).css('display','none');
				if(window.update_parent_height)window.update_parent_height();
				return false;
			}}],'div.label='+label]);
	}
	
	function loading_sign()
	{
		return createDOM('div.loading=<img src="gfx/loading.gif">');	
	}
	
	function copyLink(linkobj){
		graybox({
			h:120,
			title:'Skopiuj link bezpośredni',
			html:'<textarea id="linktocopy" style="width:380px; height:70px;">'+linkobj.href+'</textarea><BR>możesz też przeciągnąć <a class="inblock directlink" title="link bezpośredni" href="'+linkobj.href+'">'+linkobj.innerHTML+'</a> na pulpit'
		});
		var field=document.getElementById('linktocopy');
		//alert(field.value);
		fieldSelection(field,0,field.value.length);
	}
