// Show search suggest from eric and angelo
// @author chrisyu[at]jobkoo.com

// define key handlers:
// handler 1
var k1 = { // no suggest yet
  handle: function(e) {
    if (t.kw()) {
      switch (true) {
        case t.kw() != t.lkw():
        // or
        case e.keyCode == 40: // DOWN
          t.show();
      }
    }
  }
};

// handler 2
var k2 = { // already have suggest
  handle: function(e) {
    if (0 == t.kw().length || 27 == e.keyCode) { // empty or ESC
      t.hide(); return;
    }
    // else
    if (t.lkw() != t.kw()) { // content changed
      t.show(); return;
    }
    // else
    switch (e.keyCode) {
      case 38: // UP
      // or
      case 40: // DOWN
        var s = t.ul().children(".selected"); // li.selected
        var n; // next selected
        switch (true) {
          case t.ul().children().length == 1 && s.length == 1:
            n = s; break;
          case !s.prev().length && 38 == e.keyCode:
            n = t.ul().children(":last"); break;
          case !s.next().length && 40 == e.keyCode:
            n = t.ul().children(":first"); break;
          case 40 == e.keyCode:
            n = s.next(); break;
          case 38 == e.keyCode:
            n = s.prev(); break;
          default:
            // do nothing
        }

        if (n != s) {
          if (s.length) {
            s.fadeTo("fast", 0.5);
            s.removeClass("selected");
          }
          n.addClass("selected").css({ opacity: 1 });
          t.kw(n.html());
        }
        return;
      default:
        // do nothing
        return;
    }
  }
};

var t = { // tips, or suggest
  box: function() { // text box
    if (!this._box) this._box = $("#search-keyword");
    return this._box;
  },

  kw: function(kw) { //keyword
    if (null == kw) return $.trim(this.box().val());
    // else
    this.box().val( // htmldecode
      kw.replace(/&amp;/, '&')
        .replace(/&nbsp;/, ' ')
        .replace(/&gt;/, '>')
        .replace(/&lt;/, '<')
    );

    return this;
  },

  ul: function(ul) { // suggest frame <ul> tag
    if (null == ul) return this._ul;
    // else
    this._ul = ul; return this;
  },

  lkw: function(lkw) { // remember the last kw
    if (null == lkw) return this._lkw;
    // else
    this._lkw = lkw; return this;
  },

  k: function(k) { // set/get key handler
    if (null == k) return this._k;
    // else
    this._k = k; return this;
  },

  show: function() { // create tip frame
    if (this._xhr) {
      this._xhr.abort();
      delete this._xhr;
    }

    this._xhr = $.getJSON("/search-suggest/", { kw: t.kw() }, function(data) {
      t.hide(); // if suggest has already exists, delete it;
      if (!data) return; 
      if (!data.length) return;

      // else show tips
      var len = data.length;
      var ul = $("<ul>");
      ul.css({
        position: "absolute",
        top: t.box().offset().top + t.box().outerHeight() + "px",
        left: t.box().offset().left + "px",
        border: "1px solid #e92",
        background: "#fff",
        minWidth: t.box().outerWidth() - 2 + "px"
      });

      if (!$.support.boxModel || !$.support.objectAll) {
        ul.css({width: t.box().outerWidth() + "px"});
      }

      for (var i = 0; i < len; i++) {
        var li = $("<li>");
        li.html(data[i]).css({
          background: "#fa3",
          opacity: 0.5,
          padding: "3px 8px",
          color: "#333",
          cursor: "default"
        }).mouseover(function() {
          t.ul().children(".selected")
                .fadeTo("fast", 0.5).removeClass("selected");
          $(this).addClass("selected").css({ opacity: 1 });
        }).mousedown(function() {
          t.kw($(this).html());
          setTimeout(function() { t.box().focus() }, 100);
        }).appendTo(ul);
      }

      $("body").append(ul);
      t.ul(ul).k(k2).box().blur(function() {
        t.hide();
      });
    });

    return this;
  },

  hide: function() {
    if (this.ul()) {
      this.ul().remove();
      this.ul(false);
    }
    this.k(k1).box().unbind("blur");
    return this;
  },

  handle: function(e) { // handle key event
    this.k().handle(e);
    return this;
  },

  run: function() {
    this.lkw(t.kw()).k(k1);
    this.box().attr("autocomplete", "off").keyup(function(e) {
      t.handle(e).lkw(t.kw());
    });
  }
};

$("#search-form").submit(function() {
  // remember to update search/search->searchSubmit
  // if this need to be modified
  if (!isKeyword($("#search-keyword").val()) 
    || !$("#search-keyword").data('input')) {
    $("#search-keyword").focus();
  } else {
    // redirecting ...
    var t = $("#search-type").val();
    var l = $("#search-location").val();
    var q = {};
    t != 'normal' && (q.type = t);

    if (l) {
      q.location = l;
    }
    
    var query;
    if (query = $.param(q)) {
      query = '/?' + query;
    } else {
      query = '/';
    }

    location.href = $("#search-form").attr('action').replace(
      'search-submit/', 
      'search/' 
        + encodeURIComponent($("#search-keyword").val()) 
        + query
    );
  }

  return false;
});

$(function() {
  $("#search-keyword").data('input', false);
  if (!$.trim($("#search-keyword").val())) {
    $("#search-keyword").val(__('job title, company, or keyword'))
      .bind(
        'focus', 
        function() {
          $(this).css('color', '#222').val('')
            .unbind('focus')
            .data('input', true);
        }
      );
  } else {
    $("#search-keyword").css('color', '#222').data('input', true);
  }
  // suggest
  t.run();
});

// normal/senior job switch
$("#search-types a").click(function() {
  $("#search-types a").removeClass("selected");
  $(this).addClass("selected");
  $(this).attr("href") == "#jobs"
    ? $("#search-type").val("normal")
    : $("#search-type").val("senior");
});

// language switch
function switchToLang(lang)
{
  switch (lang) {
    case 'zh_CN':
      var to = 'www';
      break;
    default:
      var to = 'en';
  }

  location.href = location.href.replace(/http:\/\/\w+?\./, 
    'http://' + to + '.');
}

$('.new-window').click(function() {
  window.open($(this).attr('href'));  
  return false;
});

// get user state
$(function() {
  $.getJSON('/user/info', function(data) {
    var h;
    if (parseInt(data.id)) {
      h = '<a href="http://cm.jobkoo.com/resume">'
        + data.name + '</a> - '
        + '<a href="http://cm.jobkoo.com/space/login.php?op=exit">'
        + __('Sign out') + '</a>';
    } else {
      h = '<a href="http://cm.jobkoo.com/space/login.php">'
        + __('Sign in') + '</a> - '
        + '<a href="http://cm.jobkoo.com/space/signup.php">'
        + __('Sign up') + '</a>';
    }

    $('#login-panel span').html(h);
  });
});
