
/**
 * Custom inital load handler. Called when the carousel loads the initial
 * set of data items. Specified to the carousel as the configuration
 * parameter: loadInitHandler
 */
var loadInitialItems = function(type, args) {

	var start = args[0];
	var last = args[1]; 
	// fetch twice the number for caching. images are create once.
	makeRequest(this, 'getTrips.php', "Amsterdam", start, (last-start+1) * 2);	

	// Illustrates setting the size during the load. Set silent parameter to true
	this.setProperty("size", 20, true);

};

/**
 * Custom load next handler. Called when the carousel loads the next
 * set of data items. Specified to the carousel as the configuration
 * parameter: loadNextHandler
 */
var loadNextItems = function(type, args) {	

	var start = args[0];
	var last = args[1];
	var alreadyCached = args[2];
	
	if(!alreadyCached) {
		makeRequest(this, 'getTrips.php', "Amsterdam", start, (last-start+1) * 2);
	}

};

/**
 * Custom load previous handler. Called when the carousel loads the previous
 * set of data items. Specified to the carousel as the configuration
 * parameter: loadPrevHandler
 */
var loadPrevItems = function(type, args) {
	var start = args[0];
	var last = args[1]; 
	var alreadyCached = args[2];

	if(!alreadyCached) {
		makeRequest(this, 'getTrips.php', "Amsterdam", start, (last-start+1) * 2);
	}
};



/**
 * Called via the YUI Connection manager (see makeRequest).
 */
var handleSuccess = function(callbackResponse)
{
	var start = callbackResponse.argument[0];
	var numResults = callbackResponse.argument[1];
	var carousel = callbackResponse.argument[2];
	
  	if(callbackResponse.responseText !== undefined) {
		var theTrip = eval( '(' + callbackResponse.responseText + ')' );
		for(var i=0; i< theTrip.ResultSet.totalResultsReturned; i++) {
			var result = theTrip.ResultSet.Result[i];
			carousel.addItem(start+i, fmtTripInnerHTML(result));
		}
		showButtons();
     }
};

/**
 * Since carousel.addItem uses an HTML string to create the interface
 * for each carousel item, this method takes an individual trip plan
 * result and cobbles together HTML for the innerHTML argument.
 */
var fmtTripInnerHTML = function(result) {

  	var tripInnerHTML = 
  		'<a href="' + 
  		result.Url + 
  		'"><img src="' + 
  		result.Image.Url +
		'" width="' +
		75 +
		'" height="' +
		75+
		'"/>' + 
  		trunc(result.Title, 40, 20) + 
  		'<\/a>' + 
  		trunc(result.Summary, 20, 20);
  
	return tripInnerHTML;
	
};

var handleFailure = function(o)
{
     var result = o.status + " " + o.statusText;
     alert("Transaction failed.  The error is: " + result);
};
  
/**
 * A utility function for invoking the YUI connection manager (Ajax)
 * with a URL that matches the Yahoo! developer network Trip Planner
 * APIs (see: http://developer.yahoo.com/travel/tripservice/V1/tripSearch.html)
 *
 * The callback object is the configuration object for the YUI Connection
 * manager. If this is successful, the 'handleSuccess' function is called.
 */
var makeRequest = function(carousel, url, query, start, numResults)
{
	var params = '?query=' + query + 
	                        '&start=' + start + 
	                        '&results=' + numResults; 
	
	var callback =
	{
  		success: handleSuccess,
  		failure: handleFailure,
  		argument: [start, numResults, carousel]
	};
	
	var sUrl = url + params; 
	YAHOO.util.Connect.asyncRequest("GET", sUrl, callback, null);
};

/**
 * Just a utility function for cleaning up the returned HTML response
 * and truncating it.
 */
var trunc = function(str, maxLen, maxWordLen) 
{
	// Strip markup
    str = str.replace("<b>", "");
    str = str.replace("<\/b>", "");
    str = str.replace("<B>", "");
    str = str.replace("<\/B>", "");
    
    // Simple truncation
	if(str.length > maxLen) {
		str = str.substring(0,maxLen) + "...";
	}

	// Truncate for long words
	var start = 0;
	var loopCnt = 0;
	var strSlice = str;
	
	do  {
		var spaceBreak = strSlice.indexOf(' ');
		var lenOfWord = spaceBreak;
		if(lenOfWord == -1)
		{
			lenOfWord = strSlice.length;
		}

		if (lenOfWord > maxWordLen) {
			//debugMsg("Long word found in: " + strSlice);
			str = str.substring(0, maxWordLen);  // TRUNCATE
		}
		start = spaceBreak+1;
		strSlice = strSlice.substring(start);
		spaceBreak = strSlice.indexOf(' ');
	} while(spaceBreak != -1)
	
	
	return str;
};