var isIE = (navigator.appName == "Microsoft Internet Explorer");
var language;
var xmlHttp = null;
var xmltext = null;

var COLOR_SEPARATION_BAR="#32507B";
var COLOR_SEPARATION_TEXT="#FFFFFF";
var COLOR_NOT_SELECTABLE="#FF4040";
var COLOR_SELECTABLE="#FFFFFF";
var COLOR_SELECTED="#8DBFFE";

function getFirmwareXML()
{
  // Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
  if (typeof XMLHttpRequest != 'undefined') {
    xmlHttp = new XMLHttpRequest();
  }
  if (!xmlHttp) {
    // Internet Explorer 6 und älter
    try {
        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try {
            xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
            xmlHttp  = null;
        }
    }
  }
  if (xmlHttp) {
    xmlHttp.open('GET', '/assets/Support/firmware.xml', false);
    xmlHttp.send(null);
	  initSelection();
  }
}

/*
  <table cellpadding="0" cellspacing="0" border="0">
	  <tr>
		  <td>
*/

//var entry_count=new Array(10);
//var entry_type=new Array(10);
//var entry_select=new Array( new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10));
//var entry_modifier=new Array( new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10),new Array(10));

//var entry_modlist = new Array(100);
//var entry_modfound = new Array(100);
//var entry_modversion = new Array(100);
//var entry_modcount=0;
//var entry_addval = new Array(50);
//var entry_currentlink = new Array(50);
var InfoWindow=null;


var entry_matrix=new Array(100);
var entry_selected=new Array(20);
var entry_listbox=new Array(20);
var entry_type=new Array(100);
var entry_name=new Array(1000);


var debugwindow="";

function entry_matrix_print()
{
return;
	var matrix_size,i,j;
	
	if (debugwindow=="") debugwindow=window.open("","Debugging -- Firmware matrix display","dependent=yes");
	
	debugwindow.document.open();
	debugwindow.document.write("<table border='1'>");
	matrix_size=0;
	
	for (j=0; j<20; j++)
	{
		debugwindow.document.write("<tr>\n");
		for (i=0; i<10; i++)
		{
			if (entry_selected[j][i]==0)
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FF4040; width:50px\">"+entry_selected[j][i]+"</td>\n");
			else if (entry_selected[j][i]==-1)
				break;
			else if (entry_selected[j][i]==1)
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#40FF40; width:50px\">"+entry_selected[j][i]+"</td>\n");
			else if (entry_selected[j][i]=="none")
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FFFF40; width:50px\">"+entry_selected[j][i]+"</td>\n");
			else
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FFFFFF; width:50px\">"+entry_selected[j][i]+"</td>\n");
		}
		debugwindow.document.write("</tr>\n");
	}
	debugwindow.document.write("</table>");


	debugwindow.document.write("<table border='1'>");
	matrix_size=0;
	
	for (i=2; i<100; i++)
	{
		if (entry_matrix[1][i]==-1) break;
	}
	matrix_size=i;
	for (j=0; j<matrix_size; j++)
	{
		debugwindow.document.write("<tr>\n");
		for (i=0; i<matrix_size; i++)
		{
			if (entry_matrix[j][i]==0)
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FF4040; width:50px\">"+entry_matrix[j][i]+"</td>\n");
			else if (entry_matrix[j][i]==1)
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#40FF40; width:50px\">"+entry_matrix[j][i]+"</td>\n");
			else if (entry_matrix[j][i]==-1)
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FFFF40; width:50px\">"+entry_matrix[j][i]+"</td>\n");
			else
				debugwindow.document.write("  <td align=\"center\" style=\"background-color:#FFFFFF; width:50px\">"+entry_matrix[j][i]+"</td>\n");
		}
		debugwindow.document.write("</tr>\n");
	}
	debugwindow.document.write("</table>");
	debugwindow.document.close();
}

function entry_matrix_add(entry, fill_with)
{
	var i,j;
	for (i=2; i<100; i++)
	{
		if (entry_matrix[1][i]==entry) return;
		if (entry_matrix[1][i]==-1)
		{
			entry_matrix[1][i]=entry;
			entry_matrix[i][1]=entry;
			for (j=2; j<100; j++)
			{
				entry_matrix[j][i]=fill_with;
				entry_matrix[i][j]=fill_with;
			}
			return;
		}
	}
	alert("Firmware matrix full");
}

function entry_matrix_set(entry1, entry2, value)
{
	var i,j;
	for (i=2; i<100; i++)
	{
		if (entry_matrix[1][i]==entry1) break;
		if (entry_matrix[1][i]==-1) alert("Entry not found - unable to resolve compatibility");
	}
	for (j=2; j<100; j++)
	{
		if (entry_matrix[1][j]==entry2) break;
		if (entry_matrix[1][j]==-1) alert("Entry not found - unable to resolve compatibility");
	}
	entry_matrix[i][j]=value;
	entry_matrix[j][i]=value;
}


function entry_matrix_find_entry(entry)
{
	var i;
	for (i=2; i<100; i++)
	{
		if (entry_matrix[1][i]==entry) return i;
		if (entry_matrix[1][i]==-1)
		{
			alert("Entry not found in matrix");
			return 0;
		}
	}
}

function initSelection()
{
	while (xmlHttp.readyState < 4) {};
	xmltext=xmlHttp.responseXML;
	document.write("<table style=\"border: 0px\">\n");

	var i,j,k,sel_type,sel_name,opt_type,opt_name,opt_image, hideall_type, hide_type;
	
	// Init matrix and selections
	for (i=0; i<100; i++)
	{
		entry_matrix[i]=new Array(100);
		for (j=0; j<100; j++) entry_matrix[i][j]=-1;
	}
	entry_matrix[1][1]="-";
	for (i=0; i<20; i++)
	{
		entry_listbox[i]=0;
		entry_selected[i]=new Array(10);
		for (j=0; j<10; j++) entry_selected[i][j]=-1;
	}
	for (i=0; i<100; i++)
	{
		entry_type[i]=-1;
	}
	for (i=0; i<1000; i++)
	{
		entry_name[i]=-1;
	}
	
	for (i=0; i<xmltext.getElementsByTagName("selector").length; i++)
	{
		sel_type=xmltext.getElementsByTagName("selector")[i].getAttribute("type");
		sel_name=xmltext.getElementsByTagName("selector")[i].getAttribute("name");
		if (xmltext.getElementsByTagName("selector")[i].getAttribute("exclusive")=="yes") entry_selected[i][0]="exclusive";
		if (xmltext.getElementsByTagName("selector")[i].getAttribute("checkbox")=="yes") entry_selected[i][0]="checkbox";
		
		// Display title of selection line
		document.write("<tr style=\"background-color:"+COLOR_SEPARATION_BAR+"; color:"+COLOR_SEPARATION_TEXT+"\" height=25><td>&nbsp;&nbsp;<b>");
		document.write(sel_name);
		document.write("<\/b><\/td>\n");
		document.write("<td colspan=8 align=right>");
		document.write("<input type=button name=\"clear"+i+"\" value=\"Clear\" onclick=\"clearRow("+i+");\">&nbsp;&nbsp;");
		document.write("<\/td>\n");
		
		// Check if selection line has downloadable files (i.e. if it has a listbox). If yes, display Download-button
		if (xmltext.getElementsByTagName("selector")[i].getElementsByTagName("listbox").length>0)
		{
			document.write("<td><div align=\"center\"><a name=\"dwn"+i+"\" id=\"dwn"+i+"\" style=\"visibility:hidden;\"><img border=\"0\" src=\"/assets/Support/button_download.gif\"></a><\/div><\/td>\n");
		}
		else
		{
			document.write("<td><\/td>\n");
		}
		
		document.write("<\/tr>\n");
		document.write("<tr style=\"height: 120px\">");
		for (j=0; j<xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option").length; j++)
		{
			opt_type=xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option")[j].getAttribute("type");
			opt_name=xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option")[j].getAttribute("name");
			opt_image=xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option")[j].getAttribute("image");
			document.write("<td align=\"center\" style=\"background-color:#FFFFFF;\" id=\""+i+"_"+j+"\" onclick=selector_click("+i+","+j+");><img src=\"/assets/Support/"+opt_image+"\" );><br>"+opt_name+"<\/td>");
			entry_selected[i][j+1]="none";
			entry_matrix_add(opt_type,1);
			
			for (k=0; k<xmltext.getElementsByTagName("selector")[i].getElementsByTagName("hideall").length; k++)
			{
				hideall_type=xmltext.getElementsByTagName("selector")[i].getElementsByTagName("hideall")[k].getAttribute("type");
				entry_matrix_add(hideall_type,1);
				entry_matrix_set(opt_type, hideall_type, 0); // Set opt_type/hideall_type combination as incompatible
			}
			for (k=0; k<xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option")[j].getElementsByTagName("hide").length; k++)
			{
				hide_type=xmltext.getElementsByTagName("selector")[i].getElementsByTagName("option")[j].getElementsByTagName("hide")[k].getAttribute("type");
				entry_matrix_add(hide_type,1);
				entry_matrix_set(opt_type, hide_type, 0); // Set opt_type/hide_type combination as incompatible
			}
		}
		entry_selected[i][j+1]=-1;
		
		
		document.write("<td colspan="+(9-j)+"><\/td>\n");
		if (xmltext.getElementsByTagName("selector")[i].getElementsByTagName("listbox").length>0)
		{
			entry_selected[i][j+1]="none";
			entry_selected[i][j+2]=-1;
			entry_listbox[i]=1;
			document.write("<td><select name=\"list_"+i+"\" id=\"list_"+i+"\" onChange=\"populateList("+i+","+j+");\" class=\"controls\" size=\"8\" style=\"visibility: visible; height: 150px; width: 180px; font-size: 13px;\"></select><\/td>\n");
		}
		document.write("<\/tr>");
		document.write("<tr bgcolor=\""+COLOR_SEPARATION_BAR+"\" height=2><td colspan=10><\/td><\/tr>");
		document.write("<tr height=16><td><\/td><\/tr>");
	}
	document.write("</table>\n");
	
	
	var firm_type, firm_version, firm_matrixlabel, firm_entry;
	var comp_type, comp_version, comp_matrixlabel, add_name;
	var ignore_type;
	var entry_pos;
	
	for (i=0; i<xmltext.getElementsByTagName("firmware").length; i++)
	{
		firm_type=xmltext.getElementsByTagName("firmware")[i].getAttribute("type");
		firm_entry=xmltext.getElementsByTagName("firmware")[i].getAttribute("entry");
		firm_version=xmltext.getElementsByTagName("firmware")[i].getAttribute("version");
		firm_matrixlabel=firm_type+" V"+firm_version;
		entry_matrix_add(firm_matrixlabel,0);
		entry_type[entry_matrix_find_entry(firm_matrixlabel)]=firm_entry;
		entry_matrix_set(firm_matrixlabel, firm_type, 1);
		entry_matrix_set(firm_matrixlabel, firm_matrixlabel, 1);
		entry_name[i]=new Array(20);
		for (j=0; j<20; j++) entry_name[i][j]=-1;
		entry_name[i][0]=firm_matrixlabel;
		
		for (j=0; j<xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("additional").length; j++)
		{
			add_name=xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("additional")[j].getAttribute("name");
			entry_name[i][j+1]=add_name;
		}
		
		for (j=0; j<xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("compatibility").length; j++)
		{
			comp_type=xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("compatibility")[j].getAttribute("type");
			comp_version=xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("compatibility")[j].getAttribute("version");
			comp_matrixlabel=comp_type+" V"+comp_version;
			entry_matrix_add(comp_matrixlabel,0);
			entry_matrix_set(comp_type,firm_matrixlabel, 1);
			entry_matrix_set(comp_matrixlabel,firm_matrixlabel, 1);
		}
		for (j=0; j<xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("ignore").length; j++)
		{
			ignore_type=xmltext.getElementsByTagName("firmware")[i].getElementsByTagName("ignore")[j].getAttribute("type");
			entry_matrix_set(firm_matrixlabel, ignore_type, 1);
		}
	}
	entry_matrix_print();
}







function selector_click(row, column)
{ 
	var i;
	var opt_type, opt_name, entry;
	
	opt_type=xmltext.getElementsByTagName("selector")[row].getElementsByTagName("option")[column].getAttribute("type");
	opt_name=xmltext.getElementsByTagName("selector")[row].getElementsByTagName("option")[column].getAttribute("name");
	
	entry=entry_matrix_find_entry(opt_type);
	if (entry_matrix[0][entry]==0) return; // Do nothing if this entry is not enabled
	
	if (entry_selected[row][0]=="exclusive")
	{
		for (i=1; i<10; i++)
		{
			if (entry_selected[row][i]==-1) break;
			entry_selected[row][i]="none";
		}
		entry_selected[row][column+1]=opt_type;
	}
	if (entry_selected[row][0]=="checkbox")
	{
		if (entry_selected[row][column+1]=="none")
			entry_selected[row][column+1]=opt_type;
		else
			entry_selected[row][column+1]="none";
	}
	
	entry_matrix_process(false);
	
	entry_matrix_print();
}

function entry_matrix_process(ignore_selections)
{
	var i,j,k,l;
	var tmp_entry;
	var tmp_type;
	var sel_name;
	var listindex;
	var list;
	var selected;

	entry_matrix_calculate_dependencies(ignore_selections);
	
	// Show selected entries
	for (j=0; j<20; j++)
	{
		for (i=0; i<10; i++)
		{
			if (entry_selected[j][i+1]==-1) break;
			if (entry_selected[j][i+1]!="none")
			{
				if (document.getElementById(j+"_"+i)!=null) document.getElementById(j+"_"+i).style.backgroundColor=COLOR_SELECTED;
			}
			else
			{
				if (xmltext.getElementsByTagName("selector")[j].getElementsByTagName("option").length<=i) break;
				tmp_type=xmltext.getElementsByTagName("selector")[j].getElementsByTagName("option")[i].getAttribute("type");
				tmp_entry=entry_matrix_find_entry(tmp_type);
				if (entry_matrix[0][tmp_entry]==0)
					document.getElementById(j+"_"+i).style.backgroundColor=COLOR_NOT_SELECTABLE;
				else
					document.getElementById(j+"_"+i).style.backgroundColor=COLOR_SELECTABLE;
			}
		}
	}
	
	for (i=0; i<20; i++)
	{
		if (entry_listbox[i]==0) continue;
		sel_name=xmltext.getElementsByTagName("selector")[i].getAttribute("name");

		list=document.getElementById("list_"+i);
		selected=-1;
		if (ignore_selections==false)
		{
			for (j=0; j<50; j++)
			{
				if (list.options[j]==null) break;
				if (list.options[j].selected==true) { selected=list.options[j].value; break; }
			}
		}
		listindex=0;
//		alert("Searching i="+i+", sel_name="+sel_name);
		for (j=2; j<100; j++)
		{
			if (entry_matrix[0][j]==-1) break;
			if (entry_matrix[0][j]==1)
			{
//				if (j==22) alert("Comparing "+sel_name+" to "+entry_type[j]);
				if (sel_name==entry_type[j])
				{
					// Entry fits firmware type => show it
//					alert("Showing "+sel_name+" at i="+i+", j="+j);
					for (k=0; k<1000; k++)
					{
						if (entry_matrix[1][j]==entry_name[k][0])
						{
							document.getElementById("list_"+i).options[listindex++]=new Option(entry_name[k][0],k,false,(k==selected)?true:false);
							for (l=1; l<20; l++)
							{
								if (entry_name[k][l]==-1) break;
								document.getElementById("list_"+i).options[listindex++]=new Option("--"+entry_name[k][l],k+(l*1000),false,((k+(l*1000))==selected)?true:false);
							}
						}
					}
				}
			}
		}
		for (j=20; j>0; j--)
		{
			document.getElementById("list_"+i).options[listindex+j-1]=null;
		}
	}
}

function entry_matrix_calculate_dependencies(ignore_selections)
{
	var i,j,entry;
	var k;
	var mod,val
	var firm_version, firm_type, firm_link, firm_entry;
	var dwn_link;
	
	entry_matrix[0][0]=1;
	for (i=1; i<100; i++)
	{
	  if (entry_matrix[1][i]==-1) break;
	  entry_matrix[0][i]=1;
	}
	
	if (ignore_selections!=true)
	{
		for (i=0; i<20; i++)
		{
			if (entry_listbox[i]==0) continue;
			list=document.getElementById("list_"+i);
			for (j=0; j<50; j++)
			{
				if (list.options[j]==null) break;
				if (list.options[j].selected==true) { fnd=j; break; }
			}
			if (list.options[j]==null) 
			{
				document.getElementById("dwn"+i).style.visibility="hidden";
				continue;
			}
			val=list.options[fnd].value;
			mod=(val-(val%1000))/1000;
			val=val%1000;
			// mod = additionals, val = entry-nr
			
			firm_version=xmltext.getElementsByTagName("firmware")[val].getAttribute("version");
			firm_type=xmltext.getElementsByTagName("firmware")[val].getAttribute("type");
			firm_link=xmltext.getElementsByTagName("firmware")[val].getAttribute("link");
			firm_entry=xmltext.getElementsByTagName("firmware")[val].getAttribute("entry");
			
			dwn_link=firm_link;
			
			if (mod!=0)
			{
				dwn_link=xmltext.getElementsByTagName("firmware")[val].getElementsByTagName("additional")[mod-1].getAttribute("link");
			}
			
			dwn_link="/assets/Support/updates/"+dwn_link;
			document.getElementById("dwn"+i).style.visibility="visible";
			document.getElementById("dwn"+i).href=dwn_link;
			
			for (j=0; j<20; j++)
			{
				if (entry_selected[i][j]==-1) break;
			}
			entry_selected[i][j-1]=firm_type+" V"+firm_version;
		}
	}
	
	for (j=0; j<20; j++)
	{
		for (i=1; i<10; i++)
		{
			if (entry_selected[j][i]==-1) break;
			if (entry_selected[j][i]=="none") continue;
			entry=entry_matrix_find_entry(entry_selected[j][i]);
			for (k=2; k<100; k++)
			{
				if (entry_matrix[entry][k]==-1) break;
				if (entry_matrix[entry][k]==0) entry_matrix[0][k]=0;
			}
		}
	}

}




function populateList(listname)
{
	entry_matrix_process(false);
	entry_matrix_print();
}




function clearRow(row)
{
	var i;
	for (i=1; i<10; i++)
	{
		if (entry_selected[row][i]==-1) break;
		if (entry_selected[row][i]!="none") entry_selected[row][i]="none";
	}
	entry_matrix_process(true);
	entry_matrix_print();
	document.getElementById("dwn"+row).style.visibility="hidden";
}

