﻿
	var strSkinDir = '/wpresources/lcms/skins/default/images/tabcontrol';
	var messageBindings = new Array();
	
	
	function SendMessage(strInterfaceName, strMessage, forceSending, strSource)
	{
		// dispatch message to siblings
		var command = 'SendMessageThread("' + strInterfaceName + '", "' + strMessage + '", "'+ strSource;
		if(forceSending) command += '", "'+ forceSending;
		command += '")';
		timerID = setTimeout( command, 20);
		
		try
		{
			// dispatch message to parent
			if(parent != null && parent != self && strSource != 'parent') parent.SendMessage(strInterfaceName, strMessage, forceSending, window.name);
		}
		catch(e)
		{			
			//if(parent != null) alert(parent.id);
		}
		
		try
		{
			// dispatch message to opener window		
			if(window.opener != null) window.opener.SendMessage(strInterfaceName, strMessage, forceSending, window.name);
		}
		catch(e)
		{
			
		}

		
		// dispatch message to children		
		var iframes = document.getElementsByTagName('iframe');
		
		var i;
		for(i=0;i<iframes.length;i++)
		{		    
			var iframename = iframes[i].name;
		    
		    //alert(iframes[i].contentWindow);				
		
			if(iframename != strSource && iframes[i].id != 'tooltip')
			{
				try
				{
					if(iframes[i].contentWindow.SendMessage)
					{
						 iframes[i].contentWindow.SendMessage(strInterfaceName, strMessage, forceSending, 'parent');
					}
				}
				catch(e)
				{
				    alert('SendMessage error: '+iframes[i].id);
				    //alert(e);
					//alert(iframes[i].id + ': ' + e);
				}
			}
		}

	}
	
	function SendMessageThread(strInterfaceName, strMessage, strSource, forceSending)
	{
		for (var i=0; i < messageBindings.length; i++)
		{			
			if (messageBindings[i][0] == strInterfaceName)
			{
				//alert('interface: '+strInterfaceName+', messageBinding: '+messageBindings[i][1] + ', strSource: '+strSource + ', force: '+forceSending);				
				if(forceSending || messageBindings[i][1] + '_frame' != strSource)
				{
					eval(strInterfaceName+ '_' + messageBindings[i][1]+'("' + strMessage + '")');
				}				
			}
		}
	}
	
	function SessionTimeOut()
	{
		alert("Session TimeOut");
	}
	function ShowHideControl(strID, vShow)
	{
		//alert("showHide: " + strID + " show: " + vShow);
		var ctrlControl = document.getElementById(strID);
		if (ctrlControl != null)
		{
			ctrlControl.style.display = vShow ? '' : 'none';
		}
	}
	
	function getWPViewStyleField(strID)
	{
		return document.getElementById(strID + '_vs');
		//return eval('document.forms[0].' + strID + '_vs');
	}
	
	function ShowHideWP(strID)
	{
	
	}
	
	function DeserializeMessage(strMessage)
	{
		var arParamPairs = strMessage.split('&');
		var arParams = new Object();
		
		for (var i = 0; i < arParamPairs.length; i++)
		{
			arTmpPair = arParamPairs[i].split('=');
			arParams[unescape(arTmpPair[0])] = unescape(arTmpPair[1]); 
		}
		
		return arParams;
	}

	function IFrameSrcMerge(strID, strPage, strMessage)
	{
		//alert('id: '+strID);
		//alert('page: '+strPage);
		//alert('message: '+strMessage);
		
		var ctrlIFrame = document.getElementById(strID);		
		var strOldSrc = frames[strID].location.search;
		//alert(strOldSrc);
		
		// decode aspx page from path
		strOldPage = frames[strID].location.pathname;
		
		var parameterMerge = false;
		if(strPage == '')
		{
			strPage = strOldPage;
			parameterMerge = true;
		}
		
		strOldPage = strOldPage.substring(strOldPage.lastIndexOf('/') + 1, strOldPage.length)
		var arOldSrcLoc = strOldSrc.split('?');
		var strNewSrc = '';

		//if(strPage == '') strPage = strOldPage;

		//alert('oldpage: '+strOldPage);
		//alert('newpage: '+strPage);		
		
		if (!parameterMerge && ((arOldSrcLoc.length <= 1) || (arOldSrcLoc.length > 1 && strOldPage != strPage)))
		{	
			var locationArray = strPage.split('?');
			
			var msg = MergeQueryStrings(strMessage, 'cid=' + GetUrlParameter('cid'));
			
			if(locationArray.length > 1)
			{
				strNewSrc = locationArray[0] + '?' + MergeQueryStrings(locationArray[1], msg);
			}
			else
			{							
				strNewSrc = strPage + '?' + msg;
			}
		}
		else
		{
			// if we merge parameters
			var arNewParamPairs = strMessage.split('&');
			var arOldParamPairs = arOldSrcLoc[1].split('&');
			
			var arOldParams = new Object();
			for (var i = 0; i < arOldParamPairs.length; i++)
			{
				arTmpPair = arOldParamPairs[i].split('=');
				arOldParams[unescape(arTmpPair[0])] = unescape(arTmpPair[1]); 
			}
			// merge params
			for (var i = 0; i < arNewParamPairs.length; i++)
			{
				if(arNewParamPairs[i] == '') continue;
				arTmpPair = arNewParamPairs[i].split('=');
				strName = unescape(arTmpPair[0]);
				arOldParams[strName] = unescape(arTmpPair[1]);
			}
			
			strNewSrc = strPage + '?';
			var foundCID = false;
			for (var strKey in arOldParams)
			{
				if(strKey == 'cid') foundCID = true;
				strNewSrc += strKey + '=' + arOldParams[strKey] + '&';
			}
			if(!foundCID)
			{
				strNewSrc += 'cid=' + GetUrlParameter('cid');
			}
			
			strNewSrc = strNewSrc.substring(0, strNewSrc.length - 1);
		}
		
		//alert('newsrc: '+strNewSrc);
		
		ctrlIFrame.src = strNewSrc;
	}
	
	
	function IFrameParameterMerge(strID, strMessage)
	{		
		IFrameSrcMerge(strID, '', strMessage);		
	}
	
	
	function MergeQueryStrings(str1, str2)
	{
		//params in str2 override params in str1
		
		var arParamPairs1 = str1.split('&');
		var arParamPairs2 = str2.split('&');
		
		var arOldParams = new Object();
		for (var i = 0; i < arParamPairs2.length; i++)
		{
			if(arParamPairs2[i] == '') continue;
			var arTmpPair = arParamPairs2[i].split('=');
			arOldParams[arTmpPair[0]] = arTmpPair[1]; 
		}
		
		// merge params
		for (var i = 0; i < arParamPairs1.length; i++)
		{
			if(arParamPairs1[i] == '') continue;
			
			var arTmpPair = arParamPairs1[i].split('=');
			var strName = arTmpPair[0];
			if(arOldParams[strName] == null) arOldParams[strName] = arTmpPair[1];
		}

		var strNewParams = '';
		
		for (var strKey in arOldParams)
		{
			strNewParams += strKey + '=' + arOldParams[strKey] + '&';
		}
		
		return strNewParams.substring(0, strNewParams.length - 1);
					
	}


	function WPButtonOver(vIsOver)
	{
		return;
		//alert(this.className);
		//alert("WPButtonOver");
		var objElement = window.event.srcElement;
		if (vIsOver)
		{
			//alert(this.Name);
			//objElement.className='ms-HoverCellActiveDark';
			objElement.style.borderStyle = "solid";
			objElement.style.borderColor = "#cbdbf8";
			objElement.style.borderWidth = "1px";
			objElement.style.backgroundColor = "steelblue";
		}
		else
		{
			objElement.style.border = "none";
			objElement.style.margin = "1px";
			objElement.style.backgroundColor = "transparent";
			
			//objElement.className='ms-HoverCellInActive';
			//this.style.borderStyle = "solid";
			//this.style.borderColor = "#cbdbf8";
			//this.style.borderWidth = "1px";
		}
		//return true;
	}
	
	function MinimizeRestoreWP(strID, strStyle, strHeight)
	{
		var ctrlMain = document.getElementById(strID + '_wp');
		var ctrlContent = document.getElementById(strID + '_content');
		var ctrlMinimize = document.getElementById(strID + '_wpminimize');
		var ctrlRestore = document.getElementById(strID + '_wprestore');
		if (strStyle == 'Closed')
		{
			ctrlMain.style.display = 'none';
		}
		else
		{
			var vNormal = strStyle == "Normal";
			
			ctrlContent.style.display = vNormal ? '' : 'none';
			if (ctrlMinimize)
				ctrlMinimize.style.display = vNormal ? '' : 'none';
			if (ctrlRestore)
				ctrlRestore.style.display = vNormal ? 'none' : '';
			ctrlMain.style.height = vNormal ? strHeight : ''; 
			ctrlMain.style.display = '';
		}
//		alert(getWPViewStyleField(strID));
		//alert(getWPViewStyleField(strID).value);
	}

	function SetWPStyle(strID, strStyle)
	{
		MinimizeRestoreWPEx(strID, strStyle, null, null);
	}
	
	function MinimizeRestoreWPEx(strID, strStyle, vIsVertical, strSize)
	{
//		alert('d1');
//		alert(getWPViewStyleField(strID).value);
//		alert('d2');
		
		var ctrlMain = document.getElementById(strID + '_wp');
		var ctrlContent = document.getElementById(strID + '_content');
		var ctrlMinimize = document.getElementById(strID + '_wpminimize');
		var ctrlRestore = document.getElementById(strID + '_wprestore');
		
		var ctrlLeftFrame = document.getElementById(strID + '_left');
		var ctrlRightFrame = document.getElementById(strID + '_right');		
		
//		alert(ctrlMain + ', ' + ctrlContent + ', ' + ctrlMinimize + ', ' + ctrlRestore + ', ' + ctrlLeftFrame + ', ' + ctrlRightFrame);
		
		if (strStyle == 'Closed')
		{
			ctrlMain.style.display = 'none';
		}
		else
		{
			var vNormal = strStyle == "Normal";
			
			//if (vIsVertical)
			if (ctrlLeftFrame != null)
			{
				// vertical box
				ctrlLeftFrame.style.display = vNormal ? 'none' : 'block';
				ctrlRightFrame.style.display = vNormal ? 'block' : 'none';
			}
			
			ctrlContent.style.display = vNormal ? 'block' : 'none';
			if (ctrlMinimize != null)
				ctrlMinimize.style.display = vNormal ? 'block' : 'none';
			if (ctrlRestore != null)
				ctrlRestore.style.display = vNormal ? 'none' : 'block';
			
			var strOriginalSize = ctrlMain.getAttribute('original_size');
				
			//if (vIsVertical)
			if(ctrlLeftFrame != null)
			{
				//if(vNormal) ctrlMain.style.width = strSize;
				ctrlMain.style.width = vNormal ? strOriginalSize : ''
				//if(vNormal) ctrlMain.style.width = strOriginalSize;
			}
			else
			{
				//if(vNormal) ctrlMain.style.height = strSize;
				ctrlMain.style.height = vNormal ? strOriginalSize : ''; 
				//if(vNormal) ctrlMain.style.height = strOriginalSize; 
			}
				
			ctrlMain.style.display = 'block';
		}
//		alert('SaveState');
		SetCookieEx(strID + '_vs', strStyle);
		//getWPViewStyleField(strID).value = strStyle;
		//alert(getWPViewStyleField(strID).value);
	}
	
	
	function addListener( element, type, listener ) 
	{		
		if(( 'object' == typeof element ) && ( 'string' == typeof type ) && ( 'function' == typeof listener ))
		{			
			if( element.addEventListener ) //firefox
			{	
				element.addEventListener( type, listener, false );
			}
			else // internet explorer
			{
				type = 'on' + type;
			 	if( element.attachEvent ) 
			 	{
					element.attachEvent( type, listener );
			 	}
			 	else 
			 	{
					element[ type ] = listener;
			 	}
		 	}
	 	}	 	
	}
	
	
	
	// TabControl functions
	
	function getFrameLocation(tabSet)
	{
		//alert('getFrameLocation' + tabSet);
		//return document.getElementById(tabSet+'_frame').location; 
		return frames[tabSet+'_frame'].location;
	}
	
	function getSelectedTabField(tabSet)
	{	
		var hiddenField = document.getElementById(tabSet+'_selected');
		//alert('get: '+hiddenField.value);
		return hiddenField;		
		//return eval('document.forms[0].' + tabSet + '_selected');
	}
	
	function getTabComponent(tabSet,tabClientID)
	{	
		//alert(tabIndex);
		
		var arr = eval(tabSet + '_components');
		var i;
		for(i=0;i<arr.length;i++)
		{
			if(arr[i][0] == tabClientID) return new Array(arr[i][1], arr[i][2]);	
		}
		
		return null;
		//return document.getElementById(tabSet+'_selectedcomponent');				
	}
	
	function getTabSetAspx(tabSet,tabClientID)
	{	
		//alert(tabIndex);
				
		return document.getElementById(tabSet+'_aspx').value;				
	}
		
	
	function refreshTab(tabSet, message)
	{	
		document.getElementById(tabSet+'_message').value = message;
		
		var objLocation = getFrameLocation(tabSet);
		var arOldSrcLoc = objLocation.href.split('?');
		//objLocation.replace( arOldSrcLoc[0] + '?' + message);
		
		//var selectedField = getSelectedTabField(tabSet);
		//var tabComponent = getTabComponent(tabSet, selectedField.value);
		//var newUrl = "genericcomponentcontainer.aspx?component=" + tabComponent + "&" + message ;
		var newUrl = getFrameSource(tabSet, message);
		objLocation.replace(newUrl);
	}
	
	function getFrameSource(tabSet, message)
	{
		var objLocation = getFrameLocation(tabSet);
		var selectedField = getSelectedTabField(tabSet);

		var tabComponentData = getTabComponent(tabSet, selectedField.value);		
		var tabSetAspx = getTabSetAspx(tabSet);
		var cid = document.getElementById(tabSet+'_cid').value;
		
		var msg = '';
		if(message == null)
		{
			msg = objLocation.search.substring(1, objLocation.search.length - 1);
			if(msg.indexOf('content=') == 0)
			{
				msg = msg.substring(msg.indexOf('&') + 1, msg.length - msg.indexOf('&') - 1);
			}
		}
		else
		{
			msg = message;
		}
		if(msg != '') msg = "&" + msg + "&";
		var newUrl;
		if(tabComponentData[1])
		{
			newUrl = tabSetAspx + "?content=" + tabComponentData[0] + msg + '&cid=' + cid;
		}
		else
		{
			var seperator = tabComponentData[0].indexOf('?') >= 0 ? '&' : '?';
			newUrl = tabComponentData[0] + seperator + msg + 'cid=' + cid;
		}
		return newUrl;
	}
	
	function updateTab(tabSet)
	{
		selectTab(tabSet, getSelectedTabField(tabSet).value, "", true);
	}
	
	function setTabState(tabID, vSelect)
	{		
		var styletmp = vSelect ? '_Sel' : '';
		//document.getElementById(tabID+'_left').style.backgroundImage='url(' + strSkinDir + '/tableft' + (vSelect ? '_sel' : '') + '.gif)';
		//document.getElementById(tabID+'_m').style.backgroundImage='url(' + strSkinDir + '/tabm' + (vSelect ? '_sel' : '') + '.gif)';
		//document.getElementById(tabID+'_right').style.backgroundImage='url(' + strSkinDir + '/tabright' + (vSelect ? '_sel' : '') + '.gif)';
		document.getElementById(tabID+'_left').className = "tabLeft" + styletmp;
		document.getElementById(tabID+'_m').className = "tabM" + styletmp;
		document.getElementById(tabID+'_right').className = "tabRight" + styletmp;
	}
	
	
	function getTabIDOfBrowser(tabSet, browserID)
	{	
		//alert(tabIndex);
		
		var arr = eval(tabSet + '_browsertabs');
		var i;
		for(i=0;i<arr.length;i++)
		{
			if(arr[i][0] == browserID) return arr[i][1];	
		}
		
		return null;
		//return document.getElementById(tabSet+'_selectedcomponent');				
	}
	
	function selectAndSetTab(tabSet, message)
	{
		//alert(message);
		var browserid = message.substring(0, message.indexOf('__'));
		var code = message.substring(message.indexOf('__')+2, message.length);
		//alert(code);
		var tabID = getTabIDOfBrowser(tabSet, browserid);
		//alert(tabID);
		if(tabID != null)
		{
			var msg = document.getElementById(tabSet + '_message').value;
			var codemsg = msg == '' ? 'code='+code : msg += '&code=' + code;
			//document.getElementById(tabSet + '_message').value = codemsg;
			selectTab(tabSet, tabID, getTabComponent(tabSet, tabID)[0], false, true, codemsg);
		}
	}
	
	function TruncateTabControlTabListAtSelected(tabSet)
	{		
		var selectedField = getSelectedTabField(tabSet);
		var selectedTabID = selectedField.value;
		
		var arr = eval(tabSet + '_components');
		var i;		
		var fHide = false;
		for(i=0;i<arr.length;i++)
		{
			var tabID = arr[i][0];
			if(fHide) document.getElementById(tabID).style.display = 'none';
			if(tabID == selectedTabID) fHide = true;			
		}
			
	}
	
	
	function selectTab(tabSet, tabID, tabComponent, update, serverevent, params)
	{				
		var selectedField = getSelectedTabField(tabSet);
		//alert('selectedField: '+selectedField.value);
		// Deselect current
		setTabState(selectedField.value, false);
		// select new
		setTabState(tabID, true);	
		selectedField.value = tabID;
		
		// Refresh iframe
				
		SetCookieEx(tabSet + '_sel', tabID);
	
		if(serverevent != null && serverevent)
		{
			eval(tabSet+ '_tab_changed(tabID)');		
		}		
		else if (!update)
		{
			var objLocation = getFrameLocation(tabSet);
			var newUrl = '';
			try {
				var msg = params == null ? document.getElementById(tabSet + '_message').value : params;
				newUrl = getFrameSource(tabSet, msg);								 
			} catch (e) {
				alert(e);				
				//var sepChar = tabSource.indexOf('?') > 0 ? "&" : "?";
				
				//var msg = document.getElementById(tabSet + '_message').value;
				//newUrl = getFrameSource(tabSet, msg);
				
				//document.getElementById(tabSet+'_frame').src = tabComponent + sepChar + document.getElementById(tabSet + '_message').value;
			}		
			objLocation.replace(newUrl);
		}			
	}
	
	

function utf8Encode(str) 
{ 
	var	out	= ""; 

	for(var	i =	0; i < str.length; i++) 
	{ 
		var	c =	str.charCodeAt(i); 

		if (c <	0x80) 
		{ 
			out	+= String.fromCharCode(c); 
		} 
		else if	(c < 0x800)	
		{ 
			out	+= String.fromCharCode(0xC0	+ (c / 0x40)); 
			out	+= String.fromCharCode(0x80	+ (c % 0x40)); 
		} 
		else 
		{ 
			out	+= String.fromCharCode(0xE0	+ (c / 0x1000));  // c >> 12 
			c =	c %	0x1000;	
			out	+= String.fromCharCode(0x80	+ (c / 0x40));	 //	c >> 6 
			out	+= String.fromCharCode(0x80	+ (c % 0x40)); 
		} 
	} 

	return out;	
}


function utf8Decode(str)
{
	var out = "";
	
	for (var i = 0; i < str.length; )
	{
		var c = str.charCodeAt(i);
		
		if (c <	0x80) 
		{ 
			out	+= String.fromCharCode(c);
			i++;
		}
		else if (c < 0xE0)
		{
			out += String.fromCharCode((str.charCodeAt(i) - 0xC0) * 0x40 + (str.charCodeAt(i + 1) - 0x80));
			i += 2;
		}
		else
		{
			out += String.fromCharCode((str.charCodeAt(i) - 0xE0) * 0x1000 + (str.charCodeAt(i + 1) - 0x80) * 0x40 + (str.charCodeAt(i + 2) - 0x80));
			i += 3;
		}
	}
	
	return out;
}



function escapeURL(string)
{
	var escaped = utf8Encode(string);
	escaped = escape(escaped);
	
	// the escape function doesn't escape the plus sign
	escaped = escaped.replace(/\+/g, "%2b");
	
	return escaped;
}

//
// TODO: Check this:
//

function GetCookie (name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
{
	offset=j;
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}

function SetCookieEx(name, value) {
//	alert('SetCookie');
//	alert('Set: ' + name + ', ' + value);
var argv = SetCookieEx.arguments;
var argc = SetCookieEx.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
((path == null) ? "" : ("; path=" + path)) +  
((domain == null) ? "" : ("; domain=" + domain)) +    
((secure == true) ? "; secure" : "");
}

function DeleteCookie (name) {  
var exp = new Date();  
exp.setTime (exp.getTime() - 1);  
var cval = GetCookie (name);  
document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function setFloatDivCoords(strHiddenID, strX, strY)
{
	var objHidden = document.getElementById(strHiddenID);
	if (objHidden != null)
	{
		objHidden.value = strX + ',' + strY;
	}
}

function moveCalendar(strDivID, strHiddenID, objBtn)
{
	var objCal = document.getElementById(strDivID);
	var objHidden = document.getElementById(strHiddenID);
	if (objCal != null)
	{
		objCal.style.left = findPosX(objBtn);
		objCal.style.top = findPosY(objBtn) + 20;
		setFloatDivCoords(strHiddenID, objCal.style.left, objCal.style.top);
	}
}

function change(olditem, newitem)
{
	document.getElementById(olditem).style.display= 'none';
	document.getElementById(newitem).style.display= 'block';
}


  // this function is need to work around 
  // a bug in IE related to element attributes
  function hasClass(obj) {
     var result = false;
     if (obj.getAttributeNode("class") != null) {
         result = obj.getAttributeNode("class").value;
     }
     return result;
  }   

 function stripeall(id) {
	var evenColor = arguments[1] ? arguments[1] : "#ffffff";
    var oddColor = arguments[2] ? arguments[2] : "#000";
    
    if(document.body != null)
    {
		var tables = document.body.getElementsByTagName("table");
		if (! tables) { return; }
		for (var h = 0; h < tables.length; h++) {
			if (tables[h].id.indexOf(id) == 0){
				stripe(tables[h].id,evenColor,oddColor);
	
				
			}
		}
	}
}

 function stripe(id) {

    // the flag we'll use to keep track of 
    // whether the current row is odd or even
    var even = false;
  
    // if arguments are provided to specify the colours
    // of the even & odd rows, then use the them;
    // otherwise use the following defaults:
    var evenColor = arguments[1] ? arguments[1] : "#ffffff";
    var oddColor = arguments[2] ? arguments[2] : "#000";
  
    // obtain a reference to the desired table
    // if no such table exists, abort
    var table = document.getElementById(id);
    if (! table) { return; }

    // by definition, tables can have more than one tbody
    // element, so we'll have to get the list of child
    // &lt;tbody&gt;s 
    var tbodies = table.getElementsByTagName("tbody");
   
    
    // and iterate through them...
    for (var h = 0; h < tbodies.length; h++) {
   // alert(id + evenColor + oddColor); 
     // find all the &lt;tr&gt; elements... 
      var trs = tbodies[h].getElementsByTagName("tr");
      
      // ... and iterate through them
      for (var i = 0; i < trs.length; i++) {

	    // avoid rows that have a class attribute
        // or backgroundColor style
	    if (!hasClass(trs[i]) && ! trs[i].style.backgroundColor) {
 trs[i].style.backgroundColor = even ? evenColor : oddColor;
         // get all the cells in this row...
         // var tds = trs[i].getElementsByTagName("td");
        
          // and iterate through them...
         // for (var j = 0; j < tds.length; j++) {
        
        //    var mytd = tds[j];

            // avoid cells that have a class attribute
            // or backgroundColor style
	    //    if (! hasClass(mytd) && ! mytd.style.backgroundColor) {
        
		 //     mytd.style.backgroundColor = even ? evenColor : oddColor;
              
           // }
          //}
        }
        // flip from odd to even, or vice-versa
        even =  ! even;
      }
    }
  }

function tooltip(text){
	return escape(text);
}
function show_term_nav(p1,p2){
//	show_term(p1);
}

function show_term_tt(p1,p2, e){
	show_term(p1, e);
}
function show_term(p1, e){
	if(p1 != '~ "*"') ShowToolTipTimed('/player/term.aspx?termname=' + encodeURIComponent(p1), e);
}
function navigate_term(p1){
//	show_term(p1);
}

function hide_term(p1){
     return;
}

function hide_term_tt(p1,p2){
     return;
}

function ToolTipreplace()
{
	tt_n = navigator.userAgent.toLowerCase(),
	tt_nv = navigator.appVersion;
	var tt_ie = tt_n.indexOf("msie") != -1 && document.all
	var tt_ie6 = tt_ie && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5;
	var tt_n4 = (document.layers && typeof document.classes != undefined);
	var tt_n6 = (document.defaultView && typeof document.defaultView.getComputedStyle != undefined);

	var tags = tt_ie? (document.all.tags("span") || 1)
			: document.getElementsByTagName("span");
	
	for (var i = 0; i < tags.length; i++)
	{
		if (typeof (t_tj = tags[i]).onmouseover == "function")
		{
			if (t_tj.className == 'term')
			{
				t_tj.onmouseout = HideToolTipTimed;
			}
		}
	}
}

var m_hideTooltip = true;

function ShowToolTipTimed(url, e)
{	
	var bodytag = document.getElementsByTagName('body')[0];	
	
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e != null)
	{
	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + bodytag.scrollLeft;
		posy = e.clientY + bodytag.scrollTop;
	}
			
	var windowWidth = GetWindowWidth();
	
	var iframeWidth = 200;

	if(posx > windowWidth - iframeWidth - 40 + bodytag.scrollLeft)
	{
		posx = windowWidth - iframeWidth - 40 + bodytag.scrollLeft;
	}		
		
	ShowToolTip(url, posx, posy);
	}
}

function GetToolTipFrame()
{
	var frm = document.getElementById('tooltip');
	return frm;
}

function ShowToolTip(url, posx, posy) 
{
	//alert('posx: '+posx+', posy: '+posy);
	ShowToolTipLoading();
	
	m_hideTooltip = false;
	var frm = GetToolTipFrame();
	
	if(frm != null)
	{
	    //frm.style.position = 'absolute';
	    frm.style.width = '200px';
	    frm.style.height = '80px';
	    frm.style.left = posx + 'px';
	    frm.style.top = posy + 'px';	
    	
	    //frm.style.left = posx;
	    //frm.style.top = posy;	
    	
	    //Effect.Grow('tooltip');
	    frm.style.display = 'block';	
    	
	    //frm.src = url;		
	    //frm.contentWindow.location.href = url;
	    frm.contentWindow.location.replace(url);
	}
}

function StopHideToolTip()
{
	m_hideTooltip = false;
}

function HideToolTipTimed()
{
	m_hideTooltip = true;
	setTimeout("HideToolTip()", 1000);
}

function HideToolTip() {
	if (m_hideTooltip)
	{
		var frm = document.getElementById('tooltip');		
			frm.style.display = "none";
		ShowToolTipLoading();
		//Effect.Shrink('tooltip');
	}
}

function ShowToolTipLoading()
{
	var loadingLabel = '<table cellpadding="0" cellspacing="0" width="100%" style="height: 70px;"><tr><td class="termpanel" valign="top">'+GetTermLoadingLabel()+'</td></tr></table>';
	
	if(window.navigator.appName.toLowerCase().indexOf("microsoft") > -1)
	{
	    if(document.getElementById('tooltip') != null)
	    {
		    if(toolTipFrame.document.body != null) toolTipFrame.document.body.innerHTML = loadingLabel;
		}
	}
	else
	{	    
		if(document.getElementById('tooltip') != null) document.getElementById('tooltip').contentDocument.documentElement.getElementsByTagName('form')[0].innerHTML = loadingLabel;
	}	
}

function CreateXmlDocument(xmlText)
{   
	var xmlDoc;
	
	if (window.ActiveXObject) 
	{
	      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	      xmlDoc.async = false;
	
	      while(xmlDoc.readyState != 4) {};
	      
	      if(xmlText != null) xmlDoc.loadXML(xmlText);
    }
    else
    {
    	if(xmlText == null)
    	{
			xmlDoc = document.implementation.createDocument("", "", null);
		}
		else
		{
			var parser = new DOMParser();
			xmlDoc = parser.parseFromString(xmlText, "text/xml");
		}
	}	
	
	return xmlDoc;
}

function XmlToString(xmlDoc)
{
	var str = xmlDoc.xml;
	if(str == null)
	{
		var serializer = new XMLSerializer;      
    	str = serializer.serializeToString(xmlDoc);
	}
    
	return str;
}

function CreateChildNode(parentNode, newNodeName, newNodeContent)
{
	var newNode = parentNode.ownerDocument.createElement(newNodeName);
	if(newNodeContent != null)
	{
		var contentNode = parentNode.ownerDocument.createTextNode(newNodeContent);
		newNode.appendChild(contentNode);
	}
	parentNode.appendChild(newNode);
}

function CreateAttribute(parentNode, attributeName, attributeValue)
{
	var newAttr = parentNode.ownerDocument.createAttribute(attributeName);
    newAttr.value = attributeValue;
    parentNode.attributes.setNamedItem(newAttr);
}


function RunXslt(xmlDoc, xsltDoc)
{
    var result = null;
    
    if (document.implementation && document.implementation.createDocument)
    {
        var xsltProcessor = new XSLTProcessor();
        xsltProcessor.importStylesheet(xsltDoc);
        result = xsltProcessor.transformToFragment(xmlDoc,document);
    }    
    else if (window.ActiveXObject)
    {
        result = xmlDoc.transformNode(xsltDoc);
    }

    return result;
}


function GetHttpRequestObject()
{
	var xmlhttp = null;
	
	if (window.XMLHttpRequest)
	{
		xmlhttp = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	return xmlhttp;
}

function SendHttpRequest(url, httpmethod, async, contentType, postData, callBack)
{
	var responseStatus;
	var responseText;

    var xmlhttp = GetHttpRequestObject();
	if(xmlhttp == null)
	{
		alert('Error creating XMLHTTP object!');
		return null;
	}
	else
	{			
	    xmlhttp.open(httpmethod,url,async);
	    
	    xmlhttp.onreadystatechange = function() {
	        if (xmlhttp.readyState != 4)  return;
            
            if(xmlhttp.status != 200) 
            {
                if(xmlhttp.status != 0) alert('Hiba ('+xmlhttp.status+'): '+xmlhttp.responseText);
                return;
            }
            
            if(callBack != null) callBack(xmlhttp);
        };
    	
	    if(httpmethod == 'GET')
	    {				
		    xmlhttp.send(null);
    		
	    }
	    else if(httpmethod == 'POST')
	    {		
		    xmlhttp.setRequestHeader('Content-Type',contentType);
		    xmlhttp.send(postData == null ? '' : postData);
	    }
	    else
	    {
		    alert('Unsupported HTTP method: ' + httpmethod);
		    return null;
	    }
	    
	    return async ? null : [ xmlhttp.status, xmlhttp.responseText ];
	}	
}


var navigationPathContainer;


function RefreshNavigationPath(conteinerId, frameId)
{		
	var container = document.getElementById(conteinerId);
	
	if(container != null)
	{
		navigationPathContainer = container;	
			
		var url = GetNavigationPathAspxUrl();
		navigationPathFrame.location.href = url;		
	}	
}


function NavigationPathReady()
{	
   var mire = navigationPathFrame.document.getElementById('navpath');

   var mit = navigationPathContainer;
   if(mire != null && mit != null)
   {
   		mit.innerHTML = '<span>' + mire.innerHTML + '</span>';   
   		mire.style.display = 'block';
   		navigationPathContainer.style.display = 'block';
   }
}


function NavigateBrowser(segment)
{
	
	var aspx = GetNavigationPathAspxUrl();
	var separator = aspx.indexOf('?') >= 0 ? '&' : '?';
	var url = aspx + separator + 'segment=' + segment;
	navigationPathFrame.location.href = url;
}

function MedianAuditScript()
{	
	var same =  Math.floor(Math.random()*1000000);	
	document.getElementById('auditimage').src='http://audit.median.hu/cgi-bin/track.cgi?uc=11059806063930&dc=1&ui='+same;
}

function GetWindowWidth()
{
	var windowWidth = -1;
	if(window.navigator.appName.toLowerCase().indexOf("microsoft") > -1)
	{
		windowWidth = document.body.clientWidth;
	}
	else
	{
		windowWidth = window.innerWidth;
	}
	
	return windowWidth;
}

// xml-ben nem hasznalhato osszehasonlitasokra a < es >
function greaterThan(a ,b){
	return a > b;
}

function lessThan(a ,b){
	return a < b;
}

function GetUrlParameter(parameterName)
{
	var queryString = window.location.search;
	if(queryString.length > 0) queryString = queryString.substring(1, queryString.length);
	
	var params = queryString.split('&');
	var i;
	for(i=0; i<params.length;i++)
	{
		var param = params[i];
		var paramParts = param.split('=');
		var paramName = paramParts[0];
		var paramValue = paramParts[1];
		if(paramName == parameterName) return paramValue;
	}
	
	return null;
}


function CommandResult(code, text, error)
{
	this.httpStatusCode = code;
	this.outputText = text;
	this.errorOccured = error;
}

function ExecuteCommandOnServer(commandName, parameters, clientCallBack)
{
    // create message
	var xmlDoc = CreateXmlDocument();
	var commandNode = xmlDoc.createElement('command');
	var nameAttribute = xmlDoc.createAttribute('name');
	nameAttribute.value = commandName;
	commandNode.attributes.setNamedItem(nameAttribute);
	xmlDoc.appendChild(commandNode);
	var parametersNode = xmlDoc.createElement('parameters');
	commandNode.appendChild(parametersNode);
	if(parameters != null)
	{
		var contentNode = null;
		if(typeof(parameters) == 'string')
		{			
			contentNode = xmlDoc.createTextNode(parameters);
		}
		else
		{
			var nodeToImport = parameters.documentElement ? parameters.documentElement : parameters;
		 	contentNode = nodeToImport;
		}
		if(contentNode != null) {
		    try {
		    var cl = contentNode.cloneNode(true);
		        // parametersNode.appendChild(contentNode);
		        parametersNode.appendChild(cl); // fix because W3C DOM Recomm. doesn't allow to copy a node from a root to another ... or something like that :) ... U have 2 clone it first
		    }catch(err) {
		    }
		} else {
		}
	}
	var commandMessage = XmlToString(xmlDoc);
	
	
	// send message
	var rnd = Math.random();
	var url = '/PortalServices/ClientCommandProcessor.aspx?cid='+GetUrlParameter('cid')+'&rnd='+rnd;
	SendHttpRequest(url, 'POST', true, 'text/xml', commandMessage, function (xmlHttp) { OnServerCommandResponse(xmlHttp, clientCallBack); } );
}

function OnServerCommandResponse(xmlHttp, clientCallBack)
{        
    var errorOccured = false;
    var respText = xmlHttp.responseText;
    
    if(xmlHttp.status == 200)
	{				
	    var xmlDoc = CreateXmlDocument(xmlHttp.responseText);	
		for(var i=0;i<xmlDoc.documentElement.childNodes.length;i++)
		{			
			var node = xmlDoc.documentElement.childNodes.item(i);
			
			if(node.nodeName == 'responsetext')
			{		
			    var errorFlag = node.attributes.getNamedItem('error').value; 
				errorOccured = errorFlag == "true";
				textNode = node.firstChild;
				respText = textNode == null ? '' : (node.textContent ? node.textContent : textNode.nodeValue);

			    /*		
				var j;
				for(j=0;j<node.childNodes.length;j++)
				{
					if(node.childNodes.item(j).nodeType == 3)
					{
						respText = node.childNodes.item(j).textContent;
						var errorFlag = node.attributes.getNamedItem('error').value; 
						errorOccured = errorFlag == "true";
																
						break;
					}
				}
				*/				
			}
			else if(node.nodeName == 'clientinstructions') ProcessClientInstructionsXML(node);
		}				
	}
	
	var result = new CommandResult(xmlHttp.status, respText, errorOccured);
	
	if(clientCallBack != null) clientCallBack(result);
}



function ProcessClientInstructionsXML(node)
{
	var i;
	for(i=0;i<node.childNodes.length;i++)
	{
		var instructionNode = node.childNodes.item(i);
		if(instructionNode.nodeName == 'instruction')
		{
			eval(instructionNode.childNodes[0].nodeValue);
		}
	}
}

var UrlPopupWin = null;

function OpenUrlInPopupWindow(url, width, height, windowName)
{
   if(windowName == null) windowName = 'popurl';
   if (width==0) width=630;
   if (height==0) height=420;
        
   var params = "width=" + width + ",height=" + height + ",resizable=1,scrollbars=1,status=0";
   if ( UrlPopupWin != null )
	{
        if ( UrlPopupWin.closed )
		{
        	UrlPopupWin = null;
	    	UrlPopupWin = window.open( url, windowName, params );
    	}
		else
		{
	    	if ( UrlPopupWin.name != windowName )
			{
				UrlPopupWin.close();
				UrlPopupWin = null;
		    	UrlPopupWin = window.open( url, windowName, params );
	    	}
			else
			{
	    		UrlPopupWin.focus();
	    		if(width != 0 && height != 0) UrlPopupWin.resizeTo(width, height);	    		
	    		UrlPopupWin.location.href = url;
	    	}
		}
    }
	else
	{
       	UrlPopupWin = window.open( url, windowName, params );
	}
}

function OpenLiteracy(path)
{
	ExecuteCommandOnServer('OpenLiteracy', path, function(resp) {
	    if(resp.httpStatusCode == 200) window.location.href = '/Player/default.aspx?cid=' + GetUrlParameter('cid'); });
	    
}

// this hack ensures that there will be always a __doPostback function even if a page is xhtml
// and the browser does not parse scripts on it (mostly firefox)

function PostbackFunctionHack()
{
	if(!self.__doPostBack) __doPostBack = NewPostBackFn;	
}

function NewPostBackFn(eventTarget, eventArgument) 
{
    var theform;
	if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
		theform = document.getElementById('Form1');
		if(theform == null) theform = document.getElementById('form1');
	}
	else {
		theform = document.Form1;
	}
	theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
	theform.__EVENTARGUMENT.value = eventArgument;
	theform.submit();
}

//addListener(window, 'load', function()  { PostbackFunctionHack(); });
PostbackFunctionHack();





/*  Literacy menu scripts */

var oldliteracyid;
var oldliteracyheaderid;
var oldliteracyheaderstyle;
var oldimageid;
var oldimagesrc;
var selectedProgramList = new Array(0);

function CloseAllLiteracyMenuItem() {
 var divs = document.getElementsByTagName('table');
 var i;
 for(i=0;i<divs.length;i++) { var name = divs[i].getAttribute('name'); if(name=='literacymenu') divs[i].style.display = 'none'; }
}

var folderHeight;

function ToggleFolder(folderid)
{
		
	var folderItemsId = folderid+'_items';
	var folderItems = document.getElementById(folderItemsId);
		
	var visible = folderItems.style.display == 'block' || folderItems.style.display == '';
	if(visible) folderItems.style.display = 'none';
	else folderItems.style.display = 'block';

	/*
		
	var visible = folderItems.style.display == 'block' || folderItems.style.display == '';
	if(folderItems.offsetHeight > 1)
	{
		folderHeight = folderItems.offsetHeight;
		//alert(folderHeight);
		folderItems.style.overflow = "hidden";
		//new Effect.BlindUp(folderItemsId, {duration: 3});
		new Rico.Effect.Size( folderItemsId, null, 1, 500, 10);
		//folderItems.style.display = 'none';
	}
	else
	{
		//new Effect.BlindDown(folderItemsId, {duration: 3});
		folderItems.style.display = 'block';
		var h = folderItems.offsetHeight;
		folderItems.style.height = 1;
		
		new Rico.Effect.Size( folderItemsId, null, 200, 500, 10, {complete:function() { folderItems.style.overflow = "visible"; }} );
		//folderItems.style.overflow = "visible";
		//folderItems.style.display = 'block';
	}
	*/
	
	return false;	
}

function ToggleLiteracy(literacyid, headerid, imgid) {
 var visible = document.getElementById(literacyid).style.display == 'block';

	var open = true;
	if(oldliteracyid != null && oldliteracyid == literacyid && document.getElementById(oldliteracyid).style.display == 'block' ) open = false;
	if(oldliteracyid != null) document.getElementById(oldliteracyid).style.display = 'none';
	if(oldliteracyheaderid != null) document.getElementById(oldliteracyheaderid).className = oldliteracyheaderstyle;
	if(oldimageid != null) document.getElementById(oldimageid).src = oldimagesrc;
	if(open) {
	var img = document.getElementById(imgid);
	oldimageid = imgid;
	oldimagesrc = img.src;
		
	var imgpath = img.src.substring(0, img.src.lastIndexOf('/')+1);			
	var imgname = img.src.substring(imgpath.length, img.src.length);
	var newimgname = imgname.substring(0,imgname.lastIndexOf('.')) + '_sel' + imgname.substring(imgname.lastIndexOf('.'), imgname.length);

	img.src = imgpath + newimgname;	

	document.getElementById(literacyid).style.display = 'block';
	oldliteracyid = literacyid;
	var header = document.getElementById(headerid);
	oldliteracyheaderstyle = header.className;
	header.className = 'literacymenu_selecteditem';
	oldliteracyheaderid = headerid; }
 return false;
}


function ToggleCheckBox(img , gvb) {
	var imgpath = img.src.substring(0, img.src.lastIndexOf('/')+1);
	var imgname = img.src.substring(imgpath.length, img.src.length);
	
	var newimgname;
	if(imgname=='checked.gif') {
		newimgname = 'unchecked.gif';
		removeProgramFromList(gvb);
	}
	else {
		newimgname='checked.gif';
		addProgramToList(gvb);
	}
	img.src=imgpath+newimgname;
}

function addProgramToList(program) {
	var index = 0;
	var newList = new Array(selectedProgramList.length + 1);
	for (prog in selectedProgramList){
		newList[index] = selectedProgramList[prog];
		index++;
	}
	newList[index] = program;
	selectedProgramList = newList;
}

function removeProgramFromList(program) {
	var index = 0;
	var newList = new Array(selectedProgramList.length -1);
	for (prog in selectedProgramList){
		if(selectedProgramList[prog] != program){
			newList[index] = selectedProgramList[prog];
			index++;
		}
	}
	selectedProgramList = newList;
}

function getProgramList() {
	return selectedProgramList.join(';');
}




function CancelEvent(e)
{
	e.returnValue = false; // IE	
	if(e.preventDefault) e.preventDefault(); // firefox
}

/*
	*************************************************************************************
		TextBox utilities
	*************************************************************************************
	
*/

var TextBoxUtilities = new TextBoxUtilitiesClass();

function TextBoxUtilitiesClass()
{
    this.cursorPosInTextBoxes = new Array();
	this.selectedSuggestedItem = -1;
	this.suggestCallAllowed = true;
	
	this.KEY_BackSpace = 8;
	this.KEY_Tab = 9;
	this.KEY_Enter = 13;
	this.KEY_Shift = 16;
	this.KEY_Control = 17;
	this.KEY_Alt = 18;
	this.KEY_Pause = 19;
	this.KEY_CapsLock = 20;
	this.KEY_Escape = 27;
	this.KEY_Space = 32;
	this.KEY_PageUp = 33;
	this.KEY_PageDown = 34;
	this.KEY_End = 35;
	this.KEY_Home = 36;
	this.KEY_Left = 37;
	this.KEY_Up = 38;
	this.KEY_Right = 39;
	this.KEY_Down = 40;
	this.KEY_PrintScreen = 44;
	this.KEY_Delete = 46;
	this.KEY_F1 = 112;
	this.KEY_F2 = 113;
	this.KEY_F3 = 114;
	this.KEY_F4 = 115;
	this.KEY_F5 = 116;
	this.KEY_F6	= 117;
	this.KEY_F7 = 118;
	this.KEY_F8 = 119;
	this.KEY_F9 = 120;
	this.KEY_F10 = 121;	
	this.KEY_F11 = 122;
	this.KEY_F12 = 123;
	
	this.KEY_0 = 48;
	this.KEY_1 = 49;
	this.KEY_2 = 50;
	this.KEY_3 = 51;
	this.KEY_4 = 52;
	this.KEY_5 = 53;
	this.KEY_6 = 54;
	this.KEY_7 = 55;
	this.KEY_8 = 56;
	this.KEY_9 = 57;
	
	this.KEY_NUM0 = 96;
	this.KEY_NUM1 = 97;
	this.KEY_NUM2 = 98;
	this.KEY_NUM3 = 99;
	this.KEY_NUM4 = 100;
	this.KEY_NUM5 = 101;
	this.KEY_NUM6 = 102;
	this.KEY_NUM7 = 103;
	this.KEY_NUM8 = 104;
	this.KEY_NUM9 = 105;
}

TextBoxUtilitiesClass.prototype.SelectTextRange = function(txtBox, begin, end)
{
	txtBox.focus();
	if(txtBox.selectionStart == undefined) // IE
	{
		var range = txtBox.createTextRange();
		range.moveStart("character", begin);
		range.moveEnd("character", end - txtBox.value.length);
		range.select();
	}
	else // FF
	{
		txtBox.setSelectionRange(begin,end);
	}
}

TextBoxUtilitiesClass.prototype.GetCaretPosition = function (txtBox)
{    
	if(txtBox.selectionStart != undefined) // FF
	{	    
		return txtBox.selectionStart;
	}
	else // IE
	{
		txtBox.focus ();
		var sel = document.selection.createRange ();
		sel.moveStart ('character', -txtBox.value.length);
		var caretPos = sel.text.length;
		
		return caretPos;
	}
}

TextBoxUtilitiesClass.prototype.SetCaretPosition = function (txtBox, pos)
{    
	if(txtBox.setSelectionRange != undefined) // FF
	{	    
		txtBox.setSelectionRange(pos, pos);
	}
	else // IE
	{
		txtBox.focus ();
		var range = txtBox.createTextRange(); 
		range.move("character", pos); 
        range.select();
	}
}

TextBoxUtilitiesClass.prototype.ApplyNumberFilter = function (e)
{
	if (!(
		(this.KEY_0 <= e.keyCode && e.keyCode <= this.KEY_9)
		|| (this.KEY_NUM0 <= e.keyCode && e.keyCode <= this.KEY_NUM9)
		|| e.keyCode == this.KEY_Delete 
		|| e.keyCode == this.KEY_BackSpace
		|| e.keyCode == this.KEY_Home
		|| e.keyCode == this.KEY_End
		|| e.keyCode == this.KEY_Left
		|| e.keyCode == this.KEY_Right
		|| e.keyCode == this.KEY_Tab ))
	{			
		e.returnValue = false; // IE	
		if(e.preventDefault) e.preventDefault(); // firefox
	}		
}

TextBoxUtilitiesClass.prototype.RegisterEnterButton = function(textBoxID, buttonID)
{
	// TODO: test this
	var txtBox = document.getElementById(textBoxID);
	if(txtBox != null) txtBox.onkeydown += function(buttonID, event) { TextboxUtilities.CheckEnter(buttonID, event); };
}

TextBoxUtilitiesClass.prototype.CheckEnter = function (buttonID, e)
{		
	if (e.keyCode == this.KEY_Enter)
	{
		//e.returnValue = false;
		//e.cancel = true;
		CancelEvent(e);
		var ctrlBtn = document.getElementById(buttonID);
		if (ctrlBtn)
		{
			if((ctrlBtn.onclick)==null)
			{
				eval(ctrlBtn.href);
			}
			else
			{	
				(ctrlBtn.onclick)();
			}
		}
	}
} 

/* mode can be 'text', 'word', 'typeahead', 'none' */
TextBoxUtilitiesClass.prototype.SuggestInput = function (id, mode, commandName, minChars, e)
{       
    if(!this.suggestCallAllowed) return;
    
	var txtBox = e.target == undefined ? e.srcElement : e.target;	
		
	var cursorPos = this.GetCaretPosition(txtBox);
	this.cursorPosInTextBoxes[txtBox.id] = cursorPos;
		
	var wordBegin = this.GetCurrentWordBeginIndex(txtBox);	
		
	if(cursorPos - wordBegin < minChars)
	{
		this.HideSuggestions(id, e);
		return;
	}
	
	// variables used in the callback functions
	var t = this;	
		
	var callbackFn = null;		
	var textToComplete = null;	
		
	if(mode == 'Text')
	{			
	    textToComplete = txtBox.value;
		callbackFn = function(commandResponse) {
		    if(commandResponse.httpStatusCode == 200)
		    {
			    var response = commandResponse.outputText;
			    //alert('_'+response+'_');			
			    if(response == null || response == '')
			    {
				    t.HideSuggestions(id, e);
			    }
			    else
			    {			        
				    var popupDiv = t.CreateAutoCompletePopupDiv(id, txtBox);
				    popupDiv.innerHTML = response;
				    popupDiv.style.display = 'block';
    				
				    t.selectedSuggestedItem = 0;
				    t.SelectSuggestion(id, 0, e);
				    popupDiv.scrollTop = 0;
			    }
		    }
		    else // error
		    {
			    alert(commandResponse.errorOccured);
		    }				
	    };
	}
	else if(mode == 'Word')
	{
		textToComplete = this.GetCurrentWord(txtBox);
		
		callbackFn = function(commandResponse) {
		    if(commandResponse.httpStatusCode == 200)
		    {
			    var response = commandResponse.outputText;			
			    if(response == null || response == '')
			    {
				    t.HideSuggestions(id, e);
			    }
			    else
			    {			        
				    var popupDiv = t.CreateAutoCompletePopupDiv(id, txtBox);
				    popupDiv.innerHTML = response;
				    popupDiv.style.display = 'block';
				    
				    for(var i=0;i<popupDiv.childNodes.length;i++)
				    {
				        var child = popupDiv.childNodes[i];
				        if(child.nodeType == 1 && child.tagName == 'DIV')
				        {	
				            addListener(child, 'click',			            
				                function(event) { TextBoxUtilities.SelectSuggestedWordWithMouse(id,mode,event); });
				        }
				    }
				    
				    if(popupDiv.childNodes.length > 10)
				    {
				        popupDiv.style.overflow = 'scroll';
				        popupDiv.style.height = '260px';
				    }
				    else
				    {
				        popupDiv.style.overflow = 'auto';
				        popupDiv.style.height = 'auto';
				    }
    			
				    t.selectedSuggestedItem = 0;
				    t.SelectSuggestion(id, 0, e);
				    popupDiv.scrollTop = 0;
			    }
		    }
		    else // error
		    {
			    //alert(commandResponse.errorOccured);
			    alert(commandResponse.outputText);
		    }
		};
	}
	else if(mode == 'typeahead')
	{
		//TODO: implement
	}
	
	if(textToComplete != null)
	{
	    this.suggestCallAllowed = false;
	    
	    var paramXml = CreateXmlDocument();	    
	    var paramsNode = paramXml.createElement('data');
	    paramXml.appendChild(paramsNode);
	    CreateChildNode(paramsNode, 'word', textToComplete);
	    CreateChildNode(paramsNode, 'customparam', txtBox.getAttribute('completeparam'));
	    
	    ExecuteCommandOnServer(commandName, paramXml, function(commandResponse) {
	        t.suggestCallAllowed = true;
	        if(callbackFn != null) callbackFn(commandResponse);
	    });
	}
}

TextBoxUtilitiesClass.prototype.CreateAutoCompletePopupDiv = function(id, txtBox)
{    	
/*
	//alert(e.srcElement);
	//alert(e.target);
	var txt = '';
	for(var m in e) txt += m + ',';
	alert(txt);
	
	alert(e.srcElement);
	var txtBox = e.target == undefined ? e.srcElement : e.target;	
	*/
	
	var popupDiv = document.getElementById(id);
	
	if(popupDiv == null)
	{
		popupDiv = document.createElement('div');
		CreateAttribute(popupDiv, 'id', id);
		CreateAttribute(popupDiv, 'class', 'SelectedSuggestionsDiv');
		CreateAttribute(popupDiv, 'txtboxid', txtBox.getAttribute('id'));		
		popupDiv.style.zIndex = 10000;
		document.getElementsByTagName('body')[0].appendChild(popupDiv);		
	}
	else
	{
		popupDiv.innerHTML = '';
	}
	
	popupDiv.style.visibility = 'visible';
			
	var leftPosition = 0;
	var topPosition = 0; 
	var node = txtBox;
    while(node.tagName != "BODY") {
        leftPosition += node.offsetLeft;
        topPosition += node.offsetTop;
        node = node.offsetParent;
    }
    topPosition += txtBox.offsetHeight;
    
    popupDiv.style.left = leftPosition;
    popupDiv.style.top = topPosition;
        
	return popupDiv;	
}

TextBoxUtilitiesClass.prototype.OnKeyUp = function (id, mode, completeCommandName, minChars, e)
{
    if(window.event) e = window.event;            
		
	if (e.keyCode == this.KEY_Enter)
	{
		CancelEvent(e);
		this.HideSuggestions(id, 0);
	}
	else if (!(e.keyCode == this.KEY_Escape
	    || e.keyCode == this.KEY_Up 
	    || e.keyCode == this.KEY_Down 
	    || e.keyCode == this.KEY_PageUp 	  
	    || e.keyCode == this.KEY_PageDown	    
	    || e.keyCode == this.KEY_Control
	    || e.keyCode == this.KEY_Alt
	    || e.keyCode == this.KEY_Shift
	    || e.keyCode == this.KEY_CapsLock
	    || e.keyCode == this.KEY_Tab
	    || e.keyCode == this.KEY_Home
	    || e.keyCode == this.KEY_End
	    || e.keyCode == this.KEY_Insert
	    || e.keyCode == this.KEY_Left
	    || e.keyCode == this.KEY_Right
	    ))
	{
		this.SuggestInput(id, mode, completeCommandName, minChars, e);
	}
}

TextBoxUtilitiesClass.prototype.SelectSuggestedWordWithMouse = function (id, mode, e)
{
    if(window.event) e = window.event;
    
    CancelEvent(e);
        
    var div = e.target == undefined ? e.srcElement : e.target;
    var popupDiv = document.getElementById(id);
    var newValue = div.innerHTML;
            
    this.CompleteWord(id, newValue, mode);
}

TextBoxUtilitiesClass.prototype.OnKeyDown = function (id, mode, enterCommandButtonID, e)
{
    if(window.event) e = window.event;
    
    var txtBox = e.target == undefined ? e.srcElement : e.target;
        
	if (e.keyCode == this.KEY_Enter)
	{		
		CancelEvent(e);
		
		var popupDiv = document.getElementById(id);
		if(popupDiv == null || popupDiv.style.display != 'block')
		{
			// apply command on enter
			var ctrlBtn = document.getElementById(enterCommandButtonID);
			if (ctrlBtn)
			{
				if((ctrlBtn.onclick)==null)
				{
					eval(ctrlBtn.href);
				}
				else
				{	
					(ctrlBtn.onclick)();
				}
			}
		}
		else // complete word
		{		    
			var newValue = popupDiv.childNodes[this.selectedSuggestedItem].innerHTML;
		    this.CompleteWord(id, newValue, mode);
		}
	}
	else if (e.keyCode == this.KEY_Up)
	{
		CancelEvent(e);
		
		this.SelectSuggestion(id, -1, e);
	}
	else if (e.keyCode == this.KEY_Down)
	{
		CancelEvent(e);
		
		this.SelectSuggestion(id, +1, e);
	}
	else if (e.keyCode == this.KEY_PageUp)
	{
		CancelEvent(e);
		
		this.SelectSuggestion(id, -10, e);
	}
	else if (e.keyCode == this.KEY_PageDown)
	{
		CancelEvent(e);
		
		this.SelectSuggestion(id, +10, e);
	}	
	else if (e.keyCode == this.KEY_Home)
	{
		//CancelEvent(e);
					  
		this.SelectSuggestion(id, -1 * this.selectedSuggestedItem, e);
	}
	else if (e.keyCode == this.KEY_End)
	{
		//CancelEvent(e);
		
		var popupDiv = document.getElementById(id);
		var items = popupDiv.childNodes;
		this.SelectSuggestion(id, items.length-this.selectedSuggestedItem-1, e);
	}	
	else if (e.keyCode == this.KEY_Escape)
	{
		CancelEvent(e);
		
		this.HideSuggestions(id, 0);	
		txtBox.focus();
	}
}

TextBoxUtilitiesClass.prototype.CompleteWord = function (id, newValue, mode)
{
    var popupDiv = document.getElementById(id);
    var txtBox = document.getElementById(popupDiv.getAttribute('txtboxid'));    
    
    var newValue = newValue.replace('&nbsp;', ' ');
	if(newValue.indexOf(' ') >= 0) newValue = '"' + newValue + '"';
			    
	if(mode == 'Text')
	{
		txtBox.value = newValue;
		this.HideSuggestions(id, 0);
	}
	else if(mode == 'Word')
	{
		this.SetCurrentWord(txtBox, newValue);
		this.HideSuggestions(id, 0);
	}		
}


TextBoxUtilitiesClass.prototype.GetCurrentWord = function (txtBox)
{
    var textBoxText = txtBox.value;
	var wordBeginIndex = this.GetCurrentWordBeginIndex(txtBox);
	var wordEndIndex = this.GetCurrentWordEndIndex(txtBox);
					
	var currentWord = textBoxText.substring(wordBeginIndex, wordEndIndex);
	
	return currentWord;
}

TextBoxUtilitiesClass.prototype.SetCurrentWord = function (txtBox, newValue)
{
    var wordBeginIndex = this.GetCurrentWordBeginIndex(txtBox);
	var wordEndIndex = this.GetCurrentWordEndIndex(txtBox);
	var textBoxText = txtBox.value;
			
	var txt1 = textBoxText.substring(0, wordBeginIndex);
	var txt2 = textBoxText.substring(wordEndIndex, textBoxText.length);
		
	if(txt1.length > 0 && txt1.charAt(txt1.length-1) == '"') txt1 = txt1.substring(0,txt1.length-1);
	
	txtBox.value = txt1 + newValue + txt2;
	
	txtBox.focus();
	this.SetCaretPosition(txtBox, wordBeginIndex + newValue.length);
}


TextBoxUtilitiesClass.prototype.GetCurrentWordBeginIndex = function (txtBox)
{	
	var textBoxText = txtBox.value;
	//var currentCaretPos = this.GetCaretPosition(txtBox);
	var currentCaretPos = this.cursorPosInTextBoxes[txtBox.id];
	
	
	var quoteCount = 0;
	
	var index = currentCaretPos - 1;
	while(index >= 0)
	{
		if(textBoxText.charAt(index) == '"') quoteCount++;
		index--;
	}
	
	var wordBeginIndex = currentCaretPos - 1;
		
	if(quoteCount == 0 || quoteCount % 2 == 0) //even
	{	
		while(wordBeginIndex >= 0)
		{
			if(this.IsWordSeparatorCharacter(textBoxText.charAt(wordBeginIndex))) break;
			wordBeginIndex--;
		}
		if(wordBeginIndex + 1 < textBoxText.length) wordBeginIndex++;
	}
	else // odd
	{
		while(wordBeginIndex >= 0)
		{
			if(textBoxText.charAt(wordBeginIndex) == '"') break;
			wordBeginIndex--;
		}
		if(wordBeginIndex + 1 < textBoxText.length) wordBeginIndex++;		
	}
	
	return wordBeginIndex;
}

TextBoxUtilitiesClass.prototype.GetCurrentWordEndIndex = function (txtBox)
{
	/*
	var cursorPos = this.GetCaretPosition(txtBox);		
	var textBoxText = txtBox.value;
	var currentCaretPos = this.GetCaretPosition(txtBox);

	var wordEndIndex = currentCaretPos;
	while(textBoxText.charAt(wordEndIndex) != ' ' && textBoxText.charAt(wordEndIndex) != '"' && wordEndIndex < textBoxText.length) wordEndIndex++;
	
	return wordEndIndex;
	*/
    
    //var cursorPos = this.GetCaretPosition(txtBox);    
    
	var textBoxText = txtBox.value;
	
	//var currentCaretPos = this.GetCaretPosition(txtBox);
	var currentCaretPos = this.cursorPosInTextBoxes[txtBox.id];
	
	
	var quoteCount = 0;
	
	var index = currentCaretPos;
	while(index < textBoxText.length)
	{
		if(textBoxText.charAt(index) == '"') quoteCount++;
		index++;
	}
	
	var wordEndIndex = currentCaretPos;
		
	if(quoteCount == 0 || quoteCount % 2 == 0) //even
	{	
		while(wordEndIndex < textBoxText.length)
		{
			if(this.IsWordSeparatorCharacter(textBoxText.charAt(wordEndIndex))) break;
			wordEndIndex++;
		}
		if(wordEndIndex < 0 && wordEndIndex != textBoxText.length - 1) wordEndIndex--;
	}
	else // odd
	{
		while(wordEndIndex < textBoxText.length)
		{
			if(textBoxText.charAt(wordEndIndex) == '"') break;
			wordEndIndex++;
		}
		if(wordEndIndex > 0 && wordEndIndex != textBoxText.length - 1) wordEndIndex--;
	}
	
	return wordEndIndex;
}

TextBoxUtilitiesClass.prototype.IsWordSeparatorCharacter = function (character)
{
	var ret = false;
	
	switch(character)
	{
		case ' ':
			ret = true;
			break;
		case '\t':
			ret = true;
			break;
		case ',':
			ret = true;
			break;
		case ';':
			ret = true;
			break;
		default:
			ret = false;
			
	}
	
	return ret;
}

TextBoxUtilitiesClass.prototype.SelectSuggestion = function (id, relativePos, e)
{	
	var popupDiv = document.getElementById(id);	
	var items = popupDiv.childNodes;
	
	var index = this.selectedSuggestedItem + relativePos;
	
	if(index < 0) index = 0;
	else if(index > items.length-1) index = items.length-1;
	
	if(relativePos == 0 || index != this.selectedSuggestedItem)
	{
		for(var i=0;i<items.length;i++)
		{
			var suggestedTextDiv = items[i];
						
			if(i == index)
			{
				suggestedTextDiv.className = "SelectedSuggestedText";		
				if(suggestedTextDiv.offsetTop + suggestedTextDiv.offsetHeight >= popupDiv.clientHeight + popupDiv.scrollTop) popupDiv.scrollTop = suggestedTextDiv.offsetTop - popupDiv.clientHeight + suggestedTextDiv.offsetHeight + 2;
				else if(suggestedTextDiv.offsetTop < popupDiv.scrollTop) popupDiv.scrollTop = suggestedTextDiv.offsetTop;
			}
			else
			{
			    if(i%2==0) suggestedTextDiv.className = "SuggestedText";
			    else suggestedTextDiv.className = "SuggestedTextAlternate";
			}
		}
		this.selectedSuggestedItem = index;
	}
}

TextBoxUtilitiesClass.prototype.HideSuggestions = function (id, e)
{
	var popupDiv = document.getElementById(id);
	if(popupDiv != null) popupDiv.style.display = 'none';
}

	
	
function isNumber(num)
{
   var ValidChars = "0123456789";
   var IsNum=true;
   var curr_char;
 
   for (i = 0; i < num.length && IsNum == true; i++)      
   { 
   		if (ValidChars.indexOf(num.charAt(i)) == -1) IsNum = false;
   }
   return IsNum;  
}


function GetSelectedItemsOfSelect(selectControl)
{
    //HACK
    if(selectControl.tagName != 'SELECT') selectControl = selectControl.getElementsByTagName('select')[0];
    var selectedItems = [];
    for(var i=0;i<selectControl.options.length;i++)
    {
        var currentItem = selectControl.options[i];
        if(currentItem.selected) selectedItems[selectedItems.length] = currentItem.value;
    }
    
    return selectedItems;
}

function SetSelectedItemOfSelect(selectControl, value)
{
    //HACK
    if(selectControl.tagName != 'SELECT') selectControl = selectControl.getElementsByTagName('select')[0];
    
    for(var i=0;i<selectControl.options.length;i++)
    {
        var currentItem = selectControl.options[i];
        currentItem.selected =  (currentItem.value == value);        
    }        
}


function WriteHtml(text)
{
    var pos = document;
    while (pos.lastChild.nodeType == 1) pos = pos.lastChild;
    pos.parentNode.appendChild(document.createTextNode(text));
    alert(text);

}
