(function($) {
    var team_encode = new Array();
    var team_decode = new Array();
    team_encode["ANA"] = "A";
    team_encode["OAK"] = "B";
    team_encode["SEA"] = "C";
    team_encode["TEX"] = "D";
    team_encode["CLE"] = "E";
    team_encode["DET"] = "F";
    team_encode["KC"] = "G";
    team_encode["MIN"] = "I";
    team_encode["CHW"] = "J";
    team_encode["BAL"] = "K";
    team_encode["BOS"] = "L";
    team_encode["NYY"] = "M";
    team_encode["TB"] = "N";
    team_encode["TOR"] = "O";
    team_encode["ARI"] = "P";
    team_encode["COL"] = "Q";
    team_encode["LA"] = "R";
    team_encode["SD"] = "S";
    team_encode["SF"] = "T";
    team_encode["CHC"] = "U";
    team_encode["CIN"] = "V";
    team_encode["HOU"] = "W";
    team_encode["MIL"] = "X";
    team_encode["PIT"] = "Y";
    team_encode["STL"] = "Z";
    team_encode["ATL"] = "a";
    team_encode["FLA"] = "b";
    team_encode["NYM"] = "c";
    team_encode["PHI"] = "d";
    team_encode["WAS"] = "e";
    for(var abbv in team_encode) {
       team_decode[team_encode[abbv]] = abbv;
    }

    var total_games = 0;
    var total_distance = 0;
    var total_days = 0;
    var first_day = 0;

    var trip_list = "";
    var dir_trip_list = "";

    $.fn.tripviewer = function() {

       return this.each(function() {
			   
			   var $this = $(this);
			   
			   var $triplistdiv = $("<div></div>").attr("id", "tripviewer-table-div");
			   var $triplist = $("<table></table>").attr("id", "tripviewer-table");
			   var $headerrow = $("<tr></tr>").addClass("tripviewer-headerrow");
			   var $startrow = $("<tr></tr>").addClass("tripviewer-gamerow-even").attr("id", "tripviewer-startrow");
			   $headerrow.append("<td></td>").append("<td>#</td>").append("<td>Date</td>").append("<td>Home</td>").append("<td>Away</td>").append("<td>Dist</td>")
			             .append("<td>Tickets</td>").append("<td>Hotel</td>").append("<td>Travel</td>");
			   $triplist.append($headerrow);
			   $triplist.append($startrow);
			   $triplistdiv.append($triplist);

			   //Your Baseball Trip Summary");
			   var $title = $("<div></div>").attr("id","tripviewer-title").addClass("title-image-div").html("<img src=\"theme/images/trip-summary.png\"/>");
			   var $bar = $("<div></div>").addClass("header-bar");
			   $title.append($bar);

			   var $start_info = $("<div></div>").attr("id","tripviewer-startinfo");
			   var $start_location = $("<span></span>").attr("id","tripviewer-startinfo-location").html("Not Loaded");
			   var $start_date = $("<span></span>").attr("id","tripviewer-startinfo-date").html("4/5/2010");

			   $start_info.append("<span>Starting Location</span>");
			   $start_info.append($start_location);
			   $start_info.append("<span>Starting Date</span>");
			   $start_info.append($start_date);

			   var $totals = $("<div></div>").attr("id","tripviewer-total");
			   var $total_miles = $("<span></span>").attr("id","tripviewer-total-miles").html("0 miles");
			   var $total_games = $("<span></span>").attr("id","tripviewer-total-games").html("0 games");
			   var $total_days = $("<span></span>").attr("id","tripviewer-total-days").html("0 days");

			   $totals.append($total_miles);
			   $totals.append($total_games);
			   $totals.append($total_days);

			   var $footer = $("<div></div>").attr("id","tripviewer-footer");
			   var $printablelink = $("<a></a>").attr({"id" : "tripviewer-footer-printable"}).html("Trip Calendar").click(function() { printableTrip(); });
			   var $savetrip      = $("<a></a>").attr({"id" : "tripviewer-footer-save"}).html("Save Trip").click(function() { saveTrip(); });
			   var $map_link      = $("<a></a>").attr({"id" : "tripviewer-map-link"}).html("Get Directions").click(function() { getMap(); });
			   var $loadtrip      = $("<a></a>").attr({"id" : "tripviewer-footer-load"}).html("Load Trip").click(function() { loadTrip(); });
			   var $cleartrip      = $("<a></a>").attr({"id" : "tripviewer-footer-clear"}).html("Clear Trip").click(function() { $.clearTrip(); });

			   //$footer.append($printablelink);
			   //$footer.append(" | ");
			   $footer.append($map_link);
			   $footer.append(" | ");
			   $footer.append($savetrip);
			   $footer.append(" | ");
			   $footer.append($loadtrip);
			   $footer.append(" | ");
			   $footer.append($cleartrip);

			   $this.append($title);
			   //$this.append($bar);
			   $this.append($start_info);
			   $this.append($totals);
			   $this.append($triplistdiv);
			   $this.append($footer);

			   var $loader = $("<div></div>").attr("id", "loader").addClass("popup").append("<img src=\"loading-large.gif\">");
			   $loader.hide();
			   $this.append($loader);

			   var dialogHTML ="<div id =\"tripviewer-trip-load-header\">Load a saved Baseball Trip</div>";
			   dialogHTML += "<input type=\"text\" id=\"tripload-code\" class=\"btp-form\" value=\"Enter code\"/><br/>";
			   var $loadsubmit = $("<div></div>").addClass("popup-button").attr({"id" : "tripviewer-trip-load-submit"}).html("Submit ").click(function() { processLoad(); });
			   var $loadclose = $("<div></div>").addClass("popup-button").attr({"id" : "tripviewer-trip-load-close"}).html("Close").click(function() { loadTrip(); });

			   var $loadtripdialog = $("<div></div>").attr("id", "triploader").addClass("popup").html(dialogHTML).append($loadsubmit).append($loadclose);
			   $loadtripdialog.hide();
			   $this.append($loadtripdialog);
			   
			});
    };

    $.addStartToTrip = function(a_date, a_start) {
       var string_date = dateToString(STARTINFO.date.loaded ? a_date : Math.max(a_date,SEASONINFO.firstdate.mmdd));
       trip_list += "START" + a_date + ",";

       var rowHTML = "";
       rowHTML += "<td><div class=\"tripviewer-remove-game\">x</div></td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">Start</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\" id=\"tripviewer-startrow-startdate\">" + string_date + "</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\" colspan=4>" + a_start + "</td>";

       // Hotel
       rowHTML += "<td>"; // close me
       // Generate links
       rowHTML += $.getLinksHTML("hotel_hotels", "START", a_date, "Hotels.com");
       rowHTML += " ";
       rowHTML += $.getLinksHTML("hotel_travelocity", "START", a_date, "Travelocity");
       rowHTML += "</td>"; // closed hotel

       // Travel
       rowHTML += "<td>"; // close me
       // Air
       rowHTML += $.getLinksHTML("air", "ANA", a_date, "Air");
       rowHTML += " ";
       // Car
       rowHTML += $.getLinksHTML("car", "ANA", a_date, "Car");
       rowHTML += "</td>"; // closed travel

       //total_distance += parseInt(dist); 
       //total_days = day - first_day + 1;
       $("#tripviewer-startrow").html(rowHTML);
       $("#tripviewer-startrow .tripviewer-goto-game").click(function() { gotoGame("START", a_date); }); 

       $("#tripviewer-startrow .tripviewer-remove-game").click(function() { 
								  $("#tripviewer-startrow").html("");
								  $("#tripviewer-startinfo-location").html("Not Loaded");
								  // remove from triplist - gamegrid
								  $.clearStartLoc();
								  $("#grid").trigger("selectgame");
							       });

       // update totals
       updateTotals();

    }

    $.addGameToTrip = function(a_date, a_id) {
       var date = dateToString(a_date);
       var $gamecell = $("div#"+a_id);
       var home = $gamecell.attr("home");
       var away = $gamecell.attr("away");
       var dist = $gamecell.attr("dist");
       var day = $gamecell.attr("day");

       var game_num = ++total_games;

       trip_list += home + a_date + ",";

       if(total_games <= 25) {
	  dir_trip_list += home + a_date + ",";
       }

       var rowHTML = "";

       if(game_num == 1) {
	  first_day = day;
       }
       if(game_num % 2 == 0) {
	  rowHTML += "<tr class=\"tripviewer-gamerow tripviewer-gamerow-even\" id=\"tripviewer-gamerow-" + day + "\">";
       } else {
	  rowHTML += "<tr class=\"tripviewer-gamerow tripviewer-gamerow-odd\" id=\"tripviewer-gamerow-" + day + "\">";
       } // close me

       // FIXME: temp fix for doubleheaders
       //if(isNaN(dist)) {
       //var prev_home = $().attr("home");
       //dist = __dists[prev_home][home];
       //}

       rowHTML += "<td><div class=\"tripviewer-remove-game\">x</div></td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">" + game_num + "</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">" + date + "</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">" + home + "</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">" + away + "</td>";
       rowHTML += "<td class=\"tripviewer-goto-game\">" + dist + "</td>";

       // Tickets
       rowHTML += "<td>"; // close me
       // Generate links
       rowHTML += $.getLinksHTML("tickets_sh", home, a_date, "Stubhub");
       rowHTML += " ";
       rowHTML += $.getLinksHTML("tickets_mlb", home, a_date, "MLB");
       rowHTML += "</td>"; // closed tickets

       // Hotel
       rowHTML += "<td>"; // close me
       // Generate links
       rowHTML += $.getLinksHTML("hotel_hotels", home, a_date, "Hotels.com");
       rowHTML += " ";
       rowHTML += $.getLinksHTML("hotel_travelocity", home, a_date, "Travelocity");
       rowHTML += "</td>"; // closed hotel

       // Travel
       rowHTML += "<td>"; // close me
       // Air
       rowHTML += $.getLinksHTML("air", home, a_date, "Air");
       rowHTML += " ";
       // Car
       rowHTML += $.getLinksHTML("car", home, a_date, "Car");
       rowHTML += "</td>"; // closed travel

       rowHTML += "</tr>"; // closed row

       total_distance += parseInt(dist); 
       total_days = day - first_day + 1;

       $("#tripviewer-table").append(rowHTML);     

       $("#tripviewer-gamerow-" + day + " .tripviewer-goto-game").click(function() { gotoGame(home, a_date); }); 
       $("#tripviewer-gamerow-" + day + " .tripviewer-remove-game").click(function() { removeGame(a_id); });

       // update totals
       updateTotals();
    }

    $.clearTripviewer = function() {
       $(".tripviewer-gamerow").remove();
       // clear totals
       total_games = 0;
       total_distance = 0;
       total_days = 0;
       first_day = 0;
       trip_list = "";
       dir_trip_list = "";
       updateTotals();

       // Clear map
       $.clearDirections();
    }

    $.updateStartDateDisplay = function() {
       var dateMMDD = STARTINFO.date.mmdd;
       var dateM = Math.round(dateMMDD / 100);
       var dateD = dateMMDD % 100;
       $("#tripviewer-startinfo-date").html(dateM + "/" + dateD + "/"  + SEASONINFO.year);
       $("#tripviewer-startrow-startdate").html(dateM + "/" + dateD);
    }

    function updateTotals() {
       $("span#tripviewer-total-miles").html(total_distance + " miles");
       $("span#tripviewer-total-games").html(total_games + " games");
       $("span#tripviewer-total-days").html(total_days + " days");
    }

    function getMap() {
       window.open('getMap.php?trip=' + dir_trip_list, 'blank', '');
    }

    function saveTrip() {
       var numGames = 0;
       var tripcode = "";
       var tripcodeHTML = "";
       var lastdate = "";
       var trip_list_array = trip_list.split(",");
       for(var i in trip_list_array) {
	  if(trip_list_array[i]) {
	     var team = /[A-Z]+/.exec(trip_list_array[i]);
	     var date = /[0-9]+/.exec(trip_list_array[i]);
	     if(i == 0) {
		tripcode += parseInt(date);
		tripcodeHTML+= parseInt(date);
	     } else {
		tripcode += (parseInt(date) - lastdate);
		tripcodeHTML += (parseInt(date) - lastdate);
	     }
	     tripcode += team_encode[team];
	     tripcodeHTML += team_encode[team];
	     lastdate = parseInt(date);
	     numGames++;
	     if(numGames % 16 == 0) {
		alert("adding new line to save");
		tripcodeHTML += "<br/>";
	     }
	  }
       }
       if(tripcode) {
	  $.popupWindow("<b>Trip saved!</b><br/>Code: " + tripcodeHTML);
       }
    }

    function loadTrip() {
       $("#triploader").toggle();
    }

    function processLoad() {
       processLoadCode($("#tripload-code").attr("value"));
    }

    function processLoadCode(a_code) {
       // trim whitespace(function($) {
       var loadArray = new Array();
       var alpha = new RegExp("[A-Za-z]");
       var tcode = "";
       var tripToLoad = new Array();
       var startDate = a_code.substring(0,3);
       var codeChars = a_code.split("");
       var i = 3;
       var lastdate = parseInt(startDate);
       var laststep = "0";
       while(i < codeChars.length) {
	  if(alpha.test(codeChars[i])) {
	     lastdate += parseInt(laststep);
	     tcode += team_decode[codeChars[i]];
	     tcode += lastdate;
	     tcode += ",";
	     loadArray.push($.getGameCellId(lastdate, team_decode[codeChars[i]]));
	     laststep = "";
	  } else {
	     laststep += codeChars[i];
	  }
	  i++;
       }
       $.loadTrip(loadArray);
       $("#triploader").hide();
    }

    function printableTrip() {
       window.open('printable.php?trip=' + trip_list, 'blank', '');
    }
    
    function gotoGame(a_team, a_date) {
       $.jumpToDay(a_date); 
       $.centerMap(a_team); 
    }

    function removeGame(a_id) {
       $("#" + a_id).click();
    }

    // Utils class?
    function dateToString(a_date) {
       var date  = a_date % 100; 
       var month = (a_date - date) / 100;
       var date_string = month + "/" + date;
       return date_string;
    }

 })(jQuery);