var tabCon = [];
var conColorActive = "#FFFFFF";
var conColorNotActive = "#444444";
var tabPages = [];
var visibleTabPages = [];
var tabActive = [];
var activeTab;
var numberOfTabs = 0;
var numberOfVisibleTabs = 0;
var visibleTabCon = [];
var oldTab;
var first = true;
var mctabs = false;

function initTabs()
{
	try
	{
		tabCon = getElementsByClassName("Con", "span");

		if (tabCon.length == 0) 
		{
			tabCon = getElementsByClassName("tabhead", "a");
		
			if (tabCon.length != 0) mctabs = true;
		}

		if (tabCon.length > 0)
		{
			tabPages = getElementsByClassName("Tab", "div");
				
			if (tabPages.length == 0) 
			{
				tabPages = getElementsByClassName("panel", "div");	

				var tabConTmp = [];

				for (var i = 0; i < tabPages.length; i++)
				{
					for (var j = 0; j < tabCon.length; j++)
					{
						if (tabCon[j].getAttribute("panelid") == tabPages[i].id) tabConTmp[i] = tabCon[j];
					}
				}

				tabCon = tabConTmp;
			}
	
			numberOfTabs = tabPages.length;
			numberOfVisibleTabs = 0;
			if(numberOfTabs > 0)
			{
				var tabConI;
				var tabPagesI;
	
				for (i = 0; i < numberOfTabs; i++)
				{
					tabCon[i].label = tabCon[i].innerHTML;
					tabConI = tabCon[i];
					tabPagesI = tabPages[i];
	
					if (!mctabs)
					{	
						tabConI.className   = "disabledCon";
						tabPagesI.className = "disabledTab";
					}
	
					// Als de tab zichtbaar is, voeg toe aan lijst met zichtbare tabs
					if(tabConI.style.display != "none")
					{
						visibleTabCon[numberOfVisibleTabs]   = tabConI;
						visibleTabPages[numberOfVisibleTabs] = tabPagesI;
						numberOfVisibleTabs++
					}
				}
	
				activeTab = 0;
				var limit = 100;
				while(activeTab < limit && ((activeTab < numberOfVisibleTabs) && (visibleTabCon[activeTab].style.display == "none")))
				{
					activeTab++;
				}
	
				activeTabOld = -1;
				
				if (!mctabs)
				{
					visibleTabCon[activeTab].className   = "enabledCon";
					visibleTabPages[activeTab].className = "enabledTab";
				}
	
				updateConNumbersOnVisibleTabs();
			}
		}
	}
	catch(e) {alert(3 +"\n"+ e.message);}
}

function switchThis(event)
{
	var item 		= null;

	try
	{
		event 		= getEvent(event);
		item 		= getElement(event);
	}
	catch (e1) 
	{
		try
		{
			item	= window.event.srcElement;
		}
		catch (e2) {}
	}

	if (item != null)
	{
		var ih = item.innerHTML;

		try
		{
			if (ih.substring(0, 1) != "<") ih = item.parentNode.innerHTML; // Voor het geval er op het tabnummer wordt geklikt
		}
		catch (e) {}

		var z = 0;
		var tc;
		var f = 0;

		for(t = 0; t < tabCon.length; t++)
		{
			tc = tabCon[t];
			if (tc.innerHTML == ih) f = z;
			if (tc.style.display != "none" && tc.style.visibility != "hidden") z++;
		}

		switchTo(f);
	}
}

function switchTabToField(item)
{
	var found	= false;
	var tab		= null;
	var fields	= null;
	var found 	= false;
	var l		= null;
	
	for (t = 0; !found && t < numberOfVisibleTabs; t++)
	{
		tab		= visibleTabPages[t];
		fields	= tab.getElementsByTagName("input");
		l		= fields.length;
		
		for (f = 0; !found && f < l; f++)
		{
			if (fields[f].id == item.id)
			{
				found	= true;
				switchTo(t);
				item.focus();					
			}
		}
	}
	
	return found;
}

function switchTo(ctab, vt,k)
{
	try
	{
		var ok = true;
    	try{ok = specificBeforeTabSwitch(ctab);}catch(e){}
    	try{ctab = specificSwitchTo(ctab);}catch(e){}
    	try{if(!vt) {ctabTemp = ctab; vt = checkTab(ctab); ctab=ctabTemp;}} catch(e){vt = true;}

		if(ctab >= 0 && ctab < numberOfVisibleTabs && vt && ok)
    	{
			oldTab = activeTab;
			activeTab = ctab;
			
			switchTab(oldTab, activeTab);
    	}
    }
    catch (e) {alert(4 +"\n"+ e.message);}
}

function switchTab(oldTab, newTab)
{
	$("#suggestValues").hide();
	
	var tabElements = visibleTabPages[newTab].getElementsByTagName("IFRAME");
	var tel 		= tabElements.length;
	var te;

	for (i = 0; i < tel; i++)
	{
		te = tabElements[i];

		if (te.getAttribute("postponesrc") != null)
		{
			te.setAttribute("src", te.getAttribute("postponesrc"));
			te.removeAttribute("postponesrc");
		}
	}

	if (!mctabs)
	{
		visibleTabCon[oldTab].className   = "disabledCon";
		visibleTabCon[newTab].className   = "enabledCon";
		visibleTabPages[oldTab].className = "disabledTab";
		visibleTabPages[newTab].className = "enabledTab";
	}
	else
	{
		mcTabs.displayTab(getAttribute(visibleTabCon[newTab], "tabid"), getAttribute(visibleTabCon[newTab], "panelid"));
	}

	gotoFirst();
	
	if (oldTab != newTab) 
	{
		updateCopys();
		try{updateAfterTabSwitch();}catch(e){}
	}
}

function getCompElements()
{
	var tags = document.all || document.getElementsByTagName('*');
	var tagsl = tags.length;
	var compTags = [];
	j = 0;

	for(i = 0; i < tagsl; i++)
	{
		if(tags[i].getAttribute("comp"))
		{
			compTags[j] = tags[i];
			j++;
		}
  	}
  	return compTags;
}

function showTab(con)
{
	try
	{
		if(con.style.display != "inline")
		{
			con.style.display = "inline";
			refreshTabs();
		}
	}
	catch(e){alert(5 +"\n"+ e.message);}
}

function hideTab(con)
{
	try
	{
		if(con.style.display != "none")
		{
			con.style.display = "none";
			refreshTabs();
		}
	}
	catch(e){alert(6 +"\n"+ e.message);}
}

function refreshTabs()
{
	numberOfVisibleTabs = 0;
	for (i = 0; i<numberOfTabs; i++)
	{
		// Als de tab zichtbaar is, voeg toe aan lijst met zichtbare tabs
		if(tabCon[i].style.display != "none")
		{
			visibleTabCon[numberOfVisibleTabs]   = tabCon[i];
			visibleTabPages[numberOfVisibleTabs] = tabPages[i];
			numberOfVisibleTabs++
		}
		// Maak alle tabs onzichtbaar...
		if (!mctabs) tabPages[i].className = "disabledTab";
	}
	// ... behalve deze
	if (!mctabs) {tabPages[activeTab].className = "enabledTab";}
					
	updateConNumbersOnVisibleTabs();
}

function updateConNumbersOnVisibleTabs()
{
	for (var i = 0; i<numberOfVisibleTabs; i++)
	{
		visibleTabCon[i].number = (i+1);

		var s = "in-line";
		var number = visibleTabCon[i].number + "&nbsp;";
		
		try {s = specificTabNumberStyle();} catch (e) {}
		try {number = specificTabNumber();} catch (e) {}
		
		visibleTabCon[i].innerHTML = "<font onclick=\"switchThis(event);\" style=\"display: " + s + ";\">" + number + "</font>" + visibleTabCon[i].label;
	}
}

function updateCopys()
{
	copys 		= getCompElements();
	var copysl 	= copys.length;
	iframe 		= document.getElementsByTagName("iframe");
	viewvalues 	= getElementsByClassName("viewvalue", "span");
	var cp;

	for(i = 0; i < copysl; i++)
	{
		cp 			= copys[i];
		copyField 	= cp.getAttribute("comp");

		switch (cp.tagName)
		{
			case "SPAN":
			{
				if(copyField)
				{
					if(document.forms[0].elements[copyField])
						cp.innerHTML = document.forms[0].elements[copyField].value;
					else if(window.frames[iframe[0].name].document.getElementById(copyField) != null)
						cp.innerHTML = window.frames[iframe[0].name].document.getElementById(copyField).innerHTML;
					else if(viewvalues.length > 0)
						cp.innerHTML = document.getElementById(copyField).innerHTML;
				}
				break;
			}
			case "INPUT":
			{
				if(copyField)
				{
					if (document.forms[0].elements[copyField])
						cp.value = document.forms[0].elements[copyField].value;
					else
						cp.value = window.frames[iframe[0].name].table.document.getElementById(copyField).innerHTML;
				}
			}
		}
	}
}

function gotoFirst()
{
	try {document.body.focus();} catch (e) {}

	try
	{
		var fields = null;

		try {fields			= visibleTabPages[activeTab].getElementsByTagName("input");} 
		catch (e) {fields 	= document.getElementsByTagName("input");}

		fieldsl = fields.length;
		b 		= true;
		i 		= 0;
		
		while(b)
		{
			if(fieldsl > 0 && mode != MODE_READ)
			{
			    try{var c = isContentEditable(fields[i]);}catch(e){alert(fields[i].className +"\n"+ fields[i].tagName +"\n"+ fields[i].id);}
			    if(isContentEditable(fields[i]) && isItemVisible(fields[i]))
				{
					b = false;
					fields[i].focus();
				}

				i++;
				if(fieldsl == i)
				{
					b = false;
					iframe = visibleTabPages[activeTab].getElementsByTagName("iframe");
					if(iframe.length > 0)
					{
						window.frames[iframe[0].name].focus();
					}
				}
			}
			else
			{
				b = false;
				if (mode != MODE_READ)
				{
					textarea = visibleTabPages[activeTab].getElementsByTagName("textarea");
					if(textarea.length > 0)
					{
						textarea[0].focus();
					}
				}
				else
				{
					//visibleTabPages[activeTab].focus(); // Tab focus geven in readmode anders blijft het iframe de focus houden
				}

				iframe = visibleTabPages[activeTab].getElementsByTagName("iframe");
				if(iframe.length > 0)
				{
					window.frames[iframe[0].name].focus();										
				}
			}
		}
	}
	catch(e)
	{
		try
		{
			fields = document.getElementsByTagName("input");
			fields[0].focus();
		}
		catch (e) {}
	}
}

function _focusNextElement(item, e)
{
	if(item.id && mode != MODE_READ)
	{
		var found = false;
		ok = false;
		var d = new Date();
		var oel = $("input[type!=\"hidden\"]:not(.readonly):enabled:visible, select:not(.readonly):enabled:visible, textarea:not(.readonly):enabled:visible", visibleTabPages[activeTab]);//visibleTabPages[activeTab].getElementsByTagName("*");
		
		var oel_length = oel.length;
		var el = [];
		var ti = 0;
		var oel_item;
		var tmp_oelti;
		var maxti = 0;
		
		for(var tmpi = 0; tmpi < oel_length; tmpi++)
		{
			tmp_oelti = oel[tmpi].tabIndex;
			
			if(typeof(tmp_oelti) == "undefined" || tmp_oelti == null) tmp_oelti = 0;
			
			if (tmp_oelti > maxti) maxti = tmp_oelti;
		}
		
		for(var ti = 0; ti <= maxti; ti++)
		{
			for(var i in oel)
			{
				oel_item = oel[i];
				tmp_oelti = oel_item.tabIndex;
				
				if(typeof(tmp_oelti) == "undefined" || tmp_oelti == null) tmp_oelti = 0;
				
				if(tmp_oelti == ti)
				{
					try {if (isContentEditable(oel_item) || oel_item.type == "select-one") el.push(oel_item); } catch(e){}
				}
			}
		}
		var i = 0
		var itemid = item.id;
		
		if(e.shiftKey)
		{
			el.reverse();
		}
		
		while(i < el.length && !ok)
		{
			if(found)
			{
				//if((el[i].tagName == "INPUT" || el[i].tagName == "SELECT" || el[i].tagName == "TEXTAREA") && (el[i].type == "text" || el[i].type == "password" || el[i].type == "file" || el[i].type == "textarea" || el[i].type == "select-one") && (isContentEditable(el[i]) || el[i].type == "select-one"))
				try
				{
					el[i].focus();					
					ok = true;
				}
				catch(e) {alert("Veld \"" + el[i].id + "\" is niet zichtbaar!");}
			}
			
			if(itemid == el[i].id) 
			{
				if ((i + 1) < el.length) found = true;
			}
			
			i++;
		}
		
		if(!found) gotoFirst();
	}
}

function focusNextElement(item, e)
{
	//item = the next item to focus on; NOT the current!!
	var event = e.originalEvent;
	try 
	{
		specificFocusNextElement(item, event);
	}
	catch (e1)
	{
		try
		{
			if (mode != MODE_READ && item.tagName == "INPUT")
			{
				checkItem(item);
								
				if (item.getAttribute("valid") == "false")
				{
					item.select();
					return false;
				}
	
				if (item.getAttribute("closerecord") == "true")
				{
					checkItem(item);
					saveAndClose();
					return false;
				}
				else if (item.getAttribute("nexttab") == "true")
				{
					switchTo(activeTab + 1);
					return false;
				}
				else
				{					
					switch (item.id)
					{
						case "notfound":
						{
							return false;
							break;
						}
						case getLastInputOnTab(numberOfVisibleTabs - 1).id:
						{
							checkItem(item);
							saveAndClose();
							return false;
							break;
						}
						case getLastInputOnTab(activeTab).id:
						{
							switchTo(activeTab + 1);
							return false;
							break;
						}
						default:
						{
							var ne;
							try{ne = getNextElement(item);}catch(e){}
							
							if(ne != null)
							{
								try
								{
									ne.focus();
								}
								catch(e)
								{
									_focusNextElement(item, event);
								}
							}
							else if(checkTabForm(true, false))
							{
								_focusNextElement(item, event);
							}
						}
					}
				}
			}
		}
		catch(e){}
	}
	
	return true;
}

function getLastInputOnTab(tab)
{
	var tabElements;
	
	try {tabElements = visibleTabPages[tab].getElementsByTagName("*");} catch (e) {tabElements = document.getElementsByTagName("*");}
	
	var tabEl = null;
	var r = tabElements.length - 1;
	var tabR;

	while (r >= 0 && tabEl == null)
	{
		tabR = tabElements[r];
		if (!tabR.readOnly && isItemVisible(tabR) && (tabR.tagName=="INPUT" || tabR.tagName=="TEXTAREA")) tabEl = tabR;
		r = r - 1;
	}

	if (tabEl == null && tab > 0) return "notfound"//return getLastInputOnTab(tab - 1);
	return tabEl;
}

function getTab(itemName)
{
	for (i = 0; i<visibleTabPages.length; i = i + 1)
	{
		var fields = getElementsByTagNames(visibleTabPages[i], "INPUT,TEXTAREA,SELECT");		
		var fieldsl = fields.length;
		for (j = 0; j<fieldsl; j = j + 1)
		{
			if(itemName == fields[j].id) return i;
		}
	}
}

function checkTab(ctab, showMessageOnTabSwitch)
{
	if(ctab > activeTab) // je mag wel terug in tabs maar niet voorruit voordat het tabje niet goed is ingevuld.
	{
		var valide = checkTabForm(showMessageOnTabSwitch);

		var specificValide = null;
		try{specificValide = specificTabCheck(ctab);}catch(e){}
		if(specificValide != null) valide = specificValide;

		if(valide)
		{
			try { valide = checkTabSpecial(ctab); } catch(e) {}
		}

		return valide;
	}
	else return true;
}
