function Gmap(config,canvas,options){var debug=false;this.howto=(debug)?new Man():function(fn){return alert('error in fn: '+fn)};if(arguments.length===0){return this.howto.man('Gmap');}
this.conf={ico:'/img/marker.png',canvas:(arguments[1]!==undefined&&arguments[1]!==null)?canvas:'mapcanvas'};if(document.getElementById(this.conf.canvas)===null||document.getElementById(this.conf.canvas)===undefined){return alert('element with id "'+this.conf.canvas+'" doesn\'t exits in document!\ncreate it first please.');}
this.map=null;this.markers=[];this.options={zoom:15,navigationControl:true,mapTypeControl:false,scrollwheel:false,streetViewControl:true,backgroundColor:'#ffffff',mapTypeControlOptions:{style:google.maps.MapTypeControlStyle.DROPDOWN_MENU,position:google.maps.ControlPosition.TOP_RIGHT},navigationControlOptions:{style:google.maps.NavigationControlStyle.DEFAULTS,position:google.maps.ControlPosition.RIGHT_CENTER},mapTypeId:google.maps.MapTypeId.ROADMAP}
this.init=function(obj,canvas){var config=this.parse_config(obj),Map=this.create_map(config,this.options,canvas),markers=[];this.map=Map;this.conf=config;if(config.hasOwnProperty('markers')){for(var m=0;m<config.markers.length;m++){markers.push(this.add_marker(config.markers[m]));}}
this.markers=markers;var result=[Map.map,markers];return result;}
this.parse_config=function(obj){var config={},marks=[],icon;if(obj.hasOwnProperty('markers')){for(var m=0;m<obj.markers.length;m++){if(obj.markers.hasOwnProperty(m)){marks.push(obj.markers[m]);}}
config.markers=marks;}
if(obj.hasOwnProperty('lat')&&obj.hasOwnProperty('lng')){config.latlng={lat:obj.lat,lng:obj.lng};if(!marks.length){}}else if(marks.length){config.latlng={lat:marks[0].lat,lng:marks[0].lng};}else{return false;}
config.ico=obj.hasOwnProperty('ico')?obj.ico:null;return config;}
this.extend=function(opt){for(var o in opt){this.options[o]=opt[o];}}
var make_marker=function(conf,ico){var i={map:conf.m,position:conf.mark,animation:google.maps.Animation.BOUNCE,optimized:true,draggable:false}
if(ico!==null)i.icon=ico
var spriteMarker=new google.maps.Marker(i);return spriteMarker;}
this.add_marker=function(marker,icon){if(arguments.length===0){return this.howto.man('addMarker');}
var MarkerIcon=null,MarkerLatlng=null,marks={m:this.map};if(marker.hasOwnProperty('lat')){MarkerLatlng=new google.maps.LatLng(marker.lat,marker.lng);}else if(marker.hasOwnProperty('Ha')){MarkerLatlng=marker;}
marks.mark=MarkerLatlng;if(arguments.length===2){this.conf.ico=icon;}
if(this.conf.ico!==null){var ico=this.conf.ico,key=['size','origin','anchor'],path=(ico.hasOwnProperty('path'))?ico.path:ico;if(typeof path!=='string'){return'Invalid icon path!';}
MarkerIcon=new google.maps.MarkerImage(path);if(typeof ico!=='string'){for(var i=0;i<key.length;i++){if(!ico.hasOwnProperty(key[i])){return'Invalid icon properties!';}else if(ico[key[i]].length!==2){return'Invalid icon properties!';}}
MarkerIcon.size=new google.maps.Size(ico.size[0],ico.size[1]);MarkerIcon.origin=new google.maps.Point(ico.origin[0],ico.origin[1]);MarkerIcon.anchor=new google.maps.Point(ico.anchor[0],ico.anchor[1]);}}
return make_marker(marks,MarkerIcon);}
this.create_map=function(config,Options,canvas){var Map=null,rendererOptions={draggable:true},Latlng=new google.maps.LatLng(config.latlng.lat,config.latlng.lng);Options.center=Latlng;Map=new google.maps.Map(document.getElementById(canvas),Options);google.maps.event.trigger(Map,'resize');return Map;}
this.geocode=function(address,type){if(arguments.length===0){return this.howto.man('geocode');}
var geocoder=new google.maps.Geocoder(),query={},gmap=this,result,infowindow=new google.maps.InfoWindow();query[type]=address;var callback=function(results,status){if(status==google.maps.GeocoderStatus.OK){result=results[0].geometry.location;var mark=gmap.add_marker(result);gmap.map.panTo(result);infowindow.setContent(results[0].formatted_address+'<br />'+address);infowindow.open(gmap.map,mark);return result;}else{result="Geocode was not successful for the following reason: "+status;alert(result);return result;}}
geocoder.geocode(query,callback);}
this.zoom=function(level){if(arguments.length===0){return this.howto.man('zoom');}
if(typeof level!=='number'){return'NaN';}
this.map.setZoom(parseInt(level,10));return'zoom level is '+parseInt(level,10);}
this.map_type=function(mapType){if(arguments.length===0){return this.howto.man('mapType');}
if(google.maps.MapTypeId.hasOwnProperty(mapType)){this.map.setMapTypeId(google.maps.MapTypeId[mapType]);return'current mapTypeID is '+google.maps.MapTypeId[mapType];}
return false;}
if(arguments[2]!==undefined&&arguments[2]!==null){this.extend(options);}
this.init(config,this.conf['canvas']);}
