if( typeof nameSpace == 'undefined' ){
	nameSpace = {};
}

if( typeof nameSpace.modules == 'undefined' ){
	nameSpace.modules = {};
}

if( typeof $ == 'function' && typeof $$ == 'undefined' ){
	$(document).ready(function(){
		if( nameSpace.modules.googleMap.autoInit ){
			nameSpace.modules.googleMap.setMap();
			// controls
			nameSpace.modules.googleMap.addControl( nameSpace.modules.googleMap._CONTROLS_SMALLCONTROL );
			//nameSpace.modules.googleMap.addControl( nameSpace.modules.googleMap._CONTROLS_OVERVIEW );
			// markers
			for( i = 0; i < nameSpace.globalInfo.googMapInfo.length; i++ ){
				nameSpace.modules.googleMap.createMarker(nameSpace.globalInfo.googMapInfo[i].lat, nameSpace.globalInfo.googMapInfo[i].lon, {id:nameSpace.globalInfo.googMapInfo[i].id, name:nameSpace.globalInfo.googMapInfo[i].name, address:nameSpace.globalInfo.googMapInfo[i].address, toAddress:nameSpace.globalInfo.googMapInfo[i].toAddress});
			}
			
			
			
				// North America
			/*nameSpace.modules.googleMap.createMarker(33.93608567384134, -84.35023784637451, {id:'Atlanta', name:'Atlanta', address:'500 North Park Town Center<br>1100 Abernathy Road, N.E.<br>Suite 1200<br>Atlanta, Georgia 30328', toAddress:'500 North Park Town Center Atlanta, Georgia 30328'});
			nameSpace.modules.googleMap.createMarker(42.34668647695001, -71.0757628083229, {id:'Boston', name:'Boston', address:'Sapient<br>131 Dartmouth Street<br>3rd Floor<br>Boston, MA 02116', toAddress:'131 Dartmouth Street Boston, MA 02116'});
			nameSpace.modules.googleMap.createMarker(41.87933511293069, -87.63444721698761, {id:'Chicago', name:'Chicago', address:'200 West Adams Street<br>Suite 2700<br>Chicago, IL 60606', toAddress:'200 West Adams Street Chicago, IL 60606'});
			nameSpace.modules.googleMap.createMarker(39.75209183105176, -104.99718010425568, {id:'Denver', name:'Denver', address:'Sapient Denver<br>1730 Blake Street<br>Suite 400<br>Denver, CO 80202', toAddress:'1730 Blake Street Denver, CO 80202'});
			nameSpace.modules.googleMap.createMarker(29.75670281779729, -95.37019819021225, {id:'Houston', name:'Houston', address:'1200 Smith Street, Suite 1600<br>Houston, TX 77002 USA', toAddress:'1200 Smith Street, Houston, TX 77002 USA'});
			nameSpace.modules.googleMap.createMarker(38.93191650581907, -94.67705637216568, {id:'KansasCity', name:'Kansas City', address:'Executive Center II<br>10895 Lowell Ave, Suite 280<br>Overland Park, KS 66210', toAddress:'10895 Lowell Ave Overland Park, KS 66210'});
			nameSpace.modules.googleMap.createMarker(34.027855231889774, -118.47315609455109, {id:'LosAngeles', name:'Los Angeles', address:'1601 Cloverfield Blvd.<br>Suite 600 South<br>Santa Monica, CA 90404', toAddress:'1601 Cloverfield Blvd. Santa Monica, CA 90404'});
			nameSpace.modules.googleMap.createMarker(25.64972332421705, -80.33951461315155, {id:'MiamiFallsOffice', name:'Miami: Falls Office', address:'12910 S.W. 89 Ct.<br>Miami, FL 33176', toAddress:'12910 S.W. 89 Ct. Miami, FL 33176'});
			nameSpace.modules.googleMap.createMarker(25.603873619720247, -80.31350791454315, {id:'MiamiPalmettoBay', name:'Miami: Palmetto Bay', address:'17901 Old Cutler Road,<br>Suite 400 Palmetto Bay<br>Florida 33157', toAddress:'17901 Old Cutler Road Florida 33157'});
			nameSpace.modules.googleMap.createMarker(26.0169793908305, -80.14842599630356, {id:'Hollywood', name:'Hollywood', address:'2001 Tyler Street<br>Hollywood, FL 33020', toAddress:'2001 Tyler Street Hollywood, FL 33020'});
			nameSpace.modules.googleMap.createMarker(40.75088810386402, -73.99253100156784, {id:'NewYork', name:'New York', address:'One Penn Plaza<br>24th Floor<br>Suite 2400<br>New York, NY 10119', toAddress:'One Penn Plaza New York, NY 10119'});
			nameSpace.modules.googleMap.createMarker(37.7983591082679, -122.40291953086853, {id:'SanFrancisco', name:'San Francisco', address:'345 Broadway,<br>Suite 200<br>San Francisco,<br>CA 94133-4502', toAddress:'345 Broadway San Francisco, CA 94133-4502'});
			nameSpace.modules.googleMap.createMarker(43.64723028457626, -79.3956184387207, {id:'Toronto', name:'Toronto', address:'129 Spadina Ave.<br>Suite 500<br>Toronto, Ontario Canada<br>M5V 2L3', toAddress:'129 Spadina Ave. Toronto, Ontario Canada M5V 2L3'});
			nameSpace.modules.googleMap.createMarker(38.89117061286336, -77.08389222621918, {id:'WashingtonDC', name:'Washington D.C.', address:'1515 North Courthouse Road<br>7th Floor<br>Arlington, VA 22201-2909', toAddress:'1515 North Courthouse Road Arlington, VA 22201-2909'});
				// Europe
			nameSpace.modules.googleMap.createMarker(52.36513796010957, 4.898861646652222, {id:'Amsterdam', name:'Amsterdam', address:'Herengracht 574<br>1017 CJ Amsterdam', toAddress:'Herengracht 574 1017 CJ Amsterdam'});
			nameSpace.modules.googleMap.createMarker(51.21397426879787, 6.7547571659088135, {id:'Dusseldorf', name:'D&uuml;sseldorf', address:'Hammer Str. 19<br>40219 D&uuml;sseldorf<br>Germany', toAddress:'Hammer Str. 19 40219 D&uuml;sseldorf Germany'});
			nameSpace.modules.googleMap.createMarker(46.20730199250671, 6.144747734069824, {id:'Geneva', name:'Geneva', address:'Sapient Switzerland AG<br>c/o Florence Thi&eacute;baud advocates<br>rue du Cendrier 15<br>1201 Gen&egrave;va', toAddress:'rue du Cendrier 15 1201 Gen&egrave;va'});
			nameSpace.modules.googleMap.createMarker(51.498417756326035, -0.014333724975585938, {id:'London', name:'London', address:'1 Exchange Tower<br>Harbour Exchange Square<br>Limeharbour<br>London<br>E14 9GE', toAddress:'1 Exchange Tower Harbour Exchange Square Limeharbour London E14 9GE'});
			nameSpace.modules.googleMap.createMarker(48.13051567142859, 11.594996452331543, {id:'Munich', name:'Munich', address:'Kellerstra&szlig;e 27<br>81667 M&uuml;nchen<br>Germany', toAddress:'Kellerstra&szlig;e 27 81667 M&uuml;nchen Germany'});
			nameSpace.modules.googleMap.createMarker(59.34742507250007, 18.0375874042511, {id:'Stockholm', name:'Stockholm', address:'Sapient Sweden AB<br>H&auml;lsingegatan 40, 3rd floor<br>SE- 113 43, Stockholm<br>Sweden', toAddress:'Sapient Sweden AB H&auml;lsingegatan 40, 3rd floor SE- 113 43, Stockholm Sweden'});
			nameSpace.modules.googleMap.createMarker(47.361254751346735, 8.551654815673828, {id:'Zurich', name:'Zurich', address:'Sapient Switzerland AG<br>Regus Business Center<br>Seefeldstrasse 69<br>8008 Z&uuml;rich', toAddress:'Regus Business Center Seefeldstrasse 69 8008 Z&uuml;rich'});
				// asia
			nameSpace.modules.googleMap.createMarker(28.587131337916233, 77.32739925384521, {id:'Noida', name:'Noida', address:'Sapient<br>Green Boulevard (Tower C), 3rd & 4th Floor<br>Plot No. B-9A, Sector- 62<br>NOIDA, 201301<br>Uttar Pradesh, India', toAddress:'Plot No. B-9A, Sector- 62 NOIDA, 201301 Uttar Pradesh, India'});
			nameSpace.modules.googleMap.createMarker(12.970350998529472, 77.71232843399048, {id:'Bangalore', name:'Bangalore', address:'Salarpuria GR Tech Park<br>6th Floor, "VAYU" Block<br>#137, Bangalore South Taluk<br>Whitefield Main Road<br>Bangalore 560066<br>India', toAddress:'"VAYU" Block #137, Bangalore South Taluk Whitefield Main Road Bangalore 560066 India'});
			nameSpace.modules.googleMap.createMarker(28.534926666202843, 77.14707970619202, {id:'Delhi', name:'Delhi', address:'Sapient Towers D&amp;E<br>DLF Cyber Greens<br>DLF City Phase III<br>Sector 25-A<br>Gurgaon 122 002<br>Haryana<br>India', toAddress:'Sector 25-A Gurgaon 122 002 Haryana India'});
			
			nameSpace.modules.googleMap.createMarker(1.2815813333766721, 103.85205388069153, {id:'Singapore', name:'Singapore', address:'Level 25, North Tower<br>One Raffles Quay<br>Singapore 048583', toAddress:'One Raffles Quay Singapore 048583'});
			*/
		}
	});
}

nameSpace.modules.googleMap = 
{


	autoInit					: true,
	mapId						: 'map',
	directionsId				: 'directions',
	initialLat					: 35,
	initialLon					: 0,
	initialZoom					: 2,
	initialMarkerId				: '',
	_objMarkers					: {},
	_currentSettings 			: {},
	_initialLocationZoom		: 8,
	_CONTROLS_LARGECONTROL		: 'largeControl',
	_CONTROLS_SMALLCONTROL		: 'smallControl',
	_CONTROLS_SMALLZOOM			: 'smallZoom',
	_CONTROLS_SCALE				: 'scale',
	_CONTROLS_MAPTYPE			: 'mapType',
	_CONTROLS_HMAPTYPE			: 'hierarchicalMapType',
	_CONTROLS_OVERVIEW			: 'overviewMapControl',
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.setMap
	/////////////////////////////////////////////
	setMap : function( objOverride )
	{
		if(nameSpace.modules.googleMap.checkRequirements()){
			if( typeof objOverride == 'object' ){
				nameSpace.modules.googleMap.overrideParams( objOverride );
			}
			nameSpace.modules.googleMap._map = new GMap2(document.getElementById(nameSpace.modules.googleMap.mapId));
			nameSpace.modules.googleMap.setCenter();
			nameSpace.modules.googleMap.setCurrentSettings();
			nameSpace.modules.googleMap.performChecks();
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.checkRequirements
	/////////////////////////////////////////////
	checkRequirements : function() 
	{
		var message = '';
		
		if( typeof GMap2 != 'function' ){
			message += '* File is missing: http://maps.google.com/maps\n';
		}
		
		if( message != '' ){
			alert(message);
			return false;
		}
		
		return true;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.overrideParams
	/////////////////////////////////////////////
	overrideParams : function( e ) 
	{
		for( var i in e ){
			if( i[0] != '_' && typeof e[i] == typeof nameSpace.modules.googleMap[i] ){
				nameSpace.modules.googleMap[i] = e[i];
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.getMap
	/////////////////////////////////////////////
	getMap : function()
	{
		return nameSpace.modules.googleMap._map;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.setCenter
	/////////////////////////////////////////////
	setCenter : function( lat, lon, zoom )
	{
		if( typeof lat == 'undefined' ) lat = nameSpace.modules.googleMap.initialLat;
		if( typeof lon == 'undefined' ) lon = nameSpace.modules.googleMap.initialLon;
		if( typeof zoom == 'undefined' ) zoom = nameSpace.modules.googleMap.initialZoom;
		
		nameSpace.modules.googleMap.getMap().setCenter(new GLatLng(lat, lon), zoom);
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.checkInitialCenter
	/////////////////////////////////////////////
	checkInitialCenter : function()
	{
		var markerConfig;
		if( typeof nameSpace.modules.googleMap.initialMarkerId != 'undefined' ){
			markerConfig = nameSpace.modules.googleMap._objMarkers[nameSpace.modules.googleMap.initialMarkerId];
		}
		
		if( typeof markerConfig != 'undefined' ){
			nameSpace.modules.googleMap.initialLat = markerConfig.lat;
			nameSpace.modules.googleMap.initialLon = markerConfig.lng;
			nameSpace.modules.googleMap.initialZoom = nameSpace.modules.googleMap._initialLocationZoom;
			
			nameSpace.modules.googleMap.setCenter();
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.setCurrentSettings
	/////////////////////////////////////////////
	setCurrentSettings : function()
	{
		var oCenter = nameSpace.modules.googleMap.getMap().getCenter();
		
		nameSpace.modules.googleMap._currentSettings.lat = oCenter.lat();
		nameSpace.modules.googleMap._currentSettings.lon = oCenter.lng();
		nameSpace.modules.googleMap._currentSettings.zoom = nameSpace.modules.googleMap.getMap().getZoom();
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.panTo
	/////////////////////////////////////////////
	panTo : function( lat, lon ) 
	{
		nameSpace.modules.googleMap.getMap().panTo( new GLatLng(lat, lon) );
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.performChecks
	/////////////////////////////////////////////
	performChecks : function()
	{
		nameSpace.modules.googleMap.checkDirections();
	},
	
	/////////////////////////////////////////////
	// CONTROLS
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.addControl
	/////////////////////////////////////////////
	addControl : function( control, x ) 
	{
		var newControl;
		
		switch( control ){
			case nameSpace.modules.googleMap._CONTROLS_LARGECONTROL:
				newControl = new GLargeMapControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_SMALLCONTROL:
				newControl = new GSmallMapControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_SMALLZOOM:
				newControl = new GSmallZoomControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_SCALE:
				newControl = new GScaleControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_MAPTYPE:
				newControl = new GMapTypeControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_HMAPTYPE:
				newControl = new GHierarchicalMapTypeControl();
				break;
			case nameSpace.modules.googleMap._CONTROLS_OVERVIEW:
				newControl = new GOverviewMapControl();
				break;
		}
		
		if( typeof newControl != 'undefined' ){
			nameSpace.modules.googleMap.getMap().addControl(newControl);
		}
	},
	
	/////////////////////////////////////////////
	// MARKERS
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.setMarkerManager
	/////////////////////////////////////////////
	setMarkerManager : function() 
	{
		if( typeof MarkerManager == 'function' ){
			nameSpace.modules.googleMap._markerManager = new MarkerManager(nameSpace.modules.googleMap.getMap());
			nameSpace.modules.googleMap.createMarkerIcon();
		}
		else{
			alert('* File is missing: http://gmaps-utility-library.googlecode.com/svn/trunk/markermanager/release/src/markermanager.js');
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.createMarker
	/////////////////////////////////////////////
	createMarker : function( lat, lng, markerConfig )
	{
		if( typeof nameSpace.modules.googleMap._markerManager == 'undefined' ){
			nameSpace.modules.googleMap.setMarkerManager();
		}
		
		markerConfig = nameSpace.modules.googleMap.fixMarker( markerConfig, lat, lng );
				
		var latlng = new GLatLng(lat, lng);
		var marker = new GMarker(latlng, {icon: nameSpace.modules.googleMap.markerIcon});
		var html = nameSpace.modules.googleMap.createMarkerHTML( markerConfig );
		
		GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml(html);
        });
		
		nameSpace.modules.googleMap._markerManager.addMarker(marker, 0);
		nameSpace.modules.googleMap.logMarker( markerConfig );
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.fixMarker
	/////////////////////////////////////////////
	fixMarker : function( markerConfig, lat, lng )
	{
		markerConfig.lat = lat;
		markerConfig.lng = lng;
		
		if( typeof markerConfig.toAddress == 'undefined' && typeof markerConfig.address == 'string' ){
			markerConfig.toAddress = markerConfig.address.split('<br>', ' ');
		}
		
		return markerConfig;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.logMarker
	/////////////////////////////////////////////
	logMarker : function( markerConfig )
	{
		if( typeof markerConfig.id != 'undefined' ){
			var thisMarker = {};
			thisMarker.id = markerConfig.id;
			thisMarker.lat = markerConfig.lat;
			thisMarker.lng = markerConfig.lng;
			
			nameSpace.modules.googleMap._objMarkers[thisMarker.id] = thisMarker;
			
			if( nameSpace.modules.googleMap.initialMarkerId == thisMarker.id ){
				nameSpace.modules.googleMap.checkInitialCenter();
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.createMarkerIcon
	/////////////////////////////////////////////
	createMarkerIcon : function()
	{
		if( typeof nameSpace.modules.googleMap.markerIcon == 'undefined' ){
			var icon = new GIcon(G_DEFAULT_ICON);
			if( typeof nameSpace.globalInfo.URL != 'undefined' && typeof nameSpace.globalInfo.URL != 'undefined' ){
				icon.image = nameSpace.globalInfo.URL + 'assets/images/icon_gMap.png';
				icon.shadow = nameSpace.globalInfo.URL + 'assets/images/icon_gMapShadow.png';
				icon.iconSize = new GSize(34, 43);
				icon.shadowSize = new GSize(56, 43);
				icon.iconAnchor = new GPoint(17, 43);
				icon.infoWindowAnchor = new GPoint(0, 0);
				icon.infoShadowAnchor = new GPoint(0, 0);
			}
			nameSpace.modules.googleMap.markerIcon = icon;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.createMarkerHTML
	/////////////////////////////////////////////
	createMarkerHTML : function( markerConfig )
	{
		var name = markerConfig.name;
		var lat = markerConfig.lat;
		var lng = markerConfig.lng;
		
		html = '<br><form id="googleForm" action="globalOfficesNY.htm" method="get" target="_parent"><span style="font-size:16px;font-weight:bold;">' + name + '</span><br><br>' +
          		'<table ><tr><td></td><td style="font-size:11px;margin:0;padding:0;color:#999;" align="left">e.g. ' + name + 
				'</td></tr><tr><td align=left><b>Start address:</b></td><td align="left"><input type="text" SIZE=32 name="saddr" id="saddr" value="" /></td></tr><tr><td align="right" valign="top"><b>End address:</b></td><td style="color:#99b3cc;" align="left">' + markerConfig.address + '<br><INPUT style="margin:10px 10px -2px 0;background-color:#f0f0f0;" value="Get Directions" TYPE="SUBMIT" onclick="javascript: nameSpace.modules.googleMap.checkFormDirections(); return false;"></td></tr></table>' +'<input type="hidden" id="daddr" name="daddr" value="' + markerConfig.toAddress + 
           '"/>';
		
		return html;
	},
	
	/////////////////////////////////////////////
	// DIRECTIONS
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.initDirections
	/////////////////////////////////////////////
	initDirections : function() 
	{
		if( typeof nameSpace.modules.googleMap._directions == 'undefined' ){
			nameSpace.modules.googleMap._directions = new GDirections(nameSpace.modules.googleMap.getMap(), document.getElementById(nameSpace.modules.googleMap.directionsId));
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.getDirections
	/////////////////////////////////////////////
	getDirections : function() 
	{
		nameSpace.modules.googleMap.initDirections();
		return nameSpace.modules.googleMap._directions;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.setDirections
	/////////////////////////////////////////////
	setDirections : function( from, to ) 
	{
		$('#' + nameSpace.modules.googleMap.directionsId).addClass('active');
		nameSpace.modules.googleMap.getDirections().load("from: " + from +" to: " + to);
		nameSpace.modules.googleMap._markerManager.clearMarkers();
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.checkDirections
	/////////////////////////////////////////////
	checkDirections : function()
	{
		var objURL = nameSpace.modules.googleMap.parseURL();
		if( typeof objURL.saddr != 'undefined' && typeof objURL.daddr != 'undefined' ){
			var toAddr = objURL.daddr.split('%2C')
			toAddr = toAddr[0] + ',' + toAddr[1];
			nameSpace.modules.googleMap.setDirections( objURL.saddr, toAddr );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.checkDirections
	/////////////////////////////////////////////
	checkFormDirections : function()
	{
		nameSpace.modules.googleMap.setDirections( $('#saddr').val(), $('#daddr').val() );
		
		return false;
	},
	
	/////////////////////////////////////////////
	// GLOABL
	/////////////////////////////////////////////
	// Function - nameSpace.modules.googleMap.parseURL
	/////////////////////////////////////////////
	parseURL : function() 
	{
		var objURL = {};
		var arrURL = (location.href.indexOf("?")!==-1) ? location.href.split('?')[1].split('&') : [];
		
		if( arrURL.length != 0 ){
			for( var i = 0; i < arrURL.length; i++ ){
				objURL[ arrURL[i].split('=')[0] ] = (arrURL[i].indexOf("=")) ? arrURL[i].split('=')[1] : "";
			}
		}
		
		return objURL;
	}
};