//
// $Id: touch.js,v 1.25 2008/05/25 05:45:49 zetaka Exp $
//
// ---- Global variables
var cfs=null; // Conferences
var dls=null; // DeadLines
var ccc=null; // Country-City-Conference
var awd=null; // All words

var byPos=-1;
var searchString='';

// global variables
// for getting information from a server
// in other words, these variables are used by XMLHttpRequest().
var GLs = {
	restTm1  :15,
	timerID1 :null,
	xrq1     :null,

	restTm2  : 15,
	timerID2 : null,
	xrq2     : null,

	baseurl: "http://www.netaro.info/~zetaka/projects/ConfShare/"
}

// Global Variables for Update History 
var UHs = {
	uhs:   null,  // Update History list
	uhbd:  null,  // Update History list by Day
	IDdic: null   // keep relation "IDdic[eventID]=array index of cfs"
}

function getTodayStr() {
	var dd=new Date();
	var x=dd.getFullYear()+'-';
	var tmv=1+dd.getMonth();
	x+=(tmv < 10) ? '0'+tmv : tmv;
	x+='-';
	tmv=dd.getDate();
	x+=(tmv < 10) ? '0'+tmv : tmv;
	
	return x;
}

// 日付文字列'2008-03-24 23:23:23'を6つの数値からなる配列に分解する関数
function getDateTimeVals(dtStr) {
	var x,y,z;

	x=dtStr.split(/\s+/);
	if (x[0]) {
		 y=x[0].split(/-/);
	}
	if (x[1]) {
		 z=x[1].split(/:/);
	}
	x=y.concat(z);

	return x;
}

// ----
function clickConfList() {
	byPos=window.pageYOffset;
	setConfDetail(this.cfid);
}

// ----
function toggleNextBlock() {
	var target=this.nextSibling;
	if ('block' == target.style.display ) {
		target.style.display='none';
	} else {
		target.style.display='block';
	}
}

// ----
// convert from '(' to '[' and from ')' to ']'
function convertLocationStrToGmap(srcStr) {
	var tmpStr=''+srcStr;

	tmpStr=tmpStr.replace(/\(/g, '[');
	tmpStr=tmpStr.replace(/\)/g, ']');
	tmpStr=' ('+encodeURIComponent(tmpStr)+')';

	return tmpStr;
}

// count # of conferences in ccc[Country]
function countNumOfConfs(obj) {
	var n=0;
	for (var ct in obj) {
		n+=obj[ct].length;
	}

	return n;
}

function setConfDetail(x) {
	var rtbx, sdv, dddv, lk, btn;

	rtbx=document.getElementById('listView');
	rtbx.style.display='none';

	rtbx=document.getElementById('detailView');
	rtbx.style.display='block';
	rtbx.innerHTML='';

	{ // Prepare a navigation button.
		sdv=document.createElement('div');
		sdv.style.height='30px';
		sdv.style.paddingTop='10px';
		sdv.style.paddingBottom='10px';

		if (x > 0) {
			dddv=document.createElement('span');
			btn=document.createElement('input');
			btn.type='button';
			btn.value='Prev';
			btn.name='prev';
			btn.className='detailBtn';
			dddv.appendChild(btn);
			dddv.style.position='absolute';
			dddv.style.left='0px';
			sdv.appendChild(dddv);

			btn.addEventListener('click', function (){ setConfDetail(x-1); }, false);
		}

		{
			dddv=document.createElement('span');
			btn=document.createElement('input');
			btn.type='button';
			btn.value='List';
			btn.name='tolist';
			btn.className='detailBtn';
			dddv.appendChild(btn);
			dddv.style.position='absolute';
			dddv.style.left='40%';
			sdv.appendChild(dddv);

			btn.addEventListener('click', function (){
				b=document.getElementById('detailView');
				b.style.display='none';

				var b=document.getElementById('listView');
				b.style.display='block';
				window.scrollTo(0, byPos);
			}, false);
		}

		if (x < cfs.length-1) {
			dddv=document.createElement('span');
			btn=document.createElement('input');
			btn.type='button';
			btn.value='Next';
			btn.name='next';
			btn.className='detailBtn';
			dddv.appendChild(btn);
			dddv.style.position='absolute';
			dddv.style.right='0px';
			sdv.appendChild(dddv);

			btn.addEventListener('click', function (){ setConfDetail(x+1); }, false);
		}

		rtbx.appendChild(sdv);
	}

	// console.log('call setConfDetail by cfid: '+x);
	// set title and shortname of conference 
	sdv=document.createElement('div');
	sdv.className='detailCfname';
	var str=cfs[x].title;
	if (cfs[x].abbrtitle) {
		str+='&nbsp;('+cfs[x].abbrtitle+')' ;
	}
	sdv.innerHTML=str;
	rtbx.appendChild(sdv);

	var ul=document.createElement('ul');
	var li=document.createElement('li');
	li.innerHTML=cfs[x].period;
	ul.appendChild(li);
	li=document.createElement('li');
	var locStr=cfs[x].city+', &nbsp;'+cfs[x].country;
	li.innerHTML=locStr;
	btn=document.createElement('input');
	btn.type='button';
	btn.value='Map';
	btn.style.position='absolute';
	btn.style.right='12px';
	btn.addEventListener('click', function(){
		var urlStr='http://maps.google.com/maps?';
		urlStr+='q='+cfs[x].ido+','+cfs[x].kdo;
		urlStr+=convertLocationStrToGmap(locStr);
		urlStr+='&z=8';
		location.href=urlStr;
	}, false);
	li.appendChild(btn);
	ul.appendChild(li);
	li=document.createElement('li');
	lk=document.createElement('a');
	lk.href=cfs[x].url;
	if (cfs[x].url.length > 32) {
		lk.innerHTML=cfs[x].url.substr(0, 32)+'...';
	} else {
		lk.innerHTML=cfs[x].url;
	}
	li.appendChild(lk);
	ul.appendChild(li);
	rtbx.appendChild(ul);

	// set deadline information
	ul=document.createElement('ul');
	ul.className='eventList';
	var dn=cfs[x].deadlines.deadline.length; // get # of data
	if (dn > 0) {
		for (var y=0; y<dn; ++y) {
			var u=cfs[x].deadlines.deadline[y];
			li=document.createElement('li');

			dddv=document.createElement('div');
			dddv.innerHTML=u.datetime+'&nbsp;(&nbsp;';
			if (u.restdays > 0) {
				dddv.innerHTML+=u.restdays+' day';
				if (u.restdays > 1) { dddv.innerHTML+='s'; }
				dddv.innerHTML+=' rest';
			} else {
				dddv.innerHTML+='<span style="color:red">Already passed</span>';
			}
			dddv.innerHTML+='&nbsp;)';
			dddv.style.fontSize='12px';
			li.appendChild(dddv);

			dddv=document.createElement('div');
			dddv.innerHTML=u.desc;
			dddv.style.fontSize='12px';
			dddv.style.textAlign='right';
			li.appendChild(dddv);
			ul.appendChild(li);
		}
	} else {
		li=document.createElement('li');
		li.style.fontSize='12px';
		li.innerHTML='No deadline information';
		ul.appendChild(li);
	}
	rtbx.appendChild(ul);
}

// ---
function activateListView() {
	var rtbx=document.getElementById('detailView');
	rtbx.style.display='none';

	rtbx=document.getElementById('uiparts');
	rtbx.style.display='block';
	rtbx=document.getElementById('mainView');
	rtbx.style.display='block';
	rtbx.innerHTML='';
}

// ----
function setConfList() {
	var rtbx,sdv,dv,sp;

	//activateListView();

	var tdy=getTodayStr();
	rtbx=document.getElementById('mainView');

	// list of conference information
	for (var x=0; x<cfs.length; ++x) {
		sdv=document.createElement('div');
		sdv.className='subbox';
		sdv.cfid=x;
		sdv.addEventListener('click', clickConfList, false);

		dv=document.createElement('div');
		dv.className='cfname';
		var ihtml='';

		if (cfs[x].startdate<=tdy && tdy<=cfs[x].enddate) { 
			ihtml+='<span class="ind1">';
		}
		if (cfs[x].abbrtitle) { 
			ihtml+=cfs[x].abbrtitle; 
		} else {
			ihtml+=cfs[x].title; 
		}
		if (cfs[x].startdate<=tdy && tdy<=cfs[x].enddate) { 
			ihtml+='</span>';
		}
		dv.innerHTML=ihtml;
		sdv.appendChild(dv);

		dv=document.createElement('div');
		dv.className='period';
		dv.innerHTML=cfs[x].period;
		sdv.appendChild(dv);

		dv=document.createElement('div');
		dv.className='country';
		dv.innerHTML=cfs[x].country;
		sdv.appendChild(dv);

		rtbx.appendChild(sdv);
	}

	// re-positioning
	setTimeout( function () { window.scrollBy(0, 1); }, 500);

	waitMsgOff();
}

function setDeadlineList() {
	var rtbx,sdv,dv,sp,lk;

	//activateListView();

	rtbx=document.getElementById('mainView');

	// list of conference information
	for (var x=0; x<dls.length; ++x) {

		sdv=document.createElement('div');
		sdv.className='dlRestday';
		sdv.innerHTML=dls[x][0].datetime+' [rest '+dls[x][0].restdays;
		if (dls[x][0].restdays > 1) {
			sdv.innerHTML+=' days]';
		} else {
			sdv.innerHTML+=' day]';
		}
		rtbx.appendChild(sdv);

		for (var y=0; y<dls[x].length; ++y) {

			sdv=document.createElement('div');
			sdv.className='dlsubbox';
			sdv.cfid=dls[x][y].confIdx;
			sdv.addEventListener('click', clickConfList, false);

			dv=document.createElement('div');
			dv.className='dlType';
			dv.innerHTML=dls[x][y].desc;
			if ( dls[x][y].desc.toLowerCase().indexOf("submission deadline") >= 0 ) {
				dv.style.color='red';
			}
			sdv.appendChild(dv);

			dv=document.createElement('div');
			dv.className='dlConfTitle';
			dv.innerHTML=cfs[ dls[x][y].confIdx ].title;
			if ( cfs[ dls[x][y].confIdx ].abbrtitle ) {
				dv.innerHTML+='&nbsp;('+cfs[dls[x][y].confIdx].abbrtitle+')';
			}
			sdv.appendChild(dv);

			rtbx.appendChild(sdv);
		}
	}

	// re-positioning
	setTimeout( function () { window.scrollBy(0, 1); }, 500);

	waitMsgOff();
}

function setCountryCityList() {
	var rtbx, dv, sdv, ddv, bt, cl;

	//activateListView();

	rtbx=document.getElementById('mainView');

	// list of conference information
	for (var cv in ccc) { 
		sdv=document.createElement('div');
		sdv.className='cccCountry';
		sdv.innerHTML=cv;
		sdv.innerHTML+=' ('+countNumOfConfs( ccc[cv] )+')';
		sdv.addEventListener('click', toggleNextBlock, false);
		rtbx.appendChild(sdv);

		sdv=document.createElement('div');
		sdv.style.display='none';
		rtbx.appendChild(sdv);

		for (var ct in ccc[cv]) { 
			dv=document.createElement('div');
			dv.className='cccCity';
			cl=document.createElement('div');
			cl.innerHTML=ct;
			cl.style.width='254px';
			cl.style.float='left';
			dv.appendChild(cl);
			
			bt=document.createElement('input');
			bt.type='button';
			bt.value='Map';
			bt.style.position='absolute';
			bt.style.right='4px';
			bt.style.fontSize='10pt';

			bt.urlStr='http://maps.google.com/maps?';
			var locStr=''+ct; // like deep copy
			var qlocStr=''+ct; // like deep copy
			var firstIdx=qlocStr.indexOf("(");
			if (firstIdx >= 0) {
				qlocStr=qlocStr.substring(0, firstIdx);
			}
			bt.urlStr+='q='+qlocStr;
			bt.urlStr+=convertLocationStrToGmap(locStr);
			bt.urlStr+='&z=8';

			bt.addEventListener('click', function(){
				location.href=this.urlStr;
			}, false);
			dv.appendChild(bt);
			cl=document.createElement('div');
			cl.style.clear='left';
			dv.appendChild(cl);

			sdv.appendChild(dv);

			dv=document.createElement('div');
			sdv.appendChild(dv);

			for (var x=0; x < ccc[cv][ct].length; ++x) {
				var confIdx=ccc[cv][ct][x];

				ddv=document.createElement('div');
				ddv.className='cccConfElem';
				ddv.cfid=confIdx;
				ddv.addEventListener('click', clickConfList, false);

				cl=document.createElement('div');
				if ( cfs[ confIdx ].abbrtitle ) {
					cl.innerHTML=cfs[ confIdx ].abbrtitle+' - ';
				}
				cl.innerHTML+=cfs[ confIdx ].title;
				cl.className='cccConfName';
				ddv.appendChild(cl);

				cl=document.createElement('div');
				cl.innerHTML=cfs[ confIdx ].period;
				cl.className='cccPeriod';
				ddv.appendChild(cl);

				dv.appendChild(ddv);
			}
		}
	}

	// re-positioning
	setTimeout( function () { window.scrollBy(0, 1); }, 500);

	waitMsgOff();
}

// ---
function setKeywordList() {
	var rtbx, rdv, wdv, li, tf;
	var ul=null;
	var fch='';

	//activateListView();

	rtbx=document.getElementById('mainView');

	wdv=document.createElement('div');
	wdv.style.marginTop="4px";
	wdv.style.marginBottom="4px";

	tf=document.createElement('input');
	tf.type="textfield";
	tf.style.fontSize="18px";
	tf.style.height="18px";
	tf.style.width="200px";
	tf.style.marginLeft="2px";
	tf.addEventListener('change', findMatchWords, false);
	wdv.appendChild(tf);

	tf=document.createElement('input');
	tf.type="button";
	tf.value="reset";
	tf.style.fontSize="16px";
	tf.style.height="16px";
	tf.addEventListener('click', resetWordMatch, false);
	wdv.appendChild(tf);
	rtbx.appendChild(wdv);

	rdv=document.createElement('div');
	rdv.id='allWords';
	rtbx.appendChild(rdv);

	// list of conference information
	for (var b=0; b<awd.length; ++b) { 
		if (fch != awd[b].word.charAt(0)) {
			fch = awd[b].word.charAt(0);

			wdv=document.createElement('div');
			wdv.id='words-'+fch;
			wdv.innerHTML=fch;
			wdv.className='firstCharOfWords';
			rdv.appendChild(wdv);

			ul=document.createElement('ul');
			rdv.appendChild(ul); 
		}

		li=document.createElement('li');
		li.className='klWrd';
		li.innerHTML='['+awd[b].word+'] ('+awd[b].count+')';
		li.addEventListener('click', clickWord, false);
		ul.appendChild(li);
	}

	// re-positioning
	setTimeout( function () { window.scrollBy(0, 1); }, 500);

	waitMsgOff();
}

function findMatchWords() {
	waitMsgOn();
	searchString=this.value;

	setTimeout(filterMatchWords, 100);
}

function filterMatchWords() {
	var rd, idxv;

	var wds=document.getElementsByTagName('li');
	var swd=searchString;
	// alert('# of keywords: '+wds.length+' search by: ['+swd+']');

	for (var e=0; e<wds.length; ++e) {
		wd=tangoNuki( wds[e].innerHTML );

		if (wd.length == 0 || 'unextracted' == wd) {
			wds[e].style.display='none';
			continue;
		}

		idxv = wd.indexOf(swd); 
		if (idxv < 0) {
			wds[e].style.display='none';
		}
	}

	waitMsgOff();
}
function resetWordMatch() {
	var wds=document.getElementsByTagName('li');
	for (var e=0; e<wds.length; ++e) {
		wds[e].style.display='list-item';
	}
	var tf=this.previousSibling;
	tf.value='';
}
function clickWord() {
	var idx, wd;

	wd=tangoNuki(this.innerHTML);
	alert('click word: ['+wd+']');
}
function tangoNuki(orgStr) {
	var idx, wd='unextracted';
	var tstr=''+orgStr;

	idx=tstr.indexOf(']');
	if (idx > 0) {
		wd=tstr.substring(1, idx);
	}

	return wd;
}

// count # of conferences in a day for web update list
function countNumOfConfsOfDay(obj) {
	var n=0;
	for (var ct in obj) { ++n; }

	return n;
}

function setWebUpdateList() {
	var rtbx, dv, sdv, ddv, bt, cl;

	rtbx=document.getElementById('mainView');

	// list of conference information
	for (var dystr in UHs.uhbd) {
		sdv=document.createElement('div');
		sdv.className='wuDay';
		sdv.innerHTML=dystr;

		sdv.innerHTML+=' ('+countNumOfConfsOfDay( UHs.uhbd[dystr] )+' conf.(s))';
		sdv.addEventListener('click', toggleNextBlock, false);
		rtbx.appendChild(sdv);

		sdv=document.createElement('div');
		sdv.style.display='none';
		rtbx.appendChild(sdv);

		for ( var cfn in UHs.uhbd[dystr] ) {
			ddv=document.createElement('div');
			ddv.innerHTML=cfn;
			ddv.className='wuConf';
			ddv.cfid=UHs.IDdic[ UHs.uhbd[dystr][cfn]['eventID'] ];
			ddv.addEventListener('click', clickConfList, false);
			sdv.appendChild(ddv);
		}

	}

	// re-positioning
	setTimeout( function () { window.scrollBy(0, 1); }, 500);

	waitMsgOff();
}

function changeListViewMode() {
	var slctMn=document.getElementById('modeSelection');

	waitMsgOn();
	activateListView();

	if (0 == slctMn.selectedIndex) {
		// Conference List
		setTimeout(setConfList, 100);
	} else if (1 == slctMn.selectedIndex) {
		// Deadline List
		setTimeout("setDeadlineList()", 100);
	} else if (2 == slctMn.selectedIndex) {
		// Location List
		setTimeout("setCountryCityList()", 100);
	} else if (3 == slctMn.selectedIndex) {
		// Keyword List
		setTimeout("setKeywordList()", 100);
	} else {
		// Web Update List
		setTimeout("setWebUpdateList()", 100);
	}
}

//
function extractDeadlineArray() {
	if (dls) { delete dls; }

	dls=new Array();

	var dtdic=new Object();
	for (var u=0; u<cfs.length; ++u) {
		var dlary=cfs[u].deadlines.deadline;

		if (dlary.length > 0) {
			for (var v=0; v<dlary.length; ++v) {
				if ( dlary[v].restdays >= 0) {
					// add element called 'confIdx' to deadline Object
					dlary[v].confIdx=u;

					if ( ! dtdic[ dlary[v].datetime ] ) {
						dtdic[ dlary[v].datetime ]=new Array();
					}
					dtdic[ dlary[v].datetime ].push( dlary[v] );
				}
			}
		}
	}

	for (var dtstr in dtdic) {
		dls.push(dtstr);
	}
	dls.sort();

	for (var x=0; x<dls.length; ++x) {
		dls[x] = dtdic[ dls[x] ];
	}
}

// ---
function extractCountryConfRelation() {
	// country - city - conflist

	if (ccc) { delete ccc; }

	ccc=new Object();

	for (var u=0; u<cfs.length; ++u) {
		if ( ! ccc[ cfs[u].country ] ) {
			ccc[ cfs[u].country ]=new Object();
		}
		if ( cfs[u].city ) {
			if ( ! ccc[ cfs[u].country ][ cfs[u].city ] ) {
				ccc[ cfs[u].country ][ cfs[u].city ] = new Array();
			}
		}

		ccc[ cfs[u].country ][ cfs[u].city ].push(u);
	}
}


// ---
// 会議名称から単語を抜き取る処理
function extractWordsFromConfInfo() {
	var tg=null;
	var wary=null;
	var dic=new Object();

	if (awd) { delete awd; }

	var dt=new Date();
	var fyr=dt.getYear();
	if (fyr < 1900) { fyr+=1900; }
	fyr=""+fyr;
	var syr=fyr.substr(2); // like 2008 => 08
	var regexp=new RegExp(''+fyr+'|'+syr+'|,', "g"); // 2008, 08, ','にmatchさせる

	for (var u=0; u<cfs.length; ++u) {
		tg=''+cfs[u].title;
		tg=tg.replace(/\//g, " "); // '/'は半角空白に置換
		tg=tg.replace(regexp, ""); // 年数字は削除
		wary=tg.split(/\s+/);      // 空白文字群で切り分ける

		for (var a=0; a<wary.length; ++a) { 
			wary[a]=wary[a].toLowerCase(); 
			if ( dic[ wary[a] ] ) {
				++(dic[ wary[a] ].count);
				dic[ wary[a] ].confIDs.push(u);
			} else {
				dic[ wary[a] ]=new Object();
				dic[ wary[a] ].word=wary[a];
				dic[ wary[a] ].count=1;
				dic[ wary[a] ].confIDs=new Array();
				dic[ wary[a] ].confIDs.push(u);

 				if ( wary[a].indexOf('-') > 0 ) {
					// console.log('word: '+wary[a]);
					var subwary=wary[a].split(/-/); // ハイフンで分割
					// console.log('before #: '+wary.length);
					wary=wary.concat( subwary );
					// console.log('after #: '+wary.length);
				}
			}
		}

		tg=''+cfs[u].abbrtitle;
		tg=tg.replace(/\//g, " ");
		tg=tg.replace(regexp, "");
		wary=tg.split(/\s+/);
		for (var a=0; a<wary.length; ++a) { 
			wary[a]=wary[a].toLowerCase(); 
			if ( dic[ wary[a] ] ) {
				++(dic[ wary[a] ].count);
				dic[ wary[a] ].confIDs.push(u);
			} else {
				dic[ wary[a] ]=new Object();
				dic[ wary[a] ].word=wary[a];
				dic[ wary[a] ].count=1;
				dic[ wary[a] ].confIDs=new Array();
				dic[ wary[a] ].confIDs.push(u);
			}
		}
	}

	awd=new Array();
	for (var wd in dic) {
		// eliminate too short word
		if (wd.length < 2) { continue; }
		// eliminate specific words
		if ( wd.match(/and|in|or|on|of|its|the/) ) { continue; } 
		// eliminate words start from number
		if ( wd.match(/^\d+/) ) { continue; } 

		awd.push(wd);
	}
	awd.sort();
	// alert(awd.length+' words');
	for (var c=0; c<awd.length; ++c) {
		awd[c]=dic[ awd[c] ];
	}

	delete dic;
}

// --- make relation dictionary between event ID and index in cfs array 
// because setConfDetail() uses the array index for display a conference detail
function makeEventIDDict() {
	if (UHs.IDdic) { delete UHs.IDdic; }

	UHs.IDdic=new Array();

	for (var u=0; u<cfs.length; ++u) {
		UHs.IDdic[ cfs[u].id ] = u;
	}
}

// ----
// 日付 - 会議名称(省略名優先) - 回数(時刻) - リンク(会議情報詳細)
function extractUpdateHistoryByDayArray() {
	var ArrayRef=null;

	if ( UHs.uhbd ) { delete UHs.uhbd; }
	UHs.uhbd=new Array();

	for (var w=0; w<UHs.uhs.length; ++w) {
		var dtv=getDateTimeVals(UHs.uhs[w].datetime);
		if (6!=dtv.length) {
			console.log('Wrong datetime format: '+UHs.uhs[w].datetime);
		}

		var dystr=dtv[0]+'-'+dtv[1]+'-'+dtv[2];
		if ( ! UHs.uhbd[dystr] ) {
			UHs.uhbd[ dystr ] = new Object(); // index by date string.
		}

		if (UHs.uhs[w].abbrtitle ) {
			if ( ! UHs.uhbd[ dystr ][ UHs.uhs[w].abbrtitle ] ) {
				UHs.uhbd[ dystr ][ UHs.uhs[w].abbrtitle ]=new Object();
				UHs.uhbd[ dystr ][ UHs.uhs[w].abbrtitle ]['eventID'] = UHs.uhs[w].eventID;
				UHs.uhbd[ dystr ][ UHs.uhs[w].abbrtitle ]['hours'] = new Array();
			}
			ArrayRef=UHs.uhbd[ dystr ][ UHs.uhs[w].abbrtitle ]['hours'];
		} else {
			if ( ! UHs.uhbd[ dystr ][ UHs.uhs[w].title ] ) {
				UHs.uhbd[ dystr ][ UHs.uhs[w].title ]=new Object();
				UHs.uhbd[ dystr ][ UHs.uhs[w].title ]['eventID'] = UHs.uhs[w].eventID;
				UHs.uhbd[ dystr ][ UHs.uhs[w].title ]['hours'] = new Array();
			}
			ArrayRef=UHs.uhbd[ dystr ][ UHs.uhs[w].title ]['hours'];
		}

		ArrayRef.push( dtv[3] );
	}

	for ( var v in UHs.uhbd ) {
		//console.log(v);
		for (var u in UHs.uhbd[ v ] ) {
			//console.log('- '+u);
			ArrayRef = UHs.uhbd[v][u]['hours'];
			ArrayRef.sort();
		}
	}
}

// ----
function didLoaded2(rq) {
	if (4==rq.readyState) {
		if (200==rq.status) {
			clearInterval(GLs.timerID2);

			// make JSON to object
			UHs.uhs=eval(rq.responseText);

			//
			extractUpdateHistoryByDayArray();
		}
	}
}

// ----
function didLoaded(rq) {
	if (4==rq.readyState) {
		if (200==rq.status) {
			clearInterval(GLs.timerID1);

			// make JSON to object
			cfs=eval(rq.responseText);

			// 
			makeEventIDDict();

			// extract and build Deadline Data list (cfs => dls)
			extractDeadlineArray();

			// extract and build country - city - coufIdx relation (cfs => ccc)
			extractCountryConfRelation();

			// extract keyword set from full name of conferences. (cfs => awd)
			extractWordsFromConfInfo();

			// display a list of conferences
			setConfList();
		}
	}
}

function waitMsgOn() {
	// make invisible a wait message
	rtbx=document.getElementById('msgBlock');
	rtbx.style.display='block';
}
function waitMsgOff() {
	// make invisible a wait message
	rtbx=document.getElementById('msgBlock');
	rtbx.style.display='none';
}

// -- 
function initCList() {
	waitMsgOn();

	var cfurl=GLs.baseurl+'conferences.js';
	GLs.xrq1=new XMLHttpRequest();
	GLs.xrq1.onload = function() { didLoaded(GLs.xrq1); };
	GLs.xrq1.open("GET", cfurl);
	GLs.xrq1.setRequestHeader("Cache-Control", "no-cache");
	GLs.timerID1=setInterval(timeoutCheck1, 1000);
	GLs.xrq1.send(null);

	var uhurl=GLs.baseurl+'update_history.js';
	GLs.xrq2=new XMLHttpRequest();
	GLs.xrq2.onload = function() { didLoaded2(GLs.xrq2); };
	GLs.xrq2.open("GET", uhurl);
	GLs.xrq2.setRequestHeader("Cache-Control", "no-cache");
	GLs.timerID2=setInterval(timeoutCheck2, 1000);
	GLs.xrq2.send(null);
}

// ---------------------------------------------------------------------
function timeoutCheck1() {
	GLs.restTm1--;
	if (GLs.restTm1 <= 0) {
		clearInterval(GLs.timerID1);

		xrq1.abort();

		alert('load request 1 is timeouted.');
		return false;
	}
}
function timeoutCheck2() {
	GLs.restTm2--;
	if (GLs.restTm2 <= 0) {
		clearInterval(GLs.timerID2);

		GLs.xrq2.abort();

		alert('load request 2 is timeouted.');
		return false;
	}
}

// ---------------------------------------------------------------------
// ----
//引数で指定した要素の絶対位置座標オブジェクトを返す関数
function getElementPos(elem) {
	var obj=new Object();

	obj.x=elem.offsetLeft;
	obj.y=elem.offsetTop;

	while (elem.offsetParent) {
		elem=elem.offsetParent;
		obj.x+=elem.offsetLeft;
		obj.y+=elem.offsetTop;
	}

	return obj;
}

// --- calback functions for window object 
window.addEventListener('load', initCList, false);

//
// ends here
//
