/*
*	EXPLORE CONTROLLER
*/


var Explore = {
	moving_id : 0, //Id for moving marker
	//Stuff about last load position
	last_load_point : new GPoint(100,100),
	last_load_zoom : 100,
	last_scroll_sum : -1,	//Sum of item_ids last time scroll was calld
							//Used to work out if items have changed since last scroll
	
	//System status
	do_loading : true,
	dragging : false,

	//Move and zoom to point
	gotoPoint : function(lat, lng){
		Items.clearAllMarkers();
		MS.map.centerAndZoom(new GPoint(lng,lat), 4);
	},
	
	zoomToItem : function(item_id){
		if (MS.map.getZoom() >= 19) return;
		var newZoom = Math.min(Math.max((MS.map.getZoom())+2,10), 19);
		//MS.debug(newZoom);
		var marker = Items.getMarkerForItem(item_id);
		MS.map.setCenter(marker.point, newZoom);
		Markers.postionAllMarkers();
		
		if (MS.MS_MODE == MS_MINI) Embed.closeWindow();

		var itm = Items.getItemById(item_id);
		if (itm['type'] ==1) MS.map.closeInfoWindow();
	},

	//Event callback for map scrolling
	doScroll : function(){		
		if (!Explore.do_loading) return;
		
		//new
		Explore.dragging = false; 
		Explore.doload(false);
		//end new
		
		var sum = Items.filterBounds();
		
		//Labels changed? - if not return
		if (Explore.last_scroll_sum == sum) return;
		Explore.last_scroll_sum = sum;
		
		//Update all
		PostingList.updatePostings();	
		//AuthorList.updateAuthors();
		Items.calcTags();
		TagCloud.setTagCloud(Items.tags);
		//Explore.updateAllHTML();
	},
	
	//Load event callback
	doload : function(force){
		if ((!Explore.do_loading) && (!force)) return; //Only load if allowed

		var bounds = MS.map.getBounds();
		var sw = bounds.getSouthWest();
		var ne = bounds.getNorthEast();
		
		var x1 = sw.lng();
		var y1 = sw.lat();
		var x2 = ne.lng();
		var y2 = ne.lat();
		
		var w = x2 - x1;
		var h = y2 - y1;
		
		var point = MS.map.getCenter();
		
		var dx = Math.abs(point.x - Explore.last_load_point.x);
		var dy = Math.abs(point.y - Explore.last_load_point.y);
		var zoom = MS.map.getZoom();
		
		if ((!force) && (zoom == Explore.last_load_zoom) && (dx < (w/2)) && (dy < (h/2))) {
			return;	
		}
		
		if ((zoom > Explore.last_load_zoom) && (dx < (w/4)) && (dy < (h/4)) && (Items.items.length < 60)){
			Explore.last_load_zoom = zoom;
			return;
		}
		Explore.last_load_point = point;
		Explore.last_load_zoom = zoom;
			
		var tags = State.currentTags.join("::");	

		if (State.current_search_term != ''){
			if (tags != '') tags+='::';
			tags += '"'+State.current_search_term+'"';	
		}
		Items.load_data(x1,y1,x2,y2,tags);
	},
	
	/*
	*	Marker item clicked callback
	*/
	markerClicked : function(marker_id){
		var item_id = Items.markers[marker_id].ms_item_id;
		if (State.mode == State.MODE_EXPLORE){
			Markers.openWindow(marker_id, ItemInfo.getInfowindowHTML(item_id));
		}
	},
	
	//Map clicked event callback
	//Check if in 'add' mode...
	mapClicked : function(overlay, point){
		 if (point){
			if (State.mode == State.MODE_ADD){
				var zoom = MS.map.getZoom();
				
				if (zoom<13) {
					var zoomin = confirm('It is recommended that you zoom in to more accurately place your marker. Would you like to zoom in?');
					
					if (zoomin){
						var newZoom = Math.min(Math.max((MS.map.getZoom())+2,13), 19);
						MS.map.setCenter(point, newZoom);
						return;
					}
				}
				//Ok, lets open the add item window and advance the wizard
				MS.setStatus('');//Tell us about this place...');
				Explore.beginAddItem(point);
				Wizard.updateStage(2);
				//Wizard.nextStage();
			} else if (State.mode == State.MODE_MOVING){
				Items.moveItem(Explore.moving_id, point);
			}
		} 
	},
	

	/*
	*  Functions for supressing / allowing loading
	*/
	suppressLoading : function(){
		Explore.do_loading = false;	
	},
	
	//Supress loading for 1 second - used for opening info windows
	suppressLoadingTemp : function(){
		Explore.do_loading = false;	
		setTimeout("Explore.allowLoading()", 1500);
	},
	
	allowLoading : function(){
		Explore.do_loading = true;	
		//Explore.doScroll(); //Update
	},
	
	popupDetails : function (item_id){
		//var itm = Items.getItemById(item_id);
		
		if (MS.MS_MODE != MS_MINI){
			MS.map.closeInfoWindow();
			//Viewer.show('Posting', "/interface/view/item/get.php?id="+item_id,2, item_id);	
			SViewer.show('Posting', "/record/"+item_id+"?popupmode=true");
		} else {
			popitup("http://www.mapsack.com/item/"+item_id);
			//alert("goto: http://www.mapsack.com/item/"+item_id);
		}
	},
	
	hilightpoint : function(x,y){
		Markers.s_markers.hilight_item.setPoint(new GLatLng(y, x));	
	},
	
	dehilightpoint : function(){
		Markers.s_markers.hilight_item.setPoint(new GLatLng(1000, 1000));	
	},
	
	clicklookup : function(x,y,acc){
		var point = new GLatLng(y,x);
		Wizard.updateStage(1);
		if (acc==0){
			if (MS.map.getZoom() >= 19) return;
			
			var newZoom = 13;
			MS.map.setCenter(point, newZoom);
			Markers.postionAllMarkers();
			Status.showStatusMessage = 'Now click where the post should go... [<a href="#" onclick="Explore.cancelAddItem();">cancel</a>]';
			Explore.doload(true);
			//MS.setStatus('Now click where the post should go... [<a href="#" onclick="Explore.cancelAddItem();">cancel</a>]');
		} else {
			Explore.mapClicked(null, point);
		}
	},
	
	getLinkToView : function(base, dobounds, dotags){
		
		var dobounds = dobounds || false;
		var dotags = dotags || false;
		var base = base || 'explore';
		var point = MS.map.getCenter();
		var lat = point.lat();
		var lng = point.lng();
		var zoom = MS.map.getZoom();
		var orderby = Items.orderby;
		
		var tags = '';
		if (dotags) tags = State.currentTags.join(' ');;
		
		var bounds = '';
		
		if (dobounds){
			var b = MS.map.getBounds();
			
			var p1 = b.getSouthWest();
			var p2 = b.getNorthEast();
			
			var minlat = p1.lat();
			var maxlat = p2.lat();
			var minlng = p1.lng();
			var maxlng = p2.lng();
			
			bounds = '&maxlat='+maxlat+'&maxlng='+maxlng+'&minlat='+minlat+'&minlng='+minlng;
		}
		
		url = '/'+base+'?lat='+lat+'&lng='+lng+'&zoom='+zoom+'&tags='+tags+'&orderby='+orderby+bounds;
		return url;
	},

	openPrintView : function(){
		var url = Explore.getLinkToView('printmap/map.php', true, true);
		window.open(url,'_blank');
	},

	flagContent : function(){
		var link=Explore.getLinkToCurrent();
		var retlink = Explore.getLinkToView();
		var url = "/flag?link="+escape(link)+"&ret="+escape(retlink);
		
		location.href = url;
	},
	
	//Open the add item info window
	openAddItemWindow : function(point){
		//Move the add item marker to th enew location
		Markers.s_markers.new_item.setPosition(point);
	},

	//Begin the adding process - called from [add something]
	beginAdd : function(){
		State.mode = State.MODE_ADD;
		Wizard.init('new');
		MS.setStatus('Now click where the post should go... [<a href="#" onclick="Explore.cancelAddItem();">cancel</a>]');
		Explore.suppressLoading();
	},

	//Open the add item info window
	beginAddItem : function(point){
		//Move the add item marker to th enew location
		Markers.s_markers.new_item.setPoint(point);
	},

	//Cancel adding / editing - called from [cancel]
	cancelAddItem : function(){
		State.mode = State.MODE_EXPLORE;
		MS.setStatus('');
		Markers.s_markers.new_item.setPoint(new GLatLng(1000, 100));
		Explore.allowLoading();
		MS.map.closeInfoWindow();
		Wizard.hide();
	},

	moveItemClicked : function(id){

		Explore.moving_id = id;

		SViewer.hide();

		State.mode = State.MODE_MOVING;
		Explore.suppressLoading();
		
		MS.map.closeInfoWindow();
		MS.setStatus('Click where the item should go... [<a href="#" onclick="Explore.moveItemCancelled();">cancel</a>]');
	},

	moveItemCancelled : function(){
		Explore.allowLoading();
		State.mode = State.MODE_EXPLORE;
		MS.setStatus("",false);
	},
	
	//Save new item data...
	//======================
	addItemClicked : function() {
			
		Wizard.iba.tags = $('add_item_tags').value;
		$('finish_add_item_button').innerHTML = '';
		
		var itm = new Array();
		
		itm['item_id']	 = Wizard.iba.id;
		itm['title'] = Wizard.iba.title;
		itm['body']	 = Wizard.iba.body;
		itm['systags']	 = $('add_item_systags').value;
		itm['tags']	 = Wizard.iba.tags;
		itm['link']	 = Wizard.iba.link;
		
		var latlng = Markers.s_markers.new_item.getPoint();
		itm['lat']	 = latlng.lat();
		itm['lng']	 = latlng.lng();
		
		Items.saveItem(itm);
	},
	
	/*
	*	Tag handling
	*/	
	
	tagClicked : function(tag, mutex){
		if (typeof mutex == 'undefined') mutex = false;
		
		if (mutex){
			State.currentTags = State.genericMinTags.copy();
		}
		
		if ($type(tag) != 'array')
			State.currentTags.push(tag);
		else
			State.currentTags.extend(tag);
		
		State.currentTags.remove("");
		
		TagCloud.displayCurrentTags();
		Markers.closeWindow();
		Explore.doload(true);
	},
	
	tagUnClicked : function(tag_index){
		var tagname = State.currentTags[tag_index];
		
		State.currentTags = State.currentTags.remove(tagname);
		
		TagCloud.displayCurrentTags();
		Explore.doload(true);
	},
	
	clearAllTags : function(){
		State.currentTags = State.initialTags.copy().extend(CategoryList.getCurrentTags());
		TagCloud.displayCurrentTags();
		Explore.doload(true);
	},
	
	/*
	*	Profiles
	*/
	
	showUserProfile : function(username){
		SViewer.show('Profile', '/member/'+username+'?popupmode=true');
	}
};



