var fade_speed = jQuery.browser.msie ? 0 : 400;
var shown_classes = {
  'stores': [],
  'restaurants': [],
  'attractions': [],
  'events': []
}
function redraw_by_class($container, class_list) {
  $('ol>li', $container).hide(fade_speed);
  $('ol>li', $container).each(function() {
    var found = 0;
    for(var i = 0; i < class_list.length; ++i) {
      if($(this).hasClass(class_list[i])) {
        ++found;
      }
    }
    if(found == class_list.length) {
      $(this).show(fade_speed);
    }
  });
}
function redraw_all($container) {
  $('ol>li', $container).hide(fade_speed);
  $('ol>li', $container).show(fade_speed);
}
function remove_items(old_list, to_remove) {
  var new_list = [];
  while(old_list.length) {
    var current_item = old_list.splice(0, 1);
    var found = false;
    for(var i = 0; i < to_remove.length; ++i) {
      if(current_item[0] == to_remove[i]) {
        found = true;
        break;
      }
    }
    if(!found) {
      new_list[new_list.length] = current_item[0];
    }
  }
  return new_list;
}
function manage_selectbox(sb, mylist, $container) {
  var all_opts = [];
  for(var i = 0; i < sb.options.length; ++i) {
    all_opts[all_opts.length] = sb.options[i].value;
  }
  shown_classes[mylist] = remove_items(shown_classes[mylist], all_opts);
  if(sb.options[sb.selectedIndex].value) {
    shown_classes[mylist][shown_classes[mylist].length] = sb.options[sb.selectedIndex].value;
    redraw_by_class($container, shown_classes[mylist]);
  } else {
    redraw_by_class($container, shown_classes[mylist]);
  }
}
function manage_togglebox(tb, mylist, $container, $my_group, all_opts, my_opts) {
  shown_classes[mylist] = remove_items(shown_classes[mylist], all_opts);
  if($(tb).hasClass('selected')) {
    $(tb).removeClass('selected');
    redraw_by_class($container, shown_classes[mylist]);
  } else {
    $my_group.removeClass('selected');
    $(tb).addClass('selected');
    for(var i = 0; i < my_opts.length; ++i) {
      shown_classes[mylist][shown_classes[mylist].length] = my_opts[i];
    }
    redraw_by_class($container, shown_classes[mylist]);
  }
}

function get_classes(array_of_classes, classname_prepend) {
  var my_list = '';
  for(var j = 0; j < array_of_classes.length; ++j) {
    my_list += classname_prepend + array_of_classes[j]+' ';
  }
  return my_list;
}
function put_my_content($container, html_fragment) {
  if(jQuery.browser.msie) { html_fragment = innerShiv(html_fragment); }
  $container.append(html_fragment);
}

$(function() {
  $('#stores header').hide(); $('#dines header').hide(); $('#atts header').hide();
  $('#events header').hide(); $('#events h2').hide();
  $('#mallinfo header').hide(); $('#mallinfo h2').hide();
  
  $('input.vasearchform-searchtype').click(function() {
    if(this.checked) {
      if(this.value == 'all') {
        $('input.vasearchform-searchtype').each(function() {
          if(this.value != 'all') {
            this.checked = false;
          }
        });
      } else {
        $('#vasearchform-searchtype-all').get(0).checked = false;
      }
    }
  });
  
  $('#vasearchform-events-category').change(function() {
    manage_selectbox(this, 'events', $('#events'));
  });
  $('#vasearchform-stores-category').change(function() {
    manage_selectbox(this, 'stores', $('#stores'));
  });
  $('#vasearchform-stores-near').change(function() {
    manage_selectbox(this, 'stores', $('#stores'));
  });
  $('#vasearchform-restaurants-times').change(function() {
    manage_selectbox(this, 'restaurants', $('#dines'));
  });
  $('#vasearchform-restaurants-near').change(function() {
    manage_selectbox(this, 'restaurants', $('#dines'));
  });
  $('#vasearchform-attractions-near').change(function() {
    manage_selectbox(this, 'attractions', $('#atts'));
  });
  
  $('input.price-filter-button').click(function() {
    manage_togglebox(this, 'restaurants', $('#dines'),
      $('input.price-filter-button'), ['P1', 'P2', 'P3'],
      this.value == '$' ? ['P1'] : (this.value == '$$' ? ['P2'] : (this.value == '$$$' ? ['P3'] : []))
      );
  });
  $('#vasearchform-stores-new').click(function() {
    manage_togglebox(this, 'stores', $('#stores'),
      $('#vasearchform-stores-new'), ['cspNew'], ['cspNew']
      );
  });
  $('#vasearchform-restaurants-new').click(function() {
    manage_togglebox(this, 'restaurants', $('#dines'),
      $('#vasearchform-restaurants-new'), ['cspNew'], ['cspNew']
      );
  });
  $('#vasearchform-attractions-new').click(function() {
    manage_togglebox(this, 'attractions', $('#atts'),
      $('#vasearchform-attractions-new'), ['cspNew'], ['cspNew']
      );
  });
  
	$('#vasearchform-search').focus(function(){
		$('#searchmessage p').hide(fade_speed);
	});

  $('#vasearchform').submit(function() {
    var tchkd = false;
    $('input.vasearchform-searchtype').each(function() {
      if(this.checked) { tchkd = true; }
    });
    if(!tchkd) {
      $('#vasearchform-searchtype-all').get(0).checked = true;
    }
    
    var sterm = $('#vasearchform-search').val();
    if(sterm == 'SEARCH CATEGORIES' || sterm == '') {
      alert('Please put in a search term.');
    } else {
      $('#vasearchformbg').addClass('anim');
      $('#phrase ol').hide(fade_speed);
      $('#oops header').hide(fade_speed); $('#oops ul').hide(fade_speed);
      $('#stores header').hide(fade_speed); $('#dines header').hide(fade_speed); $('#atts header').hide(fade_speed);
      $('#events header').hide(fade_speed); $('#events h2').hide(fade_speed);
      $('#mallinfo header').hide(fade_speed); $('#mallinfo h2').hide(fade_speed);
      $('#stores ol').hide(fade_speed); $('#dines ol').hide(fade_speed); $('#atts ol').hide(fade_speed);
      $('#event-upcoming').hide(fade_speed); $('#event-happening').hide(fade_speed); $('#event-recent').hide(fade_speed);
      $('#mallinfo-guests').hide(fade_speed); $('#mallinfo-visit').hide(fade_speed); $('#mallinfo-about').hide(fade_speed);
      $.getJSON(this.action, $(this).serialize(), function(data) {
        window.json_return_object = data;
        if(data.ok) {
          var counter = 0;
          
          $s_cats = $('#vasearchform-events-category');
          $s_cats.html('<option value="">All Categories</option>'+data.evcategories);
          
          $s_cats = $('#vasearchform-stores-category');
          $s_cats.html('<option value="">Category Filter</option>'+data.shopcategories);

          $d_sv = $('#vasearchform-restaurants-times');
          $d_sv.html('<option value="">Service Times Filter</option>'+data.dinetimes);
          
          $('input.price-filter-button').removeClass('selected');
          
          $('#stores ol').html('');
          for(var i = 0; i < data.shophtml.length; ++i) {
            var cls = '';
            cls += get_classes(data.shophtml[i].cats, 'c');
            put_my_content($('#stores ol'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.shophtml[i].html+'</li>');
          }
          
          $('#dines ol').html('');
          for(var i = 0; i < data.dinehtml.length; ++i) {
            var cls = '';
            cls += get_classes(data.dinehtml[i].price, '');
            cls += get_classes(data.dinehtml[i].svc, 's');
            cls += get_classes(data.dinehtml[i].cats, 'c');
            put_my_content($('#dines ol'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.dinehtml[i].html+'</li>');
          }

          $('#atts ol').html('');
          for(var i = 0; i < data.atthtml.length; ++i) {
            var cls = '';
            cls += get_classes(data.atthtml[i].cats, 'c');
            put_my_content($('#atts ol'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.atthtml[i].html+'</li>');
          }

          $('#event-upcoming').html('');
          for(var i = 0; i < data.ev.u.length; ++i) {
            var cls = 'info ';
            cls += get_classes(data.ev.u[i].cats, 'c');
            put_my_content($('#event-upcoming'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.ev.u[i].html+'</li>');
          }
          $('#event-happening').html('');
          for(var i = 0; i < data.ev.h.length; ++i) {
            var cls = 'info ';
            cls += get_classes(data.ev.h[i].cats, 'c');
            put_my_content($('#event-happening'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.ev.h[i].html+'</li>');
          }
          $('#event-recent').html('');
          for(var i = 0; i < data.ev.r.length; ++i) {
            var cls = 'info ';
            cls += get_classes(data.ev.r[i].cats, 'c');
            put_my_content($('#event-recent'), '<li id="'+(++counter)+'" class="'+cls+'">'+data.ev.r[i].html+'</li>');
          }

          $('#mallinfo-guests').html('');
          for(var i = 0; i < data.mallinfo.guests.length; ++i) {
            put_my_content($('#mallinfo-guests'), '<li id="'+(++counter)+'" class="info">'+data.mallinfo.guests[i]+'</li>');
          }
          $('#mallinfo-visit').html('');
          for(var i = 0; i < data.mallinfo.visit.length; ++i) {
            put_my_content($('#mallinfo-visit'), '<li id="'+(++counter)+'" class="info">'+data.mallinfo.visit[i]+'</li>');
          }
          $('#mallinfo-about').html('');
          for(var i = 0; i < data.mallinfo.about.length; ++i) {
            put_my_content($('#mallinfo-about'), '<li id="'+(++counter)+'" class="info">'+data.mallinfo.about[i]+'</li>');
          }
          
          $('#vasearch .results ol > li').each(function() {
            if($('section.offers', $(this)).html() == '') {
              $('section.matches li.offer', $(this)).remove();
            } else if($('section.matches li.offer span', $(this)).html() == '()') {
              $('section.matches li.offer span', $(this)).remove();
            }
          });
          
          var noshow = true;
          
          if(data.shophtml.length && ($('#vasearchform-searchtype-all').get(0).checked || $('#vasearchform-searchtype-stores').get(0).checked)) {
            $('#stores header').show(fade_speed);
            $('#stores ol').show(fade_speed);
            noshow = false;
          }
          if(data.dinehtml.length && ($('#vasearchform-searchtype-all').get(0).checked || $('#vasearchform-searchtype-restaurants').get(0).checked)) {
            $('#dines header').show(fade_speed);
            $('#dines ol').show(fade_speed);
            noshow = false;
          }
          if(data.atthtml.length && ($('#vasearchform-searchtype-all').get(0).checked || $('#vasearchform-searchtype-attractions').get(0).checked)) {
            $('#atts header').show(fade_speed);
            $('#atts ol').show(fade_speed);
            noshow = false;
          }
          if((data.ev.u.length + data.ev.h.length + data.ev.r.length) && ($('#vasearchform-searchtype-all').get(0).checked || $('#vasearchform-searchtype-events').get(0).checked)) {
            $('#events header').show(fade_speed);
            if(data.ev.u.length) { $('#events h2.event-upcoming').show(fade_speed); }
            if(data.ev.h.length) { $('#events h2.event-happening').show(fade_speed); }
            if(data.ev.r.length) { $('#events h2.event-recent').show(fade_speed); }
            $('#events ol').show(fade_speed);
            noshow = false;
          }
          if((data.mallinfo.guests.length + data.mallinfo.visit.length + data.mallinfo.about.length) && ($('#vasearchform-searchtype-all').get(0).checked || $('#vasearchform-searchtype-mallinfo').get(0).checked)) {
            $('#mallinfo header').show(fade_speed);
            if(data.mallinfo.guests.length) { $('#mallinfo h2.mallinfo-guests').show(fade_speed); }
            if(data.mallinfo.visit.length) { $('#mallinfo h2.mallinfo-visit').show(fade_speed); }
            if(data.mallinfo.about.length) { $('#mallinfo h2.mallinfo-about').show(fade_speed); }
            $('#mallinfo ol').show(fade_speed);
            noshow = false;
          }
          
          $('#phrase ol').html('');
          if(data.found_phrase) {
            $('#phrase ol').html('<li class="info">'+data.found_phrase+'</li>');
            $('#phrase ol').show(fade_speed);
            noshow = false;
          }
          
          if(noshow) {
            $('#oops').html(data.oops);
            $('#oops header').show(fade_speed);
            $('#oops ul').show(fade_speed);
          }
        } else {
          alert('Search failed. Please try again.');
        }
        $('#vasearchformbg').removeClass('anim');
      });
    }

    return false;
  });

  if($('#dosearch').length) $('#vasearchform').submit();
  
  $(document).ajaxError(function(e, xhr, settings, exception) { 
    alert('error in: ' + settings.url + ' \n'+'error:\n' + xhr.responseText ); 
    $('#vasearchformbg').removeClass('anim');
  });
});
