var canvas, map, firstBounds, newly_added_markers, currently_visible_placemarks;
var markers_set = dataLoadDate = 0;
var oPlacemarks = new Array;

if(typeof plugin_name === 'undefined') plugin_name = '';

jQuery(window).load(function() {
	canvas = document.getElementById(plugin_name+"_canvas");
	if(canvas) {
		jQuery('#'+plugin_name+"_search").live('focus',function(event){
			if(jQuery(this).attr('value') == search_default) jQuery(this).attr('value','');
		});
		if(!jQuery('#'+plugin_name+"_search").attr('value'))
			jQuery('#'+plugin_name+"_search").attr('value',search_default);

		jQuery("."+plugin_name+"_filters").live("click",function() {
			xml_request = prepare_xml_request();
			downloadUrl(xml_request, parseXMLData);
		});

		xml_request = prepare_xml_request();
		downloadUrl(xml_request, parseXMLData);
		var myOptions = {
			disableDefaultUI: true,
			mapTypeId: google.maps.MapTypeId.TERRAIN,
			center: new google.maps.LatLng(center_lat, center_lon),
			navigationControl: true,//want to make this true, but it seems to be intertwined with scaleControl
			streetViewControl: false,
			zoom: 4,
			disableDoubleClickZoom: false,
			scrollwheel: false
		}
		 map = new google.maps.Map(canvas, myOptions);
/*
		google.maps.event.addDomListener(map, 'tilesloaded', function(){
			//https://code.google.com/apis/maps/documentation/javascript/reference.html#Map
			setTimeout("loading_animation(false);",1000);// the right event doesn't exist...
		});
*/
	}
});

function prepare_xml_request(ignore_search) {
	var concated_post_types = '';
	search_string = search_default;
	jQuery("."+plugin_name+"_filters").each(function(index,e){
		if(e.checked) {
			if(concated_post_types) concated_post_types += ',';
			concated_post_types += e.value;
		}
	});
	if(concated_post_types) {
		jQuery('#'+plugin_name+"_types").attr('value',concated_post_types);
	}
	concated_post_types = jQuery('#'+plugin_name+"_types").attr('value');
	if(!ignore_search) {
		search_string = jQuery('#'+plugin_name+"_search").attr('value').replace(/ /,'+');
	}

	xml_request = xml_file;
	if(search_string != search_default) xml_request += '&'+plugin_name+'_search='+encodeURIComponent(search_string);
	if(concated_post_types) xml_request += '&'+plugin_name+'_types='+encodeURIComponent(concated_post_types);

	return xml_request;
}

function loading_animation(active) {
	display = (active)?'block':'none';
	jQuery('#loading_animation').css('display',display);
}

function vc524_map_search(search_string,types) {
	xml_request = prepare_xml_request();
	downloadUrl(xml_request, parseXMLData);
}

//Too Many Markers! https://code.google.com/apis/maps/articles/toomanymarkers.html

function parseXMLData(xmlDoc,fillbehind) {
//	alert('start parseXMLData');

	//vc524_debug(xmlDoc);

	var xmlData = xmlDoc.documentElement.getElementsByTagName("placemark");
	if(xmlData.length) {
		var south = west = 180;
		var north = east = -180;
	}
	newly_added_markers = 0;
	currently_visible_placemarks = new Array;
	for (var i = 0; i < xmlData.length; i++) {
		var myXml = xmlData[i];

		lat = parseFloat(myXml.getAttribute("lat"));
		lng = parseFloat(myXml.getAttribute("long"));

		if(lat > north) north = lat;
		if(lat < south) south = lat;
		if(lng > east) east = lng;
		if(lng < west) west = lng;

		//Use this to change the bubble's text: http://code.google.com/apis/maps/documentation/javascript/events.html#EventProperties
		mnemonic = myXml.getAttribute("mnemonic");
		currently_visible_placemarks[mnemonic] = 1;
		if(mnemonic && oPlacemarks[mnemonic] == undefined) {
			newly_added_markers++;
			oPlacemarks[mnemonic] = {
				"name" : myXml.getAttribute("name"),
				"mnemonic": mnemonic,
				"type" : myXml.getAttribute("type"),
				"address" : myXml.getAttribute("address"),
				"locality" : myXml.getAttribute("locality"),
				"region" : myXml.getAttribute("region"),
				"width" : myXml.getAttribute("width"),
				"height" : myXml.getAttribute("height"),
				"lat" : myXml.getAttribute("lat"),
				"lng" : myXml.getAttribute("long"),
				"url" : myXml.getAttribute("url"),
				"description" : myXml.getAttribute("description"),
				//"description" : myXml.getElementsByTagName("description")[0].nodeValue,
				//"departments" : myXml.getElementsByTagName("departments")[0],
				"indicate_link" : '<a href="#" onclick="indicatePlacemark(\''+mnemonic+'\');">' + name + '</a>',
				"sortOrder" : myXml.getAttribute("sort"),
				"infowindow" : null,
				"marker" : null
			};
			oPlacemarks[mnemonic]['content'] = setupInfoWindow(oPlacemarks[mnemonic]);
				//myXml.getAttribute("name"), mnemonic, myXml.getAttribute("address"), myXml.getAttribute("locality"), myXml.getAttribute("region"), myXml.getAttribute("postal_code"), myXml.getAttribute("phone"), myXml.getAttribute("fax"), myXml.getAttribute("url"));
		}
	}
//	alert(dump({'north':north,'south':south,'east':east,'west':west}));

	vc524_debug(xmlData);

	var box = null;
	if(xmlData.length) {
		southwest = new google.maps.LatLng(south, west);
		northeast = new google.maps.LatLng(north, east);
		box = new google.maps.LatLngBounds(southwest,northeast);
		if(!firstBounds) firstBounds = box;
	}
	else {
		if(!markers_set && !fillbehind) {
			xml_request = prepare_xml_request("ignore_search");
			downloadUrl(xml_request, parseXMLData, "fillbehind");
		}
		for (var k in oPlacemarks)
			currently_visible_placemarks[oPlacemarks[k]['mnemonic']] = 1;
	}

	if(!xmlData.length && !fillbehind) {
		xmlData = xmlDoc.documentElement.getElementsByTagName("searched");
		if(typeof(xmlData[0]) != 'undefined') {
			search_value = xmlData[0].getAttribute("value")
			geocoder = new google.maps.Geocoder();
			geocoder.geocode( { 'address': search_value}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					southwest = results[0].geometry.viewport.getSouthWest();
					northeast = results[0].geometry.viewport.getNorthEast();
					box = new google.maps.LatLngBounds(
						new google.maps.LatLng(southwest.lat(),southwest.lng()),
						new google.maps.LatLng(northeast.lat(),northeast.lng())
					);
					map.fitBounds(box);
				}
			});
		}
	}
	if(!box) box = firstBounds;
	setMarkers();
/*
	vc524_debug(map);
	vc524_debug(box);
*/
	if(box && map)
		map.fitBounds(box);

//	alert(dump(map.getCenter()));
//	alert('end parseXMLData');
}

function format_phone(phone) {
	input = phone;
	phone = phone.replace(/[^0-9]/g, ""); //already done upon input

	if(phone.length == 7)
		return phone.replace(/([0-9]{3})([0-9]{4})/, "$1 $2");
	else if(phone.length == 10)
		return phone.replace(/([0-9]{3})([0-9]{3})([0-9]{4})/, "($1) $2 $3");
	else
		return phone;
}

/*
	'name' => "San Antonio"
	'mnemonic' => "san-antonio"
	'type' => "offices"
	'address' => "6911 Blanco Road"
	'width' ...
	'height' ...
	'lat' => "29.518936"
	'lng' => "-98.506808"
	'url' => "http://terracon.voltagekc.com/offices/san-antonio"
	'description' => "Terracon's San Antonio office was established in 2004 amd formerly known as Drash Consulting Engineers. Chester Drash formed the company in 1992 with a staff of five. That grew to about 110 employees when Drash joined forces with Terracon. San Antonio professionals provide geotechnical, environmental, construction materials, and facilities services. The office serves a diverse set of markets and has done an extensive amount of work in government (military base work), energy, and oil and gas."
	'indicate_link' => "<a href="#" onclick="indicatePlacemark('san-antonio');"></a>"
	'sortOrder' ...
	'infowindow' ...
	'marker' ...
*/
function setupInfoWindow(placemark) {
	//name, mnemonic, addy, city, state, zip, phone, fax, url
	var a_open = a_close = '';
	if(placemark.url) {
		a_open = '<a href="'+placemark.url+'" target="_blank">';
		a_open_btn = '<a href="'+placemark.url+'" target="_blank" class="button">';
		a_close = '</a>';
	}
	var ov = '<div class="infoWindowBody"><p><strong class="buildingName">' + a_open + placemark.name + a_close + '</strong><br />';
	if (placemark.address != null) {
		ov += '' + placemark.address.replace(', ','<br />') + '<br />';
	}
	if(placemark.locality || placemark.region || placemark.zip) {
		if(!placemark.locality) placemark.locality = '';
		if(!placemark.region) placemark.region = '';
		if(!placemark.zip) placemark.zip = '';
		if(placemark.locality && placemark.region) placemark.locality = placemark.locality + ', ';
		ov += placemark.locality+placemark.region+' '+placemark.zip+'<br />';
	}
	if(placemark.phone) ov += 'Phone: '+format_phone(placemark.phone)+'<br />';
	if(placemark.fax) ov += 'Fax: '+format_phone(placemark.fax)+'<br />';

	ov += '</p>';
	ov += a_open_btn+'<span>View '+ucfirst(placemark.type.slice(0,-1))+'</span>'+a_close;
	ov += '</div>';

	return ov;
}

function setMarkers() {

	//alert('start setMarkers()');
	//http://code.google.com/apis/maps/documentation/javascript/overlays.html#ComplexIcons
	// Add markers to the map
	var count = 0;
	for (var k in oPlacemarks) {
		count++;
		var placemark = oPlacemarks[k];

		if(!placemark['marker']) {

			//vc524_debug(placemark);

			var myLatLng = new google.maps.LatLng(placemark['lat'], placemark['lng']);
			//vc524_debug(myLatLng);

			settings = icons[placemark['type']];
			icon = settings['placemark_src'];
			marker_size = settings['marker_size'].split(',');
			marker_origin = settings['marker_origin'].split(',');
			if(settings['marker_anchor'])
				marker_anchor = settings['marker_anchor'].split(',');
			else
				marker_anchor = false;

			shadow = settings['shadow_src'];
			shadow_size = settings['shadow_size'].split(',');
			shadow_origin = settings['shadow_origin'].split(',');
			if(settings['shadow_anchor'])
				shadow_anchor = settings['shadow_anchor'].split(',');
			else
				shadow_anchor = false;

/*
			if(count < 4)
				alert(dump({'settings':settings,'marker':marker_anchor,'shadow':shadow_anchor}));
*/


			var image = new google.maps.MarkerImage(
				icon,
				new google.maps.Size(marker_size[0],marker_size[1]),// Marker pixels wide by pixels tall.
				new google.maps.Point(marker_origin[0],marker_origin[1]), //image origin
				((marker_anchor)?new google.maps.Point(marker_anchor[0],marker_anchor[1]):null) //anchor for image (bottom left corner?)
			);
			var shadow = new google.maps.MarkerImage(
				shadow,
				// The shadow image is larger in the horizontal dimension
				// while the position and offset are the same as for the main image.
				new google.maps.Size(shadow_size[0], shadow_size[1]),
				new google.maps.Point(shadow_origin[0],shadow_origin[1]),
				((shadow_anchor)?new google.maps.Point(shadow_anchor[0],shadow_anchor[1]):null)
			);

			var shape = false;
			var infowindow = new google.maps.InfoWindow({
				content: placemark['content'],
				position: new google.maps.LatLng(
					placemark['lat'],
					placemark['lng']
				)
			});

			var marker = new google.maps.Marker({
				position: myLatLng,
				map: map,
				shadow: shadow,
				icon: image,
				shape: shape,
				title: placemark['name']
			});

			listener = setPlacemarkListener(marker, placemark.mnemonic);

			oPlacemarks[k]['marker'] = marker;
			oPlacemarks[k]['infowindow'] = infowindow;
			oPlacemarks[k]['listener'] = listener;
			
			markers_set++;
		}
		//vc524_debug(placemark);
		if(typeof(placemark['marker']) != 'undefined') {
			if(currently_visible_placemarks[placemark['mnemonic']])
				placemark['marker'].setVisible(true);
			else
				placemark['marker'].setVisible(false);
		}
	}
	setTimeout("loading_animation(false);",1500);
}

function setPlacemarkListener(marker, mnemonic) {
	listener = google.maps.event.addListener(marker, 'click', function() {
		indicatePlacemark(mnemonic);
	});
	return listener;
}

function setMapCenter(centeredOn, thisMap) {
	if (centeredOn == null)
		centeredOn = new google.maps.LatLng(center_lat, center_lon);
	map.setCenter(centeredOn, 17, thisMap);
}

function indicatePlacemark(mnemonic) {
	for( var k in oPlacemarks) {
		if(oPlacemarks[k].infowindow)
			oPlacemarks[k].infowindow.close();
	}
	placemark = oPlacemarks[mnemonic];
	placemark.infowindow.open(map);//, placemark.marker
}
function nodeValue(node) {
	var result = "";
	if (node.nodeType == 1) {
		var children = node.childNodes;
		for (var i = 0; i < children.length; ++i) {
			result += nodeValue(children[i]);
		}
	}
	else if (node.nodeType == 3) {
		result = node.nodeValue;
	}
	return(result);
}
//http://code.google.com/apis/maps/articles/phpsqlsearch_v3.html#createmap
function downloadUrl(url,callback,fillbehind) {
	loading_animation(true);
//	alert('start downloadUrl');
	dataLoadDate = new Date().getTime();
	if(url.indexOf('?') > -1) concat = '&';
	else concat = '?';
	url = url+concat+ "agrajag=" + dataLoadDate;

	var request = window.ActiveXObject ?
		new ActiveXObject('Microsoft.XMLHTTP') :
		new XMLHttpRequest;

	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			request.onreadystatechange = doNothing;
// 			alert(request.responseText);
			callback(request.responseXML, fillbehind);
		}
	};

	request.open('GET', url, true);
	request.send(null);
}

function ucfirst (str) {
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1);
}

