var _invalid_input_img_html="<img src='img/wrong.gif' style='vertical-align:middle' title='Invalid Input' alt='invalid input'/>&nbsp;";
var _ajax_loading_img_html="<img src='img/ajax-loader.gif'/>"

/* space savers */
function getEl(id){
	return document.getElementById(id);
}

/*
 AJAX
*/
//e.g call setAjaxHTML('GET','panelbody/form_login.html','body_div')

function getAjaxHttpObject() {
	var xmlHttp=null;
	// Firefox, Opera 8.0+, Safari
	if(window.XMLHttpRequest){
		xmlHttp=new XMLHttpRequest();
	} else {
		// Internet Explorer
		try {
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}

function setAjaxHTML(method,url,divid,imgid,imgsrc) {
	if(imgid){
		startAjaxImage(imgid);
	}
	//unique id to prevent avoid cached file usage
	var uid = Math.random();
	url.indexOf('?') > -1 ? url+=("&uid="+uid) : url+=("?uid="+uid);
	
	ajaxReq = getAjaxHttpObject();
	ajaxReq.onreadystatechange = function(){
		if(ajaxReq.readyState == "4" || ajaxReq.readyState == "complete"){
			if(ajaxReq.status == 200) {
				if(divid){
					getEl(divid).innerHTML = ajaxReq.responseText;	
				}
			} else {
				//TODO add some kind of warning?
			}
			if(imgid) stopAjaxImage(imgid);
		}		
	};
	ajaxReq.open(method,url,true);
	ajaxReq.send(null);
}

function startAjaxImage(id,img){
	if(!img) img = "img/ajax-loader.gif";
	obj = getEl(id);
	if(obj){
		obj.src = img;	
	}
	
}
function stopAjaxImage(id,img){
	if(!img) img = "img/blank.gif";
	obj = getEl(id);
	if(obj){
		obj.src = img;	
	}
}

/*
 * AJAX UI METHODS
 */
function showHideContent(control,showLabel,hideLabel,contentDivId,uri){
	var cItem = getEl(contentDivId);
	if(cItem.innerHTML == ""){
		//display
		cItem.style.display="";
		setAjaxHTML("GET",uri,contentDivId);
		control.innerHTML = hideLabel;
	} else {
		//hide
		cItem.innerHTML = "";
		cItem.style.display="none";
		control.innerHTML = showLabel;
	}
}

function showContent(contentDivId,uri,imgid,imgsrc){
	var cItem = getEl(contentDivId);
	cItem.style.display="";
	setAjaxHTML("GET",uri,contentDivId,imgid,imgsrc);
}

function doItem(itemtype,itemid,outdiv){
	if(itemid && itemtype){
		var url;
		if(itemtype == 'loginreminder'){
			url = "do.php?f=phpscript&p=action_login_reminder&email=" + escape(itemid);
		}
		if(!url)return;
		var el = getEl(outdiv);
		setAjaxHTML("GET",url,el.id);
		el.style.display = "";
		el.innerHTML = _ajax_loading_img_html;
	}
}
/*
 * NON AJAX
 */
function showItem(id){
	getEl(id).style.display="";
}

function hideItem(id){
	getEl(id).style.display="none";
}

function getPos(obj,parent){
	var top=0;
	var left=0;
	
	if (obj.offsetParent) {
		do {
			left += obj.offsetLeft;
			top += obj.offsetTop;
			if(parent){
				if(obj == parent) break;	
			}
		} while (obj = obj.offsetParent);
	}
	return [top,left];
}

/*
INPUT VALIDATION METHODS
*/
function validateInputLength(input,minlength,maxlength,errorblockid,errmsg){
	var len = input.value.length;
	var block = getEl(errorblockid);
	block.style.display='none';
	if(minlength){
		if(len < minlength){
			block.style.display='';
			if(!errmsg) errmsg = 'Value too short, minimum length is ' + minlength;
			if(len > 0){
				block.innerHTML=_invalid_input_img_html + errmsg;
			} else {
				block.innerHTML=_invalid_input_img_html + errmsg;
			}
			return false;
		}
	}
	if(maxlength){
		if(len > maxlength){
			block.style.display='';
			block.innerHTML=_invalid_input_img_html + "Value too long, maximum length is " + maxlength;
			return false;
		}
	}
	return true;
}

//default image file extensions to check
var imageExtArray = ['jpg','JPG','jpeg','JPEG','gif','GIF'];

function validateFileUploadName(input,extarray,errorblockid){
	//for now hardcoding just to allow jpeg and gif files
	var block = getEl(errorblockid);
	block.style.display='none';
	var fname = input.value;
	if(fname && fname.length > 0){
		var x = fname.lastIndexOf(".");
		var suffix;
		if(x < 0){
			suffix='xxx';
		} else {
			suffix = fname.substr(x+1,fname.length);
		}
		var valid = false;
		for(var i = 0;i < extarray.length;i++){
		  if(suffix == extarray[i]){
		      valid = true;
		      break;
		  }
		}
		if(!valid) {
			block.style.display='';
			block.innerHTML=_invalid_input_img_html + "<b>." + suffix + "</b> file type is not accepted.";
			return false;
		}
	}
	return true;
}

function validateNumericValue(input,errorblockid){
	var block = getEl(errorblockid);
	block.style.display='none';
	var val = input.value;
	var validchars = "0123456789";
	var valid = true;
	for(i = 0;i < val.length;i++){
		if(validchars.indexOf(val.charAt(i)) == -1){
			valid = false;
			break;
		}
	}
	if(!valid){
		block.style.display='';
		block.innerHTML=_invalid_input_img_html + "Value should be a number (spaces not allowed either!)";
	}
	return valid;
}

function validateUsername(input,errorblockid){
	var block = getEl(errorblockid);
	block.style.display='none';
	var valid = true;
	if(!input.value.match(/^[a-zA-Z0-9_-]+$/)){
		valid = false;
	}
	if(!valid){
		block.style.display='';
		block.innerHTML=_invalid_input_img_html + "Only letters, numbers, underscores and hyphens allowed for username.";
	}
	return valid;
}

function validateSelect(select,errorblockid){
	var block = getEl(errorblockid);
	block.style.display = 'none';
	if(select.selectedIndex < 1 || select.options[select.selectedIndex].value == 'none'){
		block.style.display = '';
		block.innerHTML=_invalid_input_img_html + "No option selected.";
		return false;
	}
	return true;
}

function validateCheckboxSelected(cbname,errorblockid,errmsg){
	var cbs = document.getElementsByName(cbname);
	var valid = false;
	for(var i = 0;i < cbs.length;i++){
		if(cbs[i].checked){
			valid = true;
			break;
		}
	}
	var block = getEl(errorblockid);
	block.style.display = 'none';
	if(!valid){
		block.style.display = '';
		if(!errmsg) errmsg = 'Required option not selected.';
		block.innerHTML=_invalid_input_img_html + errmsg;
		return valid;
	}	
	return valid;
}

/*
APPLICATION'S INVIDUAL FORM VALIDATION
*/
var ok = true;

function validateUserForm(update){
	ok = true;
	var x = validateInputLength(getEl('register_firstname'),1,null,'register_firstname_error');
	(ok && !x)?ok = false:ok;
	x = validateInputLength(getEl('register_surname'),2,null,'register_surname_error');
	(ok && !x)?ok = false:ok;
	x = validateInputLength(getEl('register_email'),4,null,'register_email_error');
	(ok && !x)?ok = false:ok;
	//values that may not be included in the user form e.g. password update is optional
	if(getEl('register_access')){
		x = validateSelect(getEl('register_access'),'register_access_error');
		(ok && !x)?ok = false:ok;	
	}
	
	if(getEl('register_username')){
		x = validateInputLength(getEl('register_username'),4,null,'register_username_error');
		(ok && !x)?ok = false:ok;
		if(x){
			x = validateUsername(getEl('register_username'),'register_username_error');
			(ok && !x)?ok = false:ok;
		}
	}
	
	if(getEl('register_password')){
		x = validateInputLength(getEl('register_password'),8,null,'register_password_error');
		(ok && !x)?ok = false:ok;
	}
	
	if(getEl('register_password_check')){
		x = validateInputLength(getEl('register_password_check'),8,null,'register_password_check_error');
		(ok && !x)?ok = false:ok;
		//password check if ok still true
		if(ok){
			var a = getEl('register_password').value;
			var b = getEl('register_password_check').value;
			block = getEl('register_password_check_error');
			block.style.display = 'none';
			if(a != b){
				ok = false;
				block.style.display = '';
				block.innerHTML = _invalid_input_img_html + "Mismatch, please enter passwords again.";
			}
		}
	}
	return ok;
}

function validateForumTopic(){
	ok = true;
	var x = validateInputLength(getEl('forum_topic_title'),5,null,'forum_topic_title_error');
	(ok && !x)?ok = false:ok;
	x = validateInputLength(getEl('forum_topic_body'),10,null,'forum_topic_body_error');
	(ok && !x)?ok = false:ok;
	x = validateFileUploadName(getEl('forum_topic_img'),imageExtArray,'forum_topic_img_error');
	(ok && !x)?ok = false:ok;
	return ok;
}

function validateForumResponse(){
	ok = true;
	x = validateInputLength(getEl('forum_response_body'),1,null,'forum_response_body_error');
	(ok && !x)?ok = false:ok;
	x = validateFileUploadName(getEl('forum_response_img'),imageExtArray,'forum_response_img_error');
	(ok && !x)?ok = false:ok;
	return ok;
}
