| 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;
|
| +}
|
|
|