window.onload = function() {
	if (!document.getElementById) return false;
	if (!document.getElementById('showcase')) return false;
	prepareNav();
	prepareForm();
	prepareList();
}

function prepareNav() {
	if (!document.getElementById('show')) return false;
	var showselect = document.getElementById('show');
	if (showselect) showselect.onchange = function() {
		var show = this.options[this.selectedIndex].value;
		var lang = document.getElementById('showlang').value;
		grabFile(show+'?lang='+lang, document.getElementById('showcase'))
	}
	if (document.getElementById('postshow')) document.getElementById('postshow').className='hidden';
	return true;
}

function prepareForm() {
	if (!document.getElementById || !document.getElementsByTagName) return false;
	if (!document.getElementById('showcase')) return false;
	var nav = document.getElementById('show');
	if (nav) var type = nav.options[nav.selectedIndex].value;
		else var type = 'search';
	if (inArray(type,Array('search','upload','mail'))) {
		var forms = document.getElementById('showcase').getElementsByTagName('form');
		if (!forms[0]) return false;
	}
	switch(type) {
		// Document Search Section
		case 'search':
			// Making Send Buttons invisible 
			var inputs = forms[0].getElementsByTagName('input');
			for (var i=0; i<inputs.length; i++) {
				if (inputs[i]) {
					if (inputs[i].type=='submit' && inputs[i].getAttribute('id')!='postdocnr')
						inputs[i].className = 'hidden';
					if (inputs[i].type=='checkbox') {
						inputs[i].onchange = function() {
							return sendForm(this.form,'doclist');
						}
					}
				}
			}
			// Preparing select controls to load search result automatically upon change 
			var selects = forms[0].getElementsByTagName('select');
			for (var i=0; i<selects.length; i++) {
				if (selects[i]) {
					// Category controls: Update category controls first
					if (selects[i].getAttribute('id').substr(0,4)=='cat-') {
						selects[i].onchange = function() {
							var ccat = this.options[this.selectedIndex].value;
							var cfile = 'catlist?cat='+ccat+'&lang='+document.getElementById('lang').value;
							document.getElementById('catcount').value=0;
							document.getElementById('cat').value=ccat;
							sendForm(this.form,'doclist');
							grabFile(cfile,document.getElementById('catlistblock'));
						}
					}						
					// Date controls: Update meetings list first 
					else if (selects[i].getAttribute('id').indexOf('date')>=0) {
						selects[i].onchange = function() {
							checkDay(this);
							sendForm(this.form,'meetingslist');
							return sendForm(this.form,'doclist');
						}
					}
					// Checkboxes
					else if (selects[i].type == 'checkbox') {
						selects[i].onclick = function() {
							return sendForm(this.form,'doclist')
						}
					}
					// Other select controls
					else selects[i].onchange = function() {
						return sendForm(this.form,'doclist')
					}
				}
			}
			forms[0].onsubmit = function() {
				return sendForm(this,type);
			}
			break;
		// Document Upload Section
		case 'upload':
			var hide = Array('showmeetings','newmeeting','newtag');
			for (var i=0; i<hide.length; i++) {
				var ctrl = document.getElementById(hide[i]);
				if (ctrl) ctrl.className = 'unseen';
			}
			// Preparing select controls
			var selects = forms[0].getElementsByTagName('select');
			for (var i=0; i<selects.length; i++) {
				if (selects[i]) {
					var id = selects[i].getAttribute('id')
					// Date controls: Update meetings list first 
					if (id.indexOf('date')>=0) {
						selects[i].onchange = function() {
							checkDay(this);
							sendForm(this.form,'meetingslist');
						}
					}
					if (id == 'meeting' || id == 'tag') {
						selects[i].onchange = function() {
							if (this.options[this.selectedIndex].value == -1) {
								document.getElementById('new'+this.getAttribute('id')).className="seen";
							} else {
								document.getElementById('new'+this.getAttribute('id')).className="unseen";
								var opt = this.options[this.selectedIndex];
								return !insertKey(this,opt.value,opt.firstChild.nodeValue);
							}
						}
					}
				}
			}
			// Preparing date 'since' checkbox
			var since = document.getElementById('datesince');
			if (since) {
				since.onchange = function() {
					sendForm(this.form,'meetingslist');
				}
			} 
			// Meetings and Keywords
			var keys = Array('meeting','tag');
			for (i=0;i<keys.length;i++) {
				// Prepare delete buttons for existing meetings and keywords
				var keylist = document.getElementById('file'+keys[i]+'s');
				if (keylist) {
					var buttons = keylist.getElementsByTagName('input');
					for (j=0;j<buttons.length;j++) {
						if (buttons[j].type=='submit') buttons[j].onclick = function() {
							removeKey(this);
						}
					}
				}
				// Prepare fields for new meeting and new keyword
				var newen = document.getElementById('new'+keys[i]+'-en');
				var newfr = document.getElementById('new'+keys[i]+'-fr');
				var newadd = document.getElementById('add'+keys[i]);
				if (newen && newfr && newadd) {
					newadd.disabled='disabled';
					newen.onfocus = function() { 
						if (this.parentNode.getElementsByTagName('input')[1].value) 
							this.parentNode.getElementsByTagName('input')[2].disabled = ''; 
					}
					newen.onblur = function() { 
						if (!this.value) 
							this.parentNode.getElementsByTagName('input')[2].disabled = 'disabled'; 
					}
					newfr.onfocus = function() {
						if (this.parentNode.getElementsByTagName('input')[0].value) 
							this.parentNode.getElementsByTagName('input')[2].disabled = ''; 
					}
					newfr.onblur = function() {
						if (!this.value) 
							this.parentNode.getElementsByTagName('input')[2].disabled = 'disabled'; 
					}
					newadd.onclick = function() {
						var inputs = this.parentNode.getElementsByTagName('input');
						if (!inputs[0] || !inputs[1]) return false;
						if (!inputs[0].value || !inputs[1].value) {
							alert('Please fill in the fields both for the English and the French description!');
							return false;
						} else {
							var newid = this.getAttribute('id').replace('add','')+'s';
							var buttons = document.getElementById('file'+newid).getElementsByTagName('input');
							for (var i=0;i<buttons.length;i++) {
								if (buttons[i].className == 'contactbutton') buttons[i].value = '';
							}
							return sendForm(this.form,newid);
						}
						return true;
					}
				}
			}
			break;
		case 'mail':
			var target = document.getElementById('newdocs');
			if (!target) return;
			var links = target.getElementsByTagName('a');
			for (var i=0; i<links.length; i++) {
				if (links[i].className=='nomail') {
					links[i].onclick = function() {
						var href = this.getAttribute('href');
						var query = href.split('?')[1];
						return !grabFile('newdocs?'+query,document.getElementById('newdocs'));
					}
				}
			}
			forms[0].onsubmit = function() {
				return sendForm(this,type);
			}
			break;
		case 'catman':
			if (!document.getElementsByName) return false;
			var target = document.getElementById('catlist');
			if (!target) return;
			var links = target.getElementsByTagName('a');
			for (var i=0; i<links.length; i++) {
				linkclass = links[i].className;
				if (inArray(linkclass,Array('cat-up','cat-down','cat-del'))) {
					links[i].onclick = function() {
						if (this.className == 'cat-del')
							if (!confirm('Are you sure you want to delete this category?')) return false;
						var parent = this.parentNode.parentNode.getAttribute('id').replace('ul_check','');
						var href = this.getAttribute('href');
						var query = href.split('?')[1] + '&parent=' + parent;
						return !grabFile('catman?'+query,document.getElementById('ul_check'+parent));
					}
				}
				else if (linkclass=='cat-add') {
					links[i].onclick = function() {
						var id = this.parentNode.getAttribute('id');
						if (!id) return true;
						var ulid = id.replace('cat-','ul_check');
						var newul = document.getElementById(ulid);
						if (!newul) {
							newul = document.createElement('ul');
							newul.setAttribute('id',ulid);
							newul.className = 'shown';
							this.parentNode.appendChild(newul);
						}
						var liid = id.replace('cat-','newcatform-');
						if (document.getElementById(liid)) return false;
						var newli = document.createElement('li');
							newli.setAttribute('id',liid);
							newli.className = 'newcatform';
						newul.appendChild(newli);
						return !grabFile('newcat?parent='+id.replace('cat-',''),document.getElementById(liid));
					}
				}
			}
			var buttons = document.getElementsByName('postnewcat');
			if (buttons) {
				for (var i=0; i<buttons.length; i++) {
					buttons[i].onclick = function() {
						var id = this.getAttribute('id')
						if (!document.getElementById(id.replace('postnewcat','newcat_en')).value) {
							alert('Please enter category name in English!');
							return false;
						}
						if (!document.getElementById(id.replace('postnewcat','newcat_fr')).value) {
							alert('Please enter category name in French!');
							return false;
						}
						var newid = id.replace('postnewcat-','ul_check');
						return sendForm(this.form,newid);
					}
				}
			}
			break;
	}
	return true;
}

function checkDay(sel){
	if (!sel) return false;
	if (!sel.getAttribute('id')) return false; 
	var id = sel.getAttribute('id');
	var group = id.split('-')[0];
	yyyy = document.getElementById(group+'-yyyy');
	year = yyyy.options[yyyy.selectedIndex].value;
	mm = document.getElementById(group+'-mm');
	month = mm.selectedIndex;
	dd = document.getElementById(group+'-dd');
	day = dd.selectedIndex;
	// alert('Checking date: '+(day+1)+'/'+(month+1)+'/'+year);
	var max = 30;
	if (month==1) {
		max = 28;
		if ((year % 4)||(year == 2000)) max = 27;
	}
	if ((month==3)||(month==5)||(month==8)||(month==10)) {
		max = 29;
	}
	if (day > max) dd.selectedIndex = max;
	for(var i=28; i<31; i++) {
		if (i>max) dd.options[i].disabled = true;
		else dd.options[i].disabled = false;
	}
	return true;
}

function insertKey(list,opt,label) {
	if (!document.createElement || !document.createTextNode || !document.appendChild || !document.insertBefore) return false;	
	var id = list.getAttribute('id');
	if (!id) return false;
	if (document.getElementById('file'+id+'-'+opt)) return false;
	var parent = document.getElementById('file'+id+'s');
	if (!parent) return false;
	var lang = document.getElementById('lang').value;
	var nolist = document.getElementById(list.getAttribute('id')+'-0');
	if (!nolist) return false;
	nolist.className="hidden";
	var txt = document.createTextNode(label+' ');
	var val = document.createElement('input');
		val.setAttribute('type','hidden');
		val.setAttribute('id',id+'-'+opt);
		val.setAttribute('name',id+'s[]');
		val.setAttribute('value',opt);
	var del = document.createElement('input');
		del.setAttribute('type','submit');
		del.setAttribute('id','del'+id+'-'+opt);
		del.setAttribute('name','del'+id+'-'+opt);
		del.setAttribute('value','x');
		if (lang=='en' )
			del.setAttribute('title','Remove list keyword from the list!');
		else
			del.setAttribute('title','Remove list keyword from the list!');
		del.setAttribute('class','contactbutton');
		del.onclick = function() {
			removeKey(this);
		}
	var li = document.createElement('li');
		li.setAttribute('id','file'+id+'-'+opt);
		li.appendChild(txt);
		li.appendChild(val);
		li.appendChild(del);
	var items = parent.getElementsByTagName('li');
	var before = nolist;
	var j = items.length -1;
	for (var i=1; i<items.length; i++) {
		j = items.length - 1 - i;
		switch (id) {
			case 'meeting':
				if (laterDate(items[j].firstChild.nodeValue.split(':')[0],txt.nodeValue.split(':')[0]))
					before = items[j];
				break;
			case 'tag':
				if (txt.nodeValue < items[j].firstChild.nodeValue)
					before = items[j];
				break;
		}
	}
	parent.insertBefore(li,before);
	list.selectedIndex=0;
	fadeUp(li,255,255,153);
	return true;
}

function removeKey(button) {
	if (!document.getElementsByTagName || !document.removeChild) return false;	
			var remains = button.parentNode.parentNode.getElementsByTagName('li');
			if (remains.length<3) remains[1].className='seen';
			button.parentNode.parentNode.removeChild(button.parentNode);
}

function laterDate(first,second) {
	if (first.split('/')[2] < second.split('/')[2]) return true;
	else if (first.split('/')[1] < second.split('/')[1]) return true;
	else if (first.split('/')[0] < second.split('/')[0]) return true;
	return false;
}

function prepareList() {
	if (!document.getElementsByTagName || !document.getElementById) return false;
	var doclist = document.getElementById('doclist');
	if (!doclist) return false;
	var showcase = document.getElementById('showcase');
	if (!showcase) return false;
	var links = doclist.getElementsByTagName('a');
	for (var i=0; i<links.length; i++) { 
		var linkclass = links[i].className;
		if ((linkclass == 'paginate') || (linkclass == 'dellink')) {
			links[i].onclick = function() {
				var query = this.getAttribute('href').split('?')[1];
				return !grabFile('doclist?'+query,doclist);
			}
		}
		else if (linkclass == 'editlink') {
			links[i].onclick = function() {
				showselect = document.getElementById('show');
				if (showselect) showselect.selectedIndex = 1;
				var query = this.getAttribute('href').split('?')[1];
				return !grabFile('upload?'+query,showcase);
			}
		}
	}
}

function sendForm(sendform,id) {
	var ex = Array('search','upload','mail','catman','members');
	if (inArray(id,ex)) var target = document.getElementById('showcase');
		else var target = document.getElementById(id);
	if (!target) return true;
	var data = "";
	for (var i=0; i<sendform.elements.length; i++) {
		if (sendform.elements[i].type != 'checkbox' || sendform.elements[i].checked) {
			data+= sendform.elements[i].name;
			data+= "=";
			data+= escape(sendform.elements[i].value);
			data+= "&";
		}
	}
	if (id.indexOf('ul_check') >= 0) id = 'catman';
	return !sendData(data,target,id);
}


function sendData(data,target,file) {
	var request = getHTTPObject();
	if (request) {
		displayLoading(target);
		request.onreadystatechange = function() {
			parseResponse(request,target);
		}
	    request.open("POST", '/i-'+file+'.php', true);
		request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		request.send(data);
		return true;
	} else {
		return false;
	}
}

function grabFile(file, target) {
	var request = getHTTPObject();
	if (request) {
		displayLoading(target);
		request.onreadystatechange = function() {
			parseResponse(request, target, file.split('?')[0]);
		};
		request.open("GET", '/i-'+file.split('?')[0]+'.php?'+file.split('?')[1], true);
		request.send(null);
		return true;
	} else {
		return false;
	}
}

function parseResponse(request,target) {
	if (request.readyState == 4) {
		if (request.status == 200 || request.status == 304) {
			empty(target);
			target.innerHTML = request.responseText;
			prepareForm();
			prepareList();
			fadeUp(target,255,255,153);
		}
	}
}

function getHTTPObject() {
	var xhr = false;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				xhr = false;
			}
		}
	}
	return xhr;
}

function displayLoading(element) {
	var ex = Array('meetingslist', 'tagslist', 'catlistblock', 'newcat');
	if (inArray(element.getAttribute('id'),ex)) return false;
	empty(element);
	var image = document.createElement("img");
	image.setAttribute("src","/pix/loading.gif");
	image.setAttribute("alt","Loading...");
	element.appendChild(image);
}

function fadeUp(element,red,green,blue) {
	var ex = Array('meetingslist', 'tagslist', 'catlistblock');
	if (inArray(element.getAttribute('id'),ex)) return false;
	if (element.fade) {
		clearTimeout(element.fade);
	}
	element.style.backgroundColor = "rgb("+red+","+green+","+blue+")";
	if (red == 255 && green == 255 && blue == 255) {
		return;
	}
	var newred = red + Math.ceil((255 - red)/10);
	var newgreen = green + Math.ceil((255 - green)/10);
	var newblue = blue + Math.ceil((255 - blue)/10);
	var repeat = function() {
		fadeUp(element,newred,newgreen,newblue)
	};
	element.fade = setTimeout(repeat,50);
}

function empty(target) {
	while (target.hasChildNodes()) {
		target.removeChild(target.lastChild);
	}
}

function inArray(needle,haystack) {
	for(var i=0; i<haystack.length; i++) {
		if (haystack[i] == needle) return true;
	}
	return false;
}
