// Open a new window next to the old one.
// Used e.g. for demo course notes (PDF-viewer)
// and for all "external" web sites (see also:
// add_onclick()-routine here below)
var NwWindow;
function openWin(URL, winname, width, height) {
	if (winname == undefined) winname = 'extern';
	if (width == undefined) { width=974; height=900; }
	else if (height == undefined) height=900;
	NwWindow = window.open(URL, winname,
	   'width='+width+',height='+height
	   +',scrollbars=yes,resizable=yes,toolbar=yes,location=yes,menubar=yes');
	return false;
}
function closeWin() {
	if (NwWindow && !NwWindow.closed) NwWindow.close();
}
//----------------------------------------------------------------
// Handle onchange-events in the choose-course box of the 'menukop'
function choose_course(this_element)
{
    for (child_elt=this_element.firstChild; child_elt != null;
                                        child_elt=child_elt.nextSibling) {
        if ((child_elt.selected == true)&&(child_elt.value != "dummy")) {
                window.open(child_elt.value, 'cursuswindow');
        }
    }
    return false;
}
//----------------------------------------------------------------
function onloadfuncs()
{
	var retval;
	var locationstring = window.location.toString();
	if(locationstring.search(/\?brochures?=?/) != -1) {
	    // brochure page print request
	    remove_href();
	    print();
	} else {
	    // non-brochure page request (= the normal case)
	    // setKbCursor('search_box_txt');
	    add_onclick();
	    open_fragment();
	}
	// Does the individual page have a local_onload() ?
	try { retval = local_onload(); } catch(e) {};
	return retval;
}
//----------------------------------------------------------------
// Add a specific onclick attribute to all <a href=... tags
// that refer to external, non-ATComputing webpages to open
// these links in a separate window:
function add_onclick() {
	var linkname, hrefname;
	var a_tags = document.body.getElementsByTagName("a");
	for (var i=0; i < a_tags.length; i++) {

	    // Effectively the following code is equivalent to:
	    // if (a_tags[i].hasAttribute("href") &&
	    //				!a_tags[i].hasAttribute("onclick")) {
            //        var linkname = a_tags[i].getAttribute("href");
	    // But: hasAttribute() is DOM Core 2 and not supported by IE
	    // Both getAttribute() and setAttribute() are DOM Core 1.

	    try { linkname = a_tags[i].getAttribute("href"); }
	    catch(e) { continue; }; // this <a-tag doesn't have a href-attr.
	    if (a_tags[i].getAttribute) {
		// this browser knows getAttribute(): is DOM Core 2 capable:
		if ( ! (hrefname = a_tags[i].getAttribute("onclick"))) {
	           if ((linkname) && linkname.match(/^https?:\/\//i) &&
                              ! linkname.match(/^https?:\/\/www\.atcomputing\./i) &&
                              ! linkname.match(/^https?:\/\/winkel\.atcomputing\./i)) {
                         // dit correspondeert met DOM 0 (string) in add_event_listener()
			 // en dat lijkt problemen te hebben bij IE
	                 a_tags[i].setAttribute("onclick",
			                       "return openWin(this.href);");
//	                 add_event_listener(a_tags[i], 'click', 
//	                      new Function('return openWin(this.href);'));
                   }
                }
            }
	}
}
//----------------------------------------------------------------
// Zet op allerlei mogelijke manieren een event:
// 1. met DOM 2 addEventListener
// 2. met IE-only attachEvent
// 3. door onclick property: bij IE als functie, anders als string
// event_name parameter moet zonder het 'on'-voorvoegsel
// Zie het voorbeeld hierboven.
// Het lijkt erop dat het Dom 2 model (bij Firefox) niet goed werkt:
// er ontstaat wel een nieuw venster, maar beide vensters krijgen nieuwe inhoud
function add_event_listener(element, event_name, functie) {
    if (element.addEventListener) {
        element.addEventListener(event_name, functie, false);
        // alert('DOM 2 event model gebruikt'); // bijna altijd deze
    } else if (element.attachEvent) {
        element.attachEvent("on" + event_name, functie);
        // alert('IE 5 event model gebruikt');  // IE heel vaak deze
    } else if (navigator.appName.substr(0,9) == 'Microsoft') {
        element.setAttribute("on" + event_name, functie);
        // alert('DOM 0 event model (functie) gebruikt');
    } else {
        element.setAttribute("on" + event_name, functie.toString);
        // alert('DOM 0 event model (string) gebruikt');
    }
}
//----------------------------------------------------------------
// Verwijder alle <a href-tags uit het document.
// Dat maakt de zaak mooier printbaar.
// Onderdeel van het brochure-print mechanisme.
// Gebruikt hasAttribute() dus DOM Core 2, dus werkt niet op IE?
function remove_href() {
	do {
	    var a_tags = document.body.getElementsByTagName('a');
	    var flag = 0;
	    for (var i=0; i < a_tags.length; i++) {
		if (a_tags[i].hasAttribute('href')) {
		    var a_tag = a_tags[i];
		    var a_parent = a_tag.parentNode;
		    for (var a_child = a_tag.firstChild; a_child != null;
		    			a_child = a_child.nextSibling) {
			// Til het kind van de <a href een generatie omhoog:
			a_parent.insertBefore(a_child, a_tag);
			// en verwijder vervolgens de nu lege <a href:
			a_parent.removeChild(a_tag);
			// Een insertBefore kegelt de indexvolgorde in het a_tags
			// array overhoop, dus we moeten na zo'n operatie opnieuw
			// beginnen met een vers getElementsByTagName array:
			flag++; break;
		    }
		}
		if (flag) break;
	    }
	} while (flag != 0);
}
//----------------------------------------------------------------
// Zet keyboard cursor in de Zoek-box
// Heeft allerlei neveneffecten: fragments werken niet meer goed
// en de gebruiker verwacht kb cursor in het URL-venster dus typt
// dan misschien een URL in de Zoek-box. 
function setKbCursor(an_id)
{
    var this_element = document.getElementById(an_id);

    /* give this element the keyboard focus & cursor: */
    if (this_element != null) this_element.focus();
    return true;
}
//----------------------------------------------------------------
// Roep Google Maps aan
function mapURL(locatie)   // locatie: 'U' of (default) 'N'
{
        var straat = document.getElementById("mapstraat").value;
        var plaats = document.getElementById("mapplaats").value;
        var pcode  = document.getElementById("mappcode").value;
        var theURL = "http://maps.google.nl/maps";

        theURL += '?';
	if ((straat != '')||(plaats != '')||(pcode != '')) {
        	theURL += 'saddr='+straat+'%2C'+pcode+'%2C'+plaats;
        	theURL += '&';
	}
        if (locatie == 'U')
                theURL += 'daddr=Burg.Verderlaan+13%2C+Utrecht%2C+3544+AD';
        else
                theURL += 'daddr=Kerkenbos+1238%2C+Nijmegen%2C+6546+BE';

        window.open(theURL, "new",
                "width=1000,height=900,scrollbars=yes,resizable=yes");
}
//----------------------------------------------------------------
// Toggle visibility. This routine is for the simple cases.
function toggle_by_id(targetId, displaystyle) {
    var target, image, image_srcname;

    if (document.getElementById) {
        target = document.getElementById(targetId);

        if (target.style.display == 'none') {
            // set the requested display style
            target.style.display = displaystyle;
	    image_srcname = '/images/minnetje.10.png';
        } else {
            target.style.display = 'none';
	    image_srcname = '/images/plusje.10.png';
        }
	// If a corresponding  ..._plusmin (image) element exists: 
	if (image = document.getElementById(targetId+'_plusmin')) {
	    image.src = image_srcname;
	}
    }
    return false;
}
//----------------------------------------------------------------
// Make visible and go to that place on the page:
function view_visibility_fromtop(nodeID, titletxt)
{
    toggle_visibility_fromtop(nodeID, titletxt, 1);
    // Following doesn't seem to work in Konqueror:
    document.getElementById(nodeID).scrollIntoView();
    return false;
}

// Next three routines work together.
// Recursively search the tree below the given node
// and toggle the display-style (none<->default) of children
// who have the given title text. titletxt may be an array of texts.
// Beware: in a table this technique has the disadvantage that
// column-width can not be calculated accurately because of the
// step-wise operation.
// Visibility toggle routine one: the entry point routine
function toggle_visibility_fromtop(nodeID, titletxt, always_vis)
{
    var a_node, browser;

    if (titletxt === null) return false;
    if ((a_node = document.getElementById(nodeID)) === null) return false;
    if (navigator.appName == 'Microsoft Internet Explorer') {
	browser = 'IE';
    } else {
	browser = 'NS';
    }
	
    if (typeof(titletxt) != 'object') {
	// 2nd call parm must always be an array:
        var tarray = [ titletxt ];
        toggle_visibility_recursive(a_node, tarray, browser, always_vis);
    } else {
        toggle_visibility_recursive(a_node, titletxt, browser, always_vis);
    }
    return false; // click has no further href-action
}

// Visibility toggle routine two: the recursive tree walker.
// Do not call this routine directly.
function toggle_visibility_recursive(node_elt, titletxt, whichbrowser, always_vis)
{
    var child_elt, next_elt;

    for (child_elt=node_elt.firstChild; child_elt != null; child_elt=next_elt) {
	if (child_elt.nextSibling !== null) {
            next_elt = child_elt.nextSibling;
	} else {
	    next_elt = null;
	}
        if (child_elt.title && check_txt(child_elt.title, titletxt) &&
                           child_elt.style && child_elt.style.display) {
            if (!always_vis && (child_elt.style.display != "none")) {
		  // if it is visible,
                  child_elt.style.display = "none";  // then make it invisible.
   	    } else { // restore the visible situation:
		if (whichbrowser == 'IE') {
		    // IE crashes if we don't set 'inline' here
                    child_elt.style.display = 'inline';
		} else switch(child_elt.tagName) {
  		case 'table': case 'TABLE':
                    // Firefox messes up the lay out if we set 'inline' here
                    child_elt.style.display = 'table';
  		    break;
  		case 'tr': case 'TR':
                    // Firefox messes up the lay out if we set 'inline' here
                    child_elt.style.display = 'table-row';
                    break;
  		case 'th': case 'TH': case 'td': case 'TD':
                    // Firefox messes up the lay out if we set 'inline' here
                    child_elt.style.display = 'table-cell';
  		    break;
  		default:
                    child_elt.style.display = "inline"; // effectively: inherit
  		}
            }
        }
        if (child_elt.hasChildNodes()) {
            toggle_visibility_recursive(child_elt, titletxt, whichbrowser);
        }
    }
}
// Visibility toggle routine three: find elements with the proper titles.
// This routine checks whether a given text is present in a given array:
// Do not call this routine directly.
function check_txt(a_text, a_textarray)
{
// Zou ook moeten kunnen: if (a_text in a_textarray).... ?????
    for (var i in a_textarray) {
	if (a_text == a_textarray[i]) return true;
    }
    return false;
}
//----------------------------------------------------------------
function open_fragment()
{
    // Is deze pagina opgeroepen via een URL met een fragment label:
    // Zo ja, zet dat paginadeel dan in de viewport
    // Let op: alleen gebruiken om naar "display:block;" te gaan.
    var hashcharpos = window.location.href.lastIndexOf('#');
    if (hashcharpos != -1) {
        // Inderdaad: knip dat fragment label los
        var fragmentlabel = window.location.href.substring(hashcharpos+1);
        // en schakel de display-visibility van dat paginadeel aan:
        toggle_by_id(fragmentlabel, "block");
        document.getElementById(fragmentlabel).scrollIntoView();
    }
}
//----------------------------------------------------------------
// Print page
function printPage()
{
    window.print()
    return true;
}
//----------------------------------------------------------------
//
// AJAX routines om up-to-date cursus-roosterdata op te vragen
// Momenteel ongebruikt
var my_request;

// verplicht vraag-formaat:  CURSUSCODE=OS01  enz.
function my_request_setup(vraag)
{
    // Als we reeds eerder een AJAX-request hebben opgezet,
    // en dat al voorbij z'n startfase is (readyState != 0)
    // maar nog steeds niet klaar (readyState != 4)
    // dan schiet dat oude ding maar af.....
    if ((my_request != null) &&
	      (my_request.readyState != 0) && (my_request.readyState != 4)) {
        my_request.abort();
    }

    try {
        // Zet een nieuw request op, probeer de ECMA-manier:
        my_request = new XMLHttpRequest();
    } catch (errormsg) {
        try {
	    // ECMA-manier mislukt, probeer de MS-manier (ActiveX):
            my_request = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (errormsg) {
	    // allebei mislukt....
	    alert('Helaas geen AJAX-support met deze browser');
            my_request = null;
            return false;
        }
    }
    // Koppel de handler-functie aan dit request:
    my_request.onreadystatechange = my_request_change_handler;
    // Formuleer de vraag aan de server
    my_request.open("GET", './webrooster.sh.cgi'+'?'+vraag, true);
    // Vuur het request naar de server:
    my_request.send(null);
    return true;
}
function my_request_change_handler()
{
    // Als het verzoek nog niet klaar is, dan return
    if (my_request.readyState != 4) return;
      
    if (my_request.status != 200) {
        // nu: als IE en status == 0 dan ignore/return
        // anders: echte HTTP-foutcode ontvangen, en de
        // bijbehorende boodschap staat in my_request.statusText
        alert('Dat gaf HTTP-code '+my_request.status
		+' en boodschap: '+my_request.statusText);
	return;
    }
    // Gegevens zijn goed binnengekomen. We gaan ze verwerken.

    // Zoek de 'antwoordspan', en overschrijf het tekst-item daaronder.
    // Dit heeft verder niets met AJAX te maken, maar is gewoon Dynamic HTML.
    document.getElementById("antwoordspan").firstChild.data =
                                                     my_request.responseText;
}

