/**
 * 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', searchRed, searchGreen, searchBlue, searchPattern, searchCat, 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', searchRed, searchGreen, searchBlue, searchPattern, searchCat, 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', searchRed, searchGreen, searchBlue, searchPattern, searchCat, 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 = "images/left-enabled.gif";    
    } else {
        leftImage.src = "images/left-disabled.gif";    
    }
};

var handleNextButtonState = function(type, args) {
    
    var enabling = args[0];
    var rightImage = args[1];
    
    if(enabling) {
        rightImage.src = "images/right-enabled.gif";
    } else {
        rightImage.src = "images/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:        8,
            animationSpeed:    0.3,
            scrollInc:         4,
            loadInitHandler:   loadInitialItems,
            prevElement:       "prev-arrow",
            nextElement:       "next-arrow",
            loadNextHandler:   loadNextItems,
            loadPrevHandler:   loadPrevItems,
            prevButtonStateHandler:   handlePrevButtonState,
            nextButtonStateHandler:   handleNextButtonState
        }
    );

};


YAHOO.util.Event.addListener(window, 'load', pageLoad);

/**
 * 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 theResult = eval( '(' + callbackResponse.responseText + ')' );
        
        for(var i=0; i< theResult.totalResultsReturned; i++) {
            var result = theResult.items[i];
            carousel.addItem(start+i, fmtTripInnerHTML(result));
        }
        
        //alert(theResult.items[0].id);
    	//$('#imageShow').load('ajax_large.php?id='+result.id);
    	
    	
    	carousel.setProperty("size", theResult.total, true);
    	//carousel.setProperty("autoplay", 5000); 
    	    
        $('#infoCount').html("("+theResult.total+" items)");
		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="" onClick=\'$("#imageShow").load("ajax_large.php?id='+result.id+'"); return false;\'><img src="s_thumbs/' + 
          result.filename +
        '.jpg" width="' +
        100 +
        '" height="' +
        100+
        '"/></a>';
        
    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, searchRed, searchGreen, searchBlue, searchPattern, searchCat, start, numResults)
{
    var params = '?searchRed=' + searchRed + 
    						'&searchGreen=' + searchGreen +
    						'&searchBlue=' + searchBlue +
    						'&searchPattern=' + searchPattern +
    						'&searchCat=' + searchCat +
                            '&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;
};