PageSourceSearch

https://www.merimen.com.my/services/scripts/unencoded/SVCmain10108-mvs.js

js merimen.com.my collected 2026-10-06 11:03:51 UTC 484,616 bytes, 12,014 lines download raw bytes

1// COPYRIGHT NOTICE
2// ----------------
3// Copyright (c) 2000-2004. All rights reserved.
4//
5// Any unauthorised copying, reproduction or publishing in any form
6// or manner whatsoever, of either a part of or this entire script,
7// is strictly prohibited and will constitute an infringement of this
8// copyright.
9
10/*-------------------- INTERNATIONALIZATION - NUMERIC --------------------*/
11var jSVClocid=1;
12var jSVCnumformat;
13var jSVCdtformat="dd/mm/yyyy";
14var jSVCtmformat="HH:mm";
15var jSVCloctmz;
16//var jSVCapptmz=8; // assume our DB server GMT+8!
17if(typeof(request)!=='undefined')
18	var jSVCapptmz = ( request.apptmz ? request.apptmz : 8.0 ); // It is now configurable and retrieved from settoken.cfm
19else
20	var jSVCapptmz=8;
21var jSVClgid=0; // current language ID
22var svcmain_vars = {};
23var jSVCCanvas = JSVCCanvasSupported();
24
25/* Lisa note : only affects non ie browsers. */
26// mozXPath [http://km0ti0n.blunted.co.uk/mozxpath/] [email protected]
27// Code licensed under Creative Commons Attribution-ShareAlike License
28// http://creativecommons.org/licenses/by-sa/2.5/
29if( document.implementation.hasFeature("XPath", "3.0") ){
30	if( typeof XMLDocument == "undefined" ){ XMLDocument = Document; }
31  XMLDocument.prototype.selectNodes = function(cXPathString, xNode){
32    if( !xNode ) { xNode = this; }
33		var oNSResolver = this.createNSResolver(this.documentElement)
34		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
35		var aResult = [];
36		for( var i = 0; i < aItems.snapshotLength; i++){aResult[i] =  aItems.snapshotItem(i);	}
37		return aResult;
38	}
39	XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode){
40		if( !xNode ) { xNode = this; }
41		var xItems = this.selectNodes(cXPathString, xNode);
42		if( xItems.length > 0 ){return xItems[0];	}
43		else{return null;	}
44	}
45	Element.prototype.selectNodes = function(cXPathString){
46		if(this.ownerDocument.selectNodes){	return this.ownerDocument.selectNodes(cXPathString, this);}
47		else{throw "For XML Elements Only";}
48	}
49	Element.prototype.selectSingleNode = function(cXPathString){
50		if(this.ownerDocument.selectSingleNode){return this.ownerDocument.selectSingleNode(cXPathString, this);	}
51		else{throw "For XML Elements Only";}
52	}
53}
54else {
55	if( typeof XMLDocument != "undefined" ) //{ XMLDocument = new ActiveXObject("Msxml2.DOMDocument").prototype; }
56	{
57		XMLDocument.prototype.selectNodes = function(cXPathString, xNode){
58			if( !xNode ) { xNode = this; }
59			var pathNodes = cXPathString.split('/');
60			var tmpNode = xNode;
61			var tmpNodes = [];
62			for (var x = 0; x < pathNodes.length; x ++) {
63				tmpNodes = tmpNode.getElementsByTagName(pathNodes[x]);
64				if (x != pathNodes.length - 1) tmpNode = tmpNodes[0];
65			}
66			return tmpNodes;
67		}
68		XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode){
69			if( !xNode ) { xNode = this; }
70			var xItems = this.selectNodes(cXPathString, xNode);
71			if( xItems.length > 0 ){return xItems[0];	}
72			else{return null;	}
73		}
74
75		Element.prototype.selectNodes = function(cXPathString){
76			if(this.ownerDocument.selectNodes){	return this.ownerDocument.selectNodes(cXPathString, this);}
77			else{throw "For XML Elements Only";}
78		}
79		Element.prototype.selectSingleNode = function(cXPathString){
80			if(this.ownerDocument.selectSingleNode){return this.ownerDocument.selectSingleNode(cXPathString, this);	}
81			else{throw "For XML Elements Only";}
82		}
83	}
84}
85
86function JSVCSetLocale(locid,numformat,dtformat,tmformat,loctmz)
87{
88	if(locid!=null)
89		jSVClocid=locid;
90	if(numformat!=null)
91		jSVCnumformat=numformat;
92	if(dtformat==null)
93	{	if(locid==10)
94			jSVCdtformat="mm/dd/yyyy";
95	}
96	else
97		jSVCdtformat=dtformat;
98	if(tmformat!=null)
99		jSVCtmformat=tmformat;
100	if(loctmz!=null)
101		jSVCloctmz=loctmz;
102}
103function JSVCGetNumFormat(locid)
104{
105	var arr;
106	var RE;
107	var strnodec;
108	var tmp, tmp2, strsep;
109	var dpsym, strdp;
110
111	if(jSVCnumformat!=null)
112		return jSVCnumformat;
113	if(locid==null)
114		locid=jSVClocid;
115	switch(locid)
116	{
117		case 4:return ("-|.|2|,|2,3".split("|"));break;	// Indian numeric format
118//		default:return ("-|.|0|,|3".split("|"));	// Indonesian numeric format
119
120		//case 7:return ("-|.|0|,|3".split("|"));break;	// Indonesian numeric format
121		//default:return ("-|.|2|,|3".split("|"));	// Default numeric format
122		default:
123			if(request.CurrencyFormat != undefined)
124			{
125				tmp = (request.CurrencyFormat).match(/\D/gi);
126				RE = new RegExp('\\' + tmp[tmp.length - 1], "gi");
127				tmp2 = (request.CurrencyFormat).search(RE);
128				tmp = tmp.join('');
129				if(tmp.match(/^(\D)\1*[^\1]$/gi).length > 0)
130				{
131					if(tmp.charAt(0) != tmp.charAt(tmp.length - 1))
132					{
133                        dpsym = tmp.charAt(tmp.length - 1);
134                        strdp = request.CurrencyFormat;
135
136                        //remove 0 after decimal point to get true decimal point (.9900 -> .99)
137                        if( strdp.indexOf(dpsym) >= 0 )
138                            strdp = strdp.substring(0, strdp.indexOf(dpsym)) + dpsym + strdp.substring(strdp.indexOf(dpsym)+1, strdp.length).replace(/0/g,"");
139
140						arr = "-|" + tmp.charAt(tmp.length - 1) + "|" + (strdp.length - tmp2 - 1);
141
142                        // displayed decimal point
143                        ddp = request.CurrencyFormat.length - tmp2 - 1;
144					}
145					else
146					{
147						arr = "-|.|0";
148						ddp = "0";
149					}
150
151					if(tmp.length > 0)
152					{
153					    // building the 4th item in the array (separator symbol)
154						arr = arr + "|" + tmp.charAt(0);
155
156						// building the 5th item in the array (separator pattern)
157						if(tmp2 > 0 && tmp.charAt(0) != tmp.charAt(tmp.length - 1))
158							strnodec = (request.CurrencyFormat).substr(0, tmp2);
159						else
160							strnodec = request.CurrencyFormat;
161
162						strsep = "";
163						while (strnodec.length > 0)
164						{
165							if (strnodec.substring(0, strnodec.indexOf(tmp.charAt(0))).length != strnodec.substring(strnodec.lastIndexOf(tmp.charAt(0)) + 1).length)
166							{
167								strsep = "," + strnodec.substring(strnodec.lastIndexOf(tmp.charAt(0)) + 1).length.toString() + strsep;
168								strnodec = strnodec.substr(0, strnodec.lastIndexOf(tmp.charAt(0)));
169							}
170							else
171							{
172								strsep = strnodec.substring(0, strnodec.indexOf(tmp.charAt(0))).length.toString() + strsep;
173								strnodec = "";
174							}
175						}
176						arr = arr + "|" + strsep;
177					}
178					else
179						arr = arr + "|0|0";
180
181                    // build the 6th item in the array - displayed decimal places(HKTIX1)
182                    arr = arr + "|" + ddp;
183
184					arr = arr.split("|");
185				}
186				else
187					arr = "-|.|2|,|3|2".split("|");
188
189			}
190			else
191				arr = "-|.|2|,|3|2".split("|");	// Default numeric format
192
193			return arr;
194			break;
195	}
196	// Return array: Negative Symbol,Decimal Symbol,Default decimal-places for currency,Separator Symbol,Separator Pattern,displayed decimal places(HKTIX1)
197}
198function JSVCNumLOC(val,maxno,minno,decplace,decsymbol,separator,mode,currencyformat,roundup,roundthousand)
199{	// Mode: 0/null: If exceed, delete, 1: If breach, take min/max
200	var fl,obj,str;
201	if(typeof(val)=="object" && val){obj=val;val=val.value;}
202	if(minno==null)minno=0;
203	if(maxno==null){
204		if (currencyformat != null){
205			maxno=parseFloat(currencyformat.replace(/,/g, ''));
206		}
207		else{
208			maxno=9999999999999; // max 13 digits #25165 (Edwin)
209		}
210	}
211	if(isNaN(maxno))
212		try {maxno=eval(maxno)} catch(e) {};
213	if(isNaN(minno))
214		try {minno=eval(minno)} catch(e) {};
215	if(maxno<minno){fl=minno;minno=maxno;maxno=fl;}
216	if(val==null)val="";
217	fl=JSVCNumLOCtoDB(val,decsymbol,separator,1);
218	// Perform Rounding
219	if(fl!=null&&val!=""&&mode==1)
220		if(fl<minno)fl=minno
221		else if(fl>maxno)fl=maxno;
222	if(fl==null || fl<minno || fl>maxno)
223		str=""
224	else
225		str=JSVCNumDBtoLOC(fl,decplace,decsymbol,separator,currencyformat,roundup,roundthousand);
226	if(obj!=null){obj.value=str;DoReq(obj);}
227	return str;
228}
229function JSVCNumYear(val,maxno,minno)
230{
231	var obj,val2;
232	if(typeof(val)=="object")
233	{	obj=val;
234		val=val.value;
235	}
236	val=parseInt(val);
237	if(val<40 && val>=0)
238		val=val+2000
239	else if(val>=40 && val<100)
240		val=val+1900;
241	if(val>0)
242	{	if(minno==null)minno=1920;
243		if(maxno==null)maxno=2100;
244		if(maxno<minno){val2=minno;minno=maxno;maxno=val2;}
245		if(val<minno || val>maxno)
246			val=0;
247	}
248	if(val>0)
249	{	if(obj!=null){obj.value=val.toString();DoReq(obj);}
250		return val;
251	} else
252	{ if(obj!=null){obj.value="";DoReq(obj);}
253		return null;
254	}
255}
256function JSVCNum(fl,decplace,decsymbol,separator)
257{
258	return JSVCNumDBtoLOC(fl,decplace,decsymbol,separator);
259}
260//KY : Currency format for handling multiple currency in one page
261function JSVCNumDBtoLOC(fl,decplace,decsymbol,separator,currencyformat,roundup,roundthousand)
262{
263	var neg,intstr,prefix,postfix,valstd,nformat,curspace,sepspace,decfixed;
264	neg="";
265	if(fl==null)
266			return ""
267	else
268	{
269		if(typeof(fl)!="number")
270			fl=parseFloat(fl);
271		if(isNaN(fl))
272			return "";
273	}
274	//replace the currency format with the passed in one
275	if(currencyformat!=null){
276		var currformat=request.CurrencyFormat;
277		request.CurrencyFormat=currencyformat;
278		jSVCnumformat=null;
279	}
280	nformat=JSVCGetNumFormat();
281	if(decplace==null)
282		decplace=nformat[2];
283	else
284		decfixed=decplace;
285
286	// Handle decimals
287	if(decplace>0)
288	{
289		if (roundup==1)
290			fl=Math.ceil(parseFloat(fl*Math.pow(10,decplace)).toFixed(decplace))/Math.pow(10,decplace);
291		else
292			fl=Math.round(parseFloat(fl*Math.pow(10,decplace)).toFixed(decplace))/Math.pow(10,decplace);
293		if (roundthousand==1)
294			fl=Math.ceil(fl/1000)*1000;
295		if(fl<0)
296		{
297			fl=-fl;
298			neg="-";
299		}
300		if (fl.toString().indexOf("e")>=0)
301			fl = expToStr(fl);
302		valstd=fl.toString().split(".");
303		if(valstd.length==1)
304			valstd[1]="";
305		while((valstd[1].length)<decplace)
306			valstd[1]=valstd[1]+"0";
307		if(decsymbol==null)
308			decsymbol=nformat[1];
309		postfix=decsymbol+valstd[1];
310		intstr=valstd[0];
311        if(nformat.length >= 6 && nformat[5] > 0 && decfixed == null)
312        {
313            postfixlendiff = nformat[5] - (postfix.length - nformat[1].length);
314            postfix = postfix + (postfixlendiff>0? JSVCRepeatStr("0",postfixlendiff)  : "");
315        }
316	} else
317	{
318		if (roundup==1)
319			fl=Math.ceil(fl);
320		else
321			fl=Math.round(fl);
322		if (roundthousand==1)
323			fl=Math.ceil(fl/1000)*1000;
324		if(fl<0)
325		{
326			fl=-fl;
327			neg="-";
328		}
329		intstr=fl.toString();
330		postfix="";
331        if(nformat.length >= 6 && nformat[5] > 0 && decfixed == null)
332            postfix = nformat[1] + JSVCRepeatStr("0",nformat[5]);
333	}
334	// Add separators
335	if(separator==null)
336		separator=nformat[3];
337	if (separator.length > 0 && nformat[4]!=null) {
338		nformat[4]=nformat[4].toString();
339		prefix = "";
340		sepspace = nformat[4].split(",");
341		curspace = sepspace.pop();
342		while (intstr.length > 0) {
343			if (intstr.length > curspace) {
344				prefix = separator + intstr.slice(intstr.length - curspace) + prefix;
345				intstr = intstr.substring(0, intstr.length - curspace);
346				if (sepspace.length > 0)
347					curspace = sepspace.pop();
348			}
349			else {
350				prefix = intstr + prefix;
351				intstr = "";
352			}
353		}
354	}
355	else {
356		prefix = intstr;
357	}
358	//repopulate the original currency format
359	if(currencyformat!=null){
360		request.CurrencyFormat=currformat;
361		jSVCnumformat=null;
362		JSVCGetNumFormat();
363	}
364	return neg+prefix+postfix;
365}
366function JSVCNumLOCtoDB(val,decsymbol,separator,returnblank)
367{
368	var nformat,fl;
369
370	if(val==null || (val=="" && typeof val == 'string'))
371		return ((returnblank>0)?null:new Number(0));
372	nformat=JSVCGetNumFormat();
373	if(separator==null)
374		separator=nformat[3];
375	val=val.toString();
376	if(separator!="")
377		while(val.indexOf(separator)>=0)
378			val=val.replace(separator,"");
379	if(decsymbol==null)
380		decsymbol=nformat[1];
381	if(decsymbol!=".")
382		val=val.replace(decsymbol,".");
383	fl=parseFloat(val);
384	if(isNaN(fl))
385		return ((returnblank>0)?null:new Number(0));
386	return fl;
387}
388function JSVC2DP(val,maxno,minno)
389{
390	return JSVCNumLOC(val,maxno,minno,2);
391}
392function JSVC1DP(val,maxno,minno)
393{
394	return JSVCNumLOC(val,maxno,minno,1);
395}
396function JSVCInt(val,maxno,minno)
397{
398	return JSVCNumLOC(val,maxno,minno,0);
399}
400function JSVCCurr(val,maxno,minno,currencyformat,roundup,roundthousand,separator)
401{
402	return JSVCNumLOC(val,maxno,minno,null,null,separator,null,currencyformat,roundup,roundthousand);
403}
404function expToStr(exp) {
405	var arr = new Array(),exponent,precision=0;
406	arr = exp.toString().split('e');
407	if(arr.length==2) {
408		exponent = Math.abs(arr[1]);
409		precision = new Number(exponent);
410		arr = arr[0].split('.');
411		if(arr.length==2)
412			precision += arr[1].length;
413		return exp.toFixed(precision);
414	} else
415		return exp.toString();
416}
417function ObjText(obj)
418{
419	var maxchar=obj.getAttribute("MAXCHAR");
420	if(maxchar!=null && maxchar!="")
421	{
422		maxchar=parseInt(maxchar);
423		if (obj.value.length>maxchar)
424		{
425			var varname=JSVCVarNameSet("varitem",obj,true);
426			SVCalert(JSVClang("You have entered a total of "+"{0}"+" characters, which is greater than the maximum allowed ("+"{1}"+" characters). Please shorten your description/comment.",5004,0,obj.value.length,maxchar),null,null,"JSVCDoFocus(JSVCVarNameGet(\""+varname+"\"));");
427		}
428	}
429	DoReq(obj);
430}
431function JSVCDOBDate(yr,eoy,dtformat,base,day) {
432	var dt = new Date(), baseyr = sysdt.getFullYear(), baseobj, basemonth = sysdt.getMonth(), baseday = sysdt.getDate(), tmpdt;
433	if(base!=null)
434	{
435		baseobj = document.getElementById(base);
436		if(baseobj && baseobj.value != "")
437		{
438			tmpdt=CalParseDate(baseobj.value,dtformat);
439			baseyr=tmpdt.getFullYear();
440			basemonth=tmpdt.getMonth();
441			baseday=tmpdt.getDate();
442		}
443	}
444	if(dtformat=="" || dtformat==null)
445		dtformat=jSVCdtformat;
446	if (yr==null) return "";
447	if (eoy==null) eay=0;
448	if (day==null) day=0;
449	if (eoy==0)
450		return new Date(baseyr-yr, 0, 1);
451	else if (eoy==-1)
452		return new Date(baseyr-yr, basemonth, baseday-day);
453	else
454		return new Date(baseyr-yr, 11, 31);
455}
456/*-------------------- INTERNATIONALIZATION - DATES and CALENDAR --------------------*/
457function JSVCdtDBtoLOC(db,locid,dtformat,tmformat,shiftsecs) {
458	if(db==null||db=="")
459		return "";
460	if(db.constructor==String) {
461		var dt;
462		dt=new Date(db); // 1) parsing as client PC's locale format?
463		if(isNaN(dt)) {
464			dt=new Date();
465			dt.setISO8601(db); // 2) parsing as ISO standard format
466		}
467		db=dt;
468	}
469	if(db.constructor!=Date)
470		return "";
471	if(locid==null)
472		locid=jSVClocid;
473	if(dtformat==null)
474		dtformat=jSVCdtformat;
475	if(tmformat==null)
476		tmformat="";
477	if(tmformat==""&&dtformat=="")
478		return "";
479	if(shiftsecs==null)
480		shiftsecs=(jSVCloctmz-jSVCapptmz)*60*60;
481	else
482		shiftsecs=(jSVCloctmz-jSVCapptmz)*60*60+shiftsecs;
483	if(shiftsecs!=0)
484		db=db.add("s",shiftsecs);
485	if(tmformat=="") {
486		return db.DateFormat(dtformat);
487	}
488	else {
489		if(dtformat=="")
490			return db.TimeFormat(tmformat);
491		else
492			return db.DateFormat(dtformat) + " " + db.TimeFormat(tmformat);
493	}
494}
495function ObjTime12(obj) {
496    var result = false, m;
497    var re = /^\s*([0]?\d|1[0-2]):?([0-5]\d)?\s*$/; /* from 0:00 til 23:59 */
498    var re12 = /^\s*(12):?([0-5]\d)?\s*$/; /* 12:00 will be converted to 00:00 */
499    if(obj!=null && obj.value!='') {
500	    if((m = obj.value.match(re12))) {
501	        result = (m[1].length == 2 ? "" : "0") + "00:" + (m[2] || "00");
502	        obj.value=result;
503	    }
504    	else if ((m = obj.value.match(re))) {
505			result = (m[1].length == 2 ? "" : "0") + m[1] + ":" + (m[2] || "00");
506	        obj.value=result;
507	    }
508		else {
509			obj.value='';
510			//alert(JSVClang("Please use the 24-hour clock format (HH:MM).",25733));
511		}
512    }
513    try { DoReq(obj); } catch(e) {}
514}
515function ObjTime24(obj) {
516    var result = false, m;
517    var re = /^\s*([01]?\d|2[0-3])[:|\.]?([0-5]\d)?\s*$/; /* from 0:00 til 23:59 *//*Sue 14/11/2018 #27299 : can accept . or : as delimiter*/
518    var re24 = /^\s*(24)[:|\.]?([0-5]\d)?\s*$/; /* 24:00 will be converted to 00:00 */
519    if(obj!=null && obj.value!='') {
520    	if ((m = obj.value.match(re))) {
521			result = (m[1].length == 2 ? "" : "0") + m[1] + ":" + (m[2] || "00");
522	        obj.value=result;
523	    }
524	    else if((m = obj.value.match(re24))) {
525	        result = (m[1].length == 2 ? "" : "0") + "00:" + (m[2] || "00");
526	        obj.value=result;
527	    }
528		else {
529			obj.value='';
530			//alert(JSVClang("Please use the 24-hour clock format (HH:MM).",25733));
531		}
532    }
533    try { DoReq(obj); } catch(e) {}
534	return (obj!=null&&obj.value!=''?obj.value:null);
535}
536function ObjDate(obj,doNotPrompt)
537{
538	var dtformat,dt,dtmin,dtmax,sid;
539	dtformat=obj.getAttribute("DTFORMAT");
540	if(dtformat=="" || dtformat==null)
541		dtformat=jSVCdtformat;
542	if(doNotPrompt==null)
543		doNotPrompt=obj.getAttribute("DTNOTPROMPT");
544	dt=CalParseDate(obj.value,dtformat);
545	if(dt!=null)
546		if(CalCheckRange(obj,dt,dtformat,doNotPrompt)!=null)
547			dt=null;
548	obj.value=(dt==null?"":CalConstructDate(dt.getDate(),dt.getMonth(),dt.getFullYear(),dtformat));
549	if(obj.getAttribute("MRMOBJ")&&obj.getAttribute("MRMOBJ")=="CALDATE_BUD"){
550		sid=obj.name;
551		if(sid==null || sid=="")
552			sid=obj.id;
553		if(sid!=null && sid!="" && document.getElementById(sid+"_buddhist")){
554			CalConvertBuddhist(obj,document.getElementById(sid+"_buddhist"),1);
555		}
556	}
557	try { DoReq(obj); } catch(e) {}
558	return dt;
559}
560function CalConstructFromDate(dt,dtformat)
561{
562	if(dtformat=="" || dtformat==null)
563		dtformat=jSVCdtformat;
564	return CalConstructDate(dt.getDate(),dt.getMonth(),dt.getFullYear(),dtformat,dt.getHours(),dt.getMinutes(),dt.getSeconds());
565}
566function CalConstructDate(d,m,y,sTmp,hr,mi,sc)
567{
568	var	mthName =	new	Array(JSVClang("January",1681),JSVClang("February",1682),JSVClang("March",1683),JSVClang("April",1684),JSVClang("May",1685),JSVClang("June",1686),JSVClang("July",1687),JSVClang("August",1688),JSVClang("September",1689),JSVClang("October",1690),JSVClang("November",1691),JSVClang("December",1692));
569	sTmp = sTmp.replace	("dd","<e>");
570	sTmp = sTmp.replace	("d","<d>");
571	sTmp = sTmp.replace	("<e>",(d<10)? '0'+d :d);
572	sTmp = sTmp.replace	("<d>",d);
573	sTmp = sTmp.replace	("mmm","<o>");
574	sTmp = sTmp.replace	("mm","<n>");
575	sTmp = sTmp.replace	("m","<m>");
576	sTmp = sTmp.replace	("<m>", (m+1));
577	sTmp = sTmp.replace	("<n>", ((m+1)<10)? '0'+(m+1) :(m+1));
578	sTmp = sTmp.replace	("<o>",mthName[m]);
579	if(hr!="") sTmp = sTmp.replace("hh",(hr<10?'0':"")+hr);
580	if(mi!="") sTmp = sTmp.replace("nn",(mi<10?'0':"")+mi);
581	if(sc!="") sTmp = sTmp.replace("ss",(sc<10?'0':"")+sc);
582	return sTmp.replace ("yyyy",y)
583}
584function CalCheckRange(obj,dt,dtformat,doNotPrompt)
585{
586	var dtmin=obj.getAttribute("DTMIN");
587	var dtminmsg=obj.getAttribute("DTMINMSG");
588	var custommsg=obj.getAttribute("CUSTOMMSG"); //#45459 add parameter 'custommsg'
589	var s;
590	if(dtmin!=null)
591	{
592		// Check minimum
593		if((typeof(dtmin))=="string")
594		{
595			if(dtmin.substring(0,3)!="FN:")
596			{
597				dtmin=CalParseDate(dtmin,dtformat);
598				obj.setAttribute("DTMIN",dtmin);
599			}
600			else
601			{
602				dtmin=eval(dtmin.substring(3,dtmin.length));
603				dtmin=CalParseDate(dtmin.toString(),dtformat);
604			}
605		}
606		if(dtmin!=null && dt<dtmin)
607		{
608			if(!(doNotPrompt>0)){
609				if(custommsg!=null) { //#45459 add checking parameter 'custommsg'
610					var s=JSVClang(custommsg,0)+" ("+CalConstructDate(dtmin.getDate(),dtmin.getMonth(),dtmin.getFullYear(),dtformat)+")";
611				} else {
612					var s=JSVClang("Minimum date allowed is ",5013)+CalConstructDate(dtmin.getDate(),dtmin.getMonth(),dtmin.getFullYear(),dtformat)+".";
613				}
614				if (dtminmsg!=null)
615					s+=dtminmsg;
616				alert(s);
617				//alert(JSVClang("Minimum date allowed is ",5013)+CalConstructDate(dtmin.getDate(),dtmin.getMonth(),dtmin.getFullYear(),dtformat)+".");
618			}
619			return dtmin;
620		}
621	}
622	dtmax=obj.getAttribute("DTMAX");
623	dtmaxmsg=obj.getAttribute("DTMAXMSG");
624	if(dtmax!=null)
625	{
626		if((typeof(dtmax))=="string")
627		{
628			if(dtmax.substring(0,3)!="FN:")
629			{
630				dtmax=CalParseDate(dtmax,dtformat);
631				obj.setAttribute("DTMAX",dtmax);
632			}
633			else
634			{
635				dtmax=eval(dtmax.substring(3,dtmax.length));
636				dtmax=CalParseDate(dtmax.toString(),dtformat);
637			}
638		}
639		if(dtmax!=null && dt>dtmax)
640		{
641			if(!(doNotPrompt>0)){
642				var s=JSVClang("Maximum date allowed is ",5014)+CalConstructDate(dtmax.getDate(),dtmax.getMonth(),dtmax.getFullYear(),dtformat)+".";
643				if (dtmaxmsg!=null)
644					s+=dtmaxmsg;
645				alert(s);
646			}
647			return dtmax;
648		}
649	}
650	return null;
651}
652function CalParseDateTime(val,valt,dtformat)
653{
654	var dt,pos,dofs,tm,tm_hr,tm_min,tm_sec;
655	if(dtformat=="" || dtformat==null)
656		dtformat=jSVCdtformat;
657	if(valt!=null&&valt!='') {
658		tm=valt.split(":");
659		if(tm.length>=1) tm_hr=tm[0];
660		if(tm.length>=2) tm_min=tm[1];
661		if(tm.length>=3) tm_sec=tm[2];
662	}
663
664	pos=val.indexOf("{");
665	if(pos>0)
666	{
667		dofs=parseInt(val.slice(pos+1));
668		val=val.substring(0,pos);
669	}
670	if(val.toUpperCase()=="TODAY")
671		dt=new Date(sysdt.getFullYear(),sysdt.getMonth(),sysdt.getDate())
672	else
673	{
674		if(dtformat.substring(0,5)=="dd/mm") {
675			dt=new Date(CalFlipDateMonth(val)+(valt!='' && parseInt(tm_hr)>=0 && parseInt(tm_min)>=0?' '+tm_hr+':'+tm_min+':'+(tm_sec!=null&&tm_sec!=''?tm_sec:'00'):''));
676		} else
677			dt=new Date(val+(valt!='' && parseInt(tm_hr)>=0 && parseInt(tm_min)>=0?' '+tm_hr+':'+tm_min+':'+(tm_sec!=null&&tm_sec!=''?tm_sec:'00'):''));
678	}
679	// Parsed correctly?
680	if(dt==null || isNaN(dt))
681		return null;
682	// If 2-digit year then default to 19/20th century
683	curyear=dt.getFullYear();
684	if(curyear<1900 || curyear>2999)
685		return null;
686	if(curyear>=1900 && curyear<1970 && (val.indexOf(curyear))<0)
687		dt.setFullYear(curyear+100);
688	if(!isNaN(dofs) && (dofs>0 || dofs<0))
689		return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate() + dofs);
690	return dt;
691}
692function CalParseDate(val,dtformat)
693{
694	var dt,pos,dofs,val=val.toString();
695	if(dtformat=="" || dtformat==null)
696		dtformat=jSVCdtformat;
697	pos=val.indexOf("{");
698	if(pos>0)
699	{
700		dofs=parseInt(val.slice(pos+1));
701		val=val.substring(0,pos);
702	}
703	if(val.toUpperCase()=="TODAY")
704		dt=new Date(sysdt.getFullYear(),sysdt.getMonth(),sysdt.getDate())
705	else
706	{
707		if(dtformat.substring(0,5)=="dd/mm")
708			dt=new Date(CalFlipDateMonth(val))
709		else
710			dt=new Date(val);
711	}
712	// Parsed correctly?
713	if(dt==null || isNaN(dt))
714		return null;
715	// If 2-digit year then default to 19/20th century
716	curyear=dt.getFullYear();
717	if(curyear<1900 || curyear>2999)
718		return null;
719	if(curyear>=1900 && curyear<1970 && (val.indexOf(curyear))<0)
720		dt.setFullYear(curyear+100);
721	if(!isNaN(dofs) && (dofs>0 || dofs<0))
722		return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate() + dofs);
723	return dt;
724}
725//Flips the date and month portion of a datestring, 1/2/2003 becomes 2/1/2003, can specify separator
726function CalFlipDateMonth(dt,separator)
727{
728	var datearray,f,s;
729	dt=dt.replace(/[.-]/g,"/");
730	if(separator==null) separator = "/";
731	datearray = dt.split(separator);
732	f = datearray[0];
733	s = datearray[1];
734	datearray[0] = s;
735	datearray[1] = f;
736	dt = datearray.join(separator);
737	return dt;
738}
739/*-------------------- FORM PROCESSING --------------------*/
740function IsDisplayed(obj)
741{
742	while(obj!=null)
743	{
744		if(obj.style.display=="none" || obj.style.display=="NONE")
745			return false;
746		obj=obj.parentElement;
747	}
748	return true;
749}
750
751function FormObjVerify(obj,excRequired)
752{
753	//excRequired is added to verify everything  excluding CHKREQUIRED so the chkrequired wont bypassed other verification
754	if(excRequired!=1) excRequired=0;
755	var val,ver,ival,val2,extinfo;
756	val="";
757	// Obtain val for all sort of form objs
758	if((obj.type=="radio" || obj.type=="checkbox") && obj.name!="")
759	{
760		if (obj.hasAttribute('name2')) /*HW: obj.name need to be unique due to some reason, thus use name2 for chkrequired checking (SOMPOMED HK #27666)*/
761			var objlist=$("[name2="+obj.getAttribute('name2')+"]");
762		else
763			var objlist=document.getElementsByName(obj.name);
764		var len=objlist.length;
765		if(len!=null)
766		{
767			for(var t=0;t<len;t++)
768			{	if(objlist[t].checked==true)
769				{
770					val=Trim(objlist[t].value);
771					break;
772				}
773			}
774		} else
775			if(objlist.checked==true)
776				val=Trim(obj.value);
777	} else
778		val=Trim(obj.value);
779
780	if(excRequired==0){
781		// Check if CHKREQUIRED specified
782		ver=obj.getAttribute("CHKREQUIRED");
783		extinfo=obj.getAttribute("CHKREQUIREDINFO");
784		if(ver!=null)
785		{
786			if(ver!="")
787			{
788				// Dependency
789				try{
790					if(eval(ver)==true && val=="")
791						return JSVClang("should be specified.",5005)+(extinfo!=null&&extinfo!=''?'\n'+extinfo:'');
792				} catch(e){}
793			} else
794			{
795				try{
796				if(val=="")
797					return JSVClang("should be specified.",5005)+(extinfo!=null&&extinfo!=''?'\n'+extinfo:'');
798				} catch(e){}
799			}
800		}
801	}		
802	if(val=="")
803		return "";
804	ver=obj.getAttribute("CHKFORMAT");
805	if(ver!=null && ver!="")
806	{	if(ver.substring(0,3)=="FN:")
807		{
808			val2=eval(ver.substring(3,ver.length));
809			if(val2!="")
810				return val2;
811		} else
812		{	val2=eval(ver);
813			if(val2!="")
814				return val2;
815		}
816	}
817	// Otherwise check if compliant to other flags
818	ival=parseInt(val,10);
819	chkmin=obj.getAttribute("CHKMIN");
820	chkmax=obj.getAttribute("CHKMAX");
821	ver=obj.getAttribute("CHKINT");
822	if (ver!=null)
823	{
824		if(Trim(val)!=ival.toString())
825			return JSVClang("should be an integer.",5006);
826		if(chkmin!=null && ival<parseInt(ver,10))
827			return JSVClang("should be more than ",5007)+ver+".";
828		if(chkmax!=null && ival>parseInt(ver,10))
829			return JSVClang("should be less than ",5008)+ver+".";
830	}
831	ver=obj.getAttribute("CHKDATE");
832	if (ver!=null)
833	{
834		var dt=CalParseDate(val);
835		if(dt!=null)
836		{
837			if(ver=="TODAY" && sysdt!=null && dt>sysdt)
838				return JSVClang("should be a valid date not later than today.",5009);
839		} else
840			return JSVClang("should be a valid date.",5010);
841	}
842	ver=obj.getAttribute("CHKREFORMAT");
843	if(ver!=null && ver.length>0) {
844		var re=new RegExp(ver,"gi");
845		if(!re.test(val)) {
846			var sample=obj.getAttribute("CHKRESAMPLE");
847			if(sample!=null && sample.length>0){
848				/* Customization for 19592. CHKNAMECUSTOM enables a fully custom message followed by "For Example <chkreformat>"*/
849				var fullcustom = obj.getAttribute("CHKNAMECUSTOM");
850				if(fullcustom == 0 || fullcustom == null){
851					return JSVClang("invalid data. For example: {0}",7644,0,sample);
852				}
853				else if(fullcustom == 1){
854					return JSVClang("For example: {0}",36232,0,sample);
855				}
856				else if(fullcustom == 2){
857					return " ";
858				}
859				else if(fullcustom == 3){
860					return "invalid data. "+sample;
861				}
862				else if(fullcustom == 4){	/*#30569*/
863					return sample;
864				}
865			}
866			else{
867				return JSVClang("should be specified.",5005);
868			}
869		}
870	}
871	return "";
872}
873function JSVCgetInnerText(o){
874	// Note: This does not really gives 100% compatibility across all browsers. See:http://clubajax.org/plain-text-vs-innertext-vs-textcontent/
875	if (o == null)
876		return "";
877	else
878		if (o.nodeName && o.nodeName=="#text" && o.nodeValue && typeof(o.nodeValue)=="string")
879			return o.nodeValue.replace(/\xA0/g," ")
880		if (o.textContent)
881			return o.textContent.replace(/\xA0/g," ")
882		else if (o.innerText)
883			return o.innerText
884		else
885			return "";
886}
887function ObjVerify(obj,noprompt,showobjname,excRequired)
888{
889	var nm,ret,objHL=obj; // objHL : object for highlight
890	if(showobjname==null)showobjname=false;
891
892	if(obj.getAttribute('selectize')!=null) {
893		objHL=obj.nextSibling; // skip return so that selectize object can be verified with CHKREQUIRED, marker will be placed the next of the object (temp solution)
894	} else if( ((obj.getAttribute('ui-type')===null || obj.getAttribute('ui-type') ==='') && (obj.disabled || IsDisplayed(obj)==false))
895		|| (obj.getAttribute('ui-type')=="multiselect" && $("#"+obj.id).multiselect("getButton").is(':hidden'))
896	)
897//	if(obj.disabled || IsDisplayed(obj)==false)
898//	if(obj.disabled || obj.readOnly || IsDisplayed(obj)==false)
899		return true;
900	ret=FormObjVerify(obj,excRequired);
901	if(ret!="")
902	{
903		nm=obj.getAttribute("CHKNAME");
904		if(nm==null)
905		{
906			// Check for preceding text first
907			if (obj.previousSibling && obj.previousSibling.nodeType==3) {
908				nm = JSVCgetInnerText(obj.previousSibling);
909			}
910			else
911				nm = null;
912
913			if(nm!=null)
914			{
915				nm=Trim(nm);
916				if(nm.search(/[^\s]/g)<0)
917					nm="";
918			}
919			if(nm==null||nm=="")
920			{
921				var ptd=obj.parentNode,skip=-1;
922				while(ptd!=null && ptd.tagName!="TD" && ptd.parentNode) //obj is inside multiple div or span within td
923					ptd=ptd.parentNode;
924				if (obj.getAttribute('id')!=null)
925					skip=obj.getAttribute('id').indexOf('ATPOLPROD');
926				if(ptd.tagName=="TD" && skip==-1) //#21607 skip for EPL ext attr element
927				{
928					ptd=ptd.previousSibling;
929					while(ptd!=null && ptd.tagName!="TD" && ptd.previousSibling)
930						ptd=ptd.previousSibling;
931					if(ptd!=null && ptd.tagName=="TD")
932						nm=JSVCgetInnerText(ptd);//.innerText;
933				}
934			}
935			if(nm==null||nm=="") { //for DIV/Responsive View
936				var ptd=obj.parentNode,skip=-1;
937				while(ptd!=null && ptd.tagName!="DIV" && ptd.parentNode) //obj is inside multiple div or span within div
938					ptd=ptd.parentNode;
939				if (obj.getAttribute('id')!=null)
940					skip=obj.getAttribute('id').indexOf('ATPOLPROD');
941				if(ptd.tagName=="DIV" && skip==-1) //#21607 skip for EPL ext attr element
942				{
943					ptd=ptd.previousSibling;
944					while(ptd!=null && ptd.tagName!="DIV" && ptd.previousSibling)
945						ptd=ptd.previousSibling;
946					if(ptd!=null && ptd.tagName=="DIV")
947						nm=JSVCgetInnerText(ptd);
948				}
949			}
950		}
951		if(nm==null && showobjname) nm="Value highlighted (" + obj.name +") ";
952		if(nm==null) nm=JSVClang("Value highlighted",29190);
953		if(noprompt>0)
954			return false;
955		var varname=JSVCVarNameSet("varitem",objHL,true);
956		objHL.style.border="2px solid red";
957		SVCalert(JSVClang("{0} {1}",8649,0,nm,ret),null,null,"JSVCDoFocus(JSVCVarNameGet(\""+varname+"\"));");
958		/*
959		 alert(JSVClang("{0} {1}",8649,0,nm,ret));
960		 obj.focus();
961		 if((obj.tagName=="INPUT" && obj.type=="text") ||
962				obj.tagName=="TEXTAREA")
963				obj.select();
964		*/
965		return false;
966	}
967	return true;
968}
969//same exact function as above but return the obj name instead of true false
970//return field description if the object is not filled in instead of true/false
971function ObjVerifyV2(obj,noprompt,showobjname)
972{
973
974	var nm,ret;
975	if(showobjname==null)showobjname=false;
976	if( ((obj.getAttribute('ui-type')===null || obj.getAttribute('ui-type') ==='') && (obj.disabled || IsDisplayed(obj)==false))
977		|| (obj.getAttribute('ui-type')=="multiselect" && $("#"+obj.id).multiselect("getButton").is(':hidden'))
978	)
979//	if(obj.disabled || IsDisplayed(obj)==false)
980//	if(obj.disabled || obj.readOnly || IsDisplayed(obj)==false)
981		return true;
982	ret=FormObjVerify(obj);
983	if(ret!="")
984	{
985        nm=obj.getAttribute("CHKNAME");
986		if(nm==null)
987		{
988			// Check for preceding text first
989			if (obj.previousSibling && obj.previousSibling.nodeType==3) {
990				nm = JSVCgetInnerText(obj.previousSibling);
991			}
992			else
993				nm = null;
994
995            if(nm!=null)
996			{
997				nm=Trim(nm);
998				if(nm.search(/[^\s]/g)<0)
999					nm="";
1000			}
1001			if(nm==null||nm=="")
1002			{
1003				var ptd=obj.parentNode,skip=-1;
1004				while(ptd!=null && ptd.tagName!="TD" && ptd.parentNode) //obj is inside multiple div or span within td
1005					ptd=ptd.parentNode;
1006				if (obj.getAttribute('id')!=null &&(obj.getAttribute('id').indexOf('ATPOLPROD')>=0||obj.getAttribute('id').indexOf('ATVEHDTLQ')>=0))//#28426 skip for ATVEHDTLQ as well
1007					skip=1;
1008				if(ptd.tagName=="TD" && skip==-1) //#21607 skip for EPL ext attr element
1009				{
1010					ptd=ptd.previousSibling;
1011					while(ptd!=null && ptd.tagName!="TD" && ptd.previousSibling)
1012						ptd=ptd.previousSibling;
1013					if(ptd!=null && ptd.tagName=="TD")
1014						nm=JSVCgetInnerText(ptd);//.innerText;
1015				}
1016			}
1017			if(nm==null||nm=="") { //for DIV/Responsive View
1018				var ptd=obj.parentNode,skip=-1;
1019				while(ptd!=null && ptd.tagName!="DIV" && ptd.parentNode) //obj is inside multiple div or span within div
1020					ptd=ptd.parentNode;
1021				if (obj.getAttribute('id')!=null &&(obj.getAttribute('id').indexOf('ATPOLPROD')>=0||obj.getAttribute('id').indexOf('ATVEHDTLQ')>=0))//#28426 skip for ATVEHDTLQ as well
1022					skip=1;
1023				if(ptd.tagName=="DIV" && skip==-1) //#21607 skip for EPL ext attr element
1024				{
1025					ptd=ptd.previousSibling;
1026					while(ptd!=null && ptd.tagName!="DIV" && ptd.previousSibling)
1027						ptd=ptd.previousSibling;
1028					if(ptd!=null && ptd.tagName=="DIV")
1029						nm=JSVCgetInnerText(ptd);
1030				}
1031			}
1032		}
1033		if(nm==null && showobjname) nm="Value highlighted (" + obj.name +") ";
1034		if(nm==null) nm=JSVClang("Value highlighted",29190);
1035		if(noprompt>0)
1036			return false;
1037		obj.style.border="2px solid red";
1038		return nm+'~'+ret;
1039	}
1040	return '';
1041}
1042function JSVCDoFocus(obj)
1043{
1044	try
1045	{
1046		if(obj.tagName=='DIV') {
1047			$(window).scrollTop($(obj).position().top); // can scroll DIV by jq
1048		} else 
1049			obj.focus();
1050		if((obj.tagName=="INPUT" && obj.type=="text") ||
1051				obj.tagName=="TEXTAREA")
1052				obj.select();
1053	} catch(e) {}
1054}
1055function SectionVerify(obj,noprompt) {
1056	var objf,i;
1057	// get INPUT elements
1058	objf=obj.getElementsByTagName('INPUT');
1059	for(i=0 ;i<objf.length;i++) {
1060		if(!ObjVerify(objf[i],noprompt))
1061			return false;
1062	}
1063	// get SELECT elements
1064	objf=obj.getElementsByTagName('SELECT');
1065	for(i=0 ;i<objf.length;i++) {
1066		if(!ObjVerify(objf[i],noprompt))
1067			return false;
1068	}
1069	objf=obj.getElementsByTagName('TEXTAREA');
1070	for(i=0 ;i<objf.length;i++) {
1071		if(!ObjVerify(objf[i],noprompt))
1072			return false;
1073	}
1074	return true;
1075}
1076
1077function FormVerify(form,noprompt,showobjname,excRequired)
1078{
1079	var nm,ret,obj,col,t;
1080	col=form.elements;
1081	if(col!=null)
1082	{	for(t=0;t<col.length;t++)
1083		{	obj=col[t];
1084			if(!ObjVerify(obj,noprompt,showobjname,excRequired))
1085				return false;
1086	}	}
1087	return true;
1088}
1089
1090//list out all fields that not filled in
1091//Need CHKNAME for some fields! (e.g field that have field description on top of it (vertical) instead of left side, or dont have field description at all)
1092function FormVerifyList(form,noprompt,showobjname)
1093{
1094	var nm,ret,obj,col,t;
1095	var fieldlst='';
1096	var s='';
1097	col=form.elements;
1098	if(col!=null)
1099	{
1100		var arrobj = new Array();
1101		for(t=0;t<col.length;t++)
1102		{	obj=col[t];
1103			s=ObjVerifyV2(obj,noprompt,showobjname);
1104			if(s != '' && s !=true){ //need clean this up
1105
1106				var varname=JSVCVarNameSet("varitem",obj,true);
1107				if(!(arrobj.indexOf(obj.name)>=0)){
1108					arrobj.push(obj.name);
1109				var onclickfunc='JSVCVarNameGet($(this).closest(\'.clsSVCCtxFrame\').attr(\'id\').replace(\'_CTXFRAME\',\'\')).clickButton(\'OK\');JSVCDoFocus(JSVCVarNameGet(\''+ varname+'\'));';
1110					fieldlst+='<br><span style="cursor: pointer;" onmouseover="style.fontSize=12;style.fontWeight=\'bold\';$(this).next(\'div\').show()" onmouseout="style.fontSize=11;style.fontWeight=\'normal\';$(this).next(\'div\').hide();" onclick="'+onclickfunc+'">'+s.split('~')[0]+'</span>';
1111					fieldlst+='<div style="display: none;margin-left: 10;">↪'+s.split('~')[1]+'</div>'
1112				}
1113			}
1114		}
1115	}
1116	if(fieldlst !== ''){
1117		SVCalert('<div align="left"><b>Please fill in the required field(s) :</b> '+fieldlst+'</div>');
1118		return false;
1119	}
1120
1121	return true;
1122}
1123
1124function FormSubmit(obj)
1125{
1126	var obj2=document.getElementById("FORMSAVESUCCESS");
1127	if(obj2!=null)
1128	{
1129		if(obj2.value!="0")
1130		{
1131			SVCalert(JSVClang("This document is outdated. You might have clicked 'Back'\n or clicked on 'Save' twice.\n\nPlease click on Refresh now (next to Stop button at the top of the window).",5011));
1132			return false;
1133		}
1134		obj2.value="1";
1135	}
1136	if(obj!=null)
1137		if(obj.tagName=="INPUT" && obj.type=="submit")
1138			obj.click()
1139		else if(obj.tagName=="FORM")
1140			obj.submit();
1141	return true;
1142}
1143function FormFail(win,errtxt)
1144{
1145	var obj=document.getElementById("FormSubmitQuote");
1146	if(obj!=null)
1147	{
1148		obj.style.display="";
1149		if(errtxt!=null)
1150			obj.innerHTML="\n"+errtxt+"\n ";
1151		SVCalert(errtxt);
1152	}
1153}
1154function FormVSubmit(frm,confirmstr)
1155{
1156	if(confirmstr==null)
1157		confirmstr="";
1158	if(typeof(frm)=="string")
1159		frm=document.getElementById(frm);
1160	if(FormVerify(frm))
1161		if(confirmstr=="" || confirm(confirmstr))
1162			FormSubmit(frm);
1163}
1164function JSVCFormSetDOMValues(obj)
1165{	// Set the DOM values of FORM elements
1166	// Non-IE browsers innerHTML does not seems to read latest CHECKED/SELECTED/VALUE in FORM unlike IE
1167	// Therefore run this first to force the DOM to update the form values before using innerHTML
1168	var lo,i,o,tmp,osel;
1169	// set DOM
1170	lo=obj.getElementsByTagName('INPUT');
1171	for(i=0 ;i<lo.length;i++)
1172	{	o=lo[i];
1173		if(o.type&&o.type=="radio"||o.type=="checkbox")
1174			if(o.checked)
1175				o.setAttribute("checked","checked")
1176			else
1177				o.removeAttribute("checked");
1178		o.setAttribute("value",o.value);
1179	}
1180	lo=obj.getElementsByTagName('SELECT');
1181	for(i=0 ;i<lo.length;i++)
1182	{	o=lo[i];
1183		osel=o.selectedIndex;
1184       	for (var j=0; j<o.options.length; j++)
1185       	{
1186		  	if(o.type == "select-one" && j == osel) {
1187                o.options[osel].setAttribute("selected","selected");
1188			}
1189			else if(o.type == "select-multiple" && o.options[j].selected) {
1190				o.options[j].setAttribute("selected","selected");
1191			}
1192			else {
1193				o.options[j].removeAttribute("selected");
1194				// Ugly code to cater IE can't remove defaulted "SELECTED" attribute.
1195				if(o.options[j].getAttribute("selected")!=null) {
1196					tmp=osel;
1197					o.options[j].setAttribute("selected","selected");
1198					o.options[j].removeAttribute("selected");
1199                	o.options[tmp].setAttribute("selected","selected");
1200                }
1201			}
1202	}	}
1203	lo=obj.getElementsByTagName('TEXTAREA');
1204	for(i=0 ;i<lo.length;i++)
1205	{	o=lo[i];
1206		o.setAttribute("value",o.value);
1207	}
1208}
1209function JSVCSetReqList(list,chk)
1210{
1211	var obj2,listarr,abc;
1212	listarr=list.split(",");
1213	for(abc in listarr)
1214	{	obj2=(listarr[abc]==null||listarr[abc]==''?null:JSVCall(listarr[abc]));
1215		if(obj2!=null)
1216		{	if(chk)
1217			{
1218				var elems = document.getElementsByName(obj2.getAttribute('name'));
1219				if(elems.length > 1) {
1220					for(var i = 0; i < elems.length; i++)
1221					{
1222						elems[i].setAttribute("CHKREQUIRED","");
1223					}
1224				} else {
1225					obj2.setAttribute("CHKREQUIRED","");
1226				}
1227			}
1228			else {
1229				var chk=obj2.getAttribute("CHKREQUIRED_FORCE");
1230				if(chk==null) // Do not disable required field dynamically if CHKREQUIRED_FORCE is specified
1231					obj2.removeAttribute("CHKREQUIRED");
1232			}
1233			DoReq(obj2);
1234}	}	}
1235function JSVCAddUniqueObject(arr,obj)
1236{
1237	// Call this function to add an obj to an existing array arr, only if unique
1238	if(arr==null)arr=new Array();
1239	if(obj==null)return arr;
1240	for(var y=0;y<arr.length;y++)
1241		if(arr[y]==obj)
1242			return arr;
1243	arr[arr.length]=obj;
1244	return arr;
1245}
1246function JSVCGetFirstFormElement(obj)
1247{
1248	var col=obj.getElementsByTagName("input");
1249	if(col.length>0)return col[0];
1250	var col=obj.getElementsByTagName("select");
1251	if(col.length>0)return col[0];
1252	var col=obj.getElementsByTagName("textarea");
1253	if(col.length>0)return col[0];
1254	return null;
1255}
1256function JSVCGetFormElementsArray(obj)
1257{
1258	// Returns an array of FORM elements under a certain node
1259	var ret,col;
1260	ret=new Array();
1261	col=obj.getElementsByTagName("input");
1262	for (var y = 0; y < col.length; y++)
1263		ret[ret.length]=col[y];
1264	col=obj.getElementsByTagName("select");
1265	for (var y = 0; y < col.length; y++)
1266		ret[ret.length]=col[y];
1267	col=obj.getElementsByTagName("textarea");
1268	for (var y = 0; y < col.length; y++)
1269		ret[ret.length]=col[y];
1270	return ret;
1271}
1272function JSVCGetBlockElementsArray(obj)
1273{
1274	// Returns an array of FORM elements under a certain node
1275	var ret,col;
1276	ret=new Array();
1277	col=obj.getElementsByTagName("input");
1278	for (var y = 0; y < col.length; y++)
1279		ret[ret.length]=col[y];
1280	col=obj.getElementsByTagName("select");
1281	for (var y = 0; y < col.length; y++)
1282		ret[ret.length]=col[y];
1283	col=obj.getElementsByTagName("textarea");
1284	for (var y = 0; y < col.length; y++)
1285		ret[ret.length]=col[y];
1286	return ret;
1287}
1288function JSVCSetDisabledList(list,chk,exc,disablehidden)
1289{	// List now accepts string, array or collection
1290	var obj2,listarr,abc,obj3;
1291	exc=(exc!=null&&exc.length>0?exc.split(","):null);
1292	disablehidden=(typeof(disablehidden)=='undefined' || disablehidden==null ? 0 : disablehidden); // default. disablehidden used to disable hidden fields (for not doing processing)
1293
1294	if(typeof(list)=="string")
1295	{
1296		listarr=list.split(",");
1297		list=new Array();
1298		for (abc in listarr)
1299		{
1300			obj2 = document.getElementById(listarr[abc]);
1301			if(obj2!=null)
1302			JSVCAddUniqueObject(list, obj2);
1303			obj2 = document.getElementsByName(listarr[abc]);
1304			for (var y = 0; y < obj2.length; y++)
1305				JSVCAddUniqueObject(list, obj2[y]);
1306		}
1307	}
1308	for(var x=0;x<list.length;x++) {
1309		obj2=list[x];
1310		if(obj2!=null) {
1311			//obj2.disabled=(chk?true:false);
1312			if(exc==null) {
1313				obj2.disabled=(parseInt(chk|(obj2.getAttribute('PDISABLED')||obj2.getAttribute('PDISABLED')==''?1:0))==1?true:false);
1314				DoReq(obj2);
1315			}
1316			if(obj2.type&&obj2.type.toLowerCase()=="radio") {
1317				var rd=document.getElementsByName(obj2.name);
1318				for(var r=0;r<rd.length;r++)
1319					if(rd[r]) rd[r].disabled=(parseInt(chk|(rd[r].getAttribute('PDISABLED')||rd[r].getAttribute('PDISABLED')==''?1:0))==1?true:false);
1320			}
1321			obj3=obj2.getElementsByTagName("INPUT");
1322			for(var i=0;i<obj3.length;i++) {
1323				var j=obj3[i];
1324				if (!(exc!=null&&exc.indexOf(j.name)>=0))
1325				{
1326					if(j.type.toLowerCase()=="text" || j.type.toLowerCase()=="button") { // also disable textboxes
1327						j.disabled=(parseInt(chk|(j.getAttribute('PDISABLED')||j.getAttribute('PDISABLED')==''?1:0))==1?true:false);
1328						DoReq(j);
1329					} else if (disablehidden==1 && j.type.toLowerCase()=="hidden") { // disable hidden fields if applicable
1330						j.disabled=(parseInt(chk|(j.getAttribute('PDISABLED')||j.getAttribute('PDISABLED')==''?1:0))==1?true:false);
1331					} else if ((j.type.toLowerCase()=="radio" || j.type.toLowerCase()=="checkbox") && j.name!='') {
1332						var rd=document.getElementsByName(j.name);
1333						for(var r=0;r<rd.length;r++)
1334							if(rd[r]) rd[r].disabled=(parseInt(chk|(rd[r].getAttribute('PDISABLED')||rd[r].getAttribute('PDISABLED')==''?1:0))==1?true:false);
1335						DoReq(j);
1336					}
1337				}
1338			}
1339			obj3=obj2.getElementsByTagName("SELECT");
1340			for(var i=0;i<obj3.length;i++) {
1341				var j=obj3[i];
1342				if (!(exc!=null&&exc.indexOf(j.name)>=0))
1343				{
1344					j.disabled=(parseInt(chk|(j.getAttribute('PDISABLED')||j.getAttribute('PDISABLED')==''?1:0))==1?true:false);
1345					DoReq(j);
1346				}
1347			}
1348			obj3=obj2.getElementsByTagName("TEXTAREA");
1349			for(var i=0;i<obj3.length;i++) {
1350				var j=obj3[i];
1351				if (!(exc!=null&&exc.indexOf(j.name)>=0))
1352				{
1353					j.disabled=(parseInt(chk|(j.getAttribute('PDISABLED')||j.getAttribute('PDISABLED')==''?1:0))==1?true:false);
1354					DoReq(j);
1355				}
1356			}
1357		}
1358	}
1359}
1360function JSVCGetAllDOMObjStat()
1361{
1362	var objAll = document.getElementsByTagName('*');
1363	var objReturn=[];
1364
1365	for (var i=0; i<objAll.length; i++) {
1366		if((objAll[i].id==null || objAll[i].id=='') && (objAll[i].name==undefined || objAll[i].name==null || objAll[i].name=='')) continue;
1367		objReturn[objReturn.length] = {
1368			obj: 		objAll[i],
1369			disabled: 	objAll[i].disabled,
1370			display: 	objAll[i].style.display,
1371			required: 	objAll[i].getAttribute('CHKREQUIRED')
1372		}
1373	}
1374	return objReturn;
1375}
1376function JSVCRestoreDOMObjStat(objArr) {
1377	if(objArr==null || objArr.length==0) return;
1378	for(var i=0; i<objArr.length; i++) {
1379		if(objArr[i].obj==null) continue;
1380		objArr[i].obj.disabled=objArr[i].disabled;
1381		objArr[i].obj.style.display=objArr[i].display;
1382		if(objArr[i].required!=null) objArr[i].obj.setAttribute("CHKREQUIRED", objArr[i].required);
1383	}
1384}
1385function MRMPreprocessFormItem(obj,doreqonly)
1386{
1387	var str,sid,o;
1388
1389	// Preprocess 1: Check for required highlighting
1390	DoReq(obj,null,false);
1391	/*if(obj.type!="checkbox" && obj.type!="radio")
1392	{
1393		if(FormObjVerify(obj)!="" && obj.disabled!=true && !(obj.style.backgroundColor=='#f2cccc'||obj.style.backgroundColor=="rgb(242, 204, 204)"))
1394		{
1395			obj.setAttribute("BKGROUND",obj.style.backgroundColor);
1396			obj.style.backgroundColor='#f2cccc';
1397		}
1398	}*/
1399	if(doreqonly!=1)
1400	{
1401	str=obj.getAttribute("MRMOBJ");
1402	if(str!=null && str!="")
1403	{	// Preprocess 2: MRMOBJ=DATE or CALDATE
1404		if(str=="DATE" || str=="CALDATE" || str=="CALDATE_BUD")
1405		{	if(obj.onblur==null){
1406					obj.onblur=new Function("ObjDate(this);");
1407			}
1408			if(obj.maxLength=="" || obj.maxLength==null || obj.maxLength>1000)
1409				obj.maxLength=10;
1410			if(str=="CALDATE"|| str=="CALDATE_BUD")
1411			{	sid=obj.name;
1412				if(sid==null || sid=="")
1413					sid=obj.id;
1414				if(sid!=null && sid!="")
1415				{	if(obj.onkeydown==null && obj.onkeyup==null)
1416					{	obj.onkeydown = function(e){
1417							CalScrollKey(e,obj);
1418						}
1419						obj.onkeyup = function(e){
1420							CalScrollKey(e,obj);
1421						}
1422					}
1423					if(str=="CALDATE_BUD"){
1424						isbud=1;
1425					} else {
1426						isbud=0;
1427					}
1428					o=document.createElement("span");
1429					o.innerHTML="&nbsp;"+CalGenScript(sid,1,isbud);
1430					obj.parentNode.insertBefore(o,obj.nextSibling);
1431					if(isbud==1){
1432						oo=document.createElement("span");
1433						oo.innerHTML="&nbsp;"+CalGenBuddhistScript(sid);
1434						o.appendChild(oo);
1435					}
1436					if(str=="CALDATE_BUD")
1437						CalConvertBuddhist(obj,document.getElementById(obj.id+"_buddhist"),1);
1438				}
1439			}
1440		}
1441		else if(str=='CALDATETIME') // based on third party script jquery.datetimepicker.full.js
1442		{
1443			// input attrs: TIMESTEP, DTMIN, DTMAX
1444			var theformat=jSVCdtformat.toUpperCase() + ' HH:mm';
1445			var onShowLogic=function ( val,obj ) {
1446				var oSel,val,thisobj;
1447				var getPreviousObj=function(arrObj,obj) {
1448						var idx=null;
1449						var obj=(obj!=null&&obj.length>0?obj[0]:null);
1450						if(obj!=null && arrObj!=null && arrObj.length>0) {
1451							for(var i = 0; i < arrObj.length; i += 1) {
1452								if(arrObj[i] === obj && i!=0) {
1453									idx=i-1;
1454								}
1455							}
1456						}
1457						return (idx==null?null: arrObj[idx]);
1458					}
1459				oSel=$(obj).prevAll("input[MRMOBJ='CALDATETIME']:first");
1460				if(!(oSel!=null&&oSel.length>0)) oSel=$(obj).parent().prev().find("input[MRMOBJ='CALDATETIME']").last(); // look for previous object from previous sibling
1461				if(!(oSel!=null&&oSel.length>0)) oSel=$(obj).parent().prev().prev().find("input[MRMOBJ='CALDATETIME']").last(); // look for previous object from previous previous sibling
1462				oSel=(oSel!=null&&oSel.length>0?oSel[0]:null); // finalise allocating the recent object from the source
1463				thisobj=getPreviousObj($(document).find("input[MRMOBJ='CALDATETIME']"), $(obj));
1464				/***
1465				console.log('----source------------');
1466				console.log($(thisobj));
1467				console.log($(thisobj).val());
1468				//console.log($(document).find("input[MRMOBJ='CALDATETIME']").get($(oSel)));
1469				console.log('--------/source--------');
1470				***/
1471				if($(obj).val()=='') {
1472					// this.setOptions( {defaultDate: new Date('2021-01-03')});
1473					// this.setOptions({defaultDate:(thisobj!=null?$(thisobj).val():new Date())});
1474					if(thisobj!=null && $(thisobj)!=null && $(thisobj).val()!='') {
1475						val=CalParseDate($(thisobj).val());
1476						this.setOptions({defaultDate: val  , defaultTime: val }); // default calender picker as previous similar object value
1477						$(obj).datetimepicker('reset');
1478					}
1479				}
1480				/*
1481				console.log('onShowLogic | current value=');
1482				console.log($(obj).val());
1483				*/
1484			}
1485			$(obj).datetimepicker({
1486				value: obj.value,
1487				format: theformat, //'DD/MM/YYYY H:i',
1488				step: (obj.getAttribute("TIMESTEP")!=null?obj.getAttribute("TIMESTEP"):60), // attr param: TIMESTEP ; step time, default = 60 (min)
1489				minDate: (obj.getAttribute("DTMIN")=='TODAY'?0:obj.getAttribute("DTMIN")!=null?obj.getAttribute("DTMIN"):false), //attr param: DTMIN ; min date , default = false
1490				defaultDate: 0,
1491				defaultTime: 0,
1492				/* e.g.:
1493					{minDate:0} // today
1494					{minDate:'2013/12/03'}
1495					{minDate:'-1970/01/02'} // yesterday
1496				*/
1497				todayButton: true,
1498				maxDate: (obj.getAttribute("DTMAX")=='TODAY'?0:obj.getAttribute("DTMAX")!=null?obj.getAttribute("DTMAX"):false), //attr param: DTMAX ; max date , default = false
1499				onChangeDateTime: function(val,obj /* returned as JSQ */) {
1500					DoReq($(obj)[0]);
1501				}//,
1502				// onShow: onShowLogic
1503				/* other param for class will be based on default : todayButton: true, defaultSelect:true, allowBlank:false, timepickerScrollbar:true,  onSelectDate, onSelectTime, onChangeMonth, onChangeYear, onChangeDateTime, onShow, onClose, onGenerate, inverseButton,scrollMonth,scrollTime,scrollInput,hours12,yearStart,yearEnd,roundTime,dayOfWeekStart,weekends,disabledDates,allowDates,allowDateRe,disabledWeekDays */
1504				// !!! take note that any handling with onchange (e.g.: onChangeDateTime) or onchange on input object will not working well if alert() was called. use console.log instead.
1505			});
1506		}
1507		// Preprocess 3: MRMOBJ=TEXTAREA
1508		else if(str=="TEXTAREA")
1509		{	if(obj.onblur==null)
1510				obj.onblur=new Function("ObjText(this);");
1511		}
1512		//Preprocess 4: MRMOBJ=SRCDDL
1513		else if(str=="SRCDDL")
1514		{
1515			SVCAJAXDropDown(obj.id);
1516		}
1517	}
1518	}
1519
1520}
1521function MrmPreprocessFields(o) {
1522	var objf;
1523	o=(typeof(o)=='string'?document.getElementById(o):o);
1524	if(o!=null) {
1525		objf=o.getElementsByTagName('INPUT');
1526		for (cnt=0; cnt<objf.length; cnt++) {
1527			MRMPreprocessFormItem(objf[cnt]);
1528		}
1529		objf=o.getElementsByTagName('SELECT');
1530		for (cnt=0; cnt<objf.length; cnt++) {
1531			MRMPreprocessFormItem(objf[cnt]);
1532		}
1533	}
1534}
1535function MrmPreprocessFormInner(frm,doreqonly,asterisklist)
1536{
1537	// Inner routine for preprocessing forms
1538	var col,len,t,astlist;
1539	if(frm.onreset==null)
1540		frm.onreset=new Function("event.returnValue=false;");
1541	col=frm.elements;
1542	if(col==null)
1543		return;
1544	len=col.length;
1545	astlist=(asterisklist!=null?asterisklist.split(","):'');
1546	if(len!=null)
1547		for(t=0;t<len;t++){
1548			MRMPreprocessFormItem(col[t],doreqonly);
1549
1550			if (astlist!='' && astlist.indexOf($("#"+col[t].id).attr('id')) !== -1) {
1551				if ( ($("#"+col[t].id).closest('td').prev('td').text()).slice(-1)!='*'){
1552					$("#"+col[t].id).closest('td').prev('td').append(' *')
1553				}
1554			}
1555		}
1556}
1557function MrmPreprocessForm(frm,asterisklist)
1558{
1559	// Outer routine for preprocessing forms. If form object passed in, then preprocess
1560	// only that form, otherwise, preprocess ALL forms attached to the document object
1561	var col,len,frm,t;
1562	if(frm==null)
1563	{
1564		col=document.forms;
1565		len=col.length;
1566		if(len!=null)
1567		{
1568			for(t=0;t<len;t++)
1569				MrmPreprocessFormInner(col[t],null,asterisklist);
1570		}
1571	} else
1572		MrmPreprocessFormInner(frm,null,asterisklist);
1573}
1574
1575/*-------------------- FORM STORE & FORM-to-URL function --------------------*/
1576function FormStoreUpdate(obj,val,donotoverride)
1577{
1578	var store,nm,str,pos,posend;
1579	if(typeof(obj)=="string")
1580	{
1581		if(val==null)
1582			return;
1583		nm = obj;
1584	} else
1585	{
1586		DoReq(obj);
1587		nm=obj.id;
1588		if(val==null)
1589			if(obj.tagName=="INPUT" && obj.type=="checkbox")
1590				val=(obj.checked?"1":"0")
1591			else
1592				val=escape(obj.value);
1593	}
1594	store=document.getElementById("FORMSTORE");
1595	if(store==null)
1596		return;
1597	str=store.value;
1598	pos = str.indexOf("\\"+nm+":");
1599	if(pos>=0)
1600	{
1601		if(!(donotoverride>0))
1602		{
1603			// Update
1604			posend=str.indexOf("\\",pos+1);
1605			if(posend==-1)
1606				store.value=str.substring(0,pos+nm.length+2)+val;
1607			else
1608				store.value=str.substring(0,pos+nm.length+2)+val+str.slice(posend);
1609		}
1610	} else
1611		// Insert
1612		store.value=store.value+"\\"+nm+":"+val;
1613}
1614function JSVCall(nm)
1615{
1616	var o=document.getElementById(nm);
1617	if(o!=null)return o;
1618	o=document.getElementsByName(nm);
1619	if(o.length>0)
1620		return o[0]
1621	else return null;
1622}
1623function JSVCallFromParent(nm) // call from parent's window
1624{
1625	var o=window.opener.document.getElementById(nm);
1626	if(o!=null)return o;
1627	o=window.opener.document.getElementsByName(nm);
1628	if(o.length>0)
1629		return o[0]
1630	else return null;
1631}
1632function FormStoreApply()
1633{
1634	var pos,nm,val,obj,formstore,list;
1635	formstore=document.getElementById('FORMSTORE');
1636	if(formstore==null)
1637		return;
1638	list=formstore.value.split("\\");
1639	for(str in list)
1640	{
1641		pos=list[str].indexOf(":");
1642		if(pos > 0)
1643		{
1644			nm=list[str].substring(0,pos);
1645			val=unescape(list[str].slice(pos+1));
1646			obj=JSVCall(nm);
1647			if(obj!=null)
1648			{
1649			if(obj.tagName=="INPUT" && obj.type=="checkbox")
1650				obj.checked=(val=="1"?true:false)
1651			else
1652				obj.value=val;
1653			if(obj.onchange!=null)
1654				obj.onchange()
1655			else if(obj.onblur!=null)
1656				obj.onblur();
1657			}
1658		}
1659	}
1660}
1661function FormURLVAR(form,prefix)
1662{
1663	var urlstr,obj,urlstrall,col,len,nm,spos;
1664	if(prefix==null)
1665		prefix="";
1666	urlstrall="";
1667	col=form.elements;
1668	if(col!=null)
1669	{
1670		len=col.length;
1671		if(len>0)
1672			for(var t=0;t<len;t++)
1673			{
1674				obj=col[t];
1675				if(obj.disabled || IsDisplayed(obj)==false)
1676					continue;
1677				urlstr=obj.getAttribute("URLVAR");
1678				if(urlstr!=null)
1679				{
1680					nm=prefix+(obj.name).toUpperCase();
1681					if((obj.type!="checkbox" && obj.type!="radio") || obj.checked==true)
1682					{
1683						regexp=new RegExp("&"+nm+"=");
1684						spos=urlstrall.search(regexp);
1685						selvalue=obj.value;
1686						if(obj.type=="select-multiple") {
1687							selvalue="";
1688							for(var i=0;i<obj.options.length;i++) {
1689								if(obj[i].selected)
1690									selvalue+=obj[i].value+"|";
1691							}
1692							if(selvalue[selvalue.length-1]=="|")
1693								selvalue=selvalue.substring(0,selvalue.length-1);
1694						}
1695						if(spos>=0)
1696							urlstrall=urlstrall.substring(0,spos+nm.length+2)+encodeURIComponent(selvalue)+"%2C"+urlstrall.slice(spos+nm.length+2)
1697						else
1698							urlstrall=urlstrall+"&"+nm+"="+encodeURIComponent(selvalue);
1699					}
1700				}
1701			}
1702	}
1703	return urlstrall;
1704}
1705function FormDisable(frm) { // Disable all input elements in a form
1706    if(!frm)
1707        for(var i=0;i<document.forms.length;i++) {
1708            if(document.forms[i].name) {
1709                frm=document.forms[i];
1710                break;
1711            }
1712        }
1713    if(!frm) return;
1714    for(var i=0;i<frm.elements.length;i++) {
1715        var e=frm.elements[i];
1716        e.disabled=true;
1717    }
1718}
1719function JSVCFormGetElementsById(form,id)
1720{	// Get multiple items with the same ID in the form
1721	var form,col,t,arr;
1722	if(typeof(form)=="string")
1723		form=document.getElementById(form);
1724	if(form==null||typeof(form)!="object")
1725		return;
1726	col=form.elements;
1727	arr=new Array();
1728	if(col!=null)
1729	{	for(t=0;t<col.length;t++)
1730		{	if(col[t].id==id)
1731			{	//alert(col[t].id+"::"+id);
1732				arr[arr.length]=col[t];
1733			}
1734	}	}
1735	return arr;
1736}
1737/*-------------------- FORM/INPUT CHECKING --------------------*/
1738function DoReq(obj,doprompt,cascade)
1739{
1740	var tgname,col,len,obj2,objcolor,bkcolor,str,oid;
1741	if(cascade==null)cascade=true;
1742	if(obj==null)return;
1743	tgname=obj.tagName;
1744	if(typeof(obj)=="string") { // obj able to accept name list
1745		var lst=obj.split(",");
1746		if(lst.length==0)
1747			lst[0]=obj;
1748		for(var t=0,a=JSVCall(lst[t]);t<lst.length&&a!=null;t++)
1749			DoReq(a,doprompt,false);
1750	}
1751	else if(tgname=="FORM")
1752	{
1753		col=obj.elements;
1754		len=col.length;
1755		if(len!=null)
1756		{	for(var t=0;t<len;t++)
1757			{	DoReq(col[t],doprompt,false);/*obj2=col[t];objcolor=obj2;
1758				if(obj2.type=="checkbox" || obj2.type=="radio")
1759				{
1760					objcolor=obj2.nextSibling;
1761					if(objcolor==null || objcolor.tagName!="LABEL")
1762						objcolor=null;
1763				}
1764				if(objcolor!=null && obj2.disabled==false && !(objcolor.style.backgroundColor=='#f2cccc'||objcolor.style.backgroundColor=="rgb(242, 204, 204)"))
1765				{	str=FormObjVerify(obj2);
1766					if(str!="")
1767					{	if(doprompt)alert("Field "+str);
1768						objcolor.setAttribute("BKGROUND",objcolor.style.backgroundColor);
1769						objcolor.style.backgroundColor='#f2cccc';
1770					}
1771				}*/
1772			}
1773		}
1774	} else
1775	{
1776		bkcolor=obj.getAttribute("BKGROUND");
1777		objcolor=obj;
1778		if(obj.type!="radio" && obj.type!="checkbox")
1779			cascade=false;
1780		if(obj.type=="checkbox" || obj.type=="radio")
1781		{
1782			if(obj.id!=null && obj.id.length>0)
1783				objcolor=(objcolor.parentNode!=null && objcolor.parentNode.tagName=='LABEL'?objcolor.parentNode:objcolor.nextSibling);
1784			else
1785				objcolor=null;
1786			if(objcolor!=null && objcolor.tagName!="LABEL")
1787				objcolor=objcolor.nextSibling;
1788			if(objcolor!=null && objcolor.tagName!="LABEL")
1789				objcolor=null;
1790			if(objcolor!=null && objcolor.htmlFor!=obj.id)
1791				objcolor=null;
1792		}
1793		str=FormObjVerify(obj);
1794		if(objcolor!=null && (str=="" || obj.disabled==true))
1795		{
1796			bkcolor=objcolor.getAttribute("BKGROUND");
1797			if(bkcolor!=null)
1798			{
1799				objcolor.style.backgroundColor=bkcolor;
1800				objcolor.removeAttribute("BKGROUND");
1801				objcolor.style.border="";
1802                if($(obj).attr("ui-type") == "select2")
1803                    $("#"+obj.id).data('select2').$container.removeClass('select2-chkrequired');
1804				else if($(obj).siblings('.ui-multiselect').length && $(obj).attr("ui-type") == "multiselect")
1805					$(obj).multiselect("getButton").removeClass('multiselect-chkrequired');
1806			}
1807		}
1808		else
1809		{	if(doprompt && str!="")
1810				alert("Field "+str);
1811
1812		if(objcolor!=null && !(objcolor.style.backgroundColor=='#f2cccc'||objcolor.style.backgroundColor=="rgb(242, 204, 204)"))
1813		{
1814			objcolor.setAttribute("BKGROUND",objcolor.style.backgroundColor);
1815			objcolor.style.backgroundColor='#f2cccc';
1816            if($(obj).attr("ui-type") == "select2")
1817            {
1818                $("#"+obj.id).data('select2').$container.addClass('select2-chkrequired');
1819            }
1820			else if($(obj).siblings('.ui-multiselect').length && $(obj).attr("ui-type") == "multiselect")
1821            {
1822				$(obj).multiselect("getButton").addClass('multiselect-chkrequired');
1823            }
1824		}
1825
1826		// YN select2 cater for JSVCSetReq because
1827		// JSVCSetReq will DoReq, and DoReq will convert the obj background into red
1828		// Hence the above checking will not work for next DoReq cause already in red color
1829		if(objcolor!=null && $(obj).attr("ui-type-fix") == "select2-fix")
1830		{
1831			(objcolor.style.backgroundColor=="rgb(242, 204, 204)") ? $(obj).next().addClass('select2-chkrequired') : $(obj).next().removeClass('select2-chkrequired')
1832		}
1833
1834		}
1835
1836
1837		if(cascade && obj.name && obj.name.length>0 && obj.form && obj.form.elements)
1838		{	// For radio cascade to all related elements to set req
1839			col=obj.form.elements;
1840			len=col.length;
1841			if(len!=null)
1842			{	for(var t=0;t<len;t++)
1843					if( obj.name==col[t].name)
1844						DoReq(col[t],false,false);
1845			}
1846		}
1847	}
1848
1849	if(JSVCGetResp()) {
1850		if($.fn.JSVCMobShowOpt && $('#toggleOpt0').parent().hasClass('btn-primary')) {
1851			 JSVCMobShowOpt();
1852			 JSVCMobHideOpt();
1853		}
1854	}
1855}
1856function AddOnloadCode(strload,fpm)
1857{
1858	if(window.onload == null)
1859		window.onload = new Function(strload)
1860	else
1861	{
1862		var fnexp = window.onload.toString();
1863		var pos1 = fnexp.search("{");
1864		if(pos1 > 0)
1865			if(fpm==1)
1866				window.onload = new Function(strload+fnexp.slice(pos1+1,-1))
1867			else
1868				window.onload = new Function(fnexp.slice(pos1+1,-1)+strload)
1869		else
1870			window.onload = new Function(strload);
1871	}
1872}
1873function JSVCAppendEvtFunc(obj,strobjev,strfunc)
1874{
1875  if(strfunc!=null) {
1876    if(typeof(obj)=='string') obj=JSVCall(obj);
1877
1878    if(obj!=null){
1879	    if(!typeof(obj.length)=='undefined') obj=obj[0];
1880
1881	    var fn=(eval('obj.'+strobjev)!=null?eval('obj.'+strobjev).toString():'');
1882	    var pos1 = fn.search("{");
1883	    var strcur='';
1884	    if (pos1>0) strcur=fn.slice(pos1+1,-1);
1885	    eval('obj.'+strobjev+'= new Function(strcur+strfunc)');
1886	}
1887  }
1888}
1889function JSVCAppendEvtFuncOpt(obj,strobjev,strfunc) { // cater for set of objects esp for checkbox or radio
1890	var oChk=new Array(),objs=obj;
1891	if(typeof(obj)=='string') obj=document.getElementsByName(obj);
1892	if(obj!=null && typeof(obj.length)!='undefined' && obj.length>0) {
1893		oChk=obj;
1894	} else if(obj!=null && typeof(obj)!='string') {
1895		oChk.push(obj);
1896	}
1897	for(var i=0;i<oChk.length;i++) {
1898		if(oChk[i].type=='checkbox' || oChk[i].type=='radio') {
1899			JSVCAppendEvtFunc(oChk[i],strobjev,strfunc);
1900		}
1901	}
1902}
1903function JSVCReplaceEvtFunc(obj,strobjev,strfunc1,strfunc2)
1904{
1905  if(strfunc1!=null && strfunc2!=null) {
1906    if(typeof(obj)=='string') obj=JSVCall(obj);
1907    if(!typeof(obj.length=='undefined')) obj=obj[0];
1908
1909    var fn=(eval('obj.'+strobjev)!=null?eval('obj.'+strobjev).toString():'');
1910    var pos1 = fn.search("{");
1911    var strcur='';
1912    if (pos1>0) strcur=fn.slice(pos1+1,-1);
1913    if(strcur!=null&&strcur!='')
1914    	eval('strcur.replace('+strfunc1+',strfunc2)');
1915    eval('obj.'+strobjev+'= new Function(strcur)');
1916  }
1917}
1918
1919function Trim(val)
1920{
1921	if(val==null)
1922		return "";
1923	val = val.toString();
1924	while(val.charAt(0) == " ")
1925		val = val.slice(1);
1926	while(val.charAt(val.length - 1) == " ")
1927		val = val.substr(0,val.length - 1);
1928	return val;
1929}
1930function Despace(str)
1931{
1932	if(typeof(str)=="string")
1933		return str.replace(/ /g,"")
1934	else
1935	{
1936		str.value=str.value.replace(/ /g,"");
1937		DoReq(str);
1938	}
1939}
1940function ObjUpperCase(obj)
1941{
1942	obj.value=obj.value.toUpperCase();
1943	DoReq(obj);
1944}
1945function ObjAlphaNum(obj, minlen, maxlen)
1946{
1947	var msg=CheckAlphaNum(obj.value, minlen, maxlen);
1948	if (msg!="")
1949	{
1950		alert(msg);
1951		obj.value="";
1952		obj.focus();
1953	}
1954	DoReq(obj);
1955}
1956// returns "" only if val is alphanumeric (includes underscore character) and length falls within minlen and maxlength.
1957function CheckAlphaNum(val, minlen, maxlen)
1958{
1959	var msg="";
1960	var regex = /\W/gi;
1961	if (minlen==null) minlen=0;
1962	if (maxlen==null) maxlen=-1; // -1 means unlimited
1963	if (regex.test(val))
1964		msg=msg+JSVClang("Only alphanumeric characters (A-Z, 0-9 or _) are allowed in this field. ",28686);
1965	if(val!="" && val.length<minlen)
1966		msg=msg+JSVClang("Minimum length for this field is "+"{0}"+" characters. ",1676,0,minlen);
1967	else if (val!="" && val.length>maxlen && maxlen!=-1)
1968		msg=msg+JSVClang("Maximum length for this field is "+"{0}"+" characters. ",1677,0,maxlen);
1969	return msg;
1970}
1971function JSVCMaxLength(obj, MaxLen)
1972{
1973	if(MaxLen==null)
1974	{
1975		MaxLen=obj.getAttribute("maxlength");
1976	}
1977	if(MaxLen>0)
1978	{
1979		obj.value=obj.value.substring(0,MaxLen);
1980		return (obj.value.length < MaxLen);
1981	}
1982}
1983
1984function ObjCheckLen(obj, minlen, maxlen)
1985{
1986	var msg=CheckLen(obj.value, minlen, maxlen);
1987	if (msg!="")
1988	{
1989		SVCalert(msg);
1990		obj.value="";
1991		obj.focus();
1992	}
1993	DoReq(obj);
1994}
1995function CheckLen(val,minlen,maxlen){
1996	var msg="";
1997	if (minlen==null) minlen=0;
1998	if (maxlen==null) maxlen=-1; // -1 means unlimited
1999	if(val!="" && val.length<minlen)
2000		msg=msg+JSVClang("Minimum length for this field is "+"{0}"+" characters. ",1676,0,minlen);
2001	else if (val!="" && val.length>maxlen && maxlen!=-1)
2002		msg=msg+JSVClang("Maximum length for this field is "+"{0}"+" characters. ",1677,0,maxlen);
2003	return msg;
2004}
2005function JSVCOptionGetValue(obj,mode) { // mode 0 : value in listing, mode 1 : value in sum (figure only)
2006	var i,sumtot, tot=new Array(),existed=0;
2007	mode=(mode==null?0:mode);
2008	if(typeof(obj)=='string')
2009		obj=document.getElementsByName(obj);
2010	if(obj!=null&&obj.length>0) existed=1;
2011	for(i=0;i<obj.length;i++) {
2012		if( (obj[i].type=='text' || obj[i].type=='hidden' || obj[i].type=='select')  && (obj[i].checked==true && obj[i].disabled==false) ) {
2013			tot.push(obj[i].value);
2014		}
2014 else if((obj[i].type=='radio' || obj[i].type=='checkbox') && (obj[i].checked==true && obj[i].disabled==false)) {
2015			tot.push(obj[i].value);
2016		}
2017	}
2018	if (existed==1) {
2019		if(tot.length>0 && mode==0) {
2020			sumtot=tot.join(",");
2021		} else if(tot.length==0 && mode==0) {
2022			sumtot='';
2023		} else if (tot.length>0 && mode==1) {
2024			sumtot=0;
2025			for(i=0;i<tot.length;i++)
2026				if(!isNaN(tot[i]) && tot[i]>=0)
2027					sumtot=sumtot+parseFloat(tot[i]);
2028		} else if (tot.length==0 && mode==1) {
2029			sumtot=0;
2030		}
2031	} else
2032		sumtot=null;
2033	return sumtot;
2034
2035}
2036function JSVCRadioGetSelObj(obj,dis)
2037{
2038	var o,i;
2039	if(typeof(obj)=="string")
2040		o=document.getElementsByName(obj)
2041	else if(obj.name!="")
2042		o=document.getElementsByName(obj.name);
2043	if(o==null)return null;
2044	for(i = 0; i < o.length; i++)
2045		if(o[i].checked && (dis==null || dis==o[i].disabled))
2046			return o[i];
2047	return null;
2048}
2049function JSVCRadioGetValue(obj,dis)
2050{	// dis: null:ignore disabled status,true:only if disabled
2051	var o=JSVCRadioGetSelObj(obj,dis);
2052	return (o==null?null:o.value);
2053}
2054function JSVCRadioSetValue(obj,val,dis,fn)
2055{
2056	var selobj=null;
2057	if(typeof(obj)=="string")
2058		o=document.getElementsByName(obj)
2059	else
2060		o=document.getElementsByName(obj.name);
2061	if(o==null)return null;
2062	for(var i = 0; i < o.length; i++)
2063	{
2064		if(val!=null)
2065			if (o[i].value == val) {
2066				o[i].checked = true;
2067				selobj=o[i];
2068				if(fn!=null){fn();}
2069			} else{
2070				o[i].checked = false;
2071				if(fn!=null){fn();}
2072			}
2073
2074
2075		if(dis!=null)
2076			o[i].disabled=dis;
2077	}
2078	return selobj;
2079}
2080/*-------------------- URL/WINDOWS/NAVIGATION --------------------*/
2081
2082/////////////////////////////////////////////////////////////////////////////////////////
2083// JSVCReloadParent
2084//  Win - defaults to window.self
2085//
2086// Modified By		Modified On		Comments
2087// -----------		-----------		--------
2088// Theng Hey		22 Mar 2003		Simplified, no need to take any arguments
2089// Theng Hey		25 mar 2003		Reloads all ancestors, via recursive call
2090////////////////////////////////////////////////////////////////////////////////////////
2091function JSVCReloadParent(Win,doclose,doreload)
2092{
2093	var ParWin,propagate;
2094	if(Win==null)
2095		Win=window.self;
2096	if(doreload==null)
2097		doreload=-1;
2098	if(Win!=null)
2099	{
2100		ParWin = Win.opener;
2101		if (ParWin != null)
2102		{
2103			if(ParWin.closed)
2104			{
2105				if((doclose>0 || doclose==-1) && !(Win.closed))
2106					Win.close();
2107				return;
2108			}
2109			if(doreload>0 || doreload==-1)
2110			{
2111				ParWin.location.href=ParWin.location.href;
2112				if(doreload>0) doreload--;
2113				propagate=1;
2114			}
2115			if(doclose>0 || doclose==-1)
2116			{
2117				if(!(Win.closed))
2118				{
2119					Win.close();
2120					ParWin.focus();
2121					if(doclose>0) doclose--;
2122				} else
2123					doclose=0;
2124				propagate=1;
2125			}
2126			if(propagate>0)
2127				JSVCReloadParent(ParWin,doclose,doreload);
2128		}
2129	}
2130}
2131/////////////////////////////////////////////////////////////////////////////////////////
2132// NavigateParent
2133//  Win - defaults to window.self
2134//
2135// Modified By		Modified On		Comments
2136// -----------		-----------		--------
2137//
2138////////////////////////////////////////////////////////////////////////////////////////
2139function NavigateParent(url, Win)
2140{
2141	if (Win==null) Win=window.self;
2142	var ParWin = Win.opener;
2143	if (ParWin != null)
2144		{
2145		ParWin.location.href=url;
2146		//ParWin.navigate(url);
2147		ParWin.focus();
2148		}
2149}
2150function URLBack(URL)
2151{
2152	var rgexp,txt;
2153	if(URL == null || URL == "")
2154		URL = window.location.pathname + window.location.search;
2155	rgexp = /((linkfrom)|(module)|(loginmode)|(cfid)|(cftoken)|(jsessionid)|(userid)|(nolayout)|(rid)|(lastlogon)|(br)|(ct)|(mobile)|(usid))[=][^&]*[&]*/gi;
2156	URL=URL.replace(rgexp, "");
2157	rgexp = /[&][&]+/gi;
2158	return URL.replace(rgexp, "");
2159}
2160
2161/*-------------------- CONTEXT WINDOWS --------------------*/
2162function JSVCCtxMenuFrame(parobj,id,menuname,width,bCollapse,bClose,scrollfn,cssclass,csstitle,height,bScroll)
2163{
2164	if(parobj==null)
2165		parobj=document.body;
2166
2167
2168
2169	obj=document.createElement("div");
2170	obj.id=id;
2171	obj.setAttribute("CURTOP",150);
2172	if (cssclass==null)
2173		obj.className="clsSVCCtxFrame";
2174	else
2175		obj.className=cssclass;
2176
2177	if(width!=null&&width!=""&&scrollfn!=null)
2178	{
2179		if(window.attachEvent)
2180			window.attachEvent('onscroll',scrollfn)
2181		else
2182			window.addEventListener('scroll',scrollfn,false);
2183	}
2184	if(width!=null&&width!="")
2185		obj.style.width=width+"px";
2186
2187	obj.innerHTML="<div class="+(csstitle==null?"clsSVCCtxTitle":csstitle)+" style=height:3ex>"+(bCollapse?"<input type=button class=clsButton style=\"float:left;font-weight:bold\" onclick=JSVCCtxMenuCollapseToggle(this) value=\"&uarr;&uarr;\">":"")+(bClose?"<input type=button class=clsButton style=float:right onclick=\"JSVCcloseCtxMenu(this.parentNode.parentNode)\" value=\" X \">":"")+"&nbsp;"+menuname+"</div><div "+(bScroll?(height!=null&&height!=""?"style=overflow:scroll;height:"+height+"px":"style=overflow:scroll"):"")+">&nbsp;</div>";
2188	parobj.appendChild(obj);
2189	JSVCDrag.init(obj);
2190	return obj;
2191}
2192function JSVCCtxMenuContent(obj,context)
2193{
2194	obj.firstChild.nextSibling.innerHTML=context;
2195}
2196function JSVCCtxMenuCollapseToggle(obj)
2197{
2198	var o=obj.parentNode.nextSibling;
2199	if(o.style.display=="none")
2200	{	o.style.display="";
2201		obj.value=String.fromCharCode(8593,8593);
2202	}
2203	else
2204	{	o.style.display="none";
2205		obj.value=String.fromCharCode(8595,8595);
2206	}
2207}
2208function JSVCshowCtxMenu(objname,ctxval,pos,nocap,posX,posY)
2209{
2210	return JSVCshowCtxMenuEv(event,objname,ctxval,pos,nocap,posX,posY);
2211}
2212function JSVCshowCtxMenuEv(event,objname,ctxval,pos,nocap,posX,posY)
2213{
2214	var pos,obj,postop,posleft;
2215	var e,eobj,eobjpos;
2216	// POS:1 - At Object, POS:2 - Center of screen, -1: Current location, else: - At Mouse
2217	if(typeof(objname)=="object")obj=objname
2218	else
2219		obj=document.getElementById(objname);
2220	if(obj==null)
2221		return;
2222	var closectx= function(e){
2223		// If item clicked got HTML attribute CANCELCLOSE, then do not trigger close
2224		var e2=(e.target||e.srcElement);
2225		if(e2 && e2.getAttribute("CANCELCLOSE")!=null)
2226			return false;
2227		JSVCcloseCtxMenu(obj);
2228		window.removeEventListener("mouseup",closectx,true);
2229	}
2230	obj.setAttribute("ctxVal",ctxval);
2231	obj.removeAttribute("ctxSel");
2232	obj.style.display="block";
2233
2234	// POS 111 - Position of top left corner is posX, posY
2235	if(pos==111)
2236	{
2237		obj.style.left=document.body.scrollLeft + posX;
2238		obj.style.top=document.body.scrollTop + posY;
2239		if(posY+obj.clientHeight > document.body.clientHeight)
2240		{
2241			pos=document.body.clientHeight-obj.clientHeight+document.body.scrollTop-2;
2242			if(pos<0)pos=0;
2243			obj.style.top=pos;
2244		}
2245		if (posX+obj.clientWidth > document.body.clientWidth)
2246		{
2247			pos=document.body.clientWidth-obj.clientWidth-2;
2248			obj.style.left=pos;
2249		}
2250	}
2251	else if(pos==1)
2252	{
2253		// At source obj position
2254		postop=document.body.scrollTop+event.clientY-event.offsetY;
2255		obj.style.left=document.body.scrollLeft+event.clientX-event.offsetX;
2256		obj.style.top=postop;
2257		if(postop-document.body.scrollTop+obj.clientHeight > document.body.clientHeight)
2258		{
2259			pos=document.body.clientHeight-obj.clientHeight+document.body.scrollTop-2;
2260			if(pos<0)pos=0;
2261			obj.style.top=pos;
2262		}
2263	} else if (pos==2)
2264	{
2265		// Center of screen
2266		obj.style.left=document.body.scrollLeft+(document.body.clientWidth-obj.clientWidth)/2+'px';
2267		postop=document.body.scrollTop+(document.body.clientHeight-obj.clientHeight)/2;
2268		obj.style.top=postop+'px';
2269		if(postop-document.body.scrollTop+obj.clientHeight > document.body.clientHeight)
2270		{	pos=document.body.clientHeight-obj.clientHeight+document.body.scrollTop-2;
2271			if(pos<0)pos=0;
2272			obj.style.top=pos+'px';
2273		}
2274	} else if (pos==3)
2275	{
2276		// Below Object
2277		obj.style.left=event.target.offsetLeft;
2278		obj.style.top=event.target.offsetTop+event.target.offsetHeight+2;
2279	} else if(pos!=-1)
2280	{
2281		// At Mouse location
2282		obj.style.left=document.body.scrollLeft+event.clientX;
2283		if(event.clientX+obj.clientWidth > document.body.clientWidth)
2284		{
2285			pos=document.body.clientWidth-obj.clientWidth+document.body.scrollLeft-2;
2286			if(pos<0)pos=0;
2287			obj.style.left=pos;
2288		}
2289		obj.style.top=document.body.scrollTop+event.clientY;
2290		if(event.clientY+obj.clientHeight > document.body.clientHeight)
2291		{
2292			pos=document.body.clientHeight-obj.clientHeight+document.body.scrollTop-2;
2293			if(pos<0)pos=0;
2294			obj.style.top=pos;
2295		}
2296	}
2297
2298	if(nocap==2) { // 2:Disable window / disallow click exit
2299		JSVCPageDisable(obj,true);
2300	}
2301	else if(nocap==3) { // 3:Disable window / allow click exit
2302		JSVCPageDisable(obj,true);
2303		if(window.addEventListener) // all browsers except before IE9
2304			window.addEventListener("mouseup",closectx,true);
2305		else if(obj.setCapture) // before IE9
2306			obj.setCapture(false);
2307	}
2308	else if(nocap!=1) { // 0:Enable window / allow click exit, 1:Enable window / disallow click exit, 4:Enable window / click exit (bubbling model).
2309		if(window.addEventListener) // all browsers except before IE9
2310		{
2311			if(nocap==4)
2312				window.addEventListener("mouseup",closectx,false);
2313			else
2314				window.addEventListener("mouseup",closectx,true);
2315		}
2316		else if(obj.setCapture) // before IE9
2317			obj.setCapture(false);
2318    }
2319
2320	return false;
2321}
2322function JSVCcloseCtxMenuAll(event) { // event fired from mouseup
2323	var e=(event.target||event.srcElement);
2324	var o=document.getElementsByTagName("div");
2325	for(var i in o) {
2326		if(o[i].className=="clsSVCCtxFrame"||o[i].className=="clsSVCCtxMenuBox") {
2327			JSVCcloseCtxMenu(o[i]);
2328		}
2329	}
2330}
2331function JSVCtoggleCtxMenu(obj,e)
2332{
2333	//var e=event.srcElement;  --- not supported by Fs
2334	//e=(e!=null?e.srcElement:window.event.srcElement);
2335	e=(e!=null?e.target || e.srcElement:event.target || event.srcElement);
2336
2337	while(e!=null)
2338	{
2339		switch(e.className)
2340		{
2341			case "clsSVCCtxMenuItem": e.className="clsSVCCtxMenuHlight"; obj.ctxSel=e; return;
2342			case "clsSVCCtxMenuItem2": e.className="clsSVCCtxMenuHlight2"; obj.ctxSel=e; return;
2343			case "clsSVCCtxMenuHlight": e.className="clsSVCCtxMenuItem"; if(obj.ctxSel==e) obj.ctxSel=null; return;
2344			case "clsSVCCtxMenuHlight2": e.className="clsSVCCtxMenuItem2"; if(obj.ctxSel==e) obj.ctxSel=null; return;
2345			default:
2346				e=e.parentElement;
2347		}
2348	}
2349}
2350function JSVCclickCtxMenu(obj,itm,event)
2351{
2352	JSVCcloseCtxMenu(obj);
2353	if(itm==null)
2354	{
2355		itm=obj.ctxSel;
2356		if(itm==null) return;
2357	}
2358	var othis=itm; // Required: used in eval
2359	/* --- not supported by FF
2360	if(itm.doFunction != null) {
2361		eval(itm.doFunction);
2362	}*/
2363	if(itm.getAttribute('doFunction')!=null) {
2364		eval(itm.getAttribute('doFunction'));
2365	}
2366}
2367function JSVCcloseCtxMenu(obj)
2368{
2369	if(typeof(obj)=="string")
2370		obj=document.getElementById(obj);
2371	//avoid multiple closing
2372	if(obj.style.display!="none") {
2373        obj.style.display="none";
2374		JSVCPageDisable(obj,false);
2375		/*if(window.removeEventListener) // all browsers except before IE9
2376			window.removeEventListener("mouseup",JSVCcloseCtxMenuAll,true);
2377		else*/
2378		if(obj.releaseCapture) // before IE9
2379			obj.releaseCapture();
2380	}
2381}
2382/*-------------------- CONTEXT-WINDOWS - MAKING IT DRAGGABLE --------------------*/
2383var JSVCDrag = {
2384
2385	obj : null,
2386
2387	init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
2388	{
2389		o.onmousedown	= JSVCDrag.start;
2390
2391		o.hmode			= bSwapHorzRef ? false : true ;
2392		o.vmode			= bSwapVertRef ? false : true ;
2393
2394		o.root = oRoot && oRoot != null ? oRoot : o ;
2395
2396		if (o.hmode  && isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = "0px";
2397		if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = "0px";
2398		if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right  = "0px";
2399		if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = "0px";
2400
2401		o.minX	= typeof minX != 'undefined' ? minX : null;
2402		o.minY	= typeof minY != 'undefined' ? minY : null;
2403		o.maxX	= typeof maxX != 'undefined' ? maxX : null;
2404		o.maxY	= typeof maxY != 'undefined' ? maxY : null;
2405
2406		o.xMapper = fXMapper ? fXMapper : null;
2407		o.yMapper = fYMapper ? fYMapper : null;
2408
2409		o.root.onDragStart	= new Function();
2410		o.root.onDragEnd	= new Function();
2411		o.root.onDrag		= new Function();
2412	},
2413
2414	start : function(e)
2415	{	var tn,to;
2416		var o = JSVCDrag.obj = this;
2417		e = JSVCDrag.fixE(e);
2418		if(e.srcElement)to=e.srcElement
2419		else if(e.target)to=e.target;
2420		tn=to.tagName;
2421		if(!(tn=="DIV"&&to.className=="clsSVCCtxTitle"))return true;
2422		//if(tn=="INPUT"||tn=="SELECT"||tn=="TEXTAREA")return true;
2423		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
2424		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
2425		document.onmouseup		= JSVCDrag.end;
2426		o.root.onDragStart(x, y);
2427
2428		o.lastMouseX	= e.clientX;
2429		o.lastMouseY	= e.clientY;
2430
2431		if (o.hmode) {
2432			if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
2433			if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
2434		} else {
2435			if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
2436			if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
2437		}
2438
2439		if (o.vmode) {
2440			if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
2441			if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
2442		} else {
2443			if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
2444			if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
2445		}
2446
2447		document.onmousemove	= JSVCDrag.drag;
2448
2449		return false;
2450	},
2451
2452	drag : function(e)
2453	{
2454		e = JSVCDrag.fixE(e);
2455		var o = JSVCDrag.obj;
2456		var ey	= e.clientY;
2457		var ex	= e.clientX;
2458		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
2459		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
2460		var nx, ny;
2461
2462		if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
2463		if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
2464		if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
2465		if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);
2466
2467		nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
2468		ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));
2469
2470		if (o.xMapper)		nx = o.xMapper(y)
2471		else if (o.yMapper)	ny = o.yMapper(x)
2472		JSVCDrag.obj.root.CURTOP=ny;
2473		JSVCDrag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
2474		JSVCDrag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
2475		JSVCDrag.obj.lastMouseX	= ex;
2476		JSVCDrag.obj.lastMouseY	= ey;
2477
2478		JSVCDrag.obj.root.onDrag(nx, ny);
2479		return false;
2480	},
2481
2482	end : function()
2483	{
2484		document.onmousemove = null;
2485		document.onmouseup   = null;
2486		JSVCDrag.obj.root.onDragEnd(	parseInt(JSVCDrag.obj.root.style[JSVCDrag.obj.hmode ? "left" : "right"]),
2487									parseInt(JSVCDrag.obj.root.style[JSVCDrag.obj.vmode ? "top" : "bottom"]));
2488		JSVCDrag.obj = null;
2489	},
2490
2491	fixE : function(e)
2492	{
2493		if (typeof e == 'undefined') e = window.event;
2494		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
2495		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
2496		return e;
2497	}
2498};
2499/*-------------------- USERDATA PERSISTENCE ON BROWSER (Use HTML5 localStorage if such a feature exist) --------------------*/
2500function MrmSetPersistUserData(attr,val)
2501{
2502    if(typeof(Storage) !== "undefined")
2503    {
2504        localStorage.setItem("MRMpersistUserData_" + attr.toString() , val.toString().replace(/</g, "&lt;").replace(/>/g, "&gt;") );
2505    }
2506    else
2507    {
2508        var obj=document.getElementById("MRMUSERDATA");
2509        if(obj==null)
2510        {
2511    //      obj=document.createElement("<DIV ID=MRMUSERDATA class=persistUserData>");
2512    //      document.body.insertAdjacentElement("afterBegin",obj);
2513
2514            obj=document.createElement("div");
2515            obj.id="MRMUSERDATA";
2516            obj.className="persistUserData";
2517
2518            document.body.insertBefore(obj,document.body.firstChild);
2519
2520        }
2521        obj.setAttribute(attr,val);
2522    //  obj.save(attr);
2523        try { obj.save(attr); } catch(e) {};
2524    }
2525}
2526function MrmGetPersistUserData(attr)
2527{
2528
2529    if(typeof(Storage) !== "undefined")
2530    {
2531        var val = localStorage.getItem("MRMpersistUserData_" + attr.toString() );
2532    }
2533    else
2534    {
2535        var obj,val;
2536        obj=document.getElementById("MRMUSERDATA");
2537        if(obj==null)
2538        {
2539            //obj=document.createElement("<DIV ID=MRMUSERDATA class=persistUserData>");
2540            //document.body.insertAdjacentElement("afterBegin",obj);
2541            obj=document.createElement("div");
2542            obj.id="MRMUSERDATA";
2543            obj.className="persistUserData";
2544            document.body.insertBefore(obj,document.body.firstChild);
2545        }
2546    //  obj.load(attr);
2547        try { obj.load(attr); } catch(e) { return null; };
2548        val=obj.getAttribute(attr);
2549        if(val==null)
2550            val=="";
2551    }
2552    return val;
2553}
2554/*-------------------- NAME + ID input generation --------------------*/
2555var jSVCidstr;
2556function JSVCSetIDDefStr(idstr)
2557{
2558	jSVCidstr=idstr;
2559}
2560function JSVCNameClick(obj,req)
2561{
2562	var nm,val,osel,o2,clrid,spclist,noprompt,oind,spcnm;
2563	if(typeof(obj)=="string")
2564	{
2565		obj=JSVCRadioGetSelObj(obj+"nmsel");
2566//		obj=document.getElementsByName(obj+"nmsel");
2567		if(obj==null)
2568			return;
2569		noprompt=1;
2570	}
2571	if(obj!=null)
2572		spcnm=obj.getAttribute("SPCNM");
2573	if(spcnm==null||spcnm=="")
2574		spclist=new Array()
2575	else
2576		spclist=spcnm.split("|");
2577	val=JSVCRadioGetValue(obj);
2578	clrid=0;
2579	if(val!=null)
2580	{	nm=obj.name.substring(0,obj.name.length-5);	
2581		if((val==1||val==2)&&jSVClocid==1) //#37546
2582		{
2583			if (typeof Cleardata === 'function') {
2584				AddOnloadCode(Cleardata());
2585			  }
2586			
2587		}
2588
2589		if(val=="1" || val==spclist[0])
2590		{	// Company selected
2591			osel=document.getElementsByName(nm+"ID1cel");
2592			o2=document.getElementsByName(nm+"ID1");
2593			if(o2!=null && o2.length>0)
2594			{
2595				if(osel==null)
2596					o2[0].disabled=true
2597				else
2598					o2[0].disabled=false;
2599				DoReq(o2[0]);
2600			}
2601			if(val==spclist[0] && noprompt!=1)
2602			{
2603				if(!confirm(JSVClang("Are you sure you want to register this Name as {0}?\nPlease check properly and confirm.\n\nClick OK to Confirm {1}, Click Cancel to revert back to Normal",1541,0,spclist[1],spclist[1])))
2604				{
2605					val=JSVCRadioGetValue(nm+"ID1cel",false);
2606					if(val=="1")JSVCRadioSetValue(obj,"1")
2607					else  JSVCRadioSetValue(obj,"2");
2608					return;
2609				}
2610			}
2611			if(osel!=null&&osel.length>0)
2612			{	osel[0].checked=true;osel[0].disabled=false;
2613				if (osel[0].tagName=='SELECT'){/*#21291 if select company type, set company IDtype DDL chkrequired based on req*/
2614					if(req==1)
2615						osel[0].setAttribute('CHKREQUIRED',1);
2616					osel[0].style.display="";
2617					DoReq(osel[0]);
2618				}
2619			}
2620			JSVCRadioSetValue(nm+"ID1sel",null,true);
2621			var oind=document.getElementsByName(nm+"ID1sel");
2622			if(oind!=null&&oind.length>0&&oind[0].tagName=='SELECT')/*#21291 if select company type, hide individual IDtype DDL*/
2623			{
2624				oind[0].disabled=true;
2625				oind[0].style.display="none";
2626				oind[0].removeAttribute('CHKREQUIRED');
2627				DoReq(oind[0]);
2628			}
2629			o2=document.getElementsByName(nm+"nm")[0];
2630			if(val==spclist[0])
2631			{	o2.readOnly=true;
2632				o2.style.color="gray";
2633				o2.value=spclist[2];
2634			} else
2635			{	if(o2.readOnly==true)
2636				{ o2.value="";clrid=1; }
2637				o2.readOnly=false;
2638				o2.style.color="";
2639			}
2640			DoReq(o2);
2641			o2=document.getElementsByName(nm+"ID1")[0];
2642			if(o2!=null)
2643			{
2644				if(val==spclist[0])
2645				{	o2.readOnly=true;
2646					o2.style.color="gray";
2647					o2.value=spclist[3];
2648				} else
2649				{	o2.readOnly=false;
2650					o2.style.color="";
2651					if(clrid==1)
2652						o2.value="";
2653				}
2654				JSVCIDChk(o2);
2655			}
2656			o2=document.getElementsByName(nm+"ID2")[0];
2657			if(o2!=null)
2658			{
2659				JSVCRadioSetValue(nm+"ID2sel",null,true);
2660				o2.disabled=true;
2661				o2.style.backgroundColor="silver";
2662				JSVCIDChk(o2);
2663			}
2664		}
2665		else if(val=="2")
2666		{	osel=document.getElementsByName(nm+"ID1cel");
2667			if(osel!=null&&osel.length>0)
2668			{
2669				JSVCRadioSetValue(nm+"ID1cel",null,true);
2670				if (osel[0].tagName=='SELECT'){/*#21291 if select individual type, hide company IDtype DDL*/
2671					osel[0].removeAttribute('CHKREQUIRED');
2672					osel[0].style.display="none";
2673					DoReq(osel[0]);
2674				}
2675				else
2676				{
2677					osel[0].checked=false;osel[0].disabled=true;
2678				}
2679			}
2680			JSVCRadioSetValue(nm+"ID1sel",null,false);
2681			o2=JSVCRadioGetSelObj(nm+"ID1sel");
2682			if(o2==null)
2683			{	o2=document.getElementsByName(nm+"ID1sel");
2684				if(o2!=null&&o2.length>0)
2685					o2[0].checked=true;
2686			}
2687			o2=document.getElementsByName(nm+"ID1sel");
2688			if(o2!=null&&o2.length>0&&o2[0].tagName=='SELECT'){/*#21291 if select individual type, set individual IDtype DDL chkrequired based on req*/
2689				if(req==1)
2690					o2[0].setAttribute('CHKREQUIRED',1);
2691				o2[0].style.display="";
2692				DoReq(o2[0]);
2693			}
2694			o2=document.getElementsByName(nm+"nm")[0];
2695			if(o2.readOnly==true)
2696			{ o2.value="";clrid=1;o2.style.color="";o2.readOnly=false; }
2697			DoReq(o2);
2698			o2=document.getElementsByName(nm+"ID1")[0];
2699			if(o2!=null)
2700			{
2701				o2.disabled=false;
2702				if(clrid==1)
2703				{	o2.value="";o2.readOnly=false;o2.style.color=""; }
2704				JSVCIDChk(o2);
2705			}
2706			if(o2==null)
2707			{	o2=document.getElementsByName(nm+"ID2sel");
2708				if(o2!=null&&o2.length>0)
2709					o2[0].checked=true;
2710			}
2711			o2=document.getElementsByName(nm+"ID2")[0];
2712			if(o2!=null)
2713			{
2714				JSVCRadioSetValue(nm+"ID2sel",null,false);
2715				o2.disabled=false;
2716				o2.style.backgroundColor="";
2717				JSVCIDChk(o2);
2718			}
2719		}
2720	}
2721}
2722
2723function JSVCGenIDStr(idtyp,nm,dis,req,sel,val, hiderad,nmtype,id_fld_chk)
2724{	// idtyp: 1=Main ID, 2=Sec ID (cannot be both)
2725	var o,t,itm,musttyp,genstr,chkformat,maxl,chkreq,idval, strhide = '',found=0;
2726	o=jSVCidstr.split("|");
2727	if(val==null)val="";
2728	val=val.toString();
2729	genstr="";
2730	chkformat="";
2731	chkreq=req;
2732
2733	var typ1length = jSVCidstr.split('|*').length-1
2734	var typ2length = jSVCidstr.split('|+').length-1
2735	var typ3length = jSVCidstr.split('|^').length-1 /*for company ID type not using default default Co Reg No.*/
2736	var typ0length = o.length - typ1length - typ2length - typ3length
2737
2738	if(sel==null)
2739		sel=-1;
2740	if(chkreq==2)
2741		if(sel==null || sel<=0)chkreq=0;
2742	if(hiderad != null && hiderad == 1)
2743		strhide = " style=\"display: none;\""
2744	if (idtyp != 2 && o[0].length > 0 && o[0].split("!")[0]==1) { /*for existing company ID type which has only option Co Reg No.*/
2745		itm=o[0].split("!");
2746		idval=itm[0];
2747		if(itm[1].substring(0,3)=="FN:")
2748			itm[1]=eval(itm[1].substring(3,itm[1].length));
2749		genstr += "<input URLVAR CHKNAME=\"ID type\" id=\"_" + nm + "0cel\" name=\"" + nm + "cel\"" + (sel == 1 ? " CHECKED" : "") + (dis == 1 || sel != 1 ? " PDISABLED DISABLED" : "") + " type=radio value=\""+SVChtm(idval)+"\" onclick=\"JSVCIDChk('" + nm + "')\"" + strhide + "><label for=\"_" + nm + "0cel\"" + strhide + "> " + SVChtm(itm[1]) + "</label>";
2750	}
2751	else if (idtyp != 2 && o[0].length > 0) /*for company ID Type which is not using default Co Reg No.*/
2752	{
2753		if(typ1length>10 || typ2length>10 || typ3length>10)//use ddl if more than 10 choices
2754			genstr+=" <select URLVAR CHKNAME=\"ID type\" id=\"_"+nm+"0cel\" name=\""+nm+"cel\" onchange=\"DoReq(this);JSVCIDChk('"+nm+"');DoReq(this);\" "+(chkreq>0?"CHKREQUIRED ":"")+(dis==1||nmtype!=2?" DISABLED":"")+(nmtype!=2?" style=display:none; ":"")+"><option value=\"\"></option>";
2755
2756		for(t=0;t<o.length;t++)
2757		{	itm=o[t];
2758			if(o[t].length!="" && itm.substring(0,1)=="^")
2759			{	itm=itm.slice(1);
2760				itm=itm.split("!");
2761				idval=itm[0];
2762				itm=itm[1].split("~");
2763				if(itm[0].substring(0,3)=="FN:")
2764					itm[0]=eval(itm[0].substring(3,itm[0].length));
2765				if(typ1length>10 || typ2length>10 || typ3length>10)//use ddl if more than 5 choices
2766					genstr+=" <option value=\""+SVChtm(idval)+"\"" +(itm.length>1&&itm[1].length>0?" DOCHKFORMAT=\""+itm[1]+"\"":"") + strhide +" "+(sel!=1&&dis!=1&&(sel==idval)?" selected":"")+">"+SVChtm(itm[0])+"</option>";
2767				else
2768					genstr+=" <input URLVAR CHKNAME=\"ID type\" id=\"_"+nm+t+"cel\" name=\""+nm+"cel\" "+(chkreq>0?"CHKREQUIRED ":"")+(sel==1||dis==1?" DISABLED":"")+(sel!=1&&dis!=1&&(sel==idval||(sel==-1&&val==""&&found!=1))?" CHECKED":"")+" type=radio"+(itm.length>1&&itm[1].length>0?" DOCHKFORMAT=\""+itm[1]+"\"":"")+" value=\""+SVChtm(idval)+"\" onblur=DoReq(this) onclick=\"JSVCIDChk('"+nm+"');DoReq(this);\"" + strhide + "><label for=\"_"+nm+t+"cel\"" + strhide + "> "+SVChtm(itm[0])+"</label>";
2769
2770				if(sel!=1&&dis!=1&&(sel==t+1)&&itm.length>1&&itm[1].length>0)
2771					chkformat=itm[1];
2772				found=1;
2773			}
2774		}
2775		if(typ1length>10 || typ2length>10 ||typ3length>10)//use ddl if more than 10 choices
2776			genstr+=" </select>";
2777	}
2778
2779    if((idtyp==1 && typ1length>10) || (idtyp==2 && typ2length>10))//use ddl if more than 10 choices
2780        genstr+=" <select URLVAR CHKNAME=\"ID type\" id=\"_"+nm+t+"sel\" name=\""+nm+"sel\" onchange=\"DoReq(this);JSVCIDChk('"+nm+"');DoReq(this);\" "+(chkreq>0?"CHKREQUIRED ":"")+"><option value=\"\"></option>";
2781
2782	for(t=1;t<o.length;t++)
2783	{	itm=o[t];
2784		if(o[t].length!="" && itm.substring(0,1)!="^")
2785		{	if(itm.substring(0,1)=="*")musttyp=1
2786			else if(itm.substring(0,1)=="+")musttyp=2
2787			else musttyp=0;
2788			if(musttyp>0)itm=itm.slice(1);
2789			itm=itm.split("!");
2790			idval=itm[0];
2791			itm=itm[1].split("~");
2792			if(itm[0].substring(0,3)=="FN:")
2793				itm[0]=eval(itm[0].substring(3,itm[0].length));
2794			if(musttyp==0 || musttyp==idtyp)
2795			{
2796				//if(sel==-1&&val=="")sel=t+1;
2797				if( (musttyp==0 && typ0length>10) || (musttyp==1 && typ1length>10) || (musttyp==2 && typ2length>10) )//use ddl if more than 10 choices
2798				    genstr+=" <option value=\""+SVChtm(idval)+"\"" +(itm.length>1&&itm[1].length>
27980?" DOCHKFORMAT=\""+itm[1]+"\"":"") + strhide +" "+(sel!=1&&dis!=1&&(sel==idval||(sel==-1&&val==""&&found!=1))?" selected":"")+">"+SVChtm(itm[0])+"</option>";
2799				else
2800				    genstr+=" <input URLVAR CHKNAME=\"ID type\" id=\"_"+nm+t+"sel\" name=\""+nm+"sel\" "+(chkreq>0?"CHKREQUIRED ":"")+(sel==1||dis==1?" DISABLED":"")+(sel!=1&&dis!=1&&(sel==idval||(sel==-1&&val==""&&found!=1))?" CHECKED":"")+" type=radio"+(itm.length>1&&itm[1].length>0?" DOCHKFORMAT=\""+itm[1]+"\"":"")+" value=\""+SVChtm(idval)+"\" onblur=DoReq(this) onclick=\"JSVCIDChk('"+nm+"');DoReq(this);"+(!!id_fld_chk?id_fld_chk:"") + "\"" + strhide + "><label for=\"_"+nm+t+"sel\"" + strhide + "> "+SVChtm(itm[0])+"</label>";
2801
2802				if(sel!=1&&dis!=1&&(sel==t+1)&&itm.length>1&&itm[1].length>0)
2803					chkformat=itm[1];
2804				found=1;
2805			}
2806		}
2807	}
2808
2809	if((idtyp==1 && typ1length>10) || (idtyp==2 && typ2length>10))//use ddl if more than 10 choices
2810	   genstr+=" </select>";
2811
2812	/*if(typeof(val)=="string" && val.length>20)maxl=30
2813	//else maxl=16; EPolicy - ToBuild #13076_ [SG] Etiqa - FPS SIM - ID field needs to be 20 characters - Redmine
2814	else #28692*/
2815	maxl=30;
2816	if(req==2 && val=="")req=0;
2817	if (genstr != "")
2818	{
2819		if(hiderad == null || hiderad == 0)
2820			genstr += "<br>";
2821		genstr += "<input URLVAR " + (req > 0 ? "CHKREQUIRED " : "") + "name=\"" + nm + "\"" + " id=\"" + nm + "\"" + (chkformat == "" ? "" : " CHKFORMAT=\"" + chkformat + "\"") + " maxlength=" + maxl + " size=30 style=text-transform:uppercase VALUE=\"" + (val != null ? SVChtm(val) : "") + "\" onblur=\"JSVCIDChk(this);"+(!!id_fld_chk?id_fld_chk:"") + "\""+ (dis == 1 ? " DISABLED" : "") + ">";
2822	}
2823	return genstr;
2824}
2825function JSVCIsDate(dateStr) { // dd/mm/yyyy
2826	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
2827	var matchArray = dateStr.match(datePat);
2828	if (matchArray == null) return false;
2829	day = matchArray[1]; // parse date into variables
2830	month = matchArray[3];
2831	year = matchArray[5];
2832	if ( (month < 1 || month > 12) || (day < 1 || day > 31) || ((month==4 || month==6 || month==9 || month==11) && day==31))
2833		return false;
2834	else if (month == 2) {
2835		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
2836		if (day > 29 || (day==29 && !isleap)) return false;
2837	}
2838	return true; // date is valid
2839}
2840function JSVCCHKMyICDOB(str,ret) { // 0-return true/false   1-return date str.
2841	if (ret==null)ret=0;
2842	if (str.length == 6 /*&& str.search(/^[0-9]+$/) == 0*/) {
2843		var yyyy=str.substr(0,2);
2844		var mm=str.substr(2,2);
2845		var dd=str.substr(4,2);
2846		var dt=new Date(), century, curyear;
2847		curyear=dt.getFullYear();
2848		century=dt.getFullYear().toString().substr(0,2);
2849
2850		if ( parseInt(century+yyyy) < parseInt(curyear) || ( parseInt(century+yyyy) == parseInt(curyear) && parseInt(mm) < parseInt(dt.getMonth()+1)) || ( parseInt(century+yyyy) == parseInt(curyear) && parseInt(mm) == parseInt(dt.getMonth()+1)) && parseInt(dd) < parseInt(dt.getDate()) ) /* check day and month if last 2digit of year is same (19' and 20') */
2851			yyyy=century+''+yyyy;
2852		else
2853			yyyy=(parseInt(century-1).toString())+''+yyyy;
2854
2855		if (JSVCIsDate(dd+'/'+mm+'/'+yyyy))
2856			return (ret?(dd+'/'+mm+'/'+yyyy):true);
2857	}
2858	return (ret?"":false);
2859}
2860function JSVCSetDOB(src,tgt,tgtfrm,idchk) {
2861	if(idchk==null)idchk=0;
2862	var dotrig = false;
2863	var sobj=(typeof(src)=="object"?src:document.getElementById(src));
2864	var idtype=0;
2865
2866	if(idchk)
2867	{
2868		if( src.name && src.name.length>4 && src.name.substring(src.name.length-4) == "1sel" )
2869			sobj = $(sobj).next("input[name$='ID1']").get(0);
2870		if( $(sobj).prev("select[name$='1sel']").length > 0 )
2871			idtype=$(sobj).prev("select[name$='1sel']").val();
2872		else if ($(sobj).siblings("[name$='ID1sel']:checked").length > 0 && $(sobj).siblings("[name$='ID1sel']:checked").val()==2)
2873			idtype=2;
2874		if(idtype != 2) return;
2875	}
2876
2877	if(tgt==null)
2878	{
2879		if(sobj!=null && sobj.getAttribute("nameidobj")!=null) //automagically resolve DOB using JSVCNameIDObject
2880		{
2881			tgt = eval(sobj.getAttribute("nameidobj")).nmStr + "DOB";
2882			if( tgt == "" )
2883				return "";
2884			dotrig = true;
2885		}
2886	}
2887	if (tgtfrm!=null)
2888		var tobj=document.getElementById(tgtfrm).elements[tgt];
2889	else
2890		var tobj=document.getElementById(tgt);
2891	if(sobj!=null&&tobj!=null) {
2892		var tmp=JSVCCHKMyICDOB(sobj.value.substring(0,6),1);
2893		if(tmp!="") tobj.value=tmp;
2894		DoReq(tobj); ObjDate(tobj);
2895	}
2896	if(dotrig) $('#'+tgt).trigger('blur');
2897	return "";
2898}
2899
2900function JSVCSetGenMyIC(src,tgt,tgtfrm,male1,idchk) /* sets the gender. male1 flag because in claims,1=female,2=male whereas in epl:1=male,2=female*/
2901{
2902	if(idchk==null)idchk=0;
2903	var dotrig = false;
2904	var sobj=(typeof(src)=="object"?src:document.getElementById(src));
2905	var idtype=0;
2906
2907	if(idchk)
2908	{
2909		if( src.name && src.name.length>4 && src.name.substring(src.name.length-4) == "1sel" )
2910			sobj = $(sobj).next("input[name$='ID1']").get(0);
2911		if( $(sobj).prev("select[name$='1sel']").length > 0 )
2912			idtype=$(sobj).prev("select[name$='1sel']").val();
2913		else if ($(sobj).siblings("[name$='ID1sel']:checked").length > 0 && $(sobj).siblings("[name$='ID1sel']:checked").val()==2)
2914			idtype=2;
2915		if(idtype != 2) return;
2916	}
2917
2918	if(tgt==null)
2919	{
2920		if(sobj!=null && sobj.getAttribute("nameidobj")!=null) //automagically resolve DOB using JSVCNameIDObject
2921		{
2922			tgt = eval(sobj.getAttribute("nameidobj")).nmStr + "Gender";
2923			if( tgt == "" )
2924				return "";
2925			dotrig = true;
2926		}
2927	}
2928	if (tgtfrm!=null)
2929		var tobj=document.getElementById(tgtfrm).elements[tgt];
2930	else
2931		var tobj=document.getElementById(tgt);
2932	if(male1==null)male1=true;
2933	if (sobj!=null){
2934		if(tobj!=null){//gender ddl (def)
2935			if (sobj.value.substring(10,14)!="")
2936			{
2937				if (sobj.value.substring(10,14)%2)
2938					tobj.value=(male1?1:2);
2939				else
2940					tobj.value=(male1?2:1);
2941			}
2942			DoReq(tobj);
2943		}else if(document.getElementsByName(tgt)&&JSVCall(tgt)!=null){//gender radio
2944			if (sobj.value.substring(10,14)!="")
2945			{
2946				if (sobj.value.substring(10,14)%2)
2947					tgt=tgt+(male1?'1':'2');
2948				else
2949					tgt=tgt+(male1?'2':'1');
2950				document.getElementById(tgt).checked=true;
2951			}
2952			DoReq(tgt);
2953		}
2954	}
2955	if(dotrig) $('#'+tgt).trigger('change');
2956	return "";
2957}
2958function JSVCSetGenMySalutation() 	//#30152
2959{
2960	var sobj=document.getElementById("sleDGender");
2961	var iobj=document.getElementById("sleIGender");
2962	var tobj=document.getElementById("_sleDSalutation1sel");
2963	var sameinsured=document.getElementById("COPYINSURED");
2964	if (sobj!=null && sameinsured!=null && iobj!=null && tobj!=null && sameinsured.checked == false){
2965		if(tobj!=null){
2966			if (sobj.value==2)
2967			{
2968				tobj.value="Mr";
2969			}else{
2970				tobj.value="Ms";
2971			}
2972			DoReq(tobj);
2973		}
2974	}else{
2975		if(tobj!=null){
2976			if (iobj.value==2)
2977			{
2978				tobj.value="Mr";
2979			}else{
2980				tobj.value="Ms";
2981			}
2982			DoReq(tobj);
2983		}
2984	}
2985}
2986
2987function JSVCGenDOBTrig(src,dobid,genid,male1)
2988{
2989	if(dobid!=null)
2990	{
2991		var dobobj = document.getElementById(dobid);
2992		if(dobobj != null && dobobj.value == "")
2993		{
2994			JSVCSetDOB(src, dobid, null, 1);
2995		}
2996	}
2997	if(genid!=null)
2998	{
2999		var genobj = document.getElementById(genid);
3000		if( genobj != null && genobj.value == "" )
3001		{
3002			JSVCSetGenMyIC(src,genid,null,male1,1);
3003		}
3004	}
3005}
3006
3007function JSVCIDChkMyIC(obj,chkdob)
3008{
3009	if(obj==null)return "";
3010	if(chkdob==null)chkdob=0; // 1=make sure yymmdd is valid
3011	str=obj.value.replace(/[^0-9]/g,"");
3012	if(str.length==12 && (chkdob==0 || (chkdob==1 && JSVCCHKMyICDOB(str.substring(0,6),0)==true  )))
3013	{	obj.value=str.substring(0,6)+"-"+str.substring(6,8)+"-"+str.substring(8,12);
3014		return "";
3015	}
3016	return (JSVClang("should be Malaysian NRIC format",12455)+ " [yymmdd-xx-xxxx].");
3017}
3018
3019/*
3020	EPolicy - Customization #16380_ [TH] Sompo - ID number checking - Redmine
3021
3022	Thailand IC number Check
3023
3024	IC formate: A BBBB CCCCC DD E
3025
3026	A - Signifies type of citizenship
3027	BBBB - Office where the number was issued
3028	CCCCC DD - Group and sequence numbers
3029	E - Check digit
3030*/
3031function JSVCIDChkThIC(obj,company){
3032	if(company==null) company = 0;
3033	var THid = $(obj).val().replace(/[^0-9]/g,"");
3034	var
3035		chk_val,
3036		val_01 = THid.charAt(0),
3037		val_02 = THid.charAt(1),
3038		val_03 = THid.charAt(2),
3039		val_04 = THid.charAt(3),
3040		val_05 = THid.charAt(4),
3041		val_06 = THid.charAt(5),
3042		val_07 = THid.charAt(6),
3043		val_08 = THid.charAt(7),
3044		val_09 = THid.charAt(8),
3045		val_10 = THid.charAt(9),
3046		val_11 = THid.charAt(10),
3047		val_12 = THid.charAt(11),
3048		val_13 = THid.charAt(12);
3049
3050	// Replace the id number that without "-"
3051	$(obj).val(THid);
3052	if (THid.length == 13){
3053		// Checksum
3054		//
3055		chk_val = 11 - (((val_01*13)+(val_02*12)+(val_03*11)+(val_04*10)+(val_05*9)+(val_06*8)+(val_07*7)+(val_08*6)+(val_09*5)+(val_10*4)+(val_11*3)+(val_12*2))%11);
3056
3057		if (chk_val == 10){
3058			chk_val = 0;
3059		} else if (chk_val == 11) {
3060			chk_val = 1;
3061		}
3062
3063		if (val_13 != chk_val || (company==1 && val_01!= 0)){
3064			return JSVClang("should be Thailand NRIC format",25734)+ " 13 integer.";
3065		}
3066		return "";
3067	}
3068	return JSVClang("should be Thailand NRIC format",25734)+ " [x-xxxx-xxxxx-xx-x].";
3069}
3070
3071function JSVCIDChkSgIC(obj)
3072{	var chksum,chk;
3073	if(obj==null)return "";
3074	str=obj.value.toUpperCase().replace(/[^A-Z0-9]/g,"");
3075	if(str.search(/^[SFTG][0-9]{7}[A-Z]$/)==0)
3076	{	// Checksum
3077		obj.value=str;
3078		chksum=(((str.charAt(0)=="T"||str.charAt(0)=="G")?4:0)+parseInt(str.charAt(1))*2+parseInt(str.charAt(2))*7+parseInt(str.charAt(3))*6+parseInt(str.charAt(4))*5+parseInt(str.charAt(5))*4
3079			+parseInt(str.charAt(6))*3+parseInt(str.charAt(7))*2)%11;
3080		if(str.charAt(0)=="S"||str.charAt(0)=="T")chk="JZIHGFEDCBA"
3081		else chk="XWUTRQPNMLK";
3082		if(str.charAt(8)==chk.charAt(chksum))
3083			return "";
3084		return JSVClang("fails validation for a valid Singapore NRIC.\nPlease check you typed it in correctly.",12456);
3085	}
3086	return JSVClang("should be Singapore NRIC format",12457)+ " [X9999999X].";
3087}
3088function JSVCIDChkAeIC(obj)//UAE ID check
3089{
3090    if(obj==null) return "";
3091
3092    str=obj.value.replace(/[^0-9]/g,"");
3093
3094    if( (str.length==15) && obj.value.match(/^\d+$/)) return "";
3095
3096    return JSVClang("format: 15 digits. Currently, the system just allows 15 digits.",0)+ "";
3097}
3098function JSVCIDChkVnIC(obj)//Vietnam ID check
3099{
3100    if(obj==null) return "";
3101
3102    str=obj.value.replace(/[^0-9]/g,"");
3103
3104    if( (str.length==9 || str.length==12) && obj.value.match(/^\d+$/)) return "";
3105
3106    return JSVClang("format: 9 digits or 12 digits. Currently, the system just allows 12 digits.",28875)+ "";
3107}
3108function JSVCIDChkCnIC(obj,idtypechk)//China ID check - param2 not mandatory
3109{
3110    //checking if there is id type need to be selected - for EPLTMCN
3111    if((document.getElementById(idtypechk))&& $("#"+idtypechk+" option:selected").text().toUpperCase()!= 'ID CARD'){
3112       return "";
3113    }
3114    var ID = obj.value;
3115    if(ID=="")return;
3116    ID = ('' + ID).replace(/(^\s*)|(\s*$)/g, "");
3117
3118    if (/^[1-9]{1}[0-9]{16}([0-9]|[xX])$/.test(ID)) {
3119        if (checkDate(ID)) {
3120            var arrID = ID.split('');
3121            var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
3122            var checkCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
3123
3124            var sum = 0;
3125            if (arrID[17].toUpperCase() == 'X') arrID[17] = 10;
3126            for (var i = 16; i >= 0; sum+=arrID[i]*factor[i],i--);
3127            if(arrID[17] == checkCode[sum % 11]){
3128                return "";
3129            }
3130            else{
3131
3132                return JSVClang("invalid ",32125)+ "";
3133            }
3134        } else {
3135            return JSVClang("invalid ",32125)+ "";
3136
3137        };
3138    }
3139    else {
3140        return JSVClang("invalid ",32125)+ "";
3141    };
3142
3143    function checkDate(ID) {
3144        if (ID.length == 18) {
3145            var year = ID.substring(6, 10);
3146            var month = ID.substring(10, 12);
3147            var day = ID.substring(12, 14);
3148            var tempDate = new Date(parseInt(year), parseInt(month)-1, parseInt(day));
3149            return (tempDate.getFullYear() != parseInt(year) || tempDate.getMonth() != parseInt(month)-1 || tempDate.getDate() != parseInt(day))
3150                ? false
3151                : true;
3152        } else {
3153            return false;
3154        };
3155    };
3156}
3157
3158function JSVCIDChkTIN(obj,IDtype){
3159	var NAEnabled=1;
3160	if(obj.getAttribute('naenabled')!=null){
3161		NAEnabled=obj.getAttribute('naenabled');
3162	}
3163	if (IDtype==2){
3164		var reg = /^[a-zA-Z][\w]{8,12}[01]$/;
3165		var result = reg.test(obj.value);
3166		if(obj.value !== '' && result == false){
3167			if (typeof _APP !== 'undefined' && _APP=='EPL') {
3168			return JSVClang("Invalid TIN format. TIN No. should have maximum of 14 characters. It must end with 0 for a husband, or end with 1 for a wife",0);
3169			} else {
3170				return JSVClang("Invalid TIN format, it should be between 10-14 characters, starting with alphabet and ending with 0 or 1 (inclusive)",0);
3171			}
3172			
3173		}
3174	}
3175	else{
3176		var reg = /^[a-zA-Z][\w]{8,12}[01]$/;
3177		var result = reg.test(obj.value);
3178		if(obj.value !== '' && result == false){
3179			if (obj.value !== 'NA' || (NAEnabled!=1 && obj.value == 'NA')) {
3180				return JSVClang("Invalid TIN format, it should be between 10-14 characters, starting with alphabet and ending with 0 (inclusive)",0);
3181			} else {
3182				return 0;
3183			}
3184		}
3185	}
3186	return "";
3187}
3188
3189function JSVCIDChk(obj,incdisabled)
3190{	// Customize per-locale ID checking here
3191	if(incdisabled==null) incdisabled = false;
3192
3193	var nm,obj2,ver;
3194	if(typeof(obj)=="string")
3195	{	nm=obj;obj=document.getElementsByName(nm)[0]; }
3196	else
3197		nm=obj.name;
3198	// Get selected object
3199	if(obj==null)return;
3200	obj2=JSVCRadioGetSelObj(nm+"sel",(incdisabled?null:false));
3201	if(obj2==null)
3202		obj2=JSVCRadioGetSelObj(nm+"cel",(incdisabled?null:false));
3203	if(obj2==null)	/*#21291 check if its select ddl*/
3204		obj2=document.getElementsByName(nm+"cel")[0];
3205	if(obj2==null || (obj2 && obj2.disabled))
3206		obj2=document.getElementsByName(nm+"sel")[0];
3207	if(obj2==null || (obj2 && obj2.disabled))
3208		obj.disabled=true
3209	else
3210		obj.disabled=false;
3211	if(obj2!=null)
3212		if (obj2.tagName=='SELECT' && obj2.selectedIndex>-1)	/*#21291 check if its select ddl*/
3213			ver=obj2.options[obj2.selectedIndex].getAttribute("DOCHKFORMAT");
3214		else
3215			ver=obj2.getAttribute("DOCHKFORMAT");
3216	if(ver!=null && typeof(ver)=="string" && ver.length>0)
3217		obj.setAttribute("CHKFORMAT",ver)
3218	else
3219		obj.removeAttribute("CHKFORMAT");
3220	DoReq(obj);
3221}
3222//Kian Yee : Generate ID string return as string instead
3223function JSVCchkSvcTaxMY(obj){
3224	var reg = /^[A-Z][0-9]{2}-[0-9]{2}(0[1-9]|1[0-2])-[0-9]{8}$/;
3225	var result = reg.test(obj.value);
3226
3227	if(obj.value !== '' && result == false){
3228		if (typeof _APP !== 'undefined' && _APP=='EPL') {
3229			return JSVClang("Invalid Service Tax No. Format<br>↪Example: ANN-YYMM-NNNNNNNN (eg:A12-9912-12345678)<br>↪Consist of alphanumeric characters including dash",0);
3230		}
3231		else {
3232			return JSVClang(
3233				"Invalid SST No. format. SST No. should be in this format: ANN-YYMM-NNNNNNNN<br>" +
3234				"a) Total 17 characters including dash '-'<br>" +
3235				"b) A = Alphabetical (A-Z)<br>" +
3236				"c) YY = Year (00-99)<br>" +
3237				"d) MM = Month (01-12)<br>" +
3238				"e) N = Number (0-9)<br>" +
3239				"f) Position 4 and 9 must be a dash '-'", 
3240				0
3241		);
3242		}
3243	}
3244	return "";
3245}
3246function JSVCGenNameIDStr(text,nmtyp,iddisp,nm,dis,nmreq,nmsel,nmval,req1,sel1,val1,req2,sel2,val2,spcnm,nmselchgExec,appendHTML,hiderad1,hiderad2,id_fld_chk,mic,readonly,ciidtype,forcetblfmt,bluenote,id1_maxlength,nm_fld_chk,nationalityinput,nationalitycurval,nationalityreq,nationalitydisabled,NameIDObject)
3247{	// text: String or String Array of text (e.g. Claimant,Insured,Driver)
3248	// nmtyp: Name type - 1 - Individual only, 2 - Individual and company
3249	// iddisp: Bit 1: Show Main ID, Bit 2: Show Sec ID
3250	// nm: Name of object
3251	// dis: Disabled or not
3252	// req/sel/val: Required(2=only if existing)/Type-Sel-Value/Value
3253	// spcnm: Special claimant like SPANCO (format: COID|ShortName|Name|CoRegNo)
3254	// appendHTML: HTML to append to Name column
3255	// id_fld_chk : additional onblur
3256	// forcetblfmt : force hardcode tablefmt
3257	// nm_fld_chk : additional onblur (name field)
3258
3259	//nationalityinput : 1 = show nationality input between the Primary ID and Secondary ID
3260	//nationalitycurval : current nationality value
3261	//nationalityreq : nationality required field status
3262	//nationalitydisabled : nationality disabled field status
3263	//NameIDObject : object for the NameID
3264	var spclist,genstr,fnlstr,tablefmt=true;
3265	var readonlytext="";
3266	if(hiderad1 == null) hiderad1 = 0;
3267	if(hiderad2 == null) hiderad2 = 0;
3268
3269	fnlstr="";
3270	if(typeof(text)=="string")
3271	{   var tmp=text;
3272	    text=new Array();
3273	    text[0]=tmp+" "+JSVClang("Name",1173);
3274	    text[1]=tmp+" "+JSVClang("ID",2122);
3275	    text[2]=tmp+" "+JSVClang("Second ID",6030);
3276	}
3277	if(nmselchgExec==null)nmselchgExec="";
3278	if(nmreq==null)nmreq=0;
3279	if(nmtyp==null)nmtyp=2;
3280	if(request.mobile!=null)tablefmt = false;
3281	if(mic==null)mic=0;
3282	if(bluenote==null)bluenote='';//#37546
3283	if(readonly){
3284		readonlytext="readonly";
3285	}
3286	if(mic==1)
3287		fnlstr+="<div><div valign=baseline>"+text[0]+"</div><div>";
3288	else if(tablefmt)
3289		fnlstr+="<tr id=TRINSUREDDTL1><td valign=baseline>"+text[0]+"</td><td>";
3290	else
3291		fnlstr+="<div class='row form-group' id=TRINSUREDDTL1><div class='"+request.mobile_col1+"'>"+text[0]+"</div><div class='"+request.mobile_col2+"'>";
3292
3293	if(nmtyp==2)
3294	{	fnlstr+="<input URLVAR ID=\"_"+nm+"nmselIND\" name=\""+nm+"nmsel\" CHKREQUIRED "+(nmsel==2?"CHECKED ":"")+"type=radio "+(dis==1?"DISABLED ":"")+" value=2 onclick=\"JSVCNameClick(this,"+req1+");"+nmselchgExec+"\"><label for=\"_"+nm+"nmselIND\"> "+JSVClang("Individual",6031)+"</label> ";
3295		fnlstr+="<input URLVAR ID=\"_"+nm+"nmselCOM\" name=\""+nm+"nmsel\" CHKREQUIRED "+(nmsel==1?"CHECKED ":"")+" type=radio value=1 "+(dis==1?" DISABLED ":"")+" onclick=\"JSVCNameClick(this,"+req1+");"+nmselchgExec+"\"><label for=\"_"+nm+"nmselCOM\"> "+JSVClang("Company",2033)+"</label> ";
3296		if(spcnm!=null && spcnm.length>0)
3297		{	spclist=spcnm.split("|");
3298			fnlstr+="<input URLVAR ID=\"_"+nm+"nmselSPC\" SPCNM=\""+spcnm+"\" name=\""+nm+"nmsel\" value="+spclist[0]+" CHKREQUIRED "+(nmsel==spclist[0]?"CHECKED ":"")+(dis==1?"DISABLED ":"")+" type=radio onclick=\"JSVCNameClick(this);"+nmselchgExec+"\"><label for=\"_"+nm+"nmselSPC\"> "+spclist[1]+"</label>";
3299		}
3300		fnlstr+="<br>";
3301	}
3302	//fnlstr+="<input URLVAR "+(nmreq>0?"CHKREQUIRED ":"")+" name=\""+nm+"nm\" id=\""+nm+"nm\" maxlength=100 size=50 VALUE=\""+nmval+"\" "+(dis==1?"DISABLED ":"")+" onblur=DoReq(this)>";
3303	fnlstr+="<input URLVAR "+(!isNaN(nmreq)&&nmreq>0?"CHKREQUIRED ":(nmreq!=''?"CHKREQUIRED=\""+nmreq+"\" ":""))+" name=\""+nm+"nm\" id=\""+nm+"nm\" maxlength=200 size=50 VALUE=\""+SVChtm(nmval)+"\" "+(dis==1?"DISABLED ":"")+" onblur=DoReq(this) "+readonlytext+">";
3304
3305	if(mic==1)
3306		fnlstr+=(nmtyp!=2?"<br><input type=radio style=visibility:hidden>":"")+(appendHTML!=null?"<br>"+appendHTML:"")+"</div>";
3307	else if(tablefmt)
3308		fnlstr+=(nmtyp!=2?"<br><input type=radio style=visibility:hidden>":"")+(appendHTML!=null?"<br>"+appendHTML:"")+"<label style='color: blue; font-style:italic; font-weight: bold;'>"+(bluenote!=null?"<br>"+bluenote:"")+"</label>"+"</td></tr>";//#37546
3309	else
3310		fnlstr+=(nmtyp!=2?"<br><input type=radio style=visibility:hidden>":"")+(appendHTML!=null?"<br>"+appendHTML:"")+"</div></div>";
3311
3312	if((iddisp&1)==1)
3313	{	genstr=JSVCGenIDStr(1,nm+"ID1",dis,req1,sel1,val1, hiderad1,nmtyp,id_fld_chk);
3314		if(genstr!="" && genstr!=null)
3315		{
3316			if(mic==1)
3317				fnlstr+="<div valign=baseline>"+text[1]+"</div><div>"+genstr+"</div></div>";
3318            else if(tablefmt)
3319				fnlstr+="<tr id=TRINSUREDDTL2><td valign=baseline>"+text[1]+"</td><td>"+genstr+"</td></tr>";
3320            else
3321				fnlstr+="<div class=\"row form-group\" id=TRINSUREDDTL2><div class='"+request.mobile_col1+"'>"+text[1]+"</div><div class='"+request.mobile_col2+"'>"+genstr+"</div></div>";
3322		}
3323	}
3324	
3325	if(nationalityinput==1 && NameIDObject!=null){
3326		fnlstr+=NameIDObject.genNationality(nationalitycurval,nationalityreq,nationalitydisabled);
3327	}
3328
3329	if((iddisp&2)==2)
3330	{
3331		genstr=JSVCGenIDStr(2,nm+"ID2",dis,req2,sel2,val2, hiderad2,nmtyp,id_fld_chk);
3332		if(genstr!="" && genstr!=null)
3333		{
3334			if(mic==1)
3335				fnlstr+=((iddisp&1)==1?"<div>":"")+"<div valign=baseline>"+text[2]+"</div><div>"+genstr+"</div>"+((iddisp&1)==0?"</div>":"");
3336			else if(tablefmt)
3337				fnlstr+="<tr id=TRINSUREDDTL3><td valign=baseline>"+text[2]+"</td><td>"+genstr+"</td></tr>";
3338			else
3339				fnlstr+="<div class='row form-group' id=TRINSUREDDTL3><div class='"+request.mobile_col1+"' valign=baseline>"+text[2]+"</div><div class='"+request.mobile_col2+"'>"+genstr+"</div></div>";
3340		}
3341	}
3342	if(dis!=1)
3343	{
3344		AddOnloadCode("JSVCNameClick('"+nm+"');");
3345	}
3346	return fnlstr;
3347}
3348function JSVCDoIC(obj,oldic){
3349 if(jSVClocid==1){
3350   if(oldic==1){
3351     if(CheckAlphaNum(obj.value)!='')  SVCalert(CheckAlphaNum(obj.value));
3352   }else{
3353     if(JSVCIDChkMyIC(obj)!= '') SVCalert(JSVCIDChkMyIC(obj)); }
3354 }else if(jSVClocid==2){
3355   if(JSVCIDChkSgIC(obj)!= '') SVCalert(JSVCIDChkSgIC(obj));
3356 }else{
3357    if(JSVCIDChkMyIC(obj)!= '') SVCalert(JSVCIDChkMyIC(obj));
3358 }
3359
3360
3361}
3362function JSVCDoMobile(obj,re,allowNoPhone,showalert) /* changed alert to showalert. alert is a js reserved word */
3363{
3364	var r;
3365	Despace(obj);
3366	r=obj.value.toUpperCase();
3367	if(allowNoPhone==null)
3368		allowNoPhone=1;
3369	if(showalert==null) showalert=1;
3370	if(r.length>0)
3371	{	if(r=="NOPHONE" && allowNoPhone==1)
3372			obj.value=r
3373		else
3374		{	if(re==null)
3375				re=obj.getAttribute("MRMREFORMAT");
3376			if(re!="")
3377			{
3378			re=new RegExp(re);
3379			if(r.search(re)<0 || (r==(("000000000000000000").substring(0,r.length))))
3380			{
3381				if(showalert==1) {
3382					alert(JSVClang("Invalid mobile number.",3337),-1,"ALERT");
3383				}
3384
3385				obj.value="";
3386				obj.select();
3387			}}
3388		}
3389	}
3390	if(obj.getAttribute("prefix") && obj.getAttribute("prefix")==1)
3391    	DoReq(obj.previousSibling);
3392    else
3393       	DoReq(obj);
3394}
3395function JSVCDoPhone(obj,rx,allowNoPhone,showalert)
3396{
3397	var val,re,val2,chkreq,msg='';
3398	val=obj.value;
3399	val2=obj.getAttribute("CURVALUE");
3400	chkreq=obj.getAttribute("CHKREQUIRED");
3401	if(allowNoPhone==null)
3402		allowNoPhone=1;
3403	if(showalert==null) showalert=1;
3404	if(val2 && val2!="" && val==val2)
3405		return;
3406	if(rx!=null && rx!="") {
3407		re=new RegExp(rx);
3408	} else {
3409		if(jSVClocid==2)
3410			re=/^[3689][0-9]{7}$/;
3411		else if(jSVClocid==15)
3412            re=/^[0][0-9]{7,10}$/;
3413        else if(jSVClocid==14)
3414        	re=/^[0-9]{8,10}(\/[0-9]+)*$/;
3415		else
3416			re=/^\+?[0-9]{2,}\-[0-9]{6,8}(\/[0-9]+)*$/;
3417	}
3418	if(val.search(re)<0 && val!="")
3419	{
3420		if(chkreq!=null && val.toUpperCase().search("NOPHONE")>=0 && allowNoPhone==1)
3421			val="NOPHONE";
3422		else {
3423			if(rx)
3424				msg=JSVClang("Invalid phone format.",25736);
3425			else
3426				if(jSVClocid==2)
3427					msg=JSVClang("Invalid phone format. Use 3xxxxxxx/6xxxxxxx/8xxxxxxx/9xxxxxxx format.",12458);
3428				else if(jSVClocid==15)
3429                    msg=JSVClang("Invalid phone format. Use ",25737)+"0xxxxxxx/0xxxxxxxx/0xxxxxxxxx/0xxxxxxxxxx format.";
3430                else if(jSVClocid==14)
3431                	msg=JSVClang("Invalid phone format. Use ",25737)+'xxxxxxxx or xxx-xxxxxxx/xx/xx (for extensions) format.';
3432				else
3433					msg=JSVClang("Invalid phone format. Use xxx-xxxxxxx or xxx-xxxxxxx/xx/xx format.",5693);
3434			val="";
3435
3436			if(msg!='' && showalert==1) alert(msg);
3437		}
3438	}
3439	obj.value=val;
3440
3441	DoReq(obj);
3442
3443	if(msg!='' && showalert==0) return msg;
3444}
3445function JSVCDoEmail(obj,type,allownoemail,showalert) {
3446	var r,rx,objset,c;
3447	Despace(obj);
3448	r=obj.value;
3449	if(obj.name) objset=document.getElementsByName(obj.name);
3450	if(type==null) type=0;
3451	if(allownoemail==null) allownoemail=1;
3452	if(showalert==null) showalert=1;
3453	if(r.length>0) {
3454		if(allownoemail==1 && r.toUpperCase()=='NOEMAIL') {
3455			if(objset.length>1) // multi
3456			{
3457				for(c=0;c<objset.length;c++) {
3458					objset[c].value=(c==0?'NOEMAIL':'');
3459					DoReq(objset[c]);
3460				}
3461			} else
3462				document.getElementById(obj.id).removeAttribute('chkreformat');
3463				obj.value=r.toUpperCase();
3464		} else {
3465			if(type==1)
3466				rx=/^[\w&\-']+(?:\.[\w&\-']+)*@(?:[\w-]+\.)+[a-zA-Z]{2,15}$|^([0-9a-zA-Z_]{3,20})$/;
3467			else
3468				rx=/^[\w&\-']+(?:\.[\w&\-']+)*@(?:[\w-]+\.)+[a-zA-Z]{2,15}$/;
3469			if(!rx.test(r)) {
3470				document.getElementById(obj.id).setAttribute('chkreformat',rx.toString().slice(1,-1));
3471				if(showalert==1)
3472					SVCalert(JSVClang("Invalid Email.",12459),null,null,"JSVCDoFocus(JSVCall('"+obj.id+"'))");
3473			}
3474		}
3475	}
3476	DoReq(obj);
3477}
3478function JSVCGetMobile(nm)
3479{	var o,ret;
3480	o=document.getElementsByName(nm);
3481	if(o!=null && o.length>0)
3482	{	o=o[0];
3483		o2=o.previousSibling;
3484		if(o.value!="NOPHONE"&&o.value!=""&&o2!=null&&o2.tagName=="SELECT"&&o2.value!="")
3485			return o2.value+o.value;
3486	}
3487	return "";
3488}
3489
3490//KY: To set value for mobile phone field from javascript populate
3491function JSVCSetMobile(objname,val){
3492	var phoneobj,prefixobj,t,preflen;
3493	phoneobj=document.getElementById(objname);
3494	prefixobj=document.getElementById(objname+'pref');
3495	if(phoneobj&&prefixobj){
3496		preflen=0;
3497		prefixobj.value = '';
3498		if(val==null)val='';
3499		if(val.length > 0){
3500			for (t = 0; t < prefixobj.options.length; t++) {
3501				if (val.substring(0, prefixobj.options[t].value.length) == prefixobj.options[t].value) {
3502					prefixobj.value = prefixobj.options[t].value;
3503					preflen = prefixobj.options[t].value.length;
3504				}
3505			}
3506		}
3507		document.getElementById(objname).value=val.substring(preflen, val.length);
3508		document.getElementById(objname).onblur();
3509	}
3510}
3511
3512function JSVCGenMobile(name,prefixes,postfixRE,value,req,disabled,allowNoPhone,fld_chk)
3513{
3514	var aprefixes,t,sel,out;
3515	out="";
3516	if(prefixes==null)
3517		prefixes="";
3518	if(req==null)
3519		req=1;
3520	if(allowNoPhone==null)
3521		allowNoPhone=1;
3522	if(prefixes!="")
3523	{
3524		sel=0;
3525		br=0; //#44174		
3526		splitprefix=prefixes.split(","); //#44281 Khai 	
3527		aprefixes = splitprefix.sort((a,b) => b.length - a.length); //#44281 Khai sorted prefix from longest to shortest to solve 4 digits prefix split issues
3528		if (aprefixes.length > 1) // If more than one  Prefixes
3529		{
3530			out += "<select CHKREQUIRED=\"obj.nextSibling.value!='NOPHONE'" + (req == 1 ? "" : "&&obj.nextSibling.value!=''") + "\" id=\"" + name + "pref\" name=\"" + name + "pref\" onblur=DoReq(this);DoReq(this.nextSibling); " + (disabled ? "DISABLED" : "") + ">" + (aprefixes.length > 1 ? "<OPTION VALUE=''></OPTION>" : "");
3531			for (t = 0; t < aprefixes.length; t++) {
3532				if (br == 0 && sel == 0 && value != null && value.length > 0 && value.substring(0, aprefixes[t].length) == aprefixes[t]) {
3533					sel = 1;
3534					value = value.slice(aprefixes[t].length);
3535					br = 1;
3536				}
3537				else
3538					sel = 0;
3539				out += "<OPTION value=\"" + aprefixes[t] + "\"" + (sel == 1 ? " SELECTED" : "") + ">" + aprefixes[t] + "</OPTION>";
3540			}
3541			out += "</select>";
3542		}
3543		else // IF only one Prefix (Added By Oliver 11May2010)
3544		{
3545			var prefvalue = aprefixes[0];
3546			var preflen = prefvalue.length;
3547
3548			if(value.length>=preflen && value.substring(0,preflen)==prefvalue)
3549				value=value.slice(preflen);
3550
3551			out += "<input CHKREQUIRED=\"obj.nextSibling.value!='NOPHONE'" + (req == 1 ? "" : "&&obj.nextSibling.value!=''") +
3552			        "\" id=\"" + name + "pref\"" +
3553					"name=\""  + name + "pref\"" +
3554					"value=\"" + prefvalue + "\"" +
3555					"Size=\""  + preflen + "\"" +
3556					"Maxlength=\"" + preflen + "\"" +
3557					"onblur=\"DoReq(this);DoReq(this.nextSibling);" + (!!fld_chk?fld_chk:'')  + "\"" +
3558					" READONLY>"; // To Display
3559					//"DISABLED>";
3560			/*
3561			out += "<input TYPE=Hidden CHKREQUIRED=\"obj.nextSibling.value!='NOPHONE'" + (req == 1 ? "" : "&&obj.nextSibling.value!=''") +
3562			        "\" id=\"" + name + "pref\"" +
3563					"name=\""  + name + "pref\"" +
3564					"value=\"" + prefvalue + "\"" +
3565					"Size=\""  + preflen + "\"" +
3566					"Maxlength=\"" + preflen + "\"" +
3567					"onblur=DoReq(this);DoReq(this.nextSibling); " +
3568					">";			// To Pass Over Act File
3569					*/
3570		}
3571	}
3572	// Mike
3573	// Commented out by Andrew - wrong way to do thing should make it non required rather than force NOPHONE!
3574//	if(locid!=null&&value.length==0&&(locid==2||locid==4||locid==6))
3575//		value="NOPHONE";
3576	var hidobj=document.getElementById("hid"+name);// sue add this as a hack to copy the value over from insured to driver or driver to insured in mclm.js>> CopyInsured(), as it failed to capture the value. #27227
3577	out+="<input "+(req==1?"CHKNAME=\""+JSVClang("Mobile No",6032)+"\" CHKREQUIRED ":"")+"name=\""+name+"\" id=\""+name+"\" VALUE=\""+value+"\" MRMREFORMAT=\""+postfixRE+"\" "+(prefixes!=""?" prefix=1 ":" prefix=0 ")+" onblur='JSVCDoMobile(this,null,"+(allowNoPhone==1?1:0)+");DoReq(this);"+(hidobj?"document.getElementById(\"hid"+name+"\").value=this.value;":"")+(!!fld_chk?fld_chk:"")+"' "+(disabled?"DISABLED":"")+">";
3578	return out;
3579}
3580
3581/*
3582function JSVCGenMobile(name,prefixes,postfixRE,value,req,disabled,allowNoPhone)
3583{
3584	var aprefixes,t,sel,out;
3585	out="";
3586	if(prefixes==null)
3587		prefixes="";
3588	if(req==null)
3589		req=1;
3590	if(allowNoPhone==null)
3591		allowNoPhone=1;
3592	if(prefixes!="")
3593	{
3594		sel=0;
3595		aprefixes=prefixes.split(",");
3596		out+="<select CHKREQUIRED=\"obj.nextSibling.value!='NOPHONE'"+(req==1?"":"&&obj.nextSibling.value!=''")+"\" id=\""+name+"pref\" name=\""+name+"pref\" onblur=DoReq(this);DoReq(this.nextSibling); "+(disabled?"DISABLED":"")+">"+(aprefixes.length>1?"<OPTION/>":"");
3597		for(t=0;t<aprefixes.length;t++)
3598		{
3599			if(sel==0 && value!=null && value.length>0 && value.substring(0,aprefixes[t].length)==aprefixes[t])
3600			{	sel=1;value=value.slice(aprefixes[t].length); }
3601			else
3602				sel=0;
3603			out+="<OPTION value=\""+aprefixes[t]+"\""+(sel==1?" SELECTED":"")+">"+aprefixes[t]+"</OPTION>";
3604		}
3605	}
3606	// Mike
3607	// Commented out by Andrew - wrong way to do thing should make it non required rather than force NOPHONE!
3608//	if(locid!=null&&value.length==0&&(locid==2||locid==4||locid==6))
3609//		value="NOPHONE";
3610	out+="<input "+(req==1?"CHKNAME=\""+JSVClang("Mobile No",6032)+"\" CHKREQUIRED ":"")+"name=\""+name+"\" id=\""+name+"\" VALUE=\""+value+"\" MRMREFORMAT=\""+postfixRE+"\" onblur=JSVCDoMobile(this,null,"+(allowNoPhone==1?1:0)+") "+(disabled?"DISABLED":"")+">";
3611	return out;
3612}
3613*/
3614
3615function SVChtm(txt,typ,relist,reresult)
3616{	if(typeof(txt)!="string")return null;
3617	txt=txt.replace(/&/g,"&amp;").replace(/\"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
3618	if(typ==2){
3619		if(txt.substring(txt.length-2,txt.length)=="\n ")
3620			txt=txt.substring(0,txt.length-2)+"<br>&nbsp;";
3621		txt=txt.replace(/\n/g,"<br>");
3622		if(relist!=null&&reresult!=null)
3623		for(var t in relist)
3624			txt=txt.replace(relist[t],reresult[t]);
3625	}
3626	return txt;
3627}
3628function JSVCremoveURL(url,str)
3629{
3630	// Sync: JSVCremoveURL() and FN.SVCremoveURL()
3631    rgexp=new RegExp("([&\?])("+str+")[=][^&]*","gi");
3632    result=url.replace(rgexp,"$1");
3633    result=result.replace(/([&\?])&*/gi,"$1");
3634    result=result.replace(/&*$/,""); // remove at ending
3635    return result;
3636}
3637function JSVCSetStructForm(o,oF) { // to populate all fields into struct, deserialise and keep into a field, working together with "JSVCGetStructForm"
3638	var tmp,si;
3639	if(typeof(o)=='string') o=document.getElementById(o);
3640	if(typeof(oF)=='string') oF=document.getElementById(oF);
3641	if(o!=null&&oF!=null) {
3642		tmp=JSVCGetStructForm(o);
3643		if(tmp!=null) {
3644			si=JSON.stringify(tmp);
3645			oF.value=(si!=null?si:'');
3646		}
3647	}
3648}
3649function JSVCGetStructForm(o) { // to return struct of all form variable name (by name) with its value , return as struct
3650	var structval={},os;
3651	if(typeof(o)=='string') o=document.getElementById(o);
3652	if(o!=null ) {
3653		os=o.getElementsByTagName('INPUT');
3654		if(os!=null&&os.length>0) {
3655			for(var cnt=0;cnt<os.length;cnt++) {
3656				if(os[cnt].getAttribute('name')!=null)
3657					structval[os[cnt].name]=Trim(os[cnt].value);
3658			}
3659		}
3660		os=o.getElementsByTagName('SELECT');
3661		if(os!=null&&os.length>0) {
3662			for(var cnt=0;cnt<os.length;cnt++) {
3663				if(os[cnt].getAttribute('name')!=null)
3664					structval[os[cnt].name]=Trim(os[cnt].value);
3665			}
3666		}
3667	}
3668	return structval;
3669}
3670function JSVCArraySum(obj) {
3671	var ret=null,cnt,sum=0;
3672	if(obj!=null && JSVCisArray(obj) && obj.length>0) {
3673		for(cnt=0;cnt<obj.length;cnt++) {
3674			sum+=parseFloat(obj[cnt]);
3675		}
3676		ret=sum;
3677	}
3678	return ret;
3679}
3680function JSVCListSum(obj,delim) { // obj as str list of numeric values
3681	var ret=null,cnt,sum=0;
3682	delim=(delim!=null&&typeof(delim)!='undefined' ? delim : ',');
3683	if(obj!=null && obj!='') {
3684		return JSVCArraySum(obj.split(delim));
3685	} else
3686		return null;
3687}
3688function JSVCListFindNoCase(list,findvval){
3689	list=list.toUpperCase();
3690	findvval=findvval.toUpperCase();
3691	return JSVCListFind(list,findvval);
3692}
3693function JSVCListFind(list,findvval) {
3694	var found=-1,cnt=0;
3695	list=(list!=null?list.split(','):null);
3696	if(list!=null) {
3697		//return list.indexOf(findvval); : not supported by IE8 and below
3698		found=jQuery.inArray( findvval, list );
3699		if(isNaN(findvval)==false && (found==null || found==-1)) {
3700			for(cnt=0;cnt<list.length;cnt++) {
3701				if(isNaN(list[cnt])==false && parseFloat(findvval)==parseFloat(list[cnt]) ) {
3702					found=cnt;
3703					break;
3704				}
3705			}
3706		}
3707	}
3708	return found;
3709}
3710function JSVCListGetAt(list,index,delim,includeEmpty) {
3711	delim = (delim? delim: ',');
3712    var a = list.split(delim);
3713    var target;
3714    for(var i=0;i<list.length;i++){
3715        if(i==index) {
3716            target == list[i];
3717            break;
3718        }
3719    }
3720    return target;
3721}
3722function JSVCListToArray(list,delim) {
3723	var ret;
3724	var delims=(typeof(delim)=='undefined'||delim==null?',':delim);
3725	ret=list.split(delims);
3726	return ret;
3727}
3728function JSVCgenOptions(str,sep,sel,rettext,sort,type,nm){
3729	if(typeof(type)=='undefined'||type==null||type=='')type=1;
3730	var lst, t, ret;
3731	if (sep == null || sep == "")
3732		sep = ",";
3733	//if (sel == null || sel == "")
3734	//	sel = "";
3735	ret = "";
3736	var srt={
3737		load:function(str,sep) {
3738			var lst=str.split(sep);
3739			this.sep=sep;
3740			this.list=[];
3741			for(t=0;t<lst.length-1;t+=2) {
3742				this.list[t/2]=[lst[t],lst[t+1]];
3743			}
3744		},
3745		sf:function(a,b) {
3746			var a1=a[1];var b1=b[1];var c=0;
3747			if(a1>b1) c=1;
3748			else if(a1<b1) c=-1;
3749			else c=0;
3750			return c;
3751		},
3752		result:function() {
3753			var ar=this.list.sort(this.sf);
3754			for(var i in ar)
3755				ar[i]=ar[i].join(this.sep);
3756			ar=ar.join(this.sep);
3757			return ar;
3758		}
3759	}
3760	if(sort==1) {
3761		srt.load(str,sep);
3762		lst=srt.result().split(sep);
3763	}
3764	else
3765		lst=str.split(sep);
3766	if(type==1){
3767		for (t = 0; t < lst.length-1; t += 2) {
3768			idxsel=0; // default
3769
3770			if(lst[t+1]=="")lst[t+1]=lst[t];
3771			if(sel==lst[t] && rettext!=null)rettext.txt=lst[t + 1];
3772			if(sel!=null && JSVCisArray(sel)==true) /* selected value in array */
3773				if(isNaN(lst[t]))
3774					idxsel=(JSVCArrayIndexOf(sel,lst[t])>=0?1:0);
3775				else 
3776					idxsel=(JSVCArrayIndexOf(sel,parseFloat(lst[t]) )>=0?1:0);
3777			else
3778				idxsel=(sel == lst[t] || ( !isNaN(sel) && !isNaN(lst[t]) && parseFloat(sel) == parseFloat(lst[t]) ) ? 1:0);
3779			ret += "<OPTION VALUE=\"" + lst[t] + "\"" + (idxsel==1 ? " SELECTED" : "") + ">" + SVChtm(lst[t + 1]) + "</OPTION>";
3780			//if(sel.indexOf(lst[t]) > -1 && rettext!=null)rettext.txt=lst[t + 1];
3781			//ret += "<OPTION VALUE=\"" + lst[t] + "\"" + (sel.indexOf(lst[t]) > -1 || ( !isNaN(sel) && !isNaN(lst[t]) && parseFloat(sel) == parseFloat(lst[t]) ) ? " SELECTED" : "") + ">" + SVChtm(lst[t + 1]) + "</OPTION>";
3782		}
3783	} else if(type==2){
3784
3785		for(var cnt=0;cnt<lst.length-1; cnt=cnt+2) {
3786				selval=lst[cnt];
3787				seltxt=lst[cnt+1];
3788				ret+='<label><input type="radio" name="'+nm+'" value='+(isNaN(selval)?'"'+selval+'"':selval)+(onclick!=null?" onclick="+this.id+".objCallback(this,'RADIO','"+col[2]+"')":"")+(selval==sel?" checked":"")+' > '+seltxt+'&nbsp;&nbsp;</label>';
3789			}
3790	}
3791	return ret;
3792}
3793function JSVCbodyResize(obj)
3794{
3795	if(parent!=null)
3796		if(parent.bodyResizeHook!=null)
3797			parent.bodyResizeHook(obj);
3798}
3799function JSVCoptionsAdd(obj,text,value,pos) {
3800    if(!(obj!=null && obj.tagName=="SELECT")) return;
3801
3802	var chkdupe=function(options,value) {
3803		for(var i=0;i<options.length;i++) {
3804			if(options[i].value==value)
3805				return true;
3806		}
3807		return false;
3808	}
3809
3810    if(text!=null && text.constructor.toString().indexOf("Array")>=0) {
3811		if(!chkdupe(obj.options,text[1]))
3812	        obj.options[pos!=null?pos:obj.options.length]=new Option(text[0],text[1]);
3813	}
3814    else if(value!=null && value.constructor.toString().indexOf("Array")>=0) {
3815		if(!chkdupe(obj.options,value[0]))
3816	        obj.options[pos!=null?pos:obj.options.length]=new Option(value[1],value[0]);
3817	}
3818    else {
3819		if(!chkdupe(obj.options,value))
3820	        obj.options[pos!=null?pos:obj.options.length]=new Option(text,value);
3821	}
3822}
3823function JSVCoptionsRemove(obj,value) {
3824    if(!(obj!=null && obj.tagName=="SELECT")) return;
3825
3826	for(var i=0;i<obj.options.length;i++) {
3827		if(obj.options[i].value==value) {
3828			obj.remove(i);
3829			break;
3830		}
3831	}
3832}
3833function JSVCoptionsReplace(obj,valueO,textN,valueN,pos) {
3834    if(!(obj!=null && obj.tagName=="SELECT")) return;
3835
3836	for(var i=0;i<obj.options.length;i++) {
3837		if(obj.options[i].value==valueO) {
3838			obj.remove(i);
3839			JSVCoptionsAdd(obj,textN,valueN,pos);
3840			break;
3841		}
3842	}
3843}
3844/////////////////////////////////////////////////////////////////////////////////////////
3845// To open a new window
3846// src = URL to point to in the new window
3847// cascade = offset from the parent window in pixel
3848// menubar = to turn on menu bar ('yes' or 'no')
3849// awidth = width of the window
3850// aheight = height of the window
3851// returnwin = true: returns a reference to the new window; false: no return
3852// wintype = window type - window: opens a new window; modeless: opens a modeless dialog box; modal: opens a modal dialog box
3853// NOTE : wintype=="modal" - window.showModalDialog method is removed, ref : https://developer.mozilla.org/en-US/docs/Web/API/Window/showModalDialog
3854////////////////////////////////////////////////////////////////////////////////////////
3855function JSVCopenWin(src, cascade, menubar, awidth, aheight, returnwin, wintype, winname )
3856{
3857	if (cascade == null) cascade = 0;
3858	if (menubar == null) menubar = "no";
3859	if (returnwin==null) returnwin = false;
3860	if (wintype==null) wintype = "window";
3861
3862	var aWin = window.self;
3863	var x_offset, y_offset, win_width, win_height, aStr, newwin;
3864
3865    if (awidth == null)
3866    {
3867        x_offset = 50;
3868    }
3869    else
3870    {
3871        x_offset = (aWin.screen.availWidth - awidth )/ 2;
3872    }
3873    if (aheight == null)
3874    {
3875        y_offset = 50;
3876    }
3877    else
3878    {
3879        y_offset = (aWin.screen.availHeight - aheight ) / 2;
3880    }
3881    win_width = aWin.screen.availWidth - (2 * x_offset);
3882    win_height = aWin.screen.availHeight -(2 * y_offset);
3883	if (menubar="yes") win_height -= 50; // roughly the size of the menubar
3884    y_offset = y_offset + cascade;
3885    x_offset = x_offset + cascade;
3886	if(winname==null)
3887		winname="";
3888	switch (wintype)
3889	{
3890		case "window":
3891		{
3892			aStr = "left=" + x_offset + ",height=" + win_height + ",top=" + y_offset + ",width=" + win_width + ",scrollbars=yes,resizable=yes,status=yes,menubar="+menubar;
3893			newwin=window.open(src, winname, aStr );
3894			break;
3895		}
3896		case "modeless":
3897		{
3898		 	aStr = "dialogLeft:" + x_offset + "px; dialogHeight:" + win_height + "px; dialogTop:" + y_offset + "px; dialogWidth:" + win_width + "px; resizable:'yes'; status:'yes'";
3899			newwin=window.showModelessDialog(src, winname, aStr);
3900			break;
3901		}
3902		case "modal":
3903		{
3904			aStr = "dialogLeft:" + x_offset + "px; dialogHeight:" + win_height + "px; dialogTop:" + y_offset + "px; dialogWidth:" + win_width + "px; resizable:'yes'; status:'no'";
3905			newwin=window.showModalDialog(src, winname, aStr);
3906			break;
3907		}
3908	}
3909	if (returnwin) return newwin;
3910}
3911function JSVCDoBackWarning()
3912{
3913	document.write("<form autocomplete='off'><blockquote class=clsColorNote style=display:none><input type=hidden id=MMPARSEONCE>"+JSVClang("You are returning to a previous page. This page may be outdated.<br>Please click 'Refresh' to refresh the page.",1378)+"</blockquote></form>");
3914	AddOnloadCode("var obj=document.getElementById('MMPARSEONCE');if(obj.value=='1') { obj.parentNode.style.display=''; } else { obj.value='1'; };");
3915}
3916function JSVCshow(obj,show)
3917{
3918    if(show==null)
3919        show=1;
3920    var o,listarr;
3921    if(typeof(obj)=="string") {
3922		listarr=obj.split(",");
3923		for(abc in listarr) {
3924			o=JSVCall(listarr[abc]);
3925		    if(o!=null)
3926		        o.style.display=(show==1?"":"none");
3927		}
3928		return;
3929	}
3930    else if(obj!=null)
3931        o=obj;
3932    if(o!=null)
3933        o.style.display=(show==1?"":"none");
3934}
3935function JSVChide(obj)
3936{
3937    JSVCshow(obj,0);
3938}
3939
3940/*------------------------Kian Yee:Popup a Window ------------------*/
3941//1 - for maximize ,2 - for fullscreen,3 - clean params
3942function JSVCgenPopWin(url, winname, w, h,full,exstring)
3943{	// Returns object
3944	var params,PopupWin;
3945	if (winname==null||winname==""){
3946		winname = 'PopupWin';
3947		}
3948	if (w==null||w==""){
3949		w = 600;
3950	}
3951	if (h==null||h==""){
3952		h = 600;
3953	}
3954	if (exstring==null){
3955		exstring="";
3956	}
3957	if (full!=null&&full==1){
3958		params  = 'scrollbars=yes,resizable=yes,width='+screen.width+', height='+screen.height+', top=0, left=0'+', fullscreen=yes'+exstring;
3959	}
3960	if  (full==3){
3961		params  = 'width='+w+',height='+h+exstring;
3962	}
3963	else{
3964		params = 'scrollbars=yes,resizable=yes,width='+w+',height='+h+exstring;
3965	}
3966	PopupWin = window.open(url,winname,params);
3967	PopupWin.focus();
3968	// causing pages to become blank due to <a href=javscript:JSVCgenPopLink()>
3969	return PopupWin;
3970}
3971
3972function JSVCgenPopLink(url, winname, w, h,full,exstring)
3973{	// Does not return anything (suitable for a href link for IE which cannot return object)
3974	JSVCgenPopWin(url, winname, w, h,full,exstring);
3975}
3976
3977/*----------------------Kian Yee:Check Leap Year ----------------*/
3978function JSVCCheckLeapYear(chkyear)
3979{
3980	if (chkyear%4 == 0&&(chkyear%100 != 0||chkyear%400 == 0))
3981	{
3982		return true;
3983	}
3984	else
3985	{
3986		return false;
3987	}
3988}
3989/*---------------------Kian Yee: Date Functions --------------*/
3990/*
3991 DateAdd:
3992 type - year,month,day (will add on later)
3993 num - num to be added
3994refdate - date to be added from
3995
3996 return new date value
3997 *REMARKS: This is to handle the leap year problem in javascript and also the month rounded to next month problem; date will follow sql style
3998 */
3999function JSVCDateAdd(type,num,refdate)
4000{
4001	if(num==""||num==null) num=0;
4002	if(refdate==null||refdate=="")return refdate;
4003	if(typeof refdate=='string') refdate = CalParseDate(refdate);
4004	var newdate = new Date(refdate);
4005	if(type.toUpperCase() == 'Y' || type.toUpperCase() == 'YEAR' || type.toUpperCase() == 'YY' || type.toUpperCase() == 'YYYY')
4006	{
4007		newdate.setYear(refdate.getFullYear()+num);
4008		if (refdate.getDate()!= newdate.getDate()) newdate.setDate(newdate.getDate() - 1);
4009		return newdate;
4010	}
4011	else if(type == 'M' || type.toUpperCase() == 'MONTH' || type == 'MM')
4012	{
4013		newdate.setMonth(refdate.getMonth()+num);
4014		while ((refdate.getMonth()+num)%12 < newdate.getMonth())
4015		{
4016			newdate.setDate(newdate.getDate() - 1);
4017		}
4018		return newdate;
4019	}
4020	else if (type.toUpperCase()=='D' || type.toUpperCase()=='DAY' || type.toUpperCase()== 'DD')
4021	{
4022		newdate.setDate(refdate.getDate()+num);
4023		return newdate;
4024	}
4025}
4026function JSVCdaydiffWorkingDays(startDate,endDate,workdayofweek,locid,vars,mode,calctype) { //vars : may refer to js var REQUEST.DS.HOLIDAY,
4027	/*
4028		[mode] : 0 - default date difference based on number of working days
4029		 	[workdayofweek] :
4030		 		 5 = 5 working days; sat + sun are full rest days
4031		 		 5.5 = 5.5 working days; sat as half rest day + sun is full rest day
4032		 		 6 = 6 working days; sun is full rest day
4033		[mode] : 1 - date difference with custom weekends
4034			[workdayofweek] : the bit of days that is weekends
4035				bit 1 : monday
4036				bit 2 : tuesday
4037				bit 4 : wednesday .. and so on
4038
4039		[calctype] : to evaluate the end date as additional 1 working day,
4040			0 : (default) the end date's time would be '23.59.59:999', which is considered 1 working day for end date if the date is not fall within holiday.
4041				for e.g.: from 2014-04-08 (work day) to 2014-04-08 (work day), will be considered as 1 working day.
4042			1 : the end date's time would be '00.00.00:000', where the end date doesn't count as 1 day
4043
4044		to exclude the public holiday as defined in data
4045			- define [locid] as val and [vars] as struct/array (refer to REQUEST.DS.HOLIDAY)
4046		to discard verification on public holiday
4047			- define [locid] and [vars] as NULL
4048
4049
4050		to evaluate the end date as 1 working day,
4051			[]
4052
4053		for e.g. from 2014-04-08 (work day) to 2014-04-08 (work day), will be considered as 1 working day
4054	*/
4055	// workdayofweek : 5 ( 5 working days), 5.5 (5.5 working days), 6 (6 working days), 7 (working days)
4056	var totwdays,totphwdays,rangehol,i,tmp,start,end,check=0,tmp;
4057	mode=(mode==null?0:mode);
4058	calctype=(calctype==null?0:calctype);
4059
4060	if(!(startDate instanceof Date)) {
4061		startDate = CalParseDate(startDate);
4062	}
4063	if(!(endDate instanceof Date)) {
4064		endDate = CalParseDate(endDate);
4065	}
4066	if(startDate==null || endDate==null || startDate=='' || startDate==null)
4067		return null;
4068	if(locid>0 && vars!=null) {
4069		totphwdays=0;
4070		totwdays=JSVCdaydiffWorkingDays(startDate,endDate,workdayofweek,null,null,mode,calctype); // number of working day except public holiday
4071		rangehol=vars[locid];  //locid followed by the year of the starting date ...
4072		//alert('verifying ...'+startDate+ ' vs '+endDate);
4073		if(typeof(rangehol)!='undefined') {
4074			for(i=0;i<rangehol.length;i++) {
4075				tmp=rangehol[i].split('|');
4076				start=tmp[0];end=tmp[1];
4077				if(!(start instanceof Date)) start = CalParseDate(start);
4078				if(!(end instanceof Date)) end = CalParseDate(end);
4079
4080				if(startDate.getTime()>endDate.getTime())  { tmp=startDate;startDate=endDate;endDate=tmp; }
4081				//if(end=='02/01/2012') check=1;
4082
4083				try{
4084				// get number of working day with date range given
4085				if (startDate.getTime()<=start.getTime()&&end.getTime()<=endDate.getTime()          ) { // { [   ] }
4086					totphwdays+=JSVCdaydiffWorkingDays(start,end,workdayofweek,null,null,mode,calctype);
4087					//alert('total='+totwdays+' ... '+ start + ' vs1 ' + end +  ' = ' + totphwdays);
4088				} else if (start.getTime()<=startDate.getTime()&&endDate.getTime()<=end.getTime()    ) { // [ { } ]
4089					totphwdays+=JSVCdaydiffWorkingDays(startDate,endDate,workdayofweek,null,null,mode,calctype);
4090					//alert('total='+totwdays+' ... '+startDate + ' vs2 ' + endDate +  ' = ' + totphwdays);
4091				} else if (startDate.getTime()<=start.getTime()&& endDate.getTime()<=end.getTime() && start.getTime()<=endDate.getTime() ) { // { [ } ]
4092					totphwdays+=JSVCdaydiffWorkingDays(start,endDate,workdayofweek,null,null,mode,calctype);
4093					//alert('total='+totwdays+' ... '+start + ' vs3 ' + endDate +  ' = ' + totphwdays);
4094				} else if (start.getTime()<=endDate.getTime()&&end.getTime()<=endDate.getTime() && startDate.getTime()<=end.getTime() ) { // [ { ] }
4095					totphwdays+=JSVCdaydiffWorkingDays(startDate,end,workdayofweek,null,null,mode,calctype);
4096					//alert('total='+totwdays+' ... '+startDate + ' vs4 ' + end +  ' = ' + totphwdays);
4097				}
4098			}catch(e){
4099
4100			}
4101
4102			}
4103		}
4104		//alert(totwdays + ' vs ' + totphwdays);
4105		if(totwdays<totphwdays)
4106			alert (JSVClang('MRM Error: Unable to calculate working days',17768));
4107		else {
4108			return totwdays-totphwdays;
4109		}
4110	}
4111	else {
4112		if(mode==1) // custom weekends as bit
4113			return JSVCSelectedWorkingDaysBetweenDates(startDate, endDate, workdayofweek,calctype);
4114		else // default : number weekends per week
4115			return JSVCWorkingDaysBetweenDates(startDate, endDate, workdayofweek,calctype);
4116	}
4117}
4118function JSVCSelectedWorkingDaysBetweenDates(startval, endval, weekend_bit,calctype) {
4119	/* allan 23 april 2013
4120	param weekend_bit in value
4121	sunday = 2 power of getDay() as 0  = 1
4122	monday = 2 power of getDay() as 1 = 2
4123	tuesday = 2 power of getDay() as 2 = 4
4124	wednesday = 2 power of getDay() as 3 = 8
4125	thursday = 2 power of getDay() as 4 = 16
4126	friday = 2 power of getDay() as 5 = 32
4127	saturday = 2 power of getDay() as 6 = 64
4128
4129	[calctype] : to evaluate the end date as additional 1 working day,
4130		0 : (default) the end date's time would be '23.59.59:999', which is considered 1 working day for end date if the date is not fall within holiday.
4131			for e.g.: from 2014-04-08 (work day) to 2014-04-08 (work day), will be considered as 1 working day.
4132		1 : the end date's time would be '00.00.00:000', where the end date doesn't count as 1 day
4133	*/
4134	//alert(weekend_bit);
4135	var returnval,startDate=new Date(startval), endDate=new Date(endval);
4136	var tmp,reverse=(endDate<startDate?1:0);
4137	calctype=(calctype==null?0:calctype);
4138	if (reverse==1) {
4139		tmp=startDate;startDate=endDate;endDate=tmp;
4140	}
4141	if(weekend_bit!=null && weekend_bit>=0) {
4142    	// Calculate days between dates
4143	    var millisecondsPerDay = 86400 * 1000; // Day in milliseconds
4144	    startDate.setHours(0,0,0,1);  // Start just after midnight
4145	    if(calctype==0)
4146	    	endDate.setHours(23,59,59,999);  // End just before midnight
4147		else if(calctype==1)
4148			endDate.setHours(0,0,0,1);  // End just after midnight
4149		else
4150			alert(JSVClang('Mrm Err : Error occured when evaluating the day difference',25738));
4151	    var diff = endDate - startDate;  // Milliseconds between datetime objects
4152	    var days = Math.ceil(diff / millisecondsPerDay);
4153	    // Subtract two weekend days for every week in between
4154
4155	    //alert('total days:'+days);
4156	    var weeks = Math.floor(days / 7);
4157	    var remaindays=days%7;
4158	    var weekendinremaindays=0;
4159	    // Handle special cases
4160	    var startDay = startDate.getDay();
4161	   // alert('start day = ' + startDay);
4162	    var endDay = endDate.getDay();
4163//alert('end  day = ' + endDay);
4164	    var numWeekend=0,cnt=0,theweekends=new Array();
4165
4166	    for(cnt=0;cnt<7;cnt++) {
4167	    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4168	    		//alert('weekend on '+ cnt);
4169	    		numWeekend++;
4170	    	}
4171	    }
4172
4173	    //condition
4174	    //alert('start day = '+startDay+'\nend day = '+endDay+'\nweeks = ' + weeks +'\nremaining days = ' + remaindays);
4175	    if(remaindays==0) {
4176			returnval= days - (weeks * numWeekend);
4177		} else if (weeks==0 && startDay==endDay) {
4178			//alert('this 1');
4179			//alert(weekend_bit);
4180		    for(cnt=startDay;cnt<=endDay;cnt++) {
4181		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4182		    		weekendinremaindays++;
4183		    	}
4184			}
4185			returnval=days-weekendinremaindays;
4186		} else if(startDay==0 && endDay!=6) {
4187			//alert('this 2');
4188		    for(cnt=endDay;cnt>=0;cnt--) {
4189		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4190		    		weekendinremaindays++;
4191		    	}
4192			}
4193	    	returnval= days - (weeks * numWeekend) - weekendinremaindays;
4194	    } else if(startDay-endDay>1) {
4195			//alert('this 3');
4196		    for(cnt=startDay;cnt<7;cnt++) {
4197		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4198		    		weekendinremaindays++;
4199		    	}
4200			}
4201		    for(cnt=endDay;cnt>=0;cnt--) {
4202		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4203		    		weekendinremaindays++;
4204		    	}
4205			}
4206			returnval= days - (weeks * numWeekend) - weekendinremaindays;
4207	    } else if (endDay>=startDay) {
4208	    	//alert('this 4');
4209		    for(cnt=startDay;cnt<7;cnt++) {
4210		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4211		    		weekendinremaindays++;
4212		    	}
4213			}
4214		    for(cnt=endDay;cnt>=0;cnt--) {
4215		    	if((weekend_bit&(Math.pow(2,cnt)))==(Math.pow(2,cnt))) {
4216		    		weekendinremaindays++;
4217		    	}
4218			}
4219			returnval= days - ((weeks-1) * numWeekend) - weekendinremaindays;
4220	    } else {
4221	    	alert(JSVClang('Error occured (Error code : 100). Call Administrator for assistance.',17769));
4222	    	return 0;
4223		}
4224	}
4225	else
4226		returnval=JSVCWorkingDaysBetweenDates(startval,endval,null); // follow default date diff
4227	return returnval;
4228}
4229
4230
4231function JSVCWorkingDaysBetweenDates(startval, endval, workdayofweek) { // available for workdayofweek = 5 , 5.5, 6 ; default as 5 workingdays
4232	var startDate=new Date(startval), endDate=new Date(endval);
4233	var tmp,reverse=(endDate<startDate?1:0);
4234	if (reverse==1) {
4235		tmp=startDate;startDate=endDate;endDate=tmp;
4236	}
4237	if (!(workdayofweek!=null && (workdayofweek==5 || workdayofweek==5.5 || workdayofweek==6))) {
4238		workdayofweek=5; // by default
4239	}
4240
4241    // Calculate days between dates
4242    var millisecondsPerDay = 86400 * 1000; // Day in milliseconds
4243    startDate.setHours(0,0,0,1);  // Start just after midnight
4244    endDate.setHours(23,59,59,999);  // End just before midnight
4245    var diff = endDate - startDate;  // Milliseconds between datetime objects
4246    var days = Math.ceil(diff / millisecondsPerDay);
4247    // Subtract two weekend days for every week in between
4248
4249    //alert('total days:'+days);
4250    var weeks = Math.floor(days / 7);
4251    // previously : var days = days - (weeks * 2);
4252    var days = days - (weeks * (workdayofweek==5?2:(workdayofweek==5.5?1.5:(workdayofweek==6?1:0))));
4253
4254    //alert('weeks:'+weeks+' ; weekdays:'+days);
4255
4256    // Handle special cases
4257    var startDay = startDate.getDay();
4258    var endDay = endDate.getDay();
4259    // Remove weekend not previously removed.
4260    if (startDay - endDay > 1)
4261    {
4262    	//alert('a : days - 2 ; before='+days);
4263        //previously : days = days-2;
4264        days=days-(workdayofweek==5?2:(workdayofweek==5.5?1.5:(workdayofweek==6?1:0)));
4265	}
4266    // Remove start day if span starts on Sunday but ends before Saturday
4267    if (startDay == 0 && endDay != 6)
4268    {
4269    	// alert('b : days - 1 ; before='+days);
4270        // previously : days = days - 1;
4271        days=days-(workdayofweek==5?1:(workdayofweek==5.5?1:(workdayofweek==6?1:0)));
4272	}
4273    // Remove end day if span ends on Saturday but starts after Sunday
4274    if (endDay == 6 && startDay != 0)
4275    {
4276    	// alert('c : days - 1 ; before='+days);
4277        //previously : days = days - 1;
4278        days=days-(workdayofweek==5?1:(workdayofweek==5.5?0.5:(workdayofweek==6?0:0)));
4279	}
4280
4281	// alert('total '+days+'*'+(reverse==1?-1:1)+' : ' + days*(reverse==1?-1:1));
4282    return days /* days*(reverse==1?-1:1) */;
4283}
4284
4285/* Andrew 02Nov2010 */
4286function JSVCFullDateDiff(firstdate,seconddate)
4287	{
4288		var a=new Object();
4289		a.Year=0;
4290		a.Month=0;
4291		a.Day=0;
4292		while(JSVCDateAdd("Y",a.Year+1,firstdate) <= seconddate)
4293		{
4294			a.Year++;
4295		}
4296		firstdate=JSVCDateAdd("Y",a.Year,firstdate);
4297
4298		while(JSVCDateAdd("M",a.Month+1,firstdate) <= seconddate)
4299		{
4300			a.Month++;
4301		}
4302
4303		firstdate=JSVCDateAdd("M",a.Month,firstdate);
4304
4305		while(JSVCDateAdd("D",a.Day+1,firstdate) <= seconddate)
4306		{
4307			a.Day++;
4308		}
4309		return a;
4310	}
4311
4312/*PC Comment*/
4313function JSVCDateDiff(type,firstdate,seconddate)
4314{
4315	if (firstdate==null || firstdate=='' || seconddate==null || seconddate=='') return null;
4316	if(firstdate.constructor!=Date)
4317		firstdate = CalParseDate(firstdate);
4318	if(seconddate.constructor!=Date)
4319		seconddate = CalParseDate(seconddate);
4320	if (firstdate==null || firstdate=='' || seconddate==null || seconddate=='') return null;
4321
4322	var diffval=0;
4323	if (type.toUpperCase()=='D' || type.toUpperCase()=='DAY' || type.toUpperCase()== 'DD')
4324	{
4325	    var difference = seconddate.getTime() - firstdate.getTime();
4326	    var daysDifference = Math.floor(difference/1000/60/60/24);
4327		/*
4328	    difference -= daysDifference*1000*60*60*24;
4329	    var hoursDifference = Math.floor(difference/1000/60/60);
4330	    difference -= hoursDifference*1000*60*60;
4331	    var minutesDifference = Math.floor(difference/1000/60);
4332	    difference -= minutesDifference*1000*60;
4333	    var secondsDifference = Math.floor(difference/1000);
4334	    document.write('difference = ' + daysDifference + ' day/s ' + hoursDifference + ' hour/s ' +
4335		minutesDifference + ' minute/s ' + secondsDifference + ' second/s ');*/
4336		diffval=daysDifference;
4337	}
4338	else if(type.toUpperCase()=='DAYONLY') //formula above (D/DAY/DD) will take time into consideration (>=24hr only consider 1 day) but this one will not 
4339	{			
4340		seconddate.setHours(0,0,0);
4341		firstdate.setHours(0,0,0);
4342		var diffval=JSVCDateDiff('D',firstdate,seconddate);
4343	}
4344	else if(type == 'M' || type.toUpperCase() == 'MONTH' || type == 'MM')
4345	{
4346		diffval = ((seconddate.getFullYear() - firstdate.getFullYear()) * 12) + seconddate.getMonth() - firstdate.getMonth();
4347	}
4348	else if(type.toUpperCase() == 'Y' || type.toUpperCase() == 'YEAR' || type.toUpperCase() == 'YY' || type.toUpperCase() == 'YYYY')
4349	{
4350		diffval = seconddate.getFullYear() - firstdate.getFullYear();
4351	}
4352	else if(type.toUpperCase() == 'H' || type.toUpperCase() == 'HOUR' || type.toUpperCase() == 'HH')
4353	{
4354		diffval = Math.floor((seconddate.getTime() - firstdate.getTime()) / (1000 * 60 * 60));
4355	}
4356	else if(type == 'm' || type.toUpperCase() == 'MIN' || type == 'mm' || type.toUpperCase() == 'MINUTE')
4357	{
4358		diffval = Math.floor((seconddate.getTime() - firstdate.getTime()) / (1000 * 60));
4359	}
4360	else if(type.toUpperCase() == 'S' || type.toUpperCase() == 'SECOND' || type.toUpperCase() == 'SS' || type.toUpperCase() == 'SEC')
4361	{
4362		diffval = Math.floor((seconddate.getTime() - firstdate.getTime()) / 1000);
4363	}
4364	else if(type == 'hm' || type.toUpperCase() == 'HOURMIN' || type == 'hhmm' || type.toUpperCase() == 'HOURMINUTE')
4365	{
4366		var diffhour=0;
4367		var diffmin=0;
4368		diffmin = Math.floor((seconddate.getTime() - firstdate.getTime()) / (1000 * 60));
4369		diffhour = (Math.floor((seconddate.getTime() - firstdate.getTime()) / (1000 * 60 * 60)));
4370		diffval = diffmin +'(' + diffhour +'.'+ (diffmin)%60 +')';
4371	}
4372	else if(type.toUpperCase() == 'WW' || type.toUpperCase() == 'WEEK' || type.toUpperCase() == 'WK')
4373	{
4374	 	// calculate differnece in weeks (1000ms * 60sec * 60min * 24hrs * 7 days = 604800000)
4375		// diffval = Math.floor((seconddate.getTime() - firstdate.getTime()) / 604800000);
4376		// The above does not work. Need to simulate the SQL DateDiff function
4377		while(firstdate<seconddate) {
4378			firstdate=JSVCDateAdd("d",1,firstdate);
4379			if(firstdate<=seconddate && firstdate.getDay()==0) // if passes Sunday, consider 1 week
4380				diffval+=1;
4381		}
4382	}
4383
4384	return diffval;
4385}
4386
4387/*
4388 CompareDate:
4389 firstdate - first date input to compare (from date)
4390 seconddate - second date input to compare (to date)
4391 type - 1:year , 2:month , 3:day
4392 num - maximum range (ex: type 1 - maximum years allowed for the date range)
4393 range - 0:any range 1:must be in round number year 2:must be in round number month
4394 firstdatename - name for firstdate
4395 seconddatename - name for seconddate
4396
4397 return true - valid;
4397 false - not valid
4398 *REMARKS: Currently, it will add 1 min to end date for every check, need to find a better solution
4399 *Took off null checking, empty is treated as null by default
4400 */
4401function JSVCCompareDate(firstdate,seconddate,firstdatename,seconddatename,type,num,range)
4402{
4403	if(range==null||range=='')range = 0;
4404	if (firstdate != null && seconddate != null) {
4405		if (firstdatename == '' || firstdatename == null)
4406			firstdatename = 'Start Date';
4407		if (seconddatename == '' || seconddatename == null)
4408			seconddatename = 'End Date';
4409		if(typeof firstdate=='string') firstdate = CalParseDate(firstdate);
4410		if(typeof seconddate=='string') seconddate = CalParseDate(seconddate);
4411		if (seconddate != null && firstdate >= seconddate) {
4412			alert( JSVClang("{0} is greater than {1}. Please make sure that the date range specified is valid.",8661,0,firstdatename,seconddatename) );
4413			return false;
4414		}
4415		if (range==1)
4416		{
4417			if (firstdate.getMonth()!=seconddate.getMonth()||firstdate.getDate()!=seconddate.getDate())
4418			{
4419				alert(JSVClang("The range of {0} and {1} is not in rounded years. Please make sure that the date range specified is valid.",35940,0,firstdatename,seconddatename));
4420				return false;
4421			}
4422		}
4423		else if (range==2)
4424		{
4425			if (firstdate.getDate()!=seconddate.getDate())
4426			{
4427				alert(JSVClang("The range of {0} and {1} is not in rounded months. Please make sure that the date range specified is valid.",12460,0,firstdatename,seconddatename));
4428				return false;
4429			}
4430		}
4431		if ((type != null && type != '') && (num != null && num != '')) {
4432			if (type == 1) {
4433				var validdate = new Date(firstdate.setFullYear(firstdate.getFullYear() + num));
4434				if (seconddate > validdate) {
4435					alert(JSVClang("The range of {0} and {1} is out of the permitted date range which is {3} year/s. Please make sure that the date range specified is valid.",36233,0,firstdatename,seconddatename,num));
4436					return false;
4437				}
4438			}
4439			else
4440				if (type == 2) {
4441					var validdate = new Date(firstdate.setMonth(firstdate.getMonth() + num));
4442					if (seconddate > validdate) {
4443						alert(JSVClang("The range of {0} and {1} is out of the permitted date range which is {3} month/s. Please make sure that the date range specified is valid.",36234,0,firstdatename,seconddatename,num));
4444						return false;
4445					}
4446				}
4447				else
4448					if (type == 3) {
4449						var validdate = new Date(firstdate.setDate(firstdate.getDate() + num));
4450						if (seconddate > validdate) {
4451							alert(JSVClang("The range of {0} and {1} is out of the permitted date range which is {2} day/s. Please make sure that the date range specified is valid.",8669,0,firstdatename,seconddatename,num));
4452							return false;
4453						}
4454					}
4455		}
4456	}
4457	return true;
4458}
4459Math.sign=function(i) {
4460	var j=parseInt(i);
4461	if(j<0)
4462		return -1;
4463	else if(j==0)
4464		return 0;
4465	else if(j>0)
4466		return 1;
4467}
4468/* Converted from SVCdaydiff in SVCcffunctions.cfm, code should be synchronized between these two */
4469/* workingDays
4470   1 - 5 working days a week
4471   2 - 6 working days a week
4472   3 - 5 working days a week (exclude public holidays)
4473   4 - 6 working days a week (exclude public holidays)
4474*/
4475function JSVCdaydiff(date1,date2,workingDays) {
4476	if(workingDays==null)
4477		workingDays=1;
4478	if(typeof(date1)=="string")
4479		date1=CalParseDate(date1);
4480	if(typeof(date2)=="string")
4481		date2=CalParseDate(date2);
4482	if(workingDays==1)
4483		return JSVCDateDiff("d",date1,date2) - JSVCDateDiff("ww",date1,date2)*2 + Math.sign(date1.getDay()) - Math.sign(date2.getDay());
4484	else if(workingDays==2)
4485		return JSVCDateDiff("d",date1,date2) - JSVCDateDiff("ww",date1,date2) + Math.sign(date1.getDay()) - Math.sign(date2.getDay());
4486	else if((workingDays==3||workingDays==4) && request.DS && request.DS.HOLIDAYSQ) { // NOTE: DS.HOLIDAYSQ must be defined else return normal working days
4487		var wktype=(workingDays==3?1:2);
4488		var d=JSVCcountHolidays(date1,date2,wktype);
4489		return JSVCdaydiff(date1,date2,wktype) - d;
4490	}
4491	else
4492		return JSVCDateDiff("d",date1,date2);
4493}
4494/* workingDays
4495   1 - 5 working days a week
4496   2 - 6 working days a week
4497*/
4498function JSVCcountHolidays(date1,date2,workingDays) {
4499	var d=0;
4500	if(request.DS.HOLIDAYSQ==null)
4501		return d;
4502	if(typeof(date1)=="string")
4503		date1=CalParseDate(date1);
4504	if(typeof(date2)=="string")
4505		date2=CalParseDate(date2);
4506	// 1) Assume holiday is stored as full single day
4507	// 2) Strip off time from date1/date2 as we only need to compare "day"
4508	var d1=new Date(date1.getFullYear(),date1.getMonth(),date1.getDate()); // strip off time
4509	var d2=new Date(date2.getFullYear(),date2.getMonth(),date2.getDate()); // strip off time
4510	for(var i=0;i<request.DS.HOLIDAYSQ.DATA.length;i++) {
4511		var a=request.DS.HOLIDAYSQ.DATA[i];
4512		var h1=a[3];
4513		var h2=a[4];
4514		if(h1.constructor==String)
4515			h1=CalParseDate(h1);
4516		if(h2.constructor==String)
4517			h2=CalParseDate(h2);
4518		if(a[0]==jSVClocid) {
4519			// Get the sum of holiday span in the specified period, exclude if holiday falls on weekends
4520			/* Illustration for the logic: H = holiday span, D = date1 & date2 span
4521			HHH
4522			 DDDDDD  -- cond 1
4523			 HHH
4524			 DDDDDD  -- cond 2
4525			   HHH
4526			 DDDDDD  -- cond 2
4527				HHH
4528			 DDDDDD  -- cond 2
4529				 HHH
4530			 DDDDDD  -- cond 3
4531			HHHHHHHH
4532			 DDDDDD  -- cond 4
4533			*/
4534			if(h1<d1 && h2<=d2 && h2>d1)
4535				d+=JSVCdaydiff(d1,h2,workingDays);
4536			else if(h1>=d1 && h2<=d2 && h2>=h1 && d2>d1)
4537				d+=JSVCdaydiff(h1,h2,workingDays)+1;
4538			else if(h1>=d1 && h2>d2 && d2>h1)
4539				d+=JSVCdaydiff(h1,d2,workingDays);
4540			else if(h1<d1 && h2>d2 && d2>d1)
4541				d+=JSVCdaydiff(d1,d2,workingDays);
4542		}
4543	}
4544	return d;
4545}
4546/* workingDays
4547   1 - 5 working days a week
4548   2 - 6 working days a week
4549*/
4550function JSVCcountWeekends(date1,date2,workingDays) {
4551	var c=0;
4552	if(typeof(date1)=="string")
4553		date1=CalParseDate(date1);
4554	if(typeof(date2)=="string")
4555		date2=CalParseDate(date2);
4556	date1=new Date(date1.getFullYear(),date1.getMonth(),date1.getDate()); // strip off time
4557	date2=new Date(date2.getFullYear(),date2.getMonth(),date2.getDate()); // strip off time
4558	while(date1 <= date2) {
4559		if(date1.getDay()==0 || (workingDays==1 && date1.getDay()==6))
4560			c++;
4561		date1.setDate(date1.getDate()+1);
4562	}
4563	return c;
4564}
4565/*--------------------------------End of Date functions ----------------------------------------------*/
4566function JSVCHourDiff(firstdate,seconddate,caltype){
4567	if (firstdate==null || firstdate=='' || seconddate==null || seconddate=='') return null;
4568	if(firstdate.constructor!=Date)
4569		firstdate = CalParseDate(firstdate);
4570	if(seconddate.constructor!=Date)
4571		seconddate = CalParseDate(seconddate);
4572	if (firstdate==null || firstdate=='' || seconddate==null || seconddate=='') return null;
4573	var hourval=0;
4574	if(caltype==null){
4575		hourval=JSVCDateDiff('HOUR',firstdate,seconddate);
4576	}else if (caltype==1){ //min>=30 add 1 hour eg. day 1 00:00 - day 2 00:30 = 25 hours
4577		hourval = Math.round((seconddate.getTime() - firstdate.getTime()) / (1000 * 60 * 60));
4578	}else if (caltype==2){ //show decimal places for hh.mm
4579		var hrmin = (seconddate.getTime() - firstdate.getTime()) / (1000 * 60 * 60);
4580		var hr = JSVCDateDiff('HOUR',firstdate,seconddate);
4581		var mm = hrmin - hr;
4582		mm = Math.round(mm * 60);
4583		if(mm<10){
4584			mm='0'+mm.toString();
4585		}
4586		hourval = hr+'.'+mm;
4587	}
4588	return hourval;
4589}
4590
4591function JSVCLabelStr(lblname,colorbgrnd,colortxt)
4592{	
4593	var lbrem='';
4594	if(colortxt.indexOf("|")>-1){
4595		larr=colortxt.split('|');
4596		colortxt=larr[0];
4597		lbrem=larr[1];
4598	}
4599	return "<span "+(lbrem!=''?"title=\""+lbrem+"\" ":"")+" style=\"background-color:"+colorbgrnd+";color:"+colortxt+"\" class=clsSVCLabelFont>"+lblname+"</span>";
4600}
4601function JSVCLabelEditClick(event,obj)
4602{	var grpid,pobj,olist,postfix="";
4603	grpid=obj.getAttribute("GRPID");
4604	if(typeof(grpid)=="string" && grpid!=null && grpid!="")
4605	{
4606		pobj=obj.parentNode.parentNode;
4607		if(pobj==null)return;
4608		if(arguments.length == 3) postfix = '-' + arguments[2];
4609		olist=pobj.getElementsByTagName("input");
4610		for(var t=0;t<olist.length;t++)
4611		{	if(olist[t]!=obj && olist[t].name=="chklbl" + postfix && olist[t].type=="checkbox" && olist[t].checked && olist[t].checked==true && olist[t].getAttribute("GRPID")==grpid)
4612				olist[t].checked=false;
4613		}
4614	}
4615}
4616function JSVCLabelList(lst) // Accept triples of lblname,colorbgrnd,colortxt
4617{	var s,i;
4618	s="";
4619	for(i=0;i+3<=lst.length;i+=3)
4620		s+=JSVCLabelStr(lst[i],lst[i+1],lst[i+2]);
4621	return s;
4622}
4623
4624/*--------Kian Yee: Firefox Adaption Functions----*/
4625 function JSVCCleanWhitespace(node)
4626 {
4627      var notWhitespace = /\S/;
4628      for (var i=0; i < node.childNodes.length; i++) {
4629         var childNode = node.childNodes[i];
4630          if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
4631             // that is, if it's a whitespace text node
4632            node.removeChild(node.childNodes[i]);
4633             i--;
4634          }
4635          if ( childNode.nodeType == 1) {
4636              // elements can have text child nodes of their own
4637              JSVCCleanWhitespace(childNode);
4638          }
4639      }
4640 }
4641
4642JSVCinsertAdjacentElement = function (obj,where,parsedNode)
4643{
4644	switch (where){
4645	case 'beforeBegin':
4646	obj.parentNode.insertBefore(parsedNode,obj)
4647	break;
4648	case 'afterBegin':
4649	obj.insertBefore(parsedNode,obj.firstChild);
4650	break;
4651	case 'beforeEnd':
4652	obj.appendChild(parsedNode);
4653	break;
4654	case 'afterEnd':
4655	if (obj.nextSibling)
4656	obj.parentNode.insertBefore(parsedNode,obj.nextSibling);
4657	else obj.parentNode.appendChild(parsedNode);
4658	break;
4659	}
4660}
4661
4662JSVCinsertAdjacentHTML = function (obj,where,htmlStr)
4663{
4664if (document.all){obj.insertAdjacentHTML(where,htmlStr);}
4665else
4666	{
4667	var r = obj.ownerDocument.createRange();
4668	r.setStartBefore(obj);
4669	var parsedHTML = r.createContextualFragment(htmlStr);
4670	JSVCinsertAdjacentElement(obj,where,parsedHTML)
4671	}
4672}
4673function JSVCGetPosXY(obj,type){
4674	if(type==null||type=='')type=1; //type 1: absolute position ; type 2: relative to window displayed
4675	var x=0,y=0;
4676	while (obj!=null&&obj.nodeName!="BODY"){
4677		x+=obj.offsetLeft;//-obj.scrollLeft;
4678		y+=obj.offsetTop;//-obj.scrollTop;
4679		obj=(obj.offsetParent?obj.offsetParent:obj.parentNode);
4680	}
4681	if (type==2){
4682		x= x-document.body.scrollLeft;
4683		y= y-document.body.scrollTop;
4684	}
4685	return {x:x,y:y};
4686}
4687
4688// NOTE: IE10 is not fully supported (still giving error)
4689function JSVCSelectSingleNode(obj,path)
4690{
4691	if (document.implementation && document.implementation.createDocument) // non-IE
4692	{
4693		var nodes=document.evaluate(path, obj, null, XPathResult.ANY_TYPE, null);
4694		var results=nodes.iterateNext();
4695		return results;
4696	}
4697	else // for IE7-9 only. IE10 removed this function!
4698	{
4699		return obj.selectSingleNode(path);
4700	}
4701}
4702
4703function JSVChtmUnescape(sXml) {
4704    return sXml.replace(/&apos;/g,"'")
4705    .replace(/&quot;/g,"\"")
4706    .replace(/&gt;/g,">")
4707    .replace(/&lt;/g,"<")
4708    .replace(/&amp;/g,"&");
4709}
4710/*----End of Firefox Adaption function---*/
4711function JSVCArrayIndexOf(arr,elt/*,from*/)
4712{
4713	var len = arr.length;
4714	var from = Number(arguments[2]) || 0;
4715	from = (from < 0)? Math.ceil(from) : Math.floor(from);
4716	if (from < 0)
4717		from += len;
4718	for (; from < len; from++)
4719	{
4720		if (from in arr && arr[from] == elt)
4721			return from;
4722    }
4723	return -1;
4724}
4725function JSVCArrayRemove(arr,val) {
4726	for(var i=0;i<arr.length;i++) {
4727		if(arr[i]==val)
4728			arr.splice(i--,1);
4729	}
4730}
4731/* Generates a TBODY DOM object from HTML (gets around DOM limitation, can use for TR too) */
4732function JSVCcreateTBODY(html)
4733{	var otmp,t2;
4734	var otmp=document.createElement("DIV");
4735	otmp.style.display="none";
4736	otmp.style.position="absolute";
4737	otmp.style.zIndex=-1000;
4738	document.body.appendChild(otmp);
4739	if(otmp==null)
4740		return null;
4741	otmp.innerHTML="<table>"+html+"</table>";
4742	t2=otmp.firstChild.tBodies[0];
4743	if(t2!=null)
4744		t2=t2.cloneNode(true);
4745	document.body.removeChild(otmp);
4746	return t2;
4747}
4748function JSVCqueryGetColNo(query,column) {
4749	column=column.toLowerCase();
4750	if(!query.COLUMNS||!query.DATA) { // returned from serialiseJSON()
4751		return null;
4752	}
4753	for(var x in query.COLUMNS)
4754		if(query.COLUMNS[x].toLowerCase()==column) {
4755			return x;
4756		}
4757	return -1;
4758}
4759function JSVCqueryFindRow(query,colno,value,rowstart) {
4760	if(!query.COLUMNS||!query.DATA) { // returned from serialiseJSON()
4761		return null;
4762	}
4763	if(rowstart==null)
4764		rowstart=0;
4765	for(var t=rowstart;t<query.DATA.length;t++)
4766	{
4767		if(query.DATA[t][colno]==value)
4768			return query.DATA[t];
4769	}
4770	return null;
4771}
4772function JSVCqueryFindRows(query,colno,clause) {
4773	if(!query.COLUMNS||!query.DATA) { // returned from serialiseJSON()
4774		return null;
4775	}
4776	var rs={};
4777	rs.COLUMNS=query.COLUMNS;
4778	rs.DATA=[];
4779	for(var t=0;t<query.DATA.length;t++)
4780	{
4781		if(typeof(clause)=="function") { // a clause which returns boolean
4782			if(clause(query.DATA[t][colno]))
4783				rs.DATA.push(query.DATA[t]);
4784		} else {
4785			if(query.DATA[t][colno]==clause)
4786				rs.DATA.push(query.DATA[t]);
4787		}
4788	}
4789	return rs;
4790}
4791function JSVCqueryGetValue(query,column,rowIndex) {
4792	var i,x;
4793	if(query==null||!query.COLUMNS||!query.DATA) { // returned from serialiseJSON()
4794		return null;
4795	}
4796	i=JSVCqueryGetColNo(query,column);
4797	if(i>=0&&query.DATA[rowIndex]) {
4798		return query.DATA[rowIndex][i];
4799	}
4800	return null;
4801}
4802function JSVCqueryGetValues(query,column) {
4803	var i,x;
4804
4805	if(query==null||!query.COLUMNS||!query.DATA) { // returned from serialiseJSON()
4806		return null;
4807	}
4808
4809	i=JSVCqueryGetColNo(query,column);
4810	x = 0;
4811
4812	var rs = {};
4813	rs.COLUMNS=[];
4814	rs.COLUMNS.push(column);
4815	rs.DATA=[];
4816
4817	for(i>=0&&query.DATA[x];x<query.DATA.length;x++) {
4818		rs.DATA.push(query.DATA[x][i]);
4819	}
4820
4821	return rs;
4822}
4823function JSVCjsonCreateSelOptions(selobj,query,valueID,nameID,resetlen,attrArr,iLid) {
4824	var nameColNo=JSVCqueryGetColNo(query,nameID),
4825		valueColNo=JSVCqueryGetColNo(query,valueID),
4826		attrColNo=[];
4827
4828	for(k in attrArr)
4829	{
4830		if( parseInt(JSVCqueryGetColNo(query,attrArr[k])) >= 0 )
4831		{
4832			attrColNo.push(JSVCqueryGetColNo(query,attrArr[k]));
4833		}
4834	}
4835
4836	if(resetlen==null) resetlen=1;
4837	selobj.options.length = resetlen;
4838	for (var i=0;i<query.DATA.length;i++)
4839	{
4840		if (typeof(iLid) !== 'undefined'){
4841			var ilidColNo=JSVCqueryGetColNo(query,iLid);
4842			var Desc = JSVClang(query.DATA[i][nameColNo],query.DATA[i][ilidColNo]);
4843		} else {
4844			var Desc = query.DATA[i][nameColNo]
4845		}
4846		selobj.options[i + 1] = new Option(Desc,query.DATA[i][valueColNo]);
4847		for(var k in attrColNo) {
4848			selobj.options[i + 1].setAttribute(attrArr[k],query.DATA[i][attrColNo[k]]);
4849		}
4850	}
4851}
4852/* --------------------------
4853 System Prototype
4854-----------------------------*/
4855String.prototype.padLeft=function(char,maxLength) {
4856	var result=this.valueOf();
4857	for(var i=this.length;i<maxLength;i++)
4858		result=char+result;
4859	return result;
4860}
4861Date.prototype.add=function(interval,num) {
4862	var dt=this;
4863	if (num==0)
4864		return dt;
4865	switch(interval.toLowerCase()) {
4866		case "ms":
4867			dt.setMilliseconds(dt.getMilliseconds()+num);
4868			break;
4869		case "s":
4870			dt.setSeconds(dt.getSeconds()+num);
4871			break;
4872		case "mi":
4873			dt.setMinutes(dt.getMinutes()+num);
4874			break;
4875		case "h":
4876			dt.setHours(dt.getHours()+num);
4877			break;
4878		case "d":
4879			dt.setDate(dt.getDate()+num);
4880			break;
4881		case "mo":
4882			dt.setMonth(dt.getMonth()+num);
4883			break;
4884		case "y":
4885			dt.setFullYear(dt.getFullYear()+num);
4886			break;
4887	}
4888	return dt;
4889}
4890Date.prototype.DateFormat=function(format) {
4891	var smth=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
4892	var lmth=["January","February","March","April","May","June","July","August","September","October","November","December"];
4893	var sday=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
4894	var lday=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
4895	var list=[
4896		["yyyy",function(dt){return dt.getFullYear()}],
4897		["mm",function(dt){return ((dt.getMonth()+1)<10?"0":"")+(dt.getMonth()+1)}],
4898		["dd",function(dt){return (dt.getDate()<10?"0":"")+dt.getDate()}],
4899		["mmm",function(dt){return smth[dt.getMonth()]}]
4900	];
4901	var rs=format;
4902	for(var i=0;i<list.length;i++) {
4903		var itm=list[i];
4904		if(format.indexOf(itm[0])>=0) {
4905			rs=rs.replace(itm[0],itm[1](this));
4906		}
4907	}
4908	return rs;
4909}
4910Date.prototype.TimeFormat=function(format) {
4911	var s="";
4912	var list=[
4913		["HH",function(dt){return (dt.getHours()<10?"0":"")+dt.getHours()}],
4914		["mm",function(dt){return (dt.getMinutes()<10?"0":"")+dt.getMinutes()}],
4915		["ss",function(dt){return (dt.getSeconds()<10?"0":"")+dt.getSeconds()}],
4916		//12 hour format
4917		["h",function(dt){return (dt.getHours()>=12?(dt.getHours()==12?12:dt.getHours()-12):(dt.getHours()==0?12:dt.getHours()))}],
4918		["TT",function(dt){return (dt.getHours()>=12?"PM":"AM")}]
4919	];
4920	var rs=format;
4921	for(var i=0;i<list.length;i++) {
4922		var itm=list[i];
4923		if(format.indexOf(itm[0])>=0) {
4924			rs=rs.replace(itm[0],itm[1](this));
4925		}
4926	}
4927	return rs;
4928}
4929/* http://delete.me.uk/2005/03/iso8601.html */
4930/* KY : fixing for DB string, output without the T, no offset*/
4931Date.prototype.setISO8601 = function (string) {
4932    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
4933        "((T| )([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
4934        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
4935    var d = string.match(new RegExp(regexp));
4936    var offset = 0;
4937    var date = new Date(d[1], 0, 1);
4938
4939    if (d[3]) { date.setMonth(d[3] - 1); }
4940    if (d[5]) { date.setDate(d[5]); }
4941    if (d[8]) { date.setHours(d[8]); }
4942    if (d[9]) { date.setMinutes(d[9]); }
4943    if (d[11]) { date.setSeconds(d[11]); }
4944    if (d[13]) { date.setMilliseconds(Number("0." + d[13]) * 1000); }
4945    /*if (d[15]) {
4946        offset = (Number(d[17]) * 60) + Number(d[18]);
4947        offset *= ((d[16] == '-') ? 1 : -1);
4948    }
4949
4950    offset -= date.getTimezoneOffset();*/
4951    time = (Number(date) /*+ (offset * 60 * 1000)*/);
4952    this.setTime(Number(time));
4953}
4954/* --------------------------
4955 JSVCform Class
4956-----------------------------*/
4957function JSVCform(id,type,title,columns,order,repeat,queryPK,query,showinit,allowdel,nopreprocessform,titlestyle,appendIDToFieldName,readonly,columnStyle,duplicateMode,readonlyFields,skiphdrrpt,rowcounter) {
4958	this.id=id; // varname
4959	this.type=type;
4960	this.title=title;
4961	this.columns=columns;
4962	this.order=order;
4963	this.repeat=repeat;
4964	if(this.repeat>1)
4965		this.type="TABLE";
4966	this.queryPK=queryPK; // for repeat>1
4967	this.query=query; // for repeat>1
4968	this.showinit=(showinit==null?1:showinit);
4969	this.allowdel=(allowdel==null?0:allowdel);
4970	this.nopreprocessform=nopreprocessform;
4971	this.titlestyle=(titlestyle==null?0:titlestyle); // 1: Numbering style with hash (#) prefix
4972	this.appendIDToFieldName=(appendIDToFieldName==null?false:appendIDToFieldName);
4973    this.readonly = readonly || false;
4974	this.columnStyle=(columnStyle==null?0:columnStyle); // 0 (default): Display field name/title in column based, 1: Dis
4974play field name/title in row based
4975	this.duplicateMode=(duplicateMode==null?0:duplicateMode);
4976	this.readonlyFields = readonlyFields || 0; // Make Fields readonly empty/0|not readonly, 1|all fields readonly, value passed|will be excluded from readonly
4977	this.skiphdrrpt=(skiphdrrpt==null?0:skiphdrrpt);
4978	this.rowcnt=(rowcounter==null?0:rowcounter);
4979}
4980JSVCform.prototype.gen=function(cols) {
4981	if(cols!=null) {
4982		JSVCArrayRemove(cols,null);
4983		this.cols=cols;
4984	}
4985	if(this.repeat>1) {
4986		this.show=this.query.DATA.length;
4987		if(this.show>this.repeat)
4988			this.repeat=this.show;
4989		if(this.show==0)
4990			this.show=this.showinit;
4991	}
4992	else
4993		this.show=1;
4994	var isRegen=true;
4995	var o=document.getElementById(this.id);
4996	if(o==null) {
4997		isRegen=false;
4998		document.write("<div id="+this.id+"></div>");
4999		o=document.getElementById(this.id);
5000	}
5001	var s="";
5002	s+="<input type=hidden name="+this.id+"_ROWCNT value="+this.show+">";
5003	s+="<input type=hidden name="+this.id+"_REPEATROWS value="+this.repeat+">";
5004	s+="<input type=hidden name="+this.id+"_APPENDIDTOFIELDNAME value="+(this.appendIDToFieldName?1:0)+">";
5005	if(this.repeat>1)
5006		for(var i=0;i<this.repeat;i++)
5007			s+=this.gen2(this.cols,i);
5008	else
5009		s+=this.gen2(this.cols,null);
5010	if(this.repeat>1 && this.show<this.repeat && !this.readonly)
5011		s+="<div style=margin-top:6px align=left><input type=button class=clsSVCButton value='"+(this.show>0?JSVClang("Add More",7645):JSVClang("Add",2210))+" >>' onclick='var result="+this.id+".addMore(this);if(result){JSVChide(this.parentNode)}'></div>";
5012	o.innerHTML=s;
5013
5014	if(!this.nopreprocessform&&!/MrmPreprocessForm/gi.test(window.onload))
5015		AddOnloadCode("MrmPreprocessForm();");
5016	// Preprocess & trigger onblur for all INPUT elements
5017	var elem=o.getElementsByTagName("INPUT");
5018	for(var i=0;i<elem.length;i++) {
5019		var o2=elem[i];
5020		if(isRegen)
5021			MRMPreprocessFormItem(o2);
5022		if(o2.onblur&&typeof(o2.onblur)=="function")
5023			o2.onblur();
5024	}
5025	elem=o.getElementsByTagName("SELECT");
5026	for(var i=0;i<elem.length;i++) {
5027		var o2=elem[i];
5028		if(isRegen)
5029			MRMPreprocessFormItem(o2);
5030		if(o2.onblur&&typeof(o2.onblur)=="function")
5031			o2.onblur();
5032	}
5033	elem=o.getElementsByTagName("TEXTAREA");
5034	for(var i=0;i<elem.length;i++) {
5035		var o2=elem[i];
5036		if(isRegen)
5037			MRMPreprocessFormItem(o2);
5038		if(o2.onblur&&typeof(o2.onblur)=="function")
5039			o2.onblur();
5040	}
5041	this.ajaxStart();
5042}
5043JSVCform.prototype.gen2=function(cols,index) {
5044	var str="";
5045	if(index==null)
5046		index=0;
5047	var rowid=JSVCqueryGetValue(this.query,this.queryPK,index);
5048	if(this.duplicateMode) // When in Duplicate mode, always treat it as new row
5049		rowid=null;
5050	var disp_cols=[];
5051	for(var i=0;i<cols.length;i++) {
5052		if(cols[i][0]!="HIDDEN")
5053			disp_cols.push(cols[i]);
5054	}
5055	if(this.type=="TABLE") {
5056		str+="<table class=clsClmTable width=100%"+(this.repeat>1?" id=TAB"+this.id+index:"")+" style=margin-top:5px;"+(this.repeat>1&&(index+1)>this.show?"display:none;":"")+">";
5057		if(this.title) {
5058			var title="";
5059			if(this.titlestyle==1)
5060				title=this.title+" #"+(index+1);
5061			else
5062				title=this.title+(index>0?" "+(index+1):"");
5063			str+="<tr><td class=header colspan="+(this.columnStyle==0?2:1)*this.columns+"><div style='float:left;margin-top:2px'>"+title+"</div>";
5064			if(this.allowdel==1 && this.repeat>1 && this.title.length>0)
5065				str+="<div style=float:right><input type=checkbox value='"+index+"|"+(rowid==null?0:rowid)+"' name="+this.id+"_CHKDEL id="+this.id+index+"_CHKDEL onclick=JSVCSetDisabledList('TAB"+this.id+index+"BODY',this.checked) style='vertical-align:middle'><label for="+this.id+index+"_CHKDEL style='vertical-align:middle'>"+JSVClang("Mark as Delete",12461)+"</label></div>";
5066			str+="</td></tr>";
5067		}
5068		if(this.columnStyle==1) {
5069			for(var i=0;i<disp_cols.length;i++) {
5070				var addCnt="";
5071				if(i>0 && (i%this.columns)==0 && (this.skiphdrrpt!=1&&index==1))
5072					str+="</tr>";
5073				
5074				if(i<disp_cols.length && (i%this.columns)==0 && (this.skiphdrrpt!=1&&index==1))
5075					str+="<tr>";
5076
5077				//add no. col
5078				if(this.rowcnt==1&&i==0&&index==0){
5079					addCnt="<td class=clsClmRefTone1 style='font-weight:normal;width:50px;'>&nbsp;</td>"
5080				}
5081
5082				//show header for first row
5083				if(this.skiphdrrpt==1&index>0){
5084					str+="";
5085				}else{
5086					str+=(addCnt.length>0?addCnt:'')+"<td class=clsClmRefTone1 style='font-weight:normal;width:35ex'>"+(disp_cols[i]?disp_cols[i][1]:"")+"</td>"
5087				}
5088				
5089				//type 2 delete style
5090				if(i==disp_cols.length-1&&index==0&&this.allowdel==2){
5091					str+="<td class=clsClmRefTone1 style='font-weight:normal;width:2%'>&nbsp;</td>"
5092				}
5093
5094			}
5095		}
5096		if(this.skiphdrrpt!=1){
5097			for(var i=0;i<this.columns;i++) {
5098				if(this.columnStyle==0)
5099					str+="<col class=clsClmRefTone1 style=font-weight:bold;width:35ex>";
5100			str+="<col class=clsClmRefTone2 style='width:"+(this.columns>1?100/this.columns/2:"auto")+"%'>";
5101			}
5102		}
5103		
5104	}
5105	var tbodyid="TAB"+this.id+index+"BODY";
5106	str+="<tbody id="+tbodyid+">";
5107	for(var i=0;i<cols.length;i++) {
5108		if(cols[i][0]=="HIDDEN")
5109			str+=this.getCol(cols[i],index);  // Generate HIDDEN fields at first
5110	}
5111	for(var i=0;i<disp_cols.length;i++) {
5112		if(i>0 && (i%this.columns)==0)
5113			str+="</tr>";
5114		if(i<disp_cols.length && (i%this.columns)==0)
5115			str+="<tr>";
5116
5117		if(this.rowcnt==1&&i==0){
5118			str+="<td class=clsClmRefTone1 style='font-weight:normal;display:block' align=center width=25>"+(index+1)+"</td>"
5119		}
5120
5121		if(this.columnStyle==0)
5122			str+="<td valign=\"top\">"+(disp_cols[i]?disp_cols[i][1]:"")+"</td>"
5123		str+="<td "+(index>0&&this.skiphdrrpt==1?"style='width:35ex'":"")+" id=TAB"+this.id+index+"COL"+i+" valign=\"top\">"+this.getCol(disp_cols[i],index)+"</td>";
5124
5125		if(i==disp_cols.length-1&&this.allowdel==2){
5126			str+="<td "+(index>0&&this.skiphdrrpt==1?"style='width:2%'":"")+" ><input type=checkbox value='"+index+"|"+(rowid==null?0:rowid)+"' name="+this.id+"_CHKDEL id="+this.id+index+"_CHKDEL onclick=JSVCSetDisabledList('TAB"+this.id+index+"BODY',this.checked,this.name) style='vertical-align:middle'><label for="+this.id+index+"_CHKDEL style='vertical-align:middle'><b>"+JSVClang("Del",0)+"</b></label></td>"
5127		}
5128	}
5129	if(cols.length>0)
5130		str+="</tr>";
5131	str+="</tbody>";
5132	if(this.type=="TABLE")
5133		str+="</table>";
5134	str+="<input type=hidden name="+this.id+"_"+this.queryPK+" value='"+(rowid==null?0:rowid)+"'>";
5135	return str;
5136}
5137JSVCform.prototype.getCol=function(col,index) {
5138	// standard cols - 0:type,1:title,2:objname,3:req,4:qryvaluename
5139	if(col==null)
5140		return "";
5141	var str="";
5142	var multirows=(this.repeat>1 && index!=null && index>=0);
5143	var name=jGetObjName(this,col[2]);
5144	var value=jGetVal(this.query,col[4]);
5145	var readonlyField=this.readonlyFields;
5146	var genColEmail;
5147	var idPart = name.lastIndexOf('_');
5148		if(typeof(idpart)=='undefined'){idpart=0;}
5149    var idPart2 = name.slice(idPart+1,name.length);
5150    	if(typeof(idpart2)=='undefined'){idpart2=0;}
5151
5152	if(col[0]=="TEXT") {
5153		// 5:maxlength,6:size,7:uppercase,8:blurfunc,9:warnmsg
5154		str="<input type=text name="+name+(col[3]==1?" CHKREQUIRED":"")+" value=\""+SVChtm(value.toString())+"\""+(col[5]>0?" maxlength="+col[5]:"")+(col[6]>0?" size="+col[6]:"")+" onblur=DoReq(this);"+(col[8]!=null?col[8]+";":"")+(col[7]==1?"this.value=this.value.toUpperCase(); style=text-transform:uppercase":"")+">";
5155		if(col[9]!=null) {
5156			var msg="";
5157			eval(jTrParam(this.query,col[9]));
5158			if(msg!="")
5159				str+="<div class=clsSVCColorWarning>"+JSVChtmUnescape(msg)+"</div>";
5160		}
5161	}
5162	else if(col[0]=="CALDATE") {
5163		// 5:dtmin,6:dtmax,7:warnmsg,8:onblur function
5164		str="<input MRMOBJ=CALDATE type=text name="+name+(col[3]==1?" CHKREQUIRED":"")+" value=\""+jFormat(0,value)+"\" maxlength=10"+(col[5]!=""?" DTMIN='"+col[5]+"'":"")+(col[6]!=""?" DTMAX='"+col[6]+"'":"")+" onblur=ObjDate(this);"+col[8]+">";
5165		if(col[7]!=null) {
5166			var msg="";
5167			eval(jTrParam(this.query,col[7]));
5168			if(msg!="")
5169				str+="<div class=clsSVCColorWarning>"+JSVChtmUnescape(msg)+"</div>";
5170		}
5171	}
5172	else if(col[0]=="MONEY") {
5173		// 5:blurfunc,6:preset value
5174		if((value==''||value==0)&&col[6]!=null)value=jFormat(1,col[6]);
5175		str="<input type=text name="+name+(col[3]==1?" CHKREQUIRED":"")+" value=\""+jFormat(1,value)+"\" maxlength=12 size=20 onblur=JSVCCurr(this);"+(col[5]!=null?col[5]+";":"")+">";
5176	}
5177	else if(col[0]=="CHECKBOX") {
5178		// 5:bitmask,6:clickfunc
5179		var bitmask=(isNaN(col[5])?0:col[5]);
5180		var onclick=col[6];
5181		str="<input type=hidden name="+name+" value=0><input type=checkbox name="+name+(col[3]==1?" CHKREQUIRED":"")+" id="+name+"_"+bitmask+" value="+bitmask+((value&bitmask)==bitmask?" checked":"")+(onclick!=null?" onclick="+this.id+".objCallback(this,'CHECKBOX','"+col[2]+"')":"")+">";
5182	}
5183	else if(col[0]=="RADIO") {
5184		// 5:selection list e.g.: 0,test1,1,test2 ... where odd position represents value, even represents text ; 6:clickfunc
5185		var sellist=(col[5]==null||col[5]==''?'':col[5]);
5186		var onclick=col[6];
5187		var seltxt,selval;
5188		sellist=sellist.split(",");
5189		str="";
5190		for(var cnt=0;cnt<sellist.length && cnt+1 < sellist.length ; cnt=cnt+2) {
5191			selval=sellist[cnt];seltxt=sellist[cnt+1];
5192			str+='<label><input '+(readonlyField>
51920?(readonlyField!=idPart2?'DISABLED onclick="return false;" ':(readonlyField==1?' onclick="return false;" ':'')):'')+' type="radio" name="'+name+'" value='+(isNaN(selval)?'"'+selval+'"':selval)+(onclick!=null&&readonlyField!=1?" onclick="+this.id+".objCallback(this,'RADIO','"+col[2]+"')":"")+(selval==value?" checked":"")+' > '+seltxt+'&nbsp;&nbsp;</label>';
5193		}
5194	}
5195	else if(col[0]=="TEXTAREA") {
5196		// 5:maxchar,6:rows,7:width
5197		var maxchar=(col[5]==null?1024:col[5]);
5198		var rows=(col[6]==null?5:col[6]);
5199		var colwidth=(col[7]==null?"100%":col[7]);
5200		str="<textarea "+(readonlyField>0?(readonlyField!=idPart2?" DISABLED READONLY ":(readonlyField==1?" DISABLED READONLY ":"")):"")+" WRAP=SOFT MRMOBJ=TEXTAREA MAXCHAR="+maxchar+" ROWS="+rows+" name="+name+(col[3]==1?" CHKREQUIRED":"")+" style=width:"+colwidth+" onblur=ObjText(this)>"+value+"</textarea>";
5201	}
5202	else if(col[0]=="SELECT") {
5203		// 5:optionlist,6:seprator,7:blurfunc
5204		str="<select name="+name+(col[3]==1?" CHKREQUIRED":"")+" onchange=DoReq(this);"+(col[5]!=null?this.id+".objCallback(this,'SELECT','"+col[2]+"')":"")+"><option value=''></option>";
5205		str+=JSVCgenOptions(col[5],col[6],value);
5206		str+="</select>";
5207	}
5208	else if(col[0]=="SELECT_NOEMPTY") {
5209		// 5:optionlist,6:seprator,7:blurfunc
5210		str="<select name="+name+(col[3]==1?" CHKREQUIRED":"")+" onblur=DoReq(this);"+(col[5]!=null?this.id+".objCallback(this,'SELECT_NOEMPTY','"+col[2]+"')":"")+">";
5211		str+=JSVCgenOptions(col[5],col[6],value);
5212		str+="</select>";
5213	}
5214	else if(col[0]=="JS") {
5215		// 5:qryvaluename2,6:jsfunc
5216		var value2=jGetVal(this.query,col[5]);
5217		str=eval(col[6]);
5218	}
5219	else if(col[0]=="HTML") {
5220		// 5:html (now accepts function(this,col,index) as a HTML generator)
5221		if(typeof(col[5])=="function")
5222			str=col[5](this,col,index)
5223		else
5224			str=col[5];
5225	}
5226	else if(col[0]=="AJAX") {
5227		// 5:url
5228		str="<div>"+JSVClang("Loading",9242)+"... <img style=vertical-align:middle src='"+request.approot+"services/images/loading-anim.gif'></div>";
5229	}
5230	else if(col[0]=="EMAIL") {
5231		eval('svcmain_vars.genColEmail_'+this.id+'_'+name+'=  new JSVCgenMultiRows(\"svcmain_vars.genColEmail_'+this.id+'_'+name+'\",null,\"'+name+'\",\"'+value+'\",\",\",\"JSVCDoEmail(this)\",null,'+(col[3]==1?1:0)+',/*maxrows*/null,/*disptype*/null,/*optvaluelist*/null,/*optvaluelistsep*/null,true);');
5232		eval('str=svcmain_vars.genColEmail_'+this.id+'_'+name+'.gen(1)');
5233	}
5234	else if(col[0]=="HIDDEN") {
5235		str="<input "+(readonlyField>0?(readonlyField!=idPart2?" DISABLED READONLY ":(readonlyField==1?" DISABLED READONLY ":"")):"")+" type=hidden id="+name+" name="+name+" value=\""+value+"\">";
5236	}
5237	else if(col[0]=="SVCPOPSEL") { // SVCSELECTOR/SARISSA js need to be included, avoid arranging the object for this col as it may interrupting the existing function from the local's script
5238		// 5:url,6:xmldisplayfield,7:xmlvaluefield,8:hiddenvaluefield
5239		str="<input"+(col[3]==1?" CHKREQUIRED":"")+" READONLY tabindex=-1 style='background-color:silver' id="+name+" name="+name+" size=50 onblur=DoReq(this) value=\""+SVChtm(value.toString())+"\">";
5240		str+="<input type=button class=clsSVCButton value='Lookup...' id=\"btnSVCpopsel_"+name+"\" onclick=\"SVCpopsel_"+name+".StartSearch('','&S=')\">";
5241		var str2="<script>";
5242		str2+="var SVCpopsel_"+name+"=new SVCPopSelector('SVCpopsel_"+name+"','"+col[5]+"','POPUP','"+col[6]+"','"+col[7]+"',0,1,1,'"+name+"','"+jGetObjName(this,col[8])+"',null,null);";
5243		str2+="</script>";
5244		document.write(str2);
5245	}
5246	else if(col[0]=="GROUP") {
5247		var tmpstr = "";
5248		var tmpcol = col[5];
5249		if(col[3]==1 || col[3]==2) { // 1: horizontal, no line break, 2: simple line break
5250			for(var i=0; i<tmpcol.length; i++) {
5251				if(tmpcol[i][0]!="HIDDEN") tmpstr+=tmpcol[i][1]+"&nbsp;";
5252				tmpstr+=this.getCol(tmpcol[i],index)+(col[3]==1?"&nbsp;":"<br />");
5253			}
5254		}
5255		else if(col[3]==3) { // table layout
5256			tmpstr='<table border="0" width="0" margin="0" cellspacing="0" cellpadding="1" width="100%" style="border: 0px none;">';
5257			for(var i=0; i<tmpcol.length; i++) {
5258				tmpstr+='<tr><td width="30%" valign="top" style="border: 0px none;" nowrap>';
5259				if(tmpcol[i][0]!="HIDDEN") tmpstr+=tmpcol[i][1];
5260				tmpstr+='&nbsp;</td>';
5261				tmpstr+='<td width="70%" valign="top" style="border: 0px none;">';
5262				tmpstr+=this.getCol(tmpcol[i],index);
5263				tmpstr+='&nbsp;</td></tr>';
5264			}
5265			tmpstr+='</table>';
5266		}
5267
5268		str=tmpstr;
5269	}
5270	return str;
5271	function jFormat(type,value) {
5272		var e=document.createElement("INPUT");
5273		e.value=value;
5274		if(type==0)
5275			ObjDate(e);
5276		else if(type==1)
5277			JSVCCurr(e);
5278		return e.value;
5279	}
5280	function jGetVal(qry,colname) {
5281		var value=JSVCqueryGetValue(qry,colname,(multirows?index:0));
5282		if(value==null)
5283			value="";
5284		return value;
5285	}
5286	function jTrParam(qry,str) {
5287		var rx=new RegExp("\{([a-z0-9_]+)\}","i"); // translate params i.e. {CASEID}
5288		var m=rx.exec(str)
5289		while(m!=null) {
5290			str=str.replace(m[0],jGetVal(qry,m[1]));
5291			m=rx.exec(str);
5292		}
5293		return str;
5294	}
5295	function jGetObjName(o,objname) {
5296		var str="";
5297		if(multirows) { // multiple rows
5298			var rowid=JSVCqueryGetValue(o.query,o.queryPK,index);
5299			if(o.duplicateMode) // When in Duplicate mode, always treat it as new row
5300				rowid=null;
5301			if(rowid!=null && rowid>0) {
5302				str=(o.appendIDToFieldName?o.id+"_":"")+objname+"_"+rowid; // existing row
5303			} else {
5304				str=(o.appendIDToFieldName?o.id+"_":"")+objname+index; // new row
5305			}
5306		} else { // one row
5307			str=(o.appendIDToFieldName?o.id+"_":"")+objname;
5308		}
5309		return str;
5310	}
5311}
5312JSVCform.prototype.addMore=function(obj) {
5313	var next=JSVCall("TAB"+this.id+this.show);
5314	if(next!=null) {
5315		JSVCshow(next);
5316		this.show++;
5317		next=JSVCall(this.id+"_ROWCNT");
5318		next.value=this.show;
5319	}
5320	// button text
5321	obj.value=(this.show>0?JSVClang("Add More",7645):JSVClang("Add",2210))+" >>"
5322	if(this.show>=this.repeat) // last to show?
5323		return true;
5324	else
5325		return false;
5326}
5327JSVCform.prototype.objCallback=function(sender,type,objname) {
5328	var callbackCol;
5329	switch(type) {
5330		case "CHECKBOX": case "RADIO":
5331			callbackCol = 6;
5332			break;
5333		case "SELECT": case "SELECT_NOEMPTY":
5334			callbackCol = 7;
5335			break;
5336		default:
5337			return;
5338	}
5339	for(var i in this.cols)
5340		if(type==this.cols[i][0] && objname==this.cols[i][2]) {
5341			if(this.cols[i][callbackCol]!=null) {
5342				this.cols[i][callbackCol](sender,type,objname);
5343			}
5344		}
5345}
5346JSVCform.prototype.attachOnloadCode=function() {
5347	for(var i in this.cols) {
5348		var col=this.cols[i];
5349		if(col[0]=="CHECKBOX" && col[6]!=null && typeof(col[6])=="function") { // has function
5350			var f=col[6].toString();
5351			if(f.substr(0,8)=="function") {
5352				f=f.replace(/function[^\(]*\([^\)]*\)[^\{]*\{([\s\S]+)\}/,"$1");
5353			}
5354			AddOnloadCode(f+";");
5355		}
5356	}
5357}
5358JSVCform.prototype.ajaxStart=function() {
5359	for(var r=0;this.repeat>1 && r<this.repeat;r++)
5360		if((r+1)<=this.show) {
5361			for(var c=0;c<cols.length;c++) {
5362				var rowid=JSVCall("TAB"+this.id+r+"COL"+c);
5363				var col=this.cols[c];
5364				if(rowid!=null && col[0]=="AJAX") {
5365					MRMHTTPRequest("GET",col[5],null,this.ajaxComplete,null,null,null,null,rowid);
5366				}
5367			}
5368		}
5369}
5370JSVCform.prototype.ajaxComplete=function(xmlhttp,readyparam) {
5371	if(xmlhttp!=null) {
5372		var obj=JSVCall(readyparam);
5373		if(obj!=null) {
5374			var txt=xmlhttp.responseText;
5375			if(txt.length==0) {
5376				obj.innerHTML="ERROR";
5377			}
5378			else
5379				if(txt.length>0 && txt.match(/^[\s\t]*function/i))
5380					obj.innerHTML=eval(txt);
5381				else
5382					obj.innerHTML=txt;
5383		}
5384	}
5385}
5386function JSVCgetElementByTagNameAndId(obj,tagname,id)
5387{	// Get the first matching element by tagname & ID
5388	var l=obj.getElementsByTagName(tagname);
5389	for(var t=0;t<l.length;t++)
5390	{	if(l[t].id==id)
5391			return l[t];
5392	}
5393	return null;
5394}
5395function JSVCgetAllElementsByTagNameAndId(obj,tagname,id)
5396{	// Get list of all elements matching tagname and ID
5397	var l,arr;
5398	l=obj.getElementsByTagName(tagname);
5399	arr=new Array();
5400	for(var t=0;t<l.length;t++)
5401	{	if(l[t].id==id)
5402			arr[arr.length]=l[t];
5403	}
5404	return arr;
5405}
5406function JSVCRateInputChg(nm,maxdays)
5407{	var sel,o1,o2,o3,ovat,odisp,tmp,vatpc;
5408	o1=document.getElementsByName(nm+"DAYS")[0];
5409	o2=document.getElementsByName(nm+"RATE")[0];
5410	ovat=document.getElementsByName(nm+"VATPC")[0];
5411	if(ovat)
5412		vatpc=JSVCNumLOCtoDB(ovat.value);
5413	if(vatpc==""||vatpc==null)
5414		vatpc=0;
5415	odisp=document.getElementById(nm+"TOTDISP_DEFAULT");
5416	sel=JSVCRadioGetValue("rb"+nm);
5417	if(sel!=null)
5418	{
5419		o3=document.getElementsByName("sle"+nm)[0];
5420		if(sel=="1")
5421		{	o1.disabled=false;o2.disabled=false;o3.disabled=true;if(ovat)ovat.disabled=false;
5422		} else
5423		{	o1.disabled=true;o2.disabled=true;o3.disabled=false;if(ovat)ovat.disabled=true;
5424		}
5425		JSVCCurr(o3);
5426	}
5427	if(parseInt(o1.value)>parseInt(maxdays)){ JSVCniceralert("The max days allowed is "+maxdays+" days",0,"Maximum days exceeded.");}
5428	JSVC2DP(o1,maxdays,0.01);
5429	//JSVC1DP(o1,9999,0.1);
5430	JSVCCurr(o2);
5431	// Check if got TOTDISPID --> update total there instead
5432	tmp=o2.getAttribute("TOTDISPID");
5433	if(tmp!=null && tmp!="")
5434	{
5435		o3=document.getElementById(tmp);
5436		if(o3!=null&&o3.tagName=="INPUT")
5437		{
5438			o3.value=((o1.value==""||o2.value=="")?"":JSVCNumDBtoLOC(JSVCNumLOCtoDB(o1.value)*JSVCNumLOCtoDB(o2.value)*(100+vatpc)/100));
5439			o3.onblur();
5440		}
5441	} else if(odisp!=null)
5442		odisp.innerHTML=((o1.value==""||o2.value=="")?"?":JSVCNumDBtoLOC(JSVCNumLOCtoDB(o1.value)*JSVCNumLOCtoDB(o2.value)*(100+vatpc)/100));
5443}
5444function JSVCRateInputGenStr(nm,curr,desc,req,allow_lumpsum,days,rate,lumpsum,totdisp_id,allow_vatpcname,vatpclist,vatpc,maxdays)
5445{	var str,chk;
5446	str="";
5447	if(days==null)days="";if(rate==null)rate="";if(lumpsum==null)lumpsum="";
5448	if(totdisp_id==null)totdisp_id="";
5449	if(days==""&&allow_lumpsum>0&&lumpsum!="")chk=0
5450	else chk=1;
5451	str+=
5452		/* Generate radio-button, if allow_lumpsum */
5453		(allow_lumpsum>0?"<input type=radio id=\"_rb"+nm+"1\" name=\"rb"+nm+"\" onclick=\"JSVCRateInputChg('"+nm+"')\" value=\"1\" "+(chk==0?"":" checked")+"><!--label for=\"_rb"+nm+"1\"--> ":"")+
5454		/* Generate day/rate calc fields */
5455			"<input CHKNAME=\""+desc+" ("+JSVClang("days",3642)+")\" "+(req?"CHKREQUIRED ":"CHKREQUIRED=\"obj.nextSibling.nextSibling.value!=''\" ")+" size=7 maxlength=6 name=\""+nm+"DAYS\" onblur
5455=\"JSVCRateInputChg('"+nm+"','"+maxdays+"')\" value=\""+days+"\"> "+" x <input  CHKNAME=\""+desc+" ("+JSVClang("rate",7213)+")\" "+(req?"CHKREQUIRED ":"CHKREQUIRED=\"obj.previousSibling.previousSibling.value!=''\" ")+"size=10 maxlength=8 "+(totdisp_id!=""?"TOTDISPID=\""+totdisp_id+"\" ":"")+" name=\""+nm+"RATE\" onblur=\"JSVCRateInputChg('"+nm+"')\" value=\""+JSVCCurr(rate)+"\"> "+
5456			curr+"("+JSVClang("rate",7213)+")";
5457	if(allow_vatpcname!=null && allow_vatpcname!="")
5458	{
5459		str+=" + <span class='taxnamev'>"+allow_vatpcname+"</span>% ";
5460		if(vatpclist!=null && vatpclist!='')
5461		{
5462			str+="<SELECT CHKNAME=\""+desc+" ("+allow_vatpcname+")\" name=\""+nm+"VATPC\" onblur=\"JSVCRateInputChg('"+nm+"')\" onchange=\"JSVCRateInputChg('"+nm+"')\">";
5463			var vatpclistarr=vatpclist.split("|");
5464			for(var abc in vatpclistarr)
5465				str+="<OPTION VALUE=\""+vatpclistarr[abc]+"\""+(vatpclistarr[abc]==vatpc?" SELECTED":"")+">"+vatpclistarr[abc]+"</OPTION>";
5466			str+="</SELECT>";
5467		}
5468		else
5469			str+="<input CHKNAME=\""+desc+" ("+allow_vatpcname+")\" size=7 maxlength=6 name=\""+nm+"VATPC\" onblur=\"JSVCRateInputChg('"+nm+"')\" value=\""+vatpc+"\">";
5470	}
5471	str+=
5472			(totdisp_id==""?" = <b>"+curr+"</b><b id=\""+nm+"TOTDISP_DEFAULT\">&nbsp;</b>":"")+
5473			(allow_lumpsum>0?"<!--/label--><br><input type=radio id=\"_rb"+nm+"0\" name=\"rb"+nm+"\" onclick=\"JSVCRateInputChg('"+nm+"')\" value=\"0\" "+(chk==0?" checked":"")+"><!--label for=\"_rb"+nm+"0\"--> "+JSVClang("Lump-Sum",7214)+" ("+curr+"): <input "+(req?"CHKREQUIRED ":"")+"name=\"sle"+nm+"\" value=\""+lumpsum+"\" maxlength=14 onblur=JSVCCurr(this)><!--/label-->"
5474			:"");
5475	return str;
5476}
5477
5478
5479// the checkboxes and exception links are disabled without this, this gives the "can see (grey) but can't touch" effect
5480// to remove the semi transparent div, just change the 100%'s to 0%'s or comment out the related lines
5481// KY (19/10/2012) Support multi layer disabling (if no oCapture passed in, wont do anything)
5482function JSVCPageDisable(oCapture,bActivate){
5483	var extlayer;//check if disabling div existed
5484	var disable_div = document.getElementById('JSVCdivfullpage');
5485	if((disable_div==null && bActivate==false)||oCapture==null)
5486		return;
5487	if (disable_div == null) {
5488		disable_div = document.createElement("DIV");
5489		disable_div.className = "clsSVCdisablelayer";
5490		disable_div.id = "JSVCdivfullpage";
5491		//disable_div.style.zIndex=900;
5492		disable_div.style = "z-index: 900; display:block !important"; 
5493		disable_div.setAttribute("HIDDEN", "1");
5494		document.body.appendChild(disable_div);
5495		extlayer=0;
5496	} else {
5497		extlayer=1;
5498	}
5499	if(bActivate){
5500//	if(disable_div.width == 0 || disable_div.width == 0+'px' || gen_cntrl == "1"){
5501		// Josh wrote: a trick to get real height and width of document
5502		// somehow setting dimensions in % does not work for opacity, so get height and set it back to pixel value
5503		if (extlayer==1) {
5504			disable_div.style.zIndex=parseInt(disable_div.style.zIndex)+10;
5505			oCapture.style.zIndex=parseInt(disable_div.style.zIndex)+1;
5506		}
5507		else {
5508			disable_div.style.width = '100%';
5509			disable_div.style.height = '100%';
5510			disable_div.style.width = document.body.scrollWidth + 'px';
5511			disable_div.style.height = document.body.scrollHeight + 'px';
5512			disable_div.setAttribute("HIDDEN", "0");
5513			//disable_div.setAttribute("CAPTUREOBJ", oCapture);//not really in use
5514		}
5515	}else{
5516		if(parseInt(disable_div.style.zIndex)>900){
5517			disable_div.style.zIndex=parseInt(disable_div.style.zIndex)-10;
5518		}else{
5519			disable_div.parentNode.removeChild(disable_div);
5520		}
5521	}
5522}
5523function JSVCsymbol(name,deftext,locid) {
5524	var result=Trim(deftext);
5525	if(locid==null)
5526		locid=jSVClocid;
5527	if(jSVCsymbol==null)
5528		return result;
5529	var test=eval("jSVCsymbol."+name);
5530	if(test!=null && test!="")
5531		result=Trim(test);
5532	result=result.replace(/(\/\*|<!---){[\/]*LID[0-9]*}(\*\/|--->)/gi);
5533	if(result.substring(0,14).toLowerCase()=="server.svclang" && (result.length-14)>0) {
5534		result=eval("JSVClang"+result.substr(14,result.length-14));
5535	}
5536	return result;
5537}
5538
5539//Kian Yee : Regex checking for other form variable type
5540function JSVCRegex(val, regex, minlen, maxlen)
5541{
5542	var str,obj;
5543	if(typeof(val)=="object"){obj=val;val=val.value;}
5544	if (minlen==null) minlen=0;
5545	if (maxlen==null) maxlen=-1;
5546	if(typeof(regex=="string"))
5547		regex=new RegExp(regex);
5548	if (!regex.test(val)||val.length<minlen||(val.length>maxlen && maxlen!=-1))
5549		str="";
5550	else
5551		str=val;
5552	if(obj!=null){obj.value=str;DoReq(obj);}
5553	return str;
5554}
5555
5556function JSVCAddSSL(str) {
5557	return str.replace(/^(http:\/\/)/i, "https://");
5558}
5559
5560function JSVCRemSSL(str) {
5561	return str.replace(/^(https:\/\/)/i, "http://");
5562}
5563function JSVCIsMobile() {
5564	return (('ontouchstart' in document.documentElement)
5565		|| ('ontouchstart' in window)
5566		|| (navigator.maxTouchPoints > 0)
5567		|| (navigator.msMaxTouchPoints > 0));
5568}
5569/* --------------------------
5570 JSVCrpt Class
5571-----------------------------*/
5572function JSVCrpt(varname,query,totLabel) {
5573	this.varname=varname; // varname
5574	this.query=query; // JSON
5575	this.grpBy=null;
5576	this.sumBy=null;
5577	this.totLabel=(totLabel==null?[JSVClang("Sub Total",1497),JSVClang("Grand Total",10164)]:totLabel);
5578	this.rowTitle=null;
5579}
5580JSVCrpt.prototype.gen=function(cols,retstr) {
5581	this.cols=cols;
5582	var htm="";
5583	if(this.query.DATA.length==0) {
5584		htm="<p align=center>- "+ JSVClang("There is no record",12462) + " -</p>";
5585		if(retstr) return htm; else document.write(htm);
5586		return;
5587	}
5588	htm+="<table border=1 align=center cellpadding=1 cellspacing=0 style=width:100%;font-size:85%;>";
5589	for(var c in this.cols) {
5590		var col=this.cols[c];
5591		htm+=this.getCol(col,0);
5592	}
5593	if(this.rowTitle!=null) {
5594		htm+="<tr class=header><td colspan="+this.cols.length+">"+this.rowTitle.toUpperCase()+"</td></tr>"
5595	}
5596
5597/* HTML rowspan example
5598<table width="100%" border="1">
5599  <tr>
5600    <td rowspan=2>January</td><td colspan=3>ttt</td><td rowspan=2>col3</td><td>col4</td>
5601  </tr>
5602  <tr>
5603    <td>test2</td><td>test3</td><td>test4</td><td>test5</td>
5604  </tr>
5605</table>
5606*/
5607
5608	// Generate columns, currently support 2 rowspan
5609	var colcfg={rowsplit:1,cols:[]};
5610	var x=0;
5611	for(var c in this.cols) {
5612		var col=this.cols[c];
5613		var rx=new RegExp("^(.+?)//(.+?)$");
5614		var m=rx.exec(col[1],"gi");
5615		colcfg.cols[c]={};
5616		colcfg.cols[c].split=false;
5617		colcfg.cols[c].colspan=1;
5618		colcfg.cols[c].header=[];
5619		colcfg.cols[c].header[0]=col[1];
5620		if(m&&m.length>0) {
5621			colcfg.rowsplit=2;
5622			colcfg.cols[c].split=true;
5623			colcfg.cols[c].header[0]=m[1];
5624			colcfg.cols[c].header[1]=m[2];
5625			if(c>0&&(colcfg.cols[c].header[0]==colcfg.cols[c-1].header[0])) {
5626				colcfg.cols[x].colspan+=1;
5627				colcfg.cols[c].colspan=0;
5628			} else {
5629				x=c;
5630			}
5631		} else {
5632			colcfg.cols[c].colspan=0;
5633		}
5634	}
5635	if(colcfg.rowsplit>1) {
5636		for(var i=0;i<colcfg.rowsplit;i++) {
5637			htm+="<tr class=clsColumnHeader>";
5638			for(var c in this.cols) {
5639				var col=this.cols[c];
5640				if(i==0) {
5641					if(colcfg.cols[c].split==false)
5642						htm+="<td align=center rowspan="+colcfg.rowsplit+">"+colcfg.cols[c].header[i]+"&nbsp;</td>";
5643					else if(colcfg.cols[c].colspan>0)
5644						htm+="<td align=center colspan="+colcfg.cols[c].colspan+">"+colcfg.cols[c].header[i]+"&nbsp;</td>";
5645				}
5646				else if(i==1) {
5647					if(colcfg.cols[c].split==true)
5648						htm+="<td align=center>"+colcfg.cols[c].header[i]+"&nbsp;</td>";
5649				}
5650			}
5651			htm+="</tr>";
5652		}
5653	} else {
5654		htm+="<tr class=clsColumnHeader>";
5655		for(var c in this.cols) {
5656			var col=this.cols[c];
5657			htm+="<td align=center>"+col[1]+"&nbsp;</td>";
5658		}
5659		htm+="</tr>";
5660	}
5661
5662	// Generate data rows
5663	var prev=null;
5664	var subtot=[],subcnt=[];
5665	var grdtot=[],grdcnt=[];
5666	for(var i=0;i<this.query.DATA.length;i++) {
5667		// generate group by separator
5668		if(this.grpBy!=null && (prev==null || this.getData(this.grpBy,i)!=prev)) {
5669			// show subtotal row
5670			if(this.sumBy!=null && prev!=null) {
5671				htm+=trSubTotal(this,subtot,subcnt,this.totLabel[0],1);
5672			}
5673			// show grouping row
5674			htm+="<tr class=clsColumnSubHeader><td colspan="+this.cols.length+" align=left style=font-size:110%>"+this.getData(this.grpBy,i)+"</td></tr>";
5675			prev=this.getData(this.grpBy,i);
5676		}
5677		htm+="<tr class=clsRptTone"+((i+1)%2==0?"2":"1")+">";
5678		for(var c in this.cols) {
5679			var col=this.cols[c];
5680			var value=this.getCol(col,1,i);
5681			htm+="<td>"+value+(value.toString().length==0?"&nbsp;":"")+"</td>";
5682			if(this.sumBy!=null && JSVCArrayIndexOf(this.sumBy,col[2])>=0 && (col[0]=="MONEY"||col[0]=="SMALLNO")) {
5683				if(subtot[c]==null) subtot[c]=0;
5684				if(subcnt[c]==null) subcnt[c]=0;
5685				if(grdtot[c]==null) grdtot[c]=0;
5686				if(grdcnt[c]==null) grdcnt[c]=0;
5687				var x=this.calcFormula(col[2],i);
5688				if(x.toString()!="") {
5689					subtot[c]+=x;subcnt[c]+=1;
5690					grdtot[c]+=x;grdcnt[c]+=1;
5691				}
5692			}
5693		}
5694		htm+="</tr>";
5695	}
5696	// show subtotal row
5697	if(this.sumBy!=null && prev!=null) {
5698		htm+=trSubTotal(this,subtot,subcnt,this.totLabel[0],1);
5699	}
5700	// show grandtotal row
5701	htm+=trSubTotal(this,grdtot,grdcnt,this.totLabel[1],0);
5702	htm+="</table>";
5703	if(retstr) return htm; else document.write(htm);
5704
5705	function trSubTotal(o,ar,cnt,title,separator) {
5706		var htm="";
5707		if(!ar.length>0)
5708			return htm;
5709		htm+="<tr class=clsRptTotal>"+tdSubTotal(o,ar,cnt,title)+"</tr>";
5710		if(separator==1)
5711			htm+="<tr><td colspan="+o.cols.length+">&nbsp;</td></tr>";
5712		for(var i in ar) // zerorize subtotal
5713			if(ar[i]!=null) ar[i]=0;
5714		for(var i in cnt) // zerorize subcount
5715			if(cnt[i]!=null) cnt[i]=0;
5716		return htm;
5717	}
5718	function tdSubTotal(o,ar,cnt,title) {
5719		var cs=0,i;
5720		var str="";
5721		for(i=0;i<ar.length && ar[i]==null;i++)
5722			cs+=1;
5723		if(cs>0)
5724			str+="<td colspan="+cs+" align=right>"+(title==null?"":title)+"&nbsp;</td>";
5725		for(;i<ar.length || i<o.cols.length;i++) {
5726			if(ar[i]==null)
5727				str+="<td>&nbsp;</td>";
5728			else {
5729				var x="";v=ar[i];
5730				var type=o.cols[i][0];
5731				var aggType=o.cols[i][3];
5732				var decplace=o.cols[i][4];
5733				if(aggType==1) // avg
5734					v=v/cnt[i];
5735				if(type=="MONEY")
5736					x=JSVCCurr(v);
5737				else if(type=="SMALLNO")
5738					x=JSVCNum(v,decplace);
5739				str+="<td>"+x+(x.toString().length==0?"&nbsp;":"")+"</td>";
5740			}
5741		}
5742		return str;
5743	}
5744}
5745JSVCrpt.prototype.getCol=function(col,type/*0:colClass,1:getValue*/,index) {
5746	if(col[0]=="REGNO") { // [0:type,1:label,2:queryCol,3:showLink,4:CaseIDcol]
5747		if(col[1]==null)
5748			col[1]="Reg. No.";
5749		if(type==0)
5750			return "<col class=clsSVCColRegNo>";
5751		else if(type==1) {
5752			if(col[3]==1)
5753				return "<a href=javascript:openClm("+this.getData(col[4],index)+")>"+this.getData(col[2],index)+"</a>";
5754			else
5755				return this.getData(col[2],index);
5756		}
5757	}
5758	else if(col[0]=="RFQNO") { // [0:type,1:label,2:queryCol,3:showLink,4:CaseIDcol,5:RfqIDCol]
5759		if(col[1]==null)
5760			col[1]="RFQ No.";
5761		if(type==0)
5762			return "<col class=clsSVCColRegNo>";
5763		else if(type==1) {
5764			if(col[3]==1)
5765				return "<a href=javascript:openRFQ("+this.getData(col[4],index)+","+this.getData(col[5],index)+")>"+this.getData(col[2],index)+"</a>";
5766			else
5767				return this.getData(col[2],index);
5768		}
5769	}
5770	else if(col[0]=="LINK") { // [0:type,1:label,2:queryCol,3:url,4:itemLabel]
5771		if(col[1]==null)
5772			col[1]="";
5773		if(type==0)
5774			return "<col class=clsSVCColID>";
5775		else if(type==1) {
5776			if(col[3]!=null)
5777				return "<a href=\"javascript:JSVCopenWin('"+this.transData(col[3],index)+"')\">"+(col[4]!=null?this.transData(col[4],index):this.getData(col[2],index))+"</a>";
5778			else
5779				return this.getData(col[2],index);
5780		}
5781	}
5782	else if(col[0]=="SMALLNO") { // [0:type,1:label,2:queryCol,3:aggregateBy(0=sum,1=avg),4:DecimalPlace,5:FormatFunc]
5783		if(type==0)
5784			return "<col class=clsSVCColSmallNo>";
5785		else if(type==1) {
5786			var x;
5787			x=this.calcFormula(col[2],index);
5788			x=JSVCNum(x,col[4]);
5789			if(typeof(col[5])=="function")
5790				x=col[5](x,index);
5791			return x;
5792		}
5793	}
5794	else if(col[0]=="TEXT") { // [0:type,1:label,2:queryCol]
5795		if(type==0)
5796			return "<col class=clsSVCColText>";
5797		else if(type==1) {
5798			var value=this.getData(col[2],index);
5799			if(value==null) value="";
5800			value=value.toString().replace(/\r/g,"<br>").replace(/\n/g,"");
5801			return value;
5802		}
5803	}
5804	else if(col[0]=="SMALLTEXT") { // [0:type,1:label,2:queryCol]
5805		if(type==0)
5806			return "<col class=clsSVCColName>";
5807		else if(type==1)
5808			return this.getData(col[2],index);
5809	}
5810	else if(col[0]=="DATE") { // [0:type,1:label,2:queryCol,3:timeFormat,4:DateFormat]
5811		if(type==0)
5812			return "<col class=clsSVCColDate>";
5813		else if(type==1) {
5814			var tmformat=null;
5815			if(col[3]!=null)
5816				tmformat=col[3];
5817			var dtformat=null;
5818			if(col[4]!=null)
5819				dtformat=col[4];
5820			return JSVCdtDBtoLOC(this.getData(col[2],index),null,dtformat,tmformat);
5821		}
5822	}
5823	else if(col[0]=="DATETIME") { // [0:type,1:label,2:queryCol,3:timeFormat,4:DateFormat]
5824		if(type==0)
5825			return "<col class=clsSVCColDate>";
5826		else if(type==1) {
5827			var tmformat="HH:mm:ss";
5828			if(col[3]!=null && col[3]!="STD")
5829				tmformat=col[3];
5830			var dtformat=null;
5831			if(col[4]!=null)
5832				dtformat=col[4];
5833			return JSVCdtDBtoLOC(this.getData(col[2],index),null,dtformat,tmformat);
5834		}
5835	}
5836	else if(col[0]=="MONEY") { // [0:type,1:label,2:queryCol,3:aggregateBy(0=sum,1=avg),4:DecimalPlace]
5837		if(type==0)
5838			return "<col class=clsSVCColMoney>";
5839		else if(type==1) {
5840			var x;
5841			x=this.calcFormula(col[2],index);
5842			return JSVCCurr(x,9999999999,-9999999999);
5843		}
5844	}
5845	else if(col[0]=="CNT") { // [0:type,1:label]
5846		if(type==0)
5847			return "<col class=clsSVCColNo>";
5848		else if(type==1)
5849			return (index+1);
5850	}
5851	else if(col[0]=="NO") { // [0:type,1:label,2:queryCol]
5852		if(type==0)
5853			return "<col class=clsSVCColNo>";
5854		else if(type==1) {
5855			return this.getData(col[2],index);
5856		}
5857	}
5858	return "";
5859}
5860JSVCrpt.prototype.calcFormula=function(q,index) {
5861	var x,s=q,rx=new RegExp("\{([a-z0-9\_]+)\}","gi"); // finding queryCol like {RTOT1}-{RTOT2}
5862	var m=rx.exec(q);
5863	if(m!=null) {
5864		while(m!=null) {
5865			var val=this.getData(m[1],index);
5866			if(val=="") val=0;
5867			s=s.replace(m[0],val);
5868			m=rx.exec(q);
5869		}
5870		x=eval(s);
5871	} else
5872		x=this.getData(q,index);
5873	return x;
5874}
5875JSVCrpt.prototype.transData=function(str,index) {
5876	var rx=new RegExp("\{([^\}]+)\}","i"); // translate params i.e. {CASEID}
5877	var m=rx.exec(str);
5878	while(m!=null) {
5879		str=str.replace(m[0],this.getData(m[1],index));
5880		m=rx.exec(str);
5881	}
5882	return str;
5883}
5884JSVCrpt.prototype.getData=function(colname,index) {
5885	var value=JSVCqueryGetValue(this.query,colname,index);
5886	if(value==null) value="";
5887	return value;
5888}
5889JSVCrpt.prototype.groupBy=function(param) {
5890	this.grpBy=param;
5891}
5892JSVCrpt.prototype.aggBy=function(param) {
5893	var ar=param.split(",");
5894	this.sumBy=ar;
5895}
5896JSVCrpt.prototype.genFootNote=function(list) {
5897	if(list==null || list=="")
5898		return;
5899	var htm="";
5900	htm+="<br><table border=0 align=center cellpadding=1 cellspacing=0 style=width:100%>";
5901	for(var i in list) {
5902		htm+="<tr class=clsRptNote><td>NOTE"+(parseInt(i)+1)+":"+list[i]+"</td></tr>";
5903	}
5904	htm+="</table>";
5905	document.write(htm);
5906}
5907JSVCrpt.prototype.setRowTitle=function(title) {
5908	this.rowTitle=title;
5909}
5910function JSVCstrEndWith(str,endwithstr)
5911{	var len;
5912	if(str==null)str="";
5913	len=str.length;
5914	if(endwithstr.length>len||endwithstr.strlength==0)return false;
5915	if(str.substring(len-endwithstr.length,len).toUpperCase()==endwithstr.toUpperCase())return true;
5916	return false;
5917}
5918function JSVCisArray(obj) {
5919return obj && obj.constructor == Array;
5920}
5921
5922function JSVClang(TEXT,LID,LGID) { // LGID in 0 or +ve, or in struct form with key LGID2, DELIMS, SPANSTYLE  eg:{"LGID2":1,"DELIMS":";"}
5923	/* LGID
5924	 * 	-1	: force no translation
5925	 *  0	: translate based on default LGID
5926	 *  +ve : traslate based on LGID
5927	 *  [struct] value : to include secondary translated text after the the main text, LGID will be based on the default LGID
5928	 * 			LGID2	: secondary text will be traslated based on LGID2
5929	 * 			DELIMS	: both main text and secondary text will be separate by DELIMS provided. default as "/"
5930	 *			SPANSTYLE : include style for secondary text. eg: "SPANSTYLE":"font-style:italic"
5931	 */
5932
5933	/* Share the same logic in SVCmain.js -- JSVClang / SVCcffunctions.cfm -- SVClang */
5934	var cur_lgid2=null,
5935		cur_delims="",
5936		cur_lgid=null,
5937		cur_text=null,
5938		cur_spanstyle=null,
5939		returnval="",
5940		cur_TXT1="",
5941		cur_TXT2="",
5942		cur_FLIP=0;
5943	var displid = 0;
5944
5945	if(typeof JSUserID != "undefined" && (JSUserID == 'VNTRANS' || JSUserID == 'VNADJTRANS' ))
5946		displid = 1;
5947
5948	if(LID==null)
5949		LID=0;
5950	if(LGID==null)
5951		LGID=0;
5952
5953	if(arguments.length==1 && displid)
5954	   return "[" + 0 + "]" + TEXT;
5955	else if (arguments.length==1)
5956		return TEXT;
5957
5958	if(LID>0) {
5959		if(typeof(LGID)=='object') {
5960			/* primary language ID */
5961			cur_lgid=0;
5962			/* 2nd language ID */
5963			if(typeof(LGID['LGID2'])!='undefined')
5964				cur_lgid2=LGID['LGID2'];
5965			if(typeof(LGID['DELIMS'])!='undefined')
5966				cur_delims=LGID['DELIMS'];
5967			else
5968				cur_delims=' / ';
5969			if(typeof(LGID['SPANSTYLE'])!='undefined')
5970				cur_spanstyle=LGID['SPANSTYLE'];
5971			else
5972				cur_spanstyle='';
5973			cur_text=TEXT;
5974			if(typeof(LGID['FLIP'])!='undefined') {
5975				cur_FLIP=LGID['FLIP'];
5976			}
5977		} else {
5978			cur_lgid=LGID;
5979		}
5980
5981		if(cur_lgid==0) {
5982			if(request.lgid>=0)
5983				cur_lgid=request.lgid;
5984			else if(jSVClgid>=0)
5985				cur_lgid=jSVClgid;
5986		} else if(cur_lgid==-1) {
5987			cur_lgid=0; /* forcing no translation */
5988		}
5989		if(cur_lgid>0) {
5990			if(request.DS.LANG[cur_lgid]!=null && request.DS.LANG[cur_lgid][LID]!=null)
5991			{
5992				TEXT=request.DS.LANG[cur_lgid][LID];
5993				TEXT = TEXT.replace(/\\n/g,"\n");
5994			}
5995		}
5996	}
5997
5998	if(arguments.length>3) {
5999		for(var P=3;P<arguments.length;P++)
6000			TEXT=TEXT.replace(new RegExp(RegExp.escape("{"+(P-3)+"}"),"gi"),arguments[P]);
6001	}
6002
6003	if(cur_lgid2!=null && cur_text!='' && cur_text!=null && cur_lgid2!=cur_lgid) {
6004		// Secondary language
6005		if(cur_lgid2==0) {
6006			// Do not translate (for English display)
6007			returnval=cur_text;
6008		} else {
6009			returnval=JSVClang(cur_text,LID,cur_lgid2);
6010		}
6011		if(cur_FLIP==1) {
6012			cur_TXT1=(returnval!=null?returnval:'');
6013			cur_TXT2=TEXT;
6014		} else {
6015			cur_TXT1=TEXT;
6016			cur_TXT2=(returnval!=null?returnval:'');
6017		}
6018		if(cur_spanstyle!=null && cur_spanstyle!='')
6019			TEXT=cur_TXT1+cur_delims+'<span style=\"'+cur_spanstyle+'\">'+cur_TXT2+'</span>';
6020		else
6021			TEXT=cur_TXT1+cur_delims+cur_TXT2;
6022	}
6023
6024	if(displid)
6025	   TEXT = "[" + LID + "]" + TEXT;
6026
6027	return TEXT;
6028}
6029
6030function JVSClangCode(lcode) {
6031	if(!(typeof(lcode)=="string" && request && request.DS && request.DS.LANGDEF))
6032		return;
6033	var a=request.DS.LANGDEF;
6034	for(var i=0;a[i]!=null;i++) {
6035		if(a[i].LCODE.toLowerCase()==lcode.toLowerCase())
6036			return a[i]; // .LCODE/.DESC/.LANGID
6037	}
6038	return;
6039}
6040RegExp.escape=function(str)
6041{
6042  var specials=new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
6043  return str.replace(specials, "\\$&");
6044}
6045function JSVCopenWinPost(url,winname,postdata/*array*/) {
6046	var frm=document.createElement("form");
6047	frm.setAttribute("method","post");
6048	frm.setAttribute("action",url);
6049	frm.setAttribute("target",winname);
6050	for(var i in postdata) {
6051		var f=document.createElement("input");
6052		f.setAttribute("type","hidden");
6053		f.setAttribute("name",postdata[i][0]);
6054		f.setAttribute("value",postdata[i][1]);
6055		frm.appendChild(f);
6056	}
6057	document.body.appendChild(frm);
6058	frm.submit();
6059}
6060/* ======= JSVCgenMultiRows =================
6061varname - name of this JS variable
6062parentid - container's object ID
6063formname - name of the input element
6064valuelist - value list
6065valuelistsep - value list delimiter
6066disptype - 0:textbox,1:dropdown,2:date with datepicker
6067============================================= */
6068function JSVCgenMultiRows(varname,parentid,formname,valuelist,valuelistsep,onblur,capcontent,chkrequired,maxrows,disptype,optvaluelist,optvaluelistsep,allowremove,disable) {
6069	this.varname=varname;
6070	this.parentid=parentid;
6071	this.formname=formname;
6072	this.valuelist=valuelist.split(valuelistsep);
6073	this.onblur=onblur;
6074	this.capcontent=capcontent;
6075	this.chkrequired=chkrequired;
6076	this.maxrows=(maxrows>0?maxrows:10); // default 10 rows max
6077	this.currow=1;
6078	this.rowno = 1;
6079	this.disptype=disptype;
6080	this.optvaluelist=optvaluelist;
6081	this.optvaluelistsep=optvaluelistsep;
6082	this.allowremove=(allowremove!=null?allowremove:false);
6083	this.disable = disable;
6084}
6085JSVCgenMultiRows.prototype.updateValueList=function(valuelist,valuelistsep) {
6086	this.valuelist=valuelist.split(valuelistsep);
6087}
6088JSVCgenMultiRows.prototype.regen=function() {
6089	var o=JSVCall(this.parentid);
6090	this.currow=1;
6091	this.rowno=1;
6092	o.innerHTML=this.gen(true);
6093}
6094JSVCgenMultiRows.prototype.gen=function(returnstr) {
6095	var htm="";
6096	htm+=this.elemT(this.formname,(this.valuelist!=null?this.valuelist[0]:""));
6097	if(!this.disable)
6098	   htm+="&nbsp;<input type=button class=clsSVCbutton value=' + ' onclick="+this.varname+".addRow() style=margin-bottom:2px;width:35px;>";
6099	if(this.valuelist!=null)
6100		for(var i=1;i<this.valuelist.length&&i<this.maxrows;i++) {
6101			this.rowno += 1;
6102			htm+="<br>"+this.elemT(this.formname,this.valuelist[i]);
6103			if(this.allowremove) {
6104				htm+="<span id=spn"+this.formname+"_"+this.rowno+">&nbsp;</span><input type=button class=clsSVCbutton value=' - ' onclick='"+this.varname+".removeRow(this, "+ this.rowno +");' style=margin-bottom:2px;width:35px;>";
6105			}
6106			this.currow+=1;
6107		}
6108	if(this.parentid==null && this.formname!=null) {
6109		this.parentid='MultiRows_'+this.formname;
6110		if(htm!=null && htm!='') htm='<div id="'+this.parentid+'">'+htm+'</div>';
6111	}
6112	if(returnstr)
6113		return htm;
6114	else
6115		document.write(htm);
6116}
6117JSVCgenMultiRows.prototype.addRow=function() {
6118	var o=JSVCall(this.parentid);
6119	if(this.currow<this.maxrows) {
6120		this.currow+=1;
6121		this.rowno += 1;
6122		JSVCinsertAdjacentHTML(o,"beforeEnd","<br>"+this.elemT(this.formname,""));
6123		MRMPreprocessFormItem(o.lastChild);
6124		if(this.allowremove) {
6125			JSVCinsertAdjacentHTML(o,"beforeEnd","<span id=spn"+this.formname+"_"+this.rowno+">&nbsp;</span><input type=button class=clsSVCbutton value=' - ' onclick='"+this.varname+".removeRow(this, "+ this.rowno +");' style=margin-bottom:2px;width:35px;>");
6126		}
6127	}
6128}
6129JSVCgenMultiRows.prototype.removeRow=function(btn, rowid) {
6130	var o = JSVCall(this.parentid);
6131	var r = document.getElementById(this.formname + "_" + rowid), br, spn;
6132
6133	if(this.currow > 1 && r != null) {
6134		br = r.previousSibling;
6135		spn = document.getElementById("spn"+this.formname+"_"+rowid);
6136		o.removeChild(r);
6137		o.removeChild(br);
6138		o.removeChild(btn);
6139		o.removeChild(spn);
6140		this.currow --;
6141	}
6142}
6143JSVCgenMultiRows.prototype.clear=function() {
6144	var o=JSVCall(this.parentid);
6145	this.currow=1;
6146	this.rowno=1;
6147	this.valuelist=null;
6148	o.innerHTML=this.gen(true);
6149}
6150JSVCgenMultiRows.prototype.elemT=function(name,value) {
6151
6152 	if(this.disptype==1) {
6153		var str="<select"+(this.chkrequired?" CHKREQUIRED":"")+" name="+name+" id="+name+"_"+this.rowno+" onblur=DoReq(this);"+this.onblur+" style=margin-top:2px;margin-bottom:1px"+(this.disable==1?" DISABLED PDISABLED":"")+(this.disable==2?" READONLY":"")+">";
6154		str+=JSVCgenOptions(this.optvaluelist,this.optvaluelistsep,value);
6155		str+="</select>";
6156		return str;
6157	}
6158	else if (this.disptype==2) {
6159		/*
6160		<input MRMOBJ=CALDATE DTMAX="TODAY" name="sleFINALREMINDERDATE" VALUE="#FN.SVCdtdbtoloc(dtCLMFINALREMINDER)#" onblur
6160="ObjDate(this)">
6161		*/
6162
6163		return "<input TESTINGROWRRRRR MRMOBJ=CALDATE name="+name+" value=\""+JSVCdtDBtoLOC(value)+"\" onblur=ObjDate(this);"+this.onblur+" "+(this.disable==1?" DISABLED PDISABLED":"")+(this.disable==2?" READONLY":"")+">";
6164	}
6165	else
6166		return "<input"+(this.chkrequired?" CHKREQUIRED":"")+" name="+name+" id="+name+"_"+this.rowno+" maxlength=100 size=38 value=\""+value+"\" onblur=DoReq(this);"+this.onblur+" onchange="+(this.capcontent?"javascript:this.value=this.value.toString().toUpperCase(); style='text-transform:uppercase'":"''")+" "+(this.disable==1?" DISABLED PDISABLED":"")+(this.disable==2?" READONLY":"")+">";
6167}
6168/* ======= JSVCrecordBrowser =================
6169varname	- name of this JS variable
6170parentid - container's object ID
6171xmlurl - URL request which returns XML data rows
6172============================================= */
6173function JSVCrecordBrowser(varname,parentid,xmlfeedurl,title,locid,filter,sort) {
6174	this.varname=varname;
6175	this.parentid=JSVCall(parentid);
6176	this.xmlfeedurl=xmlfeedurl;
6177	this.title=(title==null?"":title);
6178	this.rcwin=this.varname+"_rcwin";
6179	this.ctlwin=this.varname+"_ctlwin";
6180	this.locid=locid;
6181	this.locale=request.DS.LOCALES[locid];
6182	this.filter=filter;
6183	this.sort=sort;
6184	this.page=1;
6185	this.pagemax=1;
6186	this.recordpage=20;
6187	this.recordcount=0;
6188}
6189JSVCrecordBrowser.prototype.gen=function() {
6190	var htm="";
6191	htm+="<div style=width:100% align=center>";
6192	if(this.title!="")
6193		htm+="<div class=header style=padding:2px;text-align:left>"+this.title.toUpperCase()+"</div>";
6194	htm+="<div id="+this.ctlwin+" align=center>";
6195	htm+="<table cellspacing=0 cellpadding=1 width=100%>";
6196	htm+="<tr>";
6197	if(this.filter==1)
6198		htm+="<td><b>"+JSVClang("Keyword",12463)+":</b>&nbsp;<input id="+this.varname+"_filter type=text size=25 maxlength=25 value='' onkeydown=\"if(event.keyCode==13&&Trim(this.value)!=''){"+this.varname+".submit()}\">&nbsp;<input type=button value="+JSVClang("Go",11203) + " class=clsSVCButton onclick=\"var o=JSVCall('"+this.varname+"_filter');if(Trim(o.value)!=''){"+this.varname+".submit()}\">&nbsp;<input type=button value="+JSVClang("Clear",1623) + " class=clsSVCButton onclick=\"var o=JSVCall('"+this.varname+"_filter');o.value='';"+this.varname+".submit()\"></td>";
6199	if(this.sort!=null) {
6200		htm+="<td align=right><b>"+ JSVClang("Sort&nbsp;By",12464)+":</b>&nbsp;<select id="+this.varname+"_sort>"+JSVCgenOptions(this.sort)+"</select></td>";
6201	}
6202	htm+="<td align=right><input type=button class=clsSVCButton value='|<' onclick="+this.varname+".navig(1)>&nbsp;<input type=button class=clsSVCButton value='<<' onclick="+this.varname+".navig(2)>&nbsp;<span id="+this.varname+"_page style=font-weight:bold></span>&nbsp;<input type=button class=clsSVCButton value='>>' onclick="+this.varname+".navig(3)>&nbsp;<input type=button class=clsSVCButton value='>|' onclick="+this.varname+".navig(4)></td>";
6203	htm+="</tr>";
6204	htm+="</table>";
6205	htm+="</div>";
6206	htm+="<div id="+this.rcwin+" align=center></div>";
6207	htm+="</div>";
6208	this.parentid.innerHTML=htm;
6209	this.submit();
6210}
6211JSVCrecordBrowser.prototype.submit=function(page,filter,sort,recordpage) {
6212	var url=this.xmlfeedurl,o;
6213
6214	if(page==null) // page
6215		page=this.page;
6216	url=JSVCremoveURL(url,"p");
6217	url+="&p="+page;
6218
6219	if(filter==null) { // filter
6220		o=JSVCall(this.varname+"_filter");
6221		if(o!=null) {
6222			filter=Trim(o.value);
6223			if(filter.length>0 && filter.length<3) {
6224				alert(JSVClang("Please specify at least 3 characters.",12465))
6225				o.select();
6226				return;
6227			}
6228		}
6229	}
6230	url=JSVCremoveURL(url,"f");
6231	if(filter!=null && filter.length>=3) url+="&f="+filter;
6232
6233	if(sort==null) { // sort by
6234		o=JSVCall(this.varname+"_sort");
6235		if(o!=null)
6236			sort=o.value;
6237	}
6238	url=JSVCremoveURL(url,"s");
6239	if(sort>=0) url+="&s="+sort;
6240
6241	if(recordpage==null) { // records per page
6242		recordpage=this.recordpage;
6243	}
6244	url=JSVCremoveURL(url,"r");
6245	if(recordpage>0) url+="&r="+recordpage;
6246
6247	var rcwin=JSVCall(this.rcwin),ctlwin=JSVCall(this.ctlwin);
6248	rcwin.innerHTML="<div style=width:90%;background-color:whitesmoke;border:2px solid brown><br><b>"+JSVClang("Loading, please wait...",7062)+"</b>&nbsp;<img style=vertical-align:middle src=\""+request.approot+"services/images/loading-anim.gif\"><br><br></div>";
6249	ctlwin.disabled=true;
6250	MRMHTTPRequest("POST",url,null,this.load,null,null,null,null,this);
6251}
6252JSVCrecordBrowser.prototype.navig=function(mode) {
6253	var p=this.page,pm=this.pagemax;
6254	if(mode==1) // first page
6255		p=1;
6256	else if(mode==2 && p>1) // previous page
6257		p--;
6258	else if(mode==3 && p<pm) // next page
6259		p++;
6260	else if(mode==4 && p<pm) // last page
6261		p=pm;
6262	if(this.page!=p) {
6263		this.page=p;
6264		this.submit(this.page);
6265	}
6266}
6267JSVCrecordBrowser.prototype.resetPage=function(recordcount,recordpage) {
6268	this.recordcount=recordcount;
6269	if(recordpage!=null)
6270		this.recordpage=recordpage;
6271	this.page=(this.recordcount==0?0:1);
6272	this.pagemax=Math.ceil(this.recordcount/this.recordpage);
6273	if(isNaN(this.pagemax))
6274		this.pagemax=1;
6275}
6276JSVCrecordBrowser.prototype.load=function(o,p/*JSVCrecordBrowser object*/) {
6277	var xml=o.responseXML;
6278	var rcwin=JSVCall(p.rcwin),ctlwin=JSVCall(p.ctlwin);
6279	var lst;
6280	lst=xml.selectSingleNode("dataset/summary/recordcount");
6281	if(lst==null) {
6282		rcwin.innerHTML="Error 1";return;
6283	}
6284	var t=Number(lst.text);
6285	if (lst.text == undefined) t = Number(Trim(lst.innerHTML));
6286	if (lst.innerHTML == undefined) t = Number(Trim(lst.textContent));
6287	if(t!=p.recordcount)
6288		p.resetPage(t);
6289	var pgobj=JSVCall(p.varname+"_page");
6290	pgobj.innerHTML=p.page+"/"+p.pagemax;
6291	// generating records
6292	lst=xml.selectNodes("dataset/summary/columns");
6293	if(lst==null) {
6294		rcwin.innerHTML="Error 2";return;
6295	}
6296	lst=lst[0].childNodes;
6297	// Reusing JSVCrpt
6298	var coldef=[],query={"COLUMNS":[],"DATA":[]},colnm=[],rows=[];
6299	for(var i=0;i<lst.length;i++) {
6300		if(lst[i].nodeType!=1) continue;
6301		if(lst[i].getAttribute("SHOW")!=0) {
6302			var x=coldef.length;
6303			var type=lst[i].getAttribute("COLTYPE"),label=lst[i].getAttribute("COLNAME"),queryCol=lst[i].nodeName;
6304			coldef[x]=[type,label,queryCol];
6305			if(type=="LINK") {
6306				var url=lst[i].getAttribute("HREF");
6307				coldef[x][3]=url;
6308			}
6309		}
6310		colnm[colnm.length]=lst[i].nodeName;
6311	}
6312	lst=xml.selectNodes("dataset/D");
6313	if(lst==null) {
6314		rcwin.innerHTML="Error 3";return;
6315	}
6316	for(var i=0;i<lst.length;i++) {
6317		var row=[];
6318		for(var j=0;j<colnm.length;j++) {
6319			var value=lst[i].getAttribute(colnm[j]);
6320			row[row.length]=(value!=null?value:null);
6321		}
6322		rows[rows.length]=row;
6323	}
6324	query.COLUMNS=colnm;
6325	query.DATA=rows;
6326	var rpt=new JSVCrpt(p.varname+"_rpt",query);
6327	JSVCSetLocale(p.locid,null,p.locale.DTFORMAT,p.locale.TMFORMAT,p.locale.TIMEZONE);
6328	rcwin.innerHTML=rpt.gen(coldef,true);
6329	ctlwin.disabled=false;
6330}
6331function JSVCpopup(varname,formname,ctxname) {
6332	this.varname=JSVCVarNameSet(varname,this,true);// Allocate unique
6333	this.formname=formname;
6334	this.formobj=JSVCall(formname);
6335	if(ctxname==null||ctxname=="")
6336		this.ctxname=this.varname+"_CTXFRAME";
6337	else
6338		this.ctxname=ctxname;
6339	this.ctxframe=JSVCall(this.ctxname);
6340	this.msgheader=this.ctxname+"_msg"; // message container
6341	// Properties
6342	this.title="Popup"; // title of the popup window
6343	this.width=300;
6344	this.msg=null;
6345	this.fnOK=null;
6346	this.fnCancel=null;
6347	this.exfields=null; // array: [["title","html"],...]
6348	this.btnFlag=3; // 1:OK,2:Cancel
6349	this.btnNames=["OK","Cancel"];
6350	this.ctxpos=2;
6351	this.ctxnocap=2;
6352}
6353JSVCpopup.prototype.clickButton=function(btnType) // OK,Cancel
6354{	btnType=btnType.toUpperCase();
6355	if(btnType=='OK')
6356	{
6357		var rs;
6358		if(this.fnOK!=null && typeof(this.fnOK)=="function")
6359			rs=this.fnOK();
6360		else if(this.fnOK!=null && typeof(this.fnOK)=="string" && this.fnOK!="")
6361			rs=eval("("+this.fnOK+")");
6362		if(rs==null || rs==true)
6363			JSVCcloseCtxMenu(this.ctxname);
6364	}
6365	else if(btnType=='CANCEL')
6366	{
6367		if(this.fnCancel!=null && typeof(this.fnCancel)=="function")
6368			this.fnCancel();
6369		else if(this.fnCancel!=null && typeof(this.fnCancel)=="string" && this.fnCancel!="")
6370			eval(this.fnCancel);
6371		JSVCcloseCtxMenu(this.ctxname);
6372	}
6373}
6374JSVCpopup.prototype.gen=function() {
6375	if(this.ctxframe==null)
6376		this.ctxframe=JSVCCtxMenuFrame(this.formobj,this.ctxname,this.title,this.width,false,false);
6377	var html="<table cellpadding=1 cellspacing=1 border=0 width=100%>"+
6378	"<tr><td colspan=2"+((this.btnFlag&3)==1?" align=center":"")+"><span id="+this.msgheader+">"+(this.msg?this.msg:"")+"</span></td></tr>";
6379	if(this.exfields) {
6380		for(var i in this.exfields) {
6381			var f=this.exfields[i];
6382			html+="<tr>"+(f[0]?"<td width=25%><b>"+f[0]+"</b></td><td":"<td colspan=2")+" id="+this.ctxname+"_itm"+i+" valign=top>"+f[1]+"</td></tr>";
6383		}
6384	}
6385	if((this.btnFlag&3)==1)
6386		html+="<tr><td colspan=2 align=center><input type=button class=clsSVCButton value='  "+this.btnNames[0]+"  ' onclick=\"JSVCVarNameGet('"+this.varname+"').clickButton('OK')\"></td></tr>"
6387	else if ((this.btnFlag&3)==0)
6388		html+="";
6389	else
6390		html+="<tr><td colspan=2 align=right><input type=button class=clsSVCButton value='  "+this.btnNames[0]+"  ' onclick=\"JSVCVarNameGet('"+this.varname+"').clickButton('OK')\">&nbsp;&nbsp;&nbsp;<input type=button class=clsSVCButton value='"+this.btnNames[1]+"' onclick=\"JSVCVarNameGet('"+this.varname+"').clickButton('CANCEL')\"></td></tr>"
6391	html+="</table>";
6392	JSVCCtxMenuContent(this.ctxframe,html);
6393	for(var i in this.exfields) {
6394		MRMPreprocessFormItem(JSVCall(this.ctxname+"_itm"+i).firstChild);
6395	}
6396	DoReq(this.formobj);
6397}
6398JSVCpopup.prototype.show=function(event) {
6399	JSVCshowCtxMenuEv(event,this.ctxframe,null,this.ctxpos,this.ctxnocap);
6400}
6401JSVCpopup.prototype.hide=function(event) {
6402	JSVCcloseCtxMenu(this.ctxname);
6403}
6404JSVCpopup.prototype.showChk=function(event,fnChk) {
6405	if(fnChk(this)==true)
6406		this.show(event);
6407	else
6408		JSVCcloseCtxMenu(this.ctxname);
6409}
6410JSVCpopup.prototype.setMsg=function(msg) {
6411	var o=JSVCall(this.msgheader);
6412	o.innerHTML=msg;
6413}
6414function JSVCSgVRegChk(str)
6415{
6416	if(typeof(str)!="string" && str.value!=null)
6417		str=str.value;
6418
6419	str=Trim(str).toUpperCase();
6420
6421	var r=/^([A-Z]{0,3})([0-9]{1,4})([A-Z0-9]{0,2})$/; // 3 groups
6422	var m=r.exec(str);
6423
6424	if(m==null || m.length<3) // no matches or no capturing group 1 & 2
6425		return JSVClang("is invalid",7646);
6426	if(m[1]=="MID" && m[3]!="" && /^\d+$/.test(m[3]))
6427		return "";
6428	else if(m[1]=="S")
6429		return "";
6430	else if(/\d+/.test(m[3]))
6431		return JSVClang("is invalid",7646);
6432	if(m[1].length>0 && m[3]=="CD")
6433		return "";
6434	if(m[1].length==0 && /^\d{4}$/.test(m[2]) && m[3]=="S")
6435		return "";
6436
6437	if(m[1].length==1)
6438		m[1]=" S"+m[1];
6439	else if(m[1].length==2)
6440		m[1]=" "+m[1];
6441
6442	m[2]=m[2].toString().padLeft("0",4);
6443
6444	if(m[3].length==2 && !(m[3]=="CD" && m[3]=="CC"))
6445		return JSVClang("is invalid",7646);
6446
6447	// calculate checksum
6448	var c=(9*(m[1].charCodeAt(1)-65)+4*(m[1].charCodeAt(2)-65)+5*m[2].charAt(0)+4*m[2].charAt(1)+3*m[2].charAt(2)+2*m[2].charAt(3)+(m[1]=="CSS"?20:12))%19;
6449	var v=["A","B","C","D","E","G","H","J","K","L","M","P","R","S","T","U","X","Y","Z"];
6450
6451	if(c>=0 && c<=18 && v[18-c]==m[3]) // 0 to 18 == Z to A (reversed)
6452		return "";
6453	else
6454		return JSVClang("is invalid",7646);
6455
6456	return JSVClang("is invalid",7646);
6457}
6458
6459function JSVCDOBtoAge(o,tgtid){ // o=source object, tgtid=target obj id
6460	var tgtobj=document.getElementById(tgtid);
6461	var tmpage="",i=0,age="";
6462	var thisyear=new Date().getFullYear();
6463	if (tgtobj!=null && o!=null && o.value!="") {
6464		i=jSVCdtformat.indexOf("yyyy");
6465		if (i>-1) {
6466			age=thisyear-parseInt(o.value.substring(i,i+4));
6467			if (tgtobj.value || tgtobj.tagName.toUpperCase()=='INPUT') tgtobj.value=age;
6468			else tgtobj.innerHTML = age;
6469		}
6470	}
6471}
6472
6473/* ======= JSVCSplitCols =================
6474Rearrange table columns to the number of columns specified
6475tableid - id of table to split
6476tbodyid - tbody id to split, null to split entire table
6477oric - original column length (default=2)
6478fnlc - new column length (default=4)
6479type - Arrangement type ... 1: vertical, 2: horizontal (default=1)
6480adjwidth - Adjust the column width specified in <col> ... 1:yes, 2:no (default=1)
6481============================================= */
6482function JSVCSplitCols(tableid, tbodyid, oric, fnlc, type, adjwidth){
6483	var c,clone,collen,reg,cwarr;
6484	var trowsobj,start,end;
6485	var tmprowobj = [];
6486	if (type==null) type=1;
6487	if (oric==null) oric=2;
6488	if (fnlc==null) fnlc=4;
6489	if (oric>=fnlc || fnlc%oric!=0) return;
6490	if (adjwidth==null) adjwidth=1;
6491	if (tbodyid!=null)tbodyobj=document.getElementById(tbodyid);
6492	else tbodyobj=document.getElementById(tableid);
6493	if (tbodyobj==null) return;
6494
6495	trowsobj = tbodyobj.rows;
6496
6497 	colobj=tbodyobj.getElementsByTagName("col");
6498	if (colobj.length) collen=oric; else collen=0;
6499
6500	for (c = 0;adjwidth==1&&c<collen; c++) { // colwidth
6501		var cw = colobj[c].style.width;
6502		if (cw) {
6503			reg = /(\d+) *([a-zA-Z%]+)/;
6504			cwarr = cw.match(reg);
6505			if (cwarr != null) {
6506				newwidth = Math.floor(parseInt(cwarr[1])/(fnlc/oric));
6507				newwidth = newwidth + cwarr[2];
6508				colobj[c].style.width = newwidth;
6509			}
6510		}
6511	}
6512	for(c=0;c<collen;c++){
6513		for(c1=0;c1<(fnlc/oric)-1;c1++) {
6514			clone = colobj[collen-1].cloneNode(true);
6515			colobj[0].parentNode.insertBefore(clone,colobj[0]);
6516		}
6517	}
6518
6519	for (var h = tbodyobj.rows.length-1; h >= 0; h--)
6520	{
6521		if(trowsobj[h].style.display=='none' && trowsobj[h].cells.length==0) // placeholder hidden rows
6522		{
6523			tmprowobj.push(trowsobj[h]);
6524			trowsobj[h].parentNode.removeChild(trowsobj[h]);
6525		}
6526	}
6527
6528	if (type == 1) {
6529		start=0;end=-1;
6530		for (var h = 0; h < tbodyobj.rows.length; h++) {
6531			for (var k = 0; k < trowsobj[h].cells.length; k++) {
6532				if (SplitColsHeader(trowsobj[h].cells[k],oric,fnlc)) {
6533					if(h==0) start=0+1;
6534					else end=h;
6535					break;
6536				}
6537				else if (end==-1 && h==tbodyobj.rows.length-1)
6538					end=tbodyobj.rows.length;
6539			}
6540			if (end != -1) {
6541				rowlen = (end - start);
6542				cellcount = oric * (end - start);
6543				totcol = fnlc;
6544				totrow = Math.ceil(cellcount / fnlc);
6545				chkcol = totcol - ((totrow * totcol) - cellcount);
6546				count=0;
6547				for (var i = oric; i < fnlc ; i=i+oric)
6548				{
6549					currowlen = (totrow - (i < chkcol ? 0 : 1));
6550					for (var j = start; j < start+currowlen; j++) {
6551						var tmprobj = trowsobj[totrow + j];
6552						for (var k = 0; k < tmprobj.cells.length; k++) { // col
6553							var x = tmprobj.cells[k].cloneNode(true);
6554							var xsel = tmprobj.cells[k].getElementsByTagName("SELECT");/* MS bug 829907 */
6555							if (xsel.length != 0) x.getElementsByTagName("SELECT")[0].options.selectedIndex = xsel[0].options.selectedIndex;
6556							trowsobj[j].appendChild(x);
6557						}
6558					}
6559					for (var j = start; j < start+currowlen; j++) {
6560						tbodyobj.rows[0].parentNode.removeChild(tbodyobj.rows[totrow + start]);
6561						count+=1;
6562					}
6563				}
6564				if (currowlen < totrow && start+totrow-1 != 0) {
6565					SplitColsAppendEmp(trowsobj[start+totrow-1], totcol);
6566				}
6567				start = end-count+1;
6568				h = start-1;
6569				rowlen = tbodyobj.rows.length;
6570				end = -1;
6571			}
6572		}
6573	}
6574	if (type == 2) {
6575		var headerflag = 0;
6576		var move = (fnlc - oric) / oric;
6577		for (var i = 0; i <  tbodyobj.rows.length; i++)
6578		{
6579			for (var h = 0; h < oric; h++) {
6580				headerflag = SplitColsHeader(trowsobj[i].cells[h],oric,fnlc);
6581				if (headerflag == 1) break;
6582			}
6583			for (var j = 1; headerflag == 0 && j <= move; j++) {
6584				var tmprobj = trowsobj[i + 1]; // row
6585				if (tmprobj) {
6586					for (var k = 0; k < tmprobj.cells.length; k++) { // col
6587						headerflag = SplitColsHeader(tmprobj.cells[k],oric,fnlc);
6588						if (headerflag == 1) {
6589							SplitColsAppendEmp(trowsobj[i], fnlc);
6590							break;
6591						}
6592						var x = tmprobj.cells[k].cloneNode(true);
6593						var xsel = tmprobj.cells[k].getElementsByTagName("SELECT");/* MS bug 829907 */
6594						if (xsel.length != 0) x.getElementsByTagName("SELECT")[0].options.selectedIndex = xsel[0].options.selectedIndex;
6595						trowsobj[i].appendChild(x);
6596					}
6597					if (headerflag == 0) tbodyobj.rows[i].parentNode.removeChild(tbodyobj.rows[i + 1]);
6598				}
6599				else {
6600					SplitColsAppendEmp(trowsobj[i], fnlc);
6601				}
6602			}
6603		}
6604	}
6605
6606	for (var h = 0; h < tmprowobj.length ; h++)
6607		tbodyobj.appendChild(tmprowobj[h])
6608}
6609function SplitColsAppendEmp(rowobj,total) {
6610	for (var k = rowobj.cells.length; k < total; k++) {
6611		var newtd = document.createElement("td");
6612		newtd.innerHTML = '&nbsp;';
6613		rowobj.appendChild(newtd);
6614	}
6615}
6616function SplitColsHeader(cell,oric,fnlc) {
6617	if (cell && / *fullrow */.test(cell.className) ) {
6618		cell.colSpan = fnlc-1;
6619		return 1;
6620	}
6621	else if (cell && / *header */.test(cell.className) || / *splithdr */.test(cell.className) || (oric > 1 && cell.colSpan == oric)) {
6622		cell.colSpan = fnlc;
6623		return 1;
6624	}
6625	return 0;
6626}
6627//Hide Rows with plus minus image
6628function JSVCShowHideRow(divname,imgname,byname,chkobj){
6629	/*leave imgname blank to use only the display toggle*/
6630	if (byname == null) byname = 1;
6631	var detdiv = (byname==1?document.getElementsByName(divname):document.getElementById(divname));
6632
6633	if (typeof _APP !== 'undefined') {
6634		if (_APP=='EPL' && !($('#PARTIALSAVEMODE').val()==1)) {
6635			chkobj = true;
6636		}
6637	}
6638
6639	//do objverify/chkrequired before hide
6640	if((chkobj!=null||typeof(chkobj)!='undefined')&&chkobj==true){
6641		var nm,ret,obj,col,t,noprompt=null,showobjname=null;
6642		col=$("#"+divname+" :input");
6643		if (typeof _APP !== 'undefined') {
6644			if (_APP == 'EPL') {
6645				if (byname == 1) {
6646					$('[name="'+divname+'"]').find('input').each(function(){
6647						col.push(this);
6648					})
6649				} else {
6650					$('[id="'+divname+'"]').find('input').each(function(){
6651						col.push(this);
6652					})
6653				}
6654			}
6655		}
6656		
6657		if(col!=null)
6658		{	for(t=0;t<col.length;t++)
6659			{	obj=col[t];
6660				if(!ObjVerify(obj,noprompt,showobjname))return false;
6661			}
6662		}
6663	}
6664
6665	if (byname == 1) {
6666		if(detdiv[0]!=null){
6667			if (detdiv[0].style.display == "none") {
6668				for (i = 0; i < detdiv.length; i++) {
6669					detdiv[i].style.display = "";
6670				}
6671				if(imgname!=null)
6672					document.images[imgname].src = request.approot + "services/images/minus.gif";
6673			}
6674			else {
6675				for (i = 0; i < detdiv.length; i++) {
6676					detdiv[i].style.display = "none";
6677				}
6678				if(imgname!=null)
6679					document.images[imgname].src = request.approot + "services/images/plus.gif";
6680			}
6681		}
6682	} else {
6683		if(detdiv!=null){
6684			if (detdiv.style.display == "none") {
6685				detdiv.style.display = "";
6686				if(imgname!=null)
6687					document.images[imgname].src = request.approot + "services/images/minus.gif";
6688			}
6689			else {
6690				detdiv.style.display = "none";
6691				if(imgname!=null)
6692					document.images[imgname].src = request.approot + "services/images/plus.gif";
6693			}
6694		}
6695	}
6696}
6697
6698function JSVCShowHideChk(trigval,trigname,fieldname,tagname,req)
6699{
6700		/*
6701		Notes
6702		-----
6703		trigval - value/list to be checked against
6704		trigname - name/id of input triggering the show/hide
6705		fieldname - input field to be shown/hide , disabled/required
6706		tagname - div/span/tr/td name/id to be shown/hide, use existing JSVCshow/JSVChide
6707		req - set required attribute to fieldname
6708		*/
6709
6710		var opt=JSVCall(trigname);
6711		var optVal=opt.value;
6712		var optField=JSVCall(fieldname);
6713		if(optField==""){var optField=null};
6714
6715		if(trigval.indexOf(optVal)>-1)
6716		{
6717			if(tagname!=null){
6718			JSVCshow(tagname);
6719				if(optField!=null){
6720					optField.removeAttribute("DISABLED");
6721					if(req!=null && req==1){
6722					optField.setAttribute("CHKREQUIRED","true");
6723					}
6724				}
6725			}
6726		}
6727		else
6728		{
6729			if(tagname!=null){
6730			JSVChide(tagname);
6731				if(optField!=null){
6732					optField.setAttribute("DISABLED","true");
6733				}
6734			}
6735		}
6736		if(optField!=null)
6737		DoReq(optField);
6738}
6739
6740//Return bit from checkbox
6741function JSVCChkToBit(chkboxname)
6742{
6743		var slcitms = document.getElementsByName(chkboxname);
6744		var prevalue = 0;
6745		for (var i=0;i < slcitms.length;i++)
6746		{
6747			if(slcitms[i].checked==true)
6748			{
6749				prevalue += parseInt(slcitms[i].value);
6750			}
6751		}
6752		return prevalue;
6753
6754}
6755
6756// http://dean.edwards.name/weblog/2005/10/add-event/
6757function JSVCaddEvent(element, type, handler) {
6758	if (element.addEventListener) {
6759		element.addEventListener(type, handler, false);
6760	} else {
6761		// assign each event handler a unique ID
6762		if (!handler.$$guid) handler.$$guid = JSVCaddEvent.guid++;
6763		// create a hash table of event types for the element
6764		if (!element.events) element.events = {};
6765		// create a hash table of event handlers for each element/event pair
6766		var handlers = element.events[type];
6767		if (!handlers) {
6768			handlers = element.events[type] = {};
6769			// store the existing event handler (if there is one)
6770			if (element["on" + type]) {
6771				handlers[0] = element["on" + type];
6772			}
6773		}
6774		// store the event handler in the hash table
6775		handlers[handler.$$guid] = handler;
6776		// assign a global event handler to do all the work
6777		element["on" + type] = handleEvent;
6778	}
6779};
6780// a counter used to create unique IDs
6781JSVCaddEvent.guid = 1;
6782
6783function JSVCremoveEvent(element, type, handler) {
6784	if (element.removeEventListener) {
6785		element.removeEventListener(type, handler, false);
6786	} else {
6787		// delete the event handler from the hash table
6788		if (element.events && element.events[type]) {
6789			delete element.events[type][handler.$$guid];
6790		}
6791	}
6792};
6793
6794function handleEvent(event) {
6795	var returnValue = true;
6796	// grab the event object (IE uses a global event object)
6797	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
6798	// get a reference to the hash table of event handlers
6799	var handlers = this.events[event.type];
6800	// execute each event handler
6801	for (var i in handlers) {
6802		this.$$handleEvent = handlers[i];
6803		if (this.$$handleEvent(event) === false) {
6804			returnValue = false;
6805		}
6806	}
6807	return returnValue;
6808};
6809function JSVCDoStopPropagation(event)
6810{
6811	if(event.stopPropagation)
6812		event.stopPropagation()
6813	else
6814		event.cancelBubble=true;
6815}
6816function fixEvent(event) {
6817	// add W3C standard event methods
6818	event.preventDefault = fixEvent.preventDefault;
6819	event.stopPropagation = fixEvent.stopPropagation;
6820	return event;
6821};
6822fixEvent.preventDefault = function() {
6823	this.returnValue = false;
6824};
6825fixEvent.stopPropagation = function() {
6826	this.cancelBubble = true;
6827};
6828function JSVCNameIDObject(objname,nmStr)
6829{
6830	var IDDefConfig={
6831		DefCountryID:1,
6832		OvrIDStr:"",
6833		CtryShortlist:"",
6834//		OvrIDStr:"1!Co Reg No|*2!NRIC~FN:JSVCIDChkMyIC(obj)|*3!Passport No|+4!Old IC|+5!Birth Cert No|*6!Army/Police ID",
6835//		CtryShortlist:"7,1,2,3,11",
6836		NameType:2, /* 1: Individual only, 2: Individual & Company */
6837		NameSize:50,
6838		NameRetainRadioSpace: 1, /* 1: retain Radio button space even if hidden; 0: remove the extra spaces*/
6839		NationalityChangeID2:1, /* 1: Nationality change will update ID2 */
6840		NationalityDefaultCountryID:1, /* If nationality is blank use default country ID */
6841		ID1Size:30,
6842		Label_Postfix:"",
6843		Label_Individual:JSVClang("Individual",6031),
6844		Label_Company:JSVClang("Company",2033),
6845		Label_Name:JSVClang("Name",1173),
6846		Label_ID1:JSVClang("ID",2122),
6847		Label_ID2:JSVClang("Second ID",6030),
6848		Label_Nationality:JSVClang("Nationality",1178),
6849		Label_Salutation:JSVClang("Salutation",11972),
6850		UI:"D" /*D - Desktio, M - Mobile*/,
6851		Name_maxlength: 200,
6852		Label_Additional:"",
6853		Label_Additional2:""
6854	}
6855	this.objname=objname;
6856	this.nmStr=nmStr;
6857	this.config=IDDefConfig;
6858}
6859JSVCNameIDObject.prototype.genName=function(nmval,id1type,chkrequired,disabled,spcnm,nmselchgExec,appendHTML,id_fld_chk,nmonchange,mic,readonly,nmval2,bluenote,NameSplit,FirstName,LastName,upperCase)
6860{
6861	var fnlstr,str,nmsel,spclist;
6862	if(nmselchgExec==null)nmselchgExec="";
6863	if(bluenote==null)bluenote='';//#37546
6864	if(mic==null)mic=0;
6865	
6866	if(mic==1){
6867		fnlstr="<div valign=baseline>"+this.config.Label_Name+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+(this.config.Label_Additional!=""?" "+this.config.Label_Additional:"")+"</div><div>";
6868	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
6869		fnlstr="<div><div valign=baseline>"+this.config.Label_Name+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+(this.config.Label_Additional!=""?" "+this.config.Label_Additional:"")+"</div><div>";
6870	} else {
6871		fnlstr="<tr><td valign=baseline>"+JSVChtmUnescape(this.config.Label_Name)+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+(this.config.Label_Additional!=""?" "+this.config.Label_Additional:"")+"</td><td>";
6872	}
6873	this.isCom=0;
6874	if(this.config.NameType==2)
6875	{
6876		// determine if idtype is company or individual
6877		if(id1type!=null)
6878		{
6879			try{
6880				if(IDtypes[id1type].IdType==1)
6881					this.isCom=1
6882				else
6883					this.isCom=0;
6884			} catch (e) {}
6885		}
6886		fnlstr+="<input URLVAR ID=\"_"+this.nmStr+"nmselIND\" name=\""+this.nmStr+"nmsel\" CHKREQUIRED "+(this.isCom==0?"CHECKED ":"")+"type=radio "+(disabled==1?"DISABLED PDISABLED ":"")+(readonly==1?"READONLY style=background-color:silver":"")+" value=2 onclick=\""+this.objname+".refresh(event);"+nmselchgExec+(!!id_fld_chk?id_fld_chk:"")+"\"><label for=\"_"+this.nmStr+"nmselIND\"> "+this.config.Label_Individual+"</label> ";
6887		fnlstr+="<input URLVAR ID=\"_"+this.nmStr+"nmselCOM\" name=\""+this.nmStr+"nmsel\" CHKREQUIRED "+(this.isCom==1?"CHECKED ":"")+" type=radio "+(disabled==1?" DISABLED PDISABLED ":"")+(readonly==1?"READONLY style=background-color:silver":"")+" value=1 onclick=\""+this.objname+".refresh(event);"+nmselchgExec+(!!id_fld_chk?id_fld_chk:"")+"\"><label for=\"_"+this.nmStr+"nmselCOM\"> "+this.config.Label_Company+"</label> ";
6888		if(spcnm!=null && typeof(spcnm)=="string" && spcnm.length>0)
6889		{	spclist=spcnm.split("|");
6890			fnlstr+="<input URLVAR ID=\"_"+this.nmStr+"nmselSPC\" SPCNM=\""+spcnm+"\" name=\""+this.nmStr+"nmsel\" value=\""+spclist[0]+"\" CHKREQUIRED "+(nmsel==spclist[0]?"CHECKED ":"")+(disabled==1?"DISABLED PDISABLED ":"")+(readonly==1?"READONLY style=background-color:silver":"")+" type=radio oncl
6890ick=\""+this.objname+".refresh(event);"+nmselchgExec+(!!id_fld_chk?id_fld_chk:"")+"\"><label for=\"_"+this.nmStr+"nmselSPC\"> "+spclist[1]+"</label>";
6891		}
6892		fnlstr+="<br>";
6893	}
6894	fnlstr+="<input URLVAR "+(chkrequired=="1"?"CHKREQUIRED ":(chkrequired!=''?"CHKREQUIRED=\""+chkrequired+"\" ":""))+" name=\""+this.nmStr+"nm\" id=\"_"+this.nmStr+"nm\" maxlength=\""+this.config.Name_maxlength+"\" size=\""+this.config.NameSize+"\" VALUE=\""+nmval+"\" "+(disabled==1?"DISABLED PDISABLED ":"")+(readonly==1?"READONLY style=background-color:silver":"")+" onblur=\""+(!!nmonchange?nmonchange:"")+(upperCase == 1?"this.value=(this.value).toUpperCase();":"")+"DoReq(this)\">"+"<label style='color: blue; font-style:italic; font-weight: bold;'>"+(bluenote!=null?"<br>"+bluenote:"")+"</label>";//#37546	
6895	if(this.config.NameType!=2 && this.config.NameRetainRadioSpace == 1)
6896		fnlstr+="<br><input type=radio style=visibility:hidden>";
6897	if(appendHTML!=null && appendHTML!="")
6898		fnlstr+="<br>"+appendHTML;
6899
6900	if (this.config.DefCountryID == 122){
6901		fnlstr+="<tr><td valign=baseline>"+JSVChtmUnescape(this.config.Label_Name)+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+(this.config.Label_Additional2!=""?" "+this.config.Label_Additional2:"")+"</td><td>";
6902		fnlstr+="<input URLVAR "+(chkrequired=="1"?"CHKREQUIRED ":(chkrequired!=''?"CHKREQUIRED=\""+chkrequired+"\" ":""))+" name=\""+this.nmStr+"nm2\" id=\"_"+this.nmStr+"nm2\" maxlength=\""+this.config.Name_maxlength+"\" size=\""+this.config.NameSize+"\" VALUE=\""+nmval2+"\" "+(disabled==1?"DISABLED PDISABLED ":"")+(readonly==1?"READONLY style=background-color:silver":"")+" onblur="+(!!nmonchange?nmonchange:"")+"DoReq(this)>";
6903	}
6904
6905	if(mic==1){
6906		fnlstr+="</div>";
6907	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
6908		fnlstr+="</div></div>";
6909	} else {
6910		fnlstr+="</td></tr>";
6911	}
6912	return fnlstr;
6913}
6914JSVCNameIDObject.prototype.genSalutation=function(sal1,chkrequired,disabled,insgcoid,hidden)
6915{	var comStr,fnlstr,optStr,idchk,listStr;
6916
6917	if(hidden==1){
6918		fnlstr="<tr style='display:none'><td valign=baseline>"+this.config.Label_Salutation+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</td><td>";
6919	}else{
6920	fnlstr="<tr><td valign=baseline>"+this.config.Label_Salutation+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</td><td>";
6921	}
6922 	var SaluteList = ["Mr","Ms","Mrs","En","Cik","Tuan","Puan","Dr","Datuk","Dato","Datuk Seri","Tan Sri","Tun","Datin","Datin Sri","Puan Sri","Toh Puan"];
6923	var SaluteListCode = ["Mr","Ms","Mrs","En","Cik","Tuan","Puan","Dr","Datuk","Dato","Datuk Seri","Tan Sri","Tun","Datin","Datin Sri","Puan Sri","Toh Puan"];
6924	if(insgcoid != null && insgcoid == 7651) { //#20841
6925		SaluteList = ["DATIN","DATO'","DATUK","DATUK SR","DR.","EN.","MISS","MR.","MRS.","MS.","PROFESSOR","PUAN","PUAN SRI","SIR","TAN SRI","TUN",
6926					"YANG AMAT BERHORMAT","YANG BERHORMAT","YANG MULIA","BRIDG. GEN (U)","CIK","CIK PUAN BESAR","DAME","DATIN PADUKA","DATO`(DR.)",
6927					"DATO`DR.","DATUK WIRA","DATUK PADUKA","DULI YANG MAHA MULIA","HAJI","HAJJAH","LADY","MADAM","MESSRS","MR.& MRS.","RT. HON.",
6928					"TOH PUAN SRI","TOH PUAN","TUAN","TUAN HJ","TUN DATU","TUN TAN SRI DATUK","YANG BERHOMAT DATUK","YANG DIPERTUAN BESAR","YANG AMAT BERHORMAT ENCIK",
6929					"YAB PUAN SRI DATIN","YAB PUAN SRI DATIN HAJJAH","YANG AMAT BERHORMAT TUN","YANG AMAT MULIA","YANG BERHORMAT CIK","YANG BERHORMAT DATO DR",
6930					"YANG BERHORMAT ENCIK","YANG BERHORMAT PUAN","YANG BERHORMAT TAN SRI","YANG BERHORMAT TAN SRI DATO`","YANG MULIA TAN SRI DATO",
6931					"YANG MULIA TUNKU TAN SRI DATO","YANG MULIA TUNKU","NOT APPLICABLE"];
6932		SaluteListCode = ["DATIN","DATO","DATUK","DATUK","DR","EN","MISS","MR","MRS","MS","PROF","PUAN","PS","SIR","TS","TUN",
6933					"YAB","YB","YM","BRGEN","CIK","CIK PN","DAME","DATIN PA","DATO`(D)",
6934					"DATO`DR.","DATUK E","DATUK PA","DYMM","HAJI","HAJJAH","LADY","MADAM","MESSRS","MR & MRS","RT HON",
6935					"T P SRI","TOH PUAN","TUAN","TUAN HJ","TUN DA","TUN TSD","Y B D","Y D B","YAB EN.",
6936					"YAB PSD","YAB PSDH","YAB TUN","YAM","YB CIK","YB D D",
6937					"YB ENCIK","YB PUAN","YB T S","YB T S D","YM T S D",
6938					"YM TTSD","YM TUNKU","NA"];
6939	}
6940 	var SaluteListLength = SaluteList.length;
6941
6942	optStr+="<option value=''></option>"
6943 	for (var i = 0; i < SaluteListLength; i++) {
6944    	optStr+="<option value=\""+SaluteListCode[i]+"\" "+(SaluteListCode[i]==sal1?"SELECTED":"")+">"+SaluteList[i]+"</option>"
6945   }
6946
6947 	if(SaluteListLength==0)
6948 		disabled=1;
6949
6950fnlstr+="<select URLVAR id=\"_"+this.nmStr+"Salutation1sel\" name=\""+this.nmStr+"Salutation1sel\"  "+(disabled==1?"DISABLED PDISABLED":"")+"  "+(chkrequired==1?"CHKREQUIRED":"")+"  style='width:160px' onchange='DoReq(this)' onblur='DoReq(this)'>";	fnlstr+=optStr;
6951	fnlstr+="</select> ";
6952	if(this.config.UI=="M") {
6953		fnlstr+="</div></div>";
6954	} else {
6955		fnlstr+="</td></tr>";
6956	}
6957	return fnlstr;
6958}
6959JSVCNameIDObject.prototype.genID1=function(id1,id1type,chkrequired,disabled,id_fld_chk,mic,readonly,idLid,upperCase)
6960{	var comStr,fnlstr,optStr,idchk,listStr;
6961	this.id1disabled=disabled;
6962	if(mic==null)mic=0;
6963
6964	if(mic==1){
6965		fnlstr="<div valign=baseline>"+this.config.Label_ID1+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</div><div>";
6966	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
6967		fnlstr="<div><div valign=baseline>"+this.config.Label_ID1+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</div><div>";
6968	} else {
6969		fnlstr="<tr><td valign=baseline>"+this.config.Label_ID1+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</td><td>";
6970	}
6971
6972	comStr=((this.isCom==1)?"C":"I");
6973	idchk=null;
6974	this.ID1ListStr=comStr+":*"+this.config.DefCountryID;
6975 	optStr=this.genOptionList(this.ID1ListStr,null,id1type);
6976 	if(optStr=="")
6977 		disabled=1;
6978	fnlstr+="<select URLVAR id=\"_"+this.nmStr+"ID1sel\" name=\""+this.nmStr+"ID1sel\"  "+(disabled==1?"DISABLED PDISABLED":"")+" style='width=160px' onchange=\""+this.objname+".checkIDFormat(this.nextSibling.nextSibling,this);"+(!!id_fld_chk?id_fld_chk:"")+"\">";
6979	fnlstr+=optStr;
6980	fnlstr+="</select> ";
6981	/*#28692*/fnlstr+="<input URLVAR "+(disabled==1?"DISABLED PDISABLED style='background-color:silver'":"")+(readonly==1?"READONLY style=background-color:silver":"")+"  "+(chkrequired=="1"?"CHKREQUIRED ":(chkrequired!=''?"CHKREQUIRED=\""+chkrequired+"\" ":""))+" id=\"_"+this.nmStr+"ID1\" name=\""+this.nmStr+"ID1\"  maxlength=30 size=\""+this.config.ID1Size+"\"  VALUE=\""+id1+"\"  "+(idchk!=null? "CHKFORMAT="+idchk+"":"" )+" nameidobj=\""+this.objname+"\" onblur=\""+this.objname+".checkIDFormat(this,this.previousSibling.previousSibling);"+(!!id_fld_chk?id_fld_chk:"")+(upperCase == 1?"this.value=(this.value).toUpperCase();":"")+"DoReq(this)\">";
6982
6983	if(mic==1){
6984		fnlstr+="</div>";
6985	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
6986		fnlstr+="</div></div>";
6987	} else {
6988		fnlstr+="</td></tr>";
6989	}
6990	return fnlstr;
6991}
6992JSVCNameIDObject.prototype.genID2=function(id2,id2type,nationalityID,chkrequired,disabled,mic)
6993{	var comStr,fnlstr,optStr,idchk;
6994	this.id2disabled=disabled;
6995	if(mic==null)mic=0;
6996
6997	if(mic==1){
6998		fnlstr="<div id=\"trID2\" valign=baseline>"+this.config.Label_ID2+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</div><div>";
6999	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
7000		fnlstr="<div id=\"trID2\"><div valign=baseline>"+this.config.Label_ID2+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</div><div>";
7001	} else {
7002		fnlstr="<tr id=\"trID2\"><td valign=baseline>"+this.config.Label_ID2+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</td><td>";
7003	}
7004	idchk=null;
7005	comStr=(this.isCom==1?"C":"I");
7006	if(nationalityID!=null && nationalityID!="" && nationalityID!=this.config.DefCountryID)
7007		this.ID2ListStr=comStr+":*"+nationalityID+","+this.config.DefCountryID
7008	else
7009		this.ID2ListStr=comStr+":"+this.config.DefCountryID;
7010	optStr=this.genOptionList(this.ID2ListStr,null,id2type);
7011 	if(optStr=="")
7012 		disabled=1;
7013
7014	fnlstr+="<select URLVAR  name=\""+this.nmStr+"ID2sel\" id=\"_"+this.nmStr+"ID2sel\"  "+(disabled==1?"DISABLED PDISABLED":"")+" style='width=160px' onchange=\""+this.objname+".checkIDFormat(this.nextSibling.nextSibling,this);\">";
7015	fnlstr+=optStr;
7016	fnlstr+="</select> ";
7017	/*#28692*/fnlstr+="<input URLVAR "+(disabled==1?"DISABLED PDISABLED style='background-color:silver'":"")+"  "+(chkrequired=="1"? "CHKREQUIRED ":(chkrequired!=''?"CHKREQUIRED=\""+chkrequired+"\" ":""))+"  name=\""+this.nmStr+"ID2\" id=\"_"+this.nmStr+"ID2\" maxlength=30 size=30 VALUE=\""+id2+"\" "+(idchk!=null? "CHKFORMAT="+idchk+"":"" )+"  onclick=\""+this.objname+".checkIDFormat(this,this.previousSibling.previousSibling);\"  onblur=DoReq(this)>";
7018
7019	if(mic==1){
7020		fnlstr+="</div>";
7021	} else if((this.config.UI=="M"  || JSVCGetResp()) && mic!=2) {
7022		fnlstr+="</div></div>";
7023	} else {
7024		fnlstr+="</td></tr>";
7025	}
7026	return fnlstr;
7027}
7028JSVCNameIDObject.prototype.genNationality=function(nationalityID,chkrequired,disabled)
7029{
7030	var shortlist;
7031	if(this.config.UI=="M" || JSVCGetResp()) {
7032		var fnlstr="<div><div valign=baseline>"+this.config.Label_Nationality+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</div><div>";
7033	} else {
7034		var fnlstr="<tr><td valign=baseline>"+this.config.Label_Nationality+(this.config.Label_Postfix!=""?" "+this.config.Label_Postfix:"")+"</td><td>";
7035	}
7036	fnlstr+="<select URLVAR id=\"_"+this.nmStr+"nationsel\" name=\""+this.nmStr+"nationsel\"  "+(disabled==1?"DISABLED PDISABLED":"")+"  "+(chkrequired==1?"CHKREQUIRED":"")+"   "+(this.config.NationalityChangeID2==1? "onchange=\""+this.objname+".refresh(event);\" onblur=\""+this.objname+".refresh(event);\" ":" onchange=DoReq(this) onblur=DoReq(this)")+" ><option value=\"\"></option>";
7037	if(nationalityID==null)
7038		nationalityID=""
7039	else
7040		nationalityID=nationalityID.toString();
7041	if(nationalityID=="" && this.config.NationalityDefaultCountryID==1)
7042		nationalityID=this.config.DefCountryID;
7043	var ShortListCountryArray=new Array();
7044	if(this.config.CtryShortlist==null||this.config.CtryShortlist=="")
7045	{	// If NULL/missing then use default from CountrySettings
7046	 	if (CountrySettings[this.config.DefCountryID]!=null && CountrySettings[this.config.DefCountryID].CtryShortlist!=null)
7047	 	{
7048			if(CountrySettings[this.config.DefCountryID].CtryShortlist!="")
7049			 	ShortListCountryArray=CountrySettings[this.config.DefCountryID].CtryShortlist.split(",");
7050	 	}
7051	} else
7052	{
7053		if(this.config.CtryShortlist!="")
7054		 	ShortListCountryArray=this.config.CtryShortlist.split(",");
7055	}
7056
7057	if(ShortListCountryArray.length>0)
7058	{	// If not provided, check from
7059	 	fnlstr+="<optgroup label=\""+JSVClang("ShortList",27424)+"\">";
7060		for(var x=0;x<ShortListCountryArray.length;x++)
7061		{
7062			/*for(var i in countries)
7063			{
7064				if(countries[i].value==ShortListCountryArray[x])
7065				{
7066					fnlstr+="<option value=\""+countries[i].value+"\" "+(countries[i].value==nationalityID?"SELECTED":"")+">"+countries[i].name+"</option>";
7067					break;
7068				}
7069			}*/
7070			if(countries[ShortListCountryArray[x]]!=undefined)
7071				fnlstr+="<option value=\""+ShortListCountryArray[x]+"\" "+(ShortListCountryArray[x]==nationalityID?"SELECTED":"")+">"+countries[ShortListCountryArray[x]].name+"</option>";
7072		}
7073		fnlstr+="</optgroup>";
7074	   	fnlstr+="<optgroup label=\""+JSVClang("Others",2637)+"\">";
7075	}
7076	/*for (var j=1; j<countries.length; j++)
7077	{	var found=0;
7078		for(var x=0;x<ShortListCountryArray.length;x++)
7079			if(countries[j].value==ShortListCountryArray[x])
7080			{
7081				found=1;break;
7082			}
7083		if(found==0)
7084			fnlstr+="<option value=\""+countries[j].value+"\" "+(countries[j].value==nationalityID?"SELECTED":"")+">"+countries[j].name+"</option>";
7085	}*/
7086	$.each(sortedCountryArray(countries),function (index,o) {
7087		if($.inArray(o.key,ShortListCountryArray)==-1)
7088			fnlstr+="<option value=\""+o.key+"\" "+(o.key==nationalityID?"SELECTED":"")+">"+o.value.name+"</option>";
7089	});
7090	if(ShortListCountryArray.length>0)
7091		fnlstr+="</optgroup>";
7092    fnlstr+="</select>";
7093	if(this.config.UI=="M" || JSVCGetResp()) {
7094		fnlstr+="</div></div>";
7095	} else {
7096		fnlstr+="</td></tr>";
7097	}
7098	return fnlstr;
7099}
7100JSVCNameIDObject.prototype.genLibertyCustomNationality=function(nationalityID,chkrequired,disabled)	//#35043
7101{	
7102	var shortlist;
7103	var fnlstr="<td align=center>";
7104
7105	fnlstr+="<select URLVAR style=\"width:20ex;text-overflow: ellipsis;\" id=\""+this.nmStr+"_nationsel\" name=\""+this.nmStr+"_nationsel\"  "+(disabled==1?"DISABLED PDISABLED":"")+"  "+(chkrequired==1?"CHKREQUIRED":"")+"   "+(this.config.NationalityChangeID2==1? "onchange=\""+this.objname+".refresh(event);\" onblur=\""+this.objname+".refresh(event);\" ":" onchange=DoReq(this) onblur=DoReq(this)")+" ><option value=\"\"></option>";
7106	if(nationalityID==null)
7107		nationalityID=""
7108	else
7109		nationalityID=nationalityID.toString();
7110	if(nationalityID=="" && this.config.NationalityDefaultCountryID==1)
7111		nationalityID=this.config.DefCountryID;
7112	var ShortListCountryArray=new Array();
7113	if(this.config.CtryShortlist==null||this.config.CtryShortlist=="")
7114	{	// If NULL/missing then use default from CountrySettings
7115	 	if (CountrySettings[this.config.DefCountryID]!=null && CountrySettings[this.config.DefCountryID].CtryShortlist!=null)
7116	 	{
7117			if(CountrySettings[this.config.DefCountryID].CtryShortlist!="")
7118			 	ShortListCountryArray=CountrySettings[this.config.DefCountryID].CtryShortlist.split(",");
7119	 	}
7120	} else
7121	{
7122		if(this.config.CtryShortlist!="")
7123		 	ShortListCountryArray=this.config.CtryShortlist.split(",");
7124	}
7125
7126	if(ShortListCountryArray.length>0)
7127	{	// If not provided, check from
7128	 	fnlstr+="<optgroup label=\""+JSVClang("ShortList",27424)+"\">";
7129		for(var x=0;x<ShortListCountryArray.length;x++)
7130		{
7131			/*for(var i in countries)
7132			{
7133				if(countries[i].value==ShortListCountryArray[x])
7134				{
7135					fnlstr+="<option value=\""+countries[i].value+"\" "+(countries[i].value==nationalityID?"SELECTED":"")+">"+countries[i].name+"</option>";
7136					break;
7137				}
7138			}*/
7139			if(countries[ShortListCountryArray[x]]!=undefined)
7140				fnlstr+="<option value=\""+ShortListCountryArray[x]+"\" "+(ShortListCountryArray[x]==nationalityID?"SELECTED":"")+">"+countries[ShortListCountryArray[x]].name+"</option>";
7141		}
7142		fnlstr+="</optgroup>";
7143	   	fnlstr+="<optgroup label=\""+JSVClang("Others",2637)+"\">";
7144	}
7145	/*for (var j=1; j<countries.length; j++)
7146	{	var found=0;
7147		for(var x=0;x<ShortListCountryArray.length;x++)
7148			if(countries[j].value==ShortListCountryArray[x])
7149			{
7150				found=1;break;
7151			}
7152		if(found==0)
7153			fnlstr+="<option value=\""+countries[j].value+"\" "+(countries[j].value==nationalityID?"SELECTED":"")+">"+countries[j].name+"</option>";
7154	}*/
7155	$.each(sortedCountryArray(countries),function (index,o) {
7156		if($.inArray(o.key,ShortListCountryArray)==-1)
7157			fnlstr+="<option value=\""+o.key+"\" "+(o.key==nationalityID?"SELECTED":"")+">"+o.value.name+"</option>";
7158	});
7159	if(ShortListCountryArray.length>0)
7160		fnlstr+="</optgroup>";
7161    fnlstr+="</select>";
7162	fnlstr+="</td>";
7163	return fnlstr;
7164}
7165
7166JSVCNameIDObject.prototype.refresh=function(event)
7167{
7168	var o_com,IsCom,oNat,NatID,comStr,optListStr;
7169	// Check if company and reset isCom flag
7170	o_com=document.getElementById("_"+this.nmStr+"nmselCOM");
7171	if(o_com!=null && o_com.checked)
7172	{	this.isCom=1
7173		comStr="C";
7174	}
7175	else
7176	{	this.isCom=0;
7177		comStr="I";
7178	}
7179	// Check if option list done correctly
7180	oid_input=document.getElementById("_"+this.nmStr+"ID1");
7181	oid_select=document.getElementById("_"+this.nmStr+"ID1sel");
7182	if(oid_input!=null && oid_select!=null)
7183	{
7184		optListStr=comStr+":*"+this.config.DefCountryID;
7185		if(optListStr!=this.ID1ListStr)
7186		{
7187			this.ID1ListStr=optListStr;
7188			this.genOptionList(optListStr,oid_select,oid_select.value);
7189		}
7190		this.checkIDFormat(oid_input,oid_select);
7191		if (oid_select.options.length==0 || this.id1disabled==true)
7192		{
7193			oid_select.disabled=true;
7194			oid_input.disabled=true;
7195			oid_input.style.backgroundColor="silver";
7196		}
7197		else if(!(oid_input.getAttribute('PDISABLED')||oid_input.getAttribute('PDISABLED')==''))
7198		{
7199			oid_select.disabled=false;
7200			oid_input.disabled=false;
7201			oid_input.style.backgroundColor="";
7202		}
7203		DoReq(oid_input);
7204		DoReq(oid_select);
7205	}
7206
7207	oNat=document.getElementById("_"+this.nmStr+"nationsel");
7208	if(oNat!=null)
7209	{
7210		NatID=oNat.value;
7211		DoReq(oNat);
7212	}
7213
7214	oid_input=document.getElementById("_"+this.nmStr+"ID2");
7215	oid_select=document.getElementById("_"+this.nmStr+"ID2sel");
7216	if(oid_input!=null && oid_select!=null)
7217	{
7218		optListStr="";
7219		if(NatID!="" && NatID!=this.config.DefCountryID && this.config.NationalityChangeID2==1)
7220			optListStr=comStr+":*"+NatID+","+this.config.DefCountryID
7221		else
7222			optListStr=comStr+":"+this.config.DefCountryID;
7223		if(optListStr!=this.ID2ListStr)
7224		{
7225			this.ID2ListStr=optListStr;
7226			this.genOptionList(optListStr,oid_select,oid_select.value);
7227		}
7228		this.checkIDFormat(oid_input,oid_select);
7229		if (oid_select.options.length==0 || this.id2disabled==true)
7230		{
7231			oid_select.disabled=true;
7232			oid_input.disabled=true;
7233			oid_input.style.backgroundColor="silver";
7234		}
7235		else
7236		{
7237			oid_select.disabled=false;
7238			oid_input.disabled=false;
7239			oid_input.style.backgroundColor="";
7240		}
7241		DoReq(oid_input);
7242		DoReq(oid_select);
7243	}
7244}
7245JSVCNameIDObject.prototype.GenDOBTrig=function()
7246{
7247
7248	var src = this.nmStr + "ID1";
7249	var dobid = this.nmStr + 'DOB';
7250	var genid = this.nmStr + 'Gender';
7251	var srcobj = JSVCall(src);
7252	if(srcobj!=null)
7253	{
7254		if(document.getElementById(dobid)!=null)
7255		{
7256			var dobobj = document.getElementById(dobid);
7257			if(dobobj != null /*&& dobobj.value == ""*/)
7258			{
7259				JSVCSetDOB(srcobj, dobid, null, 1);
7260			}
7261		}
7262		if(document.getElementById(genid)!=null)
7263		{
7264			var genobj = document.getElementById(genid);
7265			if( genobj != null /*&& genobj.value == ""*/)
7266			{
7267				JSVCSetGenMyIC(srcobj,genid,null,false,1);
7268			}
7269		}
7270	}
7271}
7272
7273JSVCNameIDObject.prototype.genOptionList=function(genOptStr,objSel,selID)
7274{	// genOptStr: Option string in this format: C:1*,2* ==> (C/I):CountryID*,CountryID*,...*=Primary
7275	var arr,mark,ctryID,ctryIdx,str,grpCnt,idval,pGrp,opt,idListArray,idList,idName;
7276	if(objSel!=null)
7277	{
7278		while (objSel.firstChild) {
7279			objSel.removeChild(objSel.firstChild);
7280		}
7281	}
7282	if(genOptStr==null || genOptStr=="")
7283	{
7284		return "";
7285	}
7286	str="";
7287	arr=genOptStr.split(":");
7288	if(arr[0]=="C")
7289		isCom=1
7290	else
7291		isCom=0;
7292	arr=arr[1].split(",");
7293	for(var x=0;x<arr.length;x++)
7294	{
7295		if(arr[x].substring(0,1)=="*")
7296		{
7297			mark=1;
7298			ctryID=arr[x].slice(1);
7299		} else
7300		{
7301			mark=0;
7302			ctryID=arr[x];
7303		}
7304		idList=null;
7305		idListArray=new Array();
7306		ctryIdx=CSGetCountryIndexPos(ctryID);
7307		if(this.config.OvrIDStr!=null && this.config.OvrIDStr!="" && ctryID==this.config.DefCountryID)
7308		{	// Still using old IDStr format
7309			var idListTmp=this.config.OvrIDStr.split("|");
7310			if(isCom==1)
7311			{	// Old style: First element always company
7312				if(Trim(idListTmp[0])!="")
7313				{
7314					idListArray[0]=idListTmp[0];
7315					if(idListArray[0].length>0 && idListArray[0].substring(0,1)!="*")
7316						idListArray[0]="*"+idListArray[0];
7317				}
7318			} else
7319			{
7320				if(idListTmp.length>1)
7321				{
7322					idListTmp.shift();
7323					idListArray=idListTmp;
7324				}
7325			}
7326		} else
7327		{
7328			if (CountrySettings[ctryID]!=null)
7329			{
7330				if(isCom==1)
7331					idList=CountrySettings[ctryID].ComID
7332				else
7333					idList=CountrySettings[ctryID].IndID;
7334			}
7335			if(idList!=null)
7336				idListArray=idList.split("|");
7337		}
7338		if(idListArray.length>0)
7339		{	grpCnt=0;
7340			for(var y=0;y<idListArray.length;y++)
7341				if(idListArray[y].length>0)
7342				{
7343					var idval=null;
7344					if (mark==1)		//(mark=="*")
7345					{
7346						if (idListArray[y].substring(0,1)=="*")
7347							idval=idListArray[y].slice(1);
7348					}
7349					else
7350					{
7351						if (idListArray[y].substring(0,1)!="*")
7352							idval=idListArray[y];
7353					}
7354					if (idval!=null)
7355					{
7356						// Interprete ID string
7357						var idcomp=idval.split("!");
7358						if(idcomp.length>1)
7359						{
7360							idval=idcomp[0];
7361							idcomp=idcomp[1].split("~");
7362							idname=idcomp[0];
7363							if(idcomp.length>1)
7364								idchk=idcomp[1]
7365							else
7366								idchk=null;
7367						} else
7368						{
7369							idval=idcomp[0];
7370							idname=IDtypes[idval].Name;
7371							idchk=IDtypes[idval].IdChkStr;
7372						}
7373
7374						if(grpCnt==0)
7375						{
7376							//str+="<OPTGROUP LABEL=\""+countries[ctryIdx].name+"\">";
7377							str+="<OPTGROUP LABEL=\""+countries[ctryID].name+"\">";
7378							pGrp=document.createElement("optgroup");
7379							//pGrp.label=countries[ctryIdx].name;
7380							pGrp.label=countries[ctryID].name;
7381						}
7382						grpCnt++;
7383						//idchk=IDtypes[idval].IdChkStr;
7384						str+="<OPTION "+((idchk!=null && typeof(idchk)=="string" && idchk.length>0)?" IDCHKSTR=\""+idchk+"\" ":"")+" VALUE=\""+idval+"\" "+(idval==selID?"SELECTED":"")+">"+idname+"</OPTION>";
7385						opt=document.createElement("option");
7386						opt.value=idval;
7387						opt.innerHTML=idname;
7388						if(idchk!=null && typeof(idchk)=="string" && idchk.length>0)
7389							opt.setAttribute("IDCHKSTR",idchk);
7390						if(idval==selID)
7391							opt.selected=true;
7392						pGrp.appendChild(opt);
7393					}
7394				}
7395			if(grpCnt>0)
7396			{
7397				str+="</OPTGROUP>";
7398				if(objSel)
7399					objSel.appendChild(pGrp);
7400			}
7401		}
7402	}
7403	return str;
7404}
7405JSVCNameIDObject.prototype.checkIDFormat=function(obj,obj2)
7406{	//obj:id string		obj2:idtype select
7407	var opt;
7408	if (obj2.selectedIndex>=0 && obj2.options.length>0)
7409	{	var opt=obj2.options[obj2.selectedIndex];
7410		idchk=opt.getAttribute("IDCHKSTR");
7411		if (idchk!=null && typeof(idchk)=="string" && idchk.length>0)
7412			obj.setAttribute("CHKFORMAT",idchk)
7413		else
7414			obj.removeAttribute("CHKFORMAT");
7415	}
7416	DoReq(obj);
7417}
7418JSVCNameIDObject.prototype.setConfigStruct=function(setup_config)
7419{
7420	if(setup_config!=null && typeof(setup_config)=="object")
7421	{
7422		for (var name in setup_config)
7423	  		if (setup_config.hasOwnProperty(name) && this.config.hasOwnProperty(name))
7424    			this.config[name]=setup_config[name];
7425	}
7426}
7427JSVCNameIDObject.prototype.getConfigStruct=function()
7428{
7429	return this.config;
7430}
7431JSVCNameIDObject.prototype.setDefCountryID=function(ctryid)
7432{
7433	this.config.DefCountryID=ctryid;
7434}
7435JSVCNameIDObject.prototype.setOvrIDStr=function(idstr)
7436{
7437	this.config.OvrIDStr=idstr;
7438}
7439JSVCNameIDObject.prototype.setCtryShortlist=function(ctryshortlist)
7440{
7441	this.config.CtryShortlist=ctryshortlist;
7442}
7443
7444JSVCNameIDObject.prototype.genTIN=function(curvalue,req,disabled,onblur,NaEnabled){
7445	var fnlstr='';
7446
7447	if(this.config.UI=="M" || JSVCGetResp()){
7448		fnlstr+="<div id=\"TR"+this.nmStr+"TIN\"><div valign=baseline>Tax Identification Number (TIN)</div><div>";
7449	} else {
7450		fnlstr+="<tr id=\"TR"+this.nmStr+"TIN\"><td valign=baseline>Tax Identification Number (TIN)</td><td>";
7451	}
7452
7453	fnlstr+=`<input id=\"_`+this.nmStr+`TIN\" name=\"`+this.nmStr+`TIN\" VALUE=\"`+curvalue+`\" maxlength=14 minlength=10 size=20 `+(req==1?"CHKREQUIRED":'')+(disabled==1?" DISABLED PDISABLED":"")+(NaEnabled==1?" NAENABLED=1":" NAENABLED=0")+` onblur=\"`+onblur+`\">`;
7454
7455	if(NaEnabled==1){
7456		fnlstr+=`<br><span id="`+this.nmStr+`tin-note" class=clsColorNote>Input “NA” if TIN is not available/ not provided/ not TIN-registered</span>`;
7457	}
7458
7459	if(this.config.UI=="M" || JSVCGetResp()) {
7460		fnlstr+="</div></div>";
7461	} else {
7462		fnlstr+="</td></tr>";
7463	}
7464
7465	return fnlstr;
7466}
7467
7468//#57723: SST Registered? Radio Button Field (Available only Type=Company)
7469JSVCNameIDObject.prototype.genSSTRegOpt=function(curvalue,req,onclick){
7470	var fnlstr = '';
7471
7472			 if (this.config.UI == "M" || JSVCGetResp()) {
7473        fnlstr += "<div id=\"TR" + this.nmStr + "SSTRegOpt\" style=\"display: none;\" ><div valign=baseline>SST Registered?</div><div>";
7474    	} else {
7475        fnlstr += "<tr id=\"TR" + this.nmStr + "SSTRegOpt\" style=\"display: none;\" ><td valign=baseline>SST Registered?</td><td>";
7476    	}
7477
7478			fnlstr += "<input type=radio id=\"_" + this.nmStr + "SSTRegOpt1\" name=\"" + this.nmStr + "SSTRegOpt\" VALUE=1 onclick=\""+onclick+"\" " + (curvalue == 1 ? " checked" : "") + (req == 1 ? " CHKREQUIRED" : '') + "><label for=\"_" + this.nmStr + "SSTRegOpt1\">Yes</label>";
7479
7480			fnlstr += "<input type=radio id=\"_" + this.nmStr + "SSTRegOpt0\" name=\"" + this.nmStr + "SSTRegOpt\" VALUE=2 onclick=\""+onclick+"\" " + (curvalue == 2 ? " checked" : "") + (req == 1 ? " CHKREQUIRED" : '') + "><label for=\"_" + this.nmStr + "SSTRegOpt0\">No</label>";
7481
7482			if (this.config.UI == "M" || JSVCGetResp()) {
7483					fnlstr += "</div></div>";
7484			} else {
7485					fnlstr += "</td></tr>";
7486			}
7487
7488
7489	return fnlstr;
7490}
7491
7492
7493JSVCNameIDObject.prototype.genSSTReg=function(curvalue,req,disabled,onblur,NaEnabled){
7494	var fnlstr='';
7495
7496	if(this.config.UI=="M" || JSVCGetResp()){
7497		fnlstr+="<div id=\"TR"+this.nmStr+"SSTRegNo\"><div valign=baseline>SST Registration Number</div><div>";
7498	} else {
7499		fnlstr+="<tr id=\"TR"+this.nmStr+"SSTRegNo\"><td valign=baseline>SST Registration Number</td><td>";
7500	}
7501
7502	fnlstr+=`<input id=\"_`+this.nmStr+`SSTRegNo\" name=\"`+this.nmStr+`SSTRegNo\" VALUE=\"`+curvalue+`\" maxlength=17 size=20 `+(req==1?"CHKREQUIRED":'')+(disabled==1?" DISABLED PDISABLED":"")+(NaEnabled==1?" NAENABLED=1":" NAENABLED=0")+` onblur=\"`+onblur+`\">`
7503
7504	if(NaEnabled==1){
7505		fnlstr+=`<br><span class=clsColorNote>Input “NA” if SST registration number is not available/ not provided/ not SST-registered</span>`;
7506	}
7507
7508	if(this.config.UI=="M" || JSVCGetResp()) {
7509		fnlstr+="</div></div>";
7510	} else {
7511		fnlstr+="</td></tr>";
7512	}
7513
7514	return fnlstr;
7515}
7516
7517//make tables highlightable - type=0 is for tr highlighting, while type 1 for td 'deep' highlighting.
7518//usage : highlighter( tableobj,0 );
7519
7520function checkIDFormatStandAlone(obj,obj2,optionTrig)
7521{	//obj:id string		obj2:idtype select 		optionTrig:Trigger on index
7522	var opt=obj2.options[obj2.selectedIndex];
7523	var idchk=opt.getAttribute("IDCHKSTR");
7524	if (obj2.selectedIndex>=0 && obj2.options.length>0)
7525	{
7526		if(obj2.selectedIndex==optionTrig) {
7527			if (idchk!=null && typeof(idchk)=="string" && idchk.length>0)
7528				obj.setAttribute("CHKFORMAT",idchk)
7529			else
7530				obj.removeAttribute("CHKFORMAT");
7531		} else
7532				obj.removeAttribute("CHKFORMAT");
7533		/*var opt=obj2.options[obj2.selectedIndex];
7534		idchk=opt.getAttribute("IDCHKSTR");
7535		if (idchk!=null && typeof(idchk)=="string" && idchk.length>0)
7536			obj.setAttribute("CHKFORMAT",idchk)
7537		else
7538			obj.removeAttribute("CHKFORMAT");*/
7539	}
7540	DoReq(obj);
7541}
7542
7543highlighter = function(o,type,onclass,offclass,oncolor,offcolor){
7544
7545    var oldclass = new Array();
7546
7547    if (type==null) type = 1;
7548    if (onclass==null) onclass='clsSVChlon';
7549    if (offclass==null) offclass='clsSVChloff';
7550    if (oncolor==null) oncolor='pink';
7551    if (offcolor==null) offcolor='';
7552
7553    this.hlon = function (e) { // highlight
7554        var obj = getTR(e);
7555        var j = 0;
7556        if (obj&& obj.tagName == 'TR' && obj.parentNode.tagName != "THEAD" && obj.parentNode.tagName != "TFOOT") {
7557            if (type == 1){
7558                for (j=0;j<obj.cells.length;j++) { //cells
7559					if (document.all) {
7560						oldclass[j] = (obj.cells[j].style && obj.cells[j].style.backgroundColor != ''?obj.cells[j].style.backgroundColor:offcolor);
7561						obj.cells[j].style.backgroundColor = oncolor;
7562					} else
7563                    	obj.cells[j].className= onclass + ' ' + obj.cells[j].className;
7564
7565                }
7566            }
7567			if (document.all) {
7568                oldclass[j] = (obj.style&&obj.style.backgroundColor!=''?obj.style.backgroundColor:offcolor);
7569	            obj.style.backgroundColor = oncolor;
7570			} else {
7571				obj.className = onclass + ' ' + obj.className;
7572			}
7573
7574        }
7575    }
7576
7577    this.hloff = function (e) { // highlight off
7578        var obj = getTR(e);
7579        var j = 0;
7580        var color;
7581		var c = obj.className || "";
7582        if (obj&& obj.tagName == 'TR' && obj.parentNode.tagName != "THEAD" && obj.parentNode.tagName != "TFOOT") {
7583            if (type==1) {
7584                for (j=0;j<obj.cells.length;j++) {
7585					if (document.all) obj.cells[j].style.backgroundColor = oldclass[j];
7586					else obj.cells[j].className = obj.cells[j].className.replace(new RegExp("(^|\\s)"+onclass+"(\\s|$)"),"$1");
7587                }
7588            }
7589			if(document.all) obj.style.backgroundColor = oldclass[j];
7590			else obj.className = obj.className.replace(new RegExp("(^|\\s)"+onclass+"(\\s|$)"),"$1");
7591        }
7592    }
7593
7594    this.getTR = function(e) { // get the row from the triggered event element
7595        var obj;
7596        if (window.event)
7597        {
7598            e = window.event;
7599            obj = e.srcElement;
7600        } else {
7601            obj = e.target;
7602        }
7603        while ( obj.parentNode && obj.tagName != 'TR' && obj.tagName != 'TABLE') {
7604            obj = obj.parentNode;
7605        }
7606        return obj;
7607    }
7608
7609    this.addTableHighlight = function () { // adds onmouseover/out listening events
7610        if( !(o&&o.tagName== 'TABLE')) return;
7611        if (o.addEventListener){
7612            o.addEventListener('mouseover', hlon, true);
7613            o.addEventListener('mouseout', hloff, true);
7614        } else if (o.attachEvent){
7615            o.attachEvent('onmouseover', hlon);
7616            o.attachEvent('onmouseout', hloff);
7617        }
7618    }
7619
7620    this.addTableHighlight();
7621}
7622var SVCStatSummary=function(cols,coltitles,order,lnk,totstr,usePaging)
7623{
7624	this.cols=cols.split("|");
7625	this.coltitles=coltitles.split("|");
7626	if(order==null || order=="")
7627		this.order=null
7628	else
7629		this.order=order.split("|");
7630	this.itms=new Array();
7631	this.cnt=0;
7632	this.tot=0;
7633	this.lnk=lnk;
7634	this.totstr=totstr;
7635	if(usePaging==1)
7636	 this.setPage=usePaging;
7637	else
7638	 this.setPage=0;
7639}
7640SVCStatSummary.prototype.add=function(id,desc,cnt,supp)
7641{
7642	var o=new Object();
7643	o.desc=desc;
7644	o.cnt=cnt;
7645	o.supp=supp;
7646	this.itms[id]=o;
7647}
7648SVCStatSummary.prototype.genrow=function(stat,itm)
7649{
7650	this.cnt++;
7651/*	// Old style
7652	document.write("<b>"+itm.cnt+"</b> case"+(itm.cnt>
76520?"s":"")+" in <a style=font-weight:bold href=\""+request.webroot+this.lnk+stat+"&"+request.mtoken+"\">"+itm.desc+"</a>"+
7653		(itm.supp>0?" / <b>"+itm.supp+"</b> suppl":"")+"</br>"); */
7654	if(request.mobile == 2) {
7655		document.write("<a href=\""+request.webroot+this.lnk+stat+"&totalcase="+((isNaN(itm.cnt)?0:itm.cnt)+(isNaN(itm.supp)?0:itm.supp))+"&setpage="+this.setPage+"&"+request.mtoken+"\" class='list-group-item'>"+
7656			"<div class='row'>"
7657			);
7658		var colcount=0;
7659		for(x in this.cols) {
7660			if(isNaN(itm.cnt)) itm.cnt=0;
7661			if(isNaN(itm.supp)) itm.supp=0;
7662			coltype=this.cols[x];
7663			if(coltype=="cnt") {
7664				document.write("<div class='col-md-1 col-xs-2'>"+
7665					"	<span "+(itm.cnt>0?"class='badge'":"")+">"+(itm.cnt>0?itm.cnt:"&nbsp;")+"</span>"+
7666					"</div>"
7667					);
7668			} else if(coltype=="supp") {
7669				document.write("<div class='col-md-1 col-xs-2'>"+
7670					"	<span "+(itm.supp>0?"class='badge'":"")+">"+(itm.supp>0?itm.supp:"&nbsp;")+"</span>"+
7671					"</div>"
7672					);
7673			} else if(coltype=="desc") {
7674				document.write("<div class='col-md-"+(12-colcount)+" col-xs-"+(12-colcount*2)+"'>"+itm.desc+"</div>");
7675			}
7676			colcount++;
7677		}
7678		document.write("</div></a>");
7679	} else {
7680		document.write("<tr class=\""+((this.cnt%2)==0?"clsDetail4":"clsDetail5")+"\">");
7681		for(x in this.cols)
7682		{
7683			if(isNaN(itm.cnt)) itm.cnt=0;
7684			if(isNaN(itm.supp)) itm.supp=0;
7685			coltype=this.cols[x];
7686			if(coltype=="cnt")
7687				document.write("<td style='text-align:center;width:6ex;' class=\"clsCaseCnt\" nowrap>"+(itm.cnt>0?itm.cnt:"")+"</td>")
7688			else if(coltype=="supp")
7689				document.write("<td style='text-align:center;width:6ex;' class=\"clsCaseCnt2\" nowrap>"+(itm.supp>0?itm.supp:"")+"</td>")
7690			else if(coltype=="desc")
7691				document.write("<td width=100% style=padding-left:3px><a style=font-weight:bold href=\""+request.webroot+this.lnk+stat+"&totalcase="+(itm.cnt+itm.supp)+"&setpage="+this.setPage+"&"+request.mtoken+"\">"+itm.desc+"</a></td>");
7692		}
7693		document.write("</tr>");
7694	}
7695	this.tot+=itm.cnt;
7696}
7697SVCStatSummary.prototype.gen=function(notitle)
7698{
7699	var x,itm;
7700	if(notitle==null)
7701		if(this.itms.length==0)
7702			notitle=1
7703		else
7704			notitle=0;
7705	if(request.mobile == 2) {
7706		// Header
7707		document.write(
7708		"<div class='list-group'>"+
7709		"	<a class='list-group-item header'>");
7710
7711		if(notitle==0) {
7712			document.write("<div class='row'>");
7713			var coltitleslen = this.cols.length
7714
7715			for(x in this.coltitles){
7716				if(x != coltitleslen-1) {
7717					document.write("<div class='col-md-1 col-xs-2'>"+
7718						"	<label>"+this.coltitles[x]+"</label>"+
7719						"</div>"
7720						);
7721				} else {
7722					document.write("<div class='col-md-"+(12-x)+" col-xs-"+(12-x*2)+"'>"+
7723						"	<label>"+this.coltitles[x]+"</label>"+
7724						"</div>"
7725						);
7726				}
7727			}
7728			document.write("</div>");
7729		}
7730		document.write("</a>");
7731	} else {
7732		// Header
7733		document.write("<table cellpadding=\"2\" cellspacing=\"0\" class=\"clsMainTable\" border=1 width=100%>");
7734
7735		if(notitle==0)
7736		{
7737			document.write("<tr class=\"header\">");
7738			for(x in this.coltitles)
7739				document.write("<td align=center>"+this.coltitles[x]+"</td>");
7740			document.write("</tr>");
7741		}
7742	}
7743
7744	if(this.order!=null)
7745	{
7746		for(x in this.order)
7747		{
7748			itm=this.itms[this.order[x]];
7749			if(itm!=null)
7750			{
7751				this.genrow(this.order[x],itm);
7752				this.itms[this.order[x]]=null;
7753			}
7754		}
7755	}
7756
7757	for(x in this.itms)
7758	{
7759		if(this.itms[x]!=null)
7760			this.genrow(x,this.itms[x]);
7761	}
7762
7763	if(request.mobile == 2) {
7764		document.write(
7765		"	<div class='label-total'>"+this.tot+" "+this.totstr+"</div>"+
7766		"</div>");
7767	}
7768	else {
7769		if(this.totstr!=null)
7770			document.write("<tr><td colspan="+this.cols.length+" style=font-weight:bold;font-size:140%>"+this.tot+" "+this.totstr+"</td></tr>");
7771		document.write("</table>");
7772	}
7773}
7774SVCconfirmPrompt=function(varname,event,action,confirmtext,callback,cancelCallback) {
7775	this.varname=varname;
7776	this.action=action;
7777	this.confirmtext=confirmtext;
7778	this.callback=callback;
7779	this.cancelCallback=cancelCallback;
7780
7781	this.pp=new JSVCpopup("pp",null,null);
7782	this.vf=this.pp.ctxname+"_verify";
7783
7784	this.pp.width=300;
7785	this.pp.title=JSVClang("CONFIRMATION",1798);
7786	if(this.confirmtext==null) {
7787		this.pp.msg=action;
7788		this.pp.exfields=null;
7789	} else {
7790		this.pp.msg=JSVClang("Are you sure you want to {0}?\nType {1} to confirm.",5019,0,this.action,this.confirmtext);
7791		this.pp.exfields=[[null,"<input CHKREQUIRED CHKNAME='"+this.confirmtext+"' id="+this.vf+" onblur=DoReq(this) onkeypress=\"if(event.keyCode==13){"+this.varname+".f
7791nOK()}else if(event.keyCode==27){"+this.varname+".fnCancel()}\">"]];
7792	}
7793	this.pp.fnOK=this.varname+".fnOK()";
7794	this.pp.fnCancel=this.varname+".fnCancel()";
7795	this.pp.gen();
7796	this.pp.show(event);
7797	var o=document.getElementById(this.vf);
7798	if(o) o.focus();
7799}
7800SVCconfirmPrompt.prototype.fnOK=function() {
7801	var cb=false;
7802	if(this.confirmtext==null) {
7803		cb=true;
7804		this.pp.hide();
7805	} else {
7806		var txt=document.getElementById(this.vf).value;
7807		if(Trim(txt.toUpperCase())==this.confirmtext) {
7808			this.pp.hide();
7809			cb=true;
7810		} else {
7811			this.pp.hide();
7812			SVCalert(JSVClang("You didn't "+"{0}"+". "+"{1}"+" cancelled.",5020,0,this.confirmtext,this.action));
7813		}
7814	}
7815	if(cb) {
7816		if(typeof(this.callback)=="function")
7817			this.callback(this.action);
7818		else
7819			eval(this.callback);
7820	}
7821}
7822SVCconfirmPrompt.prototype.fnCancel=function() {
7823	//this.pp.hide();
7824	if(this.cancelCallback)
7825	{
7826        if(typeof(this.cancelCallback)=="function")
7827            this.cancelCallback(this.action);
7828        else
7829            eval(this.cancelCallback);
7830    }
7831}
7832SVCalert=function(msg, title, width,callback) {
7833	if(title==null) title=JSVClang("ALERT",27425)
7834	if(width==null) width=300;
7835	var o;
7836	var alert_popup=new JSVCpopup("alert_popup");
7837	alert_popup.width=width;
7838	alert_popup.title=title;
7839	alert_popup.msg=msg;
7840	alert_popup.btnFlag=1;
7841	if(callback!=null)
7842		if(typeof(callback)=="function")
7843			alert_popup.fnOK=callback
7844		else
7845			alert_popup.fnOK=new Function(callback);
7846	alert_popup.gen();
7847	alert_popup.show(window.event);
7848	o=JSVCGetFirstFormElement(document.getElementById(alert_popup.ctxname));
7849	if(o)o.focus();
7850}
7851SVCnote=function(msg,ctxid) {
7852	var o;
7853	var alert_note=new JSVCpopup("alert_note",null,ctxid);
7854	alert_note.width=300;
7855	alert_note.title="Note";
7856	alert_note.msg=msg;
7857	alert_note.btnFlag=0;
7858	alert_note.gen();
7859	alert_note.show(window.event);
7860	o=JSVCGetFirstFormElement(document.getElementById(ctxid));
7861	if(o)o.focus();
7862}
7863function JSVCniceralert(msg,status,title,load,oxhttp, custombtn, clsmenubtn) {
7864	var html,oframe,width=400;//document.body.clientWidth-(document.body.clientWidth*0.1);
7865	oframe=document.getElementById("UL_alert");
7866	if(load == null) load = false;
7867	if(oframe) { oframe.parentNode.removeChild(oframe); oframe = null;}
7868	if (oframe==null) {
7869		html = "<div id=divcontainer style=overflow:visible;overflow-x:auto;overflow-y:auto;max-height:800px;>";
7870		html += '<table border=0 cellspacing=0 cellpadding=3 width=100% style=margin-top:1px;background-color:white;>';
7871		if(!load) {
7872			html += '<tr><td align=center>'+(status>=0?'<img src="'+request.approot+'services/images/info_32.png">':'<img src="'+request.approot+'services/images/alert_32.png">')+'</td></tr><tr>';
7873			html += '<tr><td id=UL_alert_msg align='+(status===2?'left':'center')+ '; style=font-weight:' +(status===2?'normal':'bold')+';color:'+(status>0?'black':'red')+'>'+msg+'</td></tr>';			
7874			if(custombtn != null && custombtn != '') // custom button to display
7875				html += custombtn;
7876			else
7877				html += '<tr><td align=center><input type="button" class="clsButton" id="okBtn" value=" OK " onClick="JSVCcloseCtxMenu(document.getElementById(\'UL_alert\'));"></td></tr>';
7878		} else {
7879			html += '<tr><td align=center style=font-weight:bold;>'+msg+' </td></tr><tr>';
7880			if(oxhttp!=null)
7881			{
7882				html += '<tr><td align=center><img src="'+request.approot+'services/images/ajax-loaderblk.gif"></td></tr>';
7883				html += '<tr><td align=center><input type="button" class="clsButton" id="cnclBtn" value=" Cancel " onClick="JSVCcloseCtxMenu(document.getElementById(\'UL_alert\'));oxhttp.abort();"></td></tr>';
7884			}
7885		}
7886		html += '</table>';
7887		html += '</div>';
7888		if(clsmenubtn == null) clsmenubtn==false
7889		oframe=JSVCCtxMenuFrame(null,"UL_alert",title,width,false,clsmenubtn);
7890		JSVCCtxMenuContent(oframe,html);
7891		JSVCshowCtxMenuEv(null,oframe,1,2,2);
7892	}
7893	else {
7894		JSVCshowCtxMenuEv(null,oframe,1,2,2);
7895	}
7896	if(!load)
7897		document.getElementById('okBtn').focus();
7898}
7899SVCconfirm=function(msg,callback,cancelCallback) {
7900	oSVCconfirm=new SVCconfirmPrompt("oSVCconfirm",window.event,msg,null,callback,cancelCallback);
7901}
7902SVCprompt=function(action,confirmtext,callback,cancelCallback) {
7903	oSVCprompt=new SVCconfirmPrompt("oSVCprompt",window.event,action,confirmtext,callback,cancelCallback);
7904}
7905function JSVCresizeTxtareaRow(id){
7906	var obj,countrowsNew;
7907	if( typeof(id) == "string" )
7908		obj = document.getElementById(id);
7909	else
7910		obj = id;
7911	var new_row;
7912	var min_row = 3;
7913	var max_row = 100;
7914
7915	if(obj) {
7916		if(obj.rows!=null) new_row = obj.rows;
7917		if(obj.getAttribute("minrows")!=null&&obj.getAttribute("minrows")!="") min_row = obj.getAttribute("minrows");
7918		if(obj.getAttribute("maxrows")!=null&&obj.getAttribute("maxrows")!="") max_row = obj.getAttribute("maxrows");
7919
7920		if(obj.value!="") {
7921			countrows = obj.value.toString().split('\n');
7922			if(countrows!=null&&countrows.length+1>new_row ) {
7923				new_row = countrows.length+1;
7924			}
7925		}
7926		
7927		if(new_row>max_row){	
7928			new_row = max_row;
7929			$(obj).attr('onkeypress','if(event.keyCode==13){return false}');
7930
7931			//To cater for long press "Enter" or paste value
7932			countrowsNew = countrows.slice(0, new_row).join("\n");
7933			if(countrowsNew != undefined) obj.value = countrowsNew;
7934		}else{
7935			if(obj.hasAttribute('onkeypress')) $(obj).removeAttr('onkeypress');
7936		}
7937		if(new_row>min_row) obj.rows = new_row;
7938	}
7939}
7940function JSVCautoExpandTextarea() {
7941	var obj = document.getElementsByTagName("TEXTAREA");
7942	for(var i=0;i<obj.length;i++) {
7943		if( obj[i].getAttribute("autoexpand")!=null && obj[i].id) {
7944				JSVCresizeTxtareaRow(obj[i]);
7945				JSVCaddEvent(obj[i],'keyup',function(event){JSVCresizeTxtareaRow(this.id)})
7946		}
7947	}
7948}
7949/*
7950 * JSVCVarNameRegister : Registration for global varnames to be used in page.
7951 *
7952 * Andrew: 05 Febuary 2013
7953 * There is this problem where we want to access an object/datastructure globally by name,
7954 * for example in document events like onclick=varname.clickfunction(). This causes problem because
7955 * variables must created global for the scripting and must be careful of name clashes
7956 * especially in library functions.
7957 *
7958 * Solution is to create a global registry (a Merimen Name register) that is active for a particular page.
7959 * This registry stores everything in a single global variable _MRMVarNameRegister object variable. Since
7960 * we are storing as Properties of Object look-up should be fast as an associative array.
7961 *
7962 * - Use allocated_varname=SVCVarNameSet(varname,value[,makeNewUnique]) to set a varname value (can be an object).
7963 *     If makeNewUnique is true and varname already taken, it will append a postfix to make it a new unique.
7964 * - Use SVCVarNameGet(varname) get the value stored for varname
7965 * - Use SVCVarNameForget(varname) to deallocate a varname value for garbage collection (not strictly neccessary
7966 * 	   as pages are short-lived and garbage collected upon navigating but nice to do anyway)
7967 *
7968 * Example:
7969 * var win=window.open("http://xx");
7970 * var varname=JSVCVarNameSet("POPUPWIN",win,true);
7971 * document.write("<input type=button value='Close Popup' onclick=\"JSVCVarNameGet("+varname+").close()\">");
7972 *
7973 */
7974var _MRMVarNameRegister=new Object();
7975function JSVCVarNameSet
7976		(
7977		varname,
7978		value,
7979		makeNewUnique
7980		)
7981{
7982	var newVarName;
7983	if((typeof(varname))!="string")
7984		varname="";
7985	newVarName=varname;
7986	if(makeNewUnique!=true)
7987		makeNewUnique=false;
7988	while(_MRMVarNameRegister.hasOwnProperty(newVarName) && makeNewUnique==true)
7989	{
7990		// Clash with makeNewUnique: allocate a random postfix
7991		newVarName=varname+"_"+Math.floor(Math.random()*100000000);
7992	}
7993	_MRMVarNameRegister[newVarName]=value;
7994	return newVarName;
7995}
7996function JSVCVarNameExists(varname)
7997{
7998	if(_MRMVarNameRegister.hasOwnProperty(varname))
7999		return true
8000	else
8001		return false;
8002}
8003function JSVCVarNameGet(varname)
8004{
8005		if(_MRMVarNameRegister.hasOwnProperty(varname))
8006			return _MRMVarNameRegister[varname]
8007		else
8008			return null;
8009}
8010function JSVCVarNameForget(varname)
8011{
8012		if(_MRMVarNameRegister.hasOwnProperty(varname))
8013			delete _MRMVarNameRegister[varname];
8014}
8015function JSVCSetSelect(elname,elattrvalue,elattr){
8016    var l_attr = elattr || 'value'
8017    $('select[name="'+elname+'"]').children().each(function(index,item){
8018        if (item.getAttribute(l_attr) == elattrvalue){
8019            item.setAttribute('selected','')
8020            return false
8021        }
8022    })
8023}
8024function JSVCBaseCurrencyTypeChange(obj,objexcrate,localcurrid) {
8025	var currid,origval;
8026	obj=(typeof(obj)=='string'?document.getElementById(obj):obj);
8027	currid=(obj!=null&&obj.value!=null?obj.value:null);
8028	objexcrate=(typeof(objexcrate)=='string'?document.getElementById(objexcrate):objexcrate);
8029	if(objexcrate!=null) {
8030		origval=(objexcrate.getAttribute('ORIGVAL')!=null&&objexcrate.getAttribute('ORIGVAL')!=''?objexcrate.getAttribute('ORIGVAL'):null);
8031		objexcrate.readOnly=(parseInt(currid)==parseInt(localcurrid)?true:false);
8032		if(origval=='' || origval==null) objexcrate.value=(parseInt(currid)==parseInt(localcurrid)?1:'');
8033		objexcrate.onblur();
8034	}
8035}
8036
8037/****** START : worksheet itemizer *******/
8038
8039
8040var cFITMitms=function(varname,curr,locid,excratesrc,excratedt,currlist,config,domainid,objid)
8041{
8042	var cnt,temp,temp2,cnty,fset;
8043	this.varname=varname;
8044	this.curr=curr;
8045	this.def_itmdtldef_items=eval('[{"COLNAME":"Description","ITMS":[["vaDESC","","CHKREQUIRED",""]]},{"COLNAME":"Part/Ref No","ITMS":[["vaPNO",""]]},{"COLNAME":"Qty","ITMS":[["NVAL2","","CHKREQUIRED",""]]},{"COLNAME":"Amount","ITMS":[["mnVAL1","","CHKREQUIRED",""]]}]');
8046	this.def_itmdtldef_rate=eval('[{"COLNAME":"Description","ITMS":[["vaDESC",""]]},{"COLNAME":"Date From","ITMS":[["dtDATE1",""]]},{"COLNAME":"Date To","ITMS":[["dtDATE2",""]]},{"COLNAME":"Days","ITMS":[["NVAL2","","READ"]]}]');
8047	//<!--- this var is used to define name of the input object --->
8047
8048	this.RulesFormItmDef={"VADESC":"DS","VADESC2":"DS2","VADESC3":"DS3","VADESC4":"DS4","VADESC5":"DS5","DTDATE1":"DT1","DTDATE2":"DT2","VAPNO":"PN","VAPNO2":"PN2","MNVAL3":"AM3","NVAL2":"QT","MNVAL1":"AM","MNVAL4":"AM4","MNVAL5":"AM5","MNVAL6":"AM6","MNVAL7":"AM7","MNVAL8":"AM8","MNVAL9":"AM9","DTDATE3":"DT3","NVAL3":"NV3","NVAL4":"NV4","DTDATE4":"DT4","NVAL5":"NV5"};
8049	this.locid=locid;
8050	this.excratesrc=excratesrc;
8051	this.excratedt=excratedt;
8052	this.currlist=currlist;
8053    this._config = config?config:{} //flag coverage: hide coverage if true
8054	this.itmgrpid=null;
8055	this.rulesetid=null;
8056	this.rulesetcfg=null;
8057	this.rulesetvarname=null;
8058	this.rulesetformprefixname=null;
8059	this.domainid=domainid;
8060	this.objid=objid;
8061	this.itemisehtml=null;
8062	this.debug_itmdef=0;
8063	this.noxrate_maxday=9999;
8064
8065}
8066cFITMitms.prototype.setRules=function(jsRS,jsR)
8067{	this.RuleSets=jsRS;
8068	if (this.RuleSets!=null && this.RuleSets.DATA.length>0) {
8069		this.rulesetid=JSVCqueryGetValue(this.RuleSets,'IRULESETID',0);
8070		this.rulesetcfg=JSVCqueryGetValue(this.RuleSets,'IRULESETCFG',0);
8071		this.rulesetvarname=JSVCqueryGetValue(this.RuleSets,'VARULESETNAME',0);
8072	}
8073	this.Rules=jsR;
8074	this.RulesCol=new Array();
8075	
8076	for(var i=0;i<this.Rules.COLUMNS.length;i++) {
8077		this.RulesCol[this.Rules.COLUMNS[i]]=i;
8078	}
8079}
8080cFITMitms.prototype.setItms=function(jsIG,jsI,jsID,jsDEFSET,jsDEFIDTL)
8081{	this.ItmGrps=jsIG;
8082	if (this.ItmGrps!=null && this.ItmGrps.DATA.length>0)
8083		this.itmgrpid=JSVCqueryGetValue(this.ItmGrps,'IITMGRPID',0);
8084	this.Itms=jsI;
8085	this.ItmsCol=new Array();
8086	this.ItmsDtls=jsID;
8087	this.ItmsDtlsCol=new Array();
8088	for(var i=0;i<this.Itms.COLUMNS.length;i++) {
8089		this.ItmsCol[this.Itms.COLUMNS[i]]=i;
8090	}
8091
8092	for(var i=0;i<this.ItmsDtls.COLUMNS.length;i++) {
8093		this.ItmsDtlsCol[this.ItmsDtls.COLUMNS[i]]=i;
8094	}
8095	this.ItmsDEFSET=jsDEFSET;
8096	this.IdtlDEFSET=(!(this.itmgrpid>0)?jsDEFIDTL:null);
8097}
8098cFITMitms.prototype.clkGrpSel=function(ev,o,nmpref,idtag,rule_ord,rAmtType)
8099{	var html,oframe;
8100	oframe=document.getElementById(this.rulesetformprefixname+"ITMSEL");
8101	html = ((rAmtType&1)==1?"<div class=clsSVCCtxMenuItem doFunction=\""+this.varname+".updItmState('"+nmpref+"','"+idtag+"',null,"+rule_ord+",1,'Lump-Sum')\">"+JSVClang("Lump-Sum",7214)+"</div>":"")+
8102	((rAmtType&2)==2?"<div class=clsSVCCtxMenuItem doFunction=\""+this.varname+".updItmState('"+nmpref+"','"+idtag+"',null,"+rule_ord+",2,'No x Rate')\">"+JSVClang("No x Rate",12063)+"</div>":"")+
8103	((rAmtType&8)==8?"<div class=clsSVCCtxMenuItem doFunction=\""+this.varname+".updItmState('"+nmpref+"','"+idtag+"',null,"+rule_ord+",8,'Itemized')\">"+JSVClang("Itemized",12064)+"</div>":"");
8104	oframe.innerHTML=html;//JSVCCtxMenuContent(oframe,html);
8105	JSVCshowCtxMenuEv(ev,oframe,1,0,0);
8106//	this.updItmState(nmpref,idtag,o.previousSibling,rule_ord);
8107}
8108cFITMitms.prototype.genRuleSet=function(oDiv,nmpref)
8109{	var flg_optmthwages, flg_showmthwages,value,thisitmdef,valuelist,maxcvg,nmri,sitm,s,rs,ig,r,t,ir,idtl,idtlcnt,idtlnewcnt,idoldlist,idnewlist,oldlist,oldcnt,newlist,newcnt,idtag,sel,v,fs,qty,ratediv,showcvg,dt1,dt2,itmtotal='',ptr_grpname='',noxrate_rateval, noxrate_noval, noxrate_maxno,form_style,slbl,flag_monthcalc;
8110	var igID=(this.itmgrpid!=null?this.itmgrpid:0), rsID=(this.rulesetid!=null?this.rulesetid:0), nmrs=this.rulesetvarname, debug_showda=0;
8111	this.rulesetformprefixname=nmpref;
8112	if(typeof(oDiv)=="string")
8113	{	oDiv=document.getElementById(oDiv);
8114	}
8115	s="";sitm="";
8116	newlist="";newcnt=0;
8117	oldlist="";oldcnt=0;
8118	showcvg=(this.rulesetcfg!=null&this.rulesetcfg>=0 && (this.rulesetcfg&1)>0 ? 0:1);
8119	if(rsID==null || rsID<=0) {
8120		alert("ERR(IG):"+JSVClang("Item Ruleset not found",25739));
8121		return;
8122	}
8123	s+="<div class=clsSVCCtxMenuBox id=\""+this.rulesetformprefixname+"ITMSEL\" ctxVal=0 onclick=JSVCclickCtxMenu(this) onmouseover=JSVCtoggleCtxMenu(this,event) onmouseout=JSVCtoggleCtxMenu(this,event) style=z-index:10000;width:17ex></div>";
8124	s+="<table id=\""+nmpref+"ItmContainer\" style=\"border:2px solid silver;width:100%\">";
8125	s+="<tr style=color:white;background-color:dimgray><td><div style=float:right>"+JSVClang("Selection",12065)+" &nbsp; </div>"+JSVClang("Item Description",12066)+"</td>{{coverage}}<td align=center style=width:25ex>"+JSVClang("Amount",1443)+" ("+this.curr+")</td></tr>";
8126    s= s.replace(/{{coverage}}/g,this._config.killcoverage?'<td style="width:0px"></td>':"<td align=center style=width:25ex>"+JSVClang("Coverage",10838)+" ("+this.curr+")</td>")
8127	// Run through the rules of the ruleset
8128	for(t=0;t<this.Rules.DATA.length;t++)
8129	{
8130		itmtotal='';
8131		r=this.Rules.DATA[t];
8132		
8133		thisitmdef=r[this.RulesCol['VAITMDEF']];
8134		noxrate_maxno=r[this.RulesCol['VARSCVAL2']];
8135		
8136		thisitmdef=(thisitmdef!=null&&thisitmdef!=''?jQuery.parseJSON(thisitmdef):null);
8137		nmri=r[2]; // rule item code
8138		ir=null;
8139		
8140		
8141		if(igID>0){
8142			ir=JSVCqueryFindRow(this.Itms,2,r[0]);
8143		}
8144		if(this.ItmsDEFSET!=null &&typeof(this.ItmsDEFSET[nmri.toUpperCase()]) !='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITMAPPLC)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITMAPPLC==0){
8145			continue; //not applicable, don't need to show item
8146		}
8147		if(ir==null)
8148		{	newcnt++;
8149			idtag="N"+newcnt.toString();
8150			newlist+=(newlist==""?"":",")+idtag;
8151			if(r[this.RulesCol['IDEFITMTYPE']]=='' || r[this.RulesCol['IDEFITMTYPE']]==null) {
8152				sel=0;
8153			} else {
8154				sel=r[this.RulesCol['IDEFITMTYPE']];
8155			}
8156		}	else
8157		{	oldcnt++;
8158			idtag=ir[1];
8159			oldlist+=(oldlist==""?"":",")+idtag;
8160			sel=ir[3];
8161			if(sel=="")sel=0;
8162		}
8163		if(r[this.RulesCol['VARULEGRPNAME']]!=null&&ptr_grpname!=r[this.RulesCol['VARULEGRPNAME']]) {
8164			ptr_grpname=r[this.RulesCol['VARULEGRPNAME']];
8165			s+="<tr style=\"background-color:#8080C0\"><td colspan=3 class=header style=font-weight:bold>"+ptr_grpname+"</td></tr>";
8166		}
8167		s+="<tr class=\"ClsRptTone"+(t%2==0?2:1)+"\"><td>";
8168		rAmtType=r[5];
8169		if(rAmtType=="")rAmtType=1;
8170		if(sel==0)
8171			if((rAmtType&1)==1)sel=1
8172			else if((rAmtType&2)==2)sel=2
8173			else if((rAmtType&8)==8)sel=8;
8174		s+="<div style=float:right>";
8175		s+="<span "+(sel==8?"":"style=display:none")+" ID=ITEMS><input class=clsButton2 value=\"Items...\" type=button onclick=\""+this.varname+".clkItmDtlWindow(event,this,'"+nmpref+"','"+idtag+"',"+t+");\"></span>";
8176
8177		 // noxrate for no
8178		if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()]) !='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL2)!='undefined')
8179			noxrate_noval=this.ItmsDEFSET[nmri.toUpperCase()].NVAL2;
8180		else if (ir!=null && !(sel==8&&(r[11]==2||r[11]==4)) && ir[6]!=null)
8181			noxrate_noval=ir[6];
8182		else
8183			noxrate_noval='';
8184		
8185		//noxrate for max days
8186		if(noxrate_maxno>0)
8187			this.noxrate_maxday=noxrate_maxno;
8188		else if(this.ItmsDEFSET!=null &&typeof(this.ItmsDEFSET[nmri.toUpperCase()]) !='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITMMAXDAY)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITMMAXDAY>0)
8189			this.noxrate_maxday=this.ItmsDEFSET[nmri.toUpperCase()].ITMMAXDAY;
8190		else
8191			this.noxrate_maxday=9999;
8192		
8193		// noxrate for rate
8194		if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()]) !='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2)!='undefined')
8195			noxrate_rateval=this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2;
8196		else if (ir!=null && ir[8]!=null)
8197			noxrate_rateval=ir[8];
8198		else
8199			noxrate_rateval='';
8200
8201		ruleset_info='';
8202		if(r[this.RulesCol['VARULESETINFO']]!=null&&r[this.RulesCol['VARULESETINFO']]!=''){
8203			ruleset_info=r[this.RulesCol['VARULESETINFO']];
8204			nobr=0;
8205		} else {
8206			nobr=1;
8207		}
8208
8209		if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].RULESETINFO)!='undefined'){
8210			rsinfoadd=nobr==0?"<br>"+this.ItmsDEFSET[nmri.toUpperCase()].RULESETINFO:""+this.ItmsDEFSET[nmri.toUpperCase()].RULESETINFO;
8211		ruleset_info=ruleset_info+rsinfoadd;
8212		}
8213
8214		s+="<span "+(sel==2?"":"style=display:none")+" ID=RATE>"+JSVCRateInputGenStr(nmpref+"RT"+idtag,this.curr,JSVClang("Rate Item",7375),0,0,noxrate_noval,noxrate_rateval,"",nmpref+"ITA"+idtag,null,null,null,this.noxrate_maxday)+"</span>";
8215		s+=" <input type=hidden name=\""+nmpref+"IS"+idtag+"\" value=\""+sel+"\">";
8216		if(sel>0) { s+="<input type=button class=clsButton "+(sel==rAmtType?"DISABLED style=cursor:none":"")+" onclick=\""+this.varname+".clkGrpSel(event,this,'"+nmpref+"','"+idtag+"',"+t+","+rAmtType+")"+"\" size=12 value=\""+(sel==8?JSVClang("Itemized",12064):(sel==2?JSVClang("No x Rate",12063):JSVClang("Lump-Sum",7214)))+(sel==rAmtType?"":" &#9660;")+"\">&nbsp;"; }
8217		s+="</div><span style=font-weight:bold;vertical-align:middle;font-size:125%>"+SVChtm(JSVClang(r[9],r[19]))+(ruleset_info!=null&&ruleset_info!=''?"<br><span style=font-size:80%;font-weight:normal>" + ruleset_info + "</span>":"")+"</span>";
8218		s+="<INPUT name=\""+nmpref+"RL"+idtag+"\" type=hidden value=\""+r[0]+"\"></td>"; // RuleID
8219		//itm-coverage
8220		if(igID==null||igID==0) {
8221			if (this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL3)!='undefined') {
8222				maxcvg=parseFloat(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL3);
8223				maxcvg=(maxcvg>=0?JSVCNumDBtoLOC(maxcvg):"");
8224			} else {
8225				maxcvg=(r[this.RulesCol['MNMAXCVG']]!=null?JSVCNumDBtoLOC(r[this.RulesCol['MNMAXCVG']]):"");
8226			}
8227		} else {
8228			maxcvg=(ir!=null?JSVCNumDBtoLOC(ir[9]):"");
8229		}
8230
8231		if(!this._config.killcoverage) {
8232            s+="<td align=center style=width:25ex><INPUT "+(r[this.RulesCol['IITMCFG']]>0&&( ( r[this.RulesCol['IITMCFG']] & 1 ) == 1)?"READONLY":"")+" "+(showcvg==1?"":"DISABLED style=\"background-color:silver\" ")+"name=\""+nmpref+"CV"+idtag+"\" maxlength=14 value=\""+maxcvg+"\" onblur
8232=\"JSVCCurr(this,null,0);"+this.varname+".fitmItmLimitTot('"+nmpref+"','"+idtag+"');\"></td>";
8233        } else {
8234            s+="<td align=center style=width:0px><INPUT type='hidden'"+(r[this.RulesCol['IITMCFG']]>0&&( ( r[this.RulesCol['IITMCFG']] & 1 ) == 1)?"READONLY":"")+" "+(showcvg==1?"":"DISABLED style=\"background-color:silver\" ")+"name=\""+nmpref+"CV"+idtag+"\" maxlength=14 value=\""+maxcvg+"\" onblur=\"JSVCCurr(this,null,0);"+this.varname+".fitmItmLimitTot('"+nmpref+"','"+idtag+"');\"></td>";
8235        }
8236
8237
8238		//itm-total
8239		s+="<td align=center style=width:25ex>";
8240		s+="<INPUT id=\""+nmpref+"IT"+idtag+"\" name=\""+nmpref+"IT"+idtag+"\" maxlength=14 value=\""+(ir==null?(r[this.RulesCol['MNVAL1']]!=null?JSVCNumDBtoLOC(r[this.RulesCol['MNVAL1']]):""):JSVCNumDBtoLOC(ir[5]))+"\"  onblur=\"JSVCCurr(this,null,-9999999999);"+this.varname+".fitmItmLimitTot('"+nmpref+"','"+idtag+"');\" "+(sel==0 || sel==2||sel==8?" READONLY style=background-color:silver":"")+">";
8241		s+="<INPUT TYPE=hidden id=\""+nmpref+"ITA"+idtag+"\" name=\""+nmpref+"ITA"+idtag+"\" maxlength=14 value=\""+(ir==null?"":JSVCNumDBtoLOC(ir[13]))+"\" onblur=\"JSVCCurr(this,null,-9999999999);"+this.varname+".fitmItmLimitTot('"+nmpref+"','"+idtag+"');\">";
8242		s+="</td>";
8243		s+="</tr>";
8244
8245		if((rAmtType&8)==8)
8246		{
8247			// Itemization allowed
8248			if(r[10]==""||r[10]==null||r[10]=='null') /* Added String null checking for possible null saved as string in db */
8249				fs=((r[11]==1||r[11]==2||r[11]==4)?this.def_itmdtldef_rate:this.def_itmdtldef_items);
8250			else
8251				fs=eval(r[10]);
8252			/* *** item detail table */
8253			sitm+=(this.debug_itmdef==1?"OBJ:"+nmpref+"IT"+idtag+"DIV":"")+"<div id=\""+nmpref+"IT"+idtag+"DIV\" INTIDTLRULEORDER=\""+t+"\" INTIDTLPREFIX=\""+nmpref+"IT"+idtag+"\" INTIDTL_NMPREF=\""+nmpref+"\" INTIDTL_IDTAG=\""+idtag+"\" INTIDTLITMDEF=\""+nmri.toUpperCase()+"\" style=display:"+(debug_showda==1?"block":"none")+";width:100%><div style=width:100%>";
8254			sitm+="<TABLE id=\"RS"+nmrs+"RI"+nmrs+"\" CELLSPACING=1 border=2 class=clsSVCClmTable style=\"WIDTH:100%;padding-left:5px\;text-align:center\"><col width=1px></col>";
8255			sitm+="<tbody>";
8256			if(r[11]==2||r[11]==4||r[11]==1||r[11]==8||r[11]==3||r[11]==5)
8257			{
8258				ratediv=null; // reset
8259				if(ir!=null&&r[11]==4&&ir[3]!=8 && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' )
8260					ratediv=this.ItmsDEFSET[nmri.toUpperCase()].NVAL2;
8261				else if(ir!=null)
8262					ratediv=(ir[6]==7?7:(ir[6]==0||ir[6]==-5||ir[6]==-5.5||ir[6]==-6?ir[6]:1));
8263				else if(ir==null) { /* new */
8264					if (this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined') { // default
8265						ratediv=this.ItmsDEFSET[nmri.toUpperCase()].NVAL2; // day type **=ratediv
8266					} else {
8267						ratediv=1; // default as daily (per day)
8268					}
8269				}
8270				sitm+="<tr><td align=left colspan="+(fs.length+2)+">";
8271				if(r[11]==4) {
8272					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].IVAL2)!='undefined')
8273						value=this.ItmsDEFSET[nmri.toUpperCase()].IVAL2;
8274					else if (ir!=null && ir[21]!=null)
8275						value=ir[21];
8276					else
8277						value='';
8278					form_style=0;
8279					if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITM_DAYBALCHG)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITM_DAYBALCHG==1)
8280						form_style=1; // allow change
8281					sitm+="<div style=\"font-weight:bold;margin-bottom:10px\" for=\""+nmpref+"RT"+idtag+"ITMDTLFLAG_DAYBALCHG\"><input "+((value&4)==4?"CHECKED":"")+" type=checkbox id=\""+nmpref+"RT"+idtag+"ITMDTLFLAG_DAYBALCHG\" name=\""+nmpref+"RT"+idtag+"ITMDTLFLAG_DAYBALCHG\" CALCTYPE=\"DAYBALCHG\" value=4 onclick=\""+(form_style==0?"return false;":"")+this.varname+".dayClmBalAdjustmentUpdate(this)\" \"> Day Claim Balance Adjustment "+(form_style==0?"(Require Permission)":"")+"</div>";
8282				}
8283				if(r[11]==1) {
8284					sitm+="<div class=clsColorNote style=font-size:10px;padding:5px>Note:<br>";
8285					sitm+="- Half monthly wages = maximum wages RM165/- is used for MC calculation<br>";
8286					sitm+="- For period of disability less than 14 days, no compensation is payable for the first 4 days of disability in accordance with Section 4(2)(a) of Workmen Compensation Act 1952.</div>";
8287				}
8288				if(r[11]==8) {
8289					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8290						value=this.ItmsDEFSET[nmri.toUpperCase()].DTVAL1; // coverage period from
8291					else
8292						value=(ir!=null?ir[this.ItmsCol['DTVAL1']]:'');
8293					sitm+="<b>
8293Coverage Period from</b> <input name=\""+nmpref+"RT"+idtag+"DTVAL1\" CHKNAME=\"Coverage Period From\" CHKREQUIRED READONLY onblur=\"ObjDate(this);\" size=15 value=\""+(value!=null?value:'')+"\"> ";
8294					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8295						value=this.ItmsDEFSET[nmri.toUpperCase()].DTVAL2; // coverage period to
8296					else
8297						value=(ir!=null?ir[this.ItmsCol['DTVAL2']]:'');
8298					sitm+="<b>to</b> <input name=\""+nmpref+"RT"+idtag+"DTVAL2\" CHKNAME=\"Coverage Period To\" CHKREQUIRED READONLY onblur=\"ObjDate(this);\" size=15 value=\""+(value!=null?value:'')+"\">";
8299				}
8300				if(r[11]==2||r[11]==4||r[11]==3) {
8301					sitm+="<div><select ORIGVAL="+ratediv+" "+(thisitmdef!=null && typeof(thisitmdef['NVAL2'].REQ)!='undefined' && parseInt(thisitmdef['NVAL2'].REQ)==1?"CHKREQUIRED":"")+" name=\""+nmpref+"RT"+idtag+"RATEDIV\" onchange=\""+    (r[11]==4?this.varname+".popDailyWages(this,this.parentNode.nextSibling.nextSibling.lastChild,this.parentNode.nextSibling.nextSibling.lastChild.childNodes[2].firstChild,this.nextSibling,this.parentNode.nextSibling.childNodes[0]);":"")+(r[11]==3?"this.nextSibling.nextSibling.innerHTML='Rate';":r[11]==4?"this.nextSibling.nextSibling.innerHTML=(this.value==7?'Weekly Rate':'Daily Rate');":"this.nextSibling.innerHTML=(this.value==7?'Weekly Rate: ':'Daily Rate:');")+"DoReq(this);\">";
8302					if(r[11]==3) {
8303						if (thisitmdef!=null && thisitmdef!='' && typeof(thisitmdef['NVAL2']!='undefined') && typeof(thisitmdef['NVAL2'].OPTITEM)!='undefined' && thisitmdef['NVAL2'].OPTITEM!='')
8304							sitm+=JSVCgenOptions(thisitmdef['NVAL2'].OPTITEM,"|",ratediv);
8305						else
8306							sitm+=JSVCgenOptions("| ","|",ratediv);
8307					}
8308					else
8309						sitm+="<option value=1>Daily (7 Days)<option value=-5"+((ratediv==-5)?" SELECTED":"")+">Daily (5 Weekdays)<option value=-5.5"+((ratediv==-5.5)?" SELECTED":"")+">Daily (5.5 Weekdays)<option value=-6"+((ratediv==-6)?" SELECTED":"")+">Daily (6 Weekdays)<option value=7"+((ratediv==7)?" SELECTED":"")+">7-day Week"+(r[11]==4?"<option value=0"+((ratediv==0)?" SELECTED":"")+">Selected Day of Weekends":"");
8310					sitm+="</select>";
8311				}
8312				if (r[11]==4) {
8313					weekendbit=(ir!=null && ir[this.ItmsCol['IVAL1']]!=null?parseInt(ir[this.ItmsCol['IVAL1']]):0);
8314					sitm+="<span style='margin-right:5px;"+(ratediv==0?"display:inline":"display:none")+"' id=\""+nmpref+"RT"+idtag+"CUSWKENDSET\"><input type=\"hidden\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=0><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=1 "+((weekendbit & 1) == 1?"CHECKED":"")+" onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Sunday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=2 "+((weekendbit & 2) == 2?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Monday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=4 "+((weekendbit & 4) == 4?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Tuesday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=8 "+((weekendbit & 8) == 8?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Wednesday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=16 "+((weekendbit & 16) == 16?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Thursday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=32 "+((weekendbit & 32) == 32?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Friday </label><label><input type=\"checkbox\" name=\""+nmpref+"RT"+idtag+"CUSWKEND\" value=64 "+((weekendbit & 64) == 64?"CHECKED":"")+"  onclick=\"this.parentNode.parentNode.previousSibling.onchange()\" > Saturday </label></span>";
8315				}
8316				if(ir!=null&&r[11]==4&&ir[3]!=8&&this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2)!='undefined')
8317					value=this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2;
8318				else if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2)!='undefined')
8319					value=this.ItmsDEFSET[nmri.toUpperCase()].MNVAL2;
8320				else if (ir!=null && ir[8]!=null)
8321					value=ir[8];
8322				else
8323					value='';
8324
8325				flg_optmthwages=(ratediv==7?0:1);
8326				if(ir!=null && typeof(ir[14])!='undefined' && ir[14]!=null  && ir[14]!='' && typeof(ir[15])!='undefined' && ir[15]!=null && ir[15]!='')
8327					flg_showmthwages=1;
8328				else if (ir==null && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL6)!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].VAVAL1)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].NVAL6!=null && this.ItmsDEFSET[nmri.toUpperCase()].VAVAL1!=null)
8329					flg_showmthwages=1;
8330				else
8331					flg_showmthwages=0;
8332				rate=value; // rate amt **=rate
8333
8334				if(thisitmdef==null || (thisitmdef!=null && typeof(thisitmdef['MNVAL2'])!='undefined')) {
8335					slbl=(r[11]==3?'Rate':(r[11]==2||r[11]==4)?(ratediv==7?'Weekly Rate':'Daily Rate'):(r[11]==5?"Weekly Rate":"Monthly Rate"));
8336					if(r[11]==2||r[11]==4||r[11]==1||r[11]==3||r[11]==5)
8337							sitm+="<b style=margin-left:8px>"+slbl+":</b> <input CHKREQUIRED ORIGVAL=\""+value+"\" "+(flg_showmthwages==1?"READONLY":"")+" CHKNAME=\""+slbl+"\" name=\""+nmpref+"RT"+idtag+"RATEVAL\" type=text onblur=\"JSVCCurr(this);"+ (r[11]==1?"if(this.nextSibling.nextSibling!=null) this.nextSibling.nextSibling.value=(this.value!=''?JSVCNumDBtoLOC("+this.varname+".fitmDtlGetHalfMthRate(JSVCNumLOCtoDB(this.value))):'');this.nextSibling.nextSibling.onblur();":"")+"\" maxlength=14 value=\""+(value!=''?JSVCNumDBtoLOC(value):'')+"\">";
8338					}
8339
8340				if(r[11]==1) {
8341					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL4)!='undefined')
8342						value=this.ItmsDEFSET[nmri.toUpperCase()].MNVAL4;
8343					else if (ir!=null && ir[22]!=null)
8344						value=ir[22];
8345					else
8346						value='';
8347					value=(value!=''?JSVCNumDBtoLOC(value):'');
8348					sitm+="<label style=font-weight:bold>&nbsp;&nbsp;Half Monthly Rate: </label><input READONLY CHKREQUIRED CHKNAME=\"Half Monthly Rate\" name=\""+nmpref+"RT"+idtag+"ITMMNVAL4\" type=text onblur=JSVCCurr(this) maxlength=14 value=\""+value+"\">";
8349
8350					/* new object : date started work */
8351					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8352						value=this.ItmsDEFSET[nmri.toUpperCase()].DTVAL1; // date started work
8353					else if (ir!=null && ir[this.ItmsCol['DTVAL1']]!=null)
8354						value=ir[this.ItmsCol['DTVAL1']];
8355					else
8356						value='';
8357					sitm+="<label style=font-weight:bold>&nbsp;&nbsp;Date Started Work: </label><input CHKREQUIRED CHKNAME=\"Date Started Work\" MRMOBJ=CALDATE name=\""+nmpref+"RT"+idtag+"DTVAL1\" type=text onblur=\"ObjDate(this);\" size=10 value=\""+(value!=null?value:'')+"\"> ";
8358
8359
8360					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL12/*NVAL2*/)!='undefined')
8361						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL12;
8362					else if (ir!=null && ir[24]!=null)
8363						value=ir[24];
8364					else
8365						value='';
8366					value=(value!=''?JSVCNumDBtoLOC(value):'');
8367					sitm+="<br><label style=font-weight:bold>&nbsp;&nbsp;Total Day(s): </label><input READONLY CHKNAME=\"Total Day(s)\" name=\""+nmpref+"RT"+idtag+"ITMNVAL12\" type=text onblur=JSVCCurr(this) size=10 maxlength=5 value=\""+value+"\">";
8368
8369					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL11/*NVAL2*/)!='undefined')
8370						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL11;
8371					else if (ir!=null && ir[23]!=null)
8372						value=ir[23];
8373					else
8374						value='';
8375					value=(value!=''?JSVCNumDBtoLOC(value):'');
8376					sitm+="<label style=font-weight:bold>&nbsp;&nbsp;Claimable Day(s): </label><input READONLY CHKNAME=\"Claimable Day(s)\" name=\""+nmpref+"RT"+idtag+"ITMNVAL11\" type=text onblur=JSVCCurr(this) size=10 maxlength=5 value=\""+value+"\">";
8377				} else if (r[11]==3) {
8378					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL3)!='undefined')
8379						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL3;
8380					else if (ir!=null && ir[this.ItmsCol['NVAL3']]!=null)
8381						value=ir[this.ItmsCol['NVAL3']];
8382					else
8383						value='';
8384						value=(value!=''?JSVCNumDBtoLOC(value):'');
8385						sitm+="<label style=font-weight:bold>&nbsp;&nbsp;per </label>";
8386					if (thisitmdef!=null && thisitmdef!='' && typeof(thisitmdef['NVAL3']!='undefined') && typeof(thisitmdef['NVAL3'].TYPE )!='OPT') { /* selection */
8387							sitm+="<select "+(thisitmdef!=null && typeof(thisitmdef['NVAL3'].REQ)!='undefined' && parseInt(thisitmdef['NVAL3'].REQ)==1?"CHKREQUIRED":"")+" name=\""+nmpref+"RT"+idtag+"ITMNVAL3\" onchange=\"DoReq(this);\">";
8388							if (thisitmdef!=null && thisitmdef!='' && typeof(thisitmdef['NVAL3']!='undefined') && typeof(thisitmdef['NVAL3'].OPTITEM)!='undefined' && thisitmdef['NVAL3'].OPTITEM!='')
8389								sitm+=JSVCgenOptions(thisitmdef['NVAL3'].OPTITEM,"|",value);
8390							else
8391								sitm+=JSVCgenOptions("| ","|",value);
8392							sitm+="</select>";
8393					} else /* free text */ {
8394							sitm+="<input name=\""+nmpref+"RT"+idtag+"ITMNVAL3\" type=text onblur=JSVCCurr(this) size=10 maxlength=5 value=\""+value+"\">";
8395						}
8396					}
8397				sitm+="</div>";
8398				if(r[11]==4) {
8399					flag_monthcalc=0;
8400					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].IVAL2)!='undefined')
8401						value=this.ItmsDEFSET[nmri.toUpperCase()].IVAL2;
8402					else if (ir!=null && ir[21]!=null)
8403						value=ir[21];
8404					else
8405						value='';
8406					if(parseInt(value)>0 && (parseInt(value)&2)==2) flag_monthcalc=1; /*bit2 from ival1 : calc based on month instead of year*/
8407					//sitm+="<div style=\"font-weight:bold\" for=\""+nmpref+"RT"+idtag+"ITMDTLFLAG\">
8407<input "+(value==1?"CHECKED":"")+" type=checkbox id=\""+nmpref+"RT"+idtag+"ITMDTLFLAG_SPCARG\" name=\""+nmpref+"RT"+idtag+"ITMDTLFLAG\" CALCTYPE=\"SPCARG\" value=1 onclick=\""+this.varname+".disableQtyFields('"+nmpref+"IT"+idtag+"');\" "+(!(ratediv==1)?"DISABLED":"")+"> Special arrangement on Day Claim<input type=\"hidden\" name=\"sleITMDTLSETFLAG\" value=1></div>";
8408					sitm+="<div style=\"font-weight:bold\" for=\""+nmpref+"RT"+idtag+"ITMDTLFLAG\"><input "+((value&1)==1?"CHECKED":"")+" type=checkbox id=\""+nmpref+"RT"+idtag+"ITMDTLFLAG_SPCARG\" name=\""+nmpref+"RT"+idtag+"ITMDTLFLAG\" CALCTYPE=\"SPCARG\" value=1 onclick=\""+this.varname+".disableQtyFields(this.parentNode.parentNode.parentNode.parentNode.parentNode);\"> Special arrangement on Day Claim<input type=\"hidden\" name=\"sleITMDTLSETFLAG\" value=1></div>";
8409					sitm+='<div'+(flg_optmthwages==1?' style="display:block"':' style="display:none"')+'>';
8410					/* v2 */ sitm+='<input '+(flg_showmthwages==1?'CHECKED':'')+' type="checkbox" name=\''+nmpref+'RT'+idtag+'MWCHK\' id="_showmthwgs" value=1 onclick="this.parentNode.previousSibling.previousSibling.firstChild.onchange();">'; // node 0
8411					sitm+='<span for="_showmthwgs" style="font-weight:bold">&nbsp;Show Monthly Wages (uncheck it if there\'s special arrangement applied for the rate)</span>'; // node 1
8412					sitm+='<div id="CalcMonthlyWages" style="clear:both;margin-bottom:2px;margin-top:2px;display:'+(flg_showmthwages==1?'block':'none')+'">'; // node 2
8413					if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL6)!='undefined')
8414						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL6;
8415					else if (ir!=null && ir[14]!=null)
8416						value=ir[14];
8417					else
8418						value='';
8419					sitm+='<div style="font-weight:bold;margin-bottom:3px"><input '+(flag_monthcalc==1?'CHECKED':'')+' type="checkbox" name="'+nmpref+'RT'+idtag+'ITMDTLFLAG" CALCTYPE="MTHCALC" value=2 onclick="this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();"> Average of Salary Rate will be calculated based on Monthly instead of Yearly</div>';
8420					/* begin CalcMonthlyWages */
8421					sitm+='<div style="float:left;width:12%;font-weight:bold">Days per. Month</div>'; // 1st ch
8422					if(ir!=null&&r[11]==4&&ir[3]!=8&& this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL6)!='undefined') {
8423						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL6;
8424					}
8425					else if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL6)!='undefined')
8426						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL6;
8427					else if (ir!=null && ir[14]!=null)
8428						value=ir[14];
8429					else
8430						value='';
8431					sitm+='<div style="float:left;width:88%"><input readonly '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="Days Per Month" name="'+nmpref+'RT'+idtag+'DPM" CALCTYPE="DPM" type=text size="5" maxlength=3 value=\"'+(value!=null&&value!=''?JSVCNumDBtoLOC(value,0):'')+'\"></div>'; // 2nd ch
8432
8433					if(ir!=null&&r[11]==4&&ir[3]!=8&& this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL6)!='undefined') {
8434						value=this.ItmsDEFSET[nmri.toUpperCase()].VAVAL1;
8435					}
8436					else if(ir==null /* new */ && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()].VAVAL1)!='undefined')
8437						value=this.ItmsDEFSET[nmri.toUpperCase()].VAVAL1;
8438					else if (ir!=null && ir[15]!=null)
8439						value=ir[15];
8440					else
8441						value='';
8442					valuelist=value;
8443					eval("value=["+(value!=''&&value!=''?value:null)+"]");
8444					sitm+='<div style="float:left;width:10%;font-weight:bold">1st Month</div>';
8445					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="1st Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[0])!='undefined'?JSVCNumDBtoLOC(value[0]):'')+'\"></div>';
8446					sitm+='<div style="float:left;width:10%;font-weight:bold">2nd Month</div>';
8447					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="2nd Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[1])!='undefined'?JSVCNumDBtoLOC(value[1]):'')+'\"></div>';
8448					sitm+='<div style="float:left;width:10%;font-weight:bold">3rd Month</div>';
8449					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="3rd Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[2])!='undefined'?JSVCNumDBtoLOC(value[2]):'')+'\"></div>';
8450					sitm+='<div style="float:left;width:10%;font-weight:bold">4th Month</div>';
8451					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="4th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[3])!='undefined'?JSVCNumDBtoLOC(value[3]):'')+'\"></div>';
8452
8453					sitm+='<div style="float:left;width:10%;font-weight:bold">5th Month</div>'
8454					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="5th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[4])!='undefined'?JSVCNumDBtoLOC(value[4]):'')+'\"></div>';
8455					sitm+='<div style="float:left;width:10%;font-weight:bold">6th Month</div>';
8456					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="6th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[5])!='undefined'?JSVCNumDBtoLOC(value[5]):'')+'\"></div>';
8457					sitm+='<div style="float:left;width:10%;font-weight:bold">7th Month</div>';
8458					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="7th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[6])!='undefined'?JSVCNumDBtoLOC(value[6]):'')+'\"></div>';
8459					sitm+='<div style="float:left;width:10%;font-weight:bold">8th Month</div>';
8460					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="8th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[7])!='undefined'?JSVCNumDBtoLOC(value[7]):'')+'\"></div>';
8461
8462					sitm+='<div style="float:left;width:10%;font-weight:bold">9th Month</div>'
8463					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="9th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[8])!='undefined'?JSVCNumDBtoLOC(value[8]):'')+'\"></div>';
8464					sitm+='<div style="float:left;width:10%;font-weight:bold">10th Month</div>';
8465					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="10th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[9])!='undefined'?JSVCNumDBtoLOC(value[9]):'')+'\"></div>';
8466					sitm+='<div style="float:left;width:10%;font-weight:bold">11st Month</div>';
8467					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="11st Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();
8467" maxlength=14 value=\"'+(typeof(value[10])!='undefined'?JSVCNumDBtoLOC(value[10]):'')+'\"></div>';
8468					sitm+='<div style="float:left;width:10%;font-weight:bold">12th Month</div>';
8469					sitm+='<div style="float:left;width:15%"><input '+(flg_showmthwages==0?'DISABLED':'')+' CHKNAME="12th Monthly Wages" name="'+nmpref+'RT'+idtag+'MW" CALCTYPE="MW" type=text onblur="JSVCCurr(this);this.parentNode.parentNode.parentNode.previousSibling.previousSibling.firstChild.onchange();" maxlength=14 value=\"'+(typeof(value[11])!='undefined'?JSVCNumDBtoLOC(value[11]):'')+'\"></div>';
8470					sitm+='<input type="hidden" size=100 name="'+nmpref+'RT'+idtag+'MWVAL" CALCTYPE="MWVAL" '+(valuelist!=null?'value="'+valuelist+'"':'')+'>';
8471					/* end CalcMonthlyWages */
8472					sitm+='</div></div>';
8473
8474					if((ir==null /* new */ || (ir!=null && ir[3]!=8) ) && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8475						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL4; // bal cf (hospitalisation)
8476					else
8477						value=(ir!=null?JSVCNumDBtoLOC(ir[11],2):'');
8478
8479					form_style=0
8480					if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITM_RESETBALCF)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITM_RESETBALCF==1)
8481						form_style=1;
8482					//balcf=value; // bal cf **=balcf
8483					sitm+="<table cellpadding=0 cellspacing=2 width=100% border=0><tr><td>&nbsp;</td><td><b>Hospitalisation</b></td><td><b>Outpatient</b></td></tr>";
8484					sitm+="<tr><td><b>Balance c/f :</b></td><td><input CHKREQUIRED CHKNAME=\"Balance C/F (Hospitalisation)\" name=\""+nmpref+"RT"+idtag+"BALCF_H\" type=text "+(form_style==0?"READONLY":"")+" onblur=JSVC2DP(this) maxlength=4 size=5 value=\""+value+"\"></td>";
8485					if((ir==null /* new */ || (ir!=null && ir[3]!=8) ) && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8486						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL7; // bal cf (outpatient)
8487					else
8488						value=(ir!=null?JSVCNumDBtoLOC(ir[17],2):'');
8489					sitm+="<td><input CHKREQUIRED CHKNAME=\"Balance C/F (Outpatient)\" name=\""+nmpref+"RT"+idtag+"BALCF_O\" type=text "+(form_style==0?"READONLY":"")+" onblur=JSVC2DP(this) maxlength=4 size=5 value=\""+value+"\"></td></tr>";
8490
8491					if((ir==null /* new */ || (ir!=null && ir[3]!=8) ) && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8492						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL5; // bal full ent
8493					else
8494						value=(ir!=null?JSVCNumDBtoLOC(ir[12],2):'');
8495					//balfpent=value; // bal full ent **=balfpent
8496					sitm+="<tr><td><b>Full Pay Entitlement :</b></td><td><input "+(form_style==0?"READONLY":"")+" CHKREQUIRED CHKNAME=\"Full Pay Entitlement\" name=\""+nmpref+"RT"+idtag+"BALFPENT_H\" type=text onblur=JSVC2DP(this) maxlength=4 size=5 value=\""+value+"\"></td>";
8497
8498					if((ir==null /* new */ || (ir!=null && ir[3]!=8) ) && this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined')
8499						value=this.ItmsDEFSET[nmri.toUpperCase()].NVAL8; // bal full ent
8500					else
8501						value=(ir!=null?JSVCNumDBtoLOC(ir[18],2):'');
8502					sitm+="<td><input "+(form_style==0?"READONLY":"")+" CHKREQUIRED CHKNAME=\"Full Pay Entitlement\" name=\""+nmpref+"RT"+idtag+"BALFPENT_O\" type=text onblur=JSVC2DP(this) maxlength=4 size=5 value=\""+value+"\"></td></tr>";
8503					// half pay entitle
8504					value=(ir!=null?ir[10]:"");
8505					sitm+="<tr><td><b>Half Pay Entitlement :</b></td><td colspan=2><select CHKREQUIRED CHKNAME=\"Half Pay Entitlement\" name=\""+nmpref+"RT"+idtag+"FACENTLEFT\"><option value=\"0.66667\" "+(value==0.66667?"SELECTED":"")+">2/3 Pay of Day left x Daily Rate</select></td></tr>";
8506
8507					form_style=0;
8508					if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITM_DAYBALCHG)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITM_DAYBALCHG==1)
8509						form_style=1; // allow change
8510					value=(ir!=null && ir[23]!=null ?JSVCNumDBtoLOC(ir[23],2):"");
8511					sitm+="<tr id=\""+nmpref+"RT"+idtag+"ENTADJDATA\"><td><b>Day Claim Adjustment :</b></td><td><input "+(form_style==0?"READONLY":"")+" CHKREQUIRED CHKNAME=\"Day Claim Adjustment\" name=\""+nmpref+"RT"+idtag+"ITMNVAL11\" type=text onblur=JSVC2DP(this,-999,999) maxlength=4 size=5 value=\""+value+"\"></td>";
8512					value=(ir!=null && ir[24]!=null ?JSVCNumDBtoLOC(ir[24],2):"");
8513					sitm+="<td><input "+(form_style==0?"READONLY":"")+" CHKREQUIRED CHKNAME=\"Day Claim Adjustment\" name=\""+nmpref+"RT"+idtag+"ITMNVAL12\" type=text onblur=JSVC2DP(this,-999,999) maxlength=3 size=5 value=\""+value+"\"></td></tr>";
8514
8515					//Balance Left
8516					value=(ir!=null?JSVCNumDBtoLOC(ir[19],2):'');
8517					sitm+="<tr><td><b>Total Claim Days :</b></td><td><input READONLY CHKNAME=\"Total Claim Days\" name=\""+nmpref+"RT"+idtag+"ENTLEFT_H\" type=text onblur=JSVC2DP(this,0,999) maxlength=4 size=5 value=\""+value+"\"></td>";
8518					value=(ir!=null?JSVCNumDBtoLOC(ir[20],2):'');
8519					sitm+="<td><input READONLY CHKNAME=\"Total Claim Days\" name=\""+nmpref+"RT"+idtag+"ENTLEFT_O\" type=text onblur=JSVC2DP(this,0,999) maxlength=4 size=5 value=\""+value+"\"></td></tr>";
8520
8521					// remarks
8522					value=(ir!=null&&ir[7]!=null?ir[7]:'');
8523					sitm+="<tr><td><b>Remarks :</b></td><td colspan=2><input CHKNAME=\"Remarks\" name=\""+nmpref+"RT"+idtag+"VADESC\" type=text onblur=DoReq(this) maxlength=200 style=width:100% value=\""+value+"\"></td></tr>";
8524
8525					sitm+="</table>";
8526				}
8527				sitm+="</td></tr>";
8528			} // endif : r[11]==2||r[11]==4||r[11]==1||r[11]==8||r[11]==3||r[11]==5
8529			sitm+="</tbody>";
8530			sitm+="<tbody>"; // 2nd tbody for header
8531			// generate data listing for itemize item (showing header)
8532			sitm+="<tr class=clsDetailSmallTitle><td style=width:4ex>No</td>";
8533				r["ITMDTLDEF"]=fs;
8534				for (v=0;v<fs.length;v++) {
8535					sitm+="<td style=text-align:center>"+SVChtm(fs[v].COLNAME)+"</td>";
8536				}
8537			sitm+="<td>Del?</td></tr>";
8538			sitm+="</tbody>";
8539			sitm+="<tbody>"; // 3rd tbody for header
8540			idtlcnt=0;idtlnewcnt=0;idoldlist="";idnewlist="";
8541				for(v=0;v<this.ItmsDtls.DATA.length;v++)
8542				{	idtl=this.ItmsDtls.DATA[v];
8543					if(ir==null /* new */) {
8544						if (idtl[27]==r[0]) // matching with ruleid
8545						{
8546							idtlcnt++;
8547							sitm+=this.genItmDtlStr(idtlcnt,idtl,nmpref+"IT"+idtag+"E"+idtl[1],t);
8548						}
8549					} else { // existing
8550						if(idtl[0]==ir[1]) // this.itmdtl[IITMID] vs this.items[IITMID] ; ir[2]=IRULEID ; itmdtl[0]=IITMID ; itmdtl[27]=iRULEID ; itmdtl[1]=IITMDTLID
8551						{
8552							idtlcnt++;
8553							sitm+=this.genItmDtlStr(idtlcnt,idtl,nmpref+"IT"+idtag+"E"+idtl[1],t);
8554							idoldlist+=(idoldlist==""?"":",")+idtl[1];
8555						} else if(ir!=null && idtl[27]==ir[2]) {
8556							idtlcnt++;
8557							sitm+=this.genItmDtlStr(idtlcnt,idtl,nmpref+"IT"+idtag+"E"+idtl[1],t);
8558						}
8559					}
8560				}
8561			for(v=0;v<this.Itms.DATA.length;v++) // get item total
8562			{
8563				if(idtag==this.Itms.DATA[v][1] && this.Itms.DATA[v][3]==8) {
8564					itmtotal=this.Itms.DATA[v][13];
8565					break;
8566				}
8567			}
8568			sitm+="</tbody>";
8569			sitm+="</table>";
8570			sitm+="<INPUT type=hidden name=\""+nmpref+"IT"+idtag+"OL\" value=\""+idoldlist+"\"><input type=hidden id=\""+nmpref+"IT"+idtag+"TOT\" value=\""+JSVCNumDBtoLOC(itmtotal)+"\"><INPUT type=hidden name=\""+nmpref+"IT"+idtag+"NL\" value=\""+idnewlist+"\"></div></div>";
8571
8572		} // endif : (rAmtType&8)==8
8573		//console.log(nmri.toUpperCase());
8574	}
8575	s+="</table>"+sitm;
8576	s+="<input type=hidden name=\""+nmpref+"rsID\" value=\""+rsID+"\">";
8577	s+="<input type=hidden name=\""+nmpref+"igID\" value=\""+igID+"\">";
8578	s+="<input type=hidden name=\""+nmpref+"newlist\" value=\""+newlist+"\">";
8579	s+="<input type=hidden name=\""+nmpref+"oldlist\" value=\""+oldlist+"\">";
8580	if(oDiv!=null)
8581	{
8582		oDiv.innerHTML=s;
8583		/*oDiv=oDiv.getElementsByTagName('INPUT');
8584		for(idtlcnt=0;idtlcnt<oDiv.length;idtlcnt++) {
8585			MRMPreprocessFormItem(oDiv[idtlcnt],0);
8586		}*/
8587	}
8588
8589	// predefine item details
8590	if(this.IdtlDEFSET!=null) {
8591		for(var itmdef in this.IdtlDEFSET) {
8592			//console.log(this.IdtlDEFSET[itmdef]);
8593			for(v=0;v<this.IdtlDEFSET[itmdef].length;v++) {
8594				//console.log(this.IdtlDEFSET[itmdef][v]);
8595				this.initItmDtlRow(itmdef,this.IdtlDEFSET[itmdef][v]);
8596			}
8597		}
8598	}
8599
8600	this.refreshItmDtl(oDiv); // refresh state of the itmdtl behaviour
8601	return s;
8602}
8603cFITMitms.prototype.refreshItmDtl=function(oDiv) {
8604	var obj=null, objs=null;
8605	/*if(itmdtltype==4)*/
8606		this.disableQtyFields(oDiv); // refresh state of the itmdtl behaviour
8607	obj=oDiv.getElementsByTagName("INPUT");
8608	for(var t2=0;t2<obj.length;t2++) // check every column of the row
8609	{
8610		if(JSVCstrEndWith(obj[t2].id,"ITMDTLFLAG_DAYBALCHG") && objs==null) objs=obj[t2];
8611	}
8612	if(objs!=null) this.dayClmBalAdjustmentUpdate(objs);
8613}
8614cFITMitms.prototype.disableArea=function(obj,dis) {
8615	var obj2,i;
8616	obj.disabled=(dis==1?true:false);
8617	DoReq(obj);
8618	obj2=obj.getElementsByTagName("INPUT");
8619	for(i=0;i<obj2.length;i++) {
8620		obj2[i].disabled=(dis==1?true:false);
8621		DoReq(obj2[i]);
8622	}
8623	obj2=obj.getElementsByTagName("SELECT");
8624	for(i=0;i<obj2.length;i++) {
8625		obj2[i].disabled=(dis==1?true:false);
8626		DoReq(obj2[i]);
8627	}
8628	obj2=obj.getElementsByTagName("TEXTAREA");
8629	for(i=0;i<obj2.length;i++) {
8630		obj2[i].disabled=(dis==1?true:false);
8631		DoReq(obj2[i]);
8632	}
8633}
8634
8635cFITMitms.prototype.dayClmBalAdjustmentUpdate=function(obj) {
8636	var chk=(obj!=null && obj.checked==true?1:0);
8637	var objcelladj;objcell=obj.parentNode, objitm_settings=obj.parentNode.parentNode, objitm_itmdtls=objitm_settings.parentNode.parentNode.parentNode.parentNode;
8638	var objitm_itmdtls_itmlisting=objitm_settings.parentNode.parentNode.parentNode.tBodies[2];
8639	//alert(objitm_itmdtls_itmlisting.innerHTML);
8640	//objitm_itmdtls.style='border:2px solid red';
8641
8642	var objcelladj=this.getObjEndWithId(objitm_settings,'TR','ENTADJDATA',0);
8643	var objratesel=this.getObjEndWithName(objitm_settings,'SELECT','RATEDIV',0);
8644	var objrateval=this.getObjEndWithName(objitm_settings,'INPUT','RATEVAL',0);
8645	var objrmk=this.getObjEndWithName(objitm_settings,'INPUT','VADESC',0);
8646		if(chk==1) {
8647			/*if( objitm_itmdtls_itmlisting.rows.length==0 || confirm(JSVClang("Adjustment on Day Claim Balance will remove the Medical leave items? Click OK to confirm.",29436)) )
8648			{*/
8649				if(objratesel!=null && objratesel.getAttribute('ORIGVAL')!=null && objratesel.getAttribute('ORIGVAL')!='') {
8650					objratesel.value=parseInt(objratesel.getAttribute('ORIGVAL'));
8651					objratesel.onchange();
8652				}
8653				if(objrateval!=null && objrateval.getAttribute('ORIGVAL')!=null && objrateval.getAttribute('ORIGVAL')!='') {
8654					objrateval.value=objrateval.getAttribute('ORIGVAL');
8655					objrateval.onblur();
8656				}
8657				this.disableArea(objcell.nextSibling,1);
8658				this.disableArea(objcell.nextSibling.nextSibling,1);
8659				this.disableArea(objcell.nextSibling.nextSibling.nextSibling,1);
8660				this.disableArea(objcelladj,0);
8661				JSVCshow(objcelladj,1);
8662				JSVCshow(objitm_itmdtls_itmlisting,0);
8663				if(objrmk!=null) {
8664					objrmk.setAttribute('CHKREQUIRED',1);
8665					objrmk.onblur();
8666				}
8667
8668/*				while(objitm_itmdtls_itmlisting.rows.length>0) {
8669				    objitm_itmdtls_itmlisting.deleteRow(0);
8670				}
8671			}
8672			else
8673				obj.checked=false;
8674*/
8675			//obj.nextSibling.nextSibling.nextSibling.style="border:2px solid red";
8676			//JSVCSetDisabledList(new Array(obj.nextSibling.nextSibling.nextSibling),1);
8677			//JSVCSetDisabledList(new Array(obj.nextSibling.nextSibling.nextSibling.nextSibling),1);
8678		} else {
8679			this.disableArea(objcell.nextSibling,0);
8680			this.disableArea(objcell.nextSibling.nextSibling,0);
8681			this.disableArea(objcell.nextSibling.nextSibling.nextSibling,0);
8682			this.disableArea(objcelladj,1);
8683			JSVCshow(objcelladj,0);
8684			JSVCshow(objitm_itmdtls_itmlisting,1);
8685			if(objrmk!=null && objrmk.getAttribute('CHKREQUIRED')!=null) {
8686				objrmk.removeAttribute('CHKREQUIRED');
8687				objrmk.onblur();
8688			}
8689			//JSVCSetDisabledList(new Array(obj.nextSibling.nextSibling.nextSibling),0);
8690			//JSVCSetDisabledList(new Array(obj.nextSibling.nextSibling.nextSibling.nextSibling),0);
8691		}
8692}
8693cFITMitms.prototype.calcCustomWkendBit=function(obj) {
8694	var thebit=0;count=0,i=0,arrret=new Array();
8695	obj=obj.getElementsByTagName('INPUT');
8696	if(obj!=null && obj.length>0) {
8697		for(i=0;i<obj.length;i++) {
8698			if(obj[i].type=='checkbox' && obj[i].disabled==false && obj[i].checked==true)
8699				count++;
8700				thebit=thebit+count;
8701		}
8702	}
8703//alert(count);
8704	arrret['bit']=thebit;
8705	arrret['count']=count;
8706	return arrret;
8707}
8708cFITMitms.prototype.popDailyWages=function(obj1,obj2,obj3,obj4,obj5) { // obj1 = selection of working days basis, obj2 = set of "monthly basis", obj3 = obj's days per month, obj4 = set of day of weekend selection (checkboxs) in span tag, obj5 = chkbox
8709	var orate=obj1.parentNode.lastChild,chk=obj2.parentNode.firstChild.checked,daypermth='',weekendbit,weekendtot,retarr,numworkday;
8710	//if(obj4!=null) obj4.style.display=(obj1.value==0?'inline':'none');
8711	if(obj4!=null) {
8712		if(obj1.value==0) { // custom
8713			obj4.style.display='inline';
8714			JSVCSetDisabledList([obj4],0);
8715			retarr=this.calcCustomWkendBit(obj4);
8716			weekendbit=retarr['bit'];
8717			weekendtot=retarr['count'];
8718		} else {
8719			obj4.style.display='none';
8720			JSVCSetDisabledList([obj4],1);
8721			weekendbit=0;weekendtot=0;
8722		}
8723	}
8724	//alert(weekendbit + ' vs ' +  weekendtot);
8725	if (chk==true)
8726	{
8727		switch (parseFloat(obj1.value))
8728		{
8729			case 1: // 7 working days
8730				daypermth=31;numworkday=7;
8731				break;
8732			case -5: // 5 working days
8733				daypermth=22;numworkday=5;
8734				break;
8735			case -5.5:  // 5.5 working days
8736				daypermth=24;numworkday=5.5;
8737				break;
8738			case -6: // 6 working days
8739				daypermth=26;numworkday=6;
8740				break;
8741			case 0: // custom
8742				switch (parseFloat(7-weekendtot))
8743				{
8744					case 7: // 7 working days
8745						daypermth=31;numworkday=7;break;
8746					case 6: // 6 working days
8747						daypermth=26;numworkday=6;break;
8748					case 5: // 5 working days
8749						daypermth=22;numworkday=5;break;
8750					case 4: // 4 working days
8751						daypermth=16;numworkday=4;break;
8752					case 3: // 3 working days
8753						daypermth=12;numworkday=3;break;
8754					case 2: // 2 working days
8755						daypermth=8;numworkday=2;break;
8756					case 1: // 1 working days
8757						daypermth=4;numworkday=1;break;
8758					default: // 0 working days
8759						daypermth=0;numworkday=0;break;
8760				}
8761				break;
8762			default:
8763				daypermth='';numworkday='';
8764		}
8765		obj3.value=daypermth;
8766		this.calcMonthlyWages(obj2,orate,numworkday,daypermth);
8767	}
8768	flgoptmth=(parseFloat(obj1.value)==7?0:1);
8769	flgshwmth=(flgoptmth==1&&chk==true?1:0);
8770	if(orate!=null) {
8771		orate.readOnly=(flgoptmth==1&&flgshwmth==1?true:false);
8772	}
8773	// enable/disable monthly basis entries
8774	JSVCSetDisabledList(JSVCGetFormElementsArray(obj2.parentNode),(flgoptmth==1?0:1));
8775	JSVCSetDisabledList(JSVCGetFormElementsArray(obj2),(flgshwmth==1?0:1));
8776	JSVCshow(obj2.parentNode,(flgoptmth==1?1:0));
8777	JSVCshow(obj2,(flgshwmth==1?1:0));
8778	/*if(obj5!=null) {
8779		JSVCSetDisabledList(obj5.id,(parseFloat(obj1.value)==1?0:1));
8780	}*/
8781}
8782cFITMitms.prototype.calcMonthlyWages=function(obj1,obj2,numworkday,daypermth) { // obj1 : area consists of monthly salary , obj2 : input value for rate, numworkday : number of working days
8783	var cnt,totmw=0,totcnt=0,totdpm=0,omaxmth,totelem=obj1.getElementsByTagName('INPUT'),arrmw=[],mwval,avgmw,flag_mthcalc=0;
8784	obj1=(totelem!=null?totelem:null);
8785	totelem=(totelem!=null?totelem.length:0);
8786	for(cnt=0;cnt<totelem;cnt++) {
8787		if(obj1[cnt].getAttribute('CALCTYPE')!=null) {
8788			if(obj1[cnt].getAttribute('CALCTYPE').toUpperCase()=='DPM')
8789				totdpm+=(obj1[cnt].value!=''?JSVCNumLOCtoDB(obj1[cnt].value):0);
8790			if(obj1[cnt].getAttribute('CALCTYPE').toUpperCase()=='MTHCALC') /* flag to indicate that the MC claimed based on month rate instead of annual) */
8791				flag_mthcalc=(obj1[cnt].checked==true?1:0);
8792			if(obj1[cnt].getAttribute('CALCTYPE').toUpperCase()=='MW') {
8793				totmw+=(obj1[cnt].value!=''?JSVCNumLOCtoDB(obj1[cnt].value):0);
8794				if (obj1[cnt].value!='') omaxmth=obj1[cnt]; // mark it
8795			}
8796			if(obj1[cnt].getAttribute('CALCTYPE').toUpperCase()=='MWVAL') mwval=obj1[cnt]; // get the obj
8797		}
8798	}
8799	if(totelem>0 && omaxmth!=null)
8800	{
8801		cnt=totelem;
8802		for(cnt=0; cnt<totelem;cnt++) {
8803			if(obj1[cnt].getAttribute('CALCTYPE')!=null && obj1[cnt].getAttribute('CALCTYPE').toUpperCase()=='MW') {
8804				totcnt++;
8805				if (obj1[cnt].value=='') obj1[cnt].value='0.00';
8806				arrmw.push(JSVCNumLOCtoDB(obj1[cnt].value));
8807				if (omaxmth==obj1[cnt]) {
8808					break;
8809				}
8810			}
8811		}
8812	}
8813	if(mwval!=null) {
8814		mwval.value=(arrmw.length>0?arrmw.join(","):'');
8815	} else alert("MRM ERR(-200)");
8816	/*v1 : obj2.value=parseFloat(totmw)/(parseFloat(totdpm)*parseFloat(totcnt));*/
8817	avgmw=parseFloat(totmw)/parseFloat(totcnt);
8818	if(parseInt(flag_mthcalc)==1) /* by month */
8819		obj2.value=parseFloat(avgmw/daypermth);
8820	else
8821		obj2.value=parseFloat(avgmw*/*parseFloat(totcnt)*/12)/(52*parseFloat(numworkday));
8822	obj2.onblur();
8823}
8824cFITMitms.prototype.calcItmDtlJS=function(obj,dataname,formula) {
8825	//alert('begin calcItmDtlJS with '+formula+'...');
8826	/* begin evaluation */
8827	try {
8828			//vaformula='[mnVAL1]=([mnVAL4]<[mnVAL3]?[mnVAL4]:mnVAL3)',
8829			oDEF=new Array();
8830			opentagidx=formula.indexOf('[:');
8831			cntvar=0;limitvar=999;
8832			while(opentagidx>=0 && cntvar<limitvar) {
8833				endtagidx=formula.indexOf(':]');
8834				def=formula.substring(opentagidx+2,endtagidx);
8835				objptr=document.getElementsByName(def); /* objdef[0] as var */
8836				// ... alert(objptr )
8837				if(objptr!=null&&objptr.length>0) objptr=objptr[objptr.length-1];
8838				 //alert('replacing def:'+def + ' vs'  + objptr + ' vs ' + objptr.name);
8839				oDEF.push(objptr);idx=oDEF.length-1;
8840				formula=formula.replace("[:"+def+":]","oDEF["+idx+"]");
8841				// post loop
8842				//alert('post loop for formula:'+formula);
8843				opentagidx=formula.indexOf('[:');
8844				cntvar++;
8845				console.log(oDEF);
8846			}
8847		//alert('evaluate in js='+formula + ' with oDEF:'+oDEF);
8848		//console.log(oDEF);
8849		//alert(oDEF[0].tagName);
8850		//oDEF[0].style.backgroundColor='yellow';
8851		eval(formula);
8852		//alert(oDEF[0].value);
8853	} catch (e) { // error on evaluation
8854		//console.log(oDEF);
8855		alert('MRM608: System Error on '+formula+'\n\n'+ e.message); return false;
8856	}
8857}
8858cFITMitms.prototype.calcItmDtl=function(obj,dataname,formula) {
8859	var arreq,arrstm,objptr,idx,objeq,strtocalc,def,valuefirst,last,limit,cnt,hasinput,objdef;
8860	formula=unescape(formula);
8861	//alert('begin calcItmDtl with '+formula+'...');
8862	if(formula!=null&&formula.substring(0,3)=='JS:') {
8863		//alert(formula.substring(3,formula.length)+'|');
8864		this.calcItmDtlJS(obj,dataname,formula.substring(3,formula.length)); // calc using JS syntax
8865		return;
8866	}
8867	arrstm=formula.split(',');
8868	if (arrstm.length>1) {
8869		for (var i=0;i<arrstm.length;i++) {
8870			cFITMitms.prototype.calcItmDtl(obj,dataname,arrstm[i]);
8871		}
8872	} else { /* only one */
8873		arrstm=formula.split('=');
8874		if(arrstm.length==2) /* must be two */
8875		{
8876			// left object : it comes with bracket "[ ]"
8877			arrstm[0]=arrstm[0].substring(1,arrstm[0].length-1);
8878            objeq=document.getElementsByName(arrstm[0]);
8879
8880            //alert(arrstm[0]);
8881            //alert('formula : '+formula);
8882            if(objeq!=null&&objeq.length>0) {
8883            	objeq=objeq[objeq.length-1]; // get the top stack of the obj
8884            } else {
8885				alert('MRM100: '+JSVClang("Error found! Please contact system administrator for assistance",25740));
8886            }
8887            //right object
8888            strtocalc=arrstm[1];
8889            // replace the formula variable
8890            first=strtocalc.indexOf('[');
8891            cnt=0;limit=99;hasinput=0;
8892            while(first>=0 && cnt<limit) {
8893                last=strtocalc.indexOf(']');
8894                def=strtocalc.substring(first+1,last);
8895				objdef=def.split(';');
8896                objptr=document.getElementsByName(objdef[0]); /* objdef[0] as var */
8897                if(objptr!=null&&objptr.length>0) objptr=objptr[objptr.length-1];
8898                if(objptr.value!='') hasinput=1;
8899//alert(objptr.value);
8900				if(objdef.indexOf('REQCAL')>0 && objptr.value=='') {
8901					hasinput=0;
8902					break;// reset as no input provided, that var require num for calc
8903				}
8904                value=(objptr.value!=''?JSVCNumLOCtoDB(objptr.value):0);
8905                strtocalc=eval("strtocalc.replace(\"["+def+"]\", value)");
8906                first=strtocalc.indexOf('[');
8907                cnt++;
8908            }
8909            // execute the calculation ...
8910            objeq.value=(hasinput==1?JSVCNumDBtoLOC((eval(strtocalc)>=0?eval(strtocalc):0)):'');
8911       } else {
8912			//Something wrong with the formula.
8913			alert('MRM101: '+JSVClang("Error found! Please contact system administrator for assistance",25740));
8914        }
8915    }
8916}
8917cFITMitms.prototype.getExcRate=function(curid,objexecrate)
8918{ // with this.excratesrc, this.excratedt
8919	if(curid>0)
8920	{
8921		var slcUrl;
8922		if(typeof(objexecrate)=='string') {
8923			objexecrate=document.getElementsByName(objexecrate);
8924			objexecrate=(objexecrate!=null&&objexecrate.length>0?objexecrate[objexecrate.length-1]:null);
8925		}
8926		slcUrl = request.webroot+"index.cfm?fusebox=SVCobj&fuseaction=xml_SVCGetExchangeRate&G=0&S="+(this.excratesrc!=''?this.excratesrc:'')+"&D="+encodeURIComponent((this.excratedt!=''?this.excratedt:''))+"&C="+(curid!=''?curid:'')+"&R=1&global=1&" + request.mtoken;
8927		oxmlhttp = MRMHTTPRequest("GET",slcUrl,null,this.getExcRateLoaded,null,null,null,null,objexecrate);
8928	}
8929}
8930cFITMitms.prototype.getExcRateLoaded=function(oxmlhttp,cvfield)
8931{
8932	var x,verified=0;
8933	x = oxmlhttp.responseXML.getElementsByTagName("data");
8934	if(x.length==1)
8935	{
8936		JSVCCleanWhitespace(x[0]);
8937		cvfield.value=x[0].childNodes[1].firstChild.nodeValue;
8938		cvfield.onblur();
8939		verified = x[0].childNodes[2].firstChild.nodeValue;
8940	}else{
8941		alert(JSVClang("No rate available for the selected date or currency.",8415));
8942		cvfield.value=0;
8943		cvfield.onblur();
8944	}
8945}
8946cFITMitms.prototype.genItmDtlStr=function(cnt,aID,nmpref,rule_ord)
8947{	var strhtml,strtmp,strpart,nmri,cnt,col,fs,strwidth,formtype,formchkreq,formdefaultval,formreadonly,formmrmdate,arropt,cntopt,frmitmnm,docalc,itmdtlfml,itmdtlfml_tmpl,cnty,cntmax,attr,cusdp,itmdtltype,objdce,formdtrangeddt1,tmp;
8948	strhtml='';
8949	fs=this.Rules.DATA[rule_ord]["ITMDTLDEF"];
8950	nmri=this.Rules.DATA[rule_ord][2];
8951	itmdtltype=this.Rules.DATA[rule_ord][this.RulesCol["IITMDTLTYPE"]];
8952	itmdtlfml_tmpl=this.Rules.DATA[rule_ord][this.RulesCol["VAFORMULA"]];
8953	itmdtlfml_tmpl=(itmdtlfml_tmpl!=null&&itmdtlfml_tmpl.substring(0,3)!='JS:'?itmdtlfml_tmpl.toUpperCase():itmdtlfml_tmpl);
8954	strhtml += "<tr class=ClsRptTone"+(cnt%2?2:1)+"><td style=width:4ex><input type=input style='background-color:transparent;border:0px;width:20px;text-align:center' READONLY name='"+nmpref+"LINENO' value='"+cnt+"'></td>";
8955	itmdtlfml=itmdtlfml_tmpl;
8956
8957        if(itmdtlfml!=null) {
8958                cnt=0;
8959                for(col=0;col<fs.length;col++)
8960                {
8961                if(fs[col].ITMS[cnt][0]!=''&& itmdtlfml.indexOf(fs[col].ITMS[cnt][0].toUpperCase())>=0) {
8962                    frmitmnm=nmpref+this.RulesFormItmDef[fs[col].ITMS[cnt][0].toUpperCase()];
8963						//alert('before:'+itmdtlfml + '; check with : '+fs[col].ITMS[cnt][0].toUpperCase());
8964						itmdtlfml=itmdtlfml.replace(new RegExp(RegExp.escape("["+fs[col].ITMS[cnt][0].toUpperCase()+"]"),"g"), "["+frmitmnm+"]");
8965						itmdtlfml=itmdtlfml.replace(new RegExp(RegExp.escape("[:"+fs[col].ITMS[cnt][0].toUpperCase()+":]"),"g"), "[:"+frmitmnm+":]");
8966						itmdtlfml=itmdtlfml.replace(new RegExp(RegExp.escape("{"+fs[col].ITMS[cnt][0].toUpperCase()+"}"),"g"), frmitmnm);
8967						//alert('after:'+itmdtlfml);
8968                }
8969            }
8970        }
8971        formshowmins=0;
8972	//alert('itmdtlfml = ' +itmdtlfml);
8973	itmdtlfml=(itmdtlfml!=null?escape(itmdtlfml):itmdtlfml);
8974	for(col=0;col<fs.length;col++)
8975	{	strtmp='';maxwidth=0;
8976		// replace the formula ...
8977		for(cnt=0;cnt<fs[col].ITMS.length;cnt++)
8978		{
8979			strpart='';strwidth=null,cusdp=null;
8980			formtype='TXT'; // default type
8981			frmitmnm=nmpref+this.RulesFormItmDef[fs[col].ITMS[cnt][0].toUpperCase()];
8982			docalc=(itmdtlfml!=null && itmdtlfml.toUpperCase().indexOf(fs[col].ITMS[cnt][0].toUpperCase() >=0)?1:0);
8983			itmdtlidx=this.ItmsDtlsCol[fs[col].ITMS[cnt][0].toUpperCase()];
8984			debug_shownm=0;
8985			/*	[0] as database name,
8986			[1] value,
8987			[2][3] .. [4][5] .. idx from 2 , with pair, idx in even : definition; idx in odd : how does it behave */
8988			// default setting...
8989			formchkreq=null;
8990			formmrmdate=1;
8991			formreadonly=0;
8992			formdtrangeddt1=0;
8993			formmoneyallownegative=0;
8994			formdefaultval=null;
8995
8996
8997			if (this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].ITMDTL_MONEY_ALLOW
8997NEGATIVE)!='undefined' && this.ItmsDEFSET[nmri.toUpperCase()].ITMDTL_MONEY_ALLOWNEGATIVE==1) {
8998				formmoneyallownegative=1;
8999			}
9000			if(typeof(fs[col].ITMS[cnt][2])=='string'   ) // OPT as select option, CHK as checkbox, TXT as textbox (default)
9001			{
9002				cntmax=fs[col].ITMS[cnt].length;
9003				for(cnty=2;cnty<cntmax;cnty+=2) {
9004					attr=fs[col].ITMS[cnt][cnty];
9005					//alert(attr + ' = ' + fs[col].ITMS[cnt][cnty+1]);
9006					if(['OPT','OPT2'].indexOf(attr) > -1 && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null) {
9007						formtype=attr;
9008						arropt=fs[col].ITMS[cnt][cnty+1].split('||'); // return 999|xxxxx -> 999 as value, xxxxx as text
9009
9010						//#26508: [SG] Sompo - Non-Motor - Wica - Change "Hospital / Clinic Name" to ddl
9011						var topt=arropt[0];
9012						if(topt.substring(0,1)=='*')//value define in query in dsp_estitms
9013						{
9014							if (this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()]!='undefined')) {
9015								if (typeof(eval('this.ItmsDEFSET[nmri.toUpperCase()].'+topt.substring(1,topt.length)))!='undefined')
9016									topt=eval('this.ItmsDEFSET[nmri.toUpperCase()].'+topt.substring(1,topt.length));
9017								arropt=topt.split('||');
9018							}
9019						}
9020						strwidth=fs[col].ITMS[cnt][1]; //obtain width from second param in struct
9021					}
9022					else if(attr=='EXCRATE' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null)
9023					{
9024						//arropt[0]: list of value / select options,
9025						//arropt[1]: obj which show the curreny rate
9026						formtype=attr;arropt=new Array();arropt[0]=this.currlist;
9027						arropt[1]=fs[col].ITMS[cnt][cnty+1];arropt[1]=nmpref+this.RulesFormItmDef[arropt[1].toUpperCase()];
9028						// special object..
9029						strpart="<select name=\""+frmitmnm+"\" style=width:100% onchange=\""+this.varname+".getExcRate(this.value,'"+arropt[1]+"')\" >";
9030						strpart+=JSVCgenOptions("||"+arropt[0],"|",(aID==null?"":(aID[itmdtlidx]!=null?parseInt(aID[itmdtlidx]):'')))+"</select>";
9031					}
9032					else if (attr.substring(0,9)=='DATERANGE' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null) {
9033						//arropt [0]: min range of the date; [1]: max range of the date; [2]: default if onfocus
9034						formtype=attr.substring(0,9);
9035						formdtrangeddt1=(attr=='DATERANGEDDT1'?1:formdtrangeddt1); // range of date deduct 1
9036						arropt=fs[col].ITMS[cnt][cnty+1].split('|');
9037						for(cntopt=0;cntopt<arropt.length;cntopt++) {
9038							if(arropt[cntopt]!=null&&arropt[cntopt].substring(0,1)=='*') {
9039								if (this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()]!='undefined')) {
9040									if (typeof(eval('this.ItmsDEFSET[nmri.toUpperCase()].'+arropt[cntopt].substring(1,arropt[cntopt].length)))!='undefined')
9041										arropt[cntopt]=eval('this.ItmsDEFSET[nmri.toUpperCase()].'+arropt[cntopt].substring(1,arropt[cntopt].length));
9042								}
9043							}
9044						}
9045					}
9046					else if(attr=='SHOWMINS' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null) {
9047						formshowmins=fs[col].ITMS[cnt][cnty+1];
9048					}
9049					else if (attr=='MRMDATE' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null) {
9050						formmrmdate=fs[col].ITMS[cnt][cnty+1];
9051					}
9052					else if (attr=='CHKREQUIRED' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null) {
9053						formchkreq='';
9054					}
9055					else if (attr=='READ') {
9056						formreadonly=1;//formtype=attr;
9057					}
9058					else if (attr=='SIZE' && cnty+1<cntmax && fs[col].ITMS[cnt][cnty+1]!=null && fs[col].ITMS[cnt][cnty+1]!='') {
9059						strwidth=fs[col].ITMS[cnt][cnty+1];
9060					}
9061					else if (attr=='DP') { // customize numeric DP
9062						cusdp=fs[col].ITMS[cnt][cnty+1];
9063					}
9064					else if (attr=='FIXEDTEXT') { // Fixed text display
9065						formtype=attr;
9066					}
9067					else if (attr=='PASSED_VAL') { // default value passed from dsp_estitms
9068						formtype=attr;
9069					}
9070					else if (attr=='PASSED_VAL_READ') { // default value passed read onlyfrom dsp_estitms
9071						formtype=attr;
9072					}
9073					else if (attr=='DEFAULTVAL') { // default value
9074						formdefaultval=fs[col].ITMS[cnt][cnty+1];
9075					}
9076				}
9077			}
9078			switch(fs[col].ITMS[cnt][0].toUpperCase())
9079			{
9080				case 'VADESC':
9081				case 'VADESC2':
9082				    if(formtype=='OPT')
9083				    {
9084                        strpart = "<select "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" name=\""+frmitmnm+"\" style=width:100% onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9085                        for(cntopt=0;cntopt<arropt.length;cntopt++) {
9086                            strpart+="<option value=\""+arropt[cntopt].split('|')[0]+"\" "+(arropt[cntopt].split('|')[0]==(aID==null?formdefaultval:""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:''))?"SELECTED":"")+">"+arropt[cntopt].split('|')[1];
9087                        }
9088                        strwidth=(strwidth==null?70:strwidth);
9089				    } else if (formtype == 'OPT2'){
9090                        var control = function (){
9091                            var
9092                            tmp_input = '<input {{txt_attr}}>'
9093                            ,tmp_sel = '<select {{sel_attr}}>{{opts}}</select>'
9094                            ,tmp_opt = '<option {{opt_attr}}>{{opt_label}}</option>'
9095                            ,tmp_opts=''
9096                            for (curropt=0;curropt<arropt.length;curropt++){
9097                                var opt_partials = arropt[curropt].split('|')
9098                                    ,opt_attr = opt_partials[0]==""? '':'value="{{val}}"'.replace(/{{val}}/,opt_partials[0])
9099                                tmp_opts += tmp_opt
9100                                            .replace(/{{opt_label}}/g,opt_partials[1])
9101                                            .replace(/{{opt_attr}}/g,opt_attr)
9102                            }
9103                            return tmp_input
9104                                .replace(/{{txt_attr}}/g,
9105                                    ['name=',frmitmnm
9106                                    ,'value="{{val}}"'.replace(/{{val}}/,aID!=null&&aID[itmdtlidx]!=null?aID[itmdtlidx]:'')
9107                                    ,'style="width:80%"'
9108                                    ,'onblur="DoReq(this);this.setAttribute(\'value\',this.value)"'
9109                                    ].join(" "))
9110                                + tmp_input
9111                                .replace(/{{txt_attr}}/g,
9112                                ['class=clsButton style="width:20%" value="Show" type=button onclick="var el=$(this); if(el.val()==\'Show\'){el.next().show();el.next().next().show();el.val(\'Hide\')}else{el.next().hide();el.next().next().hide();el.val(\'Show\')}"' ]
9113                                )
9114                                +tmp_sel
9115                                .replace(/{{opts}}/g,tmp_opts)
9116                                .replace(/{{sel_attr}}/g,
9117                                    ['name=',frmitmnm+'sel'
9118                                    ,'style="width:80%;display:none" onclick="var self=$(this), textbox = self.prev().prev(); textbox.val(self.val())"'
9119                                    ].join(' '))
9120                        }
9121                        strpart = control()
9122                        strwidth=(strwidth==null?70:strwidth);
9123				    } else if (formtype=='FIXEDTEXT'){
9124				    	strpart = SVChtm(fs[col].ITMS[cnt][1]) + "<input name=\""+frmitmnm+"\" type=hidden value=\"" +SVChtm(fs[col].ITMS[cnt][1]) +"\" onblur
9124=\"this.setAttribute('value',this.value)\" >";
9125				    } else {
9126	                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" name=\""+frmitmnm+"\" style=width:100% maxlength=200 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\" >";
9127	                    strwidth =(strwidth==null?9999:strwidth);
9128				    }
9129					break;
9130				case 'VADESC3':
9131					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+" name=\""+frmitmnm+"\" style=width:95% maxlength=100 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9132					strwidth = (strwidth==null?9999:strwidth);
9133					break;
9134				case 'VADESC4':
9135					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+" name=\""+frmitmnm+"\" style=width:95% maxlength=100 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9136					strwidth = (strwidth==null?9999:strwidth);
9137					break;
9138				case 'VADESC5':
9139					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+" name=\""+frmitmnm+"\" style=width:95% value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9140					strwidth = (strwidth==null?30:strwidth);
9141					break;
9142				case 'DTDATE1':
9143					tmp=null;tmp=(aID!=null&&aID[itmdtlidx]!=null&&aID[itmdtlidx]!=''?aID[itmdtlidx].split(" "):tmp); //[0]:date value , [1]: time value
9144					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formmrmdate==1?" MRMOBJ=CALDATE ":" ")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+(formshowmins==1?" SHOWMINS=1 ":" ")+(formdtrangeddt1==1?" DATERANGEMODE=DDT1 ": " ")+(formtype=='DATERANGE'&&arropt[0]!=''?"DTMIN=\""+arropt[0]+"\" ":"")+" "+(formtype=='DATERANGE'&&arropt[1]!=''?"DTMAX=\""+arropt[1]+"\" ":"")+" name=\""+frmitmnm+"\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>=1?tmp[0]:''):'')))+"\" "+(formtype=='DATERANGE'&&typeof(arropt[2])!='undefined'&&arropt[2]!=''?"onfocus=\"if(this.value=='') {this.value='"+arropt[2]+"';this.select() }\"":"")+" onblur=ObjDate(this);this.setAttribute('value',this.value)>";
9145					if(itmdtltype==3||itmdtltype==9) // with time
9146						strpart+= "<br><input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+" name=\""+frmitmnm+"_TM\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>=2?tmp[1]:''):'')))+"\" onblur=ObjTime24(this);this.setAttribute('value',this.value)>";
9147					strwidth = (strwidth==null?30:strwidth);
9148					break;
9149				case 'DTDATE2':
9150					tmp=null;tmp=(aID!=null&&aID[itmdtlidx]!=null&&aID[itmdtlidx]!=''?aID[itmdtlidx].split(" "):tmp); //[0]:date value , [1]: time value
9151					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formmrmdate==1?" MRMOBJ=CALDATE ":" ")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+(formshowmins==1?" SHOWMINS=1 ":" ")+(formdtrangeddt1==1?" DATERANGEMODE=DDT1 ": " ")+(formtype=='DATERANGE'&&arropt[0]!=''?"DTMIN=\""+arropt[0]+"\" ":"")+" "+(formtype=='DATERANGE'&&arropt[1]!=''?"DTMAX=\""+arropt[1]+"\" ":"")+" name=\""+frmitmnm+"\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>=1?tmp[0]:''):'')))+"\" "+(formtype=='DATERANGE'&&typeof(arropt[2])!='undefined'&&arropt[2]!=''?"onfocus=\"if(this.value=='') {this.value='"+arropt[2]+"';this.select() }\"":"")+" onblur=ObjDate(this);this.setAttribute('value',this.value)>";
9152					if(itmdtltype==3||itmdtltype==9) // with time
9153						strpart+= "<br><input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+" name=\""+frmitmnm+"_TM\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>
9153=2?tmp[1]:''):'')))+"\" onblur=ObjTime24(this);this.setAttribute('value',this.value)>";
9154					strwidth = (strwidth==null?30:strwidth);
9155					break;
9156				case 'DTDATE3':
9157					tmp=null;tmp=(aID!=null&&aID[itmdtlidx]!=null&&aID[itmdtlidx]!=''?aID[itmdtlidx].split(" "):tmp); //[0]:date value , [1]: time value
9158					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formmrmdate==1?" MRMOBJ=CALDATE ":" ")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+(formdtrangeddt1==1?" DATERANGEMODE=DDT1 ": " ")+(formtype=='DATERANGE'&&arropt[0]!=''?"DTMIN=\""+arropt[0]+"\" ":"")+" "+(formtype=='DATERANGE'&&arropt[1]!=''?"DTMAX=\""+arropt[1]+"\" ":"")+" name=\""+frmitmnm+"\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>=1?tmp[0]:''):'')))+"\" "+(formtype=='DATERANGE'&&typeof(arropt[2])!='undefined'&&arropt[2]!=''?"onfocus=\"if(this.value=='') {this.value='"+arropt[2]+"';this.select() }\"":"")+" onblur=ObjDate(this);this.setAttribute('value',this.value)>";
9159					strwidth = (strwidth==null?30:strwidth);
9160					break;
9161				case 'DTDATE4':
9162					tmp=null;tmp=(aID!=null&&aID[itmdtlidx]!=null&&aID[itmdtlidx]!=''?aID[itmdtlidx].split(" "):tmp); //[0]:date value , [1]: time value
9163					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+(formmrmdate==1?" MRMOBJ=CALDATE ":" ")+(formreadonly==1?" READONLY ORIGREADONLY ":" ")+(formdtrangeddt1==1?" DATERANGEMODE=DDT1 ": " ")+(formtype=='DATERANGE'&&arropt[0]!=''?"DTMIN=\""+arropt[0]+"\" ":"")+" "+(formtype=='DATERANGE'&&arropt[1]!=''?"DTMAX=\""+arropt[1]+"\" ":"")+" name=\""+frmitmnm+"\" size=12 maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?(tmp.length>=1?tmp[0]:''):'')))+"\" "+(formtype=='DATERANGE'&&typeof(arropt[2])!='undefined'&&arropt[2]!=''?"onfocus=\"if(this.value=='') {this.value='"+arropt[2]+"';this.select() }\"":"")+" onblur=ObjDate(this);this.setAttribute('value',this.value)>";
9164					strwidth = (strwidth==null?30:strwidth);
9165					break;
9166				case 'VAPNO':
9167				case 'VAPNO2':
9168				    if(formtype=='OPT')
9169				    {
9170                        strpart = "<select "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" name=\""+frmitmnm+"\" style=width:100% onblur=\"DoReq(this);$(this).val(this.value);\">";
9171                        for(cntopt=0;cntopt<arropt.length;cntopt++) {
9172                            strpart+="<option value=\""+arropt[cntopt].split('|')[0]+"\" "+(arropt[cntopt].split('|')[0]==(aID==null?formdefaultval:""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:''))?"SELECTED":"")+">"+arropt[cntopt].split('|')[1];
9173                        }
9174                        strwidth=(strwidth==null?30:strwidth);
9175				    } else {
9176						strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" name=\""+frmitmnm+"\" maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9177						strwidth = (strwidth==null?30:strwidth);
9178					}
9179					break;
9180				/*case 'VAPNO2':
9181					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" name=\""+frmitmnm+"\" maxlength=50 value=\""+(aID==null?"":SVChtm(""+(aID[itmdtlidx]!=null?aID[itmdtlidx]:'')))+"\" onblur=\"DoReq(this);this.setAttribute('value',this.value)\">";
9182					strwidth = (strwidth==null?30:strwidth);
9183					break;*/
9184				case 'MNVAL3':
9185					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9186					strwidth = (strwidth==null?30:strwidth);
9187					break;
9188				case 'NVAL2':
9189					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:40px maxlength=6 value=\""+(aID==null?(formtype=="READ"?"":/*"1"*/""):JSVCNum(aID[itmdtlidx], /* show DP if necessary */ (aID[itmdtlidx]>=0&&Math.floor(aID[itmdtlidx])!=aID[itmdtlidx]?2:0) ))+"\" onblur=JSVCCurr(this);this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+">";
9190					strwidth = (strwidth==null?5:strwidth);
9191					break;
9192				case 'NVAL3':
9193					if(formtype=='PASSED_VAL_READ'){
9194
9195                		if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].NVAL3)!='undefined')
9196                			{default_val = this.ItmsDEFSET[nmri.toUpperCase()].NVAL3;
9197                			default_val=(default_val!=''?JSVCNumDBtoLOC(default_val):"");}
9198                		else
9199                			{default_val = JSVCNumDBtoLOC(null);}
9200
9201                		formreadonly=1;
9202
9203                		strpart = (strpart==""?"<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur="+(cusdp!=null&&cusdp>=0?this.varname+".objToFixed(this,"+cusdp+")":"JSVCCurr(this)")+";this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?default_val:JSVCNumDBtoLOC(aID[itmdtlidx],(cusdp!=null&&cusdp>=0?cusdp:null)))+"\">":strpart);
9204						strwidth = (strwidth==null?30:strwidth);
9205                	}
9206                	else {
9207						strpart = (strpart==""?"<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur="+(cusdp!=null&&cusdp>=0?this.varname+".objToFixed(this,"+cusdp+")":"JSVCCurr(this)")+";this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx],(cusdp!=null&&cusdp>=0?cusdp:null)))+"\">":strpart);
9208						strwidth = (strwidth==null?30:strwidth);
9209					}
9210					break;
9211				case 'NVAL4':
9212					strpart = (strpart==""?"<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this);this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">":strpart);
9213					strwidth = (strwidth==null?30:strwidth);
9214					break;
9215				case 'NVAL5':
9216					strpart = (strpart==""?"<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this);this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">":strpart);
9217					strwidth = (strwidth==null?30:strwidth);
9218					break;
9219				case 'MNVAL1':
9220					strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9221					strwidth = (strwidth==null?30:strwidth);
9222					break;
9223                case 'MNVAL4':
9224                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9225                    strwidth = (strwidth==null?30:strwidth);
9226                    break;
9227                case 'MNVAL5':
9228                    if(formtype=='PASSED_VAL'){
9229
9230                		if(this.ItmsDEFSET!=null && typeof(this.ItmsDEFSET[nmri.toUpperCase()])!='undefined' && typeof(this.ItmsDEFSET[nmri.toUpperCase()].MNVAL5)!='undefined')
9231                			{default_val = this.ItmsDEFSET[nmri.toUpperCase()].MNVAL5;
9232                			default_val=(default_val!=''?JSVCNumDBtoLOC(default_val):"");}
9233                		else
9234                			{default_val = JSVCNumDBtoLOC(null);}
9235
9236                		strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID!=null?JSVCNumDBtoLOC(aID[itmdtlidx]):default_val)+"\">";
9237	                    strwidth = (strwidth==null?30:strwidth);
9238                	}
9239                	else{
9240	                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9241	                    strwidth = (strwidth==null?30:strwidth);
9242                	}
9243                    break;
9244                case 'MNVAL6':
9245                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9246                    strwidth = (strwidth==null?30:strwidth);
9247                    break;
9248                case 'MNVAL7':
9249                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9250                    strwidth = (strwidth==null?30:strwidth);
9251                    break;
9252                case 'MNVAL8':
9253                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9254                    strwidth = (strwidth==null?30:strwidth);
9255                    break;
9256                case 'MNVAL9':
9257                    strpart = "<input "+(formchkreq==null?"":formchkreq!=''?"CHKNAME=\"Highlighted field\" CHKREQUIRED=\""+formchkreq+"\"":"CHKNAME=\"Highlighted field\" CHKREQUIRED")+" "+(formreadonly==1?"READONLY ORIGREADONLY":"")+" name=\""+frmitmnm+"\" style=width:100% onkeypress=\"return "+this.varname+".clkItmDtlEnter(event,this,'"+nmpref+"')\" maxlength=25 onblur=JSVCCurr(this,null,"+(formmoneyallownegative==1?-9999999999:0)+");this.setAttribute('value',this.value);"+(docalc==1?this.varname+".calcItmDtl(this,\""+fs[col].ITMS[cnt][0].toUpperCase()+"\",\""+itmdtlfml+"\")":"")+" value=\""+(aID==null?"":JSVCNumDBtoLOC(aID[itmdtlidx]))+"\">";
9258                    strwidth = (strwidth==null?30:strwidth);
9259                    break;
9260				default:
9261					strpart='';
9262			}
9263			if (strpart!='')
9264				if(fs[col].ITMS.length>1)
9265					strtmp+="<tr><td style=width:20ex>"+SVChtm(fs[col].ITMS[cnt][1])+"</td><td>"+strpart+"</td></tr>"
9266				else
9267					strtmp+=strpart;
9268			/*
9269			if(strwidth>maxwidth)
9270				maxwidth=strwidth;
9271			*/
9272		}
9273		strhtml+="<td style=text-align:center"+(strwidth!=null&&strwidth!=''&&(isNaN(strwidth) || (!isNaN(strwidth)&&strwidth>0&&strwidth<9999))?";width:"+strwidth+(!isNaN(strwidth)?"ex":""):"")+">"+(debug_shownm==1?"OBJ:"+frmitmnm:"");
9274		if(fs[col].ITMS.length>1)
9275			strhtml+="<table cellspacing=0 cellpadding=0 width=100%>"+strtmp+"</table>"
9276		else
9277			strhtml+=strtmp;
9278		strhtml+="</td>";
9279	}
9280	strhtml+="<td style=width:3ex><input name=\""+nmpref+"DL\" value=1 type=checkbox "+(aID!=null&&aID[this.ItmsDtlsCol['ITMDTLSTATUS']]!=null&&parseInt(aID[this.ItmsDtlsCol['ITMDTLSTATUS']])==1?"CHECKED":"")+" onclick=\""+this.varname+".ItmDtlDel(this,this.parentNode.parentNode);\"></td></tr>";
9281
9282	var rowarea=document.createElement("SPAN");
9283	rowarea.innerHTML="<table>"+strhtml+"</table>";
9284	rowarea=rowarea.childNodes[0];
9285	var objdl=rowarea.tBodies[0].rows[rowarea.tBodies[0].rows.length-1].childNodes[rowarea.tBodies[0].rows[rowarea.tBodies[0].rows.length-1].childNodes.length-1].firstChild;
9286	if(objdl.checked==true) {
9287		this.ItmDtlDel(null,objdl.parentNode.parentNode,1);
9288		//objdl.parentNode.removeChild(objdl);
9289		if(!this._config.removeFlag){
9290			objdl.disabled=true;objdl.style.visibility='hidden';
9291		}
9292		strhtml=rowarea.tBodies[0].innerHTML;
9293	}
9294	return strhtml;
9295}
9296cFITMitms.prototype.ItmDtlDel=function(objchk,objrow,disb) {
9297	if(this._config.removeFlag){
9298		var checked=objchk!=null ? objchk.checked : 1;
9299		var color=checked ? 'silver' : 'white';
9300
9301		$(objrow).find('input[origreadonly!=""]').attr('readonly',checked);
9302		$(objrow).find('input:gt(0)').css('background-color',color);
9303		$(objrow).find('input[chkrequired]').attr('chkrequired',!checked).each(function(){
9304			DoReq(this);
9305		});
9306	}else{
9307		if(objchk!=null) {
9308			if(objchk.checked==true)
9309				JSVCSetDisabledList(new Array(objrow),1,objchk.name);
9310			else
9311				JSVCSetDisabledList(new Array(objrow),0,objchk.name);
9312		} else if (disb>=0) {
9313			JSVCSetDisabledList(new Array(objrow),disb);
9314		}
9315	}
9316}
9317cFITMitms.prototype.clkItmDtlEnter=function(ev,o,nmpref)
9318{	var orow;
9319	if(ev.keyCode==13)
9320	{
9321		orow=o.parentNode.parentNode;
9322		if(orow.nextSibling!=null&&orow.nextSibling.tagName=="TR")
9323		{
9324			/*orow.nextSibling.cells[1].firstChild.select();
9325			orow.nextSibling.cells[1].firstChild.focus();*/
9326			orow=orow.nextSibling.cells[1].getElementsByTagName('INPUT')[0];
9327			orow.select();
9328			orow.focus();
9329		} else
9330		{	// Simulate a click on Add
9331			orow.parentNode.parentNode.parentNode.parentNode.nextSibling.firstChild.firstChild.click();
9332		}
9333	}
9334	return true;
9335}
9336cFITMitms.prototype.clkItmDtlWindow=function(ev,o,nmpref,idtag,rule_ord)
9337{	var header,html,oframe,it_id;
9338	var itmdtltype=this.Rules.DATA[rule_ord][11];
9339	var doc_onclick=document.getElementById('itemized_doc_onclick'); // from eclaims est/dsp)estitms
9340	doc_onclick=(doc_onclick!=null && doc_onclick.value!=''? doc_onclick.value : null);
9341	it_id=nmpref+"IT"+idtag;
9342	header = this.Rules.DATA[rule_ord][9];
9343	this.itemisehtml=document.getElementById(it_id+"DIV").innerHTML;
9344	//document.getElementById(it_id+"DIV").innerHTML='';
9345	html = "<div id=divcontainer style=overflow:visible;overflow-x:auto;overflow-y:auto>"+this.itemisehtml+"</div>";
9346	html+="<div style=width:100%;text-align:center>";
9347	html+="<div style=text-align:left;"+(this._config.disableAdd?"display:none":"")+"><input type=button value=\"+ Add\" onclick=\""+this.varname+".clkItmDtlAdd(event,this,'"+it_id+"',"+rule_ord+")\"></div>";
9348	if(doc_onclick!=null)
9349		html+="<input type=button class=clsButton value=\"Documents\" id=\"dlgDoc\" style=width:18ex onclick=\""+doc_onclick+"\"> &nbsp; ";
9350	html+="<input type=button class=clsButton value=\"Calculate\" id=\"dlgCalc\" style=width:15ex onclick=\""+this.varname+".clkItmDtlCalc(event,this,"+rule_ord+")\"> &nbsp; <input type=button class=clsButton value=\"Ok\" id=\"dlgok\" style=width:10ex onclick=\""+this.varname+".clkItmDtlClose(event,this,'"+nmpref+"','"+idtag+"',1,"+rule_ord+")\"> &nbsp; <input type=button class=clsButton value=\"Cancel\" style=width:10ex onclick=\""+this.varname+".clkItmDtlClose(event,this,'"+nmpref+"','"+idtag+"',0,"+rule_ord+")\"></div>";
9351	oframe=JSVCCtxMenuFrame(null,"FRid_"+it_id,header,"990",false,false);
9352	JSVCCtxMenuContent(oframe,html);
9353	JSVCshowCtxMenuEv(ev,oframe,null,2,2);
9354}
9355cFITMitms.prototype.getObjEndWithName=function(obj,tagName,str,idx) { // idx as null = all objects in arrays, idx as 0 or +ve : get object based on idx [+ve]
9356	var objs=obj.getElementsByTagName(tagName), retval=new Array();
9357	if(objs.length>0) {
9358		for(var i=0; i<objs.length ; i++) {
9359			//alert('index '+i+':'+objs[i].id + ' to match with '+ str);
9360			if( JSVCstrEndWith(objs[i].name,str )) {
9361				//alert('push at '+ retval.length);
9362				retval.push(objs[i]);
9363				if(retval.length>=idx)
9364					break;
9365			}
9366		}
9367	}
9368	if (retval.length==0)
9369		return null
9370	else if (retval.length>0 && idx>=0)
9371		return retval[idx];
9372	else
9373		return retval;
9374}
9375cFITMitms.prototype.getObjEndWithId=function(obj,tagName,str,idx) { // idx as null = all objects in arrays, idx as 0 or +ve : get object based on idx [+ve]
9376	var objs=obj.getElementsByTagName(tagName), retval=new Array();
9377	if(objs.length>0) {
9378		for(var i=0; i<objs.length ; i++) {
9379			//alert('index '+i+':'+objs[i].id + ' to match with '+ str);
9380			if( JSVCstrEndWith(objs[i].id,str )) {
9381				//alert('push at '+ retval.length);
9382				retval.push(objs[i]);
9383				if(retval.length>=idx)
9384					break;
9385			}
9386		}
9387	}
9388	if (retval.length==0)
9389		return null
9390	else if (retval.length>0 && idx>=0)
9391		return retval[idx];
9392	else
9393		return retval;
9394}
9395cFITMitms.prototype.initItmDtlRow=function(itmdef,oDefIDtl)
9396{
9397	var oM=$("DIV[INTIDTLITMDEF='"+itmdef+"']");
9398	var oC=$("DIV[INTIDTLITMDEF='"+itmdef+"']").children();
9399	var oE=$("DIV[INTIDTLITMDEF='"+itmdef+"']").children().children();
9400
9401	var IDTL_nmpref=$(oM).attr("INTIDTL_NMPREF");
9402	var IDTL_idtag=$(oM).attr("INTIDTL_IDTAG");
9403
9404	var prefixIDTL=$(oM).attr("INTIDTLPREFIX"); // it_id
9405	var rule_ord=$(oM).attr("INTIDTLRULEORDER");
9406	var tot,obj;
9407	// oDefIDtl
9408	if(oC!=null && oC.length>0) {
9409		this.clkItmDtlAdd(null,oC[0],prefixIDTL,rule_ord,oDefIDtl);
9410	}
9411	if(oE!=null && oE.length>0) {
9412
9413		/*
9414		otbl=tbldiv.firstChild.firstChild;
9415		otbl.style='border:3px yellow solid';
9416			tot=0.0;
9417			tot=this.fitmItmDtlCalc(ev,otbl,rule_ord); // rule_ord is the idx of the rule (table's row)
9418
9419		tbldiv.firstChild.lastChild.previousSibling.value=(tot!=null?JSVCNumDBtoLOC(tot):'');
9420		// Replace old DIV with edited copy from frame
9421		JSVCFormSetDOMValues(tbldiv);
9422		odiv=document.getElementById(nmpref+"IT"+idtag+"DIV");
9423		odiv.innerHTML=tbldiv.innerHTML;
9424		tbldiv.innerHTML="";
9425		alert(nmpref + ' vs ' + idtag); // MI5427WS vs 7889
9426		this.updItmState(nmpref,idtag,null,rule_ord);
9427
9428
9429
9430		tot=this.fitmItmDtlCalc(null,oE[0],rule_ord);
9431		oE[0].firstChild.lastChild.previousSibling.value=(tot!=null?JSVCNumDBtoLOC(tot):'');
9432		JSVCFormSetDOMValues(oE[0]);
9433		this.updItmState(nmpref,idtag,null,rule_ord);
9434		*/
9435
9436
9437		tot=this.fitmItmDtlCalc(null,oE[0],rule_ord);
9438		if(tot>=0) {
9439			$("input[name='"+IDTL_nmpref+'ITA'+IDTL_idtag+"']").val(JSVCNumDBtoLOC(tot));
9440			JSVCFormSetDOMValues($("input[name='"+IDTL_nmpref+'ITA'+IDTL_idtag+"']")[0].parentNode);
9441			$("input[name='"+IDTL_nmpref+'IT'+IDTL_idtag+"']").val(JSVCNumDBtoLOC(tot));
9442			JSVCFormSetDOMValues($("input[name='"+IDTL_nmpref+'IT'+IDTL_idtag+"']")[0].parentNode);
9443			$("input[name='"+IDTL_nmpref+'IT'+IDTL_idtag+"']").blur();
9444		}
9445	}
9446
9447}
9448cFITMitms.prototype.clkItmDtlAdd=function(ev,o,it_id,rule_ord,oDefIDtl)
9449{
9450	var odiv,otb,cnt,or,otmp,objf,objdadj;
9451	var itmdtltype=this.Rules.DATA[rule_ord][11];
9452	// Deduce current count
9453	if(oDefIDtl!=null)
9454		odiv=o; // predefined data
9455	else if(o.tagName=="TR")
9456		odiv=o.parentNode.parentNode.parentNode
9457	else
9458		odiv=o.parentNode.parentNode.previousSibling.firstChild;
9459	//odiv.style='border:5px solid red';
9460	if(itmdtltype==4) {
9461		objdadj=this.getObjEndWithId(odiv,'INPUT','DAYBALCHG',0);
9462		if(objdadj!=null && objdadj.checked==true) return 0;
9463	}
9464
9465	otb=odiv.firstChild.tBodies[2]; //3rd
9466	//otb.style='border:5px solid green';
9467	//alert(otb.id + ' vs'  + otb.name);
9468	cnt=parseInt(otb.rows.length>0?otb.rows[otb.rows.length-1].firstChild.firstChild.value:0);	// get the no. at col 1
9469	cnt+=1; // new num.
9470	// Create new TR and append it
9471	//alert(it_id+"EN"+cnt,rule_ord);
9472	or=JSVCcreateTBODY(this.genItmDtlStr(cnt,null,it_id+"EN"+cnt,rule_ord)).firstChild;
9473	otb.appendChild(or);
9474	// Add new child to the list
9475	odiv.lastChild.value+=(odiv.lastChild.value==""?"":",")+"N"+cnt;
9476	// get the first element of the form object
9477	objf=or.cells[1].getElementsByTagName('INPUT')[0];
9478	if(objf==null) {
9479        objf=or.cells[1].getElementsByTagName('SELECT')[0];
9480	}
9481    if(objf!=null) {
9482        objf.focus();/*.firstChild.focus();*/
9483    }
9484	objf=or.getElementsByTagName('INPUT');
9485	for (cnt=0; cnt<objf.length; cnt++) {
9486		MRMPreprocessFormItem(objf[cnt],0);
9487	}
9488	objf=or.getElementsByTagName('SELECT');
9489	for (cnt=0; cnt<objf.length; cnt++) {
9490		MRMPreprocessFormItem(objf[cnt],0);
9491	}
9492	odiv=document.getElementById('divcontainer');
9493	if(odiv!=null) odiv.scrollTop = odiv.scrollHeight;
9494	if(itmdtltype==4) {
9495		this.disableQtyFields(odiv.firstChild);
9496	}
9497
9498	/* oDefIDtl */
9499	//oDefIDtl={ "VADESC":"test 1", "NVAL2":"1", "MNVAL1":"220.00" };
9500	if(oDefIDtl!=null) {
9501		for (key in oDefIDtl) {
9502			$(or).find("[name$='"+this.RulesFormItmDef[key]+"']").each(function() {
9503				$(this).val(oDefIDtl[key]);
9504				this.onblur();
9505			});
9506		}
9507	}
9508
9509}
9510cFITMitms.prototype.disableQtyFields=function(pf) {
9511	var objsel=pf,objidx=new Array(),objchk,i;
9512	if(objsel!=null) {
9513		objsel=objsel.getElementsByTagName('INPUT');
9514		for(i=0;i<objsel.length;i++) {
9515			if(JSVCstrEndWith(objsel[i].name,"ITMDTLFLAG") && objsel[i].getAttribute('CALCTYPE')!=null && objsel[i].getAttribute('CALCTYPE')=='SPCARG') objchk=objsel[i];
9516			if(JSVCstrEndWith(objsel[i].name,"QT")) objidx.push(objsel[i]);
9517		}
9518		if(objchk!=null && objidx!=null) {
9519			for(i=0;i<objidx.length;i++) {
9520				objidx[i].readOnly=(objchk.disabled==false&&objchk.checked==true?false:true);
9521				objidx[i].style.backgroundColor=(objidx[i].readOnly==true?'silver':'');
9522			}
9523		}
9524	}
9525}
9526
9527cFITMitms.prototype.updItmState=function(nmpref,idtag,osel,rule_ord,newval,newname)
9528{
9529	var osel,sel,on,o_it,o_ita,o_ic,o_itmdiv,otot,tot,orate,rate;
9530	if(osel==null)
9531	{	// If osel not passed in, lookup by name
9532		osel=document.getElementsByName(nmpref+"IS"+idtag);
9533		if(osel==null||osel.length==0)return;
9534		osel=osel[0];
9535	}
9536	if(newval!=null)
9537	{	osel.value=newval;
9538		osel.nextSibling.value=newname+" "+String.fromCharCode(9660);
9539	}
9540	sel=osel.value;
9541	on=osel.previousSibling.previousSibling;
9542	if(on!=null && on.tagName=="SPAN" && on.id=="RATE")
9543	{	on.style.display=(sel=="2"?"inline":"none");on=on.previousSibling;	}
9544	if(on!=null && on.tagName=="SPAN" && on.id=="ITEMS")
9545	{	on.style.display=(sel=="8"?"inline":"none");on=on.previousSibling;	}
9546	// get amount input obj and set enable/disable
9547	o_it=document.getElementsByName(nmpref+"IT"+idtag);
9548	o_ita=document.getElementsByName(nmpref+"ITA"+idtag);
9549	o_ic=document.getElementsByName(nmpref+"CV"+idtag);
9550	if(o_it==null||o_it.length==0)return;
9551	o_it=o_it[0];
9552	if(o_ita==null||o_ita.length==0)return;
9553	o_ita=o_ita[0];
9554	if(o_ic==null||o_ic.length==0)return;
9555	o_ic=o_ic[0];
9556	o_it.readOnly=(sel=="0"||sel=="2"||sel=="8"?true:false);
9557	o_it.style.backgroundColor=(sel=="0"||sel=="2"||sel=="8"?"silver":"");
9558	//o_ita.value=""; // set empty
9559
9560	if(sel=="2")
9561	{	// rate type
9562		JSVCRateInputChg(nmpref+"RT"+idtag);
9563	}
9564	else if(sel=="8")
9565	{	// itemize type - read off the totals
9566		o_itmdiv=document.getElementById(nmpref+"IT"+idtag+"DIV");
9567		if(o_itmdiv!=null)
9568		{
9569			if(this.Rules.DATA[rule_ord][11]==2 || this.Rules.DATA[rule_ord][11]==4) /* replace the day rate amt */
9570			{
9571				// Update rate
9572				rate=document.getElementsByName(nmpref+"RT"+idtag+"RATEVAL");
9573				rate=(rate!=null&&rate.length>0?rate[0].value:null);
9574				orate=document.getElementsByName(nmpref+"RT"+idtag+"RATE")[0];
9575				orate.value=rate;
9576				//JSVCRateInputChg(nmpref+"RT"+idtag);
9577			}
9578			otot=o_itmdiv.firstChild.lastChild.previousSibling; // totals object
9579			if(otot!=null)
9580			{
9581				//o_it.value=otot.value;
9582				o_ita.value=otot.value;
9583				//JSVCCurr(o_ita);
9584			}
9585		}
9586	}
9587	this.fitmItmLimitTot(nmpref,idtag);
9588}
9589
9590cFITMitms.prototype.fitmItmLimitTot=function(nmpref,idtag) {
9591	var o_it=document.getElementsByName(nmpref+"IT"+idtag);
9592	var o_ita=document.getElementsByName(nmpref+"ITA"+idtag);
9593	var o_ic=document.getElementsByName(nmpref+"CV"+idtag);
9594	var osel=document.getElementsByName(nmpref+"IS"+idtag),sel;
9595	if(o_it==null||o_it.length==0)return;
9596	o_it=o_it[0];
9597	if(o_ita==null||o_ita.length==0)return;
9598	o_ita=o_ita[0];
9599	if(o_ic==null||o_ic.length==0)return;
9600	o_ic=o_ic[0];
9601	if(osel==null||osel.length==0)return;
9602	osel=osel[0];
9603	sel=osel.value;
9604
9605	if(sel=='1') {
9606		o_ita.value=o_it.value;
9607	} else if((sel=='2' || sel=='8')) {
9608		o_it.value=o_ita.value;
9609		if(o_ic.value!='') {
9610	        if(JSVCNumLOCtoDB(o_ita.value)>JSVCNumLOCtoDB(o_ic.value)) {
9611				o_it.value=o_ic.value;
9612				//o_ita.value=o_it.value;
9613	            //o_it.value=o_ic.value;
9614	        }
9615		}
9616    }
9617}
9618
9619cFITMitms.prototype.listMoveUp=function(obj) {
9620//  var objli=obj.parentNode.parentNode; // LI
9621    var objli=obj;
9622    var objul=objli.parentNode; // ul
9623
9624    if(objli!=objul.firstChild) {
9625		jQuery(obj).prev().before(jQuery(obj));
9626    }
9627}
9628
9629cFITMitms.prototype.fitmItmDtlDateOverlap=function(otbl) {
9630	var t,cur_rowitms,chk_rowitms,t2,itmdtl_dt1,itmdtl_dt2,itmdtl_dt1_chk,itmdtl_dt2_chk,t3,itmdtl_lineno,count,y,ochk;
9631	var itmdtl_dt1_chk,itmdtl_dt2_chk,rechk=0,tmp;
9632	var itmdtl_dt3,itmdtl_dt4,itmdtl_dl, itmdtl_dl_chk;
9633	var itmdtl_pn2,itmdtl_pn2_chk,orow,singlehalfdaybit=0, singlehalfdaybit_chk=0;  /* bit 1 : half day morning, bit 2: half day evening */;
9634	var itmdtl_mcno, itmdtl_mcno_chk, itmdtl_op;
9635	var op_period_from, op_period_to;
9636	otbl=(otbl!=null&&otbl.tBodies[2]!=null?otbl.tBodies[2]:null);
9637	if(!(otbl!=null && otbl.rows!=null && otbl.rows.length>0)) return;
9638
9639	for(y=0;y<otbl.rows.length;y++) {
9640		for(t=0;t<otbl.rows.length-1;t++) {
9641			orow=otbl.rows[t];
9642			cur_rowitms=orow.getElementsByTagName("INPUT");
9643			itmdtl_dt1=null;itmdtl_dt2=null;itmdtl_pn2=null;itmdtl_dl=null;
9644			for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
9645			{
9646				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=cur_rowitms[t2];
9647				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=cur_rowitms[t2];
9648				if(JSVCstrEndWith(cur_rowitms[t2].name,"DL") && itmdtl_dl==null) itmdtl_dl=cur_rowitms[t2];
9649			}
9650			cur_rowitms=orow.getElementsByTagName("SELECT");
9651			for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
9652			{
9653				if(JSVCstrEndWith(cur_rowitms[t2].name,"PN2") && itmdtl_pn2==null) itmdtl_pn2=cur_rowitms[t2];
9654			}
9655			if(itmdtl_dl!=null && itmdtl_dl.disabled==false /* not valid for read only itm dtl */  && itmdtl_dt1!=null && itmdtl_dt2!=null && itmdtl_pn2!=null && itmdtl_dt1.value!='' && itmdtl_dt2.value!='' && itmdtl_pn2.value!='') {
9656				// swap between dates
9657				if(!(CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt2.value).getTime())) { // swap value
9658					tmp=itmdtl_dt1.value;
9659					itmdtl_dt1.value=itmdtl_dt2.value;
9660					itmdtl_dt2.value=tmp;
9661				}
9662				ochk=orow.nextSibling;
9663				chk_rowitms=ochk.getElementsByTagName("INPUT");
9664				itmdtl_dt1_chk=null;itmdtl_dt2_chk=null;itmdtl_pn2_chk=null;
9665				for(t2=0;t2<chk_rowitms.length;t2++)
9666				{
9667					if(JSVCstrEndWith(chk_rowitms[t2].name,"DT1") && itmdtl_dt1_chk==null) itmdtl_dt1_chk=chk_rowitms[t2];
9668					if(JSVCstrEndWith(chk_rowitms[t2].name,"DT2") && itmdtl_dt2_chk==null) itmdtl_dt2_chk=chk_rowitms[t2];
9669				}
9670				chk_rowitms=ochk.getElementsByTagName("SELECT");
9671				for(t2=0;t2<chk_rowitms.length;t2++)
9672				{
9673					if(JSVCstrEndWith(chk_rowitms[t2].name,"PN2") && itmdtl_pn2_chk==null) itmdtl_pn2_chk=chk_rowitms[t2];
9674				}
9675
9676				if(itmdtl_dt1_chk!=null && itmdtl_dt2_chk!=null && itmdtl_pn2_chk!=null && itmdtl_dt1_chk.value!='' && itmdtl_dt2_chk.value!='' && itmdtl_pn2_chk.value!='')  {
9677					moveflag=0;
9678					//alert('check row at '+t3+':itmdtl_pn2 at value='+itmdtl_pn2.value+', itmdtl_pn2_chk at value='+itmdtl_pn2_chk.value );
9679					curlvl=(itmdtl_pn2.value.toUpperCase()=='AM'?2:itmdtl_pn2.value.toUpperCase()=='PM'?3:1);
9680					curlvl_chk=(itmdtl_pn2_chk.value.toUpperCase()=='AM'?2:itmdtl_pn2_chk.value.toUpperCase()=='PM'?3:1);
9681					//alert('curlvl : ' +curlvl +  ' vs ' + curlvl_chk);
9682					if( (curlvl==2 || curlvl==3) && curlvl_chk==1 && CalParseDate(itmdtl_dt1_chk.value).getTime()==CalParseDate(itmdtl_dt1.value).getTime() )
9683						moveflag=1;
9684					else if(CalParseDate(itmdtl_dt1.value).getTime()>CalParseDate(itmdtl_dt1_chk.value).getTime())
9685						moveflag=1;
9686					if(moveflag==1) {
9687						this.listMoveUp(ochk);
9688					} /*else {
9689						break;
9690					}*/
9691
9692				}
9693
9694
9695			} // end if : itmdtl_dt1
9696
9697		} // end for t=0
9698	} // end for y=0
9699
9700	// rearrange order
9701	count=0;
9702	for(t=0;t<otbl.rows.length;t++) {
9703		cur_rowitms=otbl.rows[t];
9704		cur_rowitms=cur_rowitms.getElementsByTagName("INPUT");
9705		itmdtl_lineno=null;
9706		for(t2=0;t2<cur_rowitms.length;t2++)
9707		{
9708			if(JSVCstrEndWith(cur_rowitms[t2].name,"LINENO") && itmdtl_lineno==null) itmdtl_lineno=cur_rowitms[t2];
9709		}
9710		if(itmdtl_lineno!=null) {
9711			count++;
9712			itmdtl_lineno.value=count;
9713			otbl.rows[t].className='ClsRptTone'+(count%2?2:1);
9714		}
9715	}
9716
9717	// define overlap period based on active listing
9718	for(y=0;y<otbl.rows.length;y++) {
9719			orow=otbl.rows[y];
9720			cur_rowitms=orow.getElementsByTagName("INPUT");
9721			itmdtl_dt1=null;itmdtl_dt2=null;itmdtl_dt3=null;itmdtl_dt4=null;itmdtl_pn2=null;itmdtl_dl=null;itmdtl_mcno=null;itmdtl_op=null;
9722			for(t2=0;t2<cur_rowitms.length;t2++)
9723			{
9724				// mc period
9725				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=cur_rowitms[t2];
9726				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=cur_rowitms[t2];
9727				// overlapping period
9728				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT3") && itmdtl_dt3==null) itmdtl_dt3=cur_rowitms[t2];
9729				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT4") && itmdtl_dt4==null) itmdtl_dt4=cur_rowitms[t2];
9730				if(JSVCstrEndWith(cur_rowitms[t2].name,"DS5") && itmdtl_op==null) itmdtl_op=cur_rowitms[t2];
9731				// delete checkbox
9732				if(JSVCstrEndWith(cur_rowitms[t2].name,"DL") && itmdtl_dl==null) itmdtl_dl=cur_rowitms[t2];
9733				if(JSVCstrEndWith(cur_rowitms[t2].name,"DS") && itmdtl_mcno==null) itmdtl_mcno=cur_rowitms[t2];
9734			}
9735			cur_rowitms=orow.getElementsByTagName("SELECT");
9736			for(t2=0;t2<cur_rowitms.length;t2++)
9737			{
9738				if(JSVCstrEndWith(cur_rowitms[t2].name,"PN2") && itmdtl_pn2==null) itmdtl_pn2=cur_rowitms[t2];
9739			}
9740
9741			/** begin checking through list of the periods **/
9742			//alert('checking on '+ itmdtl_mcno.value);
9743
9744			if(itmdtl_dl!=null && itmdtl_dl.disabled==false /* disabled is used for reference only */ && itmdtl_dt1!=null && itmdtl_dt2!=null && itmdtl_pn2!=null && itmdtl_dt1.value!='' && itmdtl_dt2.value!='' && itmdtl_pn2.value!='' && itmdtl_op!=null)
9745			{
9746				itmdtl_op.value=''; // reset
9747
9748				singlehalfdaybit=0;op_period_from='', op_period_to='';/*itmdtl_dt3.value='';itmdtl_dt4.value='';*/ // reset
9749				// checking overlapping for each editable row
9750				for (t3=0;t3<y;t3++) {
9751					orow=otbl.rows[t3];
9752					chk_rowitms=orow.getElementsByTagName("INPUT");
9753					itmdtl_dt1_chk=null;itmdtl_dt2_chk=null;itmdtl_pn2_chk=null;itmdtl_mcno_chk=null; singlehalfdaybit_chk=null; itmdtl_dl_chk=null;
9754					for(t2=0;t2<chk_rowitms.length;t2++)
9755					{
9756						if(JSVCstrEndWith(chk_rowitms[t2].name,"DT1") && itmdtl_dt1_chk==null) itmdtl_dt1_chk=chk_rowitms[t2];
9757						if(JSVCstrEndWith(chk_rowitms[t2].name,"DT2") && itmdtl_dt2_chk==null) itmdtl_dt2_chk=chk_rowitms[t2];
9758						if(JSVCstrEndWith(chk_rowitms[t2].name,"DS") && itmdtl_mcno_chk==null) itmdtl_mcno_chk=chk_rowitms[t2];
9759						if(JSVCstrEndWith(chk_rowitms[t2].name,"DL") && itmdtl_dl_chk==null) itmdtl_dl_chk=chk_rowitms[t2];
9760					}
9761					chk_rowitms=orow.getElementsByTagName("SELECT");
9762					for(t2=0;t2<chk_rowitms.length;t2++)
9763					{
9764						if(JSVCstrEndWith(chk_rowitms[t2].name,"PN2") && itmdtl_pn2_chk==null) itmdtl_pn2_chk=chk_rowitms[t2];
9765					}
9766
9767					//alert('checking overlapping:'+ itmdtl_dt1.value +' + '+ itmdtl_dt2.value + ' / '+ itmdtl_dt3.value+' + '+ itmdtl_dt4.value +'   .. comparing with ..   '+itmdtl_dt1_chk.value + ' vs '+itmdtl_dt2_chk.value );
9768					//alert('checking overlapping:'+ itmdtl_mcno.value +' .. comparing .. '+ itmdtl_mcno_chk.value);
9769					// begin : verifying overlapping dates
9770
9771					if( itmdtl_dl_chk!=null && itmdtl_dl_chk.disabled==false && itmdtl_dt1_chk!=null && itmdtl_dt2_chk!=null && itmdtl_pn2_chk!=null && itmdtl_dt1_chk.value!='' && itmdtl_dt2_chk.value!='' && itmdtl_pn2_chk.value!='') {
9772														if( (itmdtl_pn2.value=='AM' || itmdtl_pn2.value=='PM') ) // row checking, whether it's half day claim, if overlapping period identified, skip checking and preceed for next row
9773														{
9774															if( op_period_from=='' && op_period_to=='' && CalParseDate(itmdtl_dt1.value).getTime()==CalParseDate(itmdtl_dt2.value).getTime() && CalParseDate(itmdtl_dt1_chk.value).getTime()<=CalParseDate(itmdtl_dt1.value).getTime() && CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt2_chk.value).getTime()  )
9775															{
9776																singlehalfdaybit=(itmdtl_pn2.value.toUpperCase()=='AM'?1:itmdtl_pn2.value.toUpperCase()=='PM'?2:3);
9777																singlehalfdaybit_chk=(itmdtl_pn2_chk.value.toUpperCase()=='AM'?1:itmdtl_pn2_chk.value.toUpperCase()=='PM'?2:3);
9778																if((singlehalfdaybit&singlehalfdaybit_chk)>0) { // overlapping occured for half day.
9779																	op_period_from=itmdtl_dt1.value;op_period_to=itmdtl_dt2.value;
9780																}
9781															}
9782														}
9783														else // full day
9784														{
9785															// left
9786															if(CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt1_chk.value).getTime() && CalParseDate(itmdtl_dt1_chk.value).getTime()<=CalParseDate(itmdtl_dt2.value).getTime()) {
9787																// [C][R..] .. [C]
9788																if(op_period_from!=''&&op_period_to!='') { //overlapping?
9789																	if(CalParseDate(itmdtl_dt1_chk.value).getTime()<=CalParseDate(op_period_from).getTime())
9790																		op_period_from=itmdtl_dt1_chk.value;
9791																} else {
9792																	op_period_from=itmdtl_dt1_chk.value;
9793																}
9794															} else if (CalParseDate(itmdtl_dt1_chk.value).getTime()<=CalParseDate(itmdtl_dt1.value).getTime() && CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt2_chk.value).getTime() ) {
9795																if(op_period_from!=''&&op_period_to!='') { //overlapping?
9796																	if(CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(op_period_from).getTime())
9797																		op_period_from=itmdtl_dt1.value;
9798																} else {
9799																	op_period_from=itmdtl_dt1.value;
9800																}
9801															}
9802															// right
9803															if(CalParseDate(itmdtl_dt2_chk.value).getTime()<=CalParseDate(itmdtl_dt2.value).getTime() && CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt2_chk.value).getTime()) {
9804																// [C][R..] .. [C]
9805																if(op_period_from!=''&&op_period_to!='') { //overlapping?
9806																	if(CalParseDate(op_period_to).getTime()<=CalParseDate(itmdtl_dt2_chk.value).getTime())
9807																		op_period_to=itmdtl_dt2_chk.value;
9808																} else {
9809																	op_period_to=itmdtl_dt2_chk.value;
9810																}
9811															} else if (CalParseDate(itmdtl_dt2.value).getTime()<=CalParseDate(itmdtl_dt2_chk.value).getTime() && CalParseDate(itmdtl_dt1_chk.value).getTime()<=CalParseDate(itmdtl_dt2.value).getTime() ) {
9812																if(op_period_from!=''&&op_period_to!='') { //overlapping?
9813																	if(CalParseDate(op_period_to).getTime()<=CalParseDate(itmdtl_dt2.value).getTime())
9814																		op_period_to=itmdtl_dt2.value;
9815																} else {
9816																	op_period_to=itmdtl_dt2.value;
9817																}
9818															}
9819														}
9820					} // end if : verifying overlapping dates ;  endif : itmdtl_dt1_chk!=null && itmdtl_dt2_chk!=null ... */
9821
9822				} // end for (t3=0;t3<y;t3++)
9823				if(op_period_from!='' && op_period_to!='' && itmdtl_op!=null)
9824					itmdtl_op.value=op_period_from+'-'+op_period_to+'='+itmdtl_pn2.value;
9825				// search through previous MC for matching the current MC, if there's overlapping period, a new overlapping period from evaluating from the previous MC will be included.
9826				this.fitmItmDtlOverlapEvaluatePeriod(otbl,itmdtl_dt1,itmdtl_dt2,itmdtl_pn2,itmdtl_op);
9827			} /** endif: checking through list of the periods **/
9828
9829	} // end for(y=0;y<otbl.rows.length;y++) .. end ..
9830}
9831
9832cFITMitms.prototype.fitmItmDtlOverlapEvaluatePeriod=function(otbl,itmdtl_dt1, itmdtl_dt2, itmdtl_pn2, itmdtl_op) {
9833	var dt1=itmdtl_dt1.value, dt2=itmdtl_dt2.value, dttype=itmdtl_pn2.value, op_date=itmdtl_op.value,op_list='';
9834	var orow, itmdtl_dt1_chk, itmdtl_dt2_chk, itmdtl_dl_chk, itmdtl_pn2_chk, arSet, arSetRec, itmdtl_mcno_chk;
9835
9836	//alert('op_date = ' + op_date);
9837	if(op_date!=null && op_date!='')  {
9838		arSet=this.fitmItmDtlOverlapListToArray(op_date);
9839	} else {
9840		arSet=new Array();
9841	}
9842	//alert(   (Object.prototype.toString.call( arSet ) === '[object Array]' )  + ' vs ' + arSet.length);
9843
9844	for(y=0;y<otbl.rows.length;y++)
9845	{
9846		orow=otbl.rows[y];
9847		itmdtl_dt1_chk=null;itmdtl_dt2_chk=null;itmdtl_dl_chk=null; itmdtl_pn2_chk=null; itmdtl_mcno_chk=null, op_period_from=''; op_period_to='';  op_period_type='';
9848		chk_rowitms=orow.getElementsByTagName("INPUT");
9849		for(t2=0;t2<chk_rowitms.length;t2++)
9850		{
9851			// mc period
9852			if(JSVCstrEndWith(chk_rowitms[t2].name,"DT1") && itmdtl_dt1_chk==null) itmdtl_dt1_chk=chk_rowitms[t2];
9853			if(JSVCstrEndWith(chk_rowitms[t2].name,"DT2") && itmdtl_dt2_chk==null) itmdtl_dt2_chk=chk_rowitms[t2];
9854			if(JSVCstrEndWith(chk_rowitms[t2].name,"DL") && itmdtl_dl_chk==null) itmdtl_dl_chk=chk_rowitms[t2];
9855			if(JSVCstrEndWith(chk_rowitms[t2].name,"DS") && itmdtl_mcno_chk==null) itmdtl_mcno_chk=chk_rowitms[t2];
9856		}
9857		chk_rowitms=orow.getElementsByTagName("SELECT");
9858		for(t2=0;t2<chk_rowitms.length;t2++)
9859		{
9860			if(JSVCstrEndWith(chk_rowitms[t2].name,"PN2") && itmdtl_pn2_chk==null) itmdtl_pn2_chk=chk_rowitms[t2];
9861		}
9862
9863		//alert('at line '+y+' with ' + itmdtl_mcno_chk.value + ' = '+dt1+' ~ ' + dt2 +' ~ ' + dttype + ' vs ' + itmdtl_dt1_chk.value +' ~ ' + itmdtl_dt2_chk.value +' ~ ' + itmdtl_pn2_chk.value  );
9864		if(itmdtl_dl_chk!=null && itmdtl_dl_chk.disabled==true && CalParseDate(dt1).getTime() <= CalParseDate(itmdtl_dt2_chk.value).getTime() && CalParseDate(itmdtl_dt1_chk.value).getTime() <= CalParseDate(dt2).getTime()   )
9865		{
9866			//alert('at line '+y+' BEGIN!');
9867			// given value of dt1, dt2 and dttype : get overlap by matching the current MC period entry among the previous MC period
9868			if((dttype=='AM' || dttype=='PM') && itmdtl_pn2_chk.value=='FULL') // cur period = half day, checking is full day
9869			{
9870					op_period_from=dt1; op_period_to=dt2; op_period_type=dttype;
9871			}
9872			else if ((dttype=='AM' || dttype=='PM') && dttype==itmdtl_pn2_chk.value )
9873			{
9874					op_period_from=dt1; op_period_to=dt2; op_period_type=dttype;
9875			}
9876			else if  (dttype=='FULL' && (itmdtl_pn2_chk.value=='AM' || itmdtl_pn2_chk.value=='PM') )
9877			{
9878					op_period_from=itmdtl_dt1_chk.value; op_period_to=itmdtl_dt2_chk.value; op_period_type=itmdtl_pn2_chk.value;
9879			}
9880			else if  (dttype=='FULL' && itmdtl_pn2_chk.value=='FULL')
9881			{
9882				if(CalParseDate(dt1).getTime() <= CalParseDate(itmdtl_dt1_chk.value).getTime()) {
9883					op_period_from=itmdtl_dt1_chk.value;
9884				} else {
9885					op_period_from=dt1;
9886				}
9887				if(CalParseDate(itmdtl_dt2_chk.value).getTime() <= CalParseDate(dt2).getTime()) {
9888					op_period_to=itmdtl_dt2_chk.value;
9889				} else {
9890					op_period_to=dt2;
9891				}
9892				op_period_type='FULL';
9893			}
9894		}
9895		if(op_period_from!='' && op_period_to!='')
9896			arSet=this.fitmItmDtlOverlapArrayPush(arSet,op_period_from,op_period_to,op_period_type)  // ar,dtfrom,dtto,dtday
9897
9898		//alert('at line '+y+' DONE!');
9899
9900	}
9901
9902	if(arSet.length>0)
9903		for(y=0;y<arSet.length;y++)
9904			op_list=JSVCListAppend(op_list,this.fitmItmDtlOverlapArrytoList(arSet[y]))
9905	itmdtl_op.value=op_list;
9906
9907	return 0;
9908}
9909
9910cFITMitms.prototype.fitmItmDtlOverlapArrayPush=function(ar,dtfrom,dtto,dtday) { // dtform - dtto to be merged into arr
9911	var arOPA=new Array(), value=dtfrom+'-'+dtto+'='+dtday,idx, arConflictIdx=new Array(),arTrial,j,chk;
9912
9913	//alert('current ar = '+ar + ' ; length ar = '+ ar.length);
9914	for(i=0;i<ar.length;i++) {
9915		if ( CalParseDate(dtfrom).getTime() <=  CalParseDate(ar[i]['TO']).getTime() && CalParseDate(ar[i]['FROM']).getTime() <= CalParseDate(dtto).getTime() ) {
9916			//alert('conflict on ' + i);
9917			arConflictIdx.push(i);
9918
9919		}
9920	}
9921	//alert('arConflictIdx ='+ arConflictIdx);
9922	if(arConflictIdx.length==0) {
9923		idx=ar.length;
9924		ar[idx]=new Array();
9925		ar[idx]["FROM"]=dtfrom;
9926		ar[idx]["TO"]=dtto;
9927		ar[idx]["TYPE"]=dtday;
9928		ar[idx]["VALUE"]=dtfrom+'-'+dtto+'='+dtday;
9929	} else if (arConflictIdx.length==1)
9930	{
9931		i=arConflictIdx[0];
9932		if( dtday=='FULL' && ar[i]['TYPE']=='FULL' )
9933		{
9934			if( CalParseDate(dtfrom).getTime() <= CalParseDate(ar[i]['FROM']).getTime() )
9935				ar[i]['FROM']= dtfrom;
9936			if( CalParseDate(ar[i]['TO']).getTime() <= CalParseDate(dtto).getTime() )
9937				ar[i]['TO']= dtto;
9938			ar[i]['VALUE']=ar[i]['FROM']+'-'+ar[i]['TO']+'='+ar[i]['TYPE'];
9939		}
9940		else if (  dtday=='FULL' && (ar[i]['TYPE']=='AM' || ar[i]['TYPE']=='PM')  )
9941		{
9942			ar[i]['FROM']= dtfrom;
9943			ar[i]['TO']= dtto;
9944			ar[i]['TYPE']= dtday;
9945			ar[i]['VALUE']=ar[i]['FROM']+'-'+ar[i]['TO']+'='+ar[i]['TYPE'];
9946		}
9947		else if ( (dtday=='AM' || dtday=='PM') && ar[i]['TYPE']=='FULL'  ) // assuming dtday cover only one day, not range period, system can ignore merging this period.
9948		{
9949			// do nothing
9950		}
9951		else if ( (dtday=='AM' && ar[i]['TYPE']=='PM') || (dtday=='PM' && ar[i]['TYPE']=='AM') )
9952		{
9953			ar[i]['TYPE']= 'FULL';
9954			ar[i]['VALUE']=ar[i]['FROM']+'-'+ar[i]['TO']+'='+ar[i]['TYPE'];
9955		}
9956	}
9957	else if  (arConflictIdx.length>1)
9958	{
9959		arTrial=this.fitmItmDtlOverlapArrayPush(new Array(),dtfrom,dtto,dtday) // creating array, the overlapping period might potentially splited into two range of period
9960		for(j=0;j<arTrial.length;j++)
9961		{
9962			dtfrom=arTrial[j]['FROM'];dtto=arTrial[j]['TO'];dtday=arTrial[j]['TYPE'];
9963			for(i=0;i<arConflictIdx.length;i++) {
9964				chk=ar[arConflictIdx[i]];
9965				if( dtday=='FULL' && CalParseDate(dtfrom).getTime() <=  CalParseDate(chk['FROM']).getTime() && CalParseDate(chk['TO']).getTime() <= CalParseDate(dtto).getTime() )
9966				{
9967					chk['TYPE']=='DELETE'; // marked as deleted, as half day designed cater for one day period only. cater for half day as well.
9968
9969				}
9970				else if( dtday=='FULL' && chk['TYPE']=='FULL')
9971				{
9972					if(CalParseDate(chk['FROM']).getTime() <= CalParseDate(dtfrom).getTime() &&  CalParseDate(dtfrom).getTime() <= CalParseDate(chk['TO']).getTime() && CalParseDate(chk['TO']).getTime() <= CalParseDate(dtto).getTime())
9973					{
9974						chk['TO']=JSVCDateAdd('D',-1,dtfrom);
9975					}
9976					else if(CalParseDate(dtfrom).getTime()<= CalParseDate(chk['FROM']).getTime() && CalParseDate(chk['FROM']).getTime() <= CalParseDate(dtto).getTime() && CalParseDate(dtto).getTime()  <= CalParseDate(chk['TO']).getTime())
9977					{
9978						chk['FROM']=JSVCDateAdd('D',1,dtto);
9979					}
9980					chk['VALUE']=chk['FROM']+'-'+chk['TO']+'='+chk['TYPE'];
9981				}
9982				else if ( (dtday=='AM' || dtday=='PM') && chk['TYPE']=='FULL'  )
9983				{
9984					// can be ignored, as dtday (half day) is designed for one day period.
9985				}
9986				else if ( (dtday=='AM' && chk['TYPE']=='PM') || (dtday=='PM' && chk['TYPE']=='AM') )
9987				{
9988					chk['TYPE']= 'FULL';
9989					chk['VALUE']=chk['FROM']+'-'+chk['TO']+'='+chk['TYPE'];
9990				}
9991			}
9992			for(i=0;i<arConflictIdx.length;i++) {
9993				chk=ar[arConflictIdx[i]];
9994				if( dtday=='FULL' && CalParseDate(dtfrom).getTime() <=  CalParseDate(chk['FROM']).getTime() && CalParseDate(chk['TO']).getTime() <= CalParseDate(dtto).getTime() )
9995				{
9996					chk['TYPE']=='DELETE'; // marked as deleted, as half day designed cater for one day period only. cater for half day as well.
9997
9998				}
9999				else if( dtday=='FULL' && chk['TYPE']=='FULL')
10000				{
10001					if(CalParseDate(chk['FROM']).getTime() <= CalParseDate(dtfrom).getTime() &&  CalParseDate(dtfrom).getTime() <= CalParseDate(chk['TO']).getTime() && CalParseDate(chk['TO']).getTime() <= CalParseDate(dtto).getTime())
10002					{
10003						chk['TO']=JSVCDateAdd('D',-1,dtfrom);
10004					}
10005					else if(CalParseDate(dtfrom).getTime()<= CalParseDate(chk['FROM']).getTime() && CalParseDate(chk['FROM']).getTime() <= CalParseDate(dtto).getTime() && CalParseDate(dtto).getTime()  <= CalParseDate(chk['TO']).getTime())
10006					{
10007						chk['FROM']=JSVCDateAdd('D',1,dtto);
10008					}
10009					chk['VALUE']=chk['FROM']+'-'+chk['TO']+'='+chk['TYPE'];
10010				}
10011				else if ( (dtday=='AM' || dtday=='PM') && chk['TYPE']=='FULL'  )
10012				{
10013					// can be ignored, as dtday (half day) is designed for one day period.
10014				}
10015				else if ( (dtday=='AM' && chk['TYPE']=='PM') || (dtday=='PM' && chk['TYPE']=='AM') )
10016				{
10017					chk['TYPE']= 'FULL';
10018					chk['VALUE']=chk['FROM']+'-'+chk['TO']+'='+chk['TYPE'];
10019				}
10020			}
10021			// remove overlap that's marked as deleted
10022			for(i=0;i<ar.length;i++)
10023			{
10024				if(ar[i]['TYPE']='DELETE') {
10025					ar.splice(i,1); // remove it
10026					--i; // in next loop, check the same index again after removed
10027				}
10028			}
10029			// add new one.
10030			idx=ar.length;
10031			ar[idx]=new Array();
10032			ar[idx]["FROM"]=dtfrom;
10033			ar[idx]["TO"]=dtto;
10034			ar[idx]["TYPE"]=dtday;
10035			ar[idx]["VALUE"]=dtfrom+'-'+dtto+'='+dtday;
10036		}
10037	}
10038	return ar;
10039}
10040
10041cFITMitms.prototype.fitmItmDtlOverlapArrytoList=function(objtmp) {
10042	var list,arOPA=new Array();
10043	list=objtmp['FROM']+'-'+objtmp['TO']+'='+objtmp['TYPE'];
10044	return list;
10045}
10046
10047cFITMitms.prototype.fitmItmDtlOverlapListToArray=function(str) {
10048	var arOP=new Array();
10049	var objtmp;
10050	var idx;
10051
10052	objtmp=str.split(',');
10053	for(var i=0;i<objtmp.length;i++) {
10054		//alert('before length = '+arOP.length);
10055		if(objtmp[i]!='') {
10056			idx=arOP.length;
10057			arOP[idx]=new Array();
10058			arOP[idx]['VALUE']=objtmp[i];
10059			arOP[idx]['FROM']=objtmp[i].split('=')[0].split('-')[0];
10060			arOP[idx]['TO']=objtmp[i].split('=')[0].split('-')[1];
10061			arOP[idx]['TYPE']=objtmp[i].split('=')[1];
10062		}
10063		//alert('after length = '+arOP.length);
10064	}
10065	return arOP;
10066}
10067
10068
10069
10070cFITMitms.prototype.fitmItmDtlCalc=function(ev,tblitmdtl,rule_ord) { // return the sum total of item details for current item, calculation ...
10071	var tot=new Array(),cntitmdtls,t2,otbl,otr,qty,amt,itmdtl_qty,itm_nval3,itmdtl_amt,objitmdtlflag, otot,itmdtltype,ch_input,t,rate,ratediv,orate,rowfrom,balfpent_h,balfpent_o,balcf_h,balcf_o,facentleft,len,tmp,nvar2,weekendbit=null,itmdtl_nv3,itmdtl_nv4,itmdtl_nv5,itmdtl_dt2_prev,itmdtl_pno,itmdtl_pno2,objentleft_h,objentleft_o,itm_mnval4,itm_nval11,itm_nval12,dtrangemode,objitm_dtval1,objitm_dtval2,itmdtl_ds5,arSet,entadj_h,entadj_o,objitm_daybalchg,dtobj_showmins;
10072			otbl=tblitmdtl;
10073
10074			itmdtltype=this.Rules.DATA[rule_ord][11];
10075			rowfrom=1;
10076			if(itmdtltype==2 || itmdtltype==4 || itmdtltype==1 || itmdtltype==8|| itmdtltype==3 || itmdtltype==5||itmdtltype==9)
10077			{
10078				// Rate type: Grab rate from item-dtl window and populate rate in rule
10079				// replacement as below : rate=JSVCNumLOCtoDB(otbl.rows[0].lastChild.lastChild.value);
10080				otr=otbl.rows[0].getElementsByTagName("INPUT");
10081				for(t2=0;t2<otr.length;t2++)
10082				{
10083					if(JSVCstrEndWith(otr[t2].name,"RATEVAL")) rate=otr[t2];
10084					else if(JSVCstrEndWith(otr[t2].name,"ITMMNVAL4")) itm_mnval4=otr[t2];
10085					else if(JSVCstrEndWith(otr[t2].name,"ITMNVAL11")) itm_nval11=otr[t2];
10086					else if(JSVCstrEndWith(otr[t2].name,"ITMNVAL12")) itm_nval12=otr[t2];
10087					else if(JSVCstrEndWith(otr[t2].name,"ITMNVAL3")) itm_nval3=otr[t2];
10088					else if(JSVCstrEndWith(otr[t2].name,"BALFPENT_H")) balfpent_h=otr[t2];
10089					else if(JSVCstrEndWith(otr[t2].name,"BALFPENT_O")) balfpent_o=otr[t2];
10090					else if(JSVCstrEndWith(otr[t2].name,"BALCF_H")) balcf_h=otr[t2];
10091					else if(JSVCstrEndWith(otr[t2].name,"BALCF_O")) balcf_o=otr[t2];
10092					else if(JSVCstrEndWith(otr[t2].name,"ENTLEFT_H")) objentleft_h=otr[t2];
10093					else if(JSVCstrEndWith(otr[t2].name,"ENTLEFT_O")) objentleft_o=otr[t2];
10094					//else if(JSVCstrEndWith(otr[t2].name,"ITMDTLFLAG")) objitmdtlflag=otr[t2]; // appeared more than one field and objitmdtlflag is not in use.
10095					//else if(JSVCstrEndWith(otr[t2].name,"ENTADJ_H")) entadj_h=otr[t2];
10096					//else if(JSVCstrEndWith(otr[t2].name,"ENTADJ_O")) entadj_o=otr[t2];
10097					else if(JSVCstrEndWith(otr[t2].name,"DTVAL1")) objitm_dtval1=otr[t2];
10098					else if(JSVCstrEndWith(otr[t2].name,"DTVAL2")) objitm_dtval2=otr[t2];
10099					else if(JSVCstrEndWith(otr[t2].name,"ITMDTLFLAG_DAYBALCHG")) objitm_daybalchg=otr[t2];
10100					else if(JSVCstrEndWith(otr[t2].name,"CUSWKEND") && otr[t2].checked) {
10101						weekendbit=(weekendbit==null?0:weekendbit);
10102						weekendbit+=parseInt(otr[t2].value);
10103					}
10104				}
10105				otr=otbl.rows[0].getElementsByTagName("SELECT");
10106				for(t2=0;t2<otr.length;t2++)
10107				{
10108					if(JSVCstrEndWith(otr[t2].name,"FACENTLEFT")) facentleft=otr[t2];
10109					if(JSVCstrEndWith(otr[t2].name,"ITMNVAL3")) itm_nval3=otr[t2];
10110					if(JSVCstrEndWith(otr[t2].name,"RATEDIV")) ratediv=otr[t2];
10111				}
10112				rate=(rate==null||rate.value==""?0.0:JSVCNumLOCtoDB(rate.value));
10113				ratediv=(ratediv==null||ratediv.value==""?1:ratediv.value);
10114
10115				if(itmdtltype==9)rowfrom=1; else rowfrom=2;
10116
10117
10118				// itmdtltype=4
10119				balfpent_h=(balfpent_h==null||balfpent_h.value==""?0.0:JSVCNumLOCtoDB(balfpent_h.value));
10120				balfpent_o=(balfpent_o==null||balfpent_o.value==""?0.0:JSVCNumLOCtoDB(balfpent_o.value));
10121				balcf_h=(balcf_h==null||balcf_h.value==""?0.0:JSVCNumLOCtoDB(balcf_h.value));
10122				balcf_o=(balcf_o==null||balcf_o.value==""?0.0:JSVCNumLOCtoDB(balcf_o.value));
10123				facentleft=(facentleft==null||facentleft.value==""?0.0:JSVCNumLOCtoDB(facentleft.value));
10124			}
10125			cntitmdtls=0;itmdtl_dt2_prev=null;
10126
10127			if(itmdtltype==8 && objitm_dtval1!=null && objitm_dtval1.value!='' && objitm_dtval2!=null && objitm_dtval2.value!='' && CalParseDate(objitm_dtval1.value).getTime()>CalParseDate(objitm_dtval2.value).getTime()) {
10128				tmp=objitm_dtval1.value;objitm_dtval1.value=objitm_dtval2.value;objitm_dtval2.value=tmp;
10129			}
10130			if(itmdtltype==4 && otbl!=null) {
10131				this.fitmItmDtlDateOverlap(otbl);
10132			}
10133			for(var t=rowfrom;t<otbl.rows.length;t++)
10134			{
10135				otr=otbl.rows[t];
10136				//alert(t + ' row = ' + (itmdtl_dt2_prev!=null?itmdtl_dt2_prev.value:null));
10137				if(!(otr.lastChild.firstChild.checked)) // if del is not checked ...
10138				{
10139					if(itmdtltype==""||itmdtltype==null)itmdtltype=0;
10140					itmdtl_qty=null;itmdtl_amt=null;itmdtl_pno=null;itmdtl_pno2=null;itmdtl_dt1=null;itmdtl_dt2=null;itmdtl_dt1_time=null;itmdtl_dt2_time=null;itmdtl_dt3=null;itmdtl_dt4=null;itmdtl_nv3=null;itmdtl_nv4=null;itmdtl_nv5=null;itmdtl_ds5=null;nvar2=null; // reset
10141					ch_input=otr.getElementsByTagName("INPUT");
10142					for(t2=0;t2<ch_input.length;t2++)
10143					{
10144						if(JSVCstrEndWith(ch_input[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=ch_input[t2];
10145						if(JSVCstrEndWith(ch_input[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=ch_input[t2];
10146						if(JSVCstrEndWith(ch_input[t2].name,"DT1_TM") && itmdtl_dt1_time==null) itmdtl_dt1_time=ch_input[t2];
10147						if(JSVCstrEndWith(ch_input[t2].name,"DT2_TM") && itmdtl_dt2_time==null) itmdtl_dt2_time=ch_input[t2];
10148						if(JSVCstrEndWith(ch_input[t2].name,"DT3") && itmdtl_dt3==null) itmdtl_dt3=ch_input[t2];
10149						if(JSVCstrEndWith(ch_input[t2].name,"DT4") && itmdtl_dt4==null) itmdtl_dt4=ch_input[t2];
10150						if(JSVCstrEndWith(ch_input[t2].name,"QT") && nvar2==null) nvar2=ch_input[t2];
10151						if(JSVCstrEndWith(ch_input[t2].name,"NV3") && itmdtl_nv3==null) itmdtl_nv3=ch_input[t2];
10152						if(JSVCstrEndWith(ch_input[t2].name,"NV4") && itmdtl_nv4==null) itmdtl_nv4=ch_input[t2];
10153						if(JSVCstrEndWith(ch_input[t2].name,"NV5") && itmdtl_nv5==null) itmdtl_nv5=ch_input[t2]; // actual qty
10154						if(JSVCstrEndWith(ch_input[t2].name,"PN") && itmdtl_pno==null) itmdtl_pno=ch_input[t2];
10155						if(JSVCstrEndWith(ch_input[t2].name,"PN2") && itmdtl_pno2==null) itmdtl_pno2=ch_input[t2];
10156						if(JSVCstrEndWith(ch_input[t2].name,"QT") && itmdtl_qty==null) itmdtl_qty=ch_input[t2];
10157						if(JSVCstrEndWith(ch_input[t2].name,"AM") && itmdtl_amt==null) itmdtl_amt=ch_input[t2];
10158						if(JSVCstrEndWith(ch_input[t2].name,"DS5") && itmdtl_ds5==null) itmdtl_ds5=ch_input[t2];
10159					}
10160					ch_input=otr.getElementsByTagName("SELECT");
10161					for(t2=0;t2<ch_input.length;t2++)
10162					{
10163						if(JSVCstrEndWith(ch_input[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=ch_input[t2];
10164						if(JSVCstrEndWith(ch_input[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=ch_input[t2];
10165						if(JSVCstrEndWith(ch_input[t2].name,"DT1_TM") && itmdtl_dt1_time==null) itmdtl_dt1_time=ch_input[t2];
10166						if(JSVCstrEndWith(ch_input[t2].name,"DT2_TM") && itmdtl_dt2_time==null) itmdtl_dt2_time=ch_input[t2];
10167						if(JSVCstrEndWith(ch_input[t2].name,"DT3") && itmdtl_dt3==null) itmdtl_dt3=ch_input[t2];
10168						if(JSVCstrEndWith(ch_input[t2].name,"DT4") && itmdtl_dt4==null) itmdtl_dt4=ch_input[t2];
10169						if(JSVCstrEndWith(ch_input[t2].name,"QT") && nvar2==null) nvar2=ch_input[t2];
10170						if(JSVCstrEndWith(ch_input[t2].name,"NV3") && itmdtl_nv3==null) itmdtl_nv3=ch_input[t2];
10171						if(JSVCstrEndWith(ch_input[t2].name,"NV4") && itmdtl_nv4==null) itmdtl_nv4=ch_input[t2];
10172						if(JSVCstrEndWith(ch_input[t2].name,"NV5") && itmdtl_nv5==null) itmdtl_nv5=ch_input[t2]; // actual qty
10173						if(JSVCstrEndWith(ch_input[t2].name,"PN") && itmdtl_pno==null) itmdtl_pno=ch_input[t2];
10174						if(JSVCstrEndWith(ch_input[t2].name,"PN2") && itmdtl_pno2==null) itmdtl_pno2=ch_input[t2];
10175						if(JSVCstrEndWith(ch_input[t2].name,"QT") && itmdtl_qty==null) itmdtl_qty=ch_input[t2];
10176						if(JSVCstrEndWith(ch_input[t2].name,"AM") && itmdtl_amt==null) itmdtl_amt=ch_input[t2];
10177						if(JSVCstrEndWith(ch_input[t2].name,"DS5") && itmdtl_ds5==null) itmdtl_ds5=ch_input[t2];
10178					}
10179					if(itmdtltype==8) /* billing based on coverage */
10180					{
10181						if(itmdtl_dt3!=null && itmdtl_dt3.value!='') {
10182							if(objitm_dtval1!=null && objitm_dtval1.value!='' && objitm_dtval2!=null && objitm_dtval2.value!='') {
10183								//Checks if dtDATE3 is within dtVAL1 and dtVAL2
10184								if(CalParseDate(objitm_dtval1.value).getTime()<=CalParseDate(itmdtl_dt3.value).getTime() && CalParseDate(itmdtl_dt3.value).getTime()<=CalParseDate(objitm_dtval2.value).getTime())
10185									itmdtl_qty.value=1;
10186								else
10187									itmdtl_qty.value=0;
10188							} else
10189								itmdtl_qty.value=0;
10190						} else {
10191							itmdtl_qty.value=0;
10192						}
10193					}
10194					if(itmdtltype==1 || itmdtltype==2 || itmdtltype==4 || itmdtltype==3 || itmdtltype==5 || itmdtltype==9) /* day rate */
10195					{	//dt1="";dt2="";dt3="";dt4="";
10196						// get num of itm dtls
10197						if((itmdtl_dt1!=null&&itmdtl_dt1.value!="")||(itmdtl_dt2!=null&&itmdtl_dt2.value!="")) cntitmdtls++;
10198						qty=0;dtrangemode=null;
10199						if((itmdtl_dt1!=null&&itmdtl_dt1.value!='')||(itmdtl_dt2!=null&&itmdtl_dt2.value!='')) {
10200							// pop empty date either "from" or "to",
10201							if (itmdtl_dt1!=null&&itmdtl_dt1.value==''&&itmdtl_dt2!=null&&itmdtl_dt2.value!='') itmdtl_dt1.value=itmdtl_dt2.value;
10202							if (itmdtl_dt2!=null&&itmdtl_dt2.value==''&&itmdtl_dt1!=null&&itmdtl_dt1.value!='') itmdtl_dt2.value=itmdtl_dt1.value;
10203							// or switch place between "from" and "to"
10204							if (itmdtl_dt1_time!=null && itmdtl_dt2_time!=null)
10205								if (CalParseDateTime(itmdtl_dt1.value,itmdtl_dt1_time.value).getTime()>CalParseDateTime(itmdtl_dt2.value,itmdtl_dt2_time.value).getTime()) {
10206									tmp=itmdtl_dt1.value;itmdtl_dt1.value=itmdtl_dt2.value;itmdtl_dt2.value=tmp;
10207									tmp=itmdtl_dt1_time.value;itmdtl_dt1_time.value=itmdtl_dt2_time.value;itmdtl_dt2_time.value=tmp;
10208								}
10209							else {
10210								if (CalParseDate(itmdtl_dt1.value).getTime()>CalParseDate(itmdtl_dt2.value).getTime()) {
10211									tmp=itmdtl_dt1.value;itmdtl_dt1.value=itmdtl_dt2.value;itmdtl_dt2.value=tmp;
10212								}
10213							}
10214							// populate number of days
10215							if(itmdtltype==1) {
10216								dtrangemode=null;
10217								if(itmdtl_dt1.getAttribute('DATERANGEMODE')!=null && itmdtl_dt1.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt1.getAttribute('DATERANGEMODE');
10218								if(itmdtl_dt2.getAttribute('DATERANGEMODE')!=null && itmdtl_dt2.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt2.getAttribute('DATERANGEMODE');
10219								qty=this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDate(itmdtl_dt2.value),1 /* each cal days*/,this.locid,weekendbit,dtrangemode);
10220							} else if (itmdtltype==5) {
10221								dtrangemode=null;
10222								if(itmdtl_dt1.getAttribute('DATERANGEMODE')!=null && itmdtl_dt1.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt1.getAttribute('DATERANGEMODE');
10223								if(itmdtl_dt2.getAttribute('DATERANGEMODE')!=null && itmdtl_dt2.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt2.getAttribute('DATERANGEMODE');
10224								qty=this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDate(itmdtl_dt2.value),1 /* each cal days*/,this.locid,weekendbit,dtrangemode);
10225								qty=(qty>0?Math.floor(qty/7):0); // grab block of week
10226							} else if(itmdtltype==3|| itmdtltype==9) {
10227								dtrangemode=null;
10228								if(itmdtl_dt1.getAttribute('DATERANGEMODE')!=null && itmdtl_dt1.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt1.getAttribute('DATERANGEMODE');
10229								if(itmdtl_dt2.getAttribute('DATERANGEMODE')!=null && itmdtl_dt2.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt2.getAttribute('DATERANGEMODE');
10230								if(itmdtl_dt1.getAttribute('SHOWMINS')!=null && itmdtl_dt1.getAttribute('SHOWMINS')!='') dtobj_showmins=itmdtl_dt1.getAttribute('SHOWMINS');
10231								if(itmdtl_dt2.getAttribute('SHOWMINS')!=null && itmdtl_dt2.getAttribute('SHOWMINS')!='') dtobj_showmins=itmdtl_dt2.getAttribute('SHOWMINS');
10232
10233								if(itmdtl_dt1_time!=null && itmdtl_dt2_time!=null && dtobj_showmins!=null && dtobj_showmins==1){
10234									var minutes=this.fitmDateDiff(CalParseDateTime(itmdtl_dt1.value,itmdtl_dt1_time.value),CalParseDateTime(itmdtl_dt2.value,itmdtl_dt2_time.value),ratediv,this.locid,weekendbit,dtrangemode,'mm' /* minutes */);
10235									qty = (Math.floor(minutes /60) + ((minutes - (60* Math.floor(minutes /60)))/100));
10236								} else if(itmdtl_dt1_time!=null && itmdtl_dt2_time!=null)
10237									qty=this.fitmDateDiff(CalParseDateTime(itmdtl_dt1.value,itmdtl_dt1_time.value),CalParseDateTime(itmdtl_dt2.value,itmdtl_dt2_time.value),ratediv,this.locid,weekendbit,dtrangemode,'H' /* hour */);
10238								else
10239									qty=this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDateTime(itmdtl_dt2.value),ratediv,this.locid,weekendbit,dtrangemode,'H' /* hour */);
10240							} else if(itmdtltype==4) {
10241								if(itmdtl_ds5!=null) // using itmdtl_ds5
10242									arSet=(itmdtl_ds5.value!=''?this.fitmItmDtlOverlapListToArray(itmdtl_ds5.value):new Array());
10243								else
10244									arSet=(itmdtl_dt3.value!='' && itmdtl_dt4.value!=''?this.fitmItmDtlOverlapArrayPush(new Array(),itmdtl_dt3.value,itmdtl_dt4.value,itmdtl_pno2.value) : new Array());
10245								//alert('overlapping value='+itmdtl_ds5.value+ ' ; length='+arSet.length);
10246								dtrangemode=null;
10247								if(itmdtl_dt1.getAttribute('DATERANGEMODE')!=null && itmdtl_dt1.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt1.getAttribute('DATERANGEMODE');
10248								if(itmdtl_dt2.getAttribute('DATERANGEMODE')!=null && itmdtl_dt2.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt2.getAttribute('DATERANGEMODE');
10249								// .. populate number of days for day from - to  & overlapping day
10250								if(itmdtl_pno2.value.toUpperCase()=='AM' || itmdtl_pno2.value.toUpperCase()=='PM') // half day
10251									itmdtl_nv3.value=(this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDate(itmdtl_dt2.value),ratediv,this.locid,weekendbit,dtrangemode)>0?0.5:0);
10252								else // full day
10253									itmdtl_nv3.value=this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDate(itmdtl_dt2.value),ratediv,this.locid,weekendbit,dtrangemode);
10254								//alert('overlapping lists : '+arSet+ '~'+itmdtl_ds5.value);
10255								dtrangemode=null;
10256								if(itmdtl_dt3!=null && itmdtl_dt3.getAttribute('DATERANGEMODE')!=null && itmdtl_dt3.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt3.getAttribute('DATERANGEMODE');
10257								if(itmdtl_dt4!=null && itmdtl_dt4.getAttribute('DATERANGEMODE')!=null && itmdtl_dt4.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt4.getAttribute('DATERANGEMODE');
10258								// populate the number of day for overlapping period
10259								sum_overlapday=0;
10260								for(t2=0;t2<arSet.length;t2++) {  //dt3 = overlap from, dt4 = overlap to
10261									if(arSet[t2]['TYPE'].toUpperCase()=='AM' || arSet[t2]['TYPE'].toUpperCase()=='PM') // half day
10262										sum_overlapday+=( this.fitmDateDiff(CalParseDate(arSet[t2]['FROM']),CalParseDate(arSet[t2]['TO']),ratediv,this.locid,weekendbit,dtrangemode) > 0?0.5:0);
10263									else
10264										sum_overlapday+=this.fitmDateDiff(CalParseDate(arSet[t2]['FROM']),CalParseDate(arSet[t2]['TO']),ratediv,this.locid,weekendbit,dtrangemode);
10265								}
10266								itmdtl_nv4.value=sum_overlapday;
10267								qty=parseFloat(itmdtl_nv3.value)-sum_overlapday;
10268							} else {
10269								dtrangemode=null;
10270								if(itmdtl_dt1.getAttribute('DATERANGEMODE')!=null && itmdtl_dt1.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt1.getAttribute('DATERANGEMODE');
10271								if(itmdtl_dt2.getAttribute('DATERANGEMODE')!=null && itmdtl_dt2.getAttribute('DATERANGEMODE')!='') dtrangemode=itmdtl_dt2.getAttribute('DATERANGEMODE');
10272								qty=this.fitmDateDiff(CalParseDate(itmdtl_dt1.value),CalParseDate(itmdtl_dt2.value),ratediv,this.locid,weekendbit,dtrangemode);
10273							}
10274						}
10275						if(itmdtl_nv5/*nvar2*/!=null) { // set number of times
10276							itmdtl_nv5.value=qty;
10277						}
10278						if(nvar2/*nvar2*/!=null) { // set number of times
10279							if(itmdtltype==4||itmdtltype==9) {
10280								//alert(objitmdtlflag+'='+objitmdtlflag + ' vs objitmdtlflag.disabled = '+ objitmdtlflag.disabled+ ' vs objitmdtlflag.checked=' +  objitmdtlflag.checked);
10281								if(nvar2.readOnly==false/*objitmdtlflag!=null && objitmdtlflag.disabled==false && objitmdtlflag.checked==true*/) // change amount
10282								{
10283									nvar2.value=(nvar2.value==''?qty:nvar2.value);
10284									qty=nvar2.value; // override the number of qty for special arrangement
10285								}
10286								else
10287									nvar2.value=qty;
10288							} else
10289								nvar2.value=qty;
10290						}
10291						if(itmdtltype==4) { // tot['H'] and tot['O']
10292							if(itmdtl_pno!=null && itmdtl_pno.value!='') {
10293								tot[itmdtl_pno.value+'']=(typeof(tot[itmdtl_pno.value+''])=='undefined'?0:p
10293arseFloat(tot[itmdtl_pno.value+'']))+parseFloat(qty);
10294							}
10295						}
10296						else if(itmdtltype==9){
10297							amt=(itmdtl_amt!=null?itmdtl_amt.value:0);
10298
10299							if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10300							tot['sum']+=JSVCNumLOCtoDB(amt);
10301
10302						}else { // itmdtltype = 2?
10303							if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10304							tot['sum']+=qty;
10305						}
10306					}
10307					else
10308					{
10309						qty=(itmdtl_qty!=null?itmdtl_qty.value:1);
10310						amt=(itmdtl_amt!=null?itmdtl_amt.value:0);
10311						if(amt!=null&&amt!='') cntitmdtls++;
10312						if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10313						tot['sum']+=(JSVCNumLOCtoDB(qty)*JSVCNumLOCtoDB(amt));
10314					}
10315					// keep track the previous row of itmdtl.dt2 for the next loop
10316					if(itmdtltype==4 && itmdtl_dt2!=null&&itmdtl_dt2.disabled==false) {
10317						itmdtl_dt2_prev=itmdtl_dt2;
10318					}
10319				}
10320			} // end of looping the rows of the itmdtls ... (   for(var t=rowfrom;t<otbl.rows.length;t++)   )
10321//alert('rate='+rate + ' vs ' + 'ratediv='+ratediv);
10322			if(itmdtltype==1) {
10323				if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10324				var halfmthrate=rate/3;
10325				if(itm_nval12!=null) itm_nval12.value=(tot['sum']>=0?JSVCNumDBtoLOC(tot['sum']):''); // sum
10326				/*alert('before:'+tot['sum']);
10327				tot['sum']=(tot['sum']>0&&tot['sum']-1>0?tot['sum']-1:0);
10328				alert('after:'+tot['sum']);*/
10329				if(tot['sum']<14 && tot['sum']>=4) tot['sum']-=4;
10330				else if (tot['sum']<4) tot['sum']=0;
10331				tot['sum']=(tot['sum']>0?tot['sum']-1:tot['sum']); // deducted with 1 because the first date will not counted
10332				if(itm_nval11!=null) itm_nval11.value=(tot['sum']>=0?JSVCNumDBtoLOC(tot['sum']):''); // nett
10333				if(halfmthrate>165) halfmthrate=165;
10334				if(itm_mnval4!=null) itm_mnval4.value=(halfmthrate>=0?JSVCNumDBtoLOC(halfmthrate):''); // half mth rate
10335				/*tot=halfmthrate*tot['sum']/15;*/
10336				/*old : tot=halfmthrate*(tot['sum']>0&&tot['sum']-1>0?tot['sum']-1:0)/15;*/
10337				tot=halfmthrate*(tot['sum']>0?tot['sum']:0)/15;
10338			} else if(itmdtltype==3) {
10339				if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10340				tot=rate*Math.floor(tot['sum']/parseInt(itm_nval3.value));
10341			} else if(itmdtltype==5) {
10342				if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10343				tot=rate*tot['sum'];
10344			} else if(itmdtltype==2) {
10345				if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10346				tot=tot['sum']*rate/(ratediv>0?Math.abs(ratediv):1);
10347			} else if (itmdtltype==4) {
10348				// if day claim adjustment happened?
10349				/*
10350				if( objentadj_h!=null && objentadj_o!=null && objentadj_h.disabled==false && objentadj_o.disabled==false )
10351				{
10352					objentadj_h.value=(objentadj_h.value==''?0:objentadj_h.value);
10353					objentadj_h.onblur();
10354					tot['H']=(objentadj_h.value==''?0 :  parseFloat(objentadj_h.value) );
10355
10356					objentadj_o.value=(objentadj_o.value==''?0:objentadj_o.value);
10357					objentadj_o.onblur();
10358					tot['O']=(objentadj_o.value==''?0 :  parseFloat(objentadj_o.value) );
10359				}
10360
10361				* */
10362				// tot as the number of current day claimed...
10363				if(typeof(tot['H'])=='undefined' || tot['H']==null) tot['H']=0;
10364				if(typeof(tot['O'])=='undefined' || tot['O']==null) tot['O']=0;
10365
10366				if(objitm_daybalchg!=null && objitm_daybalchg.checked==true) {
10367					// day balance adjustment
10368					entadj_h=itm_nval11;entadj_o=itm_nval12;
10369					tot['H']=0;tot['O']=0;
10370					if(entadj_h!=null && entadj_h.disabled==false && entadj_h.value!='' && entadj_o!=null && entadj_o.disabled==false && entadj_o.value!='') {
10371						tot['H']=parseFloat(entadj_h.value);
10372						tot['O']=parseFloat(entadj_o.value);
10373
10374
10375						//entadj_h=parseFloat(entadj_h.value); entadj_o=parseFloat(entadj_o.value);
10376						//objentleft_h.value=balcf_h+entadj_h; objentleft_o.value=balcf_o+entadj_o;
10377						/*
10378						// get refund
10379						var balextra_h=( balcf_h >= balfpent_h ?  balcf_h - balfpent_h : 0);
10380						var balextra_o=( balcf_o >= balfpent_o ?  balcf_o - balfpent_o : 0);
10381						var balless_h=( balcf_h < balfpent_h ?  balfpent_h -  balcf_h : 0);
10382						var balless_o=( balcf_o < balfpent_o ?  balfpent_o -  balcf_o : 0);
10383
10384						*/
10385
10386					}
10387				} // end if : objitm_daybalchg!=null && objitm_daybalchg.checked==true
10388
10389				// hospitailisation
10390				objentleft_h.value=balcf_h+tot['H'];
10391				otot=0;
10392				if(tot['H']>0) {
10393					// hospitalisation : full pay
10394					if( balcf_h < balfpent_h )
10395						otot += (balfpent_h-balcf_h >= tot['H']? tot['H']: balfpent_h-balcf_h) * rate/(ratediv>0?Math.abs(ratediv):1); /* full pay */
10396					//alert(otot);
10397					// hospitalisation : half pay
10398					if( balcf_h != parseFloat(objentleft_h.value) && parseFloat(objentleft_h.value) > balfpent_h)
10399						otot += (balcf_h>=balfpent_h ? parseFloat(objentleft_h.value)-balcf_h : parseFloat(objentleft_h.value) - balfpent_h) * rate/(ratediv>0?Math.abs(ratediv):1) * facentleft; /* partial pay */
10400					//alert(   (balcf_h>=balfpent_h ? parseFloat(objentleft_h.value)-balcf_h : parseFloat(objentleft_h.value) - balfpent_h) + ' = ' +    otot);
10401				} else if (tot['H']<0) {
10402					// hospitalisation : full pay
10403					if( parseFloat(objentleft_h.value) < balfpent_h ) {
10404						otot -= ( balcf_h <=  balfpent_h ? balcf_h - parseFloat(objentleft_h.value) : balfpent_h - parseFloat(objentleft_h.value) ) * rate/(ratediv>0?Math.abs(ratediv):1); /* full pay */
10405					}
10406					// hospitalisation : half pay
10407					if( balfpent_h < balcf_h) {
10408						otot -= (balfpent_h <= parseFloat(objentleft_h.value) ? balcf_h - parseFloat(objentleft_h.value) :  balcf_h -  balfpent_h) * rate/(ratediv>0?Math.abs(ratediv):1) * facentleft; /* partial pay */
10409					}
10410				}
10411				//alert ('Hospitalisation = ' + otot);
10412				tot['H']=otot;
10413
10414				//outpatient
10415				objentleft_o.value=balcf_o+tot['O'];
10416				otot=0;
10417				if(tot['O']>0) {
10418					// outpatient : full pay
10419					if( balcf_o < balfpent_o )
10420						otot += (balfpent_o-balcf_o >= tot['O']? tot['O']: balfpent_o-balcf_o) * rate/(ratediv>0?Math.abs(ratediv):1); /* full pay */
10421					// outpatient : half pay
10422					if( balcf_o != parseFloat(objentleft_o.value) && parseFloat(objentleft_o.value) > balfpent_o)
10423						otot += (balcf_o>=balfpent_o ? parseFloat(objentleft_o.value)-balcf_o : parseFloat(objentleft_o.value) - balfpent_o) * rate/(ratediv>0?Math.abs(ratediv):1) * facentleft; /* partial pay */
10424				} else if (tot['O']<0) {
10425					// outpatient : full pay
10426					if( parseFloat(objentleft_o.value) < balfpent_o ) {
10427						otot -= ( balcf_o <=  balfpent_o ? balcf_o - parseFloat(objentleft_o.value) : balfpent_o - parseFloat(objentleft_o.value) ) * rate/(ratediv>0?Math.abs(ratediv):1); /* full pay */
10428					}
10429					// outpatient : half pay
10430					if( balfpent_o < balcf_o) {
10431						otot -= (balfpent_o <= parseFloat(objentleft_o.value) ? balcf_o - parseFloat(objentleft_o.value) :  balcf_o -  balfpent_o) * rate/(ratediv>0?Math.abs(ratediv):1) * facentleft; /* partial pay */
10432					}
10433				}
10434				//alert ('outpatient = ' + otot);
10435				tot['O']=otot;
10436				//alert(tot['H'] + ' vs ' + tot['O']);
10437				tot=tot['O']+tot['H'];
10438				cntitmdtls=1; // flag as valid itmdtls and return value
10439			}
10440			else {
10441				if(typeof(tot['sum'])=='undefined' || tot['sum']==null) tot['sum']=0;
10442				tot=tot['sum'];
10443			}
10444	return (cntitmdtls>0?tot:null);
10445}
10446cFITMitms.prototype.chkItemiseCustom=function(o,rule_ord) {
10447	var flag_billnodupchk=0; // default to dup chk
10448	var oItmDefSet=(this.ItmsDEFSET!=null && typeof( this.ItmsDEFSET[ this.Rules.DATA[rule_ord][this.RulesCol["VARULEVARNAME"]] ] ) ? this.ItmsDEFSET[ this.Rules.DATA[rule_ord][this.RulesCol["VARULEVARNAME"]] ] : null);
10449	var otbl=o.firstChild.firstChild;
10450	var otblset=otbl.tBodies[0]; // 3rd part
10451	var otbllist=otbl.tBodies[2]; // 3rd part
10452	var itmdtltype=this.Rules.DATA[rule_ord][this.RulesCol["IITMDTLTYPE"]];
10453	var wsitmdef=this.Rules.DATA[rule_ord][this.RulesCol["VARULEVARNAME"]];
10454	var itm_dt1=null,itmdtl_dl=null,itmdtl_am=null, itmdtl_am3=null, itmdtl_ds5=null,itmdtl_dt1=null,itmdtl_dt2=null,itmdtl_pn2=null,t,t2,itmfound=0;chkfound=0;
10455	var ITMBALCF_H, ITMBALCF_O, ITMNVAL11, ITMNVAL12, itmval, itmchk, itmlist;
10456	var iswica=(this.rulesetvarname=='SGTOKIO-WCV3' || this.rulesetvarname=='SGSOMPOWICA' || this.rulesetvarname=='SGAVIVAWICA' || this.rulesetvarname=='SGWICAGEN' ? 1 : 0);
10457
10458	if(itmdtltype==1) {
10459		cur_rowitms=otblset.getElementsByTagName("INPUT");
10460		for(t2=0;t2<cur_rowitms.length;t2++) // get date started work
10461		{
10462			if(JSVCstrEndWith(cur_rowitms[t2].name,"DTVAL1") && itm_dt1==null) itm_dt1=cur_rowitms[t2];
10463		}
10464
10465		for(t=0;t<otbllist.rows.length;t++) {
10466			orow=otbllist.rows[t];
10467			itmdtl_dt1=null;itmdtl_dt2=null;itmdtl_dl=null;
10468			cur_rowitms=orow.getElementsByTagName("INPUT");
10469			for(t2=0;t2<cur_rowitms.length;t2++) // get the MC period from and to
10470			{
10471				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=cur_rowitms[t2]; // date from
10472				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=cur_rowitms[t2]; // date to
10473				if(JSVCstrEndWith(cur_rowitms[t2].name,"DL") && itmdtl_dl==null) itmdtl_dl=cur_rowitms[t2];
10474			}
10475			itmdtl_dt1.style.border='';itmdtl_dt2.style.border='';
10476
10477			if(itmdtl_dl!=null && itmdtl_dl.checked==false && itm_dt1!=null && itmdtl_dt1!=null && itmdtl_dt1!=null && itmdtl_dt2!=null) {
10478				if(itmdtl_dt1.value=='') {
10479					chkfound=1;
10480					itmdtl_dt1.style.border='2px solid red';
10481				} else if(itmdtl_dt2.value=='') {
10482					chkfound=1;
10483					itmdtl_dt2.style.border='2px solid red';
10484				} else if(!(CalParseDate(itmdtl_dt1.value).getTime()<=CalParseDate(itmdtl_dt2.value).getTime())) {
10485					chkfound=1;
10486					itmdtl_dt1.style.border='2px solid red';
10487					itmdtl_dt2.style.border='2px solid red';
10488				} else if(!(CalParseDate(itmdtl_dt2.value).getTime()<CalParseDate(itm_dt1.value).getTime())) {
10489					chkfound=1;
10490					itmdtl_dt2.style.border='2px solid red';
10491				}
10492			}
10493		}
10494		if(chkfound==1) {
10495			alert(JSVClang('System cannot process the MC period due to:\n(1) Highlighted field has to be specified\n(2) MC period has to be placed in order\n(3)or end date of MC period has to be earlier than date started work. ',32344));
10496			return false;
10497		}
10498	}
10499	else if(iswica==1 && wsitmdef=='WCML' && itmdtltype==4)
10500	{
10501		for(t=0;t<otbllist.rows.length;t++) {
10502			orow=otbllist.rows[t];
10503			itmdtl_dt1=null;itmdtl_dt2=null;itmdtl_pn2=null;
10504			cur_rowitms=orow.getElementsByTagName("INPUT");
10505			for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
10506			{
10507				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=cur_rowitms[t2];
10508				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT2") && itmdtl_dt2==null) itmdtl_dt2=cur_rowitms[t2];
10509			}
10510			cur_rowitms=orow.getElementsByTagName("SELECT");
10511			for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
10512			{
10513				if(JSVCstrEndWith(cur_rowitms[t2].name,"PN2") && itmdtl_pn2==null) itmdtl_pn2=cur_rowitms[t2];
10514			}
10515			if(itmdtl_dt1!=null && itmdtl_dt2!=null && itmdtl_pn2!=null) {
10516				if(  (itmdtl_pn2.value.toUpperCase()=='AM' || itmdtl_pn2.value.toUpperCase()=='PM') && CalParseDate(itmdtl_dt1.value).getTime()!=CalParseDate(itmdtl_dt2.value).getTime() ) {
10517					itmdtl_dt1.style.border='2px solid red';itmdtl_dt2.style.border='2px solid red';itmdtl_pn2.style.border='2px solid red';
10518					chkfound=1;
10519				} else {
10520					itmdtl_dt1.style.border='';itmdtl_dt2.style.border='';itmdtl_pn2.style.border='';
10521				}
10522			}
10523		}
10524		if(chkfound==1) {
10525			alert(JSVClang('Half day claim can be only specified for a day claim.',25741));
10526			return false;
10527		}
10528
10529
10530		cur_rowitms=otblset.getElementsByTagName("INPUT");
10531		for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
10532		{
10533			if(JSVCstrEndWith(cur_rowitms[t2].name,"BALCF_H") && ITMBALCF_H==null) ITMBALCF_H=cur_rowitms[t2];
10534			if(JSVCstrEndWith(cur_rowitms[t2].name,"BALCF_O") && ITMBALCF_O==null) ITMBALCF_O=cur_rowitms[t2];
10535			if(JSVCstrEndWith(cur_rowitms[t2].name,"ITMNVAL11") && ITMNVAL11==null) ITMNVAL11=cur_rowitms[t2];
10536			if(JSVCstrEndWith(cur_rowitms[t2].name,"ITMNVAL12") && ITMNVAL12==null) ITMNVAL12=cur_rowitms[t2];
10537		}
10538
10539		if(ITMNVAL11!=null && ITMNVAL11.disabled==false && ITMNVAL12!=null && ITMNVAL12.disabled==false && (parseFloat(ITMBALCF_H.value)+parseFloat(ITMNVAL11.value)<0 ||  parseFloat(ITMBALCF_O.value)+parseFloat(ITMNVAL12.value)<0 ) )
10540		{
10541			chkfound=1;
10542			alert(JSVClang('Day Claim Adjustment has to be readjusted to ensure absolute days calculated for total claim days',29437));
10543			return false;
10544		}
10545
10546	}
10547	else if(iswica==1 && wsitmdef=='WCME')
10548	{
10549		if(oItmDefSet!=null && typeof(oItmDefSet.ITMDTL_WCME_NODUPCHK)!='undefined') flag_billnodupchk=oItmDefSet.ITMDTL_WCME_NODUPCHK;
10550		// validate required fields
10551		for(t=0;t<otbllist.rows.length;t++) {
10552			orow=otbllist.rows[t];
10553			itmdtl_dt1=null;itmdtl_pn2=null;itmdtl_ds5=null;itmdtl_am3=null;itmdtl_am=null;itmdtl_dl=null;
10554			cur_rowitms=orow.getElementsByTagName("INPUT");
10555			for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
10556			{
10557				if(JSVCstrEndWith(cur_rowitms[t2].name,"DT1") && itmdtl_dt1==null) itmdtl_dt1=cur_rowitms[t2]; // date
10558				if(JSVCstrEndWith(cur_rowitms[t2].name,"PN") && itmdtl_pn2==null) itmdtl_pn2=cur_rowitms[t2]; // bill
10559				if(JSVCstrEndWith(cur_rowitms[t2].name,"DS5") && itmdtl_ds5==null) itmdtl_ds5=cur_rowitms[t2]; // Remarks
10560				if(JSVCstrEndWith(cur_rowitms[t2].name,"AM3") && itmdtl_am3==null) itmdtl_am3=cur_rowitms[t2];
10561				if(JSVCstrEndWith(cur_rowitms[t2].name,"AM") && itmdtl_am==null) itmdtl_am=cur_rowitms[t2];
10562				if(JSVCstrEndWith(cur_rowitms[t2].name,"DL") && itmdtl_dl==null) itmdtl_dl=cur_rowitms[t2];
10563			}
10564			itmdtl_dt1.style.border='';itmdtl_pn2.style.border='';itmdtl_ds5.style.border='';
10565			if(itmdtl_dl!=null && itmdtl_dl.checked==false && (itmdtl_am.value!='' || itmdtl_am3.value!='') ) {
10566				if(itmdtl_dt1.value=='' && itmdtl_pn2.value=='' && itmdtl_ds5.value=='') {
10567					chkfound=1;
10568					itmdtl_ds5.style.border='2px solid red';
10569				} else if(itmdtl_dt1.value!='' && itmdtl_pn2.value=='') {
10570					chkfound=1;
10571					itmdtl_pn2.style.border='2px solid red';
10572				} else if(itmdtl_dt1.value=='' && itmdtl_pn2.value!='') {
10573					chkfound=1;
10574					itmdtl_dt1.style.border='2px solid red';
10575				}
10576			}
10577		}
10578		if(chkfound==1) {
10579			alert(JSVClang('Highlighted field has to be specified.',29438));
10580			return false;
10581		}
10582
10583
10584		chkfound=0; // reset
10585		// check duplicated bill no.
10586		if(flag_billnodupchk==0)
10587		{
10588			itmchk=new Array();itmlist=new Array();
10589			for(t=0;t<otbllist.rows.length;t++) {
10590				orow=otbllist.rows[t];
10591				itmdtl_pn2=null;itmdtl_dl=null;
10592				cur_rowitms=orow.getElementsByTagName("INPUT");
10593				for(t2=0;t2<cur_rowitms.length;t2++) // check every column of the row
10594				{
10595					if(JSVCstrEndWith(cur_rowitms[t2].name,"PN") && itmdtl_pn2==null) itmdtl_pn2=cur_rowitms[t2]; // bill
10596					if(JSVCstrEndWith(cur_rowitms[t2].name,"DL") && itmdtl_dl==null) itmdtl_dl=cur_rowitms[t2];
10597				}
10598				if(itmdtl_pn2!=null ) itmdtl_pn2.style.border='';
10599				if (itmdtl_pn2!=null && itmdtl_dl.disabled==false && itmdtl_dl.checked==false) {
10600					itmchk.push(itmdtl_pn2);
10601					itmlist.push(itmdtl_pn2);
10602				} else if (itmdtl_pn2!=null && itmdtl_dl.disabled==true) {
10603					itmlist.push(itmdtl_pn2);
10604				}
10605			}
10606			if(itmchk.length>0 && itmlist.length>0) {
10607				for(t=0;t<itmchk.length;t++) {
10608					itmfound=0;
10609					for(t2=0;t2<itmlist.length;t2++) {
10610						if(itmchk[t].value!='' && itmlist[t2].value!='' && itmchk[t].value.toUpperCase()==itmlist[t2].value.toUpperCase() )
10611							itmfound++;
10612					}
10613					if (itmfound>1) {
10614						chkfound=1;
10615						itmchk[t].style.border='2px solid red';
10616					}
10617				}
10618			}
10619			if(chkfound==1) {
10620				alert(JSVClang('Duplicated bill no. identified in highlighted fields. Kindly verify and ammend the bill no.',29439));
10621				return false;
10622			}
10623		}
10624	}
10625	return true;
10626}
10627cFITMitms.prototype.clkItmDtlCalc=function(ev,o,rule_ord) {
10628	var otbl,tbldiv=o.parentNode.previousSibling;
10629	if (!(SectionVerify(tbldiv) && this.chkItemiseCustom(tbldiv,rule_ord)) ) return;
10630		tot=0.0;
10631		otbl=tbldiv.firstChild.firstChild;
10632		/*if(otbl.rows.length>1) {*/
10633			tot=this.fitmItmDtlCalc(ev,otbl,rule_ord); // rule_ord is the idx of the rule (table's row)
10634		/*}*/
10635	alert('Total sum of item = '+(tot==null?JSVCNumDBtoLOC(0):JSVCNumDBtoLOC(tot)));
10636}
10637cFITMitms.prototype.clkItmDtlClose=function(ev,o,nmpref,idtag,save,rule_ord)
10638{	var cntitmdtls,t2,tbldiv,odiv,fr,otbl,otr,tot,qty,amt,otot,itmdtltype,ch_input,t,rate,orate,rowfrom,balfpent,balcf,facentleft,len,tmp,nvar2,weekendbit=null;
10639	tbldiv=o.parentNode.previousSibling;
10640	fr=tbldiv.parentNode.parentNode;
10641	if(save==1)
10642	{
10643		if (!(SectionVerify(tbldiv) && this.chkItemiseCustom(tbldiv,rule_ord)) ) return;
10644		// Get new totals
10645		otbl=tbldiv.firstChild.firstChild;
10646		//otbl.style='border:3px yellow solid';
10647		/*if(otbl.rows.length>1)
10648		{*/
10649			tot=0.0;
10650			tot=this.fitmItmDtlCalc(ev,otbl,rule_ord); // rule_ord is the idx of the rule (table's row)
10651		/*}*/
10652		tbldiv.firstChild.lastChild.previousSibling.value=(tot!=null?JSVCNumDBtoLOC(tot):'');
10653		// Replace old DIV with edited copy from frame
10654		JSVCFormSetDOMValues(tbldiv);
10655		odiv=document.getElementById(nmpref+"IT"+idtag+"DIV");
10656		odiv.innerHTML=tbldiv.innerHTML;
10657		tbldiv.innerHTML="";
10658		//alert(nmpref + ' vs ' + idtag); // MI5427WS vs 7889
10659		this.updItmState(nmpref,idtag,null,rule_ord);
10660	} else { // close only
10661		/*odiv=document.getElementById(nmpref+"IT"+idtag+"DIV");
10662		odiv.innerHTML=this.itemisehtml;*/
10663	}
10664	JSVCcloseCtxMenu(fr);
10665}
10666
10667cFITMitms.prototype.fitmDtlGetHalfMthRate=function(value) { /* for itmtype=8 and itmdtltype=1 */
10668	var halfmthrate='';
10669	if(value>=0) {
10670		halfmthrate=parseFloat(value/3);
10671		halfmthrate=(halfmthrate>165?165:halfmthrate);
10672	}
10673	return halfmthrate;
10674}
10675cFITMitms.prototype.fitmDateDiff=function(dt1,dt2,thisworkday,thislocid,weekendbit,daterangemode,difftype) {
10676	var dtrangeddt1;
10677	difftype=(difftype==null?"D":difftype);
10678	dtrangeddt1=(daterangemode=='DDT1'||difftype!='D'?1:0); // day should not +1 itself
10679	if(thisworkday==null) {
10680		alert('MRM500: '+JSVClang("Error found! Please contact system administrator for assistance",25740));
10681		return 0;
10682	}
10683	thisworkday=parseFloat(thisworkday);
10684	if(dt1==null || dt1==null)
10685		qty=0;
10686	else if((thisworkday==0 || thisworkday==null) && weekendbit>=0) // custom days for weekend ; thisworkday as bit of the day as weekend
10687	{
10688		qty=JSVCdaydiffWorkingDays(dt1,dt2,weekendbit,thislocid,request.DS.HOLIDAYS,1);
10689		qty=(dtrangeddt1==1&&qty>0?qty-1:qty);
10690	}
10691	else if (thisworkday==1 || thisworkday==7) // daily / 7 days week
10692	{
10693		qty=JSVCDateDiff(difftype,dt1,dt2)+1;
10694		qty=(dtrangeddt1==1&&qty>0?qty-1:qty);
10695	}
10696	else if (thisworkday==-5 || thisworkday==-5.5 || thisworkday==-6) // 5, 5.5 , 6 working days
10697	{
10698		qty=JSVCdaydiffWorkingDays(dt1,dt2,Math.abs(thisworkday),thislocid,request.DS.HOLIDAYS,0);
10699		qty=(dtrangeddt1==1&&qty>0?qty-1:qty);
10700	}
10701	else {
10702		alert('MRM501: '+JSVClang("Error found! Please contact system administrator for assistance",25740));
10703		return 0;
10704	}
10705	return qty;
10706}
10707cFITMitms.prototype.objToFixed=function(obj,dp) {
10708	if (!isNaN(parseFloat(obj.value)))obj.value = parseFloat(obj.value).toFixed(dp); else obj.value='';DoReq(obj);
10709}
10710
10711/****** END : worksheet itemizer *******/
10712
10713// Simple Check box check required check
10714// ONLY work for EPL Property details Module
10715function JSVCchkBoxValidate (){
10716	var chkboclen, msgttl, dismsg = "", chkboclenName = "", idlen=0 , chkboxflg=1, counter=-1 /* Array Counter start from 0 */;
10717	var arrchcek = [];
10718	var arrmsg = [];
10719
10720	var idStr = $("#divFldContainer :checkbox" ).map(function() {
10721		var idattr = document.getElementById(this.id).getAttribute("chkrequired");
10722		if (idattr != null){
10723			return this.id;
10724		}
10725	}).get().join();
10726
10727	var idArray = idStr.split(',');
10728	idlen=idArray.len;
10729
10730	var nameStr = $("#divFldContainer :checkbox" ).map(function() {
10731		var idattr = document.getElementById(this.id).getAttribute("chkrequired");
10732		if (idattr != null){
10733			return this.name;
10734		}
10735	}).get().join();
10736
10737	var nameArray = nameStr.split(',');
10738
10739	//console.log('idStr: '+idStr)
10740	//console.log('nameStr: '+nameStr)
10741	if(nameStr!="" || idStr!=""){
10742		for (a in idArray){
10743			if (chkboclenName == nameArray[a]) {
10744				chkboclen += $("[id=" + idArray[a] + "][type=checkbox]:checked").length;
10745				arrchcek[counter]=chkboclen;
10746			} else {
10747				chkboclen = $("[id=" + idArray[a] + "][type=checkbox]:checked").length;
10748				arrchcek.push(chkboclen);
10749				msgttl = $("[id=lbl_" + nameArray[a] + "]").text();
10750				arrmsg.push(msgttl)
10751				counter+=1;
10752			}
10753			chkboclenName = nameArray[a];
10754		}
10755		for (b in arrchcek){
10756			if (arrchcek[b] == 0){
10757				chkboxflg = 0;
10758				dismsg = arrmsg[b];
10759			}
10760		}
10761	}
10762	
10763	if(chkboxflg==0) {
10764		if (dismsg != ""){
10765			alert("You must check " + dismsg);
10766		} else {
10767			alert(JSVClang("You must check at least one the compulsory checkbox.",25742));
10768		}
10769		return false;
10770	} else {
10771		return true;
10772	}
10773}
10774
10775function JSVCSetEnableOne(list,enableTheOne) {
10776    var arr = list.split(",")
10777    var i = 0
10778    for(i=0;i<list.length;i++){
10779        if(arr[i]==enableTheOne) break;
10780    }
10781    arr.splice(i,1)
10782    JSVCSetDisabledList(arr.join(),true)
10783    JSVCSetDisabledList(enableTheOne,false)
10784}
10785
10786var JSVCTemplater = JSVCTemplater || {};
10787JSVCTemplater.getPlaceholders = function (template,config) {
10788    var config = config||{};
10789    config.escaped = config.escaped||["{{{","}}}"];
10790    config.interpolation = config.interpolation||["{{","}}"];
10791
10792    var sumLength = config.interpolation.join("").length;
10793    var placeholders = [];
10794    var expressions = [];
10795    var stopper1 = 0, stopper2 = 0;
10796    var escaped1 = 0, escaped2 = 0;
10797
10798    while(template.length>0) {
10799        stopper1 = template.search(config.interpolation[0]);
10800        stopper2 = template.search(config.interpolation[1]);
10801        escaped1 = template.search(config.escaped[0]);
10802        escaped2 = template.search(config.escaped[1]);
10803
10804        if(stopper1>stopper2) throw "JSVCTemplater.getPlaceholders: Imbalanced interpolation signs";
10805        if(stopper1==-1 || stopper2==-1) break;
10806
10807        if( !(stopper1==escaped1 && stopper2==escaped2) ){
10808            placeholders.push(template.slice(
10809                stopper1
10810                ,stopper2+config.interpolation[1].length
10811            ));
10812            expressions.push(template.slice(
10813                stopper1+config.interpolation[0].length
10814                ,stopper2
10815            ));
10816        }
10817        template = template.slice(stopper2+config.interpolation[1].length);
10818    }
10819    return { brac:placeholders,expr:expressions };
10820}
10821JSVCTemplater.compileTemplate = function (template,$data,$index,$parent,$root,$config){
10822    var i=0,j=0;
10823    var hldr,frag="";
10824    var expr,expr0,expr1,expr1curr,expr1fn,expr1param1,expr1param2,expr1param3,expr1param4,expr1param5;
10825    var $config = $config || {};
10826
10827    //if(_.isArray($data)) {
10828    if(Object.prototype.toString.call( $data ) === '[object Array]') {
10829        for(j=0;j<$data.length;j++){
10830            if($root === undefined) $root = $data;
10831            frag = frag + JSVCTemplater.compileTemplate(template,$data[j],j,$parent,$root,$config);
10832        }
10833    }else{
10834        hldr = JSVCTemplater.getPlaceholders(template,$config)
10835        frag = template.slice(0)
10836        $root = $root||$data
10837        for(i=0;i<hldr.brac.length;i++){
10838            expr = hldr.expr[i].split("|");
10839            expr0 = expr[0];
10840            expr1 = expr[1];
10841
10842// evaluate expression
10843            val = (new Function(
10844                "$data"
10845                ,"$index"
10846                ,"$parent"
10847                ,"$root"
10848                ,'var result={{expr}};if(result===undefined || result===null) {result=""}; return result'.replace("{{expr}}",expr0)
10849            ))( $data,$index,$parent,$root );
10850
10851// evaluate fn on expression
10852            if(expr1) {
10853                expr1 = expr1.split(",")
10854                for(m=0;m<expr1.length;m++){
10855                    expr1fn = expr1[m];
10856                    expr1param1 = val;
10857                    expr1param2 = $data;
10858                    expr1param3 = $index;
10859                    expr1param4 = $parent;
10860                    expr1param5 = $root;
10861                    val = (new Function (
10862                        "$val"
10863                        ,"$data"
10864                        ,"$index"
10865                        ,"$parent"
10866                        ,"$root"
10867                        ,'var result=window.{{expr}}($val,$data,$index,$parent,$root);if(result===undefined || result===null) {result=""}; return result'.replace("{{expr}}",expr1fn)
10868                    ))( expr1param1,expr1param2,expr1param3,expr1param4,expr1param5 );
10869                }
10870            }
10871            frag = frag.replace(hldr.brac[i],val);
10872        }
10873    }
10874    return frag;
10875}
10876JSVCTemplater.compileEach = function (arr){
10877    var i, total = "";
10878    if(Validate.isArray(arr).passed) {
10879        for(i=0; i<arr.length; i++){
10880            total = total + JSVCTemplater.compileTemplate(arr[i].TEMPLATE, arr[i].DATA);
10881        }
10882    }
10883    return total;
10884}
10885JSVCTemplater.compileRow = function (config) {
10886    if( !config.hasOwnProperty("row") ) return "";
10887
10888    var nuKeys=[],temp,max,ttemp,tdata
10889    for(var key in config) {
10890        temp = key.replace(/cell(\d+)t/,"$1");
10891        if( !isNaN(temp) ){
10892            max = temp>max? temp: max;
10893            nuKeys.push(temp);
10894        }
10895    }
10896    nuKeys.sort();
10897
10898    temp = "";
10899    for(var i=0;i<nuKeys.length;i++) {
10900        ttemp = "cell"+nuKeys[i]+"t"
10901        tdata = "cell"+nuKeys[i]+"d"
10902        config[tdata] = ( !config.hasOwnProperty(tdata) || typeof config[tdata] == "object")? config[tdata]: {};
10903        temp = temp + this.compileTemplate(config[ttemp],config[tdata]);
10904    }
10905    return config.row.replace("{{$data.cells}}",temp);
10906}
10907function JSVCCanvasSupported(){
10908  var elem = document.createElement('canvas');
10909  return !!(elem.getContext && elem.getContext('2d'));
10910}
10911function JSVCScreenshotMenu(){
10912    return [JSVClang("Take Screenshot",28903) + ' (Ctrl+Shift+S)', 'javascript:JSVCshowCtxMenuEv(this.event,\'fb_instruction\',0,2,2);void(null);' ];
10913}
10914
10915/* Login Page placeholder disappered in IE */
10916/* HTML5 Placeholder jQuery Plugin - v2.3.1 - Copyright (c)2015 Mathias Bynens 2015-12-16*/
10917try{!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof module&&module.exports?require("jquery"):jQuery)}(function(a){function b(b){var c={},d=/^jQuery\d+$/;return a.each(b.attributes,function(a,b){b.specified&&!d.test(b.name)&&(c[b.name]=b.value)}),c}function c(b,c){var d=this,f=a(this);if(d.value===f.attr(h?"placeholder-x":"placeholder")&&f.hasClass(n.customClass))if(d.value="",f.removeClass(n.customClass),f.data("placeholder-password")){if(f=f.hide().nextAll('input[type="password"]:first').show().attr("id",f.removeAttr("id").data("placeholder-id")),b===!0)return f[0].value=c,c;f.focus()}else d==e()&&d.select()}function d(d){var e,f=this,g=a(this),i=f.id;if(!d||"blur"!==d.type||!g.hasClass(n.customClass))if(""===f.value){if("password"===f.type){if(!g.data("placeholder-textinput")){try{e=g.clone().prop({type:"text"})}catch(j){e=a("<input>").attr(a.extend(b(this),{type:"text"}))}e.removeAttr("name").data({"placeholder-enabled":!0,"placeholder-password":g,"placeholder-id":i}).bind("focus.placeholder",c),g.data({"placeholder-textinput":e,"placeholder-id":i}).before(e)}f.value="",g=g.removeAttr("id").hide().prevAll('input[type="text"]:first').attr("id",g.data("placeholder-id")).show()}else{var k=g.data("placeholder-password");k&&(k[0].value="",g.attr("id",g.data("placeholder-id")).show().nextAll('input[type="password"]:last').hide().removeAttr("id"))}g.addClass(n.customClass),g[0].value=g.attr(h?"placeholder-x":"placeholder")}else g.removeClass(n.customClass)}function e(){try{return document.activeElement}catch(a){}}var f,g,h=!1,i="[object OperaMini]"===Object.prototype.toString.call(window.operamini),j="placeholder"in document.createElement("input")&&!i&&!h,k="placeholder"in document.createElement("textarea")&&!i&&!h,l=a.valHooks,m=a.propHooks,n={};j&&k?(g=a.fn.placeholder=function(){return this},g.input=!0,g.textarea=!0):(g=a.fn.placeholder=function(b){var e={customClass:"placeholder"};return n=a.extend({},e,b),this.filter((j?"textarea":":input")+"["+(h?"placeholder-x":"placeholder")+"]").not("."+n.customClass).not(":radio, :checkbox, [type=hidden]").bind({"focus.placeholder":c,"blur.placeholder":d}).data("placeholder-enabled",!0).trigger("blur.placeholder")},g.input=j,g.textarea=k,f={get:function(b){var c=a(b),d=c.data("placeholder-password");return d?d[0].value:c.data("placeholder-enabled")&&c.hasClass(n.customClass)?"":b.value},set:function(b,f){var g,h,i=a(b);return""!==f&&(g=i.data("placeholder-textinput"),h=i.data("placeholder-password"),g?(c.call(g[0],!0,f)||(b.value=f),g[0].value=f):h&&(c.call(b,!0,f)||(h[0].value=f),b.value=f)),i.data("placeholder-enabled")?(""===f?(b.value=f,b!=e()&&d.call(b)):(i.hasClass(n.customClass)&&c.c
10917all(b),b.value=f),i):(b.value=f,i)}},j||(l.input=f,m.value=f),k||(l.textarea=f,m.value=f),a(function(){a(document).delegate("form","submit.placeholder",function(){var b=a("."+n.customClass,this).each(function(){c.call(this,!0,"")});setTimeout(function(){b.each(d)},10)})}),a(window).bind("beforeunload.placeholder",function(){var b=!0;try{"javascript:void(0)"===document.activeElement.toString()&&(b=!1)}catch(c){}b&&a("."+n.customClass).each(function(){this.value=""})}))});} catch (e) {}
10918
10919function JSVCGetResp()
10920{
10921    if( request.mobile != "undefined" && (request.mobile == 2 || request.mobile == 1))
10922        return true;
10923    else
10924        return false;
10925}
10926
10927
10928// No polyfill for indexOf for IE, as it causes error.
10929// default array proto chain already contain this function starting IE9
10930if (!Array.prototype.indexOf && !/MSIE/.test(navigator.userAgent))
10931{
10932  Array.prototype.indexOf = function(elt)
10933  {
10934    var len = this.length;
10935
10936    var from = Number(arguments[1]) || 0;
10937    from = (from < 0)
10938         ? Math.ceil(from)
10939         : Math.floor(from);
10940    if (from < 0)
10941      from += len;
10942
10943    for (; from < len; from++)
10944    {
10945      if (from in this &&
10946          this[from] === elt)
10947        return from;
10948    }
10949    return -1;
10950  };
10951}
10952
10953function JSVCcreateLoadingImage(size) {
10954    var newImg = document.createElement("img");
10955    newImg.setAttribute("src",request.approot+"services/images/loading-anim.gif");
10956    newImg.setAttribute("id","loadingImg");
10957    if (size!=null) newImg.setAttribute("width",size);
10958    newImg.setAttribute("style","vertical-align:middle;padding-left:2px;");
10959    return newImg;
10960}
10961function JSVCcreateLoadingBlock(type,timeout,cssparam) { // type=0 = loading, type=1 = uploading
10962    if(cssparam==null) cssparam="";
10963    if(timeout==null) timeout = 30000;
10964    setInterval(JSVCLoadingTimeout, timeout);
10965    if(document.getElementById('loadingBlock'))
10966        var newBlock = document.getElementById('loadingBlock');
10967    else
10968    {
10969        var newBlock = document.createElement("div");
10970        newBlock.setAttribute("id","loadingBlock");
10971        newBlock.setAttribute("align","center");
10972        newBlock.setAttribute("style","width:100%;font-weight:bold;" + cssparam);
10973    }
10974    if(type==1)
10975        newBlock.innerHTML = JSVClang("Uploading, please wait...",32345);
10976    else
10977        newBlock.innerHTML = JSVClang("Loading, please wait...",7062);
10978    newBlock.appendChild( JSVCcreateLoadingImage() );
10979    return newBlock;
10980}
10981function JSVCremoveLoadingImage() {
10982    if(document.getElementById('loadingImg'))document.getElementById('loadingImg').parentNode.removeChild( document.getElementById('loadingImg') );
10983}
10984function JSVCremoveLoadingBlock() {
10985    if(document.getElementById('loadingBlock'))document.getElementById('loadingBlock').parentNode.removeChild( document.getElementById('loadingBlock') );
10986}
10987function JSVCLoadingTimeout() {
10988    JSVCremoveLoadingImage();
10989    if(document.getElementById('loadingBlock'))
10990    {
10991        document.getElementById('loadingBlock').innerHTML=JSVClang("There was an error processing the request. Please try again.",32346);
10992    }
10993}
10994
10995String.prototype.replaceAll = function(search, replacement) {
10996    var target = this;
10997    return target.replace(new RegExp(search, 'g'), replacement);
10998}
10999
11000function JSVCRepeatStr(str, count)
11001{
11002    var array = [];
11003    for(var i = 0; i < count;)
11004        array[i++] = str;
11005    return array.join('');
11006}
11007
11008function doEqualHeight(cls) {
11009	var swidth=$(window).width(), maxh = 0, elem;
11010	if(cls != null)
11011		elem = $('.'+cls);
11012	else
11013		elem = $('.equal-height');
11014	elem.each(function() {
11015		$(this).height('auto');
11016		if($(this).height() > maxh)
11017			maxh=$(this).height();
11018	});
11019	if (swidth > 991) //bootstrap large size >= 992px
11020		elem.each(function() {
11021			$(this).height(maxh);
11022		});
11023}
11024
11025function winResize() {
11026	var doEH = $('.equal-height');
11027	$(window).resize(function() {
11028		if (doEH.length != 0)
11029			doEqualHeight();
11030	});
11031}
11032
11033function JSVCGetALLAttributeByTagNameARR(htmltype,attribute,maxAllow,excludeARR,reqARR){
11034	var typeGET = document.getElementsByTagName(htmltype);
11035	var typeARR = [];
11036	var maxAllow = maxAllow || 5;
11037	var excludeARR = excludeARR || [];
11038	var reqARR = reqARR || [];
11039	excludeARR.push('SRCHTYPE');
11040	for(var i = 0; i < typeGET.length; i++){
11041		var obj = JSVCall(typeGET[i].getAttribute(attribute));
11042		var attributeresult = typeGET[i].getAttribute(attribute);
11043		if(obj !=null && !(obj.style.display=='none') && !(obj.disabled)){
11044			if(htmltype=='select' && parseInt(maxAllow)>0){
11045				obj.length>maxAllow? typeARR.push(attributeresult):'';
11046			}else{
11047				typeARR.push(attributeresult);
11048			}
11049		}
11050	}
11051	typeARR = typeARR.filter( function( el ) {
11052  	return excludeARR.indexOf( el ) < 0;
11053	} );
11054	typeARR = typeARR.concat(reqARR);
11055	return typeARR;
11056}
11057
11058
11059function JSVCScrollTopBtn(varname,body,element,heightShow){
11060	this.varname = varname || 'scrollTopBtn';
11061	this.body = body || 0;
11062	this.element = element || 0;
11063	this.heightShow = heightShow || 500;
11064}
11065
11066JSVCScrollTopBtn.prototype.gen=function(){
11067	document.write("<button onclick="+this.varname+".scrollTop() class='clsSVCScrollTopBtn'>&#8593;</button>");
11068}
11069
11070JSVCScrollTopBtn.prototype.show=function() {
11071	(document.body.scrollTop > this.heightShow || document.documentElement.scrollTop > this.heightShow) ? document.getElementsByClassName("clsSVCScrollTopBtn")[0].style.display = "block" : document.getElementsByClassName("clsSVCScrollTopBtn")[0].style.display = "none";
11072}
11073
11074JSVCScrollTopBtn.prototype.scrollTop=function() {
11075  document.body.scrollTop = this.body;
11076  document.documentElement.scrollTop = this.element;
11077}
11078
11079function JSVCShowHideCol(col, hideFlag) {
11080	var tableRearrange=false;
11081	if(hideFlag==null) hideFlag=false;
11082	if(col==null) return;
11083	if(arguments.length > 2) tableRearrange=arguments[2];
11084	if(typeof col=="string") {
11085		if(JSVCall(col)==null) return;
11086		col=$(JSVCall(col));
11087	}
11088	else if(!(col instanceof jQuery)) {
11089		col=$(col);
11090	}
11091	col.css('display', (hideFlag?'none':''));
11092	if(tableRearrange) JSVCRearrangeTable(col.closest('table')[0]);
11093}
11094
11095function JSVCRearrangeTable(tb, skipHeader) {
11096	var colCnt=0, tmp, tmpCol=0, tmpRow=0;
11097	var cols=[];
11098	if(typeof tb=='string') {
11099		tb=JSVCall(tb);
11100	}
11101	if(tb==null || tb.rows.length==0) return;
11102	if(skipHeader==null) skipHeader=1;	// Skip Header row
11103	// Get visible columns count
11104	for(var i=0; i<tb.rows[0].cells.length; i++) {
11105		if(tb.rows[0].cells[i].style.display!='none')
11106			colCnt+=tb.rows[0].cells[i].colSpan;
11107	}
11108	// Collect all cells into array, exclude filler columns.
11109	for(var x=0, y=((skipHeader==1)?1:0), i=0; y<tb.rows.length; y++) {
11110		for(x=0, tmp=tb.rows[y].cells.length; x<tmp; x++) {
11111			if(tb.rows[y].firstChild.hasAttribute('filler_column'))
11112				tb.rows[y].removeChild(tb.rows[y].firstChild);
11113			else
11114				cols[i++] = tb.rows[y].removeChild(tb.rows[y].firstChild);
11115		}
11116	}
11117	// Rearrange table
11118	if(skipHeader==1) tmpRow=1;
11119	for(i=0, tmp=0; i<cols.length; i++, tmpCol++) {
11120		if(tmp>=colCnt) {
11121			tmpCol=0;
11122			tmp=0;
11123			tmpRow++;
11124		}
11125		if(tmpRow>=tb.rows.length) tb.insertRow(-1);
11126		tb.rows[tmpRow].appendChild(cols[i]);
11127		if(tb.rows[tmpRow].cells[tmpCol].style.display!='none') tmp+=tb.rows[tmpRow].cells[tmpCol].colSpan;
11128	}
11129	// Remove extra rows if any
11130	for(i=tb.rows.length-1; i>0; i--) {
11131		if(tb.rows[i].cells.length>=colCnt) break;
11132		if(tb.rows[i].cells.length==0) tb.deleteRow(i);
11133		else {
11134			// Add filler columns if less than other.
11135			for(var j=0,tmp=0; j<tb.rows[i].cells.length; j++) {
11136				if(tb.rows[i].cells[j].style.display!='none')
11137					tmp+=tb.rows[i].cells[tmp].colSpan;
11138			}
11139			if(tmp<colCnt) {
11140				for(j=0; j<(colCnt-tmp); j++) {
11141					tmpCol = document.createElement('td');
11142					tmpCol.setAttribute('filler_column', 1);
11143					tb.rows[i].appendChild(tmpCol);
11144				}
11145			}
11146		}
11147	}
11148}
11149
11150// shiu: SVC list functions
11151function JSVCListHas(str,val,delim) {
11152	delim = (delim? delim: ',');
11153
11154    var arr = (str !== null
11155            && str !== undefined
11156            && typeof str === "string"
11157            && str.length >0
11158    )? str.split(delim): [];
11159
11160    var flag = false;
11161    var vstring = val.toString();
11162    for(var i=0; i<arr.length; i++) {
11163        flag = (arr[i]===vstring);
11164        if(flag) break;
11165    }
11166	return flag;
11167}
11168
11169function JSVCListRemove(str,val,delim) {
11170	var arrVal=JSVCListToArray(str,delim);
11171	//console.log(JSVCListToArray(str,delim));
11172	for(var i=0; i<arrVal.length;i++) {
11173		if(arrVal[i]==val) {
11174			arrVal.splice(i, 1);
11175		}
11176	}
11177	val='';
11178	for(var i=0; i<arrVal.length;i++) {
11179		val=JSVCListAppend(val,arrVal[i],delim);
11180	}
11181	return val;
11182}
11183
11184function JSVCListAppend(str,val,delim,appendFn) {
11185	delim = (delim? delim: ',');
11186    appendFn = (
11187        appendFn !== null
11188        && appendFn !== undefined
11189        && typeof appendFn === "function"
11190    )? appendFn: function (arr,val) { arr.push(val); }
11191
11192    var arr = (str !== null
11193            && str !== undefined
11194            && typeof str === "string"
11195            && str.length >0
11196    )? str.split(delim): [];
11197
11198    appendFn(arr,val);
11199	return arr.join(delim);
11200}
11201function JSVCListAppendUnique(str,val,delim) {
11202    var uniq = function (arr,val) {
11203        var isUniq = true;
11204        var vstring = val.toString();
11205        for(var i=0; i<arr.length; i++){
11206            isUniq = (arr[i] !== vstring)
11207            if(!isUniq) break;
11208        }
11209        if(isUniq) {
11210            arr.push(val);
11211        }
11212    };
11213    return JSVCListAppend(str,val,delim,uniq);
11214}
11215function JSVCListDelete(str,val,delim,removeFn) {
11216	delim = (delim? delim: ',');
11217    removeFn = (
11218        removeFn !== null
11219        && removeFn !== undefined
11220        && typeof removeFn === "function"
11221    )? removeFn: function (arr,val) {
11222        var vstring = val.toString();
11223        for(var i=0;i<arr.length;i++) {
11224            if(arr[i] === vstring) {
11225                arr.splice(i,1);
11226                break;
11227            }
11228        }
11229    };
11230    var arr = (str !== null
11231            && str !== undefined
11232            && typeof str === "string"
11233            && str.length >0
11234    )? str.split(delim): [];
11235    removeFn(arr,val);
11236	return arr.join(delim);
11237}
11238function JSVCListDeleteAt(str,idx,delim) {
11239    var removeFn = function (arr,val) {
11240        for(var i=arr.length-1;i>-1;i--) {
11241            if(i === idx) {
11242                arr.splice(i,1);
11243                break;
11244            }
11245        }
11246    };
11247    return JSVCListDelete(str,undefined,delim,removeFn)
11248}
11249function JSVCListDeleteAll(str,val,delim) {
11250    var removeFn = function (arr,val) {
11251        var vstring = val.toString();
11252        for(var i=arr.length-1;i>-1;i--) {
11253            if(arr[i] == vstring) {
11254                arr.splice(i,1);
11255            }
11256        }
11257    };
11258    return JSVCListDelete(str,val,delim,removeFn)
11259}
11260function JSVCListToggle(str,val,delim) {
11261    var str2 = str;
11262    if(JSVCListHas(str,val,delim)) {
11263        str2 = JSVCListDeleteAll(str,val,delim)
11264    } else {
11265        str2 = JSVCListAppendUnique(str,val,delim)
11266    }
11267    return str2;
11268}
11269function JSVCListFilter(str,fn,delim) {
11270    // todo: implement
11271}
11272
11273// shiu: elements manipulation fns
11274function elsEach (els,fn,fnContext) {
11275    var temp = [];
11276    for(var i=0;i<els.length;i++){
11277        var el = els[i];
11278        fn.call(fnContext,el,i,els);
11279        temp.push(el);
11280    }
11281    return temp;
11282}
11283function elsMap (els,fn,fnContext) {
11284    var temp = [];
11285    for(var i=0;i<els.length;i++){
11286        var el = els[i];
11287        temp.push( fn.call(fnContext,el,i,els) );
11288    }
11289    return temp;
11290}
11291function elsMapExtractor (els,fn,result) {
11292    var result = result || [];
11293    for(var i=0; i<els.length; i++) {
11294        var el = els[i];
11295        if( fn(el,result) ) break;
11296    }
11297    return result;
11298}
11299function elsFilter(els,fn) {
11300    var temp = [];
11301    for(var i=0;i<els.length;i++){
11302        var el = els[i];
11303        var passed = fn(el,i,els);
11304        if(passed) temp.push(el);
11305    }
11306    return temp;
11307}
11308function elsGroup(els,fn) {
11309    var temp = {};
11310    for(var i=0;i<els.length;i++){
11311        var el = els[i];
11312
11313        var key = fn(el);
11314        if(!temp.hasOwnProperty(key)) temp[key] = [];
11315        temp[key].push(el);
11316    }
11317    return temp;
11318}
11319
11320// shiu: single element fns
11321function elIs(el,specs) {
11322    if(!el) return false;
11323
11324    var temp,flag = true;
11325    for(var k in specs) {
11326        var valElem = el[k];
11327        var valExp  = specs[k];
11328        var valExpType = valExp.constructor;
11329
11330        if(valExpType == Function) {
11331            temp = valExp.apply(el,[valElem]);
11332        } else {
11333            temp = (valElem==valExp);
11334        }
11335        flag = flag && temp;
11336        if(!flag) break;
11337    }
11338    return flag;
11339}
11340function elParent(el,specs) {
11341    var temp = null;
11342    if(el) {
11343    while( el.parentElement!==null
11344        && el.parentElement!==document.body
11345    ){
11346        if( elIs(el.parentElement,specs) ) {
11347            temp = el.parentElement;
11348        }
11349        el = el.parentElement;
11350    }
11351    }
11352    return temp;
11353}
11354function elChildren(el,specs) {
11355    var temp = [];
11356    for(var i=0;i<el.children.length;i++) {
11357        var curr = el.children[i];
11358        if(elIs(curr,specs)) {
11359            temp.push(curr);
11360        }
11361    }
11362    return temp;
11363}
11364function elIndex(el,breakCondition) {
11365    breakCondition = breakCondition || function (el) { return false; }
11366    var count = 0;
11367    while(el = el.previousElementSibling) {
11368        if(breakCondition(el)) {break;}
11369        count++;
11370    }
11371    return count;
11372}
11373function elHasClassName(el,className) {
11374    return JSVCListHas(el.className,className," ");
11375}
11376function elAppendClassName(el,className) {
11377    var appended = false;
11378    if(!elHasClassName(el,className)) {
11379        el.className = JSVCListAppend(el.className,className," ");
11380        appended = true;
11381    }
11382    return appended
11383}
11384function elRemoveClassName(el,className) {
11385    var removed = false;
11386    if(elHasClassName(el,className)) {
11387        el.className = JSVCListRemove(el.className,className," ");
11388        removed = true;
11389    }
11390    return removed;
11391}
11392function elHide(el) {
11393    if(!el) return
11394    if(!JSVCListHas(el.className,"hide"," ")) {
11395        el.className = JSVCListAppend(el.className,"hide"," ");
11396    }
11397}
11398function elShow(el) {
11399    if(!el) return
11400    el.className = JSVCListRemove(el.className,"hide"," ");
11401}
11402function elToggle(el) {
11403    if(!el) return
11404    if(!JSVCListHas(el.className,"hide"," ")) {
11405        el.className = JSVCListAppend(el.className,"hide"," ");
11406    } else {
11407        el.className = JSVCListRemove(el.className,"hide"," ");
11408    }
11409}
11410function elRemoveChildren (el,result) {
11411    result = result || [];
11412    while(el.firstElementChild) {
11413        result.unshift(
11414            el.removeChild(el.firstElementChild)
11415        );
11416    }
11417    return result;
11418}
11419function elFilterInputs (formEl) {
11420    formEl = formEl || document;
11421    var selector = [
11422        'textarea'
11423        ,'select'
11424        ,'input[type=text]'
11425        ,'input[type=hidden]'
11426        ,'input[type=password]'
11427        ,'input[type=radio]'
11428        ,'input[type=checkbox]'
11429    ]
11430    var nodelist = formEl.querySelectorAll(selector.join(","));
11431    return nodelist;
11432}
11433
11434// form value getter + setter
11435function writeKey (el) {
11436    var tag      = el.tagName.toLowerCase();
11437    var type     = (tag === "input"? el.type: "");
11438    var multiple = (tag === "select" && el.multiple? "multiple": "");
11439
11440    var k = [tag];
11441    if(type.length>0)     k.push(type);
11442    if(multiple.length>0) k.push(multiple);
11443    return k.join(".");
11444}
11445function writeName (el) {
11446    var name = el.name || "base";
11447    return name;
11448}
11449function writeNameKey (el) {
11450    return writeName(el)+"."+writeKey(el);
11451}
11452// grouped interface
11453function getValueByGroup (groups,fnFilter) {
11454    var getters = function (type) {
11455        var fn = fnFilter || function(el) { return true; };
11456        var target;
11457        switch(type) {
11458        case "textarea"       : target = function (el,vals) { if(fn(el)) vals.push(el.value); }; break;
11459        case "input.text"     : target = function (el,vals) { if(fn(el)) vals.push(el.value); }; break;
11460        case "input.hidden"   : target = function (el,vals) { if(fn(el)) vals.push(el.value); }; break;
11461        case "input.password" : target = function (el,vals) { if(fn(el)) vals.push(el.value); }; break;
11462        case "input.radio"    : target = function (el,vals) { if(fn(el) && el.checked) vals.push(el.value); return vals.length>0;}; break;
11463        case "input.checkbox" : target = function (el,vals) { if(fn(el) && el.checked) vals.push(el.value); }; break;
11464        case "select"         : target = function (el,vals) { if(fn(el) && el.selected) vals.push(el.value); return vals.length>0;}; break;
11465        case "select.multiple": target = function (el,vals) { if(fn(el) && el.selected) vals.push(el.value); }; break;
11466        case "input.reset"    : target = function (el,vals) {}; break;
11467        case "input.submit"   : target = function (el,vals) {}; break;
11468        case "input.button"   : target = function (el,vals) {}; break;
11469        case "button"         : target = function (el,vals) {}; break;
11470        }
11471        return target;
11472    };
11473    var result = {};
11474    var fnTemp,arrTemp;
11475
11476    for(var g in groups) {
11477        fnTemp = getters(g);
11478        if( fnTemp.constructor===Function ) {
11479            if(g==="select" || g==="select.multiple") {
11480                for(var i=0; i<groups[g].length; i++) {
11481                    var target = groups[g][i];
11482                    arrTemp = elsMapExtractor(target.options, fnTemp);
11483                }
11484            } else {
11485                arrTemp = elsMapExtractor(groups[g], fnTemp);
11486            }
11487            result[g] = arrTemp;
11488        }
11489    }
11490    return result;
11491}
11492function setValueByGroup (values,groups,fnFilter) {
11493    var setters = function (type) {
11494        var fn = fnFilter || function(el) { return true; };
11495        var target;
11496        switch(type) {
11497            case "textarea"       : target = function (el,vals) { var val = vals.shift(); if(val && fn(el)) el.value = val; }; break;
11498            case "input.text"     : target = function (el,vals) { var val = vals.shift(); if(val && fn(el)) el.value = val; }; break;
11499            case "input.hidden"   : target = function (el,vals) { var val = vals.shift(); if(val && fn(el)) el.value = val; }; break;
11500            case "input.password" : target = function (el,vals) { var val = vals.shift(); if(val && fn(el)) el.value = val; }; break;
11501            case "input.radio"    : target = function (el,vals) { var idx = $.inArray(el.value , vals); if(idx>-1){ vals.splice(idx,1); }; if(fn(el)) el.checked  = idx>-1; return idx>-1;}; break;
11502            case "input.checkbox" : target = function (el,vals) { var idx = $.inArray(el.value , vals); if(idx>-1){ vals.splice(idx,1); }; if(fn(el)) el.checked  = idx>-1;}; break;
11503            case "select"         : target = function (el,vals) { var idx = $.inArray(el.value , vals); if(idx>-1){ vals.splice(idx,1); }; if(fn(el)) el.selected = idx>-1; return idx>-1;}; break;
11504            case "select.multiple": target = function (el,vals) { var idx = $.inArray(el.value , vals); if(idx>-1){ vals.splice(idx,1); }; if(fn(el)) el.selected = idx>-1;}; break;
11505            case "input.reset"    : target = function (el,vals) {}; break;
11506            case "input.submit"   : target = function (el,vals) {}; break;
11507            case "input.button"   : target = function (el,vals) {}; break;
11508            case "button"         : target = function (el,vals) {}; break;
11509        }
11510        return target;
11511    };
11512    var result = true;
11513    var fnTemp,arrTemp;
11514
11515    for(var g in groups) {
11516        fnTemp = setters(g);
11517        if( fnTemp.constructor===Function && values.hasOwnProperty(g) ) {
11518            if(g==="select" || g==="select.multiple") {
11519                for(var i=0; i<groups[g].length; i++) {
11520                    var target = groups[g][i];
11521                    arrTemp = elsMapExtractor(target.options, fnTemp, values[g].slice(0));
11522                }
11523            } else {
11524                arrTemp = elsMapExtractor(groups[g], fnTemp, values[g].slice(0));
11525            }
11526        }
11527        result = result
11528            && arrTemp.constructor === Array
11529            && arrTemp.length==0;
11530    }
11531    return result;
11532}
11533// nodelist interface
11534if (!Object.keys) {
11535  Object.keys = function(obj) {
11536    var keys = [];
11537
11538    for (var i in obj) {
11539      if (obj.hasOwnProperty(i)) {
11540        keys.push(i);
11541      }
11542    }
11543
11544    return keys;
11545  };
11546}
11547
11548function simplifyObj(obj) {
11549    var olen = Object.keys(obj);
11550    return olen>1? obj: obj[olen[0]];
11551}
11552function getValueByNodelist(nodelist,fnFilter,isSimplified) {
11553    var temp = nodelist.length>0? getValueByGroup( elsGroup(nodelist,writeKey), fnFilter ): null;
11554    isSimplified = isSimplified !== undefined? isSimplified: true;
11555    return isSimplified? simplifyObj(temp): temp;
11556}
11557
11558function setValueByNodelist(values,nodelist,fnFilter) {
11559    var group, gKey;
11560    var temp = {};
11561    var result = null;
11562
11563    if(!values || !nodelist) return result;
11564    group = elsGroup(nodelist,writeKey);
11565    gKey = Object.keys(group);
11566
11567    // patching of alternate parameter
11568    if(values.constructor===String && gKey.length==1) {
11569        temp[ gKey[0] ] = values.split(",");
11570
11571    } else if(values.constructor===Array && gKey.length==1) {
11572        temp[ gKey[0] ] = values;
11573
11574    } else if(values.constructor===Object){
11575        temp = values;
11576
11577    } else {
11578        // proper error handling
11579        //throw "Invalid parameter"
11580    }
11581
11582    result = setValueByGroup(temp,group,fnFilter);
11583    return result;
11584}
11585// name interface
11586function getValueByName(name,fnFilter,isSimplified) {
11587    // return getValueByNodelist(document.getElementsByName(name),fnFilter,isSimplified);
11588    return getValueByNodelist( $('[name="'+name+'"]') ,fnFilter,isSimplified);
11589}
11590function setValueByName(values,name,fnFilter,isSimplified) {
11591	// return setValueByNodelist(values,document.getElementsByName(name),fnFilter,isSimplified);
11592    return setValueByNodelist(values,$('[name="'+name+'"]'),fnFilter,isSimplified);
11593}
11594// form interface
11595function getValuesByForm(formEl,fnFilter,isSimplified) {
11596    var nodelistGroup = elsGroup( elFilterInputs(formEl),writeName );
11597    var result = {};
11598    for(var n in nodelistGroup) {
11599        result[n] = getValueByNodelist(nodelistGroup[n],fnFilter,isSimplified);
11600    }
11601    return result;
11602}
11603function setValuesByForm(values,formEl,fnFilter) {
11604    var nodelistGroup = elsGroup( elFilterInputs(formEl),writeName );
11605    var temp = {};
11606    for(var k in nodelistGroup) {
11607        temp[k] = setValueByNodelist(values[k],nodelistGroup[k],fnFilter);
11608    }
11609    return temp;
11610}
11611function JSVCGetCompatMode() {
11612	var str = "";
11613	str = document.compatMode + '|';
11614	if(document.documentMode)
11615		str += document.documentMode;
11616	return str;
11617}
11618
11619function JSVCGenCustomDDL(name,value,list,delim) {
11620	var lst='',arr=[];
11621	var sSel='_'+name;
11622	var html;
11623	html="<select id='"+sSel+"' style=width:100%;display:none;z-index:9;overflow:visible onblur=Revert(this) onkeydown=RevertKey(this)>";
11624	if(JSVCListFindNoCase(list,value,delim)>=0) list+=value+'|'+value;
11625	html+=JSVCgenOptions(list,delim,value);
11626	html+='</select>';
11627	html+='<input name='+name+' id='+name+' maxlength=500 VALUE="'+value+'" style="width:100%" onfocus=this.select() ondblclick=Invert(this,document.getElementById(\''+sSel+'\')) onkeydown=InvertKey(this,document.getElementById(\''+sSel+'\')) TITLE="#Server.SVClang("Press Down,Up or Enter to Select from List",5110)#"> <span class=clsColorNote>* Double click to select from List</span>';
11628	return html;
11629}
11630function AJAXCaller(surl,type,async,retType) {
11631/*retType : 0 - Return JSON*/
11632	var httpReq = new XMLHttpRequest();
11633	var url = surl
11634	var responseHolder;
11635	var isAsync=false;
11636
11637	if(typeof async!=="undefined") {
11638		isAsync=async;
11639	}
11640
11641	httpReq.onreadystatechange = function() {
11642		if(this.readyState==4 && this.status==200) {
11643			switch(retType) {
11644				case 0:
11645				responseHolder=JSON.parse(this.responseText);
11646				return responseHolder;
11647				break;
11648			}
11649		}
11650	}
11651
11652	httpReq.onerror = function(e) {
11653		console.error(httpReq.statusText);
11654	}
11655
11656	if(type=='POST') {
11657		httpReq.opne(type,url,isAsync)
11658		httpReq.send();
11659	}
11660}
11661
11662function JSVCModalDialog(address,width,height,scrollable,stopBackGround,options)
11663{
11664	var width = width || 600;
11665	var height = height || 400;
11666	var scrollable = scrollable || true;
11667	var stopBackGround = stopBackGround || false;
11668
11669	var $frame = $('<iframe id="svcModalDialog" />');
11670	var dialogueOption = {
11671      url: address,
11672      dialogArguments: null,
11673      height: height,
11674      width: width,
11675      position: 'center',
11676      resizable: true,
11677			title: 'Reference',
11678      scrollable: scrollable,
11679      onClose: function() { },
11680      returnValue: null,
11681			modal: stopBackGround,
11682      doPostBackAfterCloseCallback: false,
11683      postBackElementId: null
11684  };
11685
11686	//If option not defined in dialogueOption, add from options, else append/overwrite default.
11687	if(typeof options!=='undefined') {
11688		dialogueOption=$.extend({},dialogueOption,options);
11689	}
11690
11691	var fns = {
11692      close: function() {
11693          dialogueOption.returnValue = $dialog.returnValue;
11694          $dialog = null;
11695          dialogueOption.onClose();
11696          if (dialogueOption.doPostBackAfterCloseCallback) {
11697              postBackForm(opts.postBackElementId);
11698          }
11699      },
11700      adjustWidth: function() { $frame.css("width", "100%"); }
11701  };
11702
11703	if(dialogueOption.scrollable) {
11704		$frame.css('overflow', 'auto');
11705	}
11706
11707	$frame.css({
11708      'padding': 0,
11709      'margin': 0,
11710      'padding-bottom': 10
11711  });
11712
11713	var $dialogWindow = $frame.dialog({
11714      autoOpen: true,
11715      modal: dialogueOption.modal,
11716      width: dialogueOption.width,
11717      height: dialogueOption.height,
11718      resizable: dialogueOption.resizable,
11719      position: dialogueOption.position,
11720      overlay: {
11721          opacity: 0.5,
11722          background: "black"
11723      },
11724      close: fns.close,
11725      resizeStop: fns.adjustWidth
11726  });
11727
11728	$frame.attr('src', dialogueOption.url);
11729	fns.adjustWidth();
11730
11731	$frame.load(function() {
11732    if ($dialogWindow) {
11733        var maxTitleLength = 50;
11734        var title = dialogueOption.title;
11735        if (title.length > maxTitleLength) {
11736            title = title.substring(0, maxTitleLength) + '...';
11737        }
11738        $dialogWindow.dialog('option', 'title', title);
11739    }
11740  });
11741
11742    $dialog = new Object();
11743    $dialog.dialogArguments = dialogueOption.dialogArguments;
11744    $dialog.dialogWindow = $dialogWindow;
11745    $dialog.returnValue = null;
11746}
11747
11748
11749function JSVCFieldConfig(ins, ct) {
11750
11751    if(typeof _CONST_FIELDS !== "undefined" && typeof addReqConfig == "function" && $.inArray( $('#selScreen').val(), ["CREATE_NEW","CHANGE_REG"] ) > -1 ) 
11752    {     
11753        _CONST_FIELDS = [];
11754        ScrapeFields(2);
11755        addReqConfig();
11756    }
11757    else if(typeof _CONST_FIELDS !== "undefined" && typeof addReqConfig == "function" && $.inArray( $('#selScreen').val(), ["CREATE_NEW","CHANGE_REG"] ) == -1 && typeof _field_config_ctsel !== "undefined")
11758    {
11759        if(typeof _FCONFIG_DONE !== "undefined" && _FCONFIG_DONE == 1)
11760            return;
11761        _CONST_FIELDS = [];
11762        ScrapeFields(2,_FIELDS_MAINHEADER,_field_config_ctsel );
11763        addReqConfig()
11764    }
11765
11766    // FIELD_CONFIG_JS global, populated from customtags/configfieldloader.cfm contains the compulsory/optional settings
11767    if(typeof FIELD_CONFIG_JS == "undefined") return;
11768    var conf_iINSGCOID = $('#ddlbInsurer').val() || ins, conf_ct = $('#_CLMTYPECTRL').val() || ct;
11769    if(typeof conf_iINSGCOID == 'undefined' || conf_iINSGCOID == 0 || typeof conf_ct == 'undefined' || conf_ct == 0) return false;
11770
11771    if( typeof FIELD_CONFIG_JS[conf_iINSGCOID] != 'undefined' && 
11772        typeof FIELD_CONFIG_JS[conf_iINSGCOID][conf_ct] != 'undefined' )
11773    {
11774        if(FIELD_CONFIG_JS[conf_iINSGCOID][conf_ct].REQ != "")
11775            JSVCSetReqList(FIELD_CONFIG_JS[conf_iINSGCOID][conf_ct].REQ,true);
11776
11777        if(FIELD_CONFIG_JS[conf_iINSGCOID][conf_ct].OPT != "")
11778            JSVCSetReqList(FIELD_CONFIG_JS[conf_iINSGCOID][conf_ct].OPT,false);
11779    }
11780    if(typeof FieldConfigChk === 'function') {
11781        if (typeof _CONST_FIELDS !== "undefined") {
11782            _FCONFIG_DONE = 1;
11783            FieldConfigChk(conf_iINSGCOID,conf_ct);
11784        }
11785        else 
11786        {
11787            FieldConfigChk(conf_iINSGCOID,conf_ct);
11788        }
11789    }
11790
11791}
11792
11793function JSVCFieldReset() {
11794    
11795    if(typeof _CONST_FIELDS !== "undefined" && typeof resetReqConfig == "function" && $.inArray( $('#selScreen').val(), ["CREATE_NEW","CHANGE_REG"] ) > -1 ) 
11796    {
11797        resetReqConfig();
11798        $('.set_chklbl').remove();
11799    }
11800    
11801    if(typeof FIELD_CONFIG_JS == "undefined") return;
11802    var conf_iINSGCOID = $('#ddlbInsurer').val(), conf_ct = $('#_CLMTYPECTRL').val();
11803    if(typeof conf_iINSGCOID == 'undefined' || conf_iINSGCOID == 0 || typeof conf_ct == 'undefined' || conf_ct == 0) return false;
11804
11805    if( _old_FIELD_CONFIG_CT && typeof FIELD_CONFIG_JS[conf_iINSGCOID] != 'undefined' && 
11806        typeof FIELD_CONFIG_JS[conf_iINSGCOID][_old_FIELD_CONFIG_CT] != 'undefined' )
11807    {
11808        if(FIELD_CONFIG_JS[conf_iINSGCOID][_old_FIELD_CONFIG_CT].REQ != "")
11809            JSVCSetReqList(FIELD_CONFIG_JS[conf_iINSGCOID][_old_FIELD_CONFIG_CT].REQ,false);
11810
11811        if(FIELD_CONFIG_JS[conf_iINSGCOID][_old_FIELD_CONFIG_CT].OPT != "")
11812            JSVCSetReqList(FIELD_CONFIG_JS[conf_iINSGCOID][_old_FIELD_CONFIG_CT].OPT,true);
11813    }
11814}
11815
11816function JSVCEscapeHTML(s, forAttribute) {
11817    var ESC_CHR = { '&':'&amp;', '<':'&lt;', '>':'&gt;', '"':'&quot;', "'":'&#39;', "/":'&#x2F;' }
11818
11819    if(!forAttribute) forAttribute=true
11820
11821    return s.replace(forAttribute ? /[&<>'"]/g : /[&<>]/g, function(c) {
11822        return ESC_CHR[c];
11823    });
11824}
11825
11826/* credit to: https://stackoverflow.com/questions/9804777/how-to-test-if-a-string-is-json-or-not*/
11827function JSVCIsJson(item) {
11828    item = typeof item !== "string"
11829        ? JSON.stringify(item)
11830        : item;
11831    try {
11832        item = JSON.parse(item);
11833    } catch (e) {
11834        return false;
11835    }
11836
11837    if (typeof item === "object" && item !== null) {
11838        return true;
11839    }
11840
11841    return false;
11842}
11843function chkLoginName(obj) {
11844	var regexp = /^[\w$]+$/;
11845	if(obj && obj.value.trim().length>0 && !regexp.test(obj.value)) {
11846		alert(JSVClang('Only Alphanumeric (a-z, 0-9) and underscore (_) are allowed for User ID.'));
11847		obj.value = "";
11848		return false;
11849	}
11850	return true;
11851}
11852
11853function JSVCChkDomUrl(mode, url, redir){
11854	if(mode == null || mode == '')
11855		mode = -1;
11856
11857	if(redir == null || redir == '')
11858		redir = 0;
11859
11860	if(mode > 0){
11861		var url = request.webroot + "index.cfm?fusebox=SVCobj&fuseaction=json_SVCChkRedirURL&mode=" + mode + "&oriurl=" + url + "&redir=" + redir + "&" + request.mtoken, o;
11862		o = MRMHTTPRequest("GET", url, null, null, JSVCRedirErr, null, null, null, null);
11863
11864		if(o.responseText != '' && o.responseText != null){
11865			var ErrResponseText = /Error ID:[^0-9]*([0-9]+)[^0-9]*/i.exec(o.responseText);
11866		    if(ErrResponseText){
11867		        str = 'An error occured. The error ID is : ' + ErrResponseText[1];               
11868		        alert(str);
11869		        return;
11870		    }
11871
11872		    var resp = JSON.parse(o.responseText);
11873				durl = resp.DURL,
11874		    	mode = resp.MODE,
11875		    	oriurl = resp.ORIURL,
11876		    	redir = resp.REDIR,
11877		    	type = resp.TYPE,
11878		    	wl = resp.WL;
11879
11880		    if(mode == 2 && redir == 1){
11881		    	if(wl == 1)
11882		    		window.location.href = oriurl;	
11883		    	else
11884		    		JSVCRedirBlock();
11885		    }else{
11886		    	return resp;   
11887		    }
11888		}
11889	}
11890}
11891
11892function JSVCRedirBlock(){
11893	var title = 'Security Warning!';
11894	var msg = 'The system detected a malicious redirect attempt. You are required to re-login to the system in order to restart the session.<br><br>You may contact Merimen support for further assistance.';
11895	var btnstr = '<tr><td align=center><input type="button" class="clsButton" id="okBtn" value=" OK " onClick="window.location.href = \'' + request.webroot + 'index.cfm?fusebox=SVCsec&fuseaction=act_logout&root=MIC&' + request.mtoken + '\'"></td></tr>';
11896	JSVCniceralert(msg, 0 , title, null, null, btnstr);
11897	return;
11898}
11899
11900function JSVCRedirErr(){
11901	JSVCniceralert("System encountered an unexpected error. Please close this window and try again.", 0 ,"Unexpected Error.");
11902	return;
11903}
11904
11905function JSVCEncodeForJS(string){
11906	return DOMPurify.sanitize(string);
11907}
11908
11909function JSVCEncodeForJSTEXT(string) {
11910	return DOMPurify.sanitize(string, {
11911			ALLOWED_TAGS: ['a', 'b', 'i', 'strong', 'em', 'u', 'span', 'div', 'p', 'br', 'hr'],
11912			ALLOWED_ATTR: ['href', 'title'] // Restrict attributes to only those relevant to allowed tags
11913	});
11914}
11915
11916function checkSSTFormat(obj){
11917	var chkCOMP = JSVCchkSvcTaxMY(obj);    //Checking for format from #57364
11918	if (chkCOMP !== "") {
11919			var formattedMessage = chkCOMP = chkCOMP.replace(/<br\s*\/?>/gi, '\n');
11920			alert(formattedMessage); // Use alert to show message with line breaks
11921			obj.value = '';
11922			obj.focus();
11923	}
11924}
11925
11926function checkSSTRegFormat (obj, nm){
11927	var SST = JSVCall(nm + 'SSTRegNo');  // SST registration number field
11928	var SSTRegOpt1 = JSVCall('_' + nm + 'SSTRegOpt1');  // SST Registered?
11929	var SSTRegOpt0 = JSVCall('_' + nm + 'SSTRegOpt0');  
11930	if (obj.value === '') {
11931		return;  
11932	}
11933	if (SSTRegOpt1.checked) {			//Company Type (SST Registered:Yes)
11934		checkSSTFormat(obj);    //Checking for format from #57364
11935	} else if (SSTRegOpt0.checked) { //Company Type (SST Registered:No)
11936			// No checking for the field
11937	} else {
11938			// If neither option is checked - For individual 
11939		var checkFormat = /^[0-9a-zA-Z\-]+$/;
11940		if (checkFormat.test(obj.value) == false) {
11941			alert("Invalid SST Registration No. No special character allowed except for (-)");
11942			obj.value = '';
11943			obj.focus();
11944		}
11945	}
11946	DoReq(SST);
11947}
11948
11949function checkTINFormat(obj,selIND){
11950	var str = JSVCIDChkTIN(obj,selIND);
11951	if (str!=""){
11952		alert(str);
11953		obj.value = '';
11954		obj.focus();
11955	}
11956}
11957
11958function TINGSTFieldChk(obj,nm,nm2){
11959	var TIN=JSVCall(nm2+'TIN');
11960	var SST=JSVCall(nm2+'SSTRegNo');
11961
11962	if(TIN!=null){
11963		if($("#_"+nm+"IND").is(':checked')){
11964			TIN.setAttribute('CHKREQUIRED',0);
11965			$('#'+nm2+'tin-note').hide();
11966			
11967		}
11968		else if($("#_"+nm+"COM").is(':checked')){
11969			TIN.setAttribute('CHKREQUIRED',1);
11970			$('#'+nm2+'tin-note').show();
11971		}
11972		DoReq(TIN);
11973	}
11974	
11975	/*
11976	if(SST!=null){
11977		if($("#_"+nm+"IND").is(':checked')){
11978			SST.setAttribute('CHKREQUIRED',0);
11979			
11980		}
11981		else if($("#_"+nm+"COM").is(':checked')){
11982			SST.setAttribute('CHKREQUIRED',1);
11983		}
11984		DoReq(SST);
11985	}
11986	*/
11987}
11988//#55723: SST Registered? Field Visibility function
11989function SSTFieldOpt(obj, nm, nm2) {
11990	var row = $("#TR" + nm2 + "SSTRegOpt");
11991
11992    if ($("#_" + nm + "IND").is(':checked')) {
11993        // Hide the SST Registered options when Individual is checked
11994        row.hide(); 
11995    } else if ($("#_" + nm + "COM").is(':checked')) {
11996        // Show the SST Registered options when Company is checked
11997        row.show(); 
11998    }
11999}
12000
12001
12002//#55723
12003function SSTFieldChk(obj, nm) {
12004	var SST = JSVCall('_' + nm + 'SSTRegNo');  // Get the SST registration number field
12005
12006	if ($("#_" + nm + "SSTRegOpt1").is(':checked')) {
12007		// Mandatory for SST registration number field if SST Registered?=Yes
12008		SST.setAttribute('CHKREQUIRED',1); 
12009	} else if ($("#_" + nm + "SSTRegOpt0").is(':checked')) {
12010		// Optional for SST registration number field if SST Registered?=No
12011		SST.removeAttribute('CHKREQUIRED');
12012	}
12013	DoReq(SST);
12014}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.