//
// Javascript for zipcode to address translation
//
zipcode = function() {};
zipcode.prev = '';

zipcode.get = function(val)
{
  var url = 'http://zipcloud.ibsnet.co.jp/api/search?zipcode=' + val;
  xds.load(url, zipcode.api1, zipcode.api2);
}

zipcode.api1 = function(data)
{
  try {
    if ((data['status'] != 200) || (data['results'] == null)) {
      throw 'api error';
    } else {
      var result = data['results'][0];
      var chouiki = '';
      for (var i = 0; i < result['address3'].length; i++) {
        var c = result['address3'].charCodeAt(i);
        if ((c >= 65296) && (c <= 65305)) {
          chouiki += String.fromCharCode(c - 65248);
        } else {
          chouiki += result['address3'].substr(i, 1);
        }
      }
      var ret = {
        Ken: result['address1'],
        Shi: result['address2'],
        Chouiki: chouiki
      };
      zipcode.cb(ret);
    }
  }
  catch(e) {
    zipcode.api2();
  }
}

zipcode.trans = function (code)
{
  var val = code.value;
  var zip = '';

  //
  // get zipcode value
  //
  if (!val) {
    return;
  }

  for (var i = 0; i < val.length; i++) {
    var c = val.charCodeAt(i);
    if (( c >= 48 ) && ( c <= 57 )) {
      zip += val.charAt(i);
    } else if (( c >= 65296 ) && ( c <= 65305 )) {
      // Zenkaku number
      zip += String.fromCharCode(c - 65248);
    }
  }
  if (zip.length < 7) {
    return;
  }

  //
  // get form object
  //
  var curval;
  var setData;
  var oElements, oElements1, oElements2;

  if (code.name.slice(-1) == '2') {		// called by txtZipcode2
    // check if this page is default form type (just one Juusho field)
    oElements = document.getElementsByName("txtJuusho2");
    if (oElements.length > 0) {
      curval = zip + oElements[0].name;
      setData = function(data) {
	var oElements = document.getElementsByName("txtJuusho2");
	if (oElements[0].value == "") {
	  oElements[0].value = data["Ken"] + data["Shi"] + data["Chouiki"];
	} else {
	  // check wether txtJuusho and DB is same value.
	  var rObj = new RegExp("^" + data["Ken"] + data["Shi"] + data["Chouiki"] + ".*");
	  var stNew = oElements[0].value;
	  if (!stNew.match(rObj)) {
	    if (confirm("郵便番号が変わりました．新しい住所(" + data["Ken"] + data["Shi"] + data["Chouiki"] + ")に変更しますか？")) {
	      oElements[0].value = data["Ken"] + data["Shi"] + data["Chouiki"];
	    }
	  }
	}
      }
    } else {
      // check if this page is separate form type (Ken, Shi, Chouiki)
      oElements = document.getElementsByName("txtKen2");
      oElements1 = document.getElementsByName("txtShi2");
      oElements2 = document.getElementsByName("txtChouiki2");
      if ((oElements.length > 0)
	 && (oElements1.length > 0) && (oElements2.length > 0)) {
	curval = zip + oElements[0].name + oElements1[0].name + oElements2[0].name;
	setData = function(data) {
	  var oElements = document.getElementsByName("txtKen2");
	  var oElements1 = document.getElementsByName("txtShi2");
	  var oElements2 = document.getElementsByName("txtChouiki2");
	  if (oElements[0].value == "") {
	    oElements[0].value = data["Ken"];
	  }
	  if (oElements1[0].value == "") {
	    oElements1[0].value = data["Shi"];
	  }
	  if (oElements2[0].value == "") {
	    oElements2[0].value = data["Chouiki"];
	  }
	}
      } else {
        return;				// unknown type
      }
    }
  } else {					// called by txtZipcode
    // check if this page is default form type (just one Juusho field)
    oElements = document.getElementsByName("txtJuusho");
    if (oElements.length > 0) {
      curval = zip + oElements[0].name;
      setData = function(data) {
	var oElements = document.getElementsByName("txtJuusho");
	if (oElements[0].value == "") {
	  oElements[0].value = data["Ken"] + data["Shi"] + data["Chouiki"];
	} else {
	  // check wether txtJuusho and DB is same value.
	  var rObj = new RegExp("^" + data["Ken"] + data["Shi"] + data["Chouiki"] + ".*");
	  var stNew = oElements[0].value;
	  if (!stNew.match(rObj)) {
	    if (confirm("郵便番号が変わりました．新しい住所(" + data["Ken"] + data["Shi"] + data["Chouiki"] + ")に変更しますか？")) {
	      oElements[0].value = data["Ken"] + data["Shi"] + data["Chouiki"];
	    }
	  }
	}
      }
    } else {
      // check if this page is separate form type (Ken, Shi, Chouiki)
      oElements = document.getElementsByName("txtKen");
      oElements1 = document.getElementsByName("txtShi");
      oElements2 = document.getElementsByName("txtChouiki");
      if ((oElements.length > 0)
	 && (oElements1.length > 0) && (oElements2.length > 0)) {
	curval = zip + oElements[0].name + oElements1[0].name + oElements2[0].name;
	setData = function(data) {
	  var oElements = document.getElementsByName("txtKen");
	  var oElements1 = document.getElementsByName("txtShi");
	  var oElements2 = document.getElementsByName("txtChouiki");
	  if (oElements[0].value == "") {
	    oElements[0].value = data["Ken"];
	  }
	  if (oElements1[0].value == "") {
	    oElements1[0].value = data["Shi"];
	  }
	  if (oElements2[0].value == "") {
	    oElements2[0].value = data["Chouiki"];
	  }
	}
      } else {
        return;				// unknown type
      }
    }
  }

  // state changed ?
  //if (curval == zipcode.prev) {
    // state not changed
  //  return;
  //}
  zipcode.prev = curval;

  // get address from server
  zipcode.cb = setData;
  zipcode.zip = zip;
  zipcode.get(zip);
}

zipcode.api2 = function() {
  // 739-8527
  try {
    var zip = zipcode.zip;
    var url = location.protocol + "//" + location.host + "/php/getZipcode.php";
    var req = sendRequest(function(){}, '&zipcode=' + zip, 'GET', url, false);
    if (!req) return;
    if (!req.responseText) return;
    var data = eval('(' + req.responseText + ')');
    zipcode.cb(data);
  }
  catch (e) {}
}

function checkZipcode(oJuusho, oZipcode, mode)
{
  if ((oJuusho == null) || (oZipcode == null)) {
    return true;
  }

  var val = oZipcode.value;
  var zip = '';

  //
  // get zipcode value
  //
  if (!val) {
    return true;
  }

  for (var i = 0; i < val.length; i++) {
    var c = val.charCodeAt(i);
    if (( c >= 48 ) && ( c <= 57 )) {
      zip += val.charAt(i);
    } else if (( c >= 65296 ) && ( c <= 65305 )) {
      // Zenkaku number
      zip += String.fromCharCode(c - 65248);
    }
  }
  if (zip.length < 7) {
    return true;
  }
  var url = location.protocol + "//" + location.host + "/php/getZipcode.php";
  var req = sendRequest(function(){}, '&zipcode=' + zip, 'GET', url, false);
  if (!req) return true;
  if (!req.responseText) return true;
  var data = eval('(' + req.responseText + ')');
  if (data["Jigyosyo"] == 1) {
    return true;
  }

  if (mode == 0) {
    var juusho = data["Ken"] + data["Shi"] + data["Chouiki"];
    if (oJuusho.value != juusho) {
      return true;
    }
    return false;
  } else {
    if (oJuusho.value != data["Chouiki"]) {
      return true;
    }
    return false;
  }
}

/*
 * http://d.hatena.ne.jp/NeoCat/20110206/1296934235
 */
var xds = {
  load: function(url, callback, onerror, retry, callback_key) {
    var ifr = document.createElement("iframe");
    ifr.style.display = "none";
    document.body.appendChild(ifr);
    var d = ifr.contentWindow.document;
    var cnt = 0;
    ifr[ifr.readyState/*IE*/ ? "onreadystatechange" : "onload"] = function() {
      if (this.readyState && this.readyState != 'complete' || cnt++) return;
      if (d.x) {
        if (callback) callback.apply(this, d.x);
      } else if (retry && retry > 1) {
        setTimeout(function(){ xds.load(url, callback, onerror, retry-1) }, 1000);
      } else if (onerror)
        onerror();
      setTimeout(function(){ try { ifr.parentNode.removeChild(ifr); } catch(e) {} }, 0);
    };
    var url2 = url + (url.indexOf('?')<0?'?':'&') +
      (callback_key?callback_key:'callback') + '=cb';
    d.write('<scr'+'ipt>function cb(){document.x=arguments}</scr'+'ipt>' +
      '<scr'+'ipt src="'+url2+'"></scr'+'ipt>');
    d.close();
    return ifr;
  },
  abort: function(ifr) {
    if (ifr && ifr.parentNode)
      ifr.parentNode.removeChild(ifr);
  }
}

