(function(Prototype) {

    Prototype.suggest = function(input, options) {

        var Prototypeinput = Prototype(input).attr("autocomplete", "off");
        var Prototyperesults;

        var timeout = false; 	// hold timeout ID for suggestion results to appear	
        var prevLength = 0; 		// last recorded length of $input.val()
        var cache = []; 			// cache MRU list
        var cacheSize = 0; 		// size of cache in chars (bytes?)

        if (Prototype.trim(Prototypeinput.val()) == '' || Prototype.trim(Prototypeinput.val()) == '中文/拼音') Prototypeinput.val('中文/拼音').css('color', '#aaa');
        if (!options.attachObject)
            options.attachObject = Prototype(document.createElement("ul")).appendTo('body');

        Prototyperesults = Prototype(options.attachObject);
        Prototyperesults.addClass(options.resultsClass);

        resetPosition();
        Prototype(window)
				.load(resetPosition)		// just in case user is changing size of page while loading
				.resize(resetPosition);

        Prototypeinput.focus(function() {
            if (Prototype.trim(Prototype(this).val()) == '中文/拼音') {
                Prototype(this).val('').css('color', '#000');
            }
            if (Prototype.trim(Prototype(this).val()) == '') {
                displayItems(''); //显示热门城市列表

            }
        });
        Prototypeinput.blur(function() {
            if (Prototype(".inputset").length > 0) {
                Prototype(".inputset").each(function() {
                    var sTemp = Prototype(this).text();
                    var sValue = "";
                    if (sTemp.indexOf("-") == -1) {
                        sValue = sTemp;
                    }
                    else {
                        sValue = sTemp.split('-')[1];
                    }
                    Prototypeinput.val(sValue);
                    Prototype(options.setControl).val(Prototype(this).next().text());
                    //if (Prototype("#tbHot").length <= 0) {
                    //  Prototyperesults.hide();
                    //}
                    return false;
                });
            }
            else {
                //Prototype(options.setControl).val("");
            }
        });
        Prototypeinput.click(function() {
            var q = Prototype.trim(Prototype(this).val());
            displayItems(q);
            Prototype(this).select();
        });

        // help IE users if possible
        try {
            Prototyperesults.bgiframe();
        } catch (e) { }

        Prototypeinput.keyup(processKey); //

        function resetPosition() {
            // requires jquery.dimension plugin
            var offset = Prototypeinput.offset();
            Prototyperesults.css({
                top: (offset.top + input.offsetHeight) + 'px',
                left: offset.left + 'px'
            });
        }


        function processKey(e) {

            // handling up/down/escape requires results to be visible
            // handling enter/tab requires that AND a result to be selected
            if ((/27$|38$|40$/.test(e.keyCode) && Prototyperesults.is(':visible')) ||
					(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {

                if (e.preventDefault)
                    e.preventDefault();
                if (e.stopPropagation)
                    e.stopPropagation();

                e.cancelBubble = true;
                e.returnValue = false;

                switch (e.keyCode) {

                    case 38: // up
                        prevResult();
                        break;

                    case 40: // down
                        nextResult();
                        break;
                    case 13: // return
                        selectCurrentResult();
                        break;

                    case 27: //	escape
                        Prototyperesults.hide();
                        break;

                }

            } else if (Prototypeinput.val().length != prevLength) {

                if (timeout)
                    clearTimeout(timeout);
                timeout = setTimeout(suggest, options.delay);
                prevLength = Prototypeinput.val().length;

            }


        }

        function suggest() {

            var q = Prototype.trim(Prototypeinput.val());
            displayItems(q);
        }
        function displayItems(items) {
            var html = '<div class="gray ac_result_tip"><span><a class="cityclick" style="cursor:pointer;font-size:15px;"><u>人気都市</u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="cityclick" style="cursor:pointer;font-size:15px;"><u>ほかの都市</u></a><a class="close" style="cursor:pointer;font-size:15px;" ><img src="/images/close.jpg" /></a></span></div>';
            var shtml = "";
            if (items == '') {
                var ii = 0;
                var temp = "";
                var sContent = "";
                //for (var h = 0; i < commoncitys.length; i++) {
                for (h in commoncitys) {
                    temp = "<td><a class='inputset' style='cursor:pointer;text-align:center;font-size:15px;'>" + commoncitys[h][1] + "</a><span id='spcontent' style='float:right;display:none;'>" + commoncitys[h][2] + "</span></td>";
                    if (temp.indexOf("undefined") == -1) {
                        sContent += temp;
                        ii++;
                    }
                    if (ii % 4 == 0) {
                        shtml += "<tr>" + sContent + "</tr>";
                        sContent = "";
                    }
                }

                if (sContent != "") {
                    shtml += "<tr>" + sContent + "</tr>";
                }
                html += "<div><table  width='100%' id='tbHot'  style='text-align:center'>" + shtml + "</table></div>";
            }
            else if (items == "1") {
                var ii = 0;
                var sContent = "";
                var temp = "";
                for (h in citys) {
                    temp = '<li><a class="inputset" style="cursor:pointer;">' + citys[h][0] + "-" + citys[h][1] + '</a><span id="spcontent" style="float:right;display:none;">' + citys[h][2] + '</span></li>';
                    if (temp.indexOf("undefined") == -1) {
                        sContent += temp;
                    }
                }
                shtml = '<div id="divlist" style="overflow-y:scroll; height:300px;overflow-x:hidden"><ul>' + sContent + '</ul></div>';
                //                shtml = '<ul>' + sContent + '</ul>';
                html += shtml;
            }
            else {
                /*if (!items)
                return;
                if (!items.length) {
                $results.hide();
                return;<span style="float:right"></span>
                }*/
                for (var i = 0; i < options.source.length; i++) {//国内城市匹配
                    var reg = new RegExp('^' + items + '.*$', 'im');
                    if (reg.test(options.source[i][0]) || reg.test(options.source[i][1]) || reg.test(options.source[i][2]) || reg.test(options.source[i][3])) {
                        if (typeof (options.source[i][1]) != undefined) {
                            shtml += '<li><a class="inputset" style="cursor:pointer;">' + options.source[i][0] + "-" + options.source[i][1] + '</a><span id="spcontent" style="float:right;display:none;">' + options.source[i][2] + '</span></li>';
                        }
                    }
                }
                if (shtml == '') {
                    suggest_tip = '<div>对不起，找不到：' + items + '</div>';
                }
                else {
                    suggest_tip = ''; //'<div>' + items + '，按拼音排序</div>';
                }
                html += suggest_tip + '<ul>' + shtml + '</ul>';
            }
            Prototyperesults.html(html).show();
            //            if (items == "1" || items == "") {
            //                Prototyperesults.find('div[id="divlist"]').children("ul").children('li:first-child').addClass(options.selectClass);
            //                Prototyperesults.find('div[id="divlist"]').children("ul")
            //					.children('li')
            //					.mouseover(function() {
            //					    Prototyperesults.find('div[id="divlist"]').children("ul").children('li').removeClass(options.selectClass);
            //					    Prototype(this).addClass(options.selectClass);
            //					})
            //					.click(function(e) {
            //					    e.preventDefault();
            //					    e.stopPropagation();
            //					    selectCurrentResult();
            //					});
            //            }
            //            else {
            Prototyperesults.children('ul').children('li:first-child').addClass(options.selectClass);
            Prototyperesults.children('ul')
					.children('li')
					.mouseover(function() {
					    Prototyperesults.children('ul').children('li').removeClass(options.selectClass);
					    Prototype(this).addClass(options.selectClass);
					})
					.click(function(e) {
					    e.preventDefault();
					    e.stopPropagation();
					    selectCurrentResult();
					});
            //            }

            Prototype(".cityclick").each(function() {
                Prototype(this).click(function() {
                    if (Prototype(this).text() == '人気都市') {
                        displayItems('');
                        //Prototyperesults.show();
                    }
                    if (Prototype(this).text() == 'ほかの都市') {
                        displayItems('1');
                        //Prototyperesults.show();
                    }
                });
            });
            Prototype(".inputset").each(function() {
                Prototype(this).click(function() {
                    var sTemp = Prototype(this).text();
                    var sValue = "";
                    if (sTemp.indexOf("-") == -1) {
                        sValue = sTemp;
                    }
                    else {
                        sValue = sTemp.split('-')[1];
                    }
                    Prototypeinput.val(sValue);
                    Prototype(options.setControl).val(Prototype(this).next().text());
                    setTimeout(function() { Prototyperesults.hide() }, 200);
                });
                Prototype(this).mouseover(function() {
                    Prototype(this).css("backgroundColor", "lightblue");
                }).mouseout(function() {
                    Prototype(this).css("backgroundColor", "");
                });
            });
            Prototype(".close").each(function() {
                Prototype(this).click(function() {
                    setTimeout(function() { Prototyperesults.hide() }, 200);
                });
            });
            resetPosition();
            //Prototype(options.attachObject).css({ "top": (Prototypeinput.offset().top + input.offsetHeight) + "px", "left": Prototypeinput.offset().left + "px" });
        }

        function getCurrentResult() {

            if (!Prototyperesults.is(':visible'))
                return false;

            var PrototypecurrentResult = Prototyperesults.children('ul').children('li.' + options.selectClass);
            if (!PrototypecurrentResult.length)
                PrototypecurrentResult = false;

            return PrototypecurrentResult;

        }

        function selectCurrentResult() {

            PrototypecurrentResult = getCurrentResult();
            if (PrototypecurrentResult) {
                var sTemp = PrototypecurrentResult.children('a').text();
                var sValue = "";
                if (sTemp.indexOf("-") == -1) {
                    sValue = sTemp;
                }
                else {
                    sValue = sTemp.split('-')[1];
                }
                Prototypeinput.val(sValue);
                Prototype(options.setControl).val(PrototypecurrentResult.children('a').next().text());

                Prototyperesults.hide();

                if (Prototype(options.dataContainer)) {
                    Prototype(options.dataContainer).val(PrototypecurrentResult.attr('rel'));
                }

                if (options.onSelect) {
                    options.onSelect.apply(Prototypeinput[0]);
                }
            }

            //            if (PrototypecurrentResult) {
            //                Prototypeinput.val(PrototypecurrentResult.children('a').html().replace(/<span>.+?<\/span>/i, ''));
            //                Prototyperesults.hide();

            //                if (Prototype(options.dataContainer)) {
            //                    Prototype(options.dataContainer).val(PrototypecurrentResult.attr('rel'));
            //                }

            //                if (options.onSelect) {
            //                    options.onSelect.apply(Prototypeinput[0]);
            //                }
            //            }

        }

        function nextResult() {

            PrototypecurrentResult = getCurrentResult();

            if (PrototypecurrentResult)
                PrototypecurrentResult
						.removeClass(options.selectClass)
						.next()
							.addClass(options.selectClass);
            else
                Prototyperesults.children('ul').children('li:first-child').addClass(options.selectClass);

        }

        function prevResult() {

            PrototypecurrentResult = getCurrentResult();

            if (PrototypecurrentResult)
                PrototypecurrentResult
						.removeClass(options.selectClass)
						.prev()
							.addClass(options.selectClass);
            else
                Prototyperesults.children('ul').children('li:last-child').addClass(options.selectClass);

        }

    }

    Prototype.fn.suggest = function(source, options) {

        if (!source)
            return;

        options = options || {};
        options.source = source;
        options.hot_list = options.hot_list || [];
        options.delay = options.delay || 0;
        options.resultsClass = options.resultsClass || 'ac_results';
        options.selectClass = options.selectClass || 'ac_over';
        options.matchClass = options.matchClass || 'ac_match';
        options.minchars = options.minchars || 1;
        options.delimiter = options.delimiter || '\n';
        options.onSelect = options.onSelect || false;
        options.dataDelimiter = options.dataDelimiter || '\t';
        options.dataContainer = options.dataContainer || '#SuggestResult';
        options.attachObject = options.attachObject || null;
        options.setControl = options.setControl || null;

        this.each(function() {
            new Prototype.suggest(this, options);
        });

        return this;

    };



})(jQuery);

