Initial commit. Transferred from an Eclipse/Brainstorm environment to NodeJS.
1
PetitTeton Dependancies.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
cmd /k "npm install"
|
||||||
1
Run PetitTeton NodeJS.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
cmd /k "node bin/www"
|
||||||
401
app.js
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var path = require('path');
|
||||||
|
var favicon = require('serve-favicon');
|
||||||
|
var logger = require('morgan');
|
||||||
|
var cookieParser = require('cookie-parser');
|
||||||
|
var bodyParser = require('body-parser');
|
||||||
|
var nodemailer = require('nodemailer');
|
||||||
|
var bodyParser = require('body-parser');
|
||||||
|
var phantom = require('node-phantom');
|
||||||
|
var fs = require('fs');
|
||||||
|
var rootPath = path.join(__dirname, 'public');
|
||||||
|
var config = require('./config');
|
||||||
|
var moment = require('moment');
|
||||||
|
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
app.use(bodyParser.urlencoded({extended: false}));
|
||||||
|
|
||||||
|
//app.use(favicon(__dirname + '/public/images/AV4H.ico'));
|
||||||
|
app.use(logger('dev'));
|
||||||
|
app.use(bodyParser.urlencoded({ extended: false }));
|
||||||
|
app.use(cookieParser());
|
||||||
|
|
||||||
|
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
|
//Ensure we have an endsWith method in String.
|
||||||
|
String.prototype.endsWith = function(suffix) {
|
||||||
|
return this.indexOf(suffix, this.length - suffix.length) !== -1;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
//Check for all calls to content pages with a password attached and log it in the password's counter.
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
if(req.path.endsWith('.html')) {
|
||||||
|
if(req.query.Password) {
|
||||||
|
incrementPwdUseCount(req.query.Password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
app.use(express.static(rootPath, {dotfiles: 'deny', index: false}));
|
||||||
|
|
||||||
|
//app.use('/', routes);
|
||||||
|
|
||||||
|
app.use('/FrameworkController.java', function(req, res) {
|
||||||
|
console.log("In /FrameworkController.java");
|
||||||
|
var requestParam = req.query.Request;
|
||||||
|
|
||||||
|
if(requestParam == 'CreateId') {
|
||||||
|
res.type('json');
|
||||||
|
res.send({result: 0});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log('unexpected value');
|
||||||
|
res.status(400).send('Unexpected Param');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Handle the getting a brief and contacting us.
|
||||||
|
var smtpTransport = nodemailer.createTransport({host: config.smtpHost, port: config.smtpPort, secure: true, ignoreTLS: false, requiresAuth: true, auth: {user: config.smtpUser, pass: config.smtpPassword}});
|
||||||
|
/*
|
||||||
|
//TEST CODE!!!//
|
||||||
|
try {
|
||||||
|
var name = "Wynne Crisman";
|
||||||
|
var email = "wynne@petitteton.com";
|
||||||
|
var textPath = rootPath + '/email/downloadBreifText.txt';
|
||||||
|
var htmlPath = rootPath + '/email/downloadBriefHtml.txt';
|
||||||
|
var signaturePath = rootPath + '/email/emailSignature.jpg';
|
||||||
|
var params = {from: config.fromAddress, to: email, subject: "Payback Brief", text: {path: textPath}, html: {path: htmlPath}, attachments: [{filename:'emailSignature.jpg', cid: 'emailSignature', path: signaturePath}]};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
if(error) {
|
||||||
|
console.log("Error: " + error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log("Successfully sent the email - not an error.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
//END TEST//
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
//Setup the passwords used by users to access the content. Allows us to track who has used the site when and how much.
|
||||||
|
//Note: This is mostly for marketing purposes so it won't be very secure at all (no hashing, salting, SSL, or anything), and it allows the search engines to bypass it to the content.
|
||||||
|
var pwdData;
|
||||||
|
try {
|
||||||
|
if(fs.existsSync('pwdData.json')) {
|
||||||
|
pwdData = JSON.parse(fs.readFileSync('pwdData.json', 'utf8'));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pwdData = [];
|
||||||
|
pwdData.push({pwd: 'zerotoone'});
|
||||||
|
pwdData.push({pwd: 'zephyr'});
|
||||||
|
pwdData.push({pwd: 'borealis'});
|
||||||
|
pwdData.push({pwd: 'gyroscope'});
|
||||||
|
pwdData.push({pwd: 'colnago'});
|
||||||
|
pwdData.push({pwd: 'derosa'});
|
||||||
|
pwdData.push({pwd: 'wwww&w'});
|
||||||
|
pwdData.push({pwd: 'catalyst'});
|
||||||
|
fs.writeFileSync('pwdData.json', JSON.stringify(pwdData), 'utf8');
|
||||||
|
}
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
|
||||||
|
function writePwdData() {
|
||||||
|
try {
|
||||||
|
fs.writeFileSync('pwdData.json', JSON.stringify(pwdData), 'utf8');
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementPwdUseCount(password) {
|
||||||
|
//Note: This is mostly for marketing purposes so it won't be very secure at all (no hashing, salting, SSL, or anything), and it allows the search engines to bypass it to the content.
|
||||||
|
try {
|
||||||
|
if(password) {
|
||||||
|
var index;
|
||||||
|
var found = false;
|
||||||
|
|
||||||
|
//Convert the password from base64.
|
||||||
|
password = new Buffer(password, 'base64').toString('utf-8');
|
||||||
|
|
||||||
|
//Identify which password was used (note: could use a map, but realistically with so few it is pointless complexity).
|
||||||
|
for(index = 0; !found && index < pwdData.length; index++) {
|
||||||
|
if(pwdData[index].pwd == password) {
|
||||||
|
//Track the number of times a user requests a content page.//
|
||||||
|
if(pwdData[index].accessCount) pwdData[index].accessCount++;
|
||||||
|
else pwdData[index].accessCount = 1;
|
||||||
|
|
||||||
|
writePwdData();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
app.use('/RequestBrief/', function(req, res) {
|
||||||
|
try {
|
||||||
|
var firstName = req.body.FirstName;
|
||||||
|
var lastName = req.body.LastName;
|
||||||
|
var email = req.body.Email;
|
||||||
|
var isPartnership = req.body.PartnershipInterest;
|
||||||
|
var isInvestment = req.body.InvestmentInterest;
|
||||||
|
var isOther = req.body.OtherInterest;
|
||||||
|
var textPath = rootPath + '/email/downloadBriefText.txt';
|
||||||
|
var htmlPath = rootPath + '/email/downloadBriefHtml.txt';
|
||||||
|
var signaturePath = rootPath + '/email/emailSignature.jpg';
|
||||||
|
var params = {from: config.fromAddress, to: email, subject: "Payback Brief", text: {path: textPath}, html: {path: htmlPath}, attachments: [{filename:'emailSignature.jpg', cid: 'emailSignature', path: signaturePath}]};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
try {
|
||||||
|
if(error) {
|
||||||
|
console.log("Received an error while sending the download brief email to the user. " + error);
|
||||||
|
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (request brief)");}});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
params = {from: config.fromAddress, to: config.contactUsRecipient, subject: "Downloaded Brief", text: "A user has requested the Payback brief.\n\nFirst Name: " + firstName + "\nLast Name: " + lastName + "\nEmail: " + email + "\nPartnership: " + isPartnership + "\nInvestment: " + isInvestment + "\nOther: " + isOther};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
if(error) {
|
||||||
|
try {
|
||||||
|
console.log("Received an error while sending the request brief email to the admin. " + error);
|
||||||
|
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (request brief)");}});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
res.status(200).send('success');
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
app.use('/RequestFinancials/', function(req, res) {
|
||||||
|
try {
|
||||||
|
var firstName = req.body.FirstName;
|
||||||
|
var lastName = req.body.LastName;
|
||||||
|
var email = req.body.Email;
|
||||||
|
var phone = req.body.Phone;
|
||||||
|
var company = req.body.Company;
|
||||||
|
var message = req.body.Message;
|
||||||
|
var isPartnership = req.body.PartnershipInterest;
|
||||||
|
var isInvestment = req.body.InvestmentInterest;
|
||||||
|
var isOther = req.body.OtherInterest;
|
||||||
|
var textPath = rootPath + '/email/downloadFinancialsText.txt';
|
||||||
|
var htmlPath = rootPath + '/email/downloadFinancialsHtml.txt';
|
||||||
|
var textContents = fs.readFileSync(textPath, "UTF8");
|
||||||
|
var htmlContents = fs.readFileSync(htmlPath, "UTF8");
|
||||||
|
var signaturePath = rootPath + '/email/emailSignature.jpg';
|
||||||
|
|
||||||
|
textContents = textContents.replace("%%NAME%%", firstName);
|
||||||
|
htmlContents = htmlContents.replace("%%NAME%%", firstName);
|
||||||
|
|
||||||
|
var params = {from: config.fromAddress, to: email, subject: "Payback Financials", text: textContents, html: htmlContents, attachments: [{filename:'emailSignature.jpg', cid: 'emailSignature', path: signaturePath}]};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
try {
|
||||||
|
if(error) {
|
||||||
|
console.log("Received an error while sending the request financials email to the user. " + error);
|
||||||
|
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (request financials)");}});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
params = {from: config.fromAddress, to: config.contactUsRecipient, subject: "Downloaded Financials", text: "A user has requested Payback's financials.\n\nFirst Name: " + firstName + "\nLast Name: " + lastName + "\nEmail: " + email + "\nPhone: " + phone + "\nCompany: " + company + "\nPartnership: " + isPartnership + "\nInvestment: " + isInvestment + "\nOther: " + isOther + "\nMessage: " + message};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
if(error) {
|
||||||
|
try {
|
||||||
|
console.log("Received an error while sending the request financials email to the admin. " + error);
|
||||||
|
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (request financials)");}});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
res.status(200).send('success');
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
app.use('/ContactUs', function(req, res) {
|
||||||
|
try {
|
||||||
|
var firstName = req.body.FirstName;
|
||||||
|
var lastName = req.body.LastName;
|
||||||
|
var email = req.body.Email;
|
||||||
|
var message = req.body.Text;
|
||||||
|
var params = {from: config.fromAddress, to: config.contactUsRecipient, subject: "Contact Us", text: "A user has commented via the Petit Teton website.\n\nFirst Name: " + firstName + "\nLast Name: " + lastName + "\nEmail: " + email + "\n" + message};
|
||||||
|
|
||||||
|
smtpTransport.sendMail(params, function(error, response) {
|
||||||
|
if(error) {
|
||||||
|
try {
|
||||||
|
console.log("Received an error while sending the contact us email to the admin. " + error);
|
||||||
|
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (contact us)");}});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).send('success');
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
/*
|
||||||
|
app.use('/LoginUser', function(req, res) {
|
||||||
|
//Note: This is mostly for marketing purposes so it won't be very secure at all (no hashing, salting, SSL, or anything), and it allows the search engines to bypass it to the content.
|
||||||
|
try {
|
||||||
|
var password = req.body.Password;
|
||||||
|
|
||||||
|
if(password) {
|
||||||
|
var index;
|
||||||
|
var found = false;
|
||||||
|
|
||||||
|
//Convert the password from base64.
|
||||||
|
password = new Buffer(password, 'base64').toString('utf-8');
|
||||||
|
|
||||||
|
//Identify which password was used (note: could use a map, but realistically with so few it is pointless complexity).
|
||||||
|
for(index = 0; !found && index < pwdData.length; index++) {
|
||||||
|
if(pwdData[index].pwd == password) {
|
||||||
|
//Track the time of the first and last login.
|
||||||
|
if(pwdData[index].firstLogin) pwdData[index].lastLogin = new Date();
|
||||||
|
else pwdData[index].firstLogin = new Date();
|
||||||
|
|
||||||
|
writePwdData();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found) {
|
||||||
|
//Notify the client they have logged in.
|
||||||
|
res.status(200).send('success');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.status(200).send('failed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.status(200).send('failed');
|
||||||
|
}
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
console.log("Time now is: " + moment(new Date()).format("MMM Do YYYY, h:mm:ss a"));
|
||||||
|
/*
|
||||||
|
app.use('/Admin/UserData', function(req, res) {
|
||||||
|
//TODO: Return a table of user data. This is a hidden function, and since the data is not very sensitive we won't bother with password protection or ssl.
|
||||||
|
var body = "<html><body><table><thead><tr><th style='padding: 0 20px 0 0'>Password</th><th style='padding: 0 20px 0 20px'>Page Request Count</th><th style='padding: 0 20px 0 20px'>First Login</th><th style='padding: 0 0 0 20px'>Last Login</th></tr></thead><tbody>";
|
||||||
|
|
||||||
|
for(var index = 0; index < pwdData.length; index++) {
|
||||||
|
body += "<tr>";
|
||||||
|
body += "<td>" + pwdData[index].pwd + "</td>";
|
||||||
|
body += "<td style='text-align: center'>" + (pwdData[index].accessCount ? pwdData[index].accessCount : 0) + "</td>";
|
||||||
|
body += "<td style='padding: 0 20px 0 20px'>" + (pwdData[index].firstLogin ? (moment(pwdData[index].firstLogin).format("MMM Do YYYY, h:mm:ss a") + " (" + moment(pwdData[index].firstLogin).fromNow() + ")") : "") + "</td>";
|
||||||
|
body += "<td style='padding: 0 20px 0 20px'>" + (pwdData[index].lastLogin ? (moment(pwdData[index].lastLogin).format("MMM Do YYYY, h:mm:ss a") + " (" + moment(pwdData[index].lastLogin).fromNow() + ")") : "") + "</td>";
|
||||||
|
body += "</tr>";
|
||||||
|
}
|
||||||
|
|
||||||
|
body += "</tbody></table></body></html>";
|
||||||
|
res.send(body);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
//Handle the root being requested, and the search engine requesting a static page with content.
|
||||||
|
app.use('/', function(req, res) {
|
||||||
|
try {
|
||||||
|
//Note: This is for search engines. It bypasses the password, which is fine since that is mostly a marketing gimmic to make users feel that they have some special access priviliges.
|
||||||
|
if(typeof(req.query._escaped_fragment_) !== "undefined") {
|
||||||
|
//The DIY method which is somewhat brittle since it relies on <!--CONTENT--> existing in the index.html file, and it replaces that with the contents of the passed parameter (what is after the #!) for the content html which is inserted into the index.html in place of <!--CONTENT-->.
|
||||||
|
fs.readFile(rootPath + '/index.html', {encoding: "UTF8"}, function(err, indexContent) {
|
||||||
|
if(!err) {
|
||||||
|
var file = rootPath + '/' + req.query._escaped_fragment_ + '.html';
|
||||||
|
|
||||||
|
fs.readFile(file, {encoding: "UTF8"}, function(err, content) {
|
||||||
|
if(!err) {
|
||||||
|
//Non-regex method.//
|
||||||
|
if(content.indexOf("<runonce>") != -1 && content.indexOf("</runonce>") != -1) {
|
||||||
|
content = content.substr(0, content.indexOf("<runonce>")) + content.substr(content.indexOf("</runonce>") + 10, -1);
|
||||||
|
}
|
||||||
|
//Doesn't work? Not sure why. Works in the regex test tools.//
|
||||||
|
//content = content.replace(/<runonce>(.|\n)*?<\x2frunonce>/, " ");
|
||||||
|
|
||||||
|
//Doesn't work? Based on the regex failure above, I think that replace is failing.//
|
||||||
|
var html = indexContent.replace(/<!--CONTENT-->/g, content);
|
||||||
|
|
||||||
|
//console.log(html);
|
||||||
|
res.send(html);
|
||||||
|
}
|
||||||
|
else console.log("Error reading the content file '" + file + "'. " + err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else console.log("Error reading the index.html file. " + err);
|
||||||
|
});
|
||||||
|
/* Does not work! Would be nice, but Phantom doesn't work well with Node.js. Could try using jsdom/io.js or could use prerenderer-node which is a server that runs in parallel with the web server and builds the html as the client would, which is then returned.
|
||||||
|
phantom.create(function(err, ph) {
|
||||||
|
if(!err) {
|
||||||
|
return ph.createPage(function(err, page) {
|
||||||
|
return page.open(req.protocol + "://" + req.hostname + ':' + req.app.get('port') + req.path + "#!" + req.query._escaped_fragment_, function(status) {
|
||||||
|
return page.evaluate((function() {
|
||||||
|
return document.getElementsByTagName('html')[0].innerHTML;
|
||||||
|
}), function(err, result) {
|
||||||
|
res.send(result);
|
||||||
|
return ph.exit();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else console.log("Error in Phantom.create: " + err);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.sendFile("index.html", {root: rootPath});
|
||||||
|
}
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Schedule a task every 10 minutes to check the email failure log and re-attempt sending.//
|
||||||
|
/* TODO
|
||||||
|
setInterval(function() {
|
||||||
|
//How to remove things from the file without worrying about synchronization between those threads adding to the file?
|
||||||
|
fs.
|
||||||
|
}, 600000);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// catch 404 and forward to error handler
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
try {
|
||||||
|
var err = new Error('Not Found');
|
||||||
|
err.status = 404;
|
||||||
|
next(err);
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
|
||||||
|
// error handlers
|
||||||
|
|
||||||
|
// development error handler
|
||||||
|
// will print stacktrace
|
||||||
|
if (app.get('env') === 'development') {
|
||||||
|
app.use(function(err, req, res, nex) {
|
||||||
|
try {
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render('error.ejs', {
|
||||||
|
message: err.message,
|
||||||
|
error: err
|
||||||
|
});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// production error handler
|
||||||
|
// no stacktraces leaked to user
|
||||||
|
app.use(function(err, req, res, next) {
|
||||||
|
try {
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render('error.ejs', {
|
||||||
|
message: err.message,
|
||||||
|
error: {}
|
||||||
|
});
|
||||||
|
} catch(e) {console.log(e);}
|
||||||
|
});
|
||||||
|
|
||||||
|
//console.log(app._router);
|
||||||
|
|
||||||
|
module.exports = app;
|
||||||
90
bin/www
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var app = require('../app');
|
||||||
|
var debug = require('debug')('payback:server');
|
||||||
|
var http = require('http');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get port from environment and store in Express.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var port = normalizePort(process.env.PORT || '4480');
|
||||||
|
app.set('port', port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTTP server.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var server = http.createServer(app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen on provided port, on all network interfaces.
|
||||||
|
*/
|
||||||
|
|
||||||
|
server.listen(port);
|
||||||
|
server.on('error', onError);
|
||||||
|
server.on('listening', onListening);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a port into a number, string, or false.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function normalizePort(val) {
|
||||||
|
var port = parseInt(val, 10);
|
||||||
|
|
||||||
|
if (isNaN(port)) {
|
||||||
|
// named pipe
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port >= 0) {
|
||||||
|
// port number
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "error" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onError(error) {
|
||||||
|
if (error.syscall !== 'listen') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bind = typeof port === 'string'
|
||||||
|
? 'Pipe ' + port
|
||||||
|
: 'Port ' + port
|
||||||
|
|
||||||
|
// handle specific listen errors with friendly messages
|
||||||
|
switch (error.code) {
|
||||||
|
case 'EACCES':
|
||||||
|
console.error(bind + ' requires elevated privileges');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
case 'EADDRINUSE':
|
||||||
|
console.error(bind + ' is already in use');
|
||||||
|
process.exit(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event listener for HTTP server "listening" event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onListening() {
|
||||||
|
var addr = server.address();
|
||||||
|
var bind = typeof addr === 'string'
|
||||||
|
? 'pipe ' + addr
|
||||||
|
: 'port ' + addr.port;
|
||||||
|
debug('Listening on ' + bind);
|
||||||
|
}
|
||||||
10
config.example.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//Email settings - Change these:
|
||||||
|
exports.fromAddress = 'dave@paybackdigital.com';
|
||||||
|
exports.smtpUser = 'dave@paybackdigital.com';
|
||||||
|
exports.smtpPassword = 'password';
|
||||||
|
exports.smtpHost = "secure.emailsrvr.com";
|
||||||
|
exports.smtpPort = 587;
|
||||||
|
exports.contactUsRecipient = fromAddress;
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
10
config.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
//Email settings - Change these:
|
||||||
|
exports.fromAddress = 'wynne@av4h.com';
|
||||||
|
exports.smtpUser = 'wynne@av4h.com';
|
||||||
|
exports.smtpPassword = 'landFJ40';
|
||||||
|
exports.smtpHost = "secure.emailsrvr.com";
|
||||||
|
exports.smtpPort = 465;
|
||||||
|
exports.contactUsRecipient = exports.fromAddress;
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
1
debug node.js.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
cmd /k "node-debug bin/www"
|
||||||
24
package.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "payback",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./bin/www"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"body-parser": "~1.10.2",
|
||||||
|
"cookie-parser": "~1.3.3",
|
||||||
|
"debug": "~2.1.1",
|
||||||
|
"ejs": "~2.2.3",
|
||||||
|
"express": "~4.11.1",
|
||||||
|
"morgan": "~1.5.1",
|
||||||
|
"serve-favicon": "~2.2.0",
|
||||||
|
"stylus": "~0.42.3",
|
||||||
|
"swig": "~1.4.2",
|
||||||
|
"html": "latest",
|
||||||
|
"nodemailer": "~1.0",
|
||||||
|
"body-parser": "latest",
|
||||||
|
"node-phantom": "latest",
|
||||||
|
"moment": "latest"
|
||||||
|
}
|
||||||
|
}
|
||||||
364
photos/.svn/entries
Normal file
@@ -0,0 +1,364 @@
|
|||||||
|
10
|
||||||
|
|
||||||
|
dir
|
||||||
|
0
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files
|
||||||
|
svn://gooeyfish
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
svn:special svn:externals svn:needs-lock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5bae2391-cca6-ca44-bb23-a66e832fb2eb
|
||||||
|
|
||||||
|
Chicken Icon.png
|
||||||
|
file
|
||||||
|
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files/Chicken%20Icon.png
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Chicken-Egg.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Chicken.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Chicken.svg
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
Header-1.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Header-1.svg
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
Map.psd
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Misc Images.svg
|
||||||
|
file
|
||||||
|
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files/Misc%20Images.svg
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
Petitteton Image Instructions.txt
|
||||||
|
file
|
||||||
|
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files/Petitteton%20Image%20Instructions.txt
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Petitteton.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Petitteton.svg
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
Petitteton2.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Petitteton2.svg
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
Yak Grazing.png
|
||||||
|
file
|
||||||
|
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files/Yak%20Grazing.png
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Yak Grazing.psd
|
||||||
|
file
|
||||||
|
|
||||||
|
svn://gooeyfish/trunk/Applications/Petit%20Teton/web/support-files/Yak%20Grazing.psd
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
Yak-Grazing_v2.psd
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
bullet.psd
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
egg.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h1.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h3.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h4.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h5.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h6.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h7.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
h8.png
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
menu-background.psd
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
has-props
|
||||||
|
has-prop-mods
|
||||||
|
|
||||||
|
photos
|
||||||
|
dir
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add
|
||||||
|
|
||||||
5
photos/.svn/props/Chicken Icon.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Chicken-Egg.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Chicken.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Header-1.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Map.psd.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 10
|
||||||
|
text/plain
|
||||||
|
END
|
||||||
5
photos/.svn/props/Petitteton.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Petitteton2.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Yak Grazing.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Yak Grazing.psd.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/Yak-Grazing_v2.psd.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/bullet.psd.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/egg.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h1.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h3.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h4.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h5.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h6.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h7.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/h8.png.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
5
photos/.svn/props/menu-background.psd.svn-work
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:mime-type
|
||||||
|
V 24
|
||||||
|
application/octet-stream
|
||||||
|
END
|
||||||
BIN
photos/2011-12-16 18.58.10.jpg
Normal file
|
After Width: | Height: | Size: 3.0 MiB |
BIN
photos/2011-Sept 041.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
photos/2012-1 021.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
photos/2012-1-2 004.jpg
Normal file
|
After Width: | Height: | Size: 1015 KiB |
BIN
photos/2012-11-08 22.20.59.jpg
Normal file
|
After Width: | Height: | Size: 891 KiB |
BIN
photos/2012-12-13 18.01.34.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/2012-2-1 001.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
photos/2012-2-1 003.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
photos/2012-2-1 006.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
photos/2012-2-1 016.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
photos/2012-2-1 018.jpg
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
photos/2012-2-1 024.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
photos/2012-2-1 027.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
photos/2012-2-1 030.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
2081
photos/Aquaponic Pirate Fish.svg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
photos/CSA/2012-05-29 08.33.16 (1).jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/CSA/2012-05-29 08.33.52 (1).jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/CSA/IMG_2993.JPG
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
photos/Chicken Icon.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
photos/Chicken-Egg.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
photos/Chicken.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
235
photos/Chicken.svg
Normal file
|
After Width: | Height: | Size: 426 KiB |
BIN
photos/Chickens & Eggs/IMG_3204.JPG
Normal file
|
After Width: | Height: | Size: 1014 KiB |
BIN
photos/Chickens & Eggs/IMG_3205.JPG
Normal file
|
After Width: | Height: | Size: 964 KiB |
BIN
photos/Farm Photo 2012-12-03 15.47.03.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
photos/Header-1.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
169
photos/Header-1.svg
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
photos/Holiday Advert.psd
Normal file
BIN
photos/Map.psd
Normal file
BIN
photos/Market/100_2715.JPG
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
photos/Market/IMG_3067.JPG
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/Market/IMG_3068.JPG
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
396
photos/Misc Images.svg
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
photos/People/IMG_3288.JPG
Normal file
|
After Width: | Height: | Size: 868 KiB |
BIN
photos/People/nikki_steve_v1.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
photos/PetitTetonLogo_v1.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
photos/PetitTetonLogo_v2.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
11
photos/Petitteton Image Instructions.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Instructions for cleaning up the Petit Teton image from a Raster:
|
||||||
|
|
||||||
|
1) Extensions->Raster->Reduce Noise (10)
|
||||||
|
2) Path->Trace Bitmap (Grays + Remove Background + Smooth + Stack Scans)
|
||||||
|
|
||||||
|
|
||||||
|
Instructions for Converting the SVG back to a raster as 200x191 (after adding "from your neighbor to your table" in Scala Sans BD + Italic along the bottom)
|
||||||
|
|
||||||
|
1) Export to bitmap with an 800 width.
|
||||||
|
2) Open in Adobe Photoshop CS4
|
||||||
|
3) Export to web (gif) - remove the transparency checkbox - Scale to 25% - Use Bicubic filtering
|
||||||
87
photos/Petitteton Logo Only.svg
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
photos/Petitteton.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
113
photos/Petitteton.svg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
photos/Petitteton2.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
395
photos/Petitteton2.svg
Normal file
|
After Width: | Height: | Size: 2.5 MiB |
BIN
photos/Petitteton3.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
photos/Pigs/IMG_3312.JPG
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
photos/Pigs/IMG_3314.JPG
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/Pigs/img015.tif
Normal file
BIN
photos/Pigs/img017.tif
Normal file
BIN
photos/Pigs/sleepy_pig.png
Normal file
|
After Width: | Height: | Size: 326 KiB |
BIN
photos/Sarah Pict.jpg
Normal file
|
After Width: | Height: | Size: 891 KiB |
BIN
photos/Vaps/2012-04-06 07.39.21.jpg
Normal file
|
After Width: | Height: | Size: 5.4 MiB |
BIN
photos/Vaps/2012-04-06 07.40.41.jpg
Normal file
|
After Width: | Height: | Size: 5.7 MiB |
BIN
photos/Vaps/2012-07-28 10.16.40.jpg
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
photos/Vaps/2012-08-07 09.05.37.jpg
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
photos/Vaps/DSC_0160 (2).JPG
Normal file
|
After Width: | Height: | Size: 4.4 MiB |
BIN
photos/Vaps/DSC_0169 (2).JPG
Normal file
|
After Width: | Height: | Size: 4.4 MiB |
BIN
photos/Vaps/DSC_0174 (2).JPG
Normal file
|
After Width: | Height: | Size: 3.5 MiB |
BIN
photos/Vaps/DSC_0180.JPG
Normal file
|
After Width: | Height: | Size: 4.2 MiB |
BIN
photos/Vaps/DSC_0182 (2).JPG
Normal file
|
After Width: | Height: | Size: 3.9 MiB |
BIN
photos/Vaps/DSC_0187 (2).JPG
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
photos/Vaps/IMG_20141010_163427.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
photos/Vaps/IMG_2853 (1).JPG
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
photos/Vaps/IMG_2854 (1).JPG
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
photos/Veggies/2012-08-26 18.48.23.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
photos/Veggies/2012-08-28 08.35.03.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
photos/Veggies/2012-11-08 21.45.34.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
photos/Veggies/2013-09-01 18.14.16.jpg
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
photos/Visiting/2011-1 008.jpg
Normal file
|
After Width: | Height: | Size: 3.1 MiB |
BIN
photos/Visiting/DSC_0188.JPG
Normal file
|
After Width: | Height: | Size: 4.8 MiB |
BIN
photos/Visiting/IMG_20141010_124139.jpg
Normal file
|
After Width: | Height: | Size: 649 KiB |