--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Wikipedia/History.js Tue Mar 09 10:34:58 2010 +0000
@@ -0,0 +1,360 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation.
+// ////////////////////////////////////////////////////////////////////////////
+
+var MILLIS_IN_A_DAY = 24*60*60*1000;
+var KEEP_HISTORY_FOR = 90 * MILLIS_IN_A_DAY; // 90 days
+var KEEP_CONTENT = false;
+
+function HistoryViewItem(articleTitle, articleContent, articleBase, pos) {
+ var d = new Date();
+ this.articleTitle = articleTitle;
+ this.articleContent = articleContent;
+ this.articleBase = articleBase;
+ this.pos = pos;
+ this.timestamp = d.getTime();
+}
+
+
+function HistoryView (){
+ try {
+ ListView.prototype.init.call(this, null, null);
+ var caption = new NavigationButton(1, "titlebar.png", "History", true);
+ caption.addEventListener("ActionPerformed", function(){wikiHomeView.show();});
+ this.addControl(caption);
+ this.previousView = null;
+ this.items = new Array();
+ this.startindex = 0;
+ this.endindex = 0;
+ this.current = 0;
+ this.lastRender = 0;
+ this.todayControl = null;
+ this.loadItems();
+ }catch(w) {alert(w);}
+}
+
+HistoryView.prototype = new ListView(null, null);
+
+HistoryView.prototype.items = null;
+
+
+HistoryView.prototype.addItem = function(articleTitle, articleContent, articleBase){
+ // do not store it if its the same as previous one
+ if ( this.items[this.current] != undefined && this.items[this.current] != null && articleTitle == this.items[this.current].articleTitle){
+ return;
+ }
+ var item = null;
+ this.current = this.endindex;
+ if ( KEEP_CONTENT ){
+ item = new HistoryViewItem(articleTitle, articleContent, articleBase, this.current);
+ } else {
+ item = new HistoryViewItem(articleTitle, null, articleBase, this.current);
+ }
+ this.items[this.current-this.startindex]= item;
+ this.endindex++;
+ this.saveItem(item);
+}
+
+
+HistoryView.prototype.saveItem = function(item){
+ if ( window.widget ) {
+// alert("Saving item: pos=" + item.pos +", title=" + item.articleTitle +", ts=" + item.timestamp
+// + "titlekey:" + getHistoryTitleKey(item.pos) + ", timekey: " + getHistoryTimeKey(item.pos) );
+
+ widget.setPreferenceForKey(item.articleTitle, getHistoryTitleKey(item.pos));
+ if (KEEP_CONTENT) {
+ widget.setPreferenceForKey(item.articleContent, getHistoryContentKey(item.pos));
+ }
+ widget.setPreferenceForKey(item.articleBase, getHistoryBaseKey(item.pos));
+ widget.setPreferenceForKey(""+item.timestamp, getHistoryTimeKey(item.pos));
+ this.storeIndex();
+ }
+}
+
+HistoryView.prototype.storeIndex = function () {
+ widget.setPreferenceForKey("" + this.startindex, "history.start");
+ widget.setPreferenceForKey("" + this.endindex, "history.end");
+ widget.setPreferenceForKey("" + this.current, "history.current");
+// alert("index stored, start:"+this.startindex + ", end:"+this.endindex + ", current:"+this.current);
+}
+
+
+HistoryView.prototype.clear = function(){
+ this.items = new Array();
+ if (window.widget) {
+ for (var i = this.startindex; i < this.endindex + 1; i++) {
+ widget.setPreferenceForKey(null, getHistoryTitleKey(i));
+ if (KEEP_CONTENT) {
+ widget.setPreferenceForKey(null, getHistoryContentKey(i));
+ }
+ widget.setPreferenceForKey(null, getHistoryTimeKey(i));
+ }
+ this.startindex = 0;
+ this.endindex = 0;
+ this.current = 0;
+ this.storeIndex();
+ this.lastRender = 0;
+ this.render();
+ }
+}
+
+HistoryView.prototype.loadItems = function(){
+ uiManager.showNotification(-1, "wait", "Loading...");
+ var self = this;
+ setTimeout(function(){self.doLoadItems();},0);
+}
+
+
+HistoryView.prototype.doLoadItems = function(){
+ if ( window.widget ) {
+ var d = new Date();
+ var now = d.getTime();
+ this.items = new Array();
+ var tmpstart = widget.preferenceForKey("history.start");
+ var tmpend = widget.preferenceForKey("history.end");
+ var tmpcurr = widget.preferenceForKey("history.current");
+
+ this.startindex = (( tmpstart != undefined && tmpstart != null ) ? parseInt(tmpstart) : 0);
+ this.endindex = (( tmpend != undefined && tmpend != null ) ? parseInt(tmpend) : 0);
+ this.current = (( tmpcurr != undefined && tmpcurr != null ) ? parseInt(tmpcurr) : 0);
+
+// alert("startindex=" + this.startindex +", endindex=" + this.endindex+ ", current=" + this.current);
+
+ for (var i = this.startindex; i < this.endindex; i++) {
+ var pos = i - this.startindex;
+ var title = widget.preferenceForKey(getHistoryTitleKey(i));
+// alert("Examining item: i=" + i + ", pos=" + pos +", title=" + title );
+ if ( !title || title == null || title == "null") continue;
+ var item = new HistoryViewItem(title,null,null,i);
+ if (KEEP_CONTENT) {
+ item.articleContent = widget.preferenceForKey(getHistoryContentKey(i));
+ }
+ item.articleBase = widget.preferenceForKey(getHistoryBaseKey(i));
+ item.timestamp = parseFloat(widget.preferenceForKey(getHistoryTimeKey(i)));
+ // delete items older than KEEP_HISTORY_FOR
+ if (item.timestamp < (now - KEEP_HISTORY_FOR)) {
+// alert("Deleting old item: ts="+ item.timestamp + ", th=" + (now - KEEP_HISTORY_FOR));
+ widget.setPreferenceForKey(null, getHistoryTitleKey(i));
+ if (KEEP_CONTENT) {
+ widget.setPreferenceForKey(null, getHistoryContentKey(i));
+ }
+ widget.setPreferenceForKey(null, getHistoryBaseKey(i));
+ widget.setPreferenceForKey(null, getHistoryTimeKey(i));
+ }
+ else {
+ item.pos = i;
+ this.items[pos] = item;
+ }
+// alert("Loaded item: i=" + i + ", pos=" + pos +", title=" + title +", ts=" + item.timestamp);
+ }
+ }
+ uiManager.hideNotification();
+}
+
+HistoryView.prototype.render = function(){
+ var d = new Date();
+ var now = d.getTime();
+ // what needs to be rendered?
+
+ if (now - this.lastRender > MILLIS_IN_A_DAY || this.todayControl == null) { // render all
+
+ // clear components
+ this.removeAllControls();
+ var caption = new NavigationButton(1, "titlebar.png", "History", true);
+ caption.addEventListener("ActionPerformed", function(){
+ wikiHomeView.show();
+ });
+ this.addControl(caption);
+
+ // add components for history items, up to today
+
+ this.todayControl = new ContentPanel(null, "Last 24 hours", "", true, true);
+ this.todayControl.setContent(this.renderHistoryContent(now-MILLIS_IN_A_DAY, now));
+ this.addControl(this.todayControl);
+ var weekControl = new ContentPanel(null, "Last 7 days", "", true, false);
+ weekControl.setContent(this.renderHistoryContent(now-7*MILLIS_IN_A_DAY,now-MILLIS_IN_A_DAY));
+ this.addControl(weekControl);
+ var moreControl = new ContentPanel(null, "More than 7 days", "", true, false);
+ moreControl.setContent(this.renderHistoryContent(0,now-7*MILLIS_IN_A_DAY));
+ this.addControl(moreControl);
+ } else {
+ // render only today
+ this.todayControl.setContent(this.renderHistoryContent(now-MILLIS_IN_A_DAY, now));
+ }
+
+ this.lastRender = now;
+}
+
+HistoryView.prototype.renderHistoryContent = function (from , to) {
+ var buf = "<table class='historytable'>";
+ for ( var i = this.endindex ; i >= this.startindex ; i -- ) {
+ var ind = i - this.startindex;
+ if ( this.items[ind] == undefined || this.items[ind] == null ) continue;
+ if ( this.items[ind].timestamp < from ) break;
+ if ( this.items[ind].timestamp < to ) {
+ buf += this.renderHistoryItem(this.items[ind]);
+ }
+ }
+ buf += "</table>"
+ return buf;
+}
+
+HistoryView.prototype.renderHistoryItem = function(item){
+ if ( item == undefined || item == null ) return "";
+ var buf = "<tr><td><small>";
+ buf += shortFormatTime(item.timestamp);
+ buf += "</small></td><td width=70%>";
+ buf += "<div class=\"FeedItemLink\">";
+ buf += "<a href=\"JavaScript:void(0)\" onclick=\"event.stopPropagation();wikiHistoryView.goTo(" ;
+ buf += item.pos;
+ buf += "); return false;\">";
+ buf += "<strong>";
+ buf += shorten(item.articleTitle, 30);
+ buf += "</strong></a>";
+ buf += "</div>";
+ buf += "</td><td><div class=\"FeedItemLink\">";
+ buf += "<a href=\"JavaScript:void(0)\" onclick=\"event.stopPropagation();wikiHistoryView.deleteItem(" ;
+ buf += item.pos;
+ buf += "); return false;\">";
+ buf += "<img src=delete.png border=0></a>";
+ buf += "</div>";
+ buf += "</td></tr>";
+ return buf;
+}
+
+HistoryView.prototype.deleteItem = function(pos){
+ this.items[pos-this.startindex] = null;
+ if ( window.widget ) {
+ widget.setPreferenceForKey(null, getHistoryTitleKey(pos));
+ if (KEEP_CONTENT) {
+ widget.setPreferenceForKey(null, getHistoryContentKey(pos));
+ }
+ widget.setPreferenceForKey(null, getHistoryBaseKey(pos));
+ widget.setPreferenceForKey(null, getHistoryTimeKey(pos));
+ this.storeIndex();
+ }
+ this.lastRender = 0;
+ this.render();
+}
+
+HistoryView.prototype.show = function(){
+ try {
+ this.render();
+ }catch(e){ alert(e);}
+ View.prototype.show.call(this);
+}
+
+HistoryView.prototype.goTo = function(pos){
+ this.current = pos;
+ wikiBrowse(this.items[pos-this.startindex].articleTitle, true, this.items[pos-this.startindex].articleBase); // true means don't re-add to history
+}
+
+HistoryView.prototype.go = function(offset){
+ var newcurrent = this.current + offset;
+ var idx = newcurrent-this.startindex;
+ if ( newcurrent >= this.startindex && newcurrent <= this.endindex
+ && idx >= 0 && this.items[idx] != undefined && this.items[idx] != null ) {
+ this.current = newcurrent;
+ wikiBrowse(this.items[idx].articleTitle, true, this.items[idx].articleBase);
+ }
+}
+
+HistoryView.prototype.hasNext = function(){
+ var newidx = this.current + 1;
+ return ( newidx < this.endindex && this.items[newidx] != undefined && this.items[newidx] != null );
+}
+
+// abstract function for updating per-view menu
+// only called if window.widget is defined
+HistoryView.prototype.setupMenu = function(){
+ if ( window.widget ) {
+ menu.clear();
+ var clearMenuItem = new MenuItem("Clear", MENU_ITEM_HISTORY_CLEAR);
+ var self = this;
+ clearMenuItem.onSelect = function(){self.clear();};
+ menu.append(clearMenuItem);
+
+ var self = this;
+ var searchMenuItem = new MenuItem("Search", MENU_ITEM_MAIN_SEARCH);
+ searchMenuItem.onSelect = function(){wikiHomeView.show();};
+ menu.append(searchMenuItem);
+ var historyMenuItem = new MenuItem("History", MENU_ITEM_MAIN_HISTORY);
+ historyMenuItem.onSelect = function(){wikiHistoryView.previousView = self; wikiHistoryView.show();};
+ menu.append(historyMenuItem);
+ var bookmarksMenuItem = new MenuItem("Bookmarks", MENU_ITEM_MAIN_BOOKMARKS);
+ bookmarksMenuItem.onSelect = function(){wikiBookmarksView.show();};
+ menu.append(bookmarksMenuItem);
+
+ addHelpMenuItems();
+ }
+}
+
+
+function getHistoryKeyBase(pos) {
+ return "hist." + pos + ".";
+}
+
+function getHistoryTitleKey(pos) {
+ return getHistoryKeyBase(pos) + "title";
+}
+
+function getHistoryContentKey(pos) {
+ return getHistoryKeyBase(pos) + "content";
+}
+
+function getHistoryBaseKey(pos) {
+ return getHistoryKeyBase(pos) + "base";
+}
+
+function getHistoryTimeKey(pos) {
+ return getHistoryKeyBase(pos) + "time";
+}
+
+
+//HistoryView.prototype.removeItem = function(articleTitle){
+// // find index
+// var ind = this.findItemIdFromTitle(articleTitle)
+// if ( ind == -1 ) {
+// return;
+// }
+//
+// // remove item
+// this.items[ind-this.startindex] = null;
+// if (window.widget) {
+// widget.setPreferenceForKey(null, getHistoryTitleKey(ind));
+// if (KEEP_CONTENT) {
+// widget.setPreferenceForKey(null, getHistoryContentKey(ind));
+// }
+// widget.setPreferenceForKey(null, getHistoryTimeKey(ind));
+// }
+// this.current = ind;
+// this.endindex = ind;
+// this.render();
+//}
+
+//HistoryView.prototype.findItemIdFromTitle = function(title) {
+// var ind = -1;
+// for ( var i = this.startindex ; i < this.endindex + 1 ; i ++ ) {
+// var arrind = i-this.startindex;
+// if ( this.items[arrind] && this.items[arrind] != null && title == this.items[arrind].articleTitle) {
+// ind = i;
+// break;
+// }
+// }
+// return ind;
+//}
+// return already downloaded content for an article or null
+// if we don't have it
+//HistoryView.prototype.getContentForArticle = function(articleTitle){
+// if (window.widget && KEEP_CONTENT) {
+// var i = this.findItemIdFromTitle(articleTitle);
+// return widget.preferenceForKey(getHistoryContentKey(i));
+// }
+// return null;
+//}
+