// =========================================================================
// Configuration
//
var date_width         = 84;
var body_width         = 270;
var loading_message = "<em>Loading data, please wait ...</em>";
//
// =========================================================================

var myDataTable;
var myDataSource;
var current_meeting_id;
var isCallInProgress = false;

var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;

function dominit() {
}

YAHOO.example.DynamicData = function() {

    var myColumnDefs = [
        {key:"meeting_date", label:"Date",sortable:false,resizeable:true, width:date_width},
        {key:"body",         label:"Body",sortable:false,resizeable:true, width:body_width}
        ];

    // DataSource instance
    myDataSource                = new YAHOO.util.DataSource("/async/tabledata?");
    myDataSource.responseType   = YAHOO.util.DataSource.TYPE_JSON;
    myDataSource.responseSchema = {
        resultsList: "records",
        fields: [
            {key:"meeting_date"},
            {key:"body"},
            {key:"meeting_id"}
        ],
        metaFields: {
            totalRecords: "totalRecords",
	    recordsReturned: "recordsReturned",
	    elapsed: "elapsed"
        }
    };

    var request_string = search_string();
    var oConfigs = {
        /*initialRequest: "sort=meeting_date&dir=desc&startIndex=0&rows=15",*/
	initialRequest: request_string,
       	dynamicData: true,
        sortedBy : {key:"meeting_date", dir:YAHOO.widget.DataTable.CLASS_DESC},
        selectionMode:"single",
        scrollable:true, 
        height:"21em"
    };

    myDataSource.subscribe("responseParseEvent", function(oArgs){
        document.getElementById("summary").innerHTML = 
	"Currently showing <b>" +  oArgs.response.meta.recordsReturned +
	"</b> of  <b>"    + oArgs.response.meta.totalRecords +
        "</b> records (" + oArgs.response.meta.elapsed + " seconds).";
    });

    myDataSource.subscribe("requestEvent", function(oArgs){
        document.getElementById("summary").innerHTML = loading_message;
    });

    myDataTable =
        new YAHOO.widget.DataTable("grid",
                                   myColumnDefs, myDataSource, oConfigs);

    myDataTable.set("selectionMode","single");
    myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow);
    myDataTable.subscribe("initEvent", initEventHandler);
    myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow);
    myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow);
    myDataTable.subscribe("rowSelectEvent", function(oArgs){
        populate_results(oArgs.record);
    });

    Event.onDOMReady(dominit);

    return {
        ds: myDataSource,
        dt: myDataTable
    };

}();

var results_callbacks = {

    success : function (o) {
	//alert("got json: " + o.responseText);
	
	// Process the JSON data returned from the server
	var response = [];
	try {
	    response = YAHOO.lang.JSON.parse(o.responseText);
	}
	catch (x) {
	    alert("JSON Parse failed!");
   	    isCallInProgress = false;
	    return;
	}
	
        var element    = document.getElementById("results");
	element.innerHTML = response['results_html'];
	isCallInProgress = false;
    },
    failure : function (o) {
	isCallInProgress = YAHOO.util.Connect.isCallInProgress(o);
	if (!isCallInProgress) {

	    if (o.status == 503) {
		// 503 is 'service unavailable', which we're hijacking
		// to mean 'meeting unavailable'.  See Async.pm for
		// more info.
		alert("This meeting is temporarily unavailable.\n" +
		      "Please try again later.");
		search_function(); // resubmit to clear table
            } else {
		// unknown error, dump everything
		//
		var msg = "";
		//msg = msg + "Transaction id:  " + o.tId + "\n"; // not helpful
		msg = msg + "HTTP status:     " + o.status + "\n";
		msg = msg + "Status code msg: " + o.statusText + "\n";
		msg = msg + "HTTP Headers:    " + o.getAllResponseHeaders + "\n";
		msg = msg + "Server response: " + o.responseText + "\n";

		alert("Async call failed:\n\n" + msg);
	    }

	} else {
	    alert("Async call still in progress.");	
        }
    },
    timeout : 3000
}

var stub_callbacks = {  // these do nothing, obviously.
    success : function (o) {
	;
    },
    failure : function (o) {
	;
    },
    timeout : 1000
}

function populate_results(record) {
   var element    = document.getElementById("results");
   element.innerHTML = "";
   current_meeting_id = record.getData('meeting_id');

   // This prevents the browser from issuing an AJAX request if another is currently
   // in progress.
   //
   if (! isCallInProgress) {
      isCallInProgress = true;	
      YAHOO.util.Connect.asyncRequest('GET',"/async/results/" + current_meeting_id, results_callbacks);
   }
}

function search_string() {
   var num  = document.form["number_of_records"].value;
   var when = document.form["when"].value;
   var body = document.form["body"].value;

   return "sort=meeting_date&dir=desc&rows=" + num + "&body=" + body + "&when=" + when;
}

function search_function() {

   var element    = document.getElementById("results");
   element.innerHTML = "";
 
   var request_string = search_string();

   myDataSource.sendRequest(request_string,
     myDataTable.onDataReturnInitializeTable, myDataTable);
}

function findRowNumForID(myid) {

    var rs  = myDataTable.getRecordSet();
    var len = rs.getLength();
    var i;
    for (i=0; i<len; i++) {
	var meeting_id = rs.getRecord(i).getData('meeting_id');
	if (myid == meeting_id) {
	    return i;
	}
    }
    return 0; //shouldn't happen
}

function initEventHandler() {

    if (ng_meeting_id) {
	var rowNum = findRowNumForID(ng_meeting_id);
	var trEl = myDataTable.getTrEl(rowNum);
	trEl.scrollIntoView(false);
	myDataTable.selectRow(trEl);
    } else {
	myDataTable.selectRow(myDataTable.getTrEl(0)); 
    }
}

