/*
  g_undermappe_dybde: Mappe-nesting-niveauet for siden. "foo/bar.html" er 1,
  "foo/bar/baz.html" er 2.
  Bruges til at justere links i menuen.
*/
var g_undermappe_dybde = 1;

function $(navn)
{
    return document.getElementById(navn);
}

function domskjul()
{
    for(var ix=0; ix<arguments.length; ++ix)
	arguments[ix].style.display = 'none';
}
function domvis()
{
    for(var ix=0; ix<arguments.length; ++ix)
	arguments[ix].style.display = 'block';
}

function Fejlmeld(medd, htmlmedd)
{
    var fejl_dom = $('fejl_popin');
    if(fejl_dom != null)
    {
	fejl_dom.className = 'popin_fejl';
	fejl_dom.innerHTML = htmlmedd || medd;
    }

    alert("Fejl:" + " " + medd);
}
function OpretXHR()
{
   if(window.XMLHttpRequest) 
   {
       try 
       {
	   return new XMLHttpRequest();
       } 
       catch(e) 
       {
	   return Fejlmeld(e);
       }
   } 
   else if(window.ActiveXObject) 
   {
       // IE/Windows ActiveX version
       try {
	   return new ActiveXObject('Msxml2.XMLHTTP');
       } 
       catch(e) 
       {
	   try {
	       return new ActiveXObject('Microsoft.XMLHTTP');
	   } 
	   catch(e) 
	   {
	       return Fejlmeld(e);
	   }
       }
   }
   else
       return Fejlmeld("Kan ikke oprette AJAX request");
}

function HtmlKunBody(url, rq_status, resptxt)
{
    var fra_marker = '<!-- CUT -->';
    var til_marker = '<!-- END CUT -->';
    var fra_length;
    var fra_ix;
    var til_ix;
    var body;
    
    if(rq_status == 200 || rq_status==0)
	prefix = '';
    else
	prefix = '<em>' + "Fejl" + ' ' + rq_status + " under rekvirering af " + '<tt>' + url + '</tt><br>\r\n';
    
    fra_ix = resptxt.indexOf(fra_marker);
    til_ix = resptxt.indexOf(til_marker);
    if(fra_ix >= 0 && til_ix >= 0) 
	fra_ix += fra_marker.length;
    else
    {
	fra_ix = resptxt.indexOf('<body');
	if(fra_ix>0)
	{
	    fra_ix = resptxt.indexOf('>', fra_ix+1);
	    if(fra_ix>=0) ++fra_ix;
	}
	til_ix = resptxt.indexOf('</body>');
    }

    if(fra_ix >= 0 && til_ix >= 0)
    {
	body = resptxt.substring(fra_ix, til_ix);
    }
    else
    {
	body = resptxt;
	if(prefix == "") 
	    prefix = "<em>Fejl i modtagne data for <tt>" + url + "</tt>; modtagne data vises herunder.</em><br>\r\n"
		}
    
    return prefix+body;
}

function Xhr(url, onsuccess, onfailure)
{
    var xhr = OpretXHR();
    xhr.onreadystatechange = function() {
	if(xhr.readyState==4)
	{
	    if(xhr.status==200 || xhr.status==0)
		onsuccess(url, xhr);
            else
                onfailure(url, xhr);
	}
    };
    xhr.open('GET', url);
    xhr.send(null);
}

function RodRelativTilRelativUrl(url)
{
    var res = url;
    for(var i=0; i<g_undermappe_dybde; ++i)
    {
	res = '../' + res;
    }
    return res;
}
    
function LoadMenu()
{
    var titel = $('tdtitel'); // xx skal være trtitel
    if(titel)
    {
	// xx
	titel.innerHTML = '<h2><img src="../img/wn.png"> &nbsp;&nbsp;Horsens Skakforening &nbsp;&nbsp;<img src="../img/bn.png"></h2>';
         // titel.innerHTML = '<td>&nbsp;</td><td align="left"><a class="linkbody" href="../index.html"><b>HORSENS SKAKFORENING</b></a></td><td align="right"><a alt="English" class="linkbody" href="../info/english.html"><img src="../img/flag_GB.png"></a></td>';
    }

    var menudom = $('vertmenu');
    /* Firefox gaar helt overbord i caching, saa datoen er noedv. for
       at tvinge timelig opdatering. */ 
    var url = RodRelativTilRelativUrl('menu/menu.html?date='+(new Date()).getDate() + '&hour=' + (new Date()).getHours());
    Xhr(url,
        function(url,xhr) {
	    var menuhtml = HtmlKunBody(url, xhr.status, xhr.responseText);
	    for(var niv=g_undermappe_dybde; niv > 1; --niv)
	    {
		menuhtml = menuhtml.replace(new RegExp('href="\\.\\./', "g"), 'href="../../');
		menuhtml = menuhtml.replace(new RegExp(' src="\\.\\./', "g"), ' src="../../');
	    }
	    menudom.innerHTML = menuhtml;
	    JusterMenuer(menudom, null);
            var noscriptmenu = $('menu');
	    noscriptmenu.className = 'scriptmenu';
	},
        function(url,xhr) {
	    Fejlmeld('Kunne ikke hente ' + url + ' (fejl ' + xhr.status + ')',
		     HtmlKunBody(url, xhr.status, xhr.responseText));
            menudom.innerHTML = '<iframe id="noscriptmenu" type="text/html" src="'
		+ RodRelativTilRelativUrl('menu/menu.html')
		+ '" frameborder="0" height="400" scrolling="no"><a href="'
		+ RodRelativTilRelativUrl('menu/menu.html')
		+ '">Menu</a></iframe>';

	});

}

function BeginsWith(main, part)
{
    if(part.length > main.length)
	return false;
    else
	return main.substring(0, part.length) == part;
}


function EndsWith(main, part)
{
    if(part.length > main.length)
	return false;
    else
	return main.substring(main.length-part.length, main.length) == part;
}


function ChildNodesByTag(main, tagnavn, acc)
/*
  Gennemsøg main rekursivt efter 'tagnavn', men returner *ikke*
  tagnavn-elementer inden i andre tagnavn-elementer. 
  IND: 
     main: søg under dette DOM-element.
     acc bruges kun i det rekursive kald.
  UD: En ægte liste.
*/
{
    if(acc == null)
	acc = [];
    var cs = main.childNodes;
    for(var ix=0; ix<cs.length; ++ix)
    {
	var ch = cs[ix];
	if(ch.tagName == tagnavn)
	    acc[acc.length] = ch;
	else
	    ChildNodesByTag(ch, tagnavn, acc);
    }
    return acc;
}


function Relativiser(url)
/*
  Konverter fx
     http://www.horsensskakforening.dk/info/kalender.html#201007
  til
     info/kalender.html
*/
{
    var minurl = UrlKunSide(url);
    /* Beregn relativ URL i 'g_undermappe_dybde' mappers dybde. */
    var stumper = minurl.split('/');
    var relurl = stumper[stumper.length-1];
    for(var niv=0; niv<g_undermappe_dybde; ++niv)
    {
	relurl = stumper[stumper.length-2-niv] + '/' + relurl;
    }
    return relurl;
}
function UrlKunSide(url)
{
    return url.replace(/#.*$/, '').replace(/\?.*$/, '').replace('\\','/');
}

function JusterMenuer(hovedmenudom, aaben_menu)
{
    var menuer = ChildNodesByTag(hovedmenudom, 'LI');
    var aktiv_menu = null;
    var aktivt_menupunkt = null;
    var minurl = UrlKunSide(location.href);

    var bedste_len = -1;
    for(var menuix in menuer)
    {
	var menu = menuer[menuix];
	var menupunkter = ChildNodesByTag(menu, 'LI');
	for(var menupunktix in menupunkter)
	{
	    var menupunkt = menupunkter[menupunktix];
	    var ankre = menupunkt.getElementsByTagName('a');
	    for(var aix in ankre)
	    {
		var adom = ankre[aix];
		var url = adom.href;
		if(url != null)
		{
		    url = UrlKunSide(url);
		    if(BeginsWith(minurl, url))
		    {
			if(url.length > bedste_len)
			{
			    bedste_len = url.length;
			    aktiv_menu = menu;
			    aktivt_menupunkt = menupunkt;
			}
		    }
		}
	    }
	}
    }
    if(aktiv_menu == null && aaben_menu == null)
    {
	if(0)
	{
	    alert("ikke fundet?! " + minurl + " del af " + location.href + ", niveau = " + g_undermappe_dybde);
	    return;
	}
    }
    if(!aaben_menu)
	aaben_menu = aktiv_menu;
	
    var viste = 0;
    var skjulte = 0;
    for(var menuix in menuer)
    {
	var menu = menuer[menuix];
	var aktiv = menu==aktiv_menu;
	var aaben = (menu===aaben_menu) || aktiv;
	menu.className = aktiv? 'menuAktiv':'menuInaktiv';
	var menupunkter = ChildNodesByTag(menu, 'LI');
	for(var menupunktix in menupunkter)
	{
	    var menupunkt = menupunkter[menupunktix];
	    if(aaben)
	    {
		domvis(menupunkt);
		menupunkt.className = (menupunkt===aktivt_menupunkt)?'punktAktiv':'punktInaktiv';
		++viste;
	    }
	    else
	    {
		domskjul(menupunkt);
		++skjulte;
	    }
	}
    }
}

function menuAaben(menuanker)
{
    var menuer = ChildNodesByTag($('vertmenu'), 'LI');
    for(var menuix in menuer)
    {
	var menu = menuer[menuix];
	var ankre = ChildNodesByTag(menu, 'A');
	for(var aix in ankre)
	{
	    var anker = ankre[aix];
	    if(anker===menuanker)
	    {
		JusterMenuer($('vertmenu'), menu);
		return;
	    }
	}
    }
}



function Skaf_XSS_Tilladelser()
{
    if(0)
    {
	try {
	    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	} catch (e) {
	    alert("Permission UniversalBrowserRead denied.");
	}
    }
}


function UddragIndledning(s, min, max)
/*
  Uddrag første sætning eller sårn fra et stykke HTML, uden at klippe
  det over midt i en tag eller sådan noget.
  
  Forlanger at tags skal balancere, undtaget at indledende <br> eller
  <p> fjernes; effekten er at man får første linie eller første
  afsnit.

  Indledningen skal tage mindst 'min' tegn, og højest 'max' tegn.
*/
{
    if(max >= s.length) 
    {
	return s;
    }

    /* Fjern alle indledende tags. */
    for(;;)
    {
	/* xx .lstrip - erstat med et velrettet regexp */
	while(s.length > 0 && s.charAt(0)==' ')
	    s = s.slice(1);

	if(s.slice(0,1) == '<')
	{
	    var sluttag_pos = s.indexOf('>');
	    var space_pos = s.indexOf(' ');
	    if(sluttag_pos >= 0)
	    {
		var tagnavn;
		if(space_pos < sluttag_pos)
		    tagnavn = s.slice(1, space_pos);
		else
		    tagnavn = s.slice(1, sluttag_pos);
		if(tagnavn == 'p' || tagnavn == 'div' || tagnavn == 'span' || tagnavn == 'br')
		    s = s.slice(sluttag_pos+1);
		else
		    break;
	    }
	    else
		break;
	}
	else
	    break;
    }

    if(max > s.length) max = s.length;
    if(min > max) min = max;
    var antallt = 0;
    var antalgt = 0;
    var senesteampsemi = '';
    var hoejesteraa = 0;
    var hoejestesaetningslut = 0;
    var antallukke = 0;
    for(var i=0; i<=max; ++i)
    {
	var balance = (antallt==antalgt && antallt==antallukke*2 && senesteampsemi!='&');
	
	if(balance)
	{
	    hoejesteraa = i;
	    if(i>= 1 && '.!?:'.indexOf(s.charAt(i-1)) >= 0)
	    {
		if(i == s.length || s.charAt(i)==' ' || s.charAt(i)=='<')
		    hoejestesaetningslut = i;
	    }
	}

	if(i  < max)
	{
	    var c = s.charAt(i);
	    if(c == '<')
		++antallt;
	    else if(c == '>')
		++antalgt;
	    else if(c == '&')
		senesteampsemi = '&';
	    else if(c == ';')
		senesteampsemi = ';';
	    else if(c == '/' && i>0 && s.charAt(i-1)=='<')
	    {
		++antallukke;
		if(antallukke*2 > antallt)
		    break;
	    }
	}
    }

    if(hoejestesaetningslut > 0 && hoejestesaetningslut >= min)
	return s.slice(0, hoejestesaetningslut);
    else
	return s.slice(0, hoejesteraa);
}



function htmlQuote(s)
{
    return s.replace('&', '&gt;').replace('<', '&lt;').replace('>', '&gt;');
}

function googleJsonHTML(node)
{
    if(node.type == 'html')
	return node.$t;
    else if(node.type == 'text')
    {
	return htmlQuote(node.$t);
    }
    else
    {
	/* strengt taget ved jeg ikke om det her er html eller text,
	   men text er det sikre valg, og blogger returnerer det her
	   for indlægs-titler. */
	return htmlQuote(node.$t);
    }
}

var g_script_domnode = null;
function LoadBlogFraJson(doc)
{
    var domele = g_script_domnode;
    g_script_domnode = null;

    var foerste = true;
    var res = [];
    function Og(s) { res[res.length] = s; }
    
    var items = doc.feed.entry;
    for(itemix in items)
    {
	var item = items[itemix];
	var title = googleJsonHTML(item.title);
	var description_orig = googleJsonHTML(item.content);
	var description = UddragIndledning(description_orig, 200, 500);
	var url = item.link[0].href;
	for(var linkix in item.link)
	{
	    if(item.link[linkix].type == "text/html")
	    {
		url = item.link[linkix].href;
		if(item.link[linkix].rel == "self")
		    break;
	    }
	}
	if(description.length != description_orig)
	    description += '&nbsp;&nbsp;<small><a href="' + url + '">(læs mere)</a></small>';
	    
	Og('<h3 class="blogheading"><a href="' + url + '">' + title + '</a></h3>\r\n');
	Og('<p>' + description + '</p>\r\n');
    }
    domele.innerHTML = res.join('');
}

function LoadBlog(domnode)
{
    var rssurl = null;
    var jsonurl = null;
    var inputs = ChildNodesByTag(domnode, 'INPUT'); 
    for(var inputix in inputs)
    {
	var inp = inputs[inputix];
	if(inp.name == 'json_url')
	{
	    jsonurl = inp.value;
	    break;
	}
	else if(inp.name == 'rss_url')
	{
	    rssurl = inp.value;
	    /* ingen break: kig videre efter en JSON url */
	}
    }
    
    if(jsonurl != null)
    {
	if(g_script_domnode != null)
	{
	    domnode.innerHTML = '<div class="fejl">'
		+ 'HTML fejl: kan ikke loade flere blogs samtidigt'
		+ '</div>';
	    return;
	}
	g_script_domnode = domnode;
	
	domnode.innerHTML = '<small><i>Henter blog artikler ...</i></small>';
	var scripttag = document.createElement('script');
	scripttag.setAttribute('type', 'text/javascript');
	scripttag.setAttribute('src', jsonurl + '&callback=LoadBlogFraJson');
	document.documentElement.firstChild.appendChild(scripttag);
    }
    
    else if(rssurl != null)
    {
	Skaf_XSS_Tilladelser();
	Xhr(rssurl,
	    function(url,xhr) {
		Skaf_XSS_Tilladelser();
		LoadBlogFraXml(xhr.responseXML, domnode);
	    },
	    function(url,xhr) {
		Fejlmeld('Kunne ikke hente ' + url + ' (fejl ' + xhr.status + ')',
			 HtmlKunBody(url, xhr.status, xhr.responseText));
		menudom.innerHTML = '<iframe id="noscriptmenu" type="text/html" src="'
		    + RodRelativTilRelativUrl('menu/menu.html')
		    + '" frameborder="0" height="400" scrolling="no"><a href="'
		    + RodRelativTilRelativUrl('menu/menu.html')
		    + '">Menu</a></iframe>';

	    });	    
    }
    else
    {
	domnode.innerHTML = '<div class="fejl">'
	    + 'HTML fejl: rss_url mangler, kan ikke loade blog'
	    + '</div>';
	return;
    }
}

function LoadBlogs()
{
    var divs = document.getElementsByName('embeddedblog');
    if(divs.length==0)
    {
	var blogdiv = $('embeddedblog');
	if(blogdiv)
	    LoadBlog(blogdiv);
    }
    else
    {
	for(var divix=0; divix<divs.length; ++divix)
	{
	    var div = divs[divix];
	    LoadBlog(div);
	}
    }
}



function LoadBlogFraXml(xmldoc, domele)
{
    var foerste = true;
    var res = [];
    function Og(s) { res[res.length] = s; }
    
    var items = ChildNodesByTag(xmldoc, 'item');
    for(var itemix in items)
    {
	var item = items[itemix];
	var titledom = ChildNodesByTag(item, 'title')[0];
	var title = titledom.childNodes[0].data;
	var url = ChildNodesByTag(item, 'link')[0].childNodes[0].data;
	
	Og('<h3 class="blogheading"><a href="' + url + '">' + title + '</a></h3>\r\n');
	var description = ChildNodesByTag(item, 'description')[0].childNodes[0].data;
	Og('<p>' + description + '</p>\r\n');
    }
    domele.innerHTML = res.join('');
}


function LoadMenuOgBlogs(niveau)
{
    if(niveau == undefined) 
	g_undermappe_dybde = 1;
    else
	g_undermappe_dybde = niveau;

    if(location.href.match(/^file:/))
    {
	/*
	  XmlHttpRequest virker ikke på lokaldrev pga. XSS-begræsninger.
	  Derfor: Mhp. udvikling, deaktiver XSS-sikringen.
	*/
	try {
	    if (netscape.security.PrivilegeManager.enablePrivilege)
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	} catch (e) { 
	}
    }
    LoadMenu();
    LoadBlogs();
}

function UnitTest_onload()
{
    try
    {
	UnitTest_onload_do();
    }
    catch(e)
    {
	ExplainException(e);
    }
}
function ExplainException(e)
{
    var fn = e.fileName;
    var ln = e.lineNumber;
    if(ln)
	ln = "(" + ln + ")";
    else
	ln = "";
    if(!fn) fn = '<ukendt filnavn>';
    if(e.name && e.message)
	alert(fn + ln + ': ' + e.name + ': ' + e.message + ' (' + e.description + ')');
    else
    {
	var ks = [];
	for(var k in e)
	{
	    ks[ks.length] = k;
	}
	alert(ks.join(', '));
    }
}
