document.addEvent('startedmap', function() {
	if ($('poi-panel'))
		s.startPoiPanel( $('map'), $('poi-panel') );
	s.startPoi( s.body );
	
	document.addEvent('updateblock', function(obj) {
		s.startPoi( obj );
	} );
} );

siteEngine.prototype.startPoi = function( obj )
{
	var thisObj = this;
	
	var objs = obj.getElements('.exec');
	objs[objs.length] = obj;
	for (var i=0; i<objs.length; i++)
	{
		objs[i].importProps();
		if (objs[i].hasClass('add-poi'))		this.addPoi(objs[i]);
	}
}

siteEngine.prototype.addPoi = function( obj )
{
	obj.target = $(obj.targetEl);
	obj.targetMap = obj.target.map;
	
	obj.targetMap.cleanPois();
	
	var lat = [];
	var lng = [];
	obj.pois = obj.getElements('.poi');
	for (var i=0; i<obj.pois.length; i++)
	{
		obj.pois[i].importProps();
		obj.pois[i].tipObj = obj.pois[i].getElement('.tip');
		if (obj.pois[i].tipObj)
			obj.pois[i].tip = obj.pois[i].tipObj.get('html');
		
		obj.pois[i].poi = obj.targetMap.addPoi( { 'id': obj.pois[i].id, 'type': (obj.pois[i].icon || obj.type), 'lat': obj.pois[i].lat, 'lng': obj.pois[i].lng, 'content': obj.pois[i].content, 'tip': obj.pois[i].tip } );
		
		obj.pois[i].poi.addEvent('selected', this.selectPoi.pass([obj, obj.pois[i] ], this) );
		
		obj.pois[i].poi.addEvent('deselected', function(obj) {
			obj.removeClass('selected');
			if (obj.anchor)
				obj.anchor.removeClass('marker-selected');
		}.pass(obj.pois[i], this) );
		
		/*obj.pois[i].poi.addEvent('remove', function(obj) {
			obj.targetMap.removePoi( obj.poi );
		}.pass(obj.pois[i], this) );*/
		
		obj.pois[i].anchor = obj.pois[i].getElement('.marker');
		if (obj.pois[i].anchor)
			obj.pois[i].anchor.addEvent('click', function(obj) {
				obj.select();
			}.pass(obj.pois[i].poi, this) );
		
		lat[lat.length] = obj.pois[i].lat;
		lng[lng.length] = obj.pois[i].lng;
	}
	if (obj.boundPois == 'true')
	{
		var bounds = new google.maps.LatLngBounds( new google.maps.LatLng(lat.max(), lng.min()), new google.maps.LatLng(lat.min(), lng.max()) );
		var center = bounds.getCenter();
		var zoom = obj.targetMap._map.getBoundsZoomLevel( bounds );
		obj.targetMap._map.setCenter(center, zoom);
	}
}

siteEngine.prototype.selectPoi = function(obj, poi)
{
	poi.addClass('selected');
	if (poi.anchor)
		poi.anchor.addClass('marker-selected');
	poi.fireEvent('selected');
	
	//if (obj.targetMap.gotoPoint)
	//	obj.targetMap.gotoPoint( poi.lat, poi.lng );
}

siteEngine.prototype.startPoiPanel = function( obj, panel )
{
	panel.importProps();
	this.poiPanel = new PoiPanel( obj, panel, {'open': panel.open} );
	
	obj.map.addEvent('trip-added', function( map, trip ) {
		var fn = this.poiPanel.controlTrip.bind(this.poiPanel);
		trip.addEvent('marker-added', fn );
		trip.addEvent('marker-removed', fn );
	}.bind(this) );
}

var PoiPanel = new Class({
	initialize: function(el, panel, options) {
		this._el = el;
		this.panel = panel;
		this.map = el.map;
		this._options = options;
		
		this._pois = new Array();
		this._thumbs = new Array();
		this._trips = new Array();
		this._lists = new Array();
		this._photos = new Array();
		
		this.formDelay = 1000;
		this.originalPanelWidth = 300;
		
		//document.addEvent('startedmap', function() {
			this.mPanel = m.addPanel(this.panel, { 'position': 'left', 'open': this._options.open } );
			this.mPanel.addEvent('blur', this.cancel.bind(this) );
		//}.bind(this) );
		this.module();
	},
	
	controlTrip: function( marker, trip )
	{
		var divs = this.panel.getElements('.required-trip');
		for (var i=0; i<divs.length; i++)
		{
			var div = divs[i];
			var rt = div.getElement('input');
			var rl = div.getElement('label');
			var replace = div.getElement('a.radio');
			if (rt)
			{
				if (trip)
				{
					if (trip.countMarkers() > 0)
					{
						//replace.removeClass('radio-disabled');
						//rl.removeClass('label-disabled');
						rt.disabled = false;
					}
					else
					{
						//replace.addClass('radio-disabled');
						//rl.addClass('label-disabled');
						rt.disabled = true;
					}
					if (!trip.eventAdded)
					{
						trip.addEvent('changed', this.launch.bind(this) );
						trip.eventAdded = true;
					}
				}
			}
		}
	},
	
	loading: function( state )
	{
		if (state)
		{
			this.form.addClass('loading');
		}
		else
		{
			this.form.removeClass('loading');
		}
	},
	
	module: function( )
	{
		this.form = this.panel.getElement('form');
		var inputs = this.form.getElements('input,select,textarea');
		for (var i=0; i<inputs.length; i++)
		{
			var func = function(obj)
			{
				if (this.mPanel.selected)
				{
					if (this.updateTimer)
						$clear( this.updateTimer );
					this.updateTimer = this.launch.delay(this.formDelay, this);
					//return false;
				}
			}.bind(this);
			inputs[i].addEvent('change', func);
			inputs[i].addEvent('keypress', func);
		}
		//document.addEvent('startedmap', function() {
			this.map.addEvent('resized', func );
			this.map.addEvent('moveend', func );
			this.map.addEvent('changezoom', func );
			this.mPanel.addEvent('focus', func );
		//}.bind(this) );
	},
	
	cancel: function( )
	{
		if (this.updateTimer)
			$clear( this.updateTimer );
		if (this.execXHR)
			this.execXHR.cancel();
		this.map.cleanPois();
	},
	
	chosen: function( )
	{
		//if (this.mPanel.selected)
		//{
			var types = this.panel.getElements('input.poitype');
			for (var i=0; i<types.length; i++)
			{
				if (types[i].get('checked'))
					return true;
			}
		//}
		return false;
	},
	
	chosenTrip: function( )
	{
		var types = this.panel.getElements('input.poitype');
		for (var i=0; i<types.length; i++)
		{
			if ( (types[i].get('checked')) && (types[i].get('id') == 'poitype_trips') )
				return true;
		}
		return false;
	},
	
	launch: function( )
	{
		if (this.updateTimer)
			$clear( this.updateTimer );
		if (this.chosen())
		{
			this.map.cleanPois();
			if (this.chosenTrip())
				this.map.cleanTrips();
			
			this.loading(1);
			this.bounds = this.map.getBounds();
			var params = 'task=poi&' + this.form.toQueryString() + '&area='+this.bounds.sw.lat+' '+this.bounds.sw.lng+'|'+this.bounds.ne.lat+' '+this.bounds.ne.lng;
			//this.map._map.addOverlay( new google.maps.Marker( new google.maps.LatLng(this.bounds.sw.lat, this.bounds.sw.lng) ) );
			//this.map._map.addOverlay( new google.maps.Marker( new google.maps.LatLng(this.bounds.ne.lat, this.bounds.ne.lng) ) );
			this.trip = this.map.findTrip('new');
			if (this.trip)
				params += '&path=' + this.trip.getBoundaries().join('|')
			
			if (this.execXHR)
				this.execXHR.cancel();
			this.execXHR = new Request( {
				url: 'request.php',
				data: params,
				autoCancel: true,
				method: "post"
			} ).send();
			this.execXHR.addEvent('onComplete', this.parse.bind(this) );
		}
	},
	
	parse: function( )
	{
		var xml = this.execXHR.response.xml;
	
		/*** markers section ***/
		var pois = xml.getElementsByTagName('pois');
		for (var i=0; i<pois.length; i++)
		{
			var block = $('poiblock_'+pois[i].getAttribute('type')).empty();
			var markers = pois[i].getElementsByTagName('poi');
			if (markers.length > 0)
			{
			for (var j=0; j<markers.length; j++)
			{
				var id = markers[j].getAttribute('id');
				this._pois[id] = this.map.addPoi( {
					'id': id,
					'tip': markers[j].getAttribute('name'),
					'type': pois[i].getAttribute('type')+'_small',
					'lat': markers[j].getAttribute('lat'),
					'lng': markers[j].getAttribute('lng'),
					'details': markers[j].getAttribute('details')
				} );
				this._thumbs[id] = new Element('div', {'class': 'poi-thumb'}).inject( block );
				this._thumbs[id].a = new Element('a', {'href': markers[j].getAttribute('link') } ).inject( this._thumbs[id] );
				new Element('img', { 'src': markers[j].getAttribute('thumb') } ).inject( this._thumbs[id].a );
				new Element('span').set('html', markers[j].getAttribute('name') ).inject( this._thumbs[id].a );
			}
			}
			else
			{
				block.set('html', '<div class="no-item">Nessun risultato.</div>');
			}
		}
		
		var trips = xml.getElementsByTagName('trip');
		var block = $('poiblock_trips').empty();
		if (trips.length > 0)
		{
			var table = new Element('table').inject( block );
			var thead = new Element('thead').inject( table );
			var tbody = new Element('tbody').inject( table );
			var trh = new Element('tr').inject(thead);
			new Element('th', {'class': 'trip-list-name'}).set('html', 'Nome' ).inject( trh );
			new Element('th', {'class': 'trip-list-stops'}).set('html', 'Fermate' ).inject( trh );
			new Element('th', {'class': 'trip-list-distance'}).set('html', 'Km' ).inject( trh );
			
			for (var j=0; j<trips.length; j++)
			{
				var id = getXMLdata( trips[j].getElementsByTagName('id')[0] );
				var style = trips[j].getAttribute('tripstyle');
				var link = getXMLdata( trips[j].getElementsByTagName('link')[0] ).replace( /&amp;/, '&' );
				this._trips[id] = this.map.addTrip( id , { 'style': style, 'norebound': true } );
				this._trips[id].loadFromXML( trips[j] );
			
				this._lists[id] = new Element('tr').inject(tbody);
				new Element('td', {'class': 'trip-list-name '+style} ).set('html', '<a href="'+link+'">' + getXMLdata( trips[j].getElementsByTagName('name')[0] ) + '</a>' ).inject( this._lists[id] );
				new Element('td', {'class': 'trip-list-stops'} ).set('html', trips[j].getElementsByTagName('stops')[0].getAttribute('total') ).inject( this._lists[id] );
				new Element('td', {'class': 'trip-list-distance'} ).set('html', getXMLdata( trips[j].getElementsByTagName('distance')[0] ) ).inject( this._lists[id] );
			}
		}
		else
		{
			block.set('html', '<div class="no-item">Nessun viaggio.</div>');
		}
		
		/*** areas section ***/
		/*var areas = xml.getElements('area');
		for (var i=0; i<areas.length; i++)
		{
			var topLeft = new GLatLng(areas[i].getAttribute('left'), areas[i].getAttribute('top'));
			var topRight =  new GLatLng(areas[i].getAttribute('right'), areas[i].getAttribute('top'));
			var bottomLeft =  new GLatLng(areas[i].getAttribute('left'), areas[i].getAttribute('bottom') );
			var bottomRight =  new GLatLng(areas[i].getAttribute('right'), areas[i].getAttribute('bottom') );
			this.map._map.addOverlay( new google.maps.Polygon( [topLeft,topRight,bottomRight,bottomLeft,topLeft], "#f33f00", 5, 1, "#ff0000", 0.2) );
		}*/
		
		this.loading(0);
	}
	
} );


var Poi = new Class({
	Implements: [Events, Options],
	
	initialize: function(map, params){
		this.main = map;
		this._map = map._map;
		this._id = params.id;
		this._type = params.type;
		this._lat = params.lat;
		this._lng = params.lng;
		this._details = params.details;
		
		this._params = params;
		
		this.marker = new Point( new google.maps.LatLng(this._lat, this._lng), { 'type': params.type, 'content': params.content, 'tip': params.tip } );
		//marker.addEvent('drag', function() { this.parseDirections(); }.bind(this) );
		//this.addEvent('move', function(marker) { this.build(); this.fireEvent('marker-moved', [marker, this]); }.pass(marker, this) );
		this.marker.addEvent('select', function(marker, multiple) { this.fireEvent('selected', [this, multiple]); }.bind(this) );
		this.marker.addEvent('deselect', function(marker, multiple) { this.fireEvent('deselected', [this, multiple]); }.bind(this) );
		//this.addEvent('geo', function(marker) { this.fireEvent('marker-geo', [marker, this]); }.pass(marker, this) );
		
		this._map.addOverlay( this.marker );
	},
	
	getMain: function()
	{
		return this.main;
	},
	
	getLatLng: function( )
	{
		return this.marker.getLatLng();
	},
	
	select: function( )
	{
		this.marker.select( false );
	},
	
	remove: function( )
	{
		if (this.marker)
		{
			this._map.removeOverlay( this.marker );
		}
		this.fireEvent('remove');
	}
});