(function($) {
//Global variables
var markersCluster_common = {};
var map_common;
var icons_common = {};
var gLocalSearch_common;
var currentLocalSearchStr_common;
var serviceIcons_common = {};
var serviceIcons_map_common = {};
//var serviceIconPath = '/modules/gmapSearch2/icons_small';
var serviceIconPath_common = '/modules/free_home_valuation/images/icons'; 
var panorama_common;
//queue for searches
var searchQueue_common =[];
var markersStorage_common = {};
var myPano_common;
var infowindow_common = new google.maps.InfoWindow({content: ''});
var marker_common;

intialize_commonmap = function(map_selector,variable){
     // Define the latitude and longitude positions
    var module = variable['mymodule'];
    var latitude = ''; // Latitude get from above variable
    var longitude = ''; // Longitude from same
    if(typeof(variable['lat']) != "undefined" && variable['lat'] !== null) {
            latitude = parseFloat(variable['lat']);
    }
    if(typeof(variable['lng']) != "undefined" && variable['lng'] !== null) {
            longitude = parseFloat(variable['lng']);
    }
    var zoom_int = 13;
    if(typeof(variable['zoom']) != "undefined" && variable['zoom'] !== null) {
        zoom_int = variable['zoom'];
    }
    var latLong = new google.maps.LatLng(latitude, longitude);// Set up options for the Google map
    var myOptions = {
            center : latLong,
            mapTypeControl: false,
            panControl : true,
            zoomControl : true,
            scrollwheel : false,
            streetViewControl : false,
            zoom : zoom_int,
            mapTypeId : google.maps.MapTypeId.ROADMAP,
            styles: [{"featureType":"administrative","elementType":"labels.text.fill","stylers":[{"color":"#8c8c8c"}]},{"featureType":"landscape","elementType":"all","stylers":[{"color":"#f2f2f2"}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"poi.business","elementType":"geometry.fill","stylers":[{"visibility":"on"}]},{"featureType":"road","elementType":"all","stylers":[{"saturation":-100},{"lightness":45}]},{"featureType":"road.highway","elementType":"all","stylers":[{"visibility":"simplified"}]},{"featureType":"road.arterial","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"transit","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"water","elementType":"all","stylers":[{"color":"#b2d0e3"},{"visibility":"on"}]}]
    };
    // Define the map
    map = new google.maps.Map(document.getElementById(map_selector), myOptions);
    if(typeof(variable['custom_function']) != "undefined" && variable['custom_function'] !== null) {
        var addrenss_var_str = variable['addrenss_var_str'];
        mapBoundListner = google.maps.event.addListener(map, 'tilesloaded', function(event) {
                module.LoadPropertiesList(addrenss_var_str,map);
        });
    }
    if (variable['geocoader'] != undefined) {
	    google.maps.event.addListener(map, "dragend", function() {
			var latlng = map.getCenter();
			var geocoder = geocoder = new google.maps.Geocoder();
	        geocoder.geocode({ 'latLng': latlng }, function (results, status) {
	            if (status == google.maps.GeocoderStatus.OK) {
	                if (results[1]) {
	                	for(var i = 0; i < results[0].address_components.length; i++) {
	                		if(results[0].address_components[i].types[0] == 'locality') {
                                    var city = results[0].address_components[i].long_name;
                            }
                            if(results[0].address_components[i].types[1] == 'sublocality') {
                                    var township = results[0].address_components[i].long_name;
                            }
	                	}
	                    if (city != "" && city != undefined) {
	                    	document.getElementById("city-name-id").innerHTML = city;
	                    }
	                }
	            }
	        });
		});
	}
    
    // Initialize the local searcher
    gLocalSearch_common = new google.maps.places.PlacesService(map);
    //streetview
    panorama = map.getStreetView();
    if (null == panorama) {
        $("#mapTypeControl a.streetviewlink").hide();
        $('#streetview2').hide();
    }
    $('#streetview2').width($('#'+map_selector).width());
    $('#streetview2').height($('#'+map_selector).height());
    $('#streetview2').hide();
    var fenwayPOV = {heading:0,pitch:0,zoom:2};
    panorama.setPosition(latLong);
    panorama.setPov(fenwayPOV);
    //Map Control part
    $("#mapTypeControl2 a.icon").click(function() {
            var isVisibleStreetView = panorama.getVisible();
            $("#mapTypeControl2 a.icon").each(function() {
                    $(this).removeClass('selected');
                    $('#streetview2').hide();
                    $('#map').show();
            });
            //switch map type
            if ($(this).attr('name') == 'terrain') {
                if(isVisibleStreetView) {
                    panorama.setVisible(false);
                }
                map.setMapTypeId('terrain');
            }
            if ($(this).attr('name') == 'satellite') {
                if(isVisibleStreetView) {
                    panorama.setVisible(false);
                }
                map.setMapTypeId(google.maps.MapTypeId.HYBRID);
            }
            if ($(this).attr('name') == 'maplink') {
                if(isVisibleStreetView) {
                    panorama.setVisible(false);
                }
                map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
            }
            if ($(this).attr('name') == 'streetviewlink') {
                if(isVisibleStreetView == false) {
                    panorama.setVisible(true);
                }
            }
            $(this).addClass('selected');
            return false;
    });
    //hide it back
    $("#mapGoBackControl").click(function() {
        $('#newPropertyMap').hide('slow');
        $('#oldmap').show('slow');
    });
    enableServiceTools_commonmap(map,'map');
    
    if ($('body').hasClass('dailyemail')){
        locationMarkerRadius(map,latLong);
    }
};

enableServiceTools_commonmap = function (mappy,id){
  // Allow the theme to modify the path to service-tools icons
  $("#mapTools a").each(function(){
        var name = $(this).attr('name');
        var filename = '';

        switch(name) {
            case 'school':
                filename = 'schools.svg';
                break;
            case 'grocery store':
                filename = 'grocery.svg';
                break;
            case 'bank':
                filename = 'banks.svg';
                break;
            case 'coffee':
                filename = 'cafes.svg';
                break;
            case 'park':
                filename = 'parks.svg';
                break;
            case 'restaurant':
                filename = 'restaurants.svg';
                break;
            case 'gas':
                filename = 'gasstations.svg';
                break;
            case 'day care':
                filename = 'daycare.svg';
                break;
            case 'hospital':
                filename = 'hospitals.svg';
                break;
            case 'shopping centre':
                filename = 'shopping.svg';
                break;
            case 'attraction':
                filename = 'attractions.svg';
                break;
            case 'religion':
                filename = 'religion.png';
                break;
            case 'bus_station':
                filename = 'bus.svg';
                break;
            case 'bus':
                filename = 'bus.svg';
                break;  
            default:
                filename = 'cabin.png';
        }
    markersStorage_common[name]=[];
    
    var image = new google.maps.MarkerImage(serviceIconPath_common + '/' + filename,
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(28, 40),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      // The anchor for this image is the base of the flagpole at 0,32.
      new google.maps.Point(16, 37));
    var shadow = new google.maps.MarkerImage('/modules/property/images/icon-shadow.png',
      // The shadow image is larger in the horizontal dimension
      // while the position and offset are the same as for the main image.
      new google.maps.Size(42, 35),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
      var icons = new Array(2);
      icons[0] = image;
      icons[1] = shadow; 
    serviceIcons_common[name] = icons;
  
  });
  
  //attach clicks
  $("#mapTools a.icon").click(function(){
    if(panorama_common != undefined && panorama_common.getVisible()) {
        panorama_common.setVisible(false);
        mappy.setMapTypeId(google.maps.MapTypeId.ROADMAP);
    }
    
    if(myPano_common != undefined && myPano_common.getVisible()) {
        myPano_common.setVisible(false);
        mappy.setMapTypeId(google.maps.MapTypeId.ROADMAP);
    }
    
    
    if($('#streetview').is(":visible")){
      $('#'+id).show();
      $('#streetview').hide();
    }
    var thisObj = $(this);
    var name=thisObj.attr('name');
    if(thisObj.hasClass('selected')){
      thisObj.removeClass('selected');
      //lat
      for (var lat in markersStorage_common[name]) {
        //long
        for (var lng in markersStorage_common[name][lat]) {
          //remove marker
          //map.removeOverlay(markersStorage_common[name][lat][lng]);
          markersStorage_common[name][lat][lng].setMap(null);
        }
      }
      markersStorage_common[name]=[];

    }else{
      currentLocalSearchStr_common = name;
      var request = {
            bounds: mappy.getBounds(),
            keyword: name
      };
      gLocalSearch_common.nearbySearch(request, function (results, status) {
            OnLocalSearchCommon(results, status, mappy);
      });

      $(this).parent().addClass('UploadingNow');
    }
    return false;
  });  
};

//Create markers from search results
OnLocalSearchCommon = function (results, status,mappy) {  
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    return;
  }
  var name = currentLocalSearchStr_common;
  for (var i = 0, result; result = results[i]; i++) {
     var marker = serviceCreateMarkerCommon(mappy,result,name);
     var lat= marker.position.lat();
     var lng= marker.position.lng();
     if(undefined === markersStorage_common[name][lat]){
          markersStorage_common[name][lat]=[];
     }
     if(undefined === markersStorage_common[name][lat][lng]){
              marker.setMap(mappy);//map.addOverlay(marker); 
              markersStorage_common[name][lat][lng]=marker;
          //markersStorage_common[name][lat][long].push(marker);
         }
     else{
        marker.setMap(null);
     }
  }
    
  $("a[name='" + name + "']").addClass('selected');
  $("a[name='" + name + "']").parent().removeClass('UploadingNow');
  
  ProcessQueueForlocalSearchCommon(mappy);
};

//create Marker for Service Tools
function serviceCreateMarkerCommon(mappy,searchResult, name) {
  var latlng =  searchResult.geometry.location;
  var markerOptions = { icon:serviceIcons_common[name] };
  var marker = new google.maps.Marker({
        position: latlng,
        map: mappy,
        shadow: serviceIcons_common[name][1],
        icon: serviceIcons_common[name][0],
    });

  

  google.maps.event.addListener(marker, "click", function() {
    gLocalSearch_common.getDetails(searchResult, function(result, status) {
        var html = '<div class="gs-title">'+result.name+'</div>';
        if(result['address_components'].length > 0) {
            html =  html+'<div class="gs-address"><div class="gs-street gs-addressLine">'+result['address_components'][0]['short_name'];
            //+' <div class="gs-city gs-addressLine">'+result['address_components'][2]['short_name']+', '+result['address_components'][3]['short_name']+', '+result['address_components'][4]['short_name']+'</div></div><div class="amenty-phone">'+result['formatted_phone_number']+'</div>';
        }
        
        if(result['address_components'][1] != undefined) {
            html =  html+' '+result['address_components'][1]['short_name'];
        }
        else{
            html = html+'</div>';
        }
        
        if(result['address_components'][2] != undefined) {
            html =  html+'<div class="gs-city gs-addressLine">'+result['address_components'][2]['short_name'];
        }
        if(result['address_components'][3] != undefined) {
            html =  html+', '+result['address_components'][3]['short_name'];
        }
        else if(result['address_components'][4] != undefined){
            html =  html+', '+result['address_components'][4]['short_name'];
        }
        html =  html+'</div></div>';
        
        if(result['formatted_phone_number'] != undefined) {
            html =  html+'<div class="amenty-phone">'+result['formatted_phone_number']+'</div>';
        }
        infowindow_common.setContent(html);
        infowindow_common.open(mappy,marker);
    });
 //  map.panTo(latLong);
  });
  return marker;
}

//Search for service from queue
function ProcessQueueForlocalSearchCommon(){
  if(searchQueue_common.length){
     var name = searchQueue_common.pop();
     var str = name;
     var strarray = str.split('-');
     var Search_str = '';
     currentLocalSearchStr_common = name;
     for (var i = 0; i < strarray.length; i++) {
            Search_str = strarray[i];
            if(Search_str == 'day care'){
                var request = {
                    bounds: map_common.getBounds(),
                    keyword: Search_str
                };
            }
            else{
                var request = {
                    bounds: map_common.getBounds(),
                    type: [Search_str]
                };
            }
         gLocalSearch_common.radarSearch(request, OnLocalSearchCommon);
      }
    }
};

function locationMarkerRadius(mappy,coord){

    var image = {
       url : '/modules/free_home_valuation/images/daily-email-pin-orange.svg',
       scaledSize : new google.maps.Size(26, 35)
   };

   // Create marker 
   marker = new google.maps.Marker({
       map: mappy,
       icon : image,
       position: coord,
       draggable: true,
       optimized: false
   });
   var radius ='';
   radius = $('#edit-radius').val();
     if(radius){
        setradius = radius;
      } 
   setradius = setradius * 1609.344; // convert miles to meter
   var circleOptions = {
      strokeColor: '#87de18',
      strokeOpacity: 0.8,
      strokeWeight: 2,
      fillColor: '#8fff00',
      fillOpacity: 0.35,
      map: map,
      center: coord,
      radius: setradius,
      //draggable: true
   };
   circle = new google.maps.Circle(circleOptions);
   circle.bindTo('center', marker, 'position');

   google.maps.event.addListener(marker, 'dragend', function() {
               var geocoder = geocoder = new google.maps.Geocoder();
           geocoder.geocode({
               'latLng': marker.getPosition()
           }, function(results, status) {
               if (status == google.maps.GeocoderStatus.OK) {
                   if (results[0]) {
                       $('#autocomplete').val(results[0].formatted_address);

                       handleEvent(marker,results[0]);
                   }
               }
           });
       });
  // marker.addListener('dragend', handleEvent);
        var deafult_radius = $.trim($('#edit-radius').attr('value'));
        if(deafult_radius <= 1){ 
            $('label[for="radius-unit"]').html('Mile');
         }
         else{
            $('label[for="radius-unit"]').html('Miles');
         }
           $( "#map-radius" ).val(deafult_radius);
           $( "#slider" ).slider({
            value:deafult_radius,
            min: 0.25,
            max: 5,
            step: 0.25,
            slide: function( event, ui ) {
              //alert(ui.value);
               if(ui.value <= 1){ $('label[for="radius-unit"]').html('Mile');  }  else{ $('label[for="radius-unit"]').html('Miles'); }
               radiusReceiver(ui.value);
               $( "#edit-radius" ).val(ui.value);
               $( "#map-radius" ).val(ui.value);
            }
          });
};



var handleEvent = function(marker, results) {
   var lat = marker.getPosition().lat();
   var lng = marker.getPosition().lng();
   $('.lat_lng_location').val(lat+','+lng);
   $('.search-bar .address-field').val(results.formatted_address);
   var address = '';var address_vars = '';var street_no;var street_name;var city;var province;var post_code;var country;
   var addrenss_var_str = new Object();
   if (results.address_components) {
                   for(var i = 0; i < results.address_components.length; i++) {
                           address_vars += results.address_components[i].types[0]+'='+results.address_components[i].short_name+'&';
                           if (results.address_components[i].types[0] != undefined && results.address_components[i].types[0] == 'postal_code') {
                                   $('.postal_code_1').val(results.address_components[i].long_name);
                                   $('.postal-code-input').val(results.address_components[i].long_name);
                           }
                           if(results.address_components[i].types[0] == 'street_number') {
                                   street_no = results.address_components[i].long_name;
                                   addrenss_var_str['street_no'] = street_no;
                                   $('.street-no-input').val(street_no);
                           }
                           if(results.address_components[i].types[0] == 'route') {
                                   street_name = results.address_components[i].long_name;
                                   addrenss_var_str['street_name'] = street_name;
                                   $('.street-name-input').val(street_name);
                           }
                           if(results.address_components[i].types[0] == 'locality') {
                                   city = results.address_components[i].long_name;
                                   addrenss_var_str['city'] = city;
                                   $('.city-input').val(city);
                           }
                           if(results.address_components[i].types[0] == 'administrative_area_level_1') {
                                   province = results.address_components[i].long_name;
                                   addrenss_var_str['province'] = province;
                                   $('.province-input').val(province);
                           }
                           if(results.address_components[i].types[0] == 'country') {
                                   country = results.address_components[i].long_name;
                                   addrenss_var_str['country'] = country;
                                   $('.country-input').val(country);
                           }      
                           if(results.address_components[i].types[0] == 'postal_code') {
                                   post_code = results.address_components[i].long_name;
                                   addrenss_var_str['post_code'] = post_code;
                           }
                           // setting address values into for next step
                           set_address_form_fields_values(addrenss_var_str);
                           var address_line = '';
                           if(street_no != "" && street_no != undefined) {
                                   address_line = street_no;
                           }
                           if(street_name != "" && street_name != undefined) {
                                   address_line += ", "+street_name;
                           }
                   }
                   $('.address_vars').val(address_vars);
                   address = [
                           (results.address_components[0] && results.address_components[0].short_name || ''),
                           (results.address_components[1] && results.address_components[1].short_name || ''),
                           (results.address_components[2] && results.address_components[2].short_name || '')
                   ].join(' ');
                   $('.search-bar .address-field').val(address);
     } 
};

function set_address_form_fields_values(address_vars) {
   $("#edit-address_values").val(JSON.stringify(address_vars));
}

var radiusReceiver = function(rad) {
       var containerWidth = getSmallerSize( $('#map').width(), $('#map').height() ); //gets the shortest dimension of the map
       var radius = circle.getRadius();
       rad = rad * 1609.344; // convert miles to meters
       var scale = Number(rad) / 500;
       var newCentre = new google.maps.LatLng(marker.position.lat(), marker.position.lng());
       var lat = marker.position.lat();
       var lng = marker.position.lng();
       var newCentre = new google.maps.LatLng(lat, lng);
       var zoomLevel;
       if (containerWidth > 550) {
        //Extra Large Map
        zoomLevel = 17 - Math.log(scale) / Math.log(2);
    } else if (containerWidth > 420) {
        //Large Map
        zoomLevel = 16 - Math.log(scale) / Math.log(2);
    } else if (containerWidth > 350) {
        zoomLevel = 15 - Math.log(scale) / Math.log(2);

    } else {
        //Small Map
        zoomLevel = 14 - Math.log(scale) / Math.log(2);
    }

    //Only zoom out, don't zoom in
    map.setZoom(parseInt(zoomLevel));

    //Set Radius
    circle.setRadius(parseFloat(rad));

    //Centre Map
    map.setCenter(newCentre);
};
var getSmallerSize = function(a, b) {
    return a > b ? b : a;
}; 

})(jQuery);