var map;
var localSearch = new GlocalSearch();
var errorMap;

var RadMax = 600; 				
var lat1 = "51.504682"; 
var lon1 = "-0.076303"; 

var icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/marker.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);


function check(el,msg,stat){	
	if (el) {
		if (!stat){
			el.disabled=true;			
			alert(msg);				
		}else{
			el.disabled=false;				
		}		
	}else{		
		if (msg){			
			alert(msg);
		}
	}	
}

function checking_post(){
    if($('postcodeChecker')){
        $('postcodeChecker').remove()
    }
	var b = new Element('div');
	b.setProperty('id','postcodeChecker');
         b.injectAfter('postcode');
                                b.setHTML('checking ' + $('postcode').value);
                                ('postcode').disabled = true;

}

function checking_post2(){
$$('#postcodeChecker').each(function(el){
  el.remove();
});
                                ('postcode').disabled = false;

}

function usePointFromPostcode(postcode, callbackFunction) {
	if($('postcode').value){
		//var ajax = new Ajax(wgScriptPath + '/?title=MediaWiki:Geocodes&action=raw',{method: 'post'}).request();
		
	//	ajax.addEvent('onComplete',function(el){
			//var exist = '';
			//alert(el);
			
	//		var regexp = new RegExp('\\['+ pc + ',(.*?)\\]');
	//		var matches = regexp.exec(el);
	//		$('postcode').value = pc;
			//alert(matches[1]);
	//		if(matches[1]!=null){
	//		$('geocode').value =matches[1];
	//		}else{
				checking_post();
				localSearch.setSearchCompleteCallback(null, function() {
						if (localSearch.results[0]){										
							var resultLat = localSearch.results[0].lat;
							var resultLng = localSearch.results[0].lng;
							var point = new GLatLng(resultLat,resultLng);
							
							if (DegNo(point,lat1,lon1) <= RadMax){			
								//alert(resultLat);
								$('geocode').value = resultLat + ',' +resultLng;
								checking_post2();
							}else{	
								if($('postcode').value!=""){
									//alert("This Address Not in London Business Area");		
								}
								checking_post2();
								$('postcode').value ="";
								$('postcode').focus();
								$('geocode').value ="";
			
							}				
						}else{	
							if($('postcode').value!=""){
				       		    checking_post2();
								//alert('Post code not found');
								$('postcode').value ="";
								$('postcode').focus();
								$('geocode').value ="";
							}
						
						}
					});	
				localSearch.execute(postcode + ", UK");
	//		}
	//	});
	}
	
}

function usePointFromPostcodesubmit(postcode, callbackFunction, frm) {
	if($('postcode').value){
			localSearch.setSearchCompleteCallback(null, function() {
					if (localSearch.results[0]){										
						var resultLat = localSearch.results[0].lat;
						var resultLng = localSearch.results[0].lng;
						var point = new GLatLng(resultLat,resultLng);
						
						if (DegNo(point,lat1,lon1) <= RadMax){
						    $('geocode').value = resultLat + ',' +resultLng;		
						    frm.submit();
						}else{
						    //alert("This Address Not in London Business Area");
						    checking_post2();
						    $('postcode').value ="";
								$('postcode').focus();
								$('geocode').value ="";
						}
					}else{
					    //alert('Post code not found');
					    checking_post2();
					    $('postcode').value ="";
						$('postcode').focus();
						$('geocode').value ="";
					}
				});	
			localSearch.execute(postcode + ", UK");
	}
}

function usePointFromPostcode2(postcode, frm) {
			localSearch.setSearchCompleteCallback(null, function() {
					if (localSearch.results[0]){										
						var resultLat = localSearch.results[0].lat;
						var resultLng = localSearch.results[0].lng;
						var point = new GLatLng(resultLat,resultLng);
						
						if (DegNo(point,lat1,lon1) <= RadMax){
						    if(resultLat){	
								//frm.submit();
								$('businessfound').style.display = 'block';
								$('businessfound').innerHTML = 'Loading....'; 
								new Ajax(wgScriptPath + '/', {
				                    method: 'post',
				                    onComplete: function(res){
										
										$('make-btn-img').style.display = 'none';
										
										$('businessfound').innerHTML = this.response.text; 
										$('geocode').value = resultLat + ',' +resultLng;
				                    }
				                }).request( 'action=ajax&rs=showRelatedBusiness&yourpostcode_=' + postcode);
						    }else{
						        usePointFromPostcode2(postcode, frm);
						    }
						}else{
						    alert("This Address Not in London Business Area");
						}
					}else{
					    alert('Post code not found');
					}
			});	
			localSearch.execute(postcode + ", UK");
}

function cancel_create(){
	$('businessfound').style.display = 'none';
	$('businessfound').innerHTML = ''; 
	$('make-btn-img').style.display = 'block';
}             

function event_cancel_create(){
	$('eventfound').style.display = 'none';
	$('eventfound').innerHTML = ''; 
	$('makeeventbtn').style.display = 'block';
}

function checkvenue(){    
	$('eventfound').style.display = 'block';
	$('eventfound').innerHTML = 'Loading....';
	new Ajax(wgScriptPath + '/', {
        method: 'post',
        onComplete: function(res){
			
			$('makeeventbtn').style.display = 'none';
			
			$('eventfound').innerHTML = this.response.text; 
			
        }
    }).request( 'action=ajax&rs=showRelatedEvent&venue-f=' + $('venue-input').value);
}

/*****
* RADIUS CALC : code for trap radius
******/
function DegNo(point,lat1,lon1){  
  lat2 = point.lat().toString();
  lon2 = point.lng().toString();
  RadOut = (LatLon.distHaversine(lat1.parseDeg(),lon1.parseDeg(),lat2.parseDeg(),lon2.parseDeg()).toPrecision(4)).toMi();
  return RadOut;
}

LatLon.distHaversine = function(lat1, lon1, lat2, lon2) {
  var R = 6371; // earth's mean radius in km
  var dLat = (lat2-lat1).toRad();
  var dLon = (lon2-lon1).toRad();
  lat1 = lat1.toRad(), lat2 = lat2.toRad();

  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
          Math.cos(lat1) * Math.cos(lat2) * 
          Math.sin(dLon/2) * Math.sin(dLon/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return d;
}

LatLon.prototype.toString = function() {
  return this.lat.toLat() + ', ' + this.lon.toLon();
}

String.prototype.parseDeg = function() {
  if (!isNaN(this)) return Number(this);                 // signed decimal degrees without NSEW

  var degLL = this.replace(/^-/,'').replace(/[NSEW]/i,'');  // strip off any sign or compass dir'n
  var dms = degLL.split(/[^0-9.]+/);                     // split out separate d/m/s
  for (var i in dms) if (dms[i]=='') dms.splice(i,1);    // remove empty elements (see note below)
  switch (dms.length) {                                  // convert to decimal degrees...
    case 3:                                              // interpret 3-part result as d/m/s
      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
    case 2:                                              // interpret 2-part result as d/m
      var deg = dms[0]/1 + dms[1]/60; break;
    case 1:                                              // decimal or non-separated dddmmss
      if (/[NS]/i.test(this)) degLL = '0' + degLL;       // - normalise N/S to 3-digit degrees
      var deg = dms[0].slice(0,3)/1 + dms[0].slice(3,5)/60 + dms[0].slice(5)/3600; break;
    default: return NaN;
  }
  if (/^-/.test(this) || /[WS]/i.test(this)) deg = -deg; // take '-', west and south as -ve
  return deg;
}

function LatLon(lat, lon) {
  this.lat = lat;
  this.lon = lon;
}

LatLon.prototype.toString = function() {
  return this.lat.toLat() + ', ' + this.lon.toLon();
}

Number.prototype.toRad = function() {  // convert degrees to radians
  return this * Math.PI / 180;
}

Number.prototype.toMi = function() {  // convert Kilo To Mile
  return this / 1.609344;
}

Number.prototype.toPrecision = function(fig) {  // override toPrecision method with one which displays 
  if (this == 0) return 0;                      // trailing zeros in place of exponential notation
  var scale = Math.ceil(Math.log(this)*Math.LOG10E);
  var mult = Math.pow(10, fig-scale);
  return Math.round(this*mult)/mult;
}
/*------END OF RADIUS---------*/


function placeMarkerAtPoint(point)
{
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);
}

function setCenterToPoint(point)
{
	map.setCenter(point, 10);
}

function showPointLatLng(point)
{
	alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
}

function mapLoad() {

	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("thismap"));
		
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(54.622978,-2.592773), 5, G_HYBRID_MAP);
	}
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function addUnLoadEvent(func) {
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
	  window.onunload = func;
	} else {
	  window.onunload = function() {
	    oldonunload();
	    func();
	  }
	}
}

addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);

