| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491 |
-
- (function($){
-
- function selectPrev(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var item = fwpanel.find('div.fwcombox-item-selected');
- var opts = $.data(target, 'fwcombox').options;
- if (item.length){
- //找到匹配的项
- var prev = item.prevAll(':visible');
- if (prev.length){
- //如果有上方还有选项
- item = prev.eq(0);
- }else{
- //如果已经是第一项,那么光标定位到最后一项
- item = panelbody.find('div.fwcombox-item:visible:last');
- }
- }
- //没有任何项就直接退出
- if(item.length==0)return;
- if (item.position().top <= 0){
- var h = panelbody.scrollTop() + item.position().top;
- panelbody.scrollTop(h);
- } else if (item.position().top + item.outerHeight() > panelbody.height()){
- var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
- panelbody.scrollTop(h);
- }
- var value = item.attr('value');
- if(!opts.multiple){
- setValue(target, value);
- }
- }
-
- /**
- * select next item
- */
- function selectNext(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var item = fwpanel.find('div.fwcombox-item-selected');
- var opts = $.data(target, 'fwcombox').options;
- if (item.length){
- //找到匹配的项
- var next = item.nextAll(':visible');
- if (next.length){
- //如果有下方还有选项
- item = next.eq(0);
- }else{
- //如果已经是第一项,那么光标定位到最后一项
- item = panelbody.find('div.fwcombox-item:visible:first');
- }
- }
- //没有任何项就直接退出
- if(item.length==0)return;
- if (item.position().top <= 0){
- var h = fwpanel.scrollTop() + item.position().top;
- panelbody.scrollTop(h);
- } else if (item.position().top + item.outerHeight() > panelbody.height()){
- var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
- panelbody.scrollTop(h);
- }
- var value = item.attr('value');
- if(!opts.multiple){
- setValue(target, value);
- }
- }
-
- function selectCurr(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var item = fwpanel.find('div.fwcombox-item-selected');
- var opts = $.data(target, 'fwcombox').options;
- var value = item.attr('value');
- if(!opts.multiple){
- setValue(target, value, true);
- hidePanel(target);
- }
- }
-
- /**
- * select the specified value
- */
- function select(target, value){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- if(opts.multiple){
- if(value==''){
- return;
- }
- var values = getValues(target);
- for(var i=0; i<values.length; i++){
- if (values[i] == value) return;
- }
- values.push(value);
- setValues(target,values,true);
- }else{
- setValue(target, value,true);
- hidePanel(target);
- }
- /*
- var combo = $.data(target, 'fwcombox').fwcombox;
- var input = combo.find('.fwcombox-text');
- for(var i=0; i<data.length; i++){
- if (data[i][opts.valueField] == value){
- //opts.onSelect.call(target, data[i]);
- return;
- }
- }*/
- }
-
- /**
- * unselect the specified value
- */
- function unselect(target, value){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- if(opts.multiple){
- var values =getValues(target);
- for(var i=0; i<values.length; i++){
- if (values[i] == value){
- values.splice(i, 1);
- setValues(target, values,true);
- break;
- }
- }
- }else{
- setValue(target, '',true);
- }
- for(var i=0; i<data.length; i++){
- if (data[i][opts.valueField] == value){
- opts.onUnselect.call(target, data[i]);
- return;
- }
- }
- }
- /**
- * 获取浏览器信息
- */
- function getBrowserInfo(){
- var NV = {};
- var UA = navigator.userAgent.toLowerCase();
- try
- {
- NV.name=UA.match(/msie ([\d.]+)/)[1]?'ie':
- (UA.indexOf("firefox")>0)?'firefox':
- (UA.indexOf("chrome")>0)?'chrome':
- window.opera?'opera':
- window.openDatabase?'safari':
- 'unkonw';
- }catch(e){};
- try
- {
- NV.version=(NV.name=='ie')?UA.match(/msie ([\d.]+)/)[1]:
- (NV.name=='firefox')?UA.match(/firefox\/([\d.]+)/)[1]:
- (NV.name=='chrome')?UA.match(/chrome\/([\d.]+)/)[1]:
- (NV.name=='opera')?UA.match(/opera.([\d.]+)/)[1]:
- (NV.name=='safari')?UA.match(/version\/([\d.]+)/)[1]:
- '0';
- }catch(e){};
- return NV;
- }
-
- /**
- * set values
- */
- function setValue(target,value,confirm,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var s='';
- var b=false;
- var selectedRecord = {};
- value = value || "";
- if(data!=null){
- for(var j=0; j<data.length; j++){
- if (data[j][opts.valueField] == value){
- s = data[j][opts.textField];
- selectedRecord = data[j];
- b = true;
- break;
- }
- }
- } else if(!opts.dataLoad && !CFW.oValid.fnIsNull(value)) {
- loadData(target, transformData(target));
- opts.dataLoad = true;
- }
-
- //若是data 还未初始化则从IE默认的下拉框内取
- if(!b){
- $('>option', target).each(function(){
- var v = $(this).attr('value');
- if(v == value){
- s = $(this).text();
- selectedRecord[opts.textField] = s;
- selectedRecord[opts.valueField] = value;
- return false;
- }
- });
- }
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- panelbody.find('div.fwcombox-item[value="' + value + '"]').addClass('fwcombox-item-selected');
- //按displayCol的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
- var dictType =$(target).attr('dictType');
- var displayCol =$(target).attr('displayCol');
- if(confirm){
- if(dictType == "default"){
- // displayCol 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
- if ('AAA102' == displayCol) {
- setText(target, value);
- } else if ('AAA103' == displayCol) {
- setText(target, s);
- } else {
- var text=s.substr(s.indexOf("-")+1,s.length);
- setText(target, text);
- }
- }else if(dictType == "s"){
- setText(target, s);
- }
-
- setComValue(target,value,isInit);
- if(!isInit)
- opts.onSelect.call(target, selectedRecord);
- }
- }
-
- /**
- * set values
- */
- function setValues(target,values,confirm,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var selectedRecords = [];
- var vv = [], ss = [];
- values = values || [];
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- for(var i=0; i<values.length; i++){
- var value=values[i];
- var s='';
- var b=false;
- var selectedRecord = {};
- if(data!=null){
- for(var j=0; j<data.length; j++){
- if (data[j][opts.valueField] == value){
- s = data[j][opts.textField];
- selectedRecord = data[j];
- b = true;
- break;
- }
- }
- } else if(!opts.dataLoad && !CFW.oValid.fnIsNull(value)) {
- loadData(target, transformData(target),values);
- opts.dataLoad = true;
- }
- //若是data 还未初始化则从IE默认的下拉框内取
- if(!b){
- $('>option', target).each(function(){
- var v = $(this).attr('value');
- if(v == value){
- s = $(this).text();
- selectedRecord[opts.textField] = s;
- selectedRecord[opts.valueField] = value;
- return false;
- }
- });
- }
- if(value==''&&values.length>1){
-
- }else{
- vv.push(value);
- ss.push(s);
- selectedRecords.push(selectedRecord);
- panelbody.find('div.fwcombox-item[value="' + value + '"]').addClass('fwcombox-item-selected');
- }
- }
-
- //按displayCol的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
- if(confirm){
- if ('AAA102' == opts.displayCol) {
- setText(target, vv.join(opts.separator));
- } else if ('AAA103' == opts.displayCol) {
- setText(target, vv.join(opts.separator));
- } else {
- var textFields=[];
- for(var i=0; i<ss.length; i++){
- var s=ss[i];
- var v=vv[i];
- textFields.push(s.substr(v.length + 1));
- }
- setText(target, textFields.join(opts.separator));
- }
- setComValues(target,values,isInit);
- if(!isInit)
- opts.onSelect.call(target, selectedRecords);
- }
- }
-
-
- function setComValue(target, value,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var oldValue = getValue(target);
-
- var combo = $.data(target, 'fwcombox').fwcombox;
- target.value = value+"";
-
- if(!isInit && oldValue!=target.value){
- $(target).trigger('change');
- }
-
- opts.onChange.call(target, value, oldValue);
-
-
- }
-
- function setComValues(target, values,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var oldValues = getValues(target);
- var combo = $.data(target, 'fwcombox').fwcombox;
- combo.find('input.fwcombo-value').remove();
- //var name = $(target).attr('comboName');
- for(var i=0; i<values.length; i++){
- if(values[i]==''&&values.length>1){
-
- }else{
- var input = $('<input type="hidden" class="fwcombo-value">').appendTo(combo);
- //if (name) input.attr('name', name);
- input.val(values[i]);
- }
- }
-
- var tmp = [];
- for(var i=0; i<oldValues.length; i++){
- tmp[i] = oldValues[i];
- }
- var aa = [];
- for(var i=0; i<values.length; i++){
- for(var j=0; j<tmp.length; j++){
- if (values[i] == tmp[j]){
- aa.push(values[i]);
- tmp.splice(j, 1);
- break;
- }
- }
- }
-
- if (!isInit &&(aa.length != values.length || values.length != oldValues.length)){
- if (opts.multiple){
- $(target).trigger('change');
- opts.onChange.call(target, values, oldValues);
- } else {
- opts.onChange.call(target, values[0], oldValues[0]);
- }
- }
-
-
- }
- function getValues(target){
- var values = [];
- var combo = $.data(target, 'fwcombox').fwcombox;
- combo.find('input.fwcombo-value').each(function(){
- values.push($(this).val());
- });
- return values;
- }
-
-
- function transformData(target){
- var opts = $.data(target, 'fwcombox').options;
- var data = [];
- var dname = $(target).attr('dname');
- var whereCls = $(target).attr('whereCls');
- var dictType =$(target).attr('dictType');
- var displayCol =$(target).attr('displayCol');
-
- var dictArray = null;
- if (!CFW.oValid.fnIsNull(dname) && (dictType == "default" || dictType == "s")){
- try {
- if (FW.getDictMode() == FW.DICTMODES.LOCAL ) {
- var localDictObj = FWGetDictApplet();
- if(_ENCRYPT_WHERE){
- if(whereCls!=null&&whereCls!='null'&&whereCls!=''&&whereCls!='undefined'){
- whereCls=stringToHex(encrypt(WHEREKEY,whereCls));
- }
- }
- var dictStr = localDictObj.getDict(dname,whereCls,opts.dsId);
- dictArray = JSON.parse(dictStr);
- }else if(FW.getDictMode() == FW.DICTMODES.LOCALSTORAGE ){
- dictArray = FW.getDictByLocalStorage(dname,whereCls);
- }else{
- dictArray = FW.getDict(dname,whereCls);
- }
- } catch(e) {
-
- }
- if (!CFW.oValid.fnIsNull(dictArray)) {
- for(var i=0;i<dictArray.length;i++) {
- var item = {};
- item[opts.valueField] = dictArray[i][0];
- if(dictType == "default"){
- // displayCol 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
- if ('AAA102' == displayCol) {
- item[opts.textField] = dictArray[i][0];
- } else if ('AAA103' == displayCol) {
- item[opts.textField] = dictArray[i][2];
- } else {
- item[opts.textField] = dictArray[i][0]+"-"+dictArray[i][2];
- }
- }else if(dictType == "s"){
- item[opts.textField] = dictArray[i][2];
- }
- data.push(item);
- }
- var item = {};
- item[opts.valueField] = '';
- item[opts.textField]= "";
- item['selected'] = 'selected';
- data.push(item);
- }
- } else {
- $('>option', target).each(function(){
- var item = {};
- item[opts.valueField] = $(this).attr('value');
- //为联动下拉框
- //生成下拉框是现实的文本格式为 荔湾区|401 401表示父的值
- if(opts.ldcombox&&comtype=="child"){
- comtext = $(this).html();
- var sp = comtext.split('|');
- item[opts.textField] = sp[0];
- item['parentvalue'] = sp[1];
- }else{
- item[opts.textField] = $(this).text();
- }
- item['selected'] = $(this).attr('selected');
- item['disabled'] = this.disabled;/*标志是否被过滤的对象*/
- data.push(item);
- });
- }
-
- return data;
- }
-
- /**
- * load data, the old list items will be removed.
- */
- function removeItem(target,value){
- var opts = $.data(target, 'fwcombox').options;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
-
- //若还没有初始化列表,先初始化
- if(!opts.dataLoad){
- if(!opts.remotedb){
- loadData(target, transformData(target));
- }
- if (opts.data){
- loadData(target, opts.data);
- }
- opts.dataLoad = true;
- }
- var data = $.data(target, 'fwcombox').data;
-
- for(var i=0; i<data.length; i++){
- if(data[i][opts.valueField] == value){
- data.splice(i,1);
- var item = panelbody.find('div.fwcombox-item[value="' + value + '"]');
- item.remove();
- break;
- }
- }
-
- $.data(target, 'fwcombox').data = data;
-
- }
-
- function initOptions(target,data) {
- //target.options.length=0;
- for(var i=0; i<data.length; i++){
- no = new Option();
- no.value = data[i][opts.valueField];
- no.text = data[i][opts.textField];
- target.options[i] = no;
- //target.options[target.options.length] = no;
- }
- }
-
- /**
- * load data, the old list items will be removed.
- */
- function loadData(target, data,values){
- var opts = $.data(target, 'fwcombox').options;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var selected = [];
- $.data(target, 'fwcombox').data = data;
- panelbody.empty(); // clear old data
- var isRefresh = opts.remotedb || FW.getDictMode() == FW.DICTMODES.LOCAL;
- //实现远程数据库的录入查询
- //清空原来的值
- if(isRefresh){target.options.length=0;}
- var cnt=target.options.length;
- var itemHtml='';
- for(var i=0; i<data.length; i++){
- //var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
- //item.attr({'value': data[i][opts.valueField],'disabled':data[i].disabled});
- //if(data[i].disabled){
- //item.hide();
- //}
- //item.html(data[i][opts.textField]);
- if(data[i][opts.valueField]==''){
- itemHtml+='<div class="fwcombox-item" value="'+data[i][opts.valueField]+'" >'+' '+'</div>';
- }else{
- itemHtml+='<div class="fwcombox-item" value="'+data[i][opts.valueField]+'" >'+data[i][opts.textField]+'</div>';
- }
- if (data[i]['selected']){
- if(values==null){//初始化如果有选中值
- selected.push(data[i][opts.valueField]);
- }
- }
- //需要将查询到的值初始化给原先的下拉框
- //if(isRefresh){
- no = new Option();
- no.value = data[i][opts.valueField];
- no.text = data[i][opts.textField];
- //不要用target.options.length当作变量,重复遍历影响性能
- //target.options[target.options.length] = no;
- target.options[cnt] = no;
- cnt++;
- //}
- isRefresh=true;
- }
- panelbody.html(itemHtml);
- if(isRefresh){
- target.value='';
- }
- if(!opts.remotedb){
- if (opts.multiple){
- if(values!=null){//初始化如果有值
- }else{
- setValues(target, selected,false,true);
- }
- } else {
- if (selected.length){
- setValue(target,selected[0],false,true);
- } else {
- setValue(target,'',false,true);
- }
- }
- }
-
- opts.onLoadSuccess.call(target, data);
-
- $('.fwcombox-item', fwpanel).hover(
- function(){$(this).addClass('fwcombox-item-hover');},
- function(){$(this).removeClass('fwcombox-item-hover');}
- ).click(function(){
- var item = $(this);
- if (opts.multiple){
- if (item.hasClass('fwcombox-item-selected')){
- unselect(target, item.attr('value'));
- } else {
- select(target, item.attr('value'));
- }
- } else {
- select(target, item.attr('value'));
- }
-
- });
- }
-
- /**
- * request remote data if the url property is setted.
- */
- function request(target, query){
- var opts = $.data(target, 'fwcombox').options;
-
- if (!opts.url) return;
-
- var param = $.extend({}, {"configid":opts.dname,"query":query});
-
- $.ajax({
- url:opts.url,
- data: param,
- dataType:'json',
- cache:false,
- success:function(data){
- if(data!=null && data[headtoken]!=null){
- token=data[headtoken];//更新全局变量token标志
- }
- if("1"!=data.FHZ){//出错了,弹出错误提醒
- if("CSRF" == data.FHZ){
- showMsg(data.MSG||'',3);
- return;
- }
- }
-
- var da=getData(target,data);
- loadData(target, da);
- },
- error:function(){
- opts.onLoadError.apply(this, arguments);
- },
- beforeSend:function(XMLHttpRequest ){
- var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
- }
- });
- }
-
- function getData(target,data){
- var opts = $.data(target, 'fwcombox').options;
- var rows = data.rows;
- var total = data.total;
- var iC=0;
- var data = [];
-
- if(rows&&rows.length>0){
- iC = total - rows.length;
- }else{
- return data;
- }
-
- for(var i=0; i<rows.length; i++) {
- var item = {};
- item[opts.valueField] = rows[i][0];
- item[opts.textField] = rows[i][1];
- data.push(item);
- }
-
- if(iC>0){
- var item = {};
- item[opts.valueField] = " ";
- item[opts.textField] = "剩余 "+iC+" 记录未显示";
- data.push(item);
- }
-
- return data;
-
- };
-
-
- function filter(target, query){
- var data = $.data(target, 'fwcombox').data;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var opts = $.data(target, 'fwcombox').options;
- var bEnter = false;
- opts.search = false;
- //去掉之前的选中状态
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- showPanel(target);
- if(!opts.remotedb){
- if(opts.multiple){
- var qq = opts.multiple ? query.split(opts.separator) : [query];
- var vv = [];
- var hasSelect = false;//集合中是否有符合要求的记录
- panelbody.find('div.fwcombox-item').each(function(){
- var item = $(this);
- var itemText = item.text();
- var v=item.attr('value')+'';
- for(var i=0;i<qq.length;i++){
- var q=qq[i];
- if(q==''){
- continue;
- }
- if ((!this.disabled)&&itemText.indexOf(q) != -1){
- item.show();
- var itemText1=itemText.substr(v.length + 1);
- if (itemText1 == q){
- vv.push(v);
- hasSelect = true;
- }
- bEnter =true;
- }else {
- item.show();
- bEnter =true;
- }
- }
- }).filter(':visible');
- setValues(target,vv,true);
- }else{
- target.value='';
- var hasSelect = false;//集合中是否有符合要求的记录
- var showItems = panelbody.find('div.fwcombox-item').each(function(){
- var item = $(this);
- var itemText = item.text();
- if ((!this.disabled)&&itemText.indexOf(query) != -1){
- item.show();
- if (itemText == query){
- setValue(target, item.attr('value'));
- hasSelect = true;
- }
- bEnter =true;
- }else if((!this.disabled)&&CFW.oValid._fnIsPinyinMatch(itemText,query)){
- item.show();
- bEnter =true;
- } else {
- item.hide();
- }
- }).filter(':visible');
- //如果没有完全匹配的,那么默认选中第一个
- if(showItems.length > 0 && !hasSelect){
- if(query!=''){//无任何输入选中空值
- //showItems.first().addClass('fwcombox-item-selected');
- setValue(target, showItems.first().attr('value'));
- }else{
- setValue(target, '');
- }
-
- }else if (showItems.length==0){
- setValue(target, '');
- }
- }
-
- }
- if(opts.remotedb){
- request(target,query);
- }
- }
-
- //设置不可编辑属性
- function setDisabled(target, disabled){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
-
- if (disabled){
- opts.disabled = true;
- //$(target).attr('disabled', true);
- $(target).removeAttr('disabled');
- var input = combo.find('.fwcombox-text');
- if(input.length>0){
- CFW.oGt._disablePrimitiveInput(input[0]);
- }
- } else {
- opts.disabled = false;
- $(target).removeAttr('disabled');
- combo.find('.fwcombox-text').removeAttr('disabled')
- .click(function(){
- this.select();
- });
- }
- }
-
-
-
- function setSize(target,targetWidth){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
-
- //combo.width(opts.width);
- var objWidth;
- if(targetWidth==null){
- if($.browser.msie){
- if(document.documentMode==null||document.documentMode=='5'){
- objWidth=$(target).outerWidth();
- }else{
- objWidth=$(target).parent().width()-2;
- }
- }else{
- objWidth=$(target).parent().width()-2;
- }
- }else{
- objWidth=targetWidth;
- }
-
- var arrowWidth = 18;
- var textwidth = objWidth - arrowWidth-2;
- if($.browser.msie && opts.width=='auto'){
- if(document.documentMode!=null && (document.documentMode=='7'||document.documentMode=='8'||document.documentMode=='9')){
- combo.css({width:'100%',margin:'1px'});
- objWidth=combo.width();
- textwidth = objWidth - arrowWidth-2;
- combo.find('input.fwcombox-text').css({width:(textwidth/objWidth)*100+'%'});
- }else{
- combo.width(objWidth);
- combo.find('input.fwcombox-text').width(textwidth);
- }
- }else{
- combo.width(objWidth);
- combo.find('input.fwcombox-text').width(textwidth);
- }
- //var arrowWidth = combo.find('.fwcombox-arrow').outerWidth();
-
-
- //如果手动设置了宽度,那么用手动设置的
- panel.css({
- width:opts.fwpanelWidth=='auto'?objWidth:opts.fwpanelWidth
- }).find('.fwcombox-panel-body').css({
- height:opts.fwpanelHeight=='auto'?'200': opts.fwpanelHeight
- });
- }
-
- /**
- * hide the drop down panel.
- */
- function hidePanel(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- fwpanel.hide();
- }
- /**
- * show the drop down panel.
- */
- function showPanel(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
- var opts = $.data(target, 'fwcombox').options;
- var items = panel.find('div');
- /* for(var i=1, len=items.length;i<len;i++){
- if(!items[i].disabled){
- items[i].style.display="block";
- }
- }
- */
-
- //第一次显示时创建下拉列表的数据
- //这样处理的目的是加快控制第一次初始化时的速度
- if(!opts.dataLoad){
- if(!opts.remotedb){
- loadData(target, transformData(target));
- } else {
- if (opts.data){
- loadData(target, opts.data);
- }
- }
- opts.dataLoad = true;
- }
- //重新计算panel的zindex
- var zindex = 0;
- $(combo).parents().each(function(){
- //判断是否为数字 不为数字跨浏览器会报错
- if(!isNaN($(this).css('z-index'))){
- zindex+=parseInt($(this).css('z-index'));
- }
- //alert($(this).css('z-index'));
-
- });
- $.data(target, 'fwcombox').fwpanel.css('z-index',zindex+1001);
- //每次调整只计算一次,免得重复计算
- panel.removeAttr('hasResize');
-
- panel.show();
- if (panel.is(':visible')){
- //下拉框放到DIV内并且初始化时DIV是不可见的,设置DIV可见时
- //下拉列表无法显示,需要修改宽度和高度
- if(panel.width()<5){
- setSize(target);
- }
- var top = combo.offset().top + combo.outerHeight();
- if (top + panel.outerHeight() > $(window).height() + $(document).scrollTop()){
- top = combo.offset().top - panel.outerHeight();
- }
- if (top < $(document).scrollTop()){
- top = combo.offset().top + combo.outerHeight();
- }
- panel.css({
- left:combo.offset().left,
- top:top
- });
- //设置左上角位置(考虑屏幕边界截屏的问题)
- if(combo.offset().left+panel.width()>$(window).width()){
- panel.css({
- left:$(window).width()-panel.width()-3,/*加3预防window出现水平滚动栏*/
- top:top
- });
- }else{
- panel.css({
- left:combo.offset().left,
- top:top
- });
- }
- //setTimeout(arguments.callee, 200);
- }
- }
-
- function setText(target, text){
- var combo = $.data(target, 'fwcombox').fwcombox;
- combo.find('input.fwcombox-text').val(text);
- }
-
- function getValue(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- return target.value;
- }
-
-
- function destroy(target){
- $.data(target, 'fwcombox').fwpanel.remove();
- $.data(target, 'fwcombox').fwcombox.remove();
- $(target).remove();
- }
-
- function bindEvents(target){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
- var input = combo.find('.fwcombox-text');
- var arrow = combo.find('.fwcombox-arrow');
-
- //$(document).unbind('.fwcombox');
- combo.unbind('.fwcombox');
- panel.unbind('.fwcombox');
- input.unbind('.fwcombox');
- arrow.unbind('.fwcombox');
-
- $(target).addClass('fwresize').bind('fwresize',function(){
- var comopts = $.data(this, 'fwcombox').options;
- comopts.setSize(target);
- });
-
- if (!opts.disabled){
- /*
- $(document).bind('mousedown.fwcombox', function(e){
- hidePanel(target);
- });
- panel.bind('mousedown.fwcombox', function(e){
- return false;
- });
- */
- //zzy add 2010-10-08 begin 失去焦点时关闭下拉项
- input.bind('keydown',function(e){
- if(e.keyCode==13 ||e.keyCode==9){
- //hidePanel(target);
- if(opts.multiple){
- hidePanel(target);
- }else{
- opts.selectCurr.call(target);
- }
- }
- });
- //end
-
- //鼠标点击其他地方就隐藏列表
- $(document).bind({
- 'mousedown':function(e){
- if(e.target != input[0] &&e.target != arrow[0]
- &&e.target != panel[0] && panel.is(':visible')){
- if(opts.multiple){
- hidePanel(target);
- }else{
- opts.selectCurr.call(target);
- }
- }
- },
- 'focus':function(e){
- if(e.target != input[0] &&e.target != arrow[0]
- &&e.target != panel[0]&& panel.is(':visible')&&e.target!=target){
- if(opts.multiple){
- hidePanel(target);
- }else{
- opts.selectCurr.call(target);
- }
- }
- }
- });
-
- //鼠标移动到上面屏蔽掉
- panel.bind('mousedown', function(e){
- var element = e.target || e.srcElement;
-
- //存在滚动条的情况下单击滚动条有效
- if(e.offsetX>130){
- return false;
- }
-
- var iLen = 0;
- try{
- iLen = target.options.length;
- }catch(e){}
- //有可能存在滚动条
- if(iLen>8){
- return false;
- }
-
- if(-1 != (element.className).indexOf("fwcombox-item")){
- return false;//线程堵塞等待ONCLICK执行
- }
-
- return true;//直接返回
-
- });
- panel.bind('mouseenter', function(e){
- var ee = this;
- var e2 = e;
- if (this == e.currentTarget) {
- jQuery(target).data('_hide',true);
- //showErrMsg(jQuery(target).data('_hide'),2);
- }
- });
- panel.bind('mouseout', function(e){
- if (this != e.currentTarget) {
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- }
- });
- jQuery(target).bind('mousedown', function(e){
- return false;
- });
-
- //将hidden控件的onfocus事件专递到外部可见的input来
- $(target).focus(function(){
- input[0].select();
- });
- //回传外部的blur事件
- input.blur(function(e){
- $(target).blur();
- if(!jQuery(target).data('_hide')){
- hidePanel(target);
- }
- });
-
- input.unbind('focus.fwcombox').bind('focus.fwcombox', function(event){
- input[0].select();
- $.data(target, 'fwcombox').fwpanel.hide();
- showPanel(target);
- //如果参数输入值为空
- var queryText = $(this).val();
- if (opts.editable){
- if(!opts.remotedb&&queryText==''){
- opts.filter.call(target, queryText);
- }
- }
-
- })/*.bind('mousedown.fwcombox', function(e){
- e.stopPropagation();
- })*/.bind('keyup.fwcombox', function(e){
- switch(e.keyCode){
- case 37: // left
- case 38: // up
- opts.selectPrev.call(target);
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- break;
- case 39: // right
- case 40: // down
- opts.selectNext.call(target);
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- break;
- case 16: //shift
- break;
- case 9: //tab
- break;
- case 13: // enter zzy 2010-10-08 注销防止按回车键代替TAB进入时,下拉框消失
- //opts.selectCurr.call(target);
- break;
- case 27: // esc
- hidePanel(target);
- break;
- case 46://delete
- clearInput(target);
- break;
- default:
- if (opts.editable){
- var queryText = $(this).val();
- if(!opts.remotedb){
- opts.filter.call(target, queryText);
- }else{
-
- var input = $(this);
- if(!opts.search){ //为了避免频繁的查询过滤
- opts.search = true;
- setTimeout(function(){
- filter(target,queryText);
- },1000*0.3); //延迟两秒处理
- }
-
-
- }
-
- }
- }
- return false;
- });
-
- arrow.bind('click.fwcombox', function(){
- input[0].select(); //hr 20111010
- $.data(target, 'fwcombox').fwpanel.hide();
- //alert("click.fwcombox");
- showPanel(target);
- var queryText = $(this).val();
- if (opts.editable&&!opts.multiple){
- if(!opts.remotedb&&queryText==''){
- opts.filter.call(target, queryText);
- }
- }
- }).bind('mouseenter.fwcombox', function(){
- $(this).addClass('fwcombox-arrow-hover');
- }).bind('mouseleave.fwcombox', function(){
- $(this).removeClass('fwcombox-arrow-hover');
- });
- }
- //如果target声明了onselect函数,那么绑定它
- if(target.onselect && window[target.onselect]){
- opts.onSelect = window[target.onselect];
- }
-
- }
- //单击delete键去掉选中
- function clearInput(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- var input = combo.find('.fwcombox-text');
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var opts = $.data(target, 'fwcombox').options;
- if(opts.multiple){
- setValues(target, [],true);
- }else{
- input.val('');
- target.value='';
- }
-
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- panelbody.find('div.fwcombox-item[value=""]').addClass('fwcombox-item-selected');
- input.focus();
- }
- //创建下拉框
- function create(target,objWidth){
- init(target,objWidth);
-
- var opts = $.data(target, 'fwcombox').options;
- var fwcombox = $.data(target, 'fwcombox').fwcombox;
-
- opts.disabled = $(target).attr('disabled');
- $(target).removeAttr('disabled');
- $('input.fwcombox-text', fwcombox).attr('readonly', !opts.editable);
- setDisabled(target, opts.disabled);
- setSize(target,objWidth);
- bindEvents(target);
-
- }
-
- /**
- * 创建下拉框的输入框已经下拉DIV
- */
- function init(target,objWidth){
- var obj=$(target);
- var iWidth;
- if(objWidth==null){
- if($.browser.msie){
- if(document.documentMode==null||document.documentMode=='5'){
- iWidth=obj.outerWidth();
- }else{
- iWidth=obj.parent().width()-2;
- }
- }else{
- iWidth=obj.parent().width()-2;
- }
- }else{
- iWidth=objWidth;
- }
- //var iHeight = obj.outerHeight();
- var iHeight = 20;
- var iTop = obj.offset().top + iHeight;
- var iLeft = obj.offset().left;
- //$(target).hide();
- var opts = $.data(target, 'fwcombox').options;
- var vldStr = $(target).attr('vldStr');
-
- //取原来下拉框的长度,因为IE自带的下拉框所获取的自动宽度比较正确
- //if(opts.width=='auto'){
- // opts.width= iWidth;//iWidth;
- //}
-
- /*var span = $('<span class="fwcombox"></span>').insertAfter(target);
- var input = $('<input type="text" class="fwcombox-text">').appendTo(span);
- $('<span class="fwcombox-arrow"></span>').appendTo(span);*/
-
- var span = $(target).next(".fwcombox");
- var fwpanel = $('<div class="fwcombox-panel"></div>').appendTo('body');
- //if(vldStr){
- // span.find('input.fwcombox-text').attr('vldStr', vldStr);
- // }
- fwpanel.css({
- 'top':iTop,
- 'left':iLeft,
- 'width':iWidth,
- 'display':'none'
- });
-
- var panelbody = $('<div class="fwcombox-panel-body"></div>').appendTo(fwpanel);
-
- /* panelbody.css({
- 'width':iWidth+10,
- 'height':'200px'
- });*/
- //input.attr('autocomplete', 'off');
- $.data(target, 'fwcombox').fwcombox = span;
- $.data(target, 'fwcombox').fwpanel = fwpanel;
- }
-
-
- var methods = {
- /**设置或者获取控件是否只读。
- * 参数flag可不传,不传表示获取控件的只读属性。
- * @param flag 只读标志,true为设置只读,false为取消只读。
- * @return 获取只读属性时为true和false,true表示控件只读,false表示控件;
- * 设置控件只读属性时返回jquery,当前jquery集合。
- */
- disabled : function(flag){
- if(arguments.length==0){
- //如果没有入参,那么属于要返回当前是否只读的状态
- if(this.length==0){return null;}
- var opts = $.data(this[0], 'fwcombox').options;
- return opts.disabled;
- }else{
- //有入参处理设置是否只读的情况
- return this.each(function(){
- if(flag){
- //设置为只读
- var opts = $.data(this, 'fwcombox').options;
- var combo = $.data(this, 'fwcombox').fwcombox;
- var arrow = combo.find('.fwcombox-arrow');
- var input = combo.find('.fwcombox-text');
- arrow.unbind('.fwcombox');
- input.unbind('.fwcombox');
-
- opts.disabled = true;
- $(this).removeAttr('disabled');
- CFW.oGt._disablePrimitiveInput(input[0]);
- }else{
- //设置为非只读
- var opts = $.data(this, 'fwcombox').options;
- if(opts.disabled){
- var span = jQuery.data(this, 'fwcombox').fwcombox;
- var input = jQuery('.fwcombox-text',span);
- CFW.oGt._enablePrimitiveInput(input[0]);
- opts.disabled = false;
- opts.bindEvents(this);
- }
- }
- });
- }
- },
- /**
- * 返回控件是否可见。
- * 返回值:true表示可见,false表示不可见。
- */
- visible : function(){
- if(this.length==0){return null;}
- var span = $.data(this[0],'fwcombox').fwcombox;
- return span.is(":visible");
- },
- /**
- * 获取静态字典的中文名称
- */
- getValues :function(target){
- return getValues(target);
- },
- clearInputValue :function(target){
- return clearInput(target);
- },
- /**
- * 获取静态字典的中文名称
- */
- text :function(){
- return this.map(function(){
- return $.trim($.data(this, 'fwcombox').fwcombox.find('input.fwcombox-text').val());
- }).get(0);
- },
- /**
- * 持久过滤控件中的字典项。
- * @param values 要过滤的值,可以是数组。可空,空表示取消过滤
- * @param revert 反向过滤,boolean类型,为true时保留values指定的值,过滤没指定的值。可空
- * @return jQuery jquery原集合
- */
- filter:function(values,revert){
- var vals = [].concat(values);
- return this.each(function(){
- var opts = $.data(this, 'fwcombox').options;
- if(!opts.dataLoad){
- loadData(this, transformData(this));
- opts.dataLoad = true;
- }
- if(opts.dataLoad){
- //先处理模型
- var tvalsDiv = [].concat(vals);
- var data = $.data(this, 'fwcombox').data;
- for(var i=0; i<data.length; i++){
- var pos = $.inArray(data[i][opts.valueField],vals);
- //根据是否在过滤选项中设置过滤标志
- data[i].disabled = (pos != -1);
- if(revert){data[i].disabled=!data[i].disabled;}
- //删除当前值
- if(pos!=-1){
- vals.splice(pos,1);
- }
- }
- //后处理UI,如果UI还没初始化,正好略过
- var fwpanel = $.data(this, 'fwcombox').fwpanel;
- var panelbody = $('div.fwcombox-panel-body',fwpanel);
- panelbody.children().each(function(){
- var value=$(this).attr("value");
- var pos = $.inArray(value,tvalsDiv);
- //根据是否在过滤选项中设置过滤标志
- this.disabled = (pos != -1);
- if(revert){this.disabled=!this.disabled;}
- //删除当前值
- if(pos!=-1){
- tvalsDiv.splice(pos,1);
- }
- if(this.disabled){
- $(this).hide();
- }else{
- $(this).show();
- }
- });
- }else{
- //还没初始化就直接处理select
- for(var index=0;index<this.length;index++){
- var pos = $.inArray(this.options[index].value,vals);
- //根据是否在过滤选项中设置过滤标志
- this.options[index].disabled = (pos != -1);
- if(revert){this.options[index].disabled=!this.options[index].disabled;}
- //删除当前值
- if(pos!=-1){
- vals.splice(pos,1);
- }
- }
- }
- });
- },
- /**
- * 静态字典的构造函数
- */
- init :function(options){
- return this.each(function(){
- options = options || {};
- var state = $.data(this, 'fwcombox');
- if (state){
- $.extend(state.options, options, {
- 'displayCol' : $(this).attr('displayCol'),
- 'fwpanelWidth' : $(this).attr('fwpanelWidth'),
- 'fwpanelHeight' : $(this).attr('fwpanelHeight'),
- 'dsId' : $(this).attr('dsId')
- });
- } else {
- state = $.data(this, 'fwcombox', {
- options : $.extend({
- }, $.fn.fwcombox.defaults, options,{
- 'displayCol' : $(this).attr('displayCol'),
- 'fwpanelWidth' : $(this).attr('fwpanelWidth'),
- 'fwpanelHeight' : $(this).attr('fwpanelHeight'),
- 'dsId' : $(this).attr('dsId')
- }),
- fwcombox:null,
- fwpanel:null
- });
-
- var objWidth;
- if($.browser.msie){
- if(document.documentMode==null||document.documentMode=='5'){
- objWidth=$(this).outerWidth();
- }else{
- objWidth=$(this).parent().width()-2;
- }
- }else{
- objWidth=$(this).parent().width();
- }
- create(this,objWidth);
- if(this.className=='dbcombox'){
- state.options.remotedb = true;
- state.options.url = this.url;
- state.options.dname = this.dname;
- }
- //不能一开始就初始化,影响性能
- //if(!state.options.remotedb){
- // loadData(this, transformData(this));
- //}
- }
- //不能一开始就初始化,影响性能
- //if (state.options.data){
- // loadData(this, state.options.data);
- //}
- if(options.multiple){
- var values= $(this).val();
- setValues(this, values,true,true);
- }else{
- setValue(this, this.value,true,true);
- }
- });
- }
- };
- $.fn.fwcombox = function(options){
- if (methods[options]) {
- return methods[options].apply(this, Array.prototype.slice.call(
- arguments, 1));
- } else if (typeof options === 'object' || !options) {
- return methods.init.apply(this, arguments);
- } else {
- $.error('Method ' + options + ' does not exist on fwcombox');
- }
- };
-
- $.fn.fwcombox.defaults = {
- valueField: 'value',
- textField: 'text',
- dataLoad:false,
- multiple:false,
- url: null,
- dname:null,
- data: null,
- total:null,
- width: 'auto',
- fwpanelWidth: null,
- fwpanelHeight: 200,
- separator: ',',
- editable: true,
- disabled: false,
- ldcombox:false,//是否属于联动下拉框
- ldparent:null, //联动下拉框父的名字
- ldchild:null,//联动下拉框子的名字
- sqlid:null,//数据库查询对应的配置ID
- param:null,
- search:false,
- remotedb:false,//远程查询时为true
- dsId:null,
-
- selectPrev: function(){selectPrev(this);},
- selectNext: function(){selectNext(this);},
- selectCurr: function(){selectCurr(this);},
- filter: function(query){
- filter(this, query);
- },
- setSize:function(target){
- setSize(target);
- },
- setValue:function(target,val){
- var opts = $.data(target, 'fwcombox').options;
- if(opts.multiple){
- if(val==[]&&!opts.dataLoad){
- loadData(target, transformData(target));
- }else{
- setValues(target,val,true,true);
- }
- }else{
- if(val==''&&!opts.dataLoad){
- loadData(target, transformData(target));
- }else{
- setValue(target,val,true,true);
- }
- }
-
- },
- removeItem:function(target,val){
- removeItem(target,val);
- },
- bindEvents:function(target){
- bindEvents(target);
- },
- onLoadSuccess: function(){},
- onLoadError: function(){},
- onSelect: function(record){},
- onUnselect: function(record){},
- onChange: function(newValue, oldValue){}
- };
-
- })(jQuery);
|