Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(939)

Unified Diff: chrome/common/extensions/docs/examples/extensions/news/javascript/options.js

Issue 3681008: Improvements to the Google News extension (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/examples/extensions/news/javascript/options.js
===================================================================
--- chrome/common/extensions/docs/examples/extensions/news/javascript/options.js (revision 0)
+++ chrome/common/extensions/docs/examples/extensions/news/javascript/options.js (revision 0)
@@ -0,0 +1,395 @@
+/**
+ * Copyright (c) 2010 The Chromium Authors. All rights reserved. Use of this
+ * source code is governed by a BSD-style license that can be found in the
+ * LICENSE file.
+ */
+
+/**
+ * @fileoverview Includes the country selection, topics selection and
+ * selection of no. of news stories to be shown. Include default settings also.
+ * @author navneetg@google.com (Navneet Goel).
+ */
+
+/**
+ * Stores number of selected topics on the options page.
+ */
+var checkCount = 0;
+
+/**
+ * Stores maximum count of custom topics.
+ */
+var MAX_CUS_TOPICS = 10;
+
+/**
+ * Stores temporary added custom topics which are not yet saved.
+ */
+var tempCusTopics = [];
+
+/**
+ * Checks whether ENTER key is pressed or not.
+ */
+function addCustomTopic() {
+ if (window.event.keyCode == 13) {
+ addCusTopic();
+ }
+}
+
+/**
+ * Retrieves and sets last saved country from local storage(if found),
+ * else sets country retrieved from feed.
+ */
+function setCountry() {
+ var country = window.localStorage.getItem('country');
+
+ // If country is not found in localstorage or default value is selected in
+ // drop down menu.
+ if ((!country) || country == 'noCountry') {
+ // XMLHttpRequest object that tries to load the feed for the purpose of
+ // retrieving the country value out of feed.
+ var req = new XMLHttpRequest();
+ req.onload = handleResponse;
+ req.onerror = handleError;
+ req.open('GET', DEFAULT_NEWS_URL, true);
+ req.send(null);
+
+ // Sets country to default Country in dropdown menu.
+ function handleError() {
+ $('countryList').value = 'noCountry';
+ };
+
+ // Handles parsing the feed data got back from XMLHttpRequest.
+ function handleResponse() {
+ // Feed document retrieved from URL.
+ var doc = req.responseXML;
+ if (!doc) {
+ handleError();
+ return;
+ }
+ var imageLink = doc.querySelector('image link');
+ if (imageLink) {
+ // Stores link to set value of country.
+ var newsUrl = imageLink.textContent;
+ }
+
+ // Stores country value
+ $('countryList').value = newsUrl.substring(newsUrl.indexOf('&ned=') + 5,
+ newsUrl.indexOf('&hl='));
+ };
+ } else {
+ $('countryList').value = country;
+ }
+}
+
+/**
+ * Displays various messages to user based on user input.
+ * @param {String} id Id of status element.
+ * @param {Number} timeOut Timeout value of message shown.
+ * @param {String} message Message to be shown.
+ */
+function showUserMessages(id, timeOut, message) {
+ $(id).style.setProperty('-webkit-transition',
+ 'opacity 0s ease-in');
+ $(id).style.opacity = 1;
+ $(id).innerText = chrome.i18n.getMessage(message);
+ window.setTimeout(function() {
+ $(id).style.setProperty(
+ '-webkit-transition', 'opacity' + timeOut + 's ease-in');
+ $(id).style.opacity = 0;
+ }, 1E3
+ );
+}
+
+/**
+ * Sets options page CSS according to the browser language(if found), else sets
+ * to default locale.
+ */
+function setOptionPageCSS() {
+ if (chrome.i18n.getMessage('direction') == 'rtl') {
+ document.querySelector('body').className = 'rtl';
+ }
+}
+
+/**
+ * Initializes the options page by retrieving country, topics and count of
+ * stories from local storage if present, else sets to default settings.
+ */
+function initialize() {
+ setOptionPageCSS();
+ setCountry();
+ setCountAndTopicList();
+ setLocalizedTopicList();
+
+ // Adds a custom topic on press of Enter key.
+ $('newKeyword').onkeypress = addCustomTopic;
+}
+
+/**
+ * Retrieves locale values from locale file.
+ */
+function setLocalizedTopicList() {
+ var getI18nMsg = chrome.i18n.getMessage;
+
+ $('top').innerText = getI18nMsg('1');
+ $('nation').innerText = getI18nMsg('n');
+ $('world').innerText = getI18nMsg('w');
+ $('business').innerText = getI18nMsg('b');
+ $('science').innerText = getI18nMsg('t');
+ $('entertainment').innerText = getI18nMsg('e');
+ $('sports').innerText = getI18nMsg('s');
+ $('health').innerText = getI18nMsg('m');
+ $('most').innerText = getI18nMsg('po');
+ $('select_country').innerText = getI18nMsg('country');
+ $('topic').innerText = getI18nMsg('topic');
+ $('save_button').innerText = getI18nMsg('save');
+ $('story_count').innerText = getI18nMsg('storyCount');
+ $('logo').innerHTML = $('logo').innerHTML + getI18nMsg('newsOption');
+ $('custom_text').innerHTML = getI18nMsg('customText') + '<br/>' +
+ getI18nMsg('maximumTopics',[MAX_CUS_TOPICS]);
+ $('submit_button').value = getI18nMsg('submitButton');
+}
+
+/**
+ * Sets topic list and number of stories retrieved from localstorage(if any)
+ * otherwise sets to default.
+ */
+function setCountAndTopicList() {
+ var topicLists = document.getElementsByClassName('checkBox');
+
+ // Retrieves topics list from localStorage.
+ var topics = JSON.parse(window.localStorage.getItem('topics'));
+
+ // Runs if retrieved topic list from local storage contains topics.
+ if (topics) {
+ for (var x = 0, topicList; topicList = topicLists[x]; x++) {
+
+ // Saves whether checkbox is checked or not.
+ var isPresent = false;
+ for (var y = 0; y < topics.length; y++) {
+ if (topics[y] == topicList.value) {
+ topicList.checked = true;
+ isPresent = true;
+ checkCount++;
+ break;
+ }
+ }
+ if (!isPresent) {
+ topicList.checked = false;
+ }
+ }
+ }
+
+ // Retrieves list of custom topics from localstorage(if any) and shows it
+ // in option page.
+ var keywords = JSON.parse(window.localStorage.getItem('keywords'));
+ if (keywords) {
+
+ // Template to store custom topics in a table.
+ var template = [];
+ var title = chrome.i18n.getMessage('deleteTitle');
+ for (var i = 0; i < keywords.length; i++) {
+ checkCount++;
+
+ template.push('<tr style = "height: 22px;">');
+ template.push('<td id = "keyword_value" class = "cusTopicsClass">');
+ template.push('<textarea class="noborder" readonly>');
+ template.push(keywords[i]);
+ template.push('</textarea>');
+ template.push('<td class = "suppr" onclick = "delCusTopic(this)" ');
+ template.push('title="');
+ template.push(title);
+ template.push('">');
+ template.push('</td>');
+ template.push('</tr>');
+ }
+ $('custom_topics').innerHTML = template.join('');
+ if (keywords.length == MAX_CUS_TOPICS) {
+ $('submit_button').disabled = true;
+ $('newKeyword').readOnly = 'readonly';
+ }
+ }
+ // Check all checkboxes(default settings) if no custom topic list and
+ // checkbox topic list from local storage is found.
+ if (!keywords && !topics) {
+ for (var x = 0, topicList; topicList = topicLists[x]; x++) {
+ topicList.checked = true;
+ checkCount++;
+ }
+ }
+
+ // Retrieves saved value of number of stories.
+ var count = window.localStorage.getItem('count');
+
+ // Sets number of stories in dropdown.
+ if (count) {
+ $('storyCount').value = count;
+ }
+}
+
+/**
+ * Saves checked topic list(if any), Custom topics(if any), number of
+ * stories and country value in local storage.
+ */
+function saveTopicsCountry() {
+ var country = $('countryList').value;
+ var topicLists = document.getElementsByClassName('checkBox');
+
+ // Contains selected number of stories.
+ var count = $('storyCount').value;
+
+ // Stores checked topics list.
+ var topicArr = [];
+ for (var i = 0, topicList; topicList = topicLists[i]; i++) {
+ if (topicList.checked) {
+ topicArr.push(topicList.value);
+ }
+ }
+ var keywords = JSON.parse(window.localStorage.getItem('keywords'));
+
+ // Saves custom topics to local storage(if any).
+ if (tempCusTopics.length > 0) {
+ if (keywords) {
+ keywords = keywords.concat(tempCusTopics);
+ window.localStorage.setItem('keywords', JSON.stringify(keywords));
+ } else {
+ window.localStorage.setItem('keywords', JSON.stringify(tempCusTopics));
+ }
+ tempCusTopics.splice(0, tempCusTopics.length);
+ }
+
+ // Saves checkbox topics(if any).
+ if (topicArr.length > 0) {
+ window.localStorage.setItem('topics', JSON.stringify(topicArr));
+ } else {
+ window.localStorage.removeItem('topics');
+ }
+
+ window.localStorage.setItem('count', count);
+ window.localStorage.setItem('country', country);
+
+ showUserMessages('save_status', 0.5, 'saveStatus');
+ $('save_button').disabled = true;
+}
+
+/**
+ * Disables the save button on options page if no topic is selected by the user.
+ * @param {String} id Id of checkbox checked or unchecked.
+ */
+function manageCheckCount(id) {
+ checkCount = ($(id).checked) ? (checkCount + 1) : (checkCount - 1);
+ $('save_button').disabled = (checkCount == 0) ? true : false;
+}
+
+/**
+ * Enables save button if at least one topic is selected.
+ */
+function enableSaveButton() {
+ if (checkCount != 0) {
+ $('save_button').disabled = false;
+ }
+}
+
+/**
+ * Adds new entered custom topic.
+ */
+function addCusTopic() {
+ // Retrieves custom topic list from local storage(if any), else create new
+ // array list.
+ var keywords = JSON.parse(window.localStorage.getItem('keywords') || "[]");
+
+ // Adds topic only if total number of added custom topics are less than 10.
+ if (keywords.length + tempCusTopics.length <= (MAX_CUS_TOPICS - 1)) {
+
+ // Stores new entered value in input textbox.
+ var val = $('newKeyword').value;
+ if (val) {
+ val = val.trim();
+ if (val.length > 0) {
+ var pattern = /,/g;
+
+ // Runs if comma(,) is not present in topic entered.
+ if (val.match(pattern) == null) {
+ checkCount++;
+ tempCusTopics.push(val);
+
+ // Template to store custom topics in a table.
+ var template = [];
+ var title = chrome.i18n.getMessage('deleteTitle');
+
+ template.push('<tr style = "height: 22px;">');
+ template.push('<td id = "keyword_value" class = "cusTopicsClass">');
+ template.push('<textarea class="noborder" readonly>');
+ template.push(val);
+ template.push('</textarea>');
+ template.push('<td class = "suppr" onclick = "delCusTopic(this)" ');
+ template.push('title="');
+ template.push(title);
+ template.push('">');
+ template.push('</td>');
+ template.push('</tr>');
+
+ $('custom_topics').innerHTML += template.join('');
+ enableSaveButton();
+ } else {
+ showUserMessages('invalid_status', 2.5, 'invalidChars');
+ }
+ }
+ $('newKeyword').value = '';
+ }
+ }
+
+ if ((keywords.length + tempCusTopics.length) == (MAX_CUS_TOPICS)) {
+ $('submit_button').disabled = true;
+ $('newKeyword').readOnly = 'readonly';
+ }
+}
+
+/**
+ * Delete custom topic whenever users click on delete icon.
+ * @param {HTMLTableColElement} obj HTML table column element to be deleted.
+ */
+function delCusTopic(obj) {
+ // Deletes only if total number of topics are greater than 1, else shows
+ // error message.
+ if (checkCount > 1) {
+ var value;
+
+ // Extract custom topic value.
+ value = obj.parentNode.querySelector('.cusTopicsClass textarea').value;
+
+ // Removes custom topic element from UI.
+ $('custom_topics').removeChild(obj.parentNode);
+
+ // Removes custom topic element either from temporary array(if topic is
+ // not yet saved) or from saved topic list and saves new list to
+ // local storage.
+ var flag = 0;
+ for (var i = 0; i < tempCusTopics.length; i++) {
+ if (tempCusTopics[i] == value) {
+ tempCusTopics.splice(i, 1);
+ flag = 1;
+ break;
+ }
+ }
+
+ if (flag == 0) {
+ var keywords = JSON.parse(window.localStorage.getItem('keywords'));
+ for (i = 0; i < keywords.length; i++) {
+ if (keywords[i] == value) {
+ keywords.splice(i, 1);
+ break;
+ }
+ }
+ if (keywords.length > 0) {
+ window.localStorage.setItem('keywords', JSON.stringify(keywords));
+ } else {
+ window.localStorage.removeItem('keywords');
+ }
+ }
+
+ checkCount--;
+ $('submit_button').disabled = false;
+ } else {
+ showUserMessages('save_status', 2.5, 'noTopic');
+ }
+ $('newKeyword').readOnly = false;
+}

Powered by Google App Engine
This is Rietveld 408576698