jQuery.zipsearch = function(options) {
    this.settings = jQuery.extend({
        'zipText': '#zip',
        'encode': 'UTF-8',
        'pref': '#pref',
        'city': '#city',
        'town': '#town',
        'popId': 'pop',
        'popStyle': {},
        'popOffset': 6,
        'popHover': '#dfd',
        'startLen': 7
    },
    options || {});

    String.prototype.zipSplit = function() {
        return [this.substr(0, 3), this.substr(3, 4)];
    };

    if (!jQuery(this.settings.zipText).length) {
        return false;
    }
    if (!jQuery(this.settings.pref).length && !jQuery(this.settings.city).length && !jQuery(this.settings.town).length) {
        return false;
    }

	var set = this.settings;

    jQuery(set.zipText).keyup(function() {

        var elem = jQuery('<div>');
        var popElem = '#' + set.popId;
        var zip = '';

        jQuery(set.zipText).each(function() {
            zip += jQuery(this).val().replace(/[^0-9]/g, '');
        });

        if (zip.length == set.startLen) {
	        jQuery.getJSON("http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch?zipcode=" + zip + "&oe=" + set.encode + "&callback=?",
	        function(json) {
	            if (json.zipcode.a2 != null) {
	            	
	                var popStyle = jQuery.extend({
	                    'position': 'absolute',
	                    'overflow': 'auto',
	                    'font-size': 'small',
	                    'top': jQuery(set.zipText).eq(0).offset().top + jQuery(set.zipText).eq(0).height() + set.popOffset,
	                    'left': jQuery(set.zipText).eq(0).offset().left,
	                    'width': 'auto',
	                    'height': 'auto',
	                    'border': '1px solid #000',
	                    'padding': '3px',
	                    'background': '#fff'
	                }, set.popStyle || {});
	                
	                jQuery.each(json.zipcode,
	                function() {
	                    var _this = this;
	                    jQuery('<div>').css('cursor', 'pointer').hover(function() {
	                        jQuery(this).css('background', set.popHover);
	                    },
	                    function() {
	                        jQuery(this).css('background', popStyle.background);
	                    }).html([_this.zipcode, ' ', _this.prefecture, _this.city, _this.town].join('')).click(function() {
	                        if (jQuery(set.zipText).length >= 2) {
	                            jQuery(set.zipText).eq(0).val(_this.zipcode.zipSplit()[0]);
	                            jQuery(set.zipText).eq(1).val(_this.zipcode.zipSplit()[1]);
	                        } else {
	                            jQuery(set.zipText).val(_this.zipcode);
	                        }
	                        jQuery(set.pref).val('');
	                        jQuery(set.city).val('');
	                        jQuery(set.town).val('');
	                        jQuery(set.pref).val(jQuery(set.pref).val() + _this.prefecture);
	                        jQuery(set.city).val(jQuery(set.city).val() + _this.city);
	                        jQuery(set.town).val(jQuery(set.town).val() + _this.town);
	                        jQuery(popElem).remove();
	                    }).appendTo(elem);
	                });
	                jQuery(popElem).remove();
	                jQuery('body').append(jQuery('<div>').attr('id', set.popId).css(popStyle).append(elem));
	            } else {
	                if (json.zipcode.a1 != null) {
	                    if (jQuery(set.zipText).length >= 2) {
	                        jQuery(set.zipText).eq(0).val(json.zipcode.a1.zipcode.zipSplit()[0]);
	                        jQuery(set.zipText).eq(1).val(json.zipcode.a1.zipcode.zipSplit()[1]);
	                    }
	                    jQuery(set.pref).val('');
	                    jQuery(set.city).val('');
	                    jQuery(set.town).val('');
	                    jQuery(set.pref).val(jQuery(set.pref).val() + json.zipcode.a1.prefecture);
	                    jQuery(set.city).val(jQuery(set.city).val() + json.zipcode.a1.city);
	                    jQuery(set.town).val(jQuery(set.town).val() + json.zipcode.a1.town);
	                    jQuery(popElem).remove();
	                }
	            }
	        });
        } else {
        	jQuery(popElem).remove();
        }
    });
}