// **** LEVEL 0: Base types management functions

var Platform={
	MSIE: navigator.userAgent.indexOf('MSIE ')>=0,
	WINDOWS: navigator.userAgent.indexOf('Windows')>=0,
	FIREFOX: navigator.userAgent.indexOf('Firefox')>=0,
	DOM: document.getElementById,
	IE4: document.all
}

// ---- String extended functions

function strLimit(s,l,w) {
 if (w) {
 	var p=s.indexOf(' ');
 	if ((p<0) || (p>w)) l=w;
 }
 if (s.length>l) s=s.substr(0,l-1) + '..';
 return s;
}

function strTrim(s) {
 if (!s) return '';
 s=s.replace(/^\s+|\s+$/g,'');
 return s;
}

function strRepeat(s,n) {
 var res='';
 while (n-->0) res+=s;
 return res;
}

function nl2br(s) { return s.replace(/\r?\n/g,'<br>'); }

function xParse(s,obj) {
 try {
 s=s.replace(/\$\{(.+?)\}/g, function (cero, uno) { with (obj) return eval(uno) } );
 // Warning, "_" added to the sencond member here:
 s=s.replace(/\$([a-z0-9_]+)\.([a-z0-9_]+)/ig, function (cero, uno, dos) { 
			return obj[uno]?obj[uno][dos]:null } );
 s=s.replace(/\$([a-z0-9_]+)/ig, function (cero, uno) { return obj[uno] || '' } );
 s=s.replace(/\$=\{(.+?)\}/g, function (cero, uno) { with (obj) return eval(uno); } );
 return s;
 } catch (e) {
 	alert('xParse!\n\n'+s);
 	return s;
 }
}

String.prototype.xParse=function (obj) { return xParse(this,obj); }
String.prototype.limit=function(l,w) { return strLimit(this,l,w); }
String.prototype.repeat=function (n) {  return strRepeat(this,n); }

function strAddWord(s,w) {
 if (s.indexOf(w)>=0) return s;
 return s+=(s?' ':'')+w;
}

function strRmWord(s,w) {
 if (s.search(new RegExp('\\b'+w+'\\b'))<0) return s;
 w=new RegExp('^'+w+'\s*|\s*'+w+'\\b');
 return s.replace(w,'');
}

String.prototype.trim=function () { return strTrim(this); }
String.prototype.nl2br=function () { return nl2br(this); }
String.prototype.addWord=function (w) { return strAddWord(this,w); }
String.prototype.rmWord=function (w) { return strRmWord(this,w); }

function xSplit(s,c1,c2) {
 var res=[];
 if (!s) return res;
 if (!c1) c1=';';
 if (!c2) c2=','
 s=s.split(c1), res=[];
 for (var i=0; i<s.length; i++) {
	res[i]=s[i].split(c2);
 }
 return res;
}

function xImplode(v,c1,c2) {
 if (!c1) c1=';';
 if (!c2) c2=',';
 var res='';
 for (var i in v) {
	res+=(res?c1:'') + v[i].join(c2);
 }
 return res;
}

function s2o(s,c1,c2) {
 if (!c1) c1=',';
 s=s.split(c1);
 var res={ };
 for (var i=0; i<s.length; i++) {
	var key=i+1;
	res[key]=s[i];
 }
 return res;
}

function objSubSet(obj,idx) {
 if (typeof(idx)=='string') idx=idx.split(',');
 var res={ };
 for (var i=0; i<idx.length; i++) res[idx[i]]=obj[idx[i]];
 return res;
}

function serialize(obj) {
 var res='';
 for (var i in obj) res+=i+':='+obj[i]+'</>';
 return res;
}

function unserialize(s) {
 var res={ };
 s.replace(/([a-z][a-z0-9]*):=(.*?)<\/>/ig,function(cero,uno,dos) {
 	res[uno]=dos;
 	return '';
 	});
 return res;
}

function contains(s1,s2) { return (','+s1+',').indexOf(','+s2+',')>=0; }

function containsAll(s1,s2) {
 if (typeof(s2)=='string') s2=s2.split(',');
 s1=','+s1+',';
 for (var i=0; i<s2.length; i++)
	if (s1.indexOf(','+s2[i]+',')==-1) return false;
//	if (!contains(s1,s2[i])) return false;
 return true;
}

function containsAny(s1,s2) {
 s1=','+s1+',';
 s2=s2.replace(/,/g,'|');
 s2=new RegExp(',('+s2+'),');
 return (s1.search(s2)>=0);
}

function expandULs(s,cName) {
 if (!cName) cName='faq';
 s=s.replace(/(((\n|^)\*[^*].+)+)/g,function (cero) {
 		cero=cero.replace(/(?:\n|^)\*(.+)/g,'<li>$1');
 		return '<ul class='+cName+'>' + cero + '</ul>';
 	});
 return s;
}

function expandOLs(s) {
 s=s.replace(/(((\n|^)#.+)+)/g,function (cero) {
 		cero=cero.replace(/(?:\n|^)#(.+)/g,'<li>$1');
 		return '<ol class=faq>' + cero + '</ol>';
	});
 return s;
}

function txtMakeup(s) {
 s=s.replace(/\r/g,'');
 s=expandULs(s);
 s=expandOLs(s);
 s=s.replace(/\n\n/g,'<p>');
 s=s.replace(/[.:0-9]\n/g,'<br>');
 s=s.replace(/\[(.+?)(?: (class=[a-z]+))?\]=>([-@a-z0-9\/.:?]+)/gi,'<a href="$3" $2>$1</a>');
// s=s.replace(/\[(.+?)(?: (class=[a-z]+))?( right)?\]=>\[(.+?)]/gi,'<div align=right><a target=_blank href="$3" $2>$1</a></div>');
 s=s.replace(/\[([^]]+)(?: (class=[a-z]+))? align=right\]=>\[(.+?)]/gi,'<div align=right><a target=_blank href="$3" $2>$1</a>&nbsp;</div>');
 s=s.replace(/\[(.+?)(?: (class=[a-z]+))?\]=>\[(.+?)]/gi,'<a target=_blank href="$3" $2>$1</a>');
// s=s.replace(/\[(https?:\/\/[^\s]+)\]/,'<a target=_blank href="$1">$1</a>');
 s=s.replace(/\[(https?:\/\/.+?)\]/g,'<a target=_blank href="$1">$1</a>');
 s=s.replace(/\[mailto:(.+?)\]/g,'<a href="mailto:$1">$1</a>');
 if (s.search(/^https?:\/\/[^\s]+/)==0) s='<a target=_blank href="'+s+'">'+s+'</a>';
 return s;
}

function objSort(obj,f) {
 var maux=[ ],m;
 for(var i in obj) {
	m=obj[i];
	if (f) m=m[f];
	maux.push({ id: i, v: m });
 }
 maux.sort(function(a,b) { return a.v<b.v?-1:a.v>b.v?1:0; });
 var res={ };
 for (var ID, i=0; i<maux.length; i++) res[ID=maux[i].id]=obj[ID];
 return res;
}

// **** LEVEL 1: AJAX management

function TAjaxRequest() {
 var req;
 if (window.XMLHttpRequest && !(window.ActiveXObject)) {
	req = new XMLHttpRequest();
	return req;
 }       
 // branch for IE/Windows ActiveX version
 try {
	req = new ActiveXObject("Msxml2.XMLHTTP");
 } catch(e) {
	req = new ActiveXObject("Microsoft.XMLHTTP");
 }
 return req;
}

function AJAX_call(url,callBack,isXML) {
 var ob=new TAjaxRequest();
 ob.onreadystatechange=function() {
 		if ((ob.readyState==4) && (ob.status==200)) {
 			var s=ob.responseText;
// 			var s=isXML ? ob.responseXML : ob.responseText;
 			callBack(s);
 		}
 }
// ob.onprogress=function(event) { alert('hola lucas'); }
 ob.open('GET',url);
 ob.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
 if (!Platform.MSIE) {
	ob.strictErrorChecking=false;
	ob.overrideMimeType('text/xml');
 }
 ob.send('');
 return ob;
}

function TXMLObj(s) {
 var obj={ };
 s=s.replace(/<([a-z][a-z0-9]+)>(.+?)<\/\1>/g, function (cero,uno,dos) { obj[uno]=dos; return ''; });
 return obj;
}

function selectionCallBack(s,callerLink) {
 var m;
 if (!(m=s.match(/<response>(.+)?<\/response>/))) return;
 var RESPONSE=TXMLObj(m[1]);
 var popup=getObj('popupSelection');
 if (!popup.origHTML) popup.origHTML=popup.innerHTML;
 var s=popup.origHTML.replace('$target',RESPONSE.target);
 popup.innerHTML=s;
 showPopUp(popup,myX(callerLink)-160,myY(callerLink)-20);
};

function doSelection(me) {
 var defaultSelectionCallBack=function(s) {
	var callerLink=me;
 	if (selectionCallBack)
 		selectionCallBack(s,me);
 	else
 		alert('OK!\n\nSupplier was added to your RFP');
 };
 AJAX_call(me.href+'&mode=notify',defaultSelectionCallBack);
 return false;
}

// **** LEVEL 2: Regexp & Search engine helper functions
/*
function prepareRegExp(s) { return s.replace(/[aeiouáéíóú]/g,function (ch) { return ch; }); }

var TRANSVOCALS={ }
var VX='aáàäâeéèëêiíìïîoóòöôuúùüû';
var RVX=new RegExp('['+VX+']','ig');

function prepareSearch(s) {
 s=s.replace(/ /g,' ?');
 s=s.replace(/\./g,'\\.');
 s=s.replace(RVX, function(cero) { 
 	cero=cero.toLowerCase();
 	var p=Math.floor(VX.indexOf(cero)/5)*5;
 	return '[' + VX.substr(p,5) + ']';
 });
// find luxembourg in luxemburg
 s=s.replace(/(\[(oóòöô|uúùüû)\]){2,3}/g,'[oóòöôuúùüû]+',s);
 return s;
}
*/

// **** LEVEL 4: DOM & Browser management

var _DOMObjs={ };

function getObj(n) { return (_DOMObjs[n]) || (_DOMObjs[n]=document.getElementById(n)); }

function getObjContent(n,obj) {
 var o=getObj(n); if (!o) alert(n);
 var s=o.innerHTML;
 if (!o._initContent) o._initContent=s;
 if ((s) && (obj)) s=xParse(s,obj);
 return s;
}

function setObjContent(n,s,obj) {
 if ((s) && (obj)) s=xParse(s,obj);
 var Obj=getObj(n);
 Obj._prevContent=getObjContent(n);
 if (!Obj._firstContent) Obj._firstContent=s;
 return Obj.innerHTML=s;
}

function parseObjContent(n,obj) { return setObjContent(n,(getObj(n)._initContent || getObjContent(n)),obj); }

function getLinkObj(s) {
 var links=document.links;
 for (var i=0; i<links.length; i++) {
  var l=links[i];
  if ((l.id==s) || (l.name==s) || (l.hash==s)) return l;
 }
 return false;
}

function myX(me) {
 if (me.offsetX == null)
      me.offsetX=me.offsetParent?myX(me.offsetParent)+me.offsetLeft:0;
 return me.offsetX;
}

function myY(me) {
 if (me.offsetY == null)
      me.offsetY=me.offsetParent?myY(me.offsetParent)+me.offsetTop:0;
 return me.offsetY;
}

function TCookies(s) {
 if (!s) s=document.cookie;
 s+=';';
 var res={ };
 if (s) s=s.replace(/([a-z]+?)=(.+?);/ig,function(cero,uno,dos) { res[uno]=unescape(dos); return ''; });
 return res;
}

function getCookie(n) {
 if (!document.Cookies) document.Cookies=TCookies(document.cookie);
 return document.Cookies[n];
}

function TQueryString(s) {
 if (!s) s=location.search;
 var res={ };
 s=s.replace(/([a-z0_9]+)=([^&]+)/g,function (cero,uno,dos) { res[uno]=unescape(dos); return ''; });
 return res;
}

var QueryString=new TQueryString();

function addBookmark(t,u){
 if (!t) t='ABCevents.com';
 if (!u) u=location.href;
 u=u.replace(/bookmark=yes&?/,'');
 try {
	window.external.AddFavorite(u,t);
 } catch(e) {
 	window.sidebar.addPanel(t,u,'');
 }
 return false;
}

function getPageLang(def) {
 var res;
 if (res=location.pathname.match(/\/(en|es|de|fr|it|pt)\//)) return res[1];
 return def || 'en';
}

var LANG=getPageLang('en');

var REFRESH_SESSION_TIME=60000*15; 
var REFRESH_SESSION_TIMER;

function updateSession(delayed) {
 if (delayed) return REFRESH_SESSION_TIMER=setTimeout('updateSession()',REFRESH_SESSION_TIME);
 var img=new Image();
 img.onload=function() { updateSession(1); };
 img.src='/apps/updsess.php?keep=1';
}

// **** LEVEL 5: Interface helper functions

function xAlert(msg,v) { alert(msg); return v; }

function xCheck(check,msg,v) {
 if (v==null) v=true;
 if (!check) { alert(msg); return false; }
 return v;
}

var DEFMSG={ 'notavail': 'Not available' }

function chkLink(me,msg) {
 if (me.href=='javascript:void(0)') return xAlert(msg || DEFMSG.notavail,false);
 var l=location.href.split('#');
 return me.href!=l[0];
}

function testLnk(url,me) {
 if (!url) return false;
 window.open(url);
 return false;
}

// **** LEVEL 6: Application environment protocol

function chainOnload(func) {
 var oldCall=window.onload;
 if (!oldCall) return window.onload=func;
 window.onload=function() { oldCall(); func(); }
}

// **** LEVEL 7: Special visual effects support

function setOpacity(obj,n) {
 if (n == null) n=obj.opac || 0;
 if (Platform.MSIE)
	obj.filters.alpha.opacity=n;
 else
	obj.style.MozOpacity=n*0.01;
 obj.opac=n;
}

function fadeIn(me) {
 if ((me) && (typeof(me) == 'string')) me=getObj(me);
 if ((me) && (!me.fadeMark)) {
	me.fadeMark=1; // 1 => Fadding alone
	me.fadeLimit=me.getAttribute('fadeLimit')*1 || 100;
	me.fadeSpeed=me.getAttribute('fadeSpeed')*1 || 5;
	me.opac=0;
 }
 me.opac+=me.fadeSpeed;
 if (me.opac<=me.fadeLimit) {
	setOpacity(me);
	setTimeout(function() { fadeIn(me) },50);
	return;
 }
 var s;
 if (s=me.getAttribute('nextFadeEffect')) setTimeout('fadeIn("'+s+'")',50);
 if (s=me.getAttribute('nextFadeCall')) setTimeout(s,50);
}

function fadeMe(me) { fadeIn(me); return false; }

function expandObjWidth(me,w) {
 me.prevStatus={ 
 	position: me.style.position || 'relative', 
 	width: me.style.width || (me.clientWidth+'px')
 }
 if (w.toString().search(/[0-9]$/)>=0) w+='px';
 me.style.position='absolute';
 me.style.width=w;
 return false;
}

function restoreObjWidth(me) {
 me.style.position=me.prevStatus.position;
 me.style.width=me.prevStatus.width;
}

// **** LEVEL ?: Forms validation & management

/*
var CHARCODES={
	NUL:		0,
	BELL:		7,
	DEL:		8,
	TAB:		9,
	LF:		10,
	FF:		12,
	CR:		13,
	ESC:		27,
	SPC:		32,
	ADM:		33,
	DQUOT:		34,
	SHARP:		35,
	DOLLAR:		36,
	PERCENT:	37,
	AMP:		38,
	APOS:		39,
	BRACKET_OPEN:	40,
	BRACKET_CLOSE:	41,
	ASTERISK:	42,
	CROSS:		43,
	COMMA:		44,
	HYPHEN:		45,
	POINT:		46,
	SLASH:		47
};
*/
function getKeyCode(e) { return window.event ? window.event.keyCode : e.which; }
function getKeyChar(e) { return String.fromCharCode(getKeyCode(e)); }

function isNumDigit(ctl,e) {
 var ch=getKeyChar(e);
 return (ch<' ') || ('0123456789'.indexOf(ch)>=0);
}	

function isFloatDigit(ctl,e) {
 var ch=getKeyChar(e);
 return (ch<' ') || ('0123456789.'.indexOf(ch)>=0);
}	

function isAlphaDigit(ctl,e) {
 var ch=getKeyChar(e);
 return (ch<' ') || (ch.search(/^[a-z]/i)==0);
}	

function isAlNumDigit(ctl,e) {
 var ch=getKeyChar(e);
 return (ch<' ') || (ch.search(/^[a-z0-9]/i)==0);
}

function digitMatches(ctl,e,expr) {
 var ch=getKeyChar(e);
 return (ch<' ') || (ctl.value+ch).search(expr)>=0;
}

function lockCR(ctl,e) {
// Call with onkeypress="return lockCR(this,event)";
 var cod=getKeyCode(e);
 if (cod==-1) return true; // If none? let the key to pass through..
 if (cod==13) return false;
 return true;	
}

var CHECK_PATTERNS={
	asName: /^\w+( \w+)+$/,
	asEmail: /^\w[-.\w]+@[a-z0-9][-.a-z0-9]+\.[a-z]+$/i,
	asPhone: /^\+\d+( \d+)+$/,
	asURL: /^(http:\/\/)?[a-z0-9][-a-z0-9.]+\.[a-z]+(\/[\S]*)?$/i,
	asDateDMY: /^([01]\d|2[0-9]|3[01])[-\/](0\d|1[012])[-\/]\d\d\d\d$/,
	asDateYMD: /^\d\d\d\d[-\/](0\d|1[012])[-\/]\d\d$/,
	asInteger: /^\d+$/,
	asNumber: /^\d*(\.\d+)?$/,
	asNoEmpty: /^.+$/
}

function SELECT_getTextValue(me) { return me.options[me.selectedIndex].text; }

function validateValue(val,patt) {
 switch(patt) {
 	case 'dateYMD':
	case 'date':var test=val.replace(/([0-9]{4})([0-9]{2})([0-9]{2})/,'$1/$2/$3');
			if (!(test=new Date(test))) return false;
			if (val!=d2s(test)) return false;
			return val;
			break;
	case 'email': 	return val.search(CHECK_PATTERNS.asEmail)==0;
	case 'integer': return val.search(CHECK_PATTERNS.asInteger)==0;
	case 'number':  return val.search(CHECK_PATTERNS.asNumber)==0;
	default: return true;
 }
 return true;
}

function getCheckValues(me) {
 var res=[], Obj;
 for (var i=0; i<me.length; i++) if (Obj=me[i]) if (Obj.checked) res.push(Obj.value);
 return res.join(',');
}

function getCheckTextValues(me) {
 var res=[], Obj;
 for (var i=0; i<me.length; i++) if (Obj=me[i]) if (Obj.checked) res.push(Obj.title);
 return res.join(',');
}

function validateCtl(me,check) {
 var OK, msg;
 if (!check) check=me.getAttribute('validateas');
 if (!check) switch(me.type) {
 	case 'checkbox':
 	case 'radio':
 			OK=me.checked; break;
 	default:	OK=(me.value!='');
 } else
	OK=validateValue(me.value,check);

 return OK;
}

function validateForm(me,sending) {
 var ELEMS=me.elements, fail, className;
 var reqMsg=me.getAttribute('reqFieldMsg');
 if (!reqMsg) reqMsg='Error!\nPlease, enter a proper value for field: "#FIELD#"';
 var warnMsg=me.getAttribute('warningFieldMsg');
 if (!warnMsg) warnMsg='It is recommended to provide proper a value for field: "#FIELD#"\n\nAre you sure to left it missing?';
 for (var i=0; i<ELEMS.length; i++) {
	var ctl=ELEMS[i];
//	fail=( (ctl.className=='req') || (ctl.className=='warn') ) && (!validateCtl(ctl)); // (ctl.value=='');
//	if (ctl.name=='N_DELEGS') alert(ctl.className.search(/^req/) + ': ' + validateCtl(ctl));
	fail=( (className=ctl.className) && (className=className.match(/^(req|warn)/)) ) && (!validateCtl(ctl)); // (ctl.value=='');
//	if (ctl.name=='N_DELEGS') alert(ctl.className.search(/^req/) + ': ' + fail);
	if ((!fail) && (checkExpr=ctl.getAttribute('check'))) with (ctl) {
		fail=!eval(checkExpr);
	}

//	if (className) className=className[1];
	if (fail) switch(className=className?className[1]:'') {

		case 'warn':	if (!confirm('Warning!\nIt is recommended to provide proper a value for field: "'+(ctl.title||ctl.name)+'"'+
					'\n\nAre you sure to left it missing?')) 
					ctl.focus();
				return false;

		case 'req':
		default:
				var msg=ctl.getAttribute('msgonfail'); 
				if (!msg) msg=reqMsg;
				alert(msg.replace('#FIELD#',ctl.title || ctl.name));
				ctl.focus();
				return false;
	}
 }

 if ((me.customValidate) || (me.customValidate=window[me.name+'_validate']))
	if (!me.customValidate(me,sending)) return false;

 if (sending) { me.submit(); return false; }
 return true;
}

function sortOptions(opts,fromIdx) { // Inspired by objSort()
 if (!fromIdx) fromIdx=0;
 var len=opts.length, aux=[];
 for(var i=fromIdx; i<len; i++) aux.push(opts[i]);
 opts.length=fromIdx;
 aux.sort(function(a,b) { return a.text<b.text?-1:a.text>b.text?1:0; });
 for (var i=0; i<aux.length; i++) opts.add(aux[i]);
 return opts;
}

// --- Form controls managenement

function TOption(v,s,p) {
 var o=new Option(s,v);
 if (p) p.options.add(o);
 return o;
}

function addOptsToCombo(ctl,objs,l) {
 for (var i in objs) {
      var o; // =new Option();
	if (l) {
		o=new Option(objs[i][l],objs[i].id);
	} else {
		o=new Option(objs[i],i);
	}
      ctl.options.add(o);
 }
 return false;
}

function addGroupOptsToCombo(ctl,objs,l,group) {
 if (!ctl.boundary) ctl.boundary=ctl.getAttribute('optionboundary');
 if (!ctl.boundary) ctl.boundary='-';
 var lastgroup=false;
 for (var i in objs) {
	var obj=objs[i];
	var o=new Option();
	if (lastgroup!=obj[group]) {
		o=new Option('--- '+obj[l]+' ---',ctl.boundary);
		o.className='separator';
		ctl.options.add(o);
		lastgroup=obj[group];
		continue;
	}
	if (l) o=new Option(obj[l],obj.id);
      ctl.options.add(o);
 }
 while (ctl.value==ctl.boundary) ctl.selectedIndex++;
 return false;
}

function fillCombo(ctl,objs,l,group) {
 ctl.options.length=0;
 if (!group)
	return addOptsToCombo(ctl,objs,l);
 else
	return addGroupOptsToCombo(ctl,objs,l,group);
}

function setCheckBox(ctl,val) { ctl.checked=(','+val+',').indexOf(','+ctl.value+',')>=0; }

function setCtl(ctl,val) {
// if (ctl.name.search(/^PAX1/)>=0) alert(ctl.name+': '+val);
 switch(ctl.type) {
	case 'file': return;
	case 'checkbox': setCheckBox(ctl,val); break;
	case 'select-one': // setCombo(ctl,val); break; // setCombo() is now deprecated!!
 	default: 
//			alert(ctl.type);
//			try {
				ctl.value=val;
//			} catch (e) {
//			}
			
 }
}

function getCtlVal(ctl) { return ctl.value; }

function fillForm(me,obj) {
 var ELEMS=me.elements, fname,fval,m,onFillExpr;
 if (!obj) obj={ };
 for (var i=0; i<ELEMS.length; i++) {
	var ctl=ELEMS[i];
	fval=null;
	if (!(fname=ctl.getAttribute('fillas'))) {
		if ((ctl.value) && (m=ctl.value.match(/^=(.+)/))) {
//			alert(ctl.name+': ' + m[1]);
			fname=m[1];
		} else {
			if ((fname=ctl.name) && (fname.search(/\[\d+\]$/)>=0)) { fname='='+fname; }
		}
	}
	if (fname) {
		if (m=fname.match(/^=(.+)/)) {
			with (obj) fval=eval(m[1]);
//			if (ctl.name.search(/^PAX1/)>=0) alert(m[1]+': '+fval);
		} else {
			fname=fname.replace(/\[\]$/,'');
			fval=obj[fname] || obj[fname.toLowerCase()];
		}
	}
//	alert(ctl.name + ' - ' + obj[name]);
	if (fval!=null) setCtl(ctl,fval);
 }
}

function setCtlStatus(me,names,s) {
 s=!s;
 names=names.split(',');
 for (var i=0; i<names.length; i++) {
 	var ctl=me[names[i]];
 	if (ctl) ctl.disabled=s;
 }	
 return false;
}

function enableCtls(me,names) { return setCtlStatus(me,names,1); }

function disableCtls(me,names) { return setCtlStatus(me,names,0); }

//**** LEVEL ?????: GUI Management

var currentPopUp=null;
var PopUpStack=[ ];

function pushPopUp() {
 if (currentPopUp) PopUpStack.push(currentPopUp);
}

function showPopUp(n,x,y) {
 if (currentPopUp) currentPopUp.style.visibility='hidden';
 if (!n) {
 	if (oldPopUp=PopUpStack.pop()) return showPopUp(oldPopUp);
	return false;
 }
 var O=typeof(n)=='string'?getObj(n):n;
 if (x) O.style.left=x;
 if (y) O.style.top=y;
 O.style.visibility='visible';
 currentPopUp=O;
 return false;
}

var mouseX, mouseY, dragObj;

function mtrack(e) {
 var lastX=mouseX, lastY=mouseY;
 mouseX=e.screenX; mouseY=e.screenY;
 if (dragObj) { 
	var dx=mouseX-lastX, dy=mouseY-lastY;
	dragObj.cx+=dx; dragObj.cy+=dy;
	dragObj.style.left=dragObj.cx;
	dragObj.style.top=dragObj.cy;
 }
}

function startDrag(me,e) {
 return;
 me.cx=parseInt(me.style.left);
 me.cy=parseInt(me.style.top);
 mtrack(e);
 dragObj=me;
 document.onmousemove=mtrack;
 document.onmouseup=stopDrag;
}

function stopDrag(e) {
 if (dragObj) dragObj=null;
 document.onmousemove=null;
}

// **** CSS management

function addClass(me,cn) {
 if (me.className.indexOf(cn)>=0) return;
 me.className=strAddWord(me.className,cn);
}

function rmClass(me,cn) {
 if (me.className.indexOf(cn)<0) return;
 me.className=strRmWord(me.className,cn);
}

function hoverMe(me) {
 if (me.origClass) return;
 me.origClass=me.className;
 me.className+=' hover';
}

function unhoverMe(me) {
 if (!me.origClass) return;
 me.className=me.origClass;
 me.origClass=null;
}

// **** LEVEL ????: Ads-Audit extra support

function aa_referent(s) {
 var O=document.getElementById('aaImg');
 O.src=O.src.replace(/(?:@.+)?(&.*)$/,'@'+s+'$1');
// alert(O.src);
}

// **** LEVEL ??????: Custom application interface

var activeFAQ;
var activeFAQModes=[ 'normal', 'bold' ];
var activeFAQMode=0;

function showFAQ(me,where) {
 if (typeof (me) == 'string') me=getObj(me);
 if (activeFAQ) activeFAQ.style.fontWeight=activeFAQModes[activeFAQMode];
 me.style.fontWeight=activeFAQModes[1-activeFAQMode];
 activeFAQ=me;
 var id=me.hash.substr(1);
 if (!where) where='faqAnswer';
 var content=getObjContent('divFaq_'+id);
 setObjContent(where,
      '<p class="title" style="margin:0">' + me.innerHTML + '<p style="margin-top:4px">' +
      content
	);
 getObj(where).scrollTop=0;
 me.blur();
 return false;
}

var FIRST_FAQ_ID;
var FAQIndex_SPLIT=false;

function getFAQIndex(Items,getcontents,sWhere) {
 var res='', contents='';
 if (sWhere) sWhere=",'" + sWhere + "'"; else sWhere='';
 for(var i in Items) {
	if (!FIRST_FAQ_ID) FIRST_FAQ_ID=i;
 	var obj=Items[i];
 	var question=obj.question;
 	if (FAQIndex_SPLIT) { question=question.split(':'); question=question[0]; }
 	res+='<a id=faqLnk'+obj.id+' href="#topic'+i+'" onclick="return swFAQ('+i+',this'+sWhere+')">' + question + '</a>';
 	if (getcontents) contents+='<p><a name="topic'+i+'"></a><b>'+ obj.question +'</b><br>'+txtMakeup(obj.answer);
 }
 if (getcontents) res={ index: res, contents: contents };
 return res;
}

var FAQIndexPlace,swCategCall;

function getXtdFAQIndex(Items,Categs,whereObj,which) {

 if (!swCategCall) swCategCall=function(n) { return getXtdFAQIndex(Items,Categs,whereObj,n); }

 var res='', contents='';
 for(var i in Items) {
	if (!FIRST_FAQ_ID) FIRST_FAQ_ID=i;
 	var obj=Items[i];
 	var cat=Categs[obj.cat];
// 	if (!cat) alert(i + ': ' +obj.cat);
 	if (cat.already) continue;
 	if (!cat.catIndex) cat.catIndex='';
  	var question=obj.question;
 	if (FAQIndex_SPLIT) { question=question.split(':'); question=question[0]; }
 	cat.catIndex+='<a href="#topic'+i+'" onclick="return swFAQ('+i+',this)">' + question + '</a>&nbsp;<br>';
 }
// if (getcontents) res={ index: res, contents: contents };
 if (!which) for (var i in Categs) {
 	var cat=Categs[i];
 	cat.already=1;
 	res+='<a href="#cat'+i+'" onclick="return swCategCall('+i+')">' + cat.name + '</a><br>'; 
 } else {
 	var cat=Categs[which];
 	res+='<b>' + cat.name + '</b>'+
 		'&nbsp;&nbsp;[<a href="" class=maroon onclick="swCategCall(); return false;">'+i18n('UpperLevel')+'</a>]' +
		'<br><div style="padding-left:5px">' + (cat.catIndex || '') + '</div>';
 }
 if (whereObj) {
 	FAQIndexPlace=whereObj;
 	whereObj.innerHTML=res;
 }
 return res;
}

function swFAQCateg(n) { return false; }

function getFAQHTML(n) {
 var obj=Items[n];
 var res='<p class="title faqTitle">' + obj.question + '</p>'+
 	'<p><div style="height:180px; overflow: auto">' + 
 	'' + txtMakeup(obj.answer) + '</div>';
// if (QueryString.test) alert(res);
 return res;
}

BYPASS_swFAQ=false;

function swFAQ(n,me,sWhere) {
 if (BYPASS_swFAQ) return true;
 if (me) {
 	if (activeFAQ) activeFAQ.style.fontWeight=activeFAQModes[activeFAQMode]; // 'normal';
 	me.style.fontWeight=activeFAQModes[1-activeFAQMode]; // 'bold';
 	activeFAQ=me;
 }
 if (!sWhere) sWhere='FAQ_Contents';
 setObjContent(sWhere,getFAQHTML(n));
 return false;
}

// **** LEVEL 9999: Start things!
 
chainOnload(function() {
 if (window.PUBSPACES) startBanners();
});


