var Dase;
if (Dase && (typeof Dase != "object" || Dase.NAME)) {
	throw new Error("Namespace 'Dase' already exists");
}

// Create our namespace, and specify some meta-information
Dase = {};
Dase.NAME = "Dase";    // The name of this namespace
Dase.VERSION = 1.0;    // The version of this namespace
Dase.base_href = document.getElementsByTagName('base')[0].href;

/* utilities */

/* from DOM Scripting p. 103 */
Dase.addLoadEvent = function(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		};
	}
};

Dase.$ = function(id) {
	return document.getElementById(id);
};

Dase.addClass = function(elem,cname) {
	if (!elem || !cname) return false;
	if (elem.className) {
		elem.className = elem.className + " " + cname;
	} else {
		elem.className = cname;
	}
	return true;
};

Dase.removeClass = function(elem,cname) {
	if (!elem || !cname) return false;
	var cnames = elem.className.split(" ");
	var newClassName = '';
	for (var i=0;i<cnames.length;i++) {
		if (cname != cnames[i]) {
			newClassName = newClassName + " " + cnames[i];
		}
	}
	elem.className = newClassName;
	return true;
};

Dase.hasClass = function(elem,cname) {
	if (!elem || !cname) return false;;
	var cnames = elem.className.split(" ");
	for (var i=0;i<cnames.length;i++) {
		if (cname == cnames[i]) {
			return true;
		}
	}
	return false;
};

Dase.displayError = function(msg) {
	var jsalert = Dase.$('msg');
	if (!jsalert) return false;
	Dase.removeClass(jsalert,'hide');
	jsalert.innerHTML = '';
	jsalert.innerHTML = msg;
	return true;
};

Dase.toggle = function(el) {
	if (Dase.hasClass(el,'hide')) {
		Dase.removeClass(el,'hide');
	} else {
		Dase.addClass(el,'hide');
	}
};

Dase.createHtmlSet = function(parent,set,tagName) {
	for (var i=0;i<set.length;i++) {
		Dase.createElem(parent,set[i],tagName);
	}
};

Dase.createElem = function(parent,value,tagName,className) {
	if (!parent) {
		//alert('no parent');
		return;
	}
	var element = document.createElement(tagName);
	element.style.visibility = 'hidden';
	if (value) {
		element.appendChild(document.createTextNode(value));
	}
	parent.appendChild(element);
	if (className) {
		element.className = className;
	}
	element.style.visibility = 'visible';
	return element;
};

Dase.removeChildren = function(target) {
	if (!target) return;
	while (target.childNodes[0]) {
		target.removeChild(target.childNodes[0]);
	}
}

Dase.highlight = function(target,time) {
	Dase.addClass(target,'highlight');
	setTimeout(function() {
			Dase.removeClass(target,'highlight');
			},time);
}

Dase.removeFromArray = function(ar,val) {
	for (var i=0;i<ar.length;i++) {
		if (val == ar[i]) {
			ar.splice(i,1);
		}
	}
}

Dase.createXMLHttpRequest = function() {
	var xmlhttp;
	if (window.XMLHttpRequest) {
		xmlhttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert('Perhaps your browser does not support xmlhttprequests?');
	}
	return xmlhttp;
};

Dase.getJSON = function(url,my_func,error_func,params) {
	var xmlhttp = Dase.createXMLHttpRequest();
	// this is to deal with IE6 cache behavior
	// also note that JSON data needs to be up-to-the-second
	// accurate given the way we currently do deletes!
	var date = new Date();
	if (params) {
		url = url + '?' + params + '&' + date.getTime();
	} else {
		url = url + '?' + date.getTime();
	}

	xmlhttp.open('GET', url, true);
	xmlhttp.send(null);
	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState == 4) {
			if (xmlhttp.status == 200 && xmlhttp.responseText) {
				//alert(xmlhttp.responseText);
				var json = JSON.parse(xmlhttp.responseText);
				if (my_func) {
					my_func(json);
				} else {
					return json;
				}
			} else { //non 200 status returned
				var json = {};
				if (my_func) {
					my_func(json);
				} else {
					return json;
				}
			}
		} else { 	
			// wait for the call to complete
		}
		return false;
	};
};
/* end utilities */
Dase.initDefinitionLinks = function(definitions) {
	var links = Dase.$('definition_links').getElementsByTagName('a');
	var click_count = 0;
	var converter = new Showdown.converter();
		if(click_count == 0){
			var html2 = "<dl>";
		
			var markdown2 = "";
			for (var x=0; x<definitions['a'].length;x++) {
				markdown_def2 = converter.makeHtml(definitions['a'][x]['d']);	
				markdown_term2 = converter.makeHtml(definitions['a'][x]['t']);
				if(definitions['a'][x]['fo']){
				html2 += "<dt>"+ converter.makeHtml(definitions['a'][x]['fo']) +"</dt>";
				}
				else{
				html2 +="<dt>"+ markdown_term2 +"</dt>";
				}
				if (definitions['a'][x]['i']) {
					html2 +='<a style="color:#900" href="">(Open/Close Picture)</a>';
					html2 +='<img class="hide" src="'+definitions['a'][x]['i']+'"/>';
				}
				html2 += "<dd>"+ markdown_def2 +"</dd>";
			}
			html2 += "</dl>";
			target2 = Dase.$('definitions');
			target2.innerHTML = html2;
				Dase.toggle_def_images();	
			click_count = 1;
		}
	for (var i=0;i<links.length;i++) {
		links[i].onclick = function() {
			var html = "<dl>";
		
			var markdown = "";
			for (var j=0; j<definitions[this.className].length;j++) {
				markdown_def = converter.makeHtml(definitions[this.className][j]['d']);	
				markdown_term = converter.makeHtml(definitions[this.className][j]['t']);
				if(definitions[this.className][j]['fo']){
				html += "<dt>"+ converter.makeHtml(definitions[this.className][j]['fo']) +"</dt>";
				}
				else{
				html +="<dt>"+ markdown_term +"</dt>";
				}
				if (definitions[this.className][j]['i']) {
					html +='<a style="color:#900" href="">(Open/Close Picture)</a>';
					html +='<img class="hide" src="'+definitions[this.className][j]['i']+'"/>';
				}
				html += "<dd>"+ markdown_def +"</dd>";
			}
			html += "</dl>";
			target = Dase.$('definitions');
			target.innerHTML = html;
				Dase.toggle_def_images();	
			return false;
		}
	}
};
Dase.toggle_def_images = function(){
	$('div.centercontent dl img').hide();
	$('div.centercontent dl a').click(function(){
		if ($(this).next('img').hasClass('hide')) {		
			$(this).next('img').removeClass('hide');
			$('div.centercontent dl img').hide();
			$(this).next('img').show();
		} 
		else {	
			$(this).next('img').addClass('hide');
			$(this).next('img').hide();
		}
			return false;
	});
	$('div.centercontent img').click(function(){
			$(this).addClass('hide');
			$(this).hide();
	});		
};

Dase.loadDefinitions = function() {
	var url = 'glossary.json';
	Dase.getJSON(url,
			function(json) {
			Dase.initDefinitionLinks(json);
			Dase.$('loading').className = 'hide';
			},null,null);
};

Dase.addLoadEvent(function() {
		Dase.loadDefinitions();
		});

