//'' variable to hold the current 'locateandcenter' point
var cportal = new ObjCPortal();


function ObjCPortal(){

	// Client side javascript object for portal methods

	this.maps = new ObjCPortalMaps();

	this.startLoader = ObjCPortalStartLoader;
	this.stopLoader = ObjCPortalStopLoader;

}



function ObjCPortalMaps(){

	// Client side javascript object for portal.maps methods

	//'' PROPERTIES
	this.current_locateandcenter_point;
	this.selectedMarker;

	//'' METHODS
	this.loadData = ObjCPortalMapsLoadData;
	this.loadPolygons = ObjCPortalMapsLoadPolygons;
	this.loadMarkers = ObjCPortalMapsLoadMarkers;
	this.getGIcon = ObjCPortalMapsGetGIcon;
	this.createMarker = ObjCPortalMapsCreateMarker;
	this.createPolygon = ObjCPortalMapsCreatePolygon;
	this.locateandcenter_form = ObjCPortalMapsLocateandcenter_form;
	this.locateandcenter = ObjCPortalMapsLocateandcenter;
	this.centerandzoom = ObjCPortalMapsCenterandzoom;
	this.isEditingMode = ObjCPortalMapsIsEditingMode;
	this.populateMarkerForm = ObjCPortalMapsPopulateMarkerForm;
	this.closeEditPanel = ObjCPortalMapsCloseEditPanel;
	this.showHideEditPanel = ObjCPortalMapsShowHideEditPanel;
	this.openEditor = ObjCPortalMapsOpenEditor;

}



function ObjCPortalMapsLoadData(url,center) {
	this.loadPolygons(url,center);
	this.loadMarkers(url,center);
}






function ObjCPortalMapsLoadMarkers(url,center) {


	var searchUrl = url;

	if(!searchUrl || searchUrl == "" || searchUrl == "undefined")
		return;

	GDownloadUrl(searchUrl, function(data,HTTPSTATUS) {

		var xml = GXml.parse(data);

		var markers = xml.documentElement.getElementsByTagName("marker");
		var bounds = new GLatLngBounds();
		for (var i = 0; i < markers.length; i++) {


			var Latitude = parseFloat(markers[i].getAttribute('latitude'));
			var Longitude = parseFloat(markers[i].getAttribute('longitude'));
			var Title = markers[i].getAttribute('title');
			var Icon = markers[i].getAttribute('icon');
			var Description = "";
			var OnClick = "";

			//'' ############################################################

			//'' get the CDATA fields

			var elements = markers[i].getElementsByTagName("description");
			for(var e=0;e<elements.length;e++){ 
				Description += elements[e].text;
			}
			//'' put html <> back into Description
			Description = Description.replace(/\&lt;/g,"<").replace(/\&gt;/g,">").replace(/\\/g,"");


			var elements = markers[i].getElementsByTagName("onClick");
			for(var e=0;e<elements.length;e++){ 
				OnClick += elements[e].text;
			}
			//'' put html <> back into OnClick
			OnClick = OnClick.replace(/\&lt;/g,"<").replace(/\&gt;/g,">").replace(/\\/g,"");

			
			//'' ############################################################

			//'' get the API objects

			//'' CBlock
			var CBlock;
			var elements = markers[i].getElementsByTagName("block");
			if(elements.length) 
				CBlock = cenviron.getBlock(markers[i].getAttribute('BlockID'),elements[0]);


			//'' CField
			var elements = markers[i].getElementsByTagName("fields");
			for(var e=0;e<elements.length;e++){ 
				//'' get the fieldID
				var fieldIDs = elements[e].getElementsByTagName("FieldID");
				if(fieldIDs.length)
					cenviron.getField(fieldIDs[0].text,elements[e]);
			}


			//'' CFieldData
			var elements = markers[i].getElementsByTagName("fielddatas");
			for(var e=0;e<elements.length;e++){ 
				//'' get the fieldID
				var fieldIDs = elements[e].getElementsByTagName("FieldID");
				if(fieldIDs.length)
					cenviron.getFieldData(fieldIDs[0].text,markers[i].getAttribute('BlockID'),elements[e]);
			}


			//'' ############################################################


			var point = new GLatLng(Latitude,Longitude);


			var markerOptions = { 
				title: Title,
				latitude: Latitude,
				longitude: Longitude,
				icon: cportal.maps.getGIcon(Icon),
				iconurl: Icon,
				onClick: OnClick,
				address: markers[i].getAttribute('address'),
				description: Description,
				BlockID: markers[i].getAttribute('BlockID'),
				PageID: markers[i].getAttribute('PageID'),
				DescriptionFieldID: markers[i].getAttribute('DescriptionFieldID'),
				cblock: CBlock
			};

			var marker = cportal.maps.createMarker(point, markerOptions);
			map.addOverlay(marker);

			bounds.extend(point);
		}


	});
}




function ObjCPortalMapsLoadPolygons(url,center) {


	var searchUrl = url;
	
	if(!searchUrl || searchUrl == "" || searchUrl == "undefined")
		return;

	GDownloadUrl(searchUrl, function(data,HTTPSTATUS) {

		var xml = GXml.parse(data);

		var markers = xml.documentElement.getElementsByTagName("polygon");
		var bounds = new GLatLngBounds();
		for (var i = 0; i < markers.length; i++) {



			var OnClick = "";

			//'' ############################################################

			//'' get the CDATA fields


			var elements = markers[i].getElementsByTagName("onClick");
			for(var e=0;e<elements.length;e++){ 
				OnClick += elements[e].text;
			}
			//'' put html <> back into OnClick
			OnClick = OnClick.replace(/\&lt;/g,"<").replace(/\&gt;/g,">").replace(/\\/g,"");

			//'' ############################################################



			var StartPoint = new GLatLng(markers[i].getAttribute('start').split(",")[0],markers[i].getAttribute('start').split(",")[1]);
			var EndPoint = new GLatLng(markers[i].getAttribute('end').split(",")[0],markers[i].getAttribute('end').split(",")[1]);

			var Points = [StartPoint,EndPoint];

			var polyOptions = {
				geodesic:true,
				start: markers[i].getAttribute('start'),
				end: markers[i].getAttribute('end'),
				startPoint: StartPoint,
				endPoint: EndPoint,
				points: Points,
				strokeColor: markers[i].getAttribute('color'),
				strokeWeight: markers[i].getAttribute('weight'),
				strokeOpacity: markers[i].getAttribute('opacity'),
				fillColor: markers[i].getAttribute('fillColor'),
				fillOpacity: markers[i].getAttribute('fillOpacity'),
				onClick: OnClick,
				BlockID: markers[i].getAttribute('BlockID'),
				PageID: markers[i].getAttribute('PageID')
			};

			var polygon = cportal.maps.createPolygon(polyOptions);

			
			bounds.extend(polyOptions.startPoint);
			bounds.extend(polyOptions.endPoint);


			map.addOverlay(polygon);


		}


	});


}

function ObjCPortalMapsCreatePolygon(polyOptions) {

//	var polygon = new GPolyline([startPoint,endPoint], "#ff0000", 10, 1, polyOptions);

	//'' DEFAULTS
	var defaultStrokeColor = "#ff0000";
	var defaultStrokeWeight = 3;
	var defaultStrokeOpacity = .6;
	var defaultFillColor = "";
	var defaultFillOpacity = 0;

	//'' if there are only 2 points, and geodesic is true, then create a polyline
	if(polyOptions.geodesic && polyOptions.points.length > 2)
		var polygon = new GPolygon(polyOptions.points, (polyOptions.strokeColor || defaultStrokeColor), (polyOptions.strokeWeight || defaultStrokeWeight), (polyOptions.strokeOpactiy || defaultStrokeOpacity), (polyOptions.fillColor || defaultFillColor), (polyOptions.fillOpactiy || defaultFillOpacity), polyOptions);
	else
		var polygon = new GPolyline(polyOptions.points, (polyOptions.strokeColor || defaultStrokeColor), (polyOptions.strokeWeight || defaultStrokeWeight), (polyOptions.strokeOpactiy || defaultStrokeOpacity), polyOptions);


	GEvent.addListener(polygon, 'click', function() {
		//'' in editing mode...
		if(cportal.maps.isEditingMode()){
			cportal.maps.showHideEditPanel('show');
			TT_onOffLayers('portal_map_description','','show');
			//cportal.maps.populateMarkerForm(marker);
		}

		if(markerOptions.onClick > ""){
			//cportal.maps.selectedMarker = marker;
			//eval(markerOptions.onClick);
		}

//		if(!marker.markerOptions.disableInfoWindow)
			//marker.openInfoWindowHtml(html);
	});
	return polygon;
}



function ObjCPortalMapsGetGIcon(url) {

	if(!url || url == "" || url == "undefined")
		return null;

	var icon = new GIcon();
	icon.image = url;
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(16, 0);
	icon.iconSize = new GSize(34, 34);
//	icon.shadow = "images/" + IMAGES[i] + "-shadow.png";
//	icon.shadowSize = new GSize(59, 32);
	return icon;
}



function ObjCPortalMapsCreateMarker(point, markerOptions) {

	var marker = new GMarker(point,markerOptions );
	
	//'' add the markerOptions as a property
	marker.markerOptions = markerOptions;

	var html = "";
	html += "<div style=\"overflow-x: hidden; overflow-y: auto; width: 200px; height: 175px;\">";
	html += "<strong>"+markerOptions.title+"</strong><BR>";
	html += "Address: "+markerOptions.address+"<BR>";
	html += markerOptions.description+"</div>";

	GEvent.addListener(marker, 'click', function() {
		//'' in editing mode...
		if(cportal.maps.isEditingMode()){
			cportal.maps.showHideEditPanel('show');
			TT_onOffLayers('portal_map_description','','show');
			cportal.maps.populateMarkerForm(marker);
		}

		if(markerOptions.onClick > ""){
			cportal.maps.selectedMarker = marker;
			eval(markerOptions.onClick);
		}

		if(!marker.markerOptions.disableInfoWindow)
			marker.openInfoWindowHtml(html);
	});
	return marker;
}





function ObjCPortalMapsLocateandcenter_form(removecurrent){


	//'' locates and centres the map using the form field values
	//'' removes the current_locateandcenter_point if requested

	document.all.portal_message.innerHTML = '';
	cportal.startLoader("portal_map_loading");

	if(removecurrent && this.current_locateandcenter_point){
		map.removeOverlay(this.current_locateandcenter_point);
	}


	//'' must have a lat and long
	var latitude;
	var longitude;


	if(document.forms["portal_maps_marker"].useLatLong.value == 1){
		if(document.forms["portal_maps_marker"].Latitude.value > "")
			latitude = document.forms["portal_maps_marker"].Latitude.value;

		if(document.forms["portal_maps_marker"].Longitude.value > "")
			longitude = document.forms["portal_maps_marker"].Longitude.value;


		if(latitude > "" && longitude > ""){
			var point = new GLatLng(parseFloat(latitude),parseFloat(longitude));
			return this.locateandcenter(point);
		}

	}
	else 
	{
		if(document.forms["portal_maps_marker"].Address.value > ""){
			//'' append country to postcode/address
			var addr = document.forms["portal_maps_marker"].Address.value + ", "+document.forms["portal_maps_marker"].Country.value;

			var geocoder = new GClientGeocoder();
//			geocoder.getLatLng(addr,function(point) {this.locateandcenter(point)});
			geocoder.getLatLng(addr,function(point) {cportal.maps.locateandcenter(point)});
			//'' populate the LatLong fields
			try{
				document.forms["portal_maps_marker"].Latitude.value = point.lat();
				document.forms["portal_maps_marker"].Longitude.value = point.lng();
			} catch(er){}

		}
	}

}

function ObjCPortalMapsLocateandcenter(point,title,description){

	//'' locates and centres the map using the point 

	if(point){
		var title = title || document.forms["portal_maps_marker"].Name.value;
		var description = "";
			//var description = description || document.forms["portal_maps_marker"].Description.value;

		this.current_locateandcenter_point = this.createMarker(point, {});
		map.addOverlay(this.current_locateandcenter_point);

		this.centerandzoom(this.current_locateandcenter_point.getLatLng());


	} else {
		alert("No location (point) supplied.");
	}
	cportal.stopLoader("portal_map_loading");

}



function ObjCPortalMapsCenterandzoom(point,zoom){

	//'' centres and zooms the map
	var zoom = zoom || 15;

	map.setCenter(point,zoom);  

}








function ObjCPortalMapsIsEditingMode(){
	//'' returns true if the map is currently being edited 
	if(document.forms["portal_maps_marker"]) return true;

	return false;
}



function ObjCPortalMapsPopulateMarkerForm(marker){

	//'' populates the form with the marker details
	document.forms["portal_maps_marker"].Name.value = marker.markerOptions.title;
	document.forms["portal_maps_marker"].Latitude.value = marker.markerOptions.latitude;
	document.forms["portal_maps_marker"].Longitude.value = marker.markerOptions.longitude;
	document.forms["portal_maps_marker"].Address.value = marker.markerOptions.address;
	document.forms["portal_maps_marker"].BlockID.value = marker.markerOptions.BlockID;
	setSelectedRadioGroupObject("CategoryPageID","portal_maps_marker",marker.markerOptions.PageID);
	document.all.description_preview.innerHTML = marker.markerOptions.description;
	document.forms["portal_maps_marker"].DescriptionFieldID.value = marker.markerOptions.DescriptionFieldID;

}



function ObjCPortalMapsCloseEditPanel(){

	//'' close the edit panel
	//'' this.should reset all the form fields and close the description area

	document.forms["portal_maps_marker"].reset();
	

	this.showHideEditPanel('hide');
	TT_onOffLayers('portal_map_description','','hide');

}


function ObjCPortalMapsShowHideEditPanel(state){

	MM_showHideLayers('portal_editpanel','',state);
	

}


function ObjCPortalMapsOpenEditor(formField){

	//'' opens the editor for the specified form field

	if(formField == "Description"){
		newWin("/manager_3_0_2/utils/editRichText.asp?table=fielddata&field=data&pk=blockid&id="+document.forms["portal_maps_marker"].BlockID.value+"&pk2=fieldid&id2="+document.forms["portal_maps_marker"].DescriptionFieldID.value,'editRichText',800,600,null,null,null,true);

	}
}



function ObjCPortalStartLoader(loaderName){

	try{
		var loader = document.getElementById(loaderName);
		loader.style.visibility = 'visible';
	}catch(er){}
}

function ObjCPortalStopLoader(loaderName){

	try{
		var loader = document.getElementById(loaderName);
		loader.style.visibility = 'hidden';
	}catch(er){}
	
}


