/**
 * Location Modification Loader Functions for phpBB2 (iWindsurf/iKitesurf)
 * Dependencies: Prototype JavaScript Framework 1.5.1
 * @author WeatherFlow Inc.
 * @package location_mod
 * @version 1.0
 */

var map_debug = 0;

var bb_map;
function load(){
	load_location_selector_map();
	load_topic_map();
	load_inline_maps();
	bb_map = load_bbmap('bbcode_map');
}

/**
 * BEGIN TOPIC MAP LOADING
 */

var topic_map;	
function load_topic_map(){		
	if (GBrowserIsCompatible() && (document.getElementById("location_topic_map") != null) ) {		
		topic_map = new GMap2(document.getElementById("location_topic_map"));
		topic_map.addControl(new GSmallMapControl());
		topic_map.addControl(new GMapTypeControl());
		topic_map.setCenter(new GLatLng(40.17887331434696,-99.84375), 3);

		try{
			var weatherstation = new WeatherStation('iws_data_proxy.php'+'?'+grabSID(), 'http://mapper.weatherflow.com/images/windIcons/');
			topic_map.addOverlay(weatherstation);
			GEvent.addListener(weatherstation, "click", function(marker){
				MarkerClicked(marker,topic_map);
			});				
		}
		catch(err){
			if(map_debug == 1) alert('Failed to create weatherstation object. Error: '+err);
		}
				
		try{
			load_my_topic_map();
		}
		catch(err){
			//Failed to load via external function...
			if(map_debug == 1) alert('Failed to load topic map. Error: '+err);
		}
	}		
}

/**
 * BEGIN TOPIC MAP SELECTOR LOADING
 */

var map;
var my_marker; //Used to keep track of current marker
function load_location_selector_map(){
	if (GBrowserIsCompatible() && (document.getElementById("location_selector_map") != null) ) {		
		map = new GMap2(document.getElementById("location_selector_map"));
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		
		var my_zoom = 3;
		if(document.getElementById('location_zoom') != null){
			var my_string2 = document.getElementById('location_zoom').value;								
			if( (/^\d+$/.test(my_string2)) ){					
				my_zoom = parseInt(my_string2);					
			}				
		}			
		
		map.setCenter(new GLatLng(40.17887331434696,-99.84375), my_zoom);
		
		GEvent.addListener(map, "click", function(marker, point) {
			if(marker){ return; } 
			map.removeOverlay(my_marker);
			my_marker = new GMarker(point);	
			map.addOverlay(my_marker);			
			document.getElementById("location").value = my_marker.getPoint().lat() + "," + my_marker.getPoint().lng();
			map.panTo(my_marker.getPoint());
			document.getElementById("location_zoom").value = map.getZoom();
		});

		GEvent.addListener(map,"zoomend", function(oldLevel,newLevel) {
			document.getElementById('location_zoom').value = map.getZoom();
		});
		
		//Place marker on edit condition
		if(document.getElementById('location') != null && document.getElementById('location').value != ''){
			
			if(my_marker != null){
				map.removeOverlay(my_marker)
			}						
			
			var my_string = document.getElementById('location').value.split(',');								
			if(my_string.length == 2){
				my_marker = new GMarker(new GLatLng(my_string[0],my_string[1]));
				map.addOverlay(my_marker);	
				map.panTo(new GLatLng(my_string[0],my_string[1]));					
			}

		}
		if(document.getElementById('locBoxRow') != null && document.getElementById('location').value == ''){ 
			document.getElementById('locBoxRow').style.display = 'none';			
		}
		else {
			if(document.getElementById('toggleLocBtn') != null){
				document.getElementById('toggleLocBtn').innerHTML = 'Click Here to Close Map';
			}
		}			
	}
}

function toggleLocBox(){
	if(document.getElementById('locBoxRow') != null){
		if(document.getElementById('locBoxRow').style.display == 'none'){
			document.getElementById('locBoxRow').style.display = '';				
			document.getElementById('toggleLocBtn').innerHTML = 'Click Here to Close Map';
		}
		else {
			document.getElementById('locBoxRow').style.display = 'none';
			document.getElementById('toggleLocBtn').innerHTML = 'Click Here to Associate Your Post with a Geographic Location';			
		}
	}			
}

/**
 * BEGIN INLINE BBCODE MAP LOADING
 */

//Map Information Structure
function inline_map_prefs(canvas, center, width, height, name, zoom, map, markers, map_type, wind){
	this.canvas = canvas;
	this.center = center;
	this.width = width;
	this.height = height;
	this.name = name;
	this.zoom = zoom;
	this.map = map;
	this.markers = markers; //Array
	this.map_type = map_type;
	this.show_wind = wind;
}

//Individual Marker Structure
function inline_map_marker(gmarker, name){
	this.gmarker = gmarker;
	this.name = name;
}

// Helper for info windows
function createMarker(point,str) {
	var marker = new GMarker(point);
	if(str != null && str != ''){
		GEvent.addListener(marker, "click", function() {
		  marker.openInfoWindow(str);
		});							
	}
	return marker;
}
	
var inline_map_info = new Array();
function load_inline_maps(){
	//Get containers
	var inline_map_containers = document.getElementsByClassName('gmap');		
	//Foreach Container
	for(i = 0; i < inline_map_containers.length; i++){								
		try{
			//Grab Variables and Parse
			var canvas = inline_map_containers[i].getElementsByClassName('gmapcanvas')[0];
			
			if(inline_map_containers[i].getElementsByClassName('gmapcenter')[0] != null){
				var center = inline_map_containers[i].getElementsByClassName('gmapcenter')[0].innerHTML;
			}
			else {
				var center = '40.17887331434696,-99.84375';
			}

			var proper_idth = new RegExp("^(([0-9]){3}(px|%))$");
			if(inline_map_containers[i].getElementsByClassName('gmapwidth')[0] != null
				&& proper_idth.test(inline_map_containers[i].getElementsByClassName('gmapwidth')[0].innerHTML)){
				var width = inline_map_containers[i].getElementsByClassName('gmapwidth')[0].innerHTML;
			}
			else {
				var width = '300px';
			}
			
			if(inline_map_containers[i].getElementsByClassName('gmapheight')[0] != null
				&& proper_idth.test(inline_map_containers[i].getElementsByClassName('gmapheight')[0].innerHTML)){
				var height = inline_map_containers[i].getElementsByClassName('gmapheight')[0].innerHTML;
			}
			else {
				var height = '200px';
			}
		
			if(inline_map_containers[i].getElementsByClassName('gmapname')[0] != null){
				var name = inline_map_containers[i].getElementsByClassName('gmapname')[0].innerHTML;
			}
			else {
				var name = '';
			}
			
			if(inline_map_containers[i].getElementsByClassName('gmapzoom')[0] != null &&
				!isNaN(inline_map_containers[i].getElementsByClassName('gmapzoom')[0].innerHTML)){
				
				var zoom = parseInt(inline_map_containers[i].getElementsByClassName('gmapzoom')[0].innerHTML);
			}
			else {
				var zoom = 3;
			}
			
			if(inline_map_containers[i].getElementsByClassName('gmaptype')[0] != null){				
				var map_type = inline_map_containers[i].getElementsByClassName('gmaptype')[0].innerHTML;				
				switch(map_type.toLowerCase()){					
					case 'hybrid': map_type = "G_HYBRID_MAP"; break;
					case 'satellite': map_type = "G_SATELLITE_MAP"; break;
					default: map_type = "G_NORMAL_MAP";
				}
			}
			else {
				var map_type = G_HYBRID_MAP;
			}			

			if(inline_map_containers[i].getElementsByClassName('gmapwind')[0] != null){				
				var wind = parseInt(inline_map_containers[i].getElementsByClassName('gmapwind')[0].innerHTML);
			}
			else {
				var wind = 0;
			}			
			
			var markers = new Array();
			if(inline_map_containers[i].getElementsByClassName('gmarker')[0] != null){
				var j;
				var cnt = 0;
				for(j = 0; j < inline_map_containers[i].getElementsByClassName('gmarker').length; j++){
					var str = inline_map_containers[i].getElementsByClassName('gmarker')[j].innerHTML;
					str2 = str.split(' ');
					if(str2.length >= 1 && str2[0].split(',').length == 2){
						marker_coords = str2[0].split(',');							
						if(isNaN(marker_coords[0]) || isNaN(marker_coords[1])){
							marker_coords[0] = '40.17887331434696';
							marker_coords[1] = '-99.84375';
						}						
						str = str.substr(marker_coords[0].length + marker_coords[1].length + 1);
						marker_name = (str != null && str != '') ? str : '';
						markers[cnt] = new inline_map_marker(createMarker(new GLatLng(parseFloat(marker_coords[0]),parseFloat(marker_coords[1])),marker_name),marker_name);													
						cnt++;
					}	
				}	
			}					
			
			//Set width, height
			$(canvas).setStyle({
			  backgroundColor: '#000',
			  width: width,
			  height: height
			});
			
			//Store to pref object
			inline_map_info[i] = new inline_map_prefs(canvas, center, width, height, name, zoom, null, markers, map_type, wind);					
		}
		catch(err){
			//Bad map detected, attempt to fail gracefully.
			inline_map_info[i] = new inline_map_prefs(null, null, null, null, null, null, null, null, null, false);
			if(map_debug == 1) alert('Failed to load specific inline map data. Error: '+err);
		}
		load_inline_map_by_id(i);
	}		
}

function load_inline_map_by_id(i){
	var wf_map;
	try{
		if (GBrowserIsCompatible() && inline_map_info[i].canvas != null){
			var coords = inline_map_info[i].center.split(',');
			if(coords.length != 2 || isNaN(coords[0]) || isNaN(coords[1])){
				coords[0] = '40.17887331434696';
				coords[1] = '-99.84375';
			}
			wf_map = new GMap2(inline_map_info[i].canvas);
			wf_map.addControl(new GSmallMapControl());
			wf_map.addControl(new GMapTypeControl());				
			wf_map.setCenter(new GLatLng(parseFloat(coords[0]),parseFloat(coords[1])), inline_map_info[i].zoom);				
			try{
				wf_map.setMapType(eval(inline_map_info[i].map_type));
			}
			catch(err){
				if(map_debug == 1) alert('Failed to change map type. Error: '+err);
			}
			// Plot markers if exists
			var j;
			for(j = 0; j < inline_map_info[i].markers.length; j++){				
				wf_map.addOverlay(inline_map_info[i].markers[j].gmarker);					
			}				
			
			inline_map_info[i].map = wf_map;

			//Add wind data
			if(inline_map_info[i].show_wind > 0){
				try{
					var weatherstation = new WeatherStation('iws_data_proxy.php'+'?'+grabSID(), 'http://mapper.weatherflow.com/images/windIcons/');
					wf_map.addOverlay(weatherstation);
					GEvent.addListener(weatherstation, "click", function(marker){
						MarkerClicked(marker,inline_map_info[i].map);
					});				
				}
				catch(err){
					if(map_debug == 1) alert('Failed to create weatherstation object. Error: '+err);
				}		
			}			
		}
	}
	catch(err){
		//Bad map detected, fail gracefully.
		if(map_debug == 1) alert('Failed to load inline map by ID. Error: '+err);
	}		
	wf_map = null;
}

/**
 * BEGIN GOOGLE MAPS BBCODE WIZARD
 */
var bbmarkers = new Array();
var bbmarkercnt = 0;
function load_bbmap(map_id){
	if (GBrowserIsCompatible() && (document.getElementById(map_id) != null) ) {		
		var gmap = new GMap2(document.getElementById(map_id));
		gmap.addControl(new GSmallMapControl());
		gmap.addControl(new GMapTypeControl());					
		gmap.setCenter(new GLatLng(40.17887331434696,-99.84375), 3);								
		
		GEvent.addListener(gmap, "click", function(marker, point) {
			if(marker){
				edit_bbmarker(marker);
				return;
			} 
			else {
				try{
					var mname = prompt("Enter a name for this marker:","");
					if(mname == null) return;
					bbmarkers[bbmarkercnt] = new inline_map_marker(createMarker(point,mname),mname);					
					gmap.addOverlay(bbmarkers[bbmarkercnt].gmarker);	
					bbmarkercnt++;
				}
				catch(err){
					if(map_debug == 1) alert('Failed to prompt for inline marker text. Error: '+err);
				}					
			}
		});			
		
	}
	return gmap;
}

function edit_bbmarker(marker){
	if(bbmarkercnt > 0){
		try{
			var marker_index;
			bbmarkers.each(function(item, index){
				if(item.gmarker == marker){
					marker_index = index;
					return;
				}
			});			
			if(marker_index >= 0 && bbmarkers[marker_index] != null){
				var tmp = bbmarkers[marker_index] != null ? bbmarkers[marker_index].name : '';
				var newname = prompt("Enter a name for this marker:",tmp);
				if(newname == null) { return; }
				bb_map.closeInfoWindow();
				bb_map.removeOverlay(marker);
				bbmarkers[marker_index] = new inline_map_marker(createMarker(bbmarkers[marker_index].gmarker.getPoint(),newname),newname);					
				bb_map.addOverlay(bbmarkers[marker_index].gmarker);
			}
		}
		catch(err){
			if(map_debug == 1) alert('Failed to edit inline marker. Error: '+err);
		}			
	}
}

function remove_last_bbmarker(map_handle){
	if(bbmarkercnt > 0){
		try{
			map_handle.closeInfoWindow();
			map_handle.removeOverlay(bbmarkers[bbmarkers.length-1].gmarker);
			bbmarkers = bbmarkers.without(bbmarkers[bbmarkers.length-1]);
			bbmarkercnt--;
		}
		catch(err){
			if(map_debug == 1) alert('Failed to remove last inline marker. Error: '+err);
		}
	}
}

function add_bbcode_map(map_id, map_handle, output_area){
	if(map_handle != null){
		try{
			var bbcode = "[gmap]";
			bbcode += "[gmapwidth]"+document.getElementById(map_id).style.width + "[/gmapwidth]";
			bbcode += "[gmapheight]"+document.getElementById(map_id).style.height + "[/gmapheight]";
			bbcode += "[gmapcenter]"+map_handle.getCenter().lat()+","+map_handle.getCenter().lng()+"[/gmapcenter]";
			bbcode += "[gmapzoom]"+map_handle.getZoom()+"[/gmapzoom]";
			bbcode += "[gmapwind]"+(document.getElementById('show_wind').checked ? 1 : 0)+"[/gmapwind]";
			//Parse map type
			var tmp = map_handle.getCurrentMapType();
			var out;
			switch(tmp){
				case G_SATELLITE_MAP: out = "Satellite"; break;
				case G_HYBRID_MAP: out = "Hybrid"; break;
				default: out = "Normal";
			}			
			bbcode += "[gmaptype]"+out+"[/gmaptype]";
			
			var k;
			for(k = 0; k < bbmarkers.length; k++){
				if(bbmarkers[k] != null){
					bbcode+= "[gmarker]"+bbmarkers[k].gmarker.getPoint().lat()+","+bbmarkers[k].gmarker.getPoint().lng()+" "+bbmarkers[k].name+"[/gmarker]";
				}
			}
			bbmarkers = new Array();
			
			bbcode += "[/gmap]";
			
			var txtarea = window.opener.document.post.message;
			if(txtarea != null){
				txtarea.value += bbcode;
				txtarea.focus();
			}
		}
		catch(err){
			if(map_debug == 1) alert('Failed to add bbcode for inline map. Error: '+err);
		}
	}	
}

/**
 * BEGIN WIND DATA FUNCTIONS
 */ 
function MarkerClicked(marker, gmap) {

	date = new Date();

	var html = '<div style="margin-right: 10px; background-color: #CEE9FF; text-align: center">' + marker.weatherstation.shortName + '</div>';


	if (marker.weatherstation.sensorTypeID == 17) {
		html += '<div style="text-align: center; margin-top: 5px;">';
		html += 'Current Forecast<br>';
		html += '<img width="150" height="100" src="http://mapper.weatherflow.com/cgi-bin/tinyGv2Wap.gif?width=150&height=100&t=' + marker.weatherstation.id + '&c=0&cb=222&wid=1&rid=' + date.getSeconds() + '"><br>';
		html += '<a href="http://www.iwindsurf.com/windandwhere.iws?regionID=226&siteID=' + marker.weatherstation.id + '">';
		html += 'Forecast only site</a></div>';
	} else if (marker.weatherstation.statusID == 4 || marker.weatherstation.sensorReadings.length == 0) {
		html += '<div>Data from this site is currently unavailable</div>';
	} else if (marker.weatherstation.statusID == 6) {
		html += '<div>This site is currently asleep</div>';
	} else if (marker.weatherstation.statusID == 3) {
		html += '<div style="text-align: center">Comming Soon!</div>';
	} else if (marker.weatherstation.statusID == 7) {
		html += '<div style="text-align: center">New Weatherstation Wanted!</div>';
	} else {
		if (marker.weatherstation.siteIsFree || wf_switch_toggle) {
			html += '<table class="tdCopySmall" style="width: 200px;">';

			// Wind speed
			html += '<tr>';
			html += '<td>Wind:</td>';
			html += '<td style="text-align: center;">' + marker.weatherstation.sensorReadings[0].direction + ' ';
			html += Math.round(marker.weatherstation.sensorReadings[0].average);
			if (marker.weatherstation.sensorReadings[0].lull || marker.weatherstation.sensorReadings[0].gust) {
				html += '(' + Math.round(marker.weatherstation.sensorReadings[0].lull) + '-';
				html += Math.round(marker.weatherstation.sensorReadings[0].gust) + ')';
			}
			html += '</td>';
			html += '</tr>';

			// Temperature
			html += '<tr>';
			html += '<td>Temperature:</td>';
			html += '<td style="text-align: center;">' + marker.weatherstation.sensorReadings[0].temperature + 'F';
			html += '</td>';
			html += '</tr>';

			// Time
			html += '<tr>';
			html += '<td>Time:</td>';
			html += '<td style="text-align: center;">' + marker.weatherstation.sensorReadings[0].time_str;
			html += '</td>';
			html += '</tr>';

			// Graph
			html += '<tr><td colspan="2">';
			html += '<div style="text-align: center;">';
			html += '<a href="http://www.iwindsurf.com/windandwhere.iws?siteID=' + marker.weatherstation.id + '">';
			html += '<img width="150" height="100" src="http://mapper.weatherflow.com/cgi-bin/tinyGv2Wap.gif?width=150&height=100&t=' + marker.weatherstation.id + '&c=0&cb=222&wid=1&rid=' + date.getSeconds() + '">';
			html += '<br>View Large Graph';
			html += '</a>';
			html += '</div>';
			html += '</td></tr>';
			html += '</table>';

		} else {
			html += '<div style="text-align: center; margin-bottom: 12px;">';
			html += 'This site is exclusive to<br><b>iWindsurf.com</b> FX members.<br><br>';
			html += '<a href="http://www.iwindsurf.com/services.iws?signup=Free">Get FREE Membership</a><br>'
			html += 'or<br>';
			html += '<a href="http://www.iwindsurf.com/windandwhere.iws?showLogin=true&Isection=Gmap+Obs">Log In</a>';
			html += '</div>';
		}
		
	}


	gmap.openInfoWindowHtml(marker.latlng, html);
} 

function grabSID(){
	try{
		var tmp = /^(?:.*)(?:sid=)([0-9a-z]+)(?:(&|#)*)(?:.*)$/.exec(document.location);
		if(tmp[1] != null){
			return 'sid='+tmp[1];
		}
		else{
			return '';
		}
	}
	catch(err){
		if(map_debug == 1) alert("Error parsing SID from document.location. Error: "+err);
		return '';
	}
}