digest and mobile (old) moved to -contrib repository

This commit is contained in:
Andrew Dolgov 2013-05-07 10:08:34 +04:00
parent 7c433c9412
commit d88922a5d3
43 changed files with 0 additions and 4012 deletions

View File

@ -1,337 +0,0 @@
body#ttrssDigest {
color : black;
font-family : sans-serif;
font-size : 12px;
margin : 0px;
background : url("images/tile.png");
}
a {
color : #0069D8;
text-decoration : none;
}
a:hover {
color : gray;
}
#header a, #footer a {
color : gray;
}
#header a:hover, #footer a:hover {
color : #0069D8;
}
#header {
font-size : 13px;
font-family : "Segoe UI", Tahoma, sans-serif;
padding : 5px 5px 5px 1.5em;
color : gray;
position : absolute;
top : 0px;
height : 30px;
left : 0px;
right : 0px;
color : #a0a0a0;
}
#header span.title {
font-weight : bold;
font-style : italic;
}
#header div.links {
position : absolute;
right : 1.5em;
}
#search {
float : right;
clear : left;
}
#title {
}
#latest {
padding : 5px;
}
#content {
position : absolute;
left : 0px;
top : 30px;
right : 0px;
bottom : 0px;
-webkit-transition: left 0.2s linear, right 0.2s linear;
-moz-transition: left 0.2s linear, right 0.2s linear;
transition: left 0.2s linear, right 0.2s linear;
}
#article {
position : absolute;
overflow : auto;
right : 0px;
width : 60%;
bottom : 0px;
top : 30px;
background : white;
z-index : -1;
opacity : 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
#article.visible {
opacity : 1;
}
#article #article-content h1 {
margin : 0px 0px 10px 0px;
padding : 0px 0px 5px 0px;
font-family : "Segoe UI", Tahoma, sans-serif;
font-size : 21px;
font-weight : bold;
border-width : 0px 0px 3px 0px;
border-style : solid;
border-color : #e0e0e0;
color : gray;
}
#article #article-content #toolbar {
border-width : 0px 0px 1px 0px;
border-color : #e0e0e0;
border-style : solid;
background : #fafafa;
font-size : 14px;
font-weight : bold;
padding : 5px 10px 5px 10px;
margin : 0px 0px 0px 0px;
}
#article #article-content {
padding : 0px;
font-size : 16px;
}
#article #article-content #tags {
color : #a0a0a0;
}
#article #article-content #ops {
float : right;
}
#article #article-content #ops img {
cursor : pointer;
margin-right : 0px;
margin-left : 10px;
}
#article #article-content #inner {
padding : 20px;
}
#article #article-content img {
max-width : 90%;
}
#content.move {
left : -300px;
right : 60%
}
#feeds {
position : absolute;
left : 0px;
width : 300px;
top : -30px;
bottom : 0px;
font-size : 14px;
overflow : auto;
border-width : 0px 3px 0px 0px;
border-color : #88b0f0;
border-style : solid;
background : #eee;
}
#feeds ul#feeds-content img {
width : 16px;
height : 16px;
vertical-align : middle;
margin-right : 5px;
}
#feeds ul#feeds-content div.unread-ctr {
color : #d0d0d0;
padding-left : 10px;
float : right;
}
#feeds ul#feeds-content li {
padding : 10px;
clear : both;
cursor : pointer;
color : #303030;
white-space : nowrap;
}
#feeds ul#feeds-content li.selected {
background : white;
}
#feeds ul#feeds-content {
list-style-type : none;
font-weight : bold;
margin : 0px;
padding : 0px;
}
#headlines {
font-size : 14px;
position : absolute;
left : 303px;
top : 0px;
bottom : 0px;
right : 0px;
overflow : auto;
border-width : 0px 3px 0px 0px;
border-style : solid;
border-color : #88b0f0;
}
#headlines h1 a {
color : #684C99;
}
#headlines ul#headlines-content .cb {
vertical-align : middle;
margin-right : 5px;
float : left;
}
#headlines ul#headlines-content img.icon {
width : 16px;
height : 16px;
vertical-align : middle;
margin-right : 5px;
float : right;
}
#headlines ul#headlines-content {
list-style-type : none;
color : gray;
margin : 0px;
padding : 0px;
}
#headlines ul#headlines-content li {
margin : 0px 0px 0px 0px;
padding : 10px;
color : gray;
clear : left;
border-width : 0px 0px 1px 0px;
border-style : solid;
border-color : #e0e0e0;
background : #eee;
}
#headlines ul#headlines-content a.title {
font-size : 14px;
font-weight : bold;
display : block;
margin-left : 21px;
position : relative;
}
#headlines ul#headlines-content li.fresh a.title {
color : #007FFF;
}
#headlines ul#headlines-content li.unread a.title {
color : black;
/* color : #8DB1D6; */
}
#headlines ul#headlines-content li.read a.title {
color : gray;
}
#headlines ul#headlines-content li.unread,
#headlines ul#headlines-content li.fresh {
background-color : white;
}
#headlines ul#headlines-content li.selected {
background-color : #fff7d5;
border-color : white white #e0e0e0;
}
#headlines ul#headlines-content img#H-LOADING-IMG {
margin-left : 5px;
}
#headlines ul#headlines-content div.excerpt {
color : #404040;
cursor : pointer;
margin-top : 5px;
}
#headlines ul#headlines-content div.content {
color : #404040;
}
#headlines ul#headlines-content div.content img {
max-width : 75%;
}
#headlines ul#headlines-content div.body {
margin-left : 21px;
/*margin-left : 42px;*/
}
#headlines ul#headlines-content div.info {
font-size : 11px;
margin-top : 5px;
}
#headlines ul#headlines-content div.info a {
color : gray;
}
#overlay {
background : white;
left : 0;
top : 0;
height : 100%;
width : 100%;
z-index : 100;
position : absolute;
text-align : center;
}
#overlay_inner {
margin : 1em;
}
#overlay img {
vertical-align : middle;
}
div.fatalError button {
margin-top : 5px;
}
div.fatalError textarea {
width : 100%;
height : 100px;
}
div.insensitive {
color : gray;
}

View File

@ -1,951 +0,0 @@
var last_feeds = [];
var init_params = {};
var hotkeys_map = false;
var hotkey_prefix = false;
var mobile_mode = false;
var _active_feed_id = false;
var _update_timeout = false;
var _view_update_timeout = false;
var _feedlist_expanded = false;
var _update_seq = 1;
function article_appear(article_id) {
try {
new Effect.Appear('A-' + article_id);
} catch (e) {
exception_error("article_appear", e);
}
}
function catchup_feed(feed_id, callback) {
try {
var fn = find_feed(last_feeds, feed_id).title;
if (confirm(__("Mark all articles in %s as read?").replace("%s", fn))) {
var is_cat = "";
if (feed_id < 0) is_cat = "true"; // KLUDGE
var query = "op=rpc&method=catchupFeed&feed_id=" +
feed_id + "&is_cat=" + is_cat;
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
if (callback) callback(transport);
update();
} });
}
} catch (e) {
exception_error("catchup_article", e);
}
}
function parse_article_elements_for_ids(elems) {
try {
var ids = [];
for (var i = 0; i < elems.length; i++) {
if (elems[i].id && elems[i].id.match("A-")) {
ids.push(elems[i].id.replace("A-", ""));
}
}
return ids;
} catch (e) {
exception_error("parse_article_elements_for_ids", e);
}
}
function get_selected_article_ids() {
try {
var elems = $$('#headlines-content li.selected');
return parse_article_elements_for_ids(elems);
} catch (e) {
exception_error("get_visible_article_ids", e);
}
}
function get_visible_article_ids() {
try {
var elems = $("headlines-content").getElementsByTagName("LI");
return parse_article_elements_for_ids(elems);
} catch (e) {
exception_error("get_visible_article_ids", e);
}
}
function catchup_visible_articles(callback) {
try {
var ids = get_selected_article_ids();
if ( 0 == ids.length ) {
ids = get_visible_article_ids();
ntext = [ "Mark %d displayed article as read?", "Mark %d displayed articles as read?" ];
} else {
ntext = [ "Mark %d selected article as read?", "Mark %d selected articles as read?" ];
}
if (confirm(ngettext(ntext[0], ntext[1], ids.length).replace("%d", ids.length))) {
var query = "op=rpc&method=catchupSelected" +
"&cmode=0&ids=" + param_escape(ids);
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
if (callback) callback(transport);
viewfeed(_active_feed_id, 0);
} });
}
} catch (e) {
exception_error("catchup_visible_articles", e);
}
}
function catchup_article(article_id, callback) {
try {
var query = "op=rpc&method=catchupSelected" +
"&cmode=0&ids=" + article_id;
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
if (callback) callback(transport);
} });
} catch (e) {
exception_error("catchup_article", e);
}
}
function set_selected_article(article_id) {
try {
$$("#headlines-content > li[id*=A-]").each(function(article) {
var id = article.id.replace("A-", "");
var cb = article.getElementsByTagName("INPUT")[0];
if (id == article_id) {
article.addClassName("selected");
cb.checked = true;
} else {
article.removeClassName("selected");
cb.checked = false;
}
});
} catch (e) {
exception_error("set_selected_article", e);
}
}
function set_selected_feed(feed_id) {
try {
var feeds = $("feeds-content").getElementsByTagName("LI");
for (var i = 0; i < feeds.length; i++) {
if (feeds[i].id == "F-" + feed_id)
feeds[i].className = "selected";
else
feeds[i].className = "";
}
_active_feed_id = feed_id;
} catch (e) {
exception_error("set_selected_feed", e);
}
}
function load_more() {
try {
var pr = $("H-LOADING-IMG");
if (pr) Element.show(pr);
var offset = $$("#headlines-content > li[id*=A-][class*=fresh],li[id*=A-][class*=unread]").length;
viewfeed(false, offset, false, false, true,
function() {
var pr = $("H-LOADING-IMG");
if (pr) Element.hide(pr);
});
} catch (e) {
exception_error("load_more", e);
}
}
function update(callback) {
try {
console.log('updating feeds...');
window.clearTimeout(_update_timeout);
new Ajax.Request("backend.php", {
parameters: "op=digest&method=digestinit",
onComplete: function(transport) {
fatal_error_check(transport);
parse_feeds(transport);
set_selected_feed(_active_feed_id);
if (callback) callback(transport);
} });
_update_timeout = window.setTimeout('update()', 5*1000);
} catch (e) {
exception_error("update", e);
}
}
function remove_headline_entry(article_id) {
try {
var elem = $('A-' + article_id);
if (elem) {
elem.parentNode.removeChild(elem);
}
} catch (e) {
exception_error("remove_headline_entry", e);
}
}
function view_update() {
try {
viewfeed(_active_feed_id, _active_feed_offset, false, true, true);
update();
} catch (e) {
exception_error("view_update", e);
}
}
function view(article_id) {
try {
$("content").addClassName("move");
var a = $("A-" + article_id);
var h = $("headlines");
setTimeout(function() {
// below or above viewport, reposition headline
if (a.offsetTop > h.scrollTop + h.offsetHeight || a.offsetTop+a.offsetHeight < h.scrollTop+a.offsetHeight)
h.scrollTop = a.offsetTop - (h.offsetHeight/2 - a.offsetHeight/2);
}, 500);
new Ajax.Request("backend.php", {
parameters: "op=digest&method=digestgetcontents&article_id=" +
article_id,
onComplete: function(transport) {
fatal_error_check(transport);
var reply = JSON.parse(transport.responseText);
if (reply) {
var article = reply['article'];
var mark_part = "";
var publ_part = "";
var tags_part = "";
if (article.tags.length > 0) {
tags_part = " " + __("in") + " ";
for (var i = 0; i < Math.min(5, article.tags.length); i++) {
//tags_part += "<a href=\"#\" onclick=\"viewfeed('" +
// article.tags[i] + "')\">" +
// article.tags[i] + "</a>, ";
tags_part += article.tags[i] + ", ";
}
tags_part = tags_part.replace(/, $/, "");
tags_part = "<span class=\"tags\">" + tags_part + "</span>";
}
if (article.marked)
mark_part = "<img title='"+ __("Unstar article")+"' onclick=\"toggle_mark(this, "+article.id+")\" src='images/mark_set.svg'>";
else
mark_part = "<img title='"+__("Star article")+"' onclick=\"toggle_mark(this, "+article.id+")\" src='images/mark_unset.svg'>";
if (article.published)
publ_part = "<img title='"+__("Unpublish article")+"' onclick=\"toggle_pub(this, "+article.id+")\" src='images/pub_set.svg'>";
else
publ_part = "<img title='"+__("Publish article")+"' onclick=\"toggle_pub(this, "+article.id+")\" src='images/pub_unset.svg'>";
var tmp = "<div id=\"inner\">" +
"<div id=\"ops\">" +
mark_part +
publ_part +
"</div>" +
"<h1>" + "<a target=\"_blank\" href=\""+article.url+"\">" +
article.title + "</a>" + "</h1>" +
"<div id=\"tags\">" +
tags_part +
"</div>" +
article.content + "</div>";
$("article-content").innerHTML = tmp;
$("article").addClassName("visible");
set_selected_article(article.id);
catchup_article(article_id,
function() {
$("A-" + article_id).addClassName("read");
});
} else {
elem.innerHTML = __("Error: unable to load article.");
}
}
});
return false;
} catch (e) {
exception_error("view", e);
}
}
function close_feed() {
$("headlines").removeClassName("move");
if (mobile_mode) set_selected_feed(false);
}
function go_back() {
if ($("article").hasClassName("visible")) {
close_article();
} else {
close_feed();
}
}
function close_article() {
$("content").removeClassName("move");
$("article").removeClassName("visible");
}
function viewfeed(feed_id, offset, replace, no_effects, no_indicator, callback) {
try {
$("headlines").addClassName("move");
if (!feed_id) feed_id = _active_feed_id;
if (offset == undefined) offset = 0;
if (replace == undefined) replace = (offset == 0);
_update_seq = _update_seq + 1;
if (!offset) $("headlines").scrollTop = 0;
var query = "op=digest&method=digestupdate&feed_id=" +
param_escape(feed_id) + "&offset=" + offset +
"&seq=" + _update_seq;
console.log(query);
var img = false;
if ($("F-" + feed_id)) {
img = $("F-" + feed_id).getElementsByTagName("IMG")[0];
if (img && !no_indicator) {
img.setAttribute("orig_src", img.src);
img.src = 'images/indicator_tiny.gif';
}
}
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
Element.hide("overlay");
fatal_error_check(transport);
parse_headlines(transport, replace, no_effects);
set_selected_feed(feed_id);
_active_feed_offset = offset;
if (img && !no_indicator)
img.src = img.getAttribute("orig_src");
if (callback) callback(transport);
} });
} catch (e) {
exception_error("view", e);
}
}
function find_article(articles, article_id) {
try {
for (var i = 0; i < articles.length; i++) {
if (articles[i].id == article_id)
return articles[i];
}
return false;
} catch (e) {
exception_error("find_article", e);
}
}
function find_feed(feeds, feed_id) {
try {
for (var i = 0; i < feeds.length; i++) {
if (feeds[i].id == feed_id)
return feeds[i];
}
return false;
} catch (e) {
exception_error("find_feed", e);
}
}
function get_feed_icon(feed) {
try {
if (feed.has_icon)
return getInitParam('icons_url') + "/" + feed.id + '.ico';
if (feed.id == -1)
return 'images/mark_set.svg';
if (feed.id == -2)
return 'images/pub_set.svg';
if (feed.id == -3)
return 'images/fresh.png';
if (feed.id == -4)
return 'images/tag.png';
if (feed.id < -10)
return 'images/label.png';
return 'images/blank_icon.gif';
} catch (e) {
exception_error("get_feed_icon", e);
}
}
function add_feed_entry(feed) {
try {
var icon_part = "";
icon_part = "<img src='" + get_feed_icon(feed) + "'/>";
var title = (feed.title.length > 30) ?
feed.title.substring(0, 30) + "&hellip;" :
feed.title;
var tmp_html = "<li id=\"F-"+feed.id+"\" onclick=\"viewfeed("+feed.id+")\">" +
"<div class='unread-ctr'>" + "<span class=\"unread\">" + feed.unread + "</span></div>" +
icon_part + title +
"</li>";
$("feeds-content").innerHTML += tmp_html;
} catch (e) {
exception_error("add_feed_entry", e);
}
}
function add_headline_entry(article, feed, no_effects) {
try {
var icon_part = "";
icon_part = "<img class='icon' src='" + get_feed_icon(feed) + "'/>";
var style = "";
//if (!no_effects) style = "style=\"display : none\"";
if (article.excerpt.trim() == "")
article.excerpt = __("Click to expand article.");
var li_class = "unread";
var fresh_max = getInitParam("fresh_article_max_age") * 60 * 60;
var d = new Date();
if (d.getTime() / 1000 - article.updated < fresh_max)
li_class = "fresh";
var checkbox_part = "<input type=\"checkbox\" class=\"cb\" onclick=\"toggle_select_article(this)\"/>";
var date = new Date(article.updated * 1000);
var date_part = date.toString().substring(0,21);
var tmp_html = "<li id=\"A-"+article.id+"\" "+style+" class=\""+li_class+"\">" +
checkbox_part +
icon_part +
"<a target=\"_blank\" href=\""+article.link+"\""+
"onclick=\"return view("+article.id+")\" class='title'>" +
article.title + "</a>" +
"<div class='body'>" +
"<div onclick=\"view("+article.id+")\" class='excerpt'>" +
article.excerpt + "</div>" +
"<div onclick=\"view("+article.id+")\" class='info'>";
/* tmp_html += "<a href=\#\" onclick=\"viewfeed("+feed.id+")\">" +
feed.title + "</a> " + " @ "; */
tmp_html += date_part + "</div>" +
"</div></li>";
$("headlines-content").innerHTML += tmp_html;
if (!no_effects)
window.setTimeout('article_appear(' + article.id + ')', 100);
} catch (e) {
exception_error("add_headline_entry", e);
}
}
function expand_feeds() {
try {
_feedlist_expanded = true;
redraw_feedlist(last_feeds);
} catch (e) {
exception_error("expand_feeds", e);
}
}
function redraw_feedlist(feeds) {
try {
$('feeds-content').innerHTML = "";
var limit = 10;
if (_feedlist_expanded) limit = feeds.length;
for (var i = 0; i < Math.min(limit, feeds.length); i++) {
add_feed_entry(feeds[i]);
}
if (feeds.length > limit) {
$('feeds-content').innerHTML += "<li id='F-MORE-PROMPT'>" +
"<img src='images/blank_icon.gif'>" +
"<a href=\"#\" onclick=\"expand_feeds()\">" +
ngettext("%d more...", "%d more...", feeds.length-10).replace("%d", feeds.length-10) +
"</a>" + "</li>";
}
if (feeds.length == 0) {
$('feeds-content').innerHTML =
"<div class='insensitive' style='text-align : center'>" +
__("No unread feeds.") + "</div>";
}
if (_active_feed_id)
set_selected_feed(_active_feed_id);
} catch (e) {
exception_error("redraw_feedlist", e);
}
}
function parse_feeds(transport) {
try {
var reply = JSON.parse(transport.responseText);
if (!reply) return;
var feeds = reply['feeds'];
if (feeds) {
feeds.sort( function (a,b)
{
if (b.unread != a.unread)
return (b.unread - a.unread);
else
if (a.title > b.title)
return 1;
else if (a.title < b.title)
return -1;
else
return 0;
});
var all_articles = find_feed(feeds, -4);
update_title(all_articles.unread);
last_feeds = feeds;
redraw_feedlist(feeds);
}
if (reply['hotkeys']) {
hotkeys_map = reply['hotkeys'];
}
} catch (e) {
console.log(e);
//exception_error("parse_feeds", e);
}
}
function parse_headlines(transport, replace, no_effects) {
try {
var reply = JSON.parse(transport.responseText);
if (!reply) return;
var seq = reply['seq'];
if (seq) {
if (seq != _update_seq) {
console.log("parse_headlines: wrong sequence received.");
return;
}
} else {
return;
}
var headlines = reply['headlines']['content'];
var headlines_title = reply['headlines']['title'];
if (headlines && headlines_title) {
if (replace) {
$('headlines-content').innerHTML = '';
}
var pr = $('H-MORE-PROMPT');
if (pr) pr.parentNode.removeChild(pr);
var inserted = false;
for (var i = 0; i < headlines.length; i++) {
if (!$('A-' + headlines[i].id)) {
add_headline_entry(headlines[i],
find_feed(last_feeds, headlines[i].feed_id), !no_effects);
}
}
console.log(inserted.id);
var ids = get_visible_article_ids();
if (ids.length > 0) {
if (pr) {
$('headlines-content').appendChild(pr);
} else {
$('headlines-content').innerHTML += "<li id='H-MORE-PROMPT'>" +
"<div class='body'>" +
"<a href=\"#\" onclick=\"catchup_visible_articles()\">" +
__("Mark as read") + "</a> | " +
"<a href=\"javascript:load_more()\">" +
__("Load more...") + "</a>" +
"<img style=\"display : none\" "+
"id=\"H-LOADING-IMG\" src='images/indicator_tiny.gif'>" +
"</div></li>";
}
} else {
// FIXME : display some kind of "nothing to see here" prompt here
}
// if (replace && !no_effects)
// new Effect.Appear('headlines-content', {duration : 0.3});
//new Effect.Appear('headlines-content');
}
} catch (e) {
exception_error("parse_headlines", e);
}
}
function init_second_stage() {
try {
new Ajax.Request("backend.php", {
parameters: "op=digest&method=digestinit&init=1",
onComplete: function(transport) {
parse_feeds(transport);
Element.hide("overlay");
document.onkeydown = hotkey_handler;
if (!mobile_mode)
window.setTimeout('viewfeed(-4)', 100);
_update_timeout = window.setTimeout('update()', 5*1000);
} });
} catch (e) {
exception_error("init_second_stage", e);
}
}
function init(mobile) {
try {
mobile_mode = mobile;
new Ajax.Request("backend.php", {
parameters: {op: "rpc", method: "sanityCheck"},
onComplete: function(transport) {
backend_sanity_check_callback(transport);
} });
} catch (e) {
exception_error("digest_init", e);
}
}
function toggle_mark(img, id) {
try {
var query = "op=rpc&id=" + id + "&method=mark";
if (!img) return;
if (img.src.match("mark_unset")) {
img.src = img.src.replace("mark_unset", "mark_set");
img.alt = __("Unstar article");
query = query + "&mark=1";
} else {
img.src = img.src.replace("mark_set", "mark_unset");
img.alt = __("Star article");
query = query + "&mark=0";
}
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
update();
} });
} catch (e) {
exception_error("toggle_mark", e);
}
}
function toggle_pub(img, id, note) {
try {
var query = "op=rpc&id=" + id + "&method=publ";
if (note != undefined) {
query = query + "&note=" + param_escape(note);
} else {
query = query + "&note=undefined";
}
if (!img) return;
if (img.src.match("pub_unset") || note != undefined) {
img.src = img.src.replace("pub_unset", "pub_set");
img.alt = __("Unpublish article");
query = query + "&pub=1";
} else {
img.src = img.src.replace("pub_set", "pub_unset");
img.alt = __("Publish article");
query = query + "&pub=0";
}
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
update();
} });
} catch (e) {
exception_error("toggle_pub", e);
}
}
function fatal_error(code, msg) {
try {
if (code == 6) {
window.location.href = "digest.php";
} else if (code == 5) {
window.location.href = "public.php?op=dbupdate";
} else {
if (msg == "") msg = "Unknown error";
console.error("Fatal error: " + code + "\n" +
msg);
}
} catch (e) {
exception_error("fatalError", e);
}
}
function fatal_error_check(transport) {
try {
if (transport.responseXML) {
var error = transport.responseXML.getElementsByTagName("error")[0];
if (error) {
var code = error.getAttribute("error-code");
var msg = error.getAttribute("error-msg");
if (code != 0) {
fatal_error(code, msg);
return false;
}
}
}
} catch (e) {
exception_error("fatal_error_check", e);
}
return true;
}
function update_title(unread) {
try {
document.title = "Tiny Tiny RSS";
if (unread > 0)
document.title += " (" + unread + ")";
} catch (e) {
exception_error("update_title", e);
}
}
function toggle_select_article(elem) {
try {
var article = elem.parentNode;
if (article.hasClassName("selected"))
article.removeClassName("selected");
else
article.addClassName("selected");
} catch (e) {
exception_error("toggle_select_article", e);
}
}
function hotkey_handler(e) {
try {
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
var keycode = false;
var shift_key = false;
var cmdline = $('cmdline');
try {
shift_key = e.shiftKey;
} catch (e) {
}
if (window.event) {
keycode = window.event.keyCode;
} else if (e) {
keycode = e.which;
}
var keychar = String.fromCharCode(keycode);
if (!shift_key) keychar = keychar.toLowerCase();
if (keycode == 16) return; // ignore lone shift
if (keycode == 17) return; // ignore lone ctrl
var hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
hotkey_prefix = false;
var hotkey_action = false;
var hotkeys = getInitParam("hotkeys");
for (sequence in hotkeys[1]) {
if (sequence == hotkey) {
hotkey_action = hotkeys[1][sequence];
break;
}
}
switch (keycode) {
case 27: // esc
go_back();
return false;
}
switch (hotkey_action) {
case "next_feed":
var feeds = $$("#feeds li");
for (var i = 0; i < feeds.length; i++) {
var base_id = feeds[i].id.replace("F-", "");
if (base_id == _active_feed_id) {
if (feeds[i+1]) {
viewfeed(feeds[i+1].id.replace("F-", ""));
}
break;
}
}
return false;
case "prev_feed":
var feeds = $$("#feeds li");
for (var i = 0; i < feeds.length; i++) {
var base_id = feeds[i].id.replace("F-", "");
if (base_id == _active_feed_id) {
if (feeds[i-1]) {
viewfeed(feeds[i-1].id.replace("F-", ""));
}
break;
}
}
return false;
case "next_article":
return false;
case "prev_article":
return false;
default:
console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
}
} catch (e) {
exception_error("hotkey_handler", e);
}
}

View File

@ -1,97 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Tiny Tiny RSS</title>
<?php
require_once "lib/Mobile_Detect.php";
$mobile = new Mobile_Detect();
if ($mobile->isMobile() || @$_REQUEST['mode'] == 'mobile') {
$_SESSION["digest_mobile"] = 1;
echo stylesheet_tag("plugins/digest/mobile.css");
} else {
$_SESSION["digest_mobile"] = 0;
echo stylesheet_tag("plugins/digest/digest.css");
}
?>
<meta name="viewport" content="width=device-width,
minimum-scale=1.0, maximum-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<?php print_user_stylesheet(); ?>
<link rel="shortcut icon" type="image/png" href="images/favicon.png"/>
<?php
foreach (array("lib/prototype.js",
"lib/scriptaculous/scriptaculous.js?load=effects,dragdrop,controls",
"js/functions.js",
"plugins/digest/digest.js",
"errors.php?mode=js") as $jsfile) {
echo javascript_tag($jsfile);
} ?>
<script type="text/javascript">
<?php init_js_translations(); ?>
</script>
<script type="text/javascript" src="plugins/digest/digest.js"></script>
<script type="text/javascript">
Event.observe(window, 'load', function() {
init(<?php echo $_SESSION["digest_mobile"] ?>);
});
</script>
</head>
<body id="ttrssDigest">
<div id="overlay" style="display : block">
<div id="overlay_inner">
<noscript>
<p>
<?php print_error(__("Your browser doesn't support Javascript, which is required for this application to function properly. Please check your browser settings.")) ?></p>
</noscript>
<img src="images/indicator_white.gif"/>
<?php echo __("Loading, please wait...") ?>
</div>
</div>
<div id="header">
<a style="float : left" href="#" onclick="go_back()">
<?php echo __("Go back") ?></a>
<div class="links">
<?php if (!$_SESSION["hide_hello"]) { ?>
<?php echo __('Hello,') ?> <b><?php echo $_SESSION["name"] ?></b> |
<?php } ?>
<?php if (!$_SESSION["hide_logout"]) { ?>
<a href="backend.php?op=logout"><?php echo __('Logout') ?></a> |
<?php } ?>
<a href='<?php echo get_self_url_prefix() ?>/index.php?mobile=false'>
<?php echo __("Regular version") ?></a>
</div>
</div>
<div id="article"><div id="article-content">&nbsp;</div></div>
<div id="content">
<div id="feeds">
<ul id="feeds-content"> </ul>
</div>
<div id="headlines">
<ul id="headlines-content"> </ul>
</div>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 958 B

View File

@ -1,109 +0,0 @@
<?php
// TODO: digest should register digest specific hotkey actions within tt-rss
class Digest extends Plugin implements IHandler {
private $host;
function about() {
return array(1.0,
"Digest mode for tt-rss (tablet friendly UI)",
"fox",
true);
}
function init($host) {
$this->link = $host->get_link();
$this->host = $host;
$host->add_handler("digest", "*", $this);
}
function index() {
header("Content-type: text/html; charset=utf-8");
login_sequence();
require_once dirname(__FILE__) . "/digest_body.php";
}
/* function get_js() {
return file_get_contents(dirname(__FILE__) . "/digest.js");
} */
function csrf_ignore($method) {
return in_array($method, array("index"));
}
function before($method) {
return true;
}
function after() {
}
function digestgetcontents() {
$article_id = db_escape_string($_REQUEST['article_id']);
$result = db_query("SELECT content,title,link,marked,published
FROM ttrss_entries, ttrss_user_entries
WHERE id = '$article_id' AND ref_id = id AND owner_uid = ".$_SESSION['uid']);
$content = sanitize(db_fetch_result($result, 0, "content"));
$title = strip_tags(db_fetch_result($result, 0, "title"));
$article_url = htmlspecialchars(db_fetch_result($result, 0, "link"));
$marked = sql_bool_to_bool(db_fetch_result($result, 0, "marked"));
$published = sql_bool_to_bool(db_fetch_result($result, 0, "published"));
print json_encode(array("article" =>
array("id" => $article_id, "url" => $article_url,
"tags" => get_article_tags($article_id),
"marked" => $marked, "published" => $published,
"title" => $title, "content" => $content)));
}
function digestupdate() {
$feed_id = db_escape_string($_REQUEST['feed_id']);
$offset = db_escape_string($_REQUEST['offset']);
$seq = db_escape_string($_REQUEST['seq']);
if (!$feed_id) $feed_id = -4;
if (!$offset) $offset = 0;
$reply = array();
$reply['seq'] = $seq;
$headlines = API::api_get_headlines($feed_id, 30, $offset,
'', ($feed_id == -4), true, false, "unread", "updated DESC", 0, 0);
$reply['headlines'] = array();
$reply['headlines']['title'] = getFeedTitle($feed_id);
$reply['headlines']['content'] = $headlines;
print json_encode($reply);
}
function digestinit() {
$tmp_feeds = API::api_get_feeds(-4, true, false, 0);
$params = array();
$feeds = array();
foreach ($tmp_feeds as $f) {
if ($f['id'] > 0 || $f['id'] == -4) array_push($feeds, $f);
}
if ($_REQUEST["init"] == 1) {
$params["hotkeys"] = get_hotkeys_map();
}
$params["feeds"] = $feeds;
print json_encode($params);
}
function api_version() {
return 2;
}
}
?>

View File

@ -1,345 +0,0 @@
body#ttrssDigest {
color : black;
font-family : sans-serif;
font-size : 12px;
margin : 0px;
background : url("images/tile.png");
}
a {
color : #0069D8;
text-decoration : none;
}
a:hover {
color : gray;
}
#header a, #footer a {
color : gray;
}
#header a:hover, #footer a:hover {
color : #0069D8;
}
#header {
font-size : 14px;
font-weight : bold;
font-family : "Segoe UI", Tahoma, sans-serif;
padding : 5px 5px 5px 1.5em;
color : gray;
position : absolute;
top : 0px;
height : 30px;
left : 0px;
right : 0px;
color : #a0a0a0;
}
#header span.title {
font-weight : bold;
font-style : italic;
}
#header div.links {
position : absolute;
right : 1.5em;
}
#search {
float : right;
clear : left;
}
#title {
}
#latest {
padding : 5px;
}
#content {
position : absolute;
left : 0px;
top : 30px;
right : 0px;
bottom : 0px;
-webkit-transition: left 0.2s linear, right 0.2s linear;
-moz-transition: left 0.2s linear, right 0.2s linear;
transition: left 0.2s linear, right 0.2s linear;
}
#article {
position : absolute;
overflow : auto;
right : 0px;
width : 100%;
bottom : 0px;
top : 30px;
background : white;
opacity : 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
#article.visible {
opacity : 1;
}
#article #article-content h1 {
margin : 0px;
padding : 0px;
font-family : "Segoe UI", Tahoma, sans-serif;
font-size : 21px;
font-weight : bold;
border-width : 0px 0px 3px 0px;
border-style : solid;
border-color : #e0e0e0;
color : gray;
}
#article #article-content #toolbar {
border-width : 0px 0px 1px 0px;
border-color : #e0e0e0;
border-style : solid;
background : #fafafa;
font-size : 14px;
font-weight : bold;
padding : 5px 10px 5px 10px;
margin : 0px 0px 0px 0px;
}
#article #article-content {
padding : 0px;
font-size : 16px;
}
#article #article-content #tags {
color : #a0a0a0;
margin-bottom : 5px;
}
#article #article-content #ops {
float : right;
}
#article #article-content #ops img {
cursor : pointer;
margin-right : 0px;
margin-left : 10px;
}
#article #article-content #inner {
padding : 10px;
}
#article #article-content img {
max-width : 90%;
}
#content.move {
left : 0px;
right : 100%;
}
#feeds {
position : absolute;
left : 0px;
top : 0px;
right : 0px;
bottom : 0px;
font-size : 14px;
overflow : auto;
background : white;
}
#feeds ul#feeds-content img {
width : 16px;
height : 16px;
vertical-align : middle;
margin-right : 5px;
}
#feeds ul#feeds-content div.unread-ctr {
color : #d0d0d0;
padding-left : 10px;
float : right;
}
#feeds ul#feeds-content li {
padding : 10px;
clear : both;
cursor : pointer;
color : #303030;
white-space : nowrap;
}
#feeds ul#feeds-content li.selected {
background : white;
}
#feeds ul#feeds-content {
list-style-type : none;
font-weight : bold;
margin : 0px;
padding : 0px;
}
#headlines {
font-size : 14px;
position : absolute;
top : 0px;
bottom : 0px;
right : 0px;
overflow : auto;
background : white;
border-width : 0px 3px 0px 0px;
border-style : solid;
border-color : #88b0f0;
left : 100%;
-webkit-transition: left 0.2s linear, right 0.2s linear;
-moz-transition: left 0.2s linear, right 0.2s linear;
transition: left 0.2s linear, right 0.2s linear;
}
#headlines.move {
left : 0px;
}
#headlines h1 a {
color : #684C99;
}
#headlines ul#headlines-content .cb {
vertical-align : middle;
margin-right : 5px;
float : left;
}
#headlines ul#headlines-content img.icon {
width : 16px;
height : 16px;
vertical-align : middle;
margin-right : 5px;
float : right;
}
#headlines ul#headlines-content {
list-style-type : none;
color : gray;
margin : 0px;
padding : 0px;
}
#headlines ul#headlines-content li {
margin : 0px 0px 0px 0px;
padding : 10px;
color : gray;
clear : left;
border-width : 0px 0px 1px 0px;
border-style : solid;
border-color : #e0e0e0;
background : #eee;
}
#headlines ul#headlines-content a.title {
font-size : 14px;
font-weight : bold;
display : block;
margin-left : 21px;
position : relative;
}
#headlines ul#headlines-content li.fresh a.title {
color : #007FFF;
}
#headlines ul#headlines-content li.unread a.title {
color : black;
/* color : #8DB1D6; */
}
#headlines ul#headlines-content li.read a.title {
color : gray;
}
#headlines ul#headlines-content li.unread,
#headlines ul#headlines-content li.fresh {
background-color : white;
}
#headlines ul#headlines-content li.selected {
background-color : #fff7d5;
border-color : white white #e0e0e0;
}
#headlines ul#headlines-content img#H-LOADING-IMG {
margin-left : 5px;
}
#headlines ul#headlines-content div.excerpt {
color : #404040;
cursor : pointer;
margin-top : 5px;
}
#headlines ul#headlines-content div.content {
color : #404040;
}
#headlines ul#headlines-content div.content img {
max-width : 75%;
}
#headlines ul#headlines-content div.body {
margin-left : 21px;
/*margin-left : 42px;*/
}
#headlines ul#headlines-content div.info {
font-size : 11px;
margin-top : 5px;
}
#headlines ul#headlines-content div.info a {
color : gray;
}
#overlay {
background : white;
left : 0;
top : 0;
height : 100%;
width : 100%;
z-index : 100;
position : absolute;
text-align : center;
}
#overlay_inner {
margin : 1em;
}
#overlay img {
vertical-align : middle;
}
div.fatalError button {
margin-top : 5px;
}
div.fatalError textarea {
width : 100%;
height : 100px;
}
div.insensitive {
color : gray;
}

View File

@ -1,28 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
$id = db_escape_string($_REQUEST["id"]);
$feed_id = db_escape_string($_REQUEST["feed"]);
$cat_id = db_escape_string($_REQUEST["cat"]);
$is_cat = db_escape_string($_REQUEST["is_cat"]);
render_article($id, $feed_id, $cat_id, $is_cat);
?>

View File

@ -1,59 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
define('MOBILE_VERSION', true);
require_once "config.php";
require_once "mobile-functions.php";
require_once "functions.php";
require_once "sessions.php";
require_once "version.php";
require_once "db-prefs.php";
if (!$_SESSION["uid"]) return;
$op = $_REQUEST["op"];
switch ($op) {
case "toggleMarked":
$cmode = db_escape_string($_REQUEST["mark"]);
$id = db_escape_string($_REQUEST["id"]);
markArticlesById(array($id), $cmode);
break;
case "togglePublished":
$cmode = db_escape_string($_REQUEST["pub"]);
$id = db_escape_string($_REQUEST["id"]);
publishArticlesById(array($id), $cmode);
break;
case "toggleUnread":
$cmode = db_escape_string($_REQUEST["unread"]);
$id = db_escape_string($_REQUEST["id"]);
catchupArticlesById(array($id), $cmode);
break;
case "setPref":
$id = db_escape_string($_REQUEST["id"]);
$value = db_escape_string($_REQUEST["to"]);
mobile_set_pref($id, $value);
print_r($_SESSION);
break;
default:
print json_encode(array("error", "UNKNOWN_METHOD"));
break;
}
?>

View File

@ -1,25 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
$cat_id = db_escape_string($_REQUEST["id"]);
render_category($cat_id);
?>

View File

@ -1,29 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
$feed_id = db_escape_string($_REQUEST["id"]);
$cat_id = db_escape_string($_REQUEST["cat"]);
$offset = (int) db_escape_string($_REQUEST["skip"]);
$search = db_escape_string($_REQUEST["search"]);
$is_cat = (bool) db_escape_string($_REQUEST["is_cat"]);
render_headlines_list($feed_id, $cat_id, $offset, $search, $is_cat);
?>

View File

@ -1,29 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
$use_cats = mobile_get_pref('ENABLE_CATS');
$offset = (int) db_escape_string($_REQUEST["skip"]);
if ($use_cats) {
render_categories_list($link);
} else {
render_flat_feed_list($offset);
}
?>

View File

@ -1,86 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tiny Tiny RSS</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
<link rel="apple-touch-icon" href="iui/iui-logo-touch-icon.png" />
<meta name="apple-touch-fullscreen" content="YES" />
<style type="text/css" media="screen">@import "iui/iui.css";</style>
<script type="application/x-javascript" src="iui/iui.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" src="../../lib/prototype.js"></script>
<script type="text/javascript" src="mobile.js"></script>
<style type="text/css" media="screen">@import "mobile.css";</style>
</head>
<style type="text/css">
img { max-width : 75%; }
li.oldItem {
color : gray;
}
#myBackButton {
display: none;
left: 6px;
right: auto;
padding: 0;
max-width: 55px;
border-width: 0 8px 0 14px;
-webkit-border-image: url(iui/backButton.png) 0 8 0 14;
}
img.tinyIcon {
max-width : 16px;
max-height : 16px;
margin-right : 10px;
vertical-align : middle;
}
a img {
border-width : 0px;
}
</style>
<body>
<div class="toolbar">
<h1 id="pageTitle"></h1>
<a id="myBackButton" class="button" href="#"></a>
<a class="button" href="prefs.php">Preferences</a>
</div>
<?php
$use_cats = mobile_get_pref('ENABLE_CATS');
$offset = (int) db_escape_string($_REQUEST["skip"]);
if ($use_cats) {
render_categories_list($link);
} else {
render_flat_feed_list($offset);
}
?>
</body>
</html>

View File

@ -1,45 +0,0 @@
<?php
class Mobile extends Plugin implements IHandler {
private $host;
function about() {
return array(1.0,
"Classic mobile version for tt-rss (unsupported)",
"fox",
true);
}
function init($host) {
$this->host = $host;
$host->add_handler("mobile", "index", $this);
}
function index() {
header("Content-type: text/html; charset=utf-8");
header("Location: plugins/mobile/index.php");
}
/* function get_js() {
return file_get_contents(dirname(__FILE__) . "/digest.js");
} */
function csrf_ignore($method) {
return true; //in_array($method, array("index"));
}
function before($method) {
return true;
}
function after() {
}
function api_version() {
return 2;
}
}
?>

View File

@ -1,21 +0,0 @@
Copyright (c) 2007-2009, iUI Project Members
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the iUI Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,33 +0,0 @@
NOTICE.txt - iUI credits and copyright notices
iUI is Copyright (c) 2007-2009 by the iUI project members:
M. Sean Gilligan (msgilligan)
Past members:
Joe Hewitt (joehewitt)
Christopher Allen (ChristopherA)
CREDITS
schlueter - committed fixes for issues #9, #11, #63 -- added samples
??? - created iUI icon
kris.tate - named it "iUI", created Google Code project, initial checkin
others - let us know if we missed you
iUI users - thanks for your patience, feedback, and bug reports
THIRD PARTY COMPONENTS
* iUI includes software developed by the Mozilla Project
Copyright (c) 1997-2007, Netscape Communications Corporation and others.
All rights reserved.
http://www.mozilla.org/rhino/
* iUI includes software developed by the Dojo Foundation
http://dojotoolkit.org/docs/shrinksafe
* iUI includes software developed by LCA Soft Ltd.
http://www.lcasoft.com/compress-js.html
* iUI includes software developed by the ant-googlcode Project
http://code.google.com/p/ant-googlecode/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,398 +0,0 @@
/* iui.css (c) 2007-9 by iUI Project Members, see LICENSE.txt for license */
body {
margin: 0;
font-family: Helvetica;
background: #FFFFFF;
color: #000000;
overflow-x: hidden;
-webkit-user-select: none;
-webkit-text-size-adjust: none;
}
body > *:not(.toolbar) {
display: none;
position: absolute;
margin: 0;
padding: 0;
left: 0;
top: 45px;
width: 100%;
min-height: 372px;
-webkit-transition-duration: 300ms;
-webkit-transition-property: -webkit-transform;
-webkit-transform: translateX(0%);
}
body[orient="landscape"] > *:not(.toolbar) {
min-height: 268px;
}
body > *[selected="true"] {
display: block;
}
a[selected], a:active {
background-color: #194fdb !important;
background-image: url(listArrowSel.png), url(selection.png) !important;
background-repeat: no-repeat, repeat-x;
background-position: right center, left top;
color: #FFFFFF !important;
}
a[selected="progress"] {
background-image: url(loading.gif), url(selection.png) !important;
}
/************************************************************************************************/
body > .toolbar {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
border-bottom: 1px solid #2d3642;
border-top: 1px solid #6d84a2;
padding: 10px;
height: 45px;
background: url(toolbar.png) #6d84a2 repeat-x;
}
.toolbar > h1 {
position: absolute;
overflow: hidden;
left: 50%;
margin: 1px 0 0 -75px;
height: 45px;
font-size: 20px;
width: 150px;
font-weight: bold;
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
color: #FFFFFF;
}
body[orient="landscape"] > .toolbar > h1 {
margin-left: -125px;
width: 250px;
}
.button {
position: absolute;
overflow: hidden;
top: 8px;
right: 6px;
margin: 0;
border-width: 0 5px;
padding: 0 3px;
width: auto;
height: 30px;
line-height: 30px;
font-family: inherit;
font-size: 12px;
font-weight: bold;
color: #FFFFFF;
text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
text-overflow: ellipsis;
text-decoration: none;
white-space: nowrap;
background: none;
-webkit-border-image: url(toolButton.png) 0 5 0 5;
}
.blueButton {
-webkit-border-image: url(blueButton.png) 0 5 0 5;
border-width: 0 5px;
}
.leftButton {
left: 6px;
right: auto;
}
#backButton {
display: none;
left: 6px;
right: auto;
padding: 0;
max-width: 55px;
border-width: 0 8px 0 14px;
-webkit-border-image: url(backButton.png) 0 8 0 14;
}
.whiteButton,
.redButton,
.grayButton {
display: block;
border-width: 0 12px;
padding: 10px;
text-align: center;
font-size: 20px;
font-weight: bold;
text-decoration: inherit;
color: inherit;
}
.whiteButton {
-webkit-border-image: url(whiteButton.png) 0 12 0 12;
text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
}
.redButton {
-webkit-border-image: url(redButton.png) 0 12 0 12;
color:#fff;
text-shadow: #7a0001 0 -1px 0;
}
.grayButton {
-webkit-border-image: url(grayButton.png) 0 12 0 12;
color: #FFFFFF;
}
/************************************************************************************************/
body > ul > li {
position: relative;
margin: 0;
border-bottom: 1px solid #E0E0E0;
padding: 8px 0 8px 10px;
font-size: 20px;
font-weight: bold;
list-style: none;
}
body > ul > li.group {
position: relative;
top: -1px;
margin-bottom: -2px;
border-top: 1px solid #7d7d7d;
border-bottom: 1px solid #999999;
padding: 1px 10px;
background: url(listGroup.png) repeat-x;
font-size: 17px;
font-weight: bold;
text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
color: #FFFFFF;
}
body > ul > li.group:first-child {
top: 0;
border-top: none;
}
body > ul > li > a {
display: block;
margin: -8px 0 -8px -10px;
padding: 8px 32px 8px 10px;
text-decoration: none;
color: inherit;
background: url(listArrow.png) no-repeat right center;
}
a[target="_replace"] {
box-sizing: border-box;
-webkit-box-sizing: border-box;
padding-top: 25px;
padding-bottom: 25px;
font-size: 18px;
color: cornflowerblue;
background-color: #FFFFFF;
background-image: none;
}
/************************************************************************************************/
body > .dialog {
top: 0;
width: 100%;
min-height: 417px;
z-index: 2;
background: rgba(0, 0, 0, 0.8);
padding: 0;
text-align: right;
}
.dialog > fieldset {
box-sizing: border-box;
-webkit-box-sizing: border-box;
width: 100%;
margin: 0;
border: none;
border-top: 1px solid #6d84a2;
padding: 10px 6px;
background: url(toolbar.png) #7388a5 repeat-x;
}
.dialog > fieldset > h1 {
margin: 0 10px 0 10px;
padding: 0;
font-size: 20px;
font-weight: bold;
color: #FFFFFF;
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
text-align: center;
}
.dialog > fieldset > label {
position: absolute;
margin: 16px 0 0 6px;
font-size: 14px;
color: #999999;
}
/*input:not(input[type|=radio]):not(input[type|=checkbox]) {*/
input[type|=text], input[type|=password] {
box-sizing: border-box;
-webkit-box-sizing: border-box;
width: 100%;
margin: 8px 0 0 0;
padding: 6px 6px 6px 44px;
font-size: 16px;
font-weight: normal;
}
/************************************************************************************************/
body > .panel {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
padding: 10px;
background: #c8c8c8 url(pinstripes.png);
}
.panel > fieldset {
position: relative;
margin: 0 0 20px 0;
padding: 0;
background: #FFFFFF;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border: 1px solid #999999;
text-align: right;
font-size: 16px;
}
.row {
position: relative;
min-height: 42px;
border-bottom: 1px solid #999999;
-webkit-border-radius: 0;
text-align: left;
}
fieldset > .row:last-child {
border-bottom: none !important;
}
/*.row > input:not(input[type|=radio]):not(input[type|=checkbox]) {*/
.row > input[type|=text], .row > input[type|=password] {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
margin: 0;
border: none;
padding: 12px 10px 0 110px;
/* height: 42px;*/
background: none;
}
.row > input[type|=radio], .row > input[type|=checkbox] {
margin: 7px 7px 0 0;
height: 25px;
width: 25px;
}
.row > label {
position: absolute;
margin: 0 0 0 14px;
line-height: 42px;
font-weight: bold;
}
.row > span {
position: absolute;
padding: 12px 10px 0 110px;
margin: 0;
}
.row > .toggle {
position: absolute;
top: 6px;
right: 6px;
width: 100px;
height: 28px;
}
.toggle {
border: 1px solid #888888;
-webkit-border-radius: 6px;
background: #FFFFFF url(toggle.png) repeat-x;
font-size: 19px;
font-weight: bold;
line-height: 30px;
}
.toggle[toggled="true"] {
border: 1px solid #143fae;
background: #194fdb url(toggleOn.png) repeat-x;
}
.toggleOn {
display: none;
position: absolute;
width: 60px;
text-align: center;
left: 0;
top: 0;
color: #FFFFFF;
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
}
.toggleOff {
position: absolute;
width: 60px;
text-align: center;
right: 0;
top: 0;
color: #666666;
}
.toggle[toggled="true"] > .toggleOn {
display: block;
}
.toggle[toggled="true"] > .toggleOff {
display: none;
}
.thumb {
position: absolute;
top: -1px;
left: -1px;
width: 40px;
height: 28px;
border: 1px solid #888888;
-webkit-border-radius: 6px;
background: #ffffff url(thumb.png) repeat-x;
}
.toggle[toggled="true"] > .thumb {
left: auto;
right: -1px;
}
.panel > h2 {
margin: 0 0 8px 14px;
font-size: inherit;
font-weight: bold;
color: #4d4d70;
text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0;
}
/************************************************************************************************/
#preloader {
display: none;
background-image: url(loading.gif), url(selection.png),
url(blueButton.png), url(listArrowSel.png), url(listGroup.png);
}

View File

@ -1,542 +0,0 @@
/*
Copyright (c) 2007-9, iUI Project Members
See LICENSE.txt for licensing terms
*/
(function() {
var slideSpeed = 20;
var slideInterval = 0;
var currentPage = null;
var currentDialog = null;
var currentWidth = 0;
var currentHash = location.hash;
var hashPrefix = "#_";
var pageHistory = [];
var newPageCount = 0;
var checkTimer;
var hasOrientationEvent = false;
var portraitVal = "portrait";
var landscapeVal = "landscape";
// *************************************************************************************************
window.iui =
{
animOn: true, // Slide animation with CSS transition is now enabled by default where supported
showPage: function(page, backwards)
{
if (page)
{
if (currentDialog)
{
currentDialog.removeAttribute("selected");
currentDialog = null;
}
if (hasClass(page, "dialog"))
showDialog(page);
else
{
var fromPage = currentPage;
currentPage = page;
if (fromPage)
setTimeout(slidePages, 0, fromPage, page, backwards);
else
updatePage(page, fromPage);
}
}
},
showPageById: function(pageId)
{
var page = $(pageId);
if (page)
{
var index = pageHistory.indexOf(pageId);
var backwards = index != -1;
if (backwards)
pageHistory.splice(index, pageHistory.length);
iui.showPage(page, backwards);
}
},
showPageByHref: function(href, args, method, replace, cb, bw)
{
var req = new XMLHttpRequest();
req.onerror = function()
{
if (cb)
cb(false);
};
req.onreadystatechange = function()
{
if (req.readyState == 4)
{
if (replace)
replaceElementWithSource(replace, req.responseText);
else
{
var frag = document.createElement("div");
frag.innerHTML = req.responseText;
iui.insertPages(frag.childNodes, bw);
}
if (cb)
setTimeout(cb, 1000, true);
}
};
if (args)
{
req.open(method || "GET", href, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-Length", args.length);
req.send(args.join("&"));
}
else
{
req.open(method || "GET", href, true);
req.send(null);
}
},
insertPages: function(nodes, bw)
{
var targetPage;
for (var i = 0; i < nodes.length; ++i)
{
var child = nodes[i];
if (child.nodeType == 1)
{
if (!child.id)
child.id = "__" + (++newPageCount) + "__";
var clone = $(child.id);
if (clone)
clone.parentNode.replaceChild(child, clone);
else
document.body.appendChild(child);
if (child.getAttribute("selected") == "true" || !targetPage)
targetPage = child;
--i;
}
}
if (targetPage)
iui.showPage(targetPage, bw);
},
getSelectedPage: function()
{
for (var child = document.body.firstChild; child; child = child.nextSibling)
{
if (child.nodeType == 1 && child.getAttribute("selected") == "true")
return child;
}
},
isNativeUrl: function(href)
{
for(var i = 0; i < iui.nativeUrlPatterns.length; i++)
{
if(href.match(iui.nativeUrlPatterns[i])) return true;
}
return false;
},
nativeUrlPatterns: [
new RegExp("^http:\/\/maps.google.com\/maps\?"),
new RegExp("^mailto:"),
new RegExp("^tel:"),
new RegExp("^http:\/\/www.youtube.com\/watch\\?v="),
new RegExp("^http:\/\/www.youtube.com\/v\/"),
new RegExp("^javascript:"),
]
};
// *************************************************************************************************
addEventListener("load", function(event)
{
var page = iui.getSelectedPage();
var locPage = getPageFromLoc();
if (page)
iui.showPage(page);
if (locPage && (locPage != page))
iui.showPage(locPage);
setTimeout(preloadImages, 0);
if (typeof window.onorientationchange == "object")
{
window.onorientationchange=orientChangeHandler;
hasOrientationEvent = true;
setTimeout(orientChangeHandler, 0);
}
setTimeout(checkOrientAndLocation, 0);
checkTimer = setInterval(checkOrientAndLocation, 300);
}, false);
addEventListener("unload", function(event)
{
return;
}, false);
addEventListener("click", function(event)
{
var link = findParent(event.target, "a");
if (link)
{
function unselect() { link.removeAttribute("selected"); }
if (link.href && link.hash && link.hash != "#" && !link.target)
{
link.setAttribute("selected", "true");
iui.showPage($(link.hash.substr(1)));
setTimeout(unselect, 500);
}
else if (link == $("backButton"))
history.back();
else if (link.getAttribute("type") == "submit")
{
var form = findParent(link, "form");
if (form.target == "_self")
{
form.submit();
return; // return so we don't preventDefault
}
submitForm(form);
}
else if (link.getAttribute("type") == "cancel")
cancelDialog(findParent(link, "form"));
else if (link.target == "_replace")
{
link.setAttribute("selected", "progress");
iui.showPageByHref(link.href, null, null, link, unselect);
}
else if (iui.isNativeUrl(link.href))
{
return;
}
else if (link.target == "_webapp")
{
location.href = link.href;
}
else if (!link.target)
{
link.setAttribute("selected", "progress");
var bw = link.getAttribute("backwards");
iui.showPageByHref(link.href, null, null, null, unselect, bw);
}
else
return;
event.preventDefault();
}
}, true);
addEventListener("click", function(event)
{
var div = findParent(event.target, "div");
if (div && hasClass(div, "toggle"))
{
div.setAttribute("toggled", div.getAttribute("toggled") != "true");
event.preventDefault();
}
}, true);
function getPageFromLoc()
{
var page;
var result = location.hash.match(/#_([^\?_]+)/);
if (result)
page = result[1];
if (page)
page = $(page);
return page;
}
function orientChangeHandler()
{
var orientation=window.orientation;
switch(orientation)
{
case 0:
setOrientation(portraitVal);
break;
case 90:
case -90:
setOrientation(landscapeVal);
break;
}
}
function checkOrientAndLocation()
{
if (!hasOrientationEvent)
{
if (window.innerWidth != currentWidth)
{
currentWidth = window.innerWidth;
var orient = currentWidth == 320 ? portraitVal : landscapeVal;
setOrientation(orient);
}
}
if (location.hash != currentHash)
{
var pageId = location.hash.substr(hashPrefix.length);
iui.showPageById(pageId);
}
}
function setOrientation(orient)
{
document.body.setAttribute("orient", orient);
setTimeout(scrollTo, 100, 0, 1);
}
function showDialog(page)
{
currentDialog = page;
page.setAttribute("selected", "true");
if (hasClass(page, "dialog") && !page.target)
showForm(page);
}
function showForm(form)
{
form.onsubmit = function(event)
{
event.preventDefault();
submitForm(form);
};
form.onclick = function(event)
{
if (event.target == form && hasClass(form, "dialog"))
cancelDialog(form);
};
}
function cancelDialog(form)
{
form.removeAttribute("selected");
}
function updatePage(page, fromPage)
{
if (!page.id)
page.id = "__" + (++newPageCount) + "__";
location.hash = currentHash = hashPrefix + page.id;
pageHistory.push(page.id);
var pageTitle = $("pageTitle");
if (page.title)
pageTitle.innerHTML = page.title;
if (page.localName.toLowerCase() == "form" && !page.target)
showForm(page);
var backButton = $("backButton");
if (backButton)
{
var prevPage = $(pageHistory[pageHistory.length-2]);
if (prevPage && !page.getAttribute("hideBackButton"))
{
backButton.style.display = "inline";
backButton.innerHTML = prevPage.title ? prevPage.title : "Back";
}
else
backButton.style.display = "none";
}
var backButton = $("myBackButton");
if (backButton)
{
var label = page.getAttribute("myBackLabel");
if (label)
{
backButton.style.display = "inline";
backButton.innerHTML = label;
backButton.href = page.getAttribute("myBackHref");
//backButton.target = page.getAttribute("myBackTarget");
target = page.getAttribute("myBackTarget");
if (target == null)
backButton.target = '';
else
backButton.target = target;
backButton.setAttribute("backwards", "true");
}
else
backButton.style.display = "none";
}
}
function slidePages(fromPage, toPage, backwards)
{
var axis = (backwards ? fromPage : toPage).getAttribute("axis");
clearInterval(checkTimer);
if (canDoSlideAnim() && axis != 'y')
{
slide2(fromPage, toPage, backwards, slideDone);
}
else
{
slide1(fromPage, toPage, backwards, axis, slideDone);
}
function slideDone()
{
if (!hasClass(toPage, "dialog"))
fromPage.removeAttribute("selected");
checkTimer = setInterval(checkOrientAndLocation, 300);
setTimeout(updatePage, 0, toPage, fromPage);
fromPage.removeEventListener('webkitTransitionEnd', slideDone, false);
}
}
function canDoSlideAnim()
{
return (iui.animOn) && (typeof WebKitCSSMatrix == "object");
}
function slide1(fromPage, toPage, backwards, axis, cb)
{
if (axis == "y")
(backwards ? fromPage : toPage).style.top = "100%";
else
toPage.style.left = "100%";
scrollTo(0, 1);
toPage.setAttribute("selected", "true");
var percent = 100;
slide();
var timer = setInterval(slide, slideInterval);
function slide()
{
percent -= slideSpeed;
if (percent <= 0)
{
percent = 0;
clearInterval(timer);
cb();
}
if (axis == "y")
{
backwards
? fromPage.style.top = (100-percent) + "%"
: toPage.style.top = percent + "%";
}
else
{
fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%";
toPage.style.left = (backwards ? -percent : percent) + "%";
}
}
}
function slide2(fromPage, toPage, backwards, cb)
{
toPage.style.webkitTransitionDuration = '0ms'; // Turn off transitions to set toPage start offset
// fromStart is always 0% and toEnd is always 0%
// iPhone won't take % width on toPage
var toStart = 'translateX(' + (backwards ? '-' : '') + window.innerWidth + 'px)';
var fromEnd = 'translateX(' + (backwards ? '100%' : '-100%') + ')';
toPage.style.webkitTransform = toStart;
toPage.setAttribute("selected", "true");
toPage.style.webkitTransitionDuration = ''; // Turn transitions back on
function startTrans()
{
fromPage.style.webkitTransform = fromEnd;
toPage.style.webkitTransform = 'translateX(0%)'; //toEnd
}
fromPage.addEventListener('webkitTransitionEnd', cb, false);
setTimeout(startTrans, 0);
}
function preloadImages()
{
var preloader = document.createElement("div");
preloader.id = "preloader";
document.body.appendChild(preloader);
}
function submitForm(form)
{
iui.showPageByHref(form.action || "POST", encodeForm(form), form.method);
}
function encodeForm(form)
{
function encode(inputs)
{
for (var i = 0; i < inputs.length; ++i)
{
if (inputs[i].name)
args.push(inputs[i].name + "=" + escape(inputs[i].value));
}
}
var args = [];
encode(form.getElementsByTagName("input"));
encode(form.getElementsByTagName("textarea"));
encode(form.getElementsByTagName("select"));
return args;
}
function findParent(node, localName)
{
while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName))
node = node.parentNode;
return node;
}
function hasClass(self, name)
{
var re = new RegExp("(^|\\s)"+name+"($|\\s)");
return re.exec(self.getAttribute("class")) != null;
}
function replaceElementWithSource(replace, source)
{
var page = replace.parentNode;
var parent = replace;
while (page.parentNode != document.body)
{
page = page.parentNode;
parent = parent.parentNode;
}
var frag = document.createElement(parent.localName);
frag.innerHTML = source;
page.removeChild(parent);
while (frag.firstChild)
page.appendChild(frag.firstChild);
}
function $(id) { return document.getElementById(id); }
function ddd() { console.log.apply(console, arguments); }
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 978 B

View File

@ -1,58 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tiny Tiny RSS</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
<link rel="apple-touch-icon" href="iui/iui-logo-touch-icon.png" />
<meta name="apple-touch-fullscreen" content="YES" />
<style type="text/css" media="screen">@import "iui/iui.css";</style>
<script type="application/x-javascript" src="iui/iui.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<script type="text/javascript">
function do_login() {
var f = document.forms['login'];
f.submit();
}
</script>
<body>
<div class="toolbar">
<h1 id="pageTitle"></h1>
<a id="backButton" class="button" href="#"></a>
<a class="button blueButton" onclick='do_login()'><?php echo __('Log in') ?></a>
</div>
<form target="_self" title="Login" id="login" class="panel" name="login" selected="true"
action="../../public.php?return=<?php echo htmlspecialchars($_SERVER["REQUEST_URI"]) ?>"
method="post">
<input type="hidden" name="op" value="login">
<fieldset>
<div class="row">
<label><?php echo __("Login:") ?></label>
<input type="text" autocapitalize="off" name="login">
</div>
<div class="row">
<label><?php echo __("Password:") ?></label>
<input type="password" name="password">
</div>
</fieldset>
<div align='center'><a target='_self' href='<?php echo get_self_url_prefix() ?>/index.php?mobile=false'>
<?php echo __("Open regular version") ?></a>
</form>
</body>
</html>

View File

@ -1,15 +0,0 @@
<?php
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
require_once "mobile-functions.php";
logout_user();
header("Location: index.php");
?>

View File

@ -1,542 +0,0 @@
<?php
require_once "autoload.php";
require_once "functions.php";
require_once "sessions.php";
require_once "version.php";
require_once "db-prefs.php";
init_plugins();
define('TTRSS_SESSION_NAME', 'ttrss_m_sid');
/* TODO replace with interface to db-prefs */
function mobile_pref_toggled($id) {
if (get_pref("_MOBILE_$id"))
return "true";
else
return "";
}
function mobile_get_pref($id) {
//return $_SESSION["mobile-prefs"][$id];
return get_pref("_MOBILE_$id");
}
function mobile_set_pref($id, $value) {
//$_SESSION["mobile-prefs"][$id] = $value;
return set_pref("_MOBILE_$id", $value);
}
function mobile_feed_has_icon($id) {
return file_exists("../../".ICONS_DIR."/$id.ico");
}
function render_flat_feed_list($offset) {
$owner_uid = $_SESSION["uid"];
$limit = 0;
if (!$offset) $offset = 0;
if (mobile_get_pref("SORT_FEEDS_UNREAD")) {
$order_by = "unread DESC, title";
} else {
$order_by = "title";
}
if ($limit > 0) {
$limit_qpart = "LIMIT $limit OFFSET $offset";
} else {
$limit_qpart = "";
}
$result = db_query("SELECT id,
title,
(SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
WHERE feed_id = ttrss_feeds.id AND unread = true
AND ttrss_user_entries.ref_id = ttrss_entries.id
AND owner_uid = '$owner_uid') AS unread
FROM ttrss_feeds
WHERE
ttrss_feeds.owner_uid = '$owner_uid'
ORDER BY $order_by $limit_qpart");
if (!$offset) print '<ul id="home" title="'.__('Home').'" selected="true"
myBackLabel="'.__('Logout').'" myBackHref="logout.php" myBackTarget="_self">';
// print "<li><a href='#cat-actions'>".__('Actions...')."</a></li>";
$num_feeds = 0;
while ($line = db_fetch_assoc($result)) {
$id = $line["id"];
$unread = $line["unread"];
// $unread = rand(0, 100);
if ($unread > 0) {
$line["title"] = $line["title"] . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if (mobile_feed_has_icon($id)) {
$icon_url = "../../".ICONS_URL."/$id.ico";
} else {
$icon_url = "../../images/blank_icon.gif";
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
print "<li class='$class'><a href='feed.php?id=$id'>" .
"<img class='tinyIcon' src='$icon_url'/>".
$line["title"] . "</a></li>";
}
++$num_feeds;
}
/* $next_offset = $offset + $num_feeds;
print "<li><a href=\"home.php?skip=$next_offset\"
target=\"_replace\">Show more feeds...</a></li>"; */
if (!$offset) print "</ul>";
}
function render_category($cat_id, $offset) {
$owner_uid = $_SESSION["uid"];
if ($cat_id >= 0) {
if ($cat_id != 0) {
$cat_query = "cat_id = '$cat_id'";
} else {
$cat_query = "cat_id IS NULL";
}
if (mobile_get_pref("SORT_FEEDS_UNREAD")) {
$order_by = "unread DESC, title";
} else {
$order_by = "title";
}
$result = db_query("SELECT id,
title,
(SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
WHERE feed_id = ttrss_feeds.id AND unread = true
AND ttrss_user_entries.ref_id = ttrss_entries.id
AND owner_uid = '$owner_uid') as unread
FROM ttrss_feeds
WHERE
ttrss_feeds.owner_uid = '$owner_uid' AND
$cat_query
ORDER BY $order_by");
$title = getCategoryTitle($cat_id);
print "<ul id='cat-$cat_id' title='$title' myBackLabel='".__("Home")."'
myBackHref='home.php'>";
// print "<li><a href='#cat-actions'>".__('Actions...')."</a></li>";
while ($line = db_fetch_assoc($result)) {
$id = $line["id"];
$unread = $line["unread"];
// $unread = rand(0, 100);
if ($unread > 0) {
$line["title"] = $line["title"] . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if (mobile_feed_has_icon($id)) {
$icon_url = "../../".ICONS_URL."/$id.ico";
} else {
$icon_url = "../../images/blank_icon.gif";
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
print "<li class='$class'><a href='feed.php?id=$id&cat=$cat_id'>" .
"<img class='tinyIcon' src='$icon_url'/>".
$line["title"] . "</a></li>";
}
}
print "</ul>";
} else if ($cat_id == -1) {
$title = __('Special');
print "<ul id='cat--1' title='$title' myBackLabel='".__("Home")."'
myBackHref='home.php'>";
foreach (array(-4, -3, -1, -2, 0) as $id) {
$title = getFeedTitle($id);
$unread = getFeedUnread($id, false);
$icon = getFeedIcon($id);
if ($unread > 0) {
$title = $title . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
print "<li class='$class'>
<a href='feed.php?id=$id&cat=-1'>
<img class='tinyIcon' src='../$icon'/>$title</a></li>";
}
}
print "</ul>";
} else if ($cat_id == -2) {
$title = __('Labels');
print "<ul id='cat--2' title='$title' myBackLabel='".__("Home")."'
myBackHref='home.php'>";
$result = db_query("SELECT id, caption FROM ttrss_labels2
WHERE owner_uid = '$owner_uid'");
$label_data = array();
while ($line = db_fetch_assoc($result)) {
$id = label_to_feed_id($line["id"]);
$unread = getFeedUnread($id);
$title = $line["caption"];
if ($unread > 0) {
$title = $title . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
print "<li class='$class'>
<a href='feed.php?id=$id&cat=-2'>$title</a></li>";
}
}
print "</ul>";
}
}
function render_categories_list($link) {
$owner_uid = $_SESSION["uid"];
$cat_browse = mobile_get_pref("BROWSE_CATS");
print '<ul id="home" title="'.__('Home').'" selected="true"
myBackLabel="'.__('Logout').'" myBackHref="logout.php" myBackTarget="_self">';
// print "<li><a href='#searchForm'>Search...</a></li>";
foreach (array(-1, -2) as $id) {
$title = getCategoryTitle($id);
$unread = getFeedUnread($id, true);
if ($unread > 0) {
$title = $title . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if ($cat_browse)
print "<li class='$class'><a href='cat.php?id=$id'>$title</a></li>";
else
print "<li class='$class'><a href='feed.php?id=$id&is_cat=true'>$title</a></li>";
}
$result = db_query("SELECT
ttrss_feed_categories.id,
ttrss_feed_categories.title,
COUNT(ttrss_feeds.id) AS num_feeds
FROM ttrss_feed_categories, ttrss_feeds
WHERE ttrss_feed_categories.owner_uid = $owner_uid
AND ttrss_feed_categories.id = cat_id
GROUP BY ttrss_feed_categories.id,
ttrss_feed_categories.title
ORDER BY ttrss_feed_categories.title");
while ($line = db_fetch_assoc($result)) {
if ($line["num_feeds"] > 0) {
$unread = getFeedUnread($line["id"], true);
$id = $line["id"];
if ($unread > 0) {
$line["title"] = $line["title"] . " ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
if ($cat_browse)
print "<li class='$class'><a href='cat.php?id=$id'>" .
$line["title"] . "</a></li>";
else
print "<li class='$class'><a href='feed.php?id=$id&is_cat=true'>".
$line["title"] . "</a></li>";
}
}
}
$result = db_query("SELECT COUNT(*) AS nf FROM ttrss_feeds WHERE
cat_id IS NULL and owner_uid = '$owner_uid'");
$num_feeds = db_fetch_result($result, 0, "nf");
if ($num_feeds > 0) {
$unread = getFeedUnread(0, true);
$title = "Uncategorized";
if ($unread > 0) {
$title = "$title ($unread)";
$class = '';
} else {
$class = 'oldItem';
}
if ($unread > 0 || !mobile_get_pref("HIDE_READ")) {
if ($cat_browse)
print "<li class='$class'><a href='cat.php?id=0'>$title</a></li>";
else
print "<li class='$class'><a href='feed.php?id=0&is_cat=true'>$title</a></li>";
}
}
print "</ul>";
}
function render_headlines_list($feed_id, $cat_id, $offset, $search,
$is_cat = false) {
$feed_id = $feed_id;
$limit = 15;
$filter = '';
if (!mobile_get_pref("HIDE_READ"))
$view_mode = "all_articles";
else
$view_mode = 'adaptive';
if ($search) {
$search_mode = 'this_feed';
} else {
$search_mode = '';
}
$qfh_ret = queryFeedHeadlines($feed_id, $limit,
$view_mode, $is_cat, $search, $search_mode,
"score DESC, date_entered ".(mobile_get_pref('REVERSE_HEADLINES') ? 'ASC' : 'DESC'), $offset);
$result = $qfh_ret[0];
$feed_title = $qfh_ret[1];
if (!$offset) {
print "<form id=\"searchForm-$feed_id-$cat_id\" class=\"dialog\" method=\"POST\"
action=\"feed.php\">
<input type=\"hidden\" name=\"id\" value=\"$feed_id\">
<input type=\"hidden\" name=\"cat\" value=\"$cat_id\">
<fieldset>
<h1>Search</h1>
<a class=\"button leftButton\" type=\"cancel\">Cancel</a>
<a class=\"button blueButton\" type=\"submit\">Search</a>
<label>Search:</label>
<input id=\"search\" type=\"text\" name=\"search\"/>
</fieldset>
</form>";
if ($cat_id) {
$cat_title = getCategoryTitle($cat_id);
print "<ul id=\"feed-$feed_id\" title=\"$feed_title\" selected=\"true\"
myBackLabel='$cat_title' myBackHref='cat.php?id=$cat_id'>";
} else {
print "<ul id=\"feed-$feed_id\" title=\"$feed_title\" selected=\"true\"
myBackLabel='".__("Home")."' myBackHref='home.php'>";
}
print "<li><a href='#searchForm-$feed_id-$cat_id'>Search...</a></li>";
}
$num_headlines = 0;
while ($line = db_fetch_assoc($result)) {
$id = $line["id"];
$real_feed_id = $line["feed_id"];
if (sql_bool_to_bool($line["unread"])) {
$class = '';
} else {
$class = 'oldItem';
}
if (mobile_feed_has_icon($real_feed_id)) {
$icon_url = "../../".ICONS_URL."/$real_feed_id.ico";
} else {
$icon_url = "../../images/blank_icon.gif";
}
print "<li class='$class'><a href='article.php?id=$id&feed=$feed_id&cat=$cat_id&is_cat=$is_cat'>
<img class='tinyIcon' src='$icon_url'>";
print $line["title"];
print "</a></li>";
++$num_headlines;
}
if ($num_headlines == 0 && $search) {
$articles_url = "feed.php?id=$feed_id&cat=$cat_id&skip=$next_offset";
print "<li><a href=\"$articles_url\">" . __("Nothing found (click to reload feed).") . "</a></li>";
}
// print "<a target='_replace' href='feed.php?id=$feed_id&cat=$cat_id&skip=0'>Next $limit articles...</a>";
$next_offset = $offset + $num_headlines;
$num_unread = getFeedUnread($feed_id, $is_cat);
/* FIXME needs normal implementation */
if ($num_headlines > 0 && ($num_unread == 0 || $num_unread > $next_offset)) {
if ($is_cat) {
$articles_url = "feed.php?id=$feed_id&skip=$next_offset".
"&search=$search&is_cat=true";
} else {
$articles_url = "feed.php?id=$feed_id&cat=$cat_id&skip=$next_offset".
"&search=$search";
}
print "<li><a href=\"$articles_url\"
target=\"_replace\">Get more articles...</a></li>";
}
if (!$offset) print "</ul>";
}
function render_article($id, $feed_id, $cat_id, $is_cat) {
$query = "SELECT title,link,content,feed_id,comments,int_id,
marked,unread,published,
".SUBSTRING_FOR_DATE."(updated,1,16) as updated,
author
FROM ttrss_entries,ttrss_user_entries
WHERE id = '$id' AND ref_id = id AND owner_uid = " .
$_SESSION["uid"] ;
$result = db_query($query);
if (db_num_rows($result) != 0) {
$line = db_fetch_assoc($result);
$tmp_result = db_query("UPDATE ttrss_user_entries
SET unread = false,last_read = NOW()
WHERE ref_id = '$id'
AND owner_uid = " . $_SESSION["uid"]);
$updated_fmt = make_local_datetime($line['updated'], false);
$title = $line["title"];
$article_link = $line["link"];
if (!$is_cat)
$feed_title = getFeedTitle($feed_id);
else
$feed_title = getCategoryTitle($feed_id);
print "<div class=\"panel\" id=\"article-$id\" title=\"$title\"
selected=\"true\"
myBackLabel='$feed_title' myBackHref='feed.php?id=$feed_id&cat=$cat_id&is_cat=$is_cat'>";
if ($line['feed_id'] != $feed_id) {
$real_feed_title = getFeedTitle($line['feed_id']);
$real_feed_id = $line['feed_id'];
$feed_link = "(<a href=\"feed.php?id=$real_feed_id\">$real_feed_title</a>)";
}
// print "<fieldset>";
print "<div style='float : right'>($updated_fmt)</div>";
print "<h2><a target='_blank' href='$article_link'>$title</a> $feed_link</h2>";
print "<hr>";
/* print "<div class=\"row\">";
print "<label id='title'><a target='_blank' href='$article_link'>$title</a></label>";
print "</div>"; */
$is_starred = (sql_bool_to_bool($line["marked"])) ? "true" : "false";
$is_published = (sql_bool_to_bool($line["published"])) ? "true" : "false";
//print "<div class=\"row\">";
//print "<label id='updated'>Updated:</label>";
//print "<input type='text' enabled='false' name='updated' disabled value='$updated_fmt'/>";
//print "</div>";
// print "</fieldset>";
$content = sanitize($line["content"]);
$content = preg_replace("/href=/i", "target=\"_blank\" href=", $content);
if (!mobile_get_pref("SHOW_IMAGES")) {
$content = preg_replace('/<img[^>]+>/is', '', $content);
}
print "<p>$content</p>";
print "<div class='nav'>
<label>Navigation</label>
<div class='button left' onclick='goPrev($id, $feed_id, this)'>Prev</div>
<div class='button right' onclick='goNext($id, $feed_id, this)'>Next</div>
</div>";
print "<fieldset>";
print "<div class=\"row\">
<label>Starred</label>
<div class=\"toggle\" onclick=\"toggleMarked($id, this)\" toggled=\"$is_starred\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>
</div>";
print "<div class=\"row\">
<label>Published</label>
<div class=\"toggle\" onclick=\"togglePublished($id, this)\" toggled=\"$is_published\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>
</div>";
print "<div class=\"row\">
<label>Unread</label>
<div class=\"toggle\" onclick=\"toggleUnread($id, this)\" toggled=\"$is_unread\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>
</div>";
print "</fieldset>";
print "</div>";
}
}
?>

View File

@ -1,38 +0,0 @@
div.nav {
height: 40px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
background-color: #ffffff;
border: 1px solid #999999;
text-align: center;
margin-bottom: 1em;
}
div.nav label {
line-height: 40px;
color: black;
font-weight: bold;
}
div.nav .button {
position: static;
margin: 5px 10px;
-webkit-border-image: url(../lib/iui/whiteButton.png) 0 12 0 12;
text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
color: black;
cursor: pointer; /* On a touch screen ? */
}
div.nav .button.left {
float: left;
}
div.nav .button.right {
float: right;
}
ul li a.read {
color: #666666;
}
ul li span.browse {
color : #909090;
text-align : right;
float : right;
}

View File

@ -1,163 +0,0 @@
var backend = "backend.php";
function toggleMarked(id, elem) {
var toggled = false;
if (elem.getAttribute("toggled") == "true") {
toggled = 1;
} else {
toggled = 0;
}
var query = "op=toggleMarked&id=" + id + "&mark=" + toggled;
new Ajax.Request(backend, {
parameters: query,
onComplete: function (transport) {
//
} });
}
function togglePublished(id, elem) {
var toggled = false;
if (elem.getAttribute("toggled") == "true") {
toggled = 1;
} else {
toggled = 0;
}
var query = "op=togglePublished&id=" + id + "&pub=" + toggled;
new Ajax.Request(backend, {
parameters: query,
onComplete: function (transport) {
//
} });
}
function toggleUnread(id, elem) {
var toggled = false;
if (elem.getAttribute("toggled") == "true") {
toggled = 1;
} else {
toggled = 0;
}
var query = "op=toggleUnread&id=" + id + "&unread=" + toggled;
new Ajax.Request(backend, {
parameters: query,
onComplete: function (transport) {
//
} });
}
function setPref(elem) {
var toggled = false;
var id = elem.id;
if (elem.getAttribute("toggled") == "true") {
toggled = 1;
} else {
toggled = 0;
}
var query = "op=setPref&id=" + id + "&to=" + toggled;
new Ajax.Request(backend, {
parameters: query,
onComplete: function (transport) {
//
} });
}
// Go directly to another item in the same feed
function goToSibling(article_id, feed_id, link, step) {
var links = linksInFeed(feed_id);
for (var i=0 ; i<links.length ; i++) {
var re = new RegExp(".*article\\.php\\?id="+article_id+"&.*");
if (!re.test(links[i].href)) continue;
// here, we've found the current article
var index = i + step;
if (index < 0) {
markAsRead(feed_id);
iui.showPage($("feed-"+feed_id), true);
return false;
}
if (index >= links.length) {
showRestOfFeed(feed_id);
return false;
}
console.log(links[index]);
var match = links[index].href.match(/.*article\.php\?(.*)/);
var qs = match[1];
var backwards = false;
if (step < 0) backwards = true;
link.setAttribute("selected", "progress");
function unselect() { link.removeAttribute("selected"); }
iui.showPageByHref("article.php?"+qs, null, null, null, unselect, backwards);
return false;
}
return false;
}
function goPrev(article_id, feed_id, link) {
return goToSibling(article_id, feed_id, link, -1);
}
function goNext(article_id, feed_id, link) {
return goToSibling(article_id, feed_id, link, 1);
}
// Get all the links in the feed. The all_links variable includes the "get more article" link
function linksInFeed(feed_id, all_links) {
var feed_content = $("feed-"+feed_id);
var links_raw = feed_content.getElementsByTagName("a");
if (all_links) return links_raw;
var links = [];
// filter the array to remove the "get more articles" link
// and the "search" link (which is always first)
for (var i=1 ; i<links_raw.length ; i++) {
if (links_raw[i].href.match(/.*article\.php\?id=.*/)) {
links.push(links_raw[i]);
}
}
return links;
}
// Adds the "read" class to all read links in the feed
function markAsRead(feed_id) {
var links = linksInFeed(feed_id);
for (var j=0 ; j<links.length ; j++) {
var match = links[j].href.match(/.*article\.php\?id=(\d+)&.*/);
if ($("article-"+match[1])) {
links[j].className = "read";
}
}
}
// Go the the articles list and expand the "get more articles" link
function showRestOfFeed(feed_id) {
var links_raw = linksInFeed(feed_id, true);
var lastlink = links_raw[links_raw.length - 1];
if (lastlink.target == "_replace") {
// It's a "get more articles" link
iui.showPage($("feed-"+feed_id), true);
// Mark old items a "read"
markAsRead(feed_id);
// Simulate click on the "get more articles" link
lastlink.setAttribute("selected", "progress");
function unselect() { lastlink.removeAttribute("selected"); }
setTimeout(window.scrollTo, 0, 0, 1000);
iui.showPageByHref(lastlink.href, null, null, lastlink, unselect);
} else {
iui.showPage($("home"), true);
}
}

View File

@ -1,60 +0,0 @@
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
header('Content-Type: text/html; charset=utf-8');
define('MOBILE_VERSION', true);
$basedir = dirname(dirname(dirname(__FILE__)));
set_include_path(
dirname(__FILE__) . PATH_SEPARATOR .
$basedir . PATH_SEPARATOR .
"$basedir/include" . PATH_SEPARATOR .
get_include_path());
$basedir = dirname(dirname(__FILE__));
require_once "config.php";
require_once "mobile-functions.php";
login_sequence(true);
?>
<div class="panel" id="prefs" selected="yes" title="Preferences"
myBackLabel="<?php echo __('Home') ?>" myBackHref="home.php">
<fieldset>
<div class="row">
<label><?php echo __('Enable categories') ?></label>
<div class="toggle" id="ENABLE_CATS" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("ENABLE_CATS") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
<div class="row">
<label><?php echo __('Browse categories like folders') ?></label>
<div class="toggle" id="BROWSE_CATS" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("BROWSE_CATS") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
<div class="row">
<label><?php echo __('Show images in posts') ?></label>
<div class="toggle" id="SHOW_IMAGES" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("SHOW_IMAGES") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
<div class="row">
<label><?php echo __('Hide read articles and feeds') ?></label>
<div class="toggle" id="HIDE_READ" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("HIDE_READ") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
<div class="row">
<label><?php echo __('Sort feeds by unread count') ?></label>
<div class="toggle" id="SORT_FEEDS_UNREAD" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("SORT_FEEDS_UNREAD") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
<div class="row">
<label><?php echo __('Reverse headline order (oldest first)') ?></label>
<div class="toggle" id="REVERSE_HEADLINES" onclick="setPref(this)" toggled="<?php echo mobile_pref_toggled("REVERSE_HEADLINES") ?>"><span class="thumb"></span><span class="toggleOn"><?php echo __('ON') ?></span><span class="toggleOff"><?php echo __('OFF') ?></span></div>
</div>
</fieldset>