PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/public/js/plugins/grid.common.js

http://sgd.googlecode.com/
JavaScript | 636 lines | 608 code | 3 blank | 25 comment | 278 complexity | 60c61b8e4e09f6f8c71517a133b49fd5 MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. * jqGrid common function
  3. * Tony Tomov tony@trirand.com
  4. * http://trirand.com/blog/
  5. * Dual licensed under the MIT and GPL licenses:
  6. * http://www.opensource.org/licenses/mit-license.php
  7. * http://www.gnu.org/licenses/gpl-2.0.html
  8. */
  9. // Modal functions
  10. var showModal = function(h) {
  11. h.w.show();
  12. };
  13. var closeModal = function(h) {
  14. h.w.hide().attr("aria-hidden","true");
  15. if(h.o) { h.o.remove(); }
  16. };
  17. var hideModal = function (selector,o) {
  18. o = jQuery.extend({jqm : true, gb :''}, o || {});
  19. if(o.onClose) {
  20. var oncret = o.onClose(selector);
  21. if (typeof oncret == 'boolean' && !oncret ) { return; }
  22. }
  23. if (jQuery.fn.jqm && o.jqm === true) {
  24. jQuery(selector).attr("aria-hidden","true").jqmHide();
  25. } else {
  26. if(o.gb != '') {
  27. try {jQuery(".jqgrid-overlay:first",o.gb).hide();} catch (e){}
  28. }
  29. jQuery(selector).hide().attr("aria-hidden","true");
  30. }
  31. };
  32. //Helper functions
  33. function findPos(obj) {
  34. var curleft = 0, curtop = 0;
  35. if (obj.offsetParent) {
  36. do {
  37. curleft += obj.offsetLeft;
  38. curtop += obj.offsetTop;
  39. } while (obj = obj.offsetParent);
  40. //do not change obj == obj.offsetParent
  41. }
  42. return [curleft,curtop];
  43. }
  44. var createModal = function(aIDs, content, p, insertSelector, posSelector, appendsel) {
  45. var mw = document.createElement('div'), rtlsup;
  46. rtlsup = jQuery(p.gbox).attr("dir") == "rtl" ? true : false;
  47. mw.className= "ui-widget ui-widget-content ui-corner-all ui-jqdialog";
  48. mw.id = aIDs.themodal;
  49. var mh = document.createElement('div');
  50. mh.className = "ui-jqdialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix";
  51. mh.id = aIDs.modalhead;
  52. jQuery(mh).append("<span class='ui-jqdialog-title'>"+p.caption+"</span>");
  53. var ahr= jQuery("<a href='javascript:void(0)' class='ui-jqdialog-titlebar-close ui-corner-all'></a>")
  54. .hover(function(){ahr.addClass('ui-state-hover');},
  55. function(){ahr.removeClass('ui-state-hover');})
  56. .append("<span class='ui-icon ui-icon-closethick'></span>");
  57. jQuery(mh).append(ahr);
  58. if(rtlsup) {
  59. mw.dir = "rtl";
  60. jQuery(".ui-jqdialog-title",mh).css("float","right");
  61. jQuery(".ui-jqdialog-titlebar-close",mh).css("left",0.3+"em");
  62. } else {
  63. mw.dir = "ltr";
  64. jQuery(".ui-jqdialog-title",mh).css("float","left");
  65. jQuery(".ui-jqdialog-titlebar-close",mh).css("right",0.3+"em");
  66. }
  67. var mc = document.createElement('div');
  68. jQuery(mc).addClass("ui-jqdialog-content ui-widget-content").attr("id",aIDs.modalcontent);
  69. jQuery(mc).append(content);
  70. mw.appendChild(mc);
  71. jQuery(mw).prepend(mh);
  72. if(appendsel===true) { jQuery('body').append(mw); } //append as first child in body -for alert dialog
  73. else {jQuery(mw).insertBefore(insertSelector);}
  74. if(typeof p.jqModal === 'undefined') {p.jqModal = true;} // internal use
  75. var coord = {};
  76. if ( jQuery.fn.jqm && p.jqModal === true) {
  77. if(p.left ===0 && p.top===0) {
  78. var pos = [];
  79. pos = findPos(posSelector);
  80. p.left = pos[0] + 4;
  81. p.top = pos[1] + 4;
  82. }
  83. coord.top = p.top+"px";
  84. coord.left = p.left;
  85. } else if(p.left !==0 || p.top!==0) {
  86. coord.left = p.left;
  87. coord.top = p.top+"px";
  88. }
  89. jQuery("a.ui-jqdialog-titlebar-close",mh).click(function(e){
  90. var oncm = jQuery("#"+aIDs.themodal).data("onClose") || p.onClose;
  91. var gboxclose = jQuery("#"+aIDs.themodal).data("gbox") || p.gbox;
  92. hideModal("#"+aIDs.themodal,{gb:gboxclose,jqm:p.jqModal,onClose:oncm});
  93. return false;
  94. });
  95. if (p.width === 0 || !p.width) {p.width = 300;}
  96. if(p.height === 0 || !p.height) {p.height =200;}
  97. if(!p.zIndex) {p.zIndex = 950;}
  98. var rtlt = 0;
  99. if( rtlsup && coord.left && !appendsel) {
  100. rtlt = jQuery(p.gbox).width()- (!isNaN(p.width) ? parseInt(p.width,10) :0) - 8; // to do
  101. // just in case
  102. coord.left = parseInt(coord.left,10) + parseInt(rtlt,10);
  103. }
  104. if(coord.left) { coord.left += "px"; }
  105. jQuery(mw).css(jQuery.extend({
  106. width: isNaN(p.width) ? "auto": p.width+"px",
  107. height:isNaN(p.height) ? "auto" : p.height + "px",
  108. zIndex:p.zIndex,
  109. overflow: 'hidden'
  110. },coord))
  111. .attr({tabIndex: "-1","role":"dialog","aria-labelledby":aIDs.modalhead,"aria-hidden":"true"});
  112. if(typeof p.drag == 'undefined') { p.drag=true;}
  113. if(typeof p.resize == 'undefined') {p.resize=true;}
  114. if (p.drag) {
  115. jQuery(mh).css('cursor','move');
  116. if(jQuery.fn.jqDrag) {
  117. jQuery(mw).jqDrag(mh);
  118. } else {
  119. try {
  120. jQuery(mw).draggable({handle: jQuery("#"+mh.id)});
  121. } catch (e) {}
  122. }
  123. }
  124. if(p.resize) {
  125. if(jQuery.fn.jqResize) {
  126. jQuery(mw).append("<div class='jqResize ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se ui-icon-grip-diagonal-se'></div>");
  127. jQuery("#"+aIDs.themodal).jqResize(".jqResize",aIDs.scrollelm ? "#"+aIDs.scrollelm : false);
  128. } else {
  129. try {
  130. jQuery(mw).resizable({handles: 'se, sw',alsoResize: aIDs.scrollelm ? "#"+aIDs.scrollelm : false});
  131. } catch (e) {}
  132. }
  133. }
  134. if(p.closeOnEscape === true){
  135. jQuery(mw).keydown( function( e ) {
  136. if( e.which == 27 ) {
  137. var cone = jQuery("#"+aIDs.themodal).data("onClose") || p.onClose;
  138. hideModal(this,{gb:p.gbox,jqm:p.jqModal,onClose: cone});
  139. }
  140. });
  141. }
  142. };
  143. var viewModal = function (selector,o){
  144. o = jQuery.extend({
  145. toTop: true,
  146. overlay: 10,
  147. modal: false,
  148. onShow: showModal,
  149. onHide: closeModal,
  150. gbox: '',
  151. jqm : true,
  152. jqM : true
  153. }, o || {});
  154. if (jQuery.fn.jqm && o.jqm === true) {
  155. if(o.jqM) { jQuery(selector).attr("aria-hidden","false").jqm(o).jqmShow(); }
  156. else {jQuery(selector).attr("aria-hidden","false").jqmShow();}
  157. } else {
  158. if(o.gbox != '') {
  159. jQuery(".jqgrid-overlay:first",o.gbox).show();
  160. jQuery(selector).data("gbox",o.gbox);
  161. }
  162. jQuery(selector).show().attr("aria-hidden","false");
  163. try{jQuery(':input:visible',selector)[0].focus();}catch(_){}
  164. }
  165. };
  166. function info_dialog(caption, content,c_b, modalopt) {
  167. var mopt = {
  168. width:290,
  169. height:'auto',
  170. dataheight: 'auto',
  171. drag: true,
  172. resize: false,
  173. caption:"<b>"+caption+"</b>",
  174. left:250,
  175. top:170,
  176. zIndex : 1000,
  177. jqModal : true,
  178. modal : false,
  179. closeOnEscape : true,
  180. align: 'center',
  181. buttonalign : 'center',
  182. buttons : []
  183. // {text:'textbutt', id:"buttid", onClick : function(){...}}
  184. // if the id is not provided we set it like info_button_+ the index in the array - i.e info_button_0,info_button_1...
  185. };
  186. jQuery.extend(mopt,modalopt || {});
  187. var jm = mopt.jqModal;
  188. if(jQuery.fn.jqm && !jm) { jm = false; }
  189. // in case there is no jqModal
  190. var buttstr ="";
  191. if(mopt.buttons.length > 0) {
  192. for(var i=0;i<mopt.buttons.length;i++) {
  193. if(typeof mopt.buttons[i].id == "undefined") { mopt.buttons[i].id = "info_button_"+i; }
  194. buttstr += "<a href='javascript:void(0)' id='"+mopt.buttons[i].id+"' class='fm-button ui-state-default ui-corner-all'>"+mopt.buttons[i].text+"</a>";
  195. }
  196. }
  197. var dh = isNaN(mopt.dataheight) ? mopt.dataheight : mopt.dataheight+"px",
  198. cn = "text-align:"+mopt.align+";";
  199. var cnt = "<div id='info_id'>";
  200. cnt += "<div id='infocnt' style='margin:0px;padding-bottom:1em;width:100%;overflow:auto;position:relative;height:"+dh+";"+cn+"'>"+content+"</div>";
  201. cnt += c_b ? "<div class='ui-widget-content ui-helper-clearfix' style='text-align:"+mopt.buttonalign+";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'><a href='javascript:void(0)' id='closedialog' class='fm-button ui-state-default ui-corner-all'>"+c_b+"</a>"+buttstr+"</div>" :
  202. buttstr != "" ? "<div class='ui-widget-content ui-helper-clearfix' style='text-align:"+mopt.buttonalign+";padding-bottom:0.8em;padding-top:0.5em;background-image: none;border-width: 1px 0 0 0;'>"+buttstr+"</div>" : "";
  203. cnt += "</div>";
  204. try {
  205. if(jQuery("#info_dialog").attr("aria-hidden") == "false") {
  206. hideModal("#info_dialog",{jqm:jm});
  207. }
  208. jQuery("#info_dialog").remove();
  209. } catch (e){}
  210. createModal({
  211. themodal:'info_dialog',
  212. modalhead:'info_head',
  213. modalcontent:'info_content',
  214. scrollelm: 'infocnt'},
  215. cnt,
  216. mopt,
  217. '','',true
  218. );
  219. // attach onclick after inserting into the dom
  220. if(buttstr) {
  221. jQuery.each(mopt.buttons,function(i){
  222. jQuery("#"+this.id,"#info_id").bind('click',function(){mopt.buttons[i].onClick.call(jQuery("#info_dialog")); return false;});
  223. });
  224. }
  225. jQuery("#closedialog", "#info_id").click(function(e){
  226. hideModal("#info_dialog",{jqm:jm});
  227. return false;
  228. });
  229. jQuery(".fm-button","#info_dialog").hover(
  230. function(){jQuery(this).addClass('ui-state-hover');},
  231. function(){jQuery(this).removeClass('ui-state-hover');}
  232. );
  233. if(jQuery.isFunction(mopt.beforeOpen) ) mopt.beforeOpen();
  234. viewModal("#info_dialog",{
  235. onHide: function(h) {
  236. h.w.hide().remove();
  237. if(h.o) { h.o.remove(); }
  238. },
  239. modal :mopt.modal,
  240. jqm:jm
  241. });
  242. if(jQuery.isFunction(mopt.afterOpen) ) mopt.afterOpen();
  243. try{$("#info_dialog").focus();} catch (e){}
  244. }
  245. // Form Functions
  246. function createEl(eltype,options,vl,autowidth, ajaxso) {
  247. var elem = "";
  248. if(options.defaultValue) { delete options.defaultValue; }
  249. function bindEv (el, opt) {
  250. if(jQuery.isFunction(opt.dataInit)) {
  251. // datepicker fix
  252. el.id = opt.id;
  253. opt.dataInit(el);
  254. delete opt.id;
  255. delete opt.dataInit;
  256. }
  257. if(opt.dataEvents) {
  258. jQuery.each(opt.dataEvents, function() {
  259. if (this.data !== undefined) {
  260. jQuery(el).bind(this.type, this.data, this.fn);
  261. } else {
  262. jQuery(el).bind(this.type, this.fn);
  263. }
  264. });
  265. delete opt.dataEvents;
  266. }
  267. return opt;
  268. }
  269. switch (eltype)
  270. {
  271. case "textarea" :
  272. elem = document.createElement("textarea");
  273. if(autowidth) {
  274. if(!options.cols) { jQuery(elem).css({width:"98%"});}
  275. } else if (!options.cols) { options.cols = 20; }
  276. if(!options.rows) { options.rows = 2; }
  277. if(vl=='&nbsp;' || vl=='&#160;' || (vl.length==1 && vl.charCodeAt(0)==160)) {vl="";}
  278. elem.value = vl;
  279. options = bindEv(elem,options);
  280. jQuery(elem).attr(options).attr({"role":"textbox","multiline":"true"});
  281. break;
  282. case "checkbox" : //what code for simple checkbox
  283. elem = document.createElement("input");
  284. elem.type = "checkbox";
  285. if( !options.value ) {
  286. var vl1 = vl.toLowerCase();
  287. if(vl1.search(/(false|0|no|off|undefined)/i)<0 && vl1!=="") {
  288. elem.checked=true;
  289. elem.defaultChecked=true;
  290. elem.value = vl;
  291. } else {
  292. elem.value = "on";
  293. }
  294. jQuery(elem).attr("offval","off");
  295. } else {
  296. var cbval = options.value.split(":");
  297. if(vl === cbval[0]) {
  298. elem.checked=true;
  299. elem.defaultChecked=true;
  300. }
  301. elem.value = cbval[0];
  302. jQuery(elem).attr("offval",cbval[1]);
  303. try {delete options.value;} catch (e){}
  304. }
  305. options = bindEv(elem,options);
  306. jQuery(elem).attr(options).attr("role","checkbox");
  307. break;
  308. case "select" :
  309. elem = document.createElement("select");
  310. elem.setAttribute("role","select");
  311. var msl, ovm = [];
  312. if(options.multiple===true) {
  313. msl = true;
  314. elem.multiple="multiple";
  315. $(elem).attr("aria-multiselectable","true");
  316. } else { msl = false; }
  317. if(typeof(options.dataUrl) != "undefined") {
  318. jQuery.ajax(jQuery.extend({
  319. url: options.dataUrl,
  320. type : "GET",
  321. dataType: "html",
  322. success: function(data,status){
  323. try {delete options.dataUrl; delete options.value;} catch (e){}
  324. var a;
  325. if(typeof(options.buildSelect) != "undefined") {
  326. var b = options.buildSelect(data);
  327. a = jQuery(b).html();
  328. delete options.buildSelect;
  329. } else {
  330. a = jQuery(data).html();
  331. }
  332. if(a) {
  333. jQuery(elem).append(a);
  334. options = bindEv(elem,options);
  335. if(typeof options.size === 'undefined') { options.size = msl ? 3 : 1;}
  336. if(msl) {
  337. ovm = vl.split(",");
  338. ovm = jQuery.map(ovm,function(n){return jQuery.trim(n);});
  339. } else {
  340. ovm[0] = jQuery.trim(vl);
  341. }
  342. jQuery(elem).attr(options);
  343. setTimeout(function(){
  344. jQuery("option",elem).each(function(i){
  345. if(i===0) { this.selected = ""; }
  346. $(this).attr("role","option");
  347. if(jQuery.inArray(jQuery.trim(jQuery(this).text()),ovm) > -1 || jQuery.inArray(jQuery.trim(jQuery(this).val()),ovm) > -1 ) {
  348. this.selected= "selected";
  349. if(!msl) { return false; }
  350. }
  351. });
  352. },0);
  353. }
  354. }
  355. },ajaxso || {}));
  356. } else if(options.value) {
  357. var i;
  358. if(msl) {
  359. ovm = vl.split(",");
  360. ovm = jQuery.map(ovm,function(n){return jQuery.trim(n);});
  361. if(typeof options.size === 'undefined') {options.size = 3;}
  362. } else {
  363. options.size = 1;
  364. }
  365. if(typeof options.value === 'function') { options.value = options.value(); }
  366. var so,sv, ov;
  367. if(typeof options.value === 'string') {
  368. so = options.value.split(";");
  369. for(i=0; i<so.length;i++){
  370. sv = so[i].split(":");
  371. if(sv.length > 2 ) {
  372. sv[1] = jQuery.map(sv,function(n,i){if(i>0) { return n;} }).join(":");
  373. }
  374. ov = document.createElement("option");
  375. ov.setAttribute("role","option");
  376. ov.value = sv[0]; ov.innerHTML = sv[1];
  377. if (!msl && (jQuery.trim(sv[0]) == jQuery.trim(vl) || jQuery.trim(sv[1]) == jQuery.trim(vl))) { ov.selected ="selected"; }
  378. if (msl && (jQuery.inArray(jQuery.trim(sv[1]), ovm)>-1 || jQuery.inArray(jQuery.trim(sv[0]), ovm)>-1)) {ov.selected ="selected";}
  379. elem.appendChild(ov);
  380. }
  381. } else if (typeof options.value === 'object') {
  382. var oSv = options.value;
  383. for ( var key in oSv) {
  384. if (oSv.hasOwnProperty(key ) ){
  385. ov = document.createElement("option");
  386. ov.setAttribute("role","option");
  387. ov.value = key; ov.innerHTML = oSv[key];
  388. if (!msl && ( jQuery.trim(key) == jQuery.trim(vl) || jQuery.trim(oSv[key]) == jQuery.trim(vl)) ) { ov.selected ="selected"; }
  389. if (msl && (jQuery.inArray(jQuery.trim(oSv[key]),ovm)>-1 || jQuery.inArray(jQuery.trim(key),ovm)>-1)) { ov.selected ="selected"; }
  390. elem.appendChild(ov);
  391. }
  392. }
  393. }
  394. options = bindEv(elem,options);
  395. try {delete options.value;} catch (e){}
  396. jQuery(elem).attr(options);
  397. }
  398. break;
  399. case "text" :
  400. case "password" :
  401. case "button" :
  402. var role;
  403. if(eltype=="button") { role = "button"; }
  404. else { role = "textbox"; }
  405. elem = document.createElement("input");
  406. elem.type = eltype;
  407. elem.value = vl;
  408. options = bindEv(elem,options);
  409. if(eltype != "button"){
  410. if(autowidth) {
  411. if(!options.size) { jQuery(elem).css({width:"98%"}); }
  412. } else if (!options.size) { options.size = 20; }
  413. }
  414. jQuery(elem).attr(options).attr("role",role);
  415. break;
  416. case "image" :
  417. case "file" :
  418. elem = document.createElement("input");
  419. elem.type = eltype;
  420. options = bindEv(elem,options);
  421. jQuery(elem).attr(options);
  422. break;
  423. case "custom" :
  424. elem = document.createElement("span");
  425. try {
  426. if(jQuery.isFunction(options.custom_element)) {
  427. var celm = options.custom_element.call(this,vl,options);
  428. if(celm) {
  429. celm = jQuery(celm).addClass("customelement").attr({id:options.id,name:options.name});
  430. jQuery(elem).empty().append(celm);
  431. } else {
  432. throw "e2";
  433. }
  434. } else {
  435. throw "e1";
  436. }
  437. } catch (e) {
  438. if (e=="e1") { info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_element' "+jQuery.jgrid.edit.msg.nodefined, jQuery.jgrid.edit.bClose);}
  439. if (e=="e2") { info_dialog(jQuery.jgrid.errors.errcap,"function 'custom_element' "+jQuery.jgrid.edit.msg.novalue,jQuery.jgrid.edit.bClose);}
  440. else { info_dialog(jQuery.jgrid.errors.errcap,typeof(e)==="string"?e:e.message,jQuery.jgrid.edit.bClose); }
  441. }
  442. break;
  443. }
  444. return elem;
  445. }
  446. // Date Validation Javascript
  447. function daysInFebruary (year){
  448. // February has 29 days in any year evenly divisible by four,
  449. // EXCEPT for centurial years which are not also divisible by 400.
  450. return (((year % 4 === 0) && ( year % 100 !== 0 || (year % 400 === 0))) ? 29 : 28 );
  451. }
  452. function DaysArray(n) {
  453. for (var i = 1; i <= n; i++) {
  454. this[i] = 31;
  455. if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;}
  456. if (i==2) {this[i] = 29;}
  457. }
  458. return this;
  459. }
  460. function checkDate (format, date) {
  461. var tsp = {}, sep;
  462. format = format.toLowerCase();
  463. //we search for /,-,. for the date separator
  464. if(format.indexOf("/") != -1) {
  465. sep = "/";
  466. } else if(format.indexOf("-") != -1) {
  467. sep = "-";
  468. } else if(format.indexOf(".") != -1) {
  469. sep = ".";
  470. } else {
  471. sep = "/";
  472. }
  473. format = format.split(sep);
  474. date = date.split(sep);
  475. if (date.length != 3) { return false; }
  476. var j=-1,yln, dln=-1, mln=-1;
  477. for(var i=0;i<format.length;i++){
  478. var dv = isNaN(date[i]) ? 0 : parseInt(date[i],10);
  479. tsp[format[i]] = dv;
  480. yln = format[i];
  481. if(yln.indexOf("y") != -1) { j=i; }
  482. if(yln.indexOf("m") != -1) { mln=i; }
  483. if(yln.indexOf("d") != -1) { dln=i; }
  484. }
  485. if (format[j] == "y" || format[j] == "yyyy") {
  486. yln=4;
  487. } else if(format[j] =="yy"){
  488. yln = 2;
  489. } else {
  490. yln = -1;
  491. }
  492. var daysInMonth = DaysArray(12);
  493. var strDate;
  494. if (j === -1) {
  495. return false;
  496. } else {
  497. strDate = tsp[format[j]].toString();
  498. if(yln == 2 && strDate.length == 1) {yln = 1;}
  499. if (strDate.length != yln || (tsp[format[j]]===0 && date[j]!="00")){
  500. return false;
  501. }
  502. }
  503. if(mln === -1) {
  504. return false;
  505. } else {
  506. strDate = tsp[format[mln]].toString();
  507. if (strDate.length<1 || tsp[format[mln]]<1 || tsp[format[mln]]>12){
  508. return false;
  509. }
  510. }
  511. if(dln === -1) {
  512. return false;
  513. } else {
  514. strDate = tsp[format[dln]].toString();
  515. if (strDate.length<1 || tsp[format[dln]]<1 || tsp[format[dln]]>31 || (tsp[format[mln]]==2 && tsp[format[dln]]>daysInFebruary(tsp[format[j]])) || tsp[format[dln]] > daysInMonth[tsp[format[mln]]]){
  516. return false;
  517. }
  518. }
  519. return true;
  520. }
  521. function isEmpty(val)
  522. {
  523. if (val.match(/^\s+$/) || val == "") {
  524. return true;
  525. } else {
  526. return false;
  527. }
  528. }
  529. function checkTime(time){
  530. // checks only hh:ss (and optional am/pm)
  531. var re = /^(\d{1,2}):(\d{2})([ap]m)?$/,regs;
  532. if(!isEmpty(time))
  533. {
  534. regs = time.match(re);
  535. if(regs) {
  536. if(regs[3]) {
  537. if(regs[1] < 1 || regs[1] > 12) { return false; }
  538. } else {
  539. if(regs[1] > 23) { return false; }
  540. }
  541. if(regs[2] > 59) {
  542. return false;
  543. }
  544. } else {
  545. return false;
  546. }
  547. }
  548. return true;
  549. }
  550. function checkValues(val, valref,g) {
  551. var edtrul,i, nm, dft;
  552. if(typeof(valref)=='string'){
  553. for( i =0, len=g.p.colModel.length;i<len; i++){
  554. if(g.p.colModel[i].name==valref) {
  555. edtrul = g.p.colModel[i].editrules;
  556. valref = i;
  557. try { nm = g.p.colModel[i].formoptions.label; } catch (e) {}
  558. break;
  559. }
  560. }
  561. } else if(valref >=0) {
  562. edtrul = g.p.colModel[valref].editrules;
  563. }
  564. if(edtrul) {
  565. if(!nm) { nm = g.p.colNames[valref]; }
  566. if(edtrul.required === true) {
  567. if( isEmpty(val) ) { return [false,nm+": "+jQuery.jgrid.edit.msg.required,""]; }
  568. }
  569. // force required
  570. var rqfield = edtrul.required === false ? false : true;
  571. if(edtrul.number === true) {
  572. if( !(rqfield === false && isEmpty(val)) ) {
  573. if(isNaN(val)) { return [false,nm+": "+jQuery.jgrid.edit.msg.number,""]; }
  574. }
  575. }
  576. if(typeof edtrul.minValue != 'undefined' && !isNaN(edtrul.minValue)) {
  577. if (parseFloat(val) < parseFloat(edtrul.minValue) ) { return [false,nm+": "+jQuery.jgrid.edit.msg.minValue+" "+edtrul.minValue,""];}
  578. }
  579. if(typeof edtrul.maxValue != 'undefined' && !isNaN(edtrul.maxValue)) {
  580. if (parseFloat(val) > parseFloat(edtrul.maxValue) ) { return [false,nm+": "+jQuery.jgrid.edit.msg.maxValue+" "+edtrul.maxValue,""];}
  581. }
  582. var filter;
  583. if(edtrul.email === true) {
  584. if( !(rqfield === false && isEmpty(val)) ) {
  585. // taken from jquery Validate plugin
  586. filter = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
  587. if(!filter.test(val)) {return [false,nm+": "+jQuery.jgrid.edit.msg.email,""];}
  588. }
  589. }
  590. if(edtrul.integer === true) {
  591. if( !(rqfield === false && isEmpty(val)) ) {
  592. if(isNaN(val)) { return [false,nm+": "+jQuery.jgrid.edit.msg.integer,""]; }
  593. if ((val % 1 !== 0) || (val.indexOf('.') != -1)) { return [false,nm+": "+jQuery.jgrid.edit.msg.integer,""];}
  594. }
  595. }
  596. if(edtrul.date === true) {
  597. if( !(rqfield === false && isEmpty(val)) ) {
  598. if(g.p.colModel[valref].formatoptions && g.p.colModel[valref].formatoptions.newformat) {
  599. dft = g.p.colModel[valref].formatoptions.newformat;
  600. } else {
  601. dft = g.p.colModel[valref].datefmt || "Y-m-d";
  602. }
  603. if(!checkDate (dft, val)) { return [false,nm+": "+jQuery.jgrid.edit.msg.date+" - "+dft,""]; }
  604. }
  605. }
  606. if(edtrul.time === true) {
  607. if( !(rqfield === false && isEmpty(val)) ) {
  608. if(!checkTime (val)) { return [false,nm+": "+jQuery.jgrid.edit.msg.date+" - hh:mm (am/pm)",""]; }
  609. }
  610. }
  611. if(edtrul.url === true) {
  612. if( !(rqfield === false && isEmpty(val)) ) {
  613. filter = /^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
  614. if(!filter.test(val)) {return [false,nm+": "+jQuery.jgrid.edit.msg.url,""];}
  615. }
  616. }
  617. if(edtrul.custom === true) {
  618. if( !(rqfield === false && isEmpty(val)) ) {
  619. if(jQuery.isFunction(edtrul.custom_func)) {
  620. var ret = edtrul.custom_func.call(g,val,nm);
  621. if(jQuery.isArray(ret)) {
  622. return ret;
  623. } else {
  624. return [false,jQuery.jgrid.edit.msg.customarray,""];
  625. }
  626. } else {
  627. return [false,jQuery.jgrid.edit.msg.customfcheck,""];
  628. }
  629. }
  630. }
  631. }
  632. return [true,"",""];
  633. }