// fields.js // // Fields are divided into 2 types // 1. Standard fields are loaded with the libarary // 2. Special fields are loaded with form.compressed.js // // // + wrapper // + input_area // + display_area // ====================================================================================== var no_value_fields = ['Section Break', 'Column Break', 'HTML', 'Table', 'FlexTable', 'Button', 'Image']; var codeid=0; var code_editors={}; function Field() { this.with_label = 1; } Field.prototype.make_body = function() { var ischk = (this.df.fieldtype=='Check' ? 1 : 0); // parent element if(this.parent) this.wrapper = $a(this.parent, 'div'); else this.wrapper = document.createElement('div'); this.label_area = $a(this.wrapper, 'div', '', {margin:'8px 0px 2px 0px'}); if(ischk && !this.in_grid) { this.input_area = $a(this.label_area, 'span', '', {marginRight:'4px'}); this.disp_area = $a(this.label_area, 'span', '', {marginRight:'4px'}); } // label if(this.with_label) { this.label_span = $a(this.label_area, 'span', 'field_label') // error icon this.label_icon = $a(this.label_area,'img','',{margin:'-3px 4px -3px 4px'}); $dh(this.label_icon); this.label_icon.src = 'images/icons/error.gif'; this.label_icon.title = 'Mandatory value needs to be entered'; // error icon this.suggest_icon = $a(this.label_area,'img','',{margin:'-3px 4px -3px 0px'}); $dh(this.suggest_icon); this.suggest_icon.src = 'images/icons/bullet_arrow_down.png'; this.suggest_icon.title = 'With suggestions'; } else { this.label_span = $a(this.label_area, 'span', '', {marginRight:'4px'}) $dh(this.label_area); } // make the input areas if(!this.input_area) { this.input_area = $a(this.wrapper, 'div'); this.disp_area = $a(this.wrapper, 'div'); } // apply style if(this.in_grid) { if(this.label_area) $dh(this.label_area); } else { this.input_area.className = 'input_area'; $y(this.wrapper,{marginBottom:'4px'}); // set description this.set_description(); } // bind label refresh if(this.onmake)this.onmake(); } Field.prototype.set_max_width = function() { var no_max = ['Code', 'Text Editor', 'Text', 'Table', 'HTML'] if(this.wrapper && this.layout_cell && this.layout_cell.parentNode.cells && this.layout_cell.parentNode.cells.length==1 && !in_list(no_max, this.df.fieldtype)) { $y(this.wrapper, {paddingRight:'50%'}); } } Field.prototype.set_label = function() { if(this.with_label && this.label_area && this.label!=this.df.label) { this.label_span.innerHTML = this.df.label;this.label = this.df.label; } } Field.prototype.set_description = function() { if(this.df.description) { // parent var p = in_list(['Text Editor', 'Code', 'Check'], this.df.fieldtype) ? this.label_area : this.wrapper; this.desc_area = $a(p, 'div', 'field_description', '', this.df.description) // padding on the bottom if(in_list(['Text Editor', 'Code'], this.df.fieldtype)) $(this.desc_area).addClass('field_description_top'); } } // Field Refresh // -------------------------------------------------------------------------------------------- Field.prototype.get_status = function() { // if used in filters if(this.in_filter) this.not_in_form = this.in_filter; if(this.not_in_form) { return 'Write'; } var fn = this.df.fieldname?this.df.fieldname:this.df.label; this.df = get_field(this.doctype, fn, this.docname); if(!this.df.permlevel) this.df.permlevel = 0; var p = this.perm[this.df.permlevel]; var ret; // permission level if(cur_frm.editable && p && p[WRITE])ret='Write'; else if(p && p[READ])ret='Read'; else ret='None'; // binary if(this.df.fieldtype=='Binary') ret = 'None'; // no display for binary // hidden if(cint(this.df.hidden)) ret = 'None'; // for submit if(ret=='Write' && cint(cur_frm.doc.docstatus) > 0) ret = 'Read'; // allow on submit var a_o_s = cint(this.df.allow_on_submit); if(a_o_s && (this.in_grid || (this.frm && this.frm.not_in_container))) { a_o_s = null; if(this.in_grid) a_o_s = this.grid.field.df.allow_on_submit; // take from grid if(this.frm && this.frm.not_in_container) { a_o_s = cur_grid.field.df.allow_on_submit;} // take from grid } if(cur_frm.editable && a_o_s && cint(cur_frm.doc.docstatus)>0 && !this.df.hidden) { tmp_perm = get_perm(cur_frm.doctype, cur_frm.docname, 1); if(tmp_perm[this.df.permlevel] && tmp_perm[this.df.permlevel][WRITE])ret='Write'; } return ret; } Field.prototype.set_style_mandatory = function(add) { if(add) { $(this.txt ? this.txt : this.input).addClass('input-mandatory'); if(this.disp_area) $(this.disp_area).addClass('input-mandatory'); } else { $(this.txt ? this.txt : this.input).removeClass('input-mandatory'); if(this.disp_area) $(this.disp_area).removeClass('input-mandatory'); } } Field.prototype.refresh_mandatory = function() { if(this.in_filter)return; // mandatory changes if(this.df.reqd) { if(this.label_area) this.label_area.style.color= "#d22"; this.set_style_mandatory(1); } else { if(this.label_area) this.label_area.style.color= "#222"; this.set_style_mandatory(0); } this.refresh_label_icon() this.set_reqd = this.df.reqd; } Field.prototype.refresh_display = function() { // from permission if(!this.set_status || this.set_status!=this.disp_status) { // status changed if(this.disp_status=='Write') { // write if(this.make_input&&(!this.input)) { // make input if reqd this.make_input(); if(this.onmake_input) this.onmake_input(); } if(this.show) this.show() else { $ds(this.wrapper); } // input or content if(this.input) { // if there, show it! $ds(this.input_area); $dh(this.disp_area); if(this.input.refresh)this.input.refresh(); } else { // no widget $dh(this.input_area); $ds(this.disp_area); } } else if(this.disp_status=='Read') { // read if(this.show) this.show() else { $ds(this.wrapper); } $dh(this.input_area); $ds(this.disp_area); } else { // None - hide all if(this.hide) this.hide(); else $dh(this.wrapper); } this.set_status = this.disp_status; } } Field.prototype.refresh = function() { // get status this.disp_status = this.get_status(); // if there is a special refresh in case of table, then this is not valid if(this.in_grid && this.table_refresh && this.disp_status == 'Write') { this.table_refresh(); return; } this.set_label(); this.refresh_display(); // further refresh if(this.onrefresh) this.onrefresh(); if(this.input&&this.input.refresh) this.input.refresh(this.df); if(!this.not_in_form) this.set_input(_f.get_value(this.doctype,this.docname,this.df.fieldname)); this.refresh_mandatory(); this.set_max_width(); } Field.prototype.refresh_label_icon = function() { // mandatory if(this.df.reqd) { if(this.get_value && is_null(this.get_value())) { if(this.label_icon) $ds(this.label_icon); $(this.txt ? this.txt : this.input).addClass('field-to-update') } else { if(this.label_icon) $dh(this.label_icon); $(this.txt ? this.txt : this.input).removeClass('field-to-update') } } } // Set / display values // -------------------------------------------------------------------------------------------- Field.prototype.set = function(val) { // not in form if(this.not_in_form) return; if((!this.docname) && this.grid) { this.docname = this.grid.add_newrow(); // new row } // cleanup ms word quotes if(in_list(['Data','Text','Small Text','Code'], this.df.fieldtype)) val = clean_smart_quotes(val); var set_val = val; if(this.validate)set_val = this.validate(val); _f.set_value(this.doctype, this.docname, this.df.fieldname, set_val); this.value = val; // for return } Field.prototype.set_input = function(val) { this.value = val; if(this.input&&this.input.set_input) { if(val==null)this.input.set_input(''); else this.input.set_input(val); // in widget } var disp_val = val; if(val==null) disp_val = ''; this.set_disp(disp_val); // text } Field.prototype.run_trigger = function() { // update mandatory icon this.refresh_label_icon(); if(this.df.reqd && this.get_value && !is_null(this.get_value()) && this.set_as_error) this.set_as_error(0); if(this.not_in_form) { return; } if(cur_frm.cscript[this.df.fieldname]) cur_frm.runclientscript(this.df.fieldname, this.doctype, this.docname); cur_frm.refresh_dependency(); } Field.prototype.set_disp_html = function(t) { if(this.disp_area){ $(this.disp_area).addClass('disp_area'); this.disp_area.innerHTML = (t==null ? '' : t); if(!t) $(this.disp_area).addClass('disp_area_no_val'); } } Field.prototype.set_disp = function(val) { this.set_disp_html(val); } Field.prototype.set_as_error = function(set) { if(this.in_grid || this.in_filter) return; var w = this.txt ? this.txt : this.input; if(set) { $y(w, {border: '2px solid RED'}); } else { $y(w, {border: '1px solid #888'}); } } // Show in GRID // -------------------------------------------------------------------------------------------- // for grids (activate against a particular record in the table Field.prototype.activate = function(docname) { this.docname = docname; this.refresh(); if(this.input) { this.input.isactive = true; var v = _f.get_value(this.doctype, this.docname, this.df.fieldname); this.last_value=v; // set input value if(this.input.onchange && this.input.get_value && this.input.get_value() !=v) { if(this.validate) this.input.set_value(this.validate(v)); else this.input.set_value((v==null)?'':v); if(this.format_input) this.format_input(); } if(this.input.focus){ try{this.input.focus();} catch(e){} // IE Fix - Unexpected call??? } } if(this.txt) { try{this.txt.focus();} catch(e){} // IE Fix - Unexpected call??? this.txt.isactive = true; if(this.btn)this.btn.isactive = true; this.txt.field_object = this; } } // ====================================================================================== function DataField() { } DataField.prototype = new Field(); DataField.prototype.make_input = function() { var me = this; this.input = $a(this.input_area, 'input'); if(this.df.fieldtype=='Password') { if(isIE) { this.input_area.innerHTML = ''; // IE fix this.input = this.input_area.childNodes[0]; } else { this.input.setAttribute('type', 'password'); } } this.get_value= function() { var v = this.input.value; if(this.validate)v = this.validate(v); return v; } this.input.name = this.df.fieldname; this.input.onchange = function() { if(!me.last_value)me.last_value=''; if(me.validate) me.input.value = me.validate(me.input.value); me.set(me.input.value); if(me.format_input) me.format_input(); if(in_list(['Currency','Float','Int'], me.df.fieldtype)) { if(flt(me.last_value)==flt(me.input.value)) { me.last_value = me.input.value; return; // do not run trigger } } me.last_value = me.input.value; me.run_trigger(); } this.input.set_input = function(val) { if(val==null)val=''; me.input.value = val; if(me.format_input)me.format_input(); } // autosuggest type fields // ----------------------- if(this.df.options=='Suggest') { // add auto suggest if(this.suggest_icon) $di(this.suggest_icon); this.set_get_query = function() { } this.get_query = function(doc, dt, dn) { return repl('SELECT DISTINCT `%(fieldname)s` FROM `tab%(dt)s` WHERE `%(fieldname)s` LIKE "%s" LIMIT 50', {fieldname:me.df.fieldname, dt:me.df.parent}) } var opts = { script: '', json: true, maxresults: 10, link_field: this }; this.as = new AutoSuggest(this.input, opts); } } DataField.prototype.validate = function(v) { if(this.df.options == 'Phone') { if(v+''=='')return ''; v1 = '' // phone may start with + and must only have numbers later, '-' and ' ' are stripped v = v.replace(/ /g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, ''); // allow initial +,0,00 if(v && v.substr(0,1)=='+') { v1 = '+'; v = v.substr(1); } if(v && v.substr(0,2)=='00') { v1 += '00'; v = v.substr(2); } if(v && v.substr(0,1)=='0') { v1 += '0'; v = v.substr(1); } v1 += cint(v) + ''; return v1; } else if(this.df.options == 'Email') { if(v+''=='')return ''; if(!validate_email(v)) { msgprint(this.df.label + ': ' + v + ' is not a valid email id'); return ''; } else return v; } else { return v; } } DataField.prototype.onrefresh = function() { if(this.input&&this.df.colour) { var col = '#'+this.df.colour.split(':')[1]; $bg(this.input,col); } } // ====================================================================================== function ReadOnlyField() { } ReadOnlyField.prototype = new Field(); // ====================================================================================== function HTMLField() { } HTMLField.prototype = new Field(); HTMLField.prototype.with_label = 0; HTMLField.prototype.set_disp = function(val) { this.disp_area.innerHTML = val; } HTMLField.prototype.set_input = function(val) { if(val) this.set_disp(val); } HTMLField.prototype.onrefresh = function() { this.set_disp(this.df.options?this.df.options:''); } // ====================================================================================== var datepicker_active = 0; function DateField() { } DateField.prototype = new Field(); DateField.prototype.make_input = function() { var me = this; this.user_fmt = locals['Control Panel']['Control Panel'].date_format; if(!this.user_fmt)this.user_fmt = 'dd-mm-yy'; this.input = $a(this.input_area, 'input'); $(this.input).datepicker({ dateFormat: me.user_fmt.replace('yyyy','yy'), altFormat:'yy-mm-dd', changeYear: true, beforeShow: function(input, inst) { datepicker_active = 1 }, onClose: function(dateText, inst) { datepicker_active = 0; if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); } }); var me = this; me.input.onchange = function() { // input as dd-mm-yyyy if(this.value==null)this.value=''; if(!this.not_in_form) me.set(dateutil.user_to_str(me.input.value)); me.run_trigger(); } me.input.set_input = function(val) { if(val==null)val=''; else val=dateutil.str_to_user(val); me.input.value = val; } me.get_value = function() { if(me.input.value) return dateutil.user_to_str(me.input.value); } } DateField.prototype.set_disp = function(val) { var v = dateutil.str_to_user(val); if(v==null)v = ''; this.set_disp_html(v); } DateField.prototype.validate = function(v) { if(!v) return; var me = this; this.clear = function() { msgprint ("Date must be in format " + this.user_fmt); me.input.set_input(''); return ''; } var t = v.split('-'); if(t.length!=3) { return this.clear(); } else if(cint(t[1])>12 || cint(t[1])<1) { return this.clear(); } else if(cint(t[2])>31 || cint(t[2])<1) { return this.clear(); } return v; }; // ====================================================================================== // for ensuring in AutoSuggest that 2 values are not set in quick succession due to un intentional event call var _link_onchange_flag = null; // reference when a new record is created via link function LinkField() { } LinkField.prototype = new Field(); LinkField.prototype.make_input = function() { var me = this; if(me.df.no_buttons) { this.txt = $a(this.input_area, 'input'); this.input = this.txt; } else { makeinput_popup(this, 'ic-zoom', 'ic-sq_next', 'ic-sq_plus'); // setup buttons me.setup_buttons(); me.onrefresh = function() { if(me.can_create && cur_frm.doc.docstatus==0) $ds(me.btn2); else $dh(me.btn2); } } me.txt.field_object = this; // set onchange triggers me.set_onchange(); me.input.set_input = function(val) { if(val==undefined)val=''; me.txt.value = val; } me.get_value = function() { return me.txt.value; } // add auto suggest var opts = { script: '', json: true, maxresults: 10, link_field: me }; this.as = new AutoSuggest(me.txt, opts); } LinkField.prototype.setup_buttons = function() { var me = this; // magnifier - search me.btn.onclick = function() { selector.set(me, me.df.options, me.df.label); selector.show(me.txt); } // open if(me.btn1)me.btn1.onclick = function() { if(me.txt.value && me.df.options) { loaddoc(me.df.options, me.txt.value); } } // add button - for inline creation of records me.can_create = 0; if((!me.not_in_form) && in_list(profile.can_create, me.df.options)) { me.can_create = 1; me.btn2.onclick = function() { var on_save_callback = function(new_rec) { if(new_rec) { var d = _f.calling_doc_stack.pop(); // patch for composites locals[d[0]][d[1]][me.df.fieldname] = new_rec; me.refresh(); if(me.grid)me.grid.refresh(); // call script me.run_trigger(); } } _f.calling_doc_stack.push([me.doctype, me.docname]); new_doc(me.df.options, me.on_new, 1, on_save_callback, me.doctype, me.docname, me.frm.not_in_container); } } else { $dh(me.btn2); $y($td(me.tab,0,2), {width:'0px'}); } } LinkField.prototype.set_onchange = function() { var me = this; me.txt.onchange = function(e) { if(cur_autosug)return; // still setting value // check values are not set in quick succession due to un-intentional event call if(_link_onchange_flag) { return;} _link_onchange_flag = 1; // refresh mandatory style me.refresh_label_icon(); // not in form, do nothing if(me.not_in_form) { _link_onchange_flag = 0; return; } // same value, do nothing if(cur_frm) { if(me.txt.value == locals[me.doctype][me.docname][me.df.fieldname]) { me.set(me.txt.value); // one more time, grid bug? me.run_trigger(); // wanted - called as refresh? setTimeout('_link_onchange_flag = 0', 500); return; } } me.set(me.txt.value); // deselect cell if in grid if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); // run trigger if value is cleared if(!me.txt.value) { me.run_trigger(); setTimeout('_link_onchange_flag = 0', 500); return; } // validate the value just entered var fetch = ''; if(cur_frm.fetch_dict[me.df.fieldname]) fetch = cur_frm.fetch_dict[me.df.fieldname].columns.join(', '); $c('webnotes.widgets.form.validate_link', {'value':me.txt.value, 'options':me.df.options, 'fetch': fetch}, function(r,rt) { setTimeout('_link_onchange_flag = 0', 500); if(selector && selector.display) return; // selecting from popup if(r.message=='Ok') { // set fetch values if(r.fetch_values) me.set_fetch_values(r.fetch_values); me.run_trigger(); } else { var astr = ''; if(in_list(profile.can_create, me.df.options)) astr = repl('

Click here to create a new %(dtl)s', {dt:me.df.options, dtl:get_doctype_label(me.df.options)}) msgprint(repl('error:%(val)s is not a valid %(dt)s.

You must first create a new %(dt)s %(val)s and then select its value. To find an existing %(dt)s, click on the magnifying glass next to the field.%(add)s', {val:me.txt.value, dt:get_doctype_label(me.df.options), add:astr})); me.txt.value = ''; me.set(''); } }); } } LinkField.prototype.set_fetch_values = function(fetch_values) { var fl = cur_frm.fetch_dict[this.df.fieldname].fields; var changed_fields = []; for(var i=0; i< fl.length; i++) { if(locals[this.doctype][this.docname][fl[i]]!=fetch_values[i]) { locals[this.doctype][this.docname][fl[i]] = fetch_values[i]; if(!this.grid) { refresh_field(fl[i]); // call trigger on the target field changed_fields.push(fl[i]); } } } // run triggers for(i=0; i"+val+""; this.set_disp_html(t); } // ====================================================================================== function IntField() { } IntField.prototype = new DataField(); IntField.prototype.validate = function(v) { if(isNaN(parseInt(v)))return null; return cint(v); }; IntField.prototype.format_input = function() { if(this.input.value==null) this.input.value=''; } // ====================================================================================== function FloatField() { } FloatField.prototype = new DataField(); FloatField.prototype.validate = function(v) { var v= parseFloat(v); if(isNaN(v))return null; return v; }; FloatField.prototype.format_input = function() { if(this.input.value==null) this.input.value=''; } // ====================================================================================== function CurrencyField() { } CurrencyField.prototype = new DataField(); CurrencyField.prototype.format_input = function() { var v = fmt_money(this.input.value); if(this.not_in_form) { if(!flt(this.input.value)) v = ''; // blank in filter } this.input.value = v; } CurrencyField.prototype.validate = function(v) { if(v==null || v=='') return 0; return flt(v,2); } CurrencyField.prototype.set_disp = function(val) { var v = fmt_money(val); this.set_disp_html(v); } CurrencyField.prototype.onmake_input = function() { if(!this.input) return; this.input.onfocus = function() { if(flt(this.value)==0)this.select(); } } // ====================================================================================== function CheckField() { } CheckField.prototype = new Field(); CheckField.prototype.validate = function(v) { var v= parseInt(v); if(isNaN(v))return 0; return v; }; CheckField.prototype.onmake = function() { this.checkimg = $a(this.disp_area, 'div'); var img = $a(this.checkimg, 'img'); img.src = 'images/ui/tick.gif'; $dh(this.checkimg); } CheckField.prototype.make_input = function() { var me = this; this.input = $a_input(this.input_area,'checkbox'); $y(this.input, {width:"16px", border:'0px', margin:'2px'}); // no specs for checkbox this.input.onchange = function() { me.set(this.checked?1:0); me.run_trigger(); } if(isIE){ this.input.onclick = this.input.onchange; $y(this.input, {margin:'-1px'}); } this.input.set_input = function(v) { v = parseInt(v); if(isNaN(v)) v = 0; if(v) me.input.checked = true; else me.input.checked=false; } this.get_value= function() { return this.input.checked?1:0; } } CheckField.prototype.set_disp = function(val) { if (val){ $ds(this.checkimg); } else { $dh(this.checkimg); } } // ====================================================================================== function TextField() { } TextField.prototype = new Field(); TextField.prototype.set_disp = function(val) { this.disp_area.innerHTML = replace_newlines(val); } TextField.prototype.make_input = function() { var me = this; if(this.in_grid) return; // do nothing, text dialog will take over this.input = $a(this.input_area, 'textarea'); this.input.wrap = 'off'; if(this.df.fieldtype=='Small Text') this.input.style.height = "80px"; this.input.set_input = function(v) { me.input.value = v; } this.input.onchange = function() { me.set(me.input.value); me.run_trigger(); } this.get_value= function() { return this.input.value; } } // text dialog var text_dialog; function make_text_dialog() { var d = new Dialog(520,410,'Edit Text'); d.make_body([ ['Text', 'Enter Text'], ['HTML', 'Description'], ['Button', 'Update'] ]); d.widgets['Update'].onclick = function() { var t = this.dialog; t.field.set(t.widgets['Enter Text'].value); t.hide(); } d.onshow = function() { this.widgets['Enter Text'].style.height = '300px'; var v = _f.get_value(this.field.doctype,this.field.docname,this.field.df.fieldname); this.widgets['Enter Text'].value = v==null?'':v; this.widgets['Enter Text'].focus(); this.widgets['Description'].innerHTML = '' if(this.field.df.description) $a(this.widgets['Description'], 'div', 'field_description', '', this.field.df.description); } d.onhide = function() { if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); } text_dialog = d; } TextField.prototype.table_refresh = function() { if(!this.text_dialog) make_text_dialog(); text_dialog.set_title('Enter text for "'+ this.df.label +'"'); text_dialog.field = this; text_dialog.show(); } // Select // ====================================================================================== function SelectField() { } SelectField.prototype = new Field(); SelectField.prototype.make_input = function() { var me = this; var opt=[]; if(this.in_filter && (!this.df.single_select)) { // multiple select this.input = $a(this.input_area, 'select'); this.input.multiple = true; this.input.style.height = '4em'; this.input.lab = $a(this.input_area, 'div', {fontSize:'9px',color:'#999'}); this.input.lab.innerHTML = '(Use Ctrl+Click to select multiple or de-select)' } else { // Single select this.input = $a(this.input_area, 'select'); this.input.onchange = function() { if(me.validate) me.validate(); me.set(sel_val(this)); // IE grid disappears if(isIE && me.in_grid) { $dh(_f.cur_grid_cell.grid.wrapper); $ds(_f.cur_grid_cell.grid.wrapper); } me.run_trigger(); } } // set as single (to be called from report builder) this.set_as_single = function() { var i = this.input; i.multiple = false; i.style.height = null; // default if(i.lab)$dh(i.lab) } // refresh options list this.refresh_options = function(options) { if(options) me.df.options = options; me.options_list = me.df.options?me.df.options.split('\n'):[]; // add options empty_select(this.input); if(me.in_filter && me.options_list[0]!='') { me.options_list = add_lists([''], me.options_list); } add_sel_options(this.input, me.options_list); } // refresh options this.onrefresh = function() { this.refresh_options(); if(this.not_in_form) { this.input.value = ''; return; } if(_f.get_value) var v = _f.get_value(this.doctype,this.docname,this.df.fieldname); else { if(this.options_list && this.options_list.length) var v = this.options_list[0]; else var v = null; } this.input.set_input(v); } this.input.set_input=function(v) { if(!v) { if(!me.input.multiple) { if(me.docname) { // if called from onload without docname being set on fields if(me.options_list && me.options_list.length) { me.set(me.options_list[0]); me.input.value = me.options_list[0]; } else { me.input.value = ''; } } } } else { if(me.options_list && in_list(me.options_list, v)) { if(me.input.multiple) { for(var i=0; i