yocto-reader/0000755000004100000000000000000011123745471012733 5ustar www-datarootyocto-reader/reader/0000755000004100000000000000000010735421664014200 5ustar www-datarootyocto-reader/reader/fsm.js0000644000004100000000000001452710735421006015322 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ var stateList = 'List'; var stateSettings = 'Settings'; var stateHome = 'Home'; var stateFeedDiscovery = 'FeedDiscovery'; var StateSearchResults = 'SearchResults'; var stateTrends = 'Trends'; var stateHomeView = 'HomeView'; var stateListView = 'ListView'; var stateTrendsView = 'TrendsView'; var stateItem = 'Item'; var stateSubs = 'Subscriptions'; var StateMachine = Class.create(); StateMachine.prototype = { initialize: function(startState, stateTable) { this.state = startState; this.table = stateTable; }, handleEvent: function(evt, elem, data) { this.elem = elem; var table = this.table[this.state]; if (this.logEvent) { this.logEvent(evt, elem,data); } try { this[table[evt]](evt, data); } catch(e) { alert('Invalid event [' + evt + '] in state ' + this.state + '\n' + e.message + e.stack + '\n\n'); } } } var ReaderFSM = { '_name': 'Reader', 'List' : { 'evOpen' : 'open', 'evHome' : 'home', 'evAddSub' : 'quickadd', 'evRefresh' : 'refresh', 'evBrowse' : 'browse', 'evAllItems' : 'allitems', 'evSubscriptionTitle' : 'openFeedEvent', 'evSortUpDatedorAll' : 'sortUpdatedOrAll', 'evTrends' : 'trends', 'evTagTitle' : 'openTagEvent', 'evStarred' : 'openStarredEvent', 'evShared' : 'openSharedEvent', 'evSettings' : 'showSettings', 'evSettingsView' : 'showSettings', 'evClose' : 'close' }, 'Settings' : { 'evRefresh' : 'refresh', 'evSettings' : 'showSettings', 'evSettingsView' : 'showSettings', 'evSubTab' : 'settingsSubTab', 'evPrefTab' : 'settingsPrefTab', 'evTagTab' : 'settingsTagTab', 'evGoodiesTab' : 'settingsGoodiesTab', 'evImexportTab' : 'settingsImexportTab', 'evReturnToReader' : 'returnToReader', 'displaySubList' : 'displaySubList', 'displayTagList' : 'displayTagList', /* * These events dont make sense since they are dependant on * a sequence of actions not captured in the state diagrams. * Example - rename involves displaying the rename box and * pressing OK. * So instead of blindly implementing these event handles * that dont make sense, I have indicated the events in the * actual UI handles. */ /* 'evFilter' : 'subsFilter', 'evRename' : 'subsRename', 'evAddTag' : 'subsAddTag', 'evDelete' : 'subsDelete', 'evTagSeleceted' : 'subsTagSelected', 'evDeleteSelected' : 'subsDeleteSelected', 'evSelect' : 'subsSelect', */ 'evRevert' : 'prefsRevert', 'evSetHome' : 'prefsSetHome', 'evScrollTracking' : 'prefsScrollTracking', 'evExImportToOPML' : 'importExport', 'evResource' : 'goodies', 'evSettingsView' : 'showSettings' } }; var RVFSM_events = { // 'evHomeView' : 'homeview', 'evRefresh' : 'refresh', 'evListView' : 'listview', 'evToggleExpanded': 'toggleExpanded', // 'evSearchFeeds': 'searchfeedsview', // 'evBrowse' : 'browseFeeds', // 'evTrendsView' : 'trendsview' // Home 'evDevBlog' : 'openDevBlog', 'evTip' : 'openTips', 'displayTips' : 'displayTips', 'displayUnread' : 'displayUnread', 'displayRecently': 'displayRecently', // FeedDiscovery 'evAddBlog' : 'addblog', // xxx 'evTag' : 'showbundle', 'evSubscribe' : 'addBundleOrFeed', 'evSearch' : 'searchInBrowse', 'evClose' : 'close', 'displayBundles' : 'displayBundles', 'evImport' : 'showImport', // SearchResults 'doSearch' : 'doSearch', 'evReturnToFD' : 'returnToFD', 'evSubSubscribed': 'searchFeedSubscribed', 'evView' : 'openSubscribedFeed', 'evUnsubscribe' : 'removeSubscribedFeed', // RV.LV.SU 'evRename' : 'renameCurrentFeed', 'evDelete' : 'deleteCurrentFeed', // IV 'evFrom' : 'openFeedForItem', 'evGoto' : 'openItemSite', 'evEmail' : 'openItemEmail', 'evAddTag' : 'itemEditTags' }; var RVFSM = { '_name': 'ReaderViewer', 'ListView' : RVFSM_events, 'HomeView' : RVFSM_events, 'TrendsView' : RVFSM_events }; var STFSM = { '_name': 'Settings', 'SubsView' : { } }; var StateVars = { SortString: false, // --- from here SubscriptionView: false, HomeView: false, SearchResultsView: false, FeedDiscoveryView: false, AllItemsView: false, TrendsView: false, TagView: false, SharedView: false, FeedDiscoveryView: false, // -- to here - incorporated as ReaderViewer.viewtype HomePage: false, PreviousView: false, // --- from here SubView: false, PrefView: false, TagView: false, GoodiesView: false, ImexportView: false, ImexportView: false, // -- to here - incorporated as Settings.viewtype Title: false, Date: false, NumItems: false, NumRead: false, Link: false, Read: false, Shared: false, Starred: false, NumTags: false, NumSubscriptions: false }; yocto-reader/reader/jquery.js0000644000004100000000000016656610735421006016067 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /* prevent execution of jQuery if included more than once */ if(typeof window.jQuery == "undefined") { /* * jQuery 1.1.2 - New Wave Javascript * * Copyright (c) 2007 John Resig (jquery.com) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * $Date: 2007-02-28 12:03:00 -0500 (Wed, 28 Feb 2007) $ * $Rev: 1465 $ */ // Global undefined variable window.undefined = window.undefined; var jQuery = function(a,c) { // If the context is global, return a new object if ( window == this ) return new jQuery(a,c); // Make sure that a selection was provided a = a || document; // HANDLE: $(function) // Shortcut for document ready if ( jQuery.isFunction(a) ) return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); // Handle HTML strings if ( typeof a == "string" ) { // HANDLE: $(html) -> $(array) var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a); if ( m ) a = jQuery.clean( [ m[1] ] ); // HANDLE: $(expr) else return new jQuery( c ).find( a ); } return this.setArray( // HANDLE: $(array) a.constructor == Array && a || // HANDLE: $(arraylike) // Watch for when an array-like object is passed as the selector (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || // HANDLE: $(*) [ a ] ); }; // Map over the $ in case of overwrite if ( typeof $ != "undefined" ) jQuery._$ = $; // Map the jQuery namespace to the '$' one var $ = jQuery; jQuery.fn = jQuery.prototype = { jquery: "1.1.2", size: function() { return this.length; }, length: 0, get: function( num ) { return num == undefined ? // Return a 'clean' array jQuery.makeArray( this ) : // Return just the object this[num]; }, pushStack: function( a ) { var ret = jQuery(a); ret.prevObject = this; return ret; }, setArray: function( a ) { this.length = 0; [].push.apply( this, a ); return this; }, each: function( fn, args ) { return jQuery.each( this, fn, args ); }, index: function( obj ) { var pos = -1; this.each(function(i){ if ( this == obj ) pos = i; }); return pos; }, attr: function( key, value, type ) { var obj = key; // Look for the case where we're accessing a style value if ( key.constructor == String ) if ( value == undefined ) return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; else { obj = {}; obj[ key ] = value; } // Check to see if we're setting style values return this.each(function(index){ // Set all the styles for ( var prop in obj ) jQuery.attr( type ? this.style : this, prop, jQuery.prop(this, obj[prop], type, index, prop) ); }); }, css: function( key, value ) { return this.attr( key, value, "curCSS" ); }, text: function(e) { if ( typeof e == "string" ) return this.empty().append( document.createTextNode( e ) ); var t = ""; jQuery.each( e || this, function(){ jQuery.each( this.childNodes, function(){ if ( this.nodeType != 8 ) t += this.nodeType != 1 ? this.nodeValue : jQuery.fn.text([ this ]); }); }); return t; }, wrap: function() { // The elements to wrap the target around var a = jQuery.clean(arguments); // Wrap each of the matched elements individually return this.each(function(){ // Clone the structure that we're using to wrap var b = a[0].cloneNode(true); // Insert it before the element to be wrapped this.parentNode.insertBefore( b, this ); // Find the deepest point in the wrap structure while ( b.firstChild ) b = b.firstChild; // Move the matched element to within the wrap structure b.appendChild( this ); }); }, append: function() { return this.domManip(arguments, true, 1, function(a){ this.appendChild( a ); }); }, prepend: function() { return this.domManip(arguments, true, -1, function(a){ this.insertBefore( a, this.firstChild ); }); }, before: function() { return this.domManip(arguments, false, 1, function(a){ this.parentNode.insertBefore( a, this ); }); }, after: function() { return this.domManip(arguments, false, -1, function(a){ this.parentNode.insertBefore( a, this.nextSibling ); }); }, end: function() { return this.prevObject || jQuery([]); }, // CK andSelf: function() { return this.add( this.prevObject ); }, find: function(t) { return this.pushStack( jQuery.map( this, function(a){ return jQuery.find(t,a); }), t ); }, clone: function(deep) { return this.pushStack( jQuery.map( this, function(a){ var a = a.cloneNode( deep != undefined ? deep : true ); a.$events = null; // drop $events expando to avoid firing incorrect events return a; }) ); }, filter: function(t) { return this.pushStack( jQuery.isFunction( t ) && jQuery.grep(this, function(el, index){ return t.apply(el, [index]) }) || jQuery.multiFilter(t,this) ); }, not: function(t) { return this.pushStack( t.constructor == String && jQuery.multiFilter(t, this, true) || jQuery.grep(this, function(a) { return ( t.constructor == Array || t.jquery ) ? jQuery.inArray( a, t ) < 0 : a != t; }) ); }, add: function(t) { return this.pushStack( jQuery.merge( this.get(), t.constructor == String ? jQuery(t).get() : t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ? t : [t] ) ); }, is: function(expr) { return expr ? jQuery.filter(expr,this).r.length > 0 : false; }, val: function( val ) { return val == undefined ? ( this.length ? this[0].value : null ) : this.attr( "value", val ); }, html: function( val ) { return val == undefined ? ( this.length ? this[0].innerHTML : null ) : this.empty().append( val ); }, domManip: function(args, table, dir, fn){ var clone = this.length > 1; var a = jQuery.clean(args); if ( dir < 0 ) a.reverse(); return this.each(function(){ var obj = this; if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); jQuery.each( a, function(){ fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); }); }); } }; jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object var target = arguments[0], a = 1; // extend jQuery itself if only one argument is passed if ( arguments.length == 1 ) { target = this; a = 0; } var prop; while (prop = arguments[a++]) // Extend the base object for ( var i in prop ) target[i] = prop[i]; // Return the modified object return target; }; jQuery.extend({ noConflict: function() { if ( jQuery._$ ) $ = jQuery._$; return jQuery; }, // This may seem like some crazy code, but trust me when I say that this // is the only cross-browser way to do this. --John isFunction: function( fn ) { return !!fn && typeof fn != "string" && !fn.nodeName && typeof fn[0] == "undefined" && /function/i.test( fn + "" ); }, // check if an element is in a XML document isXMLDoc: function(elem) { return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); }, // args is for internal usage only each: function( obj, fn, args ) { if ( obj.length == undefined ) for ( var i in obj ) fn.apply( obj[i], args || [i, obj[i]] ); else for ( var i = 0, ol = obj.length; i < ol; i++ ) if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; return obj; }, prop: function(elem, value, type, index, prop){ // Handle executable functions if ( jQuery.isFunction( value ) ) value = value.call( elem, [index] ); // exclude the following css properties to add px var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; // Handle passing in a number to a CSS property return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ? value + "px" : value; }, className: { // internal only, use addClass("class") add: function( elem, c ){ jQuery.each( c.split(/\s+/), function(i, cur){ if ( !jQuery.className.has( elem.className, cur ) ) elem.className += ( elem.className ? " " : "" ) + cur; }); }, // internal only, use removeClass("class") remove: function( elem, c ){ elem.className = c ? jQuery.grep( elem.className.split(/\s+/), function(cur){ return !jQuery.className.has( c, cur ); }).join(" ") : ""; }, // internal only, use is(".class") has: function( t, c ) { t = t.className || t; // escape regex characters c = c.replace(/([\.\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1"); return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t ); } }, swap: function(e,o,f) { for ( var i in o ) { e.style["old"+i] = e.style[i]; e.style[i] = o[i]; } f.apply( e, [] ); for ( var i in o ) e.style[i] = e.style["old"+i]; }, css: function(e,p) { if ( p == "height" || p == "width" ) { var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; jQuery.each( d, function(){ old["padding" + this] = 0; old["border" + this + "Width"] = 0; }); jQuery.swap( e, old, function() { if (jQuery.css(e,"display") != "none") { oHeight = e.offsetHeight; oWidth = e.offsetWidth; } else { e = jQuery(e.cloneNode(true)) .find(":radio").removeAttr("checked").end() .css({ visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" }).appendTo(e.parentNode)[0]; var parPos = jQuery.css(e.parentNode,"position"); if ( parPos == "" || parPos == "static" ) e.parentNode.style.position = "relative"; oHeight = e.clientHeight; oWidth = e.clientWidth; if ( parPos == "" || parPos == "static" ) e.parentNode.style.position = "static"; e.parentNode.removeChild(e); } }); return p == "height" ? oHeight : oWidth; } return jQuery.curCSS( e, p ); }, curCSS: function(elem, prop, force) { var ret; if (prop == "opacity" && jQuery.browser.msie) return jQuery.attr(elem.style, "opacity"); if (prop == "float" || prop == "cssFloat") prop = jQuery.browser.msie ? "styleFloat" : "cssFloat"; if (!force && elem.style[prop]) ret = elem.style[prop]; else if (document.defaultView && document.defaultView.getComputedStyle) { if (prop == "cssFloat" || prop == "styleFloat") prop = "float"; prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); var cur = document.defaultView.getComputedStyle(elem, null); if ( cur ) ret = cur.getPropertyValue(prop); else if ( prop == "display" ) ret = "none"; else jQuery.swap(elem, { display: "block" }, function() { var c = document.defaultView.getComputedStyle(this, ""); ret = c && c.getPropertyValue(prop) || ""; }); } else if (elem.currentStyle) { var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; } return ret; }, clean: function(a) { var r = []; jQuery.each( a, function(i,arg){ if ( !arg ) return; if ( arg.constructor == Number ) arg = arg.toString(); // Convert html string into DOM nodes if ( typeof arg == "string" ) { // Trim whitespace, otherwise indexOf won't work as expected var s = jQuery.trim(arg), div = document.createElement("div"), tb = []; var wrap = // option or optgroup !s.indexOf("", ""] || (!s.indexOf("", ""] || !s.indexOf("", ""] || // matched above (!s.indexOf("", ""] || [0,"",""]; // Go to html and back, then peel off extra wrappers div.innerHTML = wrap[1] + s + wrap[2]; // Move to the right depth while ( wrap[0]-- ) div = div.firstChild; // Remove IE's autoinserted from table fragments if ( jQuery.browser.msie ) { // String was a , *may* have spurious if ( !s.indexOf(" or else if ( wrap[1] == "
" && s.indexOf("= 0 ; --n ) if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length ) tb[n].parentNode.removeChild(tb[n]); } arg = []; for (var i=0, l=div.childNodes.length; im[3]-0", nth: "m[3]-0==i", eq: "m[3]-0==i", first: "i==0", last: "i==r.length-1", even: "i%2==0", odd: "i%2", // Child Checks "nth-child": "jQuery.nth(a.parentNode.firstChild,m[3],'nextSibling',a)==a", "first-child": "jQuery.nth(a.parentNode.firstChild,1,'nextSibling')==a", "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a", "only-child": "jQuery.sibling(a.parentNode.firstChild).length==1", // Parent Checks parent: "a.firstChild", empty: "!a.firstChild", // Text Check contains: "jQuery.fn.text.apply([a]).indexOf(m[3])>=0", // Visibility visible: 'a.type!="hidden"&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"', hidden: 'a.type=="hidden"||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"', // Form attributes enabled: "!a.disabled", disabled: "a.disabled", checked: "a.checked", selected: "a.selected||jQuery.attr(a,'selected')", // Form elements text: "a.type=='text'", radio: "a.type=='radio'", checkbox: "a.type=='checkbox'", file: "a.type=='file'", password: "a.type=='password'", submit: "a.type=='submit'", image: "a.type=='image'", reset: "a.type=='reset'", button: 'a.type=="button"||jQuery.nodeName(a,"button")', input: "/input|select|textarea|button/i.test(a.nodeName)" }, ".": "jQuery.className.has(a,m[2])", "@": { "=": "z==m[4]", "!=": "z!=m[4]", "^=": "z&&!z.indexOf(m[4])", "$=": "z&&z.substr(z.length - m[4].length,m[4].length)==m[4]", "*=": "z&&z.indexOf(m[4])>=0", "": "z", _resort: function(m){ return ["", m[1], m[3], m[2], m[5]]; }, _prefix: "z=a[m[3]];if(!z||/href|src/.test(m[3]))z=jQuery.attr(a,m[3]);" }, "[": "jQuery.find(m[2],a).length" }, // The regular expressions that power the parsing engine parse: [ // Match: [@value='test'], [@foo] /^\[ *(@)([a-z0-9_-]*) *([!*$^=]*) *('?"?)(.*?)\4 *\]/i, // Match: [div], [div p] /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/, // Match: :contains('foo') /^(:)([a-z0-9_-]*)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/i, // Match: :even, :last-chlid /^([:.#]*)([a-z0-9_*-]*)/i ], token: [ /^(\/?\.\.)/, "a.parentNode", /^(>|\/)/, "jQuery.sibling(a.firstChild)", /^(\+)/, "jQuery.nth(a,2,'nextSibling')", /^(~)/, function(a){ var s = jQuery.sibling(a.parentNode.firstChild); return s.slice(jQuery.inArray(a,s) + 1); } ], multiFilter: function( expr, elems, not ) { var old, cur = []; while ( expr && expr != old ) { old = expr; var f = jQuery.filter( expr, elems, not ); expr = f.t.replace(/^\s*,\s*/, "" ); cur = not ? elems = f.r : jQuery.merge( cur, f.r ); } return cur; }, find: function( t, context ) { // Quickly handle non-string expressions if ( typeof t != "string" ) return [ t ]; // Make sure that the context is a DOM Element if ( context && !context.nodeType ) context = null; // Set the correct context (if none is provided) context = context || document; // Handle the common XPath // expression if ( !t.indexOf("//") ) { context = context.documentElement; t = t.substr(2,t.length); // And the / root expression } else if ( !t.indexOf("/") ) { context = context.documentElement; t = t.substr(1,t.length); if ( t.indexOf("/") >= 1 ) t = t.substr(t.indexOf("/"),t.length); } // Initialize the search var ret = [context], done = [], last = null; // Continue while a selector expression exists, and while // we're no longer looping upon ourselves while ( t && last != t ) { var r = []; last = t; t = jQuery.trim(t).replace( /^\/\//i, "" ); var foundToken = false; // An attempt at speeding up child selectors that // point to a specific element tag var re = /^[\/>]\s*([a-z0-9*-]+)/i; var m = re.exec(t); if ( m ) { // Perform our own iteration and filter jQuery.each( ret, function(){ for ( var c = this.firstChild; c; c = c.nextSibling ) if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) ) r.push( c ); }); ret = r; t = t.replace( re, "" ); if ( t.indexOf(" ") == 0 ) continue; foundToken = true; } else { // Look for pre-defined expression tokens for ( var i = 0; i < jQuery.token.length; i += 2 ) { // Attempt to match each, individual, token in // the specified order var re = jQuery.token[i]; var m = re.exec(t); // If the token match was found if ( m ) { // Map it against the token's handler r = ret = jQuery.map( ret, jQuery.isFunction( jQuery.token[i+1] ) ? jQuery.token[i+1] : function(a){ return eval(jQuery.token[i+1]); }); // And remove the token t = jQuery.trim( t.replace( re, "" ) ); foundToken = true; break; } } } // See if there's still an expression, and that we haven't already // matched a token if ( t && !foundToken ) { // Handle multiple expressions if ( !t.indexOf(",") ) { // Clean the result set if ( ret[0] == context ) ret.shift(); // Merge the result sets jQuery.merge( done, ret ); // Reset the context r = ret = [context]; // Touch up the selector string t = " " + t.substr(1,t.length); } else { // Optomize for the case nodeName#idName var re2 = /^([a-z0-9_-]+)(#)([a-z0-9\\*_-]*)/i; var m = re2.exec(t); // Re-organize the results, so that they're consistent if ( m ) { m = [ 0, m[2], m[3], m[1] ]; } else { // Otherwise, do a traditional filter check for // ID, class, and element selectors re2 = /^([#.]?)([a-z0-9\\*_-]*)/i; m = re2.exec(t); } // Try to do a global search by ID, where we can if ( m[1] == "#" && ret[ret.length-1].getElementById ) { // Optimization for HTML document case var oid = ret[ret.length-1].getElementById(m[2]); // Do a quick check for the existence of the actual ID attribute // to avoid selecting by the name attribute in IE if ( jQuery.browser.msie && oid && oid.id != m[2] ) oid = jQuery('[@id="'+m[2]+'"]', ret[ret.length-1])[0]; // Do a quick check for node name (where applicable) so // that div#foo searches will be really fast ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; } else { // Pre-compile a regular expression to handle class searches if ( m[1] == "." ) var rec = new RegExp("(^|\\s)" + m[2] + "(\\s|$)"); // We need to find all descendant elements, it is more // efficient to use getAll() when we are already further down // the tree - we try to recognize that here jQuery.each( ret, function(){ // Grab the tag name being searched for var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; // Handle IE7 being really dumb about s if ( jQuery.nodeName(this, "object") && tag == "*" ) tag = "param"; jQuery.merge( r, m[1] != "" && ret.length != 1 ? jQuery.getAll( this, [], m[1], m[2], rec ) : this.getElementsByTagName( tag ) ); }); // It's faster to filter by class and be done with it if ( m[1] == "." && ret.length == 1 ) r = jQuery.grep( r, function(e) { return rec.test(e.className); }); // Same with ID filtering if ( m[1] == "#" && ret.length == 1 ) { // Remember, then wipe out, the result set var tmp = r; r = []; // Then try to find the element with the ID jQuery.each( tmp, function(){ if ( this.getAttribute("id") == m[2] ) { r = [ this ]; return false; } }); } ret = r; } t = t.replace( re2, "" ); } } // If a selector string still exists if ( t ) { // Attempt to filter it var val = jQuery.filter(t,r); ret = r = val.r; t = jQuery.trim(val.t); } } // Remove the root context if ( ret && ret[0] == context ) ret.shift(); // And combine the results jQuery.merge( done, ret ); return done; }, filter: function(t,r,not) { // Look for common filter expressions while ( t && /^[a-z[({<*:.#]/i.test(t) ) { var p = jQuery.parse, m; jQuery.each( p, function(i,re){ // Look for, and replace, string-like sequences // and finally build a regexp out of it m = re.exec( t ); if ( m ) { // Remove what we just matched t = t.substring( m[0].length ); // Re-organize the first match if ( jQuery.expr[ m[1] ]._resort ) m = jQuery.expr[ m[1] ]._resort( m ); return false; } }); // :not() is a special case that can be optimized by // keeping it out of the expression list if ( m[1] == ":" && m[2] == "not" ) r = jQuery.filter(m[3], r, true).r; // Handle classes as a special case (this will help to // improve the speed, as the regexp will only be compiled once) else if ( m[1] == "." ) { var re = new RegExp("(^|\\s)" + m[2] + "(\\s|$)"); r = jQuery.grep( r, function(e){ return re.test(e.className || ""); }, not); // Otherwise, find the expression to execute } else { var f = jQuery.expr[m[1]]; if ( typeof f != "string" ) f = jQuery.expr[m[1]][m[2]]; // Build a custom macro to enclose it eval("f = function(a,i){" + ( jQuery.expr[ m[1] ]._prefix || "" ) + "return " + f + "}"); // Execute it against the current filter r = jQuery.grep( r, f, not ); } } // Return an array of filtered elements (r) // and the modified expression string (t) return { r: r, t: t }; }, getAll: function( o, r, token, name, re ) { for ( var s = o.firstChild; s; s = s.nextSibling ) if ( s.nodeType == 1 ) { var add = true; if ( token == "." ) add = s.className && re.test(s.className); else if ( token == "#" ) add = s.getAttribute("id") == name; if ( add ) r.push( s ); if ( token == "#" && r.length ) break; if ( s.firstChild ) jQuery.getAll( s, r, token, name, re ); } return r; }, parents: function( elem ){ var matched = []; var cur = elem.parentNode; while ( cur && cur != document ) { matched.push( cur ); cur = cur.parentNode; } return matched; }, dir: function( elem, dir ){ var matched = []; var cur = elem[dir]; while ( cur && cur != document ) { if ( cur.nodeType == 1 ) matched.push( cur ); cur = cur[dir]; } return matched; }, nth: function(cur,result,dir,elem){ result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType == 1 ) num++; if ( num == result || result == "even" && num % 2 == 0 && num > 1 && cur == elem || result == "odd" && num % 2 == 1 && cur == elem ) return cur; } }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType == 1 && (!elem || n != elem) ) r.push( n ); } return r; } }); /* * A number of helper functions used for managing events. * Many of the ideas behind this code orignated from * Dean Edwards' addEvent library. */ jQuery.event = { // Bind an event to an element // Original by Dean Edwards add: function(element, type, handler, data) { // For whatever reason, IE has trouble passing the window object // around, causing it to be cloned in the process if ( jQuery.browser.msie && element.setInterval != undefined ) element = window; // if data is passed, bind to handler if( data ) handler.data = data; // Make sure that the function being executed has a unique ID if ( !handler.guid ) handler.guid = this.guid++; // Init the element's event structure if (!element.$events) element.$events = {}; // Get the current list of functions bound to this event var handlers = element.$events[type]; // If it hasn't been initialized yet if (!handlers) { // Init the event handler queue handlers = element.$events[type] = {}; // Remember an existing handler, if it's already there if (element["on" + type]) handlers[0] = element["on" + type]; } // Add the function to the element's handler list handlers[handler.guid] = handler; // And bind the global event handler to the element element["on" + type] = this.handle; // Remember the function in a global list (for triggering) if (!this.global[type]) this.global[type] = []; this.global[type].push( element ); }, guid: 1, global: {}, // Detach an event or set of events from an element remove: function(element, type, handler) { if (element.$events) { var i,j,k; if ( type && type.type ) { // type is actually an event object here handler = type.handler; type = type.type; } if (type && element.$events[type]) // remove the given handler for the given type if ( handler ) delete element.$events[type][handler.guid]; // remove all handlers for the given type else for ( i in element.$events[type] ) delete element.$events[type][i]; // remove all handlers else for ( j in element.$events ) this.remove( element, j ); // remove event handler if no more handlers exist for ( k in element.$events[type] ) if (k) { k = true; break; } if (!k) element["on" + type] = null; } }, trigger: function(type, data, element) { // Clone the incoming data, if any data = jQuery.makeArray(data || []); // Handle a global trigger if ( !element ) jQuery.each( this.global[type] || [], function(){ jQuery.event.trigger( type, data, this ); }); // Handle triggering a single element else { var handler = element["on" + type ], val, fn = jQuery.isFunction( element[ type ] ); if ( handler ) { // Pass along a fake event data.unshift( this.fix({ type: type, target: element }) ); // Trigger the event if ( (val = handler.apply( element, data )) !== false ) this.triggered = true; } if ( fn && val !== false ) element[ type ](); this.triggered = false; } }, handle: function(event) { // Handle the second event of a trigger and when // an event is called after a page has unloaded if ( typeof jQuery == "undefined" || jQuery.event.triggered ) return; // Empty object is for triggered events with no data event = jQuery.event.fix( event || window.event || {} ); // returned undefined or false var returnValue; var c = this.$events[event.type]; var args = [].slice.call( arguments, 1 ); args.unshift( event ); for ( var j in c ) { // Pass in a reference to the handler function itself // So that we can later remove it args[0].handler = c[j]; args[0].data = c[j].data; if ( c[j].apply( this, args ) === false ) { event.preventDefault(); event.stopPropagation(); returnValue = false; } } // Clean up added properties in IE to prevent memory leak if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null; return returnValue; }, fix: function(event) { // Fix target property, if necessary if ( !event.target && event.srcElement ) event.target = event.srcElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == undefined && event.clientX != undefined ) { var e = document.documentElement, b = document.body; event.pageX = event.clientX + (e.scrollLeft || b.scrollLeft); event.pageY = event.clientY + (e.scrollTop || b.scrollTop); } // check if target is a textnode (safari) if (jQuery.browser.safari && event.target.nodeType == 3) { // store a copy of the original event object // and clone because target is read only var originalEvent = event; event = jQuery.extend({}, originalEvent); // get parentnode from textnode event.target = originalEvent.target.parentNode; // add preventDefault and stopPropagation since // they will not work on the clone event.preventDefault = function() { return originalEvent.preventDefault(); }; event.stopPropagation = function() { return originalEvent.stopPropagation(); }; } // fix preventDefault and stopPropagation if (!event.preventDefault) event.preventDefault = function() { this.returnValue = false; }; if (!event.stopPropagation) event.stopPropagation = function() { this.cancelBubble = true; }; return event; } }; jQuery.fn.extend({ bind: function( type, data, fn ) { return this.each(function(){ jQuery.event.add( this, type, fn || data, data ); }); }, one: function( type, data, fn ) { return this.each(function(){ jQuery.event.add( this, type, function(event) { jQuery(this).unbind(event); return (fn || data).apply( this, arguments); }, data); }); }, unbind: function( type, fn ) { return this.each(function(){ jQuery.event.remove( this, type, fn ); }); }, trigger: function( type, data ) { return this.each(function(){ jQuery.event.trigger( type, data, this ); }); }, toggle: function() { // Save reference to arguments for access in closure var a = arguments; return this.click(function(e) { // Figure out which function to execute this.lastToggle = this.lastToggle == 0 ? 1 : 0; // Make sure that clicks stop e.preventDefault(); // and execute the function return a[this.lastToggle].apply( this, [e] ) || false; }); }, hover: function(f,g) { // A private function for handling mouse 'hovering' function handleHover(e) { // Check if mouse(over|out) are still within the same parent element var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; // Traverse up the tree while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; }; // If we actually just moused on to a sub-element, ignore it if ( p == this ) return false; // Execute the right function return (e.type == "mouseover" ? f : g).apply(this, [e]); } // Bind the function to the two event listeners return this.mouseover(handleHover).mouseout(handleHover); }, ready: function(f) { // If the DOM is already ready if ( jQuery.isReady ) // Execute the function immediately f.apply( document, [jQuery] ); // Otherwise, remember the function for later else { // Add the function to the wait list jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } ); } return this; } }); jQuery.extend({ /* * All the code that makes DOM Ready work nicely. */ isReady: false, readyList: [], // Handle when the DOM is ready ready: function() { // Make sure that the DOM is not already loaded if ( !jQuery.isReady ) { // Remember that the DOM is ready jQuery.isReady = true; // If there are functions bound, to execute if ( jQuery.readyList ) { // Execute all of them jQuery.each( jQuery.readyList, function(){ this.apply( document ); }); // Reset the list of functions jQuery.readyList = null; } // Remove event lisenter to avoid memory leak if ( jQuery.browser.mozilla || jQuery.browser.opera ) document.removeEventListener( "DOMContentLoaded", jQuery.ready, false ); } } }); new function(){ jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + "submit,keydown,keypress,keyup,error").split(","), function(i,o){ // Handle event binding jQuery.fn[o] = function(f){ return f ? this.bind(o, f) : this.trigger(o); }; }); // If Mozilla is used if ( jQuery.browser.mozilla || jQuery.browser.opera ) // Use the handy event callback document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); // If IE is used, use the excellent hack by Matthias Miller // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited else if ( jQuery.browser.msie ) { // Only works if you document.write() it document.write("<\/script>"); // Use the defer script hack var script = document.getElementById("__ie_init"); // script does not exist if jQuery is loaded dynamically if ( script ) script.onreadystatechange = function() { if ( this.readyState != "complete" ) return; this.parentNode.removeChild( this ); jQuery.ready(); }; // Clear from memory script = null; // If Safari is used } else if ( jQuery.browser.safari ) // Continually check to see if the document.readyState is valid jQuery.safariTimer = setInterval(function(){ // loaded and complete are both valid states if ( document.readyState == "loaded" || document.readyState == "complete" ) { // If either one are found, remove the timer clearInterval( jQuery.safariTimer ); jQuery.safariTimer = null; // and execute any waiting functions jQuery.ready(); } }, 10); // A fallback to window.onload, that will always work jQuery.event.add( window, "load", jQuery.ready ); }; // Clean up after IE to avoid memory leaks if (jQuery.browser.msie) jQuery(window).one("unload", function() { var global = jQuery.event.global; for ( var type in global ) { var els = global[type], i = els.length; if ( i && type != 'unload' ) do jQuery.event.remove(els[i-1], type); while (--i); } }); jQuery.fn.extend({ loadIfModified: function( url, params, callback ) { this.load( url, params, callback, 1 ); }, load: function( url, params, callback, ifModified ) { if ( jQuery.isFunction( url ) ) return this.bind("load", url); callback = callback || function(){}; // Default to a GET request var type = "GET"; // If the second parameter was provided if ( params ) // If it's a function if ( jQuery.isFunction( params ) ) { // We assume that it's the callback callback = params; params = null; // Otherwise, build a param string } else { params = jQuery.param( params ); type = "POST"; } var self = this; // Request the remote document jQuery.ajax({ url: url, type: type, data: params, ifModified: ifModified, complete: function(res, status){ if ( status == "success" || !ifModified && status == "notmodified" ) // Inject the HTML into all the matched elements self.attr("innerHTML", res.responseText) // Execute all the scripts inside of the newly-injected HTML .evalScripts() // Execute callback .each( callback, [res.responseText, status, res] ); else callback.apply( self, [res.responseText, status, res] ); } }); return this; }, serialize: function() { return jQuery.param( this ); }, evalScripts: function() { return this.find("script").each(function(){ if ( this.src ) jQuery.getScript( this.src ); else jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); }).end(); } }); // If IE is used, create a wrapper for the XMLHttpRequest object if ( !window.XMLHttpRequest ) XMLHttpRequest = function(){ return new ActiveXObject("Microsoft.XMLHTTP"); }; // Attach a bunch of functions for handling common AJAX events jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ jQuery.fn[o] = function(f){ return this.bind(o, f); }; }); jQuery.extend({ get: function( url, data, callback, type, ifModified ) { // shift arguments if data argument was ommited if ( jQuery.isFunction( data ) ) { callback = data; data = null; } return jQuery.ajax({ url: url, data: data, success: callback, dataType: type, ifModified: ifModified }); }, getIfModified: function( url, data, callback, type ) { return jQuery.get(url, data, callback, type, 1); }, getScript: function( url, callback ) { return jQuery.get(url, null, callback, "script"); }, getJSON: function( url, data, callback ) { return jQuery.get(url, data, callback, "json"); }, post: function( url, data, callback, type ) { if ( jQuery.isFunction( data ) ) { callback = data; data = {}; } return jQuery.ajax({ type: "POST", url: url, data: data, success: callback, dataType: type }); }, // timeout (ms) //timeout: 0, ajaxTimeout: function( timeout ) { jQuery.ajaxSettings.timeout = timeout; }, ajaxSetup: function( settings ) { jQuery.extend( jQuery.ajaxSettings, settings ); }, ajaxSettings: { global: true, type: "GET", timeout: 0, contentType: "application/x-www-form-urlencoded", processData: true, async: true, data: null }, // Last-Modified header cache for next request lastModified: {}, ajax: function( s ) { // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout s = jQuery.extend({}, jQuery.ajaxSettings, s); // if data available if ( s.data ) { // convert data if not already a string if (s.processData && typeof s.data != "string") s.data = jQuery.param(s.data); // append data to url for get requests if( s.type.toLowerCase() == "get" ) { // "?" + data or "&" + data (in case there are already params) s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data; // IE likes to send both get and post data, prevent this s.data = null; } } // Watch for a new set of requests if ( s.global && ! jQuery.active++ ) jQuery.event.trigger( "ajaxStart" ); var requestDone = false; // Create the request object var xml = new XMLHttpRequest(); // Open the socket xml.open(s.type, s.url, s.async); // Set the correct header, if data is being sent if ( s.data ) xml.setRequestHeader("Content-Type", s.contentType); // Set the If-Modified-Since header, if ifModified mode. if ( s.ifModified ) xml.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); // Set header so the called script knows that it's an XMLHttpRequest xml.setRequestHeader("X-Requested-With", "XMLHttpRequest"); // Make sure the browser sends the right content length if ( xml.overrideMimeType ) xml.setRequestHeader("Connection", "close"); // Allow custom headers/mimetypes if( s.beforeSend ) s.beforeSend(xml); if ( s.global ) jQuery.event.trigger("ajaxSend", [xml, s]); // Wait for a response to come back var onreadystatechange = function(isTimeout){ // The transfer is complete and the data is available, or the request timed out if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) { requestDone = true; // clear poll interval if (ival) { clearInterval(ival); ival = null; } var status; try { status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ? s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error"; // Make sure that the request was successful or notmodified if ( status != "error" ) { // Cache Last-Modified header, if ifModified mode. var modRes; try { modRes = xml.getResponseHeader("Last-Modified"); } catch(e) {} // swallow exception thrown by FF if header is not available if ( s.ifModified && modRes ) jQuery.lastModified[s.url] = modRes; // process the data (runs the xml through httpData regardless of callback) var data = jQuery.httpData( xml, s.dataType ); // If a local callback was specified, fire it and pass it the data if ( s.success ) s.success( data, status ); // Fire the global callback if( s.global ) jQuery.event.trigger( "ajaxSuccess", [xml, s] ); } else jQuery.handleError(s, xml, status); } catch(e) { status = "error"; jQuery.handleError(s, xml, status, e); } // The request was completed if( s.global ) jQuery.event.trigger( "ajaxComplete", [xml, s] ); // Handle the global AJAX counter if ( s.global && ! --jQuery.active ) jQuery.event.trigger( "ajaxStop" ); // Process result if ( s.complete ) s.complete(xml, status); // Stop memory leaks if(s.async) xml = null; } }; // don't attach the handler to the request, just poll it instead var ival = setInterval(onreadystatechange, 13); // Timeout checker if ( s.timeout > 0 ) setTimeout(function(){ // Check to see if the request is still happening if ( xml ) { // Cancel the request xml.abort(); if( !requestDone ) onreadystatechange( "timeout" ); } }, s.timeout); // Send the data try { xml.send(s.data); } catch(e) { jQuery.handleError(s, xml, null, e); } // firefox 1.5 doesn't fire statechange for sync requests if ( !s.async ) onreadystatechange(); // return XMLHttpRequest to allow aborting the request etc. return xml; }, handleError: function( s, xml, status, e ) { // If a local callback was specified, fire it if ( s.error ) s.error( xml, status, e ); // Fire the global callback if ( s.global ) jQuery.event.trigger( "ajaxError", [xml, s, e] ); }, // Counter for holding the number of active queries active: 0, // Determines if an XMLHttpRequest was successful or not httpSuccess: function( r ) { try { return !r.status && location.protocol == "file:" || ( r.status >= 200 && r.status < 300 ) || r.status == 304 || jQuery.browser.safari && r.status == undefined; } catch(e){} return false; }, // Determines if an XMLHttpRequest returns NotModified httpNotModified: function( xml, url ) { try { var xmlRes = xml.getResponseHeader("Last-Modified"); // Firefox always returns 200. check Last-Modified date return xml.status == 304 || xmlRes == jQuery.lastModified[url] || jQuery.browser.safari && xml.status == undefined; } catch(e){} return false; }, /* Get the data out of an XMLHttpRequest. * Return parsed XML if content-type header is "xml" and type is "xml" or omitted, * otherwise return plain text. * (String) data - The type of data that you're expecting back, * (e.g. "xml", "html", "script") */ httpData: function( r, type ) { var ct = r.getResponseHeader("content-type"); var data = !type && ct && ct.indexOf("xml") >= 0; data = type == "xml" || data ? r.responseXML : r.responseText; // If the type is "script", eval it in global context if ( type == "script" ) jQuery.globalEval( data ); // Get the JavaScript object, if JSON is used. if ( type == "json" ) eval( "data = " + data ); // evaluate scripts within html if ( type == "html" ) jQuery("
").html(data).evalScripts(); return data; }, // Serialize an array of form elements or a set of // key/values into a query string param: function( a ) { var s = []; // If an array was passed in, assume that it is an array // of form elements if ( a.constructor == Array || a.jquery ) // Serialize the form elements jQuery.each( a, function(){ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); }); // Otherwise, assume that it's an object of key/value pairs else // Serialize the key/values for ( var j in a ) // If the value is an array then the key names need to be repeated if ( a[j] && a[j].constructor == Array ) jQuery.each( a[j], function(){ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) ); }); else s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) ); // Return the resulting serialization return s.join("&"); }, // evalulates a script in global context // not reliable for safari globalEval: function( data ) { if ( window.execScript ) window.execScript( data ); else if ( jQuery.browser.safari ) // safari doesn't provide a synchronous global eval window.setTimeout( data, 0 ); else eval.call( window, data ); } }); jQuery.fn.extend({ show: function(speed,callback){ var hidden = this.filter(":hidden"); speed ? hidden.animate({ height: "show", width: "show", opacity: "show" }, speed, callback) : hidden.each(function(){ this.style.display = this.oldblock ? this.oldblock : ""; if ( jQuery.css(this,"display") == "none" ) this.style.display = "block"; }); return this; }, hide: function(speed,callback){ var visible = this.filter(":visible"); speed ? visible.animate({ height: "hide", width: "hide", opacity: "hide" }, speed, callback) : visible.each(function(){ this.oldblock = this.oldblock || jQuery.css(this,"display"); if ( this.oldblock == "none" ) this.oldblock = "block"; this.style.display = "none"; }); return this; }, // Save the old toggle function _toggle: jQuery.fn.toggle, toggle: function( fn, fn2 ){ var args = arguments; return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? this._toggle( fn, fn2 ) : this.each(function(){ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ] .apply( jQuery(this), args ); }); }, slideDown: function(speed,callback){ return this.animate({height: "show"}, speed, callback); }, slideUp: function(speed,callback){ return this.animate({height: "hide"}, speed, callback); }, slideToggle: function(speed, callback){ return this.each(function(){ var state = jQuery(this).is(":hidden") ? "show" : "hide"; jQuery(this).animate({height: state}, speed, callback); }); }, fadeIn: function(speed, callback){ return this.animate({opacity: "show"}, speed, callback); }, fadeOut: function(speed, callback){ return this.animate({opacity: "hide"}, speed, callback); }, fadeTo: function(speed,to,callback){ return this.animate({opacity: to}, speed, callback); }, animate: function( prop, speed, easing, callback ) { return this.queue(function(){ this.curAnim = jQuery.extend({}, prop); var opt = jQuery.speed(speed, easing, callback); for ( var p in prop ) { var e = new jQuery.fx( this, opt, p ); if ( prop[p].constructor == Number ) e.custom( e.cur(), prop[p] ); else e[ prop[p] ]( prop ); } }); }, queue: function(type,fn){ if ( !fn ) { fn = type; type = "fx"; } return this.each(function(){ if ( !this.queue ) this.queue = {}; if ( !this.queue[type] ) this.queue[type] = []; this.queue[type].push( fn ); if ( this.queue[type].length == 1 ) fn.apply(this); }); } }); jQuery.extend({ speed: function(speed, easing, fn) { var opt = speed && speed.constructor == Object ? speed : { complete: fn || !fn && easing || jQuery.isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && easing.constructor != Function && easing }; opt.duration = (opt.duration && opt.duration.constructor == Number ? opt.duration : { slow: 600, fast: 200 }[opt.duration]) || 400; // Queueing opt.old = opt.complete; opt.complete = function(){ jQuery.dequeue(this, "fx"); if ( jQuery.isFunction( opt.old ) ) opt.old.apply( this ); }; return opt; }, easing: {}, queue: {}, dequeue: function(elem,type){ type = type || "fx"; if ( elem.queue && elem.queue[type] ) { // Remove self elem.queue[type].shift(); // Get next function var f = elem.queue[type][0]; if ( f ) f.apply( elem ); } }, /* * I originally wrote fx() as a clone of moo.fx and in the process * of making it small in size the code became illegible to sane * people. You've been warned. */ fx: function( elem, options, prop ){ var z = this; // The styles var y = elem.style; // Store display property var oldDisplay = jQuery.css(elem, "display"); // Make sure that nothing sneaks out y.overflow = "hidden"; // Simple function for setting a style value z.a = function(){ if ( options.step ) options.step.apply( elem, [ z.now ] ); if ( prop == "opacity" ) jQuery.attr(y, "opacity", z.now); // Let attr handle opacity else if ( parseInt(z.now) ) // My hate for IE will never die y[prop] = parseInt(z.now) + "px"; y.display = "block"; // Set display property to block for animation }; // Figure out the maximum number to run to z.max = function(){ return parseFloat( jQuery.css(elem,prop) ); }; // Get the current size z.cur = function(){ var r = parseFloat( jQuery.curCSS(elem, prop) ); return r && r > -10000 ? r : z.max(); }; // Start an animation from one number to another z.custom = function(from,to){ z.startTime = (new Date()).getTime(); z.now = from; z.a(); z.timer = setInterval(function(){ z.step(from, to); }, 13); }; // Simple 'show' function z.show = function(){ if ( !elem.orig ) elem.orig = {}; // Remember where we started, so that we can go back to it later elem.orig[prop] = this.cur(); options.show = true; // Begin the animation z.custom(0, elem.orig[prop]); // Stupid IE, look what you made me do if ( prop != "opacity" ) y[prop] = "1px"; }; // Simple 'hide' function z.hide = function(){ if ( !elem.orig ) elem.orig = {}; // Remember where we started, so that we can go back to it later elem.orig[prop] = this.cur(); options.hide = true; // Begin the animation z.custom(elem.orig[prop], 0); }; //Simple 'toggle' function z.toggle = function() { if ( !elem.orig ) elem.orig = {}; // Remember where we started, so that we can go back to it later elem.orig[prop] = this.cur(); if(oldDisplay == "none") { options.show = true; // Stupid IE, look what you made me do if ( prop != "opacity" ) y[prop] = "1px"; // Begin the animation z.custom(0, elem.orig[prop]); } else { options.hide = true; // Begin the animation z.custom(elem.orig[prop], 0); } }; // Each step of an animation z.step = function(firstNum, lastNum){ var t = (new Date()).getTime(); if (t > options.duration + z.startTime) { // Stop the timer clearInterval(z.timer); z.timer = null; z.now = lastNum; z.a(); if (elem.curAnim) elem.curAnim[ prop ] = true; var done = true; for ( var i in elem.curAnim ) if ( elem.curAnim[i] !== true ) done = false; if ( done ) { // Reset the overflow y.overflow = ""; // Reset the display y.display = oldDisplay; if (jQuery.css(elem, "display") == "none") y.display = "block"; // Hide the element if the "hide" operation was done if ( options.hide ) y.display = "none"; // Reset the properties, if the item has been hidden or shown if ( options.hide || options.show ) for ( var p in elem.curAnim ) if (p == "opacity") jQuery.attr(y, p, elem.orig[p]); else y[p] = ""; } // If a callback was provided, execute it if ( done && jQuery.isFunction( options.complete ) ) // Execute the complete function options.complete.apply( elem ); } else { var n = t - this.startTime; // Figure out where in the animation we are and set the number var p = n / options.duration; // If the easing function exists, then use it z.now = options.easing && jQuery.easing[options.easing] ? jQuery.easing[options.easing](p, n, firstNum, (lastNum-firstNum), options.duration) : // else use default linear easing ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum; // Perform the next step of the animation z.a(); } }; } }); } yocto-reader/reader/rest.js0000644000004100000000000000520110735421010015472 0ustar www-datarootvar REST_root = 'http://backend.yocto.aminche.com/'; var REST_user = 'test'; function encodeParams(opcode, params) { if (!params) params = {}; var paramStr = opcode + '?user=' + REST_user; $.each(params, function(key, value) { paramStr += '&' + key + '=' + escape(value); }); return '/yocto-reader/rest/proxy.php?u=' + encodeURIComponent(REST_root + paramStr); } function REST_init() { var context = new AsyncContext(function() { alert('allDone'); }); context.addRequest(encodeParams('allFeeds'), function(json) { alert('returned: ' + json); }); context.fire(); } function AsyncContext() { this.requests = []; this.doneCount = 0; } AsyncContext.prototype.addRequest = function(url, callback) { this.requests.push({'url': url, 'callback' : callback}); } AsyncContext.prototype.fire = function() { var self = this; $.each(this.requests, function(i, req) { // alert(req.url); loadUrl(req.url, self._onDone.bind(self, i)); }) } AsyncContext.prototype.setOnComplete = function(fn) { this.onComplete = fn; } AsyncContext.prototype._onDone = function(i, reply) { this.requests[i].callback(reply.responseText); this.doneCount++; if (this.doneCount >= this.requests.length) { if (this.onComplete) this.onComplete(); } } function loadUrl (url, processingFunction, async) { async = true; // enableMozillaAccess () var httpRequestObj = null try { if (window.XMLHttpRequest) { httpRequestObj = new XMLHttpRequest () } else if (window.ActiveXObject) { httpRequestObj = new ActiveXObject ("Microsoft.XMLHTTP") } } catch(e) { alert(e.message); } if (httpRequestObj == null) { alert("You need browser with XMLHTTPRequest support.") throw("You need browser with XMLHTTPRequest support"); } httpRequestObj.onreadystatechange = function () {stateChange (httpRequestObj, processingFunction)} httpRequestObj.open ("GET", url, async) httpRequestObj.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); httpRequestObj.send ("") return httpRequestObj; } function stateChange (httpRequestObj, callBack) { if (httpRequestObj.readyState == 4) { if (httpRequestObj.status == 200 ) { if (callBack) callBack (httpRequestObj) } else { alert("Problem retrieving XML data " + httpRequestObj.status) } } } $(window).load(REST_init); yocto-reader/reader/feeddata.js0000644000004100000000000013016310735421005016264 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ function feed_load_dummy(url, fn) { var data = FTC_feedData[url]; var result = {status: {code: 404}}; if (data) { result.status.code = 200; result.feed = data.feed; } fn(result); } var google = {}; google.dummy = true; google.feeds = {}; google.feeds.Feed = Class.create(); google.feeds.Feed.prototype.initialize = function(feedurl) { this.url = feedurl; } google.load = function() { } google.setOnLoadCallback = function(fn) { $(window).load(reader_main); } google.feeds.findFeeds = function(query, callback) { var result = FTC_feedSearchData; result.status = {code: 200}; setTimeout(function(){callback(result)}, 200); } google.feeds.Feed.prototype.load = function(callback) { var url = this.url; setTimeout(function(){feed_load_dummy(url, callback)}, 200); } google.feeds.Feed.prototype.setNumEntries = function(num) { } var FTC_feedData = {}; /* * Return a time thats 'hours' hours behind 'now' */ function getPast(hours) { var d = new Date(); var dm = d.getTime(); var past = dm - hours*60*60*1000; var pastd = new Date(past); return pastd.toString(); } // Get a date with a single digit min for code coverage function getSpcDate() { var ds = getPast(1); var d = new Date(ds); d.setMinutes(5); return d.toString(); } FTC_feedData['http://rss.cnn.com/rss/cnn_topstories.rss'] = {"feed": {"title":"CNN.com", "link":"http://www.cnn.com/?eref\u003Drss_topstories", "author":"", "description":"CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.", "type":"rss20", "entries":[ {"title":"Simpson: Casino incident overblown","link":"http://rss.cnn.com/~r/rss/cnn_topstories/~3/156999937/index.html","author":"", // pubDate in recent past for testing (AM/PM) "publishedDate":getPast(2),"contentSnippet":"Former NFL star O.J. Simpson says he and one of the alleged victims of a robbery have spoken by telephone and agree the ...","content":"Former NFL star O.J. Simpson says he and one of the alleged victims of a robbery have spoken by telephone and agree the incident was blown out of proportion. Las Vegas police say no arrests have been made.\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?a\u003D8Js1vt\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?i\u003D8Js1vt\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DVuYro1as\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DVuYro1as\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DGDbEgwbK\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DGDbEgwbK\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DUeM5GH3B\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DUeM5GH3B\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DsV0zU32H\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DsV0zU32H\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DXIa7EegJ\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DXIa7EegJ\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~r/rss/cnn_topstories/~4/156999937\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E","categories":[]}, {"title":"Thousands protest Iraq war, 160 arrested","link":"http://rss.cnn.com/~r/rss/cnn_topstories/~3/157014496/index.html","author":"", // pubDate in recent past for testing (PM/AM) "publishedDate":getPast(14),"contentSnippet":"Read full story for latest details.\n\n \n","content":"Read full story for latest details.\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?a\u003Db8CJz3\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?i\u003Db8CJz3\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003D5eZxq3Ab\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003D5eZxq3Ab\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DHqIbyoXU\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DHqIbyoXU\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DXi5LUQhL\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DXi5LUQhL\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DgbpS4QAa\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DgbpS4QAa\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DhB32UeUF\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DhB32UeUF\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~r/rss/cnn_topstories/~4/157014496\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E","categories":[]}, {"title":"Report: Retired judge may replace Gonzales","link":"http://rss.cnn.com/~r/rss/cnn_topstories/~3/156946485/index.html","author":"", // Get a date with single hour / for code coverage "publishedDate":getSpcDate(),"contentSnippet":"A retired federal judge is a leading candidate to replace Attorney General Alberto Gonzales, whose last day on the job was ...","content":"A retired federal judge is a leading candidate to replace Attorney General Alberto Gonzales, whose last day on the job was Friday, two sources told CNN on Saturday. Michael B. Mukasey was nominated to the bench in 1988 by President Ronald Reagan.\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?a\u003DAVDuJG\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?i\u003DAVDuJG\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DCXNvBrOj\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DCXNvBrOj\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DXgTEyF76\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DXgTEyF76\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DJ9L5OSoF\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DJ9L5OSoF\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DP1slDKtt\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DP1slDKtt\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DQQRCo9cp\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DQQRCo9cp\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~r/rss/cnn_topstories/~4/156946485\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E","categories":[]}, {"title":"As hopes dim, Fossett search to be assessed","link":"http://rss.cnn.com/~r/rss/cnn_topstories/~3/157003819/index.html","author":"","publishedDate":"Sat, 15 Sep 2007 16:44:40 -0700","contentSnippet":"Read full story for latest details.\n\n \n","content":"Read full story for latest details.\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?a\u003Dc1eKV8\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~a/rss/cnn_topstories?i\u003Dc1eKV8\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DYp3zmTiH\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DYp3zmTiH\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DPxj9NPLL\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DPxj9NPLL\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DfKxlsibE\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DfKxlsibE\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DyXULsz2i\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DyXULsz2i\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?a\u003DWosFhnlY\u0022\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~f/rss/cnn_topstories?i\u003DWosFhnlY\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://rss.cnn.com/~r/rss/cnn_topstories/~4/157003819\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E","categories":[]} ]}}; FTC_feedData['http://technosophyunlimited.blogspot.com/atom.xml'] = {"feed": {"title":"Technosophy Unlimited", "link":"http://technosophyunlimited.blogspot.com/", "author":"Chandan Kudige", "description":"", "type":"atom10", "entries":[{"title":"M$ - Microsoft ? Myspace ?", "link":"http://technosophyunlimited.blogspot.com/2007/06/m-microsoft-myspace.html", "author":"Chandan Kudige", "publishedDate":"Tue, 26 Jun 2007 19:43:00 -0700", "contentSnippet":"Myspace has still been holding up, against all odds and all the predictions by sensible people, just defying the logic - how ...", "content":"Myspace has still been holding up, against all odds and all the predictions by sensible people, just defying the logic - how can something so crappy be still so popular ?\u003Cbr\u003E\u003Cbr\u003EAnd the moment we ask that question, we realize the error in our thinking. All it takes is to look back. But is being crappy the only thing thats similar between Myspace and Microsoft, or is there anything else we can learn and predict ?\u003Cbr\u003E\u003Cbr\u003EFirstly, believe it or not, both Microsoft and Myspace are in the same kind of business - building platforms. Microsoft built a desktop platform, whereas myspace built a networking platform. But on the technology front, Microsoft built a platform to run 3rd party applications, whereas myspace built a online platform to run 3rd party widgets. Niether of them started with that grand scheme, but rather their shortcomings prompted the developers to plug in the gaps and before we know there was a whole new market segment. Entrepernuers, whose forte was identifying all the limitations and building new companies just to fix it. All this is very similar between the two M$\u0027s.\u003Cbr\u003E\u003Cbr\u003ESo what does the future hold? If past lessons are anything to go by Myspace will continue to be very open (\u0022absolutely nothing worth keeping a secret\u0022), developer friendly (\u0022we are too lazy to fix our own bugs\u0022), will face a lot of security issues (\u0022users are not worth protecting\u0022) and continue building the money muscle (\u0022quality is nothing\u0022).\u003Cbr\u003E\u003Cbr\u003EBut the fatal mistake of Myspace unlike Microsoft is that they don\u0027t have a good plan to \u0027lock\u0027 users in, except for their over-hyped critical mass of users. But in this dynamic age critical mass just gives you a head start. Even the mighties like Google have started to realise (TODO: Add references to backup my bold claims!). Over time, (hopefully in less than a year or two), there will be an awesome addon to myspace which gets the users so hooked that they will forget to go back to myspace.", "categories":["technology", "prediction", "microsoft", "myspace"]}, {"title":"New take on Google\u0027s \u0022personal time\u0022", "link":"http://technosophyunlimited.blogspot.com/2007/05/new-take-on-googles-personal-time.html", "author":"Chandan Kudige", "publishedDate":"Thu, 24 May 2007 17:12:00 -0700", "contentSnippet":"As almost everyone knows, Google started an unique trend in the industry. At first they allowed, then encouraged, and now they ...", "content":"As almost everyone knows, Google started an unique trend in the industry. At first they allowed, then encouraged, and now they require their employees to put aside one day of the week to work on their own pet projects. It was a revolutionary idea that attracted two kinds of reactions. The starry eyed programmers everywhere said what a noble company Google was, they had the employee\u0027s best interest in their heart. As we all suspected, Google has a heart of gold. On the other hand, industry veterans like Steve Balmer \u003Ca href\u003D\u0022http://searchengineland.com/070316-084008.php\u0022\u003Emocked google\u0027s personal time concept\u003C/a\u003E\u003Cbr\u003Ecalling it naive and insane.\u003Cbr\u003E\u003Cbr\u003EHowever what most people missed is that the motivation for this concept was neither altruistic nor misguided naivety. It was a carefully calculated, but bold move, that any entrepreneur would appreciate. Think what happens in most companies that attract great people. These people do their day job to earn a living and spend the rest of their free time thinking up other great ideas. If they come up with a hit, they take off, start their own venture and eventually make millions or move on to the next big thing. The company where they were earning their living didn\u0027t really gain much from this.\u003Cbr\u003E\u003Cbr\u003ECompanies do try throwing their lawyers\u003Ca href\u003D\u0022http://bp3.blogger.com/_FUBV2D4gbvc/RlYs9qoBh9I/AAAAAAAAALo/8h-ZCQsam_U/s1600-h/dilbert2006052442720.gif\u0022\u003E\u003Cimg style\u003D\u0022margin:0pt 0pt 10px 10px;float:right\u0022 src\u003D\u0022http://bp3.blogger.com/_FUBV2D4gbvc/RlYs9qoBh9I/AAAAAAAAALo/8h-ZCQsam_U/s320/dilbert2006052442720.gif\u0022 alt\u003D\u0022\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E at such ventures, trying to claim the intellectual property, but except for the fear factor they create, they rarely succeed. So how do you take advantage of such great ideas fomenting in the brains of their employees ? Why, encourage them to work on these in company\u0027s time. This is exactly what Google is saying, and I don\u0027t think its as evil as it sounds. If I were working for such a company, I would probably work on less spectacular ideas during the personal time, and still keep the more spectacular ones for after work, in the quiet comforts of my basement, ensuring no evil hands can ever reach them ...\u003Cbr\u003E\u003Cbr\u003EIt would be great to hear opinions of new and old Google engineers about this :)", "categories":["steve balmer", "google", "personal time", "microsoft", "larry page"]}, {"title":"Yahoo! Widgets", "link":"http://technosophyunlimited.blogspot.com/2005/12/yahoo-widgets.html", "author":"Chandan Kudige", "publishedDate":"Tue, 13 Dec 2005 08:06:00 -0800", "contentSnippet":"Yahoo just announced their new version of Konfabulator - Yahoo! Widgets.For those of you who cared to read my previous rants, I ...", "content":"\u003Cp\u003EYahoo just announced their new version of Konfabulator - Yahoo! Widgets.\u003C/p\u003E\u003Cp\u003EFor those of you who cared to read my previous rants, I must say, \u003Cbr\u003EYahoo! is eerily headed in the right direction. They even have one \u003Cbr\u003Ewidget (The 21st century sticky notes) which can be accessed from \u003Cbr\u003Eanywhere and the notes are stored at the server. This is such a classic \u003Cbr\u003Eexample of the desktop reinvention I have been going on about.\u003C/p\u003E\u003Cp\u003EI have to check their developer APIs to see if they support standard \u003Cbr\u003EHTML (like Tiger Dashboard) or some custom scripts. I bet its going to \u003Cbr\u003Ebe regular HTML\u003Cbr\u003E(just a I predicted).\u003C/p\u003E", "categories":[]}, {"title":"An Interlude - Ajax Tutorial", "link":"http://technosophyunlimited.blogspot.com/2005/12/interlude-ajax-tutorial.html", "author":"Chandan Kudige", "publishedDate":"Fri, 09 Dec 2005 01:36:00 -0800", "contentSnippet":"After the ranting in the previous entries, I think its time to take a break from the philosophical side and get our hands ...", "content":"\u003Cp\u003EAfter the ranting in the previous entries, I think its time to take a break from the philosophical side and get our hands dirty. I am going to put together a tutorial which explains how to you Ajax. I plan to start from the simplest tricks all the way to the most complex ones.\u003Cbr\u003EBut one step at a time.\u003C/p\u003E\u003Cp\u003ETo begin with I will demonstrate what I have been discussing - the \u0022world-wide-wait\u0022 syndrome everyone is so familiar with. In this demo I have two pages. The first one is a traditional template based web site and the second one is Ajax based. Both of them provide you the exact same information (reviews on 7 latest car models) but you can see thedifference for yourself! \u003C/p\u003E\u003Cp\u003EI call the first one Click-and-Wait. You click each link and you wait for the page to load up. The second one, in contrast, is Wait-and-Click-click-click. The page loads the data which is packaged in an XML file and after the initial wait, you are free to click asfast as you can! \u003C/p\u003E\u003Cp\u003E\u003Ca href\u003D\u0022http://kudang.com/users/chandan/blogget/click-and-wait/click-n-wait.php\u0022\u003EPage 1\u003C/a\u003E - The typical Click and Wait website\u003C/p\u003E\u003Cp\u003E\u003Ca href\u003D\u0022http://www.blogger.com/post-edit.g?blogID\u003D19538401\u0026amp;postID\u003D113412100928656554\u0022\u003EPage 2\u003C/a\u003E - Same information, but with nifty ajax at work.\u003C/p\u003E\u003Cp\u003E\u003Cspan style\u003D\u0022font-size:85%\u0022\u003ENext: I will dissect this demo and explain how it all works. This will be useful to anyone who wants to learn the nuts and bolts of ajax orwants to implement their own ajax code. \u003C/span\u003E\u003C/p\u003E", "categories":[]}]}}; FTC_feedData['http://rss.slashdot.org/Slashdot/slashdot'] = {"feed":{"title":"Slashdot", "link":"http://slashdot.org/", "author":"help@slashdot.org", "description":"News for nerds, stuff that matters", "type":"rss10", "entries":[{"title":"PC Superstore Admits Linux Hinge Repair Mistake", "link":"http://rss.slashdot.org/~r/Slashdot/slashdot/~3/157024083/article.pl", "author":"Erris (posted by Zonk)", "publishedDate":"Sat, 15 Sep 2007 18:29:00 -0700", "contentSnippet":"Erris writes \u0022PC Superstore says their store manager was wrong to turn away a client with a broken hinge whose machine should ...", "content":"Erris writes \u0022PC Superstore says their store manager was wrong to turn away a client with a broken hinge whose machine should have been repaired. \u0027El Reg put a call in to the DSGi-owned retail giant to get some clarification on PC World\u0027s Linux support policy. A spokesman told us that there had simply been a misunderstanding at the store and that, in fact, the normal procedure would be for the Tech Guys to provide a fix. [PC World] will provide a full repair once the firm has made contact with Tikka.\u0027\u003Cp\u003E\u003Ca href\u003D\u0022http://linux.slashdot.org/article.pl?sid\u003D07/09/15/2031231\u0026amp;from\u003Drss\u0022\u003ERead more of this story\u003C/a\u003E at Slashdot.\u003C/p\u003E\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?a\u003DdFhewl\u0022\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?i\u003DdFhewl\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~r/Slashdot/slashdot/~4/157024083\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["portables"]},{"title":"Impassable Northwest Passage Open For First Time In History", "link":"http://rss.slashdot.org/~r/Slashdot/slashdot/~3/157024084/article.pl", "author":"Zonk", "publishedDate":"Sat, 15 Sep 2007 16:05:00 -0700", "contentSnippet":"An anonymous reader writes \u0022The Northwest Passage, a normally ice-locked shortcut between Europe and Asia, is now passable for ...", "content":"An anonymous reader writes \u0022The Northwest Passage, a normally ice-locked shortcut between Europe and Asia, is now passable for the first time in recorded history reports the European Space Agency. Leif Toudal Pedersen from the Danish National Space Centre said in the article: \u0027We have seen the ice-covered area drop to just around 3 million sq km which is about 1 million sq km less than the previous minima of 2005 and 2006. There has been a reduction of the ice cover over the last 10 years of about 100 000 sq km per year on average, so a drop of 1 million sq km in just one year is extreme.\u0027\u0022\u003Cp\u003E\u003Ca href\u003D\u0022http://science.slashdot.org/article.pl?sid\u003D07/09/15/2023212\u0026amp;from\u003Drss\u0022\u003ERead more of this story\u003C/a\u003E at Slashdot.\u003C/p\u003E\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?a\u003DAz9sHz\u0022\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?i\u003DAz9sHz\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~r/Slashdot/slashdot/~4/157024084\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["science"]},{"title":"Stealthy Windows Update Raises Serious Concerns", "link":"http://rss.slashdot.org/~r/Slashdot/slashdot/~3/157024085/article.pl", "author":"Zonk", "publishedDate":"Sat, 15 Sep 2007 15:26:00 -0700", "contentSnippet":"UniversalVM writes \u0022What is the single biggest issue that bothers open source advocates about proprietary software? It is ...", "content":"UniversalVM writes \u0022What is the single biggest issue that bothers open source advocates about proprietary software? It is probably the ability of the vendor to pull stunts like Microsoft\u0027s recent stealth software update and subsequent downplaying of any concerns. Their weak explanation seems to be a great exercise in circular logic: \u0027Had we failed to update the service automatically, users would not have been able to successfully check for updates and, in turn, users would not have had updates installed automatically or received expected notifications.\u0027 News.com is reporting that all of the updated files on both XP and Vista appears to be in windows update itself. This is information that was independently uncovered by users and still not released by Microsoft.\u0022\u003Cp\u003E\u003Ca href\u003D\u0022http://it.slashdot.org/article.pl?sid\u003D07/09/15/2040259\u0026amp;from\u003Drss\u0022\u003ERead more of this story\u003C/a\u003E at Slashdot.\u003C/p\u003E\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?a\u003D1UNV7y\u0022\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?i\u003D1UNV7y\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~r/Slashdot/slashdot/~4/157024085\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["windows"]},{"title":"Google Calls for International Privacy Standards", "link":"http://rss.slashdot.org/~r/Slashdot/slashdot/~3/157024086/article.pl", "author":"Zonk", "publishedDate":"Sat, 15 Sep 2007 14:18:00 -0700", "contentSnippet":"HairyNevus writes \u0022The Washington Post has an article detailing Google\u0027s request for international privacy standards. Google is ...", "content":"HairyNevus writes \u0022The Washington Post has an article detailing Google\u0027s request for international privacy standards. Google is taking this matter all the way to the U.N., arguing that a hodge-podge of privacy law unnecessarily burdens Internet-based companies while also failing to protect consumers. Although Google is currently under investigation by the EU for its privacy practices, the company claims it has been a crusader for protecting consumer privacy. Google\u0027s privacy counsel Peter Fleischer called America\u0027s privacy laws \u0027too complex and too much of a patchwork,\u0027 and the European Union\u0027s laws \u0027too bureaucratic and inflexible.\u0027 The alternative? Something closer to the Asia-Pacific Economic Cooperation\u0027s framework which \u0027balances very carefully information privacy with business needs and commercial interests\u0027, according to Fleischer.\u0022\u003Cp\u003E\u003Ca href\u003D\u0022http://yro.slashdot.org/article.pl?sid\u003D07/09/15/2014253\u0026amp;from\u003Drss\u0022\u003ERead more of this story\u003C/a\u003E at Slashdot.\u003C/p\u003E\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?a\u003DMUjpX1\u0022\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?i\u003DMUjpX1\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~r/Slashdot/slashdot/~4/157024086\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["google"]},{"title":"Internal Emails of An RIAA Attack Dog Leaked", "link":"http://rss.slashdot.org/~r/Slashdot/slashdot/~3/157024087/article.pl", "author":"Zonk", "publishedDate":"Sat, 15 Sep 2007 13:24:00 -0700", "contentSnippet":"qubezz writes \u0022The company MediaDefender works with the RIAA and MPAA against piracy, setting up fake torrents and trackers and ...", "content":"qubezz writes \u0022The company MediaDefender works with the RIAA and MPAA against piracy, setting up fake torrents and trackers and disrupting p2p traffic. Previously, the TorrentFreak site accused them of setting up a fake internet video download site designed to catch and bust users. MediaDefender denied the entrapment charges. Now 700MB of MediaDefender\u0027s internal emails from the last 6 months have been leaked onto BitTorrent trackers. The emails detail their entire plan, including how they intended to distance themselves from the fake company they set up and future strategies. Other pieces of company information were included in the emails such as logins and passwords, wage negotiations, and numerous other aspect of their internal business.\u0022\u003Cp\u003E\u003Ca href\u003D\u0022http://it.slashdot.org/article.pl?sid\u003D07/09/15/1843234\u0026amp;from\u003Drss\u0022\u003ERead more of this story\u003C/a\u003E at Slashdot.\u003C/p\u003E\n\u003Cp\u003E\u003Ca href\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?a\u003DGLD4CC\u0022\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~a/Slashdot/slashdot?i\u003DGLD4CC\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\u003C/p\u003E\u003Cimg src\u003D\u0022http://rss.slashdot.org/~r/Slashdot/slashdot/~4/157024087\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["security"]}]}}; FTC_feedData['http://www.comedycentral.com/rss/colbertvideos.jhtml'] = {"feed":{"title":"Colbert Report Videos", "link":"http://www.comedycentral.com/shows/the_colbert_report/index.jhtml?rsspartner\u003DrssFeedfetcherGoogle", "author":"", "description":"Watch Stephen Colbert feel the news at you, anytime!", "type":"rss20", "entries":[{"title":"Are You There, God?", "link":"http://www.comedycentral.com/extras/indecision2008/videos/indecision_colbert/index.jhtml?playVideo\u003D102735\u0026rsspartner\u003DrssFeedfetcherGoogle", "author":"", "publishedDate":"Fri, 14 Sep 2007 00:00:00 -0700", "contentSnippet":"Mother Teresa doubted the existence of God Boy, did she have a bad career counselor!", "content":"Mother Teresa doubted the existence of God Boy, did she have a bad career counselor!", "categories":[]},{"title":"Father James Martin", "link":"http://www.comedycentral.com/shows/the_colbert_report/videos/celebrity_interviews/index.jhtml?playVideo\u003D102804\u0026rsspartner\u003DrssFeedfetcherGoogle", "author":"", "publishedDate":"Fri, 14 Sep 2007 00:00:00 -0700", "contentSnippet":"Father James Martin sets Stephen straight about Mother Teresa\u0027s crisis of faith.", "content":"Father James Martin sets Stephen straight about Mother Teresa\u0027s crisis of faith.", "categories":[]},{"title":"WristStrong", "link":"http://www.comedycentral.com/videos/index.jhtml?playVideo\u003D102738\u0026rsspartner\u003DrssFeedfetcherGoogle", "author":"", "publishedDate":"Fri, 14 Sep 2007 00:00:00 -0700", "contentSnippet":"Stephen suggests that Matt Lauer slip his WristStrong bracelet to President Mahmoud Ahmadinejad.", "content":"Stephen suggests that Matt Lauer slip his WristStrong bracelet to President Mahmoud Ahmadinejad.", "categories":[]}]}}; FTC_feedData['http://www.quotationspage.com/data/qotd.rss'] = {"feed":{"title":"Quotes of the Day", "link":"http://www.quotationspage.com/qotd.html", "author":"", "description":"Four humorous quotations each day from The Quotations Page", "type":"rss20", "entries":[{"title":"Bernard M. Baruch", "link":"http://www.quotationspage.com/quote/38809.html", "author":"", "publishedDate":"Fri, 14 Sep 2007 17:00:00 -0700", "contentSnippet":"\u0022Never answer a critic, unless he\u0027s right.\u0022", "content":"\u0022Never answer a critic, unless he\u0027s right.\u0022", "categories":[]},{"title":"Booth Tarkington", "link":"http://www.quotationspage.com/quote/30199.html", "author":"", "publishedDate":"Fri, 14 Sep 2007 17:00:00 -0700", "contentSnippet":"\u0022There are two things that will be believed of any man whatsoever, and one of them is that he has taken to drink.\u0022", "content":"\u0022There are two things that will be believed of any man whatsoever, and one of them is that he has taken to drink.\u0022", "categories":[]},{"title":"C. E. Montague", "link":"http://www.quotationspage.com/quote/26282.html", "author":"", "publishedDate":"Fri, 14 Sep 2007 17:00:00 -0700", "contentSnippet":"\u0022To be amused by what you read--that is the great spring of happy quotations.\u0022", "content":"\u0022To be amused by what you read--that is the great spring of happy quotations.\u0022", "categories":[]}]}}; FTC_feedData['http://www.theonion.com/content/feeds/daily'] = {"feed":{"title":"The Onion", "link":"http://www.theonion.com/content", "author":"", "description":"America\u0027s Finest News Source", "type":"rss20", "entries":[{"title":"[audio] Women Now Empowered By Everything A Woman Does", "link":"http://feeds.theonion.com/~r/theonion/daily/~3/156725839/women_now_empowered_by", "author":"", "publishedDate":"Fri, 14 Sep 2007 22:01:56 -0700", "contentSnippet":"Onion Radio News - with Doyle Redland\n \n", "content":"Onion Radio News - with Doyle Redland\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003Dd927JcyN\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003Dd927JcyN\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DTIPcv3mH\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DTIPcv3mH\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DaadR8zgH\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DaadR8zgH\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~r/theonion/daily/~4/156725839\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["Onion_Radio_News"]},{"title":"Description Of Sexual Fantasy Changing With Girlfriend\u0027s Reaction", "link":"http://feeds.theonion.com/~r/theonion/daily/~3/156725840/description_of_sexual_fantasy", "author":"", "publishedDate":"Fri, 14 Sep 2007 22:01:41 -0700", "contentSnippet":"HOUSTON \u0022I put my finger up yourlips. Up to your lips. Like, to hush you, because the moment is so awe-inspiring,\u0022 said ...", "content":"HOUSTON \u0026quot;I put my finger up yourlips. Up to your lips. Like, to hush you, because the moment is so awe-inspiring,\u0026quot; said Kendler, choking back his actual fantasy.\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DoviqivBi\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DoviqivBi\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DfsMMhXK4\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DfsMMhXK4\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DhqiyMuVE\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DhqiyMuVE\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~r/theonion/daily/~4/156725840\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["Sex", "couples", "Bars", "News", "People"]},{"title":"[audio] Florida Town Mentally Prepares For Hurricane", "link":"http://feeds.theonion.com/~r/theonion/daily/~3/156276304/florida_town_mentally", "author":"", "publishedDate":"Thu, 13 Sep 2007 22:01:58 -0700", "contentSnippet":"Onion Radio News - with Doyle Redland\n \n", "content":"Onion Radio News - with Doyle Redland\u003Cdiv\u003E\n\u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003D0B6fP3fh\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003D0B6fP3fh\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DZs5JTOM2\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DZs5JTOM2\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E \u003Ca href\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?a\u003DtPIwrFa8\u0022\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~f/theonion/daily?i\u003DtPIwrFa8\u0022 border\u003D\u00220\u0022\u003E\u003C/a\u003E\n\u003C/div\u003E\u003Cimg src\u003D\u0022http://feeds.theonion.com/~r/theonion/daily/~4/156276304\u0022 height\u003D\u00221\u0022 width\u003D\u00221\u0022\u003E", "categories":["Onion_Radio_News"]}]}}; FTC_feedData['http://vitativeness.blogspot.com/feeds/posts/default'] = {"feed":{"title":"Vitativeness","link":"http://vitativeness.blogspot.com/","author":"Vitativeness","description":"","type":"atom10","entries":[{"title":"Moved","link":"http://vitativeness.blogspot.com/2007/06/moved.html","author":"Vitativeness","publishedDate":"Tue, 26 Jun 2007 19:17:00 -0700","contentSnippet":"I\u0027ve moved! Here\u0027s my new addy: touchedbycolors","content":"I\u0027ve moved! Here\u0027s my new addy: \u003Ca href\u003D\u0022http://touchedbycolors.blogspot.com\u0022\u003Etouchedbycolors\u003C/a\u003E","categories":[]},{"title":"I am back!","link":"http://vitativeness.blogspot.com/2007/04/i-am-back.html","author":"Vitativeness","publishedDate":"Sat, 28 Apr 2007 04:54:00 -0700","contentSnippet":"I\u0027ve seen it all in these past couple of months, the Washington snow,the Boston chill, the California blue sky, Las Vegas hot ...","content":"I\u0027ve seen it all in these past couple of months, the Washington snow,\u003Cbr\u003E\u003Cbr\u003Ethe Boston chill, the California blue sky, Las Vegas hot sun,\u003Cbr\u003E\u003Cbr\u003ELos Angeles rain, and to think I used to complain about Melbourne\u0027s\u003Cbr\u003E\u003Cbr\u003Eweather!\u003Cbr\u003E\u003Cbr\u003EI\u0027ve collected enough paint on this trip to last me for a couple of\u003Cbr\u003E\u003Cbr\u003Eyears (no more excuses), and to those of you who have been\u003Cbr\u003E\u003Cbr\u003Epatiently waited for me to return, thank you! New posts are on the\u003Cbr\u003E\u003Cbr\u003Eway!\u003Cbr\u003E\u003Cbr\u003E(sorry, no photos from the trip. I am not much of a clicking tourist\u003Cbr\u003E\u003Cbr\u003Eperson, hate the dead weight of the camera and if I did carry it\u003Cbr\u003E\u003Cbr\u003Earound, too lazy to take any pic).","categories":[]},{"title":"Flick It","link":"http://vitativeness.blogspot.com/2006/07/flick-it.html","author":"Vitativeness","publishedDate":"Mon, 17 Jul 2006 22:23:00 -0700","contentSnippet":"Youre in a hallway, there are three switches.Two of these switches do not perform any function.Theres a door at the end of ...","content":"\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003EYoure in a hallway, there are three switches.\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003ETwo of these switches do not perform any function.\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003ETheres a door at the end of hallway leading to a room.\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003EThe third switch will turn on the light in that room.\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003EYou can flick the switches as many times as you like,\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003Ehowever, the door to the room can only be opened once.\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003EYou can not determine whether the light in that room is\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003Eon or off without opening the door. How do you establish\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003Ewhich switch\u003Cspan\u003E \u003C/span\u003Ewill light the room?\u003Cbr\u003E\u003C/span\u003E\u003C/p\u003E\u003Cp\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003E(None of the switches are dimmers \u003C/span\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022 style\u003D\u0022font-family:Wingdings\u0022\u003E\u003Cspan\u003E:)\u003C/span\u003E\u003C/span\u003E\u003Cspan lang\u003D\u0022EN-AU\u0022\u003E).\u003C/span\u003E\u003C/p\u003E","categories":[]}]}}; FTC_feedSearchData = {"query":"cnn","entries":[{"url":"http://rss.cnn.com/rss/cnn_topstories.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E.com - Breaking News, U.S., World, Weather, Entertainment \u003Cb\u003E...\u003C/b\u003E","contentSnippet":"\u003Cb\u003ECNN\u003C/b\u003E.com delivers the latest breaking news and information on the latest top \u003Cbr\u003E stories, weather, \u003Cb\u003E...\u003C/b\u003E 2007 \u003Cb\u003ECable News Network\u003C/b\u003E LP, LLLP. A Time Warner Company. \u003Cb\u003E...\u003C/b\u003E","link":"http://www.cnn.com/"}, {"url":"http://rss.cnn.com/rss/cnn_tech.rss","title":"Technology - Computers, Internet and Personal Tech News from \u003Cb\u003ECNN\u003C/b\u003E.com","contentSnippet":"Find information about the latest advances in technology at \u003Cb\u003ECNN\u003C/b\u003E. \u003Cb\u003ECNN\u003C/b\u003E Technology \u003Cbr\u003E news and video covers the internet, business and personal tech, video games, \u003Cb\u003E...\u003C/b\u003E","link":"http://www.cnn.com/TECH/"}, {"url":"http://rss.cnn.com/rss/money_topstories.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E/Money","contentSnippet":"\u003Cb\u003ECNN\u003C/b\u003E, FORTUNE, MONEY, BUSINESS 2.0 and Fortune Small Business magazines offer \u003Cbr\u003E business news and financial market coverage updated throughout the day, \u003Cb\u003E...\u003C/b\u003E","link":"http://money.cnn.com/"}, /* {"url":"http://rss.cnn.com/rss/edition.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E.com International","contentSnippet":"World news, the latest world news headlines, weather, sport, business and \u003Cbr\u003E entertainment brought to you by \u003Cb\u003ECNN\u003C/b\u003E europe.","link":"http://edition.cnn.com/"}, {"url":"http://rss.cnn.com/rss/edition_asia.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E.com International","contentSnippet":"Countdown Beijing. Countdown Beijing. \u003Cb\u003ECNN\u003C/b\u003E takes an in-depth look at China\u0026#39;s \u003Cbr\u003E preparations for the 2008 Olympic Games full story \u003Cb\u003E...\u003C/b\u003E","link":"http://edition.cnn.com/ASIA/"}, {"url":"http://rss.cnn.com/rss/si_topstories.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E/SI Network Page","contentSnippet":"SI.com - sports news, scores, photos, columns and expert analysis from the world \u003Cbr\u003E of sports including NFL, NBA, NHL, MLB, NASCAR, college basketball, \u003Cb\u003E...\u003C/b\u003E","link":"http://sportsillustrated.cnn.com/"}, {"url":"http://rss.cnn.com/rss/si_topstories.rss","title":"SI.com - 2006 Winter Olympics","contentSnippet":"Cops put on leave after Tasering student. WEATHER. \u003Cb\u003ECNN\u003C/b\u003E CareerBuilder \u0026middot; SI.com. \u003Cbr\u003E STOCK QUOTE:. SUBSCRIBE TO SI \u0026middot; GIVE THE GIFT OF SI \u003Cb\u003E...\u003C/b\u003E","link":"http://sportsillustrated.cnn.com/olympics/"}, {"url":"http://rss.cnn.com/rss/cnn_politicalticker.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E.com - \u003Cb\u003ECNN\u003C/b\u003E Political Ticker","contentSnippet":"WASHINGTON (\u003Cb\u003ECNN\u003C/b\u003E) Former Massachusetts Gov. Mitt Romney criticizes his fellow \u003Cbr\u003E Republicans for failing to control spending, neglecting to take action on \u003Cb\u003E...\u003C/b\u003E","link":"http://politicalticker.blogs.cnn.com/"}, */ {"url":"http://twitter.com/statuses/user_timeline/428333.rss","title":"Twitter / cnnbrk","contentSnippet":"Name: \u003Cb\u003ECNN\u003C/b\u003E Breaking News; Bio: \u003Cb\u003ECNN\u003C/b\u003E.com is among the world\u0026#39;s leaders in online news \u003Cbr\u003E and \u003Cb\u003E...\u003C/b\u003E Location: Everywhere. Web: http://www.\u003Cb\u003Ecnn\u003C/b\u003E.com/; Joined: Jan 2007 \u003Cb\u003E...\u003C/b\u003E","link":"http://twitter.com/cnnbrk"}, {"url":"http://rss.cnn.com/rss/cnn_topstories.rss","title":"\u003Cb\u003ECNN\u003C/b\u003E.com - Breaking News, U.S., World, Weather, Entertainment \u003Cb\u003E...\u003C/b\u003E","contentSnippet":"\u003Cb\u003ECNN\u003C/b\u003E.com delivers the latest breaking news and information on the latest top \u003Cbr\u003E stories, weather, business, entertainment, politics, and more.","link":"http://cnn.org/"}]}; yocto-reader/reader/cache.js0000644000004100000000000001001310735421005015561 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /* Cache for feed items and their status * * (c) 2005-2007 Chandan Kudige * * /*--------------------------------------------------------------------------*/ var FCV_cache = {}; var FCV_unread = {'_all' : 0}; function FC_cacheItem(entry) { itemid = entry['entries-itemid']; FCV_cache[itemid] = entry; } /* function FC_lookupItem(feed, timestamp) { return FC_lookupItemId(FC_makeItemId(feed, timestamp)); } */ function FC_lookupItemId(itemid) { return FCV_cache[itemid]; } function FC_makeItemId(feed, timestamp) { return feed + FRC_joinstring + timestamp; } function FC_getItemFeed(itemid) { try { var t = itemid.split(FRC_joinstring); if (t.length > 1) return t[0]; } catch(e) { } } function FC_clearUnread(feed) { if (feed) { if (FCV_unread[feed]) { FCV_unread['_all'] -= parseInt(FCV_unread[feed]); FCV_unread[feed] = 0; } } else { // FCV_unread = {'_all' : 0}; } } function FC_updateUnread(feed, count) { if (!FCV_unread[feed]) FCV_unread[feed] = 0; FCV_unread[feed] += count; FCV_unread['_all'] += count; } function FC_getUnread(feed) { if (!FCV_unread[feed]) FCV_unread[feed] = 0; return FCV_unread[feed]; } function FC_getUnreadAll() { return FCV_unread['_all']; /* var total = 0; $.each(FCV_unread, function(feed, num) { total += num; }); return total; */ } function FC_setItemRead(itemid) { var feed = FC_getItemFeed(itemid); if (!feed || FR_isItemRead(itemid)) return; FC_updateUnread(feed, -1); FR_setItemRead(itemid); Reader.updateFeedCount([feed], [itemid]); } function FC_setItemUnread(itemid) { var feed = FC_getItemFeed(itemid); if (feed && FR_isItemRead(itemid)) { FC_updateUnread(feed, 1); FR_setItemUnread(itemid); Reader.updateFeedCount([feed], [itemid]); } } var FC_lastCacheTime = 0; var FC_cacheInterval = 60*1000; //msec (1 min) var FC_updateInterval = 5*60*1000; // (5 mins) var FC_numEntries = 100; var FC_feedData = {}; function FC_cacheFeed(feedurl, entries) { FC_feedData[feedurl] = {entries: entries, cacheTime: currentTime()}; } function FC_retreiveFeed(feedurl, callback) { var result = FC_feedData[feedurl]; if (!result || timeExpired(result.cacheTime, FC_cacheInterval)) { var feed = new google.feeds.Feed (feedurl); feed.setNumEntries(FC_numEntries); feed.load(FC_cacheAndCall.bind(null, callback, feedurl)); } else if (callback) { // callback(result.entries); setTimeout(function() {callback(result.entries);}, 100); } } function FC_cacheAndCall(callback, feedurl, result) { if (result.status.code == 200) { var entries = GfeedToEntries(result.feed, feedurl); FC_cacheFeed(feedurl, entries); if (callback) callback(entries); } else { if (callback) { // XXX callback([], "Feed could not be loaded - " + result.status.code); } } } yocto-reader/reader/template.js0000644000004100000000000001617310735421010016342 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /* * Extensions to jQuery DOM wrapper to render javascript objects * and arrays into appropriate HTML templated nodes. * * Author: Chandan Kudige (2007) */ jQuery.fn.extend({ /* * Populate an HTML node with attributes from a javascript object. * object can be an array or a dictionary * * For each attribute of the object, the dom elements whose * classname contains the attribute name with a prefix ('fld-') * are determined, and is populated by value of that attribute */ populate: function(object, template) { if (typeof(object) == typeof([]) && object.length != undefined) { return this.populateArray(object, template); } return this.populateObject(object); }, /* * Populate HTML template nodes with items from an array * and append the nodes to 'this' node(s). * * Returns an array of bindings, one item for each element * of the array. * each binding has * node - newly created HTML node for the element * obj - corresponding element in the array */ populateArray: function(array_object, template) { var node = this; if (typeof(template) == typeof('')) { template = $(template, $("#templates")); } var bindings = new Array; $.each(array_object, function(i, prop) { if (typeof(prop) != typeof(function(){})) { var newnode = template.clone(true). appendTo(node).populateObject(prop); bindings.push({node: newnode, obj: prop}); } }); return bindings; }, /* * Populate HTML node with the given object attributes. * * Returns the modified nodeset for chaining */ populateObject: function(json) { node = this; if (typeof(json) == typeof('')) { json = {'name' : json}; } for (property in json) { var set; if (node.is('.fld-' + property)) set = node; else set = $('.fld-' + property, node); set.each( function() { var node = $(this); if (property == 'icon') { this.style.backgroundImage = 'url("themes/default/' + json[property] + '")'; } else { $(this).setdata(json[property]); } }); } return node; // chain }, /* * This variant populates an HTML node with and item and an array of entries * (item is the feed attributes, array is the feed entries. * Used for the Summary View * * properties and rootpath are for internal use. */ populateFeed : function(obj, properties, rootpath) { var target = this; if (!properties) properties = {}; if (!rootpath) rootpath = ''; var path; for (var p in obj) { path = rootpath; if (path) path += '-'; path += p; if (typeof (obj [p]) == typeof("")) { properties[path] = obj[p]; } } target.populate(properties); for (var p in obj) { path = rootpath; if (path) path += '-'; path += p; if (typeof (obj [p]) == "object") { var ts = $('.fld-'+p, target); var rt = ts.clone(true); for (var i = 0, j = obj [p].length; i < j; i++) { ts.populateFeed(obj[p][i], properties, path); if (i < j - 1) { ts.after(rt.clone(true)); ts = ts.next(); } } } } return target; // chain } }); /* * Generic function to populate folders and tags * for folder chooser dropdowns */ function populateFolders(topnode, feed, callback) { var dropdown = $("ul.contents", topnode); var folders = FR_folderForFeed(feed); var allfolders = FR_allFolders(); $.merge(allfolders, FR_allTags()); dropdown.children().remove(); var addfolder = true; // Function called when the user clicks on a folder/tag in the dropdown var fn = function(event) { event = jQuery.event.fix( event || window.event || {} ); var folder = event.target.innerHTML; if (folder == FS_new_tag) { folder = prompt(FS_enter_new_tag); if (!folder) return; } var remove = $(event.target).is('.chooser-item-selected'); if (remove) { FR_removeFromFolder(feed, folder); } else { FR_copyToFolder(feed, folder); } Reader.refresh(); dropdown.addClass('hidden'); // Invoke the app callback if needed if (callback) { callback(feed, folder, $(event.target).is('.chooser-item-selected'), topnode); } // Re-populate the dropdown populateFolders(topnode, feed, callback); } $.each(allfolders, function(i, folder) { var li = $(document.createElement('li')).addClass('chooser-item') .setdata(folder).appendTo(dropdown).click(fn); if ($.indexOf(folders, folder) >= 0) { li.addClass('chooser-item-selected'); addfolder = false; } }); $(document.createElement('li')).addClass('chooser-item') .setdata(FS_new_tag).appendTo(dropdown).click(fn).addClass('newfolder'); var strprompt = FS_change_folders; if (addfolder) { strprompt = FS_add_to_folder; } $('.prompt', topnode).setdata(strprompt); } /* * Just like jQuery extend function, * but copy attributes with an optional prefix */ function objectCopy(dest, src, prefix) { if (!prefix) prefix = ''; for (p in src) { if (typeof(src[p]) == typeof('')) { dest[prefix + p] = src[p]; } } return dest; } yocto-reader/reader/rest.html0000644000004100000000000000065110735421010016026 0ustar www-dataroot REST TEST

TEST TEST


chandan
Last modified: Sun Dec 16 10:10:48 EST 2007 yocto-reader/reader/feed.js0000644000004100000000000001614610735421005015436 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /* * FeedRenderer class * Wrapper around Google Feed API to display feeds in different * formats. */ function FeedRenderer () { this.feeds = new Array (); this.numEntries = 4; } FeedRenderer.prototype.add = function (url) { if (typeof(url) != typeof([])) { url = [url]; } $.merge(this.feeds, [url]); } FeedRenderer.prototype.renderFeed = function (url, target, template) { var fn = function (myurl, result) { if (result.status.code == 200) { result.feed.feed = myurl + ''; if (FC_getUnread(result.feed.feed)) result.feed.feedunread = '(' + FC_getUnread(result.feed.feed) + ')'; var folders = FR_folderForFeed(result.feed.feed); var folder; if (folders && folders.length>0) { folder = folders[0]; result.feed.folder = '' + folders[0]; target.addClass('summary-with-folder'); var folderunread = 0; $.each(FR_feedsInFolder(folders[0]), function(i, ffeed) { folderunread += FC_getUnread(ffeed); }); if (folderunread) result.feed.folderunread = '(' + folderunread + ')'; } target.populateFeed(result.feed).removeClass('hidden'); ReaderViewer.homeItemLoaded(target, result.feed.feed, folder); } else { // error } } fn = fn.bind(null, url); var feed = new google.feeds.Feed (url); feed.setNumEntries(this.numEntries); feed.load(fn); } FeedRenderer.prototype.render = function (target, template) { var bindings = []; for (var i=0; i< this.feeds.length; i++) { var rt = template.clone(true).addClass('hidden'); target.append(rt); this.renderFeed (this.feeds[i], rt); bindings.push({node: rt, feed: this.feeds[i]}); } return bindings } FeedRenderer.prototype.renderSearchResult = function (query, target, template) { google.feeds.findFeeds (query, function (result) { if (result.status.code == 200) { var rt = template.clone (true); rt[0].id = ""; target.append (rt); target.populateFeed(result); Reader.hideLoading(); // Mark the entries whose feeds are already subscribed to $(".tpl-search", $("#main")).each(function() { var node = $(this); var feed = $("input.fld-entries-url", node).getdata(); if (FR_feedInfo(feed)) { node.addClass('result-subscribed'); } populateFolders(node, feed); }); } else { // error } }); } FeedRenderer.prototype.startLoading = function (sink) { for (var i=0; i< this.feeds.length; i++) { var feedurl = this.feeds[i]; var fn = function(entries, error) { if (error) { alert(feedurl + ' error: ' + error); } else if (entries) { sink.inject(entries); } } FC_retreiveFeed(feedurl, fn); } } var MonthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]; function format_author(author) { return "by " + author; } function format_date(datestr) { var today = new Date(); var d = new Date(datestr); var tm = today.getTime(); var dm = d.getTime(); if (dm > tm - 24*60*60*1000) { var hh = d.getHours(); var mm = d.getMinutes(); var am = 'AM'; if (hh >= 12) { hh -= 12; am = 'PM'; } if (mm < 10) { mm = '0' + mm; } return hh + ':' + mm + ' ' + am; } else { return MonthNames[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear(); } } function format_timestamp(str) { var d = new Date(str); return d.getTime(); } function GfeedToEntries(gfeed, feedurl) { var unread = 0; var updated = false; var entries = $.map(gfeed.entries,function(entry) { var timestamp = 0; var title = entry['title']; if (entry['publishedDate']) { timestamp = format_timestamp(entry['publishedDate']); entry['formatDate'] = format_date(entry['publishedDate']); } if (entry['author']) { entry['formatAuthor'] = format_author(entry['author']); } // Item ID format is decided here. var itemid = entry['itemid'] = FC_makeItemId(feedurl, timestamp+'/'+title); if (!FR_isItemRead(itemid)) { unread ++; } var property = objectCopy({feed: feedurl}, gfeed, ''); property = objectCopy(property, entry, 'entries-'); property.timestamp = timestamp; if (!FC_lookupItemId(itemid)) { FC_cacheItem(property); updated = true; } return property; }); FC_clearUnread(feedurl); FC_updateUnread(feedurl, unread); Reader.updateFeedCount([feedurl]); if (updated) { Reader.flashFeeds([feedurl]); } return entries; } /* * Injector takes an array, 'inject' into a processing function * slowly, with timeouts, so that the browser does not become * unresponsive */ function Injector(callback, num, interval) { this.callback = callback; this.entries = []; this.timer = false; this.num = num; this.interval = interval; } Injector.prototype = { inject: function(items) { /* if (typeof(items) != typeof([])) { items = [items]; } */ $.merge(this.entries, items); this.added(); }, added: function() { if (!this.timer && this.entries.length > 0) { this.pushout(); } }, pushout: function() { this.timer = false; var current = this.entries.slice(0, this.num); this.entries = this.entries.slice(this.num); this.callback(current); if (this.entries.length > 0) { setTimeout(this.pushout.bind(this), this.interval); this.timer = true; } } } yocto-reader/reader/strings.js0000644000004100000000000000217110735421010016211 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ var FS_change_folders = 'Change folders ...'; var FS_add_to_folder = 'Add to folder ...'; var FS_new_tag = 'New tag ...'; var FS_enter_new_tag = 'Please enter a new tag'; yocto-reader/reader/mockapi.js0000644000004100000000000010211111123730256016145 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * Copyright (C) 2008 Bradley M. Kuhn * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /*======================================================= * * DB Cache Variables * * All DB access is expected to be cached in these * variables, and the application accesses the cache * when calling the FR_* APIs * * APIs which modify the DB should update the cache immediately and * return. * The actual DB update should happen in background, hopefully * with a request queue. * *=======================================================*/ /* Login Info: * Details for the user logged in */ var FRV_logininfo; /* Unique url for user's shared items */ var FRV_shareurl; /* This is a list of all subscribed feeds */ var FRV_feedlist; /* Internal to mock apis */ var FRV_feedinfo; /* This is a hash keyed on feed url, value contains the title. * This is used for speeding up the UI */ var FRV_feedhash; /* * Hashtable keyed on tagnames, and the values are arrays of * itemids. * itemid = feedurl + '::' + item publish timestamp */ var FRV_tagHash; /* This dict stores the time stamp at which each item was tagged/branded * a particular tag */ var FRV_tagTime; /* * Generalized list of item-level operations. Currently only * 'Starred' and 'Shared' items are provided. Please see the * note in FR_init() for format of this structure. */ var FRV_brands; /* * Hash table keyed on feed urls, and value is the foldername * (if that feed is filed under any folder). */ var FRV_folderHash; /* * Hash table keyed on property name and values are property values. * The DB should support storing whatever properties are passed * by the application and retreive them back when requested. */ var FRV_properties; /* * List of items to be displayed when user 'browses' feeds. * - Format yet to be specified - */ var FRV_browseFeeds; /* * Reading stats for the 'trends' display */ var FRV_trends; /* Item status such as Starred, Shared and Read are stored as * special tags in FRV_tagHash. The special names of the special tags * start with this prefix */ var FRC_brandPrefix = '_'; /* * Safe string to join item components to create an itemid */ var FRC_joinstring = ':@@:'; /* * Property Prefixes: * We use FR_get/setProperty for storing a lot of state information. * Here are the prefixes used */ var FRP_FOLDER_STATE = 'folder-state-'; var FRP_FOLDER_SHARE = 'folder-share-'; var FRP_BUNDLE_STATE = 'bundle-state-'; /* This property determines the time for which an item should be open * before its marked read */ var FRP_ITEM_READ_TIMEOUT = 'iv-read-timeout'; var FRP_REVERT = 'PrefsRevertFlag'; var FRP_START_PAGE = 'StartPage'; var FRP_SCROLL_TRACKING = 'ScrollTracking'; var FRP_EXPANDED_VIEW = 'ExpandedView'; var FRU_devBlog = "http://example.com/devBlog"; var FRU_tips = "http://example.com/tips"; var FRV_tips = [ {title: "Tip1", content: "This is tip 1. This is tip 1. This is tip 1. This is tip 1. This is tip 1. This is tip 1. " }, {title: "Tip2", content: "This is tip 2. This is tip 2. This is tip 2. This is tip 2. This is tip 2. This is tip 2. This is tip 2. " }, {title: "Tip3", content: "This is tip 3.This is tip 3.This is tip 3.This is tip 3.This is tip 3.This is tip 3." }, {title: "Tip4", content: "This is tip 4. This is tip 4. This is tip 4. This is tip 4. This is tip 4. This is tip 4. This is tip 4. This is tip 4. " }]; /*======================================================= * * DB APIs * *=======================================================*/ /* * FR_init(callback) * * This should be called upon page load, and callback should be the application * entry point. * * In real version, this call loads data from the server via REST and invoke * the callback function. In mock version, it simply loads variables with * static info and invokes the callback on a timer. */ function FR_init(onLoadCallback) { FRV_logininfo = {'id': 'dummy@gmail.com', 'lastlogin': '0', 'name': "Big Dummy"}; FRV_shareurl = "http://www.example.com/user/reader/12345432"; FRV_feedlist = [ 'http://rss.cnn.com/rss/cnn_topstories.rss', // TEST_FEED3 'http://www.comedycentral.com/rss/colbertvideos.jhtml', 'http://esperanto-usa.org/eusa/?q=node/feed', 'http://rss.slashdot.org/Slashdot/slashdot', 'http://www.quotationspage.com/data/qotd.rss', 'http://technosophyunlimited.blogspot.com/atom.xml', // TEST_FEED4 'http://www.theonion.com/content/feeds/daily', // TEST_FEED5 'http://vitativeness.blogspot.com/feeds/posts/default', ]; FRV_feedinfo = [ {title:'CNN.com', feed:'http://rss.cnn.com/rss/cnn_topstories.rss', lastupdated: '9/16/07', unread : 5}, // TEST_FEED3 {title:'Colbert Report Videos', feed:'http://www.comedycentral.com/rss/colbertvideos.jhtml', lastupdated: '9/13/07', unread : 6}, {title:'Esperanto-USA', feed:'http://esperanto-usa.org/eusa/?q=node/feed', lastupdated: '9/14/07', unread : 7}, {title:'Slashdot', feed:'http://rss.slashdot.org/Slashdot/slashdot', lastupdated: '9/15/07', unread : 8}, {title:'Quotes of the day', feed:'http://www.quotationspage.com/data/qotd.rss', lastupdated: '8/30/07', unread : 9}, {title:'Technosophy Unlimited', feed:'http://technosophyunlimited.blogspot.com/atom.xml', lastupdated: '6/27/07', unread : 10}, // TEST_FEED4 {title:'The Onion', feed:'http://www.theonion.com/content/feeds/daily', lastupdated: '9/16/07', unread : 0}, {title:'Vitativeness', feed:'http://vitativeness.blogspot.com/feeds/posts/default', lastupdated: '6/28/07', unread : 0} ]; // These items are for testing only FRV_tagHash = { 'tag1' : ['item1', 'item2', 'item3'], 'tag2' : ['item2', 'item4', 'item5'], 'tag3' : ['item3'], 'tag4' : [], 'tag5' : ['item3', 'item1'], '_starred' : ['item3', 'item1'], '_shared' : ['item4', 'item5'], '_read' : ['item3', 'item5'] }; FRV_tagTime = { }; /* * Currently google has two brandings - Starred and Shared. * In our reader this is extended to any number of brandings. */ FRV_brands = [{display: 'Starred items', brand: 'starred', icon: 'icon-starred.png'}, {display: 'Shared items', brand: 'shared', icon: 'icon-shared.png'}]; FRV_folderHash = { 'http://rss.cnn.com/rss/cnn_topstories.rss':['news'], 'http://www.comedycentral.com/rss/colbertvideos.jhtml':['comedy'], // 'http://esperanto-usa.org/eusa/?q=node/feed':['language'], 'http://rss.slashdot.org/Slashdot/slashdot':['news'], 'http://www.quotationspage.com/data/qotd.rss':['language'], 'http://technosophyunlimited.blogspot.com/atom.xml':['technology'] }; FRV_properties = {}; FRV_browseFeeds = FRV_googleBundles; FRV_trends = FRV_sampleTrends; FRV_feedhash = {}; FRI_feedInit(FRV_feedinfo); /* -------------- * Simulate database loading by invoking the callback * with a small delay. *--------------*/ if (onLoadCallback && typeof onLoadCallback == 'function') { onLoadCallback(); } } /* * FR_loginInfo: * * Input * none * * * Output * Object with fields = * id : Login ID * name: full name * lastlogin: timestamp of last login */ function FR_loginInfo() { return FRV_logininfo; } /* * FR_getShareURL: * * Input * none * * * Output * Full URL to the publicly accessible shared items */ function FR_getShareURL() { return FRV_shareurl; } /* * FR_feedInfo * * Input * feed : URL for the feed * * Output * Object with fields - * feed : Url for this feed * title : Display text for the feed * unread : Number of items in this feed that the user has not read * lastupdated : UNIX timestamp when the feed was last updated * from the server perspective. */ function FR_feedInfo(feed) { return FRV_feedhash[feed]; } /* * FR_allFeeds - List all subscribed feeds * * Input * None * * Output * Array of all subscribed feed URLs */ function FR_allFeeds() { return FRV_feedlist; } /* * FR_browseFeeds - Browse available feed bundles * * Input * None * * Output * Array of all available feed bundles * See the structure of FRV_browseFeeds for return format */ function FR_browseFeeds() { return FRV_browseFeeds; } /* * FR_addFeed - Subscribe to a new feed * (modifies DB) * * Input * Feed URL * * Output * None */ function FR_addFeed(feed) { $.merge(FRV_feedlist, [feed]) } /* * FR_removeFeed - Unsubscribe an existing feed * (modifies DB) * * Input * Feed URL * * Output * None */ function FR_removeFeed(feed) { FRV_folderHash[feed] = undefined; FRV_feedlist = $.grep(FRV_feedlist, function(f, i) { return feed != f;}); } /* * FR_isFeedSubscribed - Check if a feed URL has been subscribed * * Input * Feed URL * * Output * true : Feed has already been subscribed to * false : Feed has not been subscribed to */ function FR_isFeedSubscribed(feed) { return ($.indexOf(FRV_feedlist,feed) >= 0); } /* * FR_allTags - List all tags for the user * * Input * None * * Output * Array of unique tagnames */ function FR_allTags() { return $.grep($.keys(FRV_tagHash), function(t) { return t.match(/^[^_]/);}); } /* * FR_tagItem - Add a given tag to a given item * (modifies DB) * * Input * itemid : Item to be tagged * tag : tag name (new or existing) * * Output * None */ function FR_tagItem(itemid, tag) { var d = new Date(); // update the tag time FRV_tagTime[itemid + FRC_joinstring + tag] = d.getTime(); FRI_AddToList(FRV_tagHash, tag, itemid); } /* * FR_untagItem - Removes a given tag from a given item * (modifies DB) * * Input * itemid : Item to be tagged * tag : tag name to be removed * * Output * None */ function FR_untagItem(itemid, tag) { // update the tag time FRV_tagTime[itemid + FRC_joinstring + tag] = undefined; FRI_RemoveFromList(FRV_tagHash, tag, itemid); if (FRV_tagHash[tag].length == 0) { FRV_tagHash[tag] = undefined; } } /* * FR_untagAllForItem - Removes all user tags from a given item * (modifies DB) * * Input * itemid : Item to be untagged * * Output * None */ function FR_untagAllForItem(itemid) { $.each(FR_allTags(itemid), function(i, tag) { FR_untagItem(itemid, tag); }); } /* * Internal to mock api */ function FRI_tagsLookup(itemid) { var alltags = $.keys(FRV_tagHash); var tags = []; return $.grep(alltags, function(tag, i) { return ($.indexOf(FRV_tagHash[tag],itemid) >= 0); }); } /* * FR_tagsForItem - List tags for a given item * * Input * itemid : Item to be tagged * * Output * Array of tag names */ function FR_tagsForItem(itemid) { var tags = FRI_tagsLookup(itemid); return $.grep(tags, function(t) { return t.match(/^[^_]/);}); } /* * FR_taggedItems - Items tagged with a given tag * * Input * tagname : string value * * Output * Array of itemids which have been tagged with the tagname */ function FR_taggedItems(tagname) { return FRV_tagHash[tagname] ? FRV_tagHash[tagname] : []; } /* * FR_taggedTime - UNIX Time stamp at which the item was tagged * * Input * item : Item to be looked up * tag : tag to be looked up * * Output * UNIX timestamp when the item was tagged. * undefined if no timestamp * * NOTE: DO NOT check the timestamp to determine if an item has been * tagged or not. Use FR_tagsForItem * */ function FR_taggedTime(item, tagname) { return FRV_tagTime[item + FRC_joinstring + tagname]; } /* Brands: * Starred and Shared items are implemented using special tags: * _starred & _shared */ function FR_allBrands() { return FRV_brands; } /* * FR_brandedItems - Items which have been branded by a given brand * * Input * brand : starred / shared / read * * Output * Array of branded items */ function FR_brandedItems(brand) { return FR_taggedItems(FRC_brandPrefix + brand); } /* * FR_brandItem - Add a brand to a given item * (modifies DB) * * Input * itemid : Item to be branded * brand : starred / shared / read * * Output * None */ function FR_brandItem(itemid, brand) { return FR_tagItem(itemid, FRC_brandPrefix + brand); } /* * FR_unbrandItem - Remove a brand from a given item * (modifies DB) * * Input * itemid : Item to be unbranded * brand : starred / shared / read * * Output * None */ function FR_unbrandItem(itemid, brand) { return FR_untagItem(itemid, FRC_brandPrefix + brand); } /* * FR_isItemBranded - Check if an item has a given brand * * Input * itemid : Item to be checked * brand : starred/shared/read * * Output * Array of itemids which have the brand */ function FR_isItemBranded(itemid, brand) { var tags = FRI_tagsLookup(itemid); return ($.indexOf(tags, FRC_brandPrefix + brand) >= 0); } /* * FR_brandedTime - returns the timestamp when the item was branded (if it was) * * Input * itemid : Item to be checked * brand : starred/shared/read * * Output * UNIX timestamp */ function FR_brandedTime(itemid, brand) { return FR_taggedTime(itemid, FRC_brandPrefix + brand); } /* starred items */ /* * FR_getStarredItems - List of items that have been starred * * Input * None * * Output * Array of itemids which have been starred */ function FR_getStarredItems() { return FR_brandedItems('starred'); } /* * FR_starItem - Star a given item * (modifies DB) * * Input * itemid : * * Output * None */ function FR_starItem(itemid) { return FR_brandItem(itemid, 'starred'); } /* * FR_unstarItem - Unstar a given item * (modifies DB) * * Input * itemid : * * Output * None */ function FR_unstarItem(itemid) { return FR_unbrandItem(itemid, 'starred'); } /* * FR_isStarred - Check if an item is starred * * Input * itemid : * * Output * true : Itemid is starred * false : Itemid is not starred */ function FR_isStarred(itemid) { return FR_isItemBranded(itemid, 'starred'); } function FR_starredTime(itemid) { return FR_taggedTime(itemid, FRC_brandPrefix + 'starred'); } /* shared items - APIs similar to "starred items"*/ function FR_getSharedItems() { return FR_brandedItems('shared'); } function FR_shareItem(itemid) { return FR_brandItem(itemid, 'shared'); } function FR_unshareItem(itemid) { return FR_unbrandItem(itemid, 'shared'); } function FR_isShared(itemid) { return FR_isItemBranded(itemid, 'shared'); } function FR_sharedTime(itemid) { return FR_taggedTime(itemid, FRC_brandPrefix + 'shared'); } /* read items - APIs similar to "starred items" */ function FR_getReadItems() { return FR_brandedItems('read'); } function FR_setItemRead(itemid) { return FR_brandItem(itemid, 'read'); } function FR_setItemUnread(itemid) { return FR_unbrandItem(itemid, 'read'); } function FR_isItemRead(itemid) { return FR_isItemBranded(itemid, 'read'); } function FR_itemReadTime(itemid) { return FR_taggedTime(itemid, FRC_brandPrefix + 'read'); } /* Folder */ /* * FR_allFolders - List of all folders in the system * * Input * None * * Output * Array of folder names */ function FR_allFolders() { var folders = []; $.each($.values(FRV_folderHash), function(i, folderlist) { if (folderlist) $.merge(folders, folderlist); }); return folders; } /* * FR_moveToFolder - Move a feed into a different folder removing this * feed from any folder(s) it is currently present * (modifies DB) * * Input * feed : feed URL * folder : name of the folder to move into (new or existing) * * Output * None */ function FR_moveToFolder(feed, foldername) { FRV_folderHash[feed]= [foldername]; } /* * FR_copyToFolder - Copy a feed into a different folder leaving this * feed in any other folder(s) it is currently present, intact * (modifies DB) * * Input * feed : feed URL * folder : name of the folder to move into (new or existing) * * Output * None */ function FR_copyToFolder(feed, foldername) { if (!FRV_folderHash[feed]) { FRV_folderHash[feed] = []; } $.merge(FRV_folderHash[feed], [foldername]); } /* * FR_removeFromFolder - Remove a feed from its folder * (modifies DB) * * Input * feed : feed URL * folder : name of the folder to remove from (new or existing) * * Output * None */ function FR_removeFromFolder(feed, foldername) { if (foldername && FRV_folderHash[feed]) { var newhash = $.grep(FRV_folderHash[feed], function(f, i) { return (f != foldername); }); if (newhash.length == 0) newhash = undefined; FRV_folderHash[feed] = newhash; } } /* * FR_feedsInFolder - List of feeds in a given folder * * Input * folder : Name of the folder to list * * Output * Array of feed URLs in this folder */ function FR_feedsInFolder(foldername) { var feeds = []; var str = ''; var allentries = $.keys(FRV_folderHash); for (var i=0; i= 0) $.merge(feeds, [f]); } return feeds; } /* * FR_folderForFeed - Find the folder in which the feed resides * * Input * feed : Feed URL * * Output * list of folder names or [] (if feed is not under any folder) */ function FR_folderForFeed(feed) { try { if (FRV_folderHash[feed]) return FRV_folderHash[feed]; } catch(e) { } } /* * FR_getStats - Return the stats needed to display the reading trends * * Input * None * * Output * See the structure of FRV_sampleTrends for the return format */ function FR_getStats() { return FRV_trends; } /* * FR_sendEmail - allows sending an item from a given feed as an * email to a friend * * Input * to_address : Email address of the friend * subject : Subject for email * note : text message for the email * feed : URL of the feed * itemid : Item ID for the item being emailed * * Output * None - Success * String - error message */ function FR_sendEmail(to_address, subject, note, feed, itemid) { // Do nothing } /* Property functions */ /* * FR_getProperty - Get the value string for given property name * (modifies DB) * * Input * propname : Name of the property * * Output * string value of the property or null (if property not found) */ function FR_getProperty(propname) { try { if (FRV_properties[propname]) return FRV_properties[propname]; } catch(e) { } return null; } /* * FR_setProperty - Set the value string for given property name * (modifies DB) * * Input * propname : Name of the property to be set * value : string value to be set * * Output * None */ function FR_setProperty(propname, value) { FRV_properties[propname] = value; } function FR_cacheFeed(feed, title, lastupdated, unread) { FRV_feedhash[feed] = {feed:feed, title:title, lastupdated: lastupdated, unread: unread}; } /* Internal Functions */ function FRI_AddToList(obj, tag, feed) { if (obj[tag]) { $.merge(obj[tag], [feed]); } else { obj[tag] = [feed]; } } function FRI_RemoveFromList(obj, tag, feed) { if (obj[tag]) { obj[tag] = $.grep(obj[tag], function(f, i) { return f != feed;}); } } function FRI_feedInit(feedlist) { $.each(feedlist, function(i, feedInfo) { FRV_feedhash[feedInfo.feed] = feedInfo; }); /* FRV_feedhash = feedlist.inject(FRV_feedhash, function(feedhash, feedInfo, index) { feedhash[feedInfo.feed] = feedInfo; return feedhash; }); */ } var FRV_googleBundles = {"bundles":{"news":{"id":"news","title":"News","isadded":false,"subscriptions":[{"id":"feed/http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml","title":"BBC News (World)"},{"id":"feed/http://www.csmonitor.com/rss/top.rss","title":"Christian Science Monitor"},{"id":"feed/http://sports.espn.go.com/espn/rss/news","title":"ESPN.com"},{"id":"feed/http://news.google.com/?output\u003Drss","title":"Google News"},{"id":"feed/http://www.marketwatch.com/rss/topstories","title":"MarketWatch.com"},{"id":"feed/http://www.npr.org/rss/podcast.php?id\u003D500001","title":"NPR Podcast (7AM EST)"}]},"sports":{"id":"sports","title":"Sports","isadded":false,"subscriptions":[{"id":"feed/http://sports.espn.go.com/espn/rss/news","title":"ESPN.com"},{"id":"feed/http://newsrss.bbc.co.uk/rss/sportonline_world_edition/front_page/rss.xml","title":"BBC Sport"},{"id":"feed/http://sports.espn.go.com/keyword/search?searchString\u003Dbill_simmons\u0026feed\u003Drss\u0026src\u003Drss\u0026rT\u003Dsports","title":"Bill Simmons"},{"id":"feed/http://www.ericmcerlain.com/offwingopinion/index.rdf","title":"Off Wing Opinion"},{"id":"feed/http://www.themightymjd.com/feed/","title":"the mighty mjd sports blog"},{"id":"feed/http://www.sportsfrog.com/feed.xml","title":"The Sports Frog"},{"id":"feed/http://www.truehoop.com/atom.xml","title":"True Hoop"},{"id":"feed/http://yanksfansoxfan.typepad.com/ysfs/atom.xml","title":"Yanksfan vs Soxfan"},{"id":"feed/http://www.footbag.org/index2/index.rss","title":"Footbag WorldWide"}]},"fun":{"id":"fun","title":"Fun","isadded":false,"subscriptions":[{"id":"feed/http://www.comedycentral.com/rss/colbertvideos.jhtml","title":"Colbert Report Videos"},{"id":"feed/http://www.comedycentral.com/rss/tdsvideos.jhtml","title":"Daily Show Videos"},{"id":"feed/http://video.google.com/videofeed?type\u003Dtop100new","title":"Google Video Top 100"},{"id":"feed/http://www.quotationspage.com/data/qotd.rss","title":"Quotes of the Day"},{"id":"feed/http://www.theonion.com/content/feeds/daily","title":"The Onion"},{"id":"feed/http://youtube.com/rss/global/top_viewed_today.rss","title":"YouTube Most Viewed"}]},"thinkers":{"id":"thinkers","title":"Thinkers","isadded":false,"subscriptions":[{"id":"feed/http://www.freakonomics.com/blog/feed/","title":"Freakonomics Blog"},{"id":"feed/http://gladwell.typepad.com/gladwellcom/atom.xml","title":"Malcolm Gladwell\u0027s Blog"},{"id":"feed/http://www.kottke.org/remainder/index.rdf","title":"kottke.org remaindered links"},{"id":"feed/http://itre.cis.upenn.edu/~myl/languagelog/index.rdf","title":"Language Log"},{"id":"feed/http://www.languagehat.com/index.rdf","title":"LanguageHat"},{"id":"feed/http://www.marginalrevolution.com/marginalrevolution/index.rdf","title":"Marginal Revolution"},{"id":"feed/http://www.npr.org/rss/podcast.php?id\u003D4538138","title":"NPR: This I Believe"},{"id":"feed/http://feeds.salon.com/salon/index","title":"Salon"},{"id":"feed/http://tedblog.typepad.com/tedblog/atom.xml","title":"TED Blog"}]},"celebrities":{"id":"celebrities","title":"Celebrities","isadded":false,"subscriptions":[{"id":"feed/http://www.defamer.com/index.xml","title":"Defamer"},{"id":"feed/http://www.gawker.com/index.xml","title":"Gawker"},{"id":"feed/http://www.perezhilton.com/index.xml","title":"PerezHilton"},{"id":"feed/http://feeds.feedburner.com/popsugar","title":"PopSugar"},{"id":"feed/http://www.thesuperficial.com/index.xml","title":"The Superficial"}]},"geeky":{"id":"geeky","title":"Geeky","isadded":false,"subscriptions":[{"id":"feed/http://feeds.feedburner.com/CoolTools","title":"Cool Tools"},{"id":"feed/http://lifehacker.com/index.xml","title":"Lifehacker"},{"id":"feed/http://www.makezine.com/blog/index.xml","title":"MAKE Magazine"},{"id":"feed/http://www.penny-arcade.com/rss.xml","title":"Penny-Arcade"},{"id":"feed/http://www.pvrblog.com/pvr/index.rdf","title":"PVRblog"}]},"video":{"id":"video","title":"Video","isadded":false,"subscriptions":[{"id":"feed/http://feeds.feedburner.com/AskANinja","title":"Ask A Ninja"},{"id":"feed/http://video.google.com/videofeed?type\u003Dtop100new","title":"Google Video Top 100"},{"id":"feed/http://feeds.feedburner.com/hotair/vent","title":"Hot Air TV"},{"id":"feed/http://www.rocketboom.com/vlog/atom.xml","title":"Rocketboom"},{"id":"feed/http://www.zefrank.com/theshow/atom.xml","title":"The Show with zefrank"},{"id":"feed/http://feeds.feedburner.com/TikiBarTV","title":"Tiki Bar TV"},{"id":"feed/http://youtube.com/rss/global/top_viewed_today.rss","title":"YouTube Most Viewed"}]},"food":{"id":"food","title":"Food","isadded":false,"subscriptions":[{"id":"feed/http://chocolateandzucchini.com/index.rdf","title":"Chocolate \u0026 Zucchini"},{"id":"feed/http://dinersjournal.blogs.nytimes.com/?feed\u003Drss2","title":"Diner\u0027s Journal"},{"id":"feed/http://www.megnut.com/index.xml","title":"Megnut"},{"id":"feed/http://feeds.feedburner.com/PurpleLiquidAWineAndFoodDiary","title":"Purple Liquid"},{"id":"feed/http://www.amateurgourmet.com/the_amateur_gourmet/atom.xml","title":"The Amateur Gourmet"},{"id":"feed/http://www.thefoodsection.com/foodsection/index.rdf","title":"The Food Section"}]},"finance":{"id":"finance","title":"Finance","isadded":false,"subscriptions":[{"id":"feed/http://rss.cnn.com/rss/money_topstories.rss","title":"CNNMoney.com"},{"id":"feed/http://www.iwillteachyoutoberich.com/atom.xml","title":"I Will Teach You To Be Rich"},{"id":"feed/http://www.marketwatch.com/rss/topstories","title":"MarketWatch.com"},{"id":"feed/http://www.pfblog.com/index.xml","title":"Personal Finance Blog"},{"id":"feed/http://www.fool.com/About/headlines/rss_headlines.asp","title":"The Motley Fool"},{"id":"feed/http://www.thestreet.com/feeds/rss/index.xml","title":"TheStreet.com"}]},"google-related":{"id":"google-related","title":"Google-related","isadded":false,"subscriptions":[{"id":"feed/http://blog.outer-court.com/rss.xml","title":"Google Blogoscoped"},{"id":"feed/http://googlesightseeing.com/feed/","title":"Google Sightseeing"},{"id":"feed/http://battellemedia.com/index.xml","title":"John Battelle\u0027s Searchblog"},{"id":"feed/http://googleblog.blogspot.com/atom.xml","title":"Official Google Blog"},{"id":"feed/http://googlereader.blogspot.com/atom.xml","title":"Official Google Reader Blog"},{"id":"feed/http://googlevideo.blogspot.com/atom.xml","title":"Official Google Video Blog"}]},"technology":{"id":"technology","title":"Technology","isadded":false,"subscriptions":[{"id":"feed/http://digg.com/rss/index.xml","title":"Digg"},{"id":"feed/http://www.engadget.com/rss.xml","title":"Engadget"},{"id":"feed/http://slashdot.org/index.rss","title":"Slashdot"},{"id":"feed/http://feeds.feedburner.com/Techcrunch","title":"TechCrunch"},{"id":"feed/http://www.wired.com/news/feeds/rss2/0,2610,,00.xml","title":"Wired News"}]},"small-business":{"id":"small-business","title":"Small-business","isadded":false,"subscriptions":[{"id":"feed/http://www.businesspundit.com/index.rdf","title":"Businesspundit"},{"id":"feed/http://exacttarget.typepad.com/chrisbaggott/atom.xml","title":"Email Marketing Best Practices"},{"id":"feed/http://www.churchofthecustomer.com/blog/index.rdf","title":"Church of the Customer Blog"},{"id":"feed/http://feeds.feedburner.com/ducttapemarketing/nRUD","title":"Duct Tape Marketing"},{"id":"feed/http://sethgodin.typepad.com/seths_blog/atom.xml","title":"Seth\u0027s Blog"},{"id":"feed/http://feeds.feedburner.com/SmallBusinessTrends","title":"Small Business Trends"},{"id":"feed/http://forum.belmont.edu/cornwall/atom.xml","title":"The Entrepreneurial Mind"}]},"science":{"id":"science","title":"Science","isadded":false,"subscriptions":[{"id":"feed/http://scienceblogs.com/cognitivedaily/atom.xml","title":"Cognitive Daily"},{"id":"feed/http://cosmicvariance.com/feed/","title":"Cosmic Variance"},{"id":"feed/http://news.nationalgeographic.com/index.rss","title":"National Geographic News"},{"id":"feed/http://www.nature.com/news/rss.rdf","title":"Nature.com"},{"id":"feed/http://www.realclimate.org/feed/rss2/","title":"RealClimate"},{"id":"feed/http://www.sciam.com/xml/sciam.xml","title":"Scientific American"}]},"photography":{"id":"photography","title":"Photography","isadded":false,"subscriptions":[{"id":"feed/http://www.durhamtownship.com/index.rdf","title":"A Walk Through Durham Township, Pennsylvania"},{"id":"feed/http://wvs.topleftpixel.com/index_fullfeed.rdf","title":"[daily dose of imagery]"},{"id":"feed/http://www.dpreview.com/news/dpr.rdf","title":"Digital Photography Review"},{"id":"feed/http://www.filemagazine.com/thecollection/atom.xml","title":"FILE Magazine"},{"id":"feed/http://www.greyscalegorilla.com/index.php?x\u003Drss","title":"greyscalegorilla"},{"id":"feed/http://groundglass.ca/index.xml","title":"groundglass"},{"id":"feed/http://www.mylalaland.com/hello/index.xml","title":"HELLO"},{"id":"feed/http://feeds.feedburner.com/ngpod","title":"National Geographic Photo of the Day"},{"id":"feed/http://www.photoflavor.com/index.xml","title":"photoflavor"},{"id":"feed/http://www.photojojo.com/content/feed","title":"Photojojo"},{"id":"feed/http://vitrineenillumina.zerosun6.com/index.php?x\u003Drss","title":"vitrine en illumina"}]},"cars":{"id":"cars","title":"Cars","isadded":false,"subscriptions":[{"id":"feed/http://www.autoblog.com/rss.xml","title":"Autoblog"},{"id":"feed/http://carscarscars.blogs.com/index/atom.xml","title":"Cars! Cars! Cars!"},{"id":"feed/http://www.jalopnik.com/index.xml","title":"Jalopnik"},{"id":"feed/http://feeds.popularmechanics.com/pm/blogs/automotive_news","title":"PopularMechanics Automotive News"},{"id":"feed/http://www.thetruthaboutcars.com/?feed\u003Drss2","title":"The Truth About Cars"}]}}}; var FRV_sampleTrends = { period : { /* Last 30 days : Array of 30 numbers, one for item count each day */ month : [ 0, 10, 0, 0, 0, 0, 10, 5, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 ], /* Time of day : Array of 24 numbers, one for each hourly period * starting with index 0 = midnight - 1AM */ day : [ 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 2 ], /* Day of week : Array of 7 numbers, one for each day of week * starting with index 0 = Sunday*/ week : [ 8, 2, 1, 0, 2, 0, 4 ] }, /* * For each feed, stats like number of items read, percent read, * number of items shared, starred, emailed, read on mobile */ itemstats : [// Feed 1 {feed: 'http://rss.cnn.com/rss/cnn_topstories.rss', link: "http://www.cnn.com/?eref\u003Drss_topstories", nread: 6, percentread: 22, shared: 0, starred: 3, emailed: 1, readonmobile: 1 }, // Feed 2 {feed: 'http://www.comedycentral.com/rss/colbertvideos.jhtml', link:"http://www.comedycentral.com/shows/the_colbert_report/index.jhtml?rsspartner\u003DrssFeedfetcherGoogle", nread: 4, percentread: 16, shared: 1, starred: 0, emailed: 3, readonmobile: 0 } // More feeds ], /* * ordered list of feeds which are frequently updated * and those which are inactive */ update_frequency: { frequent: [ {feed: 'http://www.comedycentral.com/rss/colbertvideos.jhtml', items_per_day: 8, percent_read: 16 }, {feed: 'http://rss.cnn.com/rss/cnn_topstories.rss', items_per_day: 4, percent_read: 12 } // More feeds ], inactive: [ // least active 'http://www.comedycentral.com/rss/colbertvideos.jhtml', // next least active 'http://rss.cnn.com/rss/cnn_topstories.rss' // More feeds ] } } /* * Return a given tip by its number * Internal to mockapi */ function FR_getTips(num) { if (!num) { num = Math.round(FRV_tips.length*Math.random()); } return FRV_tips[num]; } yocto-reader/reader/reader.js0000644000004100000000000025341010735421010015766 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /* * Element naming conventions: * id='' * * Prefix: ol (Operation list box in left margin) * af (Add Feed box in left margin) * fl (Feed list box in left margin) * sfl (Sub folder) * hm (Home View) * lv (List View) * tpl (Template container) * * class='-' * Type: fld (Templated element field) * */ /* -------------------------------------------- * State Variables. * If any of these variables are changed, * dont forget to call the corresponding * update function(s) *--------------------------------------------*/ var FRS_folders = []; // List of folders var FRS_feedinfo_list = []; // List of all subscribed feeds var FRS_tags = []; // List of all tags var FRS_current_item = null; var FEEDLOAD_NUMENTRIES = 7; var FEEDLOAD_INTERVAL = 150; var ALL_VIEWS = '#listview,#searchview,#settingsview,' + '#browsefeedsview,#home,#trendsview'; var SETTING_TABS = ['subscriptions','labels','goodies','importexport','extras']; //Container for all dom element references var DOM = {}; function reader_main(initCallback) { // Init subsystems FR_init(initCallback); FR_setProperty(FRP_SCROLL_TRACKING, ''); //FR_setProperty(FRP_START_PAGE, '?tag/tag1'); // FR_setProperty(FRP_EXPANDED_VIEW, 'true'); Reader.init(); // Reload the feeds periodically Reader.reloadFeeds(); setInterval(Reader.reloadFeeds.bind(this), FC_updateInterval); ReaderViewer.init(); Settings.init(); Reader.hideLoading(); handle_resize(); var start_page = location.search.length > 0? location.search : ( FR_getProperty(FRP_START_PAGE)); handle_permalinks(start_page); $(document).keyup(handle_keycuts); } function handle_resize() { var winh, winw; var sizeElements = {}; sizeElements['msie'] = {obj: document.documentElement, fieldHeight: 'clientHeight', fieldWidth: 'clientWidth'}; sizeElements['opera'] = sizeElements['safari'] = sizeElements['mozilla'] = {obj: window, fieldHeight: 'innerHeight', fieldHeight: 'innerWidth'}; $.each(sizeElements, function(browsertype, info) { if ($.browser[browsertype]) { if (!winh) { winh = info.obj[info.fieldHeight]; winw = info.obj[info.fieldWidth]; } } }); if ($.browser.mozilla) { winh = window.innerHeight; winw = window.innerWidth; } if ($.browser.mozilla) { var pos = $("#nav-toggler").positionedOffset(); var delh = winh - pos[1]; $("#nav-toggler").css('height', delh + 'px'); } if (ReaderViewer.state == stateListView) { var pos = $("#entries").positionedOffset(); var delh = winh - pos[1] - $("#chrome-footer-container")[0].offsetHeight; var delw = winw - pos[0]; $("#entries").css('width', delw + 'px'); $("#entries").css('height', delh + 'px'); } var node; try { node = $("#browsefeedsview"); var pos = node.positionedOffset(); var delh = winh - pos[1]; var delw = winw - pos[0]; node.css('height', delh + 'px'); } catch(e) { // alert(e.message); } if (!$.browser.msie) { if (ReaderViewer.viewtype == 'TrendsView') { var pos = $("#trends").positionedOffset(); var delh = winh - pos[1]; var delw = winw - pos[0]; $("#trends").css('width', delw + 'px'); $("#trends").css('height', delh + 'px'); } var elem = $("#sub-tree-resizer"); var rpos = elem.positionedOffset(); var rdelh = winh - rpos[1] - 15 - $("#sub-tree-footer")[0].offsetHeight; elem.css('height', rdelh + 'px'); } } // Create state machines var Reader = new StateMachine(stateList, ReaderFSM); var ReaderViewer = new StateMachine(stateListView, RVFSM); var Settings = new StateMachine(stateSubs, STFSM); /* * Reload data from backend */ Reader.init = function(evt) { this.state = 'List'; this.buttonClicked($('#ol-home')); if (!this.domLoaded) { this.domLoaded = true; // Setup DOM by browser and version var body = $(document.body); if ($.browser.mozilla) { body.addClass('mozilla'); } else if ($.browser.msie) { body.addClass('ie'); var ver = parseFloat($.browser.version); if (ver <= 6.0) { body.addClass('ie6'); } } else if ($.browser.opera) { body.addClass('opera'); } else if ($.browser.safari) { body.addClass('safari'); } DOM.quickadd = $("#quickadd"); DOM.recentStarred = $("#recent-activity-star"); DOM.recentShared = $("#recent-activity-share"); $(document.body).click(body_clicked); $(window).resize(handle_resize); /* DOM.navToggler = $("#nav-toggler"); DOM.navToggler.hover( DOM.navToggler.addClass.bind(DOM.navToggler, 'hover'), DOM.navToggler.removeClass.bind(DOM.navToggler, 'hover')), */ } // Initially populate unread counts from cached value // from database $.each(FR_allFeeds(), function(i, feed) { try { FC_updateUnread(feed, FR_feedInfo(feed).unread); } catch(e) {} }); Reader.handleEvent("evOpen"); Reader.handleEvent("evHome", $("#ol-home")[0]); } Reader.toggleNav = function() { if ($(document.body).is(".hide-nav")) this.handleEvent('evOpen'); else this.handleEvent('evClose'); } Reader.close = function(evt) { $(document.body).addClass("hide-nav"); } Reader.open = function(evt) { $(document.body).removeClass("hide-nav"); Reader.handleEvent('evRefresh'); } /* * Fetch all the feeds and see if there are any new items, * If so update the counts and flash the corresponding feed/folder * in Reader view. */ Reader.reloadFeeds = function() { $.each(FR_allFeeds(), function(i, feed) { FC_retreiveFeed(feed); }); } /* * Redraw the UI with the latest data */ Reader.refresh = function(evt) { this.brands = FR_allBrands(); var folders = this.folders = FR_allFolders(); this.feedlist = FR_allFeeds(); this.orphans = $.grep(this.feedlist, function(feed) { return (!FR_folderForFeed(feed)); }); this.tags = $.grep(FR_allTags(), function(tag) { return ($.indexOf(folders,tag) < 0); }); this.folderNodes = {}; this.brandNodes = {}; // Populate the brands var brand_bindings = $('#ol-brandlist').clear().populate(this.brands, '#tpl-brandlist'); $.each(brand_bindings, function(i, bind) { Reader.brandNodes[bind.obj.brand] = bind.node; if (Reader.brand) { if (bind.obj.brand == Reader.brand) { Reader.buttonClicked(bind.node[0], true); } } }); // Populate the folders var folder_bindings = $('#fl-folderlist').clear().populate(this.folders, '#tpl-folder'); Reader.folderNodes = new Object; Reader.feedNodes = new Object; Reader.tagNodes = new Object; var feed_bindings; // For each folder, populate the feeds in that folder $.each(folder_bindings, function(i, binding) { var node = binding.node; var folder = binding.obj; // Store the UI node displaying this folder in folderNodes Reader.folderNodes[folder] = node; var feeds_in_folder = FR_feedsInFolder(folder); var feed_infos = $.map(feeds_in_folder,FR_feedInfo); node.attr("name", folder); feed_bindings = $('.sfl-container',node).populate(feed_infos, '#tpl-feed'); // For each feed in the folder, hash the UI node in feedNodes $.each(feed_bindings, function (i, info) { var fnode = Reader.feedNodes[info.obj.feed]; if (fnode) { Reader.feedNodes[info.obj.feed] = fnode.addnodes(info.node); } else { Reader.feedNodes[info.obj.feed] = info.node; } }); // Remember if this folder was collapsed last time. if (FR_getProperty(FRP_FOLDER_STATE + folder) == 'open') { Reader.toggleFolder(folder); } }); if(this.folder && this.folderNodes[this.folder]) { this.buttonClicked($('.folder-selector', this.folderNodes[this.folder]), true); } // Populate the feeds not part of any folder feed_bindings = $('#fl-feedlist').clear().populate( $.map(this.orphans,FR_feedInfo),'#tpl-feed'); // For each feed at top level, hash the UI node in feedNodes $.each(feed_bindings, function (i, info) { Reader.feedNodes[info.obj.feed] = info.node; }); if (this.feed && this.feedNodes[this.feed]) { this.buttonClicked($('.feed-selector', this.feedNodes[this.feed]), true); } // Populate the tag list var tag_bindings = $('#fl-taglist').clear().populate(this.tags, '#tpl-tagfolder'); $.each(tag_bindings, function(i, info) { Reader.tagNodes[info.obj] = info.node; }); this.updateFeedCount(this.feedlist); } Reader.buttonClicked = function(node, from_code) { if (node) { if (!from_code) this.feed = this.brand = this.folder = this.tag = undefined; this.elem = node; } if (this.selectedNode) { this.selectedNode.removeClass('selected'); } this.selectedNode = $(this.elem); if (this.selectedNode) { this.selectedNode.addClass('selected'); } $('.navigated').removeClass('navigated'); } /* // XXX Reader.buttonClicked1 = function(node) { if (node) { this.feed = this.brand = this.folder = undefined; this.elem = node; } if (this.selectedNode) { this.selectedNode.removeClass('selected'); } if (this.elem) { this.selectedNode = $(this.elem); } this.selectedNode.addClass('selected'); } */ Reader.allitems = function(evt) { this.buttonClicked(); if (ReaderViewer.viewtype != 'AllItemsView') { ReaderViewer.listLoaded = false; ReaderViewer.viewtype = 'AllItemsView'; } ReaderViewer.handleEvent('evListView'); } Reader.home = function(evt) { this.buttonClicked(); ReaderViewer.viewtype = 'HomeView'; ReaderViewer.handleEvent('evListView'); } Reader.trends = function(evt) { this.buttonClicked(); ReaderViewer.viewtype = 'TrendsView'; ReaderViewer.handleEvent('evListView'); } Reader.quickadd = function (evt) { var s = $('#add-box'); var o = s.positionedOffset(); var s = $('#quick-add-bubble-holder'); s.css('top', o [1] + "px"); s.css('left', o [0] + "px"); s.show(); try { DOM.quickadd.setdata('cnn')[0].focus(); } catch(e) {} } Reader.browse = function(evt) { ReaderViewer.viewtype = 'FeedDiscoveryView'; ReaderViewer.handleEvent('evListView'); } Reader.bundleAdded = function(bundle_name) { FR_setProperty(FRP_BUNDLE_STATE + bundle_name, 'added'); } Reader.openFolder = function(folder) { var node = Reader.folderNodes[folder]; if (node) Reader.buttonClicked($('.folder-selector', node)); this.folder = folder; ReaderViewer.viewtype = 'SubscriptionView'; ReaderViewer.listLoaded = false; Reader.feedFilter = FR_feedsInFolder(folder); ReaderViewer.handleEvent('evListView'); } Reader.expandFolder = function(folder) { var node = Reader.folderNodes[folder]; if (node && node.is(".collapsed")) this.toggleFolder(folder) } Reader.collapseFolder = function(folder) { var node = Reader.folderNodes[folder]; if (node && node.is(".expanded")) this.toggleFolder(folder) } Reader.openTagEvent = function(evt, data) { return this.openTag(data); } Reader.openTag = function(tag) { this.buttonClicked($('.tag-selector', this.tagNodes[tag])); this.tag = tag; ReaderViewer.viewtype = 'TagView'; ReaderViewer.listLoaded = false; ReaderViewer.handleEvent('evListView'); } Reader.openStarredEvent = function(evt) { return Reader.openBrand('starred'); } Reader.openSharedEvent = function(evt) { return Reader.openBrand('shared'); } Reader.openBrand = function(brand) { if (this.brandNodes[brand]) this.buttonClicked(this.brandNodes[brand]); this.brand = brand; ReaderViewer.viewtype = "BrandView"; ReaderViewer.listLoaded = false; ReaderViewer.handleEvent('evListView'); } Reader.showSettings = function(evt) { // Switch to settings state this.state = 'Settings'; Settings.show(); } Reader.displaySubList = function(evt) { Settings.showsubscriptions(); } Reader.displayTagList = function(evt) { Settings.showlabels(); } /* * These events dont make sense since they are dependant on * a sequence of actions not captured in the state diagrams. * Example - rename involves displaying the rename box and * pressing OK. * So instead of blindly implementing these event handles * that dont make sense, I have indicated the events in the * actual UI handles. */ /* Reader.subsFilter = function(evt) { Settings.filterSubs(); } Reader.subsRename = function(evt) { // #subs-rename-button save_rename_clicked(this.elem); } Reader.subsAddTag = function(evt) { } Reader.subsDelete = function(evt) { } Reader.subsTagSelected = function(evt) { } Reader.subsDeleteSelected = function(evt) { } Reader.subsSelect = function(evt) { } */ /* Prefs Pane */ Reader.prefsRevert = function(evt) { FR_setProperty(FRP_REVERT, 'true'); } Reader.prefsSetHome = function(evt, data) { FR_setProperty(FRP_START_PAGE, data); } Reader.prefsScrollTracking = function(evt, data) { FR_setProperty(FRP_SCROLL_TRACKING, data?'true':null); } /* Import Export Pane - best done at server */ Reader.importExport = function(evt) { } /* Goodies Pane - cool links */ Reader.goodies = function(evt) { } Reader.toggleFolder = function(folder) { var node = Reader.folderNodes[folder]; if (node) { node = $(node); node.toggleClass('expanded'); node.toggleClass('collapsed'); // Save State if (node.is('.expanded')) { FR_setProperty(FRP_FOLDER_STATE + folder, 'open'); } else { FR_setProperty(FRP_FOLDER_STATE + folder, 'closed'); } } } Reader.openFeedEvent = function(evt, data) { return Reader.openFeed(data); } Reader.openFeed = function(feedurl) { var node = Reader.feedNodes[feedurl]; if (node) Reader.buttonClicked($('.feed-selector', node)); this.feed = feedurl; ReaderViewer.viewtype = 'SubscriptionView'; ReaderViewer.listLoaded = false; Reader.feedFilter = []; Reader.feedFilter.push(feedurl); var folders = FR_folderForFeed(feedurl); if (folders && folders.length > 0) { $.each(folders, function(i, folder) { Reader.expandFolder(folder); }); } // alert('[' + folder + '] ' + ReaderViewer.feedFilter.length); ReaderViewer.handleEvent('evListView'); } Reader.removeFeed = function(feed) { FR_removeFeed(feed); FC_clearUnread(feed);; this.handleEvent('evRefresh'); } Reader.flashNode = function(anode) { anode.addClass('updated'); setTimeout(function() { anode.removeClass('updated'); anode.addClass('updated-intermediate'); setTimeout(function() { anode.removeClass('updated-intermediate'); }, 500); }, 500); } Reader.flashFeeds = function(feeds) { var folders = []; $.each(feeds, function(i, feed) { if (FR_folderForFeed(feed)) $.merge(folders, FR_folderForFeed(feed)); var node = Reader.feedNodes[feed]; if (node) Reader.flashNode($(".feed-selector", node)); }); $.each(folders, function(i, folder) { var node = Reader.folderNodes[folder]; if (node) Reader.flashNode($(".folder-selector", node)); }); } /* * Updated the unread count for given feeds, their folders & All Items */ Reader.updateFeedCount = function(feeds, items) { var folders = []; var unread = 0; if (!items) items = []; $.each(feeds, function(i, feed) { if (FR_folderForFeed(feed)) $.merge(folders, FR_folderForFeed(feed)); if (Reader.feedNodes[feed]) { unread = FC_getUnread(feed); Reader.setUnreadNode('feed', feed, unread); } }); $.each(items, function(i, itemid) { $.merge(folders, FR_tagsForItem(itemid)); }); $.each(folders, function(i, folder) { unread = 0; $.each(FR_feedsInFolder(folder), function(i, feed) { unread += FC_getUnread(feed); }); // Folder can also be a tag ... handle this. $.each(FR_taggedItems(folder), function(i, itemid) { if (!FR_isItemRead(itemid)) { unread++; } }); Reader.setUnreadNode('folder', folder, unread); }); $.each(['starred', 'shared'], function(i, brand) { var items = FR_brandedItems(brand); var bunread = 0; $.each(items, function(i, item) { var feed = FC_getItemFeed(item); if (feed && !FR_isItemRead(item)) { bunread++; } }); Reader.setUnreadNode('brand', brand, bunread); }); unread = FC_getUnreadAll(); // check Reader.setUnreadNode('allitems', 'allitems', unread); } Reader.setUnreadNode = function(nodetype, name, unread) { var node, expr; switch (nodetype) { case 'feed': expr = ".fld-unread"; node = this.feedNodes[name]; break; case 'folder': expr = ".fld-folder_unread"; node = this.folderNodes[name]; break; case 'brand': expr = ".fld-brand_unread"; node = this.brandNodes[name]; break; case 'allitems': expr = ".fld-all_unread"; node = $("#ol-allitems"); break; // case 'tag': // break; } if (node) { $(expr, node).setdata(unread); if (unread > 0) node.addClass('unread'); else node.removeClass('unread'); } ReaderViewer.displayUnreadCount(nodetype, name, unread) } /* * In ther reader feedlist, toggle between showing all feeds/folders * and showing only updated feeds/folders */ Reader.showUpdatedOnly = function() { $("#ol-feedlist").addClass("updatedonly"); } Reader.showAll = function() { $("#ol-feedlist").removeClass("updatedonly"); } Reader.sortUpdatedOrAll = function() { $("#ol-feedlist").toggleClass("updatedonly"); } Reader.showLoading = function() { $('#loading-area').removeClass('hidden'); } Reader.hideLoading = function() { $('#loading-area').addClass('hidden'); } Reader.settingsSubTab = function(evt) { Settings.viewtype = 'SubView'; $("#setting-subscriptions").click(); Reader.handleEvent('evSettingsView'); } Reader.settingsPrefTab = function(evt) { Settings.viewtype = 'PrefView'; $("#setting-extra").click(); Reader.handleEvent('evSettingsView'); } Reader.settingsTagTab = function(evt) { Settings.viewtype = 'TagView'; $("#setting-labels").click(); Reader.handleEvent('evSettingsView'); } Reader.settingsGoodiesTab = function(evt) { Settings.viewtype = 'GoodiesView'; $("#setting-goodies").click(); Reader.handleEvent('evSettingsView'); } Reader.settingsImexportTab = function(evt) { Settings.viewtype = 'ImexportView'; $("#setting-importexport").click(); Reader.handleEvent('evSettingsView'); } Reader.returnToReader = function(evt) { this.state = 'List'; StateVars.PreviousView = true; Settings.hide(); ReaderViewer.handleEvent('evListView'); } ReaderViewer.init = function() { this.expandedView = false; if (FR_getProperty(FRP_EXPANDED_VIEW) == 'true') { this.handleEvent('evToggleExpanded'); // coverage } this.SortMode = 'newest'; this.listLoaded = false; this.homeLoaded = false; this.generation = 0; this.viewtype = 'HomeView'; this.homeviewFeeds = {}; this.homeviewFolders = {}; if (!this.domLoaded) { // Dont barf if init is called more than once this.domLoaded = true; // Tag edit form setup $("#hover-tags-edit//input.iv-addtags-input"). enter(ReaderViewer.saveTags.bind(ReaderViewer, null)); // Trendview setup $("#trends-period-tab").maketab('tab-header', 'tab-contents'); $("#trends-brand-tab").maketab('tab-header', 'tab-contents'); $("#trends-freq-tab").maketab('tab-header', 'tab-contents'); DOM.quickadd.enter(function() { ReaderViewer.viewtype = 'SearchResultsView'; ReaderViewer.handleEvent('evListView'); }); $("#entries").scroll(this.handleScroll.bind(this)); } // this.refresh(); } ReaderViewer.refresh = function(evt) { switch(this.state) { case stateListView: this.listview(); break; /* case stateHomeView: this.homeview(); break; case stateTrendsView: this.trendsview(); break; */ } } ReaderViewer.setStatus = function(str) { $('#lv-status').setdata(str); } ReaderViewer.setTitle = function(str) { $('#lv-title').setdata(str); } ReaderViewer.renameCurrentFeed = function(evt) { if (this.viewtype == 'SubscriptionView') { var newname = prompt('Enter new name for feed:'); if (!newname.match(/^\s*$/)) FR_cacheFeed(Reader.feed, newname); ReaderViewer.handleEvent('evRefresh'); } } ReaderViewer.deleteCurrentFeed = function(evt) { if (this.viewtype == 'SubscriptionView') { FR_removeFeed(Reader.feed); Reader.handleEvent("evHome", $("#ol-home")[0]); } } ReaderViewer.openFeedForItem = function(evt) { var feed = $('.fld-feed', this.elem).getdata(); Reader.openFeed(feed); } ReaderViewer.openItemSite = function(evt) { // Nothing to do, html takes care of it } ReaderViewer.openItemEmail = function(evt) { // Nothing to do, html takes care of it } /* * Change the Settings dropdown menu in listview, at the top right */ ReaderViewer.setMenu = function(kind) { this.menuKind = kind; $("#lv-settings-menu,#lv-settings-menu-contents").removeClass("allitems-menu"); $("#lv-settings-menu,#lv-settings-menu-contents").removeClass("folder-menu"); $("#lv-settings-menu,#lv-settings-menu-contents").removeClass("single-feed-menu"); $("#lv-settings-menu,#lv-settings-menu-contents").removeClass("brand-menu"); $("#lv-settings-menu,#lv-settings-menu-contents").addClass(kind + "-menu"); if (kind == 'single-feed') { var node = $("#lv-settings-menu-contents"); populateFolders(node, Reader.feed, function() { $("ul.contents", node).removeClass('hidden'); node.addClass('hidden'); }); } $("#order-by-newest,#order-by-oldest,$order-by-magic", $("#lv-settings-menu-contents")).removeClass("chooser-item-selected"); $("#order-by-" + this.SortMode, $("#lv-settings-menu-contents")). addClass("chooser-item-selected"); } ReaderViewer.homeview = function(evt) { // All views $(ALL_VIEWS).hide(); $('body,html').addClass('homeview'); $('#home').show(); make_permalink('home'); // Not in spec // if (this.homeLoaded) { // return; // } this.displayTips(); this.displayRecently(); var container = $('#hm-container').clear(); var fr = new FeedRenderer (); $.each(Reader.feedlist, function(i, feed) { fr.add(feed); }); fr.numEntries = 3; Reader.showLoading(); var bindings = fr.render(container, $('.tpl-summary', $("#templates"))); /* Cache the nodes for filling in feed & folder unread count */ ReaderViewer.homeviewFolders = {}; ReaderViewer.homeviewFeeds = {}; /* $.each(bindings, function(i, bind) { var node = bind.node; var feed = bind.feed; var folder = $('.fld-folder', node).getdata(); if (feed) { ReaderViewer.homeviewFeeds[feed] = $('.fld-feedunread', node); } if (folder) { ReaderViewer.homeviewFolders[folder] = $('.fld-folderunread', node); } alert(node[0].innerHTML); }); */ this.homeLoaded = true; } ReaderViewer.homeItemLoaded = function(node, feed, folder) { if (feed) { ReaderViewer.homeviewFeeds[feed] = $('.fld-feedunread', node); } if (folder) { var fnode = ReaderViewer.homeviewFolders[folder]; if (fnode) ReaderViewer.homeviewFolders[folder] = fnode.addnodes($('.fld-folderunread', node)); else ReaderViewer.homeviewFolders[folder] = $('.fld-folderunread', node); } Reader.hideLoading(); } ReaderViewer.listview = function(evt) { // We call listview for the sake of correctness against specs. // for everything (homeview, searchfeedsview) etc. if (this.viewtype == 'HomeView') { Reader.page = 'home'; return this.homeview(); } if (this.viewtype == 'SearchResultsView') { Reader.page = 'search'; return this.searchfeedsview(); } if (this.viewtype == 'FeedDiscoveryView') { Reader.page = 'browse'; return this.browseFeeds(); } if (this.viewtype == 'TrendsView') { Reader.page = 'trends'; return this.trendsview(); } // The real list view begins here $(ALL_VIEWS).hide(); $('body,html').removeClass('homeview'); $('#listview').show(); // not in specs - removing // if (this.state == stateListView && this.listLoaded) // return; FRS_current_item = undefined; // Switch RV state to list view this.state = stateListView; handle_resize(); this.generation++; var container = $('#entries').clear(); var fr = new FeedRenderer (); fr.numEntries = 100; Reader.showLoading(); this.setLVCount(''); this.setStatus('loading ...'); this.itemNodes = []; var sink = this.sink = new Injector(this.feedLoaded.bind(this, this.generation), FEEDLOAD_NUMENTRIES, FEEDLOAD_INTERVAL); switch (this.viewtype) { case 'AllItemsView': Reader.page = 'allitems'; this.setTitle("All Items"); this.setMenu('allitems'); make_permalink('allitems'); $.each(Reader.feedlist,function(i,feed) { fr.add(feed); }); break; case 'SubscriptionView': if (Reader.folder) make_permalink('folder', Reader.folder); else make_permalink('feed', Reader.feed); this.setTitle(Reader.folder ? Reader.folder : FR_feedInfo(Reader.feed).title); this.setMenu(Reader.folder?'folder': 'single-feed'); $.each(Reader.feedFilter, function(i, feed) { fr.add(feed); }); // Folder can also be a tag for items - so load these too sink.inject($.map(FR_taggedItems(Reader.folder), FC_lookupItemId)); break; case 'BrandView': make_permalink(Reader.brand); this.setTitle("Your " + Reader.brand +" items"); this.setMenu('brand'); /* In Shared View, we need a text section in the top explaining * what the shared view is and how to share */ if (Reader.brand == 'shared') container.append($('.tpl-sharedview-hdr', $("#templates")).clone(true)); sink.inject($.map(FR_brandedItems(Reader.brand), FC_lookupItemId)); Reader.hideLoading(); this.listLoaded = true; return; case 'TagView': make_permalink('tag', Reader.tag); this.setTitle(Reader.tag); this.setMenu('folder'); sink.inject($.map(FR_taggedItems(Reader.tag), FC_lookupItemId)); Reader.hideLoading(); this.listLoaded = true; return; } Reader.showLoading(); this.numItems = 0; this.numUnread = 0; fr.startLoading(sink); this.listLoaded = true; } ReaderViewer.sortBy = function(how) { this.SortMode = how; this.handleEvent('evRefresh'); } ReaderViewer.showUnreadOnly = function() { $("#listview").addClass("unreadonly"); } ReaderViewer.showAll = function() { $("#listview").removeClass("unreadonly"); } ReaderViewer.updateLVCount = function() { var read = $("#entries//.brand-read").length; var unread = $("#entries//.entry").length - read; this.setLVCount(unread); } ReaderViewer.setLVCount = function(count) { var node = $(".lv-unread-count"); if (count < 10) { node.setdata(count); return; } else if (count < 100) { factor = 10; } else if (count < 1000) { factor = 100; } else { factor = 1000; } node.setdata(parseInt(count/factor) * factor + '+'); } ReaderViewer.nextItem = function(scanOnly) { var rows; if (!FRS_current_item) { rows = $("#entries//.entry"); } else { rows = $(FRS_current_item).parent().next().children('.entry'); } if (rows.length > 0) { if (scanOnly) { item_select(rows[0]); } else { item_clicked(rows[0]); } card_recenter($(rows[0])); } } ReaderViewer.prevItem = function(scanOnly) { var rows; if (!FRS_current_item) { rows = $("#entries//.entry"); } else { rows = $(FRS_current_item).parent().prev().children('.entry'); } if (rows.length > 0) { if (scanOnly) { item_select(rows[0]); } else { item_clicked(rows[0]); } card_recenter($(rows[0])); } } ReaderViewer.toggleItemOpen = function() { if (FRS_current_item) { $(FRS_current_item).toggleClass('expanded'); } } ReaderViewer.starCurrentItem = function() { if (FRS_current_item) { star_clicked($(".item-star", $(FRS_current_item))[0]); } } ReaderViewer.shareCurrentItem = function() { if (FRS_current_item) { $(".item-share", $(FRS_current_item)).click(); } } ReaderViewer.toggleItemRead = function() { if (FRS_current_item) { var node = $(FRS_current_item); var itemid = $(".fld-entries-itemid", node); if (itemid.length) { var id = itemid[0].value; if (!FR_isItemRead(id)) { FC_setItemRead(id); node.addClass('brand-read'); } else { FC_setItemUnread(id); node.removeClass('brand-read'); } } } } ReaderViewer.tagItem = function() { if (FRS_current_item) { var node = $(FRS_current_item); var tagger = $(".iv-edittags", node); ReaderViewer.handleEvent('evAddTag', tagger[0]); } } ReaderViewer.viewOriginal = function() { if (FRS_current_item) { var link_a = $("a.fld-entries-link", $(FRS_current_item)); if (link_a.length) { window.open(link_a[0].href, 'yacto-reader-newsitem'); } } } ReaderViewer.trendsview = function(evt) { $(ALL_VIEWS).hide(); $('body,html').removeClass('homeview'); // this.state = stateTrendsView; $('#trendsview').show(); handle_resize(); make_permalink('trends'); var stats = FR_getStats(); var dayscaling = get_scaling(stats.period.month) var hourscaling = get_scaling(stats.period.day); var dowscaling = get_scaling(stats.period.week); /* Handle periodic tab */ var day = $("#day-bucket-chart-contents").populate(dayscaling); var hour = $("#hour-bucket-chart-contents").populate(hourscaling); var dow = $("#dow-bucket-chart-contents").populate(dowscaling); populateGraph(day, ".tpl-day-bucket-cell", dayscaling, stats.period.month); populateGraph(hour, ".tpl-hour-bucket-cell", hourscaling, stats.period.day); populateGraph(dow, ".tpl-dow-bucket-cell", dowscaling, stats.period.week); /* Handle reading trends tabs */ populateTrends("#trends-most-read-sorting-contents//tbody", ".tpl-reading-trends-read", stats.itemstats, 'nread'); populateTrends("#trends-most-starred-sorting-contents//tbody", ".tpl-reading-trends-starred", stats.itemstats, 'starred'); populateTrends("#trends-most-shared-sorting-contents//tbody", ".tpl-reading-trends-shared", stats.itemstats, 'shared'); populateTrends("#trends-most-emailed-sorting-contents//tbody", ".tpl-reading-trends-emailed", stats.itemstats, 'emailed'); populateTrends("#trends-mobile-sorting-contents//tbody", ".tpl-reading-trends-mobile", stats.itemstats, 'readonmobile'); /* Handle subscription trends tabs */ populateTrends('#trends-most-updated-sorting-contents//tbody', '.tpl-subs-trends-freq', stats.update_frequency.frequent, 'items_per_day', true); populateTrends('#trends-least-updated-sorting-contents//tbody', '.tpl-subs-trends-inactive', $.map(stats.update_frequency.inactive, FR_feedInfo), undefined, true); var totalstats = { nfeeds : 0, nread : 0, nstarred: 0, nshared : 0, nemailed : 0 }; $.each(stats.itemstats, function(i, stat) { totalstats.nfeeds++; totalstats.nread += stat.nread; totalstats.nstarred += stat.starred; totalstats.nshared += stat.shared; totalstats.nemailed += stat.emailed; }); $("#trends-item-count-header").populateObject(totalstats); var tagcloud = $("#trends-tag-cloud"); tagcloud.children().remove(); var tagtemp = $(".tpl-tag-cloud", $("#templates")); var clouds = tagcloud.populateArray(FR_allFolders(), tagtemp); var tagstats = {}; var max_items = 0; var max_readitems = 0; $.each(clouds, function(i, binding) { var items = 0; var readitems = 0; var feeds = FR_feedsInFolder(binding.obj); if (feeds) { items = feeds.length; $.each(stats.itemstats, function(i, stat) { if ($.indexOf(feeds, stat.feed) >= 0) { readitems += stat.nread; } }); } tagstats[binding.obj] = {items: items, readitems: readitems, node:binding.node}; if (items > max_items) max_items = items; if (readitems > max_readitems) max_readitems = readitems; }); $.each(tagstats, function(tag, tagstat) { var notch = Math.round(5.0 * tagstat.items / max_items); tagstat.node.addClass("x" + notch); var notch1 = Math.round(5.0 * tagstat.readitems / max_readitems); tagstat.node.addClass("y" + notch1); }); } Reader.navNext = function() { var node = $('.navigated'); if (!node || !node.length) node = Reader.selectedNode; var saved = node; // If this not a folder,feed or tag node ... if (!node || !node.parents('#fl-folderlist,#fl-feedlist,#fl-taglist').length) { node = $('span.link', $("#fl-folderlist")); if (node.length > 1) node = $(node[0]); } else { node = $('span.link', node.parents('li').next()); } if (!node || !node.length) { node = $('span.link', saved.parents('#fl-folderlist,#fl-feedlist,#fl-taglist').next()); } if (node.length > 1) node = $(node[0]); $('.navigated').removeClass('navigated'); if (node && node.length) { node.addClass('navigated'); } } Reader.navPrev = function() { var node = $('.navigated'); if (!node || !node.length) node = Reader.selectedNode; var saved = node; // If this not a folder,feed or tag node ... if (!node || !node.parents('#fl-folderlist,#fl-feedlist,#fl-taglist').length) { node = $("#fl-taglist").children('li').children('span.link'); if (node.length > 1) node = $(node[node.length-1]); } else { node = node.parents('li').prev().children('span.link'); } if (!node || !node.length) { node = saved.parents('#fl-folderlist,#fl-feedlist,#fl-taglist').prev().children('li').children('span.link'); if (node.length > 1) node = $(node[node.length-1]); } $('.navigated').removeClass('navigated'); if (node && node.length) { node.addClass('navigated'); } } Reader.navOpenSelected = function() { var node = $('.navigated'); if (node.length > 0) { if (node.is('.tag-selector')) { node.parents('li.tag').click(); } else { $('.folder-invoke,.feed-invoke', node).andSelf().click(); } } } Reader.navToggleExpand = function() { var node = $('.navigated'); if (node.length > 0) $('div.toggle', node.parent('li.folder')).click(); } Reader.toggleFullScreen = function() { if ($(document.body).is('.hide-nav')) { Reader.open(); } else { Reader.close(); } } Reader.openPromptedFeed = function() { var feed = prompt('Feed to open:'); $("#fl-feedlist//span.fld-title:contains('" + feed+ "')").parents('.feed-invoke').click(); } /* * Function to populate the bar graph for trends */ function populateGraph(node, expr, scaling, statlist) { $(".bucket-scale-dyncell", node).remove(); $.each(statlist, function(i, val) { var cell = $(expr, $("#templates")).clone(true); cell.attr('title', val); // XXX add a prefix $(".bucket", cell).css('height', parseInt(1+100*val/scaling.scalemax) + 'px'); cell.appendTo($(".bucket-scale-dynrow", node)); }); } /* * Function to populate the entrie trends screen */ function populateTrends(expr, template, orgstats, field, nosort) { var tmpstats; if (field) { tmpstats = $.grep($.clone(orgstats), function(stat) { return stat[field] > 0; }); } else { tmpstats = $.clone(orgstats); } /* Sort if needed */ var stats; if (!nosort) { stats = []; $.each(tmpstats, function(i, stat) { var found = false; for (var j=0; j= 3) rt.addClass('bundle-extra'); bundlesData[p].feedcount = ''+bundlesData[p].subscriptions.length; // FeedRenderer.prototype.renderObject (bundlesData[p], rt, template); rt.populateFeed(bundlesData[p]); var link = $(".bundle-invoke", rt); var title = bundlesData[p].title; link.click(function(event){ event = jQuery.event.fix( event || window.event || {} ); ReaderViewer.handleEvent('evTag', event.target); return false;}); if (FR_getProperty(FRP_BUNDLE_STATE + title) == 'added') { rt.addClass('bundle-added'); } var bi = $(".feeds-bundle-data", rt); bi.each(function(i) {this.bundleData = bundlesData[p];}); bnum++; } } Reader.hideLoading(); // fr.renderSearchResult ($('#quickadd')[0].value, container, $('#tpl-search')); this.searchLoaded = true; } ReaderViewer.showbundle = function(evt) { if (this.viewtype == 'FeedDiscoveryView') { var node = this.elem; var topnode = $(node).parents('.tpl-bundle-news'); var inp = $(".feeds-bundle-data", topnode); var folder = inp[0].bundleData.title; // var folder= node.href; if (folder.match(/([^\/]+)$/)) { folder = RegExp.$1; } Reader.openFolder(folder); } return false; } ReaderViewer.showImport = function(evt) { if (this.viewtype == 'FeedDiscoveryView') { Reader.settingsImexportTab(); } } ReaderViewer.searchfeedsview = function (evt) { $(ALL_VIEWS).hide(); $('body,html').removeClass('homeview'); $('#quick-add-bubble-holder').hide(); $('#searchview').show(); Reader.showLoading (); var container = $('#sr-container'); container.children().remove(); var fr = new FeedRenderer (); Reader.showLoading(); var keyword = DOM.quickadd.getdata(); $("#sv-keyword").setdata(keyword); make_permalink('search', keyword); fr.renderSearchResult (keyword, container, $('#tpl-search')); this.searchLoaded = true; } ReaderViewer.searchInBrowse = function(evt) { DOM.quickadd.setdata($('#directory-search-query').getdata()); this.viewtype = 'SearchResultsView'; this.handleEvent('evListView'); } ReaderViewer.toggleExpanded = function(evt) { this.expandedView = !this.expandedView; if (this.expandedView) { $("#view-cards").addClass('tab-header-selected'); $("#view-list").removeClass('tab-header-selected'); FR_setProperty(FRP_EXPANDED_VIEW, 'true'); } else { $("#view-list").addClass('tab-header-selected'); $("#view-cards").removeClass('tab-header-selected'); FR_setProperty(FRP_EXPANDED_VIEW, null); } this.handleEvent('evListView'); } ReaderViewer.setExpanded = function(expanded) { if (expanded != this.expandedView) this.handleEvent('evToggleExpanded'); } ReaderViewer.feedLoaded = function(generation, entries) { // There is no way to STOP a feed being loaded. // So we use this trick if (generation != this.generation) return; if (this.expandedView) { $("#entries")[0].className = 'expanded'; } else { $("#entries")[0].className = 'list'; } var feeds = []; $.each(entries, function(i, property) { var itemid = property['entries-itemid']; var node = $(ReaderViewer.expandedView?'.tpl-entry-exp':'.tpl-entry', $("#templates")).clone(true); var itemnode = {node:node, timestamp:property.timestamp}; var placed = false; switch (ReaderViewer.SortMode) { case 'newest': $.each(ReaderViewer.itemNodes, function(i, item) { if (item.timestamp < property.timestamp) { node.insertBefore(item.node); var newnodes = ReaderViewer.itemNodes.slice(0,i); newnodes.push(itemnode); $.merge(newnodes, ReaderViewer.itemNodes.slice(i)); ReaderViewer.itemNodes = newnodes; placed = true; return false; } }); break; case 'oldest': $.each(ReaderViewer.itemNodes, function(i, item) { if (item.timestamp > property.timestamp) { node.insertBefore(item.node); var newnodes = ReaderViewer.itemNodes.slice(0,i); newnodes.push(itemnode); $.merge(newnodes, ReaderViewer.itemNodes.slice(i)); ReaderViewer.itemNodes = newnodes; placed = true; return false; } }); break; default: break; } if (!placed) { node.appendTo($('#entries')); ReaderViewer.itemNodes.push(itemnode); placed = true; } node.populate(property); $(".user-tags-list", node).populateArray(FR_tagsForItem(itemid), $("#tpl-iv-tag-list", $("#templates"))); setBranding(node, property); $.merge(feeds, [property.feed]); if (itemid == ReaderViewer.current_itemid) { FRS_current_item = $(".entry", node).addClass('expanded').attr('id', 'current-entry')[0]; } }); if (this.expandedView) { $("#entries//.entry").click(card_clicked); } Reader.updateFeedCount(feeds); this.numItems += entries.length; this.setLVCount(this.numItems); this.setStatus(' ' + this.numItems + ' items'); Reader.hideLoading(); } ReaderViewer.searchAddFolder = function(node, event) { var topnode = $(node); //".sv-folder-menu"); var dropdown = $(".sv-folder-menu-contents", topnode); var inactive = dropdown.is('.hidden'); if (inactive) { dropdown.removeClass('hidden'); // var bc = $('.button-container', topnode); // dropdown[0].style.width = bc[0].offsetWidth + 'px'; } else { dropdown.addClass('hidden'); } } ReaderViewer.searchFolderHide = function() { $(".sv-folder-menu-contents").addClass('hidden'); } ReaderViewer.searchViewFeed = function(node, event) { var feed = $("input.fld-entries-url", node.parentNode).getdata(); var folders = FR_folderForFeed(feed); if (folders && folders.length > 0) { Reader.expandFolder(folders[0]); } Reader.openFeed(feed); } ReaderViewer.searchRemoveFeed = function(node, event) { if (!confirm("Are you sure you want to unsubscribe this feed?")) { return; } // Unsubscribe the feed var feed = $("input.fld-entries-url", node.parentNode).getdata(); Reader.removeFeed(feed); // Mark this search entry as unsubscribed $(node).parents(".tpl-search").removeClass("result-subscribed"); } ReaderViewer.removeSubscribedFeed = function(evt) { return this.searchRemoveFeed(this.elem); } ReaderViewer.settingsClicked = function(node, event) { var topnode = $("#lv-settings-menu"); var dropdown = $("#lv-settings-menu-contents"); var inactive = dropdown.is('.hidden'); if (inactive) { dropdown.removeClass('hidden'); // var bc = $('.button-container', topnode); // dropdown[0].style.width = bc[0].offsetWidth + 'px'; } else { dropdown.addClass('hidden'); } } ReaderViewer.settingsHide = function() { var dropdown = $("#lv-settings-menu-contents"); dropdown.addClass('hidden'); } ReaderViewer.itemEditTags = function(evt) { return this.editTags(this.elem); } ReaderViewer.editTags = function(node, event) { node = $(node); var topnode = node.parents(".entry"); var itemid = $(".fld-entries-itemid", topnode).getdata(); if(itemid.length > 0) { this.currentItem = itemid; this.currentItemNode = node.parents(".iv-main"); var tpl = $("#hover-tags-edit"); var pos = node.positionedOffset(); var l = (pos[0]+node[0].offsetWidth+2)+'px'; var t = (pos[1]-15)+'px'; // alert(l + ',' + t); tpl.css('left', l). css('top', t).show(); /* populate with current tags */ var tags = FR_tagsForItem(itemid).join(', '); $("input.iv-addtags-input", tpl).setdata(tags)[0].focus(); } } ReaderViewer.saveTags = function(node, event) { var tpl = $("#hover-tags-edit") if (this.currentItem) { var itemid = this.currentItem; var node = this.currentItemNode; this.currentItem = this.currentItemNode = undefined; var tags = $.map($("input.iv-addtags-input", tpl).getdata().split(','), $.trim); FR_untagAllForItem(itemid); $.each(tags, function(i, tag) { FR_tagItem(itemid, tag); }); var taglist = $(".user-tags-list", node); taglist.children().remove(); taglist.populateArray(FR_tagsForItem(itemid), $("#tpl-iv-tag-list", $("#templates"))); Reader.refresh(); } tpl.hide(); } ReaderViewer.close = function() { // Huh ?? } ReaderViewer.cancelTags = function(node, event) { var tpl = $("#hover-tags-edit") tpl.hide(); this.currentItem = undefined; } ReaderViewer.openDevBlog = function(evt) { window.open(FRU_devBlog); } ReaderViewer.openTips = function(evt) { window.open(FRU_tips); } ReaderViewer.displayTips = function(evt) { $(".hv-tips-container").populateObject(FR_getTips()); } ReaderViewer.displayBundles = function(evt) { // Bundles are displayed as part of the main refresh // So nothing to do here } ReaderViewer.displayUnread = function(evt) { // Unread is displayed as part of the main refresh // So nothing to do here } var dbg = true; ReaderViewer.displayUnreadCount = function(nodetype, name, unread) { if (nodetype == 'feed') { try { this.homeviewFeeds[name].setdata('('+unread+')'); } catch(e){} } else if (nodetype == 'folder') { try { // alert(unread); this.homeviewFolders[name].setdata('('+unread+')'); } catch(e){} } } ReaderViewer.displayRecently = function(evt) { var entries = FR_getStarredItems(); var node = DOM.recentStarred; if (entries && entries.length>0) { entries = entries.slice(entries.length-3); node.show().children('.tpl-recent').remove(); node.populateArray($.map(entries, FC_lookupItemId), ".tpl-recent"); } else { node.hide(); } entries = FR_getSharedItems(); entries = entries.slice(entries.length-3); node = DOM.recentShared; if (entries && entries.length>0) { entries = entries.slice(entries.length-3); node.show().children('.tpl-recent').remove(); node.populateArray($.map(entries, FC_lookupItemId), ".tpl-recent"); } else { node.hide(); } } Settings.init = function() { this.viewtype = 'SubView'; this.currentTab = 'subscriptions'; DOM.subsFilterInput = $("#subs-filter-input"); if (!this.domLoaded) { // Dont barf if init is called more than once this.domLoaded = true; DOM.subsFilterInput.enter(this.filterSubs.bind(this)). keyup(this.filterSubs.bind(this)); } DOM.settings = $("#settings"); } Settings.show = function() { // Show the settings section and hide everything else $('#main').hide(); DOM.settings.show(); $("body,html").addClass('settings'); switch(Settings.viewtype) { case 'SubView': make_permalink('settings', 'subs'); this.currentTab = 'subscriptions'; break; case 'PrefView': make_permalink('settings', 'prefs'); this.currentTab = 'extras'; break; case 'TagView': make_permalink('settings', 'labels'); this.currentTab = 'labels'; break; case 'ImexportView': make_permalink('settings', 'imexport'); this.currentTab = 'importexport'; break; case 'GoodiesView': make_permalink('settings', 'goodies'); this.currentTab = 'goodies'; break; } $.each(SETTING_TABS, function(i, tab) { $('#setting-' + tab).removeClass('selected'); $('.setting-tab-' + tab).removeClass('selected'); }); $('#setting-' + this.currentTab).addClass('selected'); $('.setting-tab-' + this.currentTab).addClass('selected'); this['show' + this.currentTab](); } /* Settings.showtab = function(newtab) { this.currentTab = newtab; this.show(); } */ Settings.showextras = function() { var folders = FR_allFolders(); var tags = FR_allTags(); var select = $("#settings-prefs-dropdown"); select.children(".dynamic").remove(); $.each(folders, function(i, folder) { var option = $(document.createElement('option')).addClass('dynamic').setdata(folder).appendTo(select); option[0].value = '?folder/' + folder; }); $.each(tags, function(i, tag) { var option = $(document.createElement('option')).addClass('dynamic').setdata(tag).appendTo(select); option[0].value = '?tag/' + tag; }); select[0].value = FR_getProperty(FRP_START_PAGE); var scrollchk = $('#settings-prefs-scroll'); scrollchk.attr('checked', FR_getProperty(FRP_SCROLL_TRACKING)); } Settings.showimportexport = function() { } Settings.showgoodies = function() { } Settings.showsubscriptions = function() { if (!this.selectedFeeds) this.selectedFeeds = []; var subs = $.map(Reader.feedlist, FR_feedInfo); $.each(subs, function(i, sub) { var folders = FR_folderForFeed(sub.feed); if (folders) { sub.folders = folders.join(', '); } }); var subsnode = $('#subscriptions'); subsnode.children().each(function() {$(this).remove();}); var bindings = subsnode.populateArray(subs, $('.tpl-settings-row,.tpl-settings-row1', $("#templates"))); $.each(bindings, function(i, b) { if ($.indexOf(Settings.selectedFeeds, b.obj.feed)>=0) { $(".chkbox", b.node).attr('checked', 'checked'); } populateFolders(b.node, b.obj.feed, Settings.subsUpdateTags.bind(Settings, b.node, b.obj.feed)); }); $("#subs-total").setdata(subs.length); if (this.selectedFeeds.length > 0) { this.updateFolders([]); } } Settings.subsUpdateTags = function(topnode, feed) { var folders = FR_folderForFeed(feed); if (!folders) folders = []; $(".fld-folders", topnode).setdata(folders.join(", ")); } Settings.hide = function() { DOM.settings.hide(); $('#main').show(); $("body,html").removeClass('settings'); } /* -- Subscriptions tab -- */ Settings.show_folders_dropdown = function (topnode) { var feed = $(".feedid", topnode)[0].value; var dropdown = $("ul.contents", topnode); var inactive = dropdown.is('.hidden'); /* Close all open dropdowns */ this.hide_folder_dropdowns(); if (inactive) { dropdown.removeClass('hidden'); var bc = $('.button-container', topnode); dropdown[0].style.width = bc[0].offsetWidth + 'px'; } else { dropdown.addClass('hidden'); } } Settings.hide_folder_dropdowns = function() { $(".tpl-settings-row//ul.contents").addClass('hidden'); } /* Settings.choice_clicked = function(feed, folder, remove, topnode) { if (remove) { FR_removeFromFolder(feed, folder); } else { FR_copyToFolder(feed, folder); } Reader.refresh(); this.show(); } */ Settings.show_rename = function(topnode) { var feed = $(".feedid", topnode)[0].value; var feedinfo = FR_feedInfo(feed); if (feedinfo) { return $("#hover-form", $("#globalnodes")). populateObject(feedinfo); } } Settings.do_rename = function(feed, newtitle) { FR_cacheFeed(feed, newtitle); Reader.refresh(); this.show(); } Settings.remove_feed = function(topnode) { var feed = $(".feedid", topnode)[0].value; ReaderViewer.homeLoaded = false; Reader.removeFeed(feed); this.show(); } Settings.select_all = function() { var settings = DOM.settings; var folders = []; this.selectedFeeds = FR_allFeeds(); $('.tpl-settings-row//.chkbox', settings).attr('checked', 'checked'); $('.tpl-settings-row//.fld-folders', settings).each( function() { $.merge(folders, $(this).getdata().split(',')); }); this.updateFolders(folders); } Settings.select_none = function() { var settings = DOM.settings; this.selectedFeeds = []; $('.tpl-settings-row//.chkbox', settings).attr('checked', ''); this.updateFolders([]); } Settings.select_unassigned = function() { var settings = DOM.settings; this.selectedFeeds = []; $('.tpl-settings-row', settings).each(function() { if ($('.fld-folders', $(this)).getdata() == '') { Settings.selectedFeeds.push($('.fld-feed', $(this)).getdata()); $('.chkbox', $(this)).attr('checked', 'checked'); } else { $('.chkbox', $(this)).attr('checked', ''); } }); this.updateFolders([]); } Settings.unsubscribeSelected = function() { if (!this.selectedFeeds || this.selectedFeeds.length == 0) { alert("Please select the feeds you want to unsubscribe from"); return; } if (!confirm("Are you sure you want to unsubscribe from selected feeds?")) { return; } Reader.showLoading(); ReaderViewer.homeLoaded = false; $.each(this.selectedFeeds, function(i, feed) { Reader.removeFeed(feed); }); Reader.hideLoading(); this.selectedFeeds = []; this.show(); } Settings.filterSubs = function() { var key = DOM.subsFilterInput.getdata(); var settings = $("#settings"); $('.tpl-settings-row', settings).each(function() { var feed = $('.fld-feed', $(this)).getdata() var folders = FR_folderForFeed(feed); var feedinfo = FR_feedInfo(feed); if (feed.indexOf(key) >= 0 || feedinfo.title.indexOf(key) >= 0 || (folders && folders.join('___').indexOf(key) >= 0)) { $(this).removeClass('hidden').next(".tpl-settings-row1").removeClass('hidden'); } else { $(this).addClass('hidden').next(".tpl-settings-row1").addClass('hidden'); } }); } Settings.checkChanged = function() { var settings = DOM.settings; var folders = []; this.selectedFeeds = []; $('.tpl-settings-row', settings).each(function() { if ($('.chkbox', $(this)).attr('checked')) { Settings.selectedFeeds.push($('.fld-feed', $(this)).getdata()); var fstr = $('.fld-folders', $(this)).getdata(); if (fstr) $.merge(folders, fstr.split(',')); } }); this.updateFolders(folders); } Settings.updateFolders = function(remove_list) { remove_list = $.uniq($.map(remove_list, $.trim)); var options = $('#subs-folder-options', DOM.settings).setdata(''); var allfolders = FR_allFolders(); $.merge(allfolders, FR_allTags()); var option = $(document.createElement('option')).attr('value', '0'); option[0].innerHTML = 'More actions...'; options.append(option); option = $(document.createElement('option')). attr('disabled', 'disabled').attr('value', '0'); option[0].innerHTML = 'Add tag...'; options.append(option); // Add all folders $.each(allfolders, function(i, f) { option = $(document.createElement('option')). attr('value', f).addClass('a').addClass('label'); option[0].innerHTML = f; options.append(option); }); if (remove_list && remove_list.length > 0) { option = $(document.createElement('option')). attr('disabled', 'disabled'); option[0].innerHTML = 'Remove tag...'; options.append(option); // Add remove_list $.each(remove_list, function(i, f) { option = $(document.createElement('option')). attr('value', f).addClass('a').addClass('label'). addClass('remove'); option[0].innerHTML = f; options.append(option); }); } // options.change(Settings.folderChanged.bind(Settings, options[0])); } Settings.folderChanged = function(node, event) { var settings = DOM.settings; var opt = $(node.options[node.selectedIndex]); var remove = false; var folder = opt[0].value; if (folder != '0') { if (opt.is('.remove')) { remove = true; } $('.tpl-settings-row', settings).each(function() { var feed = $('.fld-feed', $(this))[0].value; if ($('.chkbox', $(this)).attr('checked')) { if (remove) { FR_removeFromFolder(feed, folder); } else FR_copyToFolder(feed, folder); } }); Reader.refresh(); this.show(); } } /* -- Tag tab -- */ Settings.showlabels = function() { if (!this.selectedLabels) this.selectedLabels = []; var allfolders = FR_allFolders(); $.merge(allfolders, FR_allTags()); var topnode = $("#settings"); var tbody = $('#labels-list', topnode); tbody.children('.tpl-tags-row').remove(); $(".labels-change-sharing")[0].selectedIndex = 0; var finfos = $.map(allfolders, function(f) { var info = {folder: f}; return info; }); var bindings = tbody.populateArray(finfos, $('.tpl-tags-row', $("#templates"))); bindings.push({node: $(".labels-list-starred"), obj: {folder : "_starred"}}); bindings.push({node: $(".labels-list-shared"), obj: {folder : "_shared"}}); $.each(bindings, function(i, bind) { if (FR_getProperty(FRP_FOLDER_SHARE + bind.obj.folder) == 'public') { bind.node.addClass('is-public'); } if ($.indexOf(Settings.selectedLabels,bind.obj.folder) >= 0) { $(".chkbox", bind.node).attr('checked', 'checked'); } else { $(".chkbox", bind.node).attr('checked', ''); } }); if (FR_getProperty(FRP_FOLDER_SHARE + "_starred") =='public') $(".labels-list-starred").addClass("is-public"); else $(".labels-list-starred").removeClass("is-public"); $("#labels-total").setdata(bindings.length); } Settings.togglepublic_clicked = function(event) { event = jQuery.event.fix( event || window.event || {} ); var topnode = $(event.target).parents(".data-row"); if (!topnode.is(".labels-list-shared")) { var isPublic = topnode.is(".is-public"); var folder = $(".fld-folder", topnode).getdata(); if (isPublic) { FR_setProperty(FRP_FOLDER_SHARE + folder, null); topnode.removeClass('is-public'); } else { FR_setProperty(FRP_FOLDER_SHARE + folder, 'public'); topnode.addClass('is-public'); } } } Settings.removefolder_clicked = function(event) { event = jQuery.event.fix( event || window.event || {} ); var topnode = $(event.target).parents(".data-row"); var folder = $(".fld-folder", topnode).getdata(); if (confirm('Are you sure you want to remove the "' + folder + '" label ?')) { this.removeFolder(topnode); $("#labels-total").setdata($(".data-row", $("#setting-labels")).length); } } Settings.removeFolder = function(topnode) { var folder = $(".fld-folder", topnode).getdata(); if (!folder.match(/^_/)) { var feeds = FR_feedsInFolder(folder); if (feeds) $.each(feeds, function(i, f) {FR_removeFromFolder(f, folder);}); var items = FR_taggedItems(folder); if (items) $.each(items, function(i, item) {FR_untagItem(item, folder);}); topnode.remove(); Reader.refresh(); } } Settings.removeSelectedTags = function() { if ($.grep(this.selectedLabels, function(label) { return label.match(/^_/);}).length > 0) { alert("You cannot remove your starred or shared items"); return; } if (confirm("Are you sure you want to remove the selected labels?")) { $(".chkbox", $("#setting-labels")).each(function() { var opt = $(this); if (opt.attr('checked')) { var topnode = opt.parents(".data-row"); Settings.removeFolder(topnode); } }); $("#labels-total").setdata($(".data-row", $("#setting-labels")).length); } } Settings.tagCheckChanged = function(node) { node = $(node); var folder = $(".fld-folder", node.parents(".data-row")).getdata(); if (node.attr('checked')) { this.selectedLabels.push(folder); this.selectedLabels = $.uniq(this.selectedLabels); } else { this.selectedLabels = $.grep(this.selectedLabels, function(l) { return l != folder; }); } } Settings.shareOptionChanged = function(node) { var makePrivate = true; if (node.value != '0') { if (node.value == 'public') { makePrivate = false; } $(".chkbox", $("#setting-labels")).each(function() { var opt = $(this); if (opt.attr('checked')) { var topnode = opt.parents(".data-row"); var isPublic = topnode.is(".is-public"); var folder = $(".fld-folder", topnode).getdata(); if (makePrivate && !topnode.is('.labels-list-shared')) { FR_setProperty(FRP_FOLDER_SHARE + folder, null); topnode.removeClass('is-public'); } else { FR_setProperty(FRP_FOLDER_SHARE + folder, 'public'); topnode.addClass('is-public'); } } }); node.selectedIndex = 0; } } Settings.select_alltags = function() { $(".chkbox", $("#setting-labels")).attr('checked', 'checked'); var allfolders = FR_allFolders(); $.merge(allfolders, FR_allTags()); this.selectedLabels = allfolders; } Settings.select_notags = function() { $(".chkbox", $("#setting-labels")).attr('checked', ''); this.selectedLabels = []; } Settings.select_publictags = function() { this.selectedLabels = []; $(".chkbox", $("#setting-labels")).each(function() { var topnode = $(this).parents(".data-row"); if (topnode.is(".is-public")) { Settings.selectedLabels.push($(".fld-folder", topnode).getdata()); $(this).attr('checked', 'checked'); } else { $(this).attr('checked', ''); } }); } Settings.select_privatetags = function() { this.selectedLabels = []; $(".chkbox", $("#setting-labels")).each(function() { var topnode = $(this).parents(".data-row"); if (topnode.is(".is-public")) { $(this).attr('checked', ''); } else { Settings.selectedLabels.push($(".fld-folder", topnode).getdata()); $(this).attr('checked', 'checked'); } }); } //-- UI state manipulation code -- function setBranding(node, property) { var itemid = property['entries-itemid']; if (itemid) { if (FR_isStarred(itemid)) { node.addClass('brand-starred'); } else { node.removeClass('brand-starred'); } if (FR_isShared(itemid)) { node.addClass('brand-shared'); } else { node.removeClass('brand-shared'); } if (FR_isItemRead(itemid)) { node.addClass('brand-read'); } else { node.removeClass('brand-read'); // FC_updateUnread(property.feed, 1); } } } //-- Reader UI callbacks -- /*function home_clicked(node) { Reader.handleEvent('evHome', node); } function allitems_clicked(node) { Reader.handleEvent('evAllItems', node); } function quickadd_clicked (node) { Reader.handleEvent('evQuickAdd', node); } function browse_clicked (node) { ReaderViewer.handleEvent('evBrowse', node); } function searchfeeds_clicked (node) { ReaderViewer.handleEvent ('evSearchFeeds', node); } */ function quickadd_close_clicked(node) { $("#quick-add-bubble-holder").hide(); } function subscribeFeed_clicked (node) { var inp = $("input.fld-entries-url", node); var feed = {title: '', feed: ''}; feed.feed = inp[0].value; inp = $("input.fld-entries-title", node); feed.title = inp[0].value; FR_cacheFeed(feed.feed, feed.title); FR_addFeed(feed.feed); // Start retreiving the items FC_retreiveFeed(feed.feed); ReaderViewer.handleEvent('evSubSubscribed', node); Reader.handleEvent('evRefresh', node); } ReaderViewer.addBundleOrFeed = function(evt) { if (this.viewtype == 'FeedDiscoveryView') { return subscribeBundle_clicked(this.elem); } else if (this.viewtype == 'SearchResultsView') { subscribeFeed_clicked(this.elem); } } ReaderViewer.doSearch = function() { // Search results are displayed as part of the main refresh // So nothing to do here } ReaderViewer.returnToFD = function() { if(this.viewtype == 'SearchResultsView') { Reader.handleEvent('evBrowse'); } } ReaderViewer.searchFeedSubscribed = function(evt) { var node = this.elem; // markup the search and switch button display var topnode = $(node).parents(".tpl-search"); topnode.addClass('result-subscribed'); } ReaderViewer.openSubscribedFeed = function(evt) { this.searchViewFeed(this.elem); } ReaderViewer.handleScroll = function() { if (this.expandedView) { var scrollTop = $("#entries")[0].scrollTop; var done = false; $("#entries//.entry").each(function(i, entry) { if (!done) { if ($(entry).positionedOffset()[1] >= scrollTop) { done = true; item_clicked(entry); } } }); } } function subscribeBundle_clicked (node) { var inp = $(".feeds-bundle-data", node); var bundle = inp[0].bundleData; for (var i = 0; i < bundle.subscriptions.length; i++) { var feed = {title: '', feed: ''}; feed.title = bundle.subscriptions [i].title; feed.feed = bundle.subscriptions [i].id; feed.feed = feed.feed.replace (/^feed\//, ""); FR_cacheFeed(feed.feed, feed.title); FR_addFeed(feed.feed); // Start retreiving the items FC_retreiveFeed(feed.feed); FR_copyToFolder(feed.feed, bundle.title); } Reader.bundleAdded(bundle.title); $(node).addClass('bundle-added'); Reader.handleEvent('evRefresh', node); Reader.expandFolder(bundle.title); } function morebundles_clicked(node) { $("#directory-box").addClass("bundles-only"); make_permalink('browse', 'more'); } function lessbundles_clicked(node) { $("#directory-box").removeClass("bundles-only"); make_permalink('browse'); } function folder_clicked(node, e) { var elem = node.parentNode; Reader.buttonClicked(elem); Reader.openFolder($(".fld-name",node).getdata()); return false; } function tag_clicked(node, e) { Reader.openTag($(".fld-name", node).getdata()); } function feed_clicked(elem, e) { Reader.openFeed($("input.fld-feed", elem).getdata()); } function refresh_clicked(node, e) { ReaderViewer.listLoaded = false; ReaderViewer.homeLoaded = false; ReaderViewer.refresh(); } function card_clicked(event) { event = jQuery.event.fix( event || window.event || {} ); var node = $(event.target); var topnode = node.parents(".entry"); item_clicked(topnode[0]); card_recenter(topnode); } function card_recenter(topnode) { // Move this item to the top $("#entries")[0].scrollTop = topnode.positionedOffset()[1] - 2; } function item_select(node) { if (FRS_current_item != node) { if (FRS_current_item) { $(FRS_current_item).removeClass('expanded'); FRS_current_item.id = ''; } FRS_current_item = node; FRS_current_item.id = 'current-entry'; // $(FRS_current_item).addClass('expanded'); } } function item_clicked(node, e) { if (FRS_current_item == node) { $(node).toggleClass('expanded'); } else { if (FRS_current_item) { $(FRS_current_item).removeClass('expanded'); FRS_current_item.id = ''; } FRS_current_item = node; FRS_current_item.id = 'current-entry'; $(FRS_current_item).addClass('expanded'); } if (ReaderViewer.expandedView) { return; } node = $(node); var topnode = node.parents(".tpl-entry"); var itemid = $(".fld-entries-itemid", topnode); if($(node).is('.expanded') && itemid.length > 0) { var ci = FRS_current_item; var timeout = FR_getProperty(FRP_ITEM_READ_TIMEOUT); if (timeout == null) { timeout = 1000; } setTimeout(function() { if (ci == FRS_current_item) { FC_setItemRead(itemid[0].value); topnode.addClass('brand-read'); } }, timeout); make_permalink_item(itemid.getdata()); } else { make_permalink_item(); } ReaderViewer.updateLVCount(); } function itemread_clicked(node, event) { node = $(node); var topnode = node.parents(".entry").parent(); var itemid = $(".fld-entries-itemid", topnode); if(itemid.length > 0) { if (!FR_isItemRead(itemid[0].value)) { FC_setItemRead(itemid[0].value); topnode.addClass('brand-read'); } else { FC_setItemUnread(itemid[0].value); topnode.removeClass('brand-read'); } } } function markall_clicked(node, event) { Reader.showLoading(); var top = $(".entry"); // Set the status of currently displayed entries top.each(function() { var itemid = $(".fld-entries-itemid", $(this)); if (itemid.length > 0) { FC_setItemRead(itemid[0].value); $(this).addClass('brand-read'); } }); $.each(ReaderViewer.sink.entries, function(i, entry) { FC_setItemRead(entry['entries-itemid']); }); ReaderViewer.updateLVCount(); Reader.hideLoading(); } function star_clicked(node, event) { node = $(node); var topnode = node.parents(".entry").parent(); var itemid = $(".fld-entries-itemid", topnode); if(itemid.length > 0) { if (!FR_isStarred(itemid[0].value)) { FR_starItem(itemid[0].value); topnode.addClass('brand-starred'); } else { FR_unstarItem(itemid[0].value); topnode.removeClass('brand-starred'); /* Not in spec, not needed // If we are in the star view we need to refresh if (ReaderViewer.state == stateListView && ReaderViewer.viewtype == 'BrandView' && Reader.brand == 'starred') { refresh_clicked(node, event); } */ } } Reader.updateFeedCount([]); event = jQuery.event.fix( event || window.event || {} ); event.preventDefault(); event.stopPropagation(); } function share_clicked(node, e) { node = $(node); var topnode = node.parents(".entry").parent(); var itemid = $(".fld-entries-itemid", topnode); if(itemid.length > 0) { if (!FR_isShared(itemid[0].value)) { FR_shareItem(itemid[0].value); topnode.addClass('brand-shared'); } else { FR_unshareItem(itemid[0].value); topnode.removeClass('brand-shared'); } } Reader.updateFeedCount([]); } function listbrand_clicked(node, e) { node = $(node); var brand = $(".fld-brand", node)[0].value; Reader.buttonClicked(node); Reader.openBrand(brand); } /* * Dropdown which allows users to change the folders */ function change_folders_clicked(node, event) { node = $(node); var topnode = node.parents(".tpl-settings-row"); Settings.show_folders_dropdown(topnode); } function choose_folder_clicked(node) { if (node.parents('.button-container').length > 0) return true; return false; } function subs_rename_clicked(node, event) { var rform = Settings.show_rename($(node).parents(".tpl-settings-row")); var pos = $(node).positionedOffset(); rform.css('left', (pos[0]-4) + 'px'). css('top', (pos[1]-4) + 'px').show(); } function cancel_rename_clicked(node, event) { $("#hover-form").hide(); } function save_rename_clicked(node, event) { $("#hover-form").hide(); node = $(node); Settings.do_rename(node.siblings("input.fld-feed").getdata(), node.siblings("input.fld-title").getdata()); } function subs_remove_feed(node, event) { var topnode = $(node).parents(".tpl-settings-row"); if (confirm("Are you sure you want to unsubscribe from " + $(".fld-title", topnode).getdata())) { Settings.remove_feed(topnode); } } function lv_settings_clicked(node) { } function body_clicked(event) { event = jQuery.event.fix( event || window.event || {} ); if (!choose_folder_clicked($(event.target))) { Settings.hide_folder_dropdowns(); ReaderViewer.settingsHide(); ReaderViewer.searchFolderHide(); } } function make_permalink_item(itemid) { var args = [Reader.page]; switch (args[0]) { /* case 'allitems': case 'starred': case 'shared': break;*/ case 'folder': case 'feed': case 'tag': args.push(Reader.page_args[0]); break; } if (itemid) args.push(itemid); make_permalink.apply(null, args); } function make_permalink() { var args = []; $.merge(args, arguments); var page = args.shift(); Reader.page = page; Reader.page_args = $.makeArray(args); args = $.map(args, encodeURIComponent); args.unshift(page); $("#permalink").setdata(location.protocol + '//' + location.hostname + (location.port?':':'') + location.port + location.pathname + '?' + args.join('/')); } function handle_permalinks(srch) { var page, args = []; if (srch && srch.length > 0) { page = srch.substring(1);; if (page.match(/^([a-z]+)\/(.*)$/)) { page = RegExp.$1; args = $.map(RegExp.$2.split('/'), decodeURIComponent); } } switch (page) { case 'allitems': if (args) ReaderViewer.current_itemid = args[0]; Reader.handleEvent('evAllItems', $("#ol-allitems")[0]); break; case 'starred': if (args) ReaderViewer.current_itemid = args[0]; listbrand_clicked($("#ol-brandlist//.tpl-brandlist")[0]); break; case 'shared': if (args) ReaderViewer.current_itemid = args[0]; listbrand_clicked($("#ol-brandlist//.tpl-brandlist")[1]); break; case 'trends': Reader.handleEvent('evTrends', $("#trends-selector")[0]); break; case 'browse': Reader.handleEvent('evBrowse'); if (args.length && args[0] == 'more') $("#show-more-bundles-link").click(); break; case 'search': DOM.quickadd.setdata(args); DOM.quickadd.enter(); break; case 'folder': var folder = args.shift(); if (args) ReaderViewer.current_itemid = args[0]; Reader.openFolder(folder); break case 'feed': var feed = args.shift(); if (args) ReaderViewer.current_itemid = args[0]; Reader.openFeed(feed); break case 'tag': var tag = args.shift(); if (args) ReaderViewer.current_itemid = args[0]; Reader.openTag(tag); break case 'settings': var subpage = args.shift(); switch (subpage) { case 'labels': Reader.handleEvent('evSettings'); Reader.handleEvent('evTagTab'); break; case 'goodies': Reader.handleEvent('evSettings'); Reader.handleEvent('evGoodiesTab'); break; case 'prefs': Reader.handleEvent('evSettings'); Reader.handleEvent('evPrefTab'); break; case 'imexport': Reader.handleEvent('evSettings'); Reader.handleEvent('evImexportTab'); break; default: case 'subs': Reader.handleEvent('evSettings'); Reader.handleEvent('evSubTab'); break; } break; } } var KeyTable = {}; var table; /* Global Keys */ table = KeyTable['Global'] = {}; table[with_shift(keycode('n'))] = Reader.navNext; table[with_shift(keycode('p'))] = Reader.navPrev; table[with_shift(keycode('x'))] = Reader.navToggleExpand; table[with_shift(keycode('o'))] = Reader.navOpenSelected; table[keycode('u')] = Reader.toggleFullScreen; table[keycode('g')] = function() {gotoMode = true;} table[with_shift(keycode('g'))] = function() {gotoMode = true;} /* List View Keys */ table = KeyTable['ListView'] = {}; table[keycode('j')] = ReaderViewer.nextItem; table[keycode('k')] = ReaderViewer.prevItem; table[keycode('n')] = function(){ ReaderViewer.nextItem(true); }; table[keycode('p')] = function() { ReaderViewer.prevItem(true) }; table[keycode('o')] = ReaderViewer.toggleItemOpen; table[KEY_ENTER] = ReaderViewer.toggleItemOpen; table[keycode('s')] = ReaderViewer.starCurrentItem; table[with_shift(keycode('s'))] = ReaderViewer.shareCurrentItem; table[keycode('m')] = ReaderViewer.toggleItemRead; table[keycode('t')] = ReaderViewer.tagItem; table[keycode('v')] = ReaderViewer.viewOriginal; table[with_shift(keycode('a'))] = markall_clicked; table[keycode('1')] = function() {ReaderViewer.setExpanded(true)}; table[keycode('2')] = function() {ReaderViewer.setExpanded(false)}; table[keycode('r')] = ReaderViewer.refresh; /* Goto Keys */ table = KeyTable['Goto'] = {}; table[keycode('h')] = function() {$("#ol-home").click()}; table[keycode('a')] = function() {$("#ol-allitems").click()}; table[keycode('s')] = function() {Reader.brandNodes['starred'].click()}; table[with_shift(keycode('s'))] = function() {Reader.brandNodes['shared'].click()}; table[with_shift(keycode('t'))] = function() {$("#trends-selector").click()}; table[keycode('t')] = function() {Reader.openTag(prompt('Tag name:'))} table[keycode('u')] = Reader.openPromptedFeed; var ViewXform = { 'SubscriptionView' : 'ListView', 'AllItemsView' : 'ListView', 'BrandView' : 'ListView', 'TagView' : 'ListView' }; /* var gShiftDown = false; function handle_shiftdown(event) { event = jQuery.event.fix( event || window.event || {} ); if (event.keyCode == KEY_SHIFT) { gShiftDown = true; } } function handle_shiftup(event) { event = jQuery.event.fix( event || window.event || {} ); if (event.keyCode == KEY_SHIFT) { gShiftDown = false; } } */ var gotoMode = false; function handle_keycuts(event) { event = jQuery.event.fix( event || window.event || {} ); var code = event.keyCode; var mod = MOD_NONE; if (event.shiftKey) mod |= MOD_SHIFT; /* * We dont use alt and control keys right now if (event.altKey) mod |= MOD_ALT; if (event.ctrlKey) mod |= MOD_CTRL; */ if (mod == MOD_NONE) mod = ''; else mod = '_' + mod; // First look in the global key table var table, fn; if (gotoMode) { table = KeyTable['Goto']; gotoMode = false; fn = table[code + mod]; if (fn) return fn(); } table = KeyTable['Global']; fn = table[code + mod]; if (fn) return fn(); // If not found, look in state specific key table if (Reader.state == 'List') { // List var viewtype = ViewXform[ReaderViewer.viewtype] || ReaderViewer.viewtype; table = KeyTable[viewtype]; if (table) { fn = table[code + mod]; } if (fn) fn(); else { // alert(code); } } else { // Settings } } // App Initialization google.load("feeds", "1"); google.setOnLoadCallback(function() {reader_main();}); yocto-reader/reader/common.js0000644000004100000000000001546210735421005016023 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /*-------------------------------------------------------------------------- * Basic JavaScript extensions * for common array constructs. * * Author: Chandan Kudige (2007) /*--------------------------------------------------------------------------*/ var KEY_ENTER= 13; var KEY_ESC = 27; var KEY_LEFT = 37; var KEY_UP = 38; var KEY_RIGHT= 39; var KEY_DOWN = 40; var KEY_F1 = 112; var KEY_PLUS = 43; var KEY_MINUS= 45; var KEY_DELETE = 46; var KEY_BACKSPACE = 8; var KEY_TAB = 9; var KEY_DOT = 46; var KEY_A = 65; var KEY_0 = 48; var KEY_SHIFT = 16; var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } Function.prototype.bind = function() { var __method = this, args = $.clone(arguments), object = args.shift(); return function() { return __method.apply(object, args.concat($.clone(arguments))); } } jQuery.fn.extend({ enter: function(fn){ if (!fn) { return this[0].onkeypress({type: 'keypress', target: node[0], keyCode: KEY_ENTER}); } this.keypress(function(event) { event = jQuery.event.fix( event || window.event || {} ); var code = event.keyCode? event.keyCode : event.charCode; if (code == KEY_ENTER) { event.preventDefault(); event.stopPropagation(); fn(event); return false; } return true; }); return this; }, positionedOffset: function() { var element = this[0]; var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { if(element.tagName=='BODY') break; var p = this.css('position'); if (p == 'relative' || p == 'absolute') break; } } while (element); return [valueL, valueT]; }, datafield: function() { var anchor = this[0]; switch (anchor.nodeName) { case 'INPUT': case 'input': return 'value'; case 'a': case 'A': return 'href'; /* // We dont use this case 'IMG': return 'src'; */ default: return 'innerHTML'; } }, getdata: function() { return this[0][this.datafield()]; }, setdata: function(value) { var node = this; try { node.each(function() {this[$(this).datafield()] = value}); } catch(e) { } return this; // chain }, clear: function() { var node = this; node.each(function() {$(this).setdata('');}); return node; }, maketab: function(header_expr, content_expr) { var node = this; $('.'+content_expr, node).hide(); var hdrs = $('.'+header_expr, this); hdrs.click(function(event) { event = jQuery.event.fix( event || window.event || {} ); $('.'+content_expr, node).hide(); $('.'+header_expr, node).removeClass(header_expr + "-selected"); var hdr = $(event.target); if ($(event.target).is('.'+header_expr)) hdr = $(event.target); else hdr = $(event.target).parents('.'+header_expr); $("#" + hdr.addClass(header_expr + "-selected"). attr('id') + '-contents').show(); }); $(hdrs[0]).click(); }, addnodes: function(node) { var arr = []; this.each(function() {arr.push(this);}); node.each(function() {arr.push(this);}); return $(arr); } }); jQuery.extend({ uniq: function(first) { var second = []; jQuery.each(first, function(i,v) { jQuery.merge(second, [v]); }); return second; }, keys: function(object) { var keys = []; for (var property in object) { if (object[property] != undefined) keys.push(property); } return keys; }, values: function(object) { var values = []; for (var property in object) values.push(object[property]); return values; }, indexOf: function(obj, value) { try { for ( var i = 0, ol = obj.length; i < ol; i++ ) if (obj[i] == value) return i; } catch(e) { } return -1; }, clone: function(iterable) { if (!iterable) return []; var results = []; for (var i = 0; i < iterable.length; i++) results.push(iterable[i]); return results; } }); function get_scaling(arr) { var max = -1; $.each(arr, function(i, val) { if (max < val) max = val; }); return {scalemax: max, scale2: parseInt(2*max/3), scale1: parseInt(1*max/3), scale0: 0}; } function currentTime() { var d = new Date(); return d.getTime(); } function timeExpired(timestamp, interval) { return currentTime() - timestamp > interval; } Array.prototype.toArray = Array.prototype.clone; var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead'); function keycode(letter) { if (letter.match(/[a-zA-Z]/)) { return KEY_A + (letter.charCodeAt(0) - 'a'.charCodeAt(0)); } if (letter.match(/[0-9]/)) { return KEY_0 + (letter.charCodeAt(0) - '0'.charCodeAt(0)); } } function with_shift(str) { return str + '_' + MOD_SHIFT; } const MOD_NONE = 0; const MOD_SHIFT = 1; const MOD_ALT = 2; const MOD_CTRL = 4; yocto-reader/tests/0000755000004100000000000000000010735421013014064 5ustar www-datarootyocto-reader/tests/testcases_common.js0000644000004100000000000001364510735421012020000 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ function testBasics() { var Myclass = Class.create(); Myclass.prototype.initialize = function(arg1, arg2) { testflags["0.0"] = [arg1, arg2].join(','); } Myclass.prototype.test1 = function(arg1, arg2) { testflags["0.1"] = [this.id, arg1, arg2].join(','); } var Myvar = new Myclass('a','b'); assertEquals("0.0", "a,b", testflags["0.0"]); Myvar.id = "testid"; var fn = Myvar.test1.bind(Myvar, "testarg1"); fn("testarg2"); assertEquals("0.1", "testid,testarg1,testarg2", testflags["0.1"]); } function testDomExt() { var node = $("#c-test1//input"); node.enter(function() { testflags["1.0.1"] = true; }); node[0].onkeypress({type: 'keypress', target: node[0], keyCode: KEY_ESC}); assertEquals("1.0.0", undefined, testflags['1.0.1']); node[0].onkeypress({type: 'keypress', target: node[0], keyCode: KEY_ENTER}); assertEquals("1.0.1", true, testflags['1.0.1']); var node1 = $("#c-test2//.top"); var node2 = $("#c-test2//.bottom"); var node3 = $("#c-test2//.abs1"); var pos1 = node1.positionedOffset(); var pos2 = node2.positionedOffset(); var pos3 = node3.positionedOffset(); assert("1.1.0", pos2[1] > pos1[1]); assert("1.1.1", pos2[0] == pos1[0]); assertEquals("1.1.2", 100, pos3[1]); assertEquals("1.1.3", 250, pos3[0]); var input = $("#c-test3//input"); var anchor = $("#c-test3//a"); var img = $("#c-test3//img"); var span = $("#c-test3//span"); // test get data assertEquals("1.2.1", 'abcd', input.getdata()); assertEquals("1.2.2", 'http://www.example.com/', anchor.getdata()); assertEquals("1.2.3", 'http://www.example.com/image.gif', img.getdata()); assertEquals("1.2.4", 'span test string', span.getdata()); // test set data var str = "http://www.example.com/test"; input.setdata(str); anchor.setdata(str); img.setdata(str); span.setdata(str); assertEquals("1.3.1", str, input[0].value); assertEquals("1.3.2", str, anchor[0].href); assertEquals("1.3.3", str, img[0].src); assertEquals("1.3.4", str, span[0].innerHTML); input.clear(); anchor.clear(); img.clear(); span.clear(); assertEquals("1.4.1", '', input[0].value); //these two are urls and when empty, the DOM returns the // path of the script. // assertEquals("1.4.2", '', anchor[0].href); // assertEquals("1.4.3", '', img[0].src); assertEquals("1.4.4", '', span[0].innerHTML); // Simple Tab functions node = $("#c-test4"); node.maketab('tab-header', 'tab-contents'); assertEquals("1.5.0", "none", $(".tab-contents",node).css('display')); $("#tab1", node).click(); assertEquals("1.5.1", "block", $("#tab1-contents",node).css('display')); assert("1.5.2", $("#tab1", node).is('.tab-header-selected')); $("#tab2", node)[0].onclick({type: 'click', target: $("#tab2/a")[0]}); assertEquals("1.5.3", "none", $("#tab1-contents",node).css('display')); assert("1.5.4", !$("#tab1", node).is('.tab-header-selected')); assertEquals("1.5.5", "block", $("#tab2-contents",node).css('display')); assert("1.5.6", $("#tab2", node).is('.tab-header-selected')); // addnodes() var n1 = $(".node1,.node2", $("#c-test5")); var n2 = $(".node3,.node4,.node5", $("#c-test5")); var n3 = n1.addnodes(n2); assertEquals("1.6.1", 2, n1.length); assertEquals("1.6.2", 3, n2.length); assertEquals("1.6.3", 5, n3.length); assert("1.6.4", n3.is(".node1")); assert("1.6.5", n3.is(".node2")); assert("1.6.6", n3.is(".node3")); assert("1.6.7", n3.is(".node4")); assert("1.6.8", n3.is(".node5")); } function testUtils() { // uniq() var arr1 = [1,2,4,2,3,1,6]; var arr2 = $.uniq(arr1); assertEquals("2.0", 5, arr2.length); assert("2.1.1", $.indexOf(arr2, 1) >= 0); assert("2.1.2", $.indexOf(arr2, 2) >= 0); assert("2.1.3", $.indexOf(arr2, 3) >= 0); assert("2.1.4", $.indexOf(arr2, 4) >= 0); assert("2.1.5", $.indexOf(arr2, 5) < 0); assert("2.1.6", $.indexOf(arr2, 6) >= 0); // keys var obj = {key1: 'val1', key2: 'val2', key3: 'val3'}; var keys = $.keys(obj); assertEquals("2.2.1", "key1,key2,key3", keys.join(',')); var vals = $.values(obj); assertEquals("2.2.2", "val1,val2,val3", vals.join(',')); var arr3 = $.clone(arr1); assertEquals("2.2.3", '1,2,4,2,3,1,6', arr3.join(',')); // get_scaling var scale = get_scaling([1,2,3,4,5,6,7,8,9,10]); assertEquals("2.3.1", 10, scale.scalemax); assertEquals("2.3.2", 6, scale.scale2); assertEquals("2.3.3", 3, scale.scale1); assertEquals("2.3.4", 0, scale.scale0); // current time test - pretty lame var t1 = currentTime(); var t2 = currentTime(); assert("2.4.0", t2 >= t1); // time expired var t3 = t1 - 10000; assert("2.4.1", timeExpired(t3, 9000)); assert("2.4.2", !timeExpired(t3, 20000)); } testlist.push('testBasics'); testlist.push('testDomExt'); testlist.push('testUtils'); yocto-reader/tests/tlib.js0000644000004100000000000000677410735421013015372 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ var testlist = {}; var testflags = {}; var TEST_FEED1 = 'http://kudang.com/myfeed1.xml'; var TEST_FEED2 = 'http://kudang.com/myfeed2.xml'; var TEST_FEED3 = 'http://rss.cnn.com/rss/cnn_topstories.rss'; var TEST_TITLE3 = 'CNN.com'; var TEST_FEED4 = 'http://technosophyunlimited.blogspot.com/atom.xml'; var TEST_FEED5 = 'http://www.theonion.com/content/feeds/daily'; var TEST_FOLDER1 = 'some'; var TEST_FOLDER2 = 'folder'; var TEST_FOLDER3 = 'news'; var TEST_FOLDER4 = 'technology'; var TEST_TAG1 = 'testtag1'; var TEST_TAG2 = 'testtag2'; var obj1 = {'url1':"http://www.example.com/", 'url2':"http://www.example.com/image.gif", 'field1': "string1", 'field2':"string2", 'field3':"string3"}; var obj2 = {'icon' : 'test.gif'}; var arr1 = [{'field1' : 'string1', 'field2' : 'string2'}, {'field1' : 'newstring1', 'field2' : 'newstring2'}]; var feed1 = {'attr1' : 'text1', 'url' : 'http://www.example.com/image.gif', 'array1': [ {'name1' : 'test1.1', 'name2' : 'test string 1.2'}, {'name1' : 'test2.1', 'name2' : 'test string 2.2'}], 'array2': [ {'name3' : 'obj1.1', 'name4' : 'obj string 1.2'}, {'name3' : 'obj2.1', 'name4' : 'obj string 2.2'}, {'name3' : 'obj3.1', 'name4' : 'test string 3.2'}] }; var obj3 = {'field1' : 'apple', 'field2' : 'orange', 'field3' : 'peach'}; var obj4 = {'attr1' : 'existing'}; function testflag_incr(flagname) { if (!testflags[flagname]) testflags[flagname] = 0; testflags[flagname]++; } function testflag_resetall(flagname) { testflags = {}; } function testflag_set(flagname) { testflags[flagname] = true; } function assertFlag(casenum, flag) { assertEquals(casenum, true, testflags[flag]); } function assertNoflag(casenum, flag) { assertEquals(casenum, undefined, testflags[flag]); } var testevents = {}; var dbg = true; // Get the state machine to log events StateMachine.prototype.logEvent = function(evt, elem, data) { testevents[evt] = {fsm: this.table._name, data: data, elem: elem}; } // Clear event log function clearEventLog() { testevents = {}; } function assertEvent(testcase, evt) { assert(testcase + ': [' + evt + ']', testevents[evt] != undefined); } function assertNoevent(testcase, evt) { assert(testcase + ': [!' + evt + ']', testevents[evt] == undefined); } yocto-reader/tests/tlibui.js0000644000004100000000000000636110735421013015720 0ustar www-dataroot/* * yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 * (http://yocto-reader.flouzo.net/) * * Copyright (C) 2007 Loic Dachary (loic@dachary.org) * Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ var testlist = []; var TestQueue; var TestPaused = false; var ConfirmYes = true; var PromptResponse = 'default'; function initTests() { document.f1.tgroups.value = ""; startTests(); } function startTests() { doTest($.clone(testlist)); } function TestPause() { TestPaused = true; } function TestResume() { TestPaused = false; var mylist = TestQueue; TestQueue = null; setTimeout(function(){doTest(mylist);}, 10); } // Make sure Wait is the last call in the calling function function Wait(msecs) { TestPause(); setTimeout(function(){TestResume();}, msecs); } function SetConfirm(bool) { ConfirmYes = bool; } function SetPromptResponse(str) { PromptResponse = str; } function confirm(str) { AddStatus(" confirm('" + str + "') -> " + ConfirmYes); return ConfirmYes; } function alert(str) { AddStatus(" alert('" + str + "')"); } function prompt(str) { AddStatus(" prompt('" + str + "') -> " + PromptResponse); return PromptResponse; } function doTest(mylist) { if (TestPaused) { TestQueue = mylist; return; } var status = document.getElementById('tStatus'); var x = mylist.shift(); if (typeof(window[x]) == 'function') { try { window[x](); AddStatus(x + " OK"); } catch(jse) { if (jse.isJsUnitException) { AddStatus(x + " failed ***"); AddStatus(' ' + jse.comment + ': ' + jse.jsUnitMessage + "\n"); } else { jsUnitAllCases++; AddStatus(x + " (JS error) ***"); AddStatus(' Error: ' + jse.message?jse.message:jse + "\n"); AddStatus(jse.stack); } } } status.innerHTML = "Finished: " + x + "   Passed:" + jsUnitPassedCases+'/' + jsUnitAllCases; if (mylist.length > 0) { setTimeout(doTest.bind(null, mylist), 200); } else { status.innerHTML = "All Done " + "   Passed:" + jsUnitPassedCases+'/' + jsUnitAllCases; AddStatus("\n\nAll Testcases Completed\n"); } } function AddStatus(str) { document.f1.tgroups.value += "\n" + str; } google.setOnLoadCallback = function(fn) { } window.uitest = true; $(window).load(startTests); yocto-reader/tests/start_uitest.html0000644000004100000000000000720510735421011017506 0ustar www-dataroot JSCoverage

JSCoverage (working ...)

loading... Browser loading...
loading... Summary loading...
loading... Source loading...
loading... About loading...
URL:
File Statements Executed Coverage Missing
This is version 0.2 of JSCoverage, a program that calculates code coverage statistics for JavaScript.

See http://siliconforks.com/jscoverage/ for more information.

Copyright © 2007 siliconforks.com

yocto-reader/tests/jsUnitCore.js0000644000004100000000000004370110735421011016512 0ustar www-datarootvar JSUNIT_UNDEFINED_VALUE; var JSUNIT_VERSION = 2.2; var isTestPageLoaded = false; var jsUnitErrorCases = 0; var jsUnitPassedCases = 0; var jsUnitAllCases = 0; //hack for NS62 bug function jsUnitFixTop() { var tempTop = top; if (!tempTop) { tempTop = window; while (tempTop.parent) { tempTop = tempTop.parent; if (tempTop.top && tempTop.top.jsUnitTestSuite) { tempTop = tempTop.top; break; } } } try { window.top = tempTop; } catch (e) { } } jsUnitFixTop(); /** + * A more functional typeof + * @param Object o + * @return String + */ function _trueTypeOf(something) { var result = typeof something; try { switch (result) { case 'string': case 'boolean': case 'number': break; case 'object': case 'function': switch (something.constructor) { case String: result = 'String'; break; case Boolean: result = 'Boolean'; break; case Number: result = 'Number'; break; case Array: result = 'Array'; break; case RegExp: result = 'RegExp'; break; case Function: result = 'Function'; break; default: var m = something.constructor.toString().match(/function\s*([^( ]+)\(/); if (m) result = m[1]; else break; } break; } } finally { result = result.substr(0, 1).toUpperCase() + result.substr(1); return result; } } function _displayStringForValue(aVar) { var result = '<' + aVar + '>'; if (!(aVar === null || aVar === top.JSUNIT_UNDEFINED_VALUE)) { result += ' (' + _trueTypeOf(aVar) + ')'; } return result; } function fail(failureMessage) { throw new JsUnitException("Call to fail()", failureMessage); } function error(errorMessage) { var errorObject = new Object(); errorObject.description = errorMessage; errorObject.stackTrace = getStackTrace(); throw errorObject; } function argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) { return args.length == expectedNumberOfNonCommentArgs + 1; } function commentArg(expectedNumberOfNonCommentArgs, args) { if (argumentsIncludeComments(expectedNumberOfNonCommentArgs, args)) return 'Test Case '+args[0]; return null; } function nonCommentArg(desiredNonCommentArgIndex, expectedNumberOfNonCommentArgs, args) { return argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) ? args[desiredNonCommentArgIndex] : args[desiredNonCommentArgIndex - 1]; } function _validateArguments(expectedNumberOfNonCommentArgs, args) { if (!( args.length == expectedNumberOfNonCommentArgs || (args.length == expectedNumberOfNonCommentArgs + 1 && typeof(args[0]) == 'string') )) error('Incorrect arguments passed to assert function'); } function _assert(comment, booleanValue, failureMessage) { jsUnitAllCases++; if (!booleanValue) { jsUnitErrorCases++; throw new JsUnitException(comment, failureMessage); } jsUnitPassedCases++; } function assert() { _validateArguments(1, arguments); var booleanValue = nonCommentArg(1, 1, arguments); if (typeof(booleanValue) != 'boolean') error('Bad argument to assert(boolean)'); _assert(commentArg(1, arguments), booleanValue === true, 'Call to assert(boolean) with false'); } function assertTrue() { _validateArguments(1, arguments); var booleanValue = nonCommentArg(1, 1, arguments); if (typeof(booleanValue) != 'boolean') error('Bad argument to assertTrue(boolean)'); _assert(commentArg(1, arguments), booleanValue === true, 'Call to assertTrue(boolean) with false'); } function assertFalse() { _validateArguments(1, arguments); var booleanValue = nonCommentArg(1, 1, arguments); if (typeof(booleanValue) != 'boolean') error('Bad argument to assertFalse(boolean)'); _assert(commentArg(1, arguments), booleanValue === false, 'Call to assertFalse(boolean) with true'); } function assertEquals() { _validateArguments(2, arguments); var var1 = nonCommentArg(1, 2, arguments); var var2 = nonCommentArg(2, 2, arguments); _assert(commentArg(2, arguments), var1 === var2, 'Expected ' + _displayStringForValue(var1) + ' but was ' + _displayStringForValue(var2)); } function assertNotEquals() { _validateArguments(2, arguments); var var1 = nonCommentArg(1, 2, arguments); var var2 = nonCommentArg(2, 2, arguments); _assert(commentArg(2, arguments), var1 !== var2, 'Expected not to be ' + _displayStringForValue(var2)); } function assertNull() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), aVar === null, 'Expected ' + _displayStringForValue(null) + ' but was ' + _displayStringForValue(aVar)); } function assertNotNull() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), aVar !== null, 'Expected not to be ' + _displayStringForValue(null)); } function assertUndefined() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), aVar === top.JSUNIT_UNDEFINED_VALUE, 'Expected ' + _displayStringForValue(top.JSUNIT_UNDEFINED_VALUE) + ' but was ' + _displayStringForValue(aVar)); } function assertNotUndefined() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), aVar !== top.JSUNIT_UNDEFINED_VALUE, 'Expected not to be ' + _displayStringForValue(top.JSUNIT_UNDEFINED_VALUE)); } function assertNaN() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), isNaN(aVar), 'Expected NaN'); } function assertNotNaN() { _validateArguments(1, arguments); var aVar = nonCommentArg(1, 1, arguments); _assert(commentArg(1, arguments), !isNaN(aVar), 'Expected not NaN'); } function assertObjectEquals() { _validateArguments(2, arguments); var var1 = nonCommentArg(1, 2, arguments); var var2 = nonCommentArg(2, 2, arguments); var type; var msg = commentArg(2, arguments)?commentArg(2, arguments):''; var isSame = (var1 === var2); //shortpath for references to same object var isEqual = ( (type = _trueTypeOf(var1)) == _trueTypeOf(var2) ); if (isEqual && !isSame) { switch (type) { case 'String': case 'Number': isEqual = (var1 == var2); break; case 'Boolean': case 'Date': isEqual = (var1 === var2); break; case 'RegExp': case 'Function': isEqual = (var1.toString() === var2.toString()); break; default: //Object | Array var i; if (isEqual = (var1.length === var2.length)) for (i in var1) assertObjectEquals(msg + ' found nested ' + type + '@' + i + '\n', var1[i], var2[i]); } _assert(msg, isEqual, 'Expected ' + _displayStringForValue(var1) + ' but was ' + _displayStringForValue(var2)); } } assertArrayEquals = assertObjectEquals; function assertEvaluatesToTrue() { _validateArguments(1, arguments); var value = nonCommentArg(1, 1, arguments); if (!value) fail(commentArg(1, arguments)); } function assertEvaluatesToFalse() { _validateArguments(1, arguments); var value = nonCommentArg(1, 1, arguments); if (value) fail(commentArg(1, arguments)); } function assertHTMLEquals() { _validateArguments(2, arguments); var var1 = nonCommentArg(1, 2, arguments); var var2 = nonCommentArg(2, 2, arguments); var var1Standardized = standardizeHTML(var1); var var2Standardized = standardizeHTML(var2); _assert(commentArg(2, arguments), var1Standardized === var2Standardized, 'Expected ' + _displayStringForValue(var1Standardized) + ' but was ' + _displayStringForValue(var2Standardized)); } function assertHashEquals() { _validateArguments(2, arguments); var var1 = nonCommentArg(1, 2, arguments); var var2 = nonCommentArg(2, 2, arguments); for (var key in var1) { assertNotUndefined("Expected hash had key " + key + " that was not found", var2[key]); assertEquals( "Value for key " + key + " mismatch - expected = " + var1[key] + ", actual = " + var2[key], var1[key], var2[key] ); } for (var key in var2) { assertNotUndefined("Actual hash had key " + key + " that was not expected", var1[key]); } } function assertRoughlyEquals() { _validateArguments(3, arguments); var expected = nonCommentArg(1, 3, arguments); var actual = nonCommentArg(2, 3, arguments); var tolerance = nonCommentArg(3, 3, arguments); assertTrue( "Expected " + expected + ", but got " + actual + " which was more than " + tolerance + " away", Math.abs(expected - actual) < tolerance ); } function assertContains() { _validateArguments(2, arguments); var contained = nonCommentArg(1, 2, arguments); var container = nonCommentArg(2, 2, arguments); assertTrue( "Expected '" + container + "' to contain '" + contained + "'", container.indexOf(contained) != -1 ); } function standardizeHTML(html) { var translator = document.createElement("DIV"); translator.innerHTML = html; return translator.innerHTML; } function isLoaded() { return isTestPageLoaded; } function setUp() { } function tearDown() { } function getFunctionName(aFunction) { var regexpResult = aFunction.toString().match(/function(\s*)(\w*)/); if (regexpResult && regexpResult.length >= 2 && regexpResult[2]) { return regexpResult[2]; } return 'anonymous'; } function getStackTrace() { var result = ''; if (typeof(arguments.caller) != 'undefined') { // IE, not ECMA for (var a = arguments.caller; a != null; a = a.caller) { result += '> ' + getFunctionName(a.callee) + '\n'; if (a.caller == a) { result += '*'; break; } } } else { // Mozilla, not ECMA // fake an exception so we can get Mozilla's error stack var testExcp; try { foo.bar; } catch(testExcp) { var stack = parseErrorStack(testExcp); for (var i = 1; i < stack.length; i++) { result += '> ' + stack[i] + '\n'; } } } return result; } function parseErrorStack(excp) { var stack = []; var name; if (!excp || !excp.stack) { return stack; } var stacklist = excp.stack.split('\n'); for (var i = 0; i < stacklist.length - 1; i++) { var framedata = stacklist[i]; name = framedata.match(/^(\w*)/)[1]; if (!name) { name = 'anonymous'; } stack[stack.length] = name; } // remove top level anonymous functions to match IE while (stack.length && stack[stack.length - 1] == 'anonymous') { stack.length = stack.length - 1; } return stack; } function JsUnitException(comment, message) { this.isJsUnitException = true; this.comment = comment; this.jsUnitMessage = message; this.stackTrace = getStackTrace(); } function warn() { if (top.tracer != null) top.tracer.warn(arguments[0], arguments[1]); } function inform() { if (top.tracer != null) top.tracer.inform(arguments[0], arguments[1]); } function info() { inform(arguments[0], arguments[1]); } function debug() { if (top.tracer != null) top.tracer.debug(arguments[0], arguments[1]); } function setJsUnitTracer(aJsUnitTracer) { top.tracer = aJsUnitTracer; } function trim(str) { if (str == null) return null; var startingIndex = 0; var endingIndex = str.length - 1; while (str.substring(startingIndex, startingIndex + 1) == ' ') startingIndex++; while (str.substring(endingIndex, endingIndex + 1) == ' ') endingIndex--; if (endingIndex < startingIndex) return ''; return str.substring(startingIndex, endingIndex + 1); } function isBlank(str) { return trim(str) == ''; } // the functions push(anArray, anObject) and pop(anArray) // exist because the JavaScript Array.push(anObject) and Array.pop() // functions are not available in IE 5.0 function push(anArray, anObject) { anArray[anArray.length] = anObject; } function pop(anArray) { if (anArray.length >= 1) { delete anArray[anArray.length - 1]; anArray.length--; } } function jsUnitGetParm(name) { if (typeof(top.jsUnitParmHash[name]) != 'undefined') { return top.jsUnitParmHash[name]; } return null; } if (top && typeof(top.xbDEBUG) != 'undefined' && top.xbDEBUG.on && top.testManager) { top.xbDebugTraceObject('top.testManager.containerTestFrame', 'JSUnitException'); // asserts top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_displayStringForValue'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'error'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'argumentsIncludeComments'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'commentArg'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'nonCommentArg'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_validateArguments'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_assert'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assert'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertTrue'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertEquals'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotEquals'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNull'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotNull'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertUndefined'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotUndefined'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNaN'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotNaN'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'isLoaded'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'setUp'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'tearDown'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'getFunctionName'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'getStackTrace'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'warn'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'inform'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'debug'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'setJsUnitTracer'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'trim'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'isBlank'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'newOnLoadEvent'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'push'); top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'pop'); } function newOnLoadEvent() { isTestPageLoaded = true; } function jsUnitSetOnLoad(windowRef, onloadHandler) { var isKonqueror = navigator.userAgent.indexOf('Konqueror/') != -1 || navigator.userAgent.indexOf('Safari/') != -1; if (typeof(windowRef.attachEvent) != 'undefined') { // Internet Explorer, Opera windowRef.attachEvent("onload", onloadHandler); } else if (typeof(windowRef.addEventListener) != 'undefined' && !isKonqueror) { // Mozilla, Konqueror // exclude Konqueror due to load issues windowRef.addEventListener("load", onloadHandler, false); } else if (typeof(windowRef.document.addEventListener) != 'undefined' && !isKonqueror) { // DOM 2 Events // exclude Mozilla, Konqueror due to load issues windowRef.document.addEventListener("load", onloadHandler, false); } else if (typeof(windowRef.onload) != 'undefined' && windowRef.onload) { windowRef.jsunit_original_onload = windowRef.onload; windowRef.onload = function() { windowRef.jsunit_original_onload(); onloadHandler(); }; } else { // browsers that do not support windowRef.attachEvent or // windowRef.addEventListener will override a page's own onload event windowRef.onload = onloadHandler; } } jsUnitSetOnLoad(window, newOnLoadEvent); yocto-reader/tests/jscoverage.js0000644000004100000000000003215010735421011016551 0ustar www-dataroot/* jscoverage.js - code coverage for JavaScript Copyright (C) 2007 siliconforks.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ if (!('_$jscoverage' in window)) { window._$jscoverage = {}; } var gCurrentFile = null; var gCurrentLine = null; var gCurrentSource = null; var gCurrentLines = null; // http://www.quirksmode.org/js/findpos.html function findPos(obj) { var result = 0; do { result += obj.offsetTop; obj = obj.offsetParent; } while (obj); return result; } // http://www.quirksmode.org/viewport/compatibility.html function getViewportHeight() { if (self.innerHeight) { // all except Explorer return self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode return document.documentElement.clientHeight; } else if (document.body) { // other Explorers return document.body.clientHeight; } else { throw "Couldn't calculate viewport height"; } } function lengthyOperation(f) { var body = document.getElementsByTagName('body').item(0); body.className = 'busy'; setTimeout(function() { try { f(); } finally { body.className = ''; body = null; } }, 0); } function setSize() { var viewportHeight = getViewportHeight(); /* padding-top: 10px border-top-width: 1px border-bottom-width: 1px padding-bottom: 10px margin-bottom: 10px ---- 32px */ var tabPages = document.getElementById('tabPages'); var tabPagesHeight = (viewportHeight - findPos(tabPages) - 32) + 'px'; tabPages.style.height = tabPagesHeight; var browserIframe = document.getElementById('browserIframe'); browserIframe.height = viewportHeight - findPos(browserIframe) - 23; var coverageSummaryDiv = document.getElementById('summaryDiv'); coverageSummaryDiv.style.height = tabPagesHeight; var sourceDiv = document.getElementById('sourceDiv'); var sourceDivHeight = (viewportHeight - findPos(sourceDiv) - 23) + 'px'; sourceDiv.style.height = sourceDivHeight; } function body_load() { initTabControl(); setSize(); // check if a URL was passed in the query string if (location.search.length > 0) { var url = location.search.substring(1); // this will automatically propagate to the input field frames[0].location = url; } else if (test_url) { frames[0].location = test_url; } } function body_resize() { setSize(); } /******************************************************************************* tab 1 */ function updateBrowser() { var input = document.getElementById("location"); frames[0].location = input.value; } function updateInput() { var input = document.getElementById("location"); input.value = frames[0].location; } function input_keypress(e) { if (e.keyCode === 13) { updateBrowser(); } } function button_click() { updateBrowser(); } function browser_load() { updateInput(); } /******************************************************************************* tab 2 */ function createLink(file, line) { var link = document.createElement("a"); var url; var call; var text; if (line) { url = file + ".jscoverage.html?" + line; call = "get('" + file + "', " + line + ");"; text = line.toString(); } else { url = file + ".jscoverage.html"; call = "get('" + file + "');"; text = file; } link.setAttribute('href', 'javascript:' + call); link.appendChild(document.createTextNode(text)); return link; } function recalculateSummaryTab(cc) { if (! cc) { cc = window._$jscoverage; } if (! cc) { throw "No coverage information found."; } var tbody = document.getElementById("summaryTbody"); while (tbody.hasChildNodes()) { tbody.removeChild(tbody.firstChild); } for (var file in cc) { var i; var num_statements = 0; var num_executed = 0; var missing = []; var length = cc[file].length; for (i = 0; i < length; i++) { if (cc[file][i] === undefined) { continue; } else if (cc[file][i] === 0) { missing.push(i); } else { num_executed++; } num_statements++; } var percentage = parseInt(100 * num_executed / num_statements); var row = document.createElement("tr"); var cell = document.createElement("td"); var link = createLink(file); cell.appendChild(link); row.appendChild(cell); cell = document.createElement("td"); cell.className = 'numeric'; cell.appendChild(document.createTextNode(num_statements)); row.appendChild(cell); cell = document.createElement("td"); cell.className = 'numeric'; cell.appendChild(document.createTextNode(num_executed)); row.appendChild(cell); cell = document.createElement("td"); cell.className = 'numeric'; cell.appendChild(document.createTextNode(percentage + '%')); row.appendChild(cell); cell = document.createElement("td"); for (i = 0; i < missing.length; i++) { if (i !== 0) { cell.appendChild(document.createTextNode(", ")); } link = createLink(file, missing[i]); cell.appendChild(link); } row.appendChild(cell); tbody.appendChild(row); } } /******************************************************************************* tab 3 */ function makeTable() { var rows = []; var coverage = _$jscoverage[gCurrentFile]; var lines = gCurrentLines; var i; for (i = 0; i < lines.length; i++) { var lineNumber = i + 1; var row = ''; row += '' + lineNumber + ''; if (lineNumber in coverage) { var timesExecuted = coverage[lineNumber]; if (timesExecuted === 0) { row += ''; } else { row += ''; } row += timesExecuted; row += ''; } else { row += ''; } row += '
' + lines[i] + '
'; row += ''; row += '\n'; rows[i] = row; } var result = rows.join(''); var sourceDiv = document.getElementById('sourceDiv'); while (sourceDiv.hasChildNodes()) { sourceDiv.removeChild(sourceDiv.firstChild); } sourceDiv.innerHTML = '' + result + '
'; } function highlightSource() { // set file name var fileDiv = document.getElementById('fileDiv'); fileDiv.innerHTML = gCurrentFile; // highlight source and break into lines var pre = document.createElement('pre'); pre.appendChild(document.createTextNode(gCurrentSource)); sh_highlightElement(document, pre, sh_languages['javascript']); var source = pre.innerHTML; var length = source.length; var endOfLinePattern = /\r\n|\r|\n/g; endOfLinePattern.lastIndex = 0; var lines = []; var i = 0; while (i < length) { var start = i; var end; var startOfNextLine; var endOfLineMatch = endOfLinePattern.exec(source); if (endOfLineMatch === null) { end = length; startOfNextLine = length; } else { end = endOfLineMatch.index; startOfNextLine = endOfLinePattern.lastIndex; } var line = source.substring(start, end); lines.push(line); i = startOfNextLine; } gCurrentLines = lines; // coverage recalculateSourceTab(); } function scrollToLine() { setSize(); selectTab(2); if (! window.gCurrentLine) { return; } var div = document.getElementById('sourceDiv'); if (gCurrentLine === 1) { div.scrollTop = 0; } else { var cell = document.getElementById('line-' + gCurrentLine); var divOffset = findPos(div); var cellOffset = findPos(cell); div.scrollTop = cellOffset - divOffset; } gCurrentLine = 0; } function setThrobber() { var throbberImg = document.getElementById('throbberImg'); throbberImg.style.visibility = 'visible'; } function clearThrobber() { var throbberImg = document.getElementById('throbberImg'); throbberImg.style.visibility = 'hidden'; } function httpError(file) { gCurrentFile = null; clearThrobber(); var fileDiv = document.getElementById('fileDiv'); fileDiv.innerHTML = ''; var sourceDiv = document.getElementById('sourceDiv'); sourceDiv.innerHTML = "Error retrieving document " + file + "."; selectTab(2); } /** Loads the given file (and optional line) in the source tab. */ function get(file, line) { if (file === gCurrentFile) { selectTab(2); gCurrentLine = line; lengthyOperation(recalculateSourceTab); } else { if (gCurrentFile === null) { var tab = document.getElementById('sourceTab'); tab.className = ''; tab.onclick = tab_click; } selectTab(2); setThrobber(); // Note that the IE7 XMLHttpRequest does not support file URL's. // http://xhab.blogspot.com/2006/11/ie7-support-for-xmlhttprequest.html // http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx var request; if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); } else { request = new XMLHttpRequest(); } request.open("GET", file + ".jscoverage.js", true); request.onreadystatechange = function(event) { if (request.readyState === 4) { if (request.status === 0 || request.status === 200) { var response = request.responseText; // opera returns status zero even if there is a missing file??? if (response === '') { httpError(file); } else { clearThrobber(); gCurrentFile = file; gCurrentLine = line || 1; gCurrentSource = response; lengthyOperation(highlightSource); } } else { httpError(file); } } }; if ('onerror' in request) { request.onerror = function(event) { httpError(file); }; } try { request.send(null); } catch (e) { httpError(file); } } } /** Calculates coverage statistics for the current source file. */ function recalculateSourceTab() { if (! gCurrentFile) { return; } makeTable(); scrollToLine(); } /******************************************************************************* tabs */ function initTabControl() { var tabs = document.getElementById('tabs'); var i; var child; var tabNum = 0; for (i = 0; i < tabs.childNodes.length; i++) { child = tabs.childNodes.item(i); if (child.nodeType === 1) { if (child.className !== 'disabled') { child.onclick = tab_click; } tabNum++; } } selectTab(0); } function selectTab(tab) { if (typeof tab !== 'number') { tab = tabIndexOf(tab); } var tabControl = document.getElementById("tabControl"); var tabs = document.getElementById('tabs'); var tabPages = document.getElementById('tabPages'); var i; var child; var tabNum = 0; for (i = 0; i < tabs.childNodes.length; i++) { child = tabs.childNodes.item(i); if (child.nodeType === 1) { if (child.className !== 'disabled') { child.className = tabNum === tab? 'selected': ''; } tabNum++; } } tabNum = 0; for (i = 0; i < tabPages.childNodes.length; i++) { child = tabPages.childNodes.item(i); if (child.nodeType === 1) { child.style.display = tabNum === tab? 'block': 'none'; tabNum++; } } setSize(); } function tabIndexOf(tab) { var tabs = document.getElementById('tabs'); var i; var child; var tabNum = 0; for (i = 0; i < tabs.childNodes.length; i++) { child = tabs.childNodes.item(i); if (child.nodeType === 1) { if (child === tab) { return tabNum; } tabNum++; } } throw "Tab not found"; } function tab_click(e) { var target; if (e) { target = e.target; } else if (window.event) { // IE target = window.event.srcElement; } selectTab(target); if (target.id === 'summaryTab') { lengthyOperation(recalculateSummaryTab); } else if (target.id === 'sourceTab') { lengthyOperation(recalculateSourceTab); } } yocto-reader/tests/uitest.patch0000644000004100000000000000574211123730256016436 0ustar www-dataroot--- feedread.html 2008-12-20 20:34:46.063421900 -0500 +++ uitest.html 2008-12-20 20:41:15.977641845 -0500 @@ -30,28 +30,39 @@ + + + - + - - + + - + - + - + - - - + + + + + + + + + + +

Yocto Reader

Source Code | dummy@example.com | | | Settings | My Account | Help | Sign Out

Loading...

Subscribed. Unsubscribe
 

Tip: Managing Your Reading List

Before you get started, we want to let you know about an important feature of Yocto Reader.

As you view items in your reading list, they will be automatically marked as read as you scroll down (when in the "Expanded" view).

If you'd prefer to disable this feature, you can turn it off in Settings.

Dismiss this message (it will not appear again)

Your shared items are publicly accessible.
Tell your friends
You can use your Gmail account to to your friends, family and co-workers.
Put a clip on your site or blog
You can also copy and paste code to put a clip of your shared items on your site.
If you use Blogger, it's even easier, just use the "Add to Blogger" button.

You haven't shared any items yet.

Sharing interesting items with your friends is easy: simply click on the sharing icon.

The item will then instantly appear on your public page at:



This page is accessible to anyone who knows its address, so all that's left to do is to let your friends know about it.

Find out more about sharing
Sort by oldest only shows items from the last 30 days. Learn more Dismiss
Navigation Acting on items
j/k:next/previous item s:star item
space:next item or page <Shift> + s:share item
<Shift> + space:previous item or page v:view original
n/p:item scan down/up (list only) t:tag item
<Shift> + n/p:next/previous subscription m:mark item as read/unread
<Shift> + x:expand folder o/enter:expand/collapse item (list only)
<Shift> + o:open subscription or folder <Shift> + a:mark all as read
e:email item
Jumping Application
g then h:go home r:refresh
g then a:go to all items u:toggle full screen mode
g then s:go to starred items 1:switch to expanded view
g then <Shift> + s:go to shared items 2:switch to list view
g then u:open subscription selector
g then t:open tag selector
g then <Shift> + t:open trends page
  • Starred ()
  • abcd 
More bundles...

See more from  »

Add star Remove star Mark as read

Add star Remove star Mark as read
   
Your shared items are publicly accessible.
Tell your friends
You can use your Gmail account to to your friends, family and co-workers.
Put a clip on your site or blog
You can also copy and paste code to put a clip of your shared items on your site.
If you use Blogger, it's even easier, just use the "Add to Blogger" button.
Rename Unsubscribe
Change folders...
Delete view public page add a clip to your site
from
yocto-reader/apache-alias.conf0000644000004100000000000000005410735421002016076 0ustar www-datarootAlias /yocto-reader /usr/share/yocto-reader yocto-reader/Makefile0000644000004100000000000001350611123730256014373 0ustar www-dataroot# Copyright (C) 2007 Loic Dachary (loic@dachary.org) # Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) # Copyright (C) 2008 Bradley M. Kuhn # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public # License along with this program in the file LICENSE.txt. If not, see # . DIST_FILES = ./ChangeLog ./LICENSE.txt ./Makefile ./README.txt ./apache-alias.conf \ ./apache.conf ./backend/resttest.php ./debian/README.Debian ./debian/changelog \ ./debian/compat ./debian/control ./debian/copyright ./debian/examples \ ./debian/rules ./feedread.html ./keycuts.html ./permalinks.html \ ./reader/cache.js ./reader/common.js ./reader/feed.js ./reader/feeddata.js \ ./reader/fsm.js ./reader/jquery.js ./reader/mockapi.js ./reader/reader.js \ ./reader/rest.html ./reader/rest.js ./reader/strings.js ./reader/template.js \ ./rest/proxy.php ./tests/jsUnitCore.js ./tests/jscoverage.js \ ./tests/start_uitest.html ./tests/testcases.js ./tests/testcases_common.js \ ./tests/testcases_ui.js ./tests/tlib.js ./tests/tlibui.js ./tests/uitest.patch \ ./themes/default/addfeed-added.gif ./themes/default/addfeed-bundle-bg.gif \ ./themes/default/addfeed-more-bg.gif ./themes/default/addfeed-plus.png \ ./themes/default/addfeeds-more-bg.gif ./themes/default/addfeeds-plus.png \ ./themes/default/body-bg.png ./themes/default/button-down-arrow.gif \ ./themes/default/button-left-hover.gif ./themes/default/button-left-selected.gif \ ./themes/default/button-left.gif ./themes/default/button-right-hover.gif \ ./themes/default/button-right-selected.gif ./themes/default/button-right.gif \ ./themes/default/button-up-arrow.gif ./themes/default/button.psd \ ./themes/default/card-corners-blue.gif \ ./themes/default/card-corners-current-blue.gif \ ./themes/default/card-corners-current.gif \ ./themes/default/card-corners-read-blue.gif \ ./themes/default/card-corners-read.gif ./themes/default/card-corners.gif \ ./themes/default/card-lr-current.gif ./themes/default/card-lr-read.gif \ ./themes/default/card-lr.gif ./themes/default/card-tb-blue.gif \ ./themes/default/card-tb-current-blue.gif ./themes/default/card-tb-current.gif \ ./themes/default/card-tb-read-blue.gif ./themes/default/card-tb-read.gif \ ./themes/default/card-tb.gif ./themes/default/corner-bl.gif \ ./themes/default/corner-br.gif ./themes/default/corner-tl.gif \ ./themes/default/corner-tr.gif ./themes/default/folder-minus.gif \ ./themes/default/folder-plus.gif ./themes/default/icon-addfeed.gif \ ./themes/default/icon-allitems.gif ./themes/default/icon-check.gif \ ./themes/default/icon-feed.png ./themes/default/icon-folder.gif \ ./themes/default/icon-goto-mini.gif ./themes/default/icon-goto-small.gif \ ./themes/default/icon-goto.gif ./themes/default/icon-home.gif \ ./themes/default/icon-itememail.gif ./themes/default/icon-itemread.gif \ ./themes/default/icon-itemtag.gif ./themes/default/icon-itemunread.gif \ ./themes/default/icon-nav-left.gif ./themes/default/icon-nav-right.gif \ ./themes/default/icon-overview.png ./themes/default/icon-publish.gif \ ./themes/default/icon-reading-list.gif ./themes/default/icon-rss.png \ ./themes/default/icon-share-active.png ./themes/default/icon-share-inactive.png \ ./themes/default/icon-shared.png ./themes/default/icon-star-active.png \ ./themes/default/icon-star-inactive.png ./themes/default/icon-starred.png \ ./themes/default/icon-tag.gif ./themes/default/icon-trends-selected.gif \ ./themes/default/icon-trends.gif ./themes/default/icon-unsubscribe.gif \ ./themes/default/loading.gif ./themes/default/logo.png \ ./themes/default/module-new-window-icon.gif \ ./themes/default/screenshot-share.gif ./themes/default/settings.css \ ./themes/default/settings.zip ./themes/default/theme-merged.css \ ./themes/default/theme-saved.css ./themes/default/theme.css \ ./themes/default/trends-label-corner.gif ./tools/runuitests \ ./uitest.html all: test: if [ -t 0 ] ; then \ ./tools/runuitests ; \ fi install: dist mkdir -p $(DESTDIR)/usr/share/yocto-reader cp -r \ feedread.html permalinks.html reader themes \ $(DESTDIR)/usr/share/yocto-reader (cd $(DESTDIR)/usr/share/yocto-reader; /bin/ln -s feedread.html index.html) mkdir -p $(DESTDIR)/etc/yocto-reader mv $(DESTDIR)/usr/share/yocto-reader/reader/mockapi.js \ $(DESTDIR)/etc/yocto-reader ln -s /etc/yocto-reader/mockapi.js \ $(DESTDIR)/usr/share/yocto-reader/reader/mockapi.js (VERSION=`/usr/bin/head -1 debian/changelog | /usr/bin/perl -pe 's/^\s*yocto-reader\s+\(([\d\.]+)\)\s+.*$$/$$1/'`; /bin/cp yocto-reader-$$VERSION.tar.gz $(DESTDIR)/usr/share/yocto-reader; cd $(DESTDIR)/usr/share/yocto-reader; /bin/ln -s yocto-reader-$$VERSION.tar.gz yocto-reader.tar.gz) dist: @(VERSION=`/usr/bin/head -1 debian/changelog | /usr/bin/perl -pe 's/^\s*yocto-reader\s+\(([\d\.]+)\)\s+.*$$/$$1/'`; \ /bin/rm -rf yocto-reader-$$VERSION; \ mkdir yocto-reader-$$VERSION; \ /bin/echo $(DIST_FILES) | /usr/bin/perl -ne 'foreach $$f (split(/\s+/)) { print "$$f\n";}' | /bin/cpio -padum yocto-reader-$$VERSION; \ /bin/tar cf - yocto-reader-$$VERSION | /bin/gzip --best > yocto-reader-$$VERSION.tar.gz; \ /bin/rm -rf yocto-reader-$$VERSION ) clean: rm -Rf tests.coverage (VERSION=`/usr/bin/head -1 debian/changelog | /usr/bin/perl -pe 's/^\s*yocto-reader\s+\(([\d\.]+)\)\s+.*$$/$$1/'`; /bin/rm -rf yocto-reader-$$VERSION yocto-reader-$$VERSION.tar.gz) yocto-reader/apache.conf0000644000004100000000000000017110735421002015007 0ustar www-dataroot Options FollowSymLinks Order allow,deny Allow from all yocto-reader/backend/0000755000004100000000000000000010735421002014307 5ustar www-datarootyocto-reader/backend/resttest.php0000644000004100000000000000135410735421002016700 0ustar www-datarootch, CURLOPT_POST, true); curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postData); $result = curl_exec($this->ch); print $result; ?> yocto-reader/README.txt0000644000004100000000000000237010735421011014420 0ustar www-datarootYocto-reader - The free light-weight RSS news reader prototype version 0.2 ABSTRACT Yocto-reader is a prototype of a web based RSS reader written in Javascript. In this release the GUI front end is fully functional but does not have a backend available yet. Primary development site is http://yocto-reader.flouzo.net/ KEY FEATURES * Web 2.0 application * Keyword based search for news feeds * Browse and subscribe to feed bundles * Starring and sharring favourite news items * Custom tagging and folders * Tracking of read items * Loading huge amount of news items in background * Uses Google feed reader API * List View, Expanded View, Subscription View, Preferences etc. INSTALLATION Step 1. Unzip this distribution under the web server's DocumentRoot hierarchy. Step 2. Access the feedread.html via http URL. Optional. Edit reader/mockapi.js and change the default RSS feeds by changing the FRV_feedlist and FRV_feedinfo variables. TEST CASES All the testcases can be executed by the command tools/runuitests (Requires jscoverage in the path) LIMITATIONS OF THE PROTOTYPE * No user login * Changes are not persistent as it lacks a backend AUTHORS * Loic Dachary * Chandan Kudige LAST UPDATED ON 07/12/2007 BY CK yocto-reader/LICENSE.txt0000644000004100000000000010333011025314340014542 0ustar www-dataroot GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . yocto-reader/debian/0000755000004100000000000000000011123745471014155 5ustar www-datarootyocto-reader/debian/copyright0000644000004100000000000010114011123730256016100 0ustar www-datarootThis package was debianized by Ola Lundqvist on Mon, 17 Dec 2007 19:45:01 +0100. Debian packaging improved and modified by Bradley M. Kuhn of the Debian packaging: (C) 2007, Ola Lundqvist is licensed under the GPL, see `/usr/share/common-licenses/GPL'. Some improvements to the Debian packaging are: Copyright (C) 2008 Bradley M. Kuhn who licenses his copyrights on the packaging AGPLv3-or-later License: The License of whole package is the Affero General Public License, Version 3. It is included in full here since it is not available in common-licenses yet. GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS yocto-reader/debian/changelog0000644000004100000000000000165411123730256016030 0ustar www-datarootyocto-reader (0.9.4) unstable; urgency=medium * Removed link to proprietary Google javascript and added source installation. (closes: #507579) -- Bradley M. Kuhn Sat, 20 Dec 2008 15:15:31 -0500 yocto-reader (0.9.3) unstable; urgency=low * Answering RFP. (closes: #485450) -- Loic Dachary (OuoU) Sat, 21 Jun 2008 18:06:43 -0400 yocto-reader (0.9.2) unstable; urgency=low * keyboard shortcuts implementation * backend stub files -- Loic Dachary (OuoU) Sat, 29 Dec 2007 11:09:59 +0000 yocto-reader (0.9.1) unstable; urgency=low * Made jscoverage optional. * Splitted apache configuration to two files and install them by default to apache2 config. -- Ola Lundqvist Wed, 19 Dec 2007 07:41:17 +0100 yocto-reader (0.9.1) unstable; urgency=low * Initial release. -- Ola Lundqvist Mon, 17 Dec 2007 19:45:01 +0100 yocto-reader/debian/README.Debian0000644000004100000000000000166310735421003016212 0ustar www-datarootyocto-reader for Debian ----------------------- 1) Include a copy of the example apache-alias.conf file to your apache configuration. You can find the example apache-alias.conf file in /usr/share/doc/yocto-reader/examples. The alias file has also been installed to /etc/apache2/conf.d/yocto-reader-alias.conf to automatically enable yocto-reader in your apache configuration. Move, edit or delete according to your preferences. A default setting for apache also been installed to /etc/apache2/conf.d/yocto-reader.conf to automatically include it to your apache2 configuration. You should not need to edit this file. 2) Access the feedread.html via http URL http:///yocto-reader/feedread.html Optional: Edit /etc/yocto-reader/mockapi.js and change the default RSS feeds by changing the FRV_feedlist and FRV_feedinfo variables. -- Ola Lundqvist Mon, 17 Dec 2007 19:45:01 +0100 yocto-reader/debian/examples0000644000004100000000000000003510735421002015701 0ustar www-datarootapache.conf apache-alias.confyocto-reader/debian/rules0000755000004100000000000000417710735425675015257 0ustar www-dataroot#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. $(MAKE) test $(MAKE) #docbook-to-man debian/yocto-reader.sgml > yocto-reader.1 touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. -$(MAKE) clean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/yocto-reader. $(MAKE) DESTDIR=$(CURDIR)/debian/yocto-reader install mkdir -p $(CURDIR)/debian/yocto-reader/etc/apache2/conf.d cp apache.conf $(CURDIR)/debian/yocto-reader/etc/apache2/conf.d/yocto-reader.conf cp apache-alias.conf $(CURDIR)/debian/yocto-reader/etc/apache2/conf.d/yocto-reader-alias.conf # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples # dh_install # dh_installmenu # dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_python # dh_installinit # dh_installcron # dh_installinfo dh_installman dh_link dh_strip dh_compress dh_fixperms # dh_perl # dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure yocto-reader/debian/control0000644000004100000000000000074711123730256015563 0ustar www-datarootSource: yocto-reader Section: web Priority: extra Maintainer: Loic Dachary (OuoU) Build-Depends: debhelper (>= 5), coreutils, perl-base, cpio, tar Standards-Version: 3.7.2 Package: yocto-reader Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends} Description: web based RSS reader Yocto-reader is a prototype of a web based RSS reader written in Javascript. In this release the GUI front end is fully functional but does not have a backend available yet. yocto-reader/debian/compat0000644000004100000000000000000210735421002015340 0ustar www-dataroot5 yocto-reader/permalinks.html0000644000004100000000000000406110735421004015756 0ustar www-dataroot Permalinks

Permalinks

All Items (I.IV)
Home (R.L & RV.H)
All Items (RV.LV.A)
Starred (RV.LV.ST)
Shared (RV.LV.SH)
Trends (RV.T.*)
Browse (RV,FD)
Browse » more bundles
Search (RV.LV.SU & RV.SR & RV.SR.SS)
Folder
Feed (RV.LV)
Feed » item view
Tags (RV.LV.T)
Settings » Subscriptions (R.S & R.S.S)
Settings » Labels (R.S.T)
Settings » Goodies
Settings » Import/Export (R.S.I)
Settings » Prefs (R.S.P)

chandan
Last modified: Fri Sep 28 00:58:20 EST 2007 yocto-reader/tools/0000755000004100000000000000000010735421024014064 5ustar www-datarootyocto-reader/tools/runuitests0000755000004100000000000000056510735421024016245 0ustar www-dataroot#!/bin/sh if [ -x "$(which jscoverage)" -a -x "$(which x-www-browser)" ] ; then rm -f uitest.html cp feedread.html uitest.html patch uitest.html < tests/uitest.patch export TEST=start_uitest.html rm -rf tests.coverage jscoverage reader tests.coverage cp tests/*.html tests/jscoverage.js tests.coverage x-www-browser tests.coverage/$TEST fi yocto-reader/uitest.html0000644000004100000000000026104711123730256015143 0ustar www-dataroot Feed Reader (prototype) Test progress:

Yocto Reader

Source Code | dummy@example.com | | | Settings | My Account | Help | Sign Out

Loading...

Subscribed. Unsubscribe
 

Tip: Managing Your Reading List

Before you get started, we want to let you know about an important feature of Yocto Reader.

As you view items in your reading list, they will be automatically marked as read as you scroll down (when in the "Expanded" view).

If you'd prefer to disable this feature, you can turn it off in Settings.

Dismiss this message (it will not appear again)

Your shared items are publicly accessible.
Tell your friends
You can use your Gmail account to to your friends, family and co-workers.
Put a clip on your site or blog
You can also copy and paste code to put a clip of your shared items on your site.
If you use Blogger, it's even easier, just use the "Add to Blogger" button.

You haven't shared any items yet.

Sharing interesting items with your friends is easy: simply click on the sharing icon.

The item will then instantly appear on your public page at:



This page is accessible to anyone who knows its address, so all that's left to do is to let your friends know about it.

Find out more about sharing
Sort by oldest only shows items from the last 30 days. Learn more Dismiss
Navigation Acting on items
j/k:next/previous item s:star item
space:next item or page <Shift> + s:share item
<Shift> + space:previous item or page v:view original
n/p:item scan down/up (list only) t:tag item
<Shift> + n/p:next/previous subscription m:mark item as read/unread
<Shift> + x:expand folder o/enter:expand/collapse item (list only)
<Shift> + o:open subscription or folder <Shift> + a:mark all as read
e:email item
Jumping Application
g then h:go home r:refresh
g then a:go to all items u:toggle full screen mode
g then s:go to starred items 1:switch to expanded view
g then <Shift> + s:go to shared items 2:switch to list view
g then u:open subscription selector
g then t:open tag selector
g then <Shift> + t:open trends page
  • Starred ()
  • abcd 
More bundles...

See more from  »

Add star Remove star Mark as read

Add star Remove star Mark as read
   
Your shared items are publicly accessible.
Tell your friends
You can use your Gmail account to to your friends, family and co-workers.
Put a clip on your site or blog
You can also copy and paste code to put a clip of your shared items on your site.
If you use Blogger, it's even easier, just use the "Add to Blogger" button.
Rename Unsubscribe
Change folders...
Delete view public page add a clip to your site
from
yocto-reader/ChangeLog0000644000000000000000000000063011123730256013722 0ustar rootroot2008-12-20 Bradley M. Kuhn * feedread.html (head): Added load of reader/feeddata.js (body): s/somewhere.com/example.com/ * reader/mockapi.js (FR_init): Make sure onLoadCallback is a 'function' * Makefile (dist): Wrote target. (DIST_FILES): Added variable. (install): Added installation of dist file. * feedread.html (head): Removed inclusion of Google proprietary Javascript. yocto-reader/rest/0000755000004100000000000000000010735421011013675 5ustar www-datarootyocto-reader/rest/proxy.php0000644000004100000000000000401510735421011015567 0ustar www-dataroot$value){ if($name == $key){if($value !== ''){$output = $value;}} } foreach($_POST as $key=>$value){ if($name == $key){if($value !== ''){$output = $value;}} } if(!isset($output)){$output = '';} $output = strip_tags(substr(trim($output),0,500)); return($output); } function readdata($ch, $data) { print $data; } /* $url = urldecode(aglobal('u')); $as = aglobal('as'); if (!$as) { $as = 'raw'; } */ $url = 'http://backend.yocto.aminche.com/allFeeds?user=test'; print "$url\n\n"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1'); $resp = curl_exec($ch); curl_close($ch); print "Done: $resp\n\n"; $urlenc = urlencode($url); if (0) { $resp = preg_replace('/(<\s*head.*?>)/i', "\\1", $resp); } exit; if ($as == 'raw') { header('Content-Type: text/plain'); print $resp; } else { // $resp = htmlentities($resp); // $resp = "

Asassa

Hello\n\nAbcd\n\n"; $resp = preg_replace('/CDATA/i', '', $resp); $resp = preg_replace('/\]\]>/i', '', $resp); $resp1 = "\n" . "\n". "404 Not Found\n" . "\n" . "

Not Found

\n" . "The requested URL /proj/sudoku/empty.html was not found on this server.

\n" . "


\n" . "
Apache/1.3.33 Server at kudang.ourhome Port 80
\n" . "\n"; header('Content-Type: text/xml'); header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past ?> ]]> yocto-reader/keycuts.html0000644000004100000000000000474010735421004015304 0ustar www-dataroot
Shortcuts for Reader
shift-n/pnavigation down/upselects the next/previous subscription or folder in the navigation
shift-xnavigation expand/collapseexpand or collapse a folder selected in the navigation
shift-onavigation open subscriptionopens the item currently selected in the navigation
Shortcuts for Reader Viewer in List View
j/kitem down/upselects the next/previous item in the list
n/pscan down/upin list view, selects the next item without opening it
oopen/close itemin list view, expands or collapses the selected item
enteropen/close itemin list view, expands or collapses the selected item
stoggle starstars the selected item
shift-stoggle shareshares the selected item
mmark as read/unreadswitches the read state of the selected item
ttag an itemopens the tagging field for the selected item
vview originalopens the original source for this article in a new window
shift-amark all as readmarks all items in the current view as read
1expanded viewdisplays the subscription as expanded items
2list viewdisplays the subscription as a list of headlines
rrefreshrefreshes the unread counts in the navigation
Global Shortcuts
ghgo to homegoes to the Google Reader homepage
gago to all itemsgoes to the "All items" view
gsgo to starred itemsgoes to the "Starred items" view
gtgo to tagallows you to navigate to a tag by entering the tag name
gugo to subscriptionallows you to navigate to a subscription by entering the subscription name
utoggle full screen modehides and shows the list of subscriptions
yocto-reader/themes/0000755000004100000000000000000010735421013014207 5ustar www-datarootyocto-reader/themes/default/0000755000004100000000000000000010735421024015635 5ustar www-datarootyocto-reader/themes/default/theme-merged.css0000644000004100017500000020624710731444172021360 0ustar www-datachandan## # yocto-reader - A light-weight RSS reader aggregator prototype, version 0.2 # (http://yocto-reader.flouzo.net/) # # Copyright (C) 2007 Loic Dachary (loic@dachary.org) # Copyright (C) 2007 Chandan Kudige (chandan@nospam.kudige.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ## .ac-renderer { border: 1px solid #666; background: #eee; color: #000; z-index: 2; position: absolute; } .ac-renderer div { padding: 1px 3px; } .ac-renderer .active { background: #bbb; } ins { text-decoration: none; } #markup-templates { display: none; } html, body { margin: 0; font-size: 90%; } html, body, input { font-family: arial, sans-serif; } body { background: #fff url("body-bg.png") repeat-x 0 0; color: #000; } div, form { margin: 0; } html.settings, body.settings { overflow: auto; } a, a:visited, ul#reading-list li, .link { color: #1010c8; } .link { text-decoration: underline; cursor: pointer; } a:focus { -moz-outline: 0; } a:focus, .unselectable { -moz-user-select: none; -khtml-user-select: none; user-select: none; } a.internal, .link.internal { color: #a00; } input { font-size: 95%; } div.clr { clear: both; } .hidden { display: none; } #loading-area { position: absolute; background-image: url("loading.gif"); background-repeat: no-repeat; z-index: 10000; padding: 0; top: 14em; width: 176px; height: 63px; left: 50%; margin-left: -88px; } #loading-area p { font-weight: bold; font-size: 130%; padding: 20px 0 0 15px; margin: 0; color: #222; } .rtl { direction: rtl; right: 0px; } #search { position: absolute; top: 30px; left: 180px; padding: 0; } #search form { display: inline; } #search-input { width: 230px; } #search .input-help-text { color: #666; font-size: 90%; margin-top: .1em; } #message-area { padding: 0.3em 0.5em; text-align: center; font-weight: bold; width: auto; border-left: 0; border-right: 0; margin: 1.5em auto 0; } #message-area.info-message { background: #ffffd9; border: solid 1px #a7a772; } #message-area.progress-message { background: #b8ff6b; border: solid 1px #8bc151; } #message-area.error-message { background: #fdd; border: solid 1px #900; } #subscribe-area { position: relative; margin: 0em 1.5em 0; } body.ie6 #subscribe-area { border: 1px solid #fff; } #chrome-unsubscribe { color: #333; font-size: 100%; } #chrome-unsubscribe .chrome-unsubscribe-link { font-size: 100%; } #chrome-subscribe { background: #eaeaea; margin: 0; width: auto; font-size: 110%; -moz-border-radius: 8px; -webkit-border-radius: 8px; } #chrome-subscribe .chrome-subscribe-button { background-image: url("addfeed-plus.png"); background-position: 5px center; background-repeat: no-repeat; color: #00c; font-size: 100%; font-weight: bold; padding-left: 25px; padding-right: 5px; margin-right: 7px; width: auto; overflow: visible; } #chrome-subscribe-edit div.chrome-subscribe-container { background: #eaeaea; margin: -8px 0 0 0; padding: 1em; font-size: 100%; z-index: 2; -moz-border-radius: 0 0 8px 8px; -webkit-border-radius: 0 0 8px 8px; } #chrome-subscribe a, #chrome-unsubscribe a { padding-left: .5em; font-size: 85%; zoom: 1; } #chrome-subscribe a.edit span.closed, #chrome-subscribe a span.open { display: none; } #chrome-subscribe a.edit span.open, #chrome-subscribe a span.closed { display: inline; } #chrome-subscribe-edit-title { display: block; width: 100%; } #chrome-subscribe-edit-tags { width: 360px; } #chrome-subscribe-edit label { display: block; width: 100%; color: #666; } #chrome-subscribe-edit label .instructions { font-weight: normal; } #chrome-subscribe-edit-buttons { padding: .7em 0; } #chrome-unsubscribe, #chrome-subscribe { display: block; padding: .3em .3em .3em .4em; margin: -.6em auto .5em; } #settings-frame { width: 100%; border: 0; z-index: 10; position: absolute; top: 5.5em; margin: 0; padding: 0; left: -10000px; } #settings-frame.loaded { left: 0; } .progress-bar-vertical, .progress-bar-horizontal { position: relative; border: 1px solid #949dad; background: white; padding: 1px; overflow: hidden; margin: 2px; } .progress-bar-horizontal { width: 80%; height: 14px; } .progress-bar-vertical { width: 14px; height: 200px; } .progress-bar-thumb { position: relative; background: #a4c5ff; overflow: hidden; width: 100%; height: 100%; } .progress-bar-inner { position: absolute; top: 0; text-align: center; width: 100%; font-size: 90%; font-weight: normal; color: #555; padding: 2px; } .progress-bar { height: .3em; margin: 0 auto; } .progress-bar-label { font-weight: normal; font-size: 90%; margin: 0; } .goog-tooltip { background: infobackground; color: infotext; border: 1px solid infotext; padding: 1px; font: menu; font-size: 9pt; max-width: 40em; z-index: 2002; } .popout { background-repeat: no-repeat; background-color: transparent; padding: 1px 8px 1px 16px; background-position: 0 50%; background-image: url("reader/ui/2317887107-module-new-window-icon.gif"); text-decoration: none; } .button-container { empty-cells: show; border-spacing: 0; border-collapse: collapse; cursor: pointer; float: left; } .button-container td.btl, .button-container td.btr, .button-container td.bbl, .button-container td.bbr { border: 0; padding: 0 !important; margin: 0; background-repeat: no-repeat; } .button-container td.btl { width: 6px; height: 4px; } .button-container td.btr { height: 4px; background-position: top right; } .button-container td.bbl { width: 6px; background-position: bottom left; } .button-container td.bbr { background-position: bottom right; padding: 0 6px 4px 0 !important; } .button-container-tight td.btl { width: 5px; height: 3px; } .button-container-tight td.btr { height: 3px; } .button-container-tight td.bbl { width: 5px; } .button-container-tight td.bbr { padding: 0 5px 3px 0 !important; } .button-container-menu .button-body-container { padding-right: 18px; position: relative; } .button-container-menu .button-menu-arrow { background: url("button-down-arrow.gif") center right no-repeat; position: absolute; right: 0; top: 0; width: 14px; height: 100%; } body.ie6 .button-container-menu { position: relative; } body.ie6 .button-container-menu .button-body-container { position: static; } body.ie6 .button-container-menu .button-menu-arrow { top: 4px; right: 6px; } body.ie6 .button-container-tight .button-menu-arrow { top: 3px; right: 5px; } .button-container .btl, .button-container .bbl { background-image: url("button-left.gif"); } .button-container .btr, .button-container .bbr { background-image: url("button-right.gif"); } .button-container:hover .btl, .button-container:hover .bbl { background-image: url("button-left-hover.gif"); } .button-container:hover .btr, .button-container:hover .bbr { background-image: url("button-right-hover.gif"); } .button-container:active .btl, .button-container-selected .btl, .button-container-selected:hover .btl, .button-container:active .bbl, .button-container-selected .bbl, .button-container-selected:hover .bbl { background-image: url("button-left-selected.gif"); } .button-container:active .btr, .button-container-selected .btr, .button-container-selected:hover .btr, .button-container:active .bbr, .button-container-selected .bbr, .button-container-selected:hover .bbr { background-image: url("button-right-selected.gif"); } .button-container-disabled { filter: alpha(opacity=50); -moz-opacity: 0.5; opacity: 0.5; cursor: default; } .button-container-disabled .btl, .button-container-disabled:hover .btl, .button-container-disabled .bbl, .button-container-disabled:hover .bbl { background-image: url("button-left.gif"); } .button-container-disabled .btr, .button-container-disabled:hover .btr, .button-container-disabled .bbr, .button-container-disabled:hover .bbr { background-image: url("button-right.gif"); } .round-box { empty-cells: show; } .round-box td { padding: 0; margin: 0; } .round-box .s { font-size: 1px; line-height: 1px; } .round-box td.s, .round-box td.c { background-color: #ccc; } .round-box .tl, .round-box .tr, .round-box .bl, .round-box .br { width: 3px; height: 3px; background-repeat: no-repeat; } .round-box .tl { background-image: url("corner-tl.gif"); background-position: top left; } .round-box .tr { background-image: url("corner-tr.gif"); background-position: top right; } .round-box .bl { background-image: url("corner-bl.gif"); background-position: bottom left; } .round-box .br { background-image: url("corner-br.gif"); background-position: bottom right; } .round-box .sq { background-image: none; } #logo-container { display: block; position: relative; width: 158px; height: 56px; } #logo { position: absolute; cursor: pointer; cursor: hand; padding: 0 0 4px 0; width: 146px; height: 54px; margin-left: 14px; margin-top: 6px; background: url("reader/ui/3338954865-logo.png") no-repeat 0px 5px; } #logo span { display: none; } #global-info { position: absolute; top: 0; right: 0; margin: 0; padding: .7em 1em; } #global-info1 { margin: 0; padding: 0; float: right; } #design-selector-link { color: #cc0000; font-weight: bold; } #selectors-box td, #sub-tree-box td { background-color: #FDFA86; } #add-box td { background-color: #D4D4D7; } #selectors-box ul, #selectors-box li { padding: 0; margin: 0; } #selectors-box li { list-style-type: none; } #selectors-box li { font-weight: normal; font-size: 105%; } #quick-add-subs, #selectors-box li, #add-box #add-subs { padding: 2px 0 2px 18px; display: block; background-repeat: no-repeat; background-position: center left; } #selectors-box li { float: left; clear: left; padding-right: 5px; } #selectors-box #ol-allitems, #selectors-box #star-selector, #selectors-box #broadcast-selector, #selectors-box #trends-selector .brand-selector { font-weight: normal; } body.ie #selectors-box li { white-space: nowrap; } #selectors-box #ol-allitems.unread { font-weight: bold; } #selectors-box .c, #add-box .c { padding: 0 0 0 8px; width: 227px; } #selectors-box, #add-box, #sub-tree-box { margin: 2px 0; } #selectors-box #ol-home { background-image: url("icon-home.gif"); } #selectors-box #ol-allitems { background-image: url("icon-allitems.gif"); } #selectors-box #trends-selector { background-image: url("icon-trends.gif"); } #selectors-box #trends-selector.selected { background-image: url("icon-trends-selected.gif"); } #selectors-box li.selected { background-color: #EEEDED; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #selectors-box li.selected a, #selectors-box li.selected .link, #add-box #add-directory.selected .link { color: #000; text-decoration: none; cursor: default; } #selectors-box #nav-refresh { float: right; } #quick-add-subs, #add-box #add-subs { background-image: url("addfeeds-plus.png"); } #add-box #add-directory { float: right; padding: 2px 0.5em 2px 0; font-size: 105%; } #add-box #add-directory.selected .link { font-weight: bold; } #quick-add-form { display: block; } #quick-add-target { position: absolute; left: -9000px; width: 50px; } #quick-add-bubble-holder { color: #000; z-index: 50; margin: 2px 0; position: absolute; overflow: auto; } #quick-add-bubble-holder td.s { background-color: #6bc290; } #quick-add-bubble-holder .c { background: #D4D4D7; width: 300px; padding: 0 0 1px 8px; } #quickadd { width: 250px; float: left; } #quick-add-close { float: right; margin-right: 5px; vertical-align: top; font-weight: bold; cursor: pointer; } #quick-add-subs, #add-box #add-subs { font-weight: bold; font-size: 105%; background-position: 0 3px; } #add-box #add-subs { float: left; } #quick-add-helptext, #quick-add-instructions { clear: both; color: #555; font-size: 90%; } #quick-add-helptext a { font-weight: bold; } #quick-add-bubble-holder .button-container { margin: 1px 0 0 3px; } #quick-add-success { padding: 0.3em 0.5em; margin: 0.25em 0 0 0; background: #fcd159; border: solid 1px #a7a772; } #quick-add-success-message { padding-top: 0.2em; float: left; } #quick-add-success-title { font-weight: bold; } #quick-add-success-folder-chooser { margin-left: 1em; float: left; } #sub-tree-container { width: 100%; position: relative; zoom: 1; } #sub-tree-box { margin-bottom: 0; padding-bottom: 10px; } #sub-tree { padding: 0 0 0 8px; height: 420px; width: 227px; overflow: auto; overflow-y: auto; overflow-x: hidden; position: relative; } body.ie #sub-tree { width: 215px; } #sub-tree, #sub-tree ul, #sub-tree li { margin: 0; } #sub-tree ul { padding-left: 12px; } #sub-tree li { position: relative; zoom: 1; list-style-type: none; clear: left; } #sub-tree li .link { text-decoration: none; display: block; padding: 2px 5px 1px 4px; position: relative; zoom: 1; white-space: nowrap; overflow: hidden; float: left; } #sub-tree .name { color: #66c; text-decoration: underline; } #sub-tree .icon { vertical-align: bottom; padding-right: 1px; border: 0; } #sub-tree li .cursor { background-color: #AAAAAC; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #sub-tree li .updated { background-color: #f4ee3c; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #sub-tree li .updated-intermediate { background-color: #ebed9d; } #sub-tree li .selected .name { color: #000; text-decoration: none; } #sub-tree .toggle { position: absolute; left: -18px; top: -1px; width: 22px; height: 18px; cursor: pointer; background-repeat: no-repeat; background-position: 7px 8px; } #sub-tree li.expanded .toggle { background-image: url("folder-minus.gif"); } #sub-tree li.collapsed .toggle { background-image: url("folder-plus.gif"); } #sub-tree li.collapsed ul { display: none; } #sub-tree li a .name-unread { color: #00c; font-weight: bold; } /* CK - code for unread status in sub tree [items] */ #Reader li .unread-count { display: none; } #Reader .folder.unread .folder-selector .unread-count { display: inline; } #Reader .folder.unread .folder-selector .name { color: #00c; font-weight: bold; } #Reader .tpl-feed.unread .feed-selector .unread-count { display: inline; } #Reader .tpl-feed.unread .feed-selector .name { color: #00c; font-weight: bold; } #Reader #selectors-box .unread-count { display: none; } #Reader #selectors-box li.unread .unread-count { display: inline; } #Reader #selectors-box li.unread .name { color: #00c; font-weight: bold; } #sub-tree .icon-d-0, #sub-tree .name-d-0, #sub-tree .toggle-d-0, #sub-tree .unread-count-d-0 { display: none; } #sub-tree li .selected { background: #a4c5ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } .sub-tree-header { padding: 0.2em 0.4em; } #sub-tree-refresh { float: right; margin-right: 0.2em; font-size: 90%; } #sub-tree-container #new-subscriptions-header, #sub-tree-container.show-updated #all-subscriptions-header { display: none; } #sub-tree-container.show-updated #new-subscriptions-header { display: block; } #sub-tree-container.show-updated li li { display: none; } #sub-tree-container.show-updated li li.unread, #sub-tree-container.show-updated li li.selected { display: block; } #sub-tree-footer { padding: 0.2em 0.2em 0 0; clear: both; text-align: right; } div.banner { position: fixed; top: 40%; left: 15%; margin: 0; width: 70%; text-align: center; padding: 1em; color: #fff; text-shadow: #000 1px 1px 7px; } body.ie6 div.banner { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.4)); } div.banner-background { background: #000; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; -moz-opacity: 0.8; opacity: 0.8; filter: alpha(opacity=80); z-index: 1001; overflow: auto; } div.banner-background div { visibility: hidden; } div.banner-foreground { z-index: 1002; } div.banner div.primary-message-parent, div.banner div.secondary-message-parent { font-weight: bold; font-family: sans-serif; margin: 0; } div.banner div.primary-message-parent { font-size: 200%; } div.banner div.secondary-message-parent { border-top: solid 1px #999; padding-top: 0.5em; font-size: 150%; } div.banner div.stream-list { text-align: left; line-height: 130%; zoom: 1; } div.banner div.stream-list span { color: #dd0; padding: 0 0.5em 0 0; width: 50%; float: left; text-align: right; } div.banner div.stream-list ul { margin: 0 0 0 50%; padding: 0 0 0 0.5em; } div.banner-background div.stream-list ul li.selected { visibility: visible; background: #666; -moz-border-radius: 7px; -webkit-border-radius: 7px; border-radius: 7px; } body.ie div.banner-foreground div.stream-list ul li.selected { background: #666; } div.banner div.stream-list ul li { list-style-type: none; margin: 0; } div.banner div.stream-list ul li.separator { display: none; } div.banner h6 { text-align: center; margin: 0 0 0.25em 0; } div.banner div.initial-stream-list ul li { float: left; padding: 0 0.25em 0 0.25em; white-space: nowrap; } div.banner div.multiple-matches ul li { padding: 0 0 0 0.25em; } div.banner div.no-matches { color: #f99; } input.keyboard-selector-input { position: fixed; top: 0; left: -300px; } body.ie6 input.keyboard-selector-input { position: absolute; top: expression(eval(document.body.scrollTop)); } div.subscription-keyboard-selector { top: 20%; } body.ie6 div.subscription-keyboard-selector { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.2)); } div.subscription-keyboard-selector div.initial-stream-list span { float: none !important; text-align: left; width: auto; display: inline; } div.subscription-keyboard-selector div.initial-stream-list ul { display: inline; margin: 0; } div.subscription-keyboard-selector div.initial-stream-list ul li { float: none; display: inline; white-space: normal; } div.subscription-keyboard-selector div.initial-stream-list ul li.separator { display: inline; } #directory-box td.c, #directory-box td.s { background-color: #D4D4D7; } #directory-box .sq { width: 0; } #directory-box h4 { margin: 0; } #directory-box h4, #import-prompt { padding: 0.25em; font-size: 110%; } #directory-contents { background: #fff; padding: 0.5em; } .directory-header-box td.s, .directory-header-box td.c { background-color: #D4D4D7; } .directory-header-box h2 { margin: 0; font-size: 140%; font-weight: bold; padding: .1em .5em; } #directory-box h3 { font-size: 120%; font-weight: bold; margin: 0 0 .6em; } .directory-return-link { padding: 0.5em 0 0 1em; font-weight: bold; display: block; } #import-prompt { float: right; margin: 0; } #import-prompt-box #import-link { font-weight: bold; } #service-quickadd, #directory-search { padding-top: 1em; } #directory-box .directory-section { margin-left: 1em; } #directory-box .directory-section p { margin-bottom: 0.3em; } #directory-box .directory-form-box td { background-color: #e3f8e7; } #directory-box .directory-form-box .c { padding: 0.25em; } #bundles h3, #bundles p { display: inline-block; } body.ie #bundles-list { width: 637px; } .bundle, #show-more-bundles-container { background: #fff url("addfeed-bundle-bg.gif") no-repeat; height: 75px; width: 300px; float: left; margin: .5em; } .bundle-extra { display: none; } .bundle-clearing { clear: left; } .bundle-subscribe { float: none; font-size: 90%; } .bundle-subscribe .button-body-container { padding-left: 18px; background: url("addfeed-plus.png") no-repeat center left; white-space: nowrap; } .bundle-added .bundle-subscribe, .bundle-subscribed { display: none; } .bundle-added .bundle-subscribed { display: block; } .bundle-main { padding-top: 6px; padding-left: 65px; } .bundle-title { width: 231px; } .bundle-title { font-weight: bold; font-size: 130%; padding-bottom: 2px; white-space: nowrap; overflow: hidden; } .bundle-total { font-weight: bold; margin: .2em 0 .1em; padding-right: 8px; } .bundle-includes { text-decoration: underline; display: block; color: #000; padding: 0 0.25em 0.25em 0.25em; float: left; margin-top: 0.25em; } .bundle-includes .bundle-hover { display: none; } .bundle-includes:hover { background: #6bc290; color: #000; text-decoration: none; position: relative; } .bundle-includes:hover .bundle-hover { display: block; position: absolute; z-index: 1; background: #D4D4D7; border: solid 2px #6bc290; width: 18em; right: auto; left: 50%; margin-left: -9em; padding: 0.25em; } body.ie6 .bundle-includes:hover .bundle-hover { top: 1.1em; } .bundle-includes:hover .bundle-hover ul { margin: 0; padding: 0 0 0 0.75em; } .bundle-includes:hover .bundle-hover ul li { padding: 0; margin: 0; list-style-type: none; font-weight: bold; } #show-more-bundles-container { background-image: url("addfeeds-more-bg.gif"); } #show-more-bundles-link { padding-top: 27px; padding-right: 75px; height: 48px; width: 225px; display: block; text-align: center; font-size: 130%; font-weight: bold; } #show-more-bundles-return-link { display: none; clear: both; } #directory-box.bundles-only #show-more-bundles-container, #directory-box.bundles-only #service-quickadd, #directory-box.bundles-only #directory-search, #directory-box.bundles-only #import-prompt { display: none; } #directory-box.bundles-only .bundle-clearing { clear: none; } #directory-box.bundles-only #bundles-list { width: auto; } #directory-box.bundles-only .bundle-extra, #directory-box.bundles-only #show-more-bundles-return-link { display: block; } #service-quickadd { clear: both; } #service-quickadd-submit { background-image: url("addfeed-plus.png"); background-position: 5px center; background-repeat: no-repeat; padding-left: 25px; padding-right: 5px; } #directory-search { padding-bottom: 1em; } #directory-category-list { margin: 0; padding: 0; } #directory-category-list li { list-style-type: none; display: inline; padding: 0; margin: 0; } #directory-search-other-categories { padding: 0.5em 0 0 1em; } #directory-search-other-categories #directory-category-list { padding: 0; display: inline; } #directory-search-results ul.results { padding: 0; margin: 1em 0 0 0; } #directory-search-results ul li.result { list-style-type: none; padding: 0; margin: 0 0 1.5em 0; } #directory-search-results ul li h4 { margin: 0; font-weight: bold; font-size: 120%; } #directory-search-results ul li p { margin: 0; color: #666; } #directory-search-results ul li .feed-url { color: #008000; } #directory-search-results ul li .subscribe, #directory-search-results ul li .subscribed { margin-top: 0.2em; height: 17px; } #directory-search-results ul li .subscribed-links, #directory-search-results ul li .folder-chooser { float: left; } #directory-search-results ul li .subscribed-links { padding-top: 0.15em; } #directory-search-results ul li .subscribe { float: none; font-size: 90%; } #directory-search-results ul li .subscribe .button-body-container { padding-left: 18px; background: url("addfeed-plus.png") no-repeat center left; white-space: nowrap; } #directory-search-results ul li .subscribed, #directory-search-results ul li.result-subscribed .subscribe { display: none; } #directory-search-results ul li.result-subscribed .subscribed { display: block; color: #666; } .bundle-added .bundle-subscribed .message, #directory-search-results ul li.result-subscribed .subscribed .message { background: url("addfeed-added.gif") no-repeat; padding: 1px 0 0 15px; font-weight: bold; color: #222; } .bundle-added .bundle-subscribed .bundle-view-link, #directory-search-results ul li.result-subscribed .subscribed .view, #directory-search-results ul li.result-subscribed .subscribed .unsubscribe { color: #77c; text-decoration: underline; } #directory-search-results-paging { text-align: center; font-size: 120%; } #directory-search-results-paging .link { padding: 0 1em 1em 1em; } #directory-box #directory-welcome-title, #directory-box #directory-welcome { display: none; } #directory-box.welcome #directory-title, #directory-box.welcome #bundles, #directory-box.welcome #service-quickadd, #directory-box.welcome #directory-search, #directory-box.welcome #import-prompt { display: none; } #directory-box.welcome #directory-welcome-title, #directory-box.welcome #directory-welcome { display: block; } #directory-box.welcome #directory-welcome { margin: 1em; } #directory-welcome-video-container { margin: 1em; } #directory-welcome-video-container embed { margin: 0 auto 0 auto; display: block; width: 400px; height: 253px; } #directory-welcome-button-container { text-align: center; margin: 1em; } #directory-welcome-button, #directory-welcome-tour-link { font-size: 110%; font-weight: bold; } #message-area-outer { position: absolute; width: 100%; top: 2.2em; } #message-area-outer table { margin: 0 auto; } #message-area-outer #message-area-inner { font-weight: bold; padding: 0 1em; } #message-area-outer.progress-message td { background-color: #c8fa63; } #message-area-outer.info-message td { background-color: #fad163; } #message-area-outer.error-message td { background-color: #fc4d4d; } #scroll-filler-offline-message { display: none; } img.placeholder, .embed-placeholder { background: #d7d7d7; border: solid 1px #666; cursor: pointer; } body, html { overflow: hidden; } body { padding-bottom: 10px; } body.loaded { padding-bottom: 0; } #logo-container { width: 158px; height: 32px; } #logo { padding: 0; width: 133px; height: 28px; background: url("reader/ui/4184999142-logo-scroll.gif") no-repeat 0 0; margin-top: 13px; margin-left: 9px; } #settings-frame { top: 40px; } #main { width: auto; margin: 1.4em 0 0 0; } .folder-chooser { width: 142px; overflow: visible; } .folder-chooser .button-container { float: none; margin-right: 0; width: 100%; } .folder-chooser .button-container .button-body { font-size: 95%; } .folder-chooser .contents { position: absolute; list-style-type: none; margin: -1px 0 0 0; padding: 0; width: 140px; max-height: 180px; z-index: 1000; border: solid 1px #606060; border-top: solid 1px #bbb; background: #f3f3f3; overflow: auto; overflow-x: hidden; text-align: left; } li.chooser-item { margin: 0; padding: 0.2em 12px 0.2em 25px; cursor: pointer; white-space: nowrap; color: #000; } li.chooser-item:hover { background-color: #ddd; } li.chooser-item-selected { background-image: url("icon-check.gif"); background-position: 0.25em; background-repeat: no-repeat; } .tab-header { float: left; margin: 0 0.5em 0 0; cursor: pointer; } .tab-header td.s, .tab-header td.c { background-color: #E6E6E7; } .tab-header .c { color: #00c; padding: 0.25em 0.25em 0 0.25em; } .tab-header-selected { cursor: default; } .tab-header-selected td.s, .tab-header-selected td.c { background-color: #AAAAAC; } .tab-header-selected .c { font-weight: bold; color: #000; } .tab-group-contents { clear: left; background: #AAAAAC; padding: 5px 0 1px 0; } .tab-contents { background: #fff; } .home-header-box .c { font-size: 140%; font-weight: bold; padding: .1em .5em; } .home-header-box td.c, .home-header-box td.s { background-color: #AAAAAC; } .section { vertical-align: top; padding: 0.25em; } #left-section { width: 65%; } #right-section { width: 35%; padding-right: 1em; } .section-header { font-weight: bold; font-size: 120%; margin: .5em 0 1em; } #tips { min-width: 230px; } #tips-body { color: #777; } #tips-box { margin: 1em 0 0 0; } #tips-box td { background-color: #FDFA86; } #tips-box .c { padding: 0 .5em; } #tips-body img { border: 0; } #tips-body .bookmarklet { background-color: #E6E4E4; padding: 5px; -moz-border-radius: 8px; -webkit-border-radius: 8px; } #tips-body .promo-image-text { margin: 1em 0 0.5em 0; } #tips-body .promo-image-container { text-align: center; margin: 0.5em 0 1em 0; } #tips ul { padding: 0 0 0 1.5em; margin: 0 0 1em 0; } #tips ul li { padding: 0; margin: 0; } #tips ul li.tips-section { padding-top: 0.5em; } #recent-activity { overflow: hidden; } #recent-activity .recent { color: #777; padding-left: 24px; } #recent-activity #recent-activity-star { padding-bottom: 0.5em; } #recent-activity .recent h4 { margin: 0; padding: 2px 0 2px 18px; background-repeat: no-repeat; background-position: center left; margin-left: -24px; font-weight: normal; font-size: 100%; } body.ie6 #recent-activity .recent h4 { zoom: 1; } #recent-activity .recent h4 a { color: #777; } #recent-activity #recent-activity-star h4 { background-image: url("icon-star-active.png"); } body.ie6 #recent-activity #recent-activity-star h4 { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-active.png",sizingMethod='crop'); } #recent-activity #recent-activity-share h4 { background-image: url("icon-share-active.png"); } body.ie6 #recent-activity #recent-activity-share h4 { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-active.png",sizingMethod='crop'); } #recent-activity .recent-stream-title { font-style: italic; } #recent-activity .recent-title { font-weight: bold; color: #555; } #recent-activity .recent-item { padding: 1px 0; } #recent-activity .recent-snippet { font-size: 90%; } #team-messages .title { font-weight: bold; margin: .2em 0; font-size: 135%; } #team-messages .body { color: #444; } #team-messages .section-header { margin-bottom: .2em; font-size: 110%; margin: 1em 0 0.2em 0; } #overview { min-width: 330px; padding: 0; margin-right: 1.5em; } #overview .section-header { margin-bottom: 0.5em; } #overview .overview-segment img { float: right; padding: 0 0 2px 2px; } #overview .overview-header { margin-bottom: 4px; font-weight: bold; } #overview .label { font-size: 95%; margin: .2em 0 1em; color: #333; clear: both; } #overview .title { font-size: 120%; } #overview .fld-entries-title { margin: 0 .6em 0 0; padding-left: 20px; font-weight: bold; color: #555; font-size: 105%; background: #fff url("icon-allitems.gif") no-repeat; } #overview .item-title-rtl { margin: 0 0 0 0.6em; padding-left: 0; padding-right: 20px; background: #fff; } #overview .fld-entries-contentSnippet { color: #777; } #overview .overview-metadata { font-size: 90%; margin-bottom: .3em; } #overview-footer { width: 95%; overflow: auto; clear: both; } #footer { margin-top: 2em; padding: 1em; text-align: center; border-top: solid 1px #ccc; } #trends-header-box { margin-bottom: 0.5em; } #trends-header-box .c { font-size: 140%; font-weight: bold; padding: .1em .5em; } #trends-header-box td.c, #trends-header-box td.s { background-color: #AAAAAC; } #trends-item-count-header { font-size: 175%; color: #333; } #trends .trends-columns { width: 100%; } #trends .trends-columns-fixed { table-layout: fixed; } #trends .trends-columns td { vertical-align: top; } #trends .trends-columns td.left-column, #trends .trends-columns td.right-column { width: 50%; } #trends .trends-columns td.left-column, #trends .trends-columns td.right-column { padding-right: 1em; } #trends h2 { margin: 1em 0 0 0; } #trends .explanation { font-size: 90%; color: #999; padding: 0 0 0.75em; font-weight: normal; } #trends table.sorting { width: 100%; border-collapse: collapse; border-spacing: 0; } #trends table.sorting th { text-align: left; font-weight: bold; border-bottom: solid 1px #AAAAAC; background: #DBDBDB; padding: 2px; white-space: nowrap; } #trends table.sorting th.primary { background: #F1F1F1; } #trends table.sorting td { border-top: solid 1px #EEEEEE; padding: 2px; } #trends table.sorting tr.first-row td { border-top: 0; } #trends table.sorting td.sorting-sub-primary, #trends table.sorting td.sorting-sub-secondary { text-align: right; white-space: nowrap; } #trends table.sorting td.sorting-sub-primary { width: 4em; background: #f3f7ff; } #trends table.sorting tr.alt td.sorting-sub-primary { background: #F1F1F1; } #trends table.sorting td.sorting-sub-secondary { width: 4em; } #trends table.sorting tr.alt td { background: #E8E8E8; } #trends table.sorting .trends-sorting-homepage { padding-left: 0.25em; vertical-align: middle; border: 0; } #trends table.sorting .sorting-sub-unsubscribe { width: 13px; padding-right: 0.5em; } #trends table.sorting .trends-sorting-unsubscribe { cursor: pointer; padding-left: 0.5em; padding-bottom: 1px; vertical-align: text-bottom; } #trends .sorting-empty { padding: 1em; color: #333; } #trends .sorting-container { position: relative; zoom: 1; } #trends .sorting-container .top-links { border-top: solid 1px #AAAAAC; background: #DBDBDB; padding: 2px; text-align: right; } #trends .show-top10 .top10-link, #trends .show-top20 .top20-link, #trends .show-top40 .top40-link { font-weight: bold; text-decoration: none; color: #000; cursor: default; } #trends table.sorting tbody tr { display: none; } #trends .show-top10 table.sorting tr.top10, #trends .show-top20 table.sorting tr.top20, #trends .show-top40 table.sorting tr.top40 { display: table-row; } body.ie #trends .show-top10 table.sorting tr.top10, body.ie #trends .show-top20 table.sorting tr.top20, body.ie #trends .show-top40 table.sorting tr.top40 { display: block; } #trends .bucket-chart-description { padding: 0.5em 0 0 1em; } #trends table.bucket-chart { border-collapse: collapse; border-spacing: 0; } #trends .trends-columns table.bucket-chart td { vertical-align: bottom; text-align: center; font-size: 85%; padding: 0 1px 0 0; } #trends table.bucket-chart .bucket { background: #80c65a; width: 100%; margin: 0 auto; position: relative; } #trends table.bucket-chart .bucket, #trends table.bucket-chart .bucket .bucket-width { font-size: 1px; line-height: 1px; } #trends table.bucket-chart .bucket .bucket-width { height: 1px; } #trends table.bucket-chart .bucket-labels th { padding: 1px 9px 1px 0; text-align: right; background: url("trends-label-corner.gif") no-repeat center right; font-size: 90%; font-weight: normal; color: #999; } #trends table.bucket-chart .bucket-labels th.dow { padding: 0 1px; background: none; text-align: center; } #trends table.bucket-chart .bucket-scale-container { height: 100px; text-align: right; border-right: solid 1px #999; color: #999; padding-right: 2px; margin-right: 2px; position: relative; } #trends table.bucket-chart .bucket-scale-23, #trends table.bucket-chart .bucket-scale-13, #trends table.bucket-chart .bucket-scale-0 { position: absolute; margin-top: -1ex; right: 2px; } #trends table.bucket-chart .bucket-scale-23 { top: 33%; } #trends table.bucket-chart .bucket-scale-13 { top: 66%; } #trends table.bucket-chart .bucket-scale-0 { bottom: 0; margin-top: 0; } #trends table.bucket-chart .bucket-line-max, #trends table.bucket-chart .bucket-line-23, #trends table.bucket-chart .bucket-line-13, #trends table.bucket-chart .bucket-line-0 { position: absolute; top: 0; right: 0; height: 0; border-top: dotted 1px #ccc; } #trends table.bucket-chart .bucket-line-max { top: 0; } #trends table.bucket-chart .bucket-line-23 { top: 33%; } #trends table.bucket-chart .bucket-line-13 { top: 66%; } #trends table.bucket-chart .bucket-line-0 { border-top: solid 1px #999; top: 100%; } #trends #day-bucket-chart-contents, #trends #hour-bucket-chart-contents, #trends #dow-bucket-chart-contents { padding: 0.5em; } #trends ol.cloud { list-style-type: none; padding: 0; margin: 0; } #trends ol.cloud li { padding: 0; margin: 0; display: inline; } #trends ol.cloud li.x0 {font-size: 80%; } #trends ol.cloud li.x1 {font-size: 100%; } #trends ol.cloud li.x2 {font-size: 120%; } #trends ol.cloud li.x3 {font-size: 140%; } #trends ol.cloud li.x4 {font-size: 160%; } #trends ol.cloud li.x5 {font-size: 180%; } #trends ol.cloud li span { text-decoration: none; } #trends ol.cloud li span:hover { text-decoration: underline; } #trends ol.cloud li.y0 span {color: #aaa; } #trends ol.cloud li.y1 span {color: #888; } #trends ol.cloud li.y2 span {color: #666; } #trends ol.cloud li.y3 span {color: #444; } #trends ol.cloud li.y4 span {color: #222; } #trends ol.cloud li.y5 span {color: #000; } #trends ol.cloud .tpl-tag-cloud { cursor: pointer; } #viewer-header { z-index: 1000; position: relative; zoom: 1; } #viewer-header .title { font-size: 140%; font-weight: bold; padding: .1em 0; } #viewer-header #subscribe-area { float: left; margin: 0; padding: 0; } #viewer-header #subscribe-area #chrome-subscribe { padding: 0; margin: 0; } #viewer-header #subscribe-area .chrome-subscribe-edit-link { display: none; } #viewer-header #viewer-controls { position: absolute; right: 0; bottom: 0; } body.ie6 #viewer-header #viewer-controls { margin-bottom: -1px !important; } body.opera #viewer-header #viewer-controls { white-space: nowrap; width: 25em; } #viewer-header #viewer-controls #viewer-controls-container-main { position: relative; } body.ie6 #viewer-header #viewer-controls #viewer-controls-container-main { position: static; } #viewer-header #viewer-controls #viewer-controls-container { overflow: hidden; position: relative; } /* * The Settings menu dropdown in listview which changes according * to the specific list view */ #lv-settings-menu { margin: 0 0.5em 0 0; } #lv-settings-menu .lv-settings-switch { display: none; } #lv-settings-menu-contents, .sv-folder-menu-contents { position: absolute; list-style-type: none; margin-top: -0.25em; left: 0; padding: 0; margin: 0; width: 13em; border: solid 1px #606060; background: #f3f3f3; overflow: auto; overflow-y: auto; overflow-x: hidden; z-index : 1000; } .sv-folder-menu-contents { margin-top: 0.25em; } body.mozilla #lv-settings-menu-contents, body.mozilla #sv-folder-menu-contents { border: 0; outline: solid 1px #606060; border-bottom: solid 1px #fff; } #lv-settings-menu .button-container-selected { font-weight: normal; } /* Hide all menu items by default. Selectively enable * menu items based on in top-level state */ #lv-settings-menu-contents li.menu-item { display: none; } #lv-settings-menu-contents li.divider { border-top: solid 1px #ccc; } #lv-settings-menu-contents li .check { visibility: hidden; padding: 0; } #lv-settings-menu-contents li:hover, #lv-settings-menu-contents li li:hover{ background-color: #ddd; } #lv-settings-menu-contents li.selected .check { visibility: visible; } /* Dont display the settigns menu for shared & starred items */ #lv-settings-menu.brand-menu { display: none; } #lv-settings-menu.allitems-menu .allitems-switch, #lv-settings-menu.folder-menu .folder-switch, #lv-settings-menu.single-feed-menu .single-feed-switch, #lv-settings-menu.single-feed-menu .single-feed-switch li, #lv-settings-menu-contents.allitems-menu .allitems-switch, #lv-settings-menu-contents.folder-menu .folder-switch, #lv-settings-menu-contents.single-feed-menu .single-feed-switch, #lv-settings-menu-contents.single-feed-menu .single-feed-switch li { display: block; } .state-stream-menu { display: none; } #lv-settings-menu-contents #stream-folder-chooser { cursor: default; padding: 0.3em 0 0.2em 0; } #lv-settings-menu-contents #stream-folder-chooser .button-body { color: #666; padding: 0 0.2em 0 0.6em; } #lv-settings-menu-contents #stream-folder-chooser ul { padding: 0; margin: 0; } #lv-settings-menu-contents #stream-folder-chooser:hover { background-color: #f3f3f3; } #entries #interrupt-oldest-first { background: #fff; padding: 0.5em; } #entries #interrupt-oldest-first .interrupt-oldest-first-box { margin: 0 auto; width: 100%; } #entries #interrupt-oldest-first .interrupt-oldest-first-box td { background-color: #ffc; } #entries #interrupt-oldest-first .link, #entries #interrupt-oldest-first a { margin-left: .6em; } #entries #interrupt-oldest-first-main { width: 96%; margin: 0 auto; padding: 0.3em 0; } #entries #interrupt-broadcast { background: #fff; padding: 1em; } #entries #interrupt-broadcast .interrupt-broadcast-box { margin: 0 auto; width: 100%; } #entries #interrupt-broadcast .interrupt-broadcast-box td { background-color: #E9E9EA; } #entries #interrupt-broadcast-main { width: 96%; margin: 0 auto; padding: 1em 0; } #entries .interrupt-broadcast-header { font-size: 130%; } #entries .broadcast-actions { width: 100%; border-top: 1px solid #ccc; background: #E9E9EA; margin-top: 1em; } body.ie #entries .broadcast-actions { overflow: auto; } #entries .broadcast-action { float: left; padding: 1em 0 0 0; width: 47%; margin-right: 1em; } #entries .broadcast-action-header { font-weight: bold; padding-left: 18px; padding-top: 2px; } #entries .send-broadcast .broadcast-action-header { background: transparent url("icon-itememail.gif") no-repeat; } #entries .make-broadcast-clip .broadcast-action-header { background: transparent url("icon-publish.gif") no-repeat; } #entries .broadcast-action-section { margin-top: 1em; } #entries .interrupt-broadcast-empty { text-align: left; } #entries .broadcast-icon-screenshot-container { background: #fff; width: 189px; height: 46px; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #interrupt-first-scroll, #interrupt-first-scroll .transparency { position: absolute; top: 0; left: 0; height: 2000px; width: 100%; z-index: 1; } #interrupt-first-scroll .transparency { background: #fff; opacity: .75; -moz-opacity: 0.75; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=75); } #interrupt-first-scroll .main { position: absolute; width: 100%; z-index: 2; overflow: auto; } #first-scroll { margin: 5em auto; width: 400px; } #first-scroll td { background-color: #ffcc00; } #first-scroll .c { padding: 1em; } #first-scroll h2 { margin-top: 0; } #first-scroll .dismiss { margin: 2.5em 0 0; font-weight: bold; } #entries, #searchview { overflow: auto; overflow-y: auto; overflow-x: hidden; width: 100%; position: relative; } #entries { padding: 0; height: 300px; z-index: 1; position: relative; zoom: 1; outline: 0; } #entries .entry { position: relative; zoom: 1; } #entries .entry, #entries.list .entry-container { background: #fff; margin: 0; } #entries .entry-body, #entries .entry-title { max-width: 580px; } #entries .entry-body { padding-top: .5em; } #entries .entry-body a img { border: 0; z-index: 1; width: auto; } #entries .entry-main { margin-right: .5em; } #entries .entry-main { margin-left: 20px; } #entries .entry-title { font-size: 140%; margin: 0; } #entries .entry-title a { text-decoration: none; } #entries .entry-title a * { display: inline; } #entries .entry-title a br { display: none; } #entries .entry-title .entry-title-go-to { border: 0; padding-left: 0.25em; vertical-align: top; } #entries .entry-source-title { font-size: 120%; text-decoration: none; } #entries .entry-author, #entries .entry-date { color: #666; text-decoration: none; } #entries .entry .entry-container { position: relative; padding-bottom: 0.5em; } #entries .brand-read .entry-container .entry-title a, #entries .brand-read .entry-container .entry-source-title, #entries .brand-read .entry-container .fld-title, #entries .brand-read .entry-container .fld-entries-formatAuthor, #entries .brand-read .entry-container .entry-body a { color: #6a6ab0; } #entries .read .entry-container .entry-body { color: #222; } #entries #current-entry.read .entry-container .entry-title a, #entries #current-entry.read .entry-container .entry-source-title, #entries #current-entry.read .entry-container .entry-body a { color: #0000cc; } #entries #current-entry.overflow-settable .entry-main { overflow: auto; } body.ie #entries #current-entry .entry-main { overflow: visible; } #entries #current-entry.read .entry-container .entry-body { color: #000; } #entries.list .entry { padding: 0; margin: 0; border-bottom: solid 1px #aaa; overflow: hidden; } #entries.list .entry .collapsed { padding: 1px 0; background: #fff; border: solid 2px #fff; cursor: pointer; -moz-user-select: none; zoom: 1; margin: 0; overflow: hidden; width: auto; position: relative; } #entries.list .collapsed .entry-icons { display: block; margin: 0; padding: 0; width: auto; overflow: visible; position: absolute; top: 1px; left: .2em; } #entries.list .brand-read .collapsed { background: #EEEEEE; border: solid 2px #EEEEEE; } #entries .collapsed .entry-secondary { white-space: nowrap; overflow: hidden; color: #777; margin-right: 1em; } #entries.list .collapsed .entry-secondary { white-space: normal; position: static; float: none; padding: 0; margin: 0 9em 0 15em; width: auto; overflow: hidden; display: block; position: absolute; top: 1px; left: 0; } /* Toggle show new & show all links in list view */ #listview #lv-show-all { text-decoration: none; font-weight: bold; color: #000; } #listview.unreadonly #lv-show-all { text-decoration: underline; font-weight: normal; color: #00c; } #listview.unreadonly #lv-show-new { text-decoration: none; font-weight: bold; color: #000; } /* Toggle show new & show all links in Reader feedlist */ #ol-feedlist #ol-feedlist-show-all { text-decoration: none; font-weight: bold; color: #000; } #ol-feedlist.updatedonly #ol-feedlist-show-all { text-decoration: underline; font-weight: normal; color: #00c; cursor: pointer; } #ol-feedlist.updatedonly #ol-feedlist-show-new { text-decoration: none; font-weight: bold; color: #000; } #ol-feedlist.updatedonly li { display: none; } #ol-feedlist.updatedonly li.unread { display: block; } #ol-feedlist #sub-tree-root { display: block; } #listview.unreadonly .brand-read { display: none; } body.ie #entries.list .collapsed .entry-secondary { padding-right: 25em; } #entries.single-source .collapsed .entry-secondary { margin-left: 2em !important; } #entries .collapsed .entry-title { font-size: 100%; display: inline; margin-right: .5em; color: #000; } #entries.list .collapsed .entry-secondary .entry-title { white-space: inherit; position: static; margin: 0; padding: 0; width: auto; display: inline; } body.ie #entries.list .collapsed .entry-secondary .entry-title { overflow: auto; } #entries .collapsed .entry-original { width: 14px; height: 14px; background-image: url("icon-goto-small"); background-repeat: no-repeat; position: absolute; right: 0.2em; top: 50%; margin-top: -7px; } #entries.list .collapsed .entry-main .entry-original { white-space: normal; display: inline; float: none; margin: 0; padding: 0; width: auto; position: absolute; top: 1px; right: .5em; width: 1.2em; } #entries .collapsed .entry-source-title { color: #555; font-size: 100%; width: 12em; float: left; overflow: hidden; margin-right: 1em; } #entries.single-source .collapsed .entry-source-title { display: none !important; } #entries.list .collapsed .entry-main .entry-source-title { float: none; margin: 0; padding: 0 1em 0 0; overflow: hidden; display: block; width: 11em; white-space: nowrap; position: absolute; top: 1px; left: 1.85em; } #entries .collapsed .entry-main { overflow: hidden; white-space: nowrap; padding-left: 4px; } #entries.list .collapsed .entry-main { display: block; float: none; margin: 0; padding: 0; zoom: 1; margin-right: 5em; } body.ie #entries.list .collapsed .entry-main { overflow: auto; } #entries .collapsed .entry-date { float: right; text-align: right; width: 6.5em; padding-right: 15px; margin-right: 0.2em; } body.ie6 #entries .collapsed .entry-date { margin-right: 1.2em; } #entries.list .collapsed .entry-date { display: block; margin: 0; padding: 0; width: auto; margin-right: 2.3em; } #entries.list .collapsed .entry-secondary .snippet { white-space: inherit; display: inline; position: static; float: none; margin: 0; padding: 0; width: auto; } body.ie #entries.list .collapsed .entry-secondary .snippet { overflow: auto; } #entries.list .collapsed .entry-secondary-snippet { display: inline; } body.ie6 #entries.list .collapsed .entry-secondary-snippet { padding-right: 10em; } #entries.list #current-entry .collapsed { border: solid 2px #B2B2B3; } #entries.list #current-entry.expanded { border-top-width: 0; border-left-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-color: #B2B2B3; border-style: solid; } #entries.list #current-entry.expanded .collapsed { border-width: 2px 0 2px 0; border-bottom-color: #fff; } #entries.list #current-entry.expanded .entry-container { border-width: 0; } #entries.list #current-entry.expanded .entry-actions { border-color: #B2B2B3; } #entries.list .entry .entry-container { padding-top: 0.5em; border-width: 0 2px; border-color: #fff; border-style: solid; } #entries.list .entry .entry-container .entry-date { display: none; } #entries.list .entry .entry-actions { background: #eee; padding: 0.35em 0 0.15em 3px; left: 0; } #entries .entry .card { table-layout: fixed; width: 100%; border-spacing: 0; border-collapse: collapse; border: 0; } #entries .entry .card td { background-color: #fff; background-repeat: no-repeat; border: 0; padding: 0; } #entries .entry .card .ctl, #entries .entry .card .cl, #entries .entry .card .cbl, #entries .entry .card .ctr, #entries .entry .card .cr, #entries .entry .card .cbr, #entries .entry .card .cal, #entries .entry .card .car, #entries .entry .card .caal, #entries .entry .card .caar { width: 15px; } #entries .entry .card .ctl, #entries .entry .card .ct, #entries .entry .card .ctr { height: 13px; } #entries .entry .card .ctl { background-image: url("card-corners.gif"); } #entries .entry .card .ct { background-image: url("card-tb.gif"); background-repeat: repeat-x; } #entries .entry .card .ctr { background-image: url("card-corners.gif"); background-position: top right; } #entries .entry .card .cl { background-image: url("card-lr.gif"); background-repeat: repeat-y; } #entries .entry .card .cr { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-position: top right; } #entries .entry .card .cbl { background-image: url("card-corners.gif"); background-position: bottom left; } #entries .entry .card .cb { background-image: url("card-tb.gif"); background-repeat: repeat-x; background-position: bottom left; padding-bottom: 12px; } #entries .entry .card .cbr { background-image: url("card-corners.gif"); background-position: bottom right; } #entries .entry .card .card-bottomrow { font-size: 0px; line-height: 0px; } #entries .entry .card .cal { background-image: url("card-lr.gif"); background-color: #eee; background-repeat: repeat-y; } #entries .entry .card .car { background-image: url("card-lr.gif"); background-position: -16px 0; background-color: #eee; background-repeat: repeat-y; } #entries .entry .card .ca { background-color: #eee } #entries .action-area { background-color: #AAAAAC; padding: 4px 4px; } #entries .entry .card .caal { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-color: #AAAAAC; } #entries .entry .card .caar { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-position: top right; background-color: #AAAAAC; } #entries .entry .card .caa { background-color: #AAAAAC } #entries .entry .card .blue-action-area .cbl { background-image: url("card-corners-blue.gif"); background-position: bottom left; } #entries .entry .card .blue-action-area .cb { background-image: url("card-tb-blue.gif"); background-repeat: repeat-x; background-position: bottom left; } #entries .entry .card .blue-action-area .cbr { background-image: url("card-corners-blue.gif"); background-position: bottom right; } #entries .brand-read .card .ctl { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .ct { background-image: url("card-tb-read.gif"); } #entries .brand-read .card .ctr { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cl { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .cr { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .cbl { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cb { background-image: url("card-tb-read.gif"); } #entries .brand-read .card .cbr { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cal { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .blue-action-area .cbl { background-image: url("card-corners-read-blue.gif"); } #entries .brand-read .card .blue-action-area .cb { background-image: url("card-tb-read-blue.gif"); } #entries .brand-read .card .blue-action-area .cbr { background-image: url("card-corners-read-blue.gif"); } #entries .brand-read .card .car { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .caal { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .caar { background-image: url("card-lr-read.gif"); } #entries #current-entry .card .ctl { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .ct { background-image: url("card-tb-current.gif"); } #entries #current-entry .card .ctr { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .cl { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .caal { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .cr { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .caar { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .cbl { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .cb { background-image: url("card-tb-current.gif"); } #entries #current-entry .card .cbr { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .blue-action-area .cbl { background-image: url("card-corners-current-blue.gif"); } #entries #current-entry .card .blue-action-area .cb { background-image: url("card-tb-current-blue.gif"); } #entries #current-entry .card .blue-action-area .cbr { background-image: url("card-corners-current-blue.gif"); } #entries #current-entry .card .cal { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .car { background-image: url("card-lr-current.gif"); } #entries .entry .card .entry-container .entry-date { float: right; } #entries .entry-actions { padding-top: 0.35em; position: relative; left: -2px; font-size: 90%; } #entries .entry-actions a, #entries .entry-actions .link { text-decoration: none; } #entries .entry-actions .star, #entries .entry-actions .read-state, #entries .entry-actions .broadcast, #entries .entry-actions .email, #entries .entry-actions .tag { background-repeat: no-repeat; background-color: transparent; padding: 1px 8px 1px 16px; background-position: 0 50%; } body.ie6 #entries .entry-actions .star { zoom: 1; } #entries .entry-actions .email { background-image: url("icon-itememail.gif"); } #entries .entry-actions .tag { background-image: url("icon-itemtag.gif"); } #entries .entry-icons { width: 18px; position: absolute; top: 0; left: -2px; } body.ie6 #entries .entry-icons { top: 3px; left: -20px; } #entries .entry-icons .link { margin-bottom: .3em; } #entries .entry-icons .star { width: 15px; height: 15px; } /* * Dynamic switch of star active / inactive in item view */ #entries .item-star { background: transparent url("icon-star-inactive.png") no-repeat; } body.ie6 #entries .item-star { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-inactive.png"); } #entries .brand-starred .item-star { background: transparent url("icon-star-active.png") no-repeat; } body.ie6 #entries .brand-starred .item-star { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-active.png"); } /* link text switching */ #entries .item-add-star { display: inline; } #entries .item-remove-star { display: none; } #entries .brand-starred .item-add-star { display: none; } #entries .brand-starred .item-remove-star { display: inline; } /* * Dynamic switch of share / unshare in item view */ #entries .item-share { background: transparent url("icon-share-inactive.png") no-repeat; } body.ie6 #entries .item-share { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-inactive.png"); } #entries .brand-shared .item-share { background: transparent url("icon-share-active.png") no-repeat; } body.ie6 #entries .brand-shared .item-shared { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-active.png"); } /* * Dynamic switch of read / unread in item view */ #entries .item-read { background: transparent url("icon-itemunread.gif") no-repeat; } body.ie6 #entries .item-read { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-itemunread.gif"); } #entries .brand-read .item-read { background: transparent url("icon-itemread.gif") no-repeat; } body.ie6 #entries .brand-read .item-read { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-itemread.gif"); } #entries .collapsed .fld-entries-title { font-weight: bold; } #entries .brand-read .collapsed .fld-entries-title { font-weight: normal; } /* link text switching */ #entries .item-add-share { display: inline; } #entries .item-remove-share { display: none; } #entries .brand-shared .item-add-share { display: none; } #entries .brand-shared .item-remove-share { display: inline; } .email-this-buttons { overflow: auto; padding-top: 4px; } #entries .entry .card .email-this-area td { background-color: #AAAAAC; } .email-this-send { margin-right: 0.3em; } .email-this-area .email-this-comment { width: 100%; margin-right: 4px; } .email-this-area .email-this-ccme { margin-top: 3px; margin-left: 0px; } .email-entry-table .field-name { font-weight: bold; text-align: right; width: 6em; margin-right: 0.3em; vertical-align: middle; } .email-entry-table .email-this-subject, .email-entry-table .email-this-to { width: 100%; } .email-entry-table { margin-top: 4px; width: 100%; table-layout: fixed; } #entries .entry .entry-actions .email-active { background-color: #AAAAAC; -moz-border-radius: 4px 4px 0 0; } #entries.list .entry .entry-actions .email-active { padding-bottom: 2px; padding-top: 2px; } .email-this-area .form-error-message { color: red; font-weight: bold; } .modal-dialog-bg { position: absolute; top: 0px; left: 0px; background-color: #fff; z-index: 2000; font-size: 105%; } .modal-dialog { position: absolute; top: 0px; left: 0px; width: 450px; background-color: #aaf; border: 6px solid #a4c5ff; z-index: 2001; } .modal-dialog-title { position: relative; background-color: #e0edfe; padding: 10px 8px; font-weight: bold; font-size: 145%; cursor: default; } .modal-dialog-content { background-color: #fff; padding: 2px 7px; } .modal-dialog-buttons { background-color: #fff; padding: 4px; text-align: right; } .modal-dialog-buttons button { margin: 5px; } #scour-introduction p { margin: .9em 0; } #scour-introduction h2 { margin: 0; font-size: 125%; } .tags-container-box td { background-color: #FDFA86; font-size: 110%; } .tags-container-box .c { padding: .5em 0; } .tags-container-box .s { background-color: #AAAAAC; } .tags-container-box { z-index: 50; margin: 0; position: absolute; width: 260px; font-size: 85%; clear: both; } .tags-container-box ul { padding-left: 0; margin: 0 0 0 1em; } .tags-container-box li { list-style: none; padding: 0; margin: 0; } .tags-container-box li.author-tags, .tags-container-box li.user-tags { zoom: 1; clear: both; position: relative; } .tags-container-box li label { color: #333; margin-right: 0.5em; } .tags-container-box td.s, .tags-container-box td.c { background-color: #FDFA86; } /* Create a border for the tag edit form */ .tags-container-box tr.top td { border-top: 2px solid #AAAAAC; } .tags-container-box td.left { border-left: 2px solid #AAAAAC; } .tags-container-box td.right { border-right: 2px solid #AAAAAC; } .tags-container-box tr.bottom td { border-bottom: 2px solid #AAAAAC; } #entries ul.user-tags-list { display: inline; padding-left: 0; margin: 0 0 0 .2em; } #entries ul.user-tags-list li { list-style: none; display: inline; padding: 0; margin: 0; } #entries ul.user-tags-list li a:hover { text-decoration: underline; } #entries ul.user-tags-list li a { text-decoration: none; display: inline; color: #444; } .tags-container-box li .tags-edit { display: block; width: 90%; padding: 0; } .tags-container-box li a.tags-edit-link { color: #0000cc; font-weight: bold; text-decoration: underline; } .tags-container-box li .tags-edit-tags { width: 90%; font-size: 100%; display: block; } #entries .tags-edit-contents { overflow: auto; width: 100%; } body.opera #entries .tags-edit-contents { overflow: hidden; } .tags-container-box li .tags-edit-buttons { margin-top: 0.5em; } .tags-container-box .button-container { margin-right: .4em; } .tags-container-box .tags-edit-save { font-weight: bold; } .tags-container-box .help { color: #777; } #chrome { margin-left: 260px; zoom: 1; } #main.noreader #chrome { margin-left: 10px; } #main.noreader #Reader { display: none; } #reader-toggler { float: left; width: 5px; height: 700px; background: url("icon-nav-right.gif"); cursor: pointer; } #viewer-box-table { table-layout: fixed; width: 100%; border-spacing: 0; border-collapse: collapse; border: 0; } #viewer-box { background-color: #AAAAAC; background-image: url("corner-tl.gif"); background-repeat: no-repeat; background-position: top left; padding: 3px 0 0 3px; } #viewer-box-inner { width: 100%; background-color: #fff; zoom: 1; } #viewer-top-links { padding: .25em; background-color: #AAAAAC; } #viewer-top-links #viewer-all-new-links-parent { float: left; margin-top: 0.1em; padding-right: 0.5em; } #viewer-top-links #viewer-all-links, #viewer-top-links.show-all #viewer-new-links { display: none; } #viewer-top-links.show-all #viewer-all-links { display: inline; } #viewer-box.state-stream #viewer-top-links #viewer-all-new-links-parent { display: none; } #viewer-top-links #viewer-all-new-links-parent, #viewer-top-links .button-container { margin-right: 0.4em; } #viewer-top-links .button-container { font-size: 90%; } #viewer-top-links .button-container-tight { margin-top: -1px; } #chrome-footer-container { background-color: #AAAAAC; position: relative; padding: 5px; overflow: hidden; zoom: 1; } #chrome-footer-container .button-container { margin-right: 1em; } #entries-up .button-body, #entries-down .button-body { padding-left: 12px; background-repeat: no-repeat; background-position: center left; } #entries-up .button-body { background-image: url("button-up-arrow.gif"); } #entries-down .button-body { background-image: url("button-down-arrow.gif"); } #lv-status { position: absolute; top: 8px; right: .5em; width: 300px; text-align: right; color: #555; } #lv-status.loading { color: #777; } #entries #scroll-filler { position: relative; width: 100%; padding-bottom: 1em; text-align: center; } #entries .scroll-filler-message { position: absolute; color: #999; font-size: 110%; top: 50%; margin-top: -0.5em; width: 100%; } body.ie #entries #scroll-filler, body.ie #entries .scroll-filler-message { width: auto; } #entries.single-source .entry-source-title-parent, #entries.single-source .entry-source-title { display: none; } #no-entries-msg { padding: 1.5em 2em 3em; text-align: center; background: #fff; border: 2px solid #ccc; -moz-border-radius: 5px; -webkit-border-radius: 5px; margin: 1em; } #no-entries-msg .link { font-size: 110%; } #image-preloader { position: absolute; top: -9000px; left: -500px; width: 300px; height: 300px; } .updated-text { color: #666; } div.audio-player-container { text-align: center; padding: 1em 0; } div.view-enclosure-parent { padding-top: .5em; } div.audio-player-container a, div.audio-player-container a:visited { font-style: normal; color: green; } .entry-body .google-video div, #viewer .google-video div { float: none !important; margin: 0 !important; width: auto !important; width: height !important; padding-top: 0 !important; } #nav { float: left; width: 240px; margin: 0 10px; } #nav .add { font-weight: bold; margin: .7em 0; text-align: center; } #nav-toggler { position: relative; float: left; width: 6px; border: 0; border-right: 1px dotted #fff; cursor: pointer; background: #fff url("icon-nav-left.gif") no-repeat center center; margin: 1em 3px 0 1px; } #nav-toggler.hover { background-color: #f3f3f3; } body.hide-nav #nav-toggler { margin: 0 0 0 5px; background-image: url("icon-nav-right.gif"); } body.hide-nav #nav { display: none; } body.hide-nav #chrome { margin-left: 15px; } body.hide-nav #entries .entry-body { max-width: 100% !important; } #chrome-footer-box { padding-bottom: 10px; } #chrome-footer-box p { margin: 0.25em 0 0 0; } #debug-footer #debug-main p { margin: 0 1em 0 0; } #debug-footer #debug-main { white-space: nowrap; overflow: hidden; font-size: 80%; } #subscribe-area { margin: 0; } #chrome-subscribe { background: none; margin: 0; -moz-border-radius: 0; -webkit-border-radius: 0; } #chrome-subscribe-edit div.chrome-subscribe-container { padding: 0.5em; background: none; } #chrome-subscribe-edit label { color: #555; } #chrome-unsubscribe, #chrome-subscribe { margin-top: 0em; margin-bottom: 0; } div.keyboard-help-banner { top: 20%; left: 10%; width: 80%; } body.ie6 div.keyboard-help-banner { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.2)); } #keyboard-help-container { display: none; } #keyboard-help { width: 100%; } #keyboard-help th { color: #dd0; padding-top: 0.5em; } #keyboard-help td.key { text-align: right; font-weight: bold; padding-right: 0.25em; white-space: nowrap; } #keyboard-help td.desc { text-align: left; font-weight: normal; } #keyboard-help-tearoff-link-container { text-align: center; font-size: 90%; margin-top: 1em; } #keyboard-help-tearoff-link-container .link { color: #dd0; } /* Additions by CK for feed reader */ #entries.list .entry-container { display: none; } #entries.list #current-entry.expanded .entry-container { display: block; } #recent-activity, #team-messages { display: none; } #templates { display: none; } #folder-choice { border: 1px solid black; background: #666; } .globalnode { display: none; } #trends, #sub-tree-resizer, #browsefeedsview { overflow: scroll; } #sub-tree-resizer { overflow-x: hidden; } #recent-activity { display: block; } html.homeview, body.homeview { overflow: auto; } .tpl-summary .summary-more { display: none; } .summary-with-folder .summary-more { display: block; } .recent { display: none; } .email-this-area .email-this-comment, .email-area .email-comment { width: 100%; margin-right: 4px; } #hover-send-email { display: none; } yocto-reader/themes/default/button-left-selected.gif0000644000004100000000000000172510735421014022361 0ustar www-datarootGIF89a T뼿ȃnj߻ș}~DŽׂև񵸹ďꄇ腇酈!T, TT)AHT/<:D;E&81> % O6GFGQºQ˾MNSSOOދo`c% uSkO B 12ϚD5:Y1I}2b˕*_ǒfL$³=}΄3ΠR*:(ҟG.ũԩTz+ϩD KUQI&5[TIK8B6%jFiZjpܼy U\-{yE$(3Wd8ђKS3֨O=[tmҦ7ԹN|5ν DmsFG:=(ם\gwߥX0WZYY 83*IAOB/  ZG-9'P," X4VJ!7%D2.6;K);yocto-reader/themes/default/icon-check.gif0000644000004100000000000000016310735421017020331 0ustar www-datarootGIF89a ґqqq000² QQQ! ,  0I3a^a xI_;yocto-reader/themes/default/icon-feed.png0000644000004100000000000000127610735421017020204 0ustar www-datarootPNG  IHDR Vu\gAMA7tEXtSoftwareAdobe ImageReadyqe<PIDATxb_v?@긽 3ܛȦTP5 '2X3c:^JrXw2020=JgMfak? d~bÿbϯ`b2O3}pۏ L201c`8 4@@v fe` &Ff@u30f`(P!$l6fw@L 13>b``@23^&P Pbn9  yu9} 20ec ?~ÛuF)m@dD,?9(M X2 30|Ff]`pM$31a Ư0?`~g ;/ lA#8i\%,##[AA>z`ʙgr~ `å{_lIENDB`yocto-reader/themes/default/button-left-hover.gif0000644000004100000000000000102310735421014021703 0ustar www-datarootGIF89a ٟٸں!, MRfrG@B'"g@/(&riI2g9]V'VjM].z핶okk>gygxef~|nucppwr[|&bvĹyªüv&dМˠP_A PbD Hq",+v2B@#K/1d8cK8G,RO!384eQ|(f) J鴩L:JӣQgr5*Vh:,6XlP&5A_|5aa61764\ ÃS8!!;yocto-reader/themes/default/button-right-selected.gif0000644000004100000000000000524110735421014022541 0ustar www-datarootGIF89aU򆉊켿ͅ녇僅ȰԌŧ}߸ޚǵ¿聃!U,#9:UU P&D/U L;FACBM*\ȰÇ#J4hȱǏ CIɓ(S\ɲ˗0cʜ4sɳϟ@ ])!H*]ʴSE>JիXwFׯ`ÊKٳhӪ]˶۷pʝK.ǭu˷߿ {È+^̸KLˀ!O̹ϠCMӨS^ͺװc˞M[3۸sͻeNȓ+O>|УK9سkn:Ë;ӫn~n/Ͽs(H&h 6` >(EHgav݆(bt hŕ,QT-(#q*hh9#B"F&)ba(餐L>)%QNiU^%Yne]~)&aie&ifm)'~qig|uީzyg~:6J)9 J$ZI駷y ꨰJꩫ j꫱ J뭨Ɋ+j lz@g"쳜 TTkfv+k覫뮴Ժ+k,l' 70?,Wl_wq,$o&,r0,/l8/\s<쳽;,DtH'J74L?-*GMXslu\w^-`m@whjt[vx}zM7~66'574GtJnؐ_yΙo̝.ʡn:ɥzǩŭ.ñnµ߮;Ɣ{ʹ.<Ľo|/񏀤!IBҎ<"/&$IZ򒘴a%3Nrr ( Q~,%*WJ8_)ZҊ.wIIT 0K`}3@Ёt=BhB ,l(D'GR,C1QWj ]ECJR~(HSR,0%f~ј/Nӝ4'P:S tHaO.PuSJNQ*Vխ&Z0W*bQHZֶp\J׺xͫ^׾ `͊VMb:%,d'KZͬf%z hњMj/[պldk+oK׶=r&ЍtZصkurw x -/z^تh+ײ~K]k] w_>l~u0!, p}1xWV(0M%8gl_S`8αw@L"HN&;PIKXβ.{`F2) 2hN6pL:xγ>LBЈNF9 'MJ[Ҙδ7N{ӠGMRԨNWMid ҬgMZָεEMbNf;ЎMj[ l{MrVFpvMzη~N(Bp;'N[|1\Ђ( GN(OW0gN8W@z! ЇNHOҗ;PԧN[XϺP# 3BNhOpNxϻ 8(;yocto-reader/themes/default/card-corners-read-blue.gif0000644000004100000000000000250210735421015022543 0ustar www-datarootGIF89a>!,>vsrslsurlq u qrv  up sl nunp"m(u(m"sn,u,ns $QQaBa@TPࠀMA:T -6 \@A 0Tl6 $a!&ՙth (0i좜,`pÁ:.AF .PD 'P@i'%.48g$ ^؀sҜ8"ĨE.( †8HL˓MŁӆCNt7p 3hѨOV5lٚk=nҼ[vḍNo'}(hdC$( VeXZ8"1fa@>%6 %eR9&S4 p P&ŕy21?pPQ @!Q .1D(UB:\ /vڧ/)Xk=r!( &@ʚBIqFUX(G$B RhBBP@u TX0!]F:@ a 7ApBqbnĀOD)ԑB_ 8FJ†p+C 3P3+І8px A #P #IAQ D@*qA _ 0p0Ap@<( B i89tr. !H8<Ը؋GNV;yocto-reader/themes/default/screenshot-share.gif0000644000004100000000000000364010735421022021602 0ustar www-datarootGIF89a)죦٫=wyͥiȖ[VTMWXji䳳!,)ughlp,tm(p8Y =rl:W# ZXh f0t贺E6{xA JYA}x0)y$9 $;; ػԻע˥ ئIM\]ѠSXmWr;hBVRJmaPHMp zCB `Waఄ`]Uha(p>f8&sQA Z]ѶAXA$@@X3 8=Î<~1Nu^dpN8 <`VPnYFwplB7ϵ( (1j0$txy@h(,ލ(@ P!yMgizM> p7FШfi`*}` @jF@ `{bIc-zbVyMKd@ $ЀbcY'8*ky)U{(wУuA: e~1b`gPpX:ؾhK,F) `c  {5^aEVdL@}(q3ʄyml9 @[C P4hǬaG m4dml%cNNJ"mLch)587oz@  g@ 8GDRNx_pp4p{}-o=0@@=jA ,lꕯѸE4-ޟD^AOS{@=$ ˮC;u$JE'eꊇ4 7jki & r۷<NP!'!O1 9'9Q܆!g+A.Yt7^& /tԪU "WBXMU r`ڠC  @[~t<a9 W"Bd?Ln1<$7J꣛!0OY4»8 /x3cp9 ]=BH8IQGhDK L_x` MP;8 6 NlXx#21cҲ€QW"(eK BA@MʔR!CCi~9^PIt X'(嘇BB,S (^tD&tH3:L - ;n9 8@IњJQ1$>{$i)@}9"σl.70D@.O6a8i0hb)H54ZPTJժZXͪVծZpfx l@kZֶp\J׺xk]6d@;]jCMb:d4OYz hGKҚ me<*lgKͭnwm݌bv+Kr:ЍtKZ7(. z xKMoxO;yocto-reader/themes/default/card-lr.gif0000644000004100000000000000026210735421016017651 0ustar www-datarootGIF89a ! ,_F +G!Qqk9UWt;'.Kق!ofl!? UsڔS%2@.lIyl|K %kzΏlrn1;yocto-reader/themes/default/icon-shared.png0000644000004100000000000000064310735421021020537 0ustar www-datarootPNG  IHDRagAMAOX2tEXtSoftwareAdobe ImageReadyqe<5IDATxb?% (c]bK;;k81I Ý8 \q)A;@ Xphnb  x)f@`qv)T [ u>46@ @3`-Hc0 cPf3L ^u &B6 J@ $ͩ@l̉jk3 4Ob@1a-Pzi`@.(HbPa~sL@1R`:8YH_IENDB`yocto-reader/themes/default/icon-itememail.gif0000644000004100000000000000110110735421020021205 0ustar www-datarootGIF89aSys{xs꼽tn|؀zyslqkՅݿrlҺys{zttnztkeunzrksl!S,S4QO=:;E'D M 5"7# L 9K32$0?!6@.BJ A) &-1C+ P  ( *P RPPRG/8:- T P"lZ'£0ALTCLB.$l&QNM”qNX W4<ϝ:pH`8\ '$@Wm /2@#)D:oAS 80Xj#7MS4NJ0  0L 9T  mguFH!H?2@HT?lGx !là9!A9E38P', 28*,(8A9 EFLli*o~a@֍0@4!~ hDJTm[P;hݮxPrr1`,wzpSS@5IxqRA&^@ "TJ*}XMZ>B@g&p 9T ! ~,$%:<:(ATH!j{xA#:N #4|#N@9ю4,4Sh E c"7i1r Gq$'W 7<2x"RҒ7!d&^ 0Ib~d`pٲ.^*yj&2##MGDS|qyiZʢNF}tf)O)]:@;IFƳd.͉ςJL KK3ԥ* JQPAu 4[FH;eb(4XωI FB@C Ӟ@3mx)RiOaϠrӑGY R.uծz`]ExSG(AVTy`(=+DuZNC@ frTen Y`WJ4GD@i^$j3-&ы pPR=bAAKg"`m[,5UtlZj aqHF2QTaY{7$aCE1Pn!kctJ]bz$8U r`dpַ搄ښgo `bK_fUY)$z9L:Y_*p/pQ $;w$Gjx(86׹υntM E\v8 mj/ ,7M'y[ol[2Vb'b;p t :#*6ۺ 2@@Bkh@"bi(BP>|@I !0\|vRF@xYNC` Z00(+]6h7`tB'@*C@JRRrY VArq9MPDҕ0hiBӻMz^>i lԼ҇G`'N[8 HIIL<ݹ@$̀=y{#8yA0$@[CB7 !Ȧy!LXϺַ(Ec8cC@Ġ0Nxϻc Ġ4QAltOU 0r'8~&T7yQYALқB9Aā sz>"w>06A;yocto-reader/themes/default/icon-goto-small.gif0000644000004100000000000000113610735421020021325 0ustar www-datarootGIF89aSSSVVVKKKIII>>>EEEcccOOONNNPPP@@@444MMM\\\```uuuԮttt򕕕"""]]]111XXX000333,,,|||ZZZܘ{{{θRRR!!!CCCBBBqqq$$$UUU;;;㚚ڞ}}}222!,baS ]a` L`_` #.N>* 5!`_a1 %b^Ta@\Hb'$Db)?BJ\+ Z:C0 ^";b82 E+1 ;yocto-reader/themes/default/icon-addfeed.gif0000644000004100000000000000114210735421017020626 0ustar www-datarootGIF89aڸΝΝӬ~ܴ|{vlu 5ČŎR4{jI@|m{elѠR@ϟ̝լ۸Ǔ!KXXlڵ6}kݻjְ߽ڛ%#"ΟRlܼGD͸|%IУ s~v!,'h ~%dZ5@3T*^Upt cu\ jq#FKE9z(&" [rsLH1w-y˂ ._PB]NiR7`/e%Kor&LpiNm:]}w7Z{p4XyS 7_]!Hm!$,U@RD,ã\*N#²1P%1GM)cb֤6ҹ<CoF~`E `}" VX OQFPA;yocto-reader/themes/default/addfeed-plus.png0000644000004100000000000000157010735421013020701 0ustar www-datarootPNG  IHDR k=gAMA7tEXtSoftwareAdobe ImageReadyqe< IDATxbL;+ 3002p101^c򛙓3ן3 b3|,ƚk˧- &ueQO}ڳnN0#\$m[\{"ؙ2ep (+ή-w»_Yʘ 33K[d(Ì~0gpWb#x]111~7ҹ_bh@1sW~31d2T2h1 ߁ 00|*$=/& l`Ǐ2F>~f|g.o3o }ee.yy&@11늀@{ݷ wbx o~f;Õw_tx_ɥ,!aÇ_߾}SWW73l?+3(+;+>;0 7###А?ơ̿DY.|6Y!MYFhl `0 P:x4@ϟ?gΜ9; ܜ *2 >`zMy011~ŋͭY܁Q?#Õ+=xpŅ >xϟ->@,PK>8{v9)yy2aaaϯ?ܻw ? 7@u `L{5vIENDB`yocto-reader/themes/default/corner-br.gif0000644000004100000000000000005310735421016020214 0ustar www-datarootGIF89a!, ^;yocto-reader/themes/default/icon-allitems.gif0000644000004100000000000000110110735421017021057 0ustar www-datarootGIF89aGᯰӨ겳༽ڿ᭮į뮯󧨿f^{!G,F8GF"F/0&F GF :AF?BCC) 5*F@E%F FEEF3<(FD4 9F!,#26˾= +>7F1-ٺE'$˵ ]L؇׎#j  B";yocto-reader/themes/default/corner-tl.gif0000644000004100000000000000005310735421017020231 0ustar www-datarootGIF89a!,S;yocto-reader/themes/default/corner-tr.gif0000644000004100000000000000005410735421017020240 0ustar www-datarootGIF89a!,;yocto-reader/themes/default/icon-share-active.png0000644000004100000000000000064310735421021021644 0ustar www-datarootPNG  IHDRagAMAOX2tEXtSoftwareAdobe ImageReadyqe<5IDATxb?% (c]bK;;k81I Ý8 \q)A;@ Xphnb  x)f@`qv)T [ u>46@ @3`-Hc0 cPf3L ^u &B6 J@ $ͩ@l̉jk3 4Ob@1a-Pzi`@.(HbPa~sL@1R`:8YH_IENDB`yocto-reader/themes/default/addfeed-added.gif0000644000004100000000000000106110735421013020733 0ustar www-datarootGIF89a }ⶶ鵵荻rk׷ߙ喬þȚĝ찬q鴳泰U䲴U앹}}^ﳳߋ￿'괳񐐲ꗗMH٪׸!?#큹qɪô竫ݪyŭľ!}, }}GYns7{}cQ<8@x=0S D]^OqKg.`E+d&JvBet}UPz>:ZI1)(V* X$%WRT5om|'6Cy"u\![hw,_Fjf/4#;N 3p l?b} AirLk99hH;yocto-reader/themes/default/logo.png0000644000004100000000000001333710735421022017310 0ustar www-datarootPNG  IHDR7a#$IDATxy\}pLuM"U[M 另"))TJӆU"THE@aK,&vc+ ۱Y [- 9y3;9s4~5Ν;_۶j 9=jGz衫*mӦg],ՋOzӿz/ugAqtt!yUU> acc7޹xxfs=~ǝWvѧV=ik׬)z++Wن +~VڎVs56Ưݺu^O<^}ፕps׮:֫chgu5<'lrȭ0Վ;|+nǾͲ-V;gnV>8U#: W"nr.z>z'i>NZ{O|Y맑%싯Z hq#F6mٓ[48U ϶r܃??nNo/6,ծs/Ii<܇;ףP"%CLs޼y\qեW39xԷ¶wPǾ>z!h5K/[dɒwlrY]B;Bnjj\*M0{B͝;}!<{)G2>?r']@nd.u1b_oP3GSԳ )~ Bcj5QopHd,dX:y|U >Ogv'PO6KHI}pf>/˪h@_7Z5!+4K{  ̡h$}'>NY ؃!VJ3#pΎu̻vP??}✫G9^O !_^|E=Vr`̏ceyr/^!~~3७oHaKWhBP,%vV ߎXXMuL0>C6(HQRg2WOj-U%'95u/y<[ݏz!K aUbm I_gj@';| fjgklӓպU{/>?U3LF5UѥU'MGuVn$ .v;! VmJZض5í(Qg 4L!6&ǏZ{ϗÿ}'pn@wΫYqG]iώھmѿ~}O0uCUCK9"Z@TI01510u}U420#꣏ #M#~ݶޠ9 BLJ)$x.\,۶]} Ϭw÷}{`t"sx[|?[矶Â_Z1\xK)1Ż9ٚyCqX!7+D/RE'#OL>pw^~xŅMc( 8Ҧ5b&B^T%F8+~2,:˗J-"_|YQoxFWSiΪd tO_!Mx4Z:`\ rA&_z#7bak rM) !k|MCLҵp?S6Ԭkoz*EWJl/thǼDJaq%7غ]U}uBPW  rK@TO(zżgίx"&AvFcvwД+4:wn $a9t1PTMR$BÃ6*Od;&a>&{W뚭P90] vI!wnkK֊{3-dpSyQG1 j [+g1Rlvvcɷ~T L`6/EpGj&D͒Vi!qK]:=+|/l5IYp5}+YEXP [,_n !k2&|[u0(+_;~t'HbϺoUzb,fZ2Pk56=BD7 p- ܇?>;]i]Fq+h4fA$0"D؍ 4VBmD8ؿ 90͍a&E+ҫ6_0X %"d[-G(NNW8GE V$m¿joa (Awszjʪf%yaHgEWML#6 ETF7aj:f܄LG1VUA)U"/‚"g K%*VΓ銩usA^wyTaE/~.ڜ9K‹M8ba"%_!4LMb1]-$C CL""4Δ !n[uTz!4׺g}GfWLy %XU}UH-4GFR YZZʌDA]Ew'J_\&-[ "*Qϧ%^n#Q'/ WzbL+i2)b@E׻+SՅX9䫾QoSgt%7v5iD? dhoLd:T*Al,Cx 5dOVٯ_s@v'J k9LO*Z-!B# !! e ζcћA~M[m(1lPxĤ3!XR^.iDJ?|o],^!WiYS3\Y`p$"6$ @MMR>Wa)649t4ߛ5d/$ 5Is> 5~3-*)0Czɧk DB-E ]|z1lfiuΆ20;g g?e1oWƔ<.FR* 2Sr;&4V3 } 7,Jmf?L]Ȥe҂-eu U>ʟ`?LtrHQgo3> >N.NV %OUve\B٩?C#4irx/.em1Şriq} MpY\5Ko+P J_9޲l! f)V5__7%E!O5%IENDB`yocto-reader/themes/default/settings.css0000644000004100000000000005064510735421023020220 0ustar www-datarootins { text-decoration: none; } #markup-templates { display: none; } html, body { margin: 0; font-size: 90%; } html, body, input { font-family: arial, sans-serif; } body { background: #fff url("/reader/ui/3273805013-body-bkg.png") repeat-x 0 0; color: #000; } div, form { margin: 0; } html.settings, body.settings { overflow: auto; } a, a:visited, ul#reading-list li, .link { color: #1010c8; } .link { text-decoration: underline; cursor: pointer; } a:focus { -moz-outline: 0; } a:focus, .unselectable { -moz-user-select: none; -khtml-user-select: none; user-select: none; } a.internal, .link.internal { color: #a00; } input { font-size: 95%; } div.clr { clear: both; } .hidden { display: none; } #loading-area { position: absolute; z-index: 10000; top: 0em; left: 50%; margin-left: -26px; } #loading-area p { background-image: url("/reader/ui/328852282-loading.gif"); background-repeat: no-repeat; background-position: left; display: inline; font-weight: bold; padding: 0px 3px 0px 20px; margin: 0; } #loading-area td.c, #loading-area td.s { background-color: #FAD163; } .rtl { direction: rtl; right: 0px; } #search { position: absolute; top: 1.9em; left: 280px; padding: 0; } #search form { display: inline; } #search-input { width: 230px; } #search .input-help-text { color: #666; font-size: 90%; margin-top: .1em; } #message-area { padding: 0.3em 0.5em; text-align: center; font-weight: bold; width: auto; border-left: 0; border-right: 0; margin: 1.5em auto 0; } #message-area.info-message { background: #ffffd9; border: solid 1px #a7a772; } #message-area.progress-message { background: #b8ff6b; border: solid 1px #8bc151; } #message-area.error-message { background: #fdd; border: solid 1px #900; } #subscribe-area { position: relative; margin: 0em 1.5em 0; } body.ie6 #subscribe-area { border: 1px solid #fff; } #chrome-unsubscribe { color: #333; font-size: 100%; } #chrome-unsubscribe .chrome-unsubscribe-link { font-size: 100%; } #chrome-subscribe { background: #eaeaea; margin: 0; width: auto; font-size: 110%; -moz-border-radius: 8px; -webkit-border-radius: 8px; } #chrome-subscribe .chrome-subscribe-button { background-image: url("/reader/ui/2042982460-add.png"); background-position: 5px center; background-repeat: no-repeat; color: #00c; font-size: 100%; font-weight: bold; padding-left: 25px; padding-right: 5px; margin-right: 7px; width: auto; overflow: visible; } #chrome-subscribe-edit div.chrome-subscribe-container { background: #eaeaea; margin: -8px 0 0 0; padding: 1em; font-size: 100%; z-index: 2; -moz-border-radius: 0 0 8px 8px; -webkit-border-radius: 0 0 8px 8px; } #chrome-subscribe a, #chrome-unsubscribe a { padding-left: .5em; font-size: 85%; zoom: 1; } #chrome-subscribe a.edit span.closed, #chrome-subscribe a span.open { display: none; } #chrome-subscribe a.edit span.open, #chrome-subscribe a span.closed { display: inline; } #chrome-subscribe-edit-title { display: block; width: 100%; } #chrome-subscribe-edit-tags { width: 360px; } #chrome-subscribe-edit label { display: block; width: 100%; color: #666; } #chrome-subscribe-edit label .instructions { font-weight: normal; } #chrome-subscribe-edit-buttons { padding: .7em 0; } #chrome-unsubscribe, #chrome-subscribe { display: block; padding: .3em .3em .3em .4em; margin: -.6em auto .5em; } #settings-frame { width: 100%; border: 0; z-index: 10; position: absolute; top: 5.5em; margin: 0; padding: 0; left: -10000px; } #settings-frame.loaded { left: 0; } .progress-bar-vertical, .progress-bar-horizontal { position: relative; border: 1px solid #949dad; background: white; padding: 1px; overflow: hidden; margin: 2px; } .progress-bar-horizontal { width: 80%; height: 14px; } .progress-bar-vertical { width: 14px; height: 200px; } .progress-bar-thumb { position: relative; background: #a4c5ff; overflow: hidden; width: 100%; height: 100%; } .progress-bar-inner { position: absolute; top: 0; text-align: center; width: 100%; font-size: 90%; font-weight: normal; color: #555; padding: 2px; } .progress-bar { height: .3em; margin: 0 auto; } .progress-bar-label { font-weight: normal; font-size: 90%; margin: 0; } .goog-tooltip { background: infobackground; color: infotext; border: 1px solid infotext; padding: 1px; font: menu; font-size: 9pt; max-width: 40em; z-index: 2002; } .popout { background-repeat: no-repeat; background-color: transparent; padding: 1px 8px 1px 16px; background-position: 0 50%; background-image: url("/reader/ui/2317887107-module-new-window-icon.gif"); text-decoration: none; } body.no-chrome { background: #fff; padding-bottom: 80px; } body.no-chrome #message-area-outer { top: 0; } #body { background: #e5ecf9; color: #ccc; padding: 10em 0; text-align: center; } .offline-status { display: none; } #logo-container { display: block; position: relative; width: 158px; height: 56px; } #logo { position: absolute; cursor: pointer; cursor: hand; padding: 0 0 4px 0; width: 146px; height: 54px; margin-left: 14px; margin-top: 6px; background: url("/reader/ui/3338954865-logo.png") no-repeat 0px 5px; } #logo span { display: none; } #global-info { position: absolute; top: 0; right: 0; margin: 0; padding: 0.3em 1em; } #design-selector-link { color: #cc0000; font-weight: bold; } .round-box { empty-cells: show; } .round-box td { padding: 0; margin: 0; } .round-box .s { font-size: 1px; line-height: 1px; } .round-box td.s, .round-box td.c { background-color: #ccc; } .round-box .tl, .round-box .tr, .round-box .bl, .round-box .br { width: 3px; height: 3px; background-repeat: no-repeat; } .round-box .tl { background-image: url("/reader/ui/225120104-corner_tl.gif"); background-position: top left; } .round-box .tr { background-image: url("/reader/ui/417926813-corner_tr.gif"); background-position: top right; } .round-box .bl { background-image: url("/reader/ui/438374107-corner_bl.gif"); background-position: bottom left; } .round-box .br { background-image: url("/reader/ui/195825403-corner_br.gif"); background-position: bottom right; } .round-box .sq { background-image: none; } .button-container { empty-cells: show; border-spacing: 0; border-collapse: collapse; cursor: pointer; float: left; } .button-container td.btl, .button-container td.btr, .button-container td.bbl, .button-container td.bbr { border: 0; padding: 0 !important; margin: 0; background-repeat: no-repeat; } .button-container td.btl { width: 6px; height: 4px; } .button-container td.btr { height: 4px; background-position: top right; } .button-container td.bbl { width: 6px; background-position: bottom left; } .button-container td.bbr { background-position: bottom right; padding: 0 6px 4px 0 !important; } .button-container-tight td.btl { width: 5px; height: 3px; } .button-container-tight td.btr { height: 3px; } .button-container-tight td.bbl { width: 5px; } .button-container-tight td.bbr { padding: 0 5px 3px 0 !important; } .button-container-menu .button-body-container { padding-right: 18px; position: relative; } .button-container-menu .button-menu-arrow { background: url("/reader/ui/741609184-button-down-arrow.gif") center right no-repeat; position: absolute; right: 0; top: 0; width: 14px; height: 100%; } body.ie6 .button-container-menu { position: relative; } body.ie6 .button-container-menu .button-body-container { position: static; } body.ie6 .button-container-menu .button-menu-arrow { top: 4px; right: 6px; } body.ie6 .button-container-tight .button-menu-arrow { top: 3px; right: 5px; } .button-container .btl, .button-container .bbl { background-image: url("/reader/ui/2687712378-button-left.gif"); } .button-container .btr, .button-container .bbr { background-image: url("/reader/ui/227210396-button-right.gif"); } .button-container:hover .btl, .button-container:hover .bbl { background-image: url("/reader/ui/2505516288-button-left-hover.gif"); } .button-container:hover .btr, .button-container:hover .bbr { background-image: url("/reader/ui/558146896-button-right-hover.gif"); } .button-container:active .btl, .button-container-selected .btl, .button-container-selected:hover .btl, .button-container:active .bbl, .button-container-selected .bbl, .button-container-selected:hover .bbl { background-image: url("/reader/ui/1272308565-button-left-selected.gif"); } .button-container:active .btr, .button-container-selected .btr, .button-container-selected:hover .btr, .button-container:active .bbr, .button-container-selected .bbr, .button-container-selected:hover .bbr { background-image: url("/reader/ui/3259621848-button-right-selected.gif"); } .button-container-disabled { filter: alpha(opacity=50); -moz-opacity: 0.5; opacity: 0.5; cursor: default; } .button-container-disabled .btl, .button-container-disabled:hover .btl, .button-container-disabled .bbl, .button-container-disabled:hover .bbl { background-image: url("/reader/ui/2687712378-button-left.gif"); } .button-container-disabled .btr, .button-container-disabled:hover .btr, .button-container-disabled .bbr, .button-container-disabled:hover .bbr { background-image: url("/reader/ui/227210396-button-right.gif"); } .folder-chooser { width: 142px; overflow: visible; } .folder-chooser .button-container { float: none; margin-right: 0; width: 100%; } .folder-chooser .button-container .button-body { font-size: 95%; } .folder-chooser .contents { position: absolute; list-style-type: none; margin: -1px 0 0 0; padding: 0; width: auto; max-height: 180px; z-index: 1000; border: solid 1px #606060; border-top: solid 1px #bbb; background: #f3f3f3; overflow: auto; overflow-x: hidden; text-align: left; } li.chooser-item { margin: 0; padding: 0.2em 12px 0.2em 18px; cursor: pointer; white-space: nowrap; color: #000; } li.chooser-item:hover { background-color: #ddd; } li.chooser-item-selected { background-image: url("/reader/ui/3935512252-check.gif"); background-position: 0.25em; background-repeat: no-repeat; } #message-area-outer { position: absolute; width: 100%; top: 2.2em; } #message-area-outer table { margin: 0 auto; } #message-area-outer #message-area-inner { font-weight: bold; padding: 0 1em; } #message-area-outer.progress-message td { background-color: #c8fa63; } #message-area-outer.info-message td { background-color: #fad163; } #message-area-outer.error-message td { background-color: #fc4d4d; } .modal-dialog-bg { position: absolute; top: 0px; left: 0px; background-color: #fff; z-index: 2000; font-size: 105%; } .modal-dialog { position: absolute; top: 0px; left: 0px; width: 450px; background-color: #aaf; border: 6px solid #a4c5ff; z-index: 2001; } .modal-dialog-title { position: relative; background-color: #e0edfe; padding: 10px 8px; font-weight: bold; font-size: 145%; cursor: default; } .modal-dialog-content { background-color: #fff; padding: 2px 7px; overflow: auto; } .modal-dialog-buttons { background-color: #fff; padding: 4px; text-align: right; } .modal-dialog-buttons button { margin: 5px; } #scour-introduction p { margin: .9em 0; } #scour-introduction h2 { margin: 0; font-size: 125%; } .email-this-buttons { overflow: auto; padding-top: 4px; } #entries .entry .card .email-this-area td { background-color: #C3D9FF; } .email-this-send { margin-right: 0.3em; } .email-this-area .email-this-comment, .email-area .email-comment { width: 100%; margin-right: 4px; } .email-this-area .email-this-ccme { margin-top: 3px; margin-left: 0px; } .email-entry-table .field-name { font-weight: bold; text-align: right; width: 6em; margin-right: 0.3em; vertical-align: middle; } .email-entry-table .email-this-subject, .email-entry-table .email-this-to, .email-entry-table .email-subject, .email-entry-table .email-to { width: 100%; } .email-entry-table { margin-top: 4px; width: 100%; table-layout: fixed; } #entries .entry .entry-actions .email-active { background-color: #C3D9FF; -moz-border-radius: 4px 4px 0 0; } #entries.list .entry .entry-actions .email-active { padding-bottom: 2px; padding-top: 2px; } .email-this-area .form-error-message, .email-area .form-error-message { color: red; font-weight: bold; } #settings, #footer { margin: 1.7em 1em; } #settings a:focus { outline: none; user-select: none; -moz-outline: none; -moz-user-select: none; -khtml-user-select: none; } #settings .round-box { width: 100%; } #settings .round-box td { background-color: #D4D4D7; } #settings #header { width: 100%; overflow: auto; margin-bottom: .7em; } #settings #header h2 { float: left; display: inline; font-size: 140%; margin: .1em 1.5em 0 .3em; } #settings .close { float: left; font-size: 100%; margin-top: .5em; } #settings .settings-list { margin: 0; padding: 0; width: 100%; } #settings #settings-navigation { overflow: auto; width: 100%; } #settings .setting-group h3 { visibility: hidden; height: 1px; overflow: hidden; } #settings #settings-navigation h3 { padding: .3em .6em; margin: 0; display: block; font-size: 100%; line-height: 100%; float: left; } #settings #subscriptions .folder-chooser .button-container .button-body { white-space: nowrap; } #settings #subscriptions .folder-chooser { width: 200px; } #settings #settings-navigation .selected a { color: #000; text-decoration: none; } #settings #settings-navigation .selected { background-color: #FDFA86; margin-right: .2em; } #settings .settings-list .setting-group { list-style-type: none; font-size: 105%; width: auto; } #settings .settings-list .setting-body, #settings .settings-list .setting-body td { background-color: #FDFA86; } #settings .settings-list .setting-body { padding: 1em .5em; } #settings .settings-list .setting-group { display: none; } #settings .settings-list li.setting-group.selected { display: block; } #settings .more-info { color: #555; } #settings .more-info, #settings .more-info a { color: #555; } .settings-data { width: 100%; border-collapse: collapse; } .settings-data td { border-bottom: 1px solid #D4D4D7; padding: .2em 1em 0 0; } .settings-data .title { width: auto; padding-right: .3em; font-weight: bold; } .settings-data .title div { white-space: nowrap; overflow: hidden; min-width: 20em; max-width: 35em; } body.ie6 .settings-data .title div { width: 20em; } .settings-data .share-value { color: #777; } .settings-data .l { color: #777; } .settings-data .feed-url div { overflow: hidden; } .settings-data .chk { width: 14px; padding-right: 5px; } .settings-data-search { margin-bottom: .5em; } .settings-data-actions { margin: 0 0 .5em 0; } .settings-data-actions .select-actions { margin-right: .5em; } .settings-data .share-value { width: 3em; } .settings-data .labels { margin-top: .2em; font-size: 90%; } .settings-data .single-unsubscribe { cursor: pointer; padding: 1px 5px 0; } .settings-data .display-name { font-weight: bold; width: 15em; padding-right: .3em; } .settings-data h2 { margin: 0 0 1em 0; } .hover-form { position: absolute; padding: .3em .6em; background: #D4D4D7; border: 3px solid #D4D4D7; -moz-border-radius: 4px; z-index: 1; } .hover-form label .prompt { font-weight: bold; } .hover-form .text { display: block; margin: .2em 0 .4em; width: 16em; } .hover-form input.button { margin-right: .2em; } .hover-form .comma-prompt { color: #555; margin-bottom: .4em; } #subscriptions td { border: 0; vertical-align: top; padding-top: .4em; } #subscriptions tr.data-row td.chooser, #subscriptions tr.feed-row td { border-bottom: 1px solid #D4D4D7; } #subscriptions tr.feed-row td { padding: 0 0 .2em; color: #777; white-space: wrap; max-width: 40em; } #setting-subscriptions #subscriptions .rename { width: 7em; white-space: nowrap; } .subs-change-label { margin-left: 0.5em; } .subs-change-label .a, .subs-change-label .r { text-indent: 10px; } #setting-subscriptions-add { padding: 0em .2em .7em; border-bottom: 1px solid #D4D4D7; margin-bottom: 1em; } #subs-add-url { width: 230px; } #subscriptions.filtered tr.data-row, #subscriptions.filtered tr.feed-row { display: none; } #subscriptions.filtered tr.filtered-data { display: table-row; } body.ie #subscriptions.filtered tr.filtered-data { display: block; } #setting-subscriptions-bulk-edit { overflow: auto; width: 100%; } #main-bulk-actions { float: left; } #other-bulk-actions { text-align: right; float: right; } .subs-filter-prompt { display: block; font-size: 85%; color: #555; margin-top: .1em; } #setting-subscriptions.add-focus #setting-subscriptions-bulk-edit, #setting-subscriptions.add-focus #subscriptions { display: none; } #setting-subscriptions .subs-remove-add-focus { display: none; } #setting-subscriptions.add-focus .subs-remove-add-focus { display: block; text-align: center; } .labels-change-sharing { margin-left: 0.5em; } #labels .private-text { color: #aaa; } #labels .public-text, #labels .active-icon { display: none; } #labels .is-public .public-text, #labels .is-public .active-icon { display: inline; } #labels .is-public .private-text, #labels .is-public .inactive-icon { display: none; } #labels .share-value { width: 160px; } #labels .public-link { display: none; margin-right: .7em; } #labels .is-public .public-link { display: inline; } #labels .change-sharing { width: 24px; padding: 0; } #labels-static .private-text { color: #aaa; } #labels-static .public-text, #labels-static .active-icon { display: none; } #labels-static .is-public .public-text, #labels-static .is-public .active-icon { display: inline; } #labels-static .is-public .private-text, #labels-static .is-public .inactive-icon { display: none; } #labels-static .share-value { width: 160px; } #labels-static .public-link { display: none; margin-right: .7em; } #labels-static .is-public .public-link { display: inline; } #labels-static .change-sharing { width: 24px; padding: 0; } .settings-data .sharing-icon { cursor: pointer; } .settings-data .single-delete, .settings-data .single-unsubscribe { cursor: pointer; padding: 1px 5px 0; } #goodies table td { border: 0; } #homepage-table { margin-bottom: 1em; } #goodies { width: 500px; } #mobile-link { text-align: center; } .bookmarklet { background-color: #D4D4D7; padding: 5px; -moz-border-radius: 8px; } .next-hint { color: #666; } #setting-goodies-actions { margin-bottom: 1em; } #import-form-target { position: absolute; left: -9000px; width: 50px; } #import-form { margin-top: .7em; } #import-form #import-buttons { margin-top: 0.5em; } #import-form #import-buttons input { margin-right: 0.5em; } #import-form #import-buttons input.default { font-weight: bold; } #import-form #import-cancel { display: none; } .setting-import, .setting-export { padding: 1em; } .setting-import { border-bottom: 1px solid #D4D4D7; } body.ie6 .setting-import { position: relative; zoom: 1; } .setting-export .more-info { margin-left: 2em; } #setting-view-selector { margin-bottom: 1em; width: 400px; padding-top: 0; } #setting-extras .extra-header { font-weight: bold; margin-bottom: 1em; } #setting-extras .extra-start-page-header { display: inline; margin-right: 1em; } #setting-extras .extra { border-bottom: 1px solid #D4D4D7; padding: .6em 0; margin: 0; } #footer { padding: .2em 0; } #footer { text-align: center; } .ac-renderer { border: 1px solid #666; background: #eee; color: #000; z-index: 20000; position: absolute; } .ac-renderer div { padding: 1px 3px; } .ac-renderer .active { background: #bbb; }yocto-reader/themes/default/body-bg.png0000644000004100000000000000104110735421014017661 0ustar www-datarootPNG  IHDR  ?gAMAOX2tEXtSoftwareAdobe ImageReadyqe<PLTE._5'IDATxl1  *("W9uC,IENDB`yocto-reader/themes/default/icon-nav-right.gif0000644000004100000000000000006510735421020021146 0ustar www-datarootGIF89a !,  D`bRl% ;yocto-reader/themes/default/icon-rss.png0000644000004100000000000000116410735421021020077 0ustar www-datarootPNG  IHDR Vu\gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxbYiƱM 32320ӯ^q bXt+B&&F @MBb V&&& Bs@ oa{e/`Ō@M~c &VN6fvF/K~3E*G"f15?1 @nfU߳s ?W1Y=2X  :3d:GzrNdqd ?@5BW?Ze`q`!cg$7D ^~lU~12  @ l__ʖ` *v? l m??33`32zfW:7@1l7}XЁ ?!!?sE> (A1"(03e7OG% IENDB`yocto-reader/themes/default/trends-label-corner.gif0000644000004100000000000000006610735421024022170 0ustar www-datarootGIF89a !,  `@);yocto-reader/themes/default/icon-share-inactive.png0000644000004100000000000000055310735421021022173 0ustar www-datarootGIF89a3ɵ˽ڿ´ȷ!3,pH,q+-BB`dJC(L*0I(>@XSX 30(& D200- C1_31S D .B2 sF311y#/DB$3,DI3"2TJFA;yocto-reader/themes/default/icon-reading-list.gif0000644000004100000000000000110410735421021021625 0ustar www-datarootGIF89aA{}z|xzy{鞟vxz}򞟹!A,A@??5A@;#!@@;*.<@?;;;(7+@<%' <= ̖= /@= : ݍ"1&-)0?3=(}dPaD40`·ŋ}P ;yocto-reader/themes/default/folder-minus.gif0000644000004100000000000000044010735421017020730 0ustar www-datarootGIF89a &||}zz{!&, =@Iyl Ɛ1>aVZՌ&X)GpM"04 0:##&A;yocto-reader/themes/default/button.psd0000644000004100017500000017213510731444172020324 0ustar www-datachandan8BPSK,&8BIM%8BIM$) adobe:docid:photoshop:5180914a-6ae2-11dc-a682-aa57c63c249e 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@8BIM8BIMAK,button,KnullboundsObjcRct1Top longLeftlongBtomlongKRghtlong,slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongKRghtlong,urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM 8BIM  0JFIFHH Adobe_CMAdobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?˼'e8T *knqpOJn}ȝ/~+e}C{闼Ivjɣ%ԻpiH IM~)}AI%&K_?Bo~)}AI$K_?Ro~)}AI%'nSGW(LVbN-?J<˱{ѷ[ !NRv3 Jy1npq o{IȭL:;yAUC`qj?$I"#g$"Ix=#䔉$_?KxR$~g/?IHE=#g%"V1|TF3ԏcD$8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIM"&MM*bj(1r2iHHAdobe Photoshop 7.02007:09:25 02:11:05,K(&HH8BIMmoptdXTargetSettings autoReducebool interlacedbool zonedLossyObjc ZonedInfoemphasizeVectorsbool emphasizeTextboolfloorlong channelIDlongClrTObjc ColorTableClrsVlLsisExactbool noMatteColorboolTrnsbool zonedDitherObjc ZonedInfoemphasizeVectorsbool emphasizeTextboolfloorlong channelIDlongMttCObjc NativeQuadRd longBl longGrn longlossylongwebShiftPercentlong ditherPercentlongd numColorslong fileFormatenum FileFormatGIFditherAlgorithmenumDitherAlgorithmDfsntransparencyDitherAlgorithmenumDitherAlgorithmNonereductionAlgorithmenumReductionAlgorithmSelezonedHistogramWeightObjc ZonedInfoemphasizeVectorsbool emphasizeTextboolfloorlong channelIDlongtransparencyDitherAmountlongdrolloverMasterPaletteboolcolorTableControlObjcColorTableControl shiftEntriesVlLs lockedColorsVlLs8BIM-msetnullVersionlongK,ZZZ8BIMnorm)( Background8BIMluni Background8BIMlnsrbgnd8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpJ) L;n8BIMnorm (Layer 18BIMlfx2@nullScl UntF#Prc@YmasterFXSwitchboolDrShObjcDrSh enabboolMd enumBlnMMltpClr ObjcRGBCRd doubGrn doubBl doubOpctUntF#Prc@>uglgboollaglUntF#Ang@^DstnUntF#Pxl@CkmtUntF#PxlblurUntF#Pxl@NoseUntF#PrcAntAboolTrnSObjcShpCNm TEXT Half RoundCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@=Vrtcdoub@QObjcCrPtHrzndoub@UVrtcdoub@dObjcCrPtHrzndoub@h`Vrtcdoub@nObjcCrPtHrzndoub@oVrtcdoub@o layerConcealsboolFrFXObjcFrFXenabboolStylenumFStlInsFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@YSz UntF#Pxl@Clr ObjcRGBCRd doub@o Grn doub@nBl doub@n8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul M8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 18BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpQۋW~a8DeBF%8BIMnorm( (Layer 28BIMlfx24nullScl UntF#Prc@YmasterFXSwitchboolDrShObjcDrSh enabboolMd enumBlnMMltpClr ObjcRGBCRd doubGrn doubBl doubOpctUntF#Prc@>uglgboollaglUntF#Ang@^DstnUntF#Pxl@CkmtUntF#PxlblurUntF#Pxl@NoseUntF#PrcAntAboolTrnSObjcShpCNm TEXT Half RoundCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@=Vrtcdoub@QObjcCrPtHrzndoub@UVrtcdoub@dObjcCrPtHrzndoub@h`Vrtcdoub@nObjcCrPtHrzndoub@oVrtcdoub@o layerConcealsboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doub@jGrn doub@jBl doub@jFrFXObjcFrFXenabboolStylenumFStlOutFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@YSz UntF#Pxl@Clr ObjcRGBCRd doub@m Grn doub@m?Bl doub@m?IrGlObjcIrGl enabboolMd enumBlnMScrnClr ObjcRGBCRd doub@oGrn doub@oBl doub@gOpctUntF#Prc@RGlwTenumBETESfBLCkmtUntF#PxlblurUntF#Pxl@ShdNUntF#PrcNoseUntF#PrcAntAboolglwSenumIGSrSrcETrnSObjcShpCNm TEXTLinearCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@oVrtcdoub@oInprUntF#Prc@I8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul M8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 28BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp?6zz8BIMnorm( (Layer 68BIMlfx24nullScl UntF#Prc@YmasterFXSwitchboolDrShObjcDrSh enabboolMd enumBlnMMltpClr ObjcRGBCRd doubGrn doubBl doubOpctUntF#Prc@>uglgboollaglUntF#Ang@^DstnUntF#Pxl@CkmtUntF#PxlblurUntF#Pxl@NoseUntF#PrcAntAboolTrnSObjcShpCNm TEXT Half RoundCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@=Vrtcdoub@QObjcCrPtHrzndoub@UVrtcdoub@dObjcCrPtHrzndoub@h`Vrtcdoub@nObjcCrPtHrzndoub@oVrtcdoub@o layerConcealsboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doub@jGrn doub@jBl doub@jFrFXObjcFrFXenabboolStylenumFStlOutFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@YSz UntF#Pxl@Clr ObjcRGBCRd doub@m Grn doub@m?Bl doub@m?IrGlObjcIrGl enabboolMd enumBlnMScrnClr ObjcRGBCRd doub@oGrn doub@oBl doub@gOpctUntF#Prc@RGlwTenumBETESfBLCkmtUntF#PxlblurUntF#Pxl@ShdNUntF#PrcNoseUntF#PrcAntAboolglwSenumIGSrSrcETrnSObjcShpCNm TEXTLinearCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@oVrtcdoub@oInprUntF#Prc@I8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul M8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 68BIMlnsrlayr8BIMlyid 8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp[ϑN?:A8BIMnorm((Layer 48BIMlfx2nullScl UntF#Prc@YmasterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doub@c`Grn doub@c`Bl doub@c`8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 48BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@&?8(*8BIMnorm*(Layer 58BIMlfx2nullScl UntF#Prc@YmasterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doub@bGrn doub@bBl doub@b8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 58BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpB8BIMnorm*|(Layer 38BIMlfx2nullScl UntF#Prc@YmasterFXSwitchboolDrShObjcDrSh enabboolMd enumBlnMMltpClr ObjcRGBCRd doubGrn doubBl doubOpctUntF#Prc@>uglgboollaglUntF#Ang@^DstnUntF#Pxl@CkmtUntF#PxlblurUntF#Pxl@NoseUntF#PrcAntAboolTrnSObjcShpCNm TEXT Half RoundCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@=Vrtcdoub@QObjcCrPtHrzndoub@UVrtcdoub@dObjcCrPtHrzndoub@h`Vrtcdoub@nObjcCrPtHrzndoub@oVrtcdoub@o layerConcealsboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doubGrn doub@fBl doub@j?8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul M8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniLayer 38BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@`nn@W ,*4<@><0..""""  """"..0>>@<5,, 7\ Ƹ\7&Aa̺aA&!5LlŴlL5!AidziA#FsȾˢsF#(AdͬdA( Kx̩xK  CyyC (KwիwK(D}կ}D *gg*  $%I ҊI%$ DEh ܠhED hi ٱih ū®оƾʾͿƾʾϾ ë hi ذih EFi ۠iFE '(L ҋL(' -ii- GֱG+MzծzM+"F||F" "N{Ю|N" *EhϲlF*)Kxɾ˧zN, !EkDzlG$ #6LlȵlL8%&CcϽcC& :^ ɻ^: * * """#"%!!,.."..,!!%"#""" &""(ǹ ۸xkdXQONNN OQXdkxܯW6% %6W ʷrM( (Mr ͨcG8% %8Gcӣr?  ?r սlA Al ϩ_8   8_ ʥuG#   #GuŚkBBkݪm;##;mˊB  Baaҳw@  @wΧ~K(  (K~|I!!I|ߨd+  +dݠXXۙKKؔCCؓBBؓBBؒA%67'AؓA 7or-AؓB QSBؓB Nń;* BؓB 4kUBؓB #/K֐,BؓB Z[ BؓB #fnY2BؓB $LŤ_ BؓB  1> BؓB +Idjig\SJmˊbG& BؓBUÿMBؓB j_BؓBUÿMBؓB +Idjig\SJmˊbG& BؓB  1> BؓB $LŤ_ BؓB #fnY2BؓB Z[ BؓB #/K֐,BؓB 4kUBؓB Nń;* BؓB QSBؓA 7or-AؓA%67'AٔBBٔBBؔCCۙKKݠXXߨd+  +d|I!!I|Χ}J(  (J}ұu??u^^LJ@  @٧j8 8j•g=>g ŠpD#   "Ep ˤ[2 1Y~ зd; 9a ˛l<   :i ȤbH7$ $7Hb ɶpK$ $Kp ܮR1 1RڵvhaVNNNVahvŷ"/1@B<B@@B:<48:664.2===>BBCEDEONIQUCVUTUSNOOJIIFDDA2=B:6:86:7@B@<<:8/-"ܷ̿́ɴԷܭëԭ ÿٱůԱ ȽٵɳԵ Ȼ׶ɴԶ ļ׶ɴԶ ֶɴԶ ǽҶɴԶ ǼҶɴԶ ɺ϶ɴԶ ҽζɴԶ ɸζɴԶ ¹̶ɴԶ ̶ɴԶ ø˶ɴԶϿȶɴԶ̻ɴԶɸɴԶȸ ɴԶȸ ɴԶȸ ɴԶȸıɴԶȸδɴԶȸǼɴԶȸɺɴԶȸ¯ɴԶȸ ѾɴԶȸɴԶȸкɴԶȸ ȶɴԶȸɴԶȸ öɴԶȸѾɴԶȸ$ǵɴԶȸ#ͿɴԶȸ ~zt{̞stzɴԶȸ|vuy}}ٲjep~ɴԶȸ~mpɴԶȸ¦zɴԶȸ߾ɴԶȸɴԶȸѸɴԶȸίɴԶȸ̰ɴԶȸ®ɴԶȸɴԶȸɴԶɸ ɴԶ̻ɴԶϿ ɴԶ ù ɴԶ ɴԶ ¹̶ɴԶ ȹζɴԶ ѽζɴԶ ɺ϶ɴԶ ƻҶɴԶ ƼҶɴԶ նɴԶû׶ɴԶ ƺ׶ɴԶ ǽصɳԵ ¾رůԱ حëԭ ĿطɴԷ ̿́!,.3::8<@:4402444(..6<9>@ACBBEJOBOSBUURTQPPPIIHFBE@5=94442444<@>8;:3-*!   ſӁ ̿́ ρ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁſҁ ſҁ ſҁ ſҁ ſҁſҁſҁſҁ ſҁſҁ ſҁſҁſҁſҁſҁ ſҁ ſҁſҁſҁ ſҁ ſҁ ſҁſҁ#ƽſҁ#Ϳʵſҁ ʶӭſҁ"ò|ſҁӲſҁſҁ®ſҁԹſҁҺſҁͷſҁİſҁªſҁ˵ſҁʹſҁſҁſҁ ſҁſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ſҁ ρ ̿́  ſӁ  "!,+" -*  ?, %җ%Cbsѵ˵sbC0,&&( %&&&&" &&&,,muG_lr?cG8MZ8VNB:98889:BNV8ZM8Gc?rl_Guummu G_lr?cG8PH(  (HP8Gc?rl_Guummu G_lr?hK;A A;Kh?rl_Guummu G_lvBH1'   '1HBvl_Guummu G_p`- -`p_GuummuGdY0  0YdGuummzyKFFKyzmmX^2  2^Xmnq:0  0:qngZ&&Zg`cbc**cbc`cSTQQTScdGN2  2NGddL3  3Lde77e]##]OOE  EBBBBA *+ AA.b89d$AB Mq75tLBB Ql0HtT1#BB :q/K]Q<+NBB /3QZc='U%BB ^f&H[V BB )k$LM[hT-BB &NM]nY\ BB  001nY_< BB )HbhgeZQHlnY_>`F$ BBTHdjig\SJmnY_>bGLBB jjdjig\SJmnY_>b__BBTHdjife[RJmnMBB )Hbhg"IkK BB #! BB#BB'( BB^_UBB/3Q[NBB :q/KSPPBB Ql0H" BB Mq75'BA.b89(AA *+ ABBBBE  EOO]##]e77edL2  2LddGM1  1MGdaRSOOSRa\__`**`__\dW!!WdknS,  ,SnkjkY00ZkjjgtHDBItgjjgpD`R*)O]EpgjjgpD[hY*)WeYEpgjj gpD[dp?G1&   &1G=maYEpgjj gpD[dlGG?IMJNJKJJFGG?AA><<93592.2,231:<:@@@@ŶƁܱŮбȾ٭ëЭ ٳDZг öضɴж ·׶ɴж ʽ׶ɴж ŹѶɴж Ҷɴжжɴж³̶ɴж ιζɴжŸ̶ɴжƽ̶ɴжƺ˶ɴжȶɴжͼɴжʹɴжȸ ɴжȸ ɴжȸ ¼ɴжȸɴжȸ̱ɴжȸĹɴжȸҿǼǹɴжȸȻɴжȸϿлɴжȸѾɾɴжȸϹɴжȸǴɴжȸ ɴжȸ öɴжȸ Ϳ ѾɴжȸͿzֵɴжȸ̾|ɴжȸ |}}}ɴжȸ ~ɴжȸɴжȸƈɴжȸɴжȸɴжȸϫɴжȸɴжȸïɴжȸƾɴжȸɴжȸɴжʹɴжͼ ɴж ɴжƻɴжŽɴжŹ̶ɴж ̺ζɴж´̶ɴжϿжɴж ҶɴжĹѶɴж ɼ׶ɴж ׶ɴж ¶նɴж سDZгǾحëЭʾرŮбŶƁ?@@@:::.00(,,,$&&/41789;::=BG;GKHLJIIGGHH?A@>:=8254,,,*00.788:>>= ܁ ρ ̿́ ýЁ ſҁ ſҁ ſҁ ſҁſҁſҁſҁſҁſҁſҁſҁſҁſҁſҁ ſҁſҁ ſҁ ſҁſҁſҁſҁſҁ ſҁſҁſҁſҁ  ſҁ  ſҁ  ſҁ ͣſҁ̤ſҁ ɵſҁ óſҁ¹ſҁؠſҁӛſҁԛſҁſҁ ª ſҁªſҁԿſҁɴſҁ˽ſҁſҁſҁ ſҁſҁſҁſҁſҁſҁſҁſҁſҁ ſҁ ſҁ ſҁ ýЁ ̿́ρ ܁  ӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌӌ     YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYkYYeeYY     z¿zz½zzzzzzzzzzzzzzzzzzzzzzzzzz½zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzګz㹃zz     z¿zz½zzzzzzzzzzzzzzzzzzzzzzzzzz½zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzګz㹃zz     {ÿ{{þ{{{{{{{{{{{{{{{{{{{{{{{{{{þ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{۫{亄{{    U__cX\p_U\pXUUUmm\zXUURpX\fc_fRXp_U\fXXp_wiXfUfXUp\___fR\RXURUm\mwR_UUpXXfwX\c_       z{~z|z|zz{{zz{}|zz{zz{zzzz{։{zz{zz{}zz{|zz}zzzz~z{րzz}z}}|z|~zzz|zz|zz{zz{zz{~|{zz|{zz{zzމ{zz{z|zzz{zz{~zܳz}͐~z٫~zz~        z{z|z|zz|Ճ{zz{|zz|zz{zzzz|܍zz{Ճ{zz{zz|}zz{}zzzz~z{܀zz}z}}z|~zzz|Łzz{}~}||zz{zz{{zz{}{zz{~{zz{ƒ{zz{zz{z|z{zz{zz{zܳz}՘{z٫~z{z~        {|{}{~{{}҃}{{|}{{}{{|{{|{{}ڎ|{{|҃|{{}|{{}~{{|{{{{{}ځ{{{~{~{{{~ƒ{{|~}{{|{{||{{}~|{{|~}{{||{{|{{|{}{|{{|{{|{ݴ{|Җ|{ڬ{|{ܾɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣɣƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿƿ8BIMPatt"&04..**&&$$"..,***('&&&&&,('&&&&&&&&'(,&&&&'(**((,.&$$&&**.022'""&1,..**&&$$"..,***('&&&&&,('&&&&&&&&'(,&&&&'(**((,.&$$&&**..,3'"",,,2**(&$"" .*,*()'&&&&&&,('&&&&&&&&'(,&&&&&((((((.$"$$&(**2,,-  ߁  ف  ןց ֞Ձ ֛Ձ ֘Ձ֖Ձ֕Ձ֓Ձ֒Ձ֑ՁՁՁՁՁՁ֯ՁՁՁՁՁՁՁՁՁߛՁݛՁۛՁۛՁۛՁۛՁۛՁۛՁۛՁۛՁݛՁߛՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁ֒Ձ֓Ձ֕Ձ֖Ձ ֘Ձ֛Ձ ֞Ձ ןց ف  ߁    ݟ܁ ڟف ٞ؁ٛ؁ ٘؁ٖ؁ٕ؁ٓ؁ْ؁ّ؁؁؁éõ؁õ؁õ؁ٰõ؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁؁ߛ؁éݛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ëݛ؁ߛ؁؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁؁؁ô؁ô؁ò؁ْ؁ٓ؁ٕ؁ٖ؁ ٘؁ٛ؁ ٞ؁ ڟف ݟ܁   ߁ ܟہ ؁ ٝ؁ ٚ؁ٗ؁ٖ؁ٔ؁ٓ؁ّ؁ِ؁؁؁éõ؁õ؁õ؁ٯõ؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁؁ߛ؁éݛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ۛ؁ëݛ؁ߛ؁؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁õ؁؁؁ô؁ô؁ò؁ّ؁ٓ؁ٔ؁ٖ؁ٗ؁ ٚ؁ٝ؁ ؁ ܟہ ߁ yocto-reader/themes/default/addfeeds-more-bg.gif0000644000004100000000000000600010735421014021404 0ustar www-datarootGIF89a,K켾媫칻߳⺼ߨݫ奦콾䞞백⧨굷޷ᳵᘘۖ!,,K! HA.:B#@D#JHŋ}ȱǏ CIɈ=⦃0cʔģ8sɳϟ@ JѣH*]PtaիXjʵP/58׳hӪ](cv1۶ݻx%.T=A@)^̸ǐ#KL˘3k̹cMDQAO~cAEeTH@Dsͻ޶Mȓ+_μsT" 2䑺:3P$!0԰˟O Ͽ(0"(Rv;ACwtNЂN 4b(,xb.(4h8&&!8aE 0 @"S AP00ȗ`)dYfhvilp)tf[2E `;6j:=B4^Fb饘f馜v駠*ꨤjꩨ"x! f`NIdNx"A# &6묨@#0"QxaNδB:`0>:- T P"lZ'£0ALTCLB.$l&QNM”qNX W4<ϝ:pH`8\ '$@Wm /2@#)D:oAS 80Xj#7MS4NJ0  0L 9T  mguFH!H?2@HT?lGx !là9!A9E38P', 28*,(8A9 EFLli*o~a@֍0@4!~ hDJTm[P;hݮxPrr1`,wzpSS@5IxqRA&^@ "TJ*}XMZ>B@g&p 9T ! ~,$%:<:(ATH!j{xA#:N #4|#N@9ю4,4Sh E c"7i1r Gq$'W 7<2x"RҒ7!d&^ 0Ib~d`pٲ.^*yj&2##MGDS|qyiZʢNF}tf)O)]:@;IFƳd.͉ςJL KK3ԥ* JQPAu 4[FH;eb(4XωI FB@C Ӟ@3mx)RiOaϠrӑGY R.uծz`]ExSG(AVTy`(=+DuZNC@ frTen Y`WJ4GD@i^$j3-&ы pPR=bAAKg"`m[,5UtlZj aqHF2QTaY{7$aCE1Pn!kctJ]bz$8U r`dpַ搄ښgo `bK_fUY)$z9L:Y_*p/pQ $;w$Gjx(86׹υntM E\v8 mj/ ,7M'y[ol[2Vb'b;p t :#*6ۺ 2@@Bkh@"bi(BP>|@I !0\|vRF@xYNC` Z00(+]6h7`tB'@*C@JRRrY VArq9MPDҕ0hiBӻMz^>i lԼ҇G`'N[8 HIIL<ݹ@$̀=y{#8yA0$@[CB7 !Ȧy!LXϺַ(Ec8cC@Ġ0Nxϻc Ġ4QAltOU 0r'8~&T7yQYALқB9Aā sz>"w>06A;yocto-reader/themes/default/button-up-arrow.gif0000644000004100000000000000041510735421015021411 0ustar www-datarootGIF89a hhhfff|||~~~ϯxxx]]]α!, *@CiBJd*Gs|NfR9`A;yocto-reader/themes/default/card-lr-read.gif0000644000004100000000000000026510735421016020565 0ustar www-datarootGIF89a ! ,b0D @a H}2XSueƤګ &RÛTTt֠awM _#0ʙnOT["kp[ix-sr}tj{F;yocto-reader/themes/default/card-corners-current.gif0000644000004100000000000000224010735421015022364 0ustar www-datarootGIF89a>ܷ̆uuʋppZZyynnnn}}͝љpp||hhzzԻvvyyiillkk{{jjmmiiȷaaxx鵵έӄwwȘ}}؀rr衡徾qqgg߃Իҍ}}nnzz܀ʀ̈́ʘϞ՟!,>~~||}|{{}{('))zz}'(ev}Re\|{' j>B*}"TB>K^''nT]O}\TLZͨwI?ڄ q_Y|(-SlAуܮ,t:g < 4tT <Q91i66 'AB* ѤS{Rag?G;# xRPJJ.=yF Aׯj"D  buWn˞Mi֮n᎕Vڬw݆̗Um6/[c-.b`%elxđϭ|`^);8.gҞ/ز{_vϘ6ЮG7l೓.}߲qOmpˣVޝϳ#?=S}x廯>]~hp~qz XكE_mW!D!XfA +L 5(@#~rBS HWt<0R8xMHP 6 mDH%YDs0i đg!CL BH@5\!5TPA0 1@0!ĐN?t X|p}lzL.g9@$`DF<$ yL=q @ 8+9@ 4  yEB -p +G+p -rJ&I'G ' 2I%`3(p&;yocto-reader/themes/default/icon-star-inactive.png0000644000004100000000000000122010735421021022032 0ustar www-datarootPNG  IHDRagAMAOX2tEXtSoftwareAdobe ImageReadyqe<"IDATxb?6@P M@a5j   &۷op j bڵ    PSSnٳ{=d{L H=H Թ@̭caahgg&--QJJJϟ0;+PiP#dX aaa3 U@$/`733;wvq X@OGm / Rb8+@  `am斺|>}H4,@ b1899eѣS@_  4pUE Ą߿ =| 1̙3=.FI7 v;v?[n}Wp͇ׯ_  Py L@_݁|i +V8 K<) r50>|Ⱦ`r@S&(_}'r +"3 ™j)&IENDB`yocto-reader/themes/default/button-right-hover.gif0000644000004100000000000000411010735421014022066 0ustar www-datarootGIF89aٟٸ٣ں!,%dihlp,tmxlpH,ȤrI;lШtJZجvzxL.t4"$|N|bA"§"ߤeH*\ȰÇ#JHŋ3jQ Ǐ CIɓ(5zLɲ˗0cʌr͛8s9&ϟ@ 'ѣH*]Z(ӧPJEtիX2ׯKKMfӪ]-۷p:t+ݸt;6/߿ L+Ήx-CL"3kf)y[/[MΦSoFd֮c+-v`ڶsŭ7^ѾS-8YƓwEUΣ?.:RֳŮN/|Q F=S/>FOį\H&X `>aN_ևama{~^" f%щbC,j 4h8<@)DiH&1.PF)TViI6\v` bihdp)gmix'u矀zej衈Hh6ꨞ>*餔if)n駠i ꨦꫂ 무)k歺+*찜"#&e6묢Zl*{m mm:nznmnN:o2zooo9pyp ppnzq9q ;q$9r( yr,q0r4/;s8Sr43>rBLt$4J/qNc uOM5V_pZ#u 6bofv66q[x|߀.n'7 Wng?.y砇.褗n韟ꬷ똧nˎzo|7xG/COgws?槯ط+/( _AD:t|'ڍ`"J !A(&L!P.!,(6 q> ("ΐ 4%:wM|m)ZuUU-z1wD1e<5m| 񎨋#;=" =H1#›-E; ˨ÇH"&ӧK@'ܹ ,0B$F* Đ»яᦥ̳辽溹籰!>,@p8<;RH^r((\(2}z R:){^FΑ(NG`dsL<-=B+ ~=6,s >~s5=C#sJ:i!K 1 S> * C)C8BA;yocto-reader/themes/default/icon-itemread.gif0000644000004100000000000000010610735421020021035 0ustar www-datarootGIF89a ̪!, !rkhܩJ뼀`A_r;yocto-reader/themes/default/button-left.gif0000644000004100000000000000106010735421014020563 0ustar www-datarootGIF89a 쵵ƷǸ!, -Vf^4ʃ@]# mfH#(\6)RWi6b^ l:tǬNwⷜk\^sqzpeqjl}uenhwZ~}ky\ÙǽčμɣѾn{W=z4(\!CB !GŃ=bĊCN F 72X5-Edp@ӨS^ͺҮc˞M۸smz q"<ʢ!%@D$DK(ËO|軛_Ͼ˟O>,Y `r4J<Qwafv ($h(ՠGCf`.\I\.LQD H&L6餈,Ѐ@AELY.R@-xp>l#8P"D &`B硈&#PA,PE訤jr.X.i.XJݩ:[D`ZH &2#VkQ(g!L y8PضLj@4-L,.bF@ $BZ@ 7\* \@AxbW!>,.H$r.", D.Xb<%GlKB9 KOP!E,E#%J <..:B.1ju]mjGP!@. '.cbGt,2@) ˥@*d܌Q-Na9. 2-STpuJȣvBz!@, 0 @:!.:; $`س z,;Վハ G@^@,2?}݋_'@` ȸLa u<`0 {8dV5 t:X h9LB&6i"*s7 /#bH,n&" @*ȊeHG1ě?8JF~TAjPt#E2b>Rrk$3 0J(Wi!RqDJite!MK¡[!.E<6#E=)*-Gr}D''nbȂ $1eD$Y(H=/<^it⎝_8KgiF|Sz'Pts: xk''\ k̛D)E)e`bF+ `J$JRVF\F׶ @MhZSQo~\Ԧk:8@l0[.f3pSPoGUb2@ Ls.6dlc * 2e/j6}ݢ_ P #!&1b2SಘMb (/zKZ_o1`q۬j57l!f XSgUTWKRaU-e"xHr**VNâ@XbB9b4]bXr!, >[I8c»E("b詬lp,tmIpH,Ȥrl:ШtJZجv{LyMx,`nxf%;yocto-reader/themes/default/button-down-arrow.gif0000644000004100000000000000041510735421014021733 0ustar www-datarootGIF89a iii^^^yyyـnnn~~~ч뱱www!, *Ch$I0:4d(P(D18b4!m0'";yocto-reader/themes/default/addfeeds-plus.png0000644000004100000000000000157010735421014021065 0ustar www-datarootPNG  IHDR k=gAMA7tEXtSoftwareAdobe ImageReadyqe< IDATxbL;+ 3002p101^c򛙓3ן3 b3|,ƚk˧- &ueQO}ڳnN0#\$m[\{"ؙ2ep (+ή-w»_Yʘ 33K[d(Ì~0gpWb#x]111~7ҹ_bh@1sW~31d2T2h1 ߁ 00|*$=/& l`Ǐ2F>~f|g.o3o }ee.yy&@11늀@{ݷ wbx o~f;Õw_tx_ɥ,!aÇ_߾}SWW73l?+3(+;+>;0 7###А?ơ̿DY.|6Y!MYFhl `0 P:x4@ϟ?gΜ9; ܜ *2 >`zMy011~ŋͭY܁Q?#Õ+=xpŅ >xϟ->@,PK>8{v9)yy2aaaϯ?ܻw ? 7@u `L{5vIENDB`yocto-reader/themes/default/icon-trends.gif0000644000004100000000000000107310735421022020550 0ustar www-datarootGIF89aN}zxx|ww}zz}~Σ{yyw}.u ̲)zЛo}⚝yyy!N,NN0,>.D"#  N1BM& GC)5MMILKJ/=N?M <%NȹN4˂6@;ٷӻF(M !:*NA2N $-EH! $'64A82p;yocto-reader/themes/default/icon-home.gif0000644000004100000000000000204610735421020020200 0ustar www-datarootGIF89awtpxtp@IB:ݺ԰zVºطuJI>7H?;ΧsRKA;ꗖvk4ŻNC9զC?9앑KwVWOHCֿIB!,>p(j,d LPȂ%n=$`iTh!vp1ۥ j蔕282  aQx .3 /8/ 3 yD5 2 r8m 2 wP542 \8 1,eC| .v,8 .C6,43 FS8SG/̸ 4)P)(0C R-^( ܨVc`7`BoJ  X05X FpHJիSp1/acl/f T[~ +glٱnҮmV+W`5W-[~+,a& ٻl E wqຎBWϗ=\2c70]-i˃Evت#6]lͬ'{:䶋>vou oxp}Ows~s|룾:qWpv u5H s _BHaw18 ޙ8\3".U)fV*&c @P#@ < [=@ BhD@nK < ܓ4V)DJ4-A/w ``$AH<΀ / !H@Q)|A T2C!0pA" /G 20 k!|Pp״0CP & &P`0  *$ 4tfpBPAAłˇ9H@^@3@`7b@%d@-1C10T>@h Oc 8x\O\r3\r;yocto-reader/themes/default/icon-star-active.png0000644000004100000000000000076510735421021021520 0ustar www-datarootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% pI*G8Ą[vq)\v2031q. s8^ QlJ~I. @@lhjo5 xóT SMF\bKbb`a<ĿD|bbx $hY g#,! V1?<,q @]@Sw#@,(f0*cD&@p 4@k @$ b@Ň7$q-d)O@E >@l/.~"w/@1~t/  17ԯ@ @Bh8|0RQ6ÝBIENDB`yocto-reader/themes/default/loading.gif0000644000004100000000000001756610735421022017756 0ustar www-datarootGIF89a?BJN2BNb̮֞dntjvz"6z좲"2*:֖ FZΎ.4DBRbn**:⒖&6>Jn‚ ĢޮNZrz~ڲ.$6ƾ"򢺮ƞNVZRjzʂv~~Ҫ:Jʲþޖjz R^Ǝ⦦~¶rffz΂ڪpz*>Nnrz:N" ^jVbҪvʎӮ2B޺&6枞֞~Ɩ.>Rbz&.R^bҊҺ֮ڞ.>ޖҎv΂^j&:"~yҮ¾ڎ*ꚢ^j⸦ڲޱ߶Š֞&6ʲʆŽ..B~־ΤZf ^r֚! NETSCAPE2.0! ,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K]kw͟S╕ᷩ8KsK˓_|Yx N4Wo>tЃ N䁆\kr=$:Kx$Rg&f}zOD^IE :SiIg(5Rںj\ݘx:ӆ}R!O< p:qI$Jt .\p#itHIHዝ|22i0]P$K( CD/:傄`-N㑝DEB@ 'g$XI#p9eC`zeiO rO2Q.)N4N)Qqyf*ܩS ~ʩ4=E"E(V9i$pN;%b̍dFi8sN(MI$ 'km" '&J]/O'v":2+%Dh8Qw2̆S/ R*ZWi'h,k |o0{d̍ج L1e,, W(@ KFO= ԰8.+ qh%&,t!0Er{퓎4>G;B>@;]Xq@3+wQ˷ u_d#,`8| G=-7\6DLy%G4#|8]Ɣ3E3ی:%EJ{[;RM([2׳4lJ5CppqG$RV*ೃs5^C1!LA`OfR0GDCp_ZrTl 8؂FxjP@XE5| 56p ] 2PQj%| AW `>C%tM9p$#iМ%1I$'ZnBRLGlr򕰌,YrT䖸̥.wK\^$ ! ,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K][w͟S♕a8KsK˓_|Yx鍊N4Wo:}~ 0FzS*bf(TN$7861Kth؁~"*M':ZJHN2>. Ea)/ ]]Г'K70N!O4ȅ0NPKRgO,O( 38pxGjHUx;C O/4`-ZHEB@ ''$PI#p9es`zEO rOQ.~N42N)!f*S iTvz4=E"E(SNvh$pN;%bLt6i8sN(;0I$)$<0 'R&z]/O'I$R$0HT7 JDiV)-Oi0H[J(sv&'G6t:K-SRhqE ڌ @)ʰdcAB ,ra<Za<+*Qϼ>Hs(|3ʱ:IF4SrO|~xW^J6" &c?p:pSkeC= -.\.yt@!|۱́eL9S4yl!Sb !Q4A4晻U+Մ"׾ K Ccz[k@6T3.zw0J,hb >;XQ=pP5DASV*@a(O pD4Ti*p"G:hſ8{5"> _.@ kl#@; WdBTp Y C 08TbHGXaAa$:AKaBW`pp#0og!3@,pa(x|E2;#!IINr4L!HN.Lj& (GIJ&Y)*WV",gIZ򖳼H@! ,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K]DO{jKتsBpb8K\$UL4OeJ=y.rEg[2MO(Q2d$@*izY& Nz'ΜN$L % 'B+w> '&d8O'I$)8 mTbmj8ϣ  Dqꜩ)@k.Oi0Ȓ׺J(}& ~oo*tɿ쑍2b&{poǔ!¿Z\т63O^L=XPD(P ̜#,@LX$rƿV0хŠ;Ji>O:  =s,N( u|a܅3"$=]Wc .3N'UpEllC3y.\K@H&2nSl3B[XBHM<8iJ5Ho2$M( =K|[Vr=| ń0QߗJ9Pտ8B40-p*6DulAmY ؃r뫁j E|@B \( Fvlx5@)F( .kg!7 dCPчaq0Б#-€75aHxAu.xA,4 !FD 4ikȌ*! .pFa\@F sIzMd~%+doBb MVVM@ ZdER^ 0}y! ,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K]DO{jKp.O &[15NQ3WoT>L ^*'zēfcM $H|eI7*x~"*ͫopmbsU7o/y=# "CQk <˥t<rɓUJ!Oȅ0NPKR`O,bD+O( 38p !,v2kK7@BO$K( CD/:e*>XH %S"`ОIVY&Nύ Ri@1 9+, !shM2ۄRܳyQ( Tķ)`E-A PLx1}YLh|z0PѾKK. K`[P `ZFp\j@@X%| 56p ] 2PQj%| AW `>C%t 94K*a00 n`~^DƠ'F0g!+ 0pCB8Q b@FUC\ >>s|$#Ő%1$''?IRLGlr򕰌,YrT䖸̥.wK\^$ ! ,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K]W' IطpTP u0YÐ9ԪכyFlo`U=y ^Ψ$SĊ, D$Rg&ff&\p\]4e. Ea)/R\뉧NB.\ye" _I߯WiDm0\Hp@;Ɔ˲]Xq@3 wQ÷ s?d#,`8\w G=[6DLy%rG4Ic|6]Ɣ3E3ی'8%E*[RM([2ϓ4lJ5CppqG$RV*ೃs5p^C1!LANeR0GDCPCoV.`80 ` o*~ZkH85_{byP)jRbL3BoP(Ȇ*f7أ18Pa#Oϒ r" 8> qX4Q1"aYH y@ nA@R6),$`F8.l x* #91IcjĒ<12L!HNG܄&L"ȏ&}l$'IIJ"&7Nz򓛼H@!,? 7*\ȰÇ#JHQiȱǏ CIɓ(S,Q˗0cʜIsI;ɳϟ@ JѣHhFPJJ*TNYʵׯ;7f ٳhyj۷Q:K5NQVFwJ ^*'>b+/,~ɻxQsy4 $t'fm4Wo:9ԪWFZuaS"^}3hDWKn':U9ɪSSwAd( sM|b'" ˤvAӆ@; 4`Xq@3wȷ uSd#,`8p G=\6\6DLy%G4w]Ɣ3E3یw9%E>K>[/RM([2Qԧ4lJ5CppqG$RV*ೃs5^C1!LA0fR0GDCdV.90@-(@Rٯ-kx#a{ N{5^ G(z;W> 8Ž((T@Xi,d\lbjp=<#:16- -€75aHxAu.#4 !FD 4gȌ*! .pFa\@@3{A򧐆f%+l$jBHґb M6NzM RdERV򕰌,]y;yocto-reader/themes/default/card-corners-current-blue.gif0000644000004100000000000000222310735421015023312 0ustar www-datarootGIF89a>jkƭܷuuʂ܋rrppZZyynnmmȼ}}͙ڕ||z}zzԻjlʄݵߦtuyyhjiiaby{~۽{{}~xxwwȄ̃nqܠmpllǾ萑՚jjϷ}}}}ӻЊ泳qqzzɘ⟟䀀!,>~~||}|{{}{4355zz}34lw$}$nlr|{3H }tHvR33qQtY 3}r %tf"bͨX PIڄx^e|48] mO ̰Cܮ7(/&ܠg' 4tN<QC.k66JB3A#€ * S{jag?G;18QRPJJ.=yZׯ  buWn˞Mi֮n᎕Vڬw݆̗Um6/[c-.b`%elxđϭ|`^);8.gҞ/ز{_vϘ6ЮG7l೓.}߲qOmpˣVޝϳ#?=S}x廯~y~q7yw uab.3RIV4BG!ԡ=$=8a #P_#L \hHm ?`*PXGB P?t lD'}L@ 'dP:g9@p @`CY:SO6BC@@}  S48:B }: zP.4Ԁ@`C}aC@C)dt(z0Ȼ.T2 &>"g;yocto-reader/themes/default/button-right.gif0000644000004100000000000000441310735421015020754 0ustar www-datarootGIF89a!񲲲Ǵ뷷丸!!,pH,Ȥrl:ШtJZجv;@B!xL.zn|N~/, !  Ծ H*\ȰÇ#J6@ŋ3jȱǏ)Iɓ(S˗0cH͛8sɳ@ JѣH*]ʴӧ5JJիXj4*ׯ`ÊK,YfӪ]˶[hʝKݰq˷_y L+^'Ɛ#Kx˘V̹g?M:hҨS>kˬ_˞m86۸ͻ7ݾ  |{]CμΣKw|ؓBOiOϾWWO/&_ 6`u` ҵ``5a5_ֶa ua$J5b(.ub,b0a45c8>wc bRrHec\e`O. ihlp)tix|)蠄j衈&}裐F*餔Vjf馜v)~*ꨤjꤡꪬj*무h뮼‰k+knZl6묡>+mfv-~+Kjn+kC&h,: p pp;q{qq o[p$q('{r, r0r4:s8zs/o߯} H@Lw:_#H Zy7Ae !?($< W(0 cHo6̡H"O32P|H%NXn`Hh!pHGxGIH ~ @JO|MBІ:ԠD'JъZF7юztHGJҒ4!=JWҖ4.LgJSt´8ͩNUzӝ@hOJԢ՟C=RTu&P*T*ժZTV*Ӭr`%WJֲZtfMZֵH=6J׺T^϶_Kؽaش.c#K٫®yfznp5gAKڴMjWֺlgKͭnw j 0Mr:%KZͮvz xKMz^`퍯|Kͯ~^LN;'L [0{ GLCXHW0gL8αw@Y HN&;Pq *[Xβ.{`L2hN6 L:xγ>9hMBЈN d 'MJ[Ҙδ7N{Ӡ(GMRԨN# ` \gMZָεp !;yocto-reader/themes/default/card-corners-blue.gif0000644000004100000000000000220310735421015021630 0ustar www-datarootGIF89a>ھϡǺ۪ʷɿȹ­ƷÿǶųô!,>hheegeddgdccg  bbg  ed 7RgM#7 c [Qgd+ Ψ > ڄfb % A@n@pԏPTƞ00tAEhB15DIHC)2(X`'!@P8pӧPJt1 4gz@1c~^ͺUlװnɚEVnን{6mw݂̗_m.۷.[b~-*b_%elcRvXq\ΕNyԫ1{ fϦ&:ƷK>췿; :9l'{s͉,ܷv屳.Nq}zC_/. ## .ac-renderer { border: 1px solid #666; background: #eee; color: #000; z-index: 2; position: absolute; } .ac-renderer div { padding: 1px 3px; } .ac-renderer .active { background: #bbb; } ins { text-decoration: none; } #markup-templates { display: none; } html, body { margin: 0; font-size: 90%; } html, body, input { font-family: arial, sans-serif; } body { background: #fff url("body-bg.png") repeat-x 0 0; color: #000; } div, form { margin: 0; } html.settings, body.settings { overflow: auto; } a, a:visited, ul#reading-list li, .link { color: #1010c8; } .link { text-decoration: underline; cursor: pointer; } a:focus { -moz-outline: 0; } a:focus, .unselectable { -moz-user-select: none; -khtml-user-select: none; user-select: none; } a.internal, .link.internal { color: #a00; } input { font-size: 95%; } div.clr { clear: both; } .hidden { display: none; } #loading-area { position: absolute; background-image: url("loading.gif"); background-repeat: no-repeat; z-index: 10000; padding: 0; top: 14em; width: 176px; height: 63px; left: 50%; margin-left: -88px; } #loading-area p { font-weight: bold; font-size: 130%; padding: 20px 0 0 15px; margin: 0; color: #222; } .rtl { direction: rtl; right: 0px; } #search { position: absolute; top: 30px; left: 180px; padding: 0; } #search form { display: inline; } #search-input { width: 230px; } #search .input-help-text { color: #666; font-size: 90%; margin-top: .1em; } #message-area { padding: 0.3em 0.5em; text-align: center; font-weight: bold; width: auto; border-left: 0; border-right: 0; margin: 1.5em auto 0; } #message-area.info-message { background: #ffffd9; border: solid 1px #a7a772; } #message-area.progress-message { background: #b8ff6b; border: solid 1px #8bc151; } #message-area.error-message { background: #fdd; border: solid 1px #900; } #subscribe-area { position: relative; margin: 0em 1.5em 0; } body.ie6 #subscribe-area { border: 1px solid #fff; } #chrome-unsubscribe { color: #333; font-size: 100%; } #chrome-unsubscribe .chrome-unsubscribe-link { font-size: 100%; } #chrome-subscribe { background: #eaeaea; margin: 0; width: auto; font-size: 110%; -moz-border-radius: 8px; -webkit-border-radius: 8px; } #chrome-subscribe .chrome-subscribe-button { background-image: url("addfeed-plus.png"); background-position: 5px center; background-repeat: no-repeat; color: #00c; font-size: 100%; font-weight: bold; padding-left: 25px; padding-right: 5px; margin-right: 7px; width: auto; overflow: visible; } #chrome-subscribe-edit div.chrome-subscribe-container { background: #eaeaea; margin: -8px 0 0 0; padding: 1em; font-size: 100%; z-index: 2; -moz-border-radius: 0 0 8px 8px; -webkit-border-radius: 0 0 8px 8px; } #chrome-subscribe a, #chrome-unsubscribe a { padding-left: .5em; font-size: 85%; zoom: 1; } #chrome-subscribe a.edit span.closed, #chrome-subscribe a span.open { display: none; } #chrome-subscribe a.edit span.open, #chrome-subscribe a span.closed { display: inline; } #chrome-subscribe-edit-title { display: block; width: 100%; } #chrome-subscribe-edit-tags { width: 360px; } #chrome-subscribe-edit label { display: block; width: 100%; color: #666; } #chrome-subscribe-edit label .instructions { font-weight: normal; } #chrome-subscribe-edit-buttons { padding: .7em 0; } #chrome-unsubscribe, #chrome-subscribe { display: block; padding: .3em .3em .3em .4em; margin: -.6em auto .5em; } #settings-frame { width: 100%; border: 0; z-index: 10; position: absolute; top: 5.5em; margin: 0; padding: 0; left: -10000px; } #settings-frame.loaded { left: 0; } .progress-bar-vertical, .progress-bar-horizontal { position: relative; border: 1px solid #949dad; background: white; padding: 1px; overflow: hidden; margin: 2px; } .progress-bar-horizontal { width: 80%; height: 14px; } .progress-bar-vertical { width: 14px; height: 200px; } .progress-bar-thumb { position: relative; background: #a4c5ff; overflow: hidden; width: 100%; height: 100%; } .progress-bar-inner { position: absolute; top: 0; text-align: center; width: 100%; font-size: 90%; font-weight: normal; color: #555; padding: 2px; } .progress-bar { height: .3em; margin: 0 auto; } .progress-bar-label { font-weight: normal; font-size: 90%; margin: 0; } .goog-tooltip { background: infobackground; color: infotext; border: 1px solid infotext; padding: 1px; font: menu; font-size: 9pt; max-width: 40em; z-index: 2002; } .popout { background-repeat: no-repeat; background-color: transparent; padding: 1px 8px 1px 16px; background-position: 0 50%; background-image: url("reader/ui/2317887107-module-new-window-icon.gif"); text-decoration: none; } .button-container { empty-cells: show; border-spacing: 0; border-collapse: collapse; cursor: pointer; float: left; } .button-container td.btl, .button-container td.btr, .button-container td.bbl, .button-container td.bbr { border: 0; padding: 0 !important; margin: 0; background-repeat: no-repeat; } .button-container td.btl { width: 6px; height: 4px; } .button-container td.btr { height: 4px; background-position: top right; } .button-container td.bbl { width: 6px; background-position: bottom left; } .button-container td.bbr { background-position: bottom right; padding: 0 6px 4px 0 !important; } .button-container-tight td.btl { width: 5px; height: 3px; } .button-container-tight td.btr { height: 3px; } .button-container-tight td.bbl { width: 5px; } .button-container-tight td.bbr { padding: 0 5px 3px 0 !important; } .button-container-menu .button-body-container { padding-right: 18px; position: relative; } .button-container-menu .button-menu-arrow { background: url("button-down-arrow.gif") center right no-repeat; position: absolute; right: 0; top: 0; width: 14px; height: 100%; } body.ie6 .button-container-menu { position: relative; } body.ie6 .button-container-menu .button-body-container { position: static; } body.ie6 .button-container-menu .button-menu-arrow { top: 4px; right: 6px; } body.ie6 .button-container-tight .button-menu-arrow { top: 3px; right: 5px; } .button-container .btl, .button-container .bbl { background-image: url("button-left.gif"); } .button-container .btr, .button-container .bbr { background-image: url("button-right.gif"); } .button-container:hover .btl, .button-container:hover .bbl { background-image: url("button-left-hover.gif"); } .button-container:hover .btr, .button-container:hover .bbr { background-image: url("button-right-hover.gif"); } .button-container:active .btl, .button-container-selected .btl, .button-container-selected:hover .btl, .button-container:active .bbl, .button-container-selected .bbl, .button-container-selected:hover .bbl { background-image: url("button-left-selected.gif"); } .button-container:active .btr, .button-container-selected .btr, .button-container-selected:hover .btr, .button-container:active .bbr, .button-container-selected .bbr, .button-container-selected:hover .bbr { background-image: url("button-right-selected.gif"); } .button-container-disabled { filter: alpha(opacity=50); -moz-opacity: 0.5; opacity: 0.5; cursor: default; } .button-container-disabled .btl, .button-container-disabled:hover .btl, .button-container-disabled .bbl, .button-container-disabled:hover .bbl { background-image: url("button-left.gif"); } .button-container-disabled .btr, .button-container-disabled:hover .btr, .button-container-disabled .bbr, .button-container-disabled:hover .bbr { background-image: url("button-right.gif"); } .round-box { empty-cells: show; } .round-box td { padding: 0; margin: 0; } .round-box .s { font-size: 1px; line-height: 1px; } .round-box td.s, .round-box td.c { background-color: #ccc; } .round-box .tl, .round-box .tr, .round-box .bl, .round-box .br { width: 3px; height: 3px; background-repeat: no-repeat; } .round-box .tl { background-image: url("corner-tl.gif"); background-position: top left; } .round-box .tr { background-image: url("corner-tr.gif"); background-position: top right; } .round-box .bl { background-image: url("corner-bl.gif"); background-position: bottom left; } .round-box .br { background-image: url("corner-br.gif"); background-position: bottom right; } .round-box .sq { background-image: none; } #logo-container { display: block; position: relative; width: 158px; height: 56px; } #logo { position: absolute; cursor: pointer; cursor: hand; padding: 0 0 4px 0; width: 146px; height: 54px; margin-left: 14px; margin-top: 6px; background: url("reader/ui/3338954865-logo.png") no-repeat 0px 5px; } #logo span { display: none; } #global-info { position: absolute; top: 0; right: 0; margin: 0; padding: .7em 1em; } #global-info1 { margin: 0; padding: 0; float: right; } #design-selector-link { color: #cc0000; font-weight: bold; } #selectors-box td, #sub-tree-box td { background-color: #e1ecfe; } #add-box td { background-color: #b5edbc; } #selectors-box ul, #selectors-box li { padding: 0; margin: 0; } #selectors-box li { list-style-type: none; } #selectors-box li { font-weight: normal; font-size: 105%; } #quick-add-subs, #selectors-box li, #add-box #add-subs { padding: 2px 0 2px 18px; display: block; background-repeat: no-repeat; background-position: center left; } #selectors-box li { float: left; clear: left; padding-right: 5px; } #selectors-box #ol-allitems, #selectors-box #star-selector, #selectors-box #broadcast-selector, #selectors-box #trends-selector .brand-selector { font-weight: normal; } body.ie #selectors-box li { white-space: nowrap; } #selectors-box #ol-allitems.unread { font-weight: bold; } #selectors-box .c, #add-box .c { padding: 0 0 0 8px; width: 227px; } #selectors-box, #add-box, #sub-tree-box { margin: 2px 0; } #selectors-box #ol-home { background-image: url("icon-home.gif"); } #selectors-box #ol-allitems { background-image: url("icon-allitems.gif"); } #selectors-box #trends-selector { background-image: url("icon-trends.gif"); } #selectors-box #trends-selector.selected { background-image: url("icon-trends-selected.gif"); } #selectors-box li.selected { background-color: #a4c5ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #selectors-box li.navigated { background-color: #c7f8ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #selectors-box li.selected a, #selectors-box li.selected .link, #add-box #add-directory.selected .link { color: #000; text-decoration: none; cursor: default; } #selectors-box #nav-refresh { float: right; } #quick-add-subs, #add-box #add-subs { background-image: url("addfeeds-plus.png"); } #add-box #add-directory { float: right; padding: 2px 0.5em 2px 0; font-size: 105%; } #add-box #add-directory.selected .link { font-weight: bold; } #quick-add-form { display: block; } #quick-add-target { position: absolute; left: -9000px; width: 50px; } #quick-add-bubble-holder { color: #000; z-index: 50; margin: 2px 0; position: absolute; overflow: auto; } #quick-add-bubble-holder td.s { background-color: #6bc290; } #quick-add-bubble-holder .c { background: #b5edbc; width: 300px; padding: 0 0 1px 8px; } #quickadd { width: 250px; float: left; } #quick-add-close { float: right; margin-right: 5px; vertical-align: top; font-weight: bold; cursor: pointer; } #quick-add-subs, #add-box #add-subs { font-weight: bold; font-size: 105%; background-position: 0 3px; } #add-box #add-subs { float: left; } #quick-add-helptext, #quick-add-instructions { clear: both; color: #555; font-size: 90%; } #quick-add-helptext a { font-weight: bold; } #quick-add-bubble-holder .button-container { margin: 1px 0 0 3px; } #quick-add-success { padding: 0.3em 0.5em; margin: 0.25em 0 0 0; background: #fcd159; border: solid 1px #a7a772; } #quick-add-success-message { padding-top: 0.2em; float: left; } #quick-add-success-title { font-weight: bold; } #quick-add-success-folder-chooser { margin-left: 1em; float: left; } #sub-tree-container { width: 100%; position: relative; zoom: 1; } #sub-tree-box { margin-bottom: 0; padding-bottom: 10px; } #sub-tree { padding: 0 0 0 8px; height: 420px; width: 227px; overflow: auto; overflow-y: auto; overflow-x: hidden; position: relative; } body.ie #sub-tree { width: 215px; } #sub-tree, #sub-tree ul, #sub-tree li { margin: 0; } #sub-tree ul { padding-left: 12px; } #sub-tree li { position: relative; zoom: 1; list-style-type: none; clear: left; } #sub-tree li .link { text-decoration: none; display: block; padding: 2px 5px 1px 4px; position: relative; zoom: 1; white-space: nowrap; overflow: hidden; float: left; } #sub-tree .name { color: #66c; text-decoration: underline; } #sub-tree .icon { vertical-align: bottom; padding-right: 1px; border: 0; } #sub-tree li .cursor { background-color: #c3d9ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #sub-tree li .updated { background-color: #f4ee3c; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #sub-tree li .updated-intermediate { background-color: #ebed9d; } #sub-tree li .selected .name { color: #000; text-decoration: none; } #sub-tree .toggle { position: absolute; left: -18px; top: -1px; width: 22px; height: 18px; cursor: pointer; background-repeat: no-repeat; background-position: 7px [8p]x; } #sub-tree li.expanded .toggle { background-image: url("folder-minus.gif"); } #sub-tree li.collapsed .toggle { background-image: url("folder-plus.gif"); } #sub-tree li.collapsed ul { display: none; } #sub-tree li a .name-unread { color: #00c; font-weight: bold; } /* CK - code for unread status in sub tree [items] */ #Reader li .unread-count { display: none; } #Reader .folder.unread .folder-selector .unread-count { display: inline; } #Reader .folder.unread .folder-selector .name { color: #00c; font-weight: bold; } #Reader .tpl-feed.unread .feed-selector .unread-count { display: inline; } #Reader .tpl-feed.unread .feed-selector .name { color: #00c; font-weight: bold; } #Reader #selectors-box .unread-count { display: none; } #Reader #selectors-box li.unread .unread-count { display: inline; } #Reader #selectors-box li.unread .name { color: #00c; font-weight: bold; } #sub-tree .icon-d-0, #sub-tree .name-d-0, #sub-tree .toggle-d-0, #sub-tree .unread-count-d-0 { display: none; } #sub-tree li .selected { background: #a4c5ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #sub-tree li .navigated { border: 2px solid #a4c5ff; -moz-border-radius: 5px; -webkit-border-radius: 5px; } .sub-tree-header { padding: 0.2em 0.4em; } #sub-tree-refresh { float: right; margin-right: 0.2em; font-size: 90%; } #sub-tree-container #new-subscriptions-header, #sub-tree-container.show-updated #all-subscriptions-header { display: none; } #sub-tree-container.show-updated #new-subscriptions-header { display: block; } #sub-tree-container.show-updated li li { display: none; } #sub-tree-container.show-updated li li.unread, #sub-tree-container.show-updated li li.selected { display: block; } #sub-tree-footer { padding: 0.2em 0.2em 0 0; clear: both; text-align: right; } div.banner { position: fixed; top: 40%; left: 15%; margin: 0; width: 70%; text-align: center; padding: 1em; color: #fff; text-shadow: #000 1px 1px 7px; } body.ie6 div.banner { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.4)); } div.banner-background { background: #000; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; -moz-opacity: 0.8; opacity: 0.8; filter: alpha(opacity=80); z-index: 1001; overflow: auto; } div.banner-background div { visibility: hidden; } div.banner-foreground { z-index: 1002; } div.banner div.primary-message-parent, div.banner div.secondary-message-parent { font-weight: bold; font-family: sans-serif; margin: 0; } div.banner div.primary-message-parent { font-size: 200%; } div.banner div.secondary-message-parent { border-top: solid 1px #999; padding-top: 0.5em; font-size: 150%; } div.banner div.stream-list { text-align: left; line-height: 130%; zoom: 1; } div.banner div.stream-list span { color: #dd0; padding: 0 0.5em 0 0; width: 50%; float: left; text-align: right; } div.banner div.stream-list ul { margin: 0 0 0 50%; padding: 0 0 0 0.5em; } div.banner-background div.stream-list ul li.selected { visibility: visible; background: #666; -moz-border-radius: 7px; -webkit-border-radius: 7px; border-radius: 7px; } body.ie div.banner-foreground div.stream-list ul li.selected { background: #666; } div.banner div.stream-list ul li { list-style-type: none; margin: 0; } div.banner div.stream-list ul li.separator { display: none; } div.banner h6 { text-align: center; margin: 0 0 0.25em 0; } div.banner div.initial-stream-list ul li { float: left; padding: 0 0.25em 0 0.25em; white-space: nowrap; } div.banner div.multiple-matches ul li { padding: 0 0 0 0.25em; } div.banner div.no-matches { color: #f99; } input.keyboard-selector-input { position: fixed; top: 0; left: -300px; } body.ie6 input.keyboard-selector-input { position: absolute; top: expression(eval(document.body.scrollTop)); } div.subscription-keyboard-selector { top: 20%; } body.ie6 div.subscription-keyboard-selector { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.2)); } div.subscription-keyboard-selector div.initial-stream-list span { float: none !important; text-align: left; width: auto; display: inline; } div.subscription-keyboard-selector div.initial-stream-list ul { display: inline; margin: 0; } div.subscription-keyboard-selector div.initial-stream-list ul li { float: none; display: inline; white-space: normal; } div.subscription-keyboard-selector div.initial-stream-list ul li.separator { display: inline; } #directory-box td.c, #directory-box td.s { background-color: #b5edbc; } #directory-box .sq { width: 0; } #directory-box h4 { margin: 0; } #directory-box h4, #import-prompt { padding: 0.25em; font-size: 110%; } #directory-contents { background: #fff; padding: 0.5em; } .directory-header-box td.s, .directory-header-box td.c { background-color: #b5edbc; } .directory-header-box h2 { margin: 0; font-size: 140%; font-weight: bold; padding: .1em .5em; } #directory-box h3 { font-size: 120%; font-weight: bold; margin: 0 0 .6em; } .directory-return-link { padding: 0.5em 0 0 1em; font-weight: bold; display: block; } #import-prompt { float: right; margin: 0; } #import-prompt-box #import-link { font-weight: bold; } #service-quickadd, #directory-search { padding-top: 1em; } #directory-box .directory-section { margin-left: 1em; } #directory-box .directory-section p { margin-bottom: 0.3em; } #directory-box .directory-form-box td { background-color: #e3f8e7; } #directory-box .directory-form-box .c { padding: 0.25em; } #bundles h3, #bundles p { display: inline-block; } body.ie #bundles-list { width: 637px; } .bundle, #show-more-bundles-container { background: #fff url("addfeed-bundle-bg.gif") no-repeat; height: 75px; width: 300px; float: left; margin: .5em; } .bundle-extra { display: none; } .bundle-clearing { clear: left; } .bundle-subscribe { float: none; font-size: 90%; } .bundle-subscribe .button-body-container { padding-left: 18px; background: url("addfeed-plus.png") no-repeat center left; white-space: nowrap; } .bundle-added .bundle-subscribe, .bundle-subscribed { display: none; } .bundle-added .bundle-subscribed { display: block; } .bundle-main { padding-top: 6px; padding-left: 65px; } .bundle-title { width: 231px; } .bundle-title { font-weight: bold; font-size: 130%; padding-bottom: 2px; white-space: nowrap; overflow: hidden; } .bundle-total { font-weight: bold; margin: .2em 0 .1em; padding-right: 8px; } .bundle-includes { text-decoration: underline; display: block; color: #000; padding: 0 0.25em 0.25em 0.25em; float: left; margin-top: 0.25em; } .bundle-includes .bundle-hover { display: none; } .bundle-includes:hover { background: #6bc290; color: #000; text-decoration: none; position: relative; } .bundle-includes:hover .bundle-hover { display: block; position: absolute; z-index: 1; background: #b5edbc; border: solid 2px #6bc290; width: 18em; right: auto; left: 50%; margin-left: -9em; padding: 0.25em; } body.ie6 .bundle-includes:hover .bundle-hover { top: 1.1em; } .bundle-includes:hover .bundle-hover ul { margin: 0; padding: 0 0 0 0.75em; } .bundle-includes:hover .bundle-hover ul li { padding: 0; margin: 0; list-style-type: none; font-weight: bold; } #show-more-bundles-container { background-image: url("addfeeds-more-bg.gif"); } #show-more-bundles-link { padding-top: 27px; padding-right: 75px; height: 48px; width: 225px; display: block; text-align: center; font-size: 130%; font-weight: bold; } #show-more-bundles-return-link { display: none; clear: both; } #directory-box.bundles-only #show-more-bundles-container, #directory-box.bundles-only #service-quickadd, #directory-box.bundles-only #directory-search, #directory-box.bundles-only #import-prompt { display: none; } #directory-box.bundles-only .bundle-clearing { clear: none; } #directory-box.bundles-only #bundles-list { width: auto; } #directory-box.bundles-only .bundle-extra, #directory-box.bundles-only #show-more-bundles-return-link { display: block; } #service-quickadd { clear: both; } #service-quickadd-submit { background-image: url("addfeed-plus.png"); background-position: 5px center; background-repeat: no-repeat; padding-left: 25px; padding-right: 5px; } #directory-search { padding-bottom: 1em; } #directory-category-list { margin: 0; padding: 0; } #directory-category-list li { list-style-type: none; display: inline; padding: 0; margin: 0; } #directory-search-other-categories { padding: 0.5em 0 0 1em; } #directory-search-other-categories #directory-category-list { padding: 0; display: inline; } #directory-search-results ul.results { padding: 0; margin: 1em 0 0 0; } #directory-search-results ul li.result { list-style-type: none; padding: 0; margin: 0 0 1.5em 0; } #directory-search-results ul li h4 { margin: 0; font-weight: bold; font-size: 120%; } #directory-search-results ul li p { margin: 0; color: #666; } #directory-search-results ul li .feed-url { color: #008000; } #directory-search-results ul li .subscribe, #directory-search-results ul li .subscribed { margin-top: 0.2em; height: 17px; } #directory-search-results ul li .subscribed-links, #directory-search-results ul li .folder-chooser { float: left; } #directory-search-results ul li .subscribed-links { padding-top: 0.15em; } #directory-search-results ul li .subscribe { float: none; font-size: 90%; } #directory-search-results ul li .subscribe .button-body-container { padding-left: 18px; background: url("addfeed-plus.png") no-repeat center left; white-space: nowrap; } #directory-search-results ul li .subscribed, #directory-search-results ul li.result-subscribed .subscribe { display: none; } #directory-search-results ul li.result-subscribed .subscribed { display: block; color: #666; } .bundle-added .bundle-subscribed .message, #directory-search-results ul li.result-subscribed .subscribed .message { background: url("addfeed-added.gif") no-repeat; padding: 1px 0 0 15px; font-weight: bold; color: #222; } .bundle-added .bundle-subscribed .bundle-view-link, #directory-search-results ul li.result-subscribed .subscribed .view, #directory-search-results ul li.result-subscribed .subscribed .unsubscribe { color: #77c; text-decoration: underline; } #directory-search-results-paging { text-align: center; font-size: 120%; } #directory-search-results-paging .link { padding: 0 1em 1em 1em; } #directory-box #directory-welcome-title, #directory-box #directory-welcome { display: none; } #directory-box.welcome #directory-title, #directory-box.welcome #bundles, #directory-box.welcome #service-quickadd, #directory-box.welcome #directory-search, #directory-box.welcome #import-prompt { display: none; } #directory-box.welcome #directory-welcome-title, #directory-box.welcome #directory-welcome { display: block; } #directory-box.welcome #directory-welcome { margin: 1em; } #directory-welcome-video-container { margin: 1em; } #directory-welcome-video-container embed { margin: 0 auto 0 auto; display: block; width: 400px; height: 253px; } #directory-welcome-button-container { text-align: center; margin: 1em; } #directory-welcome-button, #directory-welcome-tour-link { font-size: 110%; font-weight: bold; } #message-area-outer { position: absolute; width: 100%; top: 2.2em; } #message-area-outer table { margin: 0 auto; } #message-area-outer #message-area-inner { font-weight: bold; padding: 0 1em; } #message-area-outer.progress-message td { background-color: #c8fa63; } #message-area-outer.info-message td { background-color: #fad163; } #message-area-outer.error-message td { background-color: #fc4d4d; } #scroll-filler-offline-message { display: none; } img.placeholder, .embed-placeholder { background: #d7d7d7; border: solid 1px #666; cursor: pointer; } body, html { overflow: hidden; } body { padding-bottom: 10px; } body.loaded { padding-bottom: 0; } #logo-container { width: 158px; height: 32px; } #logo { padding: 0; width: 133px; height: 28px; background: url("reader/ui/4184999142-logo-scroll.gif") no-repeat 0 0; margin-top: 13px; margin-left: 9px; } #settings-frame { top: 40px; } #main { width: auto; margin: 1.4em 0 0 0; } .folder-chooser { width: 142px; overflow: visible; } .folder-chooser .button-container { float: none; margin-right: 0; width: 100%; } .folder-chooser .button-container .button-body { font-size: 95%; } .folder-chooser .contents { position: absolute; list-style-type: none; margin: -1px 0 0 0; padding: 0; width: 140px; max-height: 180px; z-index: 1000; border: solid 1px #606060; border-top: solid 1px #bbb; background: #f3f3f3; overflow: auto; overflow-x: hidden; text-align: left; } li.chooser-item { margin: 0; padding: 0.2em 12px 0.2em 25px; cursor: pointer; white-space: nowrap; color: #000; } li.chooser-item:hover { background-color: #ddd; } li.chooser-item-selected { background-image: url("icon-check.gif"); background-position: 0.25em; background-repeat: no-repeat; } .tab-header { float: left; margin: 0 0.5em 0 0; cursor: pointer; } .tab-header td.s, .tab-header td.c { background-color: #e1ecfe; } .tab-header .c { color: #00c; padding: 0.25em 0.25em 0 0.25em; } .tab-header-selected { cursor: default; } .tab-header-selected td.s, .tab-header-selected td.c { background-color: #c3d9ff; } .tab-header-selected .c { font-weight: bold; color: #000; } .tab-group-contents { clear: left; background: #c3d9ff; padding: 5px 0 1px 0; } .tab-contents { background: #fff; } .home-header-box .c { font-size: 140%; font-weight: bold; padding: .1em .5em; } .home-header-box td.c, .home-header-box td.s { background-color: #c3d9ff; } .section { vertical-align: top; padding: 0.25em; } #left-section { width: 65%; } #right-section { width: 35%; padding-right: 1em; } .section-header { font-weight: bold; font-size: 120%; margin: .5em 0 1em; } #tips { min-width: 230px; } #tips-body { color: #777; } #tips-box { margin: 1em 0 0 0; } #tips-box td { background-color: #e1ecfe; } #tips-box .c { padding: 0 .5em; } #tips-body img { border: 0; } #tips-body .bookmarklet { background-color: #b4bdcb; padding: 5px; -moz-border-radius: 8px; -webkit-border-radius: 8px; } #tips-body .promo-image-text { margin: 1em 0 0.5em 0; } #tips-body .promo-image-container { text-align: center; margin: 0.5em 0 1em 0; } #tips ul { padding: 0 0 0 1.5em; margin: 0 0 1em 0; } #tips ul li { padding: 0; margin: 0; } #tips ul li.tips-section { padding-top: 0.5em; } #recent-activity { overflow: hidden; } #recent-activity .recent { color: #777; padding-left: 24px; } #recent-activity #recent-activity-star { padding-bottom: 0.5em; } #recent-activity .recent h4 { margin: 0; padding: 2px 0 2px 18px; background-repeat: no-repeat; background-position: center left; margin-left: -24px; font-weight: normal; font-size: 100%; } body.ie6 #recent-activity .recent h4 { zoom: 1; } #recent-activity .recent h4 a { color: #777; } #recent-activity #recent-activity-star h4 { background-image: url("icon-star-active.png"); } body.ie6 #recent-activity #recent-activity-star h4 { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-active.png",sizingMethod='crop'); } #recent-activity #recent-activity-share h4 { background-image: url("icon-share-active.png"); } body.ie6 #recent-activity #recent-activity-share h4 { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-active.png",sizingMethod='crop'); } #recent-activity .recent-stream-title { font-style: italic; } #recent-activity .recent-title { font-weight: bold; color: #555; } #recent-activity .recent-item { padding: 1px 0; } #recent-activity .recent-snippet { font-size: 90%; } #team-messages .title { font-weight: bold; margin: .2em 0; font-size: 135%; } #team-messages .body { color: #444; } #team-messages .section-header { margin-bottom: .2em; font-size: 110%; margin: 1em 0 0.2em 0; } #overview { min-width: 330px; padding: 0; margin-right: 1.5em; } #overview .section-header { margin-bottom: 0.5em; } #overview .overview-segment img { float: right; padding: 0 0 2px 2px; } #overview .overview-header { margin-bottom: 4px; font-weight: bold; } #overview .label { font-size: 95%; margin: .2em 0 1em; color: #333; clear: both; } #overview .title { font-size: 120%; } #overview .fld-entries-title { margin: 0 .6em 0 0; padding-left: 20px; font-weight: bold; color: #555; font-size: 105%; background: #fff url("icon-allitems.gif") no-repeat; } #overview .item-title-rtl { margin: 0 0 0 0.6em; padding-left: 0; padding-right: 20px; background: #fff; } #overview .fld-entries-contentSnippet { color: #777; } #overview .overview-metadata { font-size: 90%; margin-bottom: .3em; } #overview-footer { width: 95%; overflow: auto; clear: both; } #footer { margin-top: 2em; padding: 1em; text-align: center; border-top: solid 1px #ccc; } #trends-header-box { margin-bottom: 0.5em; } #trends-header-box .c { font-size: 140%; font-weight: bold; padding: .1em .5em; } #trends-header-box td.c, #trends-header-box td.s { background-color: #c3d9ff; } #trends-item-count-header { font-size: 175%; color: #333; } #trends .trends-columns { width: 100%; } #trends .trends-columns-fixed { table-layout: fixed; } #trends .trends-columns td { vertical-align: top; } #trends .trends-columns td.left-column, #trends .trends-columns td.right-column { width: 50%; } #trends .trends-columns td.left-column, #trends .trends-columns td.right-column { padding-right: 1em; } #trends h2 { margin: 1em 0 0 0; } #trends .explanation { font-size: 90%; color: #999; padding: 0 0 0.75em; font-weight: normal; } #trends table.sorting { width: 100%; border-collapse: collapse; border-spacing: 0; } #trends table.sorting th { text-align: left; font-weight: bold; border-bottom: solid 1px #c3d9ff; background: #e1ecff; padding: 2px; white-space: nowrap; } #trends table.sorting th.primary { background: #cfe0ff; } #trends table.sorting td { border-top: solid 1px #e8eef7; padding: 2px; } #trends table.sorting tr.first-row td { border-top: 0; } #trends table.sorting td.sorting-sub-primary, #trends table.sorting td.sorting-sub-secondary { text-align: right; white-space: nowrap; } #trends table.sorting td.sorting-sub-primary { width: 4em; background: #f3f7ff; } #trends table.sorting tr.alt td.sorting-sub-primary { background: #eaf2ff; } #trends table.sorting td.sorting-sub-secondary { width: 4em; } #trends table.sorting tr.alt td { background: #f4f8ff; } #trends table.sorting .trends-sorting-homepage { padding-left: 0.25em; vertical-align: middle; border: 0; } #trends table.sorting .sorting-sub-unsubscribe { width: 13px; padding-right: 0.5em; } #trends table.sorting .trends-sorting-unsubscribe { cursor: pointer; padding-left: 0.5em; padding-bottom: 1px; vertical-align: text-bottom; } #trends .sorting-empty { padding: 1em; color: #333; } #trends .sorting-container { position: relative; zoom: 1; } #trends .sorting-container .top-links { border-top: solid 1px #c3d9ff; background: #e1ecff; padding: 2px; text-align: right; } #trends .show-top10 .top10-link, #trends .show-top20 .top20-link, #trends .show-top40 .top40-link { font-weight: bold; text-decoration: none; color: #000; cursor: default; } #trends table.sorting tbody tr { display: none; } #trends .show-top10 table.sorting tr.top10, #trends .show-top20 table.sorting tr.top20, #trends .show-top40 table.sorting tr.top40 { display: table-row; } body.ie #trends .show-top10 table.sorting tr.top10, body.ie #trends .show-top20 table.sorting tr.top20, body.ie #trends .show-top40 table.sorting tr.top40 { display: block; } #trends .bucket-chart-description { padding: 0.5em 0 0 1em; } #trends table.bucket-chart { border-collapse: collapse; border-spacing: 0; } #trends .trends-columns table.bucket-chart td { vertical-align: bottom; text-align: center; font-size: 85%; padding: 0 1px 0 0; } #trends table.bucket-chart .bucket { background: #80c65a; width: 100%; margin: 0 auto; position: relative; } #trends table.bucket-chart .bucket, #trends table.bucket-chart .bucket .bucket-width { font-size: 1px; line-height: 1px; } #trends table.bucket-chart .bucket .bucket-width { height: 1px; } #trends table.bucket-chart .bucket-labels th { padding: 1px 9px 1px 0; text-align: right; background: url("trends-label-corner.gif") no-repeat center right; font-size: 90%; font-weight: normal; color: #999; } #trends table.bucket-chart .bucket-labels th.dow { padding: 0 1px; background: none; text-align: center; } #trends table.bucket-chart .bucket-scale-container { height: 100px; text-align: right; border-right: solid 1px #999; color: #999; padding-right: 2px; margin-right: 2px; position: relative; } #trends table.bucket-chart .bucket-scale-23, #trends table.bucket-chart .bucket-scale-13, #trends table.bucket-chart .bucket-scale-0 { position: absolute; margin-top: -1ex; right: 2px; } #trends table.bucket-chart .bucket-scale-23 { top: 33%; } #trends table.bucket-chart .bucket-scale-13 { top: 66%; } #trends table.bucket-chart .bucket-scale-0 { bottom: 0; margin-top: 0; } #trends table.bucket-chart .bucket-line-max, #trends table.bucket-chart .bucket-line-23, #trends table.bucket-chart .bucket-line-13, #trends table.bucket-chart .bucket-line-0 { position: absolute; top: 0; right: 0; height: 0; border-top: dotted 1px #ccc; } #trends table.bucket-chart .bucket-line-max { top: 0; } #trends table.bucket-chart .bucket-line-23 { top: 33%; } #trends table.bucket-chart .bucket-line-13 { top: 66%; } #trends table.bucket-chart .bucket-line-0 { border-top: solid 1px #999; top: 100%; } #trends #day-bucket-chart-contents, #trends #hour-bucket-chart-contents, #trends #dow-bucket-chart-contents { padding: 0.5em; } #trends ol.cloud { list-style-type: none; padding: 0; margin: 0; } #trends ol.cloud li { padding: 0; margin: 0; display: inline; } #trends ol.cloud li.x0 {font-size: 80%; } #trends ol.cloud li.x1 {font-size: 100%; } #trends ol.cloud li.x2 {font-size: 120%; } #trends ol.cloud li.x3 {font-size: 140%; } #trends ol.cloud li.x4 {font-size: 160%; } #trends ol.cloud li.x5 {font-size: 180%; } #trends ol.cloud li span { text-decoration: none; } #trends ol.cloud li span:hover { text-decoration: underline; } #trends ol.cloud li.y0 span {color: #aaa; } #trends ol.cloud li.y1 span {color: #888; } #trends ol.cloud li.y2 span {color: #666; } #trends ol.cloud li.y3 span {color: #444; } #trends ol.cloud li.y4 span {color: #222; } #trends ol.cloud li.y5 span {color: #000; } #trends ol.cloud .tpl-tag-cloud { cursor: pointer; } #viewer-header { z-index: 1000; position: relative; zoom: 1; } #viewer-header .title { font-size: 140%; font-weight: bold; padding: .1em 0; } #viewer-header #subscribe-area { float: left; margin: 0; padding: 0; } #viewer-header #subscribe-area #chrome-subscribe { padding: 0; margin: 0; } #viewer-header #subscribe-area .chrome-subscribe-edit-link { display: none; } #viewer-header #viewer-controls { position: absolute; right: 0; bottom: 0; } body.ie6 #viewer-header #viewer-controls { margin-bottom: -1px !important; } body.opera #viewer-header #viewer-controls { white-space: nowrap; width: 25em; } #viewer-header #viewer-controls #viewer-controls-container-main { position: relative; } body.ie6 #viewer-header #viewer-controls #viewer-controls-container-main { position: static; } #viewer-header #viewer-controls #viewer-controls-container { overflow: hidden; position: relative; } /* * The Settings menu dropdown in listview which changes according * to the specific list view */ #lv-settings-menu { margin: 0 0.5em 0 0; } #lv-settings-menu .lv-settings-switch { display: none; } #lv-settings-menu-contents, .sv-folder-menu-contents { position: absolute; list-style-type: none; margin-top: -0.25em; left: 0; padding: 0; margin: 0; width: 13em; border: solid 1px #606060; background: #f3f3f3; overflow: auto; overflow-y: auto; overflow-x: hidden; z-index : 1000; } .sv-folder-menu-contents { margin-top: 0.25em; } body.mozilla #lv-settings-menu-contents, body.mozilla #sv-folder-menu-contents { border: 0; outline: solid 1px #606060; border-bottom: solid 1px #fff; } #lv-settings-menu .button-container-selected { font-weight: normal; } /* Hide all menu items by default. Selectively enable * menu items based on in top-level state */ #lv-settings-menu-contents li.menu-item { display: none; } #lv-settings-menu-contents li.divider { border-top: solid 1px #ccc; } #lv-settings-menu-contents li .check { visibility: hidden; padding: 0; } #lv-settings-menu-contents li:hover, #lv-settings-menu-contents li li:hover{ background-color: #ddd; } #lv-settings-menu-contents li.selected .check { visibility: visible; } /* Dont display the settigns menu for shared & starred items */ #lv-settings-menu.brand-menu { display: none; } #lv-settings-menu.allitems-menu .allitems-switch, #lv-settings-menu.folder-menu .folder-switch, #lv-settings-menu.single-feed-menu .single-feed-switch, #lv-settings-menu.single-feed-menu .single-feed-switch li, #lv-settings-menu-contents.allitems-menu .allitems-switch, #lv-settings-menu-contents.folder-menu .folder-switch, #lv-settings-menu-contents.single-feed-menu .single-feed-switch, #lv-settings-menu-contents.single-feed-menu .single-feed-switch li { display: block; } .state-stream-menu { display: none; } #lv-settings-menu-contents #stream-folder-chooser { cursor: default; padding: 0.3em 0 0.2em 0; } #lv-settings-menu-contents #stream-folder-chooser .button-body { color: #666; padding: 0 0.2em 0 0.6em; } #lv-settings-menu-contents #stream-folder-chooser ul { padding: 0; margin: 0; } #lv-settings-menu-contents #stream-folder-chooser:hover { background-color: #f3f3f3; } #entries #interrupt-oldest-first { background: #fff; padding: 0.5em; } #entries #interrupt-oldest-first .interrupt-oldest-first-box { margin: 0 auto; width: 100%; } #entries #interrupt-oldest-first .interrupt-oldest-first-box td { background-color: #ffc; } #entries #interrupt-oldest-first .link, #entries #interrupt-oldest-first a { margin-left: .6em; } #entries #interrupt-oldest-first-main { width: 96%; margin: 0 auto; padding: 0.3em 0; } #entries #interrupt-broadcast { background: #fff; padding: 1em; } #entries #interrupt-broadcast .interrupt-broadcast-box { margin: 0 auto; width: 100%; } #entries #interrupt-broadcast .interrupt-broadcast-box td { background-color: #ffffcc; } #entries #interrupt-broadcast-main { width: 96%; margin: 0 auto; padding: 1em 0; } #entries .interrupt-broadcast-header { font-size: 130%; } #entries .broadcast-actions { width: 100%; border-top: 1px solid #ccc; background: #ffffcc; margin-top: 1em; } body.ie #entries .broadcast-actions { overflow: auto; } #entries .broadcast-action { float: left; padding: 1em 0 0 0; width: 47%; margin-right: 1em; } #entries .broadcast-action-header { font-weight: bold; padding-left: 18px; padding-top: 2px; } #entries .send-broadcast .broadcast-action-header { background: transparent url("icon-itememail.gif") no-repeat; } #entries .make-broadcast-clip .broadcast-action-header { background: transparent url("icon-publish.gif") no-repeat; } #entries .broadcast-action-section { margin-top: 1em; } #entries .interrupt-broadcast-empty { text-align: left; } #entries .broadcast-icon-screenshot-container { background: #fff; width: 189px; height: 46px; -moz-border-radius: 5px; -webkit-border-radius: 5px; } #interrupt-first-scroll, #interrupt-first-scroll .transparency { position: absolute; top: 0; left: 0; height: 2000px; width: 100%; z-index: 1; } #interrupt-first-scroll .transparency { background: #fff; opacity: .75; -moz-opacity: 0.75; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=75); } #interrupt-first-scroll .main { position: absolute; width: 100%; z-index: 2; overflow: auto; } #first-scroll { margin: 5em auto; width: 400px; } #first-scroll td { background-color: #ffcc00; } #first-scroll .c { padding: 1em; } #first-scroll h2 { margin-top: 0; } #first-scroll .dismiss { margin: 2.5em 0 0; font-weight: bold; } #entries, #searchview { overflow: auto; overflow-y: auto; overflow-x: hidden; width: 100%; position: relative; } #entries { padding: 0; height: 300px; z-index: 1; position: relative; zoom: 1; outline: 0; } #entries .entry { position: relative; zoom: 1; } #entries .entry, #entries.list .entry-container { background: #fff; margin: 0; } #entries .entry-body, #entries .entry-title { max-width: 580px; } #entries .entry-body { padding-top: .5em; } #entries .entry-body a img { border: 0; z-index: 1; width: auto; } #entries .entry-main { margin-right: .5em; } #entries .entry-main { margin-left: 20px; } #entries .entry-title { font-size: 140%; margin: 0; } #entries .entry-title a { text-decoration: none; } #entries .entry-title a * { display: inline; } #entries .entry-title a br { display: none; } #entries .entry-title .entry-title-go-to { border: 0; padding-left: 0.25em; vertical-align: top; } #entries .entry-source-title { font-size: 120%; text-decoration: none; } #entries .entry-author, #entries .entry-date { color: #666; text-decoration: none; } #entries .entry .entry-container { position: relative; padding-bottom: 0.5em; } #entries .brand-read .entry-container .entry-title a, #entries .brand-read .entry-container .entry-source-title, #entries .brand-read .entry-container .fld-title, #entries .brand-read .entry-container .fld-entries-formatAuthor, #entries .brand-read .entry-container .entry-body a { color: #6a6ab0; } #entries .read .entry-container .entry-body { color: #222; } #entries #current-entry.read .entry-container .entry-title a, #entries #current-entry.read .entry-container .entry-source-title, #entries #current-entry.read .entry-container .entry-body a { color: #0000cc; } #entries #current-entry.overflow-settable .entry-main { overflow: auto; } body.ie #entries #current-entry .entry-main { overflow: visible; } #entries #current-entry.read .entry-container .entry-body { color: #000; } #entries.list .entry { padding: 0; margin: 0; border-bottom: solid 1px #aaa; overflow: hidden; } #entries.list .entry .collapsed { padding: 1px 0; background: #fff; border: solid 2px #fff; cursor: pointer; -moz-user-select: none; zoom: 1; margin: 0; overflow: hidden; width: auto; position: relative; } #entries.list .collapsed .entry-icons { display: block; margin: 0; padding: 0; width: auto; overflow: visible; position: absolute; top: 1px; left: .2em; } #entries.list .brand-read .collapsed { background: #e8eef7; border: solid 2px #e8eef7; } #entries .collapsed .entry-secondary { white-space: nowrap; overflow: hidden; color: #777; margin-right: 1em; } #entries.list .collapsed .entry-secondary { white-space: normal; position: static; float: none; padding: 0; margin: 0 9em 0 15em; width: auto; overflow: hidden; display: block; position: absolute; top: 1px; left: 0; } /* Toggle show new & show all links in list view */ #listview #lv-show-all { text-decoration: none; font-weight: bold; color: #000; } #listview.unreadonly #lv-show-all { text-decoration: underline; font-weight: normal; color: #00c; } #listview.unreadonly #lv-show-new { text-decoration: none; font-weight: bold; color: #000; } /* Toggle show new & show all links in Reader feedlist */ #ol-feedlist #ol-feedlist-show-all { text-decoration: none; font-weight: bold; color: #000; } #ol-feedlist.updatedonly #ol-feedlist-show-all { text-decoration: underline; font-weight: normal; color: #00c; cursor: pointer; } #ol-feedlist.updatedonly #ol-feedlist-show-new { text-decoration: none; font-weight: bold; color: #000; } #ol-feedlist.updatedonly li { display: none; } #ol-feedlist.updatedonly li.unread { display: block; } #ol-feedlist #sub-tree-root { display: block; } #listview.unreadonly .brand-read { display: none; } body.ie #entries.list .collapsed .entry-secondary { padding-right: 25em; } #entries.single-source .collapsed .entry-secondary { margin-left: 2em !important; } #entries .collapsed .entry-title { font-size: 100%; display: inline; margin-right: .5em; color: #000; } #entries.list .collapsed .entry-secondary .entry-title { white-space: inherit; position: static; margin: 0; padding: 0; width: auto; display: inline; } body.ie #entries.list .collapsed .entry-secondary .entry-title { overflow: auto; } #entries .collapsed .entry-original { width: 14px; height: 14px; background-image: url("icon-goto-small"); background-repeat: no-repeat; position: absolute; right: 0.2em; top: 50%; margin-top: -7px; } #entries.list .collapsed .entry-main .entry-original { white-space: normal; display: inline; float: none; margin: 0; padding: 0; width: auto; position: absolute; top: 1px; right: .5em; width: 1.2em; } #entries .collapsed .entry-source-title { color: #555; font-size: 100%; width: 12em; float: left; overflow: hidden; margin-right: 1em; } #entries.single-source .collapsed .entry-source-title { display: none !important; } #entries.list .collapsed .entry-main .entry-source-title { float: none; margin: 0; padding: 0 1em 0 0; overflow: hidden; display: block; width: 11em; white-space: nowrap; position: absolute; top: 1px; left: 1.85em; } #entries .collapsed .entry-main { overflow: hidden; white-space: nowrap; padding-left: 4px; } #entries.list .collapsed .entry-main { display: block; float: none; margin: 0; padding: 0; zoom: 1; margin-right: 5em; } body.ie #entries.list .collapsed .entry-main { overflow: auto; } #entries .collapsed .entry-date { float: right; text-align: right; width: 6.5em; padding-right: 15px; margin-right: 0.2em; } body.ie6 #entries .collapsed .entry-date { margin-right: 1.2em; } #entries.list .collapsed .entry-date { display: block; margin: 0; padding: 0; width: auto; margin-right: 2.3em; } #entries.list .collapsed .entry-secondary .snippet { white-space: inherit; display: inline; position: static; float: none; margin: 0; padding: 0; width: auto; } body.ie #entries.list .collapsed .entry-secondary .snippet { overflow: auto; } #entries.list .collapsed .entry-secondary-snippet { display: inline; } body.ie6 #entries.list .collapsed .entry-secondary-snippet { padding-right: 10em; } #entries.list #current-entry .collapsed { border: solid 2px #8181dc; } #entries.list #current-entry.expanded { border-top-width: 0; border-left-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-color: #8181dc; border-style: solid; } #entries.list #current-entry.expanded .collapsed { border-width: 2px 0 2px 0; border-bottom-color: #fff; } #entries.list #current-entry.expanded .entry-container { border-width: 0; } #entries.list #current-entry.expanded .entry-actions { border-color: #8181dc; } #entries.list .entry .entry-container { padding-top: 0.5em; border-width: 0 2px; border-color: #fff; border-style: solid; } #entries.list .entry .entry-container .entry-date { display: none; } #entries.list .entry .entry-actions { background: #eee; padding: 0.35em 0 0.15em 3px; left: 0; } #entries .entry .card { table-layout: fixed; width: 100%; border-spacing: 0; border-collapse: collapse; border: 0; } #entries .entry .card td { background-color: #fff; background-repeat: no-repeat; border: 0; padding: 0; } #entries .entry .card .ctl, #entries .entry .card .cl, #entries .entry .card .cbl, #entries .entry .card .ctr, #entries .entry .card .cr, #entries .entry .card .cbr, #entries .entry .card .cal, #entries .entry .card .car, #entries .entry .card .caal, #entries .entry .card .caar { width: 15px; } #entries .entry .card .ctl, #entries .entry .card .ct, #entries .entry .card .ctr { height: 13px; } #entries .entry .card .ctl { background-image: url("card-corners.gif"); } #entries .entry .card .ct { background-image: url("card-tb.gif"); background-repeat: repeat-x; } #entries .entry .card .ctr { background-image: url("card-corners.gif"); background-position: top right; } #entries .entry .card .cl { background-image: url("card-lr.gif"); background-repeat: repeat-y; } #entries .entry .card .cr { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-position: top right; } #entries .entry .card .cbl { background-image: url("card-corners.gif"); background-position: bottom left; } #entries .entry .card .cb { background-image: url("card-tb.gif"); background-repeat: repeat-x; background-position: bottom left; padding-bottom: 12px; } #entries .entry .card .cbr { background-image: url("card-corners.gif"); background-position: bottom right; } #entries .entry .card .card-bottomrow { font-size: 0px; line-height: 0px; } #entries .entry .card .cal { background-image: url("card-lr.gif"); background-color: #eee; background-repeat: repeat-y; } #entries .entry .card .car { background-image: url("card-lr.gif"); background-position: -16px 0; background-color: #eee; background-repeat: repeat-y; } #entries .entry .card .ca { background-color: #eee } #entries .action-area { background-color: #c3d9ff; padding: 4px 4px; } #entries .entry .card .caal { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-color: #C3D9FF; } #entries .entry .card .caar { background-image: url("card-lr.gif"); background-repeat: repeat-y; background-position: top right; background-color: #C3D9FF; } #entries .entry .card .caa { background-color: #c3d9ff } #entries .entry .card .blue-action-area .cbl { background-image: url("card-corners-blue.gif"); background-position: bottom left; } #entries .entry .card .blue-action-area .cb { background-image: url("card-tb-blue.gif"); background-repeat: repeat-x; background-position: bottom left; } #entries .entry .card .blue-action-area .cbr { background-image: url("card-corners-blue.gif"); background-position: bottom right; } #entries .brand-read .card .ctl { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .ct { background-image: url("card-tb-read.gif"); } #entries .brand-read .card .ctr { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cl { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .cr { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .cbl { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cb { background-image: url("card-tb-read.gif"); } #entries .brand-read .card .cbr { background-image: url("card-corners-read.gif"); } #entries .brand-read .card .cal { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .blue-action-area .cbl { background-image: url("card-corners-read-blue.gif"); } #entries .brand-read .card .blue-action-area .cb { background-image: url("card-tb-read-blue.gif"); } #entries .brand-read .card .blue-action-area .cbr { background-image: url("card-corners-read-blue.gif"); } #entries .brand-read .card .car { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .caal { background-image: url("card-lr-read.gif"); } #entries .brand-read .card .caar { background-image: url("card-lr-read.gif"); } #entries #current-entry .card .ctl { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .ct { background-image: url("card-tb-current.gif"); } #entries #current-entry .card .ctr { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .cl { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .caal { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .cr { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .caar { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .cbl { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .cb { background-image: url("card-tb-current.gif"); } #entries #current-entry .card .cbr { background-image: url("card-corners-current.gif"); } #entries #current-entry .card .blue-action-area .cbl { background-image: url("card-corners-current-blue.gif"); } #entries #current-entry .card .blue-action-area .cb { background-image: url("card-tb-current-blue.gif"); } #entries #current-entry .card .blue-action-area .cbr { background-image: url("card-corners-current-blue.gif"); } #entries #current-entry .card .cal { background-image: url("card-lr-current.gif"); } #entries #current-entry .card .car { background-image: url("card-lr-current.gif"); } #entries .entry .card .entry-container .entry-date { float: right; } #entries .entry-actions { padding-top: 0.35em; position: relative; left: -2px; font-size: 90%; } #entries .entry-actions a, #entries .entry-actions .link { text-decoration: none; } #entries .entry-actions .star, #entries .entry-actions .read-state, #entries .entry-actions .broadcast, #entries .entry-actions .email, #entries .entry-actions .tag { background-repeat: no-repeat; background-color: transparent; padding: 1px 8px 1px 16px; background-position: 0 50%; } body.ie6 #entries .entry-actions .star { zoom: 1; } #entries .entry-actions .email { background-image: url("icon-itememail.gif"); } #entries .entry-actions .tag { background-image: url("icon-itemtag.gif"); } #entries .entry-icons { width: 18px; position: absolute; top: 0; left: -2px; } body.ie6 #entries .entry-icons { top: 3px; left: -20px; } #entries .entry-icons .link { margin-bottom: .3em; } #entries .entry-icons .star { width: 15px; height: 15px; } /* * Dynamic switch of star active / inactive in item view */ #entries .item-star { background: transparent url("icon-star-inactive.png") no-repeat; } body.ie6 #entries .item-star { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-inactive.png"); } #entries .brand-starred .item-star { background: transparent url("icon-star-active.png") no-repeat; } body.ie6 #entries .brand-starred .item-star { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-star-active.png"); } /* link text switching */ #entries .item-add-star { display: inline; } #entries .item-remove-star { display: none; } #entries .brand-starred .item-add-star { display: none; } #entries .brand-starred .item-remove-star { display: inline; } /* * Dynamic switch of share / unshare in item view */ #entries .item-share { background: transparent url("icon-share-inactive.png") no-repeat; } body.ie6 #entries .item-share { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-inactive.png"); } #entries .brand-shared .item-share { background: transparent url("icon-share-active.png") no-repeat; } body.ie6 #entries .brand-shared .item-shared { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-share-active.png"); } /* * Dynamic switch of read / unread in item view */ #entries .item-read { background: transparent url("icon-itemunread.gif") no-repeat; } body.ie6 #entries .item-read { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-itemunread.gif"); } #entries .brand-read .item-read { background: transparent url("icon-itemread.gif") no-repeat; } body.ie6 #entries .brand-read .item-read { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="icon-itemread.gif"); } #entries .collapsed .fld-entries-title { font-weight: bold; } #entries .brand-read .collapsed .fld-entries-title { font-weight: normal; } /* link text switching */ #entries .item-add-share { display: inline; } #entries .item-remove-share { display: none; } #entries .brand-shared .item-add-share { display: none; } #entries .brand-shared .item-remove-share { display: inline; } .email-this-buttons { overflow: auto; padding-top: 4px; } #entries .entry .card .email-this-area td { background-color: #C3D9FF; } .email-this-send { margin-right: 0.3em; } .email-this-area .email-this-comment { width: 100%; margin-right: 4px; } .email-this-area .email-this-ccme { margin-top: 3px; margin-left: 0px; } .email-entry-table .field-name { font-weight: bold; text-align: right; width: 6em; margin-right: 0.3em; vertical-align: middle; } .email-entry-table .email-this-subject, .email-entry-table .email-this-to { width: 100%; } .email-entry-table { margin-top: 4px; width: 100%; table-layout: fixed; } #entries .entry .entry-actions .email-active { background-color: #C3D9FF; -moz-border-radius: 4px 4px 0 0; } #entries.list .entry .entry-actions .email-active { padding-bottom: 2px; padding-top: 2px; } .email-this-area .form-error-message { color: red; font-weight: bold; } .modal-dialog-bg { position: absolute; top: 0px; left: 0px; background-color: #fff; z-index: 2000; font-size: 105%; } .modal-dialog { position: absolute; top: 0px; left: 0px; width: 450px; background-color: #aaf; border: 6px solid #a4c5ff; z-index: 2001; } .modal-dialog-title { position: relative; background-color: #e0edfe; padding: 10px 8px; font-weight: bold; font-size: 145%; cursor: default; } .modal-dialog-content { background-color: #fff; padding: 2px 7px; } .modal-dialog-buttons { background-color: #fff; padding: 4px; text-align: right; } .modal-dialog-buttons button { margin: 5px; } #scour-introduction p { margin: .9em 0; } #scour-introduction h2 { margin: 0; font-size: 125%; } .tags-container-box td { background-color: #e1ecfe; font-size: 110%; } .tags-container-box .c { padding: .5em 0; } .tags-container-box .s { background-color: #c3d9ff; } .tags-container-box { z-index: 50; margin: 0; position: absolute; width: 260px; font-size: 85%; clear: both; } .tags-container-box ul { padding-left: 0; margin: 0 0 0 1em; } .tags-container-box li { list-style: none; padding: 0; margin: 0; } .tags-container-box li.author-tags, .tags-container-box li.user-tags { zoom: 1; clear: both; position: relative; } .tags-container-box li label { color: #333; margin-right: 0.5em; } .tags-container-box td.s, .tags-container-box td.c { background-color: #e1ecfe; } /* Create a border for the tag edit form */ .tags-container-box tr.top td { border-top: 2px solid #c3d9ff; } .tags-container-box td.left { border-left: 2px solid #c3d9ff; } .tags-container-box td.right { border-right: 2px solid #c3d9ff; } .tags-container-box tr.bottom td { border-bottom: 2px solid #c3d9ff; } #entries ul.user-tags-list { display: inline; padding-left: 0; margin: 0 0 0 .2em; } #entries ul.user-tags-list li { list-style: none; display: inline; padding: 0; margin: 0; } #entries ul.user-tags-list li a:hover { text-decoration: underline; } #entries ul.user-tags-list li a { text-decoration: none; display: inline; color: #444; } .tags-container-box li .tags-edit { display: block; width: 90%; padding: 0; } .tags-container-box li a.tags-edit-link { color: #0000cc; font-weight: bold; text-decoration: underline; } .tags-container-box li .tags-edit-tags { width: 90%; font-size: 100%; display: block; } #entries .tags-edit-contents { overflow: auto; width: 100%; } body.opera #entries .tags-edit-contents { overflow: hidden; } .tags-container-box li .tags-edit-buttons { margin-top: 0.5em; } .tags-container-box .button-container { margin-right: .4em; } .tags-container-box .tags-edit-save { font-weight: bold; } .tags-container-box .help { color: #777; } #chrome { margin-left: 260px; zoom: 1; } #main.noreader #chrome { margin-left: 10px; } #main.noreader #Reader { display: none; } #reader-toggler { float: left; width: 5px; height: 700px; background: url("icon-nav-right.gif"); cursor: pointer; } #viewer-box-table { table-layout: fixed; width: 100%; border-spacing: 0; border-collapse: collapse; border: 0; } #viewer-box { background-color: #c3d9ff; background-image: url("corner-tl.gif"); background-repeat: no-repeat; background-position: top left; padding: 3px 0 0 3px; } #viewer-box-inner { width: 100%; background-color: #fff; zoom: 1; } #viewer-top-links { padding: .25em; background-color: #c3d9ff; } #viewer-top-links #viewer-all-new-links-parent { float: left; margin-top: 0.1em; padding-right: 0.5em; } #viewer-top-links #viewer-all-links, #viewer-top-links.show-all #viewer-new-links { display: none; } #viewer-top-links.show-all #viewer-all-links { display: inline; } #viewer-box.state-stream #viewer-top-links #viewer-all-new-links-parent { display: none; } #viewer-top-links #viewer-all-new-links-parent, #viewer-top-links .button-container { margin-right: 0.4em; } #viewer-top-links .button-container { font-size: 90%; } #viewer-top-links .button-container-tight { margin-top: -1px; } #chrome-footer-container { background-color: #c3d9ff; position: relative; padding: 5px; overflow: hidden; zoom: 1; } #chrome-footer-container .button-container { margin-right: 1em; } #entries-up .button-body, #entries-down .button-body { padding-left: 12px; background-repeat: no-repeat; background-position: center left; } #entries-up .button-body { background-image: url("button-up-arrow.gif"); } #entries-down .button-body { background-image: url("button-down-arrow.gif"); } #lv-status { position: absolute; top: 8px; right: .5em; width: 300px; text-align: right; color: #555; } #lv-status.loading { color: #777; } #entries #scroll-filler { position: relative; width: 100%; padding-bottom: 1em; text-align: center; } #entries .scroll-filler-message { position: absolute; color: #999; font-size: 110%; top: 50%; margin-top: -0.5em; width: 100%; } body.ie #entries #scroll-filler, body.ie #entries .scroll-filler-message { width: auto; } #entries.single-source .entry-source-title-parent, #entries.single-source .entry-source-title { display: none; } #no-entries-msg { padding: 1.5em 2em 3em; text-align: center; background: #fff; border: 2px solid #ccc; -moz-border-radius: 5px; -webkit-border-radius: 5px; margin: 1em; } #no-entries-msg .link { font-size: 110%; } #image-preloader { position: absolute; top: -9000px; left: -500px; width: 300px; height: 300px; } .updated-text { color: #666; } div.audio-player-container { text-align: center; padding: 1em 0; } div.view-enclosure-parent { padding-top: .5em; } div.audio-player-container a, div.audio-player-container a:visited { font-style: normal; color: green; } .entry-body .google-video div, #viewer .google-video div { float: none !important; margin: 0 !important; width: auto !important; width: height !important; padding-top: 0 !important; } #nav { float: left; width: 240px; margin: 0 10px; } #nav .add { font-weight: bold; margin: .7em 0; text-align: center; } #nav-toggler { position: relative; float: left; width: 6px; border: 0; border-right: 1px dotted #fff; cursor: pointer; background: #fff url("icon-nav-left.gif") no-repeat center center; margin: 1em 3px 0 1px; } #nav-toggler.hover { background-color: #f3f3f3; } body.hide-nav #nav-toggler { margin: 0 0 0 5px; background-image: url("icon-nav-right.gif"); } body.hide-nav #nav { display: none; } body.hide-nav #chrome { margin-left: 15px; } body.hide-nav #entries .entry-body { max-width: 100% !important; } #chrome-footer-box { padding-bottom: 10px; } #chrome-footer-box p { margin: 0.25em 0 0 0; } #debug-footer #debug-main p { margin: 0 1em 0 0; } #debug-footer #debug-main { white-space: nowrap; overflow: hidden; font-size: 80%; } #subscribe-area { margin: 0; } #chrome-subscribe { background: none; margin: 0; -moz-border-radius: 0; -webkit-border-radius: 0; } #chrome-subscribe-edit div.chrome-subscribe-container { padding: 0.5em; background: none; } #chrome-subscribe-edit label { color: #555; } #chrome-unsubscribe, #chrome-subscribe { margin-top: 0em; margin-bottom: 0; } div.keyboard-help-banner { top: 20%; left: 10%; width: 80%; } body.ie6 div.keyboard-help-banner { position: absolute; top: expression(eval(document.body.scrollTop + document.documentElement.clientHeight * 0.2)); } #keyboard-help-container { display: none; } #keyboard-help { width: 100%; } #keyboard-help th { color: #dd0; padding-top: 0.5em; } #keyboard-help td.key { text-align: right; font-weight: bold; padding-right: 0.25em; white-space: nowrap; } #keyboard-help td.desc { text-align: left; font-weight: normal; } #keyboard-help-tearoff-link-container { text-align: center; font-size: 90%; margin-top: 1em; } #keyboard-help-tearoff-link-container .link { color: #dd0; } /* Additions by CK for feed reader */ #entries.list .entry-container { display: none; } #entries.list #current-entry.expanded .entry-container { display: block; } #recent-activity, #team-messages { display: none; } #templates { display: none; } #folder-choice { border: 1px solid black; background: #666; } .globalnode { display: none; } #trends, #sub-tree-resizer, #browsefeedsview { overflow: scroll; } #sub-tree-resizer { overflow-x: hidden; } #recent-activity { display: block; } html.homeview, body.homeview { overflow: auto; } .tpl-summary .summary-more { display: none; } .summary-with-folder .summary-more { display: block; } .recent { display: none; } .email-this-area .email-this-comment, .email-area .email-comment { width: 100%; margin-right: 4px; } #hover-send-email { display: none; } yocto-reader/themes/default/card-lr-current.gif0000644000004100000000000000026210735421015021330 0ustar www-datarootGIF89a uummkk{{! ,_0 +ŀG"Qqk9UWt;'.Kق!ofl!? UsڔS%2@.lIyl|K %kzΏlrn1;yocto-reader/themes/default/icon-goto-mini.gif0000644000004100000000000000105410735421017021156 0ustar www-datarootGIF89a WWW444555111UUU<<FIMQ2He@;yocto-reader/themes/default/card-tb-read-blue.gif0000644000004100000000000000041110735421016021473 0ustar www-datarootGIF89a >!, >`$h2lG,2a]|C0X*$Ȥ2Ii:ШtJN,zxL.zn|Nn~; KHUN!;yocto-reader/themes/default/settings.zip0000644000004100017500000004032410731444172020657 0ustar www-datachandanPKz67<5:Q settings.cssَ=@S+ɖn!F@I,:lOmt["UźXtۏɿSRO-_5OIxx^DΗOLjڑ=sTңc fɁ%g3\'=Q>s1xh17~D#ڃ`pvo^\/?6ܐk۪خvY+'^Ͽ&<$tִeDӴό J"4qNCG?js_۱H\'N-v}NҮ4 EZY0(?0a/'2$h}5d3uSAk?:ι2 Rz㜁TPsau 6hu7 DES4_RJ`&"=Bq5:QXР^5ȁ/'\>!4@Q{GPw(vAT|Y[N֫BK 4qukr xLVr=lj9|6B V?j0uGr5$f]&{#b'{\hĠR1HlB+:k?9lqdz⩫^K"go RiQτKUсݬ8osbfM[IԔB0M3={[@{  !dp3Dj5s ۶G~iK6Qh[R9SPz&s59зj3hg3並EH!G ?Qqцs%)dF:$;VWo J'NJcƹ~W7b[PF[2a]lMRbye-VlЅ!ҴQ7]Dp宍0v-`%P8%epJ"7hvf;|H YBG#z,K7(~4)UG7W `HzdQHpEp;>&Hil[\4#2L[Z *H{|5WHҍRSD003/|L,CnGXs@,Bg+>Hyh)AD\"p~(y_ܼ: 76RfŅZMfF8OZkxZj %1^. WzagKItCmU QT~X E˲ DV.5: p oHEZ(v@g0s R]UTNKr&ե2q>`sͲB-^ܝn4OP]҄sR&;Uye1As[[ԲhDe 0pH PV*p2 ^uR}a.R7]׵LzhÁp4Nx.X~@xxZlkTe#]4AJ=8ީC5 AB\;r`q@enS"N\GԊ. :H-ر=!Qﲉa8SMA!#\sc ,XWkY-rUS$ju,nO#9Wm{z Q=PUUݶJ|<̳f6M4گXtPeto >[8ͺ.Uz!Mst_s;c h=YlJV# 6l@"UgiZuM޹^7kU<wQu\̑DRNzF 393ml쏣Vg8elq:i!+Hs ijtf̚37f(dFʆ[i;]"{m]A6 cMuh#Q575$`ƩlB!9CөS9 8 ]<4ܹt4֢ y|5=<}zV ʬ>/"."ϾF$Qe@=$~zhIנn6zhN=~5B¸Vdָ.  %ڲcQxaY'i" ,aH aGm4EٚE\Uy3rlI_VHNHT_ Twh!,C.fve'hS# /tLBRF]'\ w/腍۷^JbJBG9Sw߸L~ġ~s s1 jZH(XWyt nb;~aLN,P}@59B+Pq V2- N$_!Q@ϗiAԹ~2w*7Ӿ mʳhxY k3HDa/>} 4 YTKu佳Х3"}fvt:qBj<.[ ei!!brE՟[l{54 93 a@M9!e"xð47OsecV][橬G;6 cpe|\sM3͂#B?'T۟.u?}F:AhXC7Rav"UzV|0P>@ jL^P7!A 9k=J嚭WkBMܷ 0S!P/r4lƑa6ne>3ZT)Եkbx GoU!>WomOjMy_߯h؋~ ~U C?ѭ`nvg0а%-$  P MaM$xm^taKn1U!</%t|hNd2>eJD1}nW}.ԟHRo:?wQ.la;LāI7'ѭPƇj櫉"y'+|*\`kvxyS\2/ôdbrAxSg)~88_8h`J5#U ȰQBĔ~QJ $ ׌-GV:r󩝄Zgj **Rnt]kVv$[iUctSn3R~pM.X's"_)=̩N/ǚ/""m|?ƒ\SK/+n\ʙ֩$˱JI"bTpS0!P;hV]9LBMm%4~\tX87u)Wt ZChg+9&r3EIs/7ʺ`6X_Ar܅esR谊ALor{?8R!UT9_3L=-0uWTB\m9-Xy}ڳLre>n^4+ï.rcs'߷\|t bas3π i(Ol (T&*P-͸~?)kSuT_'ҎBs4WM15b<_pz%WG%wIȥ!T ? A'#i~ qJ@9!0#qx;ܮg j ZN6.Sr$Xg:[e:BXGse^ +T:=%4=_,%'YH z^'Ů5.3FhO9N bu-@DS]CE;F0f5UXcTq.lƾ =i5PG|rTlLkS00W`^r \Mx]1fax!93vm7q·򇞫__ Q[nNw7.lYau//]d 2LC3'bbA;Nd]-u;oxq(\.+7.XB`CD/*EmV\*3󟃄`<]R;H/I/GGEbȽIl#h+D :@.g냫{d.st MH*Z>`K@B>`կ FH0g`* m9/Kyfgn> |j񝅜]+;UZ;+-i[eӾ<7u3'nޖGG{G;*9v+لl+S ۯO C6Z znW];/ʩ*<%ɧ;{ .F>缷WO}kiq_ tQ'`dIGz㐀uwyu}*0q0\ }YW8ELG7gI@Npס<'qL $zQnjCĶpiVZqx`%*`,BXl8TY:0J Qv>}ӯ6?&U`_:<`%!yW "C/N9^"J/LXf"X`*`f޿՛Li4L2I 6mFc*^&t$a\n—N4TD"&e9l)TAHkr֌jF9qF5-V"O3!.Wr5&b"ãx:{A:-մnި*>mASғK{ZřA%'5Z/x Nwc b@S֐~:+aҀ%ԐKjA1<|RH,JZb(ɀ Oŭ2+N2ʆ _]Hk +%Bԛʗ}br%ɿ؟}zZ27MIMb;6u˞]S?0VssNur꟟tZl7_:]Xd; C|;3S#@+~lOϘuJ:DMz8L# Mq4?:_@*/e'ײqƉ9m!>}7۰0KA8Ar~a kV2bqAV a= O!wK/&NMudYr!ɂfH6b}Bb‍D3JBaF_" J/s~kj#6! @ǽ,Gz1fɑx(ks.DLX`NKPP*j`9|?>uxw!}tш=Fn'+ Dl{?3q 7Bq6>MyxXi;ѤUǜZ~h q`+yز3hk(ᤷn-/Ŭd}$T$tCRn@V:jtKLmOpL^GyRMK'=puӱ"@Κu@RBh)m^6{a#oGم2dtpf Muuљ~ONt_&,č !k+psX֮$hĕ'&C{b+֨9 Vw$ㅇ3j˩:4iɔ'3tu;R"qy`wJ. 5 $w|; 6L9~!cg8Hzҥi=RwjGaN(wUL% i]ߒ\[aR:,T4*"vL%>%!sAgBDH\1Yݭ`b LNLmX7S}Y1 kUHoRh@{5pܚ1U/3]ޛ@ K@@h7sLfg "NgBZ8mFL ATӁ:.U vS6_su} izj=?RS伆#j)ρF\kU<1{x ~ÕJ]&[.0m|S-=L a} @!kԾuu^s 4g7sSfn?dܮu\7Mo{"Rb6[Ra&uIίs,AZ I1c5;#1uz;;Q=˻u /e NSm pa|vS^lme`oF 1rYao{p*8%/dAo93?ݨ -ix/C(Y-k!h+lf%+r\Dr6XƐꥤUqSp*F(glEI@dGIrV-!k0#KC-9pA-EiZ$n =lP;]EU g?zA͸xE8~@,ҳG,`S- ubSĺēա>d[ s?8 oq=Ep8{(TR7*} t U/q97[CKGB sGl<2zrHmGDzo7 DR:Sd-8k- i8gN#[v:\TwX+3ZS(1G)fCAU5ef9ڭIf~FIͧ}WyK9/qh渞u-q,:l1`ݹ}Zp!byqaeFG.K绐- U]":ڃyнHkLC3?KЎ_)й)UDt[H2 =҈/Zi2"FӼ{Ԓ^t[?'G+e~ZJ|_z~/4lGg3/ tY t:PIrq\ u6 SNL~VeU( eW`lԞb M 22,QVZm l6PIOYQIO԰ӹ @|5[XkYkZ2d4"POb 3?Ρ` C@ A sƴн#;=K.}b>,p<[r9 0!O+"UgEM\|s :KBܔ( E!)̧PTTfpl{B\.;{bS:VN̢;Z} ~tdnH}~d{iC %է0L_'UXQd"¹8Ǫ+_N^v+ -oc!-_~mg6ֹjvS!Ň1$я`:d!9p=Y4̓ VԶzr׃EuY;ڗ(AI:۬蓨ǚ%t 4u$=^Sk+^#/2"y ^KqM^3+S/ ޮ^ʲte ><<ʮ`Y,e&Z'se4rgZ?~p1?~ WdVИ4,Tc(/}}c\9taTo7pMlH?lz"p G ,o?U+v gEqfn2*IdUԙ艄p_XVe uԸs;AON ?e84`L\]A)2B6!cK֗gIjm%*e3X%7"q%_I Nߌ_ۉŗpACF~쿠>`pVZv?7nYt/a̬Ʒt;h/="5pg)oyv4Eee+lSm W:݋1lJphlt/Ys⚰`uXbm I݄R-⅌y3u }|jjeyRk\Խ bo=yW@hI}?d"I^ G[], ^:D{!UC=Eʏ'o8Q;+![zh+_U[1CV3c.BB^o `Fl+sol@'TȰMH! ۠k1(, FlXsxL{>'҅e H2&`ߨC=ڙĊKh_]ӄKL(XC\[2U Nx#6Ì3C*c|ZGK"55|U@A$ [1# Q\ѣp솥4 8?DT6Rǥ6:kAz56SF!Q\hygɩSյw6 yHikǜyS|>0Sjhx'] ř6jHM;"|Li'ep7Tl+}/P"8>6$ J֒ ܫ^1cK0S^A*dB 5j>wМS3"Tl^T9c;C+ G489s ]R\y\5@]#9z#g]7ee.*]Mkq :LyZT{fݕA!300}a["\e.8w"öu4d`}$П|^F\qWɎYk;F2#:"AM̠XURVHShfhwA"|uGp^%Nfry4sj.As'S(O)$<2TJ"K.zA9Xsc1"Bڪz"#=qA ӞNaj5zީ!S)emmyO}>G01f6\H41HW!"X^d5NhjSzHhN1y!L7p KͳAYGQI2ȞQ8xڙ;!5 5!B^ (v0S^ԝ&r\=^I:Y<%1Ġ6J(دmߪѾ3YYڳ{؆#L^%#R9˖Yh)񛤮]գB9.IeEx\ ][A%%a\8y*`\#_oҪ |ԋ!YD E"@&*7V_ݨmFM`8L3@ y74Za4T!\Bv5R u4X&'[,9++I&A&C"gD#FeN' -c1m8Ni1mXƚ,5Uf[JMnS4-csZL.O6&9x"O>̵J[u 6Fۜ%W7$ue]{;y"2qZk*nJnZ\2uIX ^@â Y :b=t+g:V4,9 WSn3D-̼M|b5z+ *o9TB]F#^{]2I!3˴vQz- O+S6\X@`2_.1YBB! ;Ucsjbj5_T٫D>AVG4st6fA4i}0fǣB ^A ?)()5NSޭ N6-H3HDퟛcX׶MpPΛayb:q)2(DBǾf|Pe3LgR d2d2`&PW'V(l@HJ.IݠjY4^|tzdD*"\%ˡK]1X0dydd$~ $uk'7Wn-27cSlEL ]4㼕yڱN-`{RiT=9/OIof Xƒkꇦ;gLwhE ;,t7 mMg|,vPh/YlS==[?ZY>}מN ډ2D )јF+GoʮOW6WNE1z^#ΡM7kUU(%/OAYD<*eG2gPDLE5 "%y|&>$`|uf*2KDD]pq>'NR @X2D~9g0;1nVx8oSUÓP]ZCJ]y9 אQ&sѳv$xI-RRsN4^0LJ8L'}nħhZ?W{tvRsZnt'8R;-k.y9л%J;@<0K'G^)@R&׉g64g.gZgy !#76`r:ak(.5Ĭό{;6GZEl4vJytẼ\q97ŗmFf_;`гQ24f6&f3ѯO𳳳XX၁jj!, >]Ig8cĻE(a蹬lp,tmJ:pH,Ȥrl:ШtJZجv{LyMx,`n <_*;yocto-reader/themes/default/icon-unsubscribe.gif0000644000004100000000000000203410735421022021573 0ustar www-datarootGIF89aǹתѾ᧧б﫫趶۽ssn񡡡÷jRܽj]fYɉ󔼉X;q` gFſe;J4ܩˆ нw\M™.#j>ǡ確 xquƖϜ[Nϩ\:Ͽ>%ֵ}v IJբڵ{P{!, A"* 0B*4` ņ 'JpAonp : )|! .x@% @ #@A +$@(Se΋#v \eR)rEJ ,ph@1z1C6ؐ&pl|0F@9XvxA3r"dtO`F>_Q m@EEx0@.0p;yocto-reader/themes/default/icon-goto.gif0000644000004100000000000000124710735421020020222 0ustar www-datarootGIF89aS,,,츸>>>ԈCCC999;;;...bbb]]]SSS괴___[[[333цaaavvv000555񡡡VVVFFF<<<???XXXKKKrrrPPPgggQQQ큁UUUWWW@@@IIIqqqddd!S,SKLQQLKPQJJQOP 3.MP <NNB,CA?QPPS-:P(F7LSPQSK6+"&L RKM NLN2LOD  N)$ RO9(9D{1( 8YOp#QxM)M` Þt8ɤ Ӝ@''4)@CK$аA p$AM,| ,\]$ 08PCM1 ;yocto-reader/themes/default/corner-bl.gif0000644000004100000000000000005410735421016020207 0ustar www-datarootGIF89a!,D;yocto-reader/themes/default/card-corners.gif0000644000004100000000000000220210735421015020702 0ustar www-datarootGIF89a>ͻھĪ׺Пؽ௯갰۲!,>LLIIKIHHKHGGK FFK IH +K&+ G %;KH$ Ψ / ڄJF '  9@nDr8pԏD" 0tFh#5FEP!FX!@)$&H`'!)NL0piӧPJt# Ҥ&Kz@#G~^ͺUlװnɚEVnን{6mw݂̗_m.۷.[b~-*b_%elcRvXq\ΕNyԫ1{ dϦ&:ƷK>췿; :9l'{s͉,ܷv屳.Nq}zC_/D9t@NЂ KBx 3h9LCD|pJ,(|@ADj9 HPK P h`3n2+ 0A-rH& I'r2.2I%`/4(bo&;yocto-reader/themes/default/card-tb-current-blue.gif0000644000004100000000000000026210735421016022246 0ustar www-datarootGIF89a >܀XXjjų!, >_PIg8cĻ@(aɬlp,tmKzpH,Ȥrl:ШtJZجv{ x`L.:Mh|N!, >#(h6lL,bM|0X*Ȥ2i:ШtJB,VzxL.zn|N~߿,9641 K!;yocto-reader/themes/default/icon-starred.png0000644000004100000000000000076510735421021020742 0ustar www-datarootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% pI*G8Ą[vq)\v2031q. s8^ QlJ~I. @@lhjo5 xóT SMF\bKbb`a<ĿD|bbx $hY g#,! V1?<,q @]@Sw#@,(f0*cD&@p 4@k @$ b@Ň7$q-d)O@E >@l/.~"w/@1~t/  17ԯ@ @Bh8|0RQ6ÝBIENDB`yocto-reader/themes/default/card-tb-blue.gif0000644000004100000000000000025610735421016020571 0ustar www-datarootGIF89a >!, >[I8c»E("b詬lp,tmIpH,Ȥrl:ШtJZجv{LyMx,`nxf%;