var carouselContext = null;
var carouselContextType = null;

/**
 * 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, '/users/carousel', start, (last-start+1) * 2);
};

/**
 * 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, '/users/carousel', 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, '/users/carousel', start, (last-start+1) * 2);
    }
};

/**
 * Custom button state handler for enabling/disabling button state.
 * Called when the carousel has determined that the previous button
 * state should be changed.
 * Specified to the carousel as the configuration
 * parameter: prevButtonStateHandler
 */
var handlePrevButtonState = function(type, args) {

    var enabling = args[0];
    var leftImage = args[1];
    if(enabling) {
        leftImage.src = "/lib/img/left-enabled.gif";
    } else {
        leftImage.src = "/lib/img/left-disabled.gif";
    }
};

var handleNextButtonState = function(type, args) {
    var enabling = args[0];
    var rightImage = args[1];

    if(enabling) {
        rightImage.src = "/lib/img/right-enabled.gif";
    } else {
        rightImage.src = "/lib/img/right-disabled.gif";
    }

};

var showButtons = function(type, args) {
    YAHOO.util.Dom.setStyle("next-arrow", "visibility", "visible");
    YAHOO.util.Dom.setStyle("prev-arrow", "visibility", "visible");
};


/**
 * You must create the carousel after the page is loaded since it is
 * dependent on an HTML element (in this case 'dhtml-carousel'.) See the
 * HTML code below.
 */
var carousel; // for ease of debugging; globals generally not a good idea

var pageLoad = function()
{
    carousel = new YAHOO.extension.Carousel("dhtml-carousel",
        {
            numVisible:        visible_count,
            animationSpeed:    0.4,
            scrollInc:         scroll_increment,
            loadInitHandler:   loadInitialItems,
            prevElement:       "prev-arrow",
            nextElement:       "next-arrow",
            loadNextHandler:   loadNextItems,
            loadPrevHandler:   loadPrevItems,
            prevButtonStateHandler:   handlePrevButtonState,
            nextButtonStateHandler:   handleNextButtonState,
            size: expert_count
        }
    );

};

YAHOO.util.Event.addListener(window, 'load', pageLoad);

/**
 * 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'] +
        '" alt="' + result['user_name'] +'"/>' +
          result['user_name'] +
          '<\/a>';
  	if (result['title'] != null) tripInnerHTML += '<span>' + result['title'] + '</span>';
    return tripInnerHTML;

};

/**
 * 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, start, numResults)
{
    var params = '?start=' + start + '&results=' + numResults;
	if (carouselContext) params += '&context=' + carouselContext + '&context_type='+carouselContextType;

    var callback =
    {
          success: function(callbackResponse){
				var start = callbackResponse.argument[0];
			    var numResults = callbackResponse.argument[1];
			    var carousel = callbackResponse.argument[2];

			      if(callbackResponse.responseText !== undefined) {
				  	var rs = YAHOO.lang.JSON.parse(callbackResponse.responseText);
			        for(var i=0; i< rs.length; i++) {
			            var result = rs[i];
			            carousel.addItem(start+i, fmtTripInnerHTML(result));
			        }
			        showButtons();
			     }
			},
			failure: function(o){
				//var result = o.status + " " + o.statusText;
     			//alert("Transaction failed.  The error is: " + result);
			},
			cache:false,
          	argument: [start, numResults, carousel]
		    };

    var sUrl = url + params;

    var obj = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
};
