// JScript File

//relies on jquery
    $(document).ready(function() {
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"), new GSize(320,464));
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.disableDoubleClickZoom();
        map.setCenter(new GLatLng(16.03604,108.21114),13);
        map.addControl(new GSmallMapControl());
        window.setTimeout(setupOfficeMarkers, 0);
        $('#postcode').focus(function () {
             $(this).select();
        });

        var qs = new Querystring();
        var place = qs.get("Locate");
        if(place!=null){
            $('#postcode').attr('value',place);
            findPostCode();
        }
      }
    });
    $(document.body).unload(function() {
        if (GBrowserIsCompatible()) {
            GUnload();
        }
    });

var iconData = {
  'makro': { width: 54, height: 20 },
  'shadow-makro': { width: 65, height: 20 },
  'person': { width: 15, height: 30 },
  'shadow-person': { width: 31, height: 30 }
};

var officeLayer = [
      {
        'name': 'HCMC An Phu',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.800695,106.74341],
        'address': 'An Phu - An Khanh<br/>District 2<br/>Ho Chi Minh City',
        'telephone': '+84 (8) 5190390',
        'fax': '+84 (8) 5190370',
        'id': '1098245'
      },
      {
        'name': 'HCMC Binh Phu',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.742352,106.631077],
        'address': 'Binh Phu residential - Ward 11<br/>District 6<br/>Ho Chi Minh City',
        'telephone': '+84 (8) 8769705',
        'fax': '+84 (8) 8769024',
        'id': '1098247'
      },
      {
        'name': 'HCMC Hiep Phu',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.862146,106.64919],
        'address': 'Tan Thoi Hiep<br>Tan Thoi Hiep Ward<br/>District 12<br/>Ho Chi Minh City',
        'telephone': '+84 (8) 7172979',
        'fax': '+84 (8) 7172992',
        'id': '1098248'
      },
      {
        'name': 'Thang Long',
        'icon': ['makro', 'shadow-makro'],
        'posn': [21.032403,105.820068],
        'address': 'Pham Van Dong Street<br>Co Nhue Commune<br/>Tu Liem District<br/>Hanoi',
        'telephone': '+84 (4) 7551617',
        'fax': '+84 (4) 7551650',
        'id': '1098249'
      },
      {
        'name': 'Hoang Mai',
        'icon': ['makro', 'shadow-makro'],
        'posn': [20.97011566,105.8662158],
        'address': '126 Tam Trinh Road<br/>Yen So Ward<br/>Hoang Mai District<br>Hanoi',
        'telephone': '+84 (4) 6453232',
        'fax': '+84 (4) 6543234',
        'id': '1098250'
      },
      {
        'name': 'Hung Loi',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.0318,105.784],
        'address': '91B Highway<br/>Hung Loi Ward<br/>Ninh Kieu District<br/>Can Tho City',
        'telephone': '+84 (71) 739973',
        'fax': '+84 (71) 739983',
        'id': '1098243'
      },
      {
        'name': 'Hong Bang',
        'icon': ['makro', 'shadow-makro'],
        'posn': [20.87467,106.65219],
        'address': '2A Hong Bang Street<br/>So Dau Ward<br/>Hong Bang District<br/>Hai Phong City',
        'telephone': '+84 (31) 528128',
        'fax': '+84 (31) 528124',
        'id': '1098244'
      },
      {
        'name': 'Da Nang',
        'icon': ['makro', 'shadow-makro'],
        'posn': [16.03604,108.21114],
        'address': 'Cach Mang Thang Tam Street<br/>Hoa Cuong Nam Ward<br>Hai Chau District<br/>Da Nang City',
        'telephone': '+84 (511) 644933',
        'fax': '+84 (511) 644966',
        'id': '1098241'
      },
      {
        'name': 'Bien Hoa',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.94731,106.817001],
        'address': 'Nguyen Ai Quoc Street<br/>Quang Vinh Ward<br>Bien Hoa City<br/>Dong Nai Province',
        'telephone': '+84 (061) 38 820 411',
        'fax': '+84 (061) 38 820 430',
        'id': '1100242'
      },
      {
        'name': 'Long Xuyen',
        'icon': ['makro', 'shadow-makro'],
        'posn': [10.38178,105.437599],
        'address': '414 Tran Hung Dao Street<br/>My Phuoc Ward<br>Long Xuyen City<br/>An Giang Province',
        'telephone': '+84 (076) 38 211 888',
        'fax': '+84 (076) 38 211 878',
        'id': '1106154'
      },
      {
        'name': 'Quy Nhon',
        'icon': ['makro', 'shadow-makro'],
        'posn': [13.771065,109.234657],
        'address': 'Highway 1D<br/>Ghenh Rang Ward<br>Quy Nhon City<br/>Binh Dinh Province',
        'telephone': '+84 (056) 3 546 054',
        'fax': '+84 (056) 3 546 055',
        'id': '1106155'
      }
    ];

    var map;
    var userMarker;
    var icons = {};
    var allmarkers = [];
    var EARTH_RADIUS = 6367000;

    function getIcon(images) {
      var icon = null;
      if (images) {
        if (icons[images[0]]) {
          icon = icons[images[0]];
        } else {
          icon = new GIcon();
          if (images[0] == 'makro') prefix = '../../show/1098412/';
          else if (images[0] == 'person') prefix = '../../show/1098414/';
          icon.image = prefix + images[0] + '.png';
          var size = iconData[images[0]];
          icon.iconSize = new GSize(size.width, size.height);
          icon.iconAnchor = new GPoint(0,20);
          if (images[0] == 'makro') prefix = '../../show/1098415/';
          else if (images[0] == 'person') prefix = '../../show/1098416/';
          icon.shadow = prefix + images[1] + '.png';
          size = iconData[images[1]];
          icon.shadowSize = new GSize(size.width, size.height);
          icons[images[0]] = icon;
        }
      }
      return icon;
    }

    function setupOfficeMarkers() {
      var points = [];
      allmarkers.length = 0;
      for (var j in officeLayer) {
          var place = officeLayer[j];
          var icon = getIcon(place['icon']);
          var title = place['name'];
          var posn = new GLatLng(place['posn'][0], place['posn'][1]);
          points[j] = posn;
          var address = place['address'];
          var telephone = place['telephone'];
          var fax = place['fax'];
          var link = place['id'];
          var marker = createMarker(posn,title,icon,address,telephone,fax,link); 
          map.addOverlay(marker);
          allmarkers.push(marker);
      }
      fitMap(points);
    }
  
    function createMarker(posn, title, icon, address, telephone, fax,link) {
      var marker = new GMarker(posn, {title: title, icon: icon, draggable:false });
      GEvent.addListener(marker,'click', function() {
        var myHtml =  '<b>' + title + '</b><br/>' + address + '<br/><b>Tel: </b>' + telephone + '<br/><b>Fax: </b>' + fax + '<br/><div align=\"right\"><a href=\"../../menu/' + link + '_l2/index.html\">Go to store page</a></div>';
        map.openInfoWindowHtml(posn, myHtml);
      });
      return marker;
    }


    function findPostCode(){
      var postcode = $('#postcode').attr('value')+',VN';
      var geocoder = new GClientGeocoder();
      geocoder.getLatLng(
        postcode,
        function(point) {
          if (!point) {
            alert(postcode + ' not found');
          } else {
            if(!userMarker){      
              //map.panTo(point);
              var picon = getIcon(['person', 'shadow-person'])
              userMarker = new GMarker(point, {title: 'You are here', icon: picon, draggable:false });
              map.addOverlay(userMarker);
            }else{
              userMarker.setLatLng(point);
              //map.panTo(point);
            }
            searchStores(point);
          }
        }
      );
    }
    
    function searchStores(point){
        var layer = officeLayer;
        var resultpoints = [];
        var i = 0;
        resultpoints[i] = point;
        i++;
        for (var j in layer) {
          var place = layer[j];
          var title = place['name'];
          var posn = new GLatLng(place['posn'][0], place['posn'][1]);
          place['distance'] = distance_between_points ( posn, point );
        }
        
        layer.sort(sortDistance);
        $('#search_results').hide();
        $('#search_results').empty();
        resultpoints[i] = new GLatLng(layer[0]['posn'][0], layer[0]['posn'][1]);
        i++;
        $('#search_results').append('<li><div class="placename"><a href="#" onclick=\"showInfo(\'' + layer[0]['name'] + '\');return false;\">' + layer[0]['name'] + '</a></div><div class=\"distance\"><a href="#" onclick=\"showInfo(\'' + layer[0]['name'] + '\');return false;\">' + (layer[0]['distance']/1000).toFixed(1) + ' km</a></div><div class="getDirections"><a target="_blank" href="http://maps.google.com/maps?f=d&saddr=' + $('#postcode').attr('value') + '&daddr='+ layer[0]['posn'][0] +','+ layer[0]['posn'][1] +'(Makro - ' + layer[0]['name'] + ')&hl=en"></a></div></li>');
        for (var j in layer) {
          var place = layer[j];
          if(j>0&&(place['distance']/1000)<30){
            resultpoints[i] = new GLatLng(place['posn'][0], place['posn'][1]);
            i++;
            $('#search_results').append('<li><div class="placename"><a href="#" onclick=\"showInfo(\'' + place['name'] + '\');return false;\">' + place['name'] + '</a></div><div class=\"distance\"><a href="#" onclick=\"showInfo(\'' + place['name'] + '\');return false;\">' + (place['distance']/1000).toFixed(1) + ' km</a></div><div class="getDirections"><a target="_blank" href="http://maps.google.co.uk/maps?f=d&saddr=' + $('#postcode').attr('value') + '&daddr='+ place['posn'][0] +','+ place['posn'][1] +'(Makro - ' + place['name'] + ')&hl=en"></a></div></li>');
          }
        }
        $('#search_results').fadeIn(1000);
        fitMap(resultpoints);
    }
    
    //http://blog.jeromeparadis.com/archive/2007/02/08/1468.aspx
    function fitMap(points) {
      var bounds = new GLatLngBounds();
      for (var i=0; i< points.length; i++) {
        bounds.extend(points[i]);
      }
      map.setZoom(map.getBoundsZoomLevel(bounds));
      map.setCenter(bounds.getCenter());
    }
    
    Math.deg2rad = function ( x ) {
      return x * (Math.PI / 180.0); 
    }

    // Calculates the distance (in metres) between 2 points. 
    function distance_between_points ( p1, p2 ) {
      var a = Math.deg2rad( 90 - p1.y);
      var b = Math.deg2rad( 90 - p2.y);
      var theta = Math.deg2rad( p2.x - p1.x);
      var c = Math.acos( Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(theta));
      return c * EARTH_RADIUS; 
    }
    function sortDistance(a,b){
      return a['distance'] - b['distance'];
    }

    function showInfo(storeName){
        for(i in allmarkers){
            if(allmarkers[i].getTitle()==storeName){
                GEvent.trigger(allmarkers[i],'click');
                break;
            }
        }
    }

/* Client-side access to querystring name=value pairs
	Version 1.3
	28 May 2008
	
	License (Simplified BSD):
	http://adamv.com/dev/javascript/qslicense.txt
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = {};
	
	if (qs == null) qs = location.search.substring(1, location.search.length);
	if (qs.length == 0) return;

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ');
	var args = qs.split('&'); // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i = 0; i < args.length; i++) {
		var pair = args[i].split('=');
		var name = decodeURIComponent(pair[0]);
		
		var value = (pair.length==2)
			? decodeURIComponent(pair[1])
			: name;
		
		this.params[name] = value;
	}
}

Querystring.prototype.get = function(key, default_) {
	var value = this.params[key];
	return (value != null) ? value : default_;
}

Querystring.prototype.contains = function(key) {
	var value = this.params[key];
	return (value != null);
}
