/*************************************************************** 	
These are custom variables that can be set in the Mapbook.  
In order for them to be seen on the javascript side, they also 
need to be defined in the CONFIGURATION object as well.
Most likely they are used in a UX, but need to be defined
before init() runs.
****************************************************************/

// Used in the Highlight user extension
CONFIGURATION.vectorSelectStrokeColor = "purple";
CONFIGURATION.vectorHighlightStrokeColor = "aqua";
CONFIGURATION.vectorSelectedFeatureStrokeColor = "red";


//Used in the CustomUi user extension
CONFIGURATION.basemapButtons = {'show':'false',
	'baseLayers':' ',
	'buttons': []
};

/*************************************************************** 	
You can also extent the GeoMOOSE object with custom properties
and methods.  Most often this is used to extent the Input types 
for services.
****************************************************************/

//Cool little bit to change the name on the service tab to match the Service Name
GeoMOOSE.setTabTitle = function(title) {
	document.getElementById('tab-Services').innerHTML = title;
};

//Input for printing vector layers
//TODO Notice the hard coded layer name?
GeoMOOSE.Services.InputType.Vector = OpenLayers.Class(GeoMOOSE.Services.InputType, {
	MAPBOOK_NAME: "vector",

	getValue: function() {
		var sketch_layer = Map.getLayersByName('parcelHighlight')[0];
		var wkt = new OpenLayers.Format.WKT();

		var feature_info = [];
		for(var i = 0; i < sketch_layer.features.length; i++) {
			var feature = sketch_layer.features[i];

			var feature_obj = {};
			feature_obj['wkt'] = wkt.write(feature);
			for(var k in feature.attributes) {
				feature_obj[k] = feature.attributes[k];
			}

			feature_info.push(feature_obj);
		}

		var json = new OpenLayers.Format.JSON();
		return json.write(feature_info);
	}

});

//Allows you to put text between input fields on a service.  Nice for even adding some line breaks
GeoMOOSE.Services.InputType.Text = OpenLayers.Class(GeoMOOSE.Services.InputType, {
	MAPBOOK_NAME: "text",

	initialize: function(input, options) {
		GeoMOOSE.Services.InputType.prototype.initialize.apply(this, arguments);
		this.options.renderable = true;
	},

	renderHTML: function(parent_id) {
		var p = document.getElementById(parent_id);
		var inputParent = document.createElement('span');
		inputParent.className = 'service-input-parent';
		p.appendChild(inputParent);

		var text = document.createElement('span');
		text.className = 'service-input-text';
		inputParent.appendChild(text);
		text.innerHTML = OpenLayers.Util.getXmlNodeValue(this.input);
	}
	
});

//Needed to use PIXEL tolerance with Identify (and other services)
GeoMOOSE.Services.InputType.Mapsize = OpenLayers.Class(GeoMOOSE.Services.InputType, {
	MAPBOOK_NAME: "mapsize",

	getValue: function() {
		return Map.getSize().w + ','+Map.getSize().h;
	}
});


/*************************************************************** 	
User Extensions to extend GeoMOOSE
****************************************************************/

//LK User Extension for customizing the User Interface
CustomUi = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
	initialize: function() {
	},
	afterMapbookLoad: function() {
//LK Adds a spinner GIF when AJAX request is processing.  Also need to add CSS, spinner.gif and calls to toggleSpinner in compiled.js		
		var spinner = document.createElement('div');
		spinner.id = "spinner"
		spinner.className = "Hidden"
		var img = document.createElement('img');
		img.src = "images/spinner.gif";
		document.getElementById('middle').appendChild(spinner);
		document.getElementById('spinner').appendChild(img);

//LK Adds baselayer buttons to the upper right corner of map
		if(parseBoolean(CONFIGURATION.basemapButtons.show,true)) {
			var baseMapButtons = document.createElement('div');
			baseMapButtons.id = "set-layers";
			for ( var i=0 ; i<CONFIGURATION.basemapButtons.buttons.length ; i++ ) {
				var button = document.createElement('button');
				button.innerHTML = CONFIGURATION.basemapButtons.buttons[i].title;
				button.layer = CONFIGURATION.basemapButtons.buttons[i].layers;
				button.title = CONFIGURATION.basemapButtons.buttons[i].tooltip;
				button.onclick = this.setBaseLayers;
				baseMapButtons.appendChild(button);
			}		
			document.getElementById('header').parentNode.appendChild(baseMapButtons); //kind of cheating here, but know the header DIV will be there
		}
	},
	setBaseLayers: function() {
		var baseLayers = CONFIGURATION.basemapButtons.baseLayers;
		GeoMOOSE.turnLayerOff(baseLayers);
		GeoMOOSE.turnLayerOn(this.layer);
	},
    toggleSpinner: function(visibility) {
            var element = document.getElementById('spinner');
            if(element && visibility=="hide") {
                 element.className = element.className.replace('Visible','Hidden');
                 }
            else if(element && visibility=="show") {
                element.className = element.className.replace('Hidden','Visible');
                 }
    },
	 
	 toggleControlPanel: function() {
	      $('#control-panel').toggle();
		$('#map').toggleClass("expandMap");
		var str = document.getElementById('hideControlPanel').innerHTML;
		var pos = str.indexOf("Hide");
		if (pos >= 0) {
		document.getElementById('hideControlPanel').innerHTML = '&lt&lt Show Tabs';
		} else {
		document.getElementById('hideControlPanel').innerHTML = '&gt&gt Hide Tabs';
		}
	},

	closeDrawer: function(e) {
		if (!e) var e = window.event;
		var tg = (window.event) ? e.srcElement : e.target;
		if (tg.nodeName != 'DIV') return;
		var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
		while (reltg != tg && reltg.nodeName != 'BODY')
			reltg= reltg.parentNode
		if (reltg== tg) return;
		// Mouseout took place when mouse actually left layer
		// Handle event
		cleanupOpenDrawer();
	},
	CLASS_NAME: "CustomUi"
});
GeoMOOSE.UX.register("CustomUi");

var customUi = new CustomUi();


// LK User Extension to allow zoomToExtent after re-projecting
TransformAndZoomExtension = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
	srcPrj: new OpenLayers.Projection('EPSG:26915'),
	load: function() {
	},
	zoom: function(minx,miny,maxx,maxy) {
		var bounds = new OpenLayers.Bounds(minx,miny,maxx,maxy).transform(this.srcPrj,Map.projection);
		Map.zoomToExtent(bounds);
	},		
	CLASS_NAME: "TransformAndZoomExtension"
});
GeoMOOSE.UX.register('TransformAndZoomExtension');

transformAndZoom = new TransformAndZoomExtension();


//LK User Extension to autoload services without specifying them as part of the URL
AutoLoadServices = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
	services: ['search_parcels'],
	afterMapbookLoad: function() {
		for(var i = 0; i < this.services.length; i++) {
			GeoMOOSE.startService(this.services[i]);
		}
	},
	CLASS_NAME: "AutoLoadServices"
});
GeoMOOSE.UX.register("AutoLoadServices");


//LK User Extension for adding selected parcels - start of the selection service
Highlight = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
	layerName: 'parcelHighlight',
	afterMapbookLoad: function() {
		this.style_highlight.strokeColor = CONFIGURATION.vectorHighlightStrokeColor;
		this.style_select.strokeColor = CONFIGURATION.vectorSelectStrokeColor;
		this.style_selectedFeature.strokeColor = CONFIGURATION.vectorSelectedFeatureStrokeColor;
	},
	style_highlight: {
	strokeColor: '', 
	strokeWidth: 3, 
	fillOpacity: 0,
	fill: true,
	graphicZIndex: 1
	},
	style_selectedFeature: {
	strokeColor: '', 
	strokeWidth: 5, 
	fillOpacity: .1,
	fillColor: '#ff0000',
	fill: true,
	graphicZIndex: 10000
	},
	style_select: {
	strokeColor: '', 
	strokeWidth: 3, 
	fill: false
	},
	draw: function (shape,fid,clear,type,results) {
		var layer = Map.getLayersByName(this.layerName)[0];
		if(clear == true) {
			removeFeature(fid);
		}
		var wkt_format = new OpenLayers.Format.WKT();
		var feature = wkt_format.read(shape);
		feature.id = fid;
		if(results) {
			feature.attributes.results = results;
		}
		feature.attributes.opacity = ".9";
		feature.attributes.strokeOpacity = ".9";
		feature.attributes.strokeWidth = "3";
		if(type == "highlight") {
			feature.style = this.style_highlight;
			feature.attributes.stroke = CONFIGURATION.vectorHighlightStrokeColor;
		}
		else if(type == "selectedFeature") {
			feature.style = this.style_selectedFeature;
			feature.attributes.stroke = CONFIGURATION.vectorSelectedFeatureStrokeColor;
		}
		else if(type == "select") {
			feature.style = this.style_select;
			feature.attributes.stroke = CONFIGURATION.vectorSelectStrokeColor;
		}
		layer.addFeatures(feature);
	},
	selectFeature: function (fid) {
		var layer = Map.getLayersByName(this.layerName)[0];
		for(feature in layer.features) {
			layer.features[feature].style = this.style_highlight;
			layer.features[feature].attributes.stroke = CONFIGURATION.vectorHighlightStrokeColor;
		}
		var feature = layer.getFeatureById('drawn');
		if(feature) {
			feature.style = this.style_select;
		}
		if(fid) {
			var feature = layer.getFeatureById(fid);
			feature.style = this.style_selectedFeature;
			feature.attributes.stroke = CONFIGURATION.vectorSelectedFeatureStrokeColor;
		}
		layer.redraw();
	},		
	getShape: function(fid) {
		var layer = Map.getLayersByName(this.layerName)[0];
		var feature = layer.getFeatureById(fid);
		var shapeWkt = feature.geometry.toString();
		return shapeWkt;
	},
	getAllShapes: function(fid) {
		var json = new OpenLayers.Format.JSON();
		var polygonsWkt = new Object;
		var shapeWkt = new Object;
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features

		for(var i = 0; i < features.length; i++) {
			if(layer.features[i].id.substring(0,5) != "drawn") { 
				polygonsWkt[i] = features[i].geometry.toString();
			}
		}
		shapeWkt = json.write(polygonsWkt);
		return shapeWkt;
	},
	getAllCentroids: function() {
		var json = new OpenLayers.Format.JSON();
		var polygonsWkt = new Object;
		var layer = Map.getLayersByName('parcelHighlight')[0];
		var features = layer.features;
		for(var i = 0; i < features.length; i++) {
		    if(layer.features[i].id.substring(0,5) != "drawn") { 
			polygonsWkt[i] = features[i].geometry.getCentroid().toString();
		    }
		}
		shapeWkt = json.write(polygonsWkt);
		return shapeWkt;
	},
	updateNumShapes: function() {
		var json = new OpenLayers.Format.JSON();
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features
		var numShapes = 0;
		for(var i = 0; i < features.length; i++) {
			if(layer.features[i].id.substring(0,5) != "drawn") { 
				numShapes = numShapes + 1;
			}
		}
		document.getElementById('numShapes').innerHTML = numShapes;
	},
	getAllBounds: function(fid) {
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features
		var bounds = new OpenLayers.Bounds();
		
		for(var i = 0; i < features.length; i++) {
			if(layer.features[i].id.substring(0,5) != "drawn") { 
				bounds.extend(features[i].geometry.getBounds());
			}
		}
		return bounds;
	},
	getBounds: function(fid) {
		var layer = Map.getLayersByName(this.layerName)[0];
		var feature = layer.getFeatureById(fid);
		var bounds = feature.geometry.getBounds();
		return bounds;
	},
	getAllId: function() {
		var json = new OpenLayers.Format.JSON();
		var parcelId = new Object;
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features

		for(var i = 0; i < features.length; i++) {
			if(layer.features[i].id.substring(0,5) != "drawn") { 
				parcelId[i] = features[i].id;
			}
		}
		parcelId = json.write(parcelId);
		return parcelId;
	},
	printLabels: function(values) {
		var formatOut = values.substring(0,1);
		var labelset = values.substring(1);
		GeoMOOSE.startService('mailing_labels',{id: this.getAllId()});
	},
	zoomToExtent: function(bounds) {
		Map.zoomToExtent(bounds);
	},
	showParcelDataTable: function() {
		//Check if Flash is install, if it is, turn on the clipboard function for table tools
		if ((navigator.appName == "Microsoft Internet Explorer" &&
		    navigator.appVersion.indexOf("Mac") == -1 &&   navigator.appVersion.indexOf("3.1") == -1) ||
		    (navigator.plugins && navigator.plugins["Shockwave Flash"])
                    || navigator.plugins["Shockwave Flash 2.0"]){

			TableToolsInit.oFeatures.bCopy = true
		}
		//Need to move fields to the Mapbook
		var fields = ['Account','MapTaxlot','Account','maps1','Taxlot','Owner3','MAILADD1','MAILADD2','MAILCITY','MAILSTATE','MAILZIP','Situs1','Situs2','Situscity','Situszip','NBRHD','PCA','STAT','Acres','SqFeet','YRBUILT','INSTYR','INSTNBR','SALE_DATE','SALE_PRICE'];
		var data = [];
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features
		for(var i = 0; i < features.length; i++) {
			if(features[i].attributes.results) {
			    var result = [];
			    for ( var f in fields ) {
				result.push(features[i].attributes.results[fields[f]]);
			    }
			    data.push(result);
			}
		}

		$("#results").show("slide",{ direction: "down"});document.getElementById("resultsContainer").innerHTML="<table cellpadding=0 cellspacing=0 border=0 class=display id=resultsTable><tbody>&nbsp;</tbody></table>";resultsTable = $("#resultsTable").dataTable( 
		{"aoColumns": [
			{ "sTitle": "Account Number","bSortable": false,"bVisible": false},
			{ "sTitle": "MapTaxlot","bSortable": true,"bVisible": true, sClass:"right"},
			{ "sTitle": "Account Number","sWidth": "70px" , sClass:"right"},
			{ "sTitle": "Image","sWidth": "60px","bSortable": false },  
			{ "sTitle": "TaxLot","sWidth": "60px", sClass:"right" },
			{ "sTitle": "Owner","bVisible": true},
			{ "sTitle": "Mailing Add","sWidth": "55px"},
			{ "sTitle": "Mailing Add2","sWidth": "55px"},
			{ "sTitle": "Mailing City","bVisible": true},
			{ "sTitle": "Mailing State","bVisible": true},
			{ "sTitle": "Mailing Zip","bVisible": true},
			{ "sTitle": "Situs Add","sWidth": "50px" },
			{ "sTitle": "Situs Add2","sWidth": "50px" },
			{ "sTitle": "Situs City","sWidth": "50px" },
			{ "sTitle": "Situs Zip","sWidth": "50px" },
			{ "sTitle": "Neighborhood","sWidth": "20px" },
			{ "sTitle": "Property Class","sWidth": "20px" },
			{ "sTitle": "Property Status","sWidth": "20px" },
			{ "sTitle": "Acres","sWidth": "20px" },
			{ "sTitle": "Square Feet","sWidth": "20px" },
			{ "sTitle": "Year Built","sWidth": "20px" },
			{ "sTitle": "Instrument Year","sWidth": "20px" },
			{ "sTitle": "Instrument Number","sWidth": "20px" },
			{ "sTitle": "Sale Date","sWidth": "20px" },
			{ "sTitle": "Sale Price","sWidth": "20px" }], 
			
		"bAutoWidth": false,
        "sScrollY": "100px",
		"sScrollX": "100%",
		"bScrollCollapse": false,
		"bJQueryUI": true,
		"bDestroy": true,
		"sDom": 'l<"resultGlobalTools">T<"closeTable">frtip',
		"aaData":data,
		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
			$('td', nRow).attr('nowrap','nowrap');
				return nRow;
			}

		});

	        $(".resultGlobalTools").html("<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to selected taxlot' alt='Zoom to selected taxlot' onclick='if(fnGetSelected(resultsTable)){highlight.zoomToExtent(highlight.getBounds(fnGetSelected(resultsTable)));Map.zoomOut();}else{alert(\"A selected record is needed for this tool\")}' /><img src='images/toolbar/select.png' class='noborder' alt='Buffer selected taxlot' title='Buffer selected taxlot' onclick='if(fnGetSelected(resultsTable)){GeoMOOSE.startService(\"buffered_select_followup\", {shape: highlight.getShape(fnGetSelected(resultsTable)),\"shape_is_object\":\"false\"})}else{alert(\"A selected record is needed for this tool\")}'/><img src='images/toolbar/clear.png' title='Remove selected taxlot from selection' alt='Remove selected taxlot from selection' onclick='if(fnGetSelected(resultsTable)){removeFeature(fnGetSelected(resultsTable));var nextRow = fnGetSelectedRow(resultsTable);nextRow =nextRow.nextSibling;resultsTable.fnDeleteRow(fnGetSelectedRow(resultsTable));$(nextRow).addClass(\"row_selected\");highlight.selectFeature(fnGetSelected(resultsTable));GeoMOOSE.startService(\"search_parcels_url_details\",{fieldname0:\"Account\",value0:fnGetSelected(resultsTable),template:\"select_taxlot_detail.html\",layer0:\"taxmap/Taxlots\"});}else{alert(\"A selected record is needed for this tool\")}' />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Global Tools&nbsp;<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to all results' alt='Zoom to all results' onclick='highlight.zoomToExtent(highlight.getAllBounds());' /><img src='images/toolbar/select.png' title='Buffer all selected parcels' alt='Buffer all selected parcels' onclick='javascript:GeoMOOSE.startService(\"buffered_select_followup\", {shape: highlight.getAllShapes(),shape_is_object:\"true\"})' /><img src='extensions/images/text-csv.png' title='Download results in CSV format' alt='Download results in CSV format' onclick='GeoMOOSE.startService(\"mailing_labels\",{qstring: highlight.getAllId()});' /><img src='images/toolbar/find.png' title='Search Taxlots' alt='Search Taxlots' onclick='GeoMOOSE.startService(\"search_parcels\");GeoMOOSE.changeLayerVisibility(\"highlight/all\", false);removeFeature();polkTemplate.removeAllFeatures();$(\"#results\").hide();resultsTable.fnClearTable();$(\"#showResultsTable\").hide();' />");$(".closeTable").html("<img src='images/toolbar/window-close.png' class='noborder' title='Close Window' alt='Close Window' onclick='$(\"#results\").hide();$(\"#showResultsTable\").show();GeoMOOSE.startService(\"select_parcel_followup\", {shape: highlight.getAllCentroids()});$(\"#showResultsTable\").hide();' />");$("#resultsTable tbody").click(function(event) {if($(event.target.parentNode).hasClass("row_selected")){$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});highlight.selectFeature();document.getElementById(Tabs.getTab(CONFIGURATION["show_results_in"])).innerHTML=""}else{$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});$(event.target.parentNode).addClass("row_selected");highlight.selectFeature(fnGetSelected(resultsTable));GeoMOOSE.startService("search_parcels_url_details",{fieldname0:"Account",value0:fnGetSelected(resultsTable),template:"select_taxlot_detail.html",layer0:"taxmap/Taxlots"});}});
 },
	showSurveyDataTable: function() {
		//Need to move fields to the Mapbook
		var fields = ['PlatName','SurveyDate','Client','Surveyor'];
		var data = [];
		var layer = Map.getLayersByName(this.layerName)[0];
		var features = layer.features
		for(var i = 0; i < features.length; i++) {
			if(features[i].attributes.results) {
			    var result = [];
			    for ( var f in fields ) {
				result.push(features[i].attributes.results[fields[f]]);
			    }
			    data.push(result);
			}
		}

		$("#results").show("slide",{ direction: "down"});document.getElementById("resultsContainer").innerHTML="<table cellpadding=0 cellspacing=0 border=0 class=display id=resultsTable><tbody>&nbsp;</tbody></table>";resultsTable = $("#resultsTable").dataTable( 
		{"aoColumns": [
			{ "sTitle": "Survey#","bSortable": true,"bVisible": true,sClass:"right"},
			{ "sTitle": "Survey Date","bSortable": true,"bVisible": true },
			{ "sTitle": "Client"},
			{ "sTitle": "Surveyor" }],
/*			{ "sTitle": "Type","bVisible": true, sClass:"nowrap" },
			{ "sTitle": "Clerk#", sClass:"nowrap" },
			{ "sTitle": "Subdivision","bVisible": true, sClass:"nowrap" }], */
		"bAutoWidth": false,
                "sScrollY": "100px",
		"sScrollX": "100%",
		"bScrollCollapse": false,
		"bJQueryUI": true,
		"iDisplayLength": 25,
		"aLengthMenu": [[25, 50, -1], [25, 50, "All"]],
		"bDestroy": true,
		"sDom": 'l<"resultGlobalTools">T<"closeTable">frtip',
		"aaData":data,
		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
			$('td', nRow).attr('nowrap','nowrap');
				return nRow;
			}

		});
		//$(".resultGlobalTools").html("<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to selected survey' alt='Zoom to selected survey' onclick='if(fnGetSelected(resultsTable)){highlight.zoomToExtent(highlight.getBounds(fnGetSelected(resultsTable)));Map.zoomOut();}else{alert(\"A selected record is needed for this tool\")}' /><img src='images/toolbar/select.png' class='noborder' alt='Buffer selected survey' title='Buffer selected survey' onclick='if(fnGetSelected(resultsTable)){GeoMOOSE.startService(\"buffer_select_survey_followup\", {shape: highlight.getShape(fnGetSelected(resultsTable)),\"shape_is_object\":\"false\"})}else{alert(\"A selected record is needed for this tool\")}'/><img src='images/toolbar/clear.png' title='Remove selected survey from selection' alt='Remove selected survey from selection' onclick='if(fnGetSelected(resultsTable)){removeFeature(fnGetSelected(resultsTable));resultsTable.fnDeleteRow(fnGetSelectedRow(resultsTable));}else{alert(\"A selected record is needed for this tool\")}' />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Global Tools&nbsp;<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to all results' alt='Zoom to all results' onclick='highlight.zoomToExtent(highlight.getAllBounds());' /><img src='images/toolbar/select.png' title='Buffer all selected surveys' alt='Buffer all selected surveys' onclick='javascript:GeoMOOSE.startService(\"buffer_select_survey_followup\", {shape: highlight.getAllShapes(),shape_is_object:\"true\"})' /><img src='images/toolbar/find.png' title='Search Taxlots' alt='Search Taxlots' onclick='GeoMOOSE.startService(\"search_parcels\");GeoMOOSE.changeLayerVisibility(\"highlight/all\", false);removeFeature();polkTemplate.removeAllFeatures();$(\"#results\").hide();resultsTable.fnClearTable();$(\"#showResultsTable\").hide();' />");$(".closeTable").html("<img src='images/toolbar/window-close.png' class='noborder' title='Close Window' alt='Close Window' onclick='$(\"#results\").hide();$(\"#showResultsTable\").show();GeoMOOSE.startService(\"select_survey_followup\", {shape: highlight.getAllCentroids()});$(\"#showResultsTable\").hide();' />");$("#resultsTable tbody").click(function(event) {if($(event.target.parentNode).hasClass("row_selected")){$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});highlight.selectFeature();document.getElementById(Tabs.getTab(CONFIGURATION["show_results_in"])).innerHTML=""}else{$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});$(event.target.parentNode).addClass("row_selected");highlight.selectFeature(fnGetSelected(resultsTable));GeoMOOSE.startService("search_surveys_url_details",{fieldname0:"DOCUMENTNA",value0:fnGetSelected(resultsTable),template:"select_survey_detail.html",layer0:"survey/surveywebi"});}});
		  $(".resultGlobalTools").html("<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to selected survey' alt='Zoom to selected survey' onclick='if(fnGetSelected(resultsTable)){highlight.zoomToExtent(highlight.getBounds(fnGetSelected(resultsTable)));Map.zoomOut();}else{alert(\"A selected record is needed for this tool\")}' /><img src='images/toolbar/select.png' class='noborder' alt='Buffer selected survey' title='Buffer selected survey' onclick='if(fnGetSelected(resultsTable)){GeoMOOSE.startService(\"buffer_select_survey_followup\", {shape: highlight.getShape(fnGetSelected(resultsTable)),\"shape_is_object\":\"false\"})}else{alert(\"A selected record is needed for this tool\")}'/><img src='images/toolbar/clear.png' title='Remove selected survey from selection' alt='Remove selected survey from selection' onclick='if(fnGetSelected(resultsTable)){removeFeature(fnGetSelected(resultsTable));var nextRow = fnGetSelectedRow(resultsTable);nextRow =nextRow.nextSibling;resultsTable.fnDeleteRow(fnGetSelectedRow(resultsTable));$(nextRow).addClass(\"row_selected\");highlight.selectFeature(fnGetSelected(resultsTable));GeoMOOSE.startService(\"search_surveys_url_details\",{fieldname0:\"PlatName\",value0:fnGetSelected(resultsTable),template:\"select_survey_detail.html\",layer0:\"survey/survey\"});}else{alert(\"A selected record is needed for this tool\")}' />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Global Tools&nbsp;<img src='images/toolbar/zoomin.png' class='noborder' title='Zoom to all results' alt='Zoom to all results' onclick='highlight.zoomToExtent(highlight.getAllBounds());' /><img src='images/toolbar/select.png' title='Buffer all selected surveys' alt='Buffer all selected surveys' onclick='javascript:GeoMOOSE.startService(\"buffer_select_survey_followup\", {shape: highlight.getAllShapes(),shape_is_object:\"true\"})' /><img src='images/toolbar/find.png' title='Search Surveys' alt='Search Surveys' onclick='GeoMOOSE.startService(\"search_surveys\");GeoMOOSE.changeLayerVisibility(\"highlight/all\", false);removeFeature();polkTemplate.removeAllFeatures();$(\"#results\").hide();resultsTable.fnClearTable();$(\"#showResultsTable\").hide();' />");$(".closeTable").html("<img src='images/toolbar/window-close.png' class='noborder' title='Close Window' alt='Close Window' onclick='$(\"#results\").hide();$(\"#showResultsTable\").show();GeoMOOSE.startService(\"select_survey_followup\", {shape: highlight.getAllCentroids()});$(\"#showResultsTable\").hide();' />");$("#resultsTable tbody").click(function(event) {if($(event.target.parentNode).hasClass("row_selected")){$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});highlight.selectFeature();document.getElementById(Tabs.getTab(CONFIGURATION["show_results_in"])).innerHTML=""}else{$(resultsTable.fnSettings().aoData).each(function (){$(this.nTr).removeClass("row_selected");});$(event.target.parentNode).addClass("row_selected");highlight.selectFeature(fnGetSelected(resultsTable));GeoMOOSE.startService("search_surveys_url_details",{fieldname0:"PlatName",value0:fnGetSelected(resultsTable),template:"select_survey_detail.html",layer0:"survey/survey"});}});
		},
	CLASS_NAME: "Highlight"
});
GeoMOOSE.UX.register("Highlight");

highlight = new Highlight();


//LK User Extension for Polk County Template Test
PolkTemplateTest = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
 	layerName: 'templateTest',
	style_blue: {
		strokeColor: "#006DEF",
		strokeOpacity: 1,
		strokeWidth: 3,
		pointRadius: 6,
		fillColor: "#006DEF",
		fillOpacity: .1,
		pointerEvents: "visiblePainted"
	},
	style_red: {
		strokeColor: "#FF0000",
		strokeOpacity: 1,
		strokeWidth: 3,
		pointRadius: 6,
		fillColor: "#006DEF",
		fillOpacity: .0,
		pointerEvents: "visiblePainted"
	},
 	afterMapbookLoad: function() {
		var layer = new OpenLayers.Layer.Vector(this.layerName);
		this.layer = layer;
		Map.addLayer(layer);
	},
	renderHtml: function(shape,fid) { 
		polkTemplate.addParcel(shape,fid);
		var html = "<span class='service-title'>Template Test</span><br/>";
		html += "<b>1. Select a Template Shape</b><br/>";
		html += "<span  onclick='polkTemplate.createSquare(polkTemplate.center);'><img src='images/toolbar/draw-square-inverted-corners.png' title='Rotate Create square' alt='Create square' /> Square</span><br/>";
		html += "<span onclick='polkTemplate.createRectangle(polkTemplate.center);'><img src='images/toolbar/draw-rectangle.png' title='Create rectangle' alt='Create rectangle' /> Rectangle</span><br/>";
		html += "<br/><b>2. Modify the template</b><br/>";
		html += "<span onclick='polkTemplate.rotateFeature(45);'><img src='images/toolbar/object-rotate.png' title='Big Rotate counter-clockwise' alt='Rotate counter-clockwise' /> Big rotate (45&#176)</span><br/>";
		html += "<span onclick='polkTemplate.rotateFeature(5);'><img src='images/toolbar/object-rotate.png' title='Rotate counter-clockwise' alt='Rotate counter-clockwise' /> Rotate counter-clockwise (5&#176)</span><br/>";
		html += "<span onclick='polkTemplate.rotateFeature(-5);'><img src='images/toolbar/object-rotate-right.png' title='Rotate clockwise' alt='Rotate clockwise' /> Rotate clockwise (5&#176)</span><br/>";
		html += "<span onclick='polkTemplate.dragFeature(polkTemplate.center);'><img src='images/toolbar/draw_move_shape.png' title='Drag shape' alt='Drag shape' /> Drag shape</span><br/>";
		html += "<br/><b>3. Search for parcels</b><br/>";
		html += "<button onclick='GeoMOOSE.startService(\"select_historic_taxlot\", {shape: polkTemplate.getTemplate(),parcel:polkTemplate.getParcelId()})')>Go</button>";

//		removeFeature();
		document.getElementById(Tabs.getTab(CONFIGURATION.show_service_settings_in)).innerHTML = html;
		GeoMOOSE.changeTab(CONFIGURATION.show_service_settings_in);
		GeoMOOSE.setTabTitle('Template Test');
	},
	addParcel: function(shape,fid) {
		var layer = Map.getLayersByName(this.layerName)[0];
		var wkt_format = new OpenLayers.Format.WKT();
		var feature = wkt_format.read(shape.shape);
		feature.id = fid;
		feature.style = this.style_red;
		layer.addFeatures(feature);
		var center = feature.geometry.getCentroid();
		polkTemplate.center = center;
		this.parcelId = fid;
	},
	createSquare: function(center) {
		var layer = Map.getLayersByName(this.layerName)[0];
		layer.removeFeatures(layer.getFeatureById('template'));
		var poly = new OpenLayers.Bounds(center.x-1320,center.y-1320,center.x+1320,center.y+1320).toGeometry();
		var feature = new OpenLayers.Feature.Vector(poly, null, this.style_blue);
		feature.id = 'template';
		layer.addFeatures(feature);
	},
	createRectangle: function(center) {
		var layer = Map.getLayersByName(this.layerName)[0];
		layer.removeFeatures(layer.getFeatureById('template'));
		var poly = new OpenLayers.Bounds(center.x-1866.7619,center.y-933.38095,center.x+1866.7619,center.y+933.38095).toGeometry();
		var feature = new OpenLayers.Feature.Vector(poly, null, this.style_blue);
		feature.id = 'template';
		layer.addFeatures(feature);
	},
	getTemplate: function() {
		var layer = Map.getLayersByName(this.layerName)[0];
		var feature = layer.getFeatureById('template');
		var shape = new Object();
		shape = feature.geometry.toString();
		return shape;
	},
	getParcelId: function() {
		var layer = Map.getLayersByName('templateTest')[0];
		var parcelId;
		var features = layer.features

		parcelId = features[0].id;
		return parcelId;
	},
	dragFeature: function() {
		var layer = Map.getLayersByName('templateTest')[0];
		var drag = new OpenLayers.Control.DragFeature(layer);
		Map.addControl(drag);
		drag.activate();
	},
	rotateFeature: function(rotate) {
 		var layer = Map.getLayersByName('templateTest')[0];
		var feature = layer.getFeatureById('template');
		var center = feature.geometry.getCentroid();
		var cent = new OpenLayers.Geometry.Point(center.x, center.y);
		feature.geometry.rotate(rotate, cent);
		feature.layer.drawFeature(feature);
	},
	removeAllFeatures: function() {
		var layer = Map.getLayersByName(this.layerName)[0];
		layer.removeFeatures(layer.features);
	},
	getAllId: function() {
		var json = new OpenLayers.Format.JSON();
		var parcelId = new Object;
		var layer = Map.getLayersByName('parcelHighlight')[0];
		var features = layer.features

		for(var i = 0; i < features.length; i++) {
			if(layer.features[i].id.substring(0,5) != "drawn") { 
				parcelId[i] = features[i].id;
			}
		}
		parcelId = json.write(parcelId);
		return parcelId;
	},
	CLASS_NAME: "PolkTemplateTest"
});
GeoMOOSE.UX.register("PolkTemplateTest");

var polkTemplate = new PolkTemplateTest();

//LK User Extension to draw points from text file
DrawSketchPoints = new OpenLayers.Class(GeoMOOSE.UX.Extension, {
	layerName: 'sketchlayer',
	initialize: function() {
		this.MySelf = this;
 	},
 	afterMapbookLoad: function() {
//		var layer = new OpenLayers.Layer.Vector(this.layerName);
//		Map.addLayer(layer);
	},
 	addFeature: function(shape) {
 		var layer = Map.getLayersByName(this.layerName)[0];
		var wkt_format = new OpenLayers.Format.WKT();
		var feature = wkt_format.read(shape);
//		feature.id = fid;
		layer.addFeatures(feature);
	},
	getFile: function() {
		var p = document.getElementById(CONFIGURATION.tabs.Services);		
		p.innerHTML = '';

		var form = document.createElement('form');
		form.enctype = 'multipart/form-data';

		var heading = document.createElement('span');
		heading.innerHTML = "Sketch XY Points";
		heading.className = "service-title";

		var text = document.createElement('span');
		text.innerHTML = "<br/>Enter file to upload";

		var fileSelect = document.createElement('input');
		fileSelect.type = 'file';
		fileSelect.id = 'fileToUpload';
		fileSelect.name = 'fileToUpload';

		var br = document.createElement('br');
		var br2 = document.createElement('br');

		var cancelButton = document.createElement('button');	
		cancelButton.innerHTML = 'Cancel';
		cancelButton.onclick = this.callSelf;

		var button = document.createElement('button');	
		button.innerHTML = 'Upload';
		button.onclick = this.fileUpload;

		p.appendChild(form);
		form.appendChild(heading);
		form.appendChild(text);
		form.appendChild(fileSelect);
		form.appendChild(br);
		form.appendChild(br2);
		form.appendChild(cancelButton);
		form.appendChild(button);
	},
	process: function(url,params) {
		var values = this.getParams(params);
		this.values = values;
		this.url = url;
		if(values.mode == 'point' && values.x.length > 0 && values.y.length > 0) {
			openURL(url, params,'',this.onServiceReturn);
		}
		else if(values.mode == 'get') {
			this.getFile();
	 	}
		else if(values.mode == 'clear') {
	 		var layer = Map.getLayersByName(this.layerName)[0];
	 		layer.removeFeatures(layer.features);
	 	}
		else if(values.mode == 'save') {
			this.getFileName();
	 	}
	},
	fileUpload: function() {
		$.ajaxFileUpload ({
			url:'extensions/ajaxfileupload/doajaxfileupload.php', 
			secureuri:false,
			fileElementId:'fileToUpload',
			dataType: 'json',
			success: function (data, status)
			{
				if(typeof(data.error) != 'undefined')
				{
					if(data.error != '')
					{
						alert(data.error);
					}else
					{
						var MySelf = drawSketchPoints;
						MySelf.values.file = data.msg;
						MySelf.values.mode = 'returnFilePoints';
						openURL(MySelf.url, MySelf.values,'',MySelf.onServiceReturn);
					}
				}
			},
			error: function (data, status, e)
			{
				alert(e);
			}
		})
		return false;
	},
	getFileName: function() {
		var p = document.getElementById(CONFIGURATION.tabs.Services);		
		p.innerHTML = '';

		var heading = document.createElement('span');
		heading.innerHTML = "Sketch XY Points";
		heading.className = "service-title";

		var text = document.createElement('span');
		text.innerHTML = "<br/>Enter name for file to save";

		var fileName = document.createElement('input');
		fileName.id = 'fileName';
		fileName.name = 'fileName';

		var br = document.createElement('br');
		var br2 = document.createElement('br');

		var cancelButton = document.createElement('button');	
		cancelButton.innerHTML = 'Cancel';
		cancelButton.onclick = this.callSelf;

		var button = document.createElement('button');	
		button.innerHTML = 'Save';
		button.onclick = this.saveFile;

		p.appendChild(heading);
		p.appendChild(text);
		p.appendChild(fileName);
		p.appendChild(br);
		p.appendChild(br2);
		p.appendChild(cancelButton);
		p.appendChild(button);
	},
	saveFile: function() {
		var layer = Map.getLayersByName('sketchlayer')[0];
		var features = layer.features
		var pointsWkt = new Object();
		for(var i = 0; i < features.length; i++) {
			pointsWkt[i] = features[i].geometry.toString();
		}
		var fileName = document.getElementById('fileName').value;
		var MySelf = drawSketchPoints;
		var json = new OpenLayers.Format.JSON();
		MySelf.values.pointsWkt = json.write(pointsWkt);
		MySelf.values.fileName = fileName;
		openURL(MySelf.url, MySelf.values,'',MySelf.onServiceReturn);
		window.open(MySelf.url+'?mode='+MySelf.values.mode+'&pointsWkt='+json.write(pointsWkt)+'&fileName='+fileName+'&projection='+MySelf.values.projection);
	},
	getParams: function(params) {
		var args = new Object();
		var query = params;
		var pairs = query.split("&");            

		for(var i = 0; i < pairs.length; i++) {
		var pos = pairs[i].indexOf('=');       
		if (pos == -1) continue;               
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1); 
			args[argname] = unescape(value);       
		}
		return args;                           
	},
	onServiceReturn: function (response) {
		Services.onServiceReturn(response);
		GeoMOOSE.startService('draw_sketch_points');
	},
	callSelf: function () {
		GeoMOOSE.startService('draw_sketch_points');
	},
	CLASS_NAME: "DrawSketchPoints"
});
GeoMOOSE.UX.register("DrawSketchPoints");

var drawSketchPoints = new DrawSketchPoints();


// TODO should be added to the Highlight class
function removeFeature(fid) {
	var layer = Map.getLayersByName('parcelHighlight')[0];
	if(!fid) {
		layer.removeFeatures(layer.features);
		polkTemplate.removeAllFeatures();
		document.getElementById('information-tab').innerHTML = "";
	}
	else {
		var feature = layer.getFeatureById(fid);
		layer.removeFeatures(feature);
	}
	var layer = Map.getLayersByName('Markers')[0];
	if(layer) {
		Map.removeLayer(layer);
	}
	var layer = Map.getLayersByName('/drawinglayer')[0];
	layer.removeFeatures(layer.features);

}

// TODO should be added to the Highlight class
function removeElement(ele){
  if(ele.parentNode && ele.nodeType){
    ele.parentNode.removeChild(ele);
    return true;
  }else{
    return false;// not an element or no parent :(
  };
};

//var zoomToSelect;
//TODO should be added to User Interface UX
function startDynamicZoomTo() {

	selected=this.selectedIndex;
	if(selected != 0){
		var dynamicZoomToObject = CONFIGURATION.dynamiczoomto;

		selectedValue = this[selected].value;
		selectedValueArray = new String(selectedValue).split(':');
		type = selectedValueArray[0];

		if(type == 'single') {
			for(var zoomToTitle in dynamicZoomToObject) {
				for(var extentTitle in dynamicZoomToObject[zoomToTitle]) {
					if(dynamicZoomToObject[zoomToTitle][extentTitle][0] == selectedValue) {
						extent = dynamicZoomToObject[zoomToTitle][extentTitle][1];
					}
				}	
			}
			var arr = new String(extent).split(',');
			GeoMOOSE.zoomToExtent(arr[0],arr[1],arr[2],arr[3]);
		}

		else if(type == 'point') {
			GeoMOOSE.startService("zoom_to_point");
		}

		else if(type == 'dynamic') {
			for(var zoomToTitle in dynamicZoomToObject) {
				for(var extentTitle in dynamicZoomToObject[zoomToTitle]) {
					if(dynamicZoomToObject[zoomToTitle][extentTitle][0] == selectedValue) {
						layer = dynamicZoomToObject[zoomToTitle][extentTitle][1];				
						qitem = dynamicZoomToObject[zoomToTitle][extentTitle][2];
					}
				}	
			}
			GeoMOOSE.startService('dynamicZoomTo', {'layer':layer,'qitem':qitem} );
		}

		else if(type == 'static') {
			document.getElementById(Tabs.getTab(CONFIGURATION.show_service_settings_in)).innerHTML = "";
			var zoomToParent = document.getElementById(Tabs.getTab(CONFIGURATION.show_service_settings_in));
			zoomToParent.appendChild(document.createTextNode('Zoom To '));

			zoomToSelect = document.createElement('select');
			zoomToSelect.className = 'zoomto-select-followup';
			zoomToSelect.onchange = changeExtentBySelect2;
			zoomToParent.appendChild(zoomToSelect);
			var blankOption = document.createElement('option');
			blankOption.appendChild(document.createTextNode('Select'));
			zoomToSelect.appendChild(blankOption);

			for(var zoomToTitle in dynamicZoomToObject) {
				for(var extentTitle in dynamicZoomToObject[zoomToTitle]) {
					if(dynamicZoomToObject[zoomToTitle][extentTitle][0] == selectedValue) {
						layer = dynamicZoomToObject[zoomToTitle][extentTitle][1];				
						qitem = dynamicZoomToObject[zoomToTitle][extentTitle][1];
						for(var extentTitle in qitem) {
							var option = document.createElement('option');
							option.value = qitem[extentTitle][1];
							zoomToSelect.appendChild(option);
							option.appendChild(document.createTextNode(qitem[extentTitle][0]));
						}
					}
				}	
			}
		Tabs.showTab(CONFIGURATION.show_service_settings_in);
		}
		else {
			alert("error");
		}

	}
	this.selectedIndex = 0;
}

//TODO should be added to User Interface UX
function toggle_search_panel() {
	var sp = document.getElementById('search_panel');
	var className = new String(sp.className);
	if(className.match('collapsed')) {
		sp.className = className.replace('collapsed','expanded');
	} else {
		sp.className = className.replace('expanded','collapsed');
	}
	manageLayout();
}

//TODO should be added to User Interface UX
function changeExtentBySelect2() {
	var options = this.getElementsByTagName('option');
	var selectedIndex = this.selectedIndex;

	/* reset to the "blank" option */
	for(var i = 0; i < options.length; i++) {
		options[i].selected = false;
	}
//	options[0].selected = true;

	/* zoom to the extents */
	var arr = new String(options[selectedIndex].value).split(',');
	GeoMOOSE.zoomToExtent(arr[0],arr[1],arr[2],arr[3]);
}
//LK So the geocode results show a marker instead of a popup
function addMark(y,x) {
	var markers = new OpenLayers.Layer.Markers( "Markers" );
	Map.addLayer(markers);

	var size = new OpenLayers.Size(20,34);
	var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
	var icon = new OpenLayers.Icon('http://openlayers.org/dev/img/marker-gold.png',size,offset);
	markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(y,x),icon));
	markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(y,x),icon.clone()));
}

/*************************************************************** 	
Several plug-in extensions for DataTables
****************************************************************/

//This gets the ID of the selected row in the jQuery table
function fnGetSelected(oTableLocal)
{
	var id;
	var aTrs = oTableLocal.fnGetNodes();

	for ( var i=0 ; i<aTrs.length ; i++ )
	{
		if ( $(aTrs[i]).hasClass('row_selected') )
		{
			id=oTableLocal.fnGetTd(oTableLocal.fnGetPosition( aTrs[i] ),0).firstChild.nodeValue;
		}
	}
	return id;
}

function fnGetSelectedRow(oTableLocal)
{
	var id;
	var aTrs = oTableLocal.fnGetNodes();

	for ( var i=0 ; i<aTrs.length ; i++ )
	{
		if ( $(aTrs[i]).hasClass('row_selected') )
		{
			id=aTrs[i];
		}
	}
	return id;
}

/*
 * Function: $().dataTable().fnGetTd
 * Purpose:  Get a TD node from a row, taking into account column visibility
 * Returns:  node: - TD element
 * Inputs:   mixed:mTr - 
 *             node: - TR element to get the TD child from
 *             int: - aoData index
 *           int:iTd - TD node index to get
 *           bool:bVisOnly - optional - if true then only visible columns are counted for the iTd
 *             parameter. If not given or false then both hidden and visible columns will be used
 */
$.fn.dataTableExt.oApi.fnGetTd  = function ( oSettings, mTr, iTd, bVisOnly )
{
	/* Take either a TR node or aoData index as the mTr property */
	var iRow = (typeof mTr == 'object') ? 
		oSettings.oApi._fnNodeToDataIndex(oSettings, mTr) : mTr;

	if ( typeof bVisOnly == 'undefined' && !bVisOnly )
	{
		/* Looking at both visible and hidden TD elements - convert to visible index, if not present
		 * then it must be hidden. Return as appropriate
		 */
		var iCalcVis = oSettings.oApi._fnColumnIndexToVisible( oSettings, iTd );
		if ( iCalcVis !== null )
		{
			return oSettings.aoData[ iRow ].nTr.getElementsByTagName('td')[ iCalcVis ];
		}
		else
		{
			return oSettings.aoData[ iRow ]._anHidden[ iTd ];
		}
	}
	else
	{
		/* Only looking at visible TD elements, so just use getElements... */
		return oSettings.aoData[ iRow ].nTr.getElementsByTagName('td')[ iTd ];
	}
}
/******************************************************
function printinfodiv
This function will print the countent of the info div that is
typically viewed in the results tab.  By adding a button and a call
to this function from the html used to view results you can print outputs easily.
 The call from the html is stypically a button with a call to this function. 
******************************************************/
function printinfodiv(strid)
{
var prtContent = document.getElementById(strid);
var WinPrint = window.open('','','letf=0,top=0,width=1,height=1,toolbar=0,scrollbars=0,status=0');
WinPrint.document.write(prtContent.innerHTML);
WinPrint.document.close();
WinPrint.focus();
WinPrint.print();
WinPrint.close();
prtContent.innerHTML=strOldOne;
}


