动态加载数据autoComplete(mysql数据库)
/**需要jquery.autocomplete.js和jquery.js连个文件/
DbManager.java
package person;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
import com.mysql.jdbc.Driver;
public class DbManager {
public static Connection getConnection() throws SQLException {
return getConnection("test", "root", "518");//
}
public static Connection getConnection(String dbName, String userName,
String password) throws SQLException {
String url = "jdbc:mysql://localhost:3306/" + dbName
+ "?characterEncoding=utf-8";
DriverManager.registerDriver(new Driver());
return DriverManager.getConnection(url, userName, password);
}
public static void setParams(PreparedStatement preStmt, Object... params)
throws SQLException {
if (params == null || params.length == 0)
return;
for (int i = 1; i <= params.length; i++) {
Object param = params[i - 1];
if (param == null) {
preStmt.setNull(i, Types.NULL);
} else if (param instanceof Integer) {
preStmt.setInt(i, (Integer) param);
} else if (param instanceof String) {
preStmt.setString(i, (String) param);
} else if (param instanceof Double) {
preStmt.setDouble(i, (Double) param);
} else if (param instanceof Long) {
preStmt.setDouble(i, (Long) param);
} else if (param instanceof Timestamp) {
preStmt.setTimestamp(i, (Timestamp) param);
} else if (param instanceof Boolean) {
preStmt.setBoolean(i, (Boolean) param);
} else if (param instanceof Date) {
preStmt.setDate(i, (Date) param);
}
}
}
public static int executeUpdate(String sql) throws SQLException {
return executeUpdate(sql, new Object[] {});
}
public static int executeUpdate(String sql, Object... params)
throws SQLException {
Connection conn = null;
PreparedStatement preStmt = null;
try {
conn = getConnection();
preStmt = conn.prepareStatement(sql);
setParams(preStmt, params);
return preStmt.executeUpdate();
} finally {
if (preStmt != null)
preStmt.close();
if (conn != null)
conn.close();
}
}
public static int getCount(String sql) throws SQLException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
rs.next();
return rs.getInt(1);
} finally {
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
}
}
}
citys.sql
/*
Navicat MySQL Data Transfer
Source Server : ctl
Source Server Version : 50527
Source Host : localhost:3306
Source Database : test
Target Server Type : MYSQL
Target Server Version : 50527
File Encoding : 65001
Date: 2013-02-02 15:43:22
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `citys`
-- ----------------------------
DROP TABLE IF EXISTS `citys`;
CREATE TABLE `citys` (
`region` varchar(8) DEFAULT NULL,
`province` varchar(8) DEFAULT NULL,
`city` varchar(20) NOT NULL DEFAULT '',
`info` varchar(20) DEFAULT NULL,
PRIMARY KEY (`city`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of citys
-- ----------------------------
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '七台河市', '');
INSERT INTO `citys` VALUES ('华南地区', '海南', '三亚市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '三明市', '');
INSERT INTO `citys` VALUES ('华南地区', '海南', '三沙市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '三门峡市', '');
INSERT INTO `citys` VALUES ('华东地区', '上海', '上海市', '直辖市');
INSERT INTO `citys` VALUES ('华东地区', '江西', '上饶市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '东莞市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '东营市', '');
INSERT INTO `citys` VALUES ('西北地区', '宁夏', '中卫市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '中山市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '临夏回族自治州', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '临汾市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '临沂市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '临沧市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '丹东市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '丽水市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '丽江市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '乌兰察布市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '乌海市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '乌鲁木齐市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '乐山市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '九江市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '云浮市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '亳州市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '伊春市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '伊犁哈萨克自治州', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '佛山市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '佳木斯市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '保定市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '保山市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '信阳市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '克孜勒苏柯尔克孜自治州', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '克拉玛依市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '六安市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '六盘水市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '兰州市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '兴安盟', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '内江市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '凉山彝族自治州', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '包头市', '');
INSERT INTO `citys` VALUES ('华北地区', '北京', '北京市', '直辖市');
INSERT INTO `citys` VALUES ('华南地区', '广西', '北海市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '十堰市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '南京市', '副省级');
INSERT INTO `citys` VALUES ('西南地区', '四川', '南充市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '南宁市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '南平市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '南昌市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '南通市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '南阳市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '博尔塔拉蒙古自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '厦门市', '副省级');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '双鸭山市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '台州市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '合肥市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '吉安市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '吉林市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '吐鲁番地区', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '吕梁市', '');
INSERT INTO `citys` VALUES ('西北地区', '宁夏', '吴忠市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '周口市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '呼伦贝尔市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '呼和浩特市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '和田地区', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '咸宁市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '咸阳市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '哈密地区', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '哈尔滨市', '副省级');
INSERT INTO `citys` VALUES ('华北地区', '河北', '唐山市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '商丘市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '商洛市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '喀什地区', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '嘉兴市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '嘉峪关市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '四平市', '');
INSERT INTO `citys` VALUES ('西北地区', '宁夏', '固原市', '');
INSERT INTO `citys` VALUES ('地区', '省份', '地市州盟', '备注');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '塔城地区', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '大兴安岭地区', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '大同市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '大庆市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '大理白族自治州', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '大连市', '副省级');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '天水市', '');
INSERT INTO `citys` VALUES ('华北地区', '天津', '天津市', '直辖市');
INSERT INTO `citys` VALUES ('华北地区', '山西', '太原市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '威海市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '娄底市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '孝感市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '宁德市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '宁波市', '副省级');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '安庆市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '安康市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '安阳市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '安顺市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '定西市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '宜宾市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '宜昌市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '宜春市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '宝鸡市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '宣城市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '宿州市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '宿迁市', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '山南地区', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '岳阳市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '崇左市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '巴中市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '巴彦淖尔市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '巴音郭楞蒙古自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '常州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '常德市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '平凉市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '平顶山市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '广元市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '广安市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '广州市', '副省级');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '庆阳市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '廊坊市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '延安市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '延边朝鲜族自治州', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '开封市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '张家口市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '张家界市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '张掖市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '徐州市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '德宏傣族景颇族自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '德州市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '德阳市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '忻州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '怀化市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '怒江傈僳族自治州', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '恩施土家族苗族自治州', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '惠州市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '成都市', '副省级');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '扬州市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '承德市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '抚州市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '抚顺市', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '拉萨市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '揭阳市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '攀枝花市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '文山壮族苗族自治州', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '新乡市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '新余市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '无锡市', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '日喀则地区', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '日照市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '昆明市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '昌吉回族自治州', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '昌都地区', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '昭通市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '晋中市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '晋城市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '普洱市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '景德镇市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '曲靖市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '朔州市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '朝阳市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '本溪市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '来宾市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '杭州市', '副省级');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '松原市', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '林芝地区', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '果洛藏族自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '枣庄市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '柳州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '株洲市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '桂林市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '梅州市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '梧州市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '楚雄彝族自治州', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '榆林市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '武威市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '武汉市', '副省级');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '毕节市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '永州市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '汉中市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '汕头市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '汕尾市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '江门市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '池州市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '沈阳市', '副省级');
INSERT INTO `citys` VALUES ('华北地区', '河北', '沧州市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '河池市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '河源市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '泉州市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '泰安市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '泰州市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '泸州市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '洛阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '济南市', '副省级');
INSERT INTO `citys` VALUES ('华东地区', '山东', '济宁市', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '海东地区', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '海北藏族自治州', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '海南藏族自治州', '');
INSERT INTO `citys` VALUES ('华南地区', '海南', '海口市', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '海西蒙古族藏族自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '淄博市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '淮北市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '淮南市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '淮安市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '深圳市', '副省级');
INSERT INTO `citys` VALUES ('华南地区', '广东', '清远市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '温州市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '渭南市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '湖州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '湘潭市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '湘西土家族苗族自治州', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '湛江市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '滁州市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '滨州市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '漯河市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '漳州市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '潍坊市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '潜江市', '副地级');
INSERT INTO `citys` VALUES ('华南地区', '广东', '潮州市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '濮阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '烟台市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '焦作市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '牡丹江市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '玉林市', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '玉树藏族自治州', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '玉溪市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '珠海市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '甘南藏族自治州', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '甘孜藏族自治州', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '白城市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '白山市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '白银市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '百色市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '益阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '盐城市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '盘锦市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '眉山市', '');
INSERT INTO `citys` VALUES ('西北地区', '宁夏', '石嘴山市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '石家庄市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '福州市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '秦皇岛市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '红河哈尼族彝族自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '绍兴市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '绥化市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '绵阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '聊城市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '肇庆市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '自贡市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '舟山市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '芜湖市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '苏州市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '茂名市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '荆州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '荆门市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '莆田市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '莱芜市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '菏泽市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '萍乡市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '营口市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '葫芦岛市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '蚌埠市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '衡水市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '衡阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '衢州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '襄阳市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '西双版纳傣族自治州', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '西宁市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '西安市', '副省级');
INSERT INTO `citys` VALUES ('华中地区', '河南', '许昌市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '贵港市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '贵阳市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '贺州市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '资阳市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '赣州市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '赤峰市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '辽源市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '辽阳市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '达州市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '运城市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '连云港市', '');
INSERT INTO `citys` VALUES ('西南地区', '云南', '迪庆藏族自治州', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '通化市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '通辽市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '遂宁市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '遵义市', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '邢台市', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '那曲地区', '');
INSERT INTO `citys` VALUES ('华北地区', '河北', '邯郸市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '邵阳市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '郑州市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '郴州市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '鄂尔多斯市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '鄂州市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '酒泉市', '');
INSERT INTO `citys` VALUES ('西南地区', '重庆', '重庆市', '直辖市');
INSERT INTO `citys` VALUES ('华东地区', '浙江', '金华市', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '金昌市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '钦州市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '铁岭市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '铜仁市', '');
INSERT INTO `citys` VALUES ('西北地区', '陕西', '铜川市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '铜陵市', '');
INSERT INTO `citys` VALUES ('西北地区', '宁夏', '银川市', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '锡林郭勒盟', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '锦州市', '');
INSERT INTO `citys` VALUES ('华东地区', '江苏', '镇江市', '');
INSERT INTO `citys` VALUES ('东北地区', '吉林', '长春市', '副省级');
INSERT INTO `citys` VALUES ('华中地区', '湖南', '长沙市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '长治市', '');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '阜新市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '阜阳市', '');
INSERT INTO `citys` VALUES ('华南地区', '广西', '防城港市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '阳江市', '');
INSERT INTO `citys` VALUES ('华北地区', '山西', '阳泉市', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '阿克苏地区', '');
INSERT INTO `citys` VALUES ('西北地区', '新疆', '阿勒泰地区', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '阿坝藏族羌族自治州', '');
INSERT INTO `citys` VALUES ('华北地区', '内蒙古', '阿拉善盟', '');
INSERT INTO `citys` VALUES ('西南地区', '西藏', '阿里地区', '');
INSERT INTO `citys` VALUES ('西北地区', '甘肃', '陇南市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '随州市', '');
INSERT INTO `citys` VALUES ('西南地区', '四川', '雅安市', '');
INSERT INTO `citys` VALUES ('华东地区', '山东', '青岛市', '副省级');
INSERT INTO `citys` VALUES ('东北地区', '辽宁', '鞍山市', '');
INSERT INTO `citys` VALUES ('华南地区', '广东', '韶关市', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '马鞍山市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '驻马店市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '鸡西市', '');
INSERT INTO `citys` VALUES ('华中地区', '河南', '鹤壁市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '鹤岗市', '');
INSERT INTO `citys` VALUES ('华东地区', '江西', '鹰潭市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '黄冈市', '');
INSERT INTO `citys` VALUES ('西北地区', '青海', '黄南藏族自治州', '');
INSERT INTO `citys` VALUES ('华东地区', '安徽', '黄山市', '');
INSERT INTO `citys` VALUES ('华中地区', '湖北', '黄石市', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '黑河市', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '黔东南苗族侗族自治州', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '黔南布依族苗族自治州', '');
INSERT INTO `citys` VALUES ('西南地区', '贵州', '黔西南布依族苗族自治州', '');
INSERT INTO `citys` VALUES ('东北地区', '黑龙江', '齐齐哈尔市', '');
INSERT INTO `citys` VALUES ('华东地区', '福建', '龙岩市', '');
jquery.autocomplete.js
/*
* jQuery Autocomplete plugin 1.1
*
* Copyright (c) 2009 Jörn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
*/
;(function($) {
$.fn.extend({
autocomplete: function(urlOrData, options) {
var isUrl = typeof urlOrData == "string";
options = $.extend({}, $.Autocompleter.defaults, {
url: isUrl ? urlOrData : null,
data: isUrl ? null : urlOrData,
delay: isUrl ? $.Autocompleter.defaults.delay : 10,
max: options && !options.scroll ? 10 : 150
}, options);
// if highlight is set to false, replace it with a do-nothing function
options.highlight = options.highlight || function(value) { return value; };
// if the formatMatch option is not specified, then use formatItem for backwards compatibility
options.formatMatch = options.formatMatch || options.formatItem;
return this.each(function() {
new $.Autocompleter(this, options);
});
},
result: function(handler) {
return this.bind("result", handler);
},
search: function(handler) {
return this.trigger("search", [handler]);
},
flushCache: function() {
return this.trigger("flushCache");
},
setOptions: function(options){
return this.trigger("setOptions", [options]);
},
unautocomplete: function() {
return this.trigger("unautocomplete");
}
});
$.Autocompleter = function(input, options) {
var KEY = {
UP: 38,
DOWN: 40,
DEL: 46,
TAB: 9,
RETURN: 13,
ESC: 27,
COMMA: 188,
PAGEUP: 33,
PAGEDOWN: 34,
BACKSPACE: 8
};
// Create $ object for input element
var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
var timeout;
var previousValue = "";
var cache = $.Autocompleter.Cache(options);
var hasFocus = 0;
var lastKeyPressCode;
var config = {
mouseDownOnSelect: false
};
var select = $.Autocompleter.Select(options, input, selectCurrent, config);
var blockSubmit;
// prevent form submit in opera when selecting with return key
$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
if (blockSubmit) {
blockSubmit = false;
return false;
}
});
// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
// a keypress means the input has focus
// avoids issue where input had focus before the autocomplete was applied
hasFocus = 1;
// track last key pressed
lastKeyPressCode = event.keyCode;
switch(event.keyCode) {
case KEY.UP:
event.preventDefault();
if ( select.visible() ) {
select.prev();
} else {
onChange(0, true);
}
break;
case KEY.DOWN:
event.preventDefault();
if ( select.visible() ) {
select.next();
} else {
onChange(0, true);
}
break;
case KEY.PAGEUP:
event.preventDefault();
if ( select.visible() ) {
select.pageUp();
} else {
onChange(0, true);
}
break;
case KEY.PAGEDOWN:
event.preventDefault();
if ( select.visible() ) {
select.pageDown();
} else {
onChange(0, true);
}
break;
// matches also semicolon
case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
case KEY.TAB:
case KEY.RETURN:
if( selectCurrent() ) {
// stop default to prevent a form submit, Opera needs special handling
event.preventDefault();
blockSubmit = true;
return false;
}
break;
case KEY.ESC:
select.hide();
break;
default:
clearTimeout(timeout);
timeout = setTimeout(onChange, options.delay);
break;
}
}).focus(function(){
// track whether the field has focus, we shouldn't process any
// results if the field no longer has focus
hasFocus++;
}).blur(function() {
hasFocus = 0;
if (!config.mouseDownOnSelect) {
hideResults();
}
}).click(function() {
// show select when clicking in a focused field
if ( hasFocus++ > 1 && !select.visible() ) {
onChange(0, true);
}
}).bind("search", function() {
// TODO why not just specifying both arguments?
var fn = (arguments.length > 1) ? arguments[1] : null;
function findValueCallback(q, data) {
var result;
if( data && data.length ) {
for (var i=0; i < data.length; i++) {
if( data[i].result.toLowerCase() == q.toLowerCase() ) {
result = data[i];
break;
}
}
}
if( typeof fn == "function" ) fn(result);
else $input.trigger("result", result && [result.data, result.value]);
}
$.each(trimWords($input.val()), function(i, value) {
request(value, findValueCallback, findValueCallback);
});
}).bind("flushCache", function() {
cache.flush();
}).bind("setOptions", function() {
$.extend(options, arguments[1]);
// if we've updated the data, repopulate
if ( "data" in arguments[1] )
cache.populate();
}).bind("unautocomplete", function() {
select.unbind();
$input.unbind();
$(input.form).unbind(".autocomplete");
});
function selectCurrent() {
var selected = select.selected();
if( !selected )
return false;
var v = selected.result;
previousValue = v;
if ( options.multiple ) {
var words = trimWords($input.val());
if ( words.length > 1 ) {
var seperator = options.multipleSeparator.length;
var cursorAt = $(input).selection().start;
var wordAt, progress = 0;
$.each(words, function(i, word) {
progress += word.length;
if (cursorAt <= progress) {
wordAt = i;
return false;
}
progress += seperator;
});
words[wordAt] = v;
// TODO this should set the cursor to the right position, but it gets overriden somewhere
//$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
v = words.join( options.multipleSeparator );
}
v += options.multipleSeparator;
}
$input.val(v);
hideResultsNow();
$input.trigger("result", [selected.data, selected.value]);
return true;
}
function onChange(crap, skipPrevCheck) {
if( lastKeyPressCode == KEY.DEL ) {
select.hide();
return;
}
var currentValue = $input.val();
if ( !skipPrevCheck && currentValue == previousValue )
return;
previousValue = currentValue;
currentValue = lastWord(currentValue);
if ( currentValue.length >= options.minChars) {
$input.addClass(options.loadingClass);
if (!options.matchCase)
currentValue = currentValue.toLowerCase();
request(currentValue, receiveData, hideResultsNow);
} else {
stopLoading();
select.hide();
}
};
function trimWords(value) {
if (!value)
return [""];
if (!options.multiple)
return [$.trim(value)];
return $.map(value.split(options.multipleSeparator), function(word) {
return $.trim(value).length ? $.trim(word) : null;
});
}
function lastWord(value) {
if ( !options.multiple )
return value;
var words = trimWords(value);
if (words.length == 1)
return words[0];
var cursorAt = $(input).selection().start;
if (cursorAt == value.length) {
words = trimWords(value)
} else {
words = trimWords(value.replace(value.substring(cursorAt), ""));
}
return words[words.length - 1];
}
// fills in the input box w/the first match (assumed to be the best match)
// q: the term entered
// sValue: the first matching result
function autoFill(q, sValue){
// autofill in the complete box w/the first match as long as the user hasn't entered in more data
// if the last user key pressed was backspace, don't autofill
if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
// fill in the value (keep the case the user has typed)
$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
// select the portion of the value not typed by the user (so the next character will erase)
$(input).selection(previousValue.length, previousValue.length + sValue.length);
}
};
function hideResults() {
clearTimeout(timeout);
timeout = setTimeout(hideResultsNow, 200);
};
function hideResultsNow() {
var wasVisible = select.visible();
select.hide();
clearTimeout(timeout);
stopLoading();
if (options.mustMatch) {
// call search and run callback
$input.search(
function (result){
// if no value found, clear the input box
if( !result ) {
if (options.multiple) {
var words = trimWords($input.val()).slice(0, -1);
$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
}
else {
$input.val( "" );
$input.trigger("result", null);
}
}
}
);
}
};
function receiveData(q, data) {
if ( data && data.length && hasFocus ) {
stopLoading();
select.display(data, q);
autoFill(q, data[0].value);
select.show();
} else {
hideResultsNow();
}
};
function request(term, success, failure) {
if (!options.matchCase)
term = term.toLowerCase();
var data = cache.load(term);
// recieve the cached data
if (data && data.length) {
success(term, data);
// if an AJAX url has been supplied, try loading the data now
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
var extraParams = {
timestamp: +new Date()
};
$.each(options.extraParams, function(key, param) {
extraParams[key] = typeof param == "function" ? param() : param;
});
$.ajax({
// try to leverage ajaxQueue plugin to abort previous requests
mode: "abort",
// limit abortion to this input
port: "autocomplete" + input.name,
dataType: options.dataType,
url: options.url,
data: $.extend({
q: lastWord(term),
limit: options.max
}, extraParams),
success: function(data) {
var parsed = options.parse && options.parse(data) || parse(data);
cache.add(term, parsed);
success(term, parsed);
}
});
} else {
// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
select.emptyList();
failure(term);
}
};
function parse(data) {
var parsed = [];
var rows = data.split("\n");
for (var i=0; i < rows.length; i++) {
var row = $.trim(rows[i]);
if (row) {
row = row.split("|");
parsed[parsed.length] = {
data: row,
value: row[0],
result: options.formatResult && options.formatResult(row, row[0]) || row[0]
};
}
}
return parsed;
};
function stopLoading() {
$input.removeClass(options.loadingClass);
};
};
$.Autocompleter.defaults = {
inputClass: "ac_input",
resultsClass: "ac_results",
loadingClass: "ac_loading",
minChars: 1,
delay: 400,
matchCase: false,
matchSubset: true,
matchContains: false,
cacheLength: 10,
max: 100,
mustMatch: false,
extraParams: {},
selectFirst: true,
formatItem: function(row) { return row[0]; },
formatMatch: null,
autoFill: false,
width: 0,
multiple: false,
multipleSeparator: ", ",
highlight: function(value, term) {
return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1");
},
scroll: true,
scrollHeight: 180
};
$.Autocompleter.Cache = function(options) {
var data = {};
var length = 0;
function matchSubset(s, sub) {
if (!options.matchCase)
s = s.toLowerCase();
var i = s.indexOf(sub);
if (options.matchContains == "word"){
i = s.toLowerCase().search("\\b" + sub.toLowerCase());
}
if (i == -1) return false;
return i == 0 || options.matchContains;
};
function add(q, value) {
if (length > options.cacheLength){
flush();
}
if (!data[q]){
length++;
}
data[q] = value;
}
function populate(){
if( !options.data ) return false;
// track the matches
var stMatchSets = {},
nullData = 0;
// no url was specified, we need to adjust the cache length to make sure it fits the local data store
if( !options.url ) options.cacheLength = 1;
// track all options for minChars = 0
stMatchSets[""] = [];
// loop through the array and create a lookup structure
for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
var rawValue = options.data[i];
// if rawValue is a string, make an array otherwise just reference the array
rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
var value = options.formatMatch(rawValue, i+1, options.data.length);
if ( value === false )
continue;
var firstChar = value.charAt(0).toLowerCase();
// if no lookup array for this character exists, look it up now
if( !stMatchSets[firstChar] )
stMatchSets[firstChar] = [];
// if the match is a string
var row = {
value: value,
data: rawValue,
result: options.formatResult && options.formatResult(rawValue) || value
};
// push the current match into the set list
stMatchSets[firstChar].push(row);
// keep track of minChars zero items
if ( nullData++ < options.max ) {
stMatchSets[""].push(row);
}
};
// add the data items to the cache
$.each(stMatchSets, function(i, value) {
// increase the cache size
options.cacheLength++;
// add to the cache
add(i, value);
});
}
// populate any existing data
setTimeout(populate, 25);
function flush(){
data = {};
length = 0;
}
return {
flush: flush,
add: add,
populate: populate,
load: function(q) {
if (!options.cacheLength || !length)
return null;
/*
* if dealing w/local data and matchContains than we must make sure
* to loop through all the data collections looking for matches
*/
if( !options.url && options.matchContains ){
// track all matches
var csub = [];
// loop through all the data grids for matches
for( var k in data ){
// don't search through the stMatchSets[""] (minChars: 0) cache
// this prevents duplicates
if( k.length > 0 ){
var c = data[k];
$.each(c, function(i, x) {
// if we've got a match, add it to the array
if (matchSubset(x.value, q)) {
csub.push(x);
}
});
}
}
return csub;
} else
// if the exact item exists, use it
if (data[q]){
return data[q];
} else
if (options.matchSubset) {
for (var i = q.length - 1; i >= options.minChars; i--) {
var c = data[q.substr(0, i)];
if (c) {
var csub = [];
$.each(c, function(i, x) {
if (matchSubset(x.value, q)) {
csub[csub.length] = x;
}
});
return csub;
}
}
}
return null;
}
};
};
$.Autocompleter.Select = function (options, input, select, config) {
var CLASSES = {
ACTIVE: "ac_over"
};
var listItems,
active = -1,
data,
term = "",
needsInit = true,
element,
list;
// Create results
function init() {
if (!needsInit)
return;
element = $("")
.hide()
.addClass(options.resultsClass)
.css("position", "absolute")
.appendTo(document.body);
list = $("
if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
$(target(event)).addClass(CLASSES.ACTIVE);
}
}).click(function(event) {
$(target(event)).addClass(CLASSES.ACTIVE);
select();
// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
input.focus();
return false;
}).mousedown(function() {
config.mouseDownOnSelect = true;
}).mouseup(function() {
config.mouseDownOnSelect = false;
});
if( options.width > 0 )
element.css("width", options.width);
needsInit = false;
}
function target(event) {
var element = event.target;
while(element && element.tagName != "LI")
element = element.parentNode;
// more fun with IE, sometimes event.target is empty, just ignore it then
if(!element)
return [];
return element;
}
function moveSelect(step) {
listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
movePosition(step);
var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
if(options.scroll) {
var offset = 0;
listItems.slice(0, active).each(function() {
offset += this.offsetHeight;
});
if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
} else if(offset < list.scrollTop()) {
list.scrollTop(offset);
}
}
};
function movePosition(step) {
active += step;
if (active < 0) {
active = listItems.size() - 1;
} else if (active >= listItems.size()) {
active = 0;
}
}
function limitNumberOfItems(available) {
return options.max && options.max < available
? options.max
: available;
}
function fillList() {
list.empty();
var max = limitNumberOfItems(data.length);
for (var i=0; i < max; i++) {
if (!data[i])
continue;
var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
if ( formatted === false )
continue;
var li = $("").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
$.data(li, "ac_data", data[i]);
}
listItems = list.find("li");
if ( options.selectFirst ) {
listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
active = 0;
}
// apply bgiframe if available
if ( $.fn.bgiframe )
list.bgiframe();
}
return {
display: function(d, q) {
init();
data = d;
term = q;
fillList();
},
next: function() {
moveSelect(1);
},
prev: function() {
moveSelect(-1);
},
pageUp: function() {
if (active != 0 && active - 8 < 0) {
moveSelect( -active );
} else {
moveSelect(-8);
}
},
pageDown: function() {
if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
moveSelect( listItems.size() - 1 - active );
} else {
moveSelect(8);
}
},
hide: function() {
element && element.hide();
listItems && listItems.removeClass(CLASSES.ACTIVE);
active = -1;
},
visible : function() {
return element && element.is(":visible");
},
current: function() {
return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
},
show: function() {
var offset = $(input).offset();
element.css({
width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
top: offset.top + input.offsetHeight,
left: offset.left
}).show();
if(options.scroll) {
list.scrollTop(0);
list.css({
maxHeight: options.scrollHeight,
overflow: 'auto'
});
if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
var listHeight = 0;
listItems.each(function() {
listHeight += this.offsetHeight;
});
var scrollbarsVisible = listHeight > options.scrollHeight;
list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
if (!scrollbarsVisible) {
// IE doesn't recalculate width when scrollbar disappears
listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
}
}
}
},
selected: function() {
var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
return selected && selected.length && $.data(selected[0], "ac_data");
},
emptyList: function (){
list && list.empty();
},
unbind: function() {
element && element.remove();
}
};
};
$.fn.selection = function(start, end) {
if (start !== undefined) {
return this.each(function() {
if( this.createTextRange ){
var selRange = this.createTextRange();
if (end === undefined || start == end) {
selRange.move("character", start);
selRange.select();
} else {
selRange.collapse(true);
selRange.moveStart("character", start);
selRange.moveEnd("character", end);
selRange.select();
}
} else if( this.setSelectionRange ){
this.setSelectionRange(start, end);
} else if( this.selectionStart ){
this.selectionStart = start;
this.selectionEnd = end;
}
});
}
var field = this[0];
if ( field.createTextRange ) {
var range = document.selection.createRange(),
orig = field.value,
teststring = "<->",
textLength = range.text.length;
range.text = teststring;
var caretAt = field.value.indexOf(teststring);
field.value = orig;
this.selection(caretAt, caretAt + textLength);
return {
start: caretAt,
end: caretAt + textLength
}
} else if( field.selectionStart !== undefined ){
return {
start: field.selectionStart,
end: field.selectionEnd
}
}
};
})(jQuery);
jquery.js
(function(){
/*
* jQuery 1.2.6 - New Wave Javascript
*
* Copyright (c) 2008 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2008-05-27 21:17:26 +0200 (Di, 27 Mai 2008) $
* $Rev: 5700 $
*/
// Map over jQuery in case of overwrite
var _jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$;
var jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
};
// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
// Is it a simple selector
isSimple = /^.[^:#\[\.]*$/,
// Will speed up references to undefined, and allows munging its name.
undefined;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
// Make sure that a selection was provided
selector = selector || document;
// Handle $(DOMElement)
if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
return this;
}
// Handle HTML strings
if ( typeof selector == "string" ) {
// Are we dealing with HTML string or an ID?
var match = quickExpr.exec( selector );
// Verify a match, and that no context was specified for #id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] )
selector = jQuery.clean( [ match[1] ], context );
// HANDLE: $("#id")
else {
var elem = document.getElementById( match[3] );
// Make sure an element was located
if ( elem ){
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id != match[3] )
return jQuery().find( selector );
// Otherwise, we inject the element directly into the jQuery object
return jQuery( elem );
}
selector = [];
}
// HANDLE: $(expr, [context])
// (which is just equivalent to: $(content).find(expr)
} else
return jQuery( context ).find( selector );
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) )
return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
return this.setArray(jQuery.makeArray(selector));
},
// The current version of jQuery being used
jquery: "1.2.6",
// The number of elements contained in the matched element set
size: function() {
return this.length;
},
// The number of elements contained in the matched element set
length: 0,
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
return num == undefined ?
// Return a 'clean' array
jQuery.makeArray( this ) :
// Return just the object
this[ num ];
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery( elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
// Return the newly-formed element set
return ret;
},
// Force the current matched set of elements to become
// the specified array of elements (destroying the stack in the process)
// You should use pushStack() in order to do this, but maintain the stack
setArray: function( elems ) {
// Resetting the length to 0, then using the native Array push
// is a super-fast way to populate an object with array-like properties
this.length = 0;
Array.prototype.push.apply( this, elems );
return this;
},
// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
return jQuery.each( this, callback, args );
},
// Determine the position of an element within
// the matched set of elements
index: function( elem ) {
var ret = -1;
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem && elem.jquery ? elem[0] : elem
, this );
},
attr: function( name, value, type ) {
var options = name;
// Look for the case where we're accessing a style value
if ( name.constructor == String )
if ( value === undefined )
return this[0] && jQuery[ type || "attr" ]( this[0], name );
else {
options = {};
options[ name ] = value;
}
// Check to see if we're setting style values
return this.each(function(i){
// Set all the styles
for ( name in options )
jQuery.attr(
type ?
this.style :
this,
name, jQuery.prop( this, options[ name ], type, i, name )
);
});
},
css: function( key, value ) {
// ignore negative width and height values
if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
value = undefined;
return this.attr( key, value, "curCSS" );
},
text: function( text ) {
if ( typeof text != "object" && text != null )
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
var ret = "";
jQuery.each( text || this, function(){
jQuery.each( this.childNodes, function(){
if ( this.nodeType != 8 )
ret += this.nodeType != 1 ?
this.nodeValue :
jQuery.fn.text( [ this ] );
});
});
return ret;
},
wrapAll: function( html ) {
if ( this[0] )
// The elements to wrap the target around
jQuery( html, this[0].ownerDocument )
.clone()
.insertBefore( this[0] )
.map(function(){
var elem = this;
while ( elem.firstChild )
elem = elem.firstChild;
return elem;
})
.append(this);
return this;
},
wrapInner: function( html ) {
return this.each(function(){
jQuery( this ).contents().wrapAll( html );
});
},
wrap: function( html ) {
return this.each(function(){
jQuery( this ).wrapAll( html );
});
},
append: function() {
return this.domManip(arguments, true, false, function(elem){
if (this.nodeType == 1)
this.appendChild( elem );
});
},
prepend: function() {
return this.domManip(arguments, true, true, function(elem){
if (this.nodeType == 1)
this.insertBefore( elem, this.firstChild );
});
},
before: function() {
return this.domManip(arguments, false, false, function(elem){
this.parentNode.insertBefore( elem, this );
});
},
after: function() {
return this.domManip(arguments, false, true, function(elem){
this.parentNode.insertBefore( elem, this.nextSibling );
});
},
end: function() {
return this.prevObject || jQuery( [] );
},
find: function( selector ) {
var elems = jQuery.map(this, function(elem){
return jQuery.find( selector, elem );
});
return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
jQuery.unique( elems ) :
elems );
},
clone: function( events ) {
// Do the clone
var ret = this.map(function(){
if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
// IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
// Unfortunately, this means some modifications to
// attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var clone = this.cloneNode(true),
container = document.createElement("div");
container.appendChild(clone);
return jQuery.clean([container.innerHTML])[0];
} else
return this.cloneNode(true);
});
// Need to set the expando to null on the cloned set if it exists
// removeData doesn't work here, IE removes it from the original as well
// this is primarily for IE but the data expando shouldn't be copied over in any browser
var clone = ret.find("*").andSelf().each(function(){
if ( this[ expando ] != undefined )
this[ expando ] = null;
});
// Copy the events from the original to the clone
if ( events === true )
this.find("*").andSelf().each(function(i){
if (this.nodeType == 3)
return;
var events = jQuery.data( this, "events" );
for ( var type in events )
for ( var handler in events[ type ] )
jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
});
// Return the cloned set
return ret;
},
filter: function( selector ) {
return this.pushStack(
jQuery.isFunction( selector ) &&
jQuery.grep(this, function(elem, i){
return selector.call( elem, i );
}) ||
jQuery.multiFilter( selector, this ) );
},
not: function( selector ) {
if ( selector.constructor == String )
// test special case where just one selector is passed in
if ( isSimple.test( selector ) )
return this.pushStack( jQuery.multiFilter( selector, this, true ) );
else
selector = jQuery.multiFilter( selector, this );
var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
return this.filter(function() {
return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
});
},
add: function( selector ) {
return this.pushStack( jQuery.unique( jQuery.merge(
this.get(),
typeof selector == 'string' ?
jQuery( selector ) :
jQuery.makeArray( selector )
)));
},
is: function( selector ) {
return !!selector && jQuery.multiFilter( selector, this ).length > 0;
},
hasClass: function( selector ) {
return this.is( "." + selector );
},
val: function( value ) {
if ( value == undefined ) {
if ( this.length ) {
var elem = this[0];
// We need to handle select boxes special
if ( jQuery.nodeName( elem, "select" ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type == "select-one";
// Nothing was selected
if ( index < 0 )
return null;
// Loop through all the selected options
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
var option = options[ i ];
if ( option.selected ) {
// Get the specifc value for the option
value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
// We don't need an array for one selects
if ( one )
return value;
// Multi-Selects return an array
values.push( value );
}
}
return values;
// Everything else, we just grab the value
} else
return (this[0].value || "").replace(/\r/g, "");
}
return undefined;
}
if( value.constructor == Number )
value += '';
return this.each(function(){
if ( this.nodeType != 1 )
return;
if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
jQuery.inArray(this.name, value) >= 0);
else if ( jQuery.nodeName( this, "select" ) ) {
var values = jQuery.makeArray(value);
jQuery( "option", this ).each(function(){
this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
jQuery.inArray( this.text, values ) >= 0);
});
if ( !values.length )
this.selectedIndex = -1;
} else
this.value = value;
});
},
html: function( value ) {
return value == undefined ?
(this[0] ?
this[0].innerHTML :
null) :
this.empty().append( value );
},
replaceWith: function( value ) {
return this.after( value ).remove();
},
eq: function( i ) {
return this.slice( i, i + 1 );
},
slice: function() {
return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
},
map: function( callback ) {
return this.pushStack( jQuery.map(this, function(elem, i){
return callback.call( elem, i, elem );
}));
},
andSelf: function() {
return this.add( this.prevObject );
},
data: function( key, value ){
var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if ( value === undefined ) {
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
if ( data === undefined && this.length )
data = jQuery.data( this[0], key );
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
} else
return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
jQuery.data( this, key, value );
});
},
removeData: function( key ){
return this.each(function(){
jQuery.removeData( this, key );
});
},
domManip: function( args, table, reverse, callback ) {
var clone = this.length > 1, elems;
return this.each(function(){
if ( !elems ) {
elems = jQuery.clean( args, this.ownerDocument );
if ( reverse )
elems.reverse();
}
var obj = this;
if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
var scripts = jQuery( [] );
jQuery.each(elems, function(){
var elem = clone ?
jQuery( this ).clone( true )[0] :
this;
// execute all scripts after the elements have been injected
if ( jQuery.nodeName( elem, "script" ) )
scripts = scripts.add( elem );
else {
// Remove any inner scripts for later evaluation
if ( elem.nodeType == 1 )
scripts = scripts.add( jQuery( "script", elem ).remove() );
// Inject the elements into the document
callback.call( obj, elem );
}
});
scripts.each( evalScript );
});
}
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
function evalScript( i, elem ) {
if ( elem.src )
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
else
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
if ( elem.parentNode )
elem.parentNode.removeChild( elem );
}
function now(){
return +new Date;
}
jQuery.extend = jQuery.fn.extend = function() {
// copy reference to target object
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
// Handle a deep copy situation
if ( target.constructor == Boolean ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target != "object" && typeof target != "function" )
target = {};
// extend jQuery itself if only one argument is passed
if ( length == i ) {
target = this;
--i;
}
for ( ; i < length; i++ )
// Only deal with non-null/undefined values
if ( (options = arguments[ i ]) != null )
// Extend the base object
for ( var name in options ) {
var src = target[ name ], copy = options[ name ];
// Prevent never-ending loop
if ( target === copy )
continue;
// Recurse if we're merging object values
if ( deep && copy && typeof copy == "object" && !copy.nodeType )
target[ name ] = jQuery.extend( deep,
// Never move original objects, clone them
src || ( copy.length != null ? [ ] : { } )
, copy );
// Don't bring in undefined values
else if ( copy !== undefined )
target[ name ] = copy;
}
// Return the modified object
return target;
};
var expando = "jQuery" + now(), uuid = 0, windowData = {},
// exclude the following css properties to add px
exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
// cache defaultView
defaultView = document.defaultView || {};
jQuery.extend({
noConflict: function( deep ) {
window.$ = _$;
if ( deep )
window.jQuery = _jQuery;
return jQuery;
},
// See test/unit/core.js for details concerning this function.
isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
},
// check if an element is in a (or is an) XML document
isXMLDoc: function( elem ) {
return elem.documentElement && !elem.body ||
elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
},
// Evalulates a script in a global context
globalEval: function( data ) {
data = jQuery.trim( data );
if ( data ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if ( jQuery.browser.msie )
script.text = data;
else
script.appendChild( document.createTextNode( data ) );
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},
cache: {},
data: function( elem, name, data ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
// Compute a unique ID for the element
if ( !id )
id = elem[ expando ] = ++uuid;
// Only generate the data cache if we're
// trying to access or manipulate it
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
// Prevent overriding the named cache with undefined values
if ( data !== undefined )
jQuery.cache[ id ][ name ] = data;
// Return the named cache data, or the ID for the element
return name ?
jQuery.cache[ id ][ name ] :
id;
},
removeData: function( elem, name ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
// If we want to remove a specific section of the element's data
if ( name ) {
if ( jQuery.cache[ id ] ) {
// Remove the section of cache data
delete jQuery.cache[ id ][ name ];
// If we've removed all the data, remove the element's cache
name = "";
for ( name in jQuery.cache[ id ] )
break;
if ( !name )
jQuery.removeData( elem );
}
// Otherwise, we want to remove all of the element's data
} else {
// Clean up the element expando
try {
delete elem[ expando ];
} catch(e){
// IE has trouble directly removing the expando
// but it's ok with using removeAttribute
if ( elem.removeAttribute )
elem.removeAttribute( expando );
}
// Completely remove the data cache
delete jQuery.cache[ id ];
}
},
// args is for internal usage only
each: function( object, callback, args ) {
var name, i = 0, length = object.length;
if ( args ) {
if ( length == undefined ) {
for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break;
} else
for ( ; i < length; )
if ( callback.apply( object[ i++ ], args ) === false )
break;
// A special, fast, case for the most common use of each
} else {
if ( length == undefined ) {
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
} else
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
}
return object;
},
prop: function( elem, value, type, i, name ) {
// Handle executable functions
if ( jQuery.isFunction( value ) )
value = value.call( elem, i );
// Handle passing in a number to a CSS property
return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
value + "px" :
value;
},
className: {
// internal only, use addClass("class")
add: function( elem, classNames ) {
jQuery.each((classNames || "").split(/\s+/), function(i, className){
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
elem.className += (elem.className ? " " : "") + className;
});
},
// internal only, use removeClass("class")
remove: function( elem, classNames ) {
if (elem.nodeType == 1)
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className){
return !jQuery.className.has( classNames, className );
}).join(" ") :
"";
},
// internal only, use hasClass("class")
has: function( elem, className ) {
return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
}
},
// A method for quickly swapping in/out CSS properties to get correct calculations
swap: function( elem, options, callback ) {
var old = {};
// Remember the old values, and insert the new ones
for ( var name in options ) {
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}
callback.call( elem );
// Revert the old values
for ( var name in options )
elem.style[ name ] = old[ name ];
},
css: function( elem, name, force ) {
if ( name == "width" || name == "height" ) {
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
function getWH() {
val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
var padding = 0, border = 0;
jQuery.each( which, function() {
padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
});
val -= Math.round(padding + border);
}
if ( jQuery(elem).is(":visible") )
getWH();
else
jQuery.swap( elem, props, getWH );
return Math.max(0, val);
}
return jQuery.curCSS( elem, name, force );
},
curCSS: function( elem, name, force ) {
var ret, style = elem.style;
// A helper method for determining if an element's values are broken
function color( elem ) {
if ( !jQuery.browser.safari )
return false;
// defaultView is cached
var ret = defaultView.getComputedStyle( elem, null );
return !ret || ret.getPropertyValue("color") == "";
}
// We need to handle opacity special in IE
if ( name == "opacity" && jQuery.browser.msie ) {
ret = jQuery.attr( style, "opacity" );
return ret == "" ?
"1" :
ret;
}
// Opera sometimes will give the wrong display answer, this fixes it, see #2037
if ( jQuery.browser.opera && name == "display" ) {
var save = style.outline;
style.outline = "0 solid black";
style.outline = save;
}
// Make sure we're using the right name for getting the float value
if ( name.match( /float/i ) )
name = styleFloat;
if ( !force && style && style[ name ] )
ret = style[ name ];
else if ( defaultView.getComputedStyle ) {
// Only "float" is needed here
if ( name.match( /float/i ) )
name = "float";
name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
var computedStyle = defaultView.getComputedStyle( elem, null );
if ( computedStyle && !color( elem ) )
ret = computedStyle.getPropertyValue( name );
// If the element isn't reporting its values properly in Safari
// then some display: none elements are involved
else {
var swap = [], stack = [], a = elem, i = 0;
// Locate all of the parent display: none elements
for ( ; a && color(a); a = a.parentNode )
stack.unshift(a);
// Go through and make them visible, but in reverse
// (It would be better if we knew the exact display type that they had)
for ( ; i < stack.length; i++ )
if ( color( stack[ i ] ) ) {
swap[ i ] = stack[ i ].style.display;
stack[ i ].style.display = "block";
}
// Since we flip the display style, we have to handle that
// one special, otherwise get the value
ret = name == "display" && swap[ stack.length - 1 ] != null ?
"none" :
( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
// Finally, revert the display styles back
for ( i = 0; i < swap.length; i++ )
if ( swap[ i ] != null )
stack[ i ].style.display = swap[ i ];
}
// We should always get a number back from opacity
if ( name == "opacity" && ret == "" )
ret = "1";
} else if ( elem.currentStyle ) {
var camelCase = name.replace(/\-(\w)/g, function(all, letter){
return letter.toUpperCase();
});
ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
// Remember the original values
var left = style.left, rsLeft = elem.runtimeStyle.left;
// Put in the new values to get a computed value out
elem.runtimeStyle.left = elem.currentStyle.left;
style.left = ret || 0;
ret = style.pixelLeft + "px";
// Revert the changed values
style.left = left;
elem.runtimeStyle.left = rsLeft;
}
}
return ret;
},
clean: function( elems, context ) {
var ret = [];
context = context || document;
// !context.createElement fails in IE with an error but returns typeof 'object'
if (typeof context.createElement == 'undefined')
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
jQuery.each(elems, function(i, elem){
if ( !elem )
return;
if ( elem.constructor == Number )
elem += '';
// Convert html string into DOM nodes
if ( typeof elem == "string" ) {
// Fix "XHTML"-style tags in all browsers
elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
all :
front + ">" + tag + ">";
});
// Trim whitespace, otherwise indexOf won't work as expected
var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
var wrap =
// option or optgroup
!tags.indexOf("
!tags.indexOf("
tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[ 1, "
!tags.indexOf("
// matched above
(!tags.indexOf("
!tags.indexOf("
// IE can't serialize and
href="css/jquery.autocomplete.css" />
<%
Connection conn = DbManager.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from citys";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
%>
<%
StringBuffer sb = new StringBuffer();
while (rs.next()) {
//int id = rs.getInt("id"); // 整形类型
String city = rs.getString("city"); // 字符串类型
if (sb.length() == 0) {
sb.append(city);
} else {
sb.append("," + city);
}
}
%>
<%
rs.close();
pstmt.close();
conn.close();
%>
<%
String ss = sb.toString();
%>
<%=ss%>