function ImagePreloader(){
Image1 = new Image();
Image2 = new Image();
Image1.src = "../images/btn_Close_on.gif";
Image2.src = "../images/btn_Send_on.png";
}
ImagePreloader();

var map;
var gdir;
var ddir;
var pointA, pointB;
var poi;
var mapIsShowing;
var nohighway;
var gmarkers;
var to_htmls;
var from_htmls;
var html;
var searcher;
var geocoder = new GClientGeocoder;
var div_map = "map";
var div_resultList = "results";
var div_search = "searchform";
var div_directions = "directions"
var div_search_result ="searchwell"
var newLocation;
// === Array for decoding the failure codes ===
var reasons=[];
reasons[G_GEO_SUCCESS]            = "Success";
reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
reasons[G_GEO_UNKNOWN_DIRECTIONS] = "The GDirections object could not compute directions between the points.";


google.load('search' , '1');

google.setOnLoadCallback(init);

function initialize( pointA_, pointB_, poi_ , nohighway_) {
  
  pointA = pointA_;
  pointB = pointB_;
  poi = poi_;

  nohighway = ( nohighway_==1 );
  if (GBrowserIsCompatible()) {
    variables();
    //Setup Listeners
    GEvent.addListener(gdir, "error", onGetDirectionsError );  
    GEvent.addListener(gdir,"load", onGetDirectionsLoad);

    //Setup Listeners
    GEvent.addListener(ddir, "error", onDrivingDirectionsError );  
    GEvent.addListener(ddir,"load", onDrivingDirectionsLoad);
    //get directions from pointA to pointB
    getDirections( pointA, pointB );
  } else {
    alert("Sorry, the Google Maps API is not compatible with this browser");    
  }
}

// URL Encoder
function valueOrDefault(def, val) {
    if (def == undefined){ def = "";}
    return val == undefined ? def : val;
}

function urlencode (str) {
    str = (str+'').toString();
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}


//search api loaded
function init(){}

function pausecomp(millis) {
	var date = new Date();
	var curDate = null;
	do { curDate = new Date(); } 
	while(curDate-date < millis);
} 

function calcHeight()
{
//find the height of the internal page
var the_height = document.getElementById('the_iframe').contentWindow.document.body.scrollHeight;

//change the height of the iframe
document.getElementById('the_iframe').height=the_height;
}

// Geocoder Started
function getReverseGC(lat,lng){
      latlng = new GLatLng(lat, lng);
      if (latlng) {
        geocoder.getLocations(latlng, function(addresses) {
          if(addresses.Status.code != 200) {
            //alert("reverse geocoder failed to find an address for " + latlng.toUrlValue());
            newLocation = "Error"
          }
           else {
            address = addresses.Placemark[0];
		    newLocation = address.address;
			$("#mid_point_data").html(newLocation);
			searchAddress = newLocation.split(',')
			q = $("#q").val()
			$("#q").val(q + 'near ' + searchAddress[1]+ "," + searchAddress[2]);


			
			// Advertising Module Fill in
			// Add City try real city name if not go for the region
			try {adCity = valueOrDefault(address.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName);}
			catch(err){adCity = " ";}
			
			if (adCity == " "){
			try {adCity = valueOrDefault(address.AddressDetails.Country.AdministrativeArea.Locality.LocalityName);}
			catch(err){adCity = "  ";}
			}
			
			var region = searchAddress[1];
			if (adCity == "  "){
			try {adCity = region.ltrim();}
			catch(err){adCity = "   ";}
			}			
			
			// Add State Name
			try {adState = valueOrDefault(address.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName);}
			catch(err){adState = "";}
			
			// Add Country Code
			try {adCountry = valueOrDefault(address.AddressDetails.Country.CountryNameCode);}
			catch(err){adCountry = "";}
			
			// Add Zipcode
			try {adZip = valueOrDefault(address.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber);}
			catch(err){adZip = "";}
			
			
			//alert(address.address);
			//amp_city = '111111';
			//alert(amp_city);
			//amp_city = '22222';
			
			var keyword =  $("#advert-key").val();
			w =  urlencode(keyword);
			zone = 0;
			city = adCity.replace(' ','+');
			state = urlencode(adState);
			country = urlencode(adCountry);
			zip = urlencode(adZip);
			ad_type = "11";
			shape = "1";
			c_border = "f2f2f2";
			c_background = "e9edf2";
			c_text1 = "3c4957";
			c_text2 = "000000";
			c_text3 = "000000";
			c_text4 = "228822";
			c_text5 = "000000";
			c_text6 = "000000";
			c_text7 = "000000";
			c_text8 = "000000";
			c_text9 = "000000";
			c_text10 = "000000";
			$("#mw-sponsored-results").html('<iframe src="http://www.meetways.com/amp/show.php?z='+zone+'&w='+w+'&state='+state+'&country='+country+'&city='+city+'&zip='+zip+'&ad_type='+ad_type+'&shape='+shape+'&c_border='+c_border+'&c_background='+c_background+'&c_text1='+c_text1+'&c_text2='+c_text2+'&c_text3='+c_text3+'&c_text4='+c_text4+'&c_text5='+c_text5+'&c_text6='+c_text6+'&c_text7='+c_text7+'&c_text8='+c_text8+'&c_text9='+c_text9+'&c_text10='+c_text10+'&code='+new Date().getTime()+'" id="the_iframe" onLoad="calcHeight();" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" allowtransparency="yes" height="1" width="295" style="margin-bottom:10px;"></iframe>');
			pausecomp(1000);
			$("#mw-sponosred-text").html('Powered by:');
			$("#mw-sponsored-banner").html('<iframe src="http://www.meetways.com/amp/show1.php" width="150" height="39" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe>');

			
		  }
        });
      }	  
	}

/**
 * Function to create a pin. 
 */
function createMidPointMarker( point ) {
  var marker = new GMarker(point, getMidPointPin() );
  var i = gmarkers.length;
    //click listener.
    GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml( "<div style='font-size:12px; width:150px;'><strong>Meet me here!</strong><br />" + newLocation + "</div>");}) 
    gmarkers.push(marker);
  return marker;
}

/**
 * Function to request directions 
 * -pointA, coords, address, zipcode, etc. 
 * -pointB, coords, address, zipcode, etc. 
 */
function getDirections( pointA_, pointB_ ) {
  var opts = {};
  opts.getPolyline = true;
  opts.getSteps=true;
  opts.avoidHighways = nohighway;
  gdir.loadFromWaypoints([ pointA_, pointB_ ], opts);
}     


var searchIteration =0;
var searchIterationPoints=[];
var searchIterationPoi =  [];
var searchIterationMarker=[];
var searchIterationMarkup='';

var lockSearch = false;
/**
 * Function to paint the map. 
 */
function onGetDirectionsLoad(){
  //MIDPOINT
  p = gdir.getPolyline().GetPointAtDistance(gdir.getDistance().meters/2);
  map.addOverlay( createMidPointMarker( new GLatLng( p.lat(), p.lng() ) ) );
  if( lockSearch ) {lockSearch = false;return;}
  doSearch( poi, p.lat().toFixed(6) , p.lng().toFixed(6) );
  return;
  
  searchControl = new google.search.SearchControl();
  searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
 
  searcher = new google.search.LocalSearch(); 
  searchControl.addSearcher( searcher, options );
  var options = new google.search.SearcherOptions();
  options.setExpandMode( google.search.SearchControl.EXPAND_MODE_OPEN );
  searchControl.setSearchCompleteCallback( searcher , iterationSearchResults );
  searchControl.draw($("#div_search"));
  searcher.setCenterPoint( map );
  searchIteration =0;
  if( lockSearch ) {lockSearch = false;return;}
  iterateSearch();
  lockSearch = false;
}


var searchControl;
function iterateSearch() {
  if(searchIteration>4){
    getDirections(pointA,pointB);
    $("#div_search_result").html(searchIterationMarkup);
    for(i=0;i<searchIterationMarker.length;i++) {
     map.addOverlay( searchIterationMarker[i] );
    }
    return;
  }
  doIterationSearch( poi, searchIterationPoints[searchIteration].lat().toFixed(6) , searchIterationPoints[searchIteration].lng().toFixed(6) );
}

function doIterationSearch( poi, lat, lng ) {
  map.setCenter(new google.maps.LatLng( lat , lng ),40); 
  searchControl.execute( poi );
}

/**
 * Function with the search results. 
 */
function iterationSearchResults() {
    var results = searcher.results;
    var resultMarkup='';
    for (var i = 0; i < results.length; i++) {
      if( i>2 ){continue;}
      var result = results[i]; 
      var markerLatLng = new GLatLng( parseFloat( result.lat ), parseFloat( result.lng ) );
      searchIterationMarker.push( new google.maps.Marker( markerLatLng,getResultPin(i) ) );
      resultMarkup+=addResultRow( result, (i+1) );
    } 
    searchIterationMarkup+= resultMarkup;
    searchIteration++;
    iterateSearch();
}


/**
 * Search. 
 * -poi: keyword to search ( point of interest )  
 * -lat: latitude of the search area
 * -lng: longitude of the search area
 */
function doSearch( poi, lat, lng ) {
  getReverseGC( lat, lng )
  var searchControl = new google.search.SearchControl();
  searcher = new google.search.LocalSearch(); 
  searcher.setCenterPoint(lat + ',' + lng);
  var options = new google.search.SearcherOptions();
  options.setExpandMode( google.search.SearchControl.EXPAND_MODE_OPEN );
  searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
  searchControl.addSearcher( searcher, options );
  searchControl.setSearchCompleteCallback( searcher , searchResults );
  searchControl.draw($("#div_search"));
  //zoom... 1 = space   20 = street
  map.setCenter(new google.maps.LatLng( lat , lng ), 10); 
  searchControl.execute( poi );
}

/**
 * Function with the search results. 
 */
function searchResults() {
    searchIteration++;
    
    mapIsShowing = true;
    var results = searcher.results;
    var resultMarkup='';
    for (var i = 0; i < results.length; i++) {
      var result = results[i]; 
      var markerLatLng = new GLatLng( parseFloat( result.lat ), parseFloat( result.lng ) );
      var marker = new google.maps.Marker( markerLatLng,getResultPin(i) );
      resultMarkup+=addResultRow( result, (i+1) );
      map.addOverlay( marker );
	  marker.bindInfoWindow(result.html.cloneNode(true));
    }
    document.getElementById(div_search_result).innerHTML = resultMarkup; // <-- ahi se creean los links
    //assignLinkCalls();
    //document.getElementById(div_search_result).innerHTML+=showListButton();
}


function showListButton() {

}

function showResultList() {
var mapResults  = document.getElementById(div_map);
var listResults = document.getElementById(div_resultList);
  if( mapIsShowing ) {
	  mapResults.style.display = "none";
	  listResults.style.display = "block";
    mapIsShowing = false;
  } else {
	mapResults.style.display = "block";
    listResults.style.display = "none";
	searchResultsBack()
    mapIsShowing = true;
	}	
}

function searchResultsBack(){
 document.getElementById('searchwell').style.display = 'block';
 getDirections(pointA,pointB);
 document.getElementById('mw-driving-directions').style.display = 'none';
}

function onDrivingDirectionsError() {}

function onDrivingDirectionsLoad(result) {
	
	var steps = ddir.getRoute(0).getNumSteps();
	
		var directions = ""; 
		
		directions +='<table border="0" cellpadding="0" cellspacing="0" style="width:100%; margin-left:-5px;">';
		directions +='	<tr>';
		directions +='		<td colspan="3" style="padding-bottom:10px; padding-top:10px; padding-left:10px; border-bottom:1px solid #b6b6b6;">';
		directions +='			<span style="font-size:13px;">Driving directions from:</span><br /><strong>'+_pointA+'</strong><br />';
		directions +='			Total Distance: <strong>'+ddir.getRoute(0).getDistance().html+'</strong><br />'; 
		directions +='		</td>';
		directions +='	</tr>';
		directions +='	<tr>';
		directions +='	</tr>';
	for(i=0;i<steps;i++){
		//console.log(ddir.getRoute(0).getStep(i).getDistance());
		directions +='	<tr>';
		directions +='		<td class="driving-steps">';
		directions +=			(i+1)+'. ';
		directions +='		</td>';
		directions +='		<td class="driving-steps-route">';
		directions +=			ddir.getRoute(0).getStep(i).getDescriptionHtml();
		directions +='		</td>';
		directions +='		<td class="driving-miles">'+ddir.getRoute(0).getStep(i).getDistance().html+'</td>' // WEBAS
		directions +='	</tr>';
	}
		directions +='	<tr>';
		directions +='		<td colspan="3" style="padding-bottom:10px; padding-top:10px;">';
		directions +='			<div class="browser-list-container-res" style="margin-left:-10px;">';
		directions +=				document.getElementById(resultSelection).innerHTML;
		directions +='			</div>';
		directions +='		</td>';
		directions +='	</tr>';
		directions +='</table>';
		directions +='';
		directions +='<div style="text-align:center; margin-bottom:10px; margin-top:10px;"><a href="javascript:searchResultsBack()"><strong>Back to Results</strong></a></div>';
		directions +='<div style="font-size:11px; padding:6px; color:#b1b1b1; margin:0px auto;">These directions are for planning purposes only. You may find that construction projects, traffic, weather, or other events may cause conditions to differ from the map results, and you should plan your route accordingly. You must obey all signs or notices regarding your route.<br /><br />Map data &copy; 2012</div>';
		
		document.getElementById('searchwell').style.display = 'none';
		document.getElementById('mw-driving-directions').style.display = 'block';
		document.getElementById('mw-driving-directions').innerHTML = directions;
	}
/**
 * Function to request directions 
 * -pointA, coords, address, zipcode, etc. 
 * -pointB, coords, address, zipcode, etc. 
 */
var resultSelection='';
var _pointA;
function getDrivingDirections( pointA_, pointB_ ) {

  var opts = {};
  opts.getPolyline = true;
  opts.getSteps=true;
  opts.avoidHighways = nohighway;
// ADD WALKING DIRECTIONS OPTION
//  opts.travelMode = G_TRAVEL_MODE_WALKING;
  _pointA = (pointA_==1)?pointA:pointB;
  ddir.loadFromWaypoints([ _pointA, pointB_ ], opts);
}
/**
 * Function that grabs the driving directions 
 */
function drivingDirections(start,end, resultSelection_) {
  resultSelection = resultSelection_;
  getDrivingDirections(start,end);
}
// jQuey to add an effect when toggling between map and driving directions not being used.
//function assignLinkCalls(){
//  	$("#searchwell").find("a").click(function () {
//	$(".resultspanel").toggle("slow");
//  });
//}

/**
 * function  to add the result row to the sidebar
 */
function addResultRow( result, i ) {
  var addr = result.addressLines;
  var city = result.city;
  var streetAddress = result.streetAddress;
  var region = result.region;
  var country = result.country;
  var phone=(result.phoneNumbers)?result.phoneNumbers[0]['number']:"";
  var title=result.titleNoFormatting;
  var maplink=result.url;
  var countryCode = address.AddressDetails.Country.CountryNameCode;
  //var zipCode = address.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
  try {zipCode = valueOrDefault(address.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber);}
			catch(err){zipCode = " ";}
  //console.log(result);
  if (region == ''){region = ''} else {region = ', '+result.region}
  if (country == ''){country = ''} else {country = ', '+result.country}
  
  	output = '<div id="browser-list-container'+i+'" class="result browser-list-container">';
  	output+= '<table border="0" cellpadding="0" cellspacing="0" style="width:100%;">';
	output+= '	<tr>';
	output+= '		<td style="width:35px; vertical-align:top; text-align:center;"><img src="../images/pins/'+i+'.png"></td>';
  	output+= '		<td>';
	output+= '			<a target="_blank" href="'+maplink+'"><strong>'+title+'</strong></a><br />';
	output+= '			'+streetAddress+'<br />';
  	output+= '			'+city + region + country+'<br />';
  	if (phone){
	output+= '			Phone: '+phone+'<br />';
	}
	if (!phone){
	output+= '			<br />';
	}
	output+= '			<div id="browser-links-container">';
	output+= '				<div class="browser-driving-directions-title"></div>';
	output+= '				<div class="browser-driving-directions-point"><a href="javascript:drivingDirections(1,\''+result.lat+','+result.lng+'\',\'browser-list-container'+i+'\')"><img border="0" class="browser-list-links" src="../images/res_PointA.gif" style="width:42px; height:5px; vertical-align:top; padding-top:3px;" alt="" /></a></div>';
	output+= '				<div class="browser-driving-directions-point"><a href="javascript:drivingDirections(2,\''+result.lat+','+result.lng+'\',\'browser-list-container'+i+'\')"><img border="0" class="browser-list-links" src="../images/res_PointB.gif" style="width:42px; height:5px; vertical-align:top; padding-top:3px;" alt="" /></a></div>';
// Google Reviews
//	output+= '				<div class="browser-driving-directions-reviews"><a target="_blank" href="'+maplink+'&dtab=2&oi=md_reviews"><img border="0" class="browser-list-links" src="../images/res_Reviews.gif" style="width:37px; height:5px; vertical-align:top; padding-top:3px;" alt="" /></a></div>';
// Yelp review by name and location
//	output+= '				<div class="browser-driving-directions-reviews"><a href="review.php?title='+title+'&location='+streetAddress+'%2A'+city + region + country+'&maplink='+escape(maplink)+'"><img border="0" class="browser-list-links" src="../images/res_Reviews.gif" style="width:37px; height:5px; vertical-align:top; padding-top:3px;" alt="" /></a></div>';
// Yelp review by phone
	output+= '				<div class="browser-driving-directions-reviews"><a href="MeetWays_Business_Review.php?phone='+escape(phone)+'&cc='+countryCode+'&maplink='+escape(maplink)+'&keyword='+escape(poi)+'&state='+escape(region)+'&city='+escape(city)+'&zip='+escape(zipCode)+'&title='+escape(title)+'"><img border="0" class="browser-list-links" src="../images/res_Reviews.gif" style="width:37px; height:5px; vertical-align:top; padding-top:3px;" alt="" /></a></div>';
	output+= '			</div>';
	output+= '		</td>';
  	output+= '	</tr>';
	output+= '</table>';
	output+= '</div>';
	
  return output;
}

/**
 * Function to catch errors ( if any ) 
 */
function onGetDirectionsError(){
  var code = gdir.getStatus().code;
  var reason="Code "+code;
  if (reasons[code]) {
    reason = reasons[code]
  } 
  
  
  document.getElementById('LoadingResults').innerHTML = "Please Try Again";
  document.getElementById('mid_point_data').innerHTML = "No Data";
  mapError = document.getElementById('map')
  mapError.style.display = 'none';
  browserErrorDiv = document.getElementById('browser-no-directions')
  browserErrorDiv.style.display = 'block';
  document.getElementById('error-list').innerHTML = '<strong>Message:</strong> '+reason+'<br /><br /><a style="font-weight:bold;" href="index.php">Try Again</a>'
  //("Failed to obtain directions: "+reason);
}
/**
 * Function to create the map and set the properties. 
 */
function createMap( div_id ) {
  _map = new GMap2( document.getElementById( div_id ) );
  _map.addControl(new GLargeMapControl3D())
  _map.addMapType(G_PHYSICAL_MAP);
  _map.addControl(new google.maps.MenuMapTypeControl());
  _map.clearOverlays();
  return _map;
}  
/**
 * function to initialize global variables
 */
function variables() {
    map = createMap( div_map );
    gdir= new GDirections(map, document.getElementById( div_directions ));
    ddir= new GDirections(map, document.getElementById( div_directions ));
    gmarkers = [];
    to_htmls = [];
    from_htmls = [];
    htmls = [];  
}

function getMidPointPin(){
  _pin = new GIcon();
  _pin.image = "images/pins/mw-pin.png";
  _pin.shadow = "images/pins/mw-pin-shadow.png";
  _pin.iconSize = new GSize(22, 44);
  _pin.shadowSize = new GSize(34, 44);
  _pin.iconAnchor = new GPoint(12, 34);
  _pin.infoWindowAnchor = new GPoint(12,2); 
  return _pin;
}

function getResultPin(i){
  _pin = new GIcon();
  _pin.image = "images/pins/"+(i+1)+".png";
  _pin.shadow = "images/pins/mw-flag-shadow.png";
  _pin.iconSize = new GSize(15, 30);
  _pin.shadowSize = new GSize(29, 30);
  _pin.iconAnchor = new GPoint(9, 34);
  _pin.infoWindowAnchor = new GPoint(9, 2);
  return _pin;
}	
