
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 || 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 next_day(startDate, targetDay){
	var day = startDate.getDay();
	//Day: 0 (Sunday) to 6 (Saturday)
	if(day > targetDay)
		var diff = 7 - (day - targetDay);
	else
		var diff = targetDay - day;
	startDate.setDate(startDate.getDate()+diff);
	return startDate;
}
function previous_day(startDate, targetDay){
	var day = startDate.getDay();
	//Day: 0 (Sunday) to 6 (Saturday)
	if(day < targetDay)
		var diff = 7 - (targetDay - day);
	else
		var diff = day - targetDay;
	startDate.setDate(startDate.getDate()-diff);
	return startDate;
}
function dateAdd(startDate, offset, calendar){
	var startDay, j, start, finish, increment, excDate, excDates, loop;
	if(offset != 0){
		startDay = startDate.getDay();
		j = calendar.length - 1;
		if(j >= 0){
			if(offset > 0){
				start = 0;
				finish = j;
				increment = 1;
			}else{
				start = j;
				finish = 0;
				increment = -1;
			}
			counter = start;
			finish = finish + increment;
			loop = true;
			while(counter != finish && loop){
				excDate = calendar[counter];
				if(excDate == startDay){
					offset = offset - increment;
					loop = false;
				}else{
					if(excDate > startDay && counter < finish){
						loop = false;
					}else{
						if(excDate < startDay && counter > finish){
							loop = false;
						}else{
							counter = counter + increment;
						}
					}
				}
			}
			if(offset > 0){
				offset = (7 * Math.floor(offset / (6 - j))) + (offset % (6 - j));
				excDateOffset = 7 * Math.floor(offset / 7);
			}else{
				offset = (7 * Math.ceil(offset / (6 - j))) + (offset % (6 - j));
				excDateOffset = 7 * Math.ceil(offset / 7);
			}
			offset = offset + startDay;
			do{				
				if(counter == finish){
					excDateOffset = excDateOffset + (7 * increment);
					counter = start;					
				}
				excDates = offset;
				loop = true;
				while(counter != finish && loop){
					excDate = excDateOffset + calendar[counter];
					if(excDate > offset && counter < finish){
						loop = false;
					}else{
						if(excDate < offset && counter > finish){
							loop = false;
						}else{
							offset = offset + increment;
							counter = counter + increment;
						}
					}
				}
			}while(excDates != offset);
			offset = offset - startDay;
		}
		startDate.setDate(startDate.getDate() + offset);
	}
	return startDate;
}
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;
		}
	}
}

function doClear(theText) {
	if (theText.value == theText.defaultValue) {
		theText.value = ""
	}
}


