var WPCom = {
localStorageSchemaVersion: '20120209-3',
filter: 'freshlypressed',
dataSources: [],
apiURL: 'https://public-api.wordpress.com/rest/v1',
rebloggedFlag: false, // Set when a post is reblogged so we know to refresh the myblogs tab.
userAgent: function () {
return "wp-windows8";
},
newDataSource: function (filter) {
if (filter && undefined == WPCom.dataSources[filter]) {
WPCom.dataSources[filter] = new wpcomDataSource(filter);
WPCom.dataSources[filter].getData();
if (filter == 'myblog') {
WPCom.rebloggedFlag = false;
}
}
if (filter == 'myblog' && WPCom.rebloggedFlag) {
WPCom.rebloggedFlag = false;
WPCom.refresh();
}
},
timeSince: function (date) {
var seconds = Math.floor((new Date().getTime() / 1000) - (new Date(date).getTime() / 1000));
var interval = Math.floor(seconds / 31536000);
var timeago = '';
if (interval >= 1) {
timeago = interval + " year";
} else {
interval = Math.floor(seconds / 2592000);
if (interval >= 1) {
timeago = interval + " month";
} else {
interval = Math.floor(seconds / 86400);
if (interval >= 1) {
timeago = interval + " day";
} else {
interval = Math.floor(seconds / 3600);
if (interval >= 1) {
timeago = interval + " hour";
} else {
interval = Math.max(1, Math.floor(seconds / 60));
timeago = interval + " minute";
}
}
}
}
if (1 != interval)
timeago = timeago + 's';
return timeago;
},
signInOut: function () {
if (WPCom.isLoggedIn()) {
var applicationData = Windows.Storage.ApplicationData.current;
var localSettings = applicationData.localSettings;
localSettings.values["wpcomAccessToken"] = null;
localSettings.values["wpcomBlogID"] = null;
localSettings.values["wpcomBlogURL"] = null;
applicationData.signalDataChanged();
WPCom.resetDataSources();
}
var wpcomURL = "https://public-api.wordpress.com/oauth2/authorize?client_id=";
var clientID = "41";
var callbackURL = "https://wordpress.com";
wpcomURL += clientID + "&redirect_uri=" + encodeURIComponent(callbackURL) + "&response_type=code";
try {
var startURI = new Windows.Foundation.Uri(wpcomURL);
var endURI = new Windows.Foundation.Uri(callbackURL);
Windows.Security.Authentication.Web.WebAuthenticationBroker.authenticateAsync(
Windows.Security.Authentication.Web.WebAuthenticationOptions.default, startURI, endURI).then(WPCom.callbackWebAuth, WPCom.callbackWebAuthError);
}
catch (err) {
//error
return;
}
},
showPrivacyPolicy: function () {
try {
var url = 'http://automattic.com/privacy/';
var privacyPolicyUri = Windows.Foundation.Uri(url);
var options = new Windows.System.LauncherOptions();
options.displayApplicationPicker = true;
Windows.System.Launcher.launchUriAsync(privacyPolicyUri, options).then(function (success) {
if (success) {
// success
} else {
// error
}
});
}
catch (err) {
//error
return;
}
},
isLoggedIn: function () {
var applicationData = Windows.Storage.ApplicationData.current;
var localSettings = applicationData.localSettings;
if (localSettings.values["wpcomAccessToken"])
return true;
else
return false;
},
callbackWebAuth: function (result) {
var responseString = result.responseData;
if (responseString) {
//try to parse out the token
var code = responseString.substring(responseString.indexOf("code=") + 5, responseString.indexOf("&state"));
if (code.length > 0) {
//we have the code, let's get the full token
var data = new FormData();
data.append('client_id', 41);
data.append('redirect_uri', 'https://wordpress.com');
data.append('code', code);
data.append('grant_type', 'authorization_code');
WinJS.xhr({
type: "POST",
url: "https://public-api.wordpress.com/oauth2/token",
data: data
}).then(function (result) {
var authData = JSON.parse(result.responseText);
var authToken = authData.access_token;
var blog_id = authData.blog_id;
var blog_url = authData.blog_url;
var applicationData = Windows.Storage.ApplicationData.current;
var localSettings = applicationData.localSettings;
localSettings.values["wpcomAccessToken"] = authToken;
localSettings.values["wpcomBlogID"] = blog_id;
localSettings.values["wpcomBlogURL"] = blog_url;
applicationData.signalDataChanged();
WPCom.resetDataSources();
// If location is empty, we are at the share pane and should set the layout of the page.
if (WinJS.Navigation.location == "")
setShareLayout();
}, function (result) {
//handle error
});
}
}
},
callbackWebAuthError: function (err) {
//handle error here
},
resizeImage: function (file, document, uploadImage, isContentEditable) {
var Imaging = Windows.Graphics.Imaging;
var imageStream;
var longEdge = 650;
file.openReadAsync().then(function (imageStream) {
if (imageStream) {
Imaging.BitmapDecoder.createAsync(imageStream).then(function (bd) {
if (bd.pixelHeight > longEdge || bd.pixelWidth > longEdge) {
var aspect = bd.pixelWidth / bd.pixelHeight;
var transform = new Windows.Graphics.Imaging.BitmapTransform();
if (bd.pixelWidth < bd.pixelHeight) {
// image is tall
transform.scaledHeight = longEdge;
transform.scaledWidth = Math.round(transform.scaledHeight * (bd.pixelWidth / bd.pixelHeight));
} else if (bd.pixelWidth > bd.pixelHeight) {
// image is wide
transform.scaledWidth = longEdge;
transform.scaledHeight = Math.round(transform.scaledWidth * (bd.pixelHeight / bd.pixelWidth));
} else {
// image is square
transform.scaledHeight = longEdge;
transform.scaledWidth = longEdge;
}
bd.getPixelDataAsync(Imaging.BitmapPixelFormat.rgba8, Imaging.BitmapAlphaMode.straight,
transform, Imaging.ExifOrientationMode.respectExifOrientation,
Imaging.ColorManagementMode.doNotColorManage).then(function (pdp) {
var pixelData = pdp.detachPixelData();
// make temporary image with new size and save it
Windows.Storage.ApplicationData.current.localFolder.createFileAsync('temp.jpg',
Windows.Storage.CreationCollisionOption.replaceExisting).then(function (tempfile) {
tempfile.openAsync(Windows.Storage.FileAccessMode.readWrite).then(function (stream) {
Imaging.BitmapEncoder.createAsync(Imaging.BitmapEncoder.jpegEncoderId,
stream).then(function (encoder) {
encoder.setPixelData(Imaging.BitmapPixelFormat.rgba8, Imaging.BitmapAlphaMode.straight, transform.scaledWidth, transform.scaledHeight, 96, 96, pixelData);
encoder.flushAsync().then(function () {
stream.flushAsync().then(function () {
stream.close();
Windows.Storage.ApplicationData.current.localFolder.getFileAsync('temp.jpg').then(function (newfile) {
if (uploadImage)
WPCom.uploadFile(newfile, document, isContentEditable);
});
});
});
});
});
});
});
} else {
if (uploadImage)
WPCom.uploadFile(file, document, isContentEditable);
}
});
}
});
},
uploadFile: function (file, document, isContentEditable) {
var imageBase64;
file.openReadAsync().then(function (imageStream) {
if (isContentEditable)
WPCom.toggleElement(document.getElementById('image-loader'), 'show');
var reader = new Windows.Storage.Streams.DataReader(imageStream);
var promise = reader.loadAsync(imageStream.size).then(function (readSize) {
var buffer = reader.readBuffer(readSize);
imageBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer);
}, function (result) {
// error
}).done(function () {
var accessToken = WPCom.getCurrentAccessToken();
var timestamp = new Date().getTime() + ".jpg";
var xmlrpcURL = "http://" + WPCom.getCurrentBlogURL() + "/xmlrpc.php";
var xmlString = '
Sorry, but we could not connect to WordPress.com.
Please try again later.
'; WPCom.toggleError('show'); } } } self.fetching = false; } ); } // startOrEnd: 'start', 'end' wpcomDataSource.prototype.addItemsToList = function (jsonPosts, startOrEnd) { var arrayItems = []; for (var key in jsonPosts) { if (this.filter == 'freshlypressed') { arrayItems.push({ post_title: (jsonPosts[key].editorial.custom_headline.length) ? WPCom.unescapeHTML(WPCom.stripslashes(jsonPosts[key].editorial.custom_headline)) : WPCom.unescapeHTML(jsonPosts[key].title), blog_name: WPCom.unescapeHTML(jsonPosts[key].editorial.blog_name), post_image: jsonPosts[key].editorial.image.replace(/https:\/\/([^\.]+).wordpress.com/, 'http://s.wordpress.com'), post_id: jsonPosts[key].ID, blog_id: jsonPosts[key].editorial.blog_id, site_id: jsonPosts[key].editorial.site_id, ts: jsonPosts[key].editorial.displayed_on, permalink: jsonPosts[key].URL.replace(/^https:/, 'http:'), post_date: jsonPosts[key].date, post_author: jsonPosts[key].author.ID, author_name: jsonPosts[key].author.name, author_gravatar: jsonPosts[key].author.avatar_URL.replace(/s=\d+/, 's=40'), local_storage_key: (this.filter + '-' + key) }); } else if (this.filter == 'following') { var div = document.createElement('div'); div.innerHTML = jsonPosts[key].post_content; var images = div.getElementsByClassName('size-full'); var imgSrc = ''; if (images.length > 0) { imgSrc = images[0].src; } var postSummary = div.innerText; if (postSummary.indexOf('Read more') != -1) postSummary = postSummary.substring(0, postSummary.indexOf('Read more')); var blogName = WPCom.stripslashes(jsonPosts[key].post_author.blog_name); if (blogName == '') blogName = '[ No Title ]'; var test = jsonPosts[key]; arrayItems.push({ post_title: WPCom.unescapeHTML(WPCom.stripslashes(jsonPosts[key].post_title)), blog_name: blogName, post_image: imgSrc, has_image: (imgSrc == '') ? 'none' : 'block', has_text: (postSummary != '') ? 'block' : 'none', has_text_and_image: (imgSrc != '' && postSummary.length > 30) ? '-48px' : '0px', title_padding: '0px', is_reblogged: jsonPosts[key].is_reblogged, is_reblog_post: (jsonPosts[key].post_reblog_author != undefined) ? 'block' : 'none', reblog_post_position: (jsonPosts[key].post_reblog_author != undefined) ? '25px' : '0', post_reblog_note: jsonPosts[key].post_reblog_note, post_reblog_author: jsonPosts[key].post_reblog_author, post_reblog_permalink: jsonPosts[key].post_reblog_permalink, post_summary: postSummary, post_id: jsonPosts[key].ID, blog_id: jsonPosts[key].blog_id, site_id: jsonPosts[key].site_id, ts: jsonPosts[key].post_timestamp * 1000, permalink: jsonPosts[key].post_permalink.replace(/^https:/, 'http:'), post_date: jsonPosts[key].post_timestamp * 1000, post_author: jsonPosts[key].post_author, author_name: jsonPosts[key].post_author.display_name, author_gravatar: jsonPosts[key].post_author.avatar_URL, local_storage_key: (this.filter + '-' + key) }); } else if (this.filter == 'myblog') { if (jsonPosts[key].content.length == 0) break; var div = document.createElement('div'); div.innerHTML = toStaticHTML(jsonPosts[key].content); // first let's try to get images from the attachments object var attachments = jsonPosts[key].attachments; var imgSrc = ''; if ( attachments ) { for ( var image in attachments ) { imgSrc = attachments[image].guid; break; } } // if there still isn't an image, let's try to parse the content for an image if (!imgSrc) { var images = div.getElementsByClassName('size-full'); if (images.length > 0) { imgSrc = images[0].src; } } var postSummary = div.innerText; if (postSummary.indexOf('Read more') != -1) postSummary = postSummary.substring(0, postSummary.indexOf('Read more')); var postTitle = WPCom.unescapeHTML(WPCom.stripslashes(jsonPosts[key].title)); if (!postTitle) postTitle = '[ No Title ]'; var shortDateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("shortdate"); var date = new Date(jsonPosts[key].date); arrayItems.push({ post_title: postTitle, blog_name: '', post_image: imgSrc, post_id: jsonPosts[key].ID, has_image: (imgSrc == '') ? 'none' : 'block', has_text: (postSummary != '') ? 'block' : 'none', has_text_and_image: (imgSrc != '' && postSummary.length > 30) ? '-48px' : '0px', title_padding: '0px', post_summary: postSummary, blog_id: '', site_id: '', ts: jsonPosts[key].date, short_date: shortDateFormatter.format(date), permalink: jsonPosts[key].URL.replace(/^https:/, 'http:'), post_date: jsonPosts[key].date, post_author: jsonPosts[key].author.ID, author_name: jsonPosts[key].author.name, author_gravatar: jsonPosts[key].author.avatar_URL.replace(/s=\d+/, 's=40'), local_storage_key: (this.filter + '-' + key) }); } } if ('start' == startOrEnd) arrayItems.reverse(); var groupItemIndex, groupItem, date, matches; var noImagePostFound = false; for (var i = 0; i < arrayItems.length; i++) { if ('start' == startOrEnd) this.list.unshift(arrayItems[i]); else // 'end' this.list.push(arrayItems[i]); // check to see if we need to update the group item date = new Date(arrayItems[i].ts); groupItemIndex = WPCom.dataSources[this.filter].groupedList.groups.indexOfKey(new Date(date.getFullYear(), date.getMonth(), date.getDate()).toString()); if ( groupItemIndex >= 0 ) { groupItem = WPCom.dataSources[this.filter].groupedList.groups.getAt(groupItemIndex); var groups = WPCom.dataSources[this.filter].groupedList.groups; var image = arrayItems[i].post_image.replace(/resize=\d+\,\d+/, 'resize=56px,56px'); image = image.replace(/crop=\d+px\,\d+px\,\d+px\,\d+px/, 'resize=56px,56px'); // There is an issue where mshots will sometimes show a spinner for a thumb. // So lets not use them as thumbs. if (-1 < image.indexOf("wp.com/mshots")) continue; matches = groupItem.thumbnails.match(/\ 0 && matches.length < 3 && -1 == groupItem.thumbnails.indexOf(image)) { groupItem.thumbnails += WPCom.formatThumb(image); }; } else if (image != '') { groupItem.thumbnails += WPCom.formatThumb(image); } } } } wpcomDataSource.prototype.setDateRange = function (date_range) { this.oldest_in_date_range = date_range.oldest; this.newest_in_date_range = date_range.newest; } wpcomDataSource.prototype.reset = function (skipData, onlyResetLists) { if (true != onlyResetLists) { this.newest_in_date_range = null; this.oldest_in_date_range = null; this.fetching = false; this.scrollPosition = 0; } this.list = new WinJS.Binding.List(); this.groupedList = this.list.createGrouped(this.getGroupKey, this.getGroupData, this.compareGroups); if (true != skipData) this.getData(); } wpcomDataSource.prototype.cleanupLocalStorage = function () { var localStorageObject = JSON.parse(localStorage[this.filter]); var cleanupCount = 3 * WPCom.getDefaultPostCount(); if (localStorageObject.post_count > cleanupCount) { var i = 0, posts = {}, oldest_in_date_range = null, newest_in_date_range = null; for (var key in localStorageObject.posts) { i++; posts[key] = localStorageObject.posts[key]; if (posts[key].editorial != undefined) { if (null == oldest_in_date_range || new Date(posts[key].editorial.displayed_on) < new Date(oldest_in_date_range)) oldest_in_date_range = posts[key].editorial.displayed_on; if (null == newest_in_date_range || new Date(posts[key].editorial.displayed_on) > new Date(newest_in_date_range)) newest_in_date_range = posts[key].editorial.displayed_on; } else { if (null == oldest_in_date_range || new Date(posts[key].post_timestamp) < new Date(oldest_in_date_range)) oldest_in_date_range = posts[key].post_timestamp * 1000; if (null == newest_in_date_range || new Date(posts[key].post_timestamp) > new Date(newest_in_date_range)) newest_in_date_range = posts[key].post_timestamp * 1000; } if (i >= cleanupCount) break; } localStorageObject = { 'date_range': { 'oldest': oldest_in_date_range, 'newest': newest_in_date_range }, 'post_count': i, 'posts': posts }; localStorage[this.filter] = JSON.stringify(localStorageObject); } } wpcomDataSource.prototype.compareGroups = function (a, b) { var aDate = new Date(a), bDate = new Date(b); if (aDate == bDate) return 0; else if (aDate < bDate) return 1; else return -1; } wpcomDataSource.prototype.getGroupKey = function (dataItem) { var date = new Date(dataItem.ts); var key = null; if (WPCom.getCurrentFilter() == 'myblog') { key = 1; } else { key = new Date(date.getFullYear(), date.getMonth(), date.getDate()).toString(); } return key; } wpcomDataSource.prototype.getGroupData = function (dataItem) { var days = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); var date = new Date(dataItem.ts); var groupKey = new Date(date.getFullYear(), date.getMonth(), date.getDate()).toString(); var filter = WPCom.getCurrentFilter(); var thumbnails = ''; if (filter) { var index = WPCom.dataSources[filter].list.indexOf(dataItem); var i = index; var validImgCtr = index; while (validImgCtr < (index + 3) && i < WPCom.dataSources[filter].list.length) { var item = WPCom.dataSources[filter].list.getAt(i); if (item == undefined) break; var itemDate = new Date(item.ts); var itemGroupKey = new Date(itemDate.getFullYear(), itemDate.getMonth(), itemDate.getDate()).toString(); if (itemGroupKey.toString() != groupKey) break; var image = item.post_image.replace(/resize=\d+\,\d+/, 'resize=56px,56px'); image = image.replace(/crop=\d+px\,\d+px\,\d+px\,\d+px/, 'resize=56px,56px'); if (image != '' && (-1 == image.indexOf('wp.com/mshots'))) { thumbnails += WPCom.formatThumb(image); validImgCtr++; } else { item.title_padding = '100px'; } i++; } } return { thumbnails: thumbnails, day_of_month: date.getDate(), day_name: days[date.getDay()], month_name: months[date.getMonth()], month_short: months[date.getMonth()].substr(0, 3), group_title: months[date.getMonth()] + ' ' + date.getDate() } }