// core.js

//Some general useful functions

function getElement(obj){
	if(typeof obj == 'string'){
		//getElementbyId should be pretty much universal by now
		obj = document.getElementById(obj);
	}
	return obj;
}

function addLanguageLinks(){

	function refreshPage(){
		if (httpResponded()) {
			location.reload();
		}
	}
	
	var el = getElement("languageList");
	var langs = gLanguages.languages;	
	for (var ix =0; ix < langs.length ; ix++) {
		var obj = langs[ix].language;
		anchor = document.createElement('a');
		anchor.className = 'navLink';
		anchor.href = obj.url;
		anchor.onclick = function(url){
			return function(){
				var strs = url.split('?');
				httpRequest(refreshPage, strs[0], true, strs[1]);
				return false;
			}
		}(obj.url);
		anchor.appendChild(document.createTextNode(obj.name));
		el.appendChild(anchor);
		el.appendChild(document.createTextNode(' '));
	}
}

function getElementsByClassName(className, node, tag){
	var classEls = [], els, i;
	node = node || document;
	tag = tag || '*';
	els = node.getElementsByTagName(tag);
	var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
	for(i=0; i<els.length; i++){
		if(pattern.test(els[i].className)){
			classEls.push(els[i]);
		}
	}
	return classEls;
}

function populateDD(dd, options, values, selected) {
	dd = getElement(dd);
	var opts = options.split('|');
	var vals = values.split('|');
	var i, option;
	var sel = selected || -1;
	for(i=0; i < opts.length; i++){
		option = document.createElement('option');
		option.text = opts[i];
		option.value = vals[i];
		if(option.value == selected)
			sel = i;
		try{
			dd.add(option, null);
		}catch(e){
			dd.add(option, -1);
		}
	}
	dd.selectedIndex = sel;
}

function getSelectionValue(obj) {
	if(typeof obj == 'string'){
		obj = getElement(obj);
	}
	if (obj && obj.selectedIndex >= 0) {
		return obj.options[obj.selectedIndex].value;
	}
	return '';
}

function getSelectionText(obj) {
	if (obj && obj.selectedIndex >= 0) {
		return obj.options[obj.selectedIndex].text;
	}
	return '';
}

function trim(text) {
	if (text==null || text.length==0)
		return '';
	var end=text.length;
	do {
		end--;
	} while (end>=0 && text.charAt(end)==' ');
	if (end<0)
		return '';
	var start=0;
	while (text.charAt(start)==' ')
		start++;
	return text.substring(start,end+1);
}

function pad(str,padChar,minLen,right) {
	var count=minLen - str.length;
	while (count-- > 0)
		str=(right)?(str + padChar):(padChar + str);
	return str;
}

function testMask(mask, str){
	var reg = new RegExp(mask);
	var s =  reg.test(str);
	return s;
}

function isEmpty(text) {
	return (trim(text).length==0);
}

function showElement(el,show) {
	var obj=getElement(el);
	if (!obj) return;
	if (obj.style) {
		obj.style.visibility=show ? "visible" : "hidden";
	} else {
		obj.visibility=show ? "show" : "hide";
	}
}

function moveElement(el, x, y){
	var obj=getElement(el);
	if (!obj) return;
	if (obj.style) {
		obj.style.top=y+'px';
		obj.style.left=x+'px';
	} else {
		obj.top=y+'px';
		obj.left=x+'px';
	}
}

function goBack(){
	location.href=gBackButtonAction;
	return false;
}

//Popup routines

var gPopUpWindow = null;

function openPopup(url,event,width,height,move,centre,options) {
	var win=gPopUpWindow;
	if(width==null)
		width = 500;
	if(height==null)
		height = 500;
	if (!win || win.closed) {
		if (!options) {
			options="resizable,scrollbars";
		}
		win=window.open(url,"","width=" + width + ",height=" + height + ","+options);
		gPopUpWindow=win;
		var y=(event!=null)?event.screenY:9999;
		if (move!=false)
			if(centre){
				win.moveTo((screen.availWidth-width)/2,(screen.availHeight-height)/2);
			}else{	
				win.moveTo((screen.availWidth-width-20),20);
			}
	} else {
		if (win.closed) win.open();
		win.focus();
		win.location.replace(url);
	}
	return false;
}

function closePopup(){
	if (gPopUpWindow!= null && !gPopUpWindow.closed)
  		gPopUpWindow.close();

}

//Form page routines 
function bldForm(form, formBean){
	var labels,i,elName,obj;
	
	function setHidden(obj, cfg) {
		obj.value = cfg.value || '';
	}
	
	function bldTextField(label, cfg){
		var txtbox = document.createElement('input');
		txtbox.type = 'text';
		txtbox.name = label.htmlFor;
		txtbox.id = label.htmlFor;
		txtbox.value = cfg.value || '';
		if(cfg.mandatory) txtbox.className = 'required';
		txtbox.mask = cfg.mask;
		txtbox.validate = function(c){
			return function(){
				var sts = true;
				if(c.mandatory && isEmpty(this.value)){
					sts = false;
					addError(this.name,gMessageRequiredField);
				}
				if(sts && c.mask && !testMask(c.mask, this.value)){
					sts = false;
					addError(this.name,c.msg);
				}
				return sts;
			}
		}(cfg);
		txtbox.maxLength = cfg.maxLength || 0;

		if (cfg.size)
			txtbox.size = cfg.size;
		label.appendChild(txtbox);
	}
	
	function bldPasswordBox(label, cfg){
		var txtbox = document.createElement('input');
		txtbox.type = 'password';
		txtbox.name = label.htmlFor;
		txtbox.id = label.htmlFor;
		txtbox.value = cfg.value || '';
		if(cfg.mandatory) txtbox.className = 'required';
		txtbox.maxLength = cfg.maxLength || 0;
		txtbox.validate = function(isMnd){
			return function(){
				var sts = true;
				this.value = trim(this.value);
				if(isMnd && isEmpty(this.value)){
					sts = false;
					addError(this.name,gMessageRequiredField);
				}
				return sts;
			}
		}(cfg.mandatory);
		label.appendChild(txtbox);
	}
	
	function bldSelectBox(label, cfg){
		var dd = document.createElement('select');
		dd.name=label.htmlFor;
		dd.id=label.htmlFor;
		if(cfg.mandatory) dd.className = 'required';
		populateDD(dd, cfg.options, cfg.values, cfg.selected);
		dd.validate = function(isMnd){
			return function(){
				var sts = true;
				if(isMnd && isEmpty(this.value)){
					sts = false;
					addError(this.name,gMessageRequiredField);
				}
				return sts;
			}
		}(cfg.mandatory);
		label.appendChild(dd);
	}
	
	function bldCheckBox(label, cfg){
		var chkbox = document.createElement('input');
		chkbox.type = 'checkbox';
		chkbox.name = label.htmlFor;
		chkbox.id = label.htmlFor;
		label.appendChild(chkbox);
		chkbox.checked = cfg.checked;
	}
	
	function bldDisplay(label, cfg){
		var p = document.createElement('p');
		p.className = 'formText';
		var txt = document.createTextNode(cfg.value);
		p.appendChild(txt);
		label.appendChild(p);
	}
	

	// try to load hidden field values
	var inputs = form.getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++) {
		elName = inputs[i].name;
		obj = formBean[elName] || '';
		if (obj.value)
			obj.value = depresent(obj.value);
		if (obj.datatype == 'hidden')
				setHidden(inputs[i], obj);
	}
	
	labels = form.getElementsByTagName('label');
	for(i=0; i<labels.length; i++){
		elName = labels[i].htmlFor;
		
		// if the value was not passed then hide the label.
		if (formBean[elName] == null) {
			labels[i].style.visibility = 'hidden';
			break;
		}
		
		obj = formBean[elName] || '';
		if (obj.value)
			obj.value = depresent(obj.value);
		switch(obj.type){
			case 'text':
				bldTextField(labels[i], obj);
				break;
			case 'password':
				bldPasswordBox(labels[i], obj);
				break;
			case 'select':
				bldSelectBox(labels[i], obj);
				break;
			case 'checkbox':
				bldCheckBox(labels[i], obj);
				break;
			case 'display':
				bldDisplay(labels[i], obj);
				break;
			default:
				break;
		}
	}
}

// turns html escaped strings back into their proper characters.
function depresent(s) {
	var str = s;
	var re = /&lt;/g
	str = str.replace(re,"<");
	re = /&gt;/g
	str = str.replace(re,">");
	re = /&amp;/g
	str = str.replace(re,"&");
	re = /&rsquo;/g
	str = str.replace(re,"'");
	re = /&quot;/g
	str = str.replace(re,"\"");

	return str;
}


//NOTE: This is virually the same as bldDisplay() DO WE NEED THIS?
function insertFormValue(label, cfg){
	var p = document.createElement('p');
	p.className = 'formText';
	var token = (typeof cfg=='string')? cfg : cfg.value;
	var	txt = document.createTextNode(token);
	p.appendChild(txt);
	label.appendChild(p);
}

function validateForm(form){
	var isValid = true;
	var formElements;
	var idx;
	
	if(typeof form == 'string'){
		form = getElement(form);
	}
	if(!form)
		return false; //??
	
	clrErrors(form);
	formElements = form.elements;
	if(formElements.length > 0){
		for(idx=0; idx < formElements.length; idx++){
			try{
				isValid = formElements[idx].validate() && isValid;
			}catch(e){}
		}
	}
	if(!isValid){
		showErrors(form, errors);
	}
	return isValid;
}

function showErrors(form, errs){
	var idx, err, list, listItem, elem, msg;
	var msgHldr = getElement('genMessages');
	if(errs.length > 0){
		list = getElement('errList');
		if(!list){
			list = document.createElement('span');
			list.id = 'errList';
		}else{
			list.innerHTML = '';
		}
		msgHldr.appendChild(list);
		msgHldr.style.display = 'block';
	}
	var doneGeneral = false;
	var hasError = false;
	
	for(idx=0; idx<errs.length; idx++){
		err = errs[idx];
		//Populate message holder
		
		try {
			elem = getElement(err.name);
			if(!elem)
				elem = list;
			elem.className = elem.className+' errRequired';
			msg = document.createElement('span');
			msg.className = 'formMessage';
			msg.id = err.name + 'ErrorHolder';
			var errItem = getElement(msg.id);
			if (err.isError)
				hasError = true;
			if ('generalMessages' == err.name)
				doneGeneral = true;
			if (errItem != null) {
				errItem.innerHTML = err.msg;
			} else {
				msg.appendChild(document.createTextNode(err.msg));
				elem.parentNode.appendChild(msg);
			}
		} catch (e) {}
		return hasError;
	}

	// if we have an error but no general message was supplied then present a default general message
	if (hasError && !doneGeneral) {
		getElement('genMessages').innerHTML = gMessageGeneralError + "&nbsp;";
	}
	
	
	
}

function addError(elName, message){
	errors.push({name:elName,msg:message,isError:true});
}

function clrErrors(form){
	var idx;
	errors = [];
	for(idx=0; idx < form.elements.length; idx++){
		form.elements[idx].className = form.elements[idx].className.replace('errRequired','');
		form.elements[idx].onmouseover = null;
		form.elements[idx].onmouseout = null;
	}
}
