var cComboDependentCategories = Class.create({
	//
	initialize: function(argv) {
		this.cboparent = $(argv.cboparent);
		this.cboparent.observe('change', function(){this.cboParent_onClick()}.bind(this));
		this.cbochild = $(argv.cbochild);
		this.cbochild.observe('change', function(){this.cboChild_onClick()}.bind(this));
		this.inpval = $(argv.inpval);
		this.categories = argv.categories;
		this._init(this.inpval.value);
	},
	cboParent_onClick: function(){
		this.cboChild_Clear();
		this.cboChild_Fill();
	},
	cboChild_onClick: function(){
		this.inpval.value = '';
		this.inpval.value = this.cbochild.options[this.cbochild.selectedIndex].value;
	},
	cboChild_Clear: function(){
		for(var i=this.cbochild.options.length-1; i>0; i--){
			this.cbochild.options.remove(i);
		}
		this.inpval.value = '';
	},
	cboChild_Fill: function(){
		if(this.cboparent.value!=''){
			this.categories.each(function(pair){
				if(pair.key.substr(0,4)==this.cboparent.value){
					var option = document.createElement("option");
					option.text = pair.value;
					option.value = pair.key;
					this.cbochild.add(option, null);
				}
			}.bind(this));
		}
	},
	_init: function(initval){
		if(initval!=''){
			for(var i=0; i<this.cboparent.options.length; i++){
				if(this.inpval.value.substr(0,4)==this.cboparent.options[i].value){
					this.cboparent.selectedIndex = i;
					break;
				}
			}
			this.cboParent_onClick();
			for(var i=0; i<this.cbochild.options.length; i++){
				if(initval==this.cbochild.options[i].value){
					this.cbochild.selectedIndex = i;
					break;
				}
			}
		}
		this.inpval.value = initval;
	}
});




var cCalendar = Class.create({
	
	classActiveCSS: '',
	container: null,
	days: $A(),
	
	initialize: function(argv){
		//
		this.container = argv.container;
		this.classActiveCSS = argv.classActiveCSS;
		this.days = new Array();
		//
		var btt = this.container.down('div').childElements();
		var ul = this.container.down('ul');
		var events = ul.childElements();
		var max_height = -1;
		for(var i=0; i<btt.length; i++){
			var day = {'index': i, 'a':btt[i], 'events':events[i]};
			if(max_height<events[i].getHeight()) max_height=events[i].getHeight();
			//
			day.a.observe('mouseenter', function(event){
				event.stop();
				var a = event.findElement('a');
				if(a.href){
					for(var i=0; i<this.days.length; i++){
						if(this.days[i].a==a){
							this.days[i].a.addClassName(this.classActiveCSS);
							this.days[i].events.addClassName(this.classActiveCSS);
						}else{
							this.days[i].a.removeClassName(this.classActiveCSS);
							this.days[i].events.removeClassName(this.classActiveCSS);
						}
					}
				}
			}.bind(this));
			//
			this.days.push(day);
		}// for(var i=0
		ul.setStyle({'height': max_height+"px"});
		//alert(btt.length);
	}

});




var cGoogleMapLoader = Class.create({
	
	RECT: function(left, top, right, bottom){
		this.left = left ? left : 0;
		this.top = top ? top : 0;
		this.right = right ? right : 0;
		this.bottom = bottom ? bottom : 0;
	},
	
	blender: null,
	map: null,
	rc_viewport: null, // RECT
	points: null, // Array
	poins_min_length: 0, // minimalna wielkość tablicy
	keys: $A(), // Array
	requestURL: '',
	marginspx: {}, // [RECT]
	infowindow: null,
	

/**
	*/
	initialize: function(argv){
		
		this.blender = argv.blender;
		
		this.map = argv.map;
		
		this.infowindow = argv.infowindow;
		
		this.points = argv.points;
		this.poins_min_length = argv.poins_min_length ? argv.poins_min_length : 0;
		//this._calculate_viewport();
		
		this.keys = argv.keys;
		
		
		if(argv.marginspx){
			this.marginspx = new this.RECT(argv.marginspx.left, argv.marginspx.top, argv.marginspx.right, argv.marginspx.bottom);
		}else{
			this.marginspx = new this.RECT();
		}
		
		this.requestURL = argv.requestURL;
		
		google.maps.event.addListener(this.map, 'idle', function(){
			this.MakeNewView();
		}.bind(this));
		
	},


	MakeNewView: function(){
		this.blender.setStyle({'display': "block"});
		this._clear_markers();
		this._calculate_viewport();
		var _this = this;
		setTimeout(function(){_this.LoadOffers()}, 50);
	},


/**	Ładuje nowe punkty.
	*/
	LoadOffers: function(){
		
		var _URL = this.requestURL;
		_URL+= '&content_type=json';
		_URL+= '&rect[0]='+this.rc_viewport.left+'&rect[1]='+this.rc_viewport.top+'&rect[2]='+this.rc_viewport.right+'&rect[3]='+this.rc_viewport.bottom;
		for(var i=0; i<this.keys.length; i++){
			_URL+= '&key[]='+this.keys[i];
		}
		//alert(this.keys.length + ' ' + _URL);
		
		new Ajax.Request(_URL, {
			onSuccess: function(transport){
				var json = transport.responseText.evalJSON(true);
				if(json.err!=null){
					this.createPoints(json.points);
				}else{
					alert(transport.responseText);
				}
			}.bind(this)
		});
		
		//alert(latlonbounds.getCenter());
		
	},


/**	Tworzy markery z JSON
	*/
	createPoints: function(points){
		
		//alert(points[0].title);
		var _points = $A();
		
		
		for(var i=0; i<points.length; i++){
			this.points[i] = {
				'id': 'marker:'+i,
				'marker': new google.maps.Marker({
					'map': this.map,
					'position': new google.maps.LatLng(points[i].lat, points[i].lng),
					'title': points[i].title,
					'icon': new google.maps.MarkerImage("http://labs.google.com/ridefinder/images/mm_20_"+ points[i].markerid +".png"),
					'shadow': new google.maps.MarkerImage("http://labs.google.com/ridefinder/images/mm_20_shadow.png",
					new google.maps.Size(22, 20),
					new google.maps.Point(0, 0),
					new google.maps.Point(7, 19),
					new google.maps.Size(0, 0))
				}), infowindow: {
					content: points[i].infowindow,
					url: points[i].url
				}
			};
		}
		
		//this.points = _points;
		
		for(var i=0; i<this.points.length; i++){
			google.maps.event.addListener(this.points[i].marker, "mouseover", function(event){
				this.InfoWindow(event);
			}.bind(this));
			google.maps.event.addListener(this.points[i].marker, "mouseout", function(event){
				this.infowindow.update(null);
			}.bind(this));
			google.maps.event.addListener(this.points[i].marker, "click", function(event){
				this.OpenURL(event);
			}.bind(this));
		}
		
		this.blender.setStyle({'display': "none"});
		
	},


	InfoWindow: function(event){
		if(event==null){
			this.infowindow.update('');
		}else{
			for(var i=0; i<this.points.length; i++){
				if(event.latLng.lat()==this.points[i].marker.position.lat() && event.latLng.lng()==this.points[i].marker.position.lng()){
					this.infowindow.update(this.points[i].infowindow.content);
					//alert(this.points[i].infowindow.content);
					break;
				}
			}
		}
	},


	OpenURL: function(event){
		var _url = '';
		for(var i=0; i<this.points.length; i++){
			if(event.latLng.lat()==this.points[i].marker.position.lat() && event.latLng.lng()==this.points[i].marker.position.lng()){
				_url = this.points[i].infowindow.url;
				break;
			}
		}
		if(_url!='') window.location.href = _url;
	},


/**	Pobiera klucze z argumnetu.
	*/
	ChangeKeys: function(akeys){
		this.keys = akeys;
		this.MakeNewView();
	},


/**	Oblicza viewport.
	*/
	_calculate_viewport: function(){
		
		var viewport = this.map.getBounds(); // LatLngBounds(sw?:LatLng, ne?:LatLng)
		this.rc_viewport = new this.RECT(
			viewport.getSouthWest().lng(),
			viewport.getNorthEast().lat(),
			viewport.getNorthEast().lng(),
			viewport.getSouthWest().lat()
		);
		
		if(this.marginspx.left || this.marginspx.top || this.marginspx.right || this.marginspx.bottom){
			var rc_mappx = new this.RECT(0, 0, $(this.map.getDiv()).getWidth(), $(this.map.getDiv()).getHeight());
			var _rc_viewport = new this.RECT(
				this.rc_viewport.left + this.marginspx.left / rc_mappx.right * this.rc_viewport.left,
				this.rc_viewport.top - this.marginspx.top / rc_mappx.bottom * this.rc_viewport.top,
				this.rc_viewport.right - (rc_mappx.right-this.marginspx.right) / rc_mappx.right * this.rc_viewport.right,
				this.rc_viewport.bottom + this.marginspx.bottom / rc_mappx.bottom * this.rc_viewport.bottom
			);
			if(this.marginspx.left>0) _rc_viewport.left = this.rc_viewport.left + (this.marginspx.left/rc_mappx.right) * (this.rc_viewport.right-this.rc_viewport.left);
			if(this.marginspx.top>0) _rc_viewport.top = this.rc_viewport.top + (this.marginspx.top/rc_mappx.bottom) * (this.rc_viewport.bottom-this.rc_viewport.top);
			if(this.marginspx.right>0) _rc_viewport.right = this.rc_viewport.right - (this.marginspx.right/rc_mappx.right) * (this.rc_viewport.right-this.rc_viewport.left);
			if(this.marginspx.bottom>0) _rc_viewport.bottom = this.rc_viewport.bottom - (this.marginspx.bottom/rc_mappx.bottom) * (this.rc_viewport.bottom-this.rc_viewport.top);
			this.rc_viewport = _rc_viewport;
		}
		/*
		points[0] = {
			'id': 'marker0',
			'marker': new google.maps.Marker({
				'map': this.map,
				'position': new google.maps.LatLng(this.rc_viewport.top, this.rc_viewport.left),
				'title': "LatLngt: "+this.rc_viewport.top+", "+this.rc_viewport.left,
				'icon': new google.maps.MarkerImage("http://labs.google.com/ridefinder/images/mm_20_yellow.png"),
				'shadow': new google.maps.MarkerImage("http://labs.google.com/ridefinder/images/mm_20_shadow.png",
				new google.maps.Size(22, 20), 
				new google.maps.Point(0, 0), 
				new google.maps.Point(7, 19), 
				new google.maps.Size(0, 0))
			}), infowindow: ''
		};
		*/
		
	},
	
	
	
	_clear_markers: function(){
		for(var i=this.poins_min_length; i<this.points.length; i++) this.points[i].marker.setMap(null);
		this.points.length = this.poins_min_length;
	}


}); // cGoogleMapLoader




var cAdUpdater = Class.create({
	
	requestURL: '',
	ads_places: $A(),
	
	initialize: function(argv){
		this.requestURL = argv.requestURL;
		document.observe("dom:loaded", function(){
			this.PlacesSearch();
		}.bind(this));
	},
	
	PlacesSearch: function(){
		
		this.ads_places = $$('div.BoxAd');
		var adcount = {'box':0, 'banner':0, 'board':0, 'billboard':0};
		
		for(var i=0; i<this.ads_places.length; i++){
			this.ads_places[i].update('<div class="AdPreloader"><div>reklama</div><img src="/utils/img/ajax-loader.gif"/></div>');
			switch(true){
				case this.ads_places[i].hasClassName('ad-box'): adcount.box++; break;
				case this.ads_places[i].hasClassName('ad-banner'): adcount.banner++; break;
				case this.ads_places[i].hasClassName('ad-board'): adcount.board++; break;
				case this.ads_places[i].hasClassName('ad-billboard'): adcount.billboard++; break;
			}
		}
		
		var _URL = this.requestURL;
		_URL+= '&content_type=json&count[box]='+adcount.box+'&count[banner]='+adcount.banner+'&count[board]='+adcount.board+'&count[billboard]='+adcount.billboard;
		//alert(_URL);
		new Ajax.Request(_URL, {
			onSuccess: function(transport){
				var json = transport.responseText.evalJSON(true);
				if(json.err!=null){
					this.PlacesUpdate(json.ads);
				}else{
					alert(transport.responseText);
				}
			}.bind(this)
		});
		
	},
	
	PlacesUpdate: function(ads){
		for(var i=0; i<this.ads_places.length; i++){
			this.ads_places[i].update('miejsce na Twoją reklamę');
		}
	}
	
	
});
AdUpdater = new cAdUpdater({'requestURL':"/?v=ads"});






