(function ($) {
    $.fn.tkLocalSubmitter = function (fields, statuscallback) {
      
        var formfilled = function() {
            var filled = true;
            $.each(fields, function(field) {
                var input = $(fields[field])
                if( input.hasClass('blur') ) {
                    filled = false;
                } else {
                    if( input.val().length === 0) {
                        filled = false;                    
                    }
                }
            });
            return filled;
        };
        
        return this.each(function () {                   
            $.each(fields, function(field) {
                $(fields[field])
                .keypress( function(e) {
                    if(e.keyCode == 13) {
                        if( !formfilled() ) {                                
                            var next = field+1;
                            if(next>=fields.length) {
                                next = 0;
                            }
                            $(fields[next]).focus();
                            $(fields[field]).triggerHandler('blur');
                            return false;
                        }
                    }
                })
                .keyup( function(e) {
                  statuscallback(!formfilled());
                })
                .attr('autocomplete','off'); // Work round FF bug
            });                                
        });
        };
})(jQuery);

var TKLocal = {
  start: function() {
    var self = this;
    this.setHeight();
    if (GBrowserIsCompatible()) {
      TKLocal.map = new GMap2(document.getElementById("map_canvas"));
      
      TKLocal.baseIcon = new GIcon(G_DEFAULT_ICON);
      TKLocal.baseIcon.shadow = "/minisites/local/images/markers/shadow.png";
      TKLocal.baseIcon.iconSize = new GSize(20, 34);
      TKLocal.baseIcon.shadowSize = new GSize(37, 34);
      TKLocal.baseIcon.iconAnchor = new GPoint(9, 34);
      TKLocal.baseIcon.infoWindowAnchor = new GPoint(9, 2);

      
      TKLocal.geocoder = new GClientGeocoder();
      TKLocal.geocoder.setBaseCountryCode('uk');
      var sw = new GLatLng(50.176898,-12.172852); 
      var ne = new GLatLng(60.543775,3.603516); 
      TKLocal.bounds = new GLatLngBounds(sw, ne); 

      TKLocal.map.setCenter(TKLocal.bounds.getCenter(), TKLocal.map.getBoundsZoomLevel(TKLocal.bounds));
      TKLocal.map.setUIToDefault();

      TKLocal.drawMarkers();
    }
        
    // hints
    $(function(){ 
      $('input[title]').hint();
      $(window).resize(function() {
        self.setHeight();
      });
    });

    if ($('#what').hasClass('blur') || $('#where').hasClass('blur') || !$('#what').val().length || !$('#where').val().length) {
      $('#dosearch').addClass('disabled');
    }

    $('#localform').tkLocalSubmitter(['#what','#where'], function(searchdisabled) {
      if (searchdisabled) {
        $('#dosearch').addClass('disabled');
      } else {
        $('#dosearch').removeClass('disabled');
        }
    });

    // toggle other interpretations
    TKLocal.enableInterpretationToggle();

    $('#resultstoggle').click(function() {
      TKLocal.toggleResults();
    });

    $('#localform').submit(function() {
      $('.lc_results > *').hide();
      $('#pending').show();
    });

    // what
    // select interpretation
    $('.lc_what_interps .lc_interp .lc_interp_trigger').click(function() {
      $('.lc_what_interps').hide();
      var interpretationdiv = $(this).closest('.lc_interp');
      TKLocal.setSelectedWhat($(this).closest('.lc_interp'));
    });
    // keep interpretation
    $('.lc_what_interps .lc_interp_selected .lc_interp_trigger').click(function() {
      $('.lc_what_interps').hide();
      $('#sponsored_link').show();
      $('#resultswrapper').show();
      $('.lc_ambig_panel').show();
    });

    // where
    // select interpretation
    $('.lc_where_interps .lc_interp .lc_interp_trigger').click(function() {
      $('.lc_where_interps').hide();
      var interpretationdiv = $(this).closest('.lc_interp');
      TKLocal.setSelectedWhere($(this).closest('.lc_interp'));
    });
    // keep interpretation
    $('.lc_where_interps .lc_interp_selected .lc_interp_trigger').click(function() {
      $('.lc_where_interps').hide();
      $('#sponsored_link').show();
      $('#resultswrapper').show();
      $('.lc_ambig_panel').show();
    });

    TKLocal.initialiseFeedback();
    $('#what')    
      .autocomplete('/ajax/local/autocompletewhat',{
        max:10,   
        cachelength:1,
        minChars:1,
        formatResult: TKLocal.acFormatResult,
        formatItem: TKLocal.acFormatItem,
        selectFirst: false
    });         
    $('#where')   
      .autocomplete('/ajax/local/autocompletewhere',{
        max:10,   
        cachelength:1,
        minChars:1,
        formatResult: TKLocal.acFormatResult,
        formatItem: TKLocal.acFormatItem,
        selectFirst: false
    });

  },
  acFormatResult: function(row) {
    if (row[0].indexOf('**') === 0) {
      return row[0].substring(2);
    } else {
      return row[0];
    }
  },
  acFormatItem: function(row) {
    if (row[0].indexOf('**') === 0) {
      row[0] = "<div class='lastrecent'>" + row[0].substring(2) + "</div>";
    }
    return row[0];
  },
  setHeight: function() {
    // 5px due to IE scrollbar
    
    var contentHeight = $(window).height()
      - $('#header_row').height() - 2;
        
    $('#content').css('height', contentHeight);
    
    var resultsHeight = $('#content').height() - $('#related_links').height() - 2;
        
    $('#results_row').css('height',resultsHeight - 1);
    $('#main').css('height',resultsHeight);
    $('.lc_results').css('height',resultsHeight - $('.lc_result_title').height() - $('.lc_result_footer').height());
    $('#map_canvas').css('height',resultsHeight - $('#main_header').height() - $('.lc_result_footer').height() - $('#ads_row').height());
    $('.map_cell').css('height',resultsHeight - $('#main_header').height() - $('.lc_result_footer').height() - $('#ads_row').height());
    
  },
  initialiseFeedback: function() {
    // set up event handlers
    $('#lc_no').click(function() {
      $(this).addClass('lc_selected');
      $('#lc_yes').removeClass('lc_selected').hide();
      $('#lc_tellmore_trigger').show();
      data = {'command[]':['feedback'], 'search_what':$('#what').val(), 'search_where':$('#where').val(), 'open':$('#open').attr('checked'), 'feedback_found_wanted':'no'}
      $.post('/ajax/local/command', data);
    });

    $('#lc_yes').click(function() {
      $(this).addClass('lc_selected');
      $('#lc_no').removeClass('lc_selected').hide();
      $('#lc_tellmore_trigger').show();
      data = {'command[]':['feedback'], 'search_what':$('#what').val(), 'search_where':$('#where').val(), 'open':$('#open').attr('checked'), 'feedback_found_wanted':'yes'}
      $.post('/ajax/local/command', data);
    });

    $('#lc_tellmore_trigger').click(function() {
      $(this).addClass('lc_selected');
      $('#feedback_text').show();
    });

    $('#fb_confirm').click(function() {
      $('#fb_cancel').hide();
      $('#fb_confirm').hide();
      $('#fb_spinner').show();
      var ffw;

      if ($('#lc_yes').hasClass('lc_selected')) {
        ffw = 'yes';
      } else if ($('#lc_no').hasClass('lc_selected')) {
        ffw = 'no';
      }
      data = {'command[]':['feedback'], 'search_what':$('#what').val(), 'search_where':$('#where').val(), 'open':$('#open').attr('checked'), 'feedback_found_wanted':ffw, 'feedback_tell_more':$('#feedback_textarea').val()}

      TKLocal.tellmore_xhr = $.post('/ajax/local/command', data);

    });

    $('.lc_feedbackholder').ajaxComplete(function(event,request,settings) {
    	if (request && request === TKLocal.tellmore_xhr) {
        $('#feedback_text').hide();
        $('#lc_tellmore_trigger').removeClass('lc_selected');
        $('#fb_cancel').show();
        $('#fb_confirm').show();
        $('#fb_spinner').hide();
        $('#feedback_textarea').val('');
    	}
 	  });


    $('#fb_cancel').click(function() {
      $('#feedback_text').hide();
      $('#lc_tellmore_trigger').removeClass('lc_selected');
    });

  },
  resetFeedback: function() {
    // set states
    $('#lc_no').removeClass('lc_selected').show();
    $('#lc_yes').removeClass('lc_selected').show();
    $('#lc_tellmore_trigger').hide();
    $('#feedback_text').hide();
  },
  enableInterpretationToggle: function() {
    $('#selected_what_urs .ambig_term_trigger').click(function() {
        $('.lc_ambig_panel').hide();
        $('#sponsored_link').hide();
        $('#resultswrapper').hide();
        $('.lc_what_interps').show();
    });
    $('#selected_where_urs .ambig_term_trigger').click(function() {
        $('.lc_ambig_panel').hide();
        $('#sponsored_link').hide();
        $('#resultswrapper').hide();
        $('.lc_where_interps').show();
    });
  },
  toggleResults: function() {
    if (TKLocal.resultsShown) {
      $('#resultstitle').hide();
      $('.lc_results').hide();
      $('#main').css('margin-left', '0');
      $('#resultstitleholder').css('width', '25px');
      $('.lc_result_title').css('width', '25px');
      $('#resultstoggle img').attr('src', '/minisites/local/images/opener.png')
    } else {
      $('#resultstitle').show();
      $('.lc_results').show();
      $('#main').css('margin-left', '340px');
      $('#resultstitleholder').css('width', '340px');
      $('.lc_result_title').css('width', '340px');
      $('#resultstoggle img').attr('src', '/minisites/local/images/closer.png')
    }
    TKLocal.map.checkResize();
    TKLocal.resultsShown = !TKLocal.resultsShown;
  },
  setSelectedWhat: function(what) {
    if (!what.text()) {
      return;
    }
    
    $('#search_what_id').val($('.lc_id',what).text());
    $('#search_type').val($('.lc_type',what).text());
    $('.lc_results > *').hide();
    $('#pending').show();
    $('#localform').submit();
      
  },
  setSelectedWhere: function(where) {
    if (!where.text()) {
      return;
    }
    
    $('#search_where_id').val($('.lc_id',where).text());
    $('.lc_results > *').hide();
    $('#pending').show();
    $('#localform').submit();
      
  },
  drawMarkers: function() {
      TKLocal.bounds = new GLatLngBounds();
      TKLocal.hasMarkers = false;
      $('.wherecoords').each(function(i) {
        TKLocal.hasMarkers = true;
        //if ($('.address',self).text()) {
        //  var self = $(this);
        //  TKLocal.geocoder.getLocations(
        //    $('.address',self).text(),
        //    function(response) {
        //      if (response && response.Status.code === 200 && response.Placemark.length === 1 && response.Placemark[0].AddressDetails.Accuracy > 6) {
        //        var place = response.Placemark[0];
        //        $('.lat',self).text(place.Point.coordinates[1]);
        //        $('.long',self).text(place.Point.coordinates[0]);
        //      }
        //      var point = new GLatLng($('.lat',self).text(), $('.long',self).text());
        //      TKLocal.bounds.extend(point);
        //      var marker = createMarker(point, 100, "here", false);
        //      TKLocal.map.addOverlay(marker);
        //      if (i+1 === $('.wherecoords').length) {
        //        TKLocal.setZoom();   
        //      }
        //    }          
        //  );
        //} else {
          var point = new GLatLng($('.lat',$(this)).text(), $('.long',$(this)).text());
          TKLocal.bounds.extend(point);
          var marker = createMarker(point, 100, "here", false);
          TKLocal.map.addOverlay(marker);
          if (i+1 === $('.wherecoords').length) {
            TKLocal.setZoom();   
          }
        //}
      });
      
      $('.possiblecoord').each(function(i) {
        var self = $(this);
        TKLocal.geocoder.getLocations(
          $('.business_addr',self.parent()).text(),
          function(response) {
            if (response && response.Status.code === 200 && response.Placemark.length === 1 && response.Placemark[0].AddressDetails.Accuracy > 6) {
              var place = response.Placemark[0];
              $('.lat',self).text(place.Point.coordinates[1]);
              $('.long',self).text(place.Point.coordinates[0]);
            }
            TKLocal.processPoint(self, i, 'possible');
            if (i+1 === $('.possiblecoord').length) {
              TKLocal.setZoom();   
            }
          }          
        );
      });

      $('.likelycoord').each(function(i) {
        var self = $(this);
        TKLocal.geocoder.getLocations(
          $('.business_addr',self.parent()).text(),
          function(response) {
            if (response && response.Status.code === 200 && response.Placemark.length === 1 && response.Placemark[0].AddressDetails.Accuracy > 6) {
              var place = response.Placemark[0];
              $('.lat',self).text(place.Point.coordinates[1]);
              $('.long',self).text(place.Point.coordinates[0]);
            }
            TKLocal.processPoint(self, i, 'likely');
            if (i+1 === $('.likelycoord').length) {
              TKLocal.setZoom();   
            }
          }          
        );
      });
    },
    processPoint: function(element, index, type) {
      TKLocal.hasMarkers = true;
      var point = new GLatLng($('.lat',element).text(), $('.long',element).text());
      TKLocal.bounds.extend(point);
    
      var name = $('.business_link',element.parent()).html();
      var image = $('.business_image',element.parent()).html();
      var address = $('.business_addr',element.parent()).html();
      var phone = $('.business_phone',element.parent()).html();
      var distance = $('.business_distance',element.parent()).html();
    
      var markerHTML = "";
      
      markerHTML += "<table style='width: 320px;'>";
      markerHTML += "<tr>";
      markerHTML += "  <td colspan='2' class='business_link'>" + name + "</td>";
      markerHTML += "</tr>";
      markerHTML += "<tr>";
      markerHTML += "  <td class='business_image'>" + image + "</td>";
      markerHTML += "  <td valign='top'>";
      markerHTML += "<div class='business_addr'>" + address + "</div>";
      markerHTML += "<div class='business_phone'>" + phone + "</div>";
      if (distance!=null)
      {
        markerHTML += "<div class='business_distance'>" + distance + "</div>";
      }
      markerHTML += "</td>";
      markerHTML += "</tr>";
      markerHTML += "</table>";
      
      var marker = createMarker(point, index, type,markerHTML);
    
      TKLocal.map.addOverlay(marker);
      element.parent().click(function() {
        $('.lc_result').removeClass('selected');
        $(this).addClass('selected');
        marker.openInfoWindowHtml(markerHTML);
      });
    },
    setZoom: function() {
      if (TKLocal.hasMarkers) {
        var boundsZoom = TKLocal.map.getBoundsZoomLevel(TKLocal.bounds);
        if (boundsZoom > 15) {
          boundsZoom = 15;
        }
        TKLocal.map.setZoom(boundsZoom);
        TKLocal.map.setCenter(TKLocal.bounds.getCenter());
      }
    },
    map: 0,
    geocoder: 0,
    bounds: 0,
    hasMarkers: false,
    resultsShown: true,
    tellmore_xhr: false,
    baseIcon: false
}

// Creates a marker whose info window displays the letter corresponding
// to the given index.
function createMarker(point, index, prefix, html) {
  var letteredIcon = new GIcon(TKLocal.baseIcon);
  letteredIcon.image = getMarkerURL(index, prefix);

  // Set up our GMarkerOptions object
  markerOptions = { icon:letteredIcon };
  var marker = new GMarker(point, markerOptions);
  if (html) {
    GEvent.addListener(marker, "click", function() {
                  marker.openInfoWindowHtml(html);
                  });
  }
  return marker;
}

function getMarkerURL(index, prefix) {
  // Create a lettered icon for this point using our icon class
  var letter = String.fromCharCode("A".charCodeAt(0) + index);
  if (index >= 26) {
    letter = "";
  }
  return "/minisites/local/images/markers/" + prefix + letter + ".png";
}
