
var radioHierachyLevel = new Object();
radioHierachyLevel.setValue = function(obj, targetObjs){}
radioHierachyLevel.getValue = function(targetObjs){
	for(var i = 0;i < targetObjs.length;i++){
		if(targetObjs[i].checked){
			return targetObjs[i].value;
		}
	}
}

var selectHierachyLevel = new Object();
selectHierachyLevel.setValue = function(obj, targetObjs)
{
	var j = 1;
	if(obj){
		for(var k = 0;k < obj.length;k+=2){
			if(typeof(obj[k + 1]) == "object"){
				targetObjs.options[j] = new Option(obj[k + 1][0], obj[k] || "");
			}else{
				targetObjs.options[j] = new Option(obj[k + 1], obj[k] || "");
			}
			j++;
		}
		targetObjs.options.length = j;
	}else{
		targetObjs.options.length = j;
		targetObjs.selectedIndex = 0;
	}
}
selectHierachyLevel.getValue = function(targetObjs){
	if(targetObjs.selectedIndex >= 0){
		return targetObjs.options[targetObjs.selectedIndex].value;
	}else{
		return "";
	}
}

var hierachyManager = new Object();
hierachyManager.setValue = function(hierachy, targetObjs, targetObjsList)
{
	var obj = hierachy.data;
	var j = targetObjsList.length;
	for(var i = 0;i < j;i++){
		subdivsion = targetObjsList[i];
		value = hierachy.dataObjects[i].getValue(subdivsion);
		if(value == ""){
			for(i = i + 1;i < j;i++){
				hierachy.dataObjects[i].setValue(null, targetObjsList[i]);
			}
		}else{
			var match = false;
			for(var k = 0;k < obj.length && !match;k+=2){
				if(obj[k] == value){
					obj = obj[k + 1];
					match = true;
				}
			}
			if(match){
				if(i > 0){
					if(typeof(obj) == "object")
						obj = obj[1];
					else
						obj = null;
				}
				if(targetObjs == subdivsion){
					i = i + 1;
					hierachy.dataObjects[i].setValue(obj, targetObjsList[i]);
					for(i = i + 1;i < j;i++){
						hierachy.dataObjects[i].setValue(null, targetObjsList[i]);
					}
				}
			}else{
				for(i = i + 1;i < j;i++){
					hierachy.dataObjects[i].setValue(null, targetObjsList[i]);
				}
			}
		}
	}
}

function replace(expr, find, replacewith, start, count, compare){
	var expression = expr;
	var retValue = "";
	var find = find || "";
	var start = start || 0;
	var count = count || -1; 
	var end = expression.indexOf(find, start);
	while(end != -1 && count != 0){
		retValue += expression.substring(start, end) + replacewith;
		start = end + find.length;
		end = expression.indexOf(find, start);
		count = count - 1; 
	}
	return retValue += expression.substring(start);
}
function selectAdd(src, text, value, which)
{
	//ns4.7 stores value of null as 'undefined'
	src.options[which || src.length] = new Option(text, value || "");
}
function selectRemove(selectObj, firstIndex){
	if(selectObj.selectedIndex >= firstIndex){
		var src = selectObj.options;
		var j = selectObj.selectedIndex;
		for(var i = (selectObj.selectedIndex || firstIndex);i < selectObj.length && !src[i].selected;i++){}
		if(i < selectObj.length){			
			cnt = 1;
			while(i < selectObj.length-cnt){
				if(src[i+cnt].selected){
					cnt++;
				}else{
					src[i] = new Option(src[i+cnt].text, src[i+cnt].value);
					i++;
				}
			}
			while(i < selectObj.length)
				src[i] = null;
		}
		selectObj.selectedIndex = j;
	}			
}
function stateEncode(str){
	return replace(replace(str, "\\", "\\\\"), "|", "\\|");
}
function selectCache(selectObj, firstIndex){
	var str = "";
	var index = selectObj.length;
	if(index > firstIndex){
		index = index - 1;
		str = stateEncode(selectObj.options[index].value || selectObj.options[index].text);
		while(index > firstIndex){
			index = index - 1;
			str = stateEncode(selectObj.options[index].value || selectObj.options[index].text) + "|" + str;
		}
	}
	return str;	
}
function parseNumber(expression, numDigitsAfterDecimal, defaultZero, groupDigits)
{
	var lcWhole = "";
	var lcFract = "";
	var lcNumber = "123456789";
	var minusSign = false;
	var isZero = false;
	var expr = "" + expression;
	var strlength = expr.length;
	var period = strlength;
	for(var liCounter = 0;liCounter < period;liCounter++)
	{
		exprChar = expr.charAt(liCounter);
		if(lcNumber.indexOf(exprChar,0) != -1){
			lcWhole += exprChar;
		}else if(exprChar == "-" && lcWhole == ""){
			minusSign = true;
		}else if(exprChar == "0"){
			if(lcWhole == "")
				isZero = true;
			else
				lcWhole += exprChar;
		}else if(exprChar == "."){
			period = liCounter;
		}
	}
	for(var liCounter = strlength;liCounter > period;liCounter--)
	{
		exprChar = expr.charAt(liCounter);
		if(lcNumber.indexOf(exprChar,0) != -1){
			lcFract = exprChar + lcFract;
		}else if(exprChar == "0"){
			if(lcFract == "")
				isZero = true;
			else
				lcFract = exprChar + lcFract;
		}
	}
	if(lcWhole == ""){
		if(defaultZero || lcFract.length || isZero)
			lcWhole = "0";
		else
			return "";
	}
	if(lcFract.length > numDigitsAfterDecimal){
		lcFract = "" + Math.round(("0." + lcFract) * Math.pow(10, numDigitsAfterDecimal)) / Math.pow(10, numDigitsAfterDecimal)
		if(lcFract.charAt(0) == "1")
			lcWhole = "" + (parseInt(lcWhole) + 1);
		lcFract = lcFract.substring(2)
	}
	isZero = (lcFract == "" && lcWhole == "0")
	while(lcFract.length < numDigitsAfterDecimal){
		lcFract += "0";
	}
	if(!isZero){
		if(groupDigits){
			for(var liCounter = lcWhole.length-3;liCounter > 0;liCounter -= 3){
				lcWhole = lcWhole.substring(0, liCounter) + ',' + lcWhole.substring(liCounter);
			}
		}
		if(minusSign)
			lcWhole = "-" + lcWhole;
	}
	if(numDigitsAfterDecimal)
		return lcWhole + "." + lcFract;
	else
		return lcWhole;
}
function count(obj)
{
	if(obj){
		if(obj.length && obj[0] && !obj.options){
			for(var i = 0;obj[i];i++){}
			return i;
		}else
			return 1;
	}else
		return 0;	
}
function isValidDate(date_value, month_value, year_value)
{
	if(!(date_value && month_value && year_value))
		return false;
	else{
		if(month_value < 1 || month_value > 12)
			return false;
		else{
			if(date_value < 1 || date_value > 31) {
				return false;	
			}
			if ((month_value==4 || month_value==6 || month_value==9 || month_value==11) && date_value==31) {
				return false;
			}
			if(month_value == 2) { 
				var isleap = (year_value % 4 == 0 && (year_value % 100 != 0 || year_value % 400 == 0));
				if (date_value>29 || (date_value==29 && !isleap)) {
					return false;	
				}
			}
		}
	}
	return true;
}
function stringBuffer(){
	this.init = function(str){
		this.address = 0;
		this.source = str;
		this.strlen = this.source.length;
	}
	this.read = function(){
		var retval;
		if(this.address >= this.strlen){
			retval = "";
		}else{
			retval = this.source.charAt(this.address);
		}
		this.address = this.address + 1;
		return retval;
	}
	this.EOS = function(){
		return (this.address >= this.strlen);
	}
	this.length = function(){
		return this.strlen;
	}
}
function weekdayName(dayVal, abbreviate){
	var weekdayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
	if(abbreviate)
		return weekdayNames[dayVal].substring(0, 3);
	else
		return weekdayNames[dayVal];
}
function monthName(monthVal, abbreviate){
	var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
	if(abbreviate)
		return monthNames[monthVal].substring(0, 3);
	else
		return monthNames[monthVal];
}
function formatDate(dateVal, format){
	var charVal, str, value, charBuffer, retval;
	retval = "";
	
	charBuffer = new stringBuffer();
	charBuffer.init(format);
	while(!charBuffer.EOS()){
		charVal = charBuffer.read();
		if(charVal == "\\"){
			retval = retval + charBuffer.read();
		}else if(charVal == "\""){
			charVal = charBuffer.read();
			while(charVal != "\"" && !charBuffer.EOS()){
				retval = retval + char;
				charVal = charBuffer.read();
			}
		}else if(charVal == "'"){
			charVal = charBuffer.read();
			while(charVal != "\"" && !charBuffer.EOS()){
				retval = retval + char;
				charVal = charBuffer.read();
			}
		}else if(charVal == "d"){
			str = charVal + charBuffer.read();
			if(str == "dd"){
				str = str + charBuffer.read();
				if(str == "ddd"){
					str = str + charBuffer.read();
					if(str == "dddd"){
						retval = retval + weekdayName(dateVal.getDay(), false);
					}else{
						retval = retval + weekdayName(dateVal.getDay(), true);
						charBuffer.address = charBuffer.address - 1;
					}
				}else{
					value = dateVal.getDate();
					if(value < 10){
						retval = retval + "0" + value;
					}else{
						retval = retval + value;
					}
					charBuffer.address = charBuffer.address - 1;
				}
			}else{
				retval = retval + dateVal.getDate();
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "h"){
			value = dateVal.getHours() % 12;
			str = charVal + charBuffer.read();
			if(str == "hh"){
				if(value < 10){
					retval = retval + "0" + value;
				}else{
					retval = retval + value;
				}
			}else{
				retval = retval + value;
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "H"){
			value = dateVal.getHours()
			str = charVal + charBuffer.read();
			if(str == "HH"){
				if(value < 10){
					retval = retval + "0" + value;
				}else{
					retval = retval + value;
				}
			}else{
				retval = retval + value;
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "m"){
			value = dateVal.getMinutes()
			str = charVal + charBuffer.read();
			if(str == "mm"){
				if(value < 10){
					retval = retval + "0" + value;
				}else{
					retval = retval + value;
				}
			}else{
				retval = retval + value;
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "M"){
			str = charVal + charBuffer.read();
			if(str == "MM"){
				str = str + charBuffer.read();
				if(str == "MMM"){
					str = str + charBuffer.read();
					if(str == "MMMM"){
						retval = retval + monthName(dateVal.getMonth(), false);
					}else{
						retval = retval + monthName(dateVal.getMonth(), true);
						charBuffer.address = charBuffer.address - 1;
					}
				}else{
					value = dateVal.getMonth() + 1;
					if(value < 10){
						retval = retval + "0" + value;
					}else{
						retval = retval + value;
					}
					charBuffer.address = charBuffer.address - 1;
				}
			}else{
				retval = retval + (dateVal.getMonth() + 1);
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "s"){
			value = dateVal.getSeconds();
			str = charVal + charBuffer.read();
			if(str == "ss"){
				if(value < 10){
					retval = retval + "0" + value;
				}else{
					retval = retval + value;
				}
			}else{
				retval = retval + value;
				charBuffer.address = charBuffer.address - 1;
			}
		}else if(charVal == "y"){
			str = charVal + charBuffer.read();
			if(str == "yy"){
				str = str + charBuffer.read();
				if(str == "yyy"){
					str = str + charBuffer.read();
					if(str == "yyyy"){
						retval = retval + dateVal.getFullYear();
					}else{
						retval = retval + dateVal.getFullYear().toString().substring(1, 4)
						charBuffer.address = charBuffer.address - 1;
					}
				}else{
					retval = retval + dateVal.getFullYear().toString().substring(2, 4)
					charBuffer.address = charBuffer.address - 1;
				}
			}else{
				retval = retval + dateVal.getFullYear().toString().substring(3, 4)
				charBuffer.address = charBuffer.address - 1;
			}
		}else{
			retval = retval + charVal;
		}
	}
	return retval;
}
function formatNumber(numberVal, format){
	var charVal, period, group, digits, numberExpr, formatWholeNumber, formatFractNumber;
	var charBuffer, numberBuffer, whole, fract, retWholeval, retFractval;
	retWholeval = "";
	retFractval = "";
	var lcDigits = "0#";

	numberExpr = "" + numberVal;
	formatWholeNumber = "";
	retFractval = "";
	
	if(numberExpr.length){

		charBuffer = new stringBuffer();
		charBuffer.init(format);
		numberBuffer = new stringBuffer();

		period = numberExpr.indexOf(".",0);
		if(period != -1){
			whole = numberExpr.substring(0, period);
			fract = numberExpr.substring(period + 1);
		}else{
			whole = numberExpr;
			fract = "";
		}

		group = false;
		period = charBuffer.length();
		digits = 0;
		while(charBuffer.address < period){
			charVal = charBuffer.read();
			if(charVal == "\\"){
				charBuffer.read();
			}else if(charVal == "\""){
				charVal = charBuffer.read();
				while(charVal != "\"" && !charBuffer.EOS()){
					charVal = charBuffer.read();
				}
			}else if(charVal == "'"){
				charVal = charBuffer.read();
				while(charVal != "'" && !charBuffer.EOS()){
					charVal = charBuffer.read();
				}
			}else if(lcDigits.indexOf(charVal,0) != -1){
				digits = digits + 1;
			}else if(charVal == "."){
				period = charBuffer.address - 1;
			}else if(charVal == ","){
				group = true;
			}
		}

		charBuffer.address = 0;
		numberBuffer.init(whole);
		while(charBuffer.address < period){
			charVal = charBuffer.read();
			if(charVal == "\\"){
				retWholeval = retWholeval + charBuffer.read();
			}else if(charVal == "\""){
				charVal = charBuffer.read();
				while(charVal != "\"" && !charBuffer.EOS()){
					retWholeval = retWholeval + charVal;
					charVal = charBuffer.read();
				}
			}else if(charVal == "'"){
				charVal = charBuffer.read();
				while(charVal != "'" && !charBuffer.EOS()){
					retWholeval = retWholeval + charVal;
					charVal = charBuffer.read();
				}
			}else if(charVal == "#"){
				num = numberBuffer.read();
				if(num == "0"){
					if(numberBuffer.address > 1){
						retWholeval = retWholeval + num;
						if(group && ((numberBuffer.length() - (numberBuffer.address + 1)) % 3 == 2)){
							retWholeval = retWholeval + ",";
						}
					}
				}else{
					retWholeval = retWholeval + num;
					if(group && ((numberBuffer.length() - (numberBuffer.address + 1)) % 3 == 2)){
						retWholeval = retWholeval + ",";
					}
				}
				if(digits == 1){
					while(!numberBuffer.EOS()){
						num = numberBuffer.read();
						retWholeval = retWholeval + num;
						if(group && ((numberBuffer.length() - (numberBuffer.address + 1)) % 3 == 2)){
							retWholeval = retWholeval + ",";
						}
					}
				}
				digits = digits - 1;
			}else if(charVal == "0"){
				if(digits > numberBuffer.length()){
					retWholeval = retWholeval + "0";
					if(group && (digits % 3 == 1)){
						retWholeval = retWholeval + ",";
					}
				}else if(digits == 1){
					while(!numberBuffer.EOS()){
						num = numberBuffer.read();
						retWholeval = retWholeval + num;
						if(group && ((numberBuffer.length() - (numberBuffer.address + 1)) % 3 == 2)){
							retWholeval = retWholeval + ",";
						}
					}
				}else{
					num = numberBuffer.read();
					retWholeval = retWholeval + num;
					if(group && ((numberBuffer.length() - (numberBuffer.address + 1)) % 3 == 2)){
						retWholeval = retWholeval + ",";
					}
				}
				digits = digits - 1;
			}else if(charVal != ","){
				retWholeval = retWholeval + charVal;
			}
		}

		digits = 1;
		charBuffer.address = charBuffer.address + 1;
		numberBuffer.init(fract);
		while(!charBuffer.EOS()){
			charVal = charBuffer.read();
			if(charVal == "\\"){
				retFractval = retFractval + charBuffer.read();
			}else if(charVal == "\""){
				charVal = charBuffer.read();
				while(charVal != "\"" && !charBuffer.EOS()){
					retFractval = retFractval + charVal;
					charVal = charBuffer.read();
				}
			}else if(charVal == "'"){
				charVal = charBuffer.read();
				while(charVal != "'" && !charBuffer.EOS()){
					retFractval = retFractval + charVal;
					charVal = charBuffer.read();
				}
			}else if(charVal == "#"){
				num = numberBuffer.read();
				retFractval = retFractval + num;
				digits = digits + 1;
			}else if(charVal == "0"){
				if(digits > numberBuffer.length()){
					retFractval = retFractval + "0";
				}else{
					num = numberBuffer.read();
					retFractval = retFractval + num;
				}
				digits = digits + 1;
			}else if(charVal != "," && charVal != "."){
				retFractval = retFractval + charVal;
			}
		}
	}
	if(retFractval.length){
		return retWholeval + "." + retFractval;
	}else{
		return retWholeval + retFractval;
	}
}
function dateComp(date_value1, month_value1, year_value1, 
		  date_value2, month_value2, year_value2){
	if(year_value1 == year_value2){
		if(month_value1 == month_value2){
			if(date_value1 == date_value2){
				retVal = 0;
			}else{
				retVal = ((date_value1 > date_value2)? 1: -1);
			}		
		}else{
			retVal = ((month_value1 > month_value2)? 1: -1);
		}	
	}else{
		retVal = ((year_value1 > year_value2)? 1: -1);
	}
	return retVal;
}
//clear all / set a radio/checkbox  
function setRadio(formObj, which)
{
	var cnt = count(formObj);
	if(cnt == 1)
		formObj.checked = (0 == which);
	else if(cnt > 0){
		for(var i = 0;i < cnt;i++){
			formObj[i].checked = (i == which);
		}
	}
}
//checkbox clear all / check all
function setCheck(formObj, checked)
{
	var cnt = count(formObj);
	if(cnt == 1)
		formObj.checked = checked;
	else if(cnt > 0){
		for(var i = 0;i < cnt;i++){
			formObj[i].checked = checked;
		}
	}
}

