/**/
///////////////////////////////////////////////////////////////////////////////
//                            INTERACTIVE MAPS                               //
///////////////////////////////////////////////////////////////////////////////

// Only init the map when not accessed by widget
if (!location.href.match(/InteractiveMapsWidget\.jsp/)) {
   var prevFunc = window.onload;
   window.onload = function() {
      if (prevFunc) prevFunc();
      InteractiveMaps.init('interactiveMaps');
   };
}

String.prototype.trim = function() {
   a = this.replace(/^\s+/, '');
   return a.replace(/\s+$/, '');
}

function _baseUrl() {
   var base = 'http://www.stewart.com';
   return base.indexOf('<') < 0 ? base : '';
}

var InteractiveMaps = {

   BASE: _baseUrl(),
   BASE_ICON: null,
   MARKERS: [],
   PRODUCTS: {
      'afw': 'AIM for Windows',
      'sureclose': 'Sureclose',
      'titlesearch': 'TitleSearch',
      'filestor': 'FileStor'
   },

   PARAMS: {},

   init: function(divId) {
      var div = document.getElementById(divId);
      if (!div) {
         alert("You must name a <div> tag with '" + divId + "'");
         return false;
      }

      var params = [];
      for (var key in this.PARAMS) {
         params.push(escape(key) + '=' + escape(this.PARAMS[key]));
      }

      div.innerHTML = "<iframe id='__" + divId + "_iframe' src='" + this.BASE + "/interactivemaps/InteractiveMapsWidget.jsp?" + params.join('&') + "' width='758px' height='522px' frameborder='0' marginwidth='0' marginheight='0' scrolling='no' allowtransparency='true'></iframe>";
   },

   setParam: function(key, value) {
      if (key != null && key.length > 0 && value != null && value.length > 0) {
         this.PARAMS[key] = value;
      }
   },

   joinArguments: function(args, delim) {
      var a = [];
      for(var i = 0; i < args.length; i++) {
         a.push(args[i]);
      }
      return a.join(delim);
   },

   cleanEmptyArgs: function(args) {
      var a = [];
      for(var i = 0; i < args.length; i++) {
         if (args[i] != '') a.push(args[i]);
      }
      return a
   },

   allToUpper: function(args) {
      var a = [];
      for(var i = 0; i < args.length; i++) {
         a.push(args[i].toUpperCase());
      }
      return a;
   },

   typeOf: function(value) {
      if (value == undefined) {
         return "undefined";
      }

      if (value instanceof Object) {
         if (value instanceof Boolean) {
            return "Boolean";
         } else if (value instanceof Number) {
            if (/\./.test(value)) {
               return "Float";
            } else {
               return "Int";
            }
         } else if (value instanceof String) {
            return "String";
         } else if (value instanceof Array) {
            return "Array";
         } else if (value instanceof Date) {
            return "Date";
         } else if(value instanceof Function) {
            return "Function";
         } else if (value instanceof Object ) {
            return "Object";
         }
      } else if (typeof value) {
         if (typeof value == "object") {
            if (typeof value == "object" && !value) {
               return "null";
            }
         } else {
            if (typeof value == "boolean") {
               return "boolean";
            } else if (typeof value == "number") {
               if (/\./.test(value)) {
                  return "float";
               } else {
                  return "int";
               }
            } else if (typeof value == "string") {
               return "string";
            }
         }
      } else {
         return false;
      }
   },

   setEnabledStates: function() {
      this.setParam('enabledStates', this.joinArguments(this.allToUpper(this.cleanEmptyArgs(arguments)), '|'));
   },

   setDisabledStates: function() {
      this.setParam('disabledStates', this.joinArguments(this.allToUpper(this.cleanEmptyArgs(arguments)), '|'));
   },

   setRegionDisabledStroke: function(str) {
      this.setParam('regionDisabledStroke', str);
   },

   setRegionDisabledLabel: function(str) {
      this.setParam('regionDisabledLabel', str);
   },

   setRegionDisabledFill: function(str) {
      this.setParam('regionDisabledFill', str);
   },

   setShowInternational: function(str) {
      if (this.typeOf(str) != 'boolean' && this.typeOf(str) != 'Boolean') {
         alert('Invalid parameter passed to setShowInternational.  Defaulting to true');
         this.setParam('showInternational', 'true');
         return;
      }
      this.setParam('showInternational', str == true ? 'true' : 'false');
   },

   setBackgroundColor: function(color1, color2) {
      this.setParam('backgroundColor1', color1);
      this.setParam('backgroundColor2', color2);
   },

   setRegionNormalFill: function(str) {
      this.setParam('regionNormalFill', str);
   },

   setRegionHighlightFill: function(str) {
      this.setParam('regionHighlightFill', str);
   },

   setRegionNormalStroke: function(str) {
      this.setParam('regionNormalStroke', str);
   },

   setRegionHighlightStroke: function(str) {
      this.setParam('regionHighlightStroke', str);
   },

   setCityFill: function(str) {
      this.setParam('cityFill', str);
   },

   setInternationalHighlightFill: function(str) {
      this.setParam('highlightFill', str);
   },

   setShowSiteOverviewTab: function(val) {
      this.setParam('showSiteOverviewTab', val + "");
   },

   initBaseIcon: function() {
      this.BASE_ICON = new GIcon();
      this.BASE_ICON.shadow = "/interactivemaps/icons/shadow.png";
      this.BASE_ICON.iconSize = new GSize(30, 26);
      this.BASE_ICON.shadowSize = new GSize(49, 31);
      this.BASE_ICON.iconAnchor = new GPoint(28, 24);
      this.BASE_ICON.infoWindowAnchor = new GPoint(9, 2);
      this.BASE_ICON.infoShadowAnchor = new GPoint(18, 25);
   },

   showGoogleMap: function(data) {
      if (data == null) {
         return;
      } else if (GBrowserIsCompatible()) {
         if (this.BASE_ICON == null) {
            this.initBaseIcon();
         }
         var zoom = data.MapInfo.Zoom;
         var point = new GLatLng(data.MapInfo.Latitude, data.MapInfo.Longitude);
         var bounds = this.getBounds(data);
         var map = new GMap2(document.getElementById('map'));
         if (bounds != null) {
           map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
         } else {
           map.setCenter(point);
           map.setZoom(zoom);
         }

         var mm = new GMarkerManager(map);

         for (var i = 0; i < data.Affiliates.source.length; i++) {
            var d = this.markerData("affiliates", i + 1, data.Affiliates.source[i]);
            if (d != null) mm.addMarker(this.createMarker(map, d), 4);
         }
         for (var i = 0; i < data.Independents.source.length; i++) {
            var d = this.markerData("agents", i + 1, data.Independents.source[i]);
            if (d != null) mm.addMarker(this.createMarker(map, d), 4);
         }

         map.addControl(new GSmallMapControl());
         map.addControl(new GMapTypeControl());
      } else {
         alert("We're sorry, but your browser does not support Google Maps");
      }
   },

   getBounds: function(data) {
      var agents = data.Affiliates.source.concat(data.Independents.source);
      if (agents.length == 0) {
         return null;
      } else if (agents.length == 1) {
         data.MapInfo.Latitude = parseFloat(agents[0].Latitude);
         data.MapInfo.Longitude = parseFloat(agents[0].Longitude);
         data.MapInfo.Zoom = 15;
         return null;
      }
      var minLat = 1000000.0;
      var minLng = 1000000.0;
      var maxLat = -1000000.0;
      var maxLng = -1000000.0;
      for (var i in agents) {
         if (agents[i].Latitude != "0.0" && agents[i].Longitude != "0.0") {
            var lat = parseFloat(agents[i].Latitude);
            var lng = parseFloat(agents[i].Longitude);
            minLat = Math.min(minLat, lat);
            minLng = Math.min(minLng, lng);
            maxLat = Math.max(maxLat, lat);
            maxLng = Math.max(maxLng, lng);
         }
      }
      minLat -= 0.01;
      minLng -= 0.01;
      maxLat += 0.01;
      maxLng += 0.01;
      data.MapInfo.Latitude = (minLat + maxLat) / 2.0;
      data.MapInfo.Longitude = (minLng + maxLng) / 2.0;
      return new GLatLngBounds(new GLatLng(minLat, minLng), new GLatLng(maxLat, maxLng));
   },

   markerData: function(idPrefix, idCount, agent) {
      if (agent.Latitude == "0.0" || agent.Longitude == "0.0") return null;
      var officeContacts = [];
      for (var c in agent.OfficeContacts.list.source) {
         officeContacts.push(agent.OfficeContacts.list.source[c]);
      }
      var products = [];
      if (agent.Products) {
         for (var p in agent.Products.list.source) {
            products.push(agent.Products.list.source[p]);
         }
      }
      return {
         id: idPrefix + '_' + idCount,
         lat: agent.Latitude,
         lng: agent.Longitude,
         name: agent.Name,
         street: agent.Street,
         street2: agent.Street2,
         city: agent.City,
         state: agent.State,
         zip: agent.Zip,
         country: agent.Country,
         phone: agent.Phone,
         fax: agent.Fax,
         url: agent.URL,
         officeContacts: officeContacts,
         districtContact: agent.DistrictContact,
         districtContactPhone: agent.DistrictContactPhone,
         products: products,
         supportContact: agent.SupportContact
      };
   },

   createMarker: function(map, data) {
      var icon = new GIcon(this.BASE_ICON);
      icon.image = "/interactivemaps/icons/" + data.id + ".png";

      var officeTab = this.createOfficeTab(data);
      var detailsTab = this.createDetailsTab(data);
      var siteOverviewTab = this.createSiteOverviewTab(data);
      var directions = this.createDirections(data);

      var marker = new GMarker(new GLatLng(data.lat, data.lng), icon);
      marker.id = data.id;
      marker.marker = marker;
      marker.infoWindowOpen = false;
      marker.toolTipOn = false;
      marker.defaultTabs = [
         new GInfoWindowTab('Office', officeTab + directions),
         new GInfoWindowTab('Details', detailsTab)
      ];
      if (siteOverviewTab) {
         marker.defaultTabs.push(new GInfoWindowTab('Site Overview', siteOverviewTab));
      }

      marker.tooltip = new Tooltip(marker, data.name, 3);
      map.addOverlay(marker.tooltip);

      this.addEventHandlers(marker);
      this.MARKERS[data.id] = marker;
      return marker;
   },

   addEventHandlers: function(marker) {
      GEvent.addListener(marker, 'infowindowclose', function() {
         this.infoWindowOpen = false;
      });
      GEvent.addListener(marker,'infowindowopen', function() {
         this.infoWindowOpen = true;
      });
      GEvent.addDomListener(marker, 'click', this.showInfoWindow);
      GEvent.addListener(marker, 'mouseover', this.showTooltip);
      GEvent.addListener(marker, 'mouseout', this.hideTooltip);
   },

   showInfoWindow: function(i) {
      var marker = i && this.MARKERS ? this.MARKERS[i] : this.marker;
      marker.tooltip.setHide(true);
      marker.tooltip.hide();
      marker.openInfoWindowTabsHtml(marker.defaultTabs);
   },

   showTooltip: function(i) {
      var marker = i && this.MARKERS ? this.MARKERS[i] : this.marker;
      if (!marker.infoWindowOpen) {
         marker.tooltip.show();
      }
   },

   hideTooltip: function(i) {
      var marker = i && this.MARKERS ? this.MARKERS[i] : this.marker;
      marker.tooltip.setHide(true);
      marker.tooltip.hide();
   },

   createOfficeTab: function(data) {
      var html = '<div class="vcard" style="font: 12px Arial, Helvetica, sans-serif;"><div class="org"><strong>' + data.name + '</strong></div>';
      if (data.street || data.street2 || data.city || data.zip || data.state || data.country) {
         html += '<div class="adr">';
         if (data.street) {
            html += '<div class="street-address">' + data.street + '</div>';
         }
         if (data.street2) {
            html += '<div class="street-address">' + data.street2 + '</div>';
         }
         if (data.city && data.state && data.zip) {
            html += '<span class="locality">' + data.city + '</span>, <span class="region">' + data.state + '</span> <span class="postal-code">' + data.zip + '</span>';
            if (data.country && data.country != 'US') {
               html += ' <span class="country-code">' + data.country + '</span>';
            }
         }
         html += '</div>';
      }
      if (data.phone) {
         html += '<div class="tele">' + data.phone + ' <em>phone</em></div>';
      }
      if (data.fax) {
         html += '<div class="tele">' + data.fax + ' <em>fax</em></div>';
      }
      if (data.url) {
         html += '<div style="margin: 5px 0px;"><a class="url" href="' + data.url + '" target="_blank">' + data.url + '</a></div>';
      }
      return html + '</div>';
   },

   print_r: function(data) {
      var str = '';
      var counter = 0;
      for (var i in data) {
         str += 'data[' + i + ']: ' + data[i] + '\n';
      }

      return str;
   },


   createDirections: function(data) {
      var address = data.street + ", " + data.city + ", " + data.state + ", " + data.zip + ", " + data.country;
      //address += " loc:" + data.latitude + "," + data.longitude;

      var form =
      '<div id="directions_form_div" style="visibility: hidden; font: 12px Arial, Helvetica, sans-serif;">'
      + '<form id="directionsform" action="http://maps.google.com/maps" method="get" target="_blank">'
      + '<span id="start_end"></span>&nbsp;address:<br/>'
      + '<input type="text" size="25" maxlength="80" id="addr_text"/>'
      + '<input value="Get Directions" type="submit"/>'
      + '<input type="hidden" id="hidden_addr" value="' + address + '"/>'
      + '</form></div>';

      var str =
      '<div id="directions" style="font: 12px Arial, Helvetica, sans-serif;">Directions: '
      + '<a onClick="tohere()" class="link" id="to_here">To&nbsp;here</a>'
      + ' - '
      + '<a class="link" onClick="fromhere()" id="from_here">From&nbsp;here</a>'
      + form
      + '</div>';

      return str;
   },

   createDetailsTab: function(data) {
      var html = '<div class="vcarddetails" style="font: 12px Arial, Helvetica, sans-serif;">';
      if (data.officeContacts.length > 0) {
         html += '<div class="title"><strong>Office Contact</strong></div>';
      }
      for (i = 0, c = data.officeContacts.length; i < c; ++i) {
         html += '<div style="margin-bottom: 2px; ';
         if (c > 1 && i < (c-1)) {
            html += ' border-bottom: 1px dotted #999999;';
         }
         html += '">';
         html += '<div class="tel">' + data.officeContacts[i] + '</div>';
         html += '<div class="tel">' + data.phone + ' <em>(phone)</em></div>';
         html += '</div>';
      }
      html += '<div class="title"><strong>Agency Services Manager</strong></div>';
      html += '<div class="tel">' + data.districtContact + '</div>';
      html += '<div class="tel">' + data.districtContactPhone + ' <em>(phone)</em></div>';
      html += '</div>';
      return html;
   },

   createSiteOverviewTab: function(data) {
      if (this.PARAMS['showSiteOverviewTab'] != 'true' || (!data.supportContact && data.products.length == 0)) {
         return null;
      }
      var html = '<div class="vcarddetails" style="font: 12px Arial, Helvetica, sans-serif;">';
      if (data.supportContact) {
         html += '<div class="title"><strong>Account Manager</strong></div>';
         html += '<div class="tel">' + data.supportContact + '</div><br>';
      }
      if (data.products.length > 0) {
         html += '<div class="title" style="margin-bottom: 2px"><strong>Products</strong></div>';
         for (i = 0, p = data.products.length; i < p; ++i) {
            var pid = data.products[i].id;
            var n = this.PRODUCTS[pid];
            html += '<div style="margin-bottom: 2px; ';
            if (p > 1 && i < (p-1)) {
               html += ' border-bottom: 1px dotted #999999;';
            }
            html += '">';
            html += '<img class="producticon" alt="' + n + '" title="' + n + '" src="/images/random/' + pid + '.gif" style="margin-right: 4px">';
            if (pid != 'sureclose') {
               html += ' Version: ' + data.products[i].version;
            }
            html += '</div>';
         }
      }
      html += '</div>';
      return html;
   },

   animateOpacity: function(id, newOpac, duration) {
      var oldOpac = document.getElementById(id).style.opacity;
      oldOpac = oldOpac ? Math.round(oldOpac * 100) : 0;
      if (oldOpac == newOpac) return;
      if (!duration || duration <= 0) {
         this.setOpacity(newOpac, id);
         return;
      }
      var steps = Math.abs(oldOpac - newOpac);
      var interval = duration / steps;

      var dir = oldOpac > newOpac ? -1 : 1;
      var timer = 1;
      for (var i = 1; i <= steps; i++) {
         setTimeout("InteractiveMaps.setOpacity(" + (oldOpac + (dir * i)) + ", '" + id + "')", Math.round(i * interval));
         timer++;
      }
   },

   setOpacity: function(opacity, id) {
      var object = document.getElementById(id).style;
      object.opacity = (opacity / 100);
      object.MozOpacity = (opacity / 100);
      object.KhtmlOpacity = (opacity / 100);
      object.filter = "alpha(opacity=" + opacity + ")";
      object.visibility = opacity == 0 ? 'hidden' : 'visible';
      // Fix quirky IE issue:
      if (opacity == 100) object.filter = null;
   },

   toggle: function(duration, data) {
      this.showGoogleMap(data);
      this.animateOpacity('map', data != null ? 100 : 0, duration);
   },

   setZIndex: function(zIndex) {
      document.getElementById('map').style.zIndex = zIndex;
   },

   loadFlashPlugin: function(width, height, extravars) {
      // Major version of Flash required
      var requiredMajorVersion = 9;

      // Minor version of Flash required
      var requiredMinorVersion = 0;

      // Minor version of Flash required
      var requiredRevision = 28;

      // Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
      var hasProductInstall = DetectFlashVer(6, 0, 65);

      // Version check based upon the values defined in globals
      var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);

      if (hasProductInstall && !hasRequestedVersion) {
         // DO NOT MODIFY THE FOLLOWING FOUR LINES
         // Location visited after installation is complete if installation is required
         var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
         var MMredirectURL = window.location;
         document.title = document.title.slice(0, 47) + " - Flash Player Installation";
         var MMdoctitle = document.title;

         AC_FL_RunContent(
            "src", "playerProductInstall",
            "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"&"+extravars,
            "width", width,
            "height", height,
            "align", "middle",
            "id", "InteractiveMaps",
            "quality", "high",
            "wmode", "transparent",
            "name", "InteractiveMaps",
            "allowScriptAccess","sameDomain",
            "type", "application/x-shockwave-flash",
            "pluginspage", "http://www.adobe.com/go/getflashplayer"
         );
      } else if (hasRequestedVersion) {
         // if we've detected an acceptable version
         // embed the Flash Content SWF when all tests are passed
         AC_FL_RunContent(
            "src", "InteractiveMaps",
            "FlashVars", extravars,
            "width", width,
            "height", height,
            "align", "middle",
            "id", "InteractiveMaps",
            "quality", "high",
            "wmode", "transparent",
            "name", "InteractiveMaps",
            "allowScriptAccess","sameDomain",
            "type", "application/x-shockwave-flash",
            "pluginspage", "http://www.adobe.com/go/getflashplayer"
         );
      } else {  // flash is too old or we can't detect the plugin
         var alternateContent = 'Alternate HTML content should be placed here. '
                              + 'This content requires the Adobe Flash Player. '
                              + '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
         document.write(alternateContent);  // insert non-flash content
      }
   },

   showMapDiv: function() {
      parent.document.getElementById('loader').style.display = 'none';
      parent.document.getElementById('interactiveMaps').style.overflow = "visible";
      parent.document.getElementById('interactiveMaps').style.width = "auto";
      parent.document.getElementById('interactiveMaps').style.height = "auto";
   }

};
