
var showDebugMsg = false;

var helpWindow;

function showHelp()
{
    if ( !helpWindow || helpWindow.closed ) {
        var settings="scrollbars,resizable"+
                     ",width="+600+
                     ",height="+700;
	    helpWindow = window.open("/spade/doc/spade_help.html",
	                             "spade_help", settings);
	}
    helpWindow.focus();
}

var currentSelection;

// For IE
function addOverage(elem, setdesc) {
	for (i=0; i<elem.childNodes.length; i++) {
		node = elem.childNodes[i];
		if (node.nodeName=="LI") {
			if ( setdesc ) {
				node.onmouseover=function() {
					this.className+=" over";
					setItemDescription(this);
				}
				node.onmouseout=function() {
					this.className=this.className.replace(" over", "");
					resetDescription(true);
				}
			} else {
				node.onmouseover=function() {
					this.className+=" over";
				}
				node.onmouseout=function() {
					this.className=this.className.replace(" over", "");
				}
			}
		}
	}
}
	
function startList() {
	if (document.all&&document.getElementById) {
		navRoot = document.getElementById("nav");
		addOverage(navRoot);
		menuItems = document.getElementById("itemList");
		addOverage(menuItems,true);
	}
}

var currentRequest;
var cancelled = {}; // map of cancelled requests.

function tellThemToWait(waitMsg, key) {
	if ( cancelled[key] ) {
		return;
	}
    var id = "waitPnl";
    var waitTable = "<table id='wait'><tr><th>" + waitMsg + "</th></tr>" +
        "<tr ><td class='loadIcon'><img src='images/ajax-loader.gif'/></td></tr>" +
        "<tr><td align='right'><input type='button' onClick='javascript:cancelQuery("+key+")' value='Cancel'/></td></tr></table>";

    var newMod;
    var isNew = true;
    if (panels[id]) {
        isNew = false;
        newMod = panels[id];
        newMod.setBody(waitTable);
        newMod.cfg.setProperty('visible', true);
        newMod.bringToTop();
    } else {
        newMod = new YAHOO.widget.Panel("waitPnl",
            { width:"400px",
            context:["queryTabsnav2","tl","br"],
            // modal: true,
            // fixedcenter: true,
            underlay:"shadow",
            close:false,
            visible:true,
            iframe:true,
            draggable:true} );

        newMod.setBody(waitTable);
        newMod.hideMacGeckoScrollbars();
        panels[id] = newMod;
        newMod.render(document.body);
    }
}

function cancelQuery(queryKey) {
	if ( queryKey ) {
    	cancelled[queryKey] = true;
    }
	msgDiv = document.getElementById('loadingMsg');
	if ( msgDiv ) {
		msgDiv.innerHTML='Query cancelled.';
	}
	dismissWaitPanel();
}

function doneWaiting() {
	dismissWaitPanel();
	if ( currentRequest ) {
		cancelled[currentRequest] = true;
	}
}

function dismissWaitPanel() {
	setCursor("default");
    var id = 'waitPnl';
    if (panels[id]) {
        // make the wait panel invisible and kill it. Necessary for
        // getting loading correct, and to avoid the gif running in
        // the background.
        panels[id].cfg.setProperty('visible', false);
        panels[id].setBody[""];
        panels[id] = null;
    }
}

function checkCancelled(queryKey) {
	return ( cancelled[queryKey] ? cancelled[queryKey] : false );
}

function getAndSetTabContent(tabDiv, url, invokeType, params, fragment, qKey)
{    
	if ( tabDiv == null ) {
		return;
	}
	/* Display a loading message */
    tabDiv.innerHTML = "<div id='loadingMsg'><p>Loading...<\/p></div>&nbsp;<div id='distractorAnchor'></div>";

    /* Fetch some html depending on which tab was clicked */
    var myAjax = new Ajax.Updater(tabDiv, url, 
    					{method:invokeType,parameters:params,beforeUpdate:checkCancelled,onComplete:doneWaiting},qKey);
    
    if ( fragment ) {
    	window.location.href += "#"+fragment;
	}
}

function getDescription(optionValue)
{
	var description = optionValue.substring(optionValue.indexOf('#')+1);
	description = description.substring(0, description.indexOf( '#' ));
	return description;
}

function setLastDescription() {
	lastDescription = document.getElementById( 'productDescription' ).innerHTML;
	lastImg = document.getElementById( 'productIconImg' ).src;
}
function getFields(lItem,base)
{
	var view = checkView();
	if ( view != "" ) {
		view = "&view="+view;
	}
	
	var selection = lItem.id;
	// alert("sel:"+selection +", cur:" + currentSelection );
    //alert("base: "+base);
	if ( selection == currentSelection ) {
		return false;
	}
	if ( '#' == selection ) { // 'unchosen'
		resetPage();
		return false;
	}
	currentSelection = selection;
	var pType = lItem.id;
	var item = itemModel[pType];
	if ( !item ) {
		alert("Unknown item:"+pType);
		return;
	}
	var desc = item.description;
	var pName = item.name;
	var dName = item.display;
    var div = document.getElementById( 'queryTab' );
    var pars = "type="+pType; 
    pars += view;
    // The following is for testing.  Forces preliminary values for the specified fields.  
    // Doesn't handle min/max issues, though.
    // pars += "&query=agency.LIKE.ANF&query=baz.LT.123" ;
    
    setCursor("wait");
	getAndSetTabContent(div, base+'fields', 'get', pars); // , "fields");
	var tabber = document.getElementById('queryTabs').tabber;
	if ( tabber ) {
       	tabber.tabShow(0);
   	}
   	var ptc = document.getElementById( 'pTypeCell' );
   	ptc.colspan=3;
   	ptc.align="left";
	ptc.innerHTML = "<font color='black'>"+pType+"</font>";
	setTimeout( 'setDescription("'+desc+'","'+pName+'")', 50 );
}	

function setCursor(cursor)  {
	document.body.style.cursor=cursor;
}
function fetchSelectionFieldsMenu(itemType) {
	if ( itemType == currentSelection ) {
		// dismissItemsMenu();
		return true;
	}
	currentSelection = itemType;
	// alert("itemType:"+itemType );
    var urlBase = this.location.href;
    if ( urlBase.indexOf('?') > 0 ) {
    	urlBase = urlBase.substring(0,urlBase.indexOf('?'));
	}
    var itemName = getItemName(itemType);
    this.location.href = urlBase+"?type=" + itemName;
}

function strip(prefix, text) {
	return text.substring(prefix.length);
}
function getItemName(selection) {
	var idx = selection.indexOf(')-');
	var tmp = selection.substring( idx+2 );
	idx = tmp.indexOf( '#' );
	if ( idx > 0 ) {
    	tmp = tmp.substring(0, idx);
	}
	return tmp;
}
	
function getAvailable(ptype,base,displayLvl)
{
	clearStats();
    var div = document.getElementById( 'resultsTab' );
    var fieldSet = document.getElementById('getFieldsForm-'+displayLvl);
    var form = fieldSet.form;
    var formElements = form.elements;
    var pars = "type="+ptype;
    pars+="&maxRtnCount="+document.getElementById('maxRtnCount').value;
    pars+="&returnVersions="+document.getElementById('returnVersions').checked;
    pars+="&getMatchCount="+document.getElementById('getMatchCount').checked;
    // alert('pars:'+pars);
    // pars += "&debug=true" 
    displayLvl = displayLvl+"_";
    var valuePrefix = displayLvl + "val_0_";
	var addlRowPrefix = displayLvl + "val_1_";
	
    for (var i=0; i<formElements.length; i++ ) {
    	var elem = formElements[i];
    	if ( elem.id.startsWith(valuePrefix) && elem.value != "" ) {
    		var swapLon = false;
        	var fieldName=strip(valuePrefix, elem.id);
    		if ( "minLon"==elem.name ) {
    			var maxLon = document.getElementById( addlRowPrefix + fieldName );
    			var minVal = elem.value - 0;  // convert to number
    			var maxVal = maxLon.value - 0;  // convert to number
    			if ( minVal > 0 && maxVal < minVal ) {
    				swapLon = true;
    			}
    		}
        	var compName=displayLvl+'comp_0_' + fieldName;
        	var comp = document.getElementById(compName);
        	var compVal = escape(comp.value);
        	pars += "&" + escape(strip(displayLvl,comp.id)) + "=" + escape(comp.value);
        	pars += "&" + escape(strip(displayLvl,elem.id)) + "=" + escape(elem.value);
        	
        	var addlVal = document.getElementById( addlRowPrefix + fieldName );
        	if ( addlVal && addlVal.value != "" ) {
            	var conjName = displayLvl + 'andor_' + fieldName;
            	var conj = document.getElementById(conjName);
        		var conjVal = "AND";
        		if ( swapLon ) {
        			conjVal = "OR"
        		}
            	if ( conj ) {
            		conjVal = conj.value;
                	pars += "&" + escape(strip(displayLvl, conj.name)) + "=" + conjVal;
            	} else {
                	pars += "&" + escape(strip(displayLvl, conjName)) + "=" + conjVal;
            	}
            	compName=displayLvl+'comp_1_' + fieldName;
            	comp = document.getElementById(compName);
            	pars += "&" + escape(strip(displayLvl,comp.id)) + "=" + escape(comp.value);
            	pars += "&" + escape(strip(displayLvl,addlVal.id)) + "=" + escape(addlVal.value);
        	}
       	}
    }
    currentRequest = new Date().getTime();
    setCursor("wait");
    getAndSetTabContent( div, base+'Q2available.jsp', 'post', pars, null, currentRequest); // , "query" );
   	document.getElementById('queryTabs').tabber.tabShow(1);
    setTimeout( 'tellThemToWait("Please wait while we query the database.", currentRequest )', 200 );
   	return false;
}

function queryCancelled(queryKey) {
	if ( !queryKey ) {
		return false;
	}
	return cancelled[queryKey];
}

function getNext(url, params)
{
    var div = document.getElementById( 'resultsTab' );
    getAndSetTabContent( div, url, 'get', params); // , "next" );
}

function getAdmin(url)
{
    var div = document.getElementById( 'adminTab' );
    getAndSetTabContent( div, url, 'get', params); // , "admin" );

}

function setSelection(itemElement, fire)
{
	if ( !itemElement ) {
		return;
	}
	var liElement = document.getElementById( 'itemChoiceMenuRoot' );
	// alert("firstNode:"+liElement.childNodes[0]);
	var item = itemModel[itemElement.id];
	var name = item.display;
	liElement.childNodes[0].data = name ;
	if ( fire ) {
    	getFields(itemElement, "" );
	}
	return true;
}

var lastDescription = "";
var lastImg = "images/spacer.gif";
var defaultImgSrc = "images/spacer.gif";
// var defaultImgSrc = "images/spade1.banner.gif";

function onIconImgError(source) {
debug("iconImgError:"+source);
	source.src = defaultImgSrc;
}

function setItemDescription(itemElem)
{
	var item = itemModel[itemElem.id];
	setDescription(item.description, item.name);
}
function setDescription(desc, pname)
{
debug("setDescription:"+pname);
	setLastDescription();
	var descriptionElement = document.getElementById( 'productDescription' );
	// lastDescription = descriptionElement.innerHTML;
	descriptionElement.innerHTML=desc;
	var iconImgElement = document.getElementById( 'productIconImg' );
	// lastImg = iconImgElement.src;
	var img = "images/spade1.banner.gif";
	if ( pname ) {
		img = "images/products/"+pname+".jpg";
	}
	iconImgElement.src = img;
	return true;
}

function resetDescription(toLast)
{
debug("resetDescription:"+toLast);
	desc = "";
	src = "images/spacer.gif";
	if ( toLast ) {
		desc = lastDescription;
		src = lastImg;
	}
	document.getElementById( 'productDescription' ).innerHTML=desc;
	document.getElementById( 'productIconImg' ).src = src;
	return true;
}

function resetPage()
{
    var div = document.getElementById( 'queryTab' );
    getAndSetTabContent( div, 'blankQuery.html', 'get', null );
    div = document.getElementById( 'resultsTab' );
    getAndSetTabContent( div, 'blankResults.html', 'get', null );
    div = document.getElementById( 'adminTab' );
    getAndSetTabContent( div, 'blankResults.html', 'get', null );
}

var debugCount = 0;
function debug(msg)
{
	if ( showDebugMsg ) {
		document.getElementById( 'debugMsg' ).innerHTML = ++debugCount + ":" + msg;
	}
}

function checkView()
{
    var view = "";
	var query = window.location.search;
	var viewIdx = query.indexOf("view");
	if ( viewIdx < 0 ) {
    	return view;
	}
	viewIdx = viewIdx + 5; // acct for "view="

	var nextTokenIdx = query.indexOf( "&", viewIdx );
	if ( nextTokenIdx == 0 ) { // Special case: no type specified!
		return view;
	}
	var end = query.length;
	if ( nextTokenIdx > 0 ) {
		end = nextTokenIdx;
	}
	var viewLen = end - viewIdx;
	view = query.substr(viewIdx, viewLen);
	view = view.toUpperCase();
	return view;
}

function checkSelection()
{
	var query = window.location.search;
	var typeIdx = query.indexOf("type");
	if ( typeIdx < 0 ) {
    	setSelection(0, false);
    	return true;
	}
	typeIdx = typeIdx + 5; // acct for "type="

	var nextTokenIdx = query.indexOf( "&", typeIdx );
	if ( nextTokenIdx == 0 ) { // Special case: no type specified!
		setSelection(0, false);
		return true;
	}
	var end = query.length;

	if ( nextTokenIdx > 0 ) {
		end = nextTokenIdx;
	}
	var typeLen = end - typeIdx;
	var type = query.substr(typeIdx, typeLen);
	type = type.toUpperCase();
// alert("type:"+type);
	var ul = document.getElementById('itemList');
	var list;
	if ( ul.children ) {
		list = ul.children; // IE
	} else {
		list = ul.childElements();
	}
	for ( var i = 0; i < list.length; i++ ) {
		var item = list[i];
		if ( type == getItemName(item.id).toUpperCase() ) {
			setSelection( item, true );
			break;
		}
	}
}
	
function doSetup()
{
	startList();
	checkSelection();
	// need dhtmHistory.js
	// dhtmlHistory.initialize();
	// dhtmlHistory.addListener(historyChange);
	return true;
}

function historyChange(newLocation, historyData)
{
	debug("a history change has occurred:"+newLocation+
			", historyData:"+historyData);
}
