/******************************************************************************
 *
 *  This file is part of Five Points. See <http://www.fpdev.org> for
 *  additional project information and documentation.
 *  
 *  Five Points is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  Five Points is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License
 *  along with Five Points.  If not, see <http://www.gnu.org/licenses/>.
 *  
 ******************************************************************************/  

/**
 * fp_trp_process.js
 *
 * Implements all functionality related to processing and displaying a trip
 * query response. 
 */

// FIELD DECLARATIONS

var fp_ptItin_;
var fp_ptTripMode_;
var fp_ptImgRoot_ = "http://fp.atltransit.com/images/";
var fp_ptNMGroups_;
var fp_ptNMGStatusArr_;
var fp_ptNMGCollapsedArr_;
var fp_ptNMGIndex_;
var fp_ptNMStartNodeArr_;

var fp_ptUsedNMAccess_; 


// FUNCTION DEFINITIONS

function fp_initPT(mode) {
  fp_ptTripMode_ = mode;
  if(fp_ptTripMode_ == "tt") fp_ptItin_ = fp_tItinDivTT_; //document.getElementById(divName);
  if(fp_ptTripMode_ == "nt") fp_ptItin_ = fp_tItinDivNT_;
  if(fp_ptTripMode_ == "nm") fp_ptItin_ = fp_tItinDivNM_;
  if(fp_ptTripMode_ == "sp") fp_ptItin_ = fp_tItinDivSP_;
  
  // clear active div:
  while (fp_ptItin_.firstChild) fp_ptItin_.removeChild(fp_ptItin_.firstChild);
}
 
function fp_processTrip(node) { // add xmlDoc parameter?

  if(fp_ptTripMode_ == "tt") {
    fp_tTransferPtsTT_ = [];
    segNamesTT_ = [];
  }
  if(fp_ptTripMode_ == "nt") {
    fp_tTransferPtsNT_ = [];
    segNamesNT_ = [];
  }
  if(fp_ptTripMode_ == "sp") {
    fp_tTransferPtsSP_ = [];
    segNamesSP_ = [];
  }
  fp_ptUsedNMAccess_ = false;
  var len = 0, transitTrips=0;
  for (var ti = 0; ti < node.childNodes.length; ti++) {
    var tiNode = node.childNodes.item(ti);
    if(tiNode.nodeName == "walk" || tiNode.nodeName == "bike") {
      //walkGroupCount++;
      for (var wi = 0; wi < tiNode.childNodes.length; wi++) { // count walkitems
        var wiNode = tiNode.childNodes.item(wi);
        if(wiNode.nodeName == "walkitem" || wiNode.nodeName == "bikeitem") len += parseInt(wiNode.getAttribute("len"));
      }
    }
    else if(tiNode.nodeName == "transit") {
      transitTrips++;
      len += parseInt(tiNode.getAttribute("len"));
    }
  }
	
  // create summary row
  var sumRow = document.createElement("div");
  sumRow.className = "fp_itinsummary";
  var html = "", sep = "&nbsp;&nbsp;<b>&bull;</b>&nbsp;&nbsp;";
  var start = node.getAttribute("start"), end = node.getAttribute("end");
  var transfers = transitTrips <= 1 ? "None" : transitTrips-1;
  html += "<div style='font-size:16px; font-weight:bold; margin-bottom:4px;'>This trip takes "+fp_elapsedTimeStr(end-start)+" to traverse "+(Math.round(10*len/5280)/10)+" miles</div>";
  html += "Start time: <b>"+fp_sTimeToStr(start)+"</b>"+sep+"End time: <b>"+fp_sTimeToStr(end)+"</b>";
  if(transitTrips > 0) html += sep+"No. of transfers: <b>"+transfers+"</b>";

  if(fp_ptTripMode_ == "tt") {
    fp_tTripTimeTT_ = end-start; //fp_elapsedTimeStr(end-start);
    fp_tNumTransfersTT_ = transitTrips-1;
  }
  if(fp_ptTripMode_ == "nt") {
    fp_tTripTimeNT_ = end-start; //fp_elapsedTimeStr(end-start);
    fp_tNumTransfersNT_ = transitTrips-1;
  }
  if(fp_ptTripMode_ == "sp") {
    fp_tTripTimeSP_ = end-start; //fp_elapsedTimeStr(end-start);
    fp_tNumTransfersSP_ = transitTrips-1;
  }
  sumRow.innerHTML = html;
  fp_ptItin_.appendChild(sumRow);
	
  fp_ptCreateHeaderRow(); 
  // iterate through trip items
  for (var ti = 0; ti < node.childNodes.length; ti++) {
    var tiNode = node.childNodes.item(ti);
    if(tiNode.nodeName == "walk" || tiNode.nodeName == "bike") {
      fp_ptProcessWalkTrip(tiNode, fp_ptNMGIndex_);
      fp_ptNMGIndex_++;
    }
    if(tiNode.nodeName == "transit") fp_ptProcessTransitTrip(tiNode);
    if(tiNode.nodeName == "wait") fp_ptProcessWaitItem(tiNode);
    if(tiNode.nodeName == "nav") fp_ptProcessNavItem(tiNode);
  }
}

function fp_ptInitWalkInfo(nmGrpCount) {
  fp_ptWalkGroups_ = new Array(nmGrpCount);
  fp_ptNMGStatusArr_ = new Array(nmGrpCount);
  fp_ptNMGCollapsedArr_ = new Array(nmGrpCount);
  fp_ptNMStartNodeArr_ = new Array(nmGrpCount);
  fp_ptNMGIndex_ = 0;
} 

function fp_ptCreateHeaderRow() {
  var headerRow = document.createElement("div");
  headerRow.className = "fp_itinrow";
  
  var html = "";
  html += "<table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "<td style='width:66px;'>MODE</td>";
  html += "<td align='center' valign='center'>";
  html += "  <table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "  <td align='center' valign='center' style='width:50%;'>FACILITY/DIRECTION</td>";
  html += "  <td align='center' valign='center' style='width:50%;'>FROM/TO</td>";
  html += "  </tr></table>";
  html += "</td>";
  html += "<td style='width:1px;'><!-- --></td>";
  html += "<td style='width:40px;' align='center' valign='center'>LENGTH</td>";
  html += "</tr></table>";
  
  headerRow.innerHTML = html; 
  fp_ptItin_.appendChild(headerRow);  
}

function fp_ptProcessWalkTrip(node, walkGroupIndex) {
  fp_ptUsedNMAccess_ = true;
  if(fp_ptTripMode_ == "tt") segNamesTT_.push(nmType == "walk" ? "Walking" : "Cycling");
  if(fp_ptTripMode_ == "nt") segNamesNT_.push(nmType == "walk" ? "Walking" : "Cycling");
  if(fp_ptTripMode_ == "sp") segNamesSP_.push(nmType == "walk" ? "Walking" : "Cycling");
  fp_ptNMStartNodeArr_[walkGroupIndex] = node.getAttribute("fnode");
  var nmType = node.nodeName;
  var nmColor = (nmType == "walk") ? "green" : "lime";
	
  var walkItemCount = 0;
  for (var wi = 0; wi < node.childNodes.length; wi++) { // count walkitems
    var wiNode = node.childNodes.item(wi);
    if(wiNode.nodeName == "walkitem" || wiNode.nodeName == "bikeitem") walkItemCount++;
  }
  var walkGroup = new Array(walkItemCount);
  var arri = 0, totSTime, totETime, totLen = 0;
  //if(fp_ptTripMode_ == "tt") fp_tMapLinksTT_ += "walk,";
  //if(fp_ptTripMode_ == "nt") fp_tMapLinksNT_ += "walk,";
  //if(fp_ptTripMode_ == "nm") fp_tMapLinksNM_ += "walk,";
  for (var wi = 0; wi < node.childNodes.length; wi++) { // process walkitems
    var wiNode = node.childNodes.item(wi);
    if(wiNode.nodeName == "walkitem" || wiNode.nodeName == "bikeitem") {
      if(arri == 0) totSTime = wiNode.getAttribute("stime");
      if(arri == walkItemCount-1) totETime = wiNode.getAttribute("etime");
      totLen += parseInt(wiNode.getAttribute("len"));
      //if(fp_ptTripMode_ == "tt") fp_tMapLinksTT_ += wiNode.childNodes[0].nodeValue;
      //if(fp_ptTripMode_ == "nt") fp_tMapLinksNT_ += wiNode.childNodes[0].nodeValue;
      //if(fp_ptTripMode_ == "nm") fp_tMapLinksNM_ += wiNode.childNodes[0].nodeValue;
      walkGroup[arri] = fp_ptGenerateNMSubrowHTML(wiNode);
      arri++;
    }
  }
  fp_ptWalkGroups_[walkGroupIndex] = walkGroup;
  
  var walkRow = document.createElement("div");
  walkRow.className = "fp_itinrow";
  
  var topRow = document.createElement("div");
  topRow.innerHTML = fp_ptGenTopRow(nmColor);	 
  walkRow.appendChild(topRow);

  var mainRow = document.createElement("div");
  mainRow.className = "fp_itin"+nmType+"row";
  //mainRow.style.height = "30px";
	
  var table = document.createElement("table");
  table.border = table.cellSpacing = table.cellPadding = 0;
  table.style.width="100%";
	
  var tbody = document.createElement("tbody");
  var tr = document.createElement("tr");
  var td1 = document.createElement("td");
  //td1.innerHTML = "foo";
  td1.vAlign = "center";
  td1.style.width = "11px";
  td1.style.background = "url("+fp_ptImgRoot_+"trip/"+nmType+"leftbg.gif)";
  if(walkItemCount > 1) td1.innerHTML = "<div id='walktoggle"+walkGroupIndex+"' style='width:10px; height:10px; background:url("+fp_ptImgRoot_+"trip/walkplus.gif); cursor:pointer; font-size:1px; line-height:0' onclick='javascript:fp_ptToggleWalkGroup("+walkGroupIndex+")'>&nbsp;</div>";
	
  var td2 = document.createElement("td");
  td2.vAlign = "center";
  td2.style.width ="66px";
  td2.innerHTML = "<img src='"+fp_ptImgRoot_+"trip/modes/"+nmType+".gif' alt='"+nmType+"' style='display:block;'>";
	
  var td3 = document.createElement("td");
  var wgDiv = document.createElement("div");
  wgDiv.id = "walkGroup"+walkGroupIndex;
  td3.appendChild(wgDiv);
	
  tr.appendChild(td1);
  tr.appendChild(td2);
  tr.appendChild(td3);
	
  tbody.appendChild(tr);
  table.appendChild(tbody);

  mainRow.appendChild(table);
  walkRow.appendChild(mainRow);
	
  var botRow = document.createElement("div");
  botRow.innerHTML = fp_ptGenBottomRow(nmColor);	 
  walkRow.appendChild(botRow);

	 
  fp_ptItin_.appendChild(walkRow);
  //alert("test "+document.getElementById("walkGroup"+walkGroupIndex));
  
  // generate collapsed HTML, if applicable
	
  if(walkItemCount > 1) {
    var chtml = "";
		
    chtml += "<table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
    chtml += "<td align='center' valign='center'>";
    chtml += "  <table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
    chtml += "  <td align='center' valign='center' style='width:50%; height: 32px; background:#ddd; font-size:14px; line-height:14px;'><span style='font-style: italic;'>Various Streets</span><br><span style='color:#555; font-size:11px; font-weight:normal; cursor: pointer;' onclick='fp_ptToggleWalkGroup("+walkGroupIndex+")'>(Click to Expand)</span></td>";
    chtml += "  <td align='center' valign='center' style='width:50%;'>"+node.getAttribute("from")+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(totSTime)+")</span>"+" to "+node.getAttribute("to")+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(totETime)+")</span></td>";
    chtml += "  </tr></table>";
    chtml += "</td>";
    chtml += "<td style='width:1px; background: gray;'><!-- --></td>";
    var totElTime = Math.round((totETime - totSTime)/60);
    chtml += "<td style='width:40px;' align='center' valign='center'>"+(totLen < 528 ? totLen+" ft" : Math.round(10*totLen/5280)/10+" mi")+"<br>"+totElTime+" min</td>";
    chtml += "</tr></table>";		
		
    //alert("init "+walkGroupIndex);
    fp_ptNMGCollapsedArr_[walkGroupIndex] = chtml;
    //alert(fp_ptNMGCollapsedArr_[walkGroupIndex]);
  }
  //walkItemCountArr_[walkGroupIndex] = walkItemCount;
	
  // initially render as expanded
  if(fp_ptWalkGroups_.length > 1 && walkItemCount > 1) {
    fp_ptRenderNMGroupCollapsedDiv(wgDiv, walkGroupIndex); //(walkGroupIndex);
    fp_ptNMGStatusArr_[walkGroupIndex] = false;
    //alert("collapsed");
  }
  else {
    //alert("expanded");
    fp_ptRenderNMGroupExpandedDiv(wgDiv, walkGroupIndex); //walkGroupIndex);
    fp_ptNMGStatusArr_[walkGroupIndex] = true;
  }
}

function fp_ptGenerateNMSubrowHTML(node) {
  var stime = node.getAttribute("stime"), etime = node.getAttribute("etime"), len = node.getAttribute("len");
  var eltime = Math.round((etime-stime)/60);
  var html = "";

  //alert(node.getAttribute("name")+ " | " + node.getAttribute("dir"));	
  html += "<table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "<td align='center' valign='center'>";
  html += "  <table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "  <td align='center' valign='center' style='width:50%; height: 32px; background:#ddd; font-size:14px;'>"+node.getAttribute("name")+" <span style='font-size:12px; font-weight:bold; font-style: italic;'>"+node.getAttribute("dir")+"</span>";
  if(node.nodeName == "bikeitem") {
    html += "    <div style='font-size:10px; font-weight:bold; color:gray; margin-top:3px;'>"+fp_ptGetFacilityType(parseInt(node.getAttribute("ftype")));
    var prov = parseInt(node.getAttribute("prov"));
    if(prov > 0) html += " "+fp_ptGetProvisionType(prov);    
    html += "    </div>";
  }
  html += "  </td>";
  html += "  <td align='center' valign='center' style='width:50%;'>"+node.getAttribute("from")+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(stime)+")</span>"+" to "+node.getAttribute("to")+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(etime)+")</span></td>";
  html += "  </tr></table>";
  html += "</td>";
  html += "<td style='width:1px; background: gray;'><!-- --></td>";
  html += "<td style='width:40px;' align='center' valign='center'>"+(len < 528 ? len+" ft" : Math.round(10*len/5280)/10+" mi")+"<br>"+eltime+" min</td>";
  html += "</tr></table>";		

  return html;
}

function fp_ptGetFacilityType(code) {
  if(code >= 10 && code < 20) return "MAJOR THOROUGHFARE";
  if(code >= 20 && code < 30) return "MINOR THOROUGHFARE";
  if(code >= 30 && code < 40) return "LOCAL STREET";
  if(code >= 50 && code < 60) return "OFFSTREET PATH/TRAIL";
  return "(Unknown Type)";
}


function fp_ptGetProvisionType(code) {
  if(code == 1) return "W/ BARRIER-SEPARATED BIKEWAY";
  if(code == 3) return "W/ STRIPED BIKE LANES";
  if(code == 5) return "W/ BIKEABLE SHOULDER";
}

function fp_ptRenderNMGroupExpanded(wgIndex) {
  var wgDiv = document.getElementById("walkGroup"+wgIndex);
  fp_ptRenderNMGroupExpandedDiv(wgDiv, wgIndex);
}

function fp_ptRenderNMGroupExpandedDiv(wgDiv, wgIndex) {
  wgArr = fp_ptWalkGroups_[wgIndex];
  var html = "";
  for(var i=0; i<wgArr.length; i++) {
    html += wgArr[i];
    if(i < wgArr.length-1) html += "<div class='fp_itinwalkdivider'><!--  --></div>";
  }

  wgDiv.innerHTML = html;
}

function fp_ptRenderNMGroupCollapsed(wgIndex) {
  var wgDiv = document.getElementById("walkGroup"+wgIndex);
  fp_ptRenderNMGroupCollapsedDiv(wgDiv, wgIndex);
}

function fp_ptRenderNMGroupCollapsedDiv(wgDiv, wgIndex) {
  //alert("wgi "+wgIndex);
  //alert("wgd "+fp_ptNMGCollapsedArr_[wgIndex]);
  wgDiv.innerHTML = fp_ptNMGCollapsedArr_[wgIndex];
}

function fp_ptProcessTransitTrip(node) {
  var stime = node.getAttribute("stime"), etime = node.getAttribute("etime"), len = node.getAttribute("len");;
  var eltime = Math.round((etime-stime)/60);
  var mode = node.getAttribute("mode"), dir = node.getAttribute("dir"), name = node.getAttribute("name"), from = node.getAttribute("from"), to = node.getAttribute("to");
  var transitRow = document.createElement("div");
  transitRow.className = "fp_itinrow";
	
  var day = document.getElementById("fp_dayInput").value;
  if(day=="mf") day = "w"; 
  var rteURL = "rtedisp.php?route="+node.getAttribute("cid")+"&dir="+dir+"&day="+day;
	
  var html = "", color = "";
  if(fp_ptTripMode_ == "tt") {
    if(fp_tTransferPtsTT_.length == 0 && fp_ptUsedNMAccess_) fp_tTransferPtsTT_.push(from);
    fp_tTransferPtsTT_.push(to);
    segNamesTT_.push(name);
    //fp_tMapLinksTT_ += (mode+","+node.childNodes[0].nodeValue);
  }
  if(fp_ptTripMode_ == "nt") {
    if(fp_tTransferPtsNT_.length == 0 && fp_ptUsedNMAccess_) fp_tTransferPtsNT_.push(from);
    fp_tTransferPtsNT_.push(to);
    segNamesNT_.push(name);
    //fp_tMapLinksNT_ += (mode+","+node.childNodes[0].nodeValue);
  }
  if(fp_ptTripMode_ == "sp") {
    if(fp_tTransferPtsSP_.length == 0 && fp_ptUsedNMAccess_) fp_tTransferPtsSP_.push(from);
    fp_tTransferPtsSP_.push(to);
    segNamesSP_.push(name);
  }
  
  if(mode=="hrt") color = "red";
  if(mode=="lbus") color = "blue";
  if(mode=="lrt") color = "orange";
  if(mode=="rr") color = "maroon";

  html += fp_ptGenTopRow(color);
  html += "<div class='fp_itin"+mode+"row'>"
  html += "<div style='background:white; font-size:11px'>";

  html += "<table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "<td style='width:66px;'><img src='"+fp_ptImgRoot_+"trip/modes/"+mode+".gif' alt='"+mode+"' style='display:block;'></td>";
  html += "<td align='center' valign='center'>";
  html += "  <table border=0 cellpadding=0 cellspacing=0 style='width:100%;'><tr>";
  html += "  <td align='left' valign='center' style='width:50%; height: 32px; background:#ddd; font-size:14px;'>";
  html += "    <table border=0 cellpadding=0 cellspacing=0><tr>";
  html += "      <td width=4></td>";
  html += "      <td valign='center'><img src='images/trip/providers/"+fp_ptGetProviderID(node.getAttribute("cid"))+".gif' style='display:block;'></td>";
  html += "      <td width=5></td>";
  html += "      <td align='left' style='font-size:12px; padding-right:2px;'><a href='"+rteURL+"' target='_blank'>"+name+" <span style='font-size:12px; font-weight:bold; font-style: italic;'>"+dir+"</span></a></td>";
  html += "  	 </tr></table>";
  html += "  </td>";
  html += "  <td align='center' valign='center' style='width:50%;'>"+from+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(stime)+")</span>"+" to "+to+" <span style='color:#555; font-weight:bold;'>("+fp_sTimeToStr(etime)+")</span></td>";
  html += "  </tr></table>";
  html += "</td>";
  html += "<td style='width:1px; background: gray;'><!-- --></td>";
  html += "<td style='width:40px;' align='center' valign='center'>"+(len < 528 ? len+" ft" : Math.round(10*len/5280)/10+" mi")+"<br>"+eltime+" min</td>";
  html += "</tr></table>";

  html += "</div>"
  html += "</div>"
  // do main content
  html += fp_ptGenBottomRow(color);
  
  transitRow.innerHTML = html;
  fp_ptItin_.appendChild(transitRow);
}

function fp_ptGetProviderID(fullID) {
  var ret = "";
  for(var i=0; i<fullID.length; i++) {
    var ch = fullID.charAt(i);
    if(ch <'a' || ch > 'z') break;
    ret += ch;
  }
  return ret;
}

function fp_ptProcessWaitItem(node) {
  var stime = node.getAttribute("stime"), etime = node.getAttribute("etime");
  var eltime = Math.round((etime-stime)/60);
  var waitRow = document.createElement("div");
  waitRow.className = "fp_itinrow";
  var html = "";
  html += "<div class='fp_itinwaitrow'>";
  html += "<b>WAIT</b> "+(eltime==0 ? "<1" : eltime)+" min"+(eltime<=1 ? "" : "s")+" at "+node.getAttribute("name");
  html += "</div>";
  waitRow.innerHTML = html; 
  fp_ptItin_.appendChild(waitRow);
}

function fp_ptProcessNavItem(node) {
}


function fp_ptGenTopRow(color) {
  var html = "";
  html +="<div style='background: transparent url("+fp_ptImgRoot_+"trip/"+color+"tr.gif) no-repeat scroll right top; height: 6px; margin-left:4px;'>";
  html +="	<img src='"+fp_ptImgRoot_+"trip/"+color+"tl.gif' style='display: block;' align='left' height='6' width='6'>";
  html +="	<div style='border-top: 3px solid "+color+"; margin: 0px 6px; height: 3px;'><!-- --></div>";
  html +="</div>";
  return html;
}

function fp_ptGenBottomRow(color) {
  var html = "";
  html +="<div style='background: transparent url("+fp_ptImgRoot_+"trip/"+color+"br.gif) no-repeat scroll right top; height: 6px; margin-left:4px;'>";
  html +="	<img src='"+fp_ptImgRoot_+"trip/"+color+"bl.gif' style='display: block;' align='left' height='6' width='6'>";
  html +="	<div style='border-bottom: 3px solid "+color+"; margin: 0px 6px; height: 3px;'><!-- --></div>";
  html +="</div>";
  return html;
}

function fp_ptToggleWalkGroup(wgIndex) {
  //alert(""+wgIndex);
  var toggleDiv = document.getElementById("walktoggle"+wgIndex);
  if(fp_ptNMGStatusArr_[wgIndex]) {
    fp_ptRenderNMGroupCollapsed(wgIndex);	
    fp_ptNMGStatusArr_[wgIndex] = false;
    toggleDiv.style.background = 'url('+fp_ptImgRoot_+'trip/walkplus.gif)';
  }
  else {
    fp_ptRenderNMGroupExpanded(wgIndex);
    fp_ptNMGStatusArr_[wgIndex] = true;
    toggleDiv.style.background = 'url('+fp_ptImgRoot_+'trip/walkminus.gif)';
  }
}	
