/*
not converting?
         address: "One Cowboys Parkway, Irving, TX",
lat: 32.939485
lng: -96.945784



  tjMap jQuery Plugin
  by Randy Brandt
  Copyright (c) 2011 tiredjake.com  
  Version: 0.2 11-Jan-2011

  jQuery wrapper for Google Maps API v3
    
  Requires jQuery v1.4.3 or later; http://jquery.com
  Examples and docs:
    http://www.tiredjake.com/index.php?p=tjMap
    
  Licensed under the MIT license:
  http://www.opensource.org/licenses/mit-license.php
  Details at end of this file

	type
	zoom
	
	lat
	lng
	adr
	
Partial inspiration:
http://googlemaps.mayzes.org/

References
http://mapki.com/wiki/Google_Map_Parameters#Directions
http://code.google.com/p/google-maps-icons/wiki/NumericIcons

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&key=ABQIAAAA9Okjf5ZBcTLnl_N_-py1MhQfY1BYuPO-PFNcuWIrgGp-EM-RORT7klbs0BHyI3QCDYyq9YYarnT9Ew"></script>

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAA9Okjf5ZBcTLnl_N_-py1MhQfY1BYuPO-PFNcuWIrgGp-EM-RORT7klbs0BHyI3QCDYyq9YYarnT9Ew"
        type="text/javascript"></script> */


(function($) {
  var map; // current map
  var canvas;
	var markers=[]; // array of markers
  var infoWindow;
	var table="station";
  
	var num=1; //id
  var latlng;

  var methods = {
    /**	create new Google map at this using params
     	create infoWindow
     	
     	either lat: lng: or address:
     	
     	OPTIONS
     	type: roadmap, satellite, hybrid, terrain
     	zoom:
     	marker: if true draws marker at location
      display: true means draw the map @ opt.lat, opt.lng;
        usually no because first marker will draw it
    */
    init : function (params) {

////console.error("canv:",canvas,this[0].id);

      // new map?
      if (canvas!=this[0].id) {
        canvas=this[0].id;
        
				var gmt=google.maps.MapTypeId;
				var typ=[];
				typ["map"]=gmt.ROADMAP;
				typ["satellite"]=gmt.SATELLITE;
				typ["hybrid"]=gmt.HYBRID;
				typ["terrain"]=gmt.TERRAIN;

				var gmc=google.maps.MapTypeControlStyle;
				var styl=[];
				styl["menu"]=gmc.DROPDOWN_MENU;
				styl["bar"]=gmc.HORIZONTAL_BAR;
				styl["default"]=gmc.DEFAULT;
				
				var def_init = {
					type: "hybrid",
					style: "menu",
					marker: true,
          zoom: 12,
          display: true
        }
        
        opt=$.extend(def_init, params);
        opt.mapTypeId=typ[opt.type];
        opt.mapTypeControlOptions={style: styl[opt.style]};		
		
////console.log("new map:",this[0],opt);
      } else {
        
        // already have a map, so  updating
        var def_up = {
          map: map,
          display: true
        }
        opt=$.extend(def_up, params);
////console.log("update",params); ////////////////////////////
        
        if (opt.zoom) {
          opt.map.setZoom(opt.zoom);
        }

        return;
      }

console.log("this:",this, "opt:",opt); /////////////////////////////

      map = new google.maps.Map(this[0], opt);
      infoWindow = new google.maps.InfoWindow();

      if (opt.address) {
console.log("123 adr:",opt.address); //////////////////////
        geoCodify(opt); /* doesn't return if near is true , async anyway*/
				return false;
			}

			if (opt.display) {
				if (opt.marker) {
console.log("129 newmarker:", opt);
					newMarker2(opt); /* centers */
				} else {
					latlng = new google.maps.LatLng(opt.lat, opt.lng); 
console.log("133 center");
					map.setCenter(latlng); // display new map position
				}
			}
    },
		
    /**
     set single marker at obj.lat, obj.lng using obj.title
    */
    newMarker : function(obj) {
      newMarker2(obj);
    },
    
    /**
     set array of markers at lat,lng using title
     center map on center
    */
    setMarkers : function(params) {
      var def_set = {
				activate: 0 /* first one */
			}
      obj=$.extend(def_set, params);
			
console.error("tjMap markers",obj);
			$.each(obj.marks, function(key, val) { 
	      newMarker2(obj.marks[key]);
			});
			
			if (obj.activate==-1) {
				if (obj.center) {
					lat=obj.center.lat;
					lng=obj.center.lng;
				} else {
					lat=obj[0].lat;
					lng=obj[0].lng;
				}
			} else {
				lat=obj.marks[0].lat;
				lng=obj.marks[0].lng;
			}
			
			latlng=new google.maps.LatLng(lat, lng); 
			map.setCenter(latlng); // redraw map
			
			if (obj.icon) {
				var p=obj.center;
				p.icon=obj.icon;
				p.title=obj.title;
				newMarker2(p);
			}
    },
    
		/**
		 * center map at opt lat, lng
		 * 
		 * */
    centerMap : function(opt) {
			if (opt.center.lat) {
				lat=opt.center.lat;
				lng=opt.center.lng;
			} else {
				lat=opt.center[0];
				lng=opt.center[1];
			}
console.log("centerMap",opt,lat,lng);
			var latlng=new google.maps.LatLng(lat, lng); 
			map.setCenter(latlng); // display new position
			map.setZoom(opt.zoom);
		},
		
    /** geoCode
			address: anything - gets converted to lat,lng
			near: true = search nearby via ajax_getrec.php
			marker: true = show marker
			icon: custom marker
			title: optional title
			reset: false = add to existing layer
    */
    geoCode : function(params) {
			geoCodify(params);
		}
		
  };
	
  /* functions */
	// placeholder for defaults
	function fnNull() {	
	}

	/* geocode call is async */
	function geoCodify(params) {
		var def_geo = {
			lat: 0,
			lng: 0,
			formatted_address:"",
			near: false,
			reset: true,
			marker: true,
			title: "Current location",
			fnOK: newMarker2,		/* fnNull */
			fnFail: geoFail
		}
		gc=$.extend(def_geo, params);
console.log("fn geoCodify:", gc.address, gc.lat);
		if (gc.reset) {
			deleteOverlays();
console.log("post deleteOverlays",gc);
		}
		
		var geocoder = new google.maps.Geocoder();
console.error("243 var geocoder");

		geocoder.geocode({address: gc.address}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
console.error("geocodify okay"); //
				gc.lat= results[0].geometry.location.wa;
				gc.lng= results[0].geometry.location.ya;
				gc.formatted_address=results[0].formatted_address; /*  more later? */
console.log("geocodify ok:",gc.formatted_address); //

				if (gc.marker) {
					newMarker2(gc);
				} else {
					var latlng=new google.maps.LatLng(gc.lat, gc.lng); 
					map.setCenter(latlng);
				}
				
				if (gc.near) {
console.log("geo near",gc,results[0].geometry.location); //
					searchNear(gc, fnSearchOK);
				} else {
console.log("geo fnOK"); //
					gc.fnOK(gc);
				}
				
			} else {
console.log("geoCodify fail",gc);
				gc.fnFail(gc.address);
			}
		});
	}
	
	/* clear all markers */
	function deleteOverlays() {
		if (markers) {
			$.each(markers, function(i, val) {
				markers[i].setMap(null);
			});
			markers.length = 0;
		}
	}
	
  /**   */
  function fnSearchOK(rez) {
    alert("fnSearchOK"+rez);
  }

  function geoFail(adr) {
    alert("Unable to find\n"+adr);
  }
  
  $.fn.tjMap = function( method ) {
////console.error("method man:",method); /////////////////////////////
//////console.log("this:",this,"arg:",arguments); /////////////////////////////
    // defaults to init
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
////console.log("this:",this,"arg:",arguments); /////////////////////////////
      return methods.init.apply( this, arguments );
    }    
  };

	/*
		adds marker to map (assumes global map)
		at lat, lng (must be passed in via options)
		clickfn: js function to call on click
		title: hover
		drag_recode: true means drag updates DB
		Celtic Ct, Ramona is 33.01, -116.79
          title: "marker "+markers.length,
	*/
  function newMarker2(options){
		var def_mark = {
			latlng: "",
			lat: 33.01,
			lng: -116.79,
			num: -1,
			map: map,
			drag_recode: false,
			drag: false,
			zoom: -1,
			click: false
		}
		opt=$.extend(def_mark, options);

		if (opt.drag_recode===true) {
			opt.drag=true; 
		}
		if (opt.zoom>0) {
console.warn("fn newMarker2 zoom=>", opt.zoom);
			map.setZoom(opt.zoom); 
		}
console.log("fn newMarker=>", opt);
		
		newNum=1*opt.num;
		gotOne=-1;
		if (newNum>-1) {
//$.log("preeach:"+markers.length);
			$.each(markers, function(i, val) {
//$.log("scan gotOne:"+i+"="+val.num);
				if (val.num==newNum) {						
					gotOne=i;
					return false;
				}
			});
//$.log("post gotOne:"+gotOne);
		}

//console.error("fn newMarker=>", opt);

		opt.latlng=new google.maps.LatLng(opt.lat, opt.lng); 
		// display new map position
		opt.map.setCenter(opt.latlng);

		if (gotOne>-1) {
			markers[gotOne].title=opt.title; // changed?
			return;
		}

		var marker = new google.maps.Marker({
			title: opt.title,
			position: opt.latlng,
			num: newNum,
			map: opt.map,
			draggable: opt.drag,
			icon: opt.icon
		});
//$.log("push "+markers.length);
		markers.push(marker); 

		if (opt.click) {
			 google.maps.event.addListener(marker, 'click', function() {
				infoWindow.setContent(html);
				infoWindow.open(map, marker);
			});
		}
		
		if (opt.drag_recode) {
			google.maps.event.addListener(marker, 'dragend', function(){
				opt.lat=marker.position.wa;
				opt.lng=marker.position.ya;
console.log("tjMap saveGeo",opt);
				saveGeo(opt,1); // 1 means fine-tuned
			});
		}
	}

	/* */
	function searchNear(gc, fnOK) {
//////console.log("searchNear center:",center, gc); //wa, ya
		params="p=g:"+table+"&lat="+gc.lat+"&lng="+gc.lng+
		"&page="+gc.near.page+"&typ="+gc.near.type; // dist=
$.log("params:"+params); ////////////
		$.ajax({
			type: "POST",
			url: "site/tjMap_ajax.php",
			dataType: 'json',
			data: params,
			error: function(fld) {
$.log(fld,"err");
			},
			success: function(sJson){
				gc.fnOK(sJson);
				return;
				}
		
		})
		return;
	}

	/* */
	function saveGeo(opt,tuned) {
		params="p=u:"+table+":"+opt.num+
			"&lat="+opt.lat+"&lng="+opt.lng+"&geo="+tuned;

console.log("saveGeo opt=>",opt,params);
			
		$.ajax({
			type: "POST",
			url: "site/tjMap_ajax.php",
			dataType: 'json',
			data: params,
			error: function(fld) {
	$.log(fld.responseText,"err");
			},
			success: function(jsun){
	//		$.log ("ajax_set.php -->");
	$.log (jsun);
	$.log(jsun.status);
				opt.dis.data("lat",opt.lat);
				opt.dis.data("lng",opt.lng);
			}
		})
	}

})(jQuery);  
/*
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:
  
  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
*/
	/*		
		clearLocations(); //optional?
		var radius = document.getElementById('radiusSelect').value;

		var searchUrl = 'phpsqlajax_search.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
		downloadUrl(searchUrl, function(data) {
			
		var xml = parseXml(data);
		var markerNodes = xml.documentElement.getElementsByTagName("marker");
		var bounds = new google.maps.LatLngBounds();
		for (var i = 0; i < markerNodes.length; i++) {
			var name = markerNodes[i].getAttribute("name");
			var address = markerNodes[i].getAttribute("address");
			var distance = parseFloat(markerNodes[i].getAttribute("distance"));
			var latlng = new google.maps.LatLng(
					parseFloat(markerNodes[i].getAttribute("lat")),
					parseFloat(markerNodes[i].getAttribute("lng")));
	
			createOption(name, distance, i);
			createMarker(latlng, name, address);
			bounds.extend(latlng);
		}
		map.fitBounds(bounds);
	 });
*/
	/*
 $.log ("searchNear Json -->","err");
$.log (sJson);
$.log(sJson.sql);
				m=0;
$.log(sJson[m].name);
				id=sJson[m].id;

        var opt = {
					lat: center.wa,
          lng: center.ya,
          title: sJson[m].name,
          num: num
        };
////console.log("call newMarker opt",opt);
	      newMarker2(opt);
return;

// first place
            latlng = new google.maps.LatLng(sJson[0].lat,sJson[0].lng);
            map.setCenter(center);        
    
            marker = new google.maps.Marker({
             position: latlng, 
             map: map,
             draggable: true,
             title:sJson[0].name
            });
*/
