/** * 郵便番号検索スクリプト * * @author Shinya Chitose * @copyright Dispatch Base Sole Proprietorship. */ // クラスを以下の変数名で定義する var despxAjaxPostcode = new ClsSystem100AjaxPostcode(); // 変数名・関数名バッティング防止の為、カプセル化する function ClsSystem100AjaxPostcode() { /** * コンストラクタ */ this.constructor = function () { /*@cc_on @if (@_jscript_version >= 5) try { this.objXmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { this.objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { this.objXmlHttp = false; } } @else this.objXmlHttp = false; @end @*/ if (! this.objXmlHttp && typeof(XMLHttpRequest) != 'undefined') { try { this.objXmlHttp = new XMLHttpRequest(); this.objXmlHttp.overrideMimeType("text/xml"); } catch (e) { this.objXmlHttp = false; } } } /** * URLをセットする * * @param string URL */ this.setUrl = function (url) { this.url = url; this.param = '?execType=dispXML&postcode='; } /** * 分割された郵便番号から住所XMLを取得する * * @param object フォームオブジェクト * @param string 郵便番号1のName属性 * @param string 郵便番号2のName属性 * @param string 都道府県のName属性 * @param string 市区町村のName属性 * @param string 町域のName属性 */ this.getPrefStateCityStreetFromSplitPostcode = function ( objForm, postcode1FormName, postcode2FormName, prefFormName, stateFormName, cityFormName ) { // 引数をクラス変数に登録 this.objForm = objForm; this.prefFormName = prefFormName; this.stateFormName = stateFormName; this.cityFormName = cityFormName; // 郵便番号を結合する var postcode = this.objForm.elements[postcode1FormName].value + this.objForm.elements[postcode2FormName].value; // system100.despx.com からデータを取得する this.objXmlHttp.open( 'GET', this.url + this.param + escape(postcode) + this.addTimestamp(), true ); // onreadystatechange にはカプセル化された関数を代入できない為、プライベート関数を呼び出す this.objXmlHttp.onreadystatechange = _rewritePrefStateCityStreetFromSplitPostcode; this.objXmlHttp.send(null); } /** * 結合された郵便番号から住所XMLを取得する * * @param object フォームオブジェクト * @param string 郵便番号のName属性 * @param string 都道府県のName属性 * @param string 市区町村町域のName属性 */ this.getPrefUnionStateCityStreetFromPostcode = function ( objForm, postcodeFormName, prefFormName, unionFormName ) { // 引数をクラス変数に登録 this.objForm = objForm; this.prefFormName = prefFormName; this.unionFormName = unionFormName; // 郵便番号のハイフンを削除する var postcode = this.objForm.elements[postcodeFormName].value.replace('-', ''); // system100.despx.com からデータを取得する this.objXmlHttp.open( 'GET', this.url + this.param + escape(postcode) + this.addTimestamp(), true ); // onreadystatechange にはカプセル化された関数を代入できない為、プライベート関数を呼び出す this.objXmlHttp.onreadystatechange = _rewritePrefUnionStateCityStreetFromPostcode; this.objXmlHttp.send(null); } /** * タイムスタンプを追加する */ this.addTimestamp = function () { var ret = new Date(); ret = ret.getTime(); ret = '&ts=' + ret; return ret; } // コンストラクタを実行 this.constructor(); return this; } // ========================== 以下、プライベート関数 =========================== /** * 分割された郵便番号から住所XMLを取得する */ _rewritePrefStateCityStreetFromSplitPostcode = function () { var myCls = despxAjaxPostcode; /** * XMLを読み込みできない場合は処理中断 * * if (! (myCls.objXmlHttp.readyState == 4 && typeof(myCls.objXmlHttp.responseText) == 'string')) * * statusを見ると、mozilla でハングするので responseText を判別するようにしてみたが、 * Netscape 7.1 以下では問題を解決できないので、一般的な status == 200 で対応 */ if (! (myCls.objXmlHttp.readyState == 4 && myCls.objXmlHttp.status == 200)) { return false; } var xml = myCls.objXmlHttp.responseXML; // データ取得に失敗した場合は処理中断 if (! xml.documentElement) { return false; } var prefName = xml.getElementsByTagName('prefecture_name').item(0).firstChild.data; var stateName = xml.getElementsByTagName('state_name').item(0).firstChild.data; var cityName = xml.getElementsByTagName('city_name').item(0).firstChild.data; if (prefName != null) { // 都道府県フォームがプルダウン形式の場合 if (myCls.objForm.elements[myCls.prefFormName].type.indexOf('select') != -1) { var options = myCls.objForm.elements[myCls.prefFormName].options; for (var i = 0; i < options.length; i++) { if (options[i].text == prefName) { options[i].selected = true; } } // テキスト系の場合 } else { myCls.objForm.elements[myCls.prefFormName].value = prefName; } } if (stateName != null) { myCls.objForm.elements[myCls.stateFormName].value = stateName; } if (cityName != null) { myCls.objForm.elements[myCls.cityFormName].value = cityName; } } /** * 結合された郵便番号から住所XMLを取得する */ _rewritePrefUnionStateCityStreetFromPostcode = function () { var myCls = despxAjaxPostcode; /** * XMLを読み込みできない場合は処理中断 * * if (! (myCls.objXmlHttp.readyState == 4 && typeof(myCls.objXmlHttp.responseText) == 'string')) * * statusを見ると、mozilla でハングするので responseText を判別するようにしてみたが、 * Netscape 7.1 以下では問題を解決できないので、一般的な status == 200 で対応 */ if (! (myCls.objXmlHttp.readyState == 4 && myCls.objXmlHttp.status == 200)) { return false; } var xml = myCls.objXmlHttp.responseXML; // データ取得に失敗した場合は処理中断 if (! xml.documentElement) { return false; } var prefName = xml.getElementsByTagName('prefecture_name').item(0).firstChild.data; var stateName = xml.getElementsByTagName('state_name').item(0).firstChild.data; var cityName = xml.getElementsByTagName('city_name').item(0).firstChild.data; if (prefName != null) { // 都道府県フォームがプルダウン形式の場合 if (myCls.objForm.elements[myCls.prefFormName].type.indexOf('select') != -1) { var options = myCls.objForm.elements[myCls.prefFormName].options; for (var i = 0; i < options.length; i++) { if (options[i].text == prefName) { options[i].selected = true; } } // テキスト系の場合 } else { myCls.objForm.elements[myCls.prefFormName].value = prefName; } } if (stateName != null) { myCls.objForm.elements[myCls.unionFormName].value = stateName; } if (cityName != null) { myCls.objForm.elements[myCls.unionFormName].value += cityName; } }