var queryCount = -1;
var currentPage = window.location.hash;
if (typeof Stanford == "undefined") {
	var Stanford = {};
}
Stanford.datatable = {};
Stanford.datatable.mouseOverTimeoutObj = 0;

// submit the query to the back-end handler
var handleSuccess = function(o){
	if(o.responseText !== undefined){
              var myColumnSet = new YAHOO.widget.ColumnSet(Stanford.datatable.config.columnHeaders);
             
              var jsonresult = eval("("+o.responseText+")");
		/* 'pre' function to do any additional jsonProcessing */
	      if (Stanford.datatable.config['jsonProcessorFunction']) {
		 js = Stanford.datatable.config.jsonProcessorFunction(jsonresult);
		 if (typeof js == 'object') {
			jsonresult = js;
		 }
              } 
	      var contentData = Stanford.datatable.config.contentData;
              var mydata = jsonresult[contentData];
              var myDataSource = new YAHOO.util.DataSource(mydata);
              myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
              myDataSource.responseSchema = myDataTableSchema;

              var myDataTable = new YAHOO.widget.DataTable(Stanford.datatable.config.resultDiv, myColumnSet, myDataSource,Stanford.datatable.config.caption);
		/* Post function to set table handlers, etc. */
	      if (Stanford.datatable.config['postFunction']) {
		 Stanford.datatable.config.postFunction(myDataTable, jsonresult);
              } 
              setSearchProgress(-1);
        }
        else {
            error_message();
        }
}


		
var handleFailure = function(o) {
    error_message();
    };

var callback =
{
  success:handleSuccess,
  failure:handleFailure
};

var countsuccess = function(o){
	if(o.responseText !== undefined){
             var rn = document.getElementById(Stanford.datatable.config.navElementsId);
	     if (!rn) {
		debug("No place to display results nav, so not displaying");
		return;
	     }
              queryCount = o.responseText;
              var countInfo = eval ("("+queryCount+")");
	      var output = "";
              var count = parseInt(countInfo.count,10);
	      if (count > 0 ) {
                var perpage  = parseInt(countInfo.perpage,10);
                var from = parseInt(countInfo.from,10);
                var last = perpage + from;
                if (last > count) {
                  last = count;
                }
                var output = "<p>Displaying results "+(from+1)+"-"+last+" of "+ count +" - </p>";
                var numpages = Math.floor(count/perpage);
		if ( numpages > 1 ) {
			output = "<p>Your search produced " + (from+1)+"-"+last+" of "+ count + " results </p>";
		}
		else {
			output = "<p>Your search yielded " + count +" results</p>";
                }
                curpage = Math.floor(from/perpage);
                paginglinks = 0;
                var linkslist = 'Go to page: <a href="javascript:show_more(0);">&lt;&lt;</a> ';
                var start = curpage-5;
                if (start < 0) {
                  start = 0;
                }
                var endpage = start +10;
                if (endpage > numpages) {
                  endpage = numpages;
                  start = endpage-10;
                  if (start <0) {
                      start = 0;
                  }
                }

                var index;
                for (index =start; index <=endpage; index++) {
                   var viewname = index + 1;
                   if (index != curpage) {
                      linkslist += '<a href="javascript:show_more('+(index*perpage)+');">'+viewname+'</a> ';
                   }
                   else {
                      linkslist += viewname+' ';
                   }
                }
                var lastpage = count-perpage +1;
                if (lastpage <0) {lastpage = 0;}
                linkslist += '<a href="javascript:show_more('+lastpage+');">&gt;&gt;</a> ';
		if ( numpages > 1 ) {
  		    output += linkslist;
                }
	     }
	     else {
		output = "No results found";
	     }
             rn.innerHTML = output;
      }
}
  

var callbackcount = 
{
  success:countsuccess,
  failure: countfailure
}


var countfailure = function(o){
error_message();
}
function show_more(start) {

    processFormData(start);
}

function submitform(e) {
YAHOO.util.Event.stopEvent(e);
processFormData(0);
}

Stanford.datatable.prepopulate = function( ) {
    processFormData( 0 );
}

function processFormData(start) {
	//debug("starting it");
    // With start of -1 we are coming from a URL, 
    // Thus there is no need to update start count, or to store the history
    if (start != -1) {
        var fromnumfield = document.getElementById(Stanford.datatable.config.fromNumElementId);
        fromnumfield.value=start;
    }

   var formObject = document.getElementById(Stanford.datatable.config.formName);
   var formcontents = YAHOO.util.Connect.setForm(formObject);
   
   if (start != -1) {

	internalLink(formcontents);
   	//window.location.hash=formcontents;
   	currentPage = window.location.hash;
   }
   setSearchProgress(0);
   var CountObj = YAHOO.util.Connect.asyncRequest(
	'POST',
	'/' + StanfordJavaContextRoot + '/' + Stanford.datatable.config.servlet + 
		'/' + Stanford.datatable.config.servletType + '/count', 
	callbackcount );
   YAHOO.util.Connect.setForm(formObject);
   var cObj = YAHOO.util.Connect.asyncRequest(
	'POST', 
	'/' + StanfordJavaContextRoot + '/' + Stanford.datatable.config.servlet + '/' + 
		Stanford.datatable.config.servletType + '/results', 
	callback );
}

function setSearchProgress(go) {
        var limit = Stanford.datatable.config.searchTimeout*1000;
        var interval = 500;

    var prog = document.getElementById(Stanford.datatable.config.resultDiv);
 
    if (go<0) {
        if (progressCount) {
            clearTimeout(progressCount);
        }
        if (go !=-99) {
        }
    }
    else {

        if (go == 0) {
            currentCount = 0;
            prog.innerHTML = "Searching";
        }

        progressCount = setTimeout(function() {
            prog.innerHTML += ".";
            currentCount += interval;
            if (currentCount < limit) {
                setSearchProgress(1);

            }
            else {
                showSearchError();
            }
        }, interval);
    }
}

Stanford.datatable.refreshHashUpdates = function() {
	//debug("Refreshing");
	var pg = window.location.hash;
	if (pg==currentPage) {
		//debug(pg+"="+currentPage);
		return;
	}
	else {
		//debug ("parsing "+currentPage);
		currentPage = pg;
		parse_query_string();
	}
}	
	      
function showSearchError() {
    debug("showing search error");
    setSearchProgress(-99);
    var prog = document.getElementById(Stanford.datatable.config.navElementsId);
    prog.innerHTML= "Search is taking a long time...  Possible system problems";
    error_message();
  }
  
function error_message() {
    debug("technical difficulties.");
    
}

// Called after DOM is initialized on page
Stanford.datatable.init = function() {
	var perpageevt = YAHOO.util.Event.addListener("perpage","change",submitform);
	var evntset = YAHOO.util.Event.addListener(Stanford.datatable.config.formName, "submit", submitform);
	//debug("parsing query");
	parse_query_string();
	//debug("setting refresh");
	var IntervalSet = setInterval(Stanford.datatable.refreshHashUpdates,900);
	//debug("refresh set:"+IntervalSet);
}

function parse_query_string() {
        var infodiv = document.getElementById('info');
	if (infodiv) {
		debug("Hiding");
        	infodiv.className = "hidden";
	}
	else {
		debug("infodiv not found");
	}
	var doc = ''+document.location;
	var qs;
	// Use hash as first priority
	// If it is not present, use query string
	qs = window.location.hash;
	if (!qs) {
		if (doc.indexOf('?')>0) {
			qs = doc.substring(doc.indexOf('?')+1);
		}
		else {
			return;
		}
	}
	else {
		// String # off of hash
		qs = qs.substring(1);
	}
	//debug("Query:"+qs);
	var myArray = new Array();
	myArray = qs.split('&');

	var myFormItems = new Array();
	var bq = document.forms[Stanford.datatable.config.formName];
	for (i=0;i<bq.length;i++) {
		myFormItems[bq[i].name] = i;
		// Clean up hidden fields
		if (bq[i].type == 'hidden') {
			if (bq[i].className == 'passedparam') {
				bq[i].value = '';
			}
		}
	}
	var paramsSet = 0;
	for (i in myArray) {
		var qsp = myArray[i];
		if (typeof(qsp) != 'string') {
			continue;
		}
		var rslt =qsp.split("=");
		if (rslt.length >=1) {
			var name = unescape(rslt[0]);
			var val = unescape(rslt[1]);
			if (myFormItems[name] != null) {
				// For non optionlist, we can just set it directly
				var formitem = bq[myFormItems[name]];
				if (formitem.options == null) {
					formitem.value = val;
					paramsSet++;
				}
				else {
					// Set option list value if applicable
					var success = 0;
					for (i=0;i<formitem.options.length;i++) {
						if (formitem.options[i].value == val) {
							formitem.options.selectedIndex = i;
							paramsSet++;
							success=1;
							break;
						}
					}
					if (success == 0) {
						// We could add a new option... but we don't for now
					}
				}
			}
			else {
				// It doesn't exist, just add to form
				//debug("Does not exist in form - add it");
				//debug("name:"+name+":"+val);
				var el = document.createElement("input");
				el.type="hidden";
				el.name = name;
				el.value = val;
				bq.appendChild(el);
				//debug(bq);
				paramsSet++;
			}
		}
	}
	// Call the submit
	if (paramsSet != 0) {
		processFormData(-1);
	}
			
}

function debug(msg)
{
    if (typeof console != "undefined")
    {
        console.log(msg);
    }
}

Stanford.datatable.initialize = function(initobj) {
	Stanford.datatable.initializeconfig(initobj);
	YAHOO.util.Event.onDOMReady(Stanford.datatable.init);
}

Stanford.datatable.initializeconfig = function(initobj) {
	if (!initobj['resultDiv']) {
		initobj['resultDiv'] = 'bs';
	}
	if (!initobj['contentData']) {
		initobj['contentData'] = 'contentData';
	}
	if (!initobj['formName']) {
		initobj['formName'] = 'bioquery';
	}
	if (!initobj['servletType']) {
		initobj.servletType = '';
	}
	if (!initobj['searchTimeout']) {
		initobj.searchTimeout = 40;
	}
	if (!initobj['fromNumElementId']) {
		initobj.fromNumElementId = 'fromNum';
	}
	if (!initobj['navElementsId']) {
		initobj.navElementsId = 'resultsnav';
	}
	if (!initobj['servlet']) {
		initobj.servlet = 'TableRouter';
	}
	var validConf = true;
	// Validate objects and display errors 
	var out = document.getElementById(initobj.resultDiv);
	if (!out) {
		debug("Stanford Datatable error:"+initobj.resultDiv+" element does not exist for placing table");
		validConf = false;
	}
	if (!document.getElementById(initobj.formName)) {
		debug("Stanford Datatable error:"+initobj.formName+" form does not exist");
		validConf = false;
	}
	if (!document.getElementById(initobj.navElementsId)) {
		debug("Warning: nav element:"+initobj.navElementsId+" does not exist - no nav will be displayed");
	}
	Stanford.datatable.config = initobj;
	return validConf;

}

/* Custom functions */		
function show_type(obj) {

	var rlt = getObj(obj,"");
	var infodiv = document.getElementById('info');
	if (infodiv) {
		infodiv.innerHTML = "<h1>Type Information</h1>"+rlt;
		infodiv.className = "show";
	}
}







function show_info(id) {
	var servletType = Stanford.datatable.config.servletType;
   	var detailObj = YAHOO.util.Connect.asyncRequest(
		'POST',
		'/' + StanfordJavaContextRoot + '/' + 
			Stanford.datatable.config.servlet + '/' + Stanford.datatable.config.servletType + '/detail', 
		callbackdetail, 
		'id=' + id );
}

function show_bsinfo(id) {
   	var detailObj = YAHOO.util.Connect.asyncRequest(
		'POST',
		'/' + StanfordJavaContextRoot + '/' + Stanford.datatable.config.servlet + '/' + 
			Stanford.datatable.config.servletType + '/detail', 
		callbackdetail, 
		'id='+id);
}

var clearMouseover = function() {
	if (Stanford.datatable.mouseOverTimeoutObj) {
		clearTimeout(Stanford.datatable.mouseOverTimeoutObj);
	}
}


var showme = function(a) {
	var child = a.target.childNodes;
	if (child) {
		if (child.length >0) {
			kid = child[0];
			kidclass = kid.className;
			if (kidclass) {

				if (kidclass.indexOf("biotype") != -1) {
					var classindex = kidclass.substring(kidclass.indexOf("biotype")+7);
					if (classindex.indexOf(" ") > 0 ) {
						classindex = classindex.substring(0,classindex.indexOf(" "));
					}
					if (Stanford.datatable.mouseOverTimeoutObj) {
						clearMouseover();
					}
					Stanford.datatable.mouseOverTimeoutObj = setTimeout("show_type("+metadata[classindex]+")",100);
				}

				if (kidclass.indexOf("bioinfo") != -1) {
					var classindex = kidclass.substring(kidclass.indexOf("bioinfo")+7);
					if (classindex.indexOf(" ") > 0 ) {
						classindex = classindex.substring(0,classindex.indexOf(" "));
					}
					clearMouseover();
//					Stanford.datatable.mouseOverTimeoutObj = setTimeout("show_info("+classindex+")",100);
				}
			}
		}
	}
	
	
};

var detailfailure = function(o){
debug("Detail failed!  bad");
error_message();
}


function fancy_output(obj) { 
	var output = '<b>Attributes:</b>';
	var map = obj['maps'];
	var attr = obj['attrs'];
	
        output += "<table id='detailattrs'>";
	for (i in attr) {
		var a = attr[i];
		var val = a[ 'jsonValue' ];
		var name = a[ 'attributeTypeDisplayName' ];
                
                if ( val == null ) {
                    val = a['value'];
                }
		output += "<tr><td>" + name + ":</td><td>" + val + "</td></tr>";
	}
        output += "</table>";
	output += "<br><b>Mappings:</b><br>";
	output += "<table id='detailmappings'><tr><th>source</th><th>target</th><th>start-coord</th><th>stop-coord</th></tr>";
	for (i in map) { 
		var m = map[i];
		var bioId = m['bioSequenceId'];
		var tid = m['targetBioSequenceId'];
		var menum = m['mappingEnumName'];
		var tStart = m['targetPositionStart'];
		var tStop = m['targetPositionStop'];
		var sname = m['bioSequenceName'];
		var tname = m['targetBioSequenceName'];

                if ( tStart == null || tStart == 0 ) {
                    tStart = "";
                }
                if ( tStop == null || tStop == 0 ) {
                    tStop = "";
                }
		output += '<tr><td><a href="#f=i&q=' + 
                    sname + '">' + sname + '</a></td><td><a href="#f=i&q=' + tname + '">' + tname + 
                    "</a></td><td>" + tStart + "</td><td>" + tStop + "</td></tr>";
	}
	output += "</table>";	
	return output;
}
		
function getObj(obj,pref) {
	var out = "";
	for (i in obj) {
		if (typeof(obj[i]) == 'function') {
			continue;
		}
		else if (typeof(obj[i]) == 'object') {
			//out += i + ":\n" +getObj(obj[i],"  ");
			out += i + ":<blockquote>" +getObj(obj[i],"  ")+"</blockquote>";;
		}
		else {	
			//out += pref + i+":"+obj[i]+"("+typeof(obj[i])+")<br>\n";
			out += pref + i+":"+obj[i]+"<br>\n";
		}
	}
	return out;
}
var detailsuccess = function(o) {
	if (o.responseText != undefined) {
		var jsonresult = eval("("+o.responseText+")");
		var rlt = fancy_output(jsonresult);
		//var rlt = getObj(jsonresult,"");
		var infodiv = document.getElementById('info');
		infodiv.innerHTML ="<h1>Detail Information</h1>"+rlt;
		infodiv.className = "show";
	}
	else {
		error_message();
	}
}
var callbackdetail = 
{
//  success:detailsuccess,
  failure: detailfailure
}

function internalLink(hash){
if ( /Konqueror|Safari|KHTML/.test(navigator.userAgent ) ) {
df=document.createElement('form');
df.setAttribute("method","get");
df.setAttribute("action", "#"+hash);
document.body.appendChild(df);
df.submit();
document.body.removeChild(df);
} else
document.location.href = "#"+hash;
return false;
}




