/*jshint asi: false, bitwise: true, boss: false, curly: true, debug: false, devel: false, eqeqeq: true, evil: false, forin: true, immed: true, laxbreak: false, newcap: true, noarg: true, noempty: true, nonew: true, nomen: true, onevar: true, plusplus: true, regexp: false, undef: true, sub: false, strict: true, white: false*/
/*global jQuery, console, baseUrl, window, google */
(function ($) {	
	"use strict";
	
	var geocoder,
	
	getLocation		=	function (address, callback) {
		if (!geocoder) {
			geocoder	=	new google.maps.Geocoder();
		}
		
		geocoder.geocode(
			{ "address": address },
			function (point) {
				callback({
					"lat":		point[0].geometry.location.lat(),
					"lng":		point[0].geometry.location.lng()
				});
			}
		);
	},
	
	gMaps			=
	window.gMaps		=	function ($el, address) {
		var methods, map, marker;
		
		methods		=	{
			"init":			function ( ) {
				getLocation(address, function (point) {
					methods.initMap(point);
					methods.addMarker(point);
				});
				return methods;
			},
			"initMap":		function (point) {
				map	=	new google.maps.Map(
					$el[0],
					{
						"zoom":		15,
						"center":	new google.maps.LatLng(point.lat, point.lng),
						"mapTypeId":	google.maps.MapTypeId.ROADMAP
					}
				);
			},
			"addMarker":		function (point) {
				marker	=	new google.maps.Marker({
					"position":	new google.maps.LatLng(point.lat, point.lng),
					"icon":		new google.maps.MarkerImage(
						baseUrl + "/images/marker.png",
						new google.maps.Size(32, 32, "px", "px"),
						new google.maps.Point(0, 0),
						new google.maps.Point(16, 32),
						new google.maps.Size(32, 32, "px", "px")
					),
					"map":		map
				});
			},
			"map":			function ( ) {
				return map;
			},
			"marker":		function ( ) {
				return marker;
			}
		};
		
		return methods.init();
	},
	
	gStreetview		=	
	window.gStreetview	=	function ($el, address) {
		var methods, streetview, marker;
		
		methods		=	{
			"init":			function ( ) {
				getLocation(address, function (point) {
					methods.initStreetview(point);
					methods.addMarker(point);
				});
				return methods;
			},
			"initStreetview":	function (point) {
				streetview	=	new google.maps.StreetViewPanorama(
					$el[0],
					{
						"position":	new google.maps.LatLng(point.lat, point.lng)
					}
				);
			},
			"addMarker":		function (point) {
				marker	=	new google.maps.Marker({
					"position":	new google.maps.LatLng(point.lat, point.lng),
					"icon":		new google.maps.MarkerImage(
						baseUrl + "/images/marker.png",
						new google.maps.Size(32, 32, "px", "px"),
						new google.maps.Point(0, 0),
						new google.maps.Point(16, 32),
						new google.maps.Size(32, 32, "px", "px")
					),
					"map":		streetview
				});
			},
			"streetview":		function ( ) {
				return streetview;
			},
			"marker":		function ( ) {
				return marker;
			}
		};
		
		return methods.init();
	};
	
}(jQuery));

