1
0
mirror of https://github.com/MailHops/mailhops-plugin.git synced 2025-05-16 14:20:10 -07:00

TB78 Update

This commit is contained in:
Andrew Van Tassel 2020-11-10 22:28:24 -07:00
parent 47a5ce1b6d
commit e026c919b6
329 changed files with 879 additions and 2419 deletions

View File

@ -1,5 +1,10 @@
# Change Log
## 4.0.0 - 2020-11-10
- Support for Thunderbird 78.*
- Complete rewrite of code structure
- (thanks to Jürgen Ernst and his [Display mail user agent](https://addons.thunderbird.net/ja/thunderbird/addon/display-mail-user-agent-t/) for some direction)
## 3.8.0 - 2020-06-02
### Added

View File

@ -13,7 +13,7 @@ MailHops is an email route API. It does a few things:
### MailHops Message View
<img src="images/screenshot-thunderbird.png" alt="MailHops Message View" title="MailHops Message View" style="border: 1px solid #777;" />
<img src="images/screenshot-tb78-view.png" alt="MailHops Message View" title="MailHops Message View" style="border: 1px solid #777;" />
### MailHops Route Map
@ -21,7 +21,7 @@ MailHops is an email route API. It does a few things:
### MailHops Options
<img src="images/screenshot-display.png" alt="MailHops Options" title="MailHops Options" style="border: 1px solid #777;" />
<img src="images/screenshot-tb78-preferences.png" alt="MailHops Options" title="MailHops Options" style="border: 1px solid #777;" />
### MailHops Dashboard

View File

@ -4,4 +4,4 @@ filename='mailhops'
rm -f $filename.zip
zip -r $filename.zip ./ -x ./images/* -i *.js *.xul *.png *.gif *.css *.json *.dtd _locales/*/messages.json *.manifest
zip -r $filename.zip ./ -i *.js *.xhtml *.html *.png *.svg *.gif *.css *.json _locales/*/messages.json

View File

@ -1,16 +0,0 @@
content mailhops chrome/content/
skin mailhops classic/1.0 chrome/skin/classic/
locale mailhops de chrome/locale/de/
locale mailhops en chrome/locale/en/
locale mailhops es chrome/locale/es/
locale mailhops fr chrome/locale/fr/
locale mailhops ja chrome/locale/ja/
locale mailhops pl chrome/locale/pl/
locale mailhops pt-BR chrome/locale/pt-BR/
locale mailhops ru chrome/locale/ru/
locale mailhops zh-CN chrome/locale/zh-CN/
overlay chrome://messenger/content/messenger.xul chrome://mailhops/content/msgNotificationBar.xul
overlay chrome://messenger/content/messenger.xul chrome://mailhops/content/msgListColumn.xul

View File

@ -1,444 +0,0 @@
var mailHopsDisplay =
{
resultBox: null,
resultText: null,
resultDetails: null,
mailhopsDataPaneHops: null,
mailhopsDataPaneSPF: null,
mailhopsDataPaneDKIM: null,
mailhopsDataPaneMailer: null,
mailhopsDataPaneDNSBL: null,
mailhopsResultWeather: null,
mailhopsUnsubscribe: null,
mailHopsAccountMessage: null,
mhBox: null,
options: null,
init: function(options, reload){
this.options = options;
this.mhBox = document.getElementById("mailhopsNoficationBox");
this.mhNoteBox = document.getElementById("mailhopsNotification");
this.resultBox = document.getElementById("mailhopsResult");
this.resultText = document.getElementById("mailhopsResultText");
this.mailhopsResultWeather = document.getElementById("mailhopsResultWeather");
this.mailhopsUnsubscribe = document.getElementById("mailhopsUnsubscribe");
this.resultDetails = document.getElementById("mailhopsDataPaneDetails");
this.mailHopsAccountMessage = document.getElementById("mailHopsAccountMessage");
this.mailhopsDataPaneHops = document.getElementById("mailhopsDataPaneHops");
//auth
this.mailhopsDataPaneSPF = document.getElementById("mailhopsDataPaneSPF");
this.mailhopsDataPaneDKIM = document.getElementById("mailhopsDataPaneDKIM");
this.mailhopsDataPaneMailer = document.getElementById("mailhopsDataPaneMailer");
this.mailhopsDataPaneDNSBL = document.getElementById("mailhopsDataPaneDNSBL");
//wait for message to be selected before showing
if (!reload && this.mhBox)
this.mhBox.style.display = 'none';
//event listner for route click to launch map
this.mailhopsDataPaneDNSBL.addEventListener("click", function () {
if(this.hasAttribute('data-ip'))
mailHopsUtils.launchSpamHausURL( this.getAttribute('data-ip') );
});
this.resultText.addEventListener("click", function () {
if(this.value.indexOf('Rate Limit')!==-1)
window.openDialog("chrome://mailhops/content/preferences.xul","","chrome, dialog, modal, centerscreen").focus();
else if(this.hasAttribute('data-route'))
mailHopsUtils.launchMap( String(this.getAttribute('data-route')), options );
});
this.mailhopsResultWeather.addEventListener("click", function () {
mailHopsUtils.launchExternalURL(this.getAttribute('href'));
});
this.mailHopsAccountMessage.addEventListener("click", function () {
mailHopsUtils.launchExternalURL(this.getAttribute('href'));
this.style.display = 'none';
});
this.mailhopsDataPaneHops.addEventListener("click", function () {
this.parentElement.classList.toggle('active');
if(mailHopsDisplay.resultDetails.style.display !== 'block')
mailHopsDisplay.resultDetails.style.display = 'block';
else
mailHopsDisplay.resultDetails.style.display = 'none';
});
this.mailhopsUnsubscribe.addEventListener("click", function () {
if(this.getAttribute('href'))
mailHopsUtils.launchExternalURL(this.getAttribute('href'));
});
if(!!options.bar_color)
this.mhNoteBox.style.background = options.bar_color;
else
this.mhNoteBox.style.background = '';
if(!!options.font_size)
this.mhNoteBox.style.fontSize = options.font_size;
if(!!options.font_color){
this.resultText.style.color = options.font_color;
this.mailhopsResultWeather.style.color = options.font_color;
this.mailhopsUnsubscribe.style.color = options.font_color;
this.mailhopsDataPaneSPF.style.color = options.font_color;
this.mailhopsDataPaneDKIM.style.color = options.font_color;
this.mailhopsDataPaneMailer.style.color = options.font_color;
this.mailhopsDataPaneDNSBL.style.color = options.font_color;
}
},
lists: function( header_unsubscribe ){
this.mailhopsUnsubscribe.style.display='none';
if(header_unsubscribe){
this.mailhopsUnsubscribe.style.display='';
var listArr=header_unsubscribe.split(',');
var href='';
if(listArr.length){
for(var h=0;h<listArr.length;h++){
href = listArr[h].replace('<','').replace('>','');
if(href.indexOf('mailto:')!=-1){
if(href.toLowerCase().indexOf('subject=')==-1){
if(href.indexOf('?')==-1)
href+='?subject=Unsubscribe';
else
href+='&subject=Unsubscribe';
}
}
this.mailhopsUnsubscribe.setAttribute('href',href);
}
}
}
},
auth: function( header_xmailer, header_useragent, header_xmimeole, header_auth, header_spf ){
//SPF
if(header_spf){
header_spf=header_spf.replace(/^\s+/,"");
var headerSPFArr=header_spf.split(' ');
this.mailhopsDataPaneSPF.setAttribute('value','SPF: '+headerSPFArr[0]);
this.mailhopsDataPaneSPF.style.backgroundImage = "url('chrome://mailhops/content/images/auth/"+headerSPFArr[0]+".png')";
this.mailhopsDataPaneSPF.setAttribute('tooltiptext',header_spf+'\n'+mailHopsUtils.spf(headerSPFArr[0]));
this.mailhopsDataPaneSPF.style.display='block';
} else {
this.mailhopsDataPaneSPF.style.display='none';
}
//Authentication-Results
//http://tools.ietf.org/html/rfc5451
if(header_auth){
var headerAuthArr=header_auth.split(';');
var dkim_result;
var spf_result;
for(var h=0;h<headerAuthArr.length;h++){
if(headerAuthArr[h].indexOf('dkim=')!=-1){
dkim_result = headerAuthArr[h];
if(header_spf)
break;
}
if(!header_spf && headerAuthArr[h].indexOf('spf=')!=-1){
spf_result = headerAuthArr[h];
if(dkim_result)
break;
}
}
if(this.options.show_dkim && dkim_result){
dkim_result=dkim_result.replace(/^\s+/,"");
var dkimArr=dkim_result.split(' ');
this.mailhopsDataPaneDKIM.setAttribute('value','DKIM: '+dkimArr[0].replace('dkim=',''));
this.mailhopsDataPaneDKIM.style.backgroundImage = "url('chrome://mailhops/content/images/auth/"+dkimArr[0].replace('dkim=','')+".png')";
this.mailhopsDataPaneDKIM.setAttribute('tooltiptext',dkim_result+'\n'+mailHopsUtils.dkim(dkimArr[0].replace('dkim=','')));
this.mailhopsDataPaneDKIM.style.display='block';
} else {
this.mailhopsDataPaneDKIM.style.display='none';
}
if(this.options.show_spf && spf_result){
spf_result=spf_result.replace(/^\s+/,"");
var spfArr=spf_result.split(' ');
this.mailhopsDataPaneSPF.setAttribute('value','SPF: '+spfArr[0].replace('spf=',''));
this.mailhopsDataPaneSPF.style.backgroundImage = "url('chrome://mailhops/content/images/auth/"+spfArr[0].replace('spf=','')+".png')";
this.mailhopsDataPaneSPF.setAttribute('tooltiptext',spf_result+'\n'+mailHopsUtils.spf(spfArr[0].replace('spf=','')));
this.mailhopsDataPaneSPF.style.display='block';
}
} else {
this.mailhopsDataPaneDKIM.style.display='none';
}
//X-Mailer, User-Agent or X-MimeOLE
if(header_xmailer){
this.mailhopsDataPaneMailer.style.backgroundImage = "url('chrome://mailhops/content/images/email.png')";
// if(header_xmailer.indexOf('(')!=-1)
// this.mailhopsDataPaneMailer.setAttribute('value',header_xmailer.substring(0,header_xmailer.indexOf('(')));
// else if(header_xmailer.indexOf('[')!=-1)
// this.mailhopsDataPaneMailer.setAttribute('value',header_xmailer.substring(0,header_xmailer.indexOf('[')));
// else
// this.mailhopsDataPaneMailer.setAttribute('value',header_xmailer);
this.mailhopsDataPaneMailer.setAttribute('tooltiptext',header_xmailer);
this.mailhopsDataPaneMailer.style.display='block';
} else if(header_useragent){
this.mailhopsDataPaneMailer.style.backgroundImage = "url('chrome://mailhops/content/images/email.png')";
// if(header_useragent.indexOf('(')!=-1)
// this.mailhopsDataPaneMailer.setAttribute('value',header_useragent.substring(0,header_useragent.indexOf('(')));
// else if(header_useragent.indexOf('[')!=-1)
// this.mailhopsDataPaneMailer.setAttribute('value',header_useragent.substring(0,header_useragent.indexOf('[')));
// else
// this.mailhopsDataPaneMailer.setAttribute('value',header_useragent);
this.mailhopsDataPaneMailer.setAttribute('tooltiptext',header_useragent);
this.mailhopsDataPaneMailer.style.display='block';
} else if(header_xmimeole){
this.mailhopsDataPaneMailer.style.backgroundImage = "url('chrome://mailhops/content/images/email.png')";
if(header_xmimeole.indexOf('(')!=-1)
header_xmimeole = header_xmimeole.substring(0,header_xmimeole.indexOf('('));
else if(header_xmimeole.indexOf('[')!=-1)
header_xmimeole = header_xmimeole.substring(0,header_xmimeole.indexOf('['));
// if(header_xmimeole.indexOf('Produced By ')!=-1)
// this.mailhopsDataPaneMailer.setAttribute('value',header_xmimeole.replace('Produced By ',''));
// else
// this.mailhopsDataPaneMailer.setAttribute('value',header_xmimeole);
this.mailhopsDataPaneMailer.setAttribute('tooltiptext',header_xmimeole);
this.mailhopsDataPaneMailer.style.display='block';
} else {
this.mailhopsDataPaneMailer.style.display='none';
}
},
error: function(status,data){
this.resultText.style.backgroundImage = "url('chrome://mailhops/content/images/auth/error.png')";
if(data && data.error){
this.resultText.setAttribute('value', status+': '+data.error.message);
this.resultText.setAttribute('tooltiptext',data.error.message);
} else {
this.resultText.setAttribute('value', ' Service Unavailable.');
this.resultText.setAttribute('tooltiptext',' Could not connect to MailHops API.');
}
},
clear: function(no_ips){
this.mhBox.style.display = '';
this.mailhopsDataPaneDNSBL.style.display = 'none';
this.mailhopsResultWeather.style.display = 'none';
this.resultText.removeAttribute('data-route');
this.resultText.style.backgroundImage = '';
//remove child details
while(this.resultDetails.firstChild) {
this.resultDetails.removeChild(this.resultDetails.firstChild);
}
this.mailHopsAccountMessage.style.display = 'none';
if(no_ips){
this.resultText.style.backgroundImage = "url('chrome://mailhops/content/images/local.png')";
this.resultText.value = ' Looks like a local message';
} else {
this.resultText.style.backgroundImage = "url('chrome://mailhops/content/images/refresh.png')";
this.resultText.value = ' Looking Up Route...';
}
},
route: function ( header_route, message, response, meta, lookup_url ){
var displayText=''
, distanceText=''
, image='chrome://mailhops/content/images/local.png'
, weatherRoute=null
, first=null;
//remove child details
while(this.resultDetails.firstChild) {
this.resultDetails.removeChild(this.resultDetails.firstChild);
}
if(response && response.route && response.route.length){
if(this.options.client_location){
var client_location = JSON.parse(this.options.client_location);
//get distance from last route to client_location and add to response.distance.miles or kilometers
if(!response.route[response.route.length-1]['private']){
if(this.options.unit=='km')
response.distance.kilometers += mailHopsUtils.getDistance(response.route[response.route.length-1],client_location.route[0],this.options.unit);
else
response.distance.miles += mailHopsUtils.getDistance(response.route[response.route.length-1],client_location.route[0],this.options.unit);
}
//push client location to the end of the route
response.route.push(client_location.route[0]);
}
for(var i=0; i<response.route.length;i++){
//get the first hop location
if(!first && !response.route[i].private && !response.route[i].client){
first = response.route[i];
if(!!response.route[i].countryCode)
image='chrome://mailhops/content/images/flags/'+response.route[i].countryCode.toLowerCase()+'.png';
this.resultText.setAttribute('tooltiptext','View Map');
}
var hop = document.createElement('label');
var label = '';
if(response.route[i].countryCode)
hop.style.backgroundImage = "url('chrome://mailhops/content/images/flags/"+response.route[i].countryCode.toLowerCase()+".png')";
else if(response.route[i].coords)
hop.style.backgroundImage = "url('chrome://mailhops/content/images/auth/none.png')";
else
hop.style.backgroundImage = "url('chrome://mailhops/content/images/local.png')";
if(response.route[i].coords){
hop.setAttribute('class','bar-link hop');
if(response.route[i].city && response.route[i].state)
label='Hop #'+(i+1)+' '+response.route[i].city+', '+response.route[i].state;
else if(response.route[i].city && response.route[i].countryCode)
label='Hop #'+(i+1)+' '+response.route[i].city+', '+response.route[i].countryCode;
else if(response.route[i].city)
label='Hop #'+(i+1)+' '+response.route[i].city;
else if(response.route[i].state)
label='Hop #'+(i+1)+' '+response.route[i].state;
else if(response.route[i].countryName)
label='Hop #'+(i+1)+' '+response.route[i].countryName;
else
label='Hop #'+(i+1);
hop.setAttribute('data-ip',response.route[i].ip);
hop.setAttribute('tooltiptext','Click for whois');
hop.addEventListener("click", function () {
mailHopsUtils.launchWhoIs(this.getAttribute('data-ip'));
}
, false);
} else {
hop.setAttribute('class','hop');
label='Hop #'+(i+1)+' Private';
}
label+=' '+response.route[i].ip;
hop.setAttribute('value',label);
//append the hop
this.resultDetails.appendChild(hop);
//append the host
label = '';
if(response.route[i].host)
label += response.route[i].host;
if(response.route[i].whois && response.route[i].whois.descr)
label += response.route[i].whois.descr;
if(response.route[i].whois && response.route[i].whois.netname)
label += response.route[i].whois.netname;
if(label !== ''){
hop = document.createElement('label');
if (message.secure.indexOf(response.route[i].ip) !== -1) {
hop.style.backgroundImage = "url('chrome://mailhops/content/images/auth/lock.png')";
hop.setAttribute('tooltip','Used TLS or SSL');
}
hop.setAttribute('class', 'host');
hop.setAttribute('value',label);
this.resultDetails.appendChild(hop);
}
if (response.route[i].asn) {
if (response.route[i].asn.autonomous_system_organization) {
hop = document.createElement('label');
hop.setAttribute('class', 'host');
label = 'ASN Org: ';
label = label + response.route[i].asn.autonomous_system_organization;
label = label + ' (' + response.route[i].asn.autonomous_system_number + ')';
hop.setAttribute('value',label);
this.resultDetails.appendChild(hop);
}
}
//append weather
if(!weatherRoute && !!response.route[i].weather){
weatherRoute = response.route[i];
}
//auth & dnsbl
if(!response.route[i].private && response.route[i].dnsbl && response.route[i].dnsbl.listed){
this.mailhopsDataPaneDNSBL.setAttribute('value','Blacklisted '+mailHopsUtils.dnsbl(response.route[i].dnsbl.record,true));
this.mailhopsDataPaneDNSBL.setAttribute('data-ip',response.route[i].ip);
if(response.route[i].dnsbl.record)
this.mailhopsDataPaneDNSBL.setAttribute('tooltiptext','Click for more details.\n'+mailHopsUtils.dnsbl(response.route[i].dnsbl.record));
else
this.mailhopsDataPaneDNSBL.setAttribute('tooltiptext','Click for more details.');
this.mailhopsDataPaneDNSBL.style.backgroundImage = "url('chrome://mailhops/content/images/auth/bomb.png')";
this.mailhopsDataPaneDNSBL.style.display = 'block';
}
}
}
//set weather of sender
if(weatherRoute){
this.mailhopsResultWeather.style.display = 'block';
this.mailhopsResultWeather.setAttribute('tooltiptext','Weather in '+weatherRoute.city+' '+weatherRoute.state);
this.mailhopsResultWeather.value = weatherRoute.weather.summary+' '+Math.round(weatherRoute.weather.temp)+'\u00B0';
this.mailhopsResultWeather.style.backgroundImage = "url('"+mailHopsUtils.getWeatherIcon(weatherRoute.weather.icon)+"')";
if(weatherRoute.coords)
this.mailhopsResultWeather.setAttribute('href','https://darksky.net/forecast/'+weatherRoute.coords[1]+','+weatherRoute.coords[0]);
else if(weatherRoute.lat)
this.mailhopsResultWeather.setAttribute('href','https://darksky.net/forecast/'+weatherRoute.lat+','+weatherRoute.lng);
}
if(image.indexOf('local') !== -1) {
displayText = ' Local message.';
this.mailHopsAccountMessage.style.display = 'none';
} else {
if(!!first){
if(!!first.city && !!first.state)
displayText = first.city+', '+first.state;
else if(!!first.city)
displayText = first.city+', '+first.countryCode;
else if(!!first.countryName)
displayText = first.countryName;
}
if(response.distance){
if(this.options.unit=='km' && response.distance.kilometers > 0)
distanceText = mailHopsUtils.addCommas(Math.round(response.distance.kilometers))+' km traveled';
else if(response.distance.miles > 0)
distanceText = mailHopsUtils.addCommas(Math.round(response.distance.miles))+' mi traveled';
} else if(displayText=='')
displayText = ' Local message.';
}
if(!!message.time && message.time >= 0){
message.time = message.time/1000;
if(message.time < 60)
distanceText += ' in '+message.time+' sec.';
else if(message.time < 3600) //something is wrong if it takes this long
distanceText += ' in '+Math.round(message.time/60)+' min.';
else //something is wrong if it takes this long
distanceText += ' in '+Math.round(message.time/60/60)+' hr.';
}
if(header_route)
this.resultText.setAttribute("data-route", header_route);
else
this.resultText.removeAttribute("data-route");
this.resultText.setAttribute('value', displayText+' ( '+distanceText+' )');
this.resultText.style.backgroundImage = "url('"+image+"')";
if(meta && meta.message){
this.mailHopsAccountMessage.style.display = 'inline';
if(meta.message.text)
this.mailHopsAccountMessage.value = meta.message.text;
if(meta.message.url)
this.mailHopsAccountMessage.setAttribute('href', meta.message.url);
} else {
this.mailHopsAccountMessage.style.display = 'none';
}
}, //end route
toggleMailHopsBar: function(show){
if(show && this.mhBox.style.display == 'none')
this.mhBox.style.display = '';
else if(!show && this.mhBox.style.display == '')
this.mhBox.style.display = 'none';
}
};

View File

@ -1,512 +0,0 @@
/*
* @author: Andrew Van Tassel
* @email: andrew@andrewvantassel.com
* @website: http://mailhops.com
*/
var mailHops = {
msgURI: null,
isLoaded: false,
options: {
'version':'MailHops Plugin 3.8.1',
'lan':'en',
'unit':'mi',
'api_http':'https://',
'api_host':'api.mailhops.com',
'debug':false,
'hide_compact':false,
'bar_color': '#5E7A9B',
'font_color': '#ffffff',
'font_size': '14px',
'country_tag':false,
'travel_time_junk':false,
'country_filter':[]
},
message: {
secure:[]
,time: null
}
};
mailHops.LOG = function(msg) {
if(!mailHops.options.debug)
return;
var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
consoleService.logStringMessage('MailHops: '+msg);
};
mailHops.init = function() {
//load preferences
mailHops.loadPref();
document.getElementById("mailhopsLogo").addEventListener("click", function () {
window.openDialog("chrome://mailhops/content/preferences.xul","","chrome, dialog, modal, centerscreen").focus();
});
document.getElementById("mailhopsDataPaneRefresh").addEventListener("click", function () {
mailHops.refreshCache();
});
mailHops.isLoaded = true;
};
mailHops.loadPref = function(reload)
{
mailHops.LOG('load MailHops prefs');
//get preferences
mailHops.options.lan = mailHops.getCharPref('mail.mailHops.lang','en');
mailHops.options.unit = mailHops.getCharPref('mail.mailHops.unit','mi');
mailHops.options.fkey = mailHops.getCharPref('mail.mailHops.fkey','');//forecast.io api_key
//Display
mailHops.options.bar_color = mailHops.getCharPref('mail.mailHops.bar_color','#5E7A9B');
mailHops.options.font_color = mailHops.getCharPref('mail.mailHops.font_color','#ffffff');
mailHops.options.font_size = mailHops.getCharPref('mail.mailHops.font_size','14px');
mailHops.options.debug = mailHops.getCharPref('mail.mailHops.debug','false')=='true'?true:false;
mailHops.options.hide_compact = mailHops.getCharPref('mail.mailHops.hide_compact','false')=='true'?true:false;
mailHops.options.api_host = mailHops.getCharPref('mail.mailHops.api_host','api.mailhops.com');
mailHops.options.api_http = mailHops.getCharPref('mail.mailHops.api_http','https://');
mailHops.options.api_key = mailHops.getCharPref('mail.mailHops.api_key','');
mailHops.options.map_provider = mailHops.getCharPref('mail.mailHops.map_provider','OpenStreetMap.Mapnik');
mailHops.options.country_tag = mailHops.getCharPref('mail.mailHops.country_tag','false')=='true'?true:false;
mailHops.options.travel_time_junk = mailHops.getCharPref('mail.mailHops.travel_time_junk','false')=='true'?true:false;
mailHops.options.country_filter = mailHops.getCharPref('mail.mailHops.country_filter',[]);
//init display
mailHopsDisplay.init( mailHops.options, reload );
};
mailHops.StreamListener =
{
content: "" ,
found: false ,
onDataAvailable: function ( request, inputStream, offset, count )
{
try {
var sis = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance ( Components.interfaces.nsIScriptableInputStream ) ;
sis.init( inputStream ) ;
if( !this.found )
{
this.content += sis.read ( count ) ;
this.content = this.content.replace ( /\r/g , "" ) ;
var pos = this.content.indexOf ( "\n\n" ) ;
if ( pos > -1 )
{
// last header line must end with LF -> pos+1 !!!
this.content = this.content.substr ( 0 , pos + 1 ) ;
this.found = true ;
}
}
} catch(e) {
//failed to read input stream
mailHops.LOG('StreamListener Error: '+JSON.stringify(e));
}
},
onStartRequest: function ( request )
{
this.content = "" ;
this.found = false ;
},
onStopRequest: function ( aRequest , aStatusCode )
{
mailHops.headers = Components.classes["@mozilla.org/messenger/mimeheaders;1"].createInstance ( Components.interfaces.nsIMimeHeaders ) ;
mailHops.headers.initialize(this.content, this.content.length);
mailHops.headerData = this.content;
mailHops.getRoute();
}
};
/**
* loop through the header, find out if we have received-from headers
*/
mailHops.loadHeaderData = function() {
if(!!mailHops.options.hide_compact){
// CompactHeader toggle header logic
var compactHeadersView = document.getElementById('CompactHeader_collapsedHeaderView');
if(!!compactHeadersView){
if(compactHeadersView.collapsed===true){
mailHopsDisplay.toggleMailHopsBar(true);
} else if(compactHeadersView.collapsed===false){
mailHopsDisplay.toggleMailHopsBar(false);
return;
}
}
}
var msgURI = null ;
if ( gDBView ){
msgURI = gDBView.URIForFirstSelectedMessage;
}
if ( msgURI == null ){
return;
}
mailHops.msgURI = msgURI;
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance ( Components.interfaces.nsIMessenger ) ;
var msgService = messenger.messageServiceFromURI ( msgURI ) ;
msgService.CopyMessage ( msgURI , mailHops.StreamListener , false , null , msgWindow , {} ) ;
};
mailHops.getRoute = function(){
//IP regex
var regexIp=/(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}$/;
var regexAllIp = /(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)\.(1\d{0,2}|2(?:[0-4]\d{0,1}|[6789]|5[0-5]?)?|[3-9]\d?|0)(\/(?:[012]\d?|3[012]?|[456789])){0,1}/g;
var regexIPV6 = /s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*/g;
var headReceived = mailHops.headers.extractHeader ( "Received" , true );
var headDate = mailHops.headers.extractHeader ( "Date" , true );
var headXReceived = mailHops.headers.extractHeader ( "X-Received" , false );
var headXOrigIP = mailHops.headers.extractHeader ( "X-Originating-IP" , false );
// auth box
var headXMailer = mailHops.headers.extractHeader ( "X-Mailer" , false );
var headUserAgent = mailHops.headers.extractHeader ( "User-Agent" , false );
var headXMimeOLE = mailHops.headers.extractHeader ( "X-MimeOLE" , false );
var headReceivedSPF = mailHops.headers.extractHeader ( "Received-SPF" , false );
var headAuth = mailHops.headers.extractHeader ( "Authentication-Results" , false );
var headListUnsubscribe = mailHops.headers.extractHeader ( "List-Unsubscribe" , false ) ;
var all_ips = new Array();
var rline = '',firstDate=headDate,lastDate;
//empty secure and time
mailHops.message.secure = [];
mailHops.message.time = null;
mailHopsDisplay.lists( headListUnsubscribe );
mailHopsDisplay.auth( headXMailer, headUserAgent, headXMimeOLE, headAuth, headReceivedSPF );
//loop through the received headers and parse for IP addresses
if (!!headReceived){
var received_ips = new Array();
var headReceivedArr = headReceived.split('\n');
for( var h=0; h < headReceivedArr.length; h++ ) {
//build the received line by concat until semi-colon ; date/time
rline += headReceivedArr[h];
if(headReceivedArr[h].indexOf(';') === -1)
continue;
// first and last dates are used to calculate time traveled
if(rline.indexOf(';') !== -1){
if(!firstDate)
firstDate = rline.substring(rline.indexOf(';')+1).trim();
if(!lastDate)
lastDate = rline.substring(rline.indexOf(';')+1).trim();
}
// IPV6 check
rline = rline.replace(/\[IPv6\:/g,'[');
if(rline.match(regexIPV6)){
all_ips.unshift( rline.match(regexIPV6)[0] );
//reset the line
rline='';
continue;
}
// parse IPs out of Received line
received_ips = rline.match(regexAllIp);
//continue if no IPs found
if(!received_ips){
//reset the line
rline='';
continue;
}
//get unique IPs for each Received header
received_ips = received_ips.filter(function(item, pos) {
return received_ips.indexOf(item) === pos;
});
for( var r=received_ips.length; r >= 0 ; r-- ){
if(regexIp.test(received_ips[r]) && mailHops.testIP(received_ips[r],rline)){
all_ips.unshift( received_ips[r] );
}
}
//reset the line
rline='';
}
}
// parse dates
if(firstDate && firstDate.indexOf('(') !==- 1)
firstDate = firstDate.substring(0,firstDate.indexOf('(')).trim();
if(lastDate && lastDate.indexOf('(') !== -1)
lastDate = lastDate.substring(0,lastDate.indexOf('(')).trim();
if(firstDate && lastDate){
try {
firstDate = new Date(firstDate);
lastDate = new Date(lastDate);
mailHops.message.time = lastDate - firstDate;
} catch(e){
mailHops.LOG('travel dates parse Error: '+JSON.stringify(e));
mailHops.message.time = null;
}
} else {
mailHops.message.time = null;
}
//get the originating IP address
if(!!headXOrigIP){
headXOrigIP = headXOrigIP.replace(/\[IPv6\:/g,'[');
//IPV6 check
if(headXOrigIP.match(regexIPV6)){
var ip = headXOrigIP.match(regexIPV6)
if(!!ip && ip.length && all_ips.indexOf(ip[0])==-1)
all_ips.unshift( ip[0] );
} else {
var ip = headXOrigIP.match(regexAllIp);
if(!!ip && ip.length && all_ips.indexOf(ip[0])==-1)
all_ips.unshift( ip[0] );
}
}
if ( all_ips.length ){
mailHops.lookupRoute ( all_ips ) ;
} else {
mailHopsDisplay.clear( true );
}
};
//another ip check, dates will throw off the regex
mailHops.testIP = function(ip,header){
var validIP = true;
try {
var firstchar = header.substring(header.indexOf(ip)-1);
firstchar = firstchar.substring(0,1);
var lastchar = header.substring((header.indexOf(ip)+ip.length));
lastchar = lastchar.substring(0,1);
if(firstchar.match(/\.|\d|\-/)
|| lastchar.match(/\.|\d|\-/)
|| ( firstchar == '?' && lastchar == '?' )
|| (firstchar == ':' || lastchar == ':')
|| lastchar == ';'
|| header.toLowerCase().indexOf(' id '+ip) !== -1
|| parseInt(ip.substring(0,ip.indexOf('.'))) >= 240 //IANA-RESERVED
){
//only if there is one instance of this IP
if(header.indexOf(ip) == header.lastIndexOf(ip))
validIP = false;
} else if(header.indexOf('using SSL') !== -1
|| header.indexOf('using TLS') !== -1
|| header.indexOf('version=TLSv1/SSLv3') !== -1
){
//check if this IP was part of a secure transmission
mailHops.message.secure.push(ip);
}
} catch(e) {
mailHops.LOG('testIP Error: '+JSON.stringify(e));
}
return validIP;
};
mailHops.setupEventListener = function () {
if ( mailHops.isLoaded ){
return;
}
mailHops.LOG("Setting up Message listener");
mailHops.init();
mailHops.registerObserver();
var listener = {
onStartHeaders: function() { mailHopsDisplay.clear(); }
, onEndHeaders: mailHops.loadHeaderData
};
gMessageListeners.push( listener );
};
//preferences observers
mailHops.registerObserver = function(){
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService ( Ci.nsIPrefService ) ;
mailHops._branch = prefService.getBranch("mail.mailHops.");
if (!("addObserver" in mailHops._branch))
mailHops._branch.QueryInterface(Components.interfaces.nsIPrefBranch2);
mailHops._branch.addObserver( "" , mailHops , false ) ;
};
mailHops.unregisterObserver = function(){
if ( !mailHops._branch ){
return ;
}
mailHops._branch.removeObserver ( "" , mailHops ) ;
};
mailHops.observe = function ( aSubject , aTopic , aData )
{
if ( aTopic == "nsPref:changed" )
mailHops.loadPref(true);
};
mailHops.getCharPref = function ( strName , strDefault ){
var value;
if (!pref){
var pref = Components.classes["@mozilla.org/preferences-service;1"].getService( Ci.nsIPrefBranch ) ;
}
try {
value = pref.getCharPref ( strName ) ;
} catch(e){
value = strDefault ;
}
return ( value ) ;
};
//mailhops lookup
mailHops.lookupRoute = function(header_route){
//setup loading
mailHopsDisplay.clear();
var lookupURL = mailHopsUtils.getAPIUrl(mailHops.options)+'/lookup/?'+mailHopsUtils.getAPIUrlParams(mailHops.options)+'&r='+String(header_route)+'&l='+mailHops.options.lan+'&u='+mailHops.options.unit;
if(mailHops.options.fkey != '')
lookupURL += '&fkey='+mailHops.options.fkey;
if(mailHops.message.time != null)
lookupURL += '&t='+mailHops.message.time;
//check for cache
var cached_results = mailHops.getResults();
if(cached_results){
mailHops.LOG('Found Cached Result');
try {
cached_results = JSON.parse(cached_results);
mailHopsDisplay.route(header_route, mailHops.message, cached_results.response, cached_results.meta, lookupURL);
return;
} catch(e){
mailHops.LOG('Failed to parse cached result: '+JSON.stringify(e));
}
}
mailHops.LOG(lookupURL);
//call mailhops api for lookup
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", lookupURL ,true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState===4){
try {
var data = JSON.parse(xmlhttp.responseText);
if(xmlhttp.status===200){
var d = new Date();
data.meta.cached = d.toISOString();
//save the result
mailHops.saveResults(data, data.response.route);
//display the result
mailHopsDisplay.route(header_route, mailHops.message, data.response, data.meta, lookupURL);
} else if(data.error){
mailHops.LOG(JSON.stringify(data));
//display the error
mailHopsDisplay.error(xmlhttp.status,data);
}
} catch(e){
mailHops.LOG(e);
mailHopsDisplay.error();
}
}
};
xmlhttp.send(null);
};
mailHops.saveResults = function(results, route){
if(!mailHops.msgURI)
return false;
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance().QueryInterface(Components.interfaces.nsIMessenger);
var msgHdr = messenger.messageServiceFromURI(mailHops.msgURI).messageURIToMsgHdr(mailHops.msgURI);
if(!msgHdr)
return false;
if(!results){
msgHdr.setStringProperty( "MH-Route", '' );
return false;
}
var countryCode = mailHopsUtils.getOriginatingCountryCode(route);
if(!!countryCode){
results.sender = { countryCode: countryCode };
}
msgHdr.setStringProperty( "MH-Route", JSON.stringify(results) );
//Add tag
if(!!countryCode && !!mailHops.options.api_key){
try {
var msg = Components.classes["@mozilla.org/array;1"].createInstance(Components.interfaces.nsIMutableArray);
msg.clear();
msg.appendElement(msgHdr, false);
if(!!mailHops.options.country_tag){
var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"].getService(Components.interfaces.nsIMsgTagService);
if(!tagService)
return;
if(!tagService.getKeyForTag(countryCode))
tagService.addTag(countryCode,'',0);
msgHdr.folder.addKeywordsToMessages(msg, countryCode );
mailHops.LOG( "Added CountryCode tag: "+countryCode );
}
if(!!mailHops.options.country_filter && mailHops.options.country_filter.length){
if(mailHops.options.country_filter.indexOf(countryCode.toLowerCase()) !== -1){
msgHdr.folder.setJunkScoreForMessages(msg, "100");
mailHops.LOG( "Junk: Country Filter match" );
}
}
// tag as junk if travel time is longer than 10 seconds
if(!!mailHops.options.travel_time_junk && mailHops.message.time != null && mailHops.message.time > 10000){
msgHdr.folder.setJunkScoreForMessages(msg, "100");
mailHops.LOG( "Junk: Travel time match" );
}
} catch(e){
mailHops.LOG( "Error adding CountryCode tag: "+e );
}
}
};
mailHops.getResults = function(){
if(!mailHops.msgURI)
return false;
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance().QueryInterface(Components.interfaces.nsIMessenger);
var msgHdr = messenger.messageServiceFromURI(mailHops.msgURI).messageURIToMsgHdr(mailHops.msgURI);
if(!msgHdr)
return false;
return msgHdr.getStringProperty( "MH-Route" );
};
mailHops.refreshCache = function(){
mailHops.saveResults();
mailHops.getRoute();
};
// window.addEventListener("messagepane-loaded", mailHops.setupEventListener, true);
window.addEventListener("load", function() {
var messagepane = document.getElementById("messagepane");
if (messagepane) {
messagepane.addEventListener("load", function () {
mailHops.setupEventListener();
}, true);
}
}, false);

View File

@ -1,272 +0,0 @@
if (!pref) {
var pref = Components.classes["@mozilla.org/preferences-service;1"].getService ( Ci.nsIPrefBranch ) ;
}
var mailHopPreferences = {
api_host: 'api.mailhops.com', //mailhops api url
api_http: 'https://', //ssl?
api_key: '', //api key
valid_api_key: false,
fkey: '', //forecast.io api key
country_filter: [],
previewBar: null,
loadPreferences: function(){
var self = this;
this.api_host = document.getElementById("mailhop.api_host");
this.api_http = document.getElementById("mailhop.api_http");
this.api_key = document.getElementById("mailhop.api_key");
this.fkey = document.getElementById("mailhop.fkey");
this.previewBar = document.getElementById("display_preview");
document.getElementById("mailhop.lang").value = pref.getCharPref("mail.mailHops.lang",'en');
document.getElementById("mailhop.map_provider").value = pref.getCharPref("mail.mailHops.map_provider",'OpenStreetMap.Mapnik');
if(pref.getCharPref("mail.mailHops.unit",'mi')=='mi')
document.getElementById("mailhop.unit").selectedIndex = 0;
else
document.getElementById("mailhop.unit").selectedIndex = 1;
//Display Box styles
document.getElementById("mailhop.bar_color").value = pref.getCharPref("mail.mailHops.bar_color",'#FFF');
document.getElementById("mailhop.font_color").value = pref.getCharPref("mail.mailHops.font_color",'#777');
document.getElementById("mailhop.font_size").value = pref.getCharPref("mail.mailHops.font_size",'14px');
//Update styles
this.previewBar.style.background = document.getElementById("mailhop.bar_color").value;
this.previewBar.style.color = document.getElementById("mailhop.font_color").value;
this.previewBar.style.fontSize = document.getElementById("mailhop.font_size").value;
if(pref.getCharPref("mail.mailHops.debug",'true')=='true')
document.getElementById("mailhop.debug").checked = true;
else
document.getElementById("mailhop.debug").checked = false;
// API info
this.api_key.value = pref.getCharPref("mail.mailHops.api_key",'');
this.api_http.value = pref.getCharPref("mail.mailHops.api_http",'https://');
if(this.api_http.value=='https://')
this.api_http.selectedIndex = 0;
else
this.api_http.selectedIndex = 1;
this.api_host.value = pref.getCharPref("mail.mailHops.api_host",'api.mailhops.com');
this.fkey.value = pref.getCharPref("mail.mailHops.fkey",'');
// Country Filter and tagging
this.country_filter = JSON.parse(pref.getCharPref("mail.mailHops.country_filter",null) || []);
if(this.country_filter.length){
for(c in this.country_filter){
document.getElementById("country_"+this.country_filter[c]).checked=true;
}
}
if(!!this.api_key.value.trim()){
document.getElementById("mailhops-membership-link").value='My Account';
document.getElementById("mailhops-membership-link").setAttribute('href','https://mailhops.com/account/'+this.api_key.value.trim());
}
if(pref.getCharPref("mail.mailHops.country_tag",'false')=='false')
document.getElementById("mailhop.country_tag").checked = false;
else
document.getElementById("mailhop.country_tag").checked = true;
if(pref.getCharPref("mail.mailHops.travel_time_junk",'false')=='false')
document.getElementById("mailhop.travel_time_junk").checked = false;
else
document.getElementById("mailhop.travel_time_junk").checked = true;
if(pref.getCharPref("mail.mailHops.hide_compact",'false')=='false')
document.getElementById("mailhop.hide_compact").checked = false;
else
document.getElementById("mailhop.hide_compact").checked = true;
this.saveAPIKey();
document.getElementById("mailhop.bar_color").addEventListener("input", function () {
self.previewBar.style.background = this.value;
});
document.getElementById("mailhop.font_color").addEventListener("input", function () {
self.previewBar.style.color = this.value;
});
document.getElementById("mailhop.font_size").addEventListener("input", function () {
self.previewBar.style.fontSize = this.value;
});
document.addEventListener("dialogaccept", function(event) {
mailHopPreferences.savePreferences();
});
},
savePreferences: function() {
pref.setCharPref("mail.mailHops.lang", document.getElementById("mailhop.lang").selectedItem.value);
pref.setCharPref("mail.mailHops.map_provider", document.getElementById("mailhop.map_provider").selectedItem.value);
pref.setCharPref("mail.mailHops.unit", document.getElementById("mailhop.unit").selectedItem.value);
pref.setCharPref("mail.mailHops.bar_color", String(document.getElementById("mailhop.bar_color").value));
pref.setCharPref("mail.mailHops.font_color", String(document.getElementById("mailhop.font_color").value));
pref.setCharPref("mail.mailHops.font_size", String(document.getElementById("mailhop.font_size").value));
pref.setCharPref("mail.mailHops.debug", String(document.getElementById("mailhop.debug").checked));
pref.setCharPref("mail.mailHops.hide_compact", String(document.getElementById("mailhop.hide_compact").checked));
//API vars
if(!this.valid_api_key)
this.api_key.value='';
pref.setCharPref("mail.mailHops.api_key", this.api_key.value.trim());
pref.setCharPref("mail.mailHops.api_http", this.api_http.value);
pref.setCharPref("mail.mailHops.api_host", this.api_host.value);
pref.setCharPref("mail.mailHops.fkey", String(this.fkey.value));
// Country Filter and tagging
this.country_filter = [];
for(c in mailHopsUtils.countries){
if(document.getElementById("country_"+mailHopsUtils.countries[c]).checked)
this.country_filter.push(document.getElementById("country_"+mailHopsUtils.countries[c]).getAttribute('value'));
}
pref.setCharPref("mail.mailHops.country_filter", String(JSON.stringify(this.country_filter)));
pref.setCharPref("mail.mailHops.country_tag", String(document.getElementById("mailhop.country_tag").checked));
pref.setCharPref("mail.mailHops.travel_time_junk", String(document.getElementById("mailhop.travel_time_junk").checked));
return true;
},
countryListSelectAll: function(all){
if(this.valid_api_key){
for(c in mailHopsUtils.countries){
document.getElementById("country_"+mailHopsUtils.countries[c]).checked=all;
}
}
},
planError: function(error){
this.valid_api_key=false;
document.getElementById("plan-error").style.display = 'block';
document.getElementById("plan-error").value=error;
document.getElementById("plan").value='';
document.getElementById("status").value='';
document.getElementById("rate-limit").value='';
document.getElementById("rate-remaining").value='';
document.getElementById("rate-reset").value='';
document.getElementById("mailhops-membership-link").value='Join MailHops';
document.getElementById("mailhops-membership-link").setAttribute('href','https://mailhops.com');
var items = document.getElementsByClassName('filters');
for(x in items){
items[x].disabled = true;
}
var items = document.getElementsByClassName('country');
for(x in items){
items[x].disabled = true;
if(items[x].label)
items[x].label = items[x].label.toUpperCase();
}
},
saveAPIKey: function() {
if(!!this.api_key && this.api_key.value != ''){
var xmlhttp = new XMLHttpRequest();
var apiBase = this.api_http.value+this.api_host.value,
accountURL = '/v2/accounts/?api_key='+this.api_key.value.trim(),
api_key = this.api_key.value.trim(),
self = this;
xmlhttp.open("GET", apiBase+accountURL, true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState===4) {
try {
var data = JSON.parse(xmlhttp.responseText);
if(xmlhttp.status===200){
self.valid_api_key=true;
document.getElementById("plan-error").style.display = 'none';
// set plan info
document.getElementById("plan").value = "Plan: "+data.account.subscriptions.data[0].plan.name;
document.getElementById("status").value = "Status: "+data.account.subscriptions.data[0].status;
document.getElementById("rate-limit").value = "Limit: "+data.account.rate.limit;
document.getElementById("rate-remaining").value = "Remaining: "+data.account.rate.remaining;
if(data.account.rate.reset/60 < 60)
document.getElementById("rate-reset").value = "Resets in: "+Math.round(data.account.rate.reset/60)+" min.";
else
document.getElementById("rate-reset").value = "Resets in: "+Math.round(data.account.rate.reset/60/60)+" hr.";
document.getElementById("mailhops-membership-link").value='My Account';
document.getElementById("mailhops-membership-link").setAttribute('href','https://mailhops.com/account/'+api_key);
var items = document.getElementsByClassName('filters');
for(x in items){ items[x].disabled = false;}
var items = document.getElementsByClassName('country');
for(x in items){ items[x].disabled = false; if(items[x].label) items[x].label = items[x].label.toUpperCase();}
} else if(!!data.error){
self.planError(xmlhttp.status+': '+data.error.message);
}
mailHopPreferences.savePreferences();
} catch (e){
self.planError('Connection Failed to\n '+e+'!');
}
}
};
xmlhttp.send(null);
} else {
this.planError('Enter a valid API key above.');
}
},
TestConnection: function(){
var xmlhttp = new XMLHttpRequest();
var apiBase = this.api_http.value+this.api_host.value,
lookupURL = '/v1/lookup/?healthcheck';
xmlhttp.open("GET", apiBase+lookupURL,true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState===4) {
try{
var data = JSON.parse(xmlhttp.responseText);
if(xmlhttp.status===200){
alert('Connection Succeeded to\n '+apiBase+'!');
} else {
//display the error
alert('Connection Failed to\n '+apiBase+'!');
}
}
catch (ex){
alert('Connection Failed to\n '+apiBase+'! '+JSON.stringify(ex));
}
}
};
xmlhttp.send(null);
},
ResetConnection: function(){
this.api_http.value=="https://";
this.api_http.selectedIndex = 0;
this.api_host.value='api.mailhops.com';
},
ResetDisplay: function(bar,font,size){
if(bar){
if(bar.indexOf('rgb(')===0)
document.getElementById("mailhop.bar_color").value = this.rgb2hex(bar);
else
document.getElementById("mailhop.bar_color").value = bar;
}
if(font) {
if(font.indexOf('rgb(')===0)
document.getElementById("mailhop.font_color").value = this.rgb2hex(font);
else
document.getElementById("mailhop.font_color").value = font;
}
if(size) document.getElementById("mailhop.font_size").value = size;
this.previewBar.style.background = document.getElementById("mailhop.bar_color").value;
this.previewBar.style.color = document.getElementById("mailhop.font_color").value;
this.previewBar.style.fontSize = document.getElementById("mailhop.font_size").value;
},
rgb2hex: function(rgb) {
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
function hex(x) {
return ("0" + parseInt(x).toString(16)).slice(-2);
}
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
};

View File

@ -1,75 +0,0 @@
var columnHandler = {
getCellText: function(row, col) {return null;},
getSortStringForRow: function(msgHdr) {
msgHdr.getStringProperty( "MH-Route" );
var countryCode = null;
var cached_results = msgHdr.getStringProperty( "MH-Route" );
if(cached_results){
try {
cached_results = JSON.parse(cached_results);
if(cached_results.sender && cached_results.sender.countryCode){
countryCode = cached_results.sender.countryCode;
} else {
countryCode = mailHopsUtils.getOriginatingCountryCode(cached_results.response.route);
}
if(countryCode){
return 'chrome://mailhops/content/images/flags/'+countryCode.toLowerCase()+'.png';
}
} catch(e) {
return countryCode;
}
}
return countryCode;
},
isString: function() {return true;},
getCellProperties: function (row, col, props) {
return 'colMailHops';
},
getRowProperties: function(row, props){},
getImageSrc: function (row, col) {
var msgKey = gDBView.getKeyAt(row);
var msgHdr = gDBView.db.GetMsgHdrForKey(msgKey);
var countryCode = null;
var cached_results = msgHdr.getStringProperty( "MH-Route" );
if(cached_results){
try {
cached_results = JSON.parse(cached_results);
if(cached_results.sender && cached_results.sender.countryCode){
countryCode = cached_results.sender.countryCode;
} else {
countryCode = mailHopsUtils.getOriginatingCountryCode(cached_results.response.route);
}
if(countryCode){
return 'chrome://mailhops/content/images/flags/'+countryCode.toLowerCase()+'.png';
}
} catch(e) {
return null;
}
}
return null;
},
getSortLongForRow: function(hdr) {return 0;}
};
var CreateDbObserver = {
// Components.interfaces.nsIObserver
observe: function(aMsgFolder, aTopic, aData)
{
addCustomColumnHandler();
}
};
function doOnceLoaded() {
var ObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
ObserverService.addObserver(CreateDbObserver, "MsgCreateDBView", false);
}
function addCustomColumnHandler() {
gDBView.addColumnHandler("colMailHops", columnHandler);
if ("COLUMNS_MAP_NOSORT" in gFolderDisplay) {
gFolderDisplay.COLUMNS_MAP_NOSORT.add("colMailHops");
}
}
window.addEventListener("load", doOnceLoaded, false);

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<?xml-stylesheet href="chrome://mailhops/skin/pb-styles.css" type="text/css"?>
<dialog id="mailHopsMap"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
buttons="cancel"
onload="loadMap();"
title="MailHops Map"
buttonlabelcancel="Close">
<iframe id="mailhops_iframe" flex="1" width="1024" height="768" style="overflow:hidden;" type="content"></iframe>
<script>
function loadMap(){
var args = window.arguments[0];
document.getElementById('mailhops_iframe').setAttribute('src',args.src);
}
</script>
</dialog>

View File

@ -1,15 +0,0 @@
<?xml version="1.0"?>
<overlay id="mailhops_listcolumn"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<tree id="threadTree">
<treecols id="threadCols">
<splitter class="tree-splitter" />
<treecol id="colMailHops" persist="hidden ordinal width"
currentView="unthreaded" flex="2"
label="Country" tooltiptext="Click to sort by Country" />
</treecols>
</tree>
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-1-utils.js"/>
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-5-msgListColumn.js"/>
</overlay>

View File

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE overlay SYSTEM "chrome://mailhops/locale/strings.dtd" >
<?xml-stylesheet href="chrome://mailhops/skin/msgNotificationBar.css" type="text/css"?>
<overlay id="mailhopsNotificationOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml">
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-1-utils.js"/>
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-2-msgNotificationBar.js"/>
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-3.js"/>
<hbox id="mail-notification-top">
<stack id="mailhopsNoficationBox" collapsed="false" notificationside="top" class="notificationbox-stack" flex="1">
<notification id="mailhopsNotification" class="animated" value="remoteContent" type="info">
<hbox class="messageDetails">
<image id="mailhopsLogo" src="chrome://mailhops/content/images/mailhops32.png" tooltiptext="&mailhops_route_nav_options_label;"/>
<hbox id="mailhopsResult" flex="1">
<label id="mailHopsAccountMessage" class="bar-link" value="Join today" is="text-link" href="https://www.mailhops.com/#pricing"></label>
<label id="mailhopsResultText" class="bar-link"></label>
<label id="mailhopsResultWeather" class="bar-link"></label>
<hbox id="mailhopsHopsBox">
<toolbarbutton id="mailhopsDataPaneHops" label="&mailhops_hops;" class="toolbarbutton"></toolbarbutton>
<vbox id="mailhopsDataPaneDetails"></vbox>
</hbox>
<toolbarseparator />
<hbox id="mailhopsRefreshBox">
<toolbarbutton id="mailhopsDataPaneRefresh" label="&mailhops_route_nav_refresh_label;" class="toolbarbutton"></toolbarbutton>
</hbox>
<toolbarseparator />
<hbox id="mailhopsUnsubscribeBox">
<toolbarbutton id="mailhopsUnsubscribe" label="&mailhops_unsubscribe;" class="toolbarbutton"></toolbarbutton>
</hbox>
<toolbarseparator />
<label id="mailhopsDataPaneMailer" class="auth-item" is="text-link" value="" tooltiptext="Mailer"></label>
<label id="mailhopsDataPaneSPF" class="auth-item" value="" tooltiptext="SPF"></label>
<label id="mailhopsDataPaneDKIM" class="auth-item" value="" tooltiptext="DKIM"></label>
<label id="mailhopsDataPaneDNSBL" class="bar-link auth-item" value="" tooltiptext="DNSBL"></label>
</hbox>
</hbox>
</notification>
</stack>
</hbox>
</overlay>

View File

@ -1,617 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<?xml-stylesheet href="chrome://mailhops/skin/prefs.css" type="text/css"?>
<!DOCTYPE window [
<!ENTITY % MailHopsDTD SYSTEM "chrome://mailhops/locale/prefs.dtd">
%MailHopsDTD;
]>
<dialog id="mailHopsPreferences"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
buttons="accept,cancel"
onload="mailHopPreferences.loadPreferences();"
title="MailHops &mailhops_preferences;">
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-1-utils.js"/>
<script type="application/x-javascript" src="chrome://mailhops/content/mailhops-4-preferences.js"/>
<vbox width="400px">
<tabbox id="mhTabs" selectedIndex="0">
<tabs>
<tab label="&mailhops_tab_member_label;"/>
<tab label="&mailhops_tab_filters_label;"/>
<tab label="&mailhops_tab_defaults_label;"/>
<tab label="&mailhops_tab_display_label;"/>
<tab label="&mailhops_tab_api_label;"/>
</tabs>
<tabpanels>
<tabpanel>
<groupbox flex="1">
<caption label="MailHops &mailhops_tab_member_label;"/>
<description>
API Key <label xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" is="text-link" id="mailhops-membership-link" class="text-link plain" value="Join MailHops" href="https://www.mailhops.com/#pricing"/>
</description>
<hbox align="center">
<textbox id="mailhop.api_key" placeholder="Enter your MailHops API Member Key" width="500"/>
<button onclick="mailHopPreferences.saveAPIKey();">Save API Key</button>
</hbox>
<hbox align="center">
<description>
<label id="plan-error" class="text-error plain" value=""></label>
</description>
</hbox>
<hbox align="center">
<description>
<label id="plan" class="plain" value=""></label>
</description>
</hbox>
<hbox align="center">
<description>
<label id="status" class="plain" value=""></label>
</description>
</hbox>
<hbox align="center">
<description>
<label id="rate-limit" class="plain" value=""></label>
</description>
</hbox>
<hbox align="center">
<description>
<label id="rate-remaining" class="plain" value=""></label>
</description>
</hbox>
<hbox align="center">
<description>
<label id="rate-reset" class="plain" value=""></label>
</description>
</hbox>
</groupbox>
</tabpanel>
<tabpanel>
<groupbox flex="1" style="height:400px;overflow: scroll;">
<caption label="&mailhops_tab_filters_label;"/>
<checkbox id="mailhop.country_tag" label="Tag messages with country origin" checked="false" disabled="true" class="filters"/>
<checkbox id="mailhop.travel_time_junk" label="Tag messages that take longer than 10 seconds as Junk" checked="false" disabled="true" class="filters"/>
<description class="filters">Mark messages as Junk from Countries checked below.
<label id="select-all-filters" class="text-link plain filters" value="All " onclick="mailHopPreferences.countryListSelectAll(true);" disabled="true"/>
<label id="select-none-filters" class="text-link plain filters" value=" None" onclick="mailHopPreferences.countryListSelectAll(false);" disabled="true"/>
</description>
<grid flex="1">
<columns>
<column flex="1"/>
<column flex="1"/>
<column flex="1"/>
</columns>
<rows>
<row>
<vbox>
<checkbox disabled="true" class="country" id="country_ad" value="ad" label="ad"/>
<checkbox disabled="true" class="country" id="country_ae" value="ae" label="ae"/>
<checkbox disabled="true" class="country" id="country_af" value="af" label="af"/>
<checkbox disabled="true" class="country" id="country_ag" value="ag" label="ag"/>
<checkbox disabled="true" class="country" id="country_ai" value="ai" label="ai"/>
<checkbox disabled="true" class="country" id="country_al" value="al" label="al"/>
<checkbox disabled="true" class="country" id="country_am" value="am" label="am"/>
<checkbox disabled="true" class="country" id="country_an" value="an" label="an"/>
<checkbox disabled="true" class="country" id="country_ao" value="ao" label="ao"/>
<checkbox disabled="true" class="country" id="country_ar" value="ar" label="ar"/>
<checkbox disabled="true" class="country" id="country_as" value="as" label="as"/>
<checkbox disabled="true" class="country" id="country_at" value="at" label="at"/>
<checkbox disabled="true" class="country" id="country_au" value="au" label="au"/>
<checkbox disabled="true" class="country" id="country_aw" value="aw" label="aw"/>
<checkbox disabled="true" class="country" id="country_ax" value="ax" label="ax"/>
<checkbox disabled="true" class="country" id="country_az" value="az" label="az"/>
<checkbox disabled="true" class="country" id="country_ba" value="ba" label="ba"/>
<checkbox disabled="true" class="country" id="country_bb" value="bb" label="bb"/>
<checkbox disabled="true" class="country" id="country_bd" value="bd" label="bd"/>
<checkbox disabled="true" class="country" id="country_be" value="be" label="be"/>
<checkbox disabled="true" class="country" id="country_bf" value="bf" label="bf"/>
<checkbox disabled="true" class="country" id="country_bg" value="bg" label="bg"/>
<checkbox disabled="true" class="country" id="country_bh" value="bh" label="bh"/>
<checkbox disabled="true" class="country" id="country_bi" value="bi" label="bi"/>
<checkbox disabled="true" class="country" id="country_bj" value="bj" label="bj"/>
<checkbox disabled="true" class="country" id="country_bm" value="bm" label="bm"/>
<checkbox disabled="true" class="country" id="country_bn" value="bn" label="bn"/>
<checkbox disabled="true" class="country" id="country_bo" value="bo" label="bo"/>
<checkbox disabled="true" class="country" id="country_br" value="br" label="br"/>
<checkbox disabled="true" class="country" id="country_bs" value="bs" label="bs"/>
<checkbox disabled="true" class="country" id="country_bt" value="bt" label="bt"/>
<checkbox disabled="true" class="country" id="country_bv" value="bv" label="bv"/>
<checkbox disabled="true" class="country" id="country_bw" value="bw" label="bw"/>
<checkbox disabled="true" class="country" id="country_by" value="by" label="by"/>
<checkbox disabled="true" class="country" id="country_bz" value="bz" label="bz"/>
<checkbox disabled="true" class="country" id="country_ca" value="ca" label="ca"/>
<checkbox disabled="true" class="country" id="country_catalonia" value="catalonia" label="catalonia"/>
<checkbox disabled="true" class="country" id="country_cc" value="cc" label="cc"/>
<checkbox disabled="true" class="country" id="country_cd" value="cd" label="cd"/>
<checkbox disabled="true" class="country" id="country_cf" value="cf" label="cf"/>
<checkbox disabled="true" class="country" id="country_cg" value="cg" label="cg"/>
<checkbox disabled="true" class="country" id="country_ch" value="ch" label="ch"/>
<checkbox disabled="true" class="country" id="country_ci" value="ci" label="ci"/>
<checkbox disabled="true" class="country" id="country_ck" value="ck" label="ck"/>
<checkbox disabled="true" class="country" id="country_cl" value="cl" label="cl"/>
<checkbox disabled="true" class="country" id="country_cm" value="cm" label="cm"/>
<checkbox disabled="true" class="country" id="country_cn" value="cn" label="cn"/>
<checkbox disabled="true" class="country" id="country_co" value="co" label="co"/>
<checkbox disabled="true" class="country" id="country_cr" value="cr" label="cr"/>
<checkbox disabled="true" class="country" id="country_cs" value="cs" label="cs"/>
<checkbox disabled="true" class="country" id="country_cu" value="cu" label="cu"/>
<checkbox disabled="true" class="country" id="country_cv" value="cv" label="cv"/>
<checkbox disabled="true" class="country" id="country_cx" value="cx" label="cx"/>
<checkbox disabled="true" class="country" id="country_cy" value="cy" label="cy"/>
<checkbox disabled="true" class="country" id="country_cz" value="cz" label="cz"/>
<checkbox disabled="true" class="country" id="country_de" value="de" label="de"/>
<checkbox disabled="true" class="country" id="country_dj" value="dj" label="dj"/>
<checkbox disabled="true" class="country" id="country_dk" value="dk" label="dk"/>
<checkbox disabled="true" class="country" id="country_dm" value="dm" label="dm"/>
<checkbox disabled="true" class="country" id="country_do" value="do" label="do"/>
<checkbox disabled="true" class="country" id="country_dz" value="dz" label="dz"/>
<checkbox disabled="true" class="country" id="country_ec" value="ec" label="ec"/>
<checkbox disabled="true" class="country" id="country_ee" value="ee" label="ee"/>
<checkbox disabled="true" class="country" id="country_eg" value="eg" label="eg"/>
<checkbox disabled="true" class="country" id="country_eh" value="eh" label="eh"/>
<checkbox disabled="true" class="country" id="country_england" value="england" label="england"/>
<checkbox disabled="true" class="country" id="country_er" value="er" label="er"/>
<checkbox disabled="true" class="country" id="country_es" value="es" label="es"/>
<checkbox disabled="true" class="country" id="country_et" value="et" label="et"/>
<checkbox disabled="true" class="country" id="country_europeanunion" value="europeanunion" label="europeanunion"/>
<checkbox disabled="true" class="country" id="country_fam" value="fam" label="fam"/>
<checkbox disabled="true" class="country" id="country_fi" value="fi" label="fi"/>
<checkbox disabled="true" class="country" id="country_fj" value="fj" label="fj"/>
<checkbox disabled="true" class="country" id="country_fk" value="fk" label="fk"/>
<checkbox disabled="true" class="country" id="country_fm" value="fm" label="fm"/>
<checkbox disabled="true" class="country" id="country_fo" value="fo" label="fo"/>
<checkbox disabled="true" class="country" id="country_fr" value="fr" label="fr"/>
<checkbox disabled="true" class="country" id="country_ga" value="ga" label="ga"/>
<checkbox disabled="true" class="country" id="country_gb" value="gb" label="gb"/>
<checkbox disabled="true" class="country" id="country_gd" value="gd" label="gd"/>
<checkbox disabled="true" class="country" id="country_ge" value="ge" label="ge"/>
<checkbox disabled="true" class="country" id="country_gf" value="gf" label="gf"/>
<checkbox disabled="true" class="country" id="country_gh" value="gh" label="gh"/>
</vbox>
<vbox>
<checkbox disabled="true" class="country" id="country_gi" value="gi" label="gi"/>
<checkbox disabled="true" class="country" id="country_gl" value="gl" label="gl"/>
<checkbox disabled="true" class="country" id="country_gm" value="gm" label="gm"/>
<checkbox disabled="true" class="country" id="country_gn" value="gn" label="gn"/>
<checkbox disabled="true" class="country" id="country_gp" value="gp" label="gp"/>
<checkbox disabled="true" class="country" id="country_gq" value="gq" label="gq"/>
<checkbox disabled="true" class="country" id="country_gr" value="gr" label="gr"/>
<checkbox disabled="true" class="country" id="country_gs" value="gs" label="gs"/>
<checkbox disabled="true" class="country" id="country_gt" value="gt" label="gt"/>
<checkbox disabled="true" class="country" id="country_gu" value="gu" label="gu"/>
<checkbox disabled="true" class="country" id="country_gw" value="gw" label="gw"/>
<checkbox disabled="true" class="country" id="country_gy" value="gy" label="gy"/>
<checkbox disabled="true" class="country" id="country_hk" value="hk" label="hk"/>
<checkbox disabled="true" class="country" id="country_hm" value="hm" label="hm"/>
<checkbox disabled="true" class="country" id="country_hn" value="hn" label="hn"/>
<checkbox disabled="true" class="country" id="country_hr" value="hr" label="hr"/>
<checkbox disabled="true" class="country" id="country_ht" value="ht" label="ht"/>
<checkbox disabled="true" class="country" id="country_hu" value="hu" label="hu"/>
<checkbox disabled="true" class="country" id="country_id" value="id" label="id"/>
<checkbox disabled="true" class="country" id="country_ie" value="ie" label="ie"/>
<checkbox disabled="true" class="country" id="country_il" value="il" label="il"/>
<checkbox disabled="true" class="country" id="country_in" value="in" label="in"/>
<checkbox disabled="true" class="country" id="country_io" value="io" label="io"/>
<checkbox disabled="true" class="country" id="country_iq" value="iq" label="iq"/>
<checkbox disabled="true" class="country" id="country_ir" value="ir" label="ir"/>
<checkbox disabled="true" class="country" id="country_is" value="is" label="is"/>
<checkbox disabled="true" class="country" id="country_it" value="it" label="it"/>
<checkbox disabled="true" class="country" id="country_jm" value="jm" label="jm"/>
<checkbox disabled="true" class="country" id="country_jo" value="jo" label="jo"/>
<checkbox disabled="true" class="country" id="country_jp" value="jp" label="jp"/>
<checkbox disabled="true" class="country" id="country_ke" value="ke" label="ke"/>
<checkbox disabled="true" class="country" id="country_kg" value="kg" label="kg"/>
<checkbox disabled="true" class="country" id="country_kh" value="kh" label="kh"/>
<checkbox disabled="true" class="country" id="country_ki" value="ki" label="ki"/>
<checkbox disabled="true" class="country" id="country_km" value="km" label="km"/>
<checkbox disabled="true" class="country" id="country_kn" value="kn" label="kn"/>
<checkbox disabled="true" class="country" id="country_kp" value="kp" label="kp"/>
<checkbox disabled="true" class="country" id="country_kr" value="kr" label="kr"/>
<checkbox disabled="true" class="country" id="country_kw" value="kw" label="kw"/>
<checkbox disabled="true" class="country" id="country_ky" value="ky" label="ky"/>
<checkbox disabled="true" class="country" id="country_kz" value="kz" label="kz"/>
<checkbox disabled="true" class="country" id="country_la" value="la" label="la"/>
<checkbox disabled="true" class="country" id="country_lb" value="lb" label="lb"/>
<checkbox disabled="true" class="country" id="country_lc" value="lc" label="lc"/>
<checkbox disabled="true" class="country" id="country_li" value="li" label="li"/>
<checkbox disabled="true" class="country" id="country_lk" value="lk" label="lk"/>
<checkbox disabled="true" class="country" id="country_lr" value="lr" label="lr"/>
<checkbox disabled="true" class="country" id="country_ls" value="ls" label="ls"/>
<checkbox disabled="true" class="country" id="country_lt" value="lt" label="lt"/>
<checkbox disabled="true" class="country" id="country_lu" value="lu" label="lu"/>
<checkbox disabled="true" class="country" id="country_lv" value="lv" label="lv"/>
<checkbox disabled="true" class="country" id="country_ly" value="ly" label="ly"/>
<checkbox disabled="true" class="country" id="country_ma" value="ma" label="ma"/>
<checkbox disabled="true" class="country" id="country_mc" value="mc" label="mc"/>
<checkbox disabled="true" class="country" id="country_md" value="md" label="md"/>
<checkbox disabled="true" class="country" id="country_me" value="me" label="me"/>
<checkbox disabled="true" class="country" id="country_mg" value="mg" label="mg"/>
<checkbox disabled="true" class="country" id="country_mh" value="mh" label="mh"/>
<checkbox disabled="true" class="country" id="country_mk" value="mk" label="mk"/>
<checkbox disabled="true" class="country" id="country_ml" value="ml" label="ml"/>
<checkbox disabled="true" class="country" id="country_mm" value="mm" label="mm"/>
<checkbox disabled="true" class="country" id="country_mn" value="mn" label="mn"/>
<checkbox disabled="true" class="country" id="country_mo" value="mo" label="mo"/>
<checkbox disabled="true" class="country" id="country_mp" value="mp" label="mp"/>
<checkbox disabled="true" class="country" id="country_mq" value="mq" label="mq"/>
<checkbox disabled="true" class="country" id="country_mr" value="mr" label="mr"/>
<checkbox disabled="true" class="country" id="country_ms" value="ms" label="ms"/>
<checkbox disabled="true" class="country" id="country_mt" value="mt" label="mt"/>
<checkbox disabled="true" class="country" id="country_mu" value="mu" label="mu"/>
<checkbox disabled="true" class="country" id="country_mv" value="mv" label="mv"/>
<checkbox disabled="true" class="country" id="country_mw" value="mw" label="mw"/>
<checkbox disabled="true" class="country" id="country_mx" value="mx" label="mx"/>
<checkbox disabled="true" class="country" id="country_my" value="my" label="my"/>
<checkbox disabled="true" class="country" id="country_mz" value="mz" label="mz"/>
<checkbox disabled="true" class="country" id="country_na" value="na" label="na"/>
<checkbox disabled="true" class="country" id="country_nc" value="nc" label="nc"/>
<checkbox disabled="true" class="country" id="country_ne" value="ne" label="ne"/>
<checkbox disabled="true" class="country" id="country_nf" value="nf" label="nf"/>
<checkbox disabled="true" class="country" id="country_ng" value="ng" label="ng"/>
<checkbox disabled="true" class="country" id="country_ni" value="ni" label="ni"/>
<checkbox disabled="true" class="country" id="country_nl" value="nl" label="nl"/>
<checkbox disabled="true" class="country" id="country_no" value="no" label="no"/>
</vbox>
<vbox>
<checkbox disabled="true" class="country" id="country_np" value="np" label="np"/>
<checkbox disabled="true" class="country" id="country_nr" value="nr" label="nr"/>
<checkbox disabled="true" class="country" id="country_nu" value="nu" label="nu"/>
<checkbox disabled="true" class="country" id="country_nz" value="nz" label="nz"/>
<checkbox disabled="true" class="country" id="country_om" value="om" label="om"/>
<checkbox disabled="true" class="country" id="country_pa" value="pa" label="pa"/>
<checkbox disabled="true" class="country" id="country_pe" value="pe" label="pe"/>
<checkbox disabled="true" class="country" id="country_pf" value="pf" label="pf"/>
<checkbox disabled="true" class="country" id="country_pg" value="pg" label="pg"/>
<checkbox disabled="true" class="country" id="country_ph" value="ph" label="ph"/>
<checkbox disabled="true" class="country" id="country_pk" value="pk" label="pk"/>
<checkbox disabled="true" class="country" id="country_pl" value="pl" label="pl"/>
<checkbox disabled="true" class="country" id="country_pm" value="pm" label="pm"/>
<checkbox disabled="true" class="country" id="country_pn" value="pn" label="pn"/>
<checkbox disabled="true" class="country" id="country_pr" value="pr" label="pr"/>
<checkbox disabled="true" class="country" id="country_ps" value="ps" label="ps"/>
<checkbox disabled="true" class="country" id="country_pt" value="pt" label="pt"/>
<checkbox disabled="true" class="country" id="country_pw" value="pw" label="pw"/>
<checkbox disabled="true" class="country" id="country_py" value="py" label="py"/>
<checkbox disabled="true" class="country" id="country_qa" value="qa" label="qa"/>
<checkbox disabled="true" class="country" id="country_re" value="re" label="re"/>
<checkbox disabled="true" class="country" id="country_ro" value="ro" label="ro"/>
<checkbox disabled="true" class="country" id="country_rs" value="rs" label="rs"/>
<checkbox disabled="true" class="country" id="country_ru" value="ru" label="ru"/>
<checkbox disabled="true" class="country" id="country_rw" value="rw" label="rw"/>
<checkbox disabled="true" class="country" id="country_sa" value="sa" label="sa"/>
<checkbox disabled="true" class="country" id="country_sb" value="sb" label="sb"/>
<checkbox disabled="true" class="country" id="country_sc" value="sc" label="sc"/>
<checkbox disabled="true" class="country" id="country_scotland" value="scotland" label="scotland"/>
<checkbox disabled="true" class="country" id="country_sd" value="sd" label="sd"/>
<checkbox disabled="true" class="country" id="country_se" value="se" label="se"/>
<checkbox disabled="true" class="country" id="country_sg" value="sg" label="sg"/>
<checkbox disabled="true" class="country" id="country_sh" value="sh" label="sh"/>
<checkbox disabled="true" class="country" id="country_si" value="si" label="si"/>
<checkbox disabled="true" class="country" id="country_sj" value="sj" label="sj"/>
<checkbox disabled="true" class="country" id="country_sk" value="sk" label="sk"/>
<checkbox disabled="true" class="country" id="country_sl" value="sl" label="sl"/>
<checkbox disabled="true" class="country" id="country_sm" value="sm" label="sm"/>
<checkbox disabled="true" class="country" id="country_sn" value="sn" label="sn"/>
<checkbox disabled="true" class="country" id="country_so" value="so" label="so"/>
<checkbox disabled="true" class="country" id="country_sr" value="sr" label="sr"/>
<checkbox disabled="true" class="country" id="country_st" value="st" label="st"/>
<checkbox disabled="true" class="country" id="country_sv" value="sv" label="sv"/>
<checkbox disabled="true" class="country" id="country_sy" value="sy" label="sy"/>
<checkbox disabled="true" class="country" id="country_sz" value="sz" label="sz"/>
<checkbox disabled="true" class="country" id="country_tc" value="tc" label="tc"/>
<checkbox disabled="true" class="country" id="country_td" value="td" label="td"/>
<checkbox disabled="true" class="country" id="country_tf" value="tf" label="tf"/>
<checkbox disabled="true" class="country" id="country_tg" value="tg" label="tg"/>
<checkbox disabled="true" class="country" id="country_th" value="th" label="th"/>
<checkbox disabled="true" class="country" id="country_tj" value="tj" label="tj"/>
<checkbox disabled="true" class="country" id="country_tk" value="tk" label="tk"/>
<checkbox disabled="true" class="country" id="country_tl" value="tl" label="tl"/>
<checkbox disabled="true" class="country" id="country_tm" value="tm" label="tm"/>
<checkbox disabled="true" class="country" id="country_tn" value="tn" label="tn"/>
<checkbox disabled="true" class="country" id="country_to" value="to" label="to"/>
<checkbox disabled="true" class="country" id="country_tr" value="tr" label="tr"/>
<checkbox disabled="true" class="country" id="country_tt" value="tt" label="tt"/>
<checkbox disabled="true" class="country" id="country_tv" value="tv" label="tv"/>
<checkbox disabled="true" class="country" id="country_tw" value="tw" label="tw"/>
<checkbox disabled="true" class="country" id="country_tz" value="tz" label="tz"/>
<checkbox disabled="true" class="country" id="country_ua" value="ua" label="ua"/>
<checkbox disabled="true" class="country" id="country_ug" value="ug" label="ug"/>
<checkbox disabled="true" class="country" id="country_um" value="um" label="um"/>
<checkbox disabled="true" class="country" id="country_us" value="us" label="us"/>
<checkbox disabled="true" class="country" id="country_uy" value="uy" label="uy"/>
<checkbox disabled="true" class="country" id="country_uz" value="uz" label="uz"/>
<checkbox disabled="true" class="country" id="country_va" value="va" label="va"/>
<checkbox disabled="true" class="country" id="country_vc" value="vc" label="vc"/>
<checkbox disabled="true" class="country" id="country_ve" value="ve" label="ve"/>
<checkbox disabled="true" class="country" id="country_vg" value="vg" label="vg"/>
<checkbox disabled="true" class="country" id="country_vi" value="vi" label="vi"/>
<checkbox disabled="true" class="country" id="country_vn" value="vn" label="vn"/>
<checkbox disabled="true" class="country" id="country_vu" value="vu" label="vu"/>
<checkbox disabled="true" class="country" id="country_wales" value="wales" label="wales"/>
<checkbox disabled="true" class="country" id="country_wf" value="wf" label="wf"/>
<checkbox disabled="true" class="country" id="country_ws" value="ws" label="ws"/>
<checkbox disabled="true" class="country" id="country_ye" value="ye" label="ye"/>
<checkbox disabled="true" class="country" id="country_yt" value="yt" label="yt"/>
<checkbox disabled="true" class="country" id="country_za" value="za" label="za"/>
<checkbox disabled="true" class="country" id="country_zm" value="zm" label="zm"/>
<checkbox disabled="true" class="country" id="country_zw" value="zw" label="zw"/>
</vbox>
</row>
</rows>
</grid>
</groupbox>
</tabpanel>
<tabpanel>
<groupbox flex="1">
<caption label="&mailhops_tab_defaults_label; Language"/>
<radiogroup id="mailhop.lang">
<radio value="en" label="English" selected="true"/>
<radio value="de" label="German"/>
<radio value="es" label="Spanish"/>
<radio value="fr" label="French"/>
<radio value="ja" label="Japanese"/>
<radio value="pl" label="Polish"/>
<radio value="pt-BR" label="Portuguese"/>
<radio value="ru" label="Russian"/>
<radio value="zh-CH" label="Chinese"/>
</radiogroup>
</groupbox>
<groupbox flex="1">
<caption label="&mailhops_tab_defaults_label; Units"/>
<radiogroup id="mailhop.unit">
<radio value="mi" label="Miles and ºF" selected="true"/>
<radio value="km" label="Kilometers and ºC"/>
</radiogroup>
</groupbox>
<groupbox flex="1">
<caption label="&mailhops_tab_defaults_label; Map"/>
<menulist id="mailhop.map_provider">
<menupopup>
<menuitem value="OpenStreetMap.Mapnik" label="OpenStreetMap.Mapnik" />
<menuitem value="OpenStreetMap.BlackAndWhite" label="OpenStreetMap.BlackAndWhite" />
<menuitem value="OpenStreetMap.DE" label="OpenStreetMap.DE" />
<menuitem value="OpenStreetMap.France" label="OpenStreetMap.France" />
<menuitem value="OpenStreetMap.HOT" label="OpenStreetMap.HOT" />
<menuitem value="OpenSeaMap" label="OpenSeaMap" />
<menuitem value="OpenTopoMap" label="OpenTopoMap" />
<menuitem value="Thunderforest.OpenCycleMap" label="Thunderforest.OpenCycleMap" />
<menuitem value="Thunderforest.Transport" label="Thunderforest.Transport" />
<menuitem value="Thunderforest.TransportDark" label="Thunderforest.TransportDark" />
<menuitem value="Thunderforest.Landscape" label="Thunderforest.Landscape" />
<menuitem value="Thunderforest.Outdoors" label="Thunderforest.Outdoors" />
<menuitem value="OpenMapSurfer.Roads" label="OpenMapSurfer.Roads" />
<menuitem value="OpenMapSurfer.AdminBounds" label="OpenMapSurfer.AdminBounds" />
<menuitem value="OpenMapSurfer.Grayscale" label="OpenMapSurfer.Grayscale" />
<menuitem value="Hydda.Full" label="Hydda.Full" />
<menuitem value="Hydda.Base" label="Hydda.Base" />
<menuitem value="Hydda.RoadsAndLabels" label="Hydda.RoadsAndLabels" />
<menuitem value="MapQuestOpen.OSM" label="MapQuestOpen.OSM" />
<menuitem value="MapQuestOpen.Aerial" label="MapQuestOpen.Aerial" />
<menuitem value="MapQuestOpen.HybridOverlay" label="MapQuestOpen.HybridOverlay" />
<menuitem value="MapBox" label="MapBox" />
<menuitem value="Stamen.Toner" label="Stamen.Toner" />
<menuitem value="Stamen.TonerBackground" label="Stamen.TonerBackground" />
<menuitem value="Stamen.TonerHybrid" label="Stamen.TonerHybrid" />
<menuitem value="Stamen.TonerLines" label="Stamen.TonerLines" />
<menuitem value="Stamen.TonerLabels" label="Stamen.TonerLabels" />
<menuitem value="Stamen.TonerLite" label="Stamen.TonerLite" />
<menuitem value="Stamen.Watercolor" label="Stamen.Watercolor" />
<menuitem value="Stamen.Terrain" label="Stamen.Terrain" />
<menuitem value="Stamen.TerrainBackground" label="Stamen.TerrainBackground" />
<menuitem value="Stamen.TopOSMRelief" label="Stamen.TopOSMRelief" />
<menuitem value="Stamen.TopOSMFeatures" label="Stamen.TopOSMFeatures" />
<menuitem value="Esri.WorldStreetMap" label="Esri.WorldStreetMap" />
<menuitem value="Esri.DeLorme" label="Esri.DeLorme" />
<menuitem value="Esri.WorldTopoMap" label="Esri.WorldTopoMap" />
<menuitem value="Esri.WorldImagery" label="Esri.WorldImagery" />
<menuitem value="Esri.WorldTerrain" label="Esri.WorldTerrain" />
<menuitem value="Esri.WorldShadedRelief" label="Esri.WorldShadedRelief" />
<menuitem value="Esri.WorldPhysical" label="Esri.WorldPhysical" />
<menuitem value="Esri.OceanBasemap" label="Esri.OceanBasemap" />
<menuitem value="Esri.NatGeoWorldMap" label="Esri.NatGeoWorldMap" />
<menuitem value="Esri.WorldGrayCanvas" label="Esri.WorldGrayCanvas" />
<menuitem value="OpenWeatherMap.Clouds" label="OpenWeatherMap.Clouds" />
<menuitem value="OpenWeatherMap.CloudsClassic" label="OpenWeatherMap.CloudsClassic" />
<menuitem value="OpenWeatherMap.Precipitation" label="OpenWeatherMap.Precipitation" />
<menuitem value="OpenWeatherMap.PrecipitationClassic" label="OpenWeatherMap.PrecipitationClassic" />
<menuitem value="OpenWeatherMap.Rain" label="OpenWeatherMap.Rain" />
<menuitem value="OpenWeatherMap.RainClassic" label="OpenWeatherMap.RainClassic" />
<menuitem value="OpenWeatherMap.Pressure" label="OpenWeatherMap.Pressure" />
<menuitem value="OpenWeatherMap.PressureContour" label="OpenWeatherMap.PressureContour" />
<menuitem value="OpenWeatherMap.Wind" label="OpenWeatherMap.Wind" />
<menuitem value="OpenWeatherMap.Temperature" label="OpenWeatherMap.Temperature" />
<menuitem value="OpenWeatherMap.Snow" label="OpenWeatherMap.Snow" />
<menuitem value="HERE.normalDay" label="HERE.normalDay" />
<menuitem value="HERE.normalDayCustom" label="HERE.normalDayCustom" />
<menuitem value="HERE.normalDayGrey" label="HERE.normalDayGrey" />
<menuitem value="HERE.normalDayMobile" label="HERE.normalDayMobile" />
<menuitem value="HERE.normalDayGreyMobile" label="HERE.normalDayGreyMobile" />
<menuitem value="HERE.normalDayTransit" label="HERE.normalDayTransit" />
<menuitem value="HERE.normalDayTransitMobile" label="HERE.normalDayTransitMobile" />
<menuitem value="HERE.normalNight" label="HERE.normalNight" />
<menuitem value="HERE.normalNightMobile" label="HERE.normalNightMobile" />
<menuitem value="HERE.normalNightGrey" label="HERE.normalNightGrey" />
<menuitem value="HERE.normalNightGreyMobile" label="HERE.normalNightGreyMobile" />
<menuitem value="HERE.carnavDayGrey" label="HERE.carnavDayGrey" />
<menuitem value="HERE.hybridDay" label="HERE.hybridDay" />
<menuitem value="HERE.hybridDayMobile" label="HERE.hybridDayMobile" />
<menuitem value="HERE.pedestrianDay" label="HERE.pedestrianDay" />
<menuitem value="HERE.pedestrianNight" label="HERE.pedestrianNight" />
<menuitem value="HERE.satelliteDay" label="HERE.satelliteDay" />
<menuitem value="HERE.terrainDay" label="HERE.terrainDay" />
<menuitem value="HERE.terrainDayMobile" label="HERE.terrainDayMobile" />
<menuitem value="Acetate.basemap" label="Acetate.basemap" />
<menuitem value="Acetate.terrain" label="Acetate.terrain" />
<menuitem value="Acetate.all" label="Acetate.all" />
<menuitem value="Acetate.foreground" label="Acetate.foreground" />
<menuitem value="Acetate.roads" label="Acetate.roads" />
<menuitem value="Acetate.labels" label="Acetate.labels" />
<menuitem value="Acetate.hillshading" label="Acetate.hillshading" />
<menuitem value="FreeMapSK" label="FreeMapSK" />
<menuitem value="MtbMap" label="MtbMap" />
<menuitem value="CartoDB.Positron" label="CartoDB.Positron" />
<menuitem value="CartoDB.PositronNoLabels" label="CartoDB.PositronNoLabels" />
<menuitem value="CartoDB.DarkMatter" label="CartoDB.DarkMatter" />
<menuitem value="CartoDB.DarkMatterNoLabels" label="CartoDB.DarkMatterNoLabels" />
<menuitem value="HikeBike.HikeBike" label="HikeBike.HikeBike" />
<menuitem value="HikeBike.HillShading" label="HikeBike.HillShading" />
<menuitem value="BasemapAT.basemap" label="BasemapAT.basemap" />
<menuitem value="BasemapAT.grau" label="BasemapAT.grau" />
<menuitem value="BasemapAT.overlay" label="BasemapAT.overlay" />
<menuitem value="BasemapAT.highdpi" label="BasemapAT.highdpi" />
<menuitem value="BasemapAT.orthofoto" label="BasemapAT.orthofoto" />
<menuitem value="NASAGIBS.ModisTerraTrueColorCR" label="NASAGIBS.ModisTerraTrueColorCR" />
<menuitem value="NASAGIBS.ModisTerraBands367CR" label="NASAGIBS.ModisTerraBands367CR" />
<menuitem value="NASAGIBS.ViirsEarthAtNight2012" label="NASAGIBS.ViirsEarthAtNight2012" />
<menuitem value="NASAGIBS.ModisTerraLSTDay" label="NASAGIBS.ModisTerraLSTDay" />
<menuitem value="NASAGIBS.ModisTerraSnowCover" label="NASAGIBS.ModisTerraSnowCover" />
<menuitem value="NASAGIBS.ModisTerraAOD" label="NASAGIBS.ModisTerraAOD" />
<menuitem value="NASAGIBS.ModisTerraChlorophyll" label="NASAGIBS.ModisTerraChlorophyll" />
</menupopup>
</menulist>
</groupbox>
</tabpanel>
<tabpanel>
<groupbox flex="1">
<caption label="&mailhops_tab_display_label;"/>
<description>
Use any <label xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" is="text-link" class="text-link plain" href="https://en.wikipedia.org/wiki/Web_colors" value="HTML color name or Hex code"/>.
</description>
<description id="display_preview" style="font-size: 14px; color: #777; background: #FFF;">
<image src="chrome://mailhops/content/images/mailhops32.png" width="32" height="32"/>
MailHops Bar
</description>
<div height="20"></div>
<grid>
<columns>
<column/>
</columns>
<rows>
<row>
<label value="Bar Color"></label>
<textbox id="mailhop.bar_color" value="#FFF" placeholder="Enter a hex color code"/>
<grid class="grid-color">
<columns>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #eeeeee"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #c9c9c9"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #afafaf"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #a9e0f2"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #5cade0"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #84e8af"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #569603"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #f7e7bb"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #f2a232"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #fff1cc"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #e8f28c"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #d1994b"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #754947"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #e7c0f9"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(this.style.backgroundColor);" style="cursor: pointer; background-color: #53067c"></div>
</row>
</rows>
</grid>
</row>
<row>
<label value="Font Color"></label>
<textbox id="mailhop.font_color" value="#777" placeholder="Enter a hex color code"/>
<grid class="grid-color">
<columns>
<column/>
<column/>
</columns>
<rows>
<row>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(null,this.style.backgroundColor);" style="cursor: pointer; background-color: #ffffff"></div>
<div width="25px" height="25px" onclick="mailHopPreferences.ResetDisplay(null,this.style.backgroundColor);" style="cursor: pointer; background-color: #000000"></div>
</row>
</rows>
</grid>
</row>
<row>
<label value="Font Size"></label>
<textbox id="mailhop.font_size" value="14px" placeholder="Enter a size in pixels"/>
</row>
<row>
<span></span>
<button onclick="mailHopPreferences.ResetDisplay('#FFF','#777','14px');" style="text-align:center;">Reset Display</button>
</row>
</rows>
</grid>
<checkbox id="mailhop.hide_compact" label="Hide MailHops Bar when CompactHeaders are collapsed" checked="false"/>
<label xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" is="text-link" class="text-link plain" href="https://addons.mozilla.org/en-us/thunderbird/addon/compactheader/" value="CompactHeaders Add-on"/>
</groupbox>
</tabpanel>
<tabpanel>
<groupbox>
<caption label="&mailhops_tab_api_label;"/>
<grid>
<columns>
<column/>
<column flex="1"/>
</columns>
<rows>
<row>
<menulist id="mailhop.api_http">
<menupopup>
<menuitem value="https://" label="https://" />
<menuitem value="http://" label="http://" />
</menupopup>
</menulist>
<textbox id="mailhop.api_host" value="api.mailhops.com" flex="1" placeholder="Enter MailHops API host"/>
</row>
<row>
<hbox/>
<hbox flex="1">
<button onclick="mailHopPreferences.TestConnection();">&mailhops_connection_test;</button>
<button onclick="mailHopPreferences.ResetConnection();">&mailhops_connection_reset;</button>
</hbox>
</row>
</rows>
</grid>
<spacer/>
<description>
MailHops API uses <label xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" is="text-link" class="text-link plain" value="DarkSky" href="https://darksky.net"/> to get the weather of the sender, register for an API Key to enable this feature.
</description>
<textbox id="mailhop.fkey" value="" placeholder="Enter your DarkSky API Key"/>
<checkbox id="mailhop.debug" label="Debug" checked="false"/>
</groupbox>
</tabpanel>
</tabpanels>
</tabbox>
</vbox>
</dialog>

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "Einstellungen">
<!ENTITY mailhops_tab_member_label "Mitglied">
<!ENTITY mailhops_tab_filters_label "Filter">
<!ENTITY mailhops_tab_defaults_label "Grundeinstellungen">
<!ENTITY mailhops_tab_display_label "Anzeige">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Verbindung testen">
<!ENTITY mailhops_connection_reset "Verbindung zurücksetzen">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops Route">
<!ENTITY mailhops_header_auth_label "MailHops Mailer/Auth">
<!ENTITY mailhops_header_meta_label "MailHops Meta">
<!ENTITY mailhops_route_nav_map_label "Karte">
<!ENTITY mailhops_route_nav_details_label "Einzelheiten">
<!ENTITY mailhops_route_nav_refresh_label "Neu laden">
<!ENTITY mailhops_route_nav_options_label "Einstellungen">
<!ENTITY mailhops_unsubscribe "Abbestellen">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "Preferences">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops Route">
<!ENTITY mailhops_header_auth_label "MailHops Mailer/Auth">
<!ENTITY mailhops_header_meta_label "MailHops Meta">
<!ENTITY mailhops_route_nav_map_label "Map">
<!ENTITY mailhops_route_nav_details_label "Details">
<!ENTITY mailhops_route_nav_refresh_label "Refresh">
<!ENTITY mailhops_route_nav_options_label "Preferences">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "Preferencias">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops Ruta">
<!ENTITY mailhops_header_auth_label "MailHops Mailer/Aut">
<!ENTITY mailhops_header_meta_label "MailHops Meta">
<!ENTITY mailhops_route_nav_map_label "mapa">
<!ENTITY mailhops_route_nav_details_label "detalles">
<!ENTITY mailhops_route_nav_refresh_label "refrescar">
<!ENTITY mailhops_route_nav_options_label "Preferencias">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "Préférences">
<!ENTITY mailhops_tab_member_label "Compte">
<!ENTITY mailhops_tab_filters_label "Filtrage">
<!ENTITY mailhops_tab_defaults_label "Autres paramètres">
<!ENTITY mailhops_tab_display_label "Apparence de la barre">
<!ENTITY mailhops_tab_api_label "Serveur &amp; API">
<!ENTITY mailhops_connection_test "Tester la connexion">
<!ENTITY mailhops_connection_reset "Rétablir la connexion par défaut">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "Trajet">
<!ENTITY mailhops_header_auth_label "Authentification">
<!ENTITY mailhops_header_meta_label "Autres données">
<!ENTITY mailhops_route_nav_map_label "Afficher la Carte">
<!ENTITY mailhops_route_nav_details_label "Détails">
<!ENTITY mailhops_route_nav_refresh_label "Actualiser">
<!ENTITY mailhops_route_nav_options_label "Préférences">
<!ENTITY mailhops_unsubscribe "Se désabonner">
<!ENTITY mailhops_hops "Trajet">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "設定">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHopsルート">
<!ENTITY mailhops_header_auth_label "MailHopsメーラー/認証">
<!ENTITY mailhops_header_meta_label "MailHopsメタ">
<!ENTITY mailhops_route_nav_map_label "マップ">
<!ENTITY mailhops_route_nav_details_label "細部">
<!ENTITY mailhops_route_nav_refresh_label "リフレッシュ">
<!ENTITY mailhops_route_nav_options_label "設定">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "opcje">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,10 +0,0 @@
<!ENTITY mailhops_header_route_label "Trasa">
<!ENTITY mailhops_header_auth_label "Mailer/Auth">
<!ENTITY mailhops_header_lists_label "Listy">
<!ENTITY mailhops_header_meta_label "Meta">
<!ENTITY mailhops_route_nav_map_label "mapa">
<!ENTITY mailhops_route_nav_details_label "szczegóły">
<!ENTITY mailhops_route_nav_refresh_label "odśwież">
<!ENTITY mailhops_route_nav_options_label "opcje">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "Preferências">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops Route">
<!ENTITY mailhops_header_auth_label "MailHops Mailer/Auth">
<!ENTITY mailhops_header_meta_label "MailHops Meta">
<!ENTITY mailhops_route_nav_map_label "mapa">
<!ENTITY mailhops_route_nav_details_label "detalhes">
<!ENTITY mailhops_route_nav_refresh_label "refrescar">
<!ENTITY mailhops_route_nav_options_label "Preferências">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "предпочтения">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops маршрута">
<!ENTITY mailhops_header_auth_label "MailHops Мейлер / Авт">
<!ENTITY mailhops_header_meta_label "MailHops Мета">
<!ENTITY mailhops_route_nav_map_label "карта">
<!ENTITY mailhops_route_nav_details_label "подробности">
<!ENTITY mailhops_route_nav_refresh_label "обновление">
<!ENTITY mailhops_route_nav_options_label "предпочтения">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,8 +0,0 @@
<!ENTITY mailhops_preferences "优先">
<!ENTITY mailhops_tab_member_label "Member">
<!ENTITY mailhops_tab_filters_label "Filters">
<!ENTITY mailhops_tab_defaults_label "Default">
<!ENTITY mailhops_tab_display_label "Display">
<!ENTITY mailhops_tab_api_label "API &amp; Hosting">
<!ENTITY mailhops_connection_test "Test Connection">
<!ENTITY mailhops_connection_reset "Reset Connection">

View File

@ -1,9 +0,0 @@
<!ENTITY mailhops_header_route_label "MailHops路线">
<!ENTITY mailhops_header_auth_label "MailHops梅勒/验证">
<!ENTITY mailhops_header_meta_label "MailHops元">
<!ENTITY mailhops_route_nav_map_label "地圖">
<!ENTITY mailhops_route_nav_details_label "詳細信息">
<!ENTITY mailhops_route_nav_refresh_label "刷新">
<!ENTITY mailhops_route_nav_options_label "优先">
<!ENTITY mailhops_unsubscribe "Unsubscribe">
<!ENTITY mailhops_hops "Hops">

View File

@ -1,161 +0,0 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#mailhopsResultText { padding-left:20px; background-repeat: no-repeat; }
#mailhopsNoficationBox menuitem .menu-iconic-icon { width: 16px; height: 11px; }
#mailhopsNoficationBox .auth-item { display: none; background-repeat: no-repeat; padding-left: 18px; }
#mhTabs .act { padding-left: 20px; background-repeat: no-repeat; outline : none;}
#mailhopsResultWeather { display: none; background-repeat: no-repeat; padding-left: 18px; }
#mailHopsPreferences {
font-family: 'Raleway',Arial,sans-serif;
font-size: 14px;
}
#mailHopsPreferences textbox {
font-size: 14px;
padding: 5px;
color: #777;
}
#mailHopsPreferences tab {
font-size: 14px;
padding: 5px;
color: #333;
}
#mailhopsResult label {
margin-top: 8px;
}
#mailhopsNoficationBox {
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 14px;
line-height: 24px;
font-weight: normal;
position: relative;
max-height: 50px;
width: 100%;
margin: auto;
}
#mailhopsNotification {
background: #f7f7f7;
}
#mailhopsResult {
position: relative;
display: inline-flex;
}
#mailhopsNoficationBox .bar-link {
cursor: pointer;
text-decoration: none;
}
#mailhopsNoficationBox .bar-link:hover {
text-decoration: underline;
}
#mailhopsNoficationBox #mailhopsDataPanePrefsLink {
border-radius: 20px;
background-color: #CCC;
letter-spacing: .1em;
right: 0;
}
#mailhopsLogo,
#mailhopsResultText,
#mailhopsResultWeather,
#mailhopsUnsubscribe,
#mailhopsDataPaneDNSBL,
#mailhopsDataPaneDKIM,
#mailhopsDataPaneSPF,
#mailhopsDataPaneMailer {
color: #fff;
}
#mailhopsLogo,
#mailhopsResultText,
#mailhopsResultWeather,
#mailhopsUnsubscribe {
cursor: pointer;
}
#mailhopsNoficationBox .unsubscribe {
color: #CCC;
}
#mailhopsLogo {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
#mailhopsLogo:hover {
-webkit-filter: none;
filter: none;
}
#mailHopsAccountMessage {
display: none;
}
#mailhopsDataPaneDetails {
border-radius: 10px;
display: none;
padding: 10px;
border: 1px solid #CCC;
color: #333;
background-color: #FFF;
position: fixed;
margin-top: 0;
z-index: 10000;
}
#mailhopsDataPaneDetails .hop {
background-repeat: no-repeat;
display: block;
position: relative;
padding-left: 22px;
}
#mailhopsDataPaneDetails .host {
background-repeat: no-repeat;
display: block;
position: relative;
color: #777;
padding-left: 22px;
margin-left: 22px;
}
#mailhopsNoficationBox toolbarseparator {
appearance: none;
-moz-appearance: none;
margin: 3px 0px 3px 0px!important;
}
#mailhopsNoficationBox .toolbarbutton {
font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;
font-weight: 400;
padding: 0 4px 0 4px;
margin: unset!important;
color: #777!important;
cursor: pointer;
}
#mailhopsNoficationBox #mailhopsHopsBox:hover,
#mailhopsNoficationBox #mailhopsRefreshBox:hover,
#mailhopsNoficationBox #mailhopsUnsubscribeBox:hover,
#mailhopsNoficationBox #mailhopsHopsBox.active {
color: #333;
background-color: #e5e5e5;
border-radius: 10px;
}
#mailhopsNoficationBox .messageCloseButton,
#mailhopsNoficationBox .messageDetails:nth-child(2) {
display: none!important;
}

View File

@ -1,25 +0,0 @@
#mailHopsPreferences {
font-family: 'Raleway',Arial,sans-serif;
font-size: 14px;
}
#mailHopsPreferences textbox {
font-size: 14px;
padding: 5px;
color: #777;
}
#mailHopsPreferences tab {
font-size: 14px;
padding: 5px;
color: #333;
}
#mailHopsPreferences button{
height: 35px;
color: #333;
}
#mailHopsPreferences .grid-color{
margin-top: 7px;
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>MailHops</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/semantic.min.css" integrity="sha512-g/MzOGVPy3OQ4ej1U+qe4D/xhLwUn5l5xL0Fa7gdC258ZWVJQGwsbIR47SWMpRxSPjD0tfu/xkilTy+Lhrl3xg==" crossorigin="anonymous" />
</head>
<body>
<div class="popup-page">
<div id="hop-message" class="ui message">
<div id="hop-message-header" class="header" style="text-align: center;"></div>
</div>
<div id="hop-list" class="ui relaxed divided list" style="padding: 10px;">
</div>
<div class="wrapbutton">
<button type="button" class="ui green button" id="mh-map-button">Map</button>
<button type="button" class="ui icon button" id="mh-options-button" style="float: right;">Options</button>
</div>
</div>
<script src="/js/utils.js"></script>
<script src="/js/mailhops_details.js" defer="true"></script>
</body>
</html>

43
content/preferences.html Normal file
View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/semantic.min.css" integrity="sha512-g/MzOGVPy3OQ4ej1U+qe4D/xhLwUn5l5xL0Fa7gdC258ZWVJQGwsbIR47SWMpRxSPjD0tfu/xkilTy+Lhrl3xg==" crossorigin="anonymous" />
</head>
<body style="padding: 20px;">
<img src="/images/mailhops-logo.png" width="300"/>
<div class="ui divider"></div>
<form class="ui form">
<div class="field">
<label>MailHops API Key</label>
<input type="text" id="mailhop.api_key" placeholder="Enter your MailHops API Key" style="width: 50%"/>
<br/>
<a href="https://www.mailhops.com/#pricing" id="join-link" target="_blank">Join MailHops</a>
</div>
<div class="field">
<label>OpenWeatherMap.org API Key</label>
<input type="text" id="mailhop.owm_key" value="" placeholder="Enter your OpenWeatherMap API Key" style="width: 50%"/>
<br/>
MailHops API uses <a href="https://.openweathermap.org" target="_blank">OpenWeatherMap</a> to get the weather of the sender
<br/>Register for an API Key to enable this feature.
</div>
<button class="ui primary button" id="save">Save</button>
</form>
<h3>MailHops Plan Info</h3>
<div class="ui divider"></div>
<p>
<label id="plan-error" class="ui red basic label" style="display: none;"></label><br/>
<label id="plan"></label><br/>
<label id="status"></label><br/>
<label id="rate-limit"></label><br/>
<label id="rate-remaining"></label><br/>
<label id="rate-reset"></label><br/>
</p>
<script src="/js/preferences.js"></script>
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 793 B

View File

Before

Width:  |  Height:  |  Size: 666 B

After

Width:  |  Height:  |  Size: 666 B

View File

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 287 B

View File

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 287 B

View File

Before

Width:  |  Height:  |  Size: 749 B

After

Width:  |  Height:  |  Size: 749 B

View File

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

View File

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 201 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 295 B

View File

Before

Width:  |  Height:  |  Size: 283 B

After

Width:  |  Height:  |  Size: 283 B

View File

Before

Width:  |  Height:  |  Size: 436 B

After

Width:  |  Height:  |  Size: 436 B

View File

Before

Width:  |  Height:  |  Size: 746 B

After

Width:  |  Height:  |  Size: 746 B

View File

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 286 B

View File

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 287 B

View File

Before

Width:  |  Height:  |  Size: 641 B

After

Width:  |  Height:  |  Size: 641 B

View File

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 643 B

View File

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 408 B

View File

Before

Width:  |  Height:  |  Size: 604 B

After

Width:  |  Height:  |  Size: 604 B

View File

Before

Width:  |  Height:  |  Size: 591 B

After

Width:  |  Height:  |  Size: 591 B

View File

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 643 B

View File

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 600 B

View File

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 497 B

View File

Before

Width:  |  Height:  |  Size: 488 B

After

Width:  |  Height:  |  Size: 488 B

View File

Before

Width:  |  Height:  |  Size: 428 B

After

Width:  |  Height:  |  Size: 428 B

View File

Before

Width:  |  Height:  |  Size: 506 B

After

Width:  |  Height:  |  Size: 506 B

View File

Before

Width:  |  Height:  |  Size: 647 B

After

Width:  |  Height:  |  Size: 647 B

View File

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 403 B

View File

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

View File

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 524 B

View File

Before

Width:  |  Height:  |  Size: 663 B

After

Width:  |  Height:  |  Size: 663 B

View File

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 589 B

View File

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 593 B

View File

Before

Width:  |  Height:  |  Size: 585 B

After

Width:  |  Height:  |  Size: 585 B

View File

Before

Width:  |  Height:  |  Size: 504 B

After

Width:  |  Height:  |  Size: 504 B

View File

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

View File

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 497 B

View File

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

View File

Before

Width:  |  Height:  |  Size: 457 B

After

Width:  |  Height:  |  Size: 457 B

View File

Before

Width:  |  Height:  |  Size: 675 B

After

Width:  |  Height:  |  Size: 675 B

View File

Before

Width:  |  Height:  |  Size: 486 B

After

Width:  |  Height:  |  Size: 486 B

View File

Before

Width:  |  Height:  |  Size: 611 B

After

Width:  |  Height:  |  Size: 611 B

View File

Before

Width:  |  Height:  |  Size: 639 B

After

Width:  |  Height:  |  Size: 639 B

View File

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 500 B

View File

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 593 B

View File

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 526 B

View File

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 631 B

View File

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 512 B

View File

Before

Width:  |  Height:  |  Size: 443 B

After

Width:  |  Height:  |  Size: 443 B

View File

Before

Width:  |  Height:  |  Size: 514 B

After

Width:  |  Height:  |  Size: 514 B

View File

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 600 B

View File

Before

Width:  |  Height:  |  Size: 628 B

After

Width:  |  Height:  |  Size: 628 B

View File

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 398 B

View File

Before

Width:  |  Height:  |  Size: 625 B

After

Width:  |  Height:  |  Size: 625 B

View File

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

View File

Before

Width:  |  Height:  |  Size: 614 B

After

Width:  |  Height:  |  Size: 614 B

View File

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

View File

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 367 B

View File

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 453 B

View File

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 586 B

View File

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

View File

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

View File

Before

Width:  |  Height:  |  Size: 472 B

After

Width:  |  Height:  |  Size: 472 B

View File

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 483 B

View File

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 B

View File

Before

Width:  |  Height:  |  Size: 439 B

After

Width:  |  Height:  |  Size: 439 B

View File

Before

Width:  |  Height:  |  Size: 563 B

After

Width:  |  Height:  |  Size: 563 B

Some files were not shown because too many files have changed in this diff Show More