-
-
Save anonymous/9261bd7620a4e246e63f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name DL/ORB Itinary Builder | |
// @namespace http://matrix.itasoftware.com | |
// @description Builds fare purchase links | |
// @version 0.3a | |
// @grant none | |
// @include http://matrix.itasoftware.com/view/details* | |
// ==/UserScript== | |
//Version 0.3a | |
//2014-11-01 Edited by Steppo (shortened some regex and added support for german matrix) | |
//Written by paul21 of FlyerTalk.com | |
//http://www.flyertalk.com/forum/members/paul21.html | |
//Copyright Reserved -- At least share with credit if you do | |
//Simple sleep function | |
function slp(millis, callback) { | |
setTimeout(function() | |
{ callback(); } | |
, millis); | |
} | |
//Parses all of the outputs of regexp matches into an array | |
function exRE(str,re){ | |
var ret= new Array(); | |
var m; | |
var i=0; | |
while( (m = re.exec(str)) != null ) { | |
if (m.index === re.lastIndex) { | |
re.lastIndex++; | |
} | |
for (k=1;k<m.length;k++) { | |
ret[i++]=m[k]; | |
} | |
} | |
return ret; | |
} | |
//Primary function for extracting flight data from ITA/Matrix | |
function fePS() { | |
//Searches through inner-html of div itineraryNode | |
var itinHTML = document.getElementById("itineraryNode").innerHTML; | |
//Find carrier | |
var re=/airline_logos\/35px\/(\w\w)\.png/g; | |
var carriers = new Array(); | |
carriers = exRE(itinHTML,re); | |
//new code by 18sas 28-Oct-2014 | |
var re = /airline_logos\/35px\/\w\w\.png\"\salt\=\"(.*?)\"\stitle/g; | |
var airlineName = new Array(); | |
airlineName = exRE(itinHTML, re); | |
//end new code | |
//Currency in EUR? | |
var eurcur=0; | |
var re=/(€)/g; | |
var speicher = new Array(); | |
speicher = exRE(itinHTML,re); | |
if (speicher.length>1) eurcur=1; | |
var usdcur=0; | |
if (eurcur==0){ | |
var re=/($)/g; | |
var speicher = new Array(); | |
speicher = exRE(itinHTML,re); | |
if (speicher.length>1) usdcur=1; | |
} | |
//Find Airports | |
var re=/(strong)*\>[^\(\<]*\((\w{3})[^\(\<]*\((\w{3})/g; | |
var airports= new Array(); | |
var tmp_airports= new Array(); | |
var legNum = new Array(); | |
var legAirports = new Array(); | |
tmp_airports = exRE(itinHTML,re); | |
//Find Date | |
var re=/(strong)*\>[^\(\<]*\(\w{3}[^\(\<]*\(\w{3}[^\,]*\,\s*([a-zA-Z0-9]{1,3})\.?\s*([a-zA-Z0-9ä]{1,3})/g; | |
var tmp_airdate= new Array(); | |
var airdate = new Array(); | |
var legAirdate = new Array(); | |
tmp_airdate = exRE(itinHTML,re); | |
if (itaLocale=="de"){ | |
// lets swap values if german language | |
for (var i = 0; i < tmp_airdate.length; i+=3) { | |
var speicher=tmp_airdate[i+1] | |
tmp_airdate[i+1]=tmp_airdate[i+2].replace(/ä/g, "a").replace(/i/g, "y").replace(/Dez/g, "Dec").replace(/Okt/g, "Oct"); | |
tmp_airdate[i+2]=speicher; | |
} | |
} | |
var monthnames=["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP","OCT","NOV","DEC"]; | |
//Find flight number | |
//next line modified by 18sas 28-Oct-2014 | |
var re=/dijitReset carrier\"\>(.*?)\<\/td\>/g; | |
var flightnumStrs= new Array(); | |
flightnumStrs = exRE(itinHTML,re); | |
var flightnums = new Array(); | |
//Code adopted from 18sas | |
for (i=0;i<flightnumStrs.length;i++) { | |
//new code by 18sas 28-Oct-2014 | |
var flightNoRegExpString = airlineName[i].replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') + '\\s([0-9]*)'; | |
var flightNoRegExp = new RegExp(flightNoRegExpString, 'g'); | |
flightnums[i] = exRE(flightnumStrs[i], flightNoRegExp); | |
//console.log('flightNoRegExpString[' + i + ']=' + flightNoRegExpString); | |
//console.log('flightNoRegExp[' + i + ']=' + flightNoRegExp.toString()); | |
//console.log('flightNo[' + i + ']=' + flightNo.toString()); | |
//end new code | |
} | |
//Find Book Class | |
var re = /\((\w)\)/g; | |
var bookclass = new Array(); | |
bookclass = exRE(itinHTML,re); | |
//Find Class of Service | |
// C - Coach / B - Business / F - First on ORB | |
// B5-Coach / B2-Business on DL | |
var re = /(\w)[\w]+\ \;\(\w\)/g; | |
var classofservice = new Array(); | |
classofservice = exRE(itinHTML,re); | |
for (i=0;i<classofservice.length;i++) | |
{ | |
if (classofservice[i] == 'E') | |
{ | |
classofservice[i] = 'C'; | |
} | |
} | |
//Find leg divider | |
var basisHTML = document.getElementById("ita_layout_RoundedPane_1").innerHTML; | |
if (itaLocale=="de"){ | |
var re=/Airline\s\w\w\s(\w+)\s[\w{3}]/g; | |
} else { | |
var re=/Carrier\s\w\w\s(\w+)\s[\w{3}]/g; | |
} | |
var fareBasis=new Array(); | |
fareBasis=exRE(basisHTML,re); | |
var re=/farePrice\"\>[^0-9]*([0-9,.]+)/g; | |
var farePrice = new Array(); | |
farePrice = exRE(itinHTML,re); | |
if (itaLocale=="de"){ | |
var re=/Gesamtpreis\sfür\s([0-9])\sPassagier/g; | |
} else { | |
var re=/Total\scost\sfor\s([0-9])\spassenger/g; | |
} | |
var numPax = new Array(); | |
numPax = exRE(itinHTML,re); | |
var k=-1; | |
var j=0; | |
//alert(tmp_airports.join('\n')); | |
for(i=0;i<tmp_airports.length;) { | |
if (tmp_airports[i] == "strong" ) //Matches the heading airport | |
{ | |
k++; | |
legAirports[2*k]=tmp_airports[i+1]; | |
legAirports[2*k+1]=tmp_airports[i+2]; | |
legAirdate[2*k]=tmp_airdate[i+1]; | |
legAirdate[2*k+1]=tmp_airdate[i+2]; | |
if (tmp_airports.length <= i+3 || tmp_airports[i+3] == "strong") //Single flight in leg | |
{ | |
legNum[j]=k; | |
airdate[j]=tmp_airdate[i+1]; | |
airports[j++]=tmp_airports[i+1]; | |
legNum[j]=k; | |
airdate[j]=tmp_airdate[i+2]; | |
airports[j++]=tmp_airports[i+2]; | |
i+=3; | |
} else //More flights coming up, so ignore the leg ends | |
{ | |
i+=3; | |
} | |
} else { | |
//Reached a set of two airports in current leg | |
legNum[j]=k; | |
airdate[j]=tmp_airdate[i+1]; | |
airports[j++]=tmp_airports[i+1]; | |
legNum[j]=k; | |
airdate[j]=tmp_airdate[i+2]; | |
airports[j++]=tmp_airports[i+2]; | |
i+=3; | |
} | |
} | |
//Find basis legs | |
if (itaLocale=="de"){ | |
var re=/Strecke\(n\) ([\w\(\)\s\-,]+)/g; | |
} else { | |
var re=/Covers ([\w\(\)\s\-,]+)/g; | |
} | |
var fareBasisPerFlight = new Array(); | |
var basisLegNum = new Array(); | |
var tmpFareStr = exRE(basisHTML,re); | |
var j=0; | |
var l=0; | |
for (i=0;i<tmpFareStr.length;i++) { | |
var re=/(\w\w\w)\-(\w\w\w)/g; | |
var tmpSegsInBasis = exRE(tmpFareStr[i],re); | |
//alert(tmpSegsInBasis.join('\n')); | |
for (k=0;k<tmpSegsInBasis.length/2;k++) { | |
var cont=10; | |
while(cont >= 1) { | |
cont--; | |
basisLegNum[j]=l; | |
fareBasisPerFlight[j++] = fareBasis[l]; | |
if (airports[2*j-1] == tmpSegsInBasis[k*2+1]) { | |
cont =0; | |
} | |
} | |
} | |
l++; | |
} | |
var pricing = farePrice[0]; | |
if (itaLocale=="de"){ | |
pricing=pricing.replace(/\./g,"").replace(/\,/g,"."); | |
} else { | |
pricing=pricing.replace(/\,/g,""); | |
} | |
var numSegments=flightnums.length; | |
var numLegs = legAirports.length/2; | |
var flightDateNumStr = new Array(); //Padded string of date like "09" "08" etc | |
var flightDateNum = new Array(); //Numerical day | |
var flightDateYear = new Array(); //Numerical year > 2000 | |
var flightDateMonthNum = new Array(); //Month 1-12 | |
var flightDateMonthStr = new Array(); //Month in text form "FEB" etc | |
//Will parse date info into common pieces needed for date formatting | |
for (i=0;i<numSegments;i++) { | |
var dateMonth=airdate[i*2].toUpperCase(); | |
var dateNumStr=airdate[1+i*2]; | |
var dateNum=parseInt(dateNumStr); | |
//Add leading 0 if needed | |
if (dateNum < 10) { | |
dateNumStr = "0" + dateNumStr; | |
} | |
var d = new Date(); | |
var cmonth=d.getMonth(); | |
var cday=d.getDate(); | |
var cyear=d.getFullYear(); | |
var pmonth=0; //The flight month in 0-11 | |
for (j=0;j<=monthnames.length;j++) { | |
if (monthnames[j] == dateMonth) { | |
pmonth=j; | |
} | |
} | |
if (cmonth > pmonth || (cmonth == pmonth && dateNum < cday)) { | |
cyear += 1; //The flight is next year | |
} | |
flightDateNumStr[i] = dateNumStr; | |
flightDateNum[i] = dateNum; | |
flightDateYear[i] = cyear; | |
flightDateMonthNum[i] = pmonth+1; | |
flightDateMonthStr[i] = dateMonth; | |
} | |
var deltaURL ="http://"; | |
if (itaLocale=="de"){ | |
// make it local | |
deltaURL +="de"; | |
} else { | |
deltaURL +="www"; | |
} | |
deltaURL +=".delta.com/booking/priceItin.do?dispatchMethod=priceItin&tripType=multiCity&cabin=B5-Coach"; | |
if(eurcur==1){ | |
// doesnt change anything, because delta doesnt even care.. | |
deltaURL +="¤cyCd=EUR"; | |
} else { | |
deltaURL +="¤cyCd=USD"; | |
} | |
if (itaLocale=="de"){ | |
deltaURL +="&exitCountry=DE"; | |
} else { | |
deltaURL +="&exitCountry=US"; | |
} | |
for (i=0;i<numSegments;i++) { | |
var segstr=""; | |
segstr += "&itinSegment[" + i.toString() + "]=" + legNum[i*2] + ":"; | |
//segstr += "&itinSegment[" + i.toString() + "]=" + basisLegNum[i] + ":"; | |
segstr += bookclass[i] + ":"; | |
segstr += airports[i*2] + ":" + airports[1+i*2] + ":"; | |
segstr += carriers[i] + ":"; | |
segstr += flightnums[i] + ":"; | |
segstr += flightDateMonthStr[i] + ":"; | |
segstr += flightDateNumStr[i] + ":"; | |
segstr += flightDateYear[i].toString() + ":0"; | |
deltaURL += segstr; | |
} | |
deltaURL += "&fareBasis="+fareBasis[0]; | |
for (i=1;i<fareBasis.length;i++) { | |
deltaURL += ":"+fareBasis[i]; | |
} | |
deltaURL += "&price="+pricing; | |
deltaURL += "&numOfSegments=" + numSegments.toString() + "&paxCount=" + numPax[0]; | |
LDLB(deltaURL); | |
var orbitzUrl = "/shop/home?type=air&source=GOOGLE_META&searchHost=ITA&ar.type=multiCity&strm=true"; | |
var selectKey = ""; | |
//Build multi-city search based on legs | |
for (i=0;i<numLegs;i++) { | |
//Do date magic | |
var legDateMonthStr=legAirdate[i*2].toUpperCase(); | |
var legDateNumStr=legAirdate[1+i*2]; | |
var legDateNum=parseInt(legDateNumStr); | |
var d = new Date(); | |
var cmonth=d.getMonth(); | |
var cday=d.getDate(); | |
var cyear=d.getFullYear(); | |
var pmonth=0; //The flight month in 0-11 | |
for (j=0;j<=monthnames.length;j++) { | |
if (monthnames[j] == legDateMonthStr) { | |
pmonth=j; | |
} | |
} | |
if (cmonth > pmonth || (cmonth == pmonth && dateNum < cday)) { | |
cyear += 1; //The flight is next year | |
} | |
var legDateYear=cyear; | |
var legDateMonthNum=pmonth+1; | |
var iStr = i.toString(); | |
orbitzUrl += "&ar.mc.slc["+iStr+"].orig.key=" + legAirports[i*2]; | |
orbitzUrl += "&_ar.mc.slc["+iStr+"].originRadius=0"; | |
orbitzUrl += "&ar.mc.slc["+iStr+"].dest.key=" + legAirports[i*2+1]; | |
orbitzUrl += "&_ar.mc.slc["+iStr+"].destinationRadius=0"; | |
var twoyear = legDateYear%100; | |
var mstr = legDateMonthNum.toString(); | |
orbitzUrl += "&ar.mc.slc["+iStr+"].date=" + mstr + "/" + legDateNumStr + "/" + twoyear.toString(); | |
orbitzUrl += "&ar.mc.slc["+iStr+"].time=Anytime"; | |
} | |
//Build select key based on segments | |
for (i=0;i<numSegments;i++) { | |
var twoyear = flightDateYear[i]%100; | |
var mstr = flightDateMonthNum[i].toString(); | |
if ( flightDateMonthNum[i] < 10) { | |
mstr="0"+mstr; | |
} | |
selectKey += carriers[i] + flightnums[i] + airports[i*2] + airports[i*2+1] + mstr + flightDateNumStr[i] + classofservice[i]; | |
if ((i+1)<numSegments) { | |
selectKey+= "_"; | |
} | |
} | |
orbitzUrl += "&ar.mc.numAdult=" + numPax[0]; | |
orbitzUrl += "&ar.mc.numSenior=0&ar.mc.numChild=0&ar.mc.child[0]=&ar.mc.child[1]=&ar.mc.child[2]=&ar.mc.child[3]=&ar.mc.child[4]=&ar.mc.child[5]=&ar.mc.child[6]=&ar.mc.child[7]=&search=Search Flights&ar.mc.nonStop=true&_ar.mc.nonStop=0&_ar.mc.narrowSel=0&ar.mc.narrow=airlines&ar.mc.carriers[0]=&ar.mc.carriers[1]=&ar.mc.carriers[2]=&ar.mc.cabin=C"; | |
orbitzUrl += "&selectKey=" + selectKey; | |
if (usdcur==1) { | |
//lets do this when USD is cur | |
var priceval = parseFloat(pricing) + 6.99; | |
orbitzUrl += "&userRate.price=USD|" + priceval.toString(); | |
} | |
LORBB(orbitzUrl); | |
var uaUrl='{\"post\": {\"pax\": '+numPax[0]; | |
uaUrl += ', \"trips\": [{\"origin\": \" \", \"dest\": \" \", \"dep_date\": \" \", \"segments\": ['; | |
for(i=0;i<numSegments;i++) { | |
uaUrl += '{\"origin\": \"' + airports[i*2] + '\", \"'; | |
var mstr = flightDateMonthNum[i].toString(); | |
uaUrl += 'dep_date\": "' + mstr + '/' + flightDateNum[i].toString() + '/' + flightDateYear[i].toString() + '\", \"dest_date\": \" \", '; | |
uaUrl += '\"dest\": "' + airports[i*2+1] + '\", \"flight_num\": '+flightnums[i]; | |
uaUrl += ', \"carrier\": "' + carriers[i]; | |
uaUrl += '\", \"fare_code\": \" \"}'; | |
if ((i+1)<numSegments) { | |
uaUrl+= ","; | |
} | |
} | |
var uaCabCode = 'Coach'; | |
if (classofservice[0] == 'B') { | |
uaCabCode='Business'; | |
} | |
else if (classofservice[0] == 'F') { | |
uaCabCode='First'; | |
} | |
uaUrl += '], \"cabin\": \"' + uaCabCode + '\"}]}, \"kind\": \"flight\", \"provider_code\": \"UA\" }'; | |
UALB(uaUrl); | |
var usUrl = "https://shopping.usairways.com/Flights/Passenger.aspx?g=goo&c=goog_US_pax"; | |
usUrl += "&a=" + numPax[0]; | |
usUrl += "&s=" + classofservice[0].toLowerCase() ; | |
var cFnum=0; | |
var lastLegNum=-1; | |
for (i=0;i<numSegments;i++) { | |
if (legNum[i*2] != lastLegNum) { | |
lastLegNum=legNum[i*2]; | |
cFnum=0; | |
} | |
cFnum++; | |
var cLegNum = legNum[i*2] + 1; | |
var idstr = cLegNum.toString() + cFnum.toString(); | |
usUrl += "&o"+idstr+"=" + airports[i*2] + "&d"+idstr+"=" + airports[i*2+1] + "&f"+idstr+"=" + flightnums[i]; | |
usUrl += "&t"+idstr+"=" + flightDateYear[i].toString() + flightDateMonthNum[i].toString() + flightDateNumStr[i] + "0000"; | |
usUrl += "&x"+idstr+"=" + fareBasisPerFlight[i]; | |
} | |
USLB(usUrl); | |
} | |
//ID sidebarNode | |
function LDLB(deltaURL) { | |
var div = document.getElementById('sidebarNode'); | |
div.innerHTML = div.innerHTML + "<br><br><font size=4><bold><a href=\""+deltaURL+ "&vendorRedirectFlag=true&vendorID=Google" + "\" target=_new>Buy at DL</a></font></bold>"; | |
} | |
function UALB(uaUrl) { | |
var div = document.getElementById('sidebarNode'); | |
div.innerHTML = div.innerHTML + '<br><br><font size=4><bold><a href=\"https://www.hipmunk.com/bookjs?booking_info=' + encodeURIComponent(uaUrl) + '\" target=_new>Buy at UA</a></font></bold><br>(Copy Link in Text, via HPMNK)<br>'; | |
} | |
function LORBB(orbitzUrl) { | |
var div = document.getElementById('sidebarNode'); | |
div.innerHTML = div.innerHTML + "<br><br><font size=4><bold><a href=\"http://www.cheaptickets.com"+orbitzUrl + "\" target=_new>Buy at CHPTIX</a></font></bold>"; | |
div.innerHTML = div.innerHTML + "<br><font size=4><bold><a href=\"http://www.orbitz.com"+orbitzUrl + "\" target=_new>Buy at ORB</a></font></bold>"; | |
} | |
function USLB(usUrl) { | |
var div = document.getElementById('sidebarNode'); | |
div.innerHTML = div.innerHTML + "<br><br><font size=4><bold><a href=\""+usUrl+ "\" target=_new>Buy at US</a></font></bold><br>(US Only)<br>"; | |
} | |
slp(2000,fePS); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment