// Copyright:2008 by RICOH COMPANY, LTD. All Rights Reserved

var ZIP_SERVER_NAME = "http://zip.ricollab.jp"
var LIST_SIZE = 10;

var ENTER_KEY = 13;
var LEFT_KEY = 37;
var UP_KEY = 38;
var RIGHT_KEY = 39; 
var DOWN_KEY = 40;

var zipArray= new Array();
var addressArray= new Array();

/* ひとつのzipItemの初期化 */
function resetZipItem(zipItem) {
  $(zipItem).removeClass("zip_item_selected");
  $(zipItem).removeClass("zip_item_selectable");
  $(zipItem).text("");
}
/* zipListと中身を初期化 */
function resetZipList() {
  $("#zipList").slideUp();
  resetZipItem("#zipList > li");
}

/* list_itemを選択したときの動作 */
function select(item) {
  $(".zip_item_selected").removeClass("zip_item_selected");
  $(item).addClass("zip_item_selected");
}

/* 郵便番号と住所を表示する文字列を返す */
function liText(zip, address) {
  return zip + " (" + address + ")";
}

/** 
 * 選択して$("#zipInput")と$("#address1")に値を入れるときに使う
 */
function decide(item) {
  var zip = zipArray[$(item).text()];
  var address= addressArray[$(item).text()];
  $("#zipInput").attr("value", zip);
  $("#address1").attr("value", address);
  resetZipList();
}

/** 
 * リストコンテナの作成
 */
function initZipListContainer() {
  var zipList = document.createElement("ul");
  $(zipList).css("display", "none");
  $(zipList).attr("id", "zipList");

  for (i=0; i<LIST_SIZE; i++) {
    var zipItem = document.createElement("li")
    $(zipItem).addClass("zip_item");
    $(zipList).append($(zipItem)); 
  }
  var zipCountItem = document.createElement("li")
  $(zipCountItem).attr("id", "zipCountItem");
  $(zipList).append($(zipCountItem)); 
  $("#zipListContainer").append($(zipList));
}

function search(zip){
  $.getJSON(ZIP_SERVER_NAME + "/search?q=" + zip + "&type=json&callback=?&count=" + LIST_SIZE,
    function(json){
      if (json.result.length > 0) {
        $("#zipList").css("display", "block");
        for(i in json.result) {
          var zipItem = $("#zipList > li")[i];
          $(zipItem).text(liText(json.result[i].zipcode, json.result[i].address));
          zipArray[$(zipItem).text()] = json.result[i].zipcode;
          addressArray[$(zipItem).text()] = json.result[i].address;
          $(zipItem).show("fast");
          $(zipItem).addClass("zip_item_selectable");
        }
        for(i=json.result.length; i<LIST_SIZE; i++) {
          var zipItem = $("#zipList > li")[i];
          $(zipItem).css("display", "none");
          resetZipItem(zipItem);
        }
        $("#zipCountItem").text("全" + json.totalResults + "件");
        $("#zipCountItem").attr("title", zip);
      } else {
        resetZipList();
      }
    }
  );
}

function search_zip() {
  var zip = $("#zipInput").val();
  if (zip.length > 0) {
    search(zip);
    return true;
  } else {
    resetZipList();
    return false;
  }
}

/* テキストボックスで ↓ボタンを押したときの動作 */
function downKey() {
  if ($(".zip_item_selectable").length == 0) return false;
  switch($(".zip_item_selected").length) {
  case 1:
    var next = $(".zip_item_selected").next(); 
    if (next.length == 1 && next.hasClass("zip_item_selectable")) {
      select(next);
      break;
    } else {
      // case 0 に進む
    }
  case 0:
    select(".zip_item_selectable:first");
    break;
  default:      
    break;
  }
}

/* テキストボックスで ↑ボタンを押したときの動作 */
function upKey() {
  if ($(".zip_item_selectable").length == 0) return false;
  switch($(".zip_item_selected").length) {
  case 1:
    var prev = $(".zip_item_selected").prev();
    if (prev.length == 1 && prev.hasClass("zip_item_selectable")) {
      select(prev);
      break;
    } else {
      // case 0 に進む
    }
  case 0:
    select(".zip_item_selectable:last");
    break;
  default:      
    break;
  }
}

$(document).ready(function(){
  $("#zipInput").attr("autocomplete", "off");
  initZipListContainer();

  $("#zipInput").keyup(function(e){
    switch(e.keyCode) {
    // 矢印キーは何もしない
    case LEFT_KEY:
    case UP_KEY:
    case RIGHT_KEY:
    case DOWN_KEY:
      break;
    // Enterキーは決定
    case ENTER_KEY:
      if ( $(".zip_item_selected").length == 1) { 
        decide(".zip_item_selected");
        break;
      } else {
        // その他は補完候補を表示するため、defaultに進む
      }
    default:
      search_zip();
      break;
    }
  });

  $("#zipInput").keydown(function(e){
    // ↑↓じゃなければ何もしない
    if (e.keyCode != UP_KEY && e.keyCode != DOWN_KEY) {
      return;
    }
    if ( $("#zipList").css("display") == "none" ) {
      if (search_zip()) {
      } else {
        // 候補が表示されていなくて、検索しても候補がなければ何もしない
        return;
      }
    }
    switch(e.keyCode) {
    case DOWN_KEY:
      downKey();
      break;
    case UP_KEY: 
      upKey();
      break;    
    default:
      break;
    }
  });

  $(".zip_item").each(function(){
    $(this).mouseover(function(e){
      select(this);
    });
    $(this).mousedown(function(e){
      decide(this);
      resetZipList();
    });
  });

  $("#zipInput").blur(function(e){
    window.setTimeout("resetZipList()", 250);
  });

});

