this.TypeOf = function (object) {

	if (object == null)
		return 'null';

	if (typeof object == 'undefined')
		return 'undefined';

	if (object.nodeName && object.nodeType == 1)
		return 'element';

	if (object.nodeName && object.nodeType == 3 && (!/\S/).test(object.nodeValue))
		return 'textnode';

	if (object instanceof Function)
		return 'function';

	if (object instanceof Array)
		return 'array';

	if (typeof object == 'object')
		return 'object';

	if (typeof object == 'number' && isFinite(object))
		return 'number';

	if (typeof object == 'string')
		return 'string';

	if (typeof object == 'boolean')
		return 'boolean';
};

function callCal(res, qry, txt, divId, st, a1, a2) {
	var bodyID = document.getElementsByTagName("body")[0];
	
	divId = (divId) ? divId : 'termine';
	st = (st) ? st : 0;
	a1 = (a1) ? a1 : 0;
	a2 = (a2) ? a2 : 0;

	form = 0;
	if (a1) {
		if (a2) {
			form = 1;
		}
	}
	var cbFunction = divId + "_scr";

	//alert (TXT+" DIVID: "+DIVID + " ST: "+ST);
	// hier eigenes callbackscript je aufruf welches 'insertEvents' dann mit parameter aufrufen kann !
        var script = document.createElement('script');
	script.setAttribute('type', 'text/javascript');
	var orderField = 'starttime';
	var scrText = 'function '+cbFunction+'(root) { insertEvents(root,"'+txt+'","'+divId+'","'+st+'");}\n';
	if (form == 1) {
		txt = (txt) ? txt : '';			// bei array: wert fuer selectDefault von Kurse(=title.$t)
		// max-results=100    // 25 = default !
		scrText = 'function '+cbFunction+'(root) { listEvents(root,'+a1+','+a2+',"'+txt+'");}\n';
	} else {
		txt = (txt) ? txt : 'Termin(e) auf Anfrage';   // bei terminliste: erstatztext wenn keine Termmine gefunden werden.
	}
	if (script.canHaveChildren) { 
		script.appendChild(document.createTextNode( scrText ));
	} else {		// IE
		script.text = scrText;
	}
	bodyID.appendChild(script);  
	
	var newScript = document.createElement('script');
	var url = 'http://www.google.com/calendar/feeds/wirzeigenwege@gmail.com/public/full-noattendees';
	
	var cf = '&callback=' + cbFunction;
	var args = '&sortorder=a&orderby='+orderField+'&ctz=Europe/Vienna&futureevents=true';
	args = (res) ? args + '&max-results=' + res : args;
	args = (qry) ? args + '&q=' + qry : args;
	var link = url + '?alt=json-in-script' + cf + args ;
	// alert(args);
	newScript.type = 'text/javascript';
	newScript.src = link;
	bodyID.appendChild(newScript)
}
function formatTs(ts, fmt) {
    var remtxt = ts;
	var date = '';
	var time = '';
    function consume(retxt) {
      var match = remtxt.match(new RegExp('^' + retxt));
      if (match) {
        remtxt = remtxt.substring(match[0].length);
        return match[0];
      }
      return '';
    }
    var year = consume('\\d{4}');
    consume('-?');
    var month = consume('\\d{2}');
    consume('-?');
    var day = consume('\\d{2}');
    var timeOrNot = consume('T');
    if (timeOrNot == 'T') {
      var hours = consume('\\d{2}');
      consume(':?');
      var mins = consume('\\d{2}');
      consume('(:\\d{2})?(\\.\\d{3})?');
      time = ' ' + hours + ':' + mins;
    }
   	date = day + '.' + month + '.' + year;
	return [date, time];
}
function insertEvents(root,txt,divId,st) {
    var feed = root.feed;
    var entries = feed.entry || [];
 
    var empty = txt;
    var elementId = divId;
    var html = ['<ul>'];

    if (entries.length > 0) {
      for (var i = 0; i < entries.length; ++i) {
        var entry = entries[i];
        var title = entry.title.$t;
		
		var begin = (entry['gd$when']) ? formatTs(entry['gd$when'][0].startTime) : ['',''];
		var end = (entry['gd$when']) ? formatTs(entry['gd$when'][0].endTime) : ['',''];
		var begin_day = begin[0];
		var begin_time = begin[1];
		var end_day = end[0];
		var end_time = end[1];

		html.push('<li class="termin">', begin_day); // Zeilenanfang

		if (begin_day != end_day) {		// mehrtaegiger Termin = EndeTag anzeigen	
			html.push(' - ', end_day);
		} else {						// sonst nur Endzeit
			html.push(' ', begin_time, ' - ', end_time);      
		}
		if (st == 1) {		// Titel anzeigen
        	html.push(' <span class="termin_title">',title, '</span>'); 
		}
		html.push('</li>');  // Zeilenende
      }
    } else {
      html.push('<li class="kein_termin">' + empty + '</li>');
    }
    html.push('</ul>');
    document.getElementById(elementId).innerHTML = html.join("");
}
function listEvents(root,a1,a2,txt) {
	var feed = root.feed;
    var entries = feed.entry || [];
    // array leeren ?!
	var ind1 = 0;
	var ind2 = 0;
    if (entries.length > 0) {
	  for (var i = 0; i < entries.length; ++i) {
        var entry = entries[i];
        var title = entry.title.$t;
		var begin = (entry['gd$when']) ? formatTs(entry['gd$when'][0].startTime) : ['',''];
		var end = (entry['gd$when']) ? formatTs(entry['gd$when'][0].endTime) : ['',''];
		var begin_day = begin[0];
		var begin_time = begin[1];
		var end_day = end[0];
		var end_time = end[1];
		var date_string = begin_day;
		if (begin_day == end_day) {
			date_string = date_string +' '+begin_time+' - '+end_time;
		} else {
			date_string = date_string +' - '+end_day;
		}
		
		// array feed
		if (a1[title] == null) {	// neuer Kurs
			a1[title] = title;
			a2[title] = new Array;
			a2[title][0] = date_string;	// erster Termin f. neuen Kurs
			ind1++;
		} else {
			a2[title].push(date_string);	// Folgetermine
		}

	  }
    }
	//alert('done');
	initKurs(txt);
}
function keySort(hash)  {
	var arr = new Array;
	var sorted = new Array;
	for (var t in hash) { arr.push(t);}
	sorted = arr.sort();
	return sorted;
}
function std(str) {  // delete all expect :alnum: and convert to 'lc'
	var ret = str.replace(/[^0-9a-z]+/ig, '');
	return ret.toLowerCase();
}
function addOption(select,text,value, selDef ) {
	var optn = document.createElement("OPTION");
	optn.text = text.substr(0,54);
	optn.value = text;
	if (selDef) {			// if a defaultelement ist wanted
		//var _text = std(text);
		//var _def = std(selDef);
		var regex = new RegExp(std(selDef));
		var res = regex.test(std(text));	//test if std(defaultelement) is in std(text)
		if (res == true) {
			optn.selected = true;		
			optn.defaultSelected = true;
		}
	}
	select.options.add(optn);
}
function clearSel(select){	
	for(var i=select.options.length-1;i>=0;i--)
		select.remove(i);
}


