
// TODO: Sanitize entries
// TODO: Make sure the scritp works with multiple dl's on a page (IDs)

function Lexikon(element, config)  {
    var props = {
        element: element,
				container: null,
				className: "lexikon"
    };
		this.identifier = new Array();
		this.alphabet = new Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
		this.activeLetter;
		this.existingLetters = new Array();
		
    for (var p in props)  {
        this[p] = (!config || typeof config[p] == 'undefined') ? props[p] : config[p];
    }
		if(typeof(this.container) == "string")  {
			this.container = document.getElementById(this.container);
		}
		// get the styles for the lexikon
		var fileref=document.createElement("link")
		fileref.setAttribute("rel", "stylesheet")
		fileref.setAttribute("type", "text/css")
		fileref.setAttribute("href", "./pix/lexikon.css")
		document.getElementsByTagName("head")[0].appendChild(fileref)

		this.init();
};

Lexikon.prototype.init = function()  {
	target = this.element;
	if(target.nodeName == "DL")  {
		target.className = target.className + this.className;
		var identifierTemp = new Array();
		for (i = 0; i < target.childNodes.length; i++)  {
			var node = target.childNodes[i];
					if (node.nodeName == "DT")  {
						// first, check if we got a suitable id, then use that or set a new one
						if (node.id.type != "undefined" && node.id != "")  {
							identifierTemp.push(node.id);
						} else  {
							for (j = 0; j < node.childNodes.length; j++)  {
								if(node.childNodes[j].nodeType == 3)  {
									nodeText = node.childNodes[j].data;
									break;
								}
							}
							var nodeTextChunks = nodeText.split(" ");
							var k = 0
							do  {
								if (k >= nodeTextChunks.length)  {
									nodeTextChunk = "term_"+i;
								} else  {
									if (nodeTextChunks[k] != "")  {
										nodeTextChunk = nodeTextChunks[k];
									}
								}
								k++;
							} while (in_array(nodeTextChunk, identifierTemp));
							identifierTemp.push(nodeTextChunk);
							node.id = nodeTextChunk;
						}
						// here could be some onclick action for folding entries
					} else if (node.nodeName == "DD")  {
						node.id = identifierTemp[identifierTemp.length -1]+"_desc";
					}
		}
			// also get object references for all the entries
			for (var i = 0; i < identifierTemp.length; i++)  {
				var dtReference = document.getElementById(identifierTemp[i]);
				var ddReference = document.getElementById(identifierTemp[i]+"_desc");
				//alert(identifierTemp[i]);
				for (j = 0; j < dtReference.childNodes.length; j++)  {
					if(dtReference.childNodes[j].nodeType == 3)  {
						nodeText = dtReference.childNodes[j].data;
						break;
					}
				}
				var letter = nodeText.charAt(0);
				letter = letter.toLowerCase();
				var tempArray = new Array(letter, identifierTemp[i], dtReference, ddReference);
				this.identifier.push(tempArray);
			}
			// now draw the index
			this.createIndex();
			// check if we got a hash and if so, display the right entries
			var hash = location.hash;
			hash = hash.toLowerCase();
			if ((hash != "" || hash != "undefined") && in_array(hash.charAt(1), this.alphabet) && in_array(hash.charAt(1), this.existingLetters))  {
				this.showEntries(hash.charAt(1));
				var activeLink = document.getElementById('letter_'+hash.charAt(1));
				activeLink.className = "active";
			} else  {
				this.showEntries("a");
				var activeLink = document.getElementById('letter_a');
				activeLink.className = "active";
			}
		} else  {
		alert("selected element is not of type 'dl'");
	}
};

Lexikon.prototype.createIndex = function()  {
	var container = false;
	target = this.element;
	if (this.container != null)  {
		container = this.container;
	} else  {
		var container = document.createElement('div');
		container.id = target.id + "_index";
		container.className = this.className + "_index";
		target.parentNode.insertBefore(container, target);
		this.container = document.getElementById(target.id + "_index");
	}
	for (var i = 0; i < this.identifier.length; i++)  {
	 this.existingLetters.push(this.identifier[i][0]);
	}
	for (var i = 0; i < this.alphabet.length; i++)  {
		var letter = this.alphabet[i];
		if (in_array(letter, this.existingLetters))  {
			var link = document.createElement('a');
			link.href = "#" + letter;
			link.id = "letter_" + letter;
			that = this;
			link.onclick = function()  {
					that.showEntries(this.id.charAt(this.id.length-1));
					for (i = 0; i < that.container.childNodes.length; i++)  {
						var node = that.container.childNodes[i];
						if (node.nodeName == "A")  {
							node.className = "";
						}
					}		
					this.className = "active";
			}
			var linkText = document.createTextNode(letter);
			link.appendChild(linkText);
		} else  {
			var link = document.createElement('span');
			var linkText = document.createTextNode(letter);
			link.appendChild(linkText);
		}
		container.appendChild(link);
	}
};

Lexikon.prototype.showEntries = function(letter)  {
	letter = letter.toLowerCase();
	for (var i = 0; i < this.identifier.length; i++)  {
	if (this.identifier[i][0] == letter)  {
			this.identifier[i][2].style.display = "block";
			this.identifier[i][3].style.display = "block";
		} else  {
			this.identifier[i][2].style.display = "none";
			this.identifier[i][3].style.display = "none";
		}
	}
};

//php function in_array
function in_array(needle, haystack, strict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
 
    var found = false, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}
