CARS = window.CARS || {};
CARS.search = CARS.search || {};
CARS.search.savedSearch = {
  savedSearchCookie: 'userSavedSearches',
  csDlId:'',csDgId:'',
  rd: '~', // record delimiter
  ed: '|', // element delimiter
  mySearchURL: '',
  captureTemplate: '<div id="nameSearchFlyover"><a href="#" onclick="$(\'#nameSearchFlyover\').remove(); return false;" class="close">Close</a><h2>Save Your Search</h2><p>The selections you\'ve made to narrow your search will be saved on this computer <em>(cookies must be enabled)</em>.</p><p>Look for the link to view saved searches near the top of the results page: \'<span class="example">Saved: Vehicles (X) Searches (X)\'</span></p><form action="#" name="searchnameform" onsubmit="CARS.search.savedSearch.saveThisSearch($(\'#search-name\').val()); return false;"><label for="search-name">Name Your Vehicle Search</label><input type="text" name="search-name" id="search-name" size="40" maxlength="40" /></form><div class="action"><a class="button primary" href="#" onclick="CARS.search.savedSearch.saveThisSearch($(\'#search-name\').val());return false;"><span>Save Search</span></a> <a class="cancel" href="#" onclick="$(\'#nameSearchFlyover\').remove(); return false;">Cancel</a></div></div>',
  confirmationTemplate: '<h2 class="saveConfirmation">Your search has been saved!</h2>',
  sameNameError: '<p class="error">You\'ve saved a search with that name; please use a unique name.</p>',
  cc: function (name,value,days) {
    var expires;
    if (days) {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      expires = "; expires="+date.toGMTString();
    }
    else { expires = ""; }
    document.cookie = name+"="+value+expires+"; path=/";
  },
  rc: function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i=0;i < ca.length;i++) {
      var c = ca[i];
      while (c.charAt(0) === ' ') { c = c.substring(1,c.length); }
      if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }
    }
    return null;
  },
  thisIsMS: function() {
    var isMS = false;
    if (window.location.href.match(/ms=true/g)) { isMS = true; }
    if (window.location.href.match(/tracktype=usedms/)) { isMS = true; }
    if (window.location.href.match(/tracktype=newms/)) { isMS = true; }
    if (isMS) {
      this.csDlId = window.location.href.match(/dlId=([^&]*)/);
      if (this.csDlId && this.csDlId[1]) { this.csDlId = this.csDlId[1]; } else { this.csDlId = ''; }
      this.csDgId = window.location.href.match(/dgId=([^&]*)/); 
      if (this.csDgId && this.csDgId[1]) { this.csDgId = this.csDgId[1]; } else { this.csDgId = ''; }
    }
    return isMS;
  },
  attachSaveLink: function() {
    if (!this.qualifyDisplay()) { return; }
    // attach template
    if ($('#saveSearchContainer').get(0)) {
      // attach link
      if (!$('#saveSearchAction').get(0)) { $('#saveSearchContainer').append('<div id="saveSearchAction"></div>'); }
      $('#saveSearchAction').html('<a id="saveSearchLink" href="javascript:CARS.search.savedSearch.openSavePrompt();">Save Search</a>');
    }
  },
  markAsSaved: function() {
    if (!$('#saveSearchAction').get(0)) { $('#breadcrumbs').append('<div id="saveSearchAction"></div>'); }
    $('#saveSearchLink').remove();
    $('#saveSearchAction').html('<span>Search Saved</span>');
  },
  qualifyDisplay: function() {
    if (this.isThisSearchSaved(window.location.href)) { 
      this.markAsSaved(); 
      return false;
    }
    return true;
  },
  openSavePrompt: function() {
    $('body').append(this.captureTemplate);
    $('#nameSearchFlyover').css({"top":$(window).scrollTop()+150});
    $('#search-name').focus();
    if (window.trackLink) { trackLink('','open-save-search-prompt'); }
  },
  nameIsUnique: function(searchName) {
    searchName = this.cleanSaveName(searchName);
    $('#nameSearchFlyover p.error').remove();
    var savedSearches = this.getSavedSearches();
    for (var i=0; i<savedSearches.length; i++) {
      if (savedSearches[i][0] == searchName) {
        $('#nameSearchFlyover input').addClass('error').before(this.sameNameError);
        $('p.error').hide().fadeIn();
        return false;
      }
    }
    return true;
  },
  saveThisSearch: function(searchName) {
    if (!this.nameIsUnique(searchName)) { return false; }
    var datestring = this.getDateString();
    var savedSearches = this.getSavedSearches();
    // clean save name
    var mySaveName = this.cleanSaveName(searchName) || 'Saved Search from ' + datestring;
    savedSearches[savedSearches.length] = [mySaveName, this.cleanSearchURL(this.mySearchURL), datestring];
    this.packSavedSearches(savedSearches);
    this.updateSavedCount();
    this.markAsSaved();
    $('#nameSearchFlyover').html(this.confirmationTemplate).fadeTo(2000, 0.99, function() {
      $('#nameSearchFlyover').fadeTo(1000, 0, function() {
        $('#nameSearchFlyover').remove();
      });
    });
    if (window.trackLink) { trackLink('','search-saved'); }
  },
  getDateString: function() {
    var monthName = ["January","February","March","April","May","June","July","August","September","October","November","December"];
    var d = new Date();
    return monthName[d.getMonth()] + ' ' + d.getDate() + ' ' + d.getFullYear();
  },
  isThisSearchSaved: function(url) {
    url = this.cleanSearchURL(url);
    var savedSearches = this.getSavedSearches();
    for (var i=0; i<savedSearches.length; i++) {
      if (this.cleanSearchURL(savedSearches[i][1]) == url) { return true; }
    }
    return false;
  },
  removeSavedSearch: function(id, reload) {
    if (id == 'all') { 
      this.cc(this.savedSearchCookie, '', -1); 
    } else {
      var savedSearches = this.getSavedSearches();
      savedSearches.splice(id,1);
      this.packSavedSearches(savedSearches);
    }
    if (reload) { window.location.reload(); }
  },
  cleanSearchURL: function(url) {
    // strip out the hash
    url = url.replace(/#.*/,'');
    // strip empty params
    url = url.replace(/[^?&]+=&/gi,'');
    // strip out values we don't care about
    url = url.replace(/&?(AmbMdId|AmbMkId|AmbMkNm|AmbMdNm|alMkId|alMdId|searchSource|crSrtFlds|feedSegId|sf2Nm|sf2Dir|pgId|PMmt|rn|uncpo)=[^&]*/ig,'');
    // clean exterraneous ampersands
    url = url.replace(/\?&/,'?').replace(/&$/,'');
    // consistent param sort
    var hostName = url.slice(0, url.indexOf('?') + 1);
    var queryParams = url.slice(url.indexOf('?') + 1).split('&');
    queryParams = queryParams.sort();
    url = hostName + queryParams.join('&');
    return url;
  },
  cleanSaveName: function(name) {
    return $.trim(name.replace(/[\/\|~,;]/g, ''));
  },
  getSavedSearches: function() { // creates array of arrays
    var savedSearchData = this.rc(this.savedSearchCookie);
    var savedSearches = [];
    if (savedSearchData !== null) {
      savedSearchData = savedSearchData.split(this.rd);
      for (var i=0; i<savedSearchData.length; i++) {
        if (savedSearchData[i] != '') {
          savedSearches[savedSearches.length] = savedSearchData[i].split(this.ed);
        }
      }
    }
    return savedSearches;
  },
  updateSavedCount: function() {
    $('#savedSearchCount').html(this.getSavedCount());
  },
  getSavedCount: function() {
    return this.getSavedSearches().length;
  },
  packSavedSearches: function(savedSearches) { // expects array of arrays
    for (i=0; i < savedSearches.length; i++) {
      savedSearches[i] = savedSearches[i].join(this.ed);
    }
    var cookieText = savedSearches.join(this.rd);
    this.cc(this.savedSearchCookie, cookieText, 120);
  },
  goToSaved: function(url) {
    // bundle criteria
		var criteriaStr = createQueryString('', '', '');
		var encodedCriteriaBO = encode(criteriaStr);
		// ship the user off to the page, need other params for MS
		window.location = url + "?criteria=" + encodedCriteriaBO + "&tracktype=" + tracktype + "&csDlId=" + this.csDlId + "&csDgId=" + this.csDgId;
		return false;
  },
  init: function() {
    // test if we're on search
    criteriaObject = window.criteriaObject || false;
    if (!criteriaObject) { return false; } // sniff for criteria
    // test if it's a microsite
    if (this.thisIsMS()) { this.savedSearchCookie = this.csDlId + '-' + this.savedSearchCookie; }
    // initialize current URL
    this.mySearchURL = this.cleanSearchURL(window.location.href);
    if (this.mySearchURL !== null) {
      this.attachSaveLink();
    }
    this.updateSavedCount();
  }
};

// add to page
$(document).ready(function() { CARS.search.savedSearch.init(); });

