/*
return element object by Id
@param string, object Id
@return element object
*/
function elId(id){return document.getElementById(id);}

/*
return element object by name
@param string, object name
@return element object
*/
function elName(name){return document.getElementByName(name);}

/**
 * trim value
 * @param string strToTrim. value to be trim.
 * @return string
 */
function trim(strToTrim)
{
	return strToTrim.replace(/^\s+|\s+$/g,"");
}

/**
 * set object visibility
 * @param string strObjName. object name.
 * @param boolean blnShow. true=visible | false=collapse
 */
function setObjVisibility(strObjName, blnShow)
{	
	var obj = elId(strObjName);
	if(obj == null) return;

	var strVisibleValue ;
//	if(blnShow == 'true') strVisibleValue = 'visible';
//	else strVisibleValue = 'collapse';
//	obj.style.visibility = strVisibleValue;
	
	if(blnShow == 'true')
	{
		obj.style.display = '';
		obj.style.visibility = 'visible';		
	}
	else obj.style.display = 'none';
}

/**
 * set object Div msg
 * @param string strObjName. regex.
 * @param string strMsg. msg
 * @param string strClassName. css class name
 */
function setDivMsg(strObjName, strMsg, strClassName)
{
	var obj = elId(strObjName);
	if(obj == null) return;
	if(typeof(strClassName) != 'undefined' && strClassName.length > 0) 
	{
		strMsg = "<span class='" + strClassName +"'>" + strMsg + "</span>";
	}
	obj.innerHTML  = strMsg;
}

/*
* Do submit
*/
function doSubmit(objCtrl)
{
	objCtrl.form.submit();
}

/*
* Do Client site language translation
*/
function lang(strKey)
{
	var translation = eval(strKey);
	if(translation == '') return strKey;
	return translation;
}

function escapeHTML (str)
{
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML;
}


/*
* Include a js file in a js file. same as includeJs2 
*/
function includeJs(strUrl)
{
	var str = '<script type="text/javascript" src="' + strUrl + '"></script>';
	document.write(str); 
}

/*
* Include a js file in a js file. same as includeJs 
*/
function includeJs2(strUrl)
{
	var body = document.getElementsByTagName('body').item(0);
	script = document.createElement('script');
	script.src = strUrl;
	script.type = 'text/javascript';
	body.appendChild(script);
}

function popWin(url, h, w) 
{
	var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

	if(typeof(h) == 'undefined') h = 600;
	if(typeof(w) == 'undefined') w = 700;
	
	if (is_chrome)
	{
		w=window.open('about:blank', "W958b6e9ea6bed1f9c5288b15959dad77", "left=150,top=120,menubar=no,height="+h+",width="+w+",scrollbars=yes,resizable=yes");
		w.opener = null;
		w.document.location = url;
	}
	else
	{
		w=window.open(url, "W958b6e9ea6bed1f9c5288b15959dad77", "left=150,top=120,menubar=no,height="+h+",width="+w+",scrollbars=yes,resizable=yes");
	}
	w.focus();
} 

<!--
/*
 * cookie.js - mainly manipulate cookie handling which similar to backend php
 * Secondly manipulate serialize, url, security
 */
//serialize object
//Source from : http://www.coolcode.cn/andot/javascript-php-serialize-unserialize/171
//Source from : http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
var core_serialize = {
	serialize:function(o){
		var p = 0, sb = [], ht = [], hv = 1;
		var classname = function(o) {
			if (typeof(o) == 'undefined' || typeof(o.constructor) == 'undefined') return '';
			var c = o.constructor.toString();
			c = core_serialize.utf16to8(c.substr(0, c.indexOf('(')).replace(/(^\s*function\s*)|(\s*$)/ig, ''));
			return ((c == '') ? 'Object' : c);
		};
		var is_int = function(n) {
			var s = n.toString(), l = s.length;
			if (l > 11) return false;
			for (var i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {
				switch (s.charAt(i)) {
					case '0':
					case '1':
					case '2':
					case '3':
					case '4':
					case '5':
					case '6':
					case '7':
					case '8':
					case '9': break;
					default : return false;
				}
			}
			return !(n < -2147483648 || n > 2147483647);
		};
		var in_ht = function(o) {
			for (var k in ht) if (ht[k] === o) return k;
			return false;
		};
		var ser_null = function() {
			sb[p++] = 'N;';
		};
		var ser_boolean = function(b) {
			sb[p++] = (b ? 'b:1;' : 'b:0;');
		};
		var ser_integer = function(i) {
			sb[p++] = 'i:' + i + ';';
		};
		var ser_double = function(d) {
			if (isNaN(d)) d = 'NAN';
			else if (d == Number.POSITIVE_INFINITY) d = 'INF';
			else if (d == Number.NEGATIVE_INFINITY) d = '-INF';
			sb[p++] = 'd:' + d + ';';
		};
		var ser_string = function(s) {
			var utf8 = core_serialize.utf16to8(s);
			sb[p++] = 's:' + utf8.length + ':"';
			sb[p++] = utf8;
			sb[p++] = '";';
		};
		var ser_date = function(dt) {
			sb[p++] = 'O:4:"Date":7:{';
			sb[p++] = 's:4:"year";';
			ser_integer(dt.getFullYear());
			sb[p++] = 's:5:"month";';
			ser_integer(dt.getMonth() + 1);
			sb[p++] = 's:3:"day";';
			ser_integer(dt.getDate());
			sb[p++] = 's:4:"hour";';
			ser_integer(dt.getHours());
			sb[p++] = 's:6:"minute";';
			ser_integer(dt.getMinutes());
			sb[p++] = 's:6:"second";';
			ser_integer(dt.getSeconds());
			sb[p++] = 's:11:"millisecond";';
			ser_integer(dt.getMilliseconds());
			sb[p++] = '}';
		}
		var ser_array = function(a) {
			sb[p++] = 'a:';
			var lp = p;
			sb[p++] = 0;
			sb[p++] = ':{';
			for (var k in a) {
				if (typeof(a[k]) != 'function') {
					is_int(k) ? ser_integer(k) : ser_string(k);
					__serialize(a[k]);
					sb[lp]++;
				}
			}
			sb[p++] = '}';
		};
		var ser_object = function(o) {
			var cn = classname(o);
			if (cn == '') ser_null();
			else if (typeof(o.serialize) != 'function') {
				sb[p++] = 'O:' + cn.length + ':"' + cn + '":';
				var lp = p;
				sb[p++] = 0;
				sb[p++] = ':{';
				if (typeof(o.__sleep) == 'function') {
					var a = o.__sleep();
					for (var kk in a) {
						ser_string(a[kk]);
						__serialize(o[a[kk]]);
						sb[lp]++;
					}
				}
				else {
					for (var k in o) {
						if (typeof(o[k]) != 'function') {
							ser_string(k);
							__serialize(o[k]);
							sb[lp]++;
						}
					}
				}
				sb[p++] = '}';
			}
			else {
				var cs = o.serialize();
				sb[p++] = 'C:' + cn.length + ':"' + cn + '":' + cs.length + ':{' +cs + '}';
			}
		};
		var ser_pointref = function(R) {
			sb[p++] = 'R:' + R + ';';
		};
		var ser_ref = function(r) {
			sb[p++] = 'r:' + r + ';';
		};
		var __serialize = function(o) {
			if (o == null || o.constructor == Function) {
				hv++;
				ser_null();
			}
			else switch (o.constructor) {
				case Boolean: {
					hv++;
					ser_boolean(o);
					break;
				}
				case Number: {
					hv++;
					is_int(o) ? ser_integer(o) : ser_double(o);
					break;
				}
				case String: {
					hv++;
					ser_string(o);
					break;
				}
				case Date: {
					hv++;
					ser_date(o);
				}
				case Object:
				case Array: {
					var r = in_ht(o);
					if (r) {
						ser_pointref(r);
					}
					else {
						ht[hv++] = o;
						ser_array(o);
					}
					break;
				}
				default: {
					var r = in_ht(o);
					if (r) {
						hv++;
						ser_ref(r);
					}
					else {
						ht[hv++] = o;
						ser_object(o);
					}
					break;
				}
			}
		};
		__serialize(o);
		return sb.join('');
	},
	
	unserialize:function(ss) {
		var p = 0, ht = [], hv = 1;
		var unser_null = function() {
			p++;
			return null;
		};
		var unser_boolean = function() {
			p++;
			var b = (ss.charAt(p++) == '1');
			p++;
			return b;
		};
		var unser_integer = function() {
			p++;
			var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
			p++;
			return i;
		};
		var unser_double = function() {
			p++;
			var d = ss.substring(p, p = ss.indexOf(';', p));
			switch (d) {
				case 'NAN': d = NaN; break;
				case 'INF': d = Number.POSITIVE_INFINITY; break;
				case '-INF': d = Number.NEGATIVE_INFINITY; break;
				default: d = parseFloat(d);
			}
			p++;
			return d;
		};
		var unser_string = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var s = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			return s;
		};
		var unser_array = function() {
			p++;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var a = [];
			ht[hv++] = a;
			for (var i = 0; i < n; i++) {
				var k;
				switch (ss.charAt(p++)) {
					case 'i': k = unser_integer(); break;
					case 's': k = unser_string(); break;
					case 'U': k = unser_unicode_string(); break;
					default: return false;
				}
				a[k] = __unserialize();
			}
			p++;
			return a;
		};
		var unser_date = function() {
			var k, a = [];
			for (var i = 0; i < 7; i++) {
				p++;
				k = unser_string();
				p++;
				a[k] = unser_integer();
			}
			var dt = new Date(
				a['year'],
				a['month'] - 1,
				a['day'],
				a['hour'],
				a['minute'],
				a['second'],
				a['millisecond']
			);
			ht[hv++] = dt;
			return dt;
		}
		var unser_object = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var cn = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			if (cn == "Date" && n == 7) {
				return unser_date();
			}
			if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
				eval(['function ', cn, '(){}'].join(''));
			}
			var o = eval(['new ', cn, '()'].join(''));
			ht[hv++] = o;
			for (var i = 0; i < n; i++) {
				var k;
				switch (ss.charAt(p++)) {
					case 's': k = unser_string(); break;
					case 'U': k = unser_unicode_string(); break;
					default: return false;
				}
				if (k.charAt(0) == '\0') {
					k = k.substring(k.indexOf('\0', 1) + 1, k.length);
				}
				o[k] = __unserialize();
			}
			p++;
			if (typeof(o.__wakeup) == 'function') o.__wakeup();
			return o;
		};
		var unser_custom_object = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var cn = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
				eval(['function ', cn, '(){}'].join(''));
			}
			var o = eval(['new ', cn, '()'].join(''));
			ht[hv++] = o;
			if (typeof(o.unserialize) != 'function') p += n;
			else o.unserialize(ss.substring(p, p += n));
			p++;
			return o;
		};
		var unser_unicode_string = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var sb = [];
			for (var i = 0; i < l; i++) {
				if ((sb[i] = ss.charAt(p++)) == '\\') {
					sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += 4), 16));
				}
			}
			p += 2;
			return sb.join('');
		};
		var unser_ref = function() {
			p++;
			var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
			p++;
			return ht[r];
		};
		var __unserialize = function() {
			switch (ss.charAt(p++)) {
				case 'N': return ht[hv++] = unser_null();
				case 'b': return ht[hv++] = unser_boolean();
				case 'i': return ht[hv++] = unser_integer();
				case 'd': return ht[hv++] = unser_double();
				case 's': return ht[hv++] = unser_string();
				case 'U': return ht[hv++] = unser_unicode_string();
				case 'r': return ht[hv++] = unser_ref();
				case 'a': return unser_array();
				case 'O': return unser_object();
				case 'C': return unser_custom_object();
				case 'R': return unser_ref();
				default: return false;
			}
		};
		return __unserialize();
	},
	
	utf16to8:function(str){
		var out, i, len, c;
		out = "";
		len = str.length;
		for(i = 0; i < len; i++) {
			c = str.charCodeAt(i);
			if ((c >= 0x0001) && (c <= 0x007F)) {
				out += str.charAt(i);
			} else if (c > 0x07FF) {
				out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
				out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
			} else {
				out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
			}
		}
		return out;
	},

	utf8to16:function(str){
		var out, i, len, c;
		var char2, char3;

		out = "";
		len = str.length;
		i = 0;
		while(i < len) {
			c = str.charCodeAt(i++);
			switch(c >> 4)
			{ 
			  case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
				// 0xxxxxxx
				out += str.charAt(i-1);
				break;
			  case 12: case 13:
				// 110x xxxx   10xx xxxx
				char2 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
				break;
			  case 14:
				// 1110 xxxx  10xx xxxx  10xx xxxx
				char2 = str.charCodeAt(i++);
				char3 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x0F) << 12) |
							   ((char2 & 0x3F) << 6) |
							   ((char3 & 0x3F) << 0));
				break;
			}
		}
		return out;
	}
};//end serialize object

// Url Object
var core_url = {
	getBaseDomain:function(){
		e = document.domain.split(/\./);
		if(e.length > 1) return (e[e.length-2] + "." +  e[e.length-1]) ;
		else return "";	  
	}
};//end url object

// Cookie Object
var core_cookie = {
	iExpiry : 0,
	sPath : '/',
	sDomain : '',
	bSecure : false,
	bHttpOnly : true,

	getTime:function(){
		var dTime = new Date();
		dTime.getTime();
		return Math.round(dTime/1000);
	},
	
	setExpiry:function(){
		this.iExpiry = this.getTime()- 3600;
	},

	addExpiryTime:function(iTime){
		this.iExpiry = this.getTime() + iTime;
	},

	setBaseDomain:function(){
		if(this.isLocalHost()) return;		
		this.sDomain = "." + core_url.getBaseDomain();
	},

	setFullDomain:function(){
		if(this.isLocalHost()) return;
		this.sDomain = "." + document.location.hostname ;
	},

	setOtherDomain:function(sDomain){
		this.sDomain = sDomain;
	},
	
	isLocalHost:function(){
		var sHost = document.location.hostname;
		if(sHost.search(/localhost/i)<0) return false;
		this.sDomain = 'core.cookie.dev';
		return true;
	},
	
	setSecure:function(){
		this.bSecure = true;
	},

	setPath:function(sPath){
		this.sPath = sPath;
	},

	getValue:function(sType, sSubKey){
		var sCookie = this.getCookie(sType);
		var aPart = new Array();
		if(sCookie != "")
		{
			sCookie = core_security.decodeValue(sCookie);
			aPart = core_serialize.unserialize(sCookie);
			if(typeof(sSubKey) == 'undefined') return aPart;	

			if(typeof(aPart[sSubKey]) != 'undefined') return aPart[sSubKey];
		}
		return "";
	},

	setValue:function(sType, mValue, sSubKey){
		var sCookie = this.getCookie(sType);
		var aPart = new Array(); 	
		var sValue;
		if(sCookie != "")
		{
			sCookie = core_security.decodeValue(sCookie);
			aPart = core_serialize.unserialize(sCookie);			
		}
		if(typeof(sSubKey) != 'undefined')
		{
			aPart[sSubKey] = mValue ; 
			sValue = core_serialize.serialize(aPart);
		}
		else
		{			
			sValue = core_serialize.serialize(mValue);			
		}
		sValue = core_security.encodeValue(sValue);
		return this.setCookie(sType, sValue);
	},

	setCookie:function(sName, sValue){
		var iExpiry = this.iExpiry ;
		var oDate = new Date();
		oDate.setTime(iExpiry * 1000);
		iExpiry = oDate.toGMTString();
		var sPath = this.sPath ;
		var sDomain = this.sDomain ;
		var bSecure = this.bSecure ;

		var sCookie = sName + "=" + escape ( sValue ) ;
		if ( iExpiry )	sCookie += "; expires=" + iExpiry;
		if ( sPath )	sCookie += "; path=" + escape ( sPath );
		if ( sDomain )	sCookie += "; domain=" + escape ( sDomain );	  
		if ( bSecure )	sCookie += "; secure";	  
		document.cookie = sCookie;
	},

	getCookie:function(sName){
		if (document.cookie.length>0){
			sStart=document.cookie.indexOf(sName + "=");
			if (sStart!=-1){ 
				sStart=sStart + sName.length+1; 
				sEnd=document.cookie.indexOf(";",sStart);
				if (sEnd==-1) sEnd=document.cookie.length;
				return unescape(document.cookie.substring(sStart,sEnd));
			} 
		}	
		return "";
	}
};//end cookie object

core_cookie.addExpiryTime(3600);
core_cookie.setBaseDomain();

// Security Object
var core_security = {	
	s:"",
	t:"",

	encodeValue:function(mValue){
		return this.doSwitch(mValue, true);
	},
	
	decodeValue:function(sValue){
		return this.doSwitch(sValue, false);		
	},
	
	doSwitch:function(sValue, bEncode)
	{
		if(sValue == "") return sValue;
		
		var aCode = this.getEncodeSource(bEncode);
		aStr = sValue.split("");
		var sNew = "";
		var sChar = "";
		for (var i=0; i< aStr.length; i++ )
		{
			sChar = aStr[i];
			if(typeof(aCode[sChar]) != 'undefined') sNew += aCode[sChar];
			else sNew += sChar;
		}
		return sNew;
	},
	
	getEncodeSource:function(bEncode)
	{
		var aCode = new Array();
		var sSource = this.s;
		var sTarget = this.t;

		var aSource = sSource.split("");
		var aTarget = sTarget.split("");

		if(bEncode)
		{
			for(var i=0; i<aSource.length; i++)
			{
				aCode[aSource[i]] = aTarget[i];
			}			
		}
		else
		{
			for(var i=0; i<aTarget.length; i++)
			{
				aCode[aTarget[i]] = aSource[i];
			}
		}
		return aCode;		
	}


};//end object security

//encode from http://iframe.in/
//core_security.s = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
eval(unescape('%63%6F%72%65%5F%73%65%63%75%72%69%74%79%2E%73%20%3D%20%22%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%31%32%33%34%35%36%37%38%39%30%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%22%3B'));
//core_security.t = "hijklVWXYZvwxyz123mnopqr4stu560ABCDEFG789HIJKQRSTLMNOPUabcdefg";
eval(unescape('%63%6F%72%65%5F%73%65%63%75%72%69%74%79%2E%74%20%3D%20%22%68%69%6A%6B%6C%56%57%58%59%5A%76%77%78%79%7A%31%32%33%6D%6E%6F%70%71%72%34%73%74%75%35%36%30%41%42%43%44%45%46%47%37%38%39%48%49%4A%4B%51%52%53%54%4C%4D%4E%4F%50%55%61%62%63%64%65%66%67%22%3B'));

//-->

function correctPNG() {// correctly handle PNG transparency in Win IE 5.5 & 6.
   var arVersion = navigator.appVersion.split("MSIE"); var version = parseFloat(arVersion[1]);
   if ((version >= 5.5) && (document.body.filters)) {
      for(var i=0; i<document.images.length; i++) {
         var img = document.images[i]; var imgName = img.src.toUpperCase();
         if (imgName.substring(imgName.length-3, imgName.length) == "PNG") {
            var imgID = (img.id) ? "id='" + img.id + "' " : ""; var imgClass = (img.className) ? "class='" + img.className + "' " : "";
            var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "; var imgStyle = "display:inline-block;" + img.style.cssText 
            if (img.align == "left") imgStyle = "float:left;" + imgStyle
            if (img.align == "right") imgStyle = "float:right;" + imgStyle
            if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
            var strNewHTML = "<span " + imgID + imgClass + imgTitle
            + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
            + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
            + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>";
            img.outerHTML = strNewHTML
            i = i-1;
         }
      }
   }    
}
if (window.addEventListener)
	window.addEventListener("onload", correctPNG, false);
else
	window.attachEvent("onload", correctPNG);
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 3e(a,b,c,d){7(G(d)==\'I\')d=\'\';q e=2g+"/"+b+"/1I-3f-3g.2h?2i="+a+"&3h="+c+"&"+d;$.2j(e)}9 3i(a){q b=1k 1l();b[\'R\']=\'3j\';b[\'3k\']=\'1J\';b[\'3l\']=\'3m\';b[\'3n\']=\'1J\';b[\'3o\']=\'1J\';q c=r.H(\'3p[]\');q d=s;q e="";J(q i=0;i<c.w;i++){7(c[i].v==u)e=c[i].F}7(e==""){3q("2k 1K 3r 1m.");A s}q f=r.1n.2l.F;7(f.w>2m){f=f.M(0,2m)+\'...\'}q g=3s.3t();q h=2g+"/"+b[a]+"/1n.2h?3u="+e+"&2l="+f+"&2n="+a+"&2i="+g;$.2j(h,9(){2o()})}9 2o(){q a=r.L(\'3v\');B="<14 1L=\'2p\'></14><14 1L=\\"1n\\">3w 3x J 3y 1n.</14><14 1L=\'2p\'></14>";7(a!=S)a.X=B}9 3z(a){1M=D(\'1o-2q\');1N=D(\'1o-2r\');2s=2t(1M.F);1O=2t(1N.F);7((1O<2s)&&1O!=\'-1\'){7(a==u)1N.F=\'-1\';z 1M.F=\'-1\'}}9 3A(a,b,c,d){Y=3B(a,\'0,\'+d,s);7(Y==s){2u(b,\'u\');2v(b,\'2k 1K 3C 5 \'+c+\' 3D.\');3E(b,\'3F\');a.v=s;N(a,s,u)}z{2v(b,\'\');2u(b,\'s\')}}9 D(a){A r.L(a)}9 3G(a){D(a).K.Z=\'1p\';D(a).K.1P=\'3H\'}9 3I(a){D(a).K.Z=\'1q\';D(a).K.1P=\'3J\'}9 1Q(a){7(r.L){r.L(a).K.Z=\'1p\';r.L(a).K.T=\'1e\'}z{7(r.10){r.10[a].Z=\'1p\';r.10[a].T=\'1e\'}z{r.1f[a].K.Z=\'1p\';r.1f[a].K.T=\'1e\'}}}9 1R(a){7(r.L){r.L(a).K.Z=\'1q\';r.L(a).K.T=\'1S\'}z{7(r.10){r.10[a].Z=\'1q\';r.10[a].T=\'1S\'}z{r.1f[a].K.Z=\'1q\';r.1f[a].K.T=\'1S\'}}}9 1r(a){a.15=u}9 16(a){a.15=s}9 2w(a,b){7(r.L){r.L(a).X=b}z{7(r.10){r.10[a].X=b}z{r.1f[a].X=b}}}9 3K(a){a=r.H(a);J(i=0;i<a.w;i++){a[i].15=u}}9 3L(a){19=a;1s(19);a=r.H(a);J(i=0;i<a.w;i++){a[i].v=u;17(a[i]);N(a[i],s,u)}}9 3M(a){19=a;1s(19);a=r.H(a);J(i=0;i<a.w;i++){a[i].v=u;1T(a[i]);N(a[i],s,u)}}9 2x(a){19=a;1s(19);a=r.H(a);J(i=0;i<a.w;i++){a[i].v=u;17(a[i]);N(a[i],s,u)}}9 1s(a){a=r.H(a);J(i=0;i<a.w;i++){a[i].v=s;N(a[i],s,u);16(a[i])}}9 2x(a,b,c,d){2y(a,b,c);q e=0;7(G(c)==\'I\')c="";7(G(d)!=\'I\'){C=1t.1u.1v.1w(\'\',\'1U\',1t.1u.1v.1w(d)[0]);e=1}z{C=r.H(\'1a[]\')}J(i=0;i<C.w;i++){7(C[i].v&&C[i].15)Q;E=C[i].R;E=E.M(8);U=E.M(E.w-4,E.w);1g=E.M(0,3);7(b==0&&a==1&&(E==\'1x\'||U==\'1y\'||1g==\'1V\')&&e==0)Q;7(b==1&&a==0&&(E!=\'1x\'&&U!=\'1y\'))Q;7(c==E&&b==1&&a==0)Q;C[i].v=u;N(C[i],s,u);17(C[i])}}9 2y(a,b,c,d){q e=0;7(G(c)==\'I\')c="";7(G(d)!=\'I\'){C=1t.1u.1v.1w(\'\',\'1U\',1t.1u.1v.1w(d)[0]);e=1}z{C=r.H(\'1a[]\')}J(i=0;i<C.w;i++){7(C[i].v==s&&C[i].15==s)Q;E=C[i].R;E=E.M(8);U=E.M(E.w-4,E.w);1g=E.M(0,3);7(b==0&&a==1&&(E==\'1x\'||U==\'1y\'||1g==\'1V\')&&e==0)Q;7(b==1&&a==0&&(E!=\'1x\'&&U!=\'1y\'&&1g!=\'1V\'))Q;7(c==E&&b==1&&a==0)Q;C[i].v=s;N(C[i],s,u);16(C[i]);17(C[i]);1b=\'1W\'+C[i].R;V=D(1b);7(V!=S)16(V)}}9 3N(a){q b=r.H(a);J(q x=0;x<b.w;x++)N(b[x],s,u,u)}9 3O(a){q b=a.O;b=r.H(b);J(i=0;i<b.w;i++){N(b[i],s,u)}}9 3P(a,b){y=D(a);7(y==S)A;1X=D(b);7(1X==S)A;y.v=1X.v;N(y)}9 N(a,b,c,d){q e="2z";q f="3Q";7(a.v==u){a.11.1z=e}z{a.11.1z=f}7(G(b)==\'I\')b=s;7(G(d)==\'I\')d=s;2A(a,b,d);7(G(c)==\'I\')c=s;7(c==s)2B(a);1b=\'1W\'+a.R;V=D(1b);7(V!=S)V.v=a.v}1A.2C=9(a){7(!1Y.1Z.21){q b=[\'/\',\'.\',\'*\',\'+\',\'?\',\'|\',\'(\',\')\',\'[\',\']\',\'{\',\'}\',\'\\\\\'];1Y.1Z.21=1k 1A(\'(\\\\\'+b.3R(\'|\\\\\')+\')\',\'g\')}A a.1c(1Y.1Z.21,\'\\\\$1\')};9 2A(a,b,c){7(G(b)==\'I\')b=s;7(G(c)==\'I\')c=s;W=a.O;W=W.1c("[]","")+\'2D\';7(W==\'3S\')W=\'3T\';12=2E(a.3U);12=12.1c(\'&\',\'&3V;\');7(a.F!=3W&&a.F.M(0,2)==\'3X\')12=12+\' (3Y)\';7(12==\'\')A;q d=r.L(W);7(d==S)A;2F=\'<b>3Z 40: </b><41/>\';B=d.X;7(G(B)==\'I\'||B==\'\'){B=\', \'}z{B=B.M(27);B=\', \'+B+\', \'}2G=\', \'+12+\', \';7(a.v==u&&b==s&&a.15==s){B=B+12+\', \'}z 7(!c){q e=1k 1A(1A.2C(2G));B=B.1c(e,\', \')}7(B.w>4){B=B.M(2,(B.w-2));B=2F+B}z{B=\'\'}d.X=B}9 2B(a){7(G(2H)==\'9\')2H(a)}9 42(a,b){U=\'43\'+a;22=\'44\'+a;7(G(b)==\'I\'){q c=D(U);7(c.K.T==\'\'||c.K.T==\'1e\')b=u;z b=s}7(b){D(22).X=\'45 2I\';1R(U)}z{D(22).X=\'46 2I\';1Q(U)}}9 47(a){y=D(a);7(y==S)A;y.v=u;17(y)}9 17(a){W=a.O;Y=a.v;23=a.11.11.1z;1d=s;q b=r.H(W);J(x=0;x<b.w;x++){7(b[x].R==a.R&&1d==s){1d=u;Q}7(1d==s)Q;1B=b[x].11.11.1z;7(1B=="")Q;7(1B==23&&1d==u)2J;7(1B<23&&1d==u)2J;b[x].v=Y;N(b[x],u,u);7(Y)1r(b[x]);z 16(b[x]);1b=\'1W\'+b[x].R;V=D(1b);7(V!=S){7(Y)1r(V);z 16(V)}}}9 1T(a){W=\'2K[]\';Y=a.v;2L=a.F;q b=r.H(W);J(x=0;x<b.w;x++){1C=b[x].11.11.R;1C=1C.M(6);7(1C!=2L)Q;b[x].v=Y;N(b[x],u,u);7(Y)1r(b[x]);z 16(b[x])}}9 48(a){y=r.L(a);7(y!=S)1T(y)}9 49(a){y=r.L(a);7(y!=S)17(y)}9 4a(a){q b=a+"4b";q c=r.L(b);7(c.K.T==\'\'||c.K.T==\'1e\')1R(b);z 1Q(b);2M(a)}9 2M(a){q b=a+"2D";q c=2N(a);2w(b,c)}9 2N(a){q b=1l();7(a==\'2O\')b=1h(a,r.H(\'24[]\'));7(a==\'2P\')b=1h(a,r.H(\'25[]\'));7(a==\'2Q\'){q b=1h(a,r.H(\'1a[]\'));b=1h(a,r.H(\'2n[]\'),b[0],b[1],b[2])}7(G(b[0])!=\'I\')A b[0];A""}9 1h(a,b,c,d,e){q f=1;q g=0;q h=0;q j="";q k=2R(a);q l="4c";7(G(c)==\'I\'||c==k)q c="";7(G(d)!=\'I\')h=h+d;7(G(e)!=\'I\'&&e!=0){g=g+e;c=c.1c(" ... "+g+" 2S","")}f=f-h;7(f<=0)f=0;J(i=0;i<b.w;i++){7(b[i].v==u&&f>0){q m=r.4d(\'4e\');q n="";J(x=0;x<m.w;x++){7(m[x].4f==b[i].R){n=m[x].X}}c+=j+""+n+"";f--;h++;j=", "}z 7(b[i].v==u&&f==0){g++;h++}}7(h==0)c=k;z 7(f==0&&g>0){q o=" ... "+g+" 2S";c+=o}q p=1l();p[0]=c;p[1]=h;p[2]=g;A p}9 2R(a){7(a==\'2O\')A"26 24";7(a==\'2Q\')A"26 1a";7(a==\'2P\')A"26 25";A s}9 4g(a){2T(\'2U\');q b="";b=b+13(\'2U\');b=b+P(\'4h\');b=b+13(\'1m\');b=b+P(\'1a\',1);b=b+P(\'25\',1);b=b+P(\'24\',1);b=b+P(\'2K\',1);b=b+P(\'1P\',1);b=b+P(\'1I-1D\',1);b=b+P(\'4i\',1);b=b+P(\'C-4j-4k\',1);b=b+13(\'4l\');b=b+13(\'1o-2q\');b=b+13(\'1o-2r\');b=b+13(\'1E\');b=b+P(\'2V\');b=b+P(\'1E-1m\');b=b+13(\'1E-4m\');b=b+P(\'1I-4n\',1);b=b+1i(\'4o\');b=b+1i(\'2W\');b=b+1i(\'4p\');b=b+1i(\'4q\');7(b!=""){b=b.M(1,b.w);a=a+\'?\'+b}r.1a.4r=a}9 2T(a){7(D(a).F==D(a).4s)D(a).F=\'\'}9 13(a){y=D(a);7(y!=S){28=2E(y.F);7(28!="")A\'&\'+a+\'=\'+29(28)}A\'\'}9 P(a,b){1F=a;7(G(b)!=\'I\'&&b==1)1F=1F+\'[]\';y=r.H(1F);q c=\'\';J(i=0;i<y.w;i++){7(y[i].v&&y[i].15==s){c=c+y[i].F+\',\'}}7(c!=\'\'){c=c.M(0,c.w-1);c=\'&\'+a+\'=\'+29(c)}A c}9 1i(a){y=r.H(a);q b=\'\';J(i=0;i<y.w;i++){b=b+y[i].F}7(b!=\'\'){b=\'&\'+a+\'=\'+b}A b}9 29(a){q b=a;b=b.4t();b=4u(b);b=b.1c(/%20/g,\'+\');A b}1G="4v";9 4w(a,b,c,d,e){7(!d){d=b}7(!e){e=c}2X(1G,a,d,e,"4x","");2Y()}9 4y(){2a(1G).1H=4z}9 2Y(){2a(1G).1H=4A}9 2a(a){7(4B.4C.4D("4E")!=-1){A 4F[a]}z{A r[a]}}9 2X(a,b,c,d,e,f){q g=\'\';g+=\'<2Z 4G="4H:4I-4J-4K-4L-4M" \';g+=\'R="\'+a+\'" \';g+=\'4N="30://4O.31.32/4P/33/4Q/34/4R.4S#" \';g+=\'35="\'+c+\'" \';g+=\'1H="\'+d+\'">\';g+=\'<1j O="4T" F="\'+b+\'"/>\';g+=\'<1j O="36" F="\'+e+\'"/>\';g+=\'<1j O="37" F="38"/>\';g+=\'<1j O="39" F="\'+f+\'"/>\';g+=\'<1j O="3a" F="3b"/>\';g+=\'<3c 2W="\'+b+\'"\';g+=\' 35="\'+c+\'"\';g+=\' 1H="\'+d+\'"\';g+=\' 1D="4U/x-33-34"\';g+=\' O="\'+a+\'"\';g+=\' 3a="3b"\';g+=\' 37="38"\';g+=\' 36="\'+e+\'" \';g+=\' 39="\'+f+\'" \';g+=\' 4V="u" \';g+=\' 4W="30://4X.31.32/4Y/4Z">\';g+=\'</3c>\';g+=\'</2Z>\';r.50(g)}9 51(){q a=1k 1l("1E-1m","2V");q c=$("2b").2c("1U");q d=$("2b").2c("1K");q e=$("2b").2c("52");c.2d(\'[1D="3d"]\').53(\'\').54(\'55\');c.2d(\'[1D="56"]\').2e(9(){q t=$(2f);7(t.18(\'v\')&&($.57(t.18(\'O\'),a)==-1)){t.18(\'v\',\'\');t.58().59(\'2z\')}});q b="";c.2d(\':5a\').2e(9(){q t=$(2f);7(b!=t.18(\'O\')){b=t.18(\'O\');$(\'[O=\'+b+\']:v\').18(\'v\',\'\');t.18(\'v\',\'v\')}});$(\'14.5b\').3d(\'\');d.2e(9(){2f.5c=0})}',62,323,'|||||||if||function|||||||||||||||||var|document|false||true|checked|length||oCtrl|else|return|sHtml|field|getEl|iId|value|typeof|getElementsByName|undefined|for|style|getElementById|substring|updateThis|name|asGetCBList|continue|id|null|display|sKey|oSl|sName|innerHTML|bCheck|visibility|layers|parentNode|sDesc|asGetText|div|disabled|enableThis|toggleCb|attr|fieldName|location|sSL|replace|bStart|none|all|sKey2|getCheckBoxLabel|asGetHidden|param|new|Array|option|feedback|experience|hidden|visible|disableThis|uncheckAll|YAHOO|util|Dom|getElementsByClassName|90100|0000|className|RegExp|sParantCls|sParentSpe|type|salary|sCtrl|leaderboard_id|height|job|malaysia|select|class|oMin|oMax|iMax|position|hidediv|showdiv|block|toggleCbSpe|input|901|Sl|oCtrl2|arguments|callee||sRE|sLblKey|sStart|specialization|industry|Select||sVal|asUrlEncode|jobstreet_getFlash|form|find|filter|each|this|dPath|php|rnd|get|Please|fbmsg|1000|country|updFb|enter|min|max|iMin|Number|setObjVisibility|setDivMsg|updateInnerHtml|checkAllLoc|uncheckAllLoc|labelSelected|updateThisDesc|updateThisDetail|escape|Sel|trim|sLegend|sSearch|updateThisExternal|Options|break|role|iSpe|updateOptSel|getCheckBoxSet|qsSpe|qsInd|qsLoc|getDefLabelDesc|more|fixInputCaption|key|classified|src|jobstreet_writeFlash|jobstreet_shrink_leaderboard|object|http|macromedia|com|shockwave|flash|width|wmode|quality|high|flashvars|allowscriptaccess|always|embed|text|doSearchLog|search|log|cnt|sendFeedBack|indonesia|my|th|thailand|ph|sg|fb|alert|one|Math|random|fbid|fbCon|Thank|you|your|ctrlYoe|ctrlMaxSel|checkRequiredCb|maximum|only|setDivClass|errorReg|hideEl|absolute|showEl|static|disableAll|checkAll|checkAllSpe|updateThisScan|updateRadioSet|updateThisById|labelNormal|join|roleSel|specializationSel|alt|amp|70000|70|SG|Your|Selection|br|toggleSpeRole|optSpeRole|lblTogSpeRole|Hide|More|toggleCbById|toggleAllSpe|toggleAllLoc|toggleQs|Con|All|getElementsByTagName|label|htmlFor|doAdvanceSearch|area|qualification|of|study|nationality|currency|posted|campus|sort|order|href|title|toString|encodeURIComponent|homepage_leaderboard|jobstreet_setup_expleaderboard|transparent|jobstreet_expand_leaderboard|120|60|navigator|appName|indexOf|Microsoft|window|classid|clsid|D27CDB6E|AE6D|11cf|96B8|444553540000|codebase|download|pub|cabs|swflash|cab|movie|application|swliveconnect|pluginspage|www|go|getflashplayer|write|clearAdvanceSearch|textarea|val|trigger|blur|checkbox|inArray|parent|removeClass|radio|optConSel|selectedIndex'.split('|'),0,{}))
function getEl(sId){return document.getElementById(sId);}

function displayBanner()
{
	if(getEl('banner1')){getEl('header-right').innerHTML = getEl('bannerMY').innerHTML;}
	if(getEl('bannerCP1')){if(typeof(maxPageWidth)!='undefined'){getEl('bannerCP1').style.left=(maxPageWidth-368);}else{getEl('bannerCP1').style.left=(790-368);}
	getEl('bannerCP1').style.top=10;getEl('bannerCP1').style.visibility='visible';}
	if (getEl('bannerCP2')){if(typeof(maxPageWidth)!='undefined'){getEl('bannerCP2').style.left=(maxPageWidth-368+104);}else{getEl('bannerCP2').style.left=(790-368+104);}
	getEl('bannerCP2').style.top=10;getEl('bannerCP2').style.visibility='visible';}
	if(getEl('banner'))
	{
		sHtml = getEl('banner').innerHTML;
		bFound = sHtml.search("codebase");
		bFound = -1;
		if(bFound == -1) 
		{
			getEl('header-right').innerHTML = getEl('banner').innerHTML;
			getEl('banner').innerHTML = "";
		}
		else
		{
			getEl('banner').style.position = "static";
			getEl('banner').style.visibility = "visible";
		}
	}
}

 /**
 * Validator Javascript set use fo:	
 *	1.	Form Javascript validation set
 * File: validator.js
 *
 * @Created clloke <chenlin@jobstreet.com>
 */

/**
 * Casting Data Type
 * @param string sText. value to be cast.
 * @param string sType. data type
 * @return mix cast data type.
 */
function typeCasting(sText, sType)
{
	sType = sType.toLowerCase();
	switch(sType)
	{
		case 'int': 
		case 'integer': 
			sText = parseInt(sText);	
			break;		
		case 'float':
		case 'double':			
			sText = parseFloat(sText);	
			break;		
		case 'boolean': sText = Boolean(sText);	break;
		case 'date': break;
		case 'string': 
		default : 
			sText = sText.toString();	
			break;
	}
	return sText;
}

function changeDate(oCtrl, sName, bHandle)
{
	var oDate = document.getElementsByName(sName);	
	if(typeof(oDate) == 'undefined') return false;

	var bComplete = true;

	var oDay = document.getElementsByName(sName + '_day');	
	sDay = oDay[0].selectedIndex;
	if(typeof(sDay) == 'undefined' || sDay == 0) bComplete = false;
	
	var oMonth = document.getElementsByName(sName + '_month');	
	sMonth = oMonth[0].selectedIndex;
	if(typeof(sMonth) == 'undefined' || sMonth == 0) bComplete = false;

	var oYear = document.getElementsByName(sName + '_year');	
	sYear = oYear[0].selectedIndex;
	if(typeof(sYear) == 'undefined' || sYear == 0) bComplete = false;
		
	if(bComplete == false)	
	{
		oDate[0].value = '' ;
		return;
	}
	var sDate = oDay[0].value + '-' + oMonth[0].value + '-' + oYear[0].value ;
	oDate[0].value = sDate;	
	
	if(typeof(bHandle) != 'undefined' && bHandle == true) core_validator.onCheckComponent(oDate[0]);
}
	/*---------------------------------------------------------------------------------------------
		Validation Component Part
	---------------------------------------------------------------------------------------------*/

/**
 * Check Empty/Required
 * @param string sText. value to be check.
 * @return boolean. true = pass | false = fail
 */
function isRequired(sText)
{
	if(trim(sText) == '') return false;
	return true;
}

/**
 * Check on regex
 * @param string regex. regex.
 * @param string sText. value to be check.
 * @return boolean. true = pass | false = fail
 */
function checkRegEx(regex, sText)
{
	//no checking for empty value
	if(trim(sText) == '') return true; 

	sText = sText.toString();
	var strRegex = new RegExp(regex);

	if (strRegex.test(sText)) return true; 
	return false;
}

/**
 * Check on valid value like email, date
 * @param string sText. value to be check.
 * @param string sType. data type
 * @return boolean. true = pass | false = fail
 */
function checkValid(sText, sType)
{
	switch (sType)
	{
		case 'date':
			return checkDate(sText);
			break;
	}
	return true;
}

function checkDate(sText)
{
	var sDate = getStrDate(sText, '-');
	var aDate = sDate.split('-');
	var sDay = aDate[2];
	var sMonth = aDate[1];
	var sYear = aDate[0]; 

	if (sDay.charAt(0) == 0) sDay = sDay.substr(1,sDay.length);
	if (sMonth.charAt(0) == 0) sMonth = sMonth.substr(1,sMonth.length);

	var oDate = new Date(sYear, sMonth-1, sDay);
	if ((oDate.getMonth()+1 != sMonth) || (oDate.getDate() != sDay) || (oDate.getFullYear() != sYear))
	{
		return false;
	}
	return true;
}

/**
 * Check on min range
 * @param string minValue. minimum value
 * @param string sText. value to be check.
 * @param string sType. data type
 * @return boolean. true = pass | false = fail
 */
function checkRangeMin(minValue, sText, sType)
{
	//no checking for empty value
	if(trim(sText) == '') return true; 

	sText = typeCasting(sText, sType);
	minValue = typeCasting(minValue, sType);
	if(sType == 'date') 
	{
		sText = getStrDate(sText);
		minValue = getStrDate(minValue);
	}
	if (sText >= minValue) return true; 
	return false;
}

/**
 * Check on max range
 * @param string maxValue. maximum value
 * @param string sText. value to be check.
 * @param string sType. data type
 * @return boolean. true = pass | false = fail
 */
function checkRangeMax(maxValue, sText, sType)
{
	//no checking for empty value
	if(trim(sText) == '') return true; 

	sText = typeCasting(sText, sType);
	maxValue = typeCasting(maxValue, sType);
	if(sType == 'date') 
	{
		sText = getStrDate(sText);
		maxValue = getStrDate(maxValue);
	}
	if (sText <= maxValue) return true; 
	return false;
}

/**
 * Compare value
 * @param string strTag. compare tag
 * @param string strCompare. compare value
 * @param string sText. value to be check.
 * @param string sType. data type
 * @return boolean. true = pass | false = fail
 */
function checkCompare(strTag, strCompare, sText, sType)
{
	//no checking for empty value
	if(trim(sText) == '') return true; 
	if(sType == 'date') 
	{
		var sText = getStrDate(sText);
		var strCompare = getStrDate(strCompare);
		sType = 'integer';
	}
	
	sText = typeCasting(sText, sType);
	strCompare = typeCasting(strCompare, sType);	
	strTag = strTag.toString();	

	switch(strTag)
	{
		case ">"	: if (sText > strCompare) return true; break;
		case ">="	: if (sText >= strCompare) return true; break;
		case "<"	: if (sText < strCompare) return true; break;
		case "<="	: if (sText <= strCompare) return true; break;
		case "="	: if (sText == strCompare) return true; break;
		case "!="	: if (sText != strCompare) return true; break;
	}
	return false;
}

/**
 * recompile date in yyyy-mm-dd format
 * @param string sText. value to be recompiled.
 * @param string strDelimeter. delimeter
 * @return string.
 */
function getStrDate(sText, strDelimeter)
{
	//Support 4 delimeter /- . (slash,dash,dot,space) and year should be 4 char
	//Return server format in yyyy<strDelimeter>mm<strDelimeter>dd

	var arrDate = new Array();
	arrDate = sText.split("/");	
	if(arrDate.length != 3) arrDate = sText.split("-");
	if(arrDate.length != 3) arrDate = sText.split(".");	
	if(arrDate.length != 3) arrDate = sText.split(" ");	
	if(arrDate.length != 3) return false;	
	
	var year;
	var month;
	var day;
	if(arrDate[0].length == 4) 
	{
		year = arrDate[0];
		month = arrDate[1];
		day = arrDate[2];
	}
	else if(arrDate[2].length == 4)
	{
		year = arrDate[2];
		month = arrDate[1];
		day = arrDate[0];
	}
	else return false;	

	if(month.length == 1) month = '0' + month;
	if(day.length == 1) day = '0' + day;
	
	if(typeof(strDelimeter) == 'undefined' || strDelimeter == null) strDelimeter = '';

	var strDate = year + strDelimeter +  month + strDelimeter + day;
	return strDate;
}

/**
 * Check on min length
 * @param string intMin. minimum value
 * @param string sText. value to be check.
 * @return boolean. true = pass | false = fail
 */
function checkLengthMin(intMin, sText)
{
	sText = sText.toString();
	if (sText.length < parseInt(intMin)) return false;	
	return true;
}

/**
 * Check on max length
 * @param string intMax. maximum value
 * @param string sText. value to be check.
 * @return boolean. true = pass | false = fail
 */
function checkLengthMax(intMax, sText)
{
	sText = sText.toString();
	if (sText.length > parseInt(intMax)) return false;	
	return true;
}	

/**
 * Check on Required within a group
 * @param string sText. value to be check.
 * @param array group. other dom object to check
 * @return boolean. true = pass | false = fail
 */
function checkRequired(sText, aGroup)
{
	var bResult = isRequired(sText);
	if(bResult) return true;
	if(aGroup.length > 0)
	{
		for (var i =0; i<aGroup.length; i++)
		{
			var aObjCtrl = document.getElementsByName(aGroup[i]);
			for (var j=0; j<aObjCtrl.length ; j++ )
			{
				if(typeof(aObjCtrl[j].value) == 'undefined') continue;
				if(trim(aObjCtrl[j].value) == "") continue;
				bResult = true;
			}
		}
		return bResult;
	}	
}

/**
 * Check on Required within a group
 * @param string sText. value to be check.
 * @param array param. reserve param
 * @return boolean. true = pass | false = fail
 */
function checkRequiredList(oCtrl, sParam, bCoreValidation)
{
	var aParam = sParam.split(",");
	var intMin = aParam[0];
	var intMax = aParam[1];
	if(oCtrl.multiple == false)
	{
		if(oCtrl.length > 1 && intMin > 0) if(oCtrl.value == "" || oCtrl.value == "00") 
		{
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_SELECT ;
			else return false;
		}
	}
	else
	{
		var iCntSel = 0;
		for(var i=0; i < oCtrl.length ; i++) if(oCtrl.options[i].selected) iCntSel++;
		if(iCntSel < intMin ) 
		{
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_SELECT_MIN;
			else return false;
		}
		if(iCntSel > intMax)
		{
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_SELECT_MAX;
			else return false;
		}
	}
	return true;
}

/**
 * Check on Required within a group
 * @param string sText. value to be check.
 * @param array param. reserve param
 * @return boolean. true = pass | false = fail
 */
function checkRequiredCb(oCtrl, sParam, bCoreValidation)
{
	var aParam = sParam.split(",");
	var intMin = aParam[0];
	var intMax = aParam[1];

	var aCtrl = document.getElementsByName(oCtrl.name);
	if(aCtrl.length == 1)
	{
		if(oCtrl.checked == false)
		{	
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_CHECK;
			return false;
		}
	}
	else
	{
		var iCntSel = 0;
		for(var i=0; i < aCtrl.length ; i++) if(aCtrl[i].checked == true) iCntSel++;

		if(iCntSel < intMin ) 
		{
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_CHECK_MIN;
			else return false;
		}
		if(iCntSel > intMax)
		{
			if(bCoreValidation) return vConfig.error.ERR_REQUIRED_CHECK_MAX;
			else return false;
		}
	}
	return true;
}

/**
 * Check on Required within a group
 * @param string sText. value to be check.
 * @param array param. reserve param
 * @return boolean. true = pass | false = fail
 */
function checkRequiredRadio(oCtrl, aParam)
{ 
	var sName = oCtrl.name;
	var aElement = document.getElementsByName(sName);
	var bResult = false;
	for (var i =0; i<aElement.length; i++)
	{
		var aObjCtrl = aElement[i];
		if(aObjCtrl.checked == true)bResult = true;		
	}
	return bResult;
}

/**
 * Check on Required within a group
 * @param string sText. value to be check.
 * @param array group. other dom object to check
 * @return boolean. true = pass | false = fail
 */
function checkMatch(sText, aMatch)
{
	if(aMatch.length > 0)
	{
		var bResult = true;
		for (var i =0; i<aMatch.length; i++)
		{
			var aObjCtrl = document.getElementsByName(aMatch[i]);
			for (var j=0; j<aObjCtrl.length ; j++ )
			{
				if(typeof(aObjCtrl[j].value) == 'undefined') continue;
				if(trim(aObjCtrl[j].value) == "") continue;
				if(sText != aObjCtrl[j].value) bResult = false;
			}
		}
		return bResult;
	}
}

//sText=file name
//aConf=<max size>,<format seperate by |>
function checkFile(oCtrl, aConf)
{
	if(oCtrl.form.enctype == '')
	{
		// Developer Msg
		var sMsg = "Missing enctype in form tag";
		alert(sMsg);		
	}

	if(typeof(aConf[0]) != 'undefined')
	{
		//browser not allow to check file size
		var iMaxSize = aConf[0];
	}

	if(typeof(aConf[1]) != 'undefined')
	{
		var sFormat = aConf[1];
	}
	//current not yet solution for checking file at client side without activeX
	return true;
}

var vConfig = {
	//Validation Type
	type: {	
		TYP_REQUIRED: "REQUIRED",				//Required validation 
		TYP_REQUIRED_LIST: "REQUIRED_LIST",		//Required validation 
		TYP_REQUIRED_RADIO: "REQUIRED_RADIO",	//Required validation 
		TYP_REQUIRED_CB: "REQUIRED_CB",			//Required validation 
		TYP_FORMAT: "FORMAT",				//Format validation
		TYP_LENGTH_MIN: "LENGTH_MIN",		//Length min value
		TYP_LENGTH_MAX: "LENGTH_MAX",		//Length max value
		TYP_RANGE_MIN: "RANGE_MIN",		//Range min value
		TYP_RANGE_MAX: "RANGE_MAX",			//Range max value
		TYP_COMPARE_TAG: "COMPARE_TAG",		//Comparison tag
		TYP_COMPARE_VALUE: "COMPARE_VALUE",	//Comparison Target value
		TYP_CUSTOM_FUNC: "FUNCTION",			//Customize function 
		TYP_CUSTOM_PARAM: "PARAM",			//Customize function parameter
		TYP_MATCH: "MATCH",					//Matching
		TYP_FILE: "FILE",					//File
		TYP_TYPE: "TYPE",						//data type
		TYP_DIV: "EDIV",						//error msg div		
		TYP_LABEL: "LABEL",						//error msg label
		TYP_DELIMITER: "DELIMITER"						//error msg label
	},
	
	//Validation Expression
	exp: {
		EXP_INT_POSITIVE	: /^\d+$/ ,			//+ integer 
		EXP_INT_NEGATIVE	: /^-\d+$/ ,		//- integer 
		EXP_INT				: /^-{0,1}\d+$/ ,	//+/- integer 
		EXP_NUMBER_POSITIVE	: /^\d*\.{0,1}\d+$/ ,			//+ number
		EXP_NUMBER_NEGATIVE	: /^-\d*\.{0,1}\d+$/ ,		//- number
		EXP_NUMBER			: /^-{0,1}\d*\.{0,1}\d+$/ ,	//+/- number
		EXP_CURRENCY	: /^\d+(\.\d{0,2})?$/ ,		//+ currency with 2 decimal
		EXP_RATE		: /^\d+(\.\d{0,4})?$/ ,		//+ rate with 4 decimal
		EXP_STRING_ALPHA	: /^([a-zA-Z]+)$/ ,		//Alphabet only
		EXP_STRING_ALPHANUM	: /^([0-9A-Za-z]+)$/ ,		//Alphabet & Numeric only
		EXP_STRING			: /^([0-9A-Za-z_]+)$/ ,	//Alphabet & Numeric & _
		EXP_STRING_NAME		: /^([0-9A-Za-z_\.]+)$/ ,	//Alphabet & Numeric & _
		EXP_YEAR		: /^(19|20)[\d]{2,2}$/ ,	//Year From 1900 - 2099
		/* dd/mm/yyyy | dd-mm-yyyy */
		EXP_DATE_DMY	: /^([1-9]|0[1-9]|[12][0-9]|3[01])[\/|-]([1-9]|0[1-9]|1[012])[\/|-](19|20)\d\d$/ ,
		/* yyyy-mm-dd | yyyy/mm/dd */
		EXP_DATE_YMD	: /^(19|20)\d\d[\/|-]([1-9]|0[1-9]|1[012])[\/|-]([1-9]|0[1-9]|[12][0-9]|3[01])$/ , 
		EXP_DOMAIN : /^([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$/ ,				//Domain Name
		EXP_URL	   : /^https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?$/ ,	//Url
		/* Ip address */
		EXP_IPV4   : /^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/ ,	
		/* Email */
		EXP_EMAIL  : /^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/ 	
	},
	
	//Validation Error Code
	error: {
		ERR_REQUIRED	: "ERR_REQUIRED",	//required field missing
		ERR_REQUIRED_SELECT : "ERR_REQUIRED_SELECT",	//required field missing - select
		ERR_REQUIRED_SELECT_MAX : "ERR_REQUIRED_SELECT_MAX",	//required field at min - select
		ERR_REQUIRED_SELECT_MIN : "ERR_REQUIRED_SELECT_MIN",	//required field at max - select
		ERR_REQUIRED_CHECK :  "ERR_REQUIRED_CHECK",	//required field missing - check
		ERR_REQUIRED_CHECK_MAX : "ERR_REQUIRED_CHECK_MAX",	//required field at min - select
		ERR_REQUIRED_CHECK_MIN : "ERR_REQUIRED_CHECK_MIN",	//required field at max - select
		ERR_FORMAT		: "ERR_FORMAT",		//format error
		ERR_RANGE_MIN	: "ERR_RANGE_MIN",	//min value is required
		ERR_RANGE_MAX	: "ERR_RANGE_MAX",	//max value exceed
		ERR_COMPARE		: "ERR_COMPARE",	//compare error
		ERR_LENGTH_MIN	: "ERR_LENGTH_MIN",	//min length is required
		ERR_LENGTH_MAX	: "ERR_LENGTH_MAX",	//max length exceed
		ERR_CUSTOM		: "ERR_CUSTOM",		//custom function error
		ERR_INVALID		: "ERR_INVALID",		//invalid input
		ERR_MATCH		: "ERR_MATCH",		//match input
		ERR_FILE_MAXSIZE : "ERR_FILE_MAXSIZE",
		ERR_FILE_EXT : "ERR_FILE_EXT",		
		ERR_FILE_INI_SIZE : "ERR_FILE_INI_SIZE",		//STANDARD PHP FILE UPLOAD ERROR
		ERR_FILE_FORM_SIZE : "ERR_FILE_FORM_SIZE",		//STANDARD PHP FILE UPLOAD ERROR
		ERR_FILE_PARTIAL : "ERR_FILE_PARTIAL",			//STANDARD PHP FILE UPLOAD ERROR
		ERR_FILE_NO_TMP_DIR : "ERR_FILE_NO_TMP_DIR",	//STANDARD PHP FILE UPLOAD ERROR
		ERR_FILE_CANT_WRITE : "ERR_FILE_CANT_WRITE",	//STANDARD PHP FILE UPLOAD ERROR
		ERR_FILE_EXTENSION : "ERR_FILE_EXTENSION"		//STANDARD PHP FILE UPLOAD ERROR
	},

	form : "",
	
	key : "",

	getType:function(sType)
	{
		if(this.isKeyExist() == false) return "";
		var sJs = "var sVal = this.oKey." + sType ;
		eval(sJs);
		if(typeof(sVal) == 'undefined') return "";
		return sVal;
	},	
	
	getError:function(sKey)
	{	
		if(this.isFormExist() == false) return "";
		if(typeof(this.oFrom.error) == 'undefined') return "";
		sKey = sKey.replace("[]", "");
		if(typeof(this.oFrom.error[sKey]) == 'undefined') return "";
		return this.oFrom.error[sKey];	
	},

	getErrorInput:function(sKey)
	{	
		if(this.isFormExist() == false) return "";
		if(typeof(this.oFrom.errorInput) == 'undefined') return "";
		sKey = sKey.replace("[]", "");
		if(typeof(this.oFrom.errorInput[sKey]) == 'undefined') return "";
		return this.oFrom.errorInput[sKey];	
	},
	
	addError:function(sKey, sCode, sInput)
	{	
		if(this.isFormExist() == false) return "";
		if(typeof(this.oFrom.error) != 'object') this.oFrom.error = new Array();
		sKey = sKey.replace("[]", "");
		this.oFrom.error[sKey] = sCode;
		if(typeof(sInput) != 'undefined') 
		{
			if(typeof(this.oFrom.errorInput) != 'object') this.oFrom.errorInput = new Array();
			this.oFrom.errorInput[sKey] = sInput;
		}
	},
	
	killError:function(sKey)
	{
		if(typeof(this.oFrom.error) == 'undefined') return "";
		sKey = sKey.replace("[]", "");
		this.oFrom.error[sKey] = 'undefined';
	},

	getRegex:function(regex)
	{	
		var sJs = "var regex = vConfig.exp." + regex + ";";
		eval(sJs);
		return regex;
	},
	
	isKeyExist:function()
	{
		if(this.isFormExist() == false) return false;
		sKey = this.key.replace("[]", "");
		var sJs = "var oKey = vConfig." + this.form + "." + sKey + ";";
		eval(sJs);
		if(typeof(oKey) != 'object') return false;
		this.oKey = oKey;
		return true;
	},

	isFormExist:function()
	{
		var sJs = "var oForm = vConfig." + this.form + ";";
		eval(sJs);		
		if(typeof(oForm) != 'object') return false;
		this.oFrom = oForm;
		return true;
	}
	
	
};//end config object

	/*---------------------------------------------------------------------------------------------
		Core Validation Part
	---------------------------------------------------------------------------------------------*/

var core_validator = {
	onCheckComponent:function(oCtrl) {
		/**
		 * Check Component upon event
		 * @param object oCtrl. component
		 * @return boolean. true = pass | false = fail
		 */
		if(oCtrl == null) return true;
		var sText = trim(oCtrl.value);
		var sForm = oCtrl.form.name;
		var sKey = oCtrl.name; 

		//get js config form object
		vConfig.form = sForm;
		vConfig.key = sKey;
		var sType = vConfig.getType(vConfig.type.TYP_TYPE);
		var bResult = true;

		//check required
		var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED);
		var aRequired = sRequired.split(","); 
		if(aRequired[0] == 1 || aRequired[0] == 'true')
		{				
			aRequired.shift();
			if (!checkRequired( sText, aRequired ))
			{
				vConfig.addError(sKey, vConfig.error.ERR_REQUIRED);
				bResult = false;
			}
		}

		//check list
		var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_LIST);			 
		if(sRequired != "")
		{		
			var sRequired = checkRequiredList(oCtrl, sRequired, true );
			if (!(sRequired == true))
			{
				vConfig.addError(sKey, sRequired);
				bResult = false;
			}
		}

		//check checkbox
		var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_CB);
		if(sRequired != "")
		{		
			var sRequired = checkRequiredCb( oCtrl, sRequired , true);
			if (!(sRequired == true))
			{
				vConfig.addError(sKey, sRequired);
				bResult = false;
				//do uncheck here
				if(sRequired == vConfig.error.ERR_REQUIRED_CHECK_MAX) oCtrl.checked = false;
			}
		}

		//check radio
		var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_RADIO);
		var aRequired = sRequired.split(","); 
		if(aRequired[0] == 1 || aRequired[0] == 'true')
		{		
			aRequired.shift();
			if (!checkRequiredRadio(oCtrl, aRequired ))
			{
				vConfig.addError(sKey, vConfig.error.ERR_REQUIRED_SELECT);
				bResult = false;
			}
		}

		//skip check on empty value
		if(bResult && sText == '') 
		{
			this.isValidInput(sForm,sKey);
			return true;
		}

		var aValue = new Array(sText);
		//Check for delimiter
		var sDelimiter = vConfig.getType(vConfig.type.TYP_DELIMITER);
		if(sDelimiter != "") var aValue = sText.split(sDelimiter);
	
		for (var i=0; i< aValue.length ; i++ )
		{
			var sSubText = trim(aValue[i]);
			//check format
			var strRegex = vConfig.getType(vConfig.type.TYP_FORMAT);
			if(bResult && strRegex != '')
			{
				strRegex = vConfig.getRegex(strRegex);
				if (!checkRegEx(strRegex,sSubText))
				{		
					vConfig.addError(sKey, vConfig.error.ERR_FORMAT, sSubText);
					bResult = false;
				}
			}

			//check min length
			var intLengthMin = vConfig.getType(vConfig.type.TYP_LENGTH_MIN);
			if(bResult && intLengthMin != '')
			{
				if (!checkLengthMin(intLengthMin, sSubText))
				{
					vConfig.addError(sKey, vConfig.error.ERR_LENGTH_MIN, sSubText);
					bResult = false;
				}
			}

			//check max length
			var intLengthMax = vConfig.getType(vConfig.type.TYP_LENGTH_MAX);
			if(bResult && intLengthMax != '')
			{
				if (!checkLengthMax(intLengthMax, sSubText))
				{
					vConfig.addError(sKey, vConfig.error.ERR_LENGTH_MAX, sSubText);
					bResult = false;
				}
			}

			//check valid
			if(bResult)
			{
				if (!checkValid(sSubText, sType))
				{
					vConfig.addError(sKey, vConfig.error.ERR_INVALID, sSubText);
					bResult = false;
				}
			}

			//check min range
			var mixRangeMin = vConfig.getType(vConfig.type.TYP_RANGE_MIN); 
			if(bResult && mixRangeMin != '')
			{
				if (!checkRangeMin(mixRangeMin, sSubText, sType))
				{
					vConfig.addError(sKey, vConfig.error.ERR_RANGE_MIN, sSubText);
					bResult = false;
				}
			}

			//check max range
			var mixRangeMax = vConfig.getType(vConfig.type.TYP_RANGE_MAX); 
			if(bResult && mixRangeMax != '')
			{
				if (!checkRangeMax(mixRangeMax, sSubText, sType))
				{
					vConfig.addError(sKey, vConfig.error.ERR_RANGE_MAX, sSubText);
					bResult = false;
				}
			}
			
			//check compare
			var strCompareTag = vConfig.getType(vConfig.type.TYP_COMPARE_TAG); 
			var strCompareValue = vConfig.getType(vConfig.type.TYP_COMPARE_VALUE);  
			if(bResult && strCompareTag != '' && strCompareValue != '')
			{ 
				if (!checkCompare(strCompareTag, strCompareValue, sSubText, sType))
				{
					vConfig.addError(sKey, vConfig.error.ERR_COMPARE, sSubText);
					bResult = false;
				}
			}
			if (!bResult) break;
		}//end for each delimiter

		//check match
		var sMatch =  vConfig.getType(vConfig.type.TYP_MATCH); 
		if(bResult && sMatch != '')
		{ 
			if (!checkMatch( sText, sMatch.split(",") ))
			{
				vConfig.addError(sKey, vConfig.error.ERR_MATCH);
				bResult = false;
			}
		}

		//check File
		var sFile =  vConfig.getType(vConfig.type.TYP_FILE); 
		if(bResult && sFile != '')
		{ 
			var sRequired = checkFile( oCtrl, sFile.split(",") );
			if (!(sRequired == true))
			{
				vConfig.addError(sKey, sRequired);
				bResult = false;
			}
		}
		
		//check custom
		var strCustomFunc = vConfig.getType(vConfig.type.TYP_CUSTOM_FUNC); 
		var aParam = vConfig.getType(vConfig.type.TYP_CUSTOM_PARAM);
		aParam = aParam.split(',');
		if(bResult && strCustomFunc != '')
		{	
			if (!eval(strCustomFunc + "(oCtrl, aParam)"))
            {
				vConfig.addError(sKey, vConfig.error.ERR_CUSTOM);            
                bResult = false;
            }
		}

		if(bResult) this.isValidInput(sForm, sKey);
		else this.onHandleErrorByKey(sForm, sKey);
	},//end onCheckComponent
	
	onCheckSubmit:function(oCtrl)
	{
		/**
		 * Check Component upon submit
		 * @param object oCtrl. component
		 * @return boolean. true = pass | false = fail
		 */
		if(oCtrl == null) return true;
		var sForm = oCtrl.form.name;
		vConfig.form = sForm;
		var sKey ;
	
		var sErrMsg ;
		var bError = false;

		var aField = oCtrl.form.getElementsByTagName('*');
		for (var i=0; i<aField.length; i++)
		{
			// Allow for multiple values being assigned to the class attribute
			sKey = aField[i].getAttribute('name');
			if(sKey == null) continue;
			if(sKey == '') continue;

			vConfig.key = sKey;
			
			var sText = trim(aField[i].value);
			
			var sType = vConfig.getType(vConfig.type.TYP_TYPE) ;
		
			//check required
			var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED);
			var aRequired = sRequired.split(","); 
			if(aRequired[0] == 1 || aRequired[0] == 'true')
			{		
				aRequired.shift();
				if (!checkRequired( sText, aRequired ))
				{
					vConfig.addError(sKey, vConfig.error.ERR_REQUIRED);
					bError = true;
					continue;
				}
			}

			//check list
			var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_LIST);			 
			if(sRequired != "")
			{		
				var sRequired = checkRequiredList( aField[i], sRequired, true );
				if (!(sRequired == true))
				{
					vConfig.addError(sKey, sRequired);
					bError = true;
					continue;
				}
			}

			//check checkbox
			var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_CB);
			if(sRequired != "")
			{		
				var sRequired = checkRequiredCb( aField[i], sRequired , true);
				if (!(sRequired == true))
				{
					vConfig.addError(sKey, sRequired);
					bError = true;
					continue;
				}
			}

			//check radio
			var sRequired = vConfig.getType(vConfig.type.TYP_REQUIRED_RADIO);
			var aRequired = sRequired.split(","); 
			if(aRequired[0] == 1 || aRequired[0] == 'true')
			{		
				aRequired.shift();
				if (!checkRequiredRadio( aField[i], aRequired ))
				{
					vConfig.addError(sKey, vConfig.error.ERR_REQUIRED_SELECT);
					bError = true;
					continue;
				}
			}

			//skip check on empty value
			if(sText == '') 
			{
				this.isValidInput(sForm,sKey);
				continue;
			}

			var aValue = new Array(sText);
			//Check for delimiter
			var sDelimiter = vConfig.getType(vConfig.type.TYP_DELIMITER);
			if(sDelimiter != "") var aValue = sText.split(sDelimiter);
		
			for (var j=0; j< aValue.length ; j++ )
			{
				var sSubText = trim(aValue[j]);
				var bSubError = false;

				//check format
				var strRegex = vConfig.getType(vConfig.type.TYP_FORMAT);
				if(strRegex != '')
				{
					strRegex = vConfig.getRegex(strRegex);
					if (!checkRegEx(strRegex,sSubText))
					{		
						vConfig.addError(sKey, vConfig.error.ERR_FORMAT, sSubText);
						bSubError = true;
						break;
					}
				}

				//check min length
				var intLengthMin = vConfig.getType(vConfig.type.TYP_LENGTH_MIN); 
				if(intLengthMin != '')
				{
					if (!checkLengthMin(intLengthMin, sSubText))
					{
						vConfig.addError(sKey, vConfig.error.ERR_LENGTH_MIN, sSubText);
						bSubError = true;
						break;
					}
				}

				//check max length
				var intLengthMax = vConfig.getType(vConfig.type.TYP_LENGTH_MAX);
				if(intLengthMax != '')
				{
					if (!checkLengthMax(intLengthMax, sSubText))
					{
						vConfig.addError(sKey, vConfig.error.ERR_LENGTH_MAX, sSubText);
						bSubError = true;
						break;
					}
				}

				//check valid			
				if (!checkValid(sSubText, sType))
				{
					vConfig.addError(sKey, vConfig.error.ERR_INVALID, sSubText);
					bSubError = true;
					break;
				}		

				//check min range
				var mixRangeMin = vConfig.getType(vConfig.type.TYP_RANGE_MIN); 
				if(mixRangeMin != '')
				{
					if (!checkRangeMin(mixRangeMin, sSubText, sType))
					{
						vConfig.addError(sKey, vConfig.error.ERR_RANGE_MIN, sSubText);
						bSubError = true;
						break;
					}
				}

				//check max range
				var mixRangeMax = vConfig.getType(vConfig.type.TYP_RANGE_MAX);
				if(mixRangeMax != '')
				{
					if (!checkRangeMax(mixRangeMax, sSubText, sType))
					{
						vConfig.addError(sKey, vConfig.error.ERR_RANGE_MAX, sSubText);
						bSubError = true;
						break;
					}
				}
				
				//check Compare
				var strCompareTag = vConfig.getType(vConfig.type.TYP_COMPARE_TAG); 
				var strCompareValue = vConfig.getType(vConfig.type.TYP_COMPARE_VALUE);  
				if(strCompareTag != '' && strCompareValue != '')
				{ 
					if (!checkCompare(strCompareTag, strCompareValue, sSubText, sType))
					{
						vConfig.addError(sKey, vConfig.error.ERR_COMPARE, sSubText);
						bSubError = true;
						break;
					}
				}
			}//end foreach delimiter value

			if(bSubError)
			{
				bError = true;
				continue;
			}

			//check match
			var sMatch =  vConfig.getType(vConfig.type.TYP_MATCH); 
			if(sMatch != '')
			{ 
				if (!checkMatch( sText, sMatch.split(",") ))
				{
					vConfig.addError(sKey, vConfig.error.ERR_MATCH);
					bError = true;
					continue;
				}
			}

			//check File
			var sFile =  vConfig.getType(vConfig.type.TYP_FILE); 
			if(sFile != '')
			{ 
				var sRequired = checkFile( aField[i], sFile.split(",") );
				if (!(sRequired == true))
				{
					vConfig.addError(sKey, sRequired);
					bError = true;
					continue;
				}
			}
			
			//check custom
			var strCustomFunc = vConfig.getType(vConfig.type.TYP_CUSTOM_FUNC); 
			var aParam = vConfig.getType(vConfig.type.TYP_CUSTOM_PARAM);
			aParam = aParam.split(',');
			if(strCustomFunc != '')
			{	
				if (!eval(strCustomFunc + "(aField[i], aParam)"))
				{		
					bError = true;
					continue;
				}
			}

			this.isValidInput(sForm, sKey);
		}

		if(bError)
		{
			this.onHandleError(oCtrl.form);
			return false;
		}
		return true;
	}, //end function onCheckSubmit

	isValidInput:function(sForm, sKey)
	{
		/* Public: Clear Error Msg */
		vConfig.form = sForm;
		vConfig.key = sKey;
		sDiv = vConfig.getType(vConfig.type.TYP_DIV);
		setDivMsg(sDiv, '');
		setObjVisibility(sDiv,'false'); 
		vConfig.killError(sKey);
	},
	
	onHandleError:function(oCtrl)
	{
		/* Public: Handle Error By Config */
		var sForm = oCtrl.name; 
		vConfig.form = sForm;

		var sKey;
		var sError;
		var aField = oCtrl.getElementsByTagName('*');
		for (var i=0; i<aField.length; i++)
		{
			// Allow for multiple values being assigned to the class attribute
			sKey = aField[i].getAttribute('name');
			if(sKey == null) continue; 
			sError = vConfig.getError(sKey);
			if(sError == "") continue;		
			this.onHandleErrorByKey(sForm, sKey);
		}		
	},

	onHandleErrorByKey:function(sForm, sKey)
	{
		/* Public: Handle Error By Config */
		vConfig.form = sForm;
		vConfig.key = sKey;

		var sDiv = vConfig.getType(vConfig.type.TYP_DIV);
		var sError = vConfig.getError(sKey);	
		var sMsg = this.getErrorMsg(sError);
		this.showError(sMsg, sDiv);		
	},
	
	getErrorMsg:function(sCode){
		/* Private: Pass Error Code, Handle Msg Variable, Return Error Msg */
		var sMsg = vConfig.getType(sCode) ; 
		if(sMsg == '') 
		{
			var sJs = "var sMsg = validator_error." + sCode + ";";
			eval(sJs);
		}
		if(typeof( sMsg ) == 'undefined') return "";

		var sLbl = vConfig.getType(vConfig.type.TYP_LABEL) ;
		var sVal = "";
		switch (sCode)
		{
			case vConfig.error.ERR_RANGE_MIN:
				sVal = vConfig.getType(vConfig.type.TYP_RANGE_MIN); 
				break;				
			case vConfig.error.ERR_RANGE_MAX:
				sVal = vConfig.getType(vConfig.type.TYP_RANGE_MAX); 
				break;	
			case vConfig.error.ERR_COMPARE:
				var sTag = vConfig.getType(vConfig.type.TYP_COMPARE_TAG); 
				var sValue = vConfig.getType(vConfig.type.TYP_COMPARE_VALUE);  
				sVal = sTag + ' ' + sValue;
				break;	
			case vConfig.error.ERR_LENGTH_MIN:
				sVal = vConfig.getType(vConfig.type.TYP_LENGTH_MIN); 
				break;	
			case vConfig.error.ERR_LENGTH_MAX:	
				sVal = vConfig.getType(vConfig.type.TYP_LENGTH_MAX);
				break;
			case vConfig.error.ERR_MATCH:	
				sVal = vConfig.getType(vConfig.type.TYP_MATCH); 
				sVal = this.getMatchValue(sVal);
				break;	
			case vConfig.error.ERR_REQUIRED_SELECT_MIN:	
				sVal = vConfig.getType(vConfig.type.TYP_REQUIRED_LIST); 
				sVal = sVal.split(",");
				sVal = sVal[0];
				break;
			case vConfig.error.ERR_REQUIRED_SELECT_MAX:	
				sVal = vConfig.getType(vConfig.type.TYP_REQUIRED_LIST); 
				sVal = sVal.split(",");
				sVal = sVal[1];
				break;
			case vConfig.error.ERR_REQUIRED_CHECK_MIN:	
				sVal = vConfig.getType(vConfig.type.TYP_REQUIRED_CB); 
				sVal = sVal.split(",");
				sVal = sVal[0];
				break;
			case vConfig.error.ERR_REQUIRED_CHECK_MAX:	
				sVal = vConfig.getType(vConfig.type.TYP_REQUIRED_CB); 
				sVal = sVal.split(",");
				sVal = sVal[1];
				break;
			case vConfig.error.ERR_FILE_EXT:
				sVal = vConfig.getType(vConfig.type.TYP_FILE); 
				sVal = sVal.split(";");
				sVal = sVal[1];			
				break;
		}
		
		var sKey = vConfig.key;
		var sIpt = vConfig.getErrorInput(sKey);		
		sMsg = sMsg.replace("lbl_label",sLbl);
		sMsg = sMsg.replace("lbl_value",sVal);
		sMsg = sMsg.replace("lbl_input",sIpt);
		return sMsg;
	},

	showError:function (sMsg, sDiv)
	{
		/*Private: Display Error*/ 
		if(sMsg == "") return;
		var oDiv = document.getElementById(sDiv);
		if(oDiv != null) 
		{
			setObjVisibility(sDiv, 'true'); 
			setDivMsg(sDiv, sMsg);			
		}
	},
	
	getMatchValue:function(sVal)
	{
		/*Private: Get Match Value*/ 
		var aVal = sVal.split(",");
		var sValue = "";
		if(aVal.length > 1)
		{
			for(var i=0; i<aVal.length; i++)
			{
				vConfig.key = aVal[i].toString();
				sValue += vConfig.getType(vConfig.type.TYP_LABEL) ;
				if(i < aVal.length -1)  sValue += " , ";
			}
		}
		else
		{
			vConfig.key = aVal.toString();
			sValue += vConfig.getType(vConfig.type.TYP_LABEL) ;
		}		
		return sValue;
	},
	
	unfoundConfig:function()
	{
		var sMsg = validator_error.ERR_TIMEOUT;
		alert(sMsg);
	}
};//end validate object


var validator_error = {
	ERR_TIMEOUT : "Session Timeout. Please re-submit this form",
	ERR_REQUIRED    : "Please fill in lbl_label !" ,
	ERR_REQUIRED_SELECT   : "Please select lbl_label !" ,
	ERR_REQUIRED_SELECT_MAX   : "Please select maximum lbl_value for lbl_label !" ,
	ERR_REQUIRED_SELECT_MIN   : "Please select minimum lbl_value for lbl_label !" ,
	ERR_REQUIRED_CHECK    : "Please check lbl_label !" ,
	ERR_REQUIRED_CHECK_MAX   : "Please check maximum lbl_value for lbl_label !" ,
	ERR_REQUIRED_CHECK_MIN   : "Please check minimum lbl_value for lbl_label !" ,
	ERR_FORMAT      : "Please enter your lbl_label in a valid format!" ,
	ERR_RANGE_MIN   : "Minimum value of lbl_value for lbl_label !" ,
	ERR_RANGE_MAX	: "Exceed maximum range of lbl_value for lbl_label !" ,
	ERR_COMPARE		: "lbl_label must lbl_value !" ,
	ERR_LENGTH_MIN  : "Length should not less then lbl_value for lbl_label !" ,
	ERR_LENGTH_MAX  : "Exceed maximum length of lbl_value for lbl_label !" ,
	ERR_INVALID		: "Invalid value for lbl_label ! ",
	ERR_MATCH		: "lbl_label should match with lbl_value",
	ERR_FILE_MAXSIZE	: "lbl_label exceeds maximum file size lbl_value",
	ERR_FILE_EXT		: "lbl_label do not match format lbl_value",
	ERR_FILE_INI_SIZE : "lbl_label exceeds the upload_max_filesize directive in php.ini.",
	ERR_FILE_FORM_SIZE : "lbl_label exceeds the MAX_FILE_SIZE directive that specified in HTML form.",
	ERR_FILE_PARTIAL : "lbl_label was only partially uploaded.",
	ERR_FILE_NO_TMP_DIR : "lbl_label was missing a temporary folder.",
	ERR_FILE_CANT_WRITE : "lbl_label was failed to write file to disk.",
	ERR_FILE_EXTENSION : "lbl_label was stopped by extension."		
	
};
(function ($) {
	$.fn.hint = function(){
	  var clsBlur = 'blur';
	  
	  return this.each(
		function(){
			var objInput = $(this);
			var strTitle = objInput.attr('title');
			var objForm = $(this.form);
			var objWin = $(window);
			
			function disable(){
				if (objInput.val() === strTitle && objInput.hasClass(clsBlur)){
					objInput.val('').removeClass(clsBlur);
				}
			}
			
			function enable(){
				if (strTitle){
					objInput.blur(
						function(){
							if (objInput.val() === '' || objInput.hasClass(clsBlur)){
								objInput.val(strTitle).addClass(clsBlur);
							}
						}
					).focus(disable).blur();
				}
			}
			
			enable();
			
			objForm.submit(disable);
			objWin.unload(disable);
		});
	};
})(jQuery);

function updateCaption(i){
	var strKeyId = '#key';
	var objKeyId = $(strKeyId);
	var blnAutoComplete = false;
	
	i.each(function () {
		var objInput = $(this);
		
		switch(objInput.val()){
			case '2':
				//job title only
				objKeyId.attr('title', 'Enter job title');
				objKeyId.attr('autosuggest', 'off');
				try {
					turnSuggestOff();
				}
				catch (err) {
				}
				break;
			case '3':
				//company name only
				objKeyId.attr('title', 'Enter company name');
				objKeyId.attr('autosuggest', 'off');
				try {
					turnSuggestOff();
				}
				catch (err) {
				}
				break;
			default:
				//all
				objKeyId.attr('title', 'Enter job title, company name, skill, etc');
				objKeyId.attr('autosuggest', 'on');
				try {
					turnSuggestOn();
				}
				catch (err) {
				}
				break;
		}
	});
	
	if (objKeyId.attr('title'))
		objKeyId.hint();
	
	function turnSuggestOn()
	{
		if (!objKeyId.hasClass('ac_input'))
		{
			objKeyId.attr('autosuggest', 'on');
			enableAutoComplete();
		}
	}
	
	function turnSuggestOff()
	{
		if (objKeyId.hasClass('ac_input'))
		{
			objKeyId.unautocomplete();
			objKeyId.unbind('keypress.autocomplete');
			objKeyId.unbind('keydown.autocomplete');
			objKeyId.attr('autosuggest', 'off');
			objKeyId.removeClass('ac_input');
		}
	}
}

//init
$(function(){ 
    updateCaption($("input[name='area']:checked"));
});
/**
 * Ajax Queue Plugin
 * 
 * Homepage: http://jquery.com/plugins/project/ajaxqueue
 * Documentation: http://docs.jquery.com/AjaxQueue
 */

/**

<script>
$(function(){
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
});
</script>
<ul style="position: absolute; top: 5px; right: 5px;"></ul>

 */
/*
 * Queued Ajax requests.
 * A new Ajax request won't be started until the previous queued 
 * request has finished.
 */

/*
 * Synced Ajax requests.
 * The Ajax request will happen as soon as you call this method, but
 * the callbacks (success/error/complete) won't fire until all previous
 * synced requests have been completed.
 */


(function($) {
	
	var ajax = $.ajax;
	
	var pendingRequests = {};
	
	var synced = [];
	var syncedData = [];
	
	$.ajax = function(settings) {
		// create settings for compatibility with ajaxSetup
		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
		
		var port = settings.port;
		
		switch(settings.mode) {
		case "abort": 
			if ( pendingRequests[port] ) {
				pendingRequests[port].abort();
			}
			return pendingRequests[port] = ajax.apply(this, arguments);
		case "queue": 
			var _old = settings.complete;
			settings.complete = function(){
				if ( _old )
					_old.apply( this, arguments );
				jQuery([ajax]).dequeue("ajax" + port );;
			};
		
			jQuery([ ajax ]).queue("ajax" + port, function(){
				ajax( settings );
			});
			return;
		case "sync":
			var pos = synced.length;
	
			synced[ pos ] = {
				error: settings.error,
				success: settings.success,
				complete: settings.complete,
				done: false
			};
		
			syncedData[ pos ] = {
				error: [],
				success: [],
				complete: []
			};
		
			settings.error = function(){ syncedData[ pos ].error = arguments; };
			settings.success = function(){ syncedData[ pos ].success = arguments; };
			settings.complete = function(){
				syncedData[ pos ].complete = arguments;
				synced[ pos ].done = true;
		
				if ( pos == 0 || !synced[ pos-1 ] )
					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
		
						synced[i] = null;
						syncedData[i] = null;
					}
			};
		}
		return ajax.apply(this, arguments);
	};
	
})(jQuery);
/*
 * jQuery Autocomplete plugin 1.1
 *
 * Copyright (c) 2009 J?rn Zaefferer
 * Modified Shea Kai
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
 */
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.1i.1j({19:3(b,c){5 d=Y b=="1B";c=$.1j({},$.N.1Y,{R:d?b:S,B:d?S:b,1C:d?$.N.1Y.1C:10,1a:c&&!c.1D?10:3F},c);c.1E=c.1E||3(a){7 a};c.1F=c.1F||c.1Z;7 y.I(3(){21 $.N(y,c)})},O:3(a){7 y.T("O",a)},1k:3(a){7 y.Z("1k",[a])},22:3(){7 y.Z("22")},23:3(a){7 y.Z("23",[a])},24:3(){7 y.Z("24")}});$.N=3(h,j){5 k={2w:38,2x:40,2y:46,2z:9,2A:13,2B:27,2C:3G,2D:33,2E:34,2F:8};5 l=$(h).3H("19","3I").U(j.2G);5 m;5 n="";5 o=$.N.2H(j);5 p=0;5 r;5 s={1G:C};5 t=$.N.2I(j,h,26,s);5 u;$.1H.2J&&$(h.2K).T("3J.19",3(){4(u){u=C;7 C}});l.T(($.1H.2J?"3K":"3L")+".19",3(a){p=1;r=a.2L;3M(a.2L){V k.2w:a.1l();4(t.P()){t.2M()}A{11(0,H)}W;V k.2x:a.1l();4(t.P()){t.2N()}A{11(0,H)}W;V k.2D:a.1l();4(t.P()){t.2O()}A{11(0,H)}W;V k.2E:a.1l();4(t.P()){t.2P()}A{11(0,H)}W;V j.1b&&$.1m(j.X)==","&&k.2C:V k.2A:4(26()){a.1l();u=H;7 C}W;V k.2z:V k.2B:t.12();W;3N:28(m);m=29(11,j.1C);W}}).2Q(3(){p++}).3O(3(){p=0;4(!s.1G){2R()}}).2S(3(){4(p++>1&&!t.P()){11(0,H)}}).T("1k",3(){5 c=(1I.w>1)?1I[1]:S;3 2a(q,a){5 b;4(a&&a.w){1c(5 i=0;i<a.w;i++){4(a[i].O.L()==q.L()){b=a[i];W}}}4(Y c=="3")c(b);A l.Z("O",b&&[b.B,b.J])}$.I(14(l.M()),3(i,a){2b(a,2a,2a)})}).T("22",3(){o.1n()}).T("23",3(){$.1j(j,1I[1]);4("B"2T 1I[1])o.1o()}).T("24",3(){t.1d();l.1d();$(h.2K).1d(".19")});3 26(){5 b=t.2U();4(!b)7 C;5 v=b.O;n=v;4(j.1b){5 c=14(l.M());4(c.w>1){5 d=j.X.w;5 e=$(h).1e().1J;5 f,1K=0;$.I(c,3(i,a){1K+=a.w;4(e<=1K){f=i;7 C}1K+=d});c[f]=v;v=c.2V(j.X)}v+=j.X}l.M(v);1p();l.Z("O",[b.B,b.J]);7 H}3 11(a,b){4(r==k.2y){t.12();7}5 c=l.M();4(!b&&c==n)7;n=c;c=1f(c);4(c.w>=j.2c){l.U(j.2d);4(!j.1L)c=c.L();2b(c,2W,1p)}A{1M();t.12()}};3 14(b){4(!b)7[""];4(!j.1b)7[$.1m(b)];7 $.3P(b.2e(j.X),3(a){7 $.1m(b).w?$.1m(a):S})}3 1f(a){4(!j.1b)7 a;5 b=14(a);4(b.w==1)7 b[0];5 c=$(h).1e().1J;4(c==a.w){b=14(a)}A{b=14(a.2f(a.2X(c),""))}7 b[b.w-1]}3 1N(q,a){4(j.1N&&(1f(l.M()).L()==q.L())&&r!=k.2F){l.M(l.M()+a.2X(1f(n).w));$(h).1e(n.w,n.w+a.w)}};3 2R(){28(m);m=29(1p,3Q)};3 1p(){5 c=t.P();t.12();28(m);1M();4(j.2Y){l.1k(3(a){4(!a){4(j.1b){5 b=14(l.M()).1q(0,-1);l.M(b.2V(j.X)+(b.w?j.X:""))}A{l.M("");l.Z("O",S)}}})}};3 2W(q,a){4(a&&a.w&&p){1M();t.2g(a,q);1N(q,a[0].J);t.2h()}A{1p()}};3 2b(c,d,e){4(!j.1L)c=c.L();5 f=o.2Z(c);4(f&&f.w){d(c,f)}A 4((Y j.R=="1B")&&(j.R.w>0)){5 g={3R:+21 3S()};$.I(j.30,3(a,b){4(a==\'R\'&&b.w>0){g[a]=b+\'?31=\'+1f(c);3T(g[a])}A{g[a]=Y b=="3"?b():b}});$.3U({3V:"3W",3X:"19"+h.3Y,32:j.32,R:j.R,B:$.1j({31:1f(c)},g),3Z:3(a){5 b=j.1O&&j.1O(a)||1O(a);o.1r(c,b);d(c,b)}})}A{t.35();e(c)}};3 1O(a){5 b=[];5 c=a.2e("\\n");1c(5 i=0;i<c.w;i++){5 d=$.1m(c[i]);4(d){d=d.2e("\\t");b[b.w]={B:d,J:d[0],O:j.1P&&j.1P(d,d[0])||d[0]}}}7 b};3 1M(){l.1s(j.2d)}};$.N.1Y={2G:"41",36:"42",2d:"43",2c:2,1C:44,1L:C,1t:H,1Q:C,1u:20,1a:45,2Y:C,30:{},2i:C,1Z:3(a){7 a[0]},1F:S,1N:C,G:0,1b:C,X:", ",1E:3(a,b){7 a.2f(21 47("(?![^&;]+;)(?!<[^<>]*)("+b.2f(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/37,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","37"),"<39>$1</39>")},1D:H,1R:48};$.N.2H=3(g){5 h={};5 j=0;3 1t(s,a){4(!g.1L)s=s.L();5 i=s.3a(a);4(g.1Q=="49"){i=s.L().1k("\\\\b"+a.L())}4(i==-1)7 C;7 i==0||g.1Q};3 1r(q,a){4(j>g.1u){1n()}4(!h[q]){j++}h[q]=a}3 1o(){4(!g.B)7 C;5 b={},3b=0;4(!g.R)g.1u=1;b[""]=[];1c(5 i=0,3c=g.B.w;i<3c;i++){5 c=g.B[i];c=(Y c=="1B")?[c]:c;5 d=g.1F(c,i+1,g.B.w);4(d===C)2j;5 e=d.4a(0).L();4(!b[e])b[e]=[];5 f={J:d,B:c,O:g.1P&&g.1P(c)||d};b[e].2k(f);4(3b++<g.1a){b[""].2k(f)}};$.I(b,3(i,a){g.1u++;1r(i,a)})}29(1o,25);3 1n(){h={};j=0}7{1n:1n,1r:1r,1o:1o,2Z:3(q){4(!g.1u||!j)7 S;4(!g.R&&g.1Q){5 a=[];1c(5 k 2T h){4(k.w>0){5 c=h[k];$.I(c,3(i,x){4(1t(x.J,q)){a.2k(x)}})}}7 a}A 4(h[q]){7 h[q]}A 4(g.1t){1c(5 i=q.w-1;i>=g.2c;i--){5 c=h[q.4b(0,i)];4(c){5 a=[];$.I(c,3(i,x){4(1t(x.J,q)){a[a.w]=x}});7 a}}}7 S}}};$.N.2I=3(e,f,g,h){5 j={K:"4c"};5 k,D=-1,B,1S="",2l=H,F,E;3 3d(){4(!2l)7;F=$("<4d/>").12().U(e.36).15("3e","3f").2m(1T.3g);E=$("<4e/>").2m(F).2S(3(a){$(16(a)).U(j.K);g();f.2Q();7 C}).4f(3(){h.1G=H}).4g(3(){h.1G=C});4(e.G>0)F.15("G",e.G);2l=C}3 2n(a){4(16(a).3h&&16(a).3h.4h()==\'3i\'){D=$("2o",E).1s(j.K).3j(16(a));$(16(a)).U(j.K)}}3 16(a){5 b=a.16;4i(b&&b.4j!="3i")b=b.1v;4(!b)7[];7 b}3 17(a){k.1q(D,D+1).1s(j.K);3k(a);5 b=k.1q(D,D+1).U(j.K);4(e.1D){5 c=0;k.1q(0,D).I(3(){c+=y.1g});4((c+b[0].1g-E.1w())>E[0].4k){E.1w(c+b[0].1g-E.4l())}A 4(c<E.1w()){E.1w(c)}}};3 3k(a){D+=a;4(D<0){D=k.1x()-1}A 4(D>=k.1x()){D=0}}3 3l(a){7 e.1a&&e.1a<a?e.1a:a}3 3m(){E.3n();5 a=3l(B.w);1c(5 i=0;i<a;i++){4(!B[i])2j;5 b=e.1Z(B[i].B,i+1,a,B[i].J,1S);4(b===C)2j;5 c=$("<2o/>").2p(e.1E(b,1S)).U(i%2==0?"4m":"4n").2m(E)[0];$.B(c,"3o",B[i])}k=E.4o("2o");4(e.2i){k.1q(0,1).U(j.K);D=0}4($.1i.1y)E.1y()}7{2g:3(d,q){3d();B=d;1S=q;3m()},2N:3(){17(1)},2M:3(){17(-1)},2O:3(){4(D!=0&&D-8<0){17(-D)}A{17(-8)}},2P:3(){4(D!=k.1x()-1&&D+8>k.1x()){17(k.1x()-1-D)}A{17(8)}},12:3(){F&&F.12();k&&k.1s(j.K);D=-1;F&&F.1d(\'3p\')},P:3(){7 F&&F.4p(":P")},4q:3(){7 y.P()&&(k.2q("."+j.K)[0]||e.2i&&k[0])},2h:3(){5 b=$(f).4r();F.15({G:Y e.G=="1B"||e.G>0?e.G:$(f).G(),1h:b.1h+f.1g,18:b.18}).2h();F.3q(3(a){F.1d(\'3q\');F.T(\'3p\',2n);2n(a)});4(e.1D){E.1w(0);E.15({3r:e.1R,4s:\'Q\'});4($.1H.3s&&Y 1T.3g.3t.3r==="1U"){5 c=0;k.I(3(){c+=y.1g});5 d=c>e.1R;E.15(\'1z\',d?e.1R:c);4(!d){k.G(E.G()-1V(k.15("3u-18"))-1V(k.15("3u-4t")))}}}},2U:3(){5 a=k&&k.2q("."+j.K).1s(j.K);7 a&&a.w&&$.B(a[0],"3o")},35:3(){E&&E.3n()},1d:3(){F&&F.4u()}}};$.1i.1e=3(b,c){4(b!==1U){7 y.I(3(){4(y.2r){5 a=y.2r();4(c===1U||b==c){a.4v("2s",b);a.3v()}A{a.4w(H);a.4x("2s",b);a.4y("2s",c);a.3v()}}A 4(y.3w){y.3w(b,c)}A 4(y.1W){y.1W=b;y.3x=c}})}5 d=y[0];4(d.2r){5 e=1T.1e.4z(),3y=d.J,2t="<->",2u=e.3z.w;e.3z=2t;5 f=d.J.3a(2t);d.J=3y;y.1e(f,f+2u);7{1J:f,3A:f+2u}}A 4(d.1W!==1U){7{1J:d.1W,3A:d.3x}}}})(3B);(3($){$.1i.4A=$.1i.1y=3(s){4($.1H.3s&&/6.0/.4B(4C.4D)){s=$.1j({1h:\'Q\',18:\'Q\',G:\'Q\',1z:\'Q\',3C:H,2v:\'4E:C;\'},s||{});5 a=3(n){7 n&&n.4F==4G?n+\'1A\':n},2p=\'<3D 4H="1y"4I="0"4J="-1"2v="\'+s.2v+\'"\'+\'3t="2g:4K;3e:3f;z-3j:-1;\'+(s.3C!==C?\'2q:4L(4M=\\\'0\\\');\':\'\')+\'1h:\'+(s.1h==\'Q\'?\'1X(((1V(y.1v.3E.4N)||0)*-1)+\\\'1A\\\')\':a(s.1h))+\';\'+\'18:\'+(s.18==\'Q\'?\'1X(((1V(y.1v.3E.4O)||0)*-1)+\\\'1A\\\')\':a(s.18))+\';\'+\'G:\'+(s.G==\'Q\'?\'1X(y.1v.4P+\\\'1A\\\')\':a(s.G))+\';\'+\'1z:\'+(s.1z==\'Q\'?\'1X(y.1v.1g+\\\'1A\\\')\':a(s.1z))+\';\'+\'"/>\';7 y.I(3(){4($(\'> 3D.1y\',y).w==0)y.4Q(1T.4R(2p),y.4S)})}7 y}})(3B);',62,303,'|||function|if|var||return|||||||||||||||||||||||||length||this||else|data|false|active|list|element|width|true|each|value|ACTIVE|toLowerCase|val|Autocompleter|result|visible|auto|url|null|bind|addClass|case|break|multipleSeparator|typeof|trigger||onChange|hide||trimWords|css|target|moveSelect|left|autocomplete|max|multiple|for|unbind|selection|lastWord|offsetHeight|top|fn|extend|search|preventDefault|trim|flush|populate|hideResultsNow|slice|add|removeClass|matchSubset|cacheLength|parentNode|scrollTop|size|bgiframe|height|px|string|delay|scroll|highlight|formatMatch|mouseDownOnSelect|browser|arguments|start|progress|matchCase|stopLoading|autoFill|parse|formatResult|matchContains|scrollHeight|term|document|undefined|parseInt|selectionStart|expression|defaults|formatItem||new|flushCache|setOptions|unautocomplete||selectCurrent||clearTimeout|setTimeout|findValueCallback|request|minChars|loadingClass|split|replace|display|show|selectFirst|continue|push|needsInit|appendTo|fnMouseover|li|html|filter|createTextRange|character|teststring|textLength|src|UP|DOWN|DEL|TAB|RETURN|ESC|COMMA|PAGEUP|PAGEDOWN|BACKSPACE|inputClass|Cache|Select|opera|form|keyCode|prev|next|pageUp|pageDown|focus|hideResults|click|in|selected|join|receiveData|substring|mustMatch|load|extraParams|query|dataType|||emptyList|resultsClass|gi||strong|indexOf|nullData|ol|init|position|absolute|body|nodeName|LI|index|movePosition|limitNumberOfItems|fillList|empty|ac_data|mouseover|mousemove|maxHeight|msie|style|padding|select|setSelectionRange|selectionEnd|orig|text|end|jQuery|opacity|iframe|currentStyle|150|188|attr|off|submit|keypress|keydown|switch|default|blur|map|200|timestamp|Date|encodeURI|ajax|mode|abort|port|name|success||ac_input|ac_results|ac_loading|400|100||RegExp|180|word|charAt|substr|ac_over|div|ul|mousedown|mouseup|toUpperCase|while|tagName|clientHeight|innerHeight|ac_even|ac_odd|find|is|current|offset|overflow|right|remove|move|collapse|moveStart|moveEnd|createRange|bgIframe|test|navigator|userAgent|javascript|constructor|Number|class|frameborder|tabindex|block|Alpha|Opacity|borderTopWidth|borderLeftWidth|offsetWidth|insertBefore|createElement|firstChild'.split('|'),0,{}))
