// ----
// split values from a string like '2008-08-30'
function splitDateVals(dateStr) {
	var date=dateStr.split('-');
	return date;
}

// split values from a string like '23:23:23'
function splitTimeVals(timeStr) {
	var time=timeStr.split(':');
	return time;
}

// split values from a string like '2008-08-30 23:23:23'
function splitDatetimeVals(datetimeStr) {
	var dandt=datetimeStr.split(' ');
	var date=splitDateVals(dandt[0]);
	var time=splitTimeVals(dandt[1]);
	return date.concat(time);
}

// ----
// return a array which has a sorted data
function sortKeyOfObject(objRef) {
	var a=new Array();

	for (var akey in objRef) { a.push( akey ); }
	a.sort();

	return a;
}

// =====================================================================
// functions for markers on the Google Map
// ---
// put markers on the Map for display locations of conferences
function putMarkersOntheMap(llObj) {
	// clearAllMarkers();

	for (var ll in llObj) {
		var pnt=ll.split(",");
		if (2 != pnt.length) { 
			alert('wrong data format for lat/long'); continue; 
		}

		// make HTML string for info window
		var fuki='';
		var locname='';
		{
			fuki='<div style="max-width:400px;">';

			var cfref=axObj.cfs[ llObj[ll].indexes[0] ];
			fuki+='<div class="fukidashi-loc">'
			locname=cfref.city+', '+cfref.country;
			fuki+=locname;
			fuki+='</div>'

			// the number of live conference information
			var numCf=llObj[ll].indexes.length;
			fuki+='<div class="fukidashi-val">'
				if (numCf > 1) {
					fuki+=numCf+' conferences';
				} else {
					fuki+=numCf+' conference';
				}
			fuki+='</div>'

			// the number of live submission deadline information
			var eNumSd=0;
			for (var f=0; f<numCf; ++f) {
				var dlAryRef=axObj.cfs[ llObj[ll].indexes[f] ].deadlines.deadline;
				var numSd=dlAryRef.length;
				for (var g=0; g<numSd; ++g) {
					if ( dlAryRef[g].restdays >= 0 && 
					     dlAryRef[g].desc.toLowerCase().indexOf('mission dead') >= 0 ) {
						++eNumSd;
					}
				}
			}
			if (eNumSd > 0) {
				fuki+='<div class="fukidashi-val">'+eNumSd;
				if (eNumSd > 1) {
					fuki+=' submission deadlines';
				} else {
					fuki+=' submission deadline';
				}
				fuki+='</div>'
			}

			fuki+='</div>';
		}

		var gmrk=putSmallMarker2(pnt[0], pnt[1], locname, fuki);
		llObj[ll].marker=gmrk;
	}
}

// ---
function hideAllMarkers() {
	for (var ll in axObj.llIdxCf) {
		axObj.llIdxCf[ll].display=false;
	}
}

// ---
function showAllMarkers() {
	for (var ll in axObj.llIdxCf) {
		axObj.llIdxCf[ll].display=true;
	}
}

// ---
function MarkerDisplayFlagOn( cfsIndex ) {
	var cfObjRef= axObj.cfs [ cfsIndex ];
	if ( ! cfObjRef ) {
		console.log('not exist specified confernce object');
		return;
	}

	var locIndex=cfObjRef.ido+','+cfObjRef.kdo;
	var locObjRef= axObj.llIdxCf [ locIndex ];
	if ( ! locObjRef ) {
		console.log('not exist specified location object');
		return;
	}
	locObjRef.display = true;
}

// ---
function updateMarkerFlagByFilterIndex() {
	if (1 > filterCfIndexArray.length) {
		showAllMarkers();
		return;
	}

	hideAllMarkers();
	for (var x=0; x<filterCfIndexArray.length; ++x) {
		var cfsIdx=axObj.cfidIdx[ filterCfIndexArray[x] ];

		MarkerDisplayFlagOn( cfsIdx );
	}
}

// ---
function redrawGeoMarkers() {
	// update display status of markers 
	for (var ll in axObj.llIdxCf) {
		if ( axObj.llIdxCf[ll].display ) {
			axObj.llIdxCf[ll].marker.show();
		} else {
			axObj.llIdxCf[ll].marker.hide();
		}
	}
}

// =====================================================================
// functions for markers on the Google Map
// ---
function hideAllDates() {
	for (var yrval in axObj.dtIdxCf) {
		if ('_' == yrval.charAt(0)) { continue; }

		for (var mtval in axObj.dtIdxCf[yrval]) {
			if ('_' == mtval.charAt(0)) { continue; }

			for (var dtval in axObj.dtIdxCf[yrval][mtval]) {
				if ('_' == mtval.charAt(0)) { continue; }

				axObj.dtIdxCf[yrval][mtval][dtval]._visible=false;
			}

			axObj.dtIdxCf[yrval][mtval]._visible=false;
		}

		axObj.dtIdxCf[yrval]._visible=false;
	}
}

// ---
function showAllDates() {
	for (var yrval in axObj.dtIdxCf) {
		if ('_' == yrval.charAt(0)) { continue; }

		for (var mtval in axObj.dtIdxCf[yrval]) {
			if ('_' == mtval.charAt(0)) { continue; }

			for (var dtval in axObj.dtIdxCf[yrval][mtval]) {
				if ('_' == mtval.charAt(0)) { continue; }

				axObj.dtIdxCf[yrval][mtval][dtval]._visible=true;
			}

			axObj.dtIdxCf[yrval][mtval]._visible=true;
		}

		axObj.dtIdxCf[yrval]._visible=true;
	}
}

// ---
function redrawDateList() {
	setupDateList();
}

// =====================================================================
// functions for setup each content
// ----
function setupConferenceList() {
	var tg=Ext.get('confCt');
	if (! tg) { 
		alert('failed to get a block named "confCt"');
		return; 
	}
	tg.innerHTML=''; // re-initialize

	var dtv=new Date();
	var mm=1+dtv.getMonth();
	if (mm < 10) { mm='0'+mm; }
	var dd=dtv.getDate();
	if (dd < 10) { dd='0'+dd; }
	var todayYMDStr=dtv.getFullYear()+'-'+mm+'-'+dd;
	// console.log('today: '+todayYMDStr);

	var elemCount=0;
	var monthLabel='';
	var monthBox=null;
	for (var idx=0; idx<axObj.cfs.length; ++idx) {

		var dtVals=splitDateVals( axObj.cfs[idx].startdate );
		var newMtLabel=dtVals[0]+'-'+dtVals[1];

		if (monthLabel != newMtLabel) {
			var c1=document.createElement('div');
			c1.className='monthLabelGr';
			c1.addEventListener('click', toggleVisibilityOfNextSibling, false);
			var mylabel=mtLabel[ (dtVals[1]-1) ]+', '+dtVals[0];
			c1.innerHTML=mylabel+' ';
			c1.id=mylabel;

			tg.appendChild(c1);
			monthLabel=newMtLabel;

			var monthBox=document.createElement('div');
			monthBox.className='monthBox';
			monthBox.style.display='block';
			tg.appendChild(monthBox);
		}

		var cfObjRef=axObj.cfs[ idx ]; 

		var cfBox=document.createElement('div');
		cfBox.className='cfBox';
		cfBox.cfID=cfObjRef.id;
		cfBox.style.display='block';
		cfBox.addEventListener('dblclick', openDetailWin, false);
		monthBox.appendChild(cfBox);
		++elemCount;
		if ( idx % 2 ) {
			cfBox.style.backgroundColor='#dddddd';
		}

		var c2=document.createElement('div');
		c2.className='titleLabel_1';
		if (cfObjRef.startdate<= todayYMDStr && todayYMDStr <=cfObjRef.enddate) {
			c2.className='titleLabel_2';
		}
		var xtitle = cfObjRef.title;
		if ( cfObjRef.abbrtitle ) {
			xtitle += ' ('+cfObjRef.abbrtitle+')';
		}
		c2.innerHTML = xtitle;
		cfBox.appendChild(c2);

		var c3=document.createElement('div');
		c3.className='periodLabel_1';
		c3.innerHTML = cfObjRef.period;
		cfBox.appendChild(c3);

		var c4=document.createElement('div');
		c4.className='rightBox';
		cfBox.appendChild(c4);
		var c5=document.createTextNode( cfObjRef.city+', '+cfObjRef.country+' ');
		c5.className='locLabel_1';
		c4.appendChild(c5);

		var c6=document.createElement('input');
		c6.type='button';
		c6.value='detail';
		c6.cfID=cfObjRef.id;
		c6.addEventListener('click', openDetailWin, false);
		c4.appendChild(c6);
	}

	updateNumOfConfs();
}

// ----
function updateNumOfConfs() {
	var tg=Ext.get('confCt');
	if (! tg) { 
		alert('failed to get a block named "confCt"');
		return; 
	}

	for (var x=0; x<tg.dom.childNodes.length; ++x) {
		// console.log(tg.dom.childNodes[x].className); 
		if ('monthBox'==tg.dom.childNodes[x].className) {
			var mb=tg.dom.childNodes[x];
			var visCount=0;
			for (var y=0; y<mb.childNodes.length; ++y) {
				if ('block'==mb.childNodes[y].style.display) { ++visCount; }
			}
			var mtLblBx=tg.dom.childNodes[x].previousSibling;
			var appendLabel='('+visCount;
			if (visCount > 1) {
				appendLabel+=' conferences)';
			} else {
				appendLabel+=' conference)';
			}
			var fs=mtLblBx.innerHTML.indexOf(' ');
			var ss=mtLblBx.innerHTML.indexOf(' ', 1+fs);
			mtLblBx.innerHTML=mtLblBx.innerHTML.substr(0, 1+ss);
			mtLblBx.innerHTML+=appendLabel
		}
	}
}

// ---
function setupSubmissionDeadlineList() {
	var tg=Ext.get('sbdlCt');
	if (! tg) { 
		alert('failed to get a block named "sbdlCt"');
		return; 
	}

	var sortedDl=sortKeyOfObject(axObj.ddIdxCf) ;

	for (var dix=0; dix<sortedDl.length; ++dix) {
		var dt=sortedDl[dix];
		var c1=document.createElement('div');
		c1.className='dlDayLabel';
		var lbl1=dt+' ('+axObj.ddIdxCf[dt].restdays;
		if (axObj.ddIdxCf[dt].restdays < 2) { 
			lbl1+=' day left)'; 
		} else {
			lbl1+=' days left)'; 
		}
		c1.innerHTML=lbl1;
		c1.addEventListener('click', toggleVisibilityOfNextSibling, false);
		tg.appendChild(c1);

		var dldayBox=document.createElement('div');
		dldayBox.className='dlDayBox';
		dldayBox.style.display='block';
		tg.appendChild(dldayBox);

		for (var x=0; x<axObj.ddIdxCf[dt].data.length; ++x) {
			var cfObjRef=axObj.ddIdxCf[dt].data[x];

			var dlBox=document.createElement('div');
			dlBox.className='dlBox';
			dlBox.cfID=cfObjRef.cfinfo.id;
			dlBox.addEventListener('dblclick', openDetailWin, false);
			dldayBox.appendChild(dlBox);
			if ( x % 2 ) {
				dlBox.style.backgroundColor='#dddddd';
			}

			var cfObjRef=axObj.ddIdxCf[dt].data[x];

			var c2=document.createElement('div');
			c2.className='descLabel';
			c2.innerHTML = cfObjRef.desc;
			if (cfObjRef.desc.indexOf('submission deadline') >= 0) {
				c2.style.color = 'blue';
			}
			dlBox.appendChild(c2);

			var c3=document.createElement('div');
			c3.className='confTitleLabel_1';
			c3.innerHTML = cfObjRef.cfinfo.title;
			if ( cfObjRef.cfinfo.abbrtitle ) {
				c3.innerHTML += ' ('+cfObjRef.cfinfo.abbrtitle+')';
			}
			dlBox.appendChild(c3);

			var c4=document.createElement('div');
			c4.className='rightBox';
			dlBox.appendChild(c4);
			var c5=document.createTextNode( cfObjRef.cfinfo.city+', '+cfObjRef.cfinfo.country+' ');
			c5.className='locLabel_2';
			c4.appendChild(c5);

			var c6=document.createElement('input');
			c6.type='button';
			c6.value='detail';
			c6.cfID=cfObjRef.cfinfo.id;
			c6.addEventListener('click', openDetailWin, false);
			c4.appendChild(c6);
		}
	}

}

// ---
function toggleVisibilityOfNextNextSibling(evt) {
	var x=this.nextSibling.nextSibling;

	if ( 'block' != x.style.display ) {
		x.style.display='block';
		this.src='./foldOpenMarker.png';
	} else {
		x.style.display='none';
		this.src='./foldCloseMarker.png';
	}

	evt.stopEvent();
}

function toggleVisibilityOfNextSibling(evt) {
	var x=this.nextSibling;

	if ( 'block' != x.style.display ) {
		x.style.display='block';
		this.src='./foldOpenMarker.png';
	} else {
		x.style.display='none';
		this.src='./foldCloseMarker.png';
	}

	evt.stopEvent();
}

// ----
function setupLocationList() {
	var tg=Ext.get('ccCt');
	if (! tg) { 
		alert('failed to get a block named "ccCt"');
		return; 
	}
	tg.innerHTML=''; // clear a content in this block

	var sortedCountries=sortKeyOfObject(axObj.ccIdxCf) ;

	for (var idx=0; idx<sortedCountries.length; ++idx) {
		var countryName=sortedCountries[idx]

		var c1=document.createElement('div');
		c1.className='countryFrame';
		tg.appendChild(c1);

		var c8=document.createElement('div');
		c8.className='countryLabelBlock';
		Ext.EventManager.on(c8, 'click', toggleCityList);
		c1.appendChild(c8);

		var c6=document.createElement('div');
		c6.className='countryLabel';
		c6.innerHTML=countryName;
		c8.appendChild(c6);

		var c7=document.createElement('input');
		c7.type='button';
		c7.value='Select all';
		c7.className='countryLabelBtn';
		Ext.EventManager.on(c7, 'click', selectAndClearAllCitiesofCountry);
		c8.appendChild(c7);

		var c9=document.createElement('div');
		c9.style.clear='both';
		c8.appendChild(c9);

		var countryBox=document.createElement('div');
		countryBox.className='countryBox';
		c1.appendChild(countryBox);
			
		var sortedCities=sortKeyOfObject(axObj.ccIdxCf[countryName]) ;

		for (var idy=0; idy<sortedCities.length; ++idy) {
			var cityName=sortedCities[idy]

			var c2=document.createElement('div');
			c2.className='cityBox';
			c2.cityValue=cityName;
			c2.countryValue=countryName;
			// c2.addEventListener('click', filterMainListByCity, false);
			Ext.EventManager.on(c2, 'click', filterMainListByCity);
			countryBox.appendChild(c2);

			var c3=document.createElement('div');
			c3.className='cityLabel';
			c3.innerHTML=cityName;
			c2.appendChild(c3);

			var c4=document.createElement('div');
			c4.className='numCfOnCity';
			c4.innerHTML='('+axObj.ccIdxCf[countryName][cityName].length+')';
			c2.appendChild(c4);

			var c5=document.createElement('div');
			c5.className='clearBlock';
			c2.appendChild(c5);
		}
	}

}

function toggleCityList(evt){
	var tg=new Ext.Element(this);
	var x=tg.next();
	if (!x) { 
		alert('failed to find cities box!');
		return; 
	}
	var y=tg.select('input.countryLabelBtn');
	if (1 != y.getCount()) { 
		alert('failed to find Button in countryLabel!');
		return; 
	}

	x.setVisibilityMode(Ext.Element.DISPLAY);
	y.setVisibilityMode(Ext.Element.VISIBILITY);
	if ( x.isDisplayed() ) {
		x.setVisible(false);
		y.setVisible(false);
	} else {
		x.setVisible(true);
		x.dom.style.display='block'; // why? but it is essential
		y.setVisible(true);
	}

	evt.stopEvent();

	delete tg;
}

// ----
function setupDateList() {
	var tg=Ext.get('dtBx');
	if (! tg) { 
		alert('failed to get a block named "pdCt"');
		return; 
	}
	tg.innerHTML=''; // clear a content in this block

	var dh=Ext.DomHelper;

	for (var yVal in axObj.dtIdxCf) {
		if ('_' == yVal.charAt(0)) { continue; }
		if ( ! axObj.dtIdxCf[yVal]._visible) { continue; }
		
		var c1=document.createElement('div');
		c1.className='dtbYear';
		// c1.id='yValID:'+yVal;
		tg.appendChild(c1);

		dh.append(c1, {
			tag: 'div', id: 'yValID:'+yVal, children: [
				{ tag: 'img', cls:'foldMarker', src: './foldOpenMarker.png' },
				{ tag: 'span', id: 'dtval-'+yVal, html: yVal },
			]
		});

		if (0) {
			Ext.EventManager.on(g1, 'click', toggleVisibilityOfNextNextSibling);
			// g1.addEventListener('click', toggleVisibilityOfNextNextSibling, false);
		}

		var c2=document.createElement('div');
		c2.style.display='block';
		c1.appendChild(c2);

		for (var mVal in axObj.dtIdxCf[yVal]) {
			if ('_' == mVal.charAt(0)) { continue; }
			if ( ! axObj.dtIdxCf[yVal][mVal]._visible) { continue; }

			var c3=document.createElement('div');
			c3.className='dtbMonth';
			c2.appendChild(c3);

			dh.append(c3, {
				tag: 'div', id: 'ymValID:'+yVal+':'+mVal, children: [
					{ tag: 'img', cls:'foldMarker', src: './foldCloseMarker.png' },
					{ tag: 'span', id: 'dtval-'+yVal+'-'+mVal, html: mtLabel[mVal-1] },
				]
			});

			if (0) {
			// g2.addEventListener('click', toggleVisibilityOfNextNextSibling, false);
			Ext.EventManager.on(g2, 'click', toggleVisibilityOfNextNextSibling);
			}

			var c4=document.createElement('div');
			c4.style.display='none';
			c3.appendChild(c4);

			var prevDay=-1;
			for (var dmVal in axObj.dtIdxCf[yVal][mVal]) {
				if ('_' == dmVal.charAt(0)) { continue; }
				if ( ! axObj.dtIdxCf[yVal][mVal][dmVal]._visible) { continue; }

				if ( -1 != prevDay && 1 != (dmVal-prevDay) ) {
					var c5=document.createElement('div');
					c5.className='dateSeparator';
					c4.appendChild(c5);
				}
				prevDay=dmVal;

				var c6=document.createElement('div');
				c6.className='dtbDate';
				c6.id='dtVal-'+yVal+'-'+mVal+'-'+dmVal;
				c6.addEventListener('click', function(e){
					var x=Ext.select("div[id^=dtVal]");
					alert(x.getCount()+', '+e.target.id);
				}, false); // zetaka
				c6.innerHTML=dmVal;
				c4.appendChild(c6);
			}
		}
	}

	// register event handlers
	var yb=Ext.select('div.dtbYear', true, 'dtBx');
	yb.each(function(el){ 
		var x=el.first();
		x.on('click', function(e, t){
			var v=Ext.fly(t);
			var x=v.findParent('div[id^=yValID]');
			if (x) {
				var u=x.firstChild;
				var w=x.nextSibling;
				if ('none' == w.style.display) {
					w.style.display='block';
					u.src='./foldOpenMarker.png';
				} else {
					w.style.display='none';
					u.src='./foldCloseMarker.png';
				}
			}
		});
	});

	yb=Ext.select('div.dtbMonth', true, 'dtBx');
	yb.each(function(el){ 
		var x=el.first();
		x.on('click', function(e, t){
			var v=Ext.fly(t);
			var x=v.findParent('div[id^=ymValID]');
			if (x) {
				var u=x.firstChild;
				var w=x.nextSibling;
				if ('none' == w.style.display) {
					w.style.display='block';
					u.src='./foldOpenMarker.png';
				} else {
					w.style.display='none';
					u.src='./foldCloseMarker.png';
				}
			}
		});
	});

	var ea=Ext.DomQuery.select('span.dtbMonthLabel');
	Ext.each(ea, function(obj, index, array) {
		Ext.get(obj).on('mouseover', function(e, t){
			var dem=t.id.split(':');
			if (3!=dem.length) { return; }

			var tgIdStr=mtLabel[parseInt(dem[2], 10)-1]+', '+dem[1];
			// console.log(tgIdStr);
			var ct=Ext.fly(tgIdStr);
			if (ct) { ct.dom.scrollIntoView(); }

			var htg=Ext.fly(t);
			htg.parent().addClassOnOver('dtbMonthHL');
			// htg.parent().highlight();
		});
	});

}

// ----
function setupKeywordsList() {
	var tg=Ext.get('kwCt');
	if (! tg) { 
		alert('failed to get a block named "kwCt"');
		return; 
	}
	tg.innerHTML=''; // clear a content in this block

	for (var idx=0; idx<axObj.kwIdxCf.length; ++idx) {
		var kwObjRef=axObj.kwIdxCf[idx];

		var c2=document.createElement('span');
		c2.className='shortName';
		c2.kwID=idx;
		var label=kwObjRef.word;
		if (kwObjRef.cfsIndexes.length > 1) {
			label+=' ('+kwObjRef.cfsIndexes.length+')';
		}
		c2.innerHTML=label;
		c2.addEventListener('click', filterMainListByKeyword, false);
		tg.appendChild(c2);

		// This is a separator
		var c3=document.createElement('span');
		var s1=document.createTextNode(' / ');
		c3.appendChild(s1);
		tg.appendChild(c3);
	}
}

// ----
function setupShortnamesList() {
	var tg=Ext.get('snFt');
	if (! tg) { 
		alert('failed to get a block named "snFt"');
		return; 
	}
	tg.innerHTML=''; // clear a content in this block

	var sortedSns=sortKeyOfObject(axObj.snIdxCf) ;

	for (var idx=0; idx<sortedSns.length; ++idx) {
		var snm=sortedSns[idx];

		var c1=document.createElement('span');
		c1.className='shortName';
		c1.addEventListener('click', filterMainListByShortname, false);
		c1.innerHTML=axObj.snIdxCf[snm].name;
		tg.appendChild(c1);

		// var numCfs=axObj.snIdxCf[snm].cfs.length;
		// if (numCfs > 1) { c1.innerHTML+=' ('+numCfs+')'; }

		// This is a separator
		var c4=document.createElement('span');
		c4.innerHTML=' / ';
		tg.appendChild(c4);
	}
}

function setupConferenceDetailInfo (cfObj) {
	var rootNd=document.createElement('div');

	var c1=document.createElement('div');
	c1.className='vname';
	var a1=document.createElement('a');
	a1.href=cfObj.url
	a1.target='_blank';
	var t1=document.createTextNode(cfObj.name);
	a1.appendChild(t1);
	c1.appendChild(a1);
	rootNd.appendChild(c1);

	var tbl1=document.createElement('table');
	tbl1.className='vdltable';
	var tr1=document.createElement('tr');
	var th1=document.createElement('th');
	th1.innerHTML='Dates:';
	var td1=document.createElement('td');
	td1.innerHTML=cfObj.period;
	tr1.appendChild(th1);
	tr1.appendChild(td1);
	tbl1.appendChild(tr1);

	var tr2=document.createElement('tr');
	var th2=document.createElement('th');
	th2.innerHTML='Location:';
	var td2=document.createElement('td');
	td2.innerHTML=cfObj.city+', '+cfObj.country;
	tr2.appendChild(th2);
	tr2.appendChild(td2);
	tbl1.appendChild(tr2);

	var tr3=document.createElement('tr');
	var th3=document.createElement('th');
	th3.innerHTML='Web page:';
	var td3=document.createElement('td');
	var a2=document.createElement('a');
	a2.href=cfObj.url;
	a2.target='_blank';
	var t2=document.createTextNode(cfObj.url);
	a2.appendChild(t2);
	td3.appendChild(a2);
	tr3.appendChild(th3);
	tr3.appendChild(td3);
	tbl1.appendChild(tr3);
	rootNd.appendChild(tbl1);

	var c2=document.createElement('div');
	c2.id='vmap';
	c2.ido=0;
	c2.kdo=0;
	var h1=document.createElement('h3');
	h1.style.textAlign='center';
	h1.innerHTML='No location data';
	c2.appendChild(h1);
	rootNd.appendChild(c2);

	var tbl4=document.createElement('table');
	tbl4.className='vdltable';
	var tr4=document.createElement('tr');
	var th4=document.createElement('th');
	th4.innerHTML='Deadlines:';
	var td4=document.createElement('td');

	for (var d=0; d<cfObj.deadlines.deadline.length; ++d) {
		ddObjRef=cfObj.deadlines.deadline[d];
		var sbrt=document.createElement('div');
		var dtdv=document.createElement('div');
		dtdv.className='dldate';
		dtdv.innerHTML=ddObjRef.datetime;
		sbrt.appendChild(dtdv);

		var spn1=document.createElement('span');
		spn1.style.fontWeight='bold';
		if (ddObjRef.restdays < 0) {
			spn1.style.color='red';
			spn1.innerHTML=' (Already passed)';
		} else {
			var htmlStr=' ('+ddObjRef.restdays;
			if (ddObjRef.restdays < 2) {
				htmlStr+=' day left)';
			} else {
				htmlStr+=' days left)';
			}
			spn1.innerHTML=htmlStr;
		}
		dtdv.appendChild(spn1);

		var dsdv=document.createElement('div');
		dsdv.className='dldesc';
		dsdv.innerHTML=ddObjRef.desc;
		sbrt.appendChild(dsdv);

		td4.appendChild(sbrt);
	}
	
	tr4.appendChild(th4);
	tr4.appendChild(td4);
	tbl4.appendChild(tr4);
	rootNd.appendChild(tbl4);

	var tbl5=document.createElement('table');
	tbl5.className='vdltable';
	var tr5=document.createElement('tr');
	var th5=document.createElement('th');
	th5.innerHTML='Web update history:';
	var td5=document.createElement('td');
	td5.id='wuhArea';
	td5.innerHTML='';
	tr5.appendChild(th5);
	tr5.appendChild(td5);
	tbl5.appendChild(tr5);
	rootNd.appendChild(tbl5);

	return rootNd;
}

// ----
function keywordSearchInAttrBrowser(fd, evt) {
	var kwdStr=fd.getValue().toLowerCase();
	console.log('['+kwdStr+']');

	keywordSearchforShortnames(kwdStr);
	keywordSearchforKeywords(kwdStr);
	keywordSearchforCityandCountry(kwdStr);
}

// ----
function clearKeywordSearchInAttrBrowser() {
	var emptyStr='';
	var fd=Ext.getDom('kwdVal');
	fd.value=emptyStr;
	fd.focus();

	keywordSearchforShortnames(emptyStr);
	keywordSearchforKeywords(emptyStr);
	keywordSearchforCityandCountry(emptyStr);
}

// ----
function keywordSearchforShortnames(valStr) {
	var snbx=Ext.getDom('snFt');
	var mxidx=snbx.childNodes.length;
	// console.log('# of target nodes: '+mxidx);

	var objRef=null;
	if (valStr.length < 1) {
		// if search string is empty ...
		// console.log( 'empty' );
		for (var idx=0; idx<mxidx; ++idx) {
			objRef=snbx.childNodes[idx];
			if ( 'none'==objRef.style.display ) {
				objRef.style.display='inline';
			}
		}
	} else {
		for (var idx=0; idx<mxidx; ++idx) {
			objRef=snbx.childNodes[idx];
			if (objRef.className=='shortName'){
				var targetStr=objRef.innerHTML.toLowerCase();
				if ( targetStr.indexOf(valStr) < 0) {
					objRef.style.display='none';
				} else {
					objRef.style.display='inline';
				}
			}
		}
	}
}

// ----
function keywordSearchforKeywords(valStr) {
	var snbx=Ext.getDom('kwCt');
	var mxidx=snbx.childNodes.length;
	// console.log('# of target nodes: '+mxidx);

	var objRef=null;
	if (valStr.length < 1) {
		// if search string is empty ...
		// console.log( 'empty' );
		for (var idx=0; idx<mxidx; ++idx) {
			objRef=snbx.childNodes[idx];
			if ( 'none'==objRef.style.display ) {
				objRef.style.display='inline';
			}
		}
	} else {
		for (var idx=0; idx<mxidx; ++idx) {
			objRef=snbx.childNodes[idx];
			if (objRef.className=='shortName'){
				var targetStr=objRef.innerHTML.toLowerCase();
				if ( targetStr.indexOf(valStr) < 0) {
					objRef.style.display='none';
				} else {
					objRef.style.display='inline';
				}
			}
		}
	}
}

// ----
function keywordSearchforCityandCountry(valStr) {
	var snbx=Ext.get('ccCt');

	var countries=snbx.select('div.countryLabel');
	// console.info('# of div.countryLabel is '+countries.getCount());

	if (valStr.length < 1) {
		var cities=snbx.select('div.cityLabel');
		// console.info('# of div.cityLabel is '+cities.getCount());

		// if search string is empty, all elements is displayed.
		countries.each(function(elem, thisObj, index) {
			elem.parent().parent().setVisibilityMode(Ext.Element.DISPLAY);
			elem.parent().parent().setVisible(true);
			elem.parent().next().setVisibilityMode(Ext.Element.DISPLAY);
			elem.parent().next().setVisible(false);
		}, this);

		cities.each(function(elem, thisObj, index){
			elem.parent().setVisibilityMode(Ext.Element.DISPLAY);
			elem.parent().setVisible(true);
		});

		var btns=snbx.select('input.countryLabelBtn');
		btns.each(function(elem, thisObj, index){
			elem.setVisibilityMode(Ext.Element.VISIBILITY);
			elem.setVisible(false);
		});

	} else {
		// make invisible all country boxes once.
		countries.each(function(elem, thisObj, index) {
			elem.parent().parent().setVisibilityMode(Ext.Element.DISPLAY);
			elem.parent().parent().setVisible(false);
		});

		var ctBx=snbx.select('div.cityBox');
		ctBx.each(function(elem, thisObj, index) {
			var tStr=elem.dom.cityValue.toLowerCase();
			var cStr=elem.dom.countryValue.toLowerCase();
			if ( tStr.indexOf(valStr.toLowerCase()) >= 0 ||
			     cStr.indexOf(valStr.toLowerCase()) >= 0) {
				elem.setVisibilityMode(Ext.Element.DISPLAY);
				elem.setVisible(true);
				elem.parent().setVisibilityMode(Ext.Element.DISPLAY);
				elem.parent().setVisible(true);
				elem.parent().dom.style.display='block';

				var y=elem.parent().prev().select('input.countryLabelBtn');
				y.each(function(elem, thisObj, index){
					elem.setVisibilityMode(Ext.Element.VISIBILITY);
					elem.setVisible(true);
				});

				elem.parent().parent().setVisibilityMode(Ext.Element.DISPLAY);
				elem.parent().parent().setVisible(true);
			} else {
				elem.setVisibilityMode(Ext.Element.DISPLAY);
				elem.setVisible(false);
			}
		}, this);

	}
}

//
// =========================================================================
// ---
function displayWUH(elm, success, resp, options) {
	if (! success) {
		elm.dom.innerHTML='Error: failed to get web update history data.';
		return;
	}

	var xml=GXml.parse(resp.responseText);

	var dts=xml.getElementsByTagName('datetime');
	var pdy=xml.getElementsByTagName('pastdays');

	var str=''
	for (var x=0; x<dts.length; ++x) {
		if (x > 3) { break; }

		str+=dts[x].firstChild.nodeValue;
		str+=' (';
		str+=pdy[x].firstChild.nodeValue;
		str+=' days ago)';
		str+='<br />';
	}
	elm.dom.innerHTML=str;
}

// ends here
//
