var fstatic;
var gstatic;
var hstatic;

var fname;
var fargs;

var tableView;

var savedMap;
var shortMap;
var savedNotes;

function nameView(tview) {
  if (tview) document.getElementById('view').innerHTML = '<a href="Javascript:switchView(1)">&gt; map view</a>';
        else document.getElementById('view').innerHTML = '<a href="Javascript:switchView(0)">&gt; table view</a>';
}

function switchView(tview) {

 if (tview==undefined) {
   nameView(tableView);
   savedMap = document.getElementById('map').innerHTML;
   collapseTable();
   shortMap = document.getElementById('map').innerHTML;
   if (document.getElementById('fnotes')) savedNotes = document.getElementById('fnotes').innerHTML;
 }
 else if (tview) {
   tableView = false;
   nameView(tableView);
   if (document.getElementById('fnotes')) document.getElementById('fnotes').innerHTML = '&nbsp;';
   document.getElementById('map').innerHTML = shortMap;
   resetmap();
 }
 else {
   //location.href = fname + '?';
   tableView = true;
   nameView(tableView);
   document.getElementById('map').innerHTML = savedMap;
   highlightTable();
   if (document.getElementById('fnotes')) document.getElementById('fnotes').innerHTML = savedNotes;
 }
}

function highlightTable() {
var i,j,k,l,c,r,t;
var el,br;

 // document.getElementById('map').style.border = "thin solid red";
 t = document.getElementById('map');
 r = t.getElementsByTagName("tr");  
 for(i=0; i<r.length; i++) {
  c = r[i].getElementsByTagName("td");
  if (c.length>1) for (j=0;j<c.length;j++) c[j].style.borderLeft = "1px solid #DDDDDD";
  if (c.length==1) c[0].style.border = "thin solid #C40403"; // C40403;
 }
}

function collapseTable() {
var i,j,k,l,c,r,t;
var el,br;

 t = document.getElementById('map');
 r = t.getElementsByTagName("tr");  
 for(i=0; i<r.length; i++) {
  c = r[i].getElementsByTagName("td");
  for (j=0; j<c.length; j++) {
   el = c[j].innerHTML;
   l = el.length;
   if (l) {
     br = el.search('<br>');
     if (br>0) {
      compound = el.substr(0,br);
      defs = el.substr(br,l-br);
      c[j].innerHTML = compound;
     }
   }
  }
 }
}

function setmap2(f,g,h,s) { 

 setmap(g,h,f,s); // just changing parameter order for consistency with previous version 
}

function setmap(g,h,f,s) {
 var a,b,i,j,c,r,t;

 fstatic = f;
 gstatic = g;
 hstatic = h;

 window.onresize = resetmap;
 BrowserDetect.init(); // ==> BrowserDetect.browser, BrowserDetect.version, BrowserDetect.OS

 if (s!=undefined) {
  stack = s.split('+');
  for (j=0;j<stack.length;j++) {
    // alert(j+':'+stack[j]);
  }
 }
 sep = location.href.indexOf('?');
 if (sep>0) { 
   fname = location.href.substr(0,sep);
   fargs = location.href.substring(sep); 
   tableView = true;
 }
 else {
   fname = location.href;
   fargs = ''; // here, args include '?'- use sep+1 to skip it
   tableView = false;
 }
 if (fargs == '?-') {
   document.getElementById('home').innerHTML = '&nbsp;';
   document.getElementById('logo').innerHTML = '&nbsp;';
   document.getElementById('view').innerHTML = '&nbsp;';
 }
 switchView();
 if (fargs.length) switchView(false);
 else {
   if (document.getElementById('fnotes')) document.getElementById('fnotes').innerHTML = '&nbsp;';
        if (BrowserDetect.browser=="Explorer") alert("IE not supported\nbest viewed with Firefox");
   else if (BrowserDetect.browser!="Firefox")  alert("best viewed with Firefox");
   resetmap();
 }
}

function resetmap() {

 if (tableView) return; // do not resize if map not already displayed
 highlightTable();

 // f == number of phonetic sounds (fan,ban,pan etc.) ==> class phonetic0..phonetic(f-1)

 // xradius = 240 + 5*h; xcenter = xradius + 10;
 // yradius = 160 + 5*h; ycenter = yradius + 10;
 //
 xradius = 0.4 * document.width;
 if (BrowserDetect.browser=="Firefox") yradius = 0.5 * document.height; // 0.9
                                  else yradius = 0.35 * document.height; // 0.4
 f = fstatic;
 g = gstatic;
 h = hstatic;
 hmax = 12;
 xcenter = xradius + 10; 
 ycenter = yradius + 30;
 if ((g==h) || (h<=hmax)) {            // only one pinyin sound or less than n0 (10) chars in total

   x0 = 0.4; xq = hmax /(1-x0);
   y0 = 0.7; yq = hmax /(1-y0);
   if (h<hmax) {
     xradius = xradius * (x0 + (h/xq));    // this factor would be 1 when h==hmax
     yradius = yradius * (y0 + (h/yq));    // --ditto--
   }
   b = (2*Math.PI)/h;   // angular increment
   a = 3 * Math.PI/2;       // initial angle
   for (i=0;i<=h;i++) {
     left = getLeft(a,i); top = getTop(a,i);
     a += b;
     if (i) setID(i,left,top,2); else setID(i,left,top,4);
   }
 }
 else {
   //
   // outer ellipse : all pinyin sounds except the 1st
   //
   yradius = yradius * 1.2;
   ycenter = yradius + 30;

   b = (2*Math.PI) / (h-g);   // angular increment
   a = b + (Math.PI)/3;       // initial angle, not aligned with inner one
   for (i=g+1;i<=h;i++) {
     left = getLeft(a,1); top = getTop(a,1);
     a += b;
     setID(i,left,top,0);
   }
   //
   // inner ellipse : first pinyin sound
   //
   if (g<3) xyscale = 0.42; else if (g<5) xyscale = 0.54; else xyscale = 0.66;
   xradius = xradius * xyscale;
   yradius = yradius * xyscale;
   b = (2*Math.PI) / g;     // angular increment
   a = Math.PI/3;       // initial angle
   for (i=0;i<=g;i++) {
     left = getLeft(a,i); top = getTop(a,i);
     a += b;
     if (i) setID(i,left,top,2); else setID(i,left,top,4);
   }
 }
}

function setID(i,left,top,border) {
  elementID = 'char' + i;

  document.getElementById(elementID).style.left = left;
  document.getElementById(elementID).style.top  = top;
  document.getElementById(elementID).style.position  = 'absolute';
  if (border) document.getElementById(elementID).style.borderLeftWidth = border;
}


var xcenter,ycenter;
var xradius,yradius;

function getLeft(a,i) {
var l;
 l = xcenter;
 if (i) l += Math.floor(xradius * Math.cos(a));
 return l;
}

function getTop(a,i) {
var t;
 t  = ycenter;
 if (i) t  -= Math.floor(yradius * Math.sin(a));
 return t;
}

// source : http://www.quirksmode.org/resources.html
// 
// BrowserDetect, courtesy of http://www.quirksmode.org/js/detect.html

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

/*
var aLeft = new Array;
var aTop  = new Array;
var aPos  = new Array;
var aBord = new Array;

function savePositions() {
var h,elementID;

 for (h=0;h<=hstatic;h++) {
   elementID = 'char' + h;
   aLeft[h] = document.getElementById(elementID).style.left;
   aTop[h]  = document.getElementById(elementID).style.top;
   aPos[h]  = document.getElementById(elementID).syle.position;
   aBord[h] = document.getElementById(elementID).style.borderLeftWidth;
 }
}

function restorePositions() {
var h,elementID;

 for (h=0;h<=hstatic;h++) {
   elementID = 'char' + h;
   document.getElementById(elementID).style.left = aLeft[h];
   document.getElementById(elementID).style.top = aTop[h];
   document.getElementById(elementID).style.position = aPos[h];
   document.getElementById(elementID).style.borderLeftWidth = aBord[h];
 }
}


function clearPositions() {
var h,elementID;

 for (h=0;h<=hstatic;h++) {
   elementID = 'char' + h;
   document.getElementById(elementID).style.left = undefined;
   document.getElementById(elementID).style.top = undefined;
 }
}

var table = document.getElementById(map);  
   var rows = table.getElementsByTagName("tr");  
   for(i = 0; i < rows.length; i++){          
       rows[i].className = "even";

*/
