var mapviewer,geocoder;
var imarker = 0;
var points = [];
var printnow = false;
var polyline;
var maptype = MM_WORLD_MAP;
var pan_zoom_widget,small_pan_zoom_widget,small_zoom_widget;
var geocode_status, message, results_panel;
var results = new Array();
var markers = new Array();
var resmarkers = new Array();

var max_results = 10;
var route;
var mapbtn ;

var qs, street, city, state, postal_code, country_code_quick, country_code_full, searchbtn, quicksearchbtn;
 

function moveToResult(count) {
    mapviewer.goToPosition(results[count]);
    removeMarkers();
  
}
  
function undoMarker(){
	if(markers.length >= 1){
		mapviewer.removeOverlay(markers[markers.length-1]);
		markers.splice(markers.length-1,1);
		addPolyline(undefined, undefined, undefined, false, undefined);
	}
}


function removeMarkersExcept(marker){
	if(markers != null)
	for(i=0;i<markers.length;i++)
		if(markers[i] != marker){
			markers.splice(i,1);
			mapviewer.removeOverlay(markers[i]);
		}
			
}

function circularRoute(){
	if(markers.length > 0)
		if(markers[markers.length-1].getPosition().coords.lat !=  markers[0].getPosition().coords.lat && 
		   markers[markers.length-1].getPosition().coords.lon !=  markers[0].getPosition().coords.lon){
			addMarker(markers[0].getPosition());
			mapbtn.value = "Start mapping";
		}
}

function removeMarkers(){
	for(i=0;i<markers.length;i++){
		mapviewer.removeOverlay(markers[i]);
	}	
	markers=[];	
	              
    if (polyline)
    	polyline.remove();
}

function processResults() {
    // callback function registered with the geocoder to handle geocoding results
    // inform the user a geocode has finished
    updateGeocodeStatus('endGeocode');
    // if an error occurred, inform the user
    if (geocoder.error_code && geocoder.error_code != 'MM_GEOCODE_MULTIPLE_MATCHES') {
        message.innerHTML = 'We are sorry - the following error occurred: <' + '/br><' + 'em>' + geocoder.error_code + '<' + '/em>';
        return false;
    }
    results = geocoder.result_set;
    var ol = document.createElement('ol');
     
    //loop through the result set
    for (var count=0; count < results.length; count++) {
        var address = results[count].address;
        var li = document.createElement('li');
        //add a link for each result
        var anchor = document.createElement('a');

        anchor.href = '#';
        anchor.result_count = count;
        anchor.onclick = function () { moveToResult(this.result_count); return false; };
        
        anchor.appendChild(document.createTextNode(address.display_name));
        
        
        li.appendChild(anchor);
        ol.appendChild(li);
   		var icon = new MMIcon( '/Images/sinpix.gif' );

		var marker = mapviewer.createMarker(results[count], { 'label' : '', 'draggable':false,'icon':icon });
       	marker.setInfoBoxContent('<p>' + address.display_name + '<' + '/p>');
     	resmarkers.push(marker);
    }

    results_panel.appendChild(ol);
    results_panel.style.display = 'block';

    //if there were multiple matches, display all the results
    if (geocoder.error_code == 'MM_GEOCODE_MULTIPLE_MATCHES') {
    	var location = mapviewer.getAutoScaleLocation( resmarkers );
    	mapviewer.goToPosition( location ); 
    	
    //otherwise show the only match at the optimal zoom factor
    } else {
    	mapviewer.goToPosition( results[0] );
    }
}

function onLoad() {
    mapviewer = new MultimapViewer( document.getElementById( 'mapviewer' ) );
    mapviewer.goToPosition( new MMLocation( new MMLatLon(54.30288,-2.59141), 6 ) );
    qs = document.getElementById( 'qs' ); 

    country_code_quick = document.getElementById( 'country_code_quick' );
    searchbtn = document.getElementById( 'searchbtn' );
    quicksearchbtn = document.getElementById( 'quicksearchbtn' ); 
    
    geocode_status = document.getElementById( 'geocodestatus' );
    message = document.getElementById('message');
    results_panel = document.getElementById('resultspanel');
    
    geocoder = new MMGeocoder(processResults);
	addPanZoomWidget();
	mapviewer.addEventHandler( 'endPan', onEndPan );
	mapviewer.addEventHandler( 'click', onClickMap );
	mapviewer.addEventHandler( 'contextMenu', onContextMenu );
	mapviewer.addEventHandler( 'overlayEndDrag',onOverlayEndDrag )
	MMDataResolver.setDataPreferences( MM_WORLD_MAP, [ 904 ].concat ( MMDataResolver.getDefaultDataPreferences( MM_WORLD_MAP ) ) );
 	mapbtn = document.getElementById("allowmapping");

    loadMap();
}

function onClickMap(evt,obj,pos){
	if(mapbtn.value == "Stop mapping" && obj == mapviewer){
		addMarker(pos);
	}
}
function onEndPan(){
	if(printnow){
		window.print();	
		printnow = false;
	}
}

function toggle(btn){
	if(btn.value == "Start mapping") {
		 btn.value= "Stop mapping" ;
	} else {
		btn.value= "Start mapping" ;
	}
}

function onOverlayEndDrag(pos){
	 addPolyline(  undefined, undefined, undefined, false, undefined );
}


function displayDataPrefs() {
    var pointprefs = MMDataResolver.getCoverage( mapviewer.getCurrentPosition(), mapviewer.getZoomFactor(), maptype);
    var prefs = MMDataResolver.getDataPreferences( maptype);
    var orderedprefs = [];
  
    if (!pointprefs) {
        alert('There is no info on data pref available  at this point');
        return false; 
    }        
    // Sort available data prefs by priority
    for( var i = 0; i < prefs.length; ++i ) {
        for( var j = 0; j < pointprefs.length; ++j ) {
            if (prefs[i] == pointprefs[j] ) {orderedprefs.push(pointprefs[j]) }
        }
    }
    var str = '';   
    // Get copyright statements to display 
    for( var i = 0; i < orderedprefs.length; ++i ) {
        var copyright = MMDataResolver.getCopyright(orderedprefs[i], maptype);
        copyright = copyright.replace (/&copy;/g, 'Copyright - ') 
        str += copyright + '\n';
    }
   alert(str); 
}   

function reverseDataPrefs() {
    var prefs = MMDataResolver.getDataPreferences( maptype);
    var newprefs = [];
    // Reverse order
    for( var i = prefs.length - 1 ; i >= 0; --i ) {
        newprefs.push(prefs[i]);
    }
    // Re-draw map
    MMDataResolver.setDataPreferences( maptype, newprefs ); 
    mapviewer.redrawMap();
}     
function callGeocoder( fields ) {
 var address = new MMAddress();
    address.street = '';
    address.city = '';
    address.state = '';
    address.postal_code = '';
    address.country_code = fields.country_code;
    address.qs = fields.qs;
    // clear any existing items from previous geocoding requests
    cleanUp();
    // inform the user a geocode is occurring
    updateGeocodeStatus('startGeocode');
    // perform the geocode
    geocoder.count = max_results;
    geocoder.geocode(address); 
    
}

function updateGeocodeStatus( type ) {
    if( type == 'startGeocode' ) {
        // if the geocode is starting, disable the form inputs and inform the user
        geocode_status.style.display = 'block';
        disableFields(true);
    } else {
        // if the geocode is ending, enable the form inputs and inform the user
        geocode_status.style.display = 'none';
        disableFields(false);
    }
}
function  addPoly (points, color, opacity, thickness,  closed, fill) {
   if (polyline) polyline.remove();
    polyline = new MMPolyLineOverlay( points, color, opacity, thickness,  closed, fill );
    mapviewer.addOverlay(polyline);
}
function  addPolyline (color, opacity, thickness,  closed, fill) {
   points = [];

   for(i=0;i<markers.length;i++)
   		points.push( markers[i].getPosition().coords );

    if (polyline) 
    	polyline.remove();
    
    if(markers.length >= 2){
    	polyline = new MMPolyLineOverlay( points, color, opacity, thickness,  closed, fill );
    	mapviewer.addOverlay(polyline);
    }
}

function addPanZoomWidget (outside) {
    //Add the Pan Zoom Widget
    if ( !outside ) {
        mapviewer.removeWidget ( pan_zoom_widget );
        mapviewer.removeWidget ( small_pan_zoom_widget );
        mapviewer.removeWidget ( small_zoom_widget );
        pan_zoom_widget = new MMPanZoomWidget ();
    } else {
        removeAllWidgets ();     
        pan_zoom_widget = new MMPanZoomWidget( new MMBox () ); 
        pan_zoom_widget.setContainer(container);
    }
    mapviewer.addWidget ( pan_zoom_widget );
}
function onContextMenu( type, target, menu, pos, step )
{
  items = [ { label : 'Delete marker', onclick : function()   { removeMarker(pos) }, className : 'MMremovemarker' } ];

  menu.addItemsJSON( items );
}


function addMarker(pos) {
   imarker++;
   var icon = new MMIcon( '/Images/sinpix.gif' );
   
   var marker;
   
   
   if(markers.length == 0)
   	marker = mapviewer.createMarker(pos, { 'text':'S','label': pos.toString(), 'draggable' : true  });
   else
   	marker = mapviewer.createMarker(pos, { 'label': pos.toString(), 'draggable' : true,'icon':icon  });
   
   	
   markers.push(marker);
   addPolyline(undefined, undefined, undefined, false, undefined );
   

   marker.setInfoBoxContent('<h1>' + pos.toString() + '</h1>');
}

function removeMarker(pos) {
	var del = false;
	var res = 0.002;
	for(i=0;i<markers.length;i++){
			if(Math.abs(markers[i].getPosition().coords.lat-pos.lat)< res && Math.abs(markers[i].getPosition().coords.lon- pos.lon)< res ){
				mapviewer.removeOverlay( markers[i] );
				markers.splice(i,1);
				del = true;
				break;
			}
	}
	if(del)
		addPolyline(  undefined, undefined, undefined, false, undefined );
}


function cleanUp() {
    // Clean up the HTML containers
    message.innerHTML = '';
    while (results_panel.firstChild) {
        results_panel.removeChild(results_panel.firstChild);
    }
    //remove any markers
    mapviewer.removeAllOverlays();
    markers = new Array();
}
     
function disableFields( bool ) {
    // disable the user input fields
    qs.disabled = bool; 
    country_code_quick.disabled = bool;
    quicksearchbtn.disabled = bool;  
}


function setMap(){
	var map = document.getElementById('mapimg');
	var polyhk = document.getElementById('polyhk');

	map.value="";
	polyhk.value="";
	
	
	var zoom = mapviewer.getZoomFactor();
	
	if(markers.length > 0){
		for(i=0;i<markers.length;i++){
			if(i > 0)
				map.value += ",";
			
			polyhk.value += mapviewer.geoPosToContainerPixels( markers[i].getPosition().coords);
			map.value += "("+markers[i].getPosition().coords.lat+","+markers[i].getPosition().coords.lon+")";
		}
	}
	map.value += ","+mapviewer.getMapBounds().getCenter()+",("+zoom+")";
}

MMAttachEvent( window, 'load', onLoad );


