﻿var map = null;
var mgr = null;
var progressBar = null;
var searchOrigin = null;
var CINEMADATA = [];
var MARKERDATA = [];
var SEARCHRESULT = [];


// FUNCTION: createMarker(point,label,image)
function createMarker(point,label,image) {
	base_icon = new GIcon();
	base_icon.image = image;
	base_icon.transparent = null; // don't use transparency mask
	base_icon.shadow = null; // don't use shadow image
	base_icon.iconSize = new GSize(22, 36); // icon size matches image
	base_icon.shadowSize = null; // self-explanatory
	base_icon.iconAnchor = new GPoint(11, 18); // *center* of the icon
	base_icon.infoWindowAnchor = new GPoint(11, 18);
	base_icon.infoShadowAnchor = null;	
	marker_options = { icon:base_icon };
	
	var marker = new GMarker(point,marker_options);
	marker.value = label;
	infowindow_options = { maxWidth:250 };
    GEvent.addListener(marker,"mouseover",function() {
    	marker.openInfoWindowHtml(label, infowindow_options);
    });   
	return marker;
}


// FUNCTION: gotCinemaData()

function gotData() { 
    for (i=0; i < CINEMADATA.length; i++) {   

        var latitude = CINEMADATA[i].latitude;
        var longitude = CINEMADATA[i].longitude;
		
		point = new GLatLng(latitude, longitude);
		
        /* Create InfoWindow HTML */
        var label = "";            
        label += "<strong>"+CINEMADATA[i].theaterName+"</strong>";
        if (CINEMADATA[i].dolby3D > 0) {
            label += "&nbsp;<strong class='Dolby3DHighlightStyle'>Dolby 3D</strong>";
        }
        label += "<br/>";
        for (j=0; j < CINEMADATA[i].address.length; j++ ){
            if (CINEMADATA[i].address[j].length > 0){
                label += CINEMADATA[i].address[j]+"<br/>";
            }
        }
        if (CINEMADATA[i].screencount > 1) {
            label += "("+CINEMADATA[i].screencount+" screens)<br/>";
        }
        
        if (CINEMADATA[i].url !== ""){
            var displayUrl = CINEMADATA[i].url.substring(0,25);
            var targetUrl = CINEMADATA[i].url; 
                
            // fix for poorly formed SFDC target values
            var targetPattern = new RegExp("^http://");
            if ( targetPattern.test(targetUrl) == false ){
                targetUrl = "http://" + targetUrl;
            }
            
            if ( CINEMADATA[i].url.length > 25 ) {
                label += "<a target=\"_blank\" href='"+targetUrl+"'>"+displayUrl+"...</a><br/>";
            }
            else {
                label += "<a target=\"_blank\" href='"+targetUrl+"'>"+targetUrl+"</a><br/>";
            }
        }	       	    

        if (CINEMADATA[i].dolby3D == 0) {
            MARKERDATA.push(createMarker(point, '<div align="left" id="InfoMarker">' + label + '</div>', "/images/icon/icon_google_dolby.gif"));	    		                   
        }
        else{
            MARKERDATA.push(createMarker(point, '<div align="left" id="InfoMarker">' + label + '</div>', "/images/icon/icon_google_dolby_3D.gif"));                            
        }
        
        if (CINEMADATA[i].latitude == 0 && CINEMADATA[i].longitude == 0 ||
            CINEMADATA[i].latitude == "" && CINEMADATA[i].longitude == "") {         
            CINEMADATA.splice(i,1);  
            MARKERDATA.splice(i,1);
            i = i -1;
        }	   
    }      
  
    var styles = [{
        url: '/images/icon/gmap_cluster_small.png',
        height: 53,
        width: 52,
        opt_textColor: '#FFFFFF'        
      },
      {
        url: '/images/icon/gmap_cluster_medium.png',
        height: 56,
        width: 55,
        opt_textColor: '#FFFFFF'
      },
      {
        url: '/images/icon/gmap_cluster_large.png',
        height: 66,
        width: 65,
        opt_textColor: '#FFFFFF'
      }];
    
    var mcOptions = {gridSize: 40, maxZoom: 7, styles: styles};
    var markerCluster = new MarkerClusterer(map,MARKERDATA,mcOptions);
    
    progressBar.remove();  

}

// FUNCTION: getCinemaData(url)
// get Cinema data from JSON service

function getCinemaData(url) {   
    $.getJSON(url, function(data) {
        CINEMADATA = data;
	    gotData();
    });
    $("div#mapContainer").ajaxError(function(event, request, settings){
        $('div#mapContainer').block({ message: '<br/><h2>Unable to load map data, please try again later.</h2>', css: { border: '3px solid' } });
    });
}

// FUNCTION:  getSearchResults(origin,radius)
// display top N cinemas within specified radius of the search location

function getSearchResults(origin,radius){
    var N = 10;                    // number of search results to display
    var resultItemZoomLevel = 15;  // search result item zoom level
    var maxDisplay = N;
    var displayNum = 1;
        
    for (i=0; i < CINEMADATA.length; i++) {          	  
	    SEARCHRESULT[i] = [];
	    SEARCHRESULT[i][0] = origin.distanceFrom( new GLatLng( CINEMADATA[i].latitude, CINEMADATA[i].longitude ) ) * .000621371192;
	    SEARCHRESULT[i][1]= CINEMADATA[i];	   		    
	    SEARCHRESULT[i][2]= MARKERDATA[i];    
	}
	// sort results in ascending distance from origin
	SEARCHRESULT.sort(function(a,b){return (a[0]-b[0])});

    var results = "<table>";
    results += "<tr><th colspan=\"3\"><strong>Cinema Information</strong></th><th><strong>Distance</strong></th></tr>";
    
    for (i=0; i < N; i++) {
        if (SEARCHRESULT[i][1].latitude != 0 && SEARCHRESULT[i][1].longitude != 0){
            if (displayNum % 2 == 0) {
                results += "<tr>";
            }
            else{
                results += "<tr class=\"altRow\">";
            }
            results += "<td valign=\"top\" align=\"center\"><strong>"+displayNum+"</strong></td>";
            
            results += "<td valign=\"top\">";            
            results += "<strong><a href=\"#mapView\" onclick=\"javascript:displayCinema(SEARCHRESULT["+i+"],"+resultItemZoomLevel+");\">";   
            results += SEARCHRESULT[i][1].theaterName+"</a></strong><br/>";
     
            for (j=0; j < SEARCHRESULT[i][1].address.length; j++ ){
              if (SEARCHRESULT[i][1].address[j].length > 0){
                results += SEARCHRESULT[i][1].address[j]+"<br/>";
              }
            }
            
            if (SEARCHRESULT[i][1].screencount > 1) {
              results += "("+SEARCHRESULT[i][1].screencount+" screens)<br/>";
            }
             
            if (SEARCHRESULT[i][1].url !== ""){                                       
                var displayUrl = SEARCHRESULT[i][1].url.substring(0,25);
                var targetUrl = SEARCHRESULT[i][1].url; 
                
                // fix for poorly formed SFDC target values
                var targetPattern = new RegExp("^http://");
                if ( targetPattern.test(targetUrl) == false ){
                    targetUrl = "http://" + targetUrl;
                }
            
                if ( SEARCHRESULT[i][1].url.length > 25 ) {                    
                    results += "<a target=\"_blank\" href='"+targetUrl+"'>"+displayUrl+"...</a><br/>";
                }
                else {
                    results += "<a target=\"_blank\" href='"+targetUrl+"'>"+targetUrl+"</a><br/>";
                }            
            }
            results += "<br/></td>";
            
            if (SEARCHRESULT[i][1].dolby3D > 0) {
              results += "<td valign=\"top\" align=\"center\"><img title=\"Dolby 3D\" alt=\"Dolby 3D\" src=\"/images/icon/icon_google_dolby_3D.gif\" align=\"baseline\" border=\"0\"></td>";
            }
            else {
              results += "<td valign=\"top\" align=\"center\"><img title=\"Dolby Digital Cinema\" alt=\"Dolby Digital Cinema\" src=\"/images/icon/icon_google_dolby.gif\" align=\"baseline\" border=\"0\"></td>";   
            }
            
            var distancekm = SEARCHRESULT[i][0] * 1.609344;
            var distancemi = SEARCHRESULT[i][0];
            
            results += "<td valign=\"top\">"+distancemi.toFixed(1)+" mi<br/>"+distancekm.toFixed(1)+" km </td></tr>";      
            displayNum = displayNum + 1;
        }
        else {
            N = N + 1;  // workaround for invalid SFDC geocodes
        }
    } 
	results += "</table>";
	
	// write to page
	jQuery("#mapSearchResults").html("<h3>Top "+maxDisplay+" Search Results</h3>"+results);

	/* expansions fix for dynamic content area calculations */
    try{
        var menuHeight = $('.leftmenu').height(); 
	    var contentHeight = $('#contentContainer').height(); 
	    var resultHeight = $('#mapSearchResults').height();
	    
	    if(menuHeight > (contentHeight - CONTENTOFFSET)){       	        
	        var totalHeight = contentHeight + resultHeight - CONTENTOFFSET;
	        $('#contentContainer').height(totalHeight);
	    }
	}
	catch(err) {}
}


function checkEnter(e){ //e is event object passed from function invocation
    var characterCode;

    if(e && e.which){ //if which property of event object is supported (NN4)
        e = e
        characterCode = e.which //character code is contained in NN4's which property
    }
    else{
        e = e || window.event;
        characterCode = e.keyCode //character code is contained in IE's keyCode property
    }
    

    if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
        plotInput(document.getElementById('gmapsearch').value, 1 );
        return false;
    }        
}


// FUNCTION:  displayCinema(data, zoomlevel)
// zoom and center map on cinema marker, automatically open infowindow
       
function displayCinema(data, zoomlevel){    
    map.setCenter(new GLatLng(data[1].latitude, data[1].longitude), zoomlevel);        
    GEvent.trigger(data[2],"mouseover");
}


// FUNCTION:  getCinemaDistance(origin,n)
// get the nth distance result when cinemas are sorted by distance from origin in ascending order

function getCinemaDistance(origin,n) {
    var distanceArray = [];
       
    for (i=0; i < CINEMADATA.length; i++) {           	    	    
	    distanceArray[i] = origin.distanceFrom( new GLatLng( CINEMADATA[i].latitude, CINEMADATA[i].longitude ) ) * .000621371192;	   	    
	}
	distanceArray.sort(function(a,b){return (a-b)});
	
	return distanceArray[n-1];	
}

// FUNCTION: loadMap(url)
// loads the map to the div container on the page

function loadMap(url) {
    if (GBrowserIsCompatible()) {       
      	map = new GMap2(document.getElementById("map"));        
        
        // render map
        map.setCenter(new GLatLng(20, -100), 2);	
        map.setMapType(G_NORMAL_MAP); 

	    var mapControl = new GMapTypeControl();
        map.addControl(mapControl);
        map.addControl(new GLargeMapControl());    
                
	    mgr = new GMarkerManager(map, {borderPadding:1});
		    
    	progressBar = new ProgressbarControl(map);    
	    progressBar.start();
	    
        getCinemaData(url);	       
    }   
    else {
        $('div#mapContainer').block({ message: '<br/><h2>Unable to display Google Maps data.</h2>', css: { border: '3px solid' } });    
    }    
}

// FUNCTION: plotInput(address, radius)
// geocode input and plot

function plotInput(address, radius) {  
address = document.getElementById("gmapsearch").value;
radius = 1   ;
    var geocoder = new GClientGeocoder();
    
    geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert("The location entered was not found");
      } else {

        // calculate zoom level        
        var span = new GLatLng( point.lat() + .01667, point.lng() ); // (37.786840999999995, -122.406366)        
        var viewsize = new GSize(978,395);
        
        // plot         
        var r = getCinemaDistance(point,10);        
                
        var rlat = r / 69.172;  // 69.172 miles/degree of latitude
        var rlong = r / (Math.cos( rlat * (Math.PI/180) ) * 69.172);  // cosine (latitude)* 69.172 miles  
                
        var ne = new GLatLng( point.lat() + rlat, point.lng() + rlong);
        var sw = new GLatLng( point.lat() - rlat, point.lng() - rlong);           
        var lb = new GLatLngBounds( sw, ne );
        var zoomlevel = map.getCurrentMapType().getBoundsZoomLevel(lb,viewsize);       
        
        map.setCenter(point, zoomlevel);

        if (searchOrigin != null){ 
            map.removeOverlay(searchOrigin);
        }
       
        searchOrigin = new GMarker(point);        
        map.addOverlay(searchOrigin);
        searchOrigin.openInfoWindowHtml(address);        
        
        getSearchResults(point,radius);        

      }
    }
  );

}

