// ############### init

function ReadFile(fileUrl) {
    var req;
    var fileContent;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.open("GET", fileUrl, false);
        req.send(null);
        fileContent = req.responseXML;
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        req.open("GET", fileUrl, false);
        req.onreadystatechange=function() {
                                    if (req.readyState == 4) {
                                        fileContent = req.responseXML;
                                    }
                                }
        req.send(null);
    }
    return fileContent;
}// FileRead End

// ## prepare search array ##
/**
 * Provides suggestions for state names (USA).
 * @class
 * @scope public
 */

function StateSuggestions() {

    this.states = new Array();
	
    var linkPattern = /^javascript.showPage\('(.*)'\).*/i; 	// extract hyperlinks
    var oGraphData = ReadFile('../wi/graph.xml');
    var oNodes = oGraphData.getElementsByTagName('node');

	for (var i=0; i<oNodes.length; i++) {
		var sDisplayEntry = oNodes[i].getElementsByTagName('label')[0].firstChild.nodeValue;
		var sNodeId = oNodes[i].attributes[0].nodeValue;
		var sClassName = oNodes[i].attributes[1].nodeValue;
		var sDisplayLink = null;

		// get displayLink
		var link = oNodes[i].getElementsByTagName('ref')[0];
		if ( link != null) {
			link = link.attributes[0].nodeValue;
			if ( linkPattern.exec(link) != null) {
				sDisplayLink = RegExp.$1;
			}
		}
	   	   
		// get color
		var sFillColor = null;
		var fill = oNodes[i].getElementsByTagName('fill')[0];
		if ( fill != null) {
			sFillColor = fill.attributes[0].nodeValue;
		}
		this.states.push(new Array(sDisplayEntry, sNodeId, sDisplayLink, sClassName, sFillColor));
	}

}

/**
 * Request suggestions for the given autosuggest control.
 * @scope protected
 * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
 */
StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
                                                          bTypeAhead /*:boolean*/) {
	
	// aSuggestions-array second dim: 0=suggestionWord, 1=suggestionEntry, 2=suggestionEntryLink;
	var aSuggestions = [];

    var sTextboxValue = oAutoSuggestControl.textbox.value;
    
	// start suggesting if user has entered more two one chars
	if (sTextboxValue.length > 1){

        //convert value in textbox to lowercase
   		var pGraphNodeNamePattern = new RegExp("(.*)(\\S*(" + sTextboxValue + ")\\S*)(.*)", "i");

        //search for matching links (= states)
   		for (var i=0; i < this.states.length; i++) {

			// compare the lowercase versions for case-insensitive comparison
			// search left AND right

			if ( pGraphNodeNamePattern.exec(this.states[i][0]) != null ) {
				var sWord = RegExp.$2;
				var sWordCompletion = sTextboxValue + sWord.substring(sTextboxValue.length);
				var sEntryPrefix = RegExp.$1;
				var sEntryMiddle = RegExp.$3;
				var sSuffix = sWord + RegExp.$4;
				var sEntrySuffix = sSuffix.substring(sEntryMiddle.length);
				var sEntryNodeId = this.states[i][1];
				var bIsLink = false;
				
				if (this.states[i][2] != null) bIsLink = true;
                	//add a suggestion using what's already in the textbox to begin it
                	aSuggestions.push(new Array(sWordCompletion, sEntryPrefix, sEntryMiddle, sEntrySuffix, sEntryNodeId, bIsLink));
            }
            if (aSuggestions.length > 20) {
               aSuggestions.push(new Array(sWordCompletion, ' * * * ', '', '', '', false));
               break;
            }
        }
		if (aSuggestions.length == 0) {
			oAutoSuggestControl.currentLinkId = 0;
			oAutoSuggestControl.cur = -1;
		}
	} else {
		oAutoSuggestControl.currentLinkId = 0;
		oAutoSuggestControl.cur = -1;
    }

	//provide suggestions to the control
	oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
};

StateSuggestions.prototype.displayLink = function (nodeId) {
	for (var i=0; i<this.states.length; i++) {
		if (this.states[i][1] == nodeId) {
			if (this.states[i][2] != null)
				window.open(this.states[i][2], 'content');
			break;
		}
	}
   
	var oGraphDoc = window.parent.frames["intermediate"].frames["middle"].frames["graph"].document;
	var oMsg = window.parent.document.getElementById('message');
	 
	// display a wait msg
	oMsg.innerHTML = 'Bitte warten';
	oMsg.className = 'message';
	
	// center graph
	try {
		var oApplet = oGraphDoc.getElementsByTagName('applet')[0];
		var oGraph = oApplet.getGraphPanel().getGraph();
		var graphNode = oGraph.getElement(nodeId);
		oApplet.getGraphPanel().centerNode(graphNode);
	} catch (e) {
		oMsg.innerHTML = 'Applet-Fehler';
		alert ('Java-Fehler: Bei der Zentrierung des Graphen ist folgendes Problem ist aufgetreten:\n\n' + e + '\n\nUeberpruefen Sie Ihr Java Runtime Environment.');	
	}
	// clear wait msg
	oMsg.className = 'message invisible';
};

	
