//***********************************************
//* TerriToniAX API v2.1+              		*
//* Javascript Implementation 	                *
//* Copyright Toni Brandt 2003 - 2007 		*
//***********************************************

//============
//|| PUBLIC ||
//============

// Constants
//===========

var TXUNDEFINED=-1;

// Platforms
//----------
var TXIEXPLORE=0;
var TXNETSCAPE=1;
var TXIIS=2;
var TXAPACHE=3;
var TXWIN32=4;
var TXWIN16=5;
var TXLINUX=6;
var TXSOLARIS=7;
var TXAMIGAOS=8;
var TXMOPHUN=9;
var TXJ2ME=10;
var TXJAVA=11;
var TXFIREFOX=12;

// Platform types
//----------------
var TXOS=0;
var TXWEBBROWSER

// Debug verbosity Levels
//------------------------
var TXCRITICAL=0;
var TXERROR=1;
var TXWARNING=2;
var TXTRACE=3;
var TXINFO=4;

// Text formatting
//-----------------
var TXPLAIN=0;
var TXBOLD=1;
var TXITALIC=2;
var TXUNDERLINED=3;

// Functions
//===========

// General
//---------

function tx_get_browser()
{
	var platform=navigator.userAgent.toLowerCase();
    	TXSys_platformVersion=parseInt(navigator.appVersion)
//	alert(navigator.appVersion);

	if(platform.indexOf('mozilla')!=-1)
	{
		TXSys_platform=TXFIREFOX;		
	}


	if(platform.indexOf('msie')!=-1)
	{
		TXSys_platform=TXIEXPLORE;		
	}
}

function TX_init()
{
	tx_get_browser();
}

function TX_getPlatformType()
{
	return TXWEBBROWSER;
}

function TX_getPlatform()
{
	if(TXWEBBROWSER==null)
	{
		tx_get_browser();
	}
	return TXSys_platform;
}


/*
TX_getPlatformVersion()
TX_getLanguage()
TX_initGfx()
TX_initConsole(cols,lines)
TX_initKeyboard()
TX_openWebBrowser(url)
*/

function TX_debug(level,msg)
{
	string="";
	if(TXSys_verbosity>=level)
	{
		switch(level)
		{
		case TXWARNING:
			string="Warning!";
			break;
		case TXERROR:
			string="Error!";
			break;
		case TXCRITICAL:
			string="Critical error!";
			break;
		case TXTRACE:
			string="Trace Message:";
			break;
		case TXINFO:
			string="Info:";
			break;
		}
		string+=" "+msg;
		if(TXSys_func.length>0)
		{
			string+=" in function "+TXSys_func+".";
		}
		TX_output(string);
	}
}

function TX_setVerbosity(level)
{
	TXSys_verbosity=level;
}



// Input
//-------
function TXKeyboard_getAsc(evt)
{
	var key;
	if (window.event)
	{
	   key = window.event.keyCode;
	}
	else
	{
		if (evt)
		{
		   key = evt.which;
		}
		else
		{
		   return true;
		}
	}
	return key;
}

function TXKeyboard_filter(evt,charset)
{
	return TXChar_filter(TX_ascToChar(TXKeyboard_getAsc(evt)),charset);
}


// Characters
//------------
function TXChar_filter(char,charset)
{
	if ((charset).indexOf(char) == -1)
	{
	   return false;
	}
	return true;

//	return ((charset).indexOf(char) != -1);
}


// Variable Conversions
//----------------------
function TX_ascToChar(n)
{
	// control chars
	if ((n==null)||(n==0)||(n==8)||(n==9)||(n==13)||(n==27))
	{
	   return "";
	}
	return String.fromCharCode(n);
}

function TX_intToStr(n,digits)
{
	string=n+"";
	switch(TX_sgn(string.length-digits))
	{
	case -1:
		for(i=string.length;i<digits;i++)
		{
			string="0"+string;
		}
		break;
	case 1:
		string=TXStr_right(string,digits);
		break;
	}
	return string;
}

function TX_strToInt(tx_str)
{
	if(tx_str==null||tx_str=="")
	{
		return 0;
	}
	tx_str+="";
	while(tx_str.length>1 && TXStr_left(tx_str,1)=="0")
	{
		tx_str=TXStr_mid(tx_str,1);
	}
	return parseInt(tx_str);
}

function TX_intToHex(n)
{
	var retstr="";
	var v=0;

	while(n>0)
	{
		v=n%16;
		if(v>9)
		{
			retstr+=String.fromCharCode(parseInt(v+55));
		}
		else
		{
			retstr+=String.fromCharCode(parseInt(v+48));
		}
		n-=v;
		if(n>0)
			n=n/16;		
	}
	return retstr;
}

// Strings
//---------
function TXStr_left(tx_str,n)
{
	TX_enterFunc("TXStr_left");
	if(tx_str==null||tx_str=="")
	{	
		TX_debug(TXERROR,"'tx_str' is invalid.");
		return "";
	}
	if(tx_str.length<n)
	{
		TX_debug(TXWARNING,"'tx_str' is shorter than 'n'.");
		n=tx_str.length;
	}
	tx_str=tx_str+"";
	return tx_str.substr(0,n);
}

function TXStr_mid(tx_str,n,length)
{
	TX_enterFunc("TXStr_left");
	if(tx_str==null||tx_str=="")
	{	
		TX_debug(TXERROR,"'tx_str' is invalid.");
		return "";
	}
	if(tx_str.length<n)
	{
		TX_debug(TXWARNING,"'tx_str' is shorter than 'n'.");
		n=tx_str.length;
	}
	tx_str=tx_str+"";
	if(length==null||length==0)
	{
		length=tx_str.length-n;
	}
	return tx_str.substr(n,length);
}

function TXStr_right(tx_str,n)
{
	TX_enterFunc("TXStr_right");
	if(tx_str==null||tx_str=="")
	{	
		TX_debug(TXERROR,"'tx_str' is invalid.");
		return "";
	}
	if(tx_str.length<n)
	{
		TX_debug(TXWARNING,"'tx_str' is shorter than 'n'.");
		n=tx_str.length;
	}
	tx_str=tx_str+"";
	return tx_str.substr(tx_str.length-n,n);
}



// Maths
//-------
function TX_add(val,delta,min,max)
{
	val+=delta;
	if(min!=null && val<min)
	{
		val=max;	
	}
	if(max!=null && val>max)
	{
		val=min;	
	}
	return val;
}

function TX_sgn(val)
{
	if(val==0)
	{
		return 0;
	}
	if(val<1)
	{
		return -1;
	}
	return 1;	
}

function TX_min(val1,val2)
{
	if(val1<val2)
		return val1;
	else
		return val2;
}

function TX_max(val1,val2)
{
	if(val1>val2)
		return val1;
	else
		return val2;
}



// TXCalendar
//-----------
function TXCalendar_getCurrentDate()
{
	return TXCalendar_currentDate;
}

function TXCalendar_getCurrentTime()
{
	tx_time=new Date();
	return TX_intToStr(tx_time.getHours(),2)+":"+TX_intToStr(tx_time.getMinutes(),2);
}


function TXCalendar_parseDate(tx_date,elm)
{
	if(tx_date==null || tx_date=="")
	{
		return false;
	}
	elems=new Array();
	tx_date=tx_date+"-";
	start=0;
	for(i=0;i<3;i++)
	{
		tx_end=tx_date.indexOf('-',start);
		if(tx_end<0)
		{
			return false;
		}
		elems[i]=tx_date.substring(start,tx_end);
		start=tx_end+1;
	}
	if(elm==null)
	{
		return true;
	}
	return elems[elm];
}

function TXCalendar_parseTime(tx_time,elm)
{
	if(tx_time==null || tx_time=="")
	{
		return false;
	}
	elems=new Array();
	tx_time=tx_time+":";
	start=0;
	for(i=0;i<2;i++)
	{
		tx_end=tx_time.indexOf(':',start);
		if(tx_end<0)
		{
			return false;
		}
		elems[i]=tx_time.substring(start,tx_end);
		start=tx_end+1;
	}
	if(elm==null)
	{
		return true;
	}
	return elems[elm];
}



function TXCalendar_add(tx_date,y,m,d)
{
	y=parseInt(y+parseInt(TXCalendar_getYear(tx_date)));
	m=parseInt(m+parseInt(TXCalendar_getYear(tx_date)));
	d=parseInt(d+parseInt(TXCalendar_getYear(tx_date)));
	return TXCalendar_createDate(y,m,d);	
}

function TXCalendar_getYear(tx_date)
{
	return TXCalendar_parseDate(tx_date,0);
}

function TXCalendar_getMonth(tx_date)
{
	return TXCalendar_parseDate(tx_date,1);
}

function TXCalendar_getDate(tx_date)
{
	return TXCalendar_parseDate(tx_date,2);
}

function TXCalendar_formatDate(tx_year,tx_month,tx_day)
{
	TX_enterFunc("TXCalendar_createDate");
	if(tx_year==null)
	{
		TX_debug(TXERROR,"'tx_year' is invalid!");
		return "";
	}
	if(tx_month==null)
	{
		TX_debug(TXERROR,"'tx_month' is invalid!");
		return "";
	}
	if(tx_day==null)
	{
		TX_debug(TXERROR,"'tx_day' is invalid!");
		return "";
	}
	return tx_year+"-"+TX_intToStr(tx_month,2)+"-"+TX_intToStr(tx_day,2);
}

function TXCalendar_compareDates(tx_date1,tx_date2)
{
	if(tx_date1==null || tx_date1=="")
	{
		return 0;
	}
	if(tx_date2==null)
	{
		tx_date2=TXCalendar_getCurrentDate();
	}
	tx_date1+="-";
	tx_date2+="-";
	tx_start1=0;
	tx_start2=0;
	for(tx_i=0;tx_i<3;tx_i++)
	{
		tx_end1=tx_date1.indexOf('-',tx_start1);
		tx_end2=tx_date2.indexOf('-',tx_start2);
		if(tx_end1<0 || tx_end2<0)
		{
			return 0;
		}
		tx_val1=TX_strToInt(tx_date1.substring(tx_start1,tx_end1));
		tx_val2=TX_strToInt(tx_date2.substring(tx_start2,tx_end2));
		if(tx_val1-tx_val2!=0)
		{
			return TX_sgn(parseInt(tx_val1-tx_val2));
		}
		tx_start1=tx_end1+1;
		tx_start2=tx_end2+1;
	}
	return 0;
}

function TXCalendar_compareTimes(tx_time1,tx_time2)
{
	if(tx_time1==null || tx_time1=="")
	{
		return 0;
	}
	if(tx_time2==null)
	{
		tx_time2=TXCalendar_getCurrentTime();
	}
	tx_time1+=":";
	tx_time2+=":";
	tx_start1=0;
	tx_start2=0;
	for(tx_i=0;tx_i<2;tx_i++)
	{
		tx_end1=tx_time1.indexOf(':',tx_start1);
		tx_end2=tx_time2.indexOf(':',tx_start2);
		if(tx_end1<0 || tx_end2<0)
		{
			return 0;
		}
		tx_val1=TX_strToInt(tx_time1.substring(tx_start1,tx_end1));
		tx_val2=TX_strToInt(tx_time2.substring(tx_start2,tx_end2));
		if(tx_val1-tx_val2!=0)
		{
			return TX_sgn(parseInt(tx_val1-tx_val2));
		}
		tx_start1=tx_end1+1;
		tx_start2=tx_end2+1;
	}
	return 0;
}

function TXCalendar_compareDatesAndTimes(txdt_date1,txdt_time1,txdt_date2,txdt_time2)
{
	if(txdt_date1==null)
	{
		return 0;
	}
	if(txdt_date2==null)
	{
		txdt_date2=TXCalendar_getCurrentDate();
	}
	if(txdt_time2==null)
	{
		txdt_time2=TXCalendar_getCurrentTime();
	}

	tx_diff=TXCalendar_compareDates(txdt_date1,txdt_date2);
	if(tx_diff==0 && txdt_time1!=null)
	{
		tx_diff=TXCalendar_compareTimes(txdt_time1,txdt_time2);
	}			
	return tx_diff;
}


function TXCalendar_overlapPeriods(tx_startdate1,tx_starttime1,tx_enddate1,tx_endtime1,tx_startdate2,tx_starttime2,tx_enddate2,tx_endtime2)
{
	if(tx_startdate1==null||tx_startdate1=="")
	{
		return false;
	}
	if(tx_starttime1==null||tx_starttime1=="")
	{
		tx_starttime1="0:00";
	}
	if(tx_enddate1==null||tx_enddate1=="")
	{
		tx_enddate1=tx_startdate1;
	}
	if(tx_endtime1==null||tx_endtime1=="")
	{
		tx_endtime1=tx_starttime1;
	}
	if(tx_startdate2==null)
	{
		tx_startdate2=TXCalendar_getCurrentDate();	
		tx_starttime2=TXCalendar_getCurrentTime();	
	}
	if(tx_startdate2=="")
	{
		return false;
	}
	if(tx_starttime2==null)
	{
		tx_starttime2="0:00";
	}
	if(tx_enddate2==null)
	{
		tx_enddate2=tx_startdate2;
	}
	if(tx_endtime2==null)
	{
		tx_endtime2=tx_starttime2;
	}
	if(	TXCalendar_compareDatesAndTimes(tx_startdate1,tx_starttime1,tx_enddate2,tx_endtime2)<1 &&
		TXCalendar_compareDatesAndTimes(tx_enddate1,tx_endtime1,tx_startdate2,tx_starttime2)>-1)
	{
		return true;
	}
	return false;
}


// TXGui
//-------
var tx_offsetX;
var tx_offsetY;
var tx_sel_popup;

function TXGui_createButton(label,width,height,action)
{
	string="<table bordercolor='#000000' border='1' width='"+width+"'><tr><td><a href='"+action+"'>"+label+"</a></td></tr></table>";
	document.write(string);

//	document.write("<a href='"+action+"'><p class='button' width='"+width+"'>"+label+"</p>");
}


//function TXMenu_triggerContext(event)
//{
//	if(!e)
//	{
//		var e=window.event;
//	}
//		TXMenu_show(id,e);


function TXWindow_getHeight()
{
	switch(TX_getPlatform())
	{
	case TXIEXPLORE:
		return document.body.clientHeight;
		break;
	case TXFIREFOX:
		return window.innerHeight;
		break;
	}
}

function TXWindow_getWidth()
{
	switch(TX_getPlatform())
	{
	case TXIEXPLORE:
		return document.body.clientWidth;
		break;
	case TXFIREFOX:
		return window.innerWidth;
		break;
	}
}



function TXMouse_getX(e)
{
	var parelm, x;
	elm=tx_get_elm(e);
	if(elm!=null && elm.id!=null && elm.id.length>0)
	{
		switch(TX_getPlatform())
		{
		case TXIEXPLORE:
			x=window.event.x+document.body.scrollLeft;
			break;
		case TXFIREFOX:
			x=e.pageX;
			break;
		}
		elm=elm.offsetParent;
		while(elm!=null) 
		{
			elm = elm.offsetParent;
			if(elm!=null)
			{
				x-=elm.offsetLeft;
			}
		}
	}
	else
	{
		return e.clientX;
	}
	return x;
}


function TXMouse_getY(e)
{
	var elm, y;
	elm=tx_get_elm(e);
	if(elm!=null && elm.id!=null && elm.id.length>0)
	{
		switch(TX_getPlatform())
		{
		case TXIEXPLORE:
			y=window.event.y+document.body.scrollTop;
			break;
		case TXFIREFOX:
			y=e.pageY;
			break;
		}
		elm=elm.offsetParent;
		while(elm!=null) 
		{
			elm = elm.offsetParent;
			if(elm!=null)
			{
				y-=elm.offsetTop;
			}
		}
	}
	else
	{
		return e.clientY;
	}
	return y;
}

function tx_get_elm(event)
{
	if(!event)
	{
		var event=window.event;
	}

	//Firefox
	if(event.target)
	{	
		var elm=event.target;
	}
	else
	{
		//Internet Explorer
		if(event.srcElement)
		{
			var elm = event.srcElement;
		}
	}
	return elm;
}

function TXGui_eventHandler(event)
{
	switch(event.type)
	{
	case "mousedown":
//		alert("tx_sel_popup="+tx_sel_popup);
		tx_select_reset_dropdown(event);
		switch(event.button)
		{
		case 1: 
			dragndrop(event);
			return true;
			break;
		case 2:
			TXMenu_triggerContext(event);
			break;
		}
		break;
	case "mouseup":
		tx_sel_popup=null;
		break;
	case "mousemove":
		if(tx_sel_popup!=null)
		{
			tx_sel_popup.style.left=TXMouse_getX(event)-tx_offsetX;
			tx_sel_popup.style.top=TXMouse_getY(event)-tx_offsetY;
		}
		break;
	}
}


function tx_get_popup(event)
{
	var x=TXMouse_getX(event);
	var y=TXMouse_getY(event);
	var left, top, right, bottom;
	var elm;
	var i=0;	
	while(tx_popup[i]!=null)
	{
		elm=document.getElementById(tx_popup[i]);
		left=parseInt(elm.style.left);
		top=parseInt(elm.style.top);
		right=left+elm.clientWidth;
		bottom=top+elm.clientHeight;
//		alert("x="+x+"\ny="+y+"\nleft="+left+"\ntop="+top+"\nright="+right+"\nbottom="+bottom);
		if(	left<x	&&
			top<y	&&
			right>x	&&
			bottom>y)
			return elm;
		i++;
	}
	return null;
}


function dragndrop(event)
{
	var elm=tx_get_popup(event);
	if(elm==null)
		return false;
	tx_sel_popup=elm;
	tx_offsetX=TXMouse_getX(event)-parseInt(elm.style.left);
	tx_offsetY=TXMouse_getY(event)-parseInt(elm.style.top);

/*
	while(event.type!="mouseup")
	{
		tx_sel_popup.style.left=TXMouse_getX(event)-tx_offsetX;
		tx_sel_popup.style.top=TXMouse_getY(event)-tx_offsetY;
	}
*/
}


// TXGuiElement
//--------------
function TXGuiElement_getX(id)
{
	if(id==null||id.length==0)
		return -1;

	elm=document.getElementById(id);
	if(elm==null)
		return -1;
	x=0;
	while(elm!=null) 
	{
		x += elm.offsetLeft;
		elm = elm.offsetParent;
	}
	return x;
}

function TXGuiElement_getY(id)
{
	if(id==null||id.length==0)
		return -1;

	elm=document.getElementById(id);
	if(elm==null)
		return -1;
	y = 0;
	while (elm!=null) 
	{
	 	y += elm.offsetTop;
		elm = elm.offsetParent;
	}
	return y;
}

function TXGuiElement_getWidth(id)
{
	if(id==null||id.length==0)
		return -1;

	elm=document.getElementById(id);
	if(elm==null)
	{
		return -1;
	}
	return parseInt(elm.clientWidth);
}

function TXGuiElement_getHeight(id)
{
	if(id==null||id.length==0)
		return -1;

	elm=document.getElementById(id);
	if(elm==null)
	{
		return -1;
	}
	return parseInt(elm.clientHeight);
}

/* unimplemented functions
TXGuiElement_getLeftMargin(id)
TXGuiElement_getRightMargin(id)
TXGuiElement_getTopMargin(id)
TXGuiElement_getBottomMargin(id)
TXGuiElement_getAlignX(id)
TXGuiElement_getAlignY(id)
TXGuiElement_hide(id)
TXGuiElement_show(id)
*/

// TXForm
//--------
var num_quest=0;	//dummy variable for question numberingthat is not implemented in this edition

function TXForm_inputText(tx_id,tx_label,tx_length,tx_charset,tx_default,tx_action)
{
	if(tx_default==null)
	{
		tx_default="";
	}
	if(tx_action==null)
	{
		tx_action="";
	}
	string=tx_label+": ";
	string+="<input type='text' name='"+tx_id+"' id='"+tx_id+"' maxSize='"+tx_length+"' onKeyPress='return TXKeyboard_filter(event,\x22"+tx_charset+"\x22);' value='"+tx_default+"' onChange='"+tx_action+"'>";
	return string;
}

function TXForm_inputDate(tx_id,tx_label,tx_default,tx_action)
{
	if(!tx_default)
	{
		tx_default="";
	}
	if(tx_action==null)
	{
		tx_action="";
	}
	tx_charset="1234567890-";
	string=tx_label;
	string+=" (ÅÅÅÅ-MM-DD): ";
	string+=" <input type='text' name='"+tx_id+"' id='"+tx_id+"' value='"+tx_default+"' size='10' maxlength='10' onKeyPress='return TXKeyboard_filter(event,\x22"+tx_charset+"\x22);' onChange='if(this.value!=\x22\x22&&!TXCalendar_parseDate(this.value)){alert(\x22ogiltigt datumformat\x22);}"+tx_action+"'>";
	return string;
}

function TXForm_inputTime(tx_id,tx_label,tx_default,tx_action)
{
	if(!tx_default)
	{
		tx_default="";
	}
	if(tx_action==null)
	{
		tx_action="";
	}
	tx_charset="1234567890:";
	string=tx_label;
	string+=" (HH:MM): ";
	string+="<input type='text' name='"+tx_id+"' id='"+tx_id+"' maxSize='5' onKeyPress='return TXKeyboard_filter(event,\x22"+tx_charset+"\x22);' value='"+tx_default+"' onChange='if(this.value!=\x22\x22&&!TXCalendar_parseTime(this.value)){alert(\x22ogiltigt tidsformat\x22);}"+tx_action+"'><br>";
	return string;
}

function TXForm_inputInt(name, prompt, min, max, tx_default, action)
{
//Creates a form question that is answered with an integer. 
	var string="<input type='hidden' name='"+name+"' id='"+name+"' value='"+tx_default+"'>";
	var max_str=max+"";
	var size=max_str.length+1; 
	string+="<input type='hidden' name='formq_name_"+num_quest+"' value='"+name+"'>";
	string+="<input type='hidden' name='formq_"+name+"_type' value='integer'>";
	string+="<input type='hidden' name='formq_"+name+"_min' value='"+min+"'>";
	string+="<input type='hidden' name='formq_"+name+"_max' value='"+max+"'>";
	string+="<div ID="+name+"_div>";
	prompt=prompt+" ("+min+"..."+max+")";
//	write_heading(prompt)
	string+=prompt;
	tx_charset="-1234567890";
	string+=" <input type='text' name='"+name+"_gui' id='"+name+"_gui' value='"+tx_default+"' size='"+size+"' maxlength='"+size+"' onKeyPress='return TXKeyboard_filter(event,\x22"+tx_charset+"\x22);' onChange='if(TXForm_testBounds(this.value,"+min+","+max+","+name+"_div)){document.form."+name+".value=this.value;"+action+"}'>";
	string+="</div>";
	num_quest=num_quest+1;
	return string;
}

function TXForm_select(id,prompt,tx_default,action)
{
	var string = prompt+": ";
	string += "<input type='text' size='10' readonly='true' id='"+id+"' name='"+id+"' value='"+tx_default+"'>";
	string += "<input type='button' value='v' ";
	string += "onMouseOver='tx_set_button_mouseover(\""+id+"\",true);' ";
	string += "onMouseOut='tx_set_button_mouseover(\""+id+"\",false);' ";
	string += "id='"+id+"_button' onClick='TXMenu_show(\""+id+"\",event);";
	if(action!=null)
		string += action;
	string += "'>";	
	string += "<DIV CLASS='dropdown' id='tx_menu_"+id+"'></DIV >";
	string += "<input type='hidden' id='"+id+"_num_opts' name='"+id+"_num_opts' value='0'>";
	string += "<input type='hidden' id='"+id+"_type' name='"+id+"_type' value='select'>";
	return string;
}

//unspeced functions
//------------------
function TXForm_testBounds(value,mini,maxi,field)
{
	tx_form_clear_error(field);

	//validate characters
	if(parseInt(value)!=value&&value!="")
	{
		tx_form_display_error(field," Field contains invalid characters!");
		return false;
	}

	//Make sure that the field is not empty
	if(value.length==0)
	{
		tx_form_display_error(field," Field is empty!");
		return false;
	}

	//Validate value
	if(parseInt(value)<mini||parseInt(value)>maxi)
	{
		tx_form_display_error(field," Value out of bounds!");
		return false;
	}

	return true;
}



function tx_form_clear_error(field)
{
//Clears an error at the specified entry 'field' 
	var i=field.innerHTML.indexOf("<!--");
	if(i>-1)
		field.innerHTML=field.innerHTML.substring(0,i);
}

function tx_form_display_error(field,text)
{
//Displays an error 'text' at the specified entry 'field'
	var err_str="<!--error--><FONT color=#FF0000>*";
	field.innerHTML=field.innerHTML+err_str+text+"</FONT>";
}



// TXMenu
//--------
function TXMenu_setValue(id,val)
{
	menu_type=document.getElementById(id+"_type");
	if(menu_type==null)
	{
		TX_debug(TXERROR,"Menu "+id+" not found!");
		return false;
	}
	if(menu_type.value!="popup")
	{
		num=document.getElementById(id+"_num_opts");
		if(num==null)
			return false;
	
		if(val!=null)
		{
			for(opt_i=0;opt_i<num.value;opt_i++)
			{
				elm=document.getElementById("opt"+id+"_"+opt_i);
				if(elm!=null)
				{
					if(document.getElementById("opt"+id+"_"+opt_i).innerText!=val)
					{
						elm.style.background="#FFFFFF";
						elm.style.color="#000000";
					}
					else
					{
						elm.style.background="#000000";
						elm.style.color="#FFFFFF";
					}
				}
			}
		}
		document.getElementById(id).value=val;
/*
		if(cache!=null)
		{
			document.getElementById(cache).value=value;
		}
*/
	}
	return true;
}

function TXMenu_getValue(id)
{
	if(document.getElementById(id+"_type").value!="popup")
	{
		return document.getElementById(id).value;
	}
}

function TXMenu_addOption(id,value,label,action)
{
	opt_i=document.getElementById(id+"_num_opts").value;
	dropdown=document.getElementById("tx_menu_"+id);
	if(dropdown==null)
		return false;
	if(dropdown.innerHTML=="")
		dropdown.innerHTML="<STYLE TYPE='text/css'>#tx_menu_"+id+"{visibility:hidden}</STYLE>";
	var string="";
	string+="<h1 id='opt"+id+"_"+opt_i+"' class='option' ";
	string+="onMouseDown='Javascript:TXMenu_setValue(\x22"+id+"\x22,\x22"+value+"\x22); TXMenu_show(\x22"+id+"\x22,event);";
	if(action!=null)
	{
		string+=action.replace(/'/g,"\x22");
	}
	string+="'";
	if(document.getElementById(id+"_type").value!="popup")
	{
		string+="onMouseOver='if(TXMenu_getValue(\x22"+id+"\x22)!=\x22"+value+"\x22){this.style.background=\x22#888888\x22}' ";
		string+="onMouseOut='if(TXMenu_getValue(\x22"+id+"\x22)!=\x22"+value+"\x22){this.style.background=\x22#FFFFFF\x22}' ";
	}
	label=label.replace(/ /g,"&nbsp;");
	string+=">"+label+"</h1>";
	dropdown.innerHTML+=string;
	document.getElementById(id+"_num_opts").value++;
	return true;
}

function TXMenu_addOptionRange(id,min,max,digits,action)
{
	//Save the present value
	if(document.getElementById(id+"_type").value!="popup")
	{
		old_value=TXMenu_getValue(id);
	}
/* TODO: re-implement the use of a separate storage variable, needed for dynamically shown/hidden select fields (in divs/layers).
	if(cache!=null)
	{
		old_value=document.getElementById(cache).value;
	}
	else
	{
		old_value=tx_select_get_option(tx_menu);
	}
*/
	//First, delete all options
	dropdown=document.getElementById("tx_menu_"+id);
	if(dropdown==null)
		return false;
	dropdown.innerHTML="<STYLE TYPE='text/css'>#tx_menu_"+id+"{visibility:hidden}</STYLE>";

	//Then, build up the new options
	document.getElementById(id+"_num_opts").value=parseInt(max-min)+1;
	string = "";
	var cnt=0;
	for(var i=min;i<=max;i++)
	{
		val=i+"";
		if(digits!=null||digits>0)
		{
			while(val.length<digits)
			{
				val="0"+val;
			}
		}
		string +="<h1 id='opt"+id+"_"+cnt+"' class='option'";
		cnt++;
		string +="onClick='Javascript:TXMenu_setValue(\x22"+id+"\x22,\x22"+val+"\x22);TXMenu_show(\x22"+id+"\x22,event);";
		if(action!=null){string+=action;}
/*
		if(cache!=null)
		{
			string+="document.getElementById(\x22"+cache+"\x22).value=\x22"+i+"\x22;";
		}
*/
		string +="'";
		if(document.getElementById(id+"_type").value!="popup")
		{
			string +="onMouseOver='if(TXMenu_getValue(\x22"+id+"\x22)!=\x22"+val+"\x22){this.style.background=\x22#888888\x22}'";
			string +="onMouseOut='if(TXMenu_getValue(\x22"+id+"\x22)!=\x22"+val+"\x22){this.style.background=\x22#FFFFFF\x22}'";
		}
		string +=">"+val+"</h1>";
	}
	document.all["tx_menu_"+id].innerHTML+=string;


	//Set default option
	if(old_value.length==0||old_value>max)
	{
		TXMenu_setValue(id,max);//,document.all["opt"+tx_menu+"_"+n]);
/*
		if(cache!=null)
		{
			document.getElementById(tx_menu).value="";
			document.getElementById(cache).value="";
		}
*/
	}
	else
	{
		TXMenu_setValue(id,old_value);//,document.all["opt"+tx_menu+"_"+old_value]);
	}

	if(max>0)
	{
		TXMenu_enable(id);
	}
	else
	{
		TXMenu_disable(id);
	}

	return true;
}


function TXMenu_enable(id)
{
	if(document.getElementById(id+"_type").value=="select")
		document.getElementById(id+"_button").disabled=false;	
	document.getElementById(id).disabled=false;	
}

function TXMenu_disable(id)
{
	if(document.getElementById(id+"_type").value=="select")
		document.getElementById(id+"_button").disabled=true;	
	document.getElementById(id).disabled=true;	
}



//Future spec
function TXMenu_triggerContext(event)
{
	if(!event)
	{
		var event=window.event;
	}

	//Firefox
	if(event.target)
	{	
		var elm=event.target;
	}
	else
	{
		//Internet Explorer
		if(event.srcElement)
		{
			var elm = event.srcElement;
		}
	}

	if(elm!=null)
	{
		var id=elm.id;
//		alert("id="+id);
//		alert("showing menu...");
		TXMenu_show(id,event);
		return false;
	}

	
	return true;
}



// TXDoc
//-------
/*
function TXDoc_
._createSelectionMarker = function() {
    return "##SELECTION_MARKER_" + Math.random() + "##";
}
*/
function TXDoc_eventHandler(id,e)
{
	var i,button,buttons_disabled;	

	//event
	if(!e){
		var e = window.event;
	}

/*
	//element
	var elm;
	if(e.target)
	{
		elm=e.target;
	}	
	else
	{
		if(e.srcElement)
		{
			elm=e.srcElement;
		}
	}
	if(elm.nodeType==3)
	{
		elm=targ.parentNode;
	}
*/
	switch(e.type)
	{
	case "mousedown":
	case "mouseup":
    		tx_range=document.selection.createRange();
		if(tx_range.text.length>0)
		{
			buttons_disabled=false;
		}
		else	
		{
			buttons_disabled=true;
		}
		for(i=0;i<4;i++)
		{
			button=document.getElementById("tx_textFormat_button_"+i);
			if(button)
			{
				button.disabled=buttons_disabled;
			}
		}
		document.form.tx_text_link_button.disabled=buttons_disabled;
		break;
	}
	return true;
}

function TXDoc_formatText(id,tx_format)
{
	var elm=document.all[id];
	var txt,start_tag,end_tag,sel_txt;	

	switch(tx_format)
	{
	case TXBOLD:
		start_tag="<b>";
		end_tag="</b>";
		break;
	case TXITALIC:
		start_tag="<i>";
		end_tag="</i>";
		break;
	case TXUNDERLINED:
		start_tag="<u>";
		end_tag="</u>";
		break;
	}

	//IE only
//    	range=document.selection.createRange();
    	sel_txt = tx_range.text;
	if(sel_txt.length>0&& elm.value.indexOf(sel_txt)>-1)
	{
		tx_range.text=start_tag+tx_range.text+end_tag;
//		alert(range.htmlText);//=start_tag+range.text+end_tag;
//		range.htmlText="";
	}
}

function TXDoc_write(e)
{
	var asc,chr,elm;

	//event
	if(!e){
		var e = window.event;
	}

	//element
	if(e.target)
	{
		elm=e.target;
	}	
	else
	{
		if(e.srcElement)
		{
			elm=e.srcElement;
		}
	}
	if(elm.nodeType==3)
	{
		elm=targ.parentNode;
	}

	alert(elm);
	asc=TXKeyboard_getAsc(e);
	chr=TX_ascToChr(asc);

	elm.innerHTML+=chr;

}

function TXDoc_insertLink(id)
{
	var elm=document.all[id];
	var txt,url,link,start_tag,end_tag;	

	url=window.prompt("Mata in adress som du vill att länken ska peka på","http://");

	start_tag="<a href='#' onClick='window.open(\x22"+url+"\x22);'>";
	end_tag="</a>";

	//IE only
    	sel_txt = tx_range.text;
	if(sel_txt.length>0)
	{
		tx_range.text=start_tag+tx_range.text+end_tag;
	}	
}


//=============
//|| PRIVATE ||
//=============

var TXSys_platform=TXUNDEFINED;
var TXSys_platformVersion=0;
var TXSys_verbosity=0;
var TXSys_func="";
var TXDoc_selectionStart, TXDoc_selectionEnd;


function TX_enterFunc(name)
{
	TXSys_func=name;	
	if(TXSys_verbosity>=TXTRACE)
	{
		TX_debug(TXTRACE,"Entered function "+name+".\n");	
	}
}

function TX_output(msg)
{
	alert(msg);
}

document.write("<style type=\x22text/css\x22>");
document.write("selection.normal{");
document.write("border: 2px #000000 solid;");
document.write("background: #FFFFFF;");
document.write("font: normal 12px/normal Arial, Helvetica, sans-serif;");
document.write("color: #000000;}");

document.write("text{");
document.write("border: 2px #000000 solid;");
document.write("background: #FFFFFF;");
document.write("font: normal 12px/normal Arial, Helvetica, sans-serif;");
document.write("color: #000000;}");

document.write("</style>");


document.write("<STYLE TYPE='text/css'>");
document.write(".dropdown {border-width: 1px; border-style: solid; border-color: #000000;"); 
document.write("position: absolute; background-color: #FFFFFF; padding: 0;");
document.write("layer-background-color: yellow; visibility: hidden; z-index: 1; overflow:auto;}");
document.write("h1.option {font-size:small; color: #000000; text-decoration: none; margin-bottom: 0cm; background:#FFFFFF; margin-top: 0cm; font-weight: normal; font-family: sans-serif}");
document.write("}");
document.write("</STYLE>");


// auxiliary functions for select boxes
//--------------------------------------
var button_mouseover	= false;
var active		= null;

function tx_set_button_mouseover(id,state)
{
	if(id==active)
	{
		button_mouseover=state;
	}
}

function tx_option_refresh(menu_id,value,option_id,state)
{
	if(state==true)
	{
		option_id.style.background="#888888";
		option_id.style.color="#000000";
	}
	else
	{
		option_id.style.background="#FFFFFF";
		option_id.style.color="#000000";
	}

	if(document.getElementById(menu_id).value==value)
	{
		temp=option_id.style.background;
		option_id.style.background=option_id.style.color;
		option_id.style.color=temp;
	}
}

function tx_select_reset_dropdown(event)
{
	if(active!=null)
	{
		dropdown=document.all["tx_menu_"+active].style;
		if(dropdown!=null)
		{
			if(event.elm!=document.all[active]);
			{
				if(button_mouseover==false)
				{					
					TXMenu_show(active,event);
				}
			}
		}
	}
	return true;
}

// auxiliary functions for menus of any kind
//------------------------------------------
function TXMenu_show(id,event)
{
	if(id==null){TX_debug(TXERROR,"Invalid ID"); return false;}
	if(event==null){TX_debug(TXERROR,"Invalid Event"); return false;}

	var x,y;
	div=document.all["tx_menu_"+id];
	var mt_elm=document.getElementById(id+"_type");
	if(mt_elm==null)
	{
		return false;
	}
	menuType=document.getElementById(id+"_type").value;
	switch(menuType)
	{
	case "select":
		button=document.getElementById(id+"_button");
		button.disabled=true;
		x=TXGuiElement_getX(id);
		y=TXGuiElement_getY(id)+TXGuiElement_getHeight(id)+4;
		break;
	case "popup":
		x=TXMouse_getX(event);
		y=TXMouse_getY(event);
		break;
	}
	
	if(id!=active)
	{
		if(active!=null)
		{
			document.all["tx_menu_"+active].style.visibility	= "hidden";
		}
		if(menuType=="select")
			button_mouseover=true;
		active=id;
		avail_height	= document.body.clientHeight-y+document.body.scrollTop;
		req_height	= div.scrollHeight+2;

		//defaults
		div.style.left	= x;
		div.style.top	= y;
		switch(menuType)
		{
		case "select":
			div.style.width		= TXGuiElement_getWidth(id)+4+TXGuiElement_getWidth(id+"_button")+4;
			break;
		}
/*
		//Is there enough space beneath?
		if(avail_height<req_height)
		{
			//No, is there more space above?
			avail_height_top	= TXGuiElement_getY(id)-document.body.scrollTop;
			if(avail_height_top>avail_height)
			{
				//Is it enough?
				if(avail_height_top<req_height)
				{
					//No, limit size
					div.style.top		= document.body.scrollTop;
					div.style.height	= avail_height_top;
				}
				else
				{
					//Yes, use the required size and place it in the right position
					switch(menuType)
					{
					case "select":
						div.style.top = TXGuiElement_getY(id)-req_height;
						break;
					case "popup":
						div.style.top = y-req_height;
						break;
					}
					div.style.height	= req_height;
				}
			}
			else
			{
				//Show below, but limit max height to visible area
				div.style.height	= avail_height;
			}
		}
		else
		{
			//No probs, use the required size
			div.style.height	= req_height;
		}
*/

		//Props ready, show it
		div.style.visibility 	= "visible";
	}
	else
	{
		div.style.visibility	= "hidden";
		active=null;
	}

	switch(menuType)
	{
	case "select":
		button.disabled=false;		
		break;
	case "popup":
		div.style.zIndex=999;
		break;
	}
	return true;
}


// TX WWW
//========
var tx_popup=new Array();


//(future spec. function name not final)
function TXWWW_showPopup(id,html)
{
	var header="<table style='border-style: solid; border-color: #FAA24B;' cellspacing='0' cellpadding='0'><tr><td bgcolor='#FAA24B'>LetraDomus</td></tr><tr><td>";
//	var header="<table><tr><td bgcolor='#FAA24B'>LetraDomus</td></tr><tr><td>";
	var footer="</td></tr></table>";
	popup=document.getElementById(id);
	popup.innerHTML=header+html+footer;
	popup.style.color="#000000";
	popup.style.backgroundColor="#18A7A1";
	popup.style.visibility="visible";
//	popup.style.left=0;
//	popup.style.top=0;
	popup.style.left=(TXWindow_getWidth()-popup.clientWidth)/2;
	popup.style.top=(TXWindow_getHeight()-popup.clientHeight)/2;
	popup.style.zIndex=900;
//	popup.style.position="absolute";
	var i=0;
	while(tx_popup[i]!=null)
	{
		i++;
	}
	tx_popup[i]=id;
}

function TXWWW_hidePopup(id)
{
	popup=document.getElementById(id);
	popup.style.visibility="hidden";
	var i=0;
	while(tx_popup[i]!=id)
	{
		i++;
	}
	while(tx_popup[i+1]!=null)
	{
		tx_popup[i]=tx_popup[i+1];
		i++;
	}
	tx_popup[i]=null;
}



