(function ($) {
var hasResult = false;
var currentSelect = "";
var selectedCity = "";
String.prototype.trim = function () { //自定义的trim方法 防止浏览器兼容性造成的问题 2012-10-9 Lzz
return this.replace(/^\s+|\s+$/g, '');
}
$.suggest = function (input, options) {
//var $input = $(input).attr("autocomplete", "off");
var $input = $(input);
var $results;
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 ($.trim($input.val()) == '' || $.trim($input.val()) == '中文/英文') $input.val('').css('color', '#aaa');
if (!options.attachObject)
options.attachObject = $(document.createElement("ul")).appendTo('body');
$results = $(options.attachObject);
$results.addClass(options.resultsClass);
//resetPosition();
//$(window)
//.load(resetPosition) // just in case user is changing size of page while loading
//.resize(resetPosition);
$input.blur(function () {
/*********update at 2011-12-23 ,默认第一个**********/
/*if ($(this).val().length == 0) {
hasResult = false;
}
if (hasResult) {
$(input).val(currentSelect).css('color', '#000');
hasResult = false;
currentSelect = "";
}
else {
$(this).val("中文/拼音").css('color', '#aaa');
}*/
/****************************************************/
var $value = $input.val();
if( $value=="" || $value.length == 0){
$('input[name='+$input[0].id+']').val('');
}else{
var $val = $('input[name='+$input[0].id+']').val();
if(($value.length > 0 && !hasResult) || $val.length == 0){
$input.val('');
}
}
setTimeout(function () { $results.hide(); }, 200);
});
$input.focus(function () {
if ($.trim($(this).val()) == '中文/英文') {
$(this).val('').css('color', '#000');
}
if ($.trim($(this).val()) == '') {
displayItems('',options.listSize,options.parentVal); //显示热门城市列表
}
});
$input.click(function () {
var q = $.trim($(this).val());
displayItems(q,options.listSize,options.parentVal);
$(this).select();
});
// help IE users if possible
try {
$results.bgiframe();
} catch (e) { }
$input.keyup(processKey); //
// function resetPosition() {
// // requires jquery.dimension plugin
// var offset = $input.offset();
// $results.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) && $results.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
$results.hide();
break;
}
} else if ($input.val().length != prevLength) {
if (timeout)
clearTimeout(timeout);
timeout = setTimeout(suggest, options.delay);
prevLength = $input.val().length;
}
}
function suggest() {
var q = $.trim($input.val());
displayItems(q,options.listSize,options.parentVal);
}
function displayItems(items,size,parentname) {
var parentVal = null;
if(parentname){ //用于联动
var pp_val = $('#'+parentname).val();
if(pp_val.length > 0){
parentVal = pp_val;
}else{
pp_val = $('input[name='+parentname+']').val();
if(pp_val.length > 0){
parentVal = pp_val;
}
}
}
var html = '';
var listsize = size||10;
var iframe_attach = "";
var current_broswer = navigator.userAgent.toLowerCase();
if (current_broswer.match(/msie ([6.]+)/)) {//如果是ie6
//231px对应10个提示选项和一个tip头(提示项和tip头都是21px)
iframe_attach = "";
}
if (items == '') {//热门城市遍历
var count = 0;
for (h in options.hot_list) {
if (null != options.hot_list[h][0]&& (parentVal==null || parentVal== options.hot_list[h][0] )) {
html += '
' + options.hot_list[h][1] + '' + options.hot_list[h][2] + '' + options.hot_list[h][3] + '';
count++;
if (count == size) {
break;
}
}
}
html = iframe_attach + '请输入中文/英文或者↑↓选择
';
}
else {
/*if (!items)
return;
if (!items.length) {
$results.hide();
return;
}*/
var jSum = 0;
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(parentVal==null || parentVal == options.source[i][0] ) {
html += '' + options.source[i][1] + '' + options.source[i][2] + '' + options.source[i][3] + '';
}
jSum++;
}
if (jSum == listsize) {
break;
}
}
if (html == '') {
hasResult = false;
suggest_tip = '对不起,找不到:' + items + '
';
}
else {
hasResult = true;
suggest_tip = iframe_attach + '' + items + ',按字母排序
';
}
/***取出当前第一个城市的英文 add at 2011-12-23****/
var pos = html.indexOf("") + 7;
//currentSelect = html.substr(pos, html.indexOf("", pos + 1) - pos);
currentSelect = html.substr(pos, html.indexOf("", pos) - pos);
/*************************************************/
html = suggest_tip + '';
}
$results.html(html).show();
$results.children('ul').children('li:first-child').addClass(options.selectClass);
$results.children('ul')
.children('li')
.mouseover(function () {
$results.children('ul').children('li').removeClass(options.selectClass);
$(this).addClass(options.selectClass);
})
.click(function (e) {
e.preventDefault();
e.stopPropagation();
selectCurrentResult();
});
}
function getCurrentResult() {
if (!$results.is(':visible'))
return false;
var $currentResult = $results.children('ul').children('li.' + options.selectClass);
if (!$currentResult.length)
$currentResult = false;
return $currentResult;
}
function selectCurrentResult() {
$currentResult = getCurrentResult();
if ($currentResult) {
$(options.selectCity).val($currentResult.children('a').children("span").eq(1).children('font').html());
$input.val($currentResult.children('a').html().replace(/.+?<\/span>|.+?<\/SPAN>/g, '')).css('color', '#000');
/**绑定ID**/
$('input[name='+$input[0].id+']').val($currentResult.children('a').find('FONT').html());
$('input[name='+$input[0].id+']').change();
/***/
$results.hide();
if ($(options.dataContainer)) {
$(options.dataContainer).val($currentResult.attr('rel'));
}
if (options.onSelect) {
options.onSelect.apply($input[0]);
}
}
}
function nextResult() {
$currentResult = getCurrentResult();
if ($currentResult)
$currentResult
.removeClass(options.selectClass)
.next()
.addClass(options.selectClass);
else
$results.children('ul').children('li:first-child').addClass(options.selectClass);
}
function prevResult() {
$currentResult = getCurrentResult();
if ($currentResult)
$currentResult
.removeClass(options.selectClass)
.prev()
.addClass(options.selectClass);
else
$results.children('ul').children('li:last-child').addClass(options.selectClass);
}
}
$.fn.suggest = function (source, options) {
if (!source)
return;
options = options || {};
options.source = source;
options.parentVal = options.parentVal || null;
options.listSize = options.listSize || 10;
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.selectCity = options.selectCity || ""; //控件的id,存在选择的city
//options.tips = options.tips || "中文/拼音";
this.each(function () {
new $.suggest(this, options);
});
return this;
};
})(jQuery);