/**  Debug Functions **/
function print_r(theObj){
   if(theObj.constructor == Array || theObj.constructor == Object){
      document.write("<ul>")
      for(var p in theObj){
         if(theObj[p].constructor == Array || theObj[p].constructor == Object){
            document.write("<li>["+p+"] => "+typeof(theObj)+"</li>");
            document.write("<ul>")
            print_r(theObj[p]);
            document.write("</ul>")
         } else {
            document.write("<li>["+p+"] => "+theObj[p]+"</li>");
         }
      }
      document.write("</ul>")
   }
}

$(document).ready(
	function () {
      $("#errorContainer").ajaxError(function(event, request, settings){
         if (settings.type != 'GET') {
            $(this).append('<p>We\'re sorry, but the Circle City Tickets web site is experiencing a temporary problem. If you could try going back and attempting your transaction again, it will probably clear itself up. This can occasionally happen when the site is under heavy load. If this problem persists, please call us at (317) 254-9500 or submit a  <a onclick="showBugForm();">bug report</a>. Thanks!</p>').slideDown('slow');
            $('.loadingAnimation').fadeOut('slow');
         }
      });
    	$('#jsWarning').hide();

        if ($.browser.msie && ($.browser.version == 6)) {
          $("#errorContainer").append('<p>We would like to politely request that you think about upgrading your browser from IE 6, as you will notice a significant increase in speed and quality of your experience.<br /><a href="/error/browser/">See here for Upgrade Help</a></p>').slideDown('fast');
        }
        $('#miniSearch').autocomplete(
        		"/search/suggest/",
        		{
        			minChars:5,
        			//matchSubset:0,
        			//matchContains:0,
        			cacheLength:0,
        			onItemSelect:selectEvent,
        			onFindValue:findValue,
        			formatItem:formatEvent,
        			autoFill:true,
        			width:350,
        			maxItemsToShow:10,
        			showAllEntry:true,
        			showMoreEntry:true
        		}
        	);
        $('#fieldset-searchGroup li label').labelOver('searchLabel');
        $('#bugReport').jqm({ajax:'/index/support/', modal:true});

        // Force an ajax error for testing the bug report feature
        /*$.ajax({
            type: 'POST',
            url: '/blah',
            datatype: 'json',
            success: function(data){
                alert('uhh what');
            }
        });*/
	}
);

/** Print Functions **/
function printPage()
{
   window.print();
}

/** Sort Results **/
function sortResults(sortBy)
{
    $.ajax({
     type: 'POST',
     url: '/search/sort-results/sortBy/' + sortBy,
     data: '',
     success: function(updatedResults){
        $("#listContainer").html(updatedResults);
        $('.inActiveFilter').addClass('activeFilter');
        $('.inActiveFilter').removeClass('inActiveFilter');
     }
    });
}
/** Search Functions **/
function updateSearch(searchFor)
{
   $('#miniSearch').val(searchFor);
   $('#miniSearchForm').trigger('submit');
}

/** Error Functions **/
function showErrors()
{
   $('#errorContainer').slideDown('slow');
}

/** Checkout Functions **/
function preparePaymentForm()
{
   $('#paymentForm').attr('action', '/checkout/process-order/');
   $('#process').bind('click',function(){$('#paymentForm').trigger("submit")});
   $('#payment_card_expiration').mask('99/9999',{placeholder:' '});
   $('#payment_card_cvv').after('<img src="/images/ico-help.png" alt="Whats this?" id="whatsThisTrigger" class="jqModal" />');
   $('#whatsThis').jqm();
}

function prepareCartForm()
{
   //$('#validationHolder').cluetip({cluetipClass: 'jtip',local:true, arrows:true, activation: 'click'});
   $('#cartForm').attr('action', '/checkout/');
   $('#cartButton').bind('click',function(){
      if ($('#shippingOption').val() != '') {
         $('#cartForm').trigger("submit");
      } else {
         $('#shippingOption').attr('onchange','$("#shippingError").hide();');
         //$('#validationHolder').trigger('dblclick');
         $('#shippingError').show();
      }
   });
}

function clearValidation()
{
   $('#validationHolder').trigger('click');
   $('#shippingOption').attr('onchange', '');
}

function continueShopping(url)
{
   location.href = url;
}

function checkout()
{
   location.href = '/cart/view/';
}

function loadCartDetails()
{
   $.ajax({
      type: 'POST',
      url: '/cart/view-mini/',
      success: function(cart){
         $('.rightCol').html(cart);
      }
   });
}

function processOrder(functionCall)
{
   $.ajax({
      type: 'POST',
      dataType: 'json',
      url: '/checkout/' + functionCall + '/',
      success: function(jsonData){
            if (jsonData.chain != '' && jsonData.chain != undefined) {
               $('.leftCol .loadingAnimation p').text(jsonData.message);
               processOrder(jsonData.chain);
            }
            if (jsonData.action == 'redirect') {
               redirectUser(jsonData.location);
            }
      }
   });
}

/** Shopping Cart Functions **/
function addToCart(tickets_id)
{
   var field = $('#ticket_' + tickets_id + '_form :input').not(':hidden');

   if ($(field[0]).val() != '') {
      //$('#ticket_' + tickets_id + '_form').trigger('submit');
      $.ajax({
         type: 'POST',
         dataType: 'json',
         url: '/cart/add-item/',
         data: 'ticket_id=' + tickets_id + '&ticket_split=' + $(field[0]).val(),
         beforeSend: function(data){
            $('#addToCart .loadingAnimation p').text('Adding Items to your cart...');
            $('#addToCart').jqm({overlay:40, modal:true}).jqmShow();
         },
         success: function(json){
            //$('#addToCart').jqm().jqmHide();

            if (json.itemCount) {
               updateCartCount(json.itemCount);
            }
            $(field[0]).val('');
            $(field[0]).trigger('change');

            var text = '<p>You have added ' + json.ticketCount + ' ' +  json.ticketDescription + ' tickets to your cart.</p>';
            var button1 = '<button id="continueShopping" type="button" class="jqmClose">Continue Shopping</button>';
            var button2 = '<button id="checkoutButton" type="button" onclick="checkout();">Checkout</button>';
            $('#addToCart').html(text + button1 + button2);
            $('#addToCart').jqmAddClose('#continueShopping');
            $('#addToCart').jqmAddClose('#checkoutButton');
         }
      });
   }

}

function reserveTickets(data)
{
   $.ajax({
      type: 'POST',
      dataType: 'json',
      url: '/cart/reserve-tickets/',
      data: data,
      beforeSend: function(){
         $('#addToCart .loadingAnimation p').text('Reserving your tickets...');
      },
      success: function(json){
         $('#addToCart').jqm().jqmHide();

         if (json.itemCount) {
            updateCartCount(json.itemCount);
         }
      }
   });
}

function updateCartCount(count)
{
   $('#cartCount').text(count);
   //animateCart();
}

function animateCart()
{
   $('#cartUpdate').show('fast');

   for (i=0;i < 5; i++) {
      $('#cartUpdate').animate({marginLeft:'-=25'}, 500);
      $('#cartUpdate').animate({marginLeft:'+=25'}, 500, null);
   }

   $('#cartUpdate').hide('slow');
}

function quantitySelected(tickets_id)
{
   var field = $('#ticket_' + tickets_id + '_form :input').not(':hidden');

   if ($(field[0]).val() == '') {
      $('#addToCart_' + tickets_id).attr('disabled','disabled');
   } else {
      $('#addToCart_' + tickets_id).removeAttr('disabled');
   }
}


function updateCart()
{
   $.ajax({
      type: "POST",
      url: '/cart/view-contents/',
      beforeSend: function(){
         $('#cartContents div.loadingAnimation p.loadingText').text('Retrieving Cart Contents...');
      },
      success: function(cartContents){
         $('#cartContents').html(cartContents);
      }
   });
}

/** Prefs Functions **/
function setupPrefsPage()
{
   $("#preferencesPane > ul").tabs();
   /** Setup the city search **/
   $('#city_search').autocomplete(
   	"/venue/suggest-city/",
   	{
   		minChars:3,
   		matchSubset:1,
   		matchContains:1,
   		cacheLength:10,
   		onItemSelect:selectCity,
   		onFindValue:findValue,
   		formatItem:formatCity,
   		autoFill:true,
   		width:250,
   		maxItemsToShow:10,
   		mustMatch:true
   	}
   );
   $('label.city_search').labelOver('searchLabel');

   /** Setup venue search **/
   $('#venue_search').autocomplete(
   	"/venue/suggest-venue/",
   	{
   		minChars:3,
   		matchSubset:1,
   		matchContains:1,
   		cacheLength:10,
   		onItemSelect:selectVenue,
   		onFindValue:findValue,
   		formatItem:formatVenue,
   		autoFill:true,
   		width:250,
   		maxItemsToShow:20,
   		mustMatch:true
   	}
   );
   $('label.venue_search').labelOver('searchLabel');

   /** Setup Artist search **/
   $('#artist_search').autocomplete(
   	"/headliner/suggest-artist/",
   	{
   		minChars:3,
   		matchSubset:1,
   		matchContains:1,
   		cacheLength:10,
   		onItemSelect:selectArtist,
   		onFindValue:findValue,
   		formatItem:formatArtist,
   		autoFill:true,
   		width:250,
   		maxItemsToShow:20,
   		mustMatch:true
   	}
   );
   $('label.artist_search').labelOver('searchLabel');

   /** Setup Team Search **/
   $('#team_search').autocomplete(
   	"/headliner/suggest-team/",
   	{
   		minChars:3,
   		matchSubset:1,
   		matchContains:1,
   		cacheLength:10,
   		onItemSelect:selectTeam,
   		onFindValue:findValue,
   		formatItem:formatTeam,
   		autoFill:true,
   		width:250,
   		maxItemsToShow:20,
   		mustMatch:true
   	}
   );
   $('label.team_search').labelOver('searchLabel');
}

/** My City Functions **/
function selectCity(li)
{
   if (li.selectValue != '') {
      $.ajax({
               type: "POST",
               dataType: 'json',
               url: '/user/add-city/name/' + li.selectValue,
               success: function(cityList){
                  updateCities(cityList);
                  $('#city_search').text('');
                  $('#city_search').focus();
               }
      });
   }
	return false;
}

function formatCity(row)
{
   return row[0];
}

function updateCities(cityList)
{
   var newCityList = '';
   var newCity = '';
   for (i=0;i < cityList.length;i++) {
      if ($('#city_search').val() == cityList[i].user_city) {
         newCity = ' class="newCity"';
      } else {
         newCity = '';
      }
      newCityList += '<li' + newCity + '><a href="#" onclick="removeCity(' + cityList[i].cities_id + ')">X</a>';
      newCityList += cityList[i].user_city + '</li>';
   }

   if (newCityList.length == 0) {
      newCityList = '<li>Add cities on the left</li>';
   }

   $('#myCitiesList').html(newCityList);

   highlightNewItem('.newCity');

   $('#city_search').val('');
}

function removeCity(cities_id)
{
   $.ajax({
            type: "POST",
            dataType: 'json',
            url: '/user/remove-city/cities_id/' + cities_id,
            success: function(cityList){
               updateCities(cityList);
            }
   });
}

/** My Venue Functions **/
function selectVenue(li)
{
   if (li.selectValue != '') {
      $.ajax({
               type: "POST",
               dataType: 'json',
               url: '/user/add-venue/venue_id/' + li.extra[1],
               success: function(venueList){
                  updateVenues(venueList);
                  $('#venue_search').text('');
                  $('#venue_search').focus();
               }
      });
   }
}

function formatVenue(row)
{
   return row[0] + ' in ' + row[1];
}

function updateVenues(venueList)
{
   var newVenueList = '';
   var newVenue = '';
   for (i=0;i < venueList.length;i++) {
      if ($('#venue_search').val() == venueList[i].venue_name) {
         newVenue = ' class="newVenue"';
      } else {
         newVenue = '';
      }

      newVenueList += '<li' + newVenue + '><a href="#" onclick="removeVenue(' + venueList[i].venue_id + ')">X</a>';
      newVenueList += venueList[i].venue_name + '</li>';
   }

   if (newVenueList.length == 0) {
      newVenueList = '<li>Add venues on the left</li>';
   }

   $('#myVenuesList').html(newVenueList);

   highlightNewItem('.newVenue');

   $('#venue_search').val('');
}

function removeVenue(venue_id)
{
   $.ajax({
            type: "POST",
            dataType: 'json',
            url: '/user/remove-venue/venue_id/' + venue_id,
            success: function(venueList){
               updateVenues(venueList);
            }
   });
}

/** My Artists Functions **/
function selectArtist(li)
{
   if (li.selectValue != '') {
      $.ajax({
               type: "POST",
               dataType: 'json',
               url: '/user/add-artist/artists_id/' + li.extra[0],
               success: function(artistList){
                  updateArtists(artistList);
                  $('#artist_search').text('');
                  $('#artist_search').focus();
               }
      });
   }
}

function formatArtist(row)
{
   return row[0];
}

function updateArtists(artistList)
{
   var newArtistList = '';
   var newArtist = '';
   for (i=0;i < artistList.length;i++) {
      if ($('#artist_search').val() == artistList[i].artists_name) {
         newArtist = ' class="newArtist"';
      } else {
         newArtist = '';
      }
      newArtistList += '<li' + newArtist + '><a href="#" onclick="removeArtist(' + artistList[i].artists_id + ')">X</a>';
      newArtistList += artistList[i].artists_name + '</li>';
   }

   if (newArtistList.length == 0) {
      newArtistList = '<li>Add artists on the left</li>';
   }

   $('#myArtistsList').html(newArtistList);

   highlightNewItem('.newArtist');

   $('#artist_search').val('');
}

function removeArtist(artist_id)
{
   $.ajax({
            type: "POST",
            dataType: 'json',
            url: '/user/remove-artist/artists_id/' + artist_id,
            success: function(artistList){
               updateArtists(artistList);
            }
   });
}

/** My Team Functions **/
function selectTeam(li)
{
   if (li.selectValue != '') {
      $.ajax({
               type: "POST",
               dataType: 'json',
               url: '/user/add-team/teams_id/' + li.extra[0],
               success: function(teamList){
                  updateTeams(teamList);
                  $('#team_search').text('');
                  $('#team_search').focus();
               }
      });
   }
}

function formatTeam(row)
{
   return row[0];
}

function updateTeams(teamList)
{
   var newTeamList = '';
   var newTeam = '';
   for (i=0;i < teamList.length;i++) {
      if ($('#team_search').val() == teamList[i].teams_name) {
         newTeam = ' class="newTeam"';
      } else {
         newTeam = '';
      }
      newTeamList += '<li' + newTeam + '><a href="#" onclick="removeTeam(' + teamList[i].teams_id + ')">X</a>';
      newTeamList += teamList[i].teams_name + '</li>';
   }

   if (newTeamList.length == 0) {
      newTeamList = '<li>Add teams on the left</li>';
   }

   $('#myTeamsList').html(newTeamList);

   highlightNewItem('.newTeam');

   $('#team_search').val('');
}

function removeTeam(teams_id)
{
   $.ajax({
            type: "POST",
            dataType: 'json',
            url: '/user/remove-team/teams_id/' + teams_id,
            success: function(teamList){
               updateTeams(teamList);
            }
   });
}
/** User Pref's general functions **/
function highlightNewItem(newItem)
{
   $(newItem).animate({backgroundColor: '#ecf3f5'}, 500 ).animate({backgroundColor: '#FFFFFF'},500);
}

/** Form Setup Functions **/
function prepareUpdateForm()
{
   var timeout = null;
   $('#billing_country_id').bind('change', getStateList);
   $('#shipping_country_id').bind('change', getStateList);

   $('#registerForm').attr('action', '/user/profile/');
   $('input#user_password').attachPassMeter({imgsPath: '/images/'});
   $("#details_home_phone").mask('(999) 999-9999',{placeholder:' '});
   $("#details_cell_phone").mask('(999) 999-9999',{placeholder:' '});
   $("#details_work_phone").mask('(999) 999-9999',{placeholder:' '});
   $('#details_email').after('<span id="validationHolder" rel="span#errorMessages">&nbsp;</span>');
   $('#details_email').after('<span id="errorMessages" >&nbsp;</span>');
   $('#user_username').before('<span id="usernameHolder">' + $('#user_username').val() + '</span>');
   $('#validationHolder').cluetip({cluetipClass: 'jtip',local:true, arrows:true, activation: 'click'});

/*   if (!$('#shipping_same').is(':checked')) {
      $('#shippingGroup').toggle();
   }*/

   $('#details_email').bind("keydown", function(e){
   lastKeyPressCode = e.keyCode;
      switch(e.keyCode) {
         case 16: // Shift
         case 224: // Alt
         case 37: // left arrow
         case 39: //right arrow
      	case 9:  // tab
      	case 13: // return
      	  // Capture Tab and Return so we don't set a timer for them
      	break;
      	default:
            if (timeout) {
               clearTimeout(timeout);
            }
            timeout = setTimeout(function(){validateEmail(0);}, 500);
      }
   });
   $('#Update').bind('click',function(){$('#registerForm').trigger("submit")});
}

function prepareSignInForm()
{
   $('#signIn').bind('click',function(){$('#signInForm').trigger("submit")});
}

function getStateList()
{
    var stateElement = null;

    if ($(this).attr('id') == 'billing_country_id') {
        stateElement = $('#billing_state_id');
    } else if($(this).attr('id') == 'shipping_country_id') {
        stateElement = $('#shipping_state_id')
    } else if ($(this).attr('id') == 'event_country_id') {
        stateElement = $('#event_state_id');
    } else if ($(this).attr('id') == 'contact_country_id') {
        stateElement = $('#contact_state_id');
    }

   $.ajax({
            type: "POST",
            dataType: 'json',
            data: 'country_id=' + $(this).val(),
            url: '/user/pick-country/',
            success: function(stateList){
                stateElement.get(0).options.length = 0;
                var options = [];
                var i = 0;
                var o = null;

                if (stateList != null) {
                    for (i = 0; i < stateList.length; i++) {
                        // required to get around IE bug (http://support.microsoft.com/?scid=kb%3Ben-us%3B276228)
                        o = document.createElement("OPTION");
                        o.value = typeof stateList[i] == 'object' ? stateList[i]['state_id'] : stateList[i];
                        o.text = typeof stateList[i] == 'object' ? stateList[i]['state_name'] : stateList[i];
                        stateElement.get(0).options[i] = o;
                    }
                }
            }
   });
}

function prepareSellForm()
{
   $('#contact_country').bind('change', getStateList);
   $('#event_country').bind('change', getStateList);
}

function prepareSignupForm()
{
   var timeout = null;

   $('#billing_country_id').bind('change', getStateList);
   $('#shipping_country_id').bind('change', getStateList);

   if ($('#user_username').val() != '') {
       usernameText = $('#user_username').val();
   } else {
       usernameText = 'Please fill in an email address above.';
   }

   $('#registerForm').attr('action', '/user/register/');
   $('input#user_password').attachPassMeter({imgsPath: '/images/'});
   $("#details_home_phone").mask('(999) 999-9999',{placeholder:' '});
   $("#details_cell_phone").mask('(999) 999-9999',{placeholder:' '});
   $("#details_work_phone").mask('(999) 999-9999',{placeholder:' '});
   $('#details_email').after('<span id="validationHolder" rel="span#errorMessages">&nbsp;</span>');
   $('#details_email').after('<span id="errorMessages" >&nbsp;</span>');
   $('#user_username').before('<span id="usernameHolder">' + usernameText + '</span>');
   $('#validationHolder').cluetip({cluetipClass: 'jtip',local:true, arrows:true, activation: 'click'});

   /*if (!$('#shipping_same').is(':checked')) {
      $('#shippingGroup').toggle();
   }*/

   $('#details_email').bind("keydown", function(e){
   lastKeyPressCode = e.keyCode;
      switch(e.keyCode) {
         case 16: // Shift
         case 224: // Alt
         case 37: // left arrow
         case 39: //right arrow
      	case 9:  // tab
      	case 13: // return
      	  // Capture Tab and Return so we don't set a timer for them
      	break;
      	default:
            if (timeout) {
               clearTimeout(timeout);
            }
            timeout = setTimeout(function(){validateEmail(1);}, 500);
      }
   });
   $('#register').bind('click',function(){$('#registerForm').trigger("submit")});
}

/** Bug Report Functions **/
function showBugForm()
{
    $('#bugReport').jqmShow();
}

function prepareBugReportForm()
{
    $('#bugReportForm').attr('action', '/index/process-support/');
    $('#bugReportSubmit').bind('click',function(){submitForm('/index/process-support/', '#bugReportSubmit');});
}

/** Ajax Functions **/
function getHeadlinerEventList(headliner_id)
{
   $.ajax({
      type: "POST",
      url: "/headliner/get-event-list/headliner_id/" + headliner_id + "/",
      data: "",
      success: function(eventList){
                  $("#headlinerEventList").html(eventList);
               }
      });
}

function getVenueEventList(venue_id)
{
   $.ajax({
      type: "POST",
      url: "/venue/get-event-list/venue_id/" + venue_id + "/",
      data: "",
      success: function(eventList){
                  $("#venueEventList").html(eventList);
               }
      });
}

/** General Functions **/
function redirectUser(url) {
   window.location = url;
}

/** Pagination Functions **/
function changePage(uri, pageNum, container)
{
    uri = uri.replace(new RegExp('/pageNum/([0-9]|[A-Z])+'), '');
    uri = uri + "/pageNum/" + pageNum + '/';

    $.ajax({
     type: "POST",
     url: uri,
     data: "",
     beforeSend: function(){
        /*$("#" + container + ' .loadingAnimation').show();*/
     },
     success: function(list){
      $("#" + container).html(list);
     }
    });
}

/** AutoComplete Functions **/
function findValue(li) {
	if( li == null ) {
        return alert("No match!");
	}

	var sValue = li.extra[0];

	return sValue;
}

function selectEvent(li) {
	findValue(li);
	if (li.extra[1]) {
	  window.location = '/headliner/view/headliner_name/' + li.selectValue + '/headliner_id/' + li.extra[1] + '/';
	}
}

function formatEvent(row) {
    return row[0] + row[1];
}

function selectEventAdmin(li) {
	findValue(li);
	if (li.extra[3]) {
	  $('#suggestion_events_id').val(li.extra[3]);
	  //$('#headliner_id').attr('selectedIndex', 0);
	}
}

function formatEventAdmin(row) {
    if (row[1]) {
        return row[0] + ' - ' + row[1] + ',' + row[2] + ' on ' + row[3];
    } else {
        return row[0];
    }
}

function selectBillingStateCountry(row)
{
   $('#billing_state_id').val(row.extra[0]);
}

function selectShippingStateCountry(row)
{
   $('#shipping_state_id').val(row.extra[0]);
}

function formatStateCountry(row)
{
   return row[0];
}

/** Filter Functions **/
function initializeFilters(filterWhat, filterOn)
{
    filterWhat  = filterWhat.split(',')
    filterOn    = filterOn.split(',')

    for (i=0;i<filterWhat.length;i++) {
        $.ajax({
         type: "POST",
         filterOn:filterOn[i],
         filterWhat:filterWhat[i],
         url: '/filter/' + filterOn[i] + '/filterWhat/' + filterWhat[i],
         data: "",
         success: function(filterList){
            if (this.filterOn == 'location') {
                //$('#' + this.filterOn + 'FiltersContainer').children().insertAfter('.scrollUpFilter');
                $(filterList).insertBefore('#locationNav');
                $('#locationScroller').slideDown("slow");
            } else {
                $('#' + this.filterOn + 'FiltersContainer').append(filterList);
                $('#' + this.filterOn + 'Filters').slideDown("slow");
            }
        }
        });
    }
}

function activateFilter(filterWhat, filterOn, params, trigger)
{
    $.ajax({
     type: "POST",
     url: "/filter/activate/filterWhat/" + filterWhat + '/filterOn/' + filterOn + '/' + params.join('/'),
     data: "",
     success: function(updatedResults){
        $("#listContainer").html(updatedResults);
        changeFilterStatus(trigger);
     }
    });
}

function changeFilterStatus(trigger)
{
    if ($(trigger).parent().hasClass('inActiveFilter')) {
        $(trigger).parent().removeClass('inActiveFilter');
    } else {
        $(trigger).parent().addClass('inActiveFilter');
    }
}

var scrollUpFilter = function(e)
{
    jQuery.easing.def = 'easeOutElastic';
    var filterList = $('ul', $(this).parent().parent().get(0));
    filterList.scrollTo( '-=190', 1000,{easing:'easeOutElastic'});
}

var scrollDownFilter = function(e)
{
    jQuery.easing.def = 'easeOutElastic';
    var filterList = $('ul', $(this).parent().parent().get(0));
    filterList.scrollTo( '+=190', 1000,{easing:'easeOutElastic'});
}

var toggleFilters = function(e)
{
   if ($(this).parent().parent().attr('id') == 'locationFiltersContainer') {
      var filterList = $('#locationScroller');
   } else {
      var filterList = $('ul', $(this).parent().parent().get(0));
   }

	if (filterList.css('display') == 'none') {
	    filterList.slideToggle(300);
		$(this).html('[-]');
	} else {
	    filterList.slideToggle(300);
	    $(this).html('[+]');
	}

	return false;
};

/** Validation Functions **/
function validateEmail(updateUsername)
{
   if ( this.triggered == 1) {
      $('#validationHolder').trigger('click');
      //$('#details_email').focus();
   }

   $.getJSON('/user/validate/email/' + $('#details_email').val(), function(json){
      if (json == true) {
         if (updateUsername == 1) {
            $('#user_username').val($('#details_email').val());
            $('#usernameHolder').html($('#details_email').val());
         }
         $('#validationHolder').html('Valid Email.');
         parent.triggered = 0;
      } else {

         $('#validationHolder').html('');
         if (updateUsername == 1) {
            $('#user_username').val('');
            $('#usernameHolder').html('Please fill in an email address.');
         }
         $('#errorMessages').html('');

         $.each(json, function(i){
            if (i > 0) {
               $('#errorMessages').append('<br />');
            }
            $('#errorMessages').append(this.toString());

            if ( i == 3 ) return false;
         });
         $('#validationHolder').trigger('click');
         $('#details_email').focus();
         parent.triggered = 1;
      }
   });
}

/** Label Functions **/
jQuery.fn.labelOver = function(overClass) {
	return this.each(function(){
		var label = jQuery(this);
		var f = label.attr('for');
		if (f) {
			var input = jQuery('#' + f);

			this.hide = function() {
			     label.css({ display:'none' })
			}

			this.show = function() {
			  if (input.val() == ''){
			      label.css({ display:'inline' })
			  }
			}

			// handlers
			input.focus(this.hide);
			input.blur(this.show);
		   label.attr('id', overClass).click(function(){ input.focus() });

			if (input.val() != '') this.hide();
		}
	})
}

/** Form Processing Functions **/
function submitForm(submitUrl, submitButton)
{
    $.ajax({
        type: 'POST',
        dataType: 'json',
        url: submitUrl,
        data: $(submitButton).parents('form').serializeArray(),
        success: function(jsonData){
            removeErrorMessages();
            if (processResult(jsonData) == true) {
                removeLoadingAnimation(submitButton);
            }
        },
        beforeSend: function(){
            addLoadingAnimation(submitButton);
        }
    });
}

function processResult(data)
{
    // Check to see if the form was valid
    if (data.formResult == false) {
        var fieldLabels = new Array();
        $.each(data, function(i,item){
            addErrorMessages(i, item);
            fieldLabels.push($('[for=' + i + ']').text());
            life: 5000;
        });

        var errorFields = fieldLabels.join(', ');
        errorFields = errorFields.substring(0, (errorFields.length-2));
    }

    if (data.redirect) {
       redirect(data.redirect.location);
    }

    // Check to see if we are chaining requests
    if (data.chain) {
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: data.chain.url,
            data: data.chain.data,
            success: function(jsonData){
                processResult(jsonData);
            }
        });
    }

    // Check to see if we need to load any content
    if (data.load) {
        var targets = data.load.target.split(',');
        $.each(targets, function(i, item) {
            $(item).html(data.load.content);
        })
    }

    if (data.notification) {
       $('#notificationContainer').jGrowl(data.notification.content, data.notification.options);
    }

    if (data.callback) {
       eval(data.callback);
    }

    if (data.refresh) {
        window.location.reload();
    }

    if (data.removeItem) {
        $('#' + data.removeItem.item_id).fadeOut('normal', function(){$(this).remove();});
    }

    if (data.addItem) {
        //$('#' + data.addItem.).fadeOut('normal', function(){$(this).remove();});
    }

    if (data.highlight) {
        $(data.highlight).effect('highlight', {}, 500);
    }

    return true;
}

function removeErrorMessages()
{
   $('ul.errors').remove();
}

function addErrorMessages(element, messages)
{
    var errorMessages = '';
    var elementName = $('#' + element).attr('name');

    $.each(messages, function(i, item){
        errorMessages += '<li>' + item + '</li>';
    });
    // Converted to using for attribute so that all the elements get the proper error
    // messages since all elements will have a label.
    //$('#' + element).after('<ul class="errors">' + errorMessages + '</ul>');
    $('[for=' + element + ']').parent().append('<ul class="errors">' + errorMessages + '</ul>');
}

function addLoadingAnimation(formButton)
{
    $(formButton).attr('disabled', 'disabled');
    $(formButton).after('<img class="formLoading" src="/images/loading.gif" alt="Loading..." />')
}

function removeLoadingAnimation(formButton)
{
    $(formButton).attr('disabled', '');
    $('.formLoading').remove();
}

function addInlineLoadingAnimation(element)
{
    $(element).parent().append('<img class="formLoading" src="/images/loading.gif" alt="Loading..." />');
    $(element).parents().each(function(i){
        if ($(this).is('form')) {
            $('#' + $(this).attr('id') + ' input').each(function(i){$(this).attr('disabled', 'disabled')});
        }
    });
}

function removeInlineLoadingAnimation(element)
{
    $('.formLoading').remove();
    $(element).parents().each(function(i){
        if ($(this).is('form')) {
            $('#' + $(this).attr('id') + ' input').each(function(i){$(this).attr('disabled', '')});
        }
    });
}

function redirect(location)
{
    window.location.href = location;
}