var errorNodes = [];
var map = false;
var map_reps = [];
var markers  = [];
var ENTER_ZIPCODE_MESSAGE = "Please enter a zipcode.";

$(document).ready(function(){
   if(typeof $('#name_search').get(0) != 'undefined')
   {
      $('#name_search_header').click(toggle_name_search);
      $('#zip_search_header').click(toggle_zip_search);
      
      $('#name_search').get(0).onsubmit = name_search_on_submit;
      $('#zip_search').get(0).onsubmit = zip_search_on_submit;
      
      $('#name_search_header .collapse_status').html('-');
      $('#zip_search_header .collapse_status').html('-');
   }
});

function clearTopSearchPanel()
{
   if($('[name=zip_search_field_top]').val() == 'Find a rep, enter your zip')
   {
      $('[name=zip_search_field_top]').val('');
   }
}

function resetTopSearchPanel()
{
   if($('[name=zip_search_field_top]').val() == '')
   {
      $('[name=zip_search_field_top]').val('Find a rep, enter your zip');
   }
}

function submitTopSearchPanel(_e, lang)
{
   if(_e.keyCode == 13)
   {
      goTopSearchPanel(lang)
   }
}

function goTopSearchPanel(lang)
{
   if(!$('[name=zip_search_field_top]').val())
   {
      alert(ENTER_ZIPCODE_MESSAGE);
      return false;
   }
   if($('[name=zip_search_field_top]').val() == 'Find a rep, enter your zip')
   {
      alert(ENTER_ZIPCODE_MESSAGE);
      return false;
   }
   
	 if(lang)
	 {
     location.href='/'+lang+'/site/find_a_rep/zip/'+$('[name=zip_search_field_top]').val();
	 }
	 else
	 {
     location.href='/site/find_a_rep/zip/'+$('[name=zip_search_field_top]').val();
	 }
}

function findRepByZipcode(_zip)
{
   $('#zip_search_zip').get(0).value = _zip;
   $('#zip_search_submit').click();
}

var toggle_name_search = function()
{
  var ele = $('#name_search');
  var current = ele.get(0).style.display;

  if(current == 'none')
  {
    $('#name_search_header .collapse_status').html('-');
  }
  else
  {
    $('#name_search_header .collapse_status').html('+');
  }
  if($.browser.msie /*&& $.browser.version > 7*/)
    ele.toggle();
  else
    ele.slideToggle(1000);
}

var toggle_zip_search = function()
{
  var ele = $('#zip_search');
  var current = ele.get(0).style.display;

  if(current == 'none')
  {
    $('#zip_search_header .collapse_status').html('-');
  }
  else
  {
    $('#zip_search_header .collapse_status').html('+');
  }
  if($.browser.msie /*&& $.browser.version > 7*/)
    ele.toggle();
  else
    ele.slideToggle(1000);
}

var name_search_on_submit = function()
{
  var fname = $('#name_search_fname').get(0).value;
  var lname = $('#name_search_lname').get(0).value;
  var state = $('#name_search_state').get(0).value;

  clear_errors();

  if(fname == '' && lname == '')
    show_error_on_field($('#name-message-container'), 'Either First Name or Last Name is required.');

  if(errorNodes.length > 0)
    return false;

  $('#name_search .loading').show();

  $.getJSON('/widget/find_rep/type/name/fname/' + fname + '/lname/' + lname + '/state/' + state, name_search_on_complete);
  
  return false;
}

var zip_search_on_submit = function()
{
  var zip = $('#zip_search_zip').get(0).value;

  clear_errors();

  if(zip == '')
    show_error_on_field($('#zip-message-container'), 'Enter a valid Zip Code.');

  if(errorNodes.length > 0)
    return false;

  $('#zip_search .loading').show();

  $.getJSON('/widget/find_rep/type/zip/zip/' + zip, zip_search_on_complete);

  return false;
}

var name_search_on_complete = function(response)
{
  $('#name_search_loading').hide();

  if(response.error)
    return handle_server_error(response.error);

  if(response.reps.length == 1 && response.reps[0].dir.length > 0)
  {
    //window.location = "/cart/index/rep_id/" + response.reps[0].uid + "/";
    window.location = "/field/" + response.reps[0].dir;
    return false;
  }

  display_results(response.reps);
}

var zip_search_on_complete = function(response)
{
  $('#zip_search_loading').hide();

  if(response.error)
    return handle_server_error(response.error);

  if(response.reps.length == 1)
  {
    window.location = "/field/" + response.reps[0].dir;
    return false;
  }

  display_results(response.reps);
}

var handle_server_error = function(error)
{
  if(error.type == 'field')
  {
    if(error.field == 'zip_search_zip')
    {
      $('#zip-message-container').html(error.message);
      $('#zip-message-container').css('display', 'block');
    }
   
    show_error_on_field($('#' + error.field).get(0), error.message);
  }
  else if(error.type == 'main')
  {
  }
  return false;
}

var display_results = function(reps)
{
  var container = $('#results');
  container.empty();

  if(reps.length == 0)
  {
    $('#search_status').html('Your search found no representatives.');
    return false;
  }
  else
  {
    $('#search_status').html('Found ' + reps.length + ' Representatives.');
  }

  hide_name_search();
  hide_zip_search();

  for(var i = 0; i < reps.length; i++)
  {
    var node = $('<li></li>');
    var imgSrc = reps[i].pic == ''? '/rep_profiles/default/default.jpg' : '/rep_profiles/' + reps[i].uid + '/' + reps[i].pic;
    var imgNode = $('<a onclick="focus_rep(' + i + ')"><img src="' + imgSrc + '" /></a>');

    var nameNode = $('<a class="name" onclick="focus_rep(' + i + ')">' + reps[i].fname + ' ' + reps[i].lname + '</a>');
 
    if(reps[i].distance)
      var milesNode = $('<span class="distance">' + reps[i].distance + ' miles</span>');

    var addressNode = $('<span class="address">' + reps[i].city + ', ' + reps[i].state + ' ' + reps[i].zip + '</span>');
    
    if (reps[i].userlevel == 3)
    {
      var urlNode = $('<a class="shop_link" href="/field/' + reps[i].dir + '/contact_me.html">Contact me</a>');
    }
    else
    {
      var urlNode = $('<a class="shop_link" href="/cart/index/rep_id/' + reps[i].uid + '/">Shop with me</a>');
    }
    
    node.append(imgNode).append(nameNode);

    if(reps[0].distance)
      node.append(milesNode);
    
    node.append(addressNode).append(urlNode);
    container.append(node);
  }

  if(!map)
  {
    init_map();
    if(!map)
      return;
  }

  map.clearOverlays();

  var points = [];
  markers = [];
  map_reps = [];
  
  for(var i = 0; i < reps.length; i++)
  {
    var rep_data = new Object();
    rep_data.data = reps[i];

    var match = 'null';
    for(var j = 0; j < map_reps.length; j++)
    {
      if(map_reps[j].data.lat == reps[i].lat && map_reps[j].data.lng == reps[i].lng)
      {
        match = j;
        break;
      }
    }

    var rep_index = map_reps.length;
    map_reps[rep_index] = rep_data;

    if(match != 'null')
    {
      map_reps[rep_index].marker = map_reps[match].marker;
      markers[map_reps[rep_index].marker].reps.push(rep_index);
    }
    else
    {
      var marker_data = new Object();
      var point = new GLatLng(reps[i].lat, reps[i].lng);
      marker_data.marker = new GMarker(point);
      points.push(point);

      marker_data.reps = [rep_index];
      var marker_index = markers.length;
      markers[marker_index] = marker_data;
      map_reps[rep_index].marker = marker_index;
    }
  }

  var bounds = new GLatLngBounds();
  for(var i = 0; i < points.length; i++)
    bounds.extend(points[i]);

  map.setCenter(bounds.getCenter());
  map.setZoom(map.getBoundsZoomLevel(bounds) - 1);

  for(var i = 0; i < markers.length; i++)
  {
    var marker_reps = markers[i].reps;
    var tabs = [];
    for(var j = 0; j < marker_reps.length; j++)
    {
      var marker_rep = map_reps[marker_reps[j]].data;
      var str = '';
      str += '<div class="info_window" style="height : 20px;">';
      var imgSrc = marker_rep.pic == ''? '/rep_profiles/default/default.jpg' : '/rep_profiles/' + marker_rep.uid + '/' + marker_rep.pic;
      str += '<img src="' + imgSrc + '" width="60px" height="60px" />';
      str += '<p>' + marker_rep.fname + ' ' + marker_rep.lname + '</p>';
      var shoptext = marker_rep.userlevel == 3? 'Contact me' : 'Shop with me';
      str += '<a href="http://www.myparklane.com/repcart/repcart.php?rep_id=' + marker_rep.uid + '">' + shoptext + '</a>';
      str += '<a href="/field/' + marker_rep.dir + '">Visit Web Site</a>';
      str += '<a href="/field/' + marker_rep.dir + '/contact.html">Send E-mail</a>';
      str += '</div>';
      tabs.push(new GInfoWindowTab(marker_rep.fname, str));
    }
    markers[i].tabs = tabs;
    markers[i].marker.bindInfoWindowTabsHtml(tabs);
    map.addOverlay(markers[i].marker);
  }
}

var focus_rep = function(index)
{
  var rep = map_reps[index];
  var marker_data = markers[rep.marker];
  var lat_lng = marker_data.marker.getLatLng();
  map.setCenter(lat_lng);
  map.setZoom(15);
  marker_data.marker.openInfoWindowTabsHtml(marker_data.tabs);
}

var hide_name_search = function()
{
  if($.browser.msie /*&& $.browser.version > 7*/)
    $('#name_search').hide();
  else
    $('#name_search').slideUp(1000);

  $('#name_search_header .collapse_status').html('+');
}

var hide_zip_search = function()
{
  if($.browser.msie /*&& $.browser.version > 7*/)
    $('#zip_search').hide();
  else
    $('#zip_search').slideUp(1000);

  $('#zip_search_header .collapse_status').html('+');
}

var show_error_on_field = function(fieldNode, message)
{
   fieldNode.html(message);
   fieldNode.css('display', 'block');

   var errorNode = $('<p class="error">' + message + '</p>').get(0);
   errorNodes.push(errorNode);
   return errorNode;
  
  //var container = fieldNode.parentNode;
  //var errorNode = $('<p class="error">' + message + '</p>').get(0);
  //container.appendChild(errorNode);
  //errorNodes.push(errorNode);
  //return errorNode;
}


var clear_errors = function()
{
  //for(var i = 0; i < errorNodes.length; i++)
  //{
    //errorNodes[i].parentNode.removeChild(errorNodes[i]);
    //errorNodes[i].html('');
  //}
  
   $('#name-message-container').html('');
   $('#name-message-container').css('display', 'none');
   
   $('#zip-message-container').html('');
   $('#zip-message-container').css('display', 'none');
  
  errorNodes = [];
}

function init_map()
{
  if (GBrowserIsCompatible()) 
  {
    map = new GMap2(document.getElementById("map_canvas"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
  }
  else 
  {
    alert('Your browser is not compatible with our mapping implementation. You will not be able to view representatives on the map.');
  }
}

