// Create all the new variables
var userX = 0;
var userY = 0;
var userZ = 0;

var showMarker;
var checkmyMapcount = 0;

var showHelp = '';

var markerTitle = '';
var markerDescription ='';
var markerImage='';
var markerX='';
var markerY='';

var table = '';
var field = '';
var value = '';

var searchAddress = null;

var vectorLayer;

//this is used to ensure the object is ready
var mapexists = this.myMap;

// Function to read the Query String
function getQueryVariable(variable){  
	var query = window.location.search.substring(1);  
	var vars = query.split("&");  
	for (var i=0;i<vars.length;i++){    
		var pair = vars[i].split("=");    
		if (pair[0] == variable){      
			return pair[1];    
		}  
	} 	  
}

// Populate our variables
userX = getQueryVariable("easting");
userY = getQueryVariable("northing");
userZ = getQueryVariable("zoom");
showMarker = getQueryVariable("marker");
markerTitle = unescape(getQueryVariable("markertitle"));
markerDescription = unescape(getQueryVariable("markerdesc"));
markerImage = getQueryVariable("marker");
markerX = getQueryVariable("markerx");
markerY = getQueryVariable("markery");
showHelp = getQueryVariable("help");
searchAddress = getQueryVariable("address");

table = getQueryVariable("table");
field = getQueryVariable("field");
value = getQueryVariable("value");

var markerLocation =
    {
        crs: "EPSG:27700",
        id: "Location1",
        name: markerDescription,
        score: 0,
        x: markerX,
        y: markerY
    };

// Set DOJO function to wait until the page has loaded
dojo.addOnLoad(function(){

	if(userX > 0){
		if(userY > 0){
			checkmyMap();
	}} 

	if(showHelp == 'yes'){
		displayHelp();
	}
	else
	{
		closeHelp();
	}

	if(table !=undefined && field !=undefined && value !=undefined) {
		doSearch(table, field, value);
	}

	// add the Open Layers mouse position control
	myMap.getOLMap().addControl(new OpenLayers.Control.MousePosition());
})

function displayHelp(){
	var helpPanel = dojo.byId('help');
	dojo.style(helpPanel, {visibility: 'visible'});

}

function closeHelp(){
	var helpPanel = dojo.byId('help');
	dojo.style(helpPanel, {visibility: 'hidden'});
}

// checking the map object	
function checkmyMap(){
	if(mapexists != null){
		mapexists = "YES";
		movemyMap();
		
	}else{
		checkmyMapdelay();
		mapexists = this.myMap;
		checkmyMapcount = checkmyMapcount +1;
	}			
}

// add a delay and recheck the map object is ready (allow 5 attempts)
function checkmyMapdelay(){
	if (checkmyMapcount < 5){
		setTimeout("checkmyMap()",1000);
	}
}

// move the map if the mapexists is set to YES
function movemyMap(){
	if(mapexists == "YES"){
        if (userX || userY || searchterm){
		//do nothing
	} else {
		if(userZ > 0){
 		var OLXY = myMap.getOLMap().getExtent().getCenterLonLat();
 		userX = parseInt(OLXY.lon);
 		userY = parseInt(OLXY.lat);

	}}


		// Check X & Y			
		if(userX > 0){
			if(userY > 0){
				var configuration = this.myMap.getConfiguration();
				var maxZoomLevels = configuration.zoomLevels.getLevelCount();
				var mapSrs = myMap.configuration.getProjectionSystem();
				// Check Z
				if(userZ > 0 && userZ <=maxZoomLevels){     	        		
     	       				this.myMap.moveToAndZoom({x: userX, y: userY, srs: mapSrs},userZ);
	
        			}

				if(markerImage !== undefined){
				    //addMarkers();
				    createLocatorMarker(markerLocation);
		
				}
        		}
		
		} else {
			this.myMap.moveTo({x: userX, y: userY});

			if(markerImage !== undefined){
			    //addMarkers();
			    createLocatorMarker(markerLocation);

			}
		}

			
	}
}

function displayResults()
{

	var resultString = "";
	var i = 0;
	var resultX=new Array(); 
	var resultY=new Array();
	var X = 0;
	var Y = 0; 
	var DifX = 0;
	var DifY = 0; 

	//alert(results);

        for(var item in results)
        {
                var address = results[item];

		if (i == 0) {MarkerText = address.name};

		resultX[i] = address.x;
		resultY[i] = address.y;
		DifX = X - resultX[i];
		DifX = DifX * DifX;
		DifY = Y - resultY[i];
		DifY = DifY * DifY;
		X = X + resultX[i];
		Y = Y + resultY[i];
		i = i + 1;
	}

	if (DifX > 2500 ||  DifY > 2500) {
		X = parseInt(resultX[0]);
		Y = parseInt(resultY[0]);
	} else {
		X = parseInt(X/i);
		Y = parseInt(Y/i);
		MarkerText = searchterm.toUpperCase();
	}

	userX = X;
	userY = Y;

	if (userZ ==null){
		userZ = "11";
	}

	checkmyMap();

}

// add a marker to the map if specified
function addMarkers(){

	//alert("Add Markers");

    var markerArray = [];
    var mapsrs =  myMap.configuration.getProjectionSystem();
    var mPoint = new stratus.geometry.Point({ x: markerX, y: markerY, srs: mapsrs });
    
    var hub = stratus.RiaHub.getInstance();
        
        // create icon
    var mapTransparentImage = hub.getResourceUrl("/widgets/stratus/img/transparentPixel.png");
    
    var size = new OpenLayers.Size(45, 47);
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
    var icon = new OpenLayers.Icon("/ria/images/" + markerImage + ".png", size, offset); 
    /* var icon = new OpenLayers.Icon(mapTransparentImage, size, offset);*/ 
    /*
    dojo.addClass(icon.imageDiv, "mapMarker");
    icon.imageDiv.id = "MapMarker";
    */
    var properties = {
        point: mPoint,
        icon: icon,
        title: markerTitle,
        description: markerDescription
    };

    var marker = new stratus.Marker(properties); 
    markerArray.push(marker);

    var markerManager = this.myMap.getMarkerManager();
        /*markerManager.addLocatorMarker(marker);*/
    markerManager.addMarkers(markerArray);
}

function createLocatorMarker(location) {

    var hub = stratus.RiaHub.getInstance();

    // create icon
    var mapTransparentImage = hub.getResourceUrl("/widgets/stratus/img/transparentPixel.png");
    //var size = new OpenLayers.Size(35, 41);
    var size = new OpenLayers.Size(76, 47);
    var offset = new OpenLayers.Pixel(-(size.w/3), - size.h);
    var icon = new OpenLayers.Icon(mapTransparentImage, size, offset);
    //var icon = new OpenLayers.Icon("/ria/images/" + markerImage + ".png", size, offset);
    //dojo.addClass(icon.imageDiv, "mapMarker");
    dojo.addClass(icon.imageDiv, "mapMarker" + markerImage);
    icon.imageDiv.id = "MapMarker";
    // get point
    var point = new stratus.geometry.Point({ x: location.x, y: location.y, srs: location.crs });

    // subTitle to show on callout
    var subTitle = (mapLocatorPopup.showLayerPicker) ? resources["locatorMarker-title"] : this.resources["locatorMarker-moreInformation"];

    //create a new marker
    var marker = new stratus.Marker({ icon: icon, point: point, title: location.name,
        description: subTitle,
        deleteLinkSwitch: true, deleteLinkMessage: resources["locatorMarker-delete"]
    });
    
    markerManager.addLocatorMarker(marker, mapLocatorPopup);
}

function doSearch(table,field,value)	
{
	table = unescape(table);
	field = unescape(field);
	value = unescape(value);
			
	var filter =
	{
		"tableName": ["" + table + ""],
		"targetSrs": "EPSG:27700",
		"includeGeometry": true,
		"searchExpression" : "" + field + "='" + value + "'",
		"callback": showObjectSearchResults,
	        "exceptionCallback": handleException
        };

	//Note that the search function will call showResults when complete
	featureSearch = new stratus.search.FeatureSearch();
        featureSearch.searchByExpression(filter);
}

function showObjectSearchResults(results)
{
               
	for(layer in results) {
	        if(results[layer].length==0) {
	                alert("Sorry, that value cannot be found. Please try again.");
			return;
                }

		for(var i = 0; i < results[layer].length; i++) {
                       	geometry=results[layer][i].geometry;
			var feature_bounds= geometry.getBounds(); 
			drawPolygon();
                }
		myMap.getOLMap().zoomToExtent(feature_bounds,true);

        }
               
}

function handleException(ex) {
	console.dir(ex);
        //dojo.byId("errordiv").innerHTML = ex.declaredClass + ": " + ex.message;
	alert(ex);
}


//Clear Polygon if its show in the map
            function clearPolygon()
            {
                if(vectorLayer == null) 
                {
                    return;
                }
                vectorLayer.removeFeatures(vectorLayer.features);
            }

function drawPolygon() 
            {
                // Clear existing Polygon if it exists.
                clearPolygon();

                if(geometry == null) 
                {
                    alert("No geometry!");
                    return;
                }

                var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);

		layer_style.fillOpacity = 0.5;
                layer_style.graphicOpacity = 1;

                //Red style
                var style_red = OpenLayers.Util.extend({}, layer_style);
                style_red.strokeColor = "red";
                style_red.fillColor = "red";
                style_red.graphicName = "star";
                style_red.pointRadius = 10;
                style_red.strokeWidth = 4;
                style_red.rotation = 45;
                style_red.strokeLinecap = "butt";
		vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: style_red});
                myMap.getOLMap().addLayer(vectorLayer);

                var polygonFeature = new OpenLayers.Feature.Vector(geometry);
		var feature_bounds= geometry.getBounds(); 
		
                vectorLayer.addFeatures([polygonFeature]);
		myMap.getOLMap().zoomToExtent(feature_bounds,true);
}
		
