var DIGITS = "0123456789";
var UPPER_LATIN_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var LOWER_LATIN_LETTERS = "abcdefghijklmnopqrstuvwxyz";
var LATIN_LETTERS = UPPER_LATIN_LETTERS + LOWER_LATIN_LETTERS;
var LOWER_LETTERS = LOWER_LATIN_LETTERS + LOWER_LOCALE_LETTERS;
var UPPER_LETTERS = UPPER_LATIN_LETTERS + UPPER_LOCALE_LETTERS;
var SPECIAL_CHARACTERS  = "\"'./-_()[]{}," + SPECIAL_LOCALE_CHARACTERS;

var hoveredTab = null;

function jumpto(url) {
	window.location = url;
}

function tab_hover(tab, on) {
	//if(tab == hoveredTab) return;
	if(hoveredTab != null && hoveredTab != selectedTab && document.images[hoveredTab]) {
		document.images[hoveredTab].src = '../resources/' + hoveredTab + '-taboff_' + locale + '.gif';
	}
	if(on) {
		if(document.images[tab])
			document.images[tab].src = '../resources/' + tab + '-tabon_' + locale + '.gif';
		if(document.images['toplines'])
			document.images['toplines'].src = '../resources/' + tab + '-lines.gif';
		hoveredTab = tab;
	} else {
		if(document.images[selectedTab])
			document.images[selectedTab].src = '../resources/' + selectedTab + '-tabon_' + locale + '.gif';
		if(document.images['toplines'])
			document.images['toplines'].src = '../resources/' + selectedTab + '-lines.gif';
	}
}


function setAction() {
	if(arguments.length == 0) return;
	if(!frm) return;
	if(arguments.length > 0) {
		frm.elements['action'].value = arguments[0];
	}
	if(arguments.length > 1) {
		frm.elements['target'].value = arguments[1];
	}
	if(arguments.length > 2) {
		frm.elements['index'].value = arguments[2];
	}
	frm.submit();
}

function serviceAction(type, action) {
	var frm = document.forms['service_' + type];
	if(!frm) {
		alert('Error: frm ' + 'service_' + type + ' not found!');
		return;
	}
	var optionsEl = frm.elements['options'];
	if(!optionsEl) {
		alert('Error: options for ' + type + ' not found!');
		return;
	}
	if(optionsEl.selectedIndex == -1)
		return; // nothing selected
		
	var selectedOption = optionsEl.options[optionsEl.selectedIndex].value;
	if(selectedOption.length == 0)
		return; // first option is selected with tip
		
	var values = selectedOption.split(':');
	var principalEl = get_object('principal_' + type);
	if(principalEl != null)
		principalEl.value = values[0];
	var credentialEl = get_object('credential_' + type);
	if(credentialEl != null)
		credentialEl.value = values[1];
	if (action == 'edit')
		frm.submit();
	else if (action == 'login')
		frm.submit();
}


function hasMultipleInput(frm) {
	var els = frm.elements;
	var len = els.length;
	var isFirst = true;
	for (var i = 0; i < len; i++) {
		if (isInputText(els[i])) {
			if(isFirst)
				isFirst = false;
			else
				return true;
		}
	}
	return false;
}

function isInputText(src) {
	return (src.nodeName && (src.nodeName.toLowerCase() == 'input' && src.type == 'text')
		||  src.nodeName.toLowerCase() == 'textarea');
}

function isInputAccessible(src) {
	if((src.type && src.type == 'hidden') 
			|| (src.nodeName.toLowerCase() == 'input' && (src.readOnly || src.disabled)))  {
		return false;
	} else {
		var obj = src;
		while(obj) {
			if(hasClass(obj.className,'hidden')) return false;
			obj = obj.parentNode ? obj.parentNode : null;
		}
	}
	return true;
}

function isInputReadOnly(src) {
	if(src.nodeName && src.nodeName.toLowerCase() == 'input')
		return src.readOnly;
	else
		return false;
}

function isRadioChecked(frm, name, value) {
	var els = frm.elements;
	var len = els.length;
	for (var i = 0; i < len; i++) {
		if (els[i].name == name && els[i].checked && els[i].value == value) {
			return true;
		}
	}
	return false;
}

function navigate(forward, target) {
	if(!target || !target.name) return;
	var els = target.form.elements;

	var start = 0;
	for(var i = 0; i < els.length; i++) {
		var el = els.item(i);
		if(el.name == target.name) {
			start = i;
			break;
		}
	}
	
	if(forward) {
		for(var i = start + 1; i < els.length; i++) {
			var el = els.item(i);
			if(el.name == target.name) continue;
			var canFocus = isInputAccessible(el);
			if(canFocus) {
				try { 
					el.focus(); 
				} catch (e) { 
					// IGNORE
				}
				return true;
			}
		}
	} else {
		for(var i = start - 1; i >= 0; i--) {
			var el = els.item(i);
			if(el.name == target.name) continue;
			var canFocus = isInputAccessible(el);
			if(canFocus) {
				try { 
					el.focus(); 
				} catch (e) { 
					// IGNORE
				}
				return true;
			}
		}
	}
	return false;
}

var spinIntervals = new Object();
var spinInterval = null;
function startSpin(name, up) {
	var el = (frm) ? frm.elements[name] : null;
	if(!el || el.disabled || el.readOnly) return;
	if(spinInterval != null) {
		window.clearInterval(spinInterval);
		spinInterval = null;
	}
	var interval = (spinIntervals[name] ? spinIntervals[name] : 1) * (up ? 1 : -1);
	spin(name, interval);
	spinInterval = window.setInterval("spin('" + name + "', " + interval + ")", 150);
}

function stopSpin(e) {
	if(spinInterval != null) {
		window.clearInterval(spinInterval);
		spinInterval = null;
	}
}

function spin(name, interval) {
	var el = (frm) ? frm.elements[name] : null;
	if(!el || el.disabled || el.readOnly) return;
	var val = el.value.length == 0 ? 0 : parseFloat(unFormatNumber(el.value));
	var newInterval = val + interval;
	var newValue;
	if(newInterval <= 0)
		newValue = '';
	else
		newValue = newInterval;
	if(newValue != el.value) {
		el.value = newValue;
		if(typeof el.onchange == 'function') {
			el.onchange(el);
		}
	}
}

function ensureInterval(src, interval) {
	if(src.value.length == 0) return;
	src.value = Math.max(interval, Math.round(src.value / interval) * interval);
}

function initKeyEvents() {
	documentKeys = new keyEvents();

	if(document.all) {
		documentKeys.addKey(13, enterPressed, '');
		//documentKeys.addKey(38, upPressed   , '');
		//documentKeys.addKey(40, downPressed , '');
	}
		
	document.onkeydown = function(evt) { documentKeys.keyEvent(evt); }
}

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

function filterOptions(src, allOptions, filter) {
	var options = src.options;
	var changed = filter ? false : options.length != allOptions.length;
	for(var i = 0; !changed && i < options.length; i++) {
		var option = options[i];
		if(!inArray(filter, option.value))
			changed = true;
	}
	if(changed) {
		var selection = (src.selectedIndex == -1 ? '0' : options[src.selectedIndex].value);
		// always leave first option for (n/a)
		while(options.length > 1)
			src.remove(1);
	
		//addOption(src, '0', '', '0' == selection);
		if(filter) {
			for(var i = 0; i < filter.length; i++) {
				var key = filter[i];
				var value = allOptions[key];
				addOption(src, key, value, key == selection);
			}
		} else {
			for(key in allOptions) {
				var value = allOptions[key];
				addOption(src, key, value, key == selection);
			}
		}
	}
}

function addOption(target, value, text, selected) {
	var option = document.createElement('option');
	option.value = value;
	option.text = text;
	if(selected) {
		option.selected = true;
	}
	if(document.all)
		target.options.add(option);
	else
		target.appendChild(option);

}


// Document Events

function documentLoaded(e) {
	initKeyEvents();
	toolTipLib.attachToolTipBehavior();
}

// Input Events

function inputChanged(e) {
	var target = (e.target) ? e.target : e.srcElement;
	if(!target || !target.name) return;

	var frm = target.form;
	
	switch(target.name) {
	case 'prev':
	case 'next':
		return; // avoid setting dirty flag
		
	default:
		break;
	}

	if(frm.elements['dirty'])
		frm.elements['dirty'].value = 1;
	
}

function inputFocused(e) {
	var target = (e.target) ? e.target : e.srcElement;
	if(!target) return;

	//target.style.backgroundColor = '#f6f6e6';
	//target.style.borderStyle = 'solid';
	//target.style.borderColor = '#90896B';
	//target.style.color = '#003399';
	
	if(hasClass(target.className, 'currency')
			|| hasClass(target.className, 'decimal')) {
		target.value = unFormatNumber(target.value, 2);
	}
	if(isInputText(target)) {
		try {
			target.select();
		} catch(e) {
			// IGNORE
		}
	}
}

function inputBlured(e) {
	var target = (e.target) ? e.target : e.srcElement;
	if(!target) return;

	//target.style.backgroundColor = '';
	//target.style.borderStyle = '';
	//target.style.borderColor = '';
	//target.style.color = '';
	
	if(hasClass(target.className, 'currency')
			|| hasClass(target.className, 'decimal')) {
		var fmtValue = formatNumber(unFormatNumber(target.value, 2), DECIMAL_FORMAT);
		if(fmtValue != null && target.value != fmtValue)
			target.value = fmtValue;
	} else if(hasClass(target.className, 'taxnumber')) {
		if(target.value.length > 0) target.value = leftPad(target.value, 9, '0');
	} else if(hasClass(target.className, 'date')) {
		var dateValue = parseDate(target.value, true);
		target.value = (dateValue) ? formatDate(dateValue, DATE_FORMAT)  : '';
	} else if(hasClass(target.className, 'interval')) {
		var interval = spinIntervals[target.name];
		if(interval && interval > 1 && target.value.length > 0)
			target.value = Math.max(interval, Math.round(target.value / interval) * interval);
		
	}
}

function inputOnKeyDown(e) {

	if(documentKeys.keyEvent(e)) {
		if(e.target) {
			e.preventDefault();
			e.stopPropagation();
		}
	}
	
}

function inputOnKeyPress(e) {
	var target = (e.target) ? e.target : e.srcElement;

	if(e.ctrlKey || e.altKey) return;
	
	// NS must handle up/down keys in key press event
	if(e.keyCode == 13) {
		enterPressed(e);
		return;
	}/* else if(e.keyCode == 38) {
		upPressed(e);
		return;
	} else if(e.keyCode == 40) {
		downPressed(e);
		return;
	}*/
	
	var validchars = '';
	if(hasClass(target.className, 'number') || hasClass(target.className, 'digits'))
		validchars += DIGITS;
	else if(hasClass(target.className, 'date'))
		validchars = DIGITS + DATE_SEPARATOR;
	else if(hasClass(target.className, 'currency') || hasClass(target.className, 'decimal'))
		validchars = DIGITS + DECIMAL_SEPARATOR + MINUS_SIGN;
	else if(hasClass(target.className, 'phonenumber'))
		validchars = DIGITS + ' -()+';
	if(hasClass(target.className, 'username'))
		validchars += LATIN_LETTERS + DIGITS;
	if(hasClass(target.className, 'latin'))
		validchars += LATIN_LETTERS + ' .';
	if(hasClass(target.className, 'email'))
		validchars += LATIN_LETTERS + DIGITS + '@.';
	else if(hasClass(target.className, 'uppercase'))
		validchars += UPPER_LETTERS + ' ';
	if(hasClass(target.className, 'dotted'))
		validchars += '.';
	if(hasClass(target.className, 'dashed'))
		validchars += '-';
	if(validchars.length == 0)
		return;

	if(document.all) {
		var keyChar = String.fromCharCode(e.keyCode);
		if((hasClass(target.className, 'currency') || hasClass(target.className, 'decimal')) 
				&& DECIMAL_SEPARATOR != '.' && keyChar == '.') {
			e.keyCode = 44; // change . to ,
		} else if(hasClass(target.className, 'uppercase') && ((pos = LOWER_LETTERS.indexOf(keyChar)) != -1)) {
			e.keyCode = UPPER_LETTERS.substring(pos, pos + 1).charCodeAt(0); // change lower to upper
		} else {
			if(validchars.indexOf(keyChar) >= 0)
				e.returnValue = true;
			else
				e.returnValue = false;
		}
	} else if(e.charCode) {
		var keyChar = String.fromCharCode(e.charCode);
		if((hasClass(target.className, 'currency') || hasClass(target.className, 'decimal'))
				&& DECIMAL_SEPARATOR != '.' && keyChar == '.') {
			e.preventDefault();
			target.value = 
				target.value.substring(0, target.selectionStart) 
					+ ',' + target.value.substring(target.selectionEnd);
		} else if(hasClass(target.className, 'uppercase') && ((pos = LOWER_LETTERS.indexOf(keyChar)) != -1)) {
			e.preventDefault();
			target.value = 
				target.value.substring(0, target.selectionStart) 
					+ UPPER_LETTERS.substring(pos, pos + 1) + target.value.substring(target.selectionEnd);
		} else {
			if(validchars.indexOf(keyChar) < 0) {
				e.preventDefault();
			}
		}
	}
}


// Key Events

function enterPressed(e) {
	var target = (e.target) ? e.target : e.srcElement;
	
	if(!hasMultipleInput(target.form))
		return;
	
	if(e.shiftKey)
		navigate(false, target);
	else
		navigate(true, target);
	
	if(e.target) {
		e.preventDefault();
		e.stopPropagation();
	} else {
		e.returnValue = false;
		return false;
	}

}

function downPressed(e) {
	var target = (e.target) ? e.target : e.srcElement;

	navigate(true, target);

	if(e.target) {
		e.preventDefault();
		e.stopPropagation();
	}
}

function upPressed(e) {
	var target = (e.target) ? e.target : e.srcElement;

	navigate(false, target);

	if(e.target) {
		e.preventDefault();
		e.stopPropagation();
	}
}


var optionsList = null;
var optionLabel = null;
var optionInput = null;
function showOptions(listid, labelid, inputid) {
	optionLabel = get_object(labelid);
	optionsList = get_object(listid);
	optionInput = get_object(inputid);
	if(!optionLabel || !optionsList) return;
	var x = AnchorPosition_getPageOffsetLeft(optionLabel);
	var y = AnchorPosition_getPageOffsetTop(optionLabel);
	optionsList.style.left = x + "px";
	optionsList.style.top = (y + optionLabel.offsetHeight) + "px";
	//optionsList.style.width = (optionLabel.offsetWidth - 2) + "px";
	if(!optionsList.style.visibility || optionsList.style.visibility == 'hidden')
		optionsList.style.visibility = 'visible';
	else
		optionsList.style.visibility = 'hidden';
}

function selectOption(optionid) {
	var option = get_object(optionid);
	if(!optionLabel || !optionsList || !optionInput || !option) return;
	optionLabel.firstChild.data = option.title + ' ';
	optionsList.style.visibility = 'hidden';
	optionInput.value = optionid.substr(optionid.indexOf('_')+1);
	optionsList = null;
	optionLabel = null;
	optionInput.form.submit();
}

function unfoldMenu(menuid, imgid) {
	var menu = get_object(menuid);
	if(menu == null) return;
	var menuArrow = get_object(imgid);
	var sib = node_after(menu);
	while(sib != null && sib.id && startsWith(sib.id, menuid)) {
		sib.className = removeClass(sib.className, 'hidden');
		sib = node_after(sib);
	}
	if(menuArrow != null)
		menuArrow.src = '../resources/submenu-opened.gif';
}



function show_hidden_rows(tableId){ 
	var tabl = document.getElementById(tableId);	 
	var l = tabl.rows.length;
	var i = 1;
	for (i = 1; i < l; i++ ) {		
		var tr = tabl.rows[i];
		if (tr != null) {
			var style = tr.style.display;			
			if (style=='none')
			{
			tr.style.display='block';
			}
		}	
	}
}


