X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.js;h=f3ae1965ebf8cb76fc19e18052da4f21d97fe4c6;hb=5c7c7da9e12134ae2c4be1f60823e5440015f0ca;hp=7f9f1d21e352074278db64338974af997aeb3eaf;hpb=e176b01ade29842d602eb8d1f362807f74ab6019;p=tt-rss.git diff --git a/functions.js b/functions.js index 7f9f1d21..f3ae1965 100644 --- a/functions.js +++ b/functions.js @@ -1,8 +1,8 @@ var hotkeys_enabled = true; -var xmlhttp_rpc = Ajax.getTransport(); var notify_silent = false; var last_progress_point = 0; var async_counters_work = false; +var sanity_check_done = false; /* add method to remove element from array */ @@ -12,11 +12,59 @@ Array.prototype.remove = function(s) { } } -function is_opera() { - return window.opera; +/* create console.log if it doesn't exist */ + +if (!window.console) console = {}; +console.log = console.log || function(msg) { }; +console.warn = console.warn || function(msg) { }; +console.error = console.error || function(msg) { }; + +function exception_error(location, e, ext_info) { + var msg = format_exception_error(location, e); + + if (!ext_info) ext_info = false; + + disableHotkeys(); + + try { + + var ebc = $("xebContent"); + + if (ebc) { + + Element.show("dialog_overlay"); + Element.show("errorBoxShadow"); + + if (ext_info) { + if (ext_info.responseText) { + ext_info = ext_info.responseText; + } + } + + ebc.innerHTML = + "
Error message:
" + + "
" + msg + "
"; + + if (ext_info) { + ebc.innerHTML += "
Additional information:
" + + ""; + } + + ebc.innerHTML += "
Stack trace:
" + + ""; + + } else { + alert(msg); + } + + } catch (e) { + alert(msg); + + } + } -function exception_error(location, e, silent) { +function format_exception_error(location, e) { var msg; if (e.fileName) { @@ -32,13 +80,12 @@ function exception_error(location, e, silent) { msg = "Exception: " + e + "\nFunction: " + location + "()"; } - debug("EXCEPTION: " + msg + ""); + console.error("EXCEPTION: " + msg); - if (!silent) { - alert(msg); - } + return msg; } + function disableHotkeys() { hotkeys_enabled = false; } @@ -47,48 +94,6 @@ function enableHotkeys() { hotkeys_enabled = true; } -function xmlhttp_ready(obj) { - return obj.readyState == 4 || obj.readyState == 0 || !obj.readyState; -} - -function open_article_callback(transport) { - try { - - if (transport.responseXML) { - - var link = transport.responseXML.getElementsByTagName("link")[0]; - var id = transport.responseXML.getElementsByTagName("id")[0]; - - debug("open_article_callback, received link: " + link); - - if (link && id) { - - var wname = "ttrss_article_" + id.firstChild.nodeValue; - - debug("link url: " + link.firstChild.nodeValue + ", wname " + wname); - - var w = window.open(link.firstChild.nodeValue, wname); - - if (!w) { notify_error("Failed to load article in new window"); } - - if (id) { - id = id.firstChild.nodeValue; - if (!document.getElementById("headlinesList")) { - window.setTimeout("toggleUnread(" + id + ", 0)", 100); - } - } - } else { - notify_error("Can't open article: received invalid article link"); - } - } else { - notify_error("Can't open article: received invalid XML"); - } - - } catch (e) { - exception_error("open_article_callback", e); - } -} - function param_escape(arg) { if (typeof encodeURIComponent != 'undefined') return encodeURIComponent(arg); @@ -115,7 +120,7 @@ function delay(gap) { var notify_hide_timerid = false; function hide_notify() { - var n = document.getElementById("notify"); + var n = $("notify"); if (n) { n.style.display = "none"; } @@ -132,8 +137,8 @@ function notify_real(msg, no_hide, n_type) { return; } - var n = document.getElementById("notify"); - var nb = document.getElementById("notify_body"); + var n = $("notify"); + var nb = $("notify_body"); if (!n || !nb) return; @@ -167,13 +172,13 @@ function notify_real(msg, no_hide, n_type) { n.className = "notify"; } else if (n_type == 2) { n.className = "notifyProgress"; - msg = " " + msg; + msg = " " + msg; } else if (n_type == 3) { n.className = "notifyError"; - msg = " " + msg; + msg = " " + msg; } else if (n_type == 4) { n.className = "notifyInfo"; - msg = " " + msg; + msg = " " + msg; } // msg = " " + msg; @@ -207,7 +212,7 @@ function printLockingError() { } function cleanSelected(element) { - var content = document.getElementById(element); + var content = $(element); for (i = 0; i < content.rows.length; i++) { content.rows[i].className = content.rows[i].className.replace("Selected", ""); @@ -215,7 +220,7 @@ function cleanSelected(element) { } function getVisibleUnreadHeadlines() { - var content = document.getElementById("headlinesList"); + var content = $("headlinesList"); var rows = new Array(); @@ -232,7 +237,7 @@ function getVisibleUnreadHeadlines() { function getVisibleHeadlineIds() { - var content = document.getElementById("headlinesList"); + var content = $("headlinesList"); var rows = new Array(); @@ -268,7 +273,7 @@ function getLastVisibleHeadlineId() { } function markHeadline(id) { - var row = document.getElementById("RROW-" + id); + var row = $("RROW-" + id); if (row) { var is_active = false; @@ -283,7 +288,7 @@ function markHeadline(id) { row.className = row.className = "Active"; } - var check = document.getElementById("RCHK-" + id); + var check = $("RCHK-" + id); if (check) { check.checked = true; @@ -295,7 +300,7 @@ function markHeadline(id) { } function getFeedIds() { - var content = document.getElementById("feedsList"); + var content = $("feedsList"); var rows = new Array(); @@ -318,7 +323,7 @@ function setCookie(name, value, lifetime, path, domain, secure) { d.setTime(d.getTime() + (lifetime * 1000)); } - debug("setCookie: " + name + " => " + value + ": " + d); + console.log("setCookie: " + name + " => " + value + ": " + d); int_setCookie(name, value, d, path, domain, secure); @@ -361,39 +366,6 @@ function getCookie(name) { return unescape(dc.substring(begin + prefix.length, end)); } -function disableContainerChildren(id, disable, doc) { - - if (!doc) doc = document; - - var container = doc.getElementById(id); - - if (!container) { - //alert("disableContainerChildren: element " + id + " not found"); - return; - } - - for (var i = 0; i < container.childNodes.length; i++) { - var child = container.childNodes[i]; - - try { - child.disabled = disable; - } catch (E) { - - } - - if (disable) { - if (child.className && child.className.match("button")) { - child.className = "disabledButton"; - } - } else { - if (child.className && child.className.match("disabledButton")) { - child.className = "button"; - } - } - } - -} - function gotoPreferences() { document.location.href = "prefs.php"; } @@ -406,49 +378,30 @@ function gotoExportOpml() { document.location.href = "opml.php?op=Export"; } -function getActiveFeedId() { -// return getCookie("ttrss_vf_actfeed"); - try { - debug("gAFID: " + active_feed_id); - return active_feed_id; - } catch (e) { - exception_error("getActiveFeedId", e); - } -} - -function activeFeedIsCat() { - return active_feed_is_cat; -} - -function setActiveFeedId(id) { -// return setCookie("ttrss_vf_actfeed", id); - try { - debug("sAFID(" + id + ")"); - active_feed_id = id; - } catch (e) { - exception_error("setActiveFeedId", e); - } -} - function parse_counters(reply, scheduled_call) { try { var feeds_found = 0; - var elems = reply.getElementsByTagName("counter"); + var elems = JSON.parse(reply.firstChild.nodeValue); for (var l = 0; l < elems.length; l++) { - var id = elems[l].getAttribute("id"); - var t = elems[l].getAttribute("type"); - var ctr = elems[l].getAttribute("counter"); - var error = elems[l].getAttribute("error"); - var has_img = elems[l].getAttribute("hi"); - var updated = elems[l].getAttribute("updated"); - var title = elems[l].getAttribute("title"); - var xmsg = elems[l].getAttribute("xmsg"); + var id = elems[l].id + var kind = elems[l].kind; + var ctr = parseInt(elems[l].counter) + var error = elems[l].error; + var has_img = elems[l].has_img; + var updated = elems[l].updated; + var title = elems[l].title; + var xmsg = elems[l].xmsg; if (id == "global-unread") { + + if (ctr > global_unread) { + offlineDownloadStart(1); + } + global_unread = ctr; updateTitle(); continue; @@ -459,8 +412,8 @@ function parse_counters(reply, scheduled_call) { continue; } - if (t == "category") { - var catctr = document.getElementById("FCATCTR-" + id); + if (kind && kind == "cat") { + var catctr = $("FCATCTR-" + id); if (catctr) { catctr.innerHTML = "(" + ctr + ")"; if (ctr > 0) { @@ -472,12 +425,12 @@ function parse_counters(reply, scheduled_call) { continue; } - var feedctr = document.getElementById("FEEDCTR-" + id); - var feedu = document.getElementById("FEEDU-" + id); - var feedr = document.getElementById("FEEDR-" + id); - var feed_img = document.getElementById("FIMG-" + id); - var feedlink = document.getElementById("FEEDL-" + id); - var feedupd = document.getElementById("FLUPD-" + id); + var feedctr = $("FEEDCTR-" + id); + var feedu = $("FEEDU-" + id); + var feedr = $("FEEDR-" + id); + var feed_img = $("FIMG-" + id); + var feedlink = $("FEEDL-" + id); + var feedupd = $("FLUPD-" + id); if (updated && feedlink) { if (error) { @@ -507,7 +460,7 @@ function parse_counters(reply, scheduled_call) { if (has_img && feed_img) { if (!feed_img.src.match(id + ".ico")) { - feed_img.src = getInitParam("icons_location") + "/" + id + ".ico"; + feed_img.src = getInitParam("icons_url") + "/" + id + ".ico"; } } @@ -517,8 +470,11 @@ function parse_counters(reply, scheduled_call) { if (feedctr && feedu && feedr) { - if (feedu.innerHTML != ctr && id == getActiveFeedId() && scheduled_call) { - viewCurrentFeed(); + if (parseInt(ctr) > 0 && + parseInt(feedu.innerHTML) < parseInt(ctr) && + id == getActiveFeedId() && scheduled_call) { + + displayNewContentPrompt(id); } var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML)); @@ -532,7 +488,7 @@ function parse_counters(reply, scheduled_call) { } if (ctr > 0) { - feedctr.className = "odd"; + feedctr.className = "feedCtrHasUnread"; if (!feedr.className.match("Unread")) { var is_selected = feedr.className.match("Selected"); @@ -547,12 +503,15 @@ function parse_counters(reply, scheduled_call) { } - if (row_needs_hl) { + if (row_needs_hl && + !getInitParam("theme_options").match('no_highlights')) { new Effect.Highlight(feedr, {duration: 1, startcolor: "#fff7d5", queue: { position:'end', scope: 'EFQ-' + id, limit: 1 } } ); + + cache_invalidate("F:" + id); } } else { - feedctr.className = "invisible"; + feedctr.className = "feedCtrNoUnread"; feedr.className = feedr.className.replace("Unread", ""); } } @@ -562,15 +521,21 @@ function parse_counters(reply, scheduled_call) { var feeds_stored = number_of_feeds; - debug("Feed counters, C: " + feeds_found + ", S:" + feeds_stored); + console.log("Feed counters, C: " + feeds_found + ", S:" + feeds_stored); if (feeds_stored != feeds_found) { number_of_feeds = feeds_found; if (feeds_stored != 0 && feeds_found != 0) { - debug("Subscribed feed number changed, refreshing feedlist"); + console.log("Subscribed feed number changed, refreshing feedlist"); setTimeout('updateFeedList(false, false)', 50); } + } else { +/* var fl = $("feeds-frame").innerHTML; + if (fl) { + cache_invalidate("FEEDLIST"); + cache_inject("FEEDLIST", fl, getInitParam("num_feeds")); + } */ } } catch (e) { @@ -592,32 +557,18 @@ function parse_counters_reply(transport, scheduled_call) { updateTitle(""); return; } - - var error_code = false; - var error_msg = false; - - if (reply.firstChild) { - error_code = reply.firstChild.getAttribute("error-code"); - error_msg = reply.firstChild.getAttribute("error-msg"); - } - if (!error_code) { - error_code = reply.getAttribute("error-code"); - error_msg = reply.getAttribute("error-msg"); - } - - if (error_code && error_code != 0) { - debug("refetch_callback: got error code " + error_code); - return fatalError(error_code, error_msg); - } + if (!transport_error_check(transport)) return; var counters = reply.getElementsByTagName("counters")[0]; - parse_counters(counters, scheduled_call); + if (counters) + parse_counters(counters, scheduled_call); var runtime_info = reply.getElementsByTagName("runtime-info")[0]; - parse_runtime_info(runtime_info); + if (runtime_info) + parse_runtime_info(runtime_info); if (feedsSortByUnread()) { resort_feedlist(); @@ -630,33 +581,30 @@ function parse_counters_reply(transport, scheduled_call) { function all_counters_callback2(transport, async_call) { try { if (async_call) async_counters_work = true; + if (offline_mode) return; - debug("all_counters_callback2 IN: " + transport + ""); parse_counters_reply(transport); - debug("all_counters_callback2 OUT: " + transport + ""); } catch (e) { - exception_error("all_counters_callback2", e); + exception_error("all_counters_callback2", e, transport); } } function get_feed_unread(id) { try { - return parseInt(document.getElementById("FEEDU-" + id).innerHTML); + return parseInt($("FEEDU-" + id).innerHTML); } catch (e) { - exception_error("get_feed_unread", e, true); return -1; } } function get_cat_unread(id) { try { - var ctr = document.getElementById("FCATCTR-" + id).innerHTML; + var ctr = $("FCATCTR-" + id).innerHTML; ctr = ctr.replace("(", ""); ctr = ctr.replace(")", ""); return parseInt(ctr); } catch (e) { - exception_error("get_feed_unread", e, true); return -1; } } @@ -670,7 +618,7 @@ function get_feed_entry_unread(elem) { } try { - return parseInt(document.getElementById("FEEDU-" + id).innerHTML); + return parseInt($("FEEDU-" + id).innerHTML); } catch (e) { return -1; } @@ -682,11 +630,11 @@ function get_feed_entry_name(elem) { } -function resort_category(node) { +function resort_category(node, cat_mode) { try { - debug("resort_category: " + node); + console.log("resort_category: " + node + " CM=" + cat_mode); var by_unread = feedsSortByUnread(); @@ -701,8 +649,11 @@ function resort_category(node) { var tmp_name = get_feed_entry_name(list[i]); var cur_name = get_feed_entry_name(list[j]); - - if ((by_unread && (cur_val > tmp_val)) || (!by_unread && (cur_name < tmp_name))) { + + var valid_pair = cat_mode || (list[i].id.match(/FEEDR-[0-9]/) && + list[j].id.match(/FEEDR-[0-9]/)); + + if (valid_pair && ((by_unread && (cur_val > tmp_val)) || (!by_unread && (cur_name < tmp_name)))) { tempnode_i = list[i].cloneNode(true); tempnode_j = list[j].cloneNode(true); node.replaceChild(tempnode_i, list[j]); @@ -718,20 +669,20 @@ function resort_category(node) { } function resort_feedlist() { - debug("resort_feedlist"); + console.log("resort_feedlist"); - if (document.getElementById("FCATLIST--1")) { + if ($("FCATLIST--1")) { var lists = document.getElementsByTagName("UL"); for (var i = 0; i < lists.length; i++) { if (lists[i].id && lists[i].id.match("FCATLIST-")) { - resort_category(lists[i]); + resort_category(lists[i], true); } } } else { - resort_category(document.getElementById("feedList")); + resort_category($("feedList"), false); } } @@ -773,9 +724,9 @@ function hideOrShowFeeds(hide) { try { - debug("hideOrShowFeeds: " + hide); + console.log("hideOrShowFeeds: " + hide); - if (document.getElementById("FCATLIST--1")) { + if ($("FCATLIST--1")) { var lists = document.getElementsByTagName("UL"); @@ -804,22 +755,22 @@ function hideOrShowFeedsCategory(id, hide) { var cat_node = null; if (id) { - node = document.getElementById("FCATLIST-" + id); - cat_node = document.getElementById("FCAT-" + id); + node = $("FCATLIST-" + id); + cat_node = $("FCAT-" + id); } else { - node = document.getElementById("feedList"); // no categories + node = $("feedList"); // no categories } - // debug("hideOrShowFeedsCategory: " + node + " (" + hide + ")"); + // console.log("hideOrShowFeedsCategory: " + node + " (" + hide + ")"); var cat_unread = 0; if (!node) { - debug("hideOrShowFeeds: passed node is null, aborting"); + console.log("hideOrShowFeeds: passed node is null, aborting"); return; } - // debug("cat: " + node.id); + // console.log("cat: " + node.id); if (node.hasChildNodes() && node.firstChild.nextSibling != false) { for (i = 0; i < node.childNodes.length; i++) { @@ -834,7 +785,7 @@ function hideOrShowFeedsCategory(id, hide) { node.childNodes[i].className != "error" && node.childNodes[i].className != "tag"); - // debug(node.childNodes[i].id + " --> " + has_unread); + // console.log(node.childNodes[i].id + " --> " + has_unread); if (hide && !has_unread) { //node.childNodes[i].style.display = "none"; @@ -858,30 +809,33 @@ function hideOrShowFeedsCategory(id, hide) { } } - // debug("end cat: " + node.id + " unread " + cat_unread); - - if (cat_unread == 0) { - if (cat_node.style == undefined) { - debug("ERROR: supplied cat_node " + cat_node + - " has no styles. WTF?"); - return; - } - if (hide) { - //cat_node.style.display = "none"; - Effect.Fade(cat_node, {duration : 0.3, - queue: { position: 'end', scope: 'CFADE-' + node.id, limit: 1 }}); + // console.log("end cat: " + node.id + " unread " + cat_unread); + + if (cat_node) { + + if (cat_unread == 0) { + if (cat_node.style == undefined) { + console.log("ERROR: supplied cat_node " + cat_node + + " has no styles. WTF?"); + return; + } + if (hide) { + //cat_node.style.display = "none"; + Effect.Fade(cat_node, {duration : 0.3, + queue: { position: 'end', scope: 'CFADE-' + node.id, limit: 1 }}); + } else { + cat_node.style.display = "list-item"; + } } else { - cat_node.style.display = "list-item"; - } - } else { - try { - cat_node.style.display = "list-item"; - } catch (e) { - debug(e); + try { + cat_node.style.display = "list-item"; + } catch (e) { + console.log(e); + } } } -// debug("unread for category: " + cat_unread); +// console.log("unread for category: " + cat_unread); } catch (e) { exception_error("hideOrShowFeedsCategory", e); @@ -900,13 +854,13 @@ function selectTableRowById(elem_id, check_id, do_select) { try { - var row = document.getElementById(elem_id); + var row = $(elem_id); if (row) { selectTableRow(row, do_select); } - var check = document.getElementById(check_id); + var check = $(check_id); if (check) { check.checked = do_select; @@ -919,10 +873,10 @@ function selectTableRowById(elem_id, check_id, do_select) { function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, classcheck, reset_others) { - var content = document.getElementById(content_id); + var content = $(content_id); if (!content) { - alert("[selectTableRows] Element " + content_id + " not found."); + console.log("[selectTableRows] Element " + content_id + " not found."); return; } @@ -934,7 +888,7 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, selectTableRow(content.rows[i], do_select); var row_id = content.rows[i].id.replace(prefix, ""); - var check = document.getElementById(check_prefix + row_id); + var check = $(check_prefix + row_id); if (check) { check.checked = do_select; @@ -943,7 +897,7 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, selectTableRow(content.rows[i], false); var row_id = content.rows[i].id.replace(prefix, ""); - var check = document.getElementById(check_prefix + row_id); + var check = $(check_prefix + row_id); if (check) { check.checked = false; @@ -954,7 +908,7 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, selectTableRow(content.rows[i], false); var row_id = content.rows[i].id.replace(prefix, ""); - var check = document.getElementById(check_prefix + row_id); + var check = $(check_prefix + row_id); if (check) { check.checked = false; @@ -967,11 +921,11 @@ function selectTableRowsByIdPrefix(content_id, prefix, check_prefix, do_select, function getSelectedTableRowIds(content_id, prefix) { - var content = document.getElementById(content_id); + var content = $(content_id); if (!content) { - alert("[getSelectedTableRowIds] Element " + content_id + " not found."); - return; + console.log("[getSelectedTableRowIds] Element " + content_id + " not found."); + return new Array(); } var sel_rows = new Array(); @@ -990,7 +944,7 @@ function getSelectedTableRowIds(content_id, prefix) { } function toggleSelectRowById(sender, id) { - var row = document.getElementById(id); + var row = $(id); if (sender.checked) { if (!row.className.match("Selected")) { @@ -1035,13 +989,47 @@ function toggleSelectRow(sender) { } } +function getNextUnreadCat(id) { + try { + var rows = $("feedList").getElementsByTagName("LI"); + var feeds = new Array(); + + var unread_only = true; + var is_cat = true; + + for (var i = 0; i < rows.length; i++) { + if (rows[i].id.match("FCAT-")) { + if (rows[i].id == "FCAT-" + id && is_cat || (Element.visible(rows[i]) && Element.visible(rows[i].parentNode))) { + + var cat_id = parseInt(rows[i].id.replace("FCAT-", "")); + + if (cat_id >= 0) { + if (!unread_only || get_cat_unread(cat_id) > 0) { + feeds.push(cat_id); + } + } + } + } + } + + var idx = feeds.indexOf(id); + if (idx != -1 && idx < feeds.length) { + return feeds[idx+1]; + } else { + return feeds.shift(); + } + + } catch (e) { + exception_error("getNextUnreadCat", e); + } +} function getRelativeFeedId2(id, is_cat, direction, unread_only) { try { // alert(id + " IC: " + is_cat + " D: " + direction + " U: " + unread_only); - var rows = document.getElementById("feedList").getElementsByTagName("LI"); + var rows = $("feedList").getElementsByTagName("LI"); var feeds = new Array(); for (var i = 0; i < rows.length; i++) { @@ -1104,71 +1092,6 @@ function getRelativeFeedId2(id, is_cat, direction, unread_only) { } } - -function getRelativeFeedId(list, id, direction, unread_only) { - var rows = list.getElementsByTagName("LI"); - var feeds = new Array(); - - for (var i = 0; i < rows.length; i++) { - if (rows[i].id.match("FEEDR-")) { - - if (rows[i].id == "FEEDR-" + id || (Element.visible(rows[i]) && Element.visible(rows[i].parentNode))) { - - if (!unread_only || - (rows[i].className.match("Unread") || rows[i].id == "FEEDR-" + id)) { - feeds.push(rows[i].id.replace("FEEDR-", "")); - } - } - } - } - - if (!id) { - if (direction == "next") { - return feeds.shift(); - } else { - return feeds.pop(); - } - } else { - if (direction == "next") { - var idx = feeds.indexOf(id); - if (idx != -1 && idx < feeds.length) { - return feeds[idx+1]; - } else { - return getRelativeFeedId(list, false, direction, unread_only); - } - } else { - var idx = feeds.indexOf(id); - if (idx > 0) { - return feeds[idx-1]; - } else { - return getRelativeFeedId(list, false, direction, unread_only); - } - } - - } -} - -function showBlockElement(id, h_id) { - var elem = document.getElementById(id); - - if (elem) { - elem.style.display = "block"; - - if (h_id) { - elem = document.getElementById(h_id); - if (elem) { - elem.style.display = "none"; - } - } - } else { - alert("[showBlockElement] can't find element with id " + id); - } -} - -function appearBlockElement_afh(effect) { - -} - function checkboxToggleElement(elem, id) { if (elem.checked) { Effect.Appear(id, {duration : 0.5}); @@ -1177,23 +1100,6 @@ function checkboxToggleElement(elem, id) { } } -function appearBlockElement(id, h_id) { - - try { - if (h_id) { - Effect.Fade(h_id); - } - Effect.SlideDown(id, {duration : 1.0, afterFinish: appearBlockElement_afh}); - } catch (e) { - exception_error("appearBlockElement", e); - } - -} - -function hideParentElement(e) { - e.parentNode.style.display = "none"; -} - function dropboxSelect(e, v) { for (i = 0; i < e.length; i++) { if (e[i].value == v) { @@ -1233,39 +1139,59 @@ function leading_zero(p) { return s; } -function closeInfoBox(cleanup) { +function make_timestamp() { + var d = new Date(); + + return leading_zero(d.getHours()) + ":" + leading_zero(d.getMinutes()) + + ":" + leading_zero(d.getSeconds()); +} - Element.hide("dialog_overlay"); - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); +function closeErrorBox() { - if (shadow) { - shadow.style.display = "none"; - } else if (box) { - box.style.display = "none"; + if (Element.visible("errorBoxShadow")) { + Element.hide("dialog_overlay"); + Element.hide("errorBoxShadow"); + + enableHotkeys(); } - if (cleanup) box.innerHTML = " "; + return false; +} + +function closeInfoBox(cleanup) { + + try { + enableHotkeys(); - enableHotkeys(); + if (Element.visible("infoBoxShadow")) { + Element.hide("dialog_overlay"); + Element.hide("infoBoxShadow"); + if (cleanup) $("infoBox").innerHTML = " "; + } + } catch (e) { + exception_error("closeInfoBox", e); + } + return false; } -function displayDlg(id, param) { +function displayDlg(id, param, callback) { notify_progress("Loading, please wait...", true); disableHotkeys(); - var query = "backend.php?op=dlg&id=" + + var query = "?op=dlg&id=" + param_escape(id) + "¶m=" + param_escape(param); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function (transport) { infobox_callback2(transport); + if (callback) callback(transport); } }); return false; @@ -1289,30 +1215,21 @@ function infobox_submit_callback2(transport) { function infobox_callback2(transport) { try { - debug("infobox_callback2"); - - if (!getInitParam("infobox_disable_overlay")) { - Element.show("dialog_overlay"); - } + console.log("infobox_callback2"); - var box = document.getElementById('infoBox'); - var shadow = document.getElementById('infoBoxShadow'); + var box = $('infoBox'); + if (box) { - box.innerHTML=transport.responseText; - if (shadow) { - shadow.style.display = "block"; - } else { - box.style.display = "block"; + if (!getInitParam("infobox_disable_overlay")) { + Element.show("dialog_overlay"); } - } - /* FIXME this needs to be moved out somewhere */ + box.innerHTML=transport.responseText; + Element.show("infoBoxShadow"); + //Effect.SlideDown("infoBoxShadow", {duration : 1.0}); + - if (document.getElementById("tags_choices")) { - new Ajax.Autocompleter('tags_str', 'tags_choices', - "backend.php?op=rpc&subop=completeTags", - { tokens: ',', paramName: "search" }); } disableHotkeys(); @@ -1354,20 +1271,14 @@ function createFilter() { } } -function toggleSubmitNotEmpty(e, submit_id) { - try { - document.getElementById(submit_id).disabled = (e.value == "") - } catch (e) { - exception_error("toggleSubmitNotEmpty", e); - } -} - function isValidURL(s) { return s.match("http://") != null || s.match("https://") != null || s.match("feed://") != null; } function subscribeToFeed() { + try { + var form = document.forms['feed_add_form']; var feed_url = form.feed_url.value; @@ -1378,22 +1289,49 @@ function subscribeToFeed() { notify_progress(__("Subscribing to feed..."), true); - closeInfoBox(); - - var feeds_doc = document; - -// feeds_doc.location.href = "backend.php?op=error&msg=Loading,%20please wait..."; - var query = Form.serialize("feed_add_form"); - debug("subscribe q: " + query); + console.log("subscribe q: " + query); + + Form.disable("feed_add_form"); new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - dlg_frefresh_callback(transport); + //dlg_frefresh_callback(transport); + + notify(''); + + var result = transport.responseXML.getElementsByTagName('result')[0]; + var rc = parseInt(result.getAttribute('code')); + + Form.enable("feed_add_form"); + + switch (rc) { + case 1: + closeInfoBox(); + notify_info(__("Subscribed to %s").replace("%s", feed_url)); + + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); + } + break; + case 2: + alert(__("Can't subscribe to the specified URL.")); + break; + case 0: + alert(__("You are already subscribed to this feed.")); + break; + } + } }); + } catch (e) { + exception_error("subscribeToFeed", e); + } + return false; } @@ -1418,55 +1356,47 @@ function filterCR(e, f) } } -var debug_last_class = "even"; - -function debug(msg) { - - if (debug_last_class == "even") { - debug_last_class = "odd"; - } else { - debug_last_class = "even"; - } - - var c = document.getElementById('debug_output'); - if (c && Element.visible(c)) { - while (c.lastChild != 'undefined' && c.childNodes.length > 100) { - c.removeChild(c.lastChild); - } - - var d = new Date(); - var ts = leading_zero(d.getHours()) + ":" + leading_zero(d.getMinutes()) + - ":" + leading_zero(d.getSeconds()); - c.innerHTML = "
  • [" + ts + "] " + - msg + "
  • " + c.innerHTML; - } -} - function getInitParam(key) { return init_params[key]; } -function storeInitParam(key, value) { - debug("storeInitParam is OBSOLETE: " + key + " => " + value + ""); +function setInitParam(key, value) { init_params[key] = value; } -function fatalError(code, message) { +function fatalError(code, msg, ext_info) { try { + if (!ext_info) ext_info = "N/A"; + if (code == 6) { window.location.href = "tt-rss.php"; } else if (code == 5) { window.location.href = "update.php"; } else { - var fe = document.getElementById("fatal_error"); - var fc = document.getElementById("fatal_error_msg"); - if (message == "") message = "Unknown error"; + if (msg == "") msg = "Unknown error"; + + var ebc = $("xebContent"); + + if (ebc) { + + Element.show("dialog_overlay"); + Element.show("errorBoxShadow"); + Element.hide("xebBtn"); - fc.innerHTML = " " + message + " (Code " + code + ")"; + if (ext_info) { + if (ext_info.responseText) { + ext_info = ext_info.responseText; + } + } - fe.style.display = "block"; + ebc.innerHTML = + "
    Error message:
    " + + "
    " + msg + "
    " + + "
    Additional information:
    " + + ""; + } } } catch (e) { @@ -1478,9 +1408,9 @@ function getFeedName(id, is_cat) { var e; if (is_cat) { - e = document.getElementById("FCATN-" + id); + e = $("FCATN-" + id); } else { - e = document.getElementById("FEEDN-" + id); + e = $("FEEDN-" + id); } if (e) { return e.innerHTML.stripTags(); @@ -1489,11 +1419,11 @@ function getFeedName(id, is_cat) { } } -function filterDlgCheckAction(sender) { +function filterDlgCheckType(sender) { try { - var action = sender[sender.selectedIndex].value; + var ftype = sender[sender.selectedIndex].value; var form = document.forms["filter_add_form"]; @@ -1502,21 +1432,61 @@ function filterDlgCheckAction(sender) { } if (!form) { - debug("filterDlgCheckAction: can't find form!"); + console.log("filterDlgCheckType: can't find form!"); return; } - var action_param = document.getElementById("filter_dlg_param_box"); + // if selected filter type is 5 (Date) enable the modifier dropbox + if (ftype == 5) { + Element.show("filter_dlg_date_mod_box"); + Element.show("filter_dlg_date_chk_box"); + } else { + Element.hide("filter_dlg_date_mod_box"); + Element.hide("filter_dlg_date_chk_box"); - if (!action_param) { - debug("filterDlgCheckAction: can't find action param box!"); - return; } - // if selected action supports parameters, enable params field - if (action == 4 || action == 6) { - Element.show(action_param); - } else { + } catch (e) { + exception_error("filterDlgCheckType", e); + } + +} + +function filterDlgCheckAction(sender) { + + try { + + var action = sender[sender.selectedIndex].value; + + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (!form) { + console.log("filterDlgCheckAction: can't find form!"); + return; + } + + var action_param = $("filter_dlg_param_box"); + + if (!action_param) { + console.log("filterDlgCheckAction: can't find action param box!"); + return; + } + + // if selected action supports parameters, enable params field + if (action == 4 || action == 6 || action == 7) { + Element.show(action_param); + if (action != 7) { + Element.show(form.action_param); + Element.hide(form.action_param_label); + } else { + Element.show(form.action_param_label); + Element.hide(form.action_param); + } + } else { Element.hide(action_param); } @@ -1526,6 +1496,56 @@ function filterDlgCheckAction(sender) { } +function filterDlgCheckDate() { + try { + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (!form) { + console.log("filterDlgCheckAction: can't find form!"); + return; + } + + var reg_exp = form.reg_exp.value; + + var query = "?op=rpc&subop=checkDate&date=" + reg_exp; + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + + var form = document.forms["filter_add_form"]; + + if (!form) { + form = document.forms["filter_edit_form"]; + } + + if (transport.responseXML) { + var result = transport.responseXML.getElementsByTagName("result")[0]; + + if (result && result.firstChild) { + if (result.firstChild.nodeValue == "1") { + + new Effect.Highlight(form.reg_exp, {startcolor : '#00ff00'}); + + return; + } + } + } + + new Effect.Highlight(form.reg_exp, {startcolor : '#ff0000'}); + + } }); + + + } catch (e) { + exception_error("filterDlgCheckDate", e); + } +} + function explainError(code) { return displayDlg("explainError", code); } @@ -1535,10 +1555,10 @@ function getRelativePostIds(id, limit) { if (!limit) limit = 3; - debug("getRelativePostIds: " + id + " limit=" + limit); + console.log("getRelativePostIds: " + id + " limit=" + limit); var ids = new Array(); - var container = document.getElementById("headlinesList"); + var container = $("headlinesList"); if (container) { var rows = container.rows; @@ -1567,22 +1587,46 @@ function getRelativePostIds(id, limit) { function openArticleInNewWindow(id) { try { - debug("openArticleInNewWindow: " + id); + console.log("openArticleInNewWindow: " + id); - var query = "backend.php?op=rpc&subop=getArticleLink&id=" + id; + var query = "?op=rpc&subop=getArticleLink&id=" + id; var wname = "ttrss_article_" + id; - debug(query + " " + wname); + console.log(query + " " + wname); var w = window.open("", wname); if (!w) notify_error("Failed to open window for the article"); - new Ajax.Request(query, { + new Ajax.Request("backend.php", { + parameters: query, onComplete: function(transport) { - open_article_callback(transport); - } }); + var link = transport.responseXML.getElementsByTagName("link")[0]; + var id = transport.responseXML.getElementsByTagName("id")[0]; + + console.log("open_article received link: " + link); + + if (link && id) { + + var wname = "ttrss_article_" + id.firstChild.nodeValue; + + console.log("link url: " + link.firstChild.nodeValue + ", wname " + wname); + + var w = window.open(link.firstChild.nodeValue, wname); + + if (!w) { notify_error("Failed to load article in new window"); } + + if (id) { + id = id.firstChild.nodeValue; + if (!$("headlinesList")) { + window.setTimeout("toggleUnread(" + id + ", 0)", 100); + } + } + } else { + notify_error("Can't open article: received invalid article link"); + } + } }); } catch (e) { exception_error("openArticleInNewWindow", e); @@ -1619,50 +1663,8 @@ Position.Center = function(element, parent) { } -function labeltest_callback(transport) { - try { - var container = document.getElementById('label_test_result'); - - container.innerHTML = transport.responseText; - if (!Element.visible(container)) { - Effect.SlideDown(container, { duration : 0.5 }); - } - - notify(""); - } catch (e) { - exception_error("labeltest_callback", e); - } -} - -function labelTest() { - - try { - var container = document.getElementById('label_test_result'); - - var form = document.forms['label_edit_form']; - - var sql_exp = form.sql_exp.value; - var description = form.description.value; - - notify_progress("Loading, please wait..."); - - var query = "backend.php?op=pref-labels&subop=test&expr=" + - param_escape(sql_exp) + "&descr=" + param_escape(description); - - new Ajax.Request(query, { - onComplete: function (transport) { - labeltest_callback(transport); - } }); - - return false; - - } catch (e) { - exception_error("labelTest", e); - } -} - function isCdmMode() { - return !document.getElementById("headlinesList"); + return !$("headlinesList"); } function getSelectedArticleIds2() { @@ -1678,7 +1680,7 @@ function getSelectedArticleIds2() { var ids = new Array(); for (var i = 0; i < rows.length; i++) { - var chk = document.getElementById("RCHK-" + rows[i]); + var chk = $("RCHK-" + rows[i]); if (chk && chk.checked) { ids.push(rows[i]); } @@ -1694,26 +1696,15 @@ function displayHelpInfobox(topic_id) { var w = window.open(url, "ttrss_help", "status=0,toolbar=0,location=0,width=450,height=500,scrollbars=1,menubar=0"); - return false; -} - -function focus_element(id) { - try { - var e = document.getElementById(id); - if (e) e.focus(); - } catch (e) { - exception_error("focus_element", e); - } - return false; } function loading_set_progress(p) { try { if (p < last_progress_point || !Element.visible("overlay")) return; - debug("loading_set_progress : " + p + " (" + last_progress_point + ")"); + console.log("loading_set_progress : " + p + " (" + last_progress_point + ")"); - var o = document.getElementById("l_progress_i"); + var o = $("l_progress_i"); // o.style.width = (p * 2) + "px"; @@ -1732,106 +1723,496 @@ function loading_set_progress(p) { function remove_splash() { if (Element.visible("overlay")) { - debug("about to remove splash, OMG!"); + console.log("about to remove splash, OMG!"); Element.hide("overlay"); - debug("removed splash!"); + console.log("removed splash!"); } } -function addLabelExample() { +function getSelectedFeedsFromBrowser() { + + var list = $("browseFeedList"); + + var selected = new Array(); + + for (i = 0; i < list.childNodes.length; i++) { + var child = list.childNodes[i]; + if (child.id && child.id.match("FBROW-")) { + var id = child.id.replace("FBROW-", ""); + + var cb = $("FBCHK-" + id); + + if (cb.checked) { + selected.push(id); + } + } + } + + return selected; +} + +function updateFeedBrowser() { try { - var form = document.forms["label_edit_form"]; - var text = form.sql_exp; - var op = form.label_fields[form.label_fields.selectedIndex]; - var p = form.label_fields_param; + var query = Form.serialize("feed_browser"); + + Element.show('feed_browser_spinner'); - if (op) { - op = op.value; + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + + Element.hide('feed_browser_spinner'); - var tmp = ""; + var c = $("browseFeedList"); + var r = transport.responseXML.getElementsByTagName("content")[0]; + var nr = transport.responseXML.getElementsByTagName("num-results")[0]; + var mode = transport.responseXML.getElementsByTagName("mode")[0]; - if (text.value != "") { - if (text.value.substring(text.value.length-3, 3).toUpperCase() != "AND") { - tmp = " AND "; + if (c && r) { + c.innerHTML = r.firstChild.nodeValue; + } + + if (parseInt(mode.getAttribute("value")) == 2) { + Element.show('feed_archive_remove'); } else { - tmp = " "; + Element.hide('feed_archive_remove'); } - } + + } }); - if (op == "unread") { - tmp = tmp + "unread = true"; - } + } catch (e) { + exception_error("updateFeedBrowser", e); + } - if (op == "updated") { - tmp = tmp + "last_read is null and unread = false"; - } +} - if (op == "kw_title") { - tmp = tmp + "ttrss_entries.title like '%"+p.value+"%'"; - } - if (op == "kw_content") { - tmp = tmp + "ttrss_entries.content like '%"+p.value+"%'"; - } +function transport_error_check(transport) { + try { + if (transport.responseXML) { + var error = transport.responseXML.getElementsByTagName("error")[0]; - if (op == "scoreE") { - tmp = tmp + "score = " + p.value; + if (error) { + var code = error.getAttribute("error-code"); + var msg = error.getAttribute("error-msg"); + if (code != 0) { + fatalError(code, msg); + return false; + } } + } + } catch (e) { + exception_error("check_for_error_xml", e); + } + return true; +} - if (op == "scoreG") { - tmp = tmp + "score > " + p.value; - } +function strip_tags(s) { + return s.replace(/<\/?[^>]+(>|$)/g, ""); +} + +function truncate_string(s, length) { + if (!length) length = 30; + var tmp = s.substring(0, length); + if (s.length > length) tmp += "…"; + return tmp; +} + +function hotkey_prefix_timeout() { + try { + + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + if (hotkey_prefix_pressed && ts - hotkey_prefix_pressed >= 5) { + console.log("hotkey_prefix seems to be stuck, aborting"); + hotkey_prefix_pressed = false; + hotkey_prefix = false; + Element.hide('cmdline'); + } + + setTimeout("hotkey_prefix_timeout()", 1000); + + } catch (e) { + exception_error("hotkey_prefix_timeout", e); + } +} + +function hideAuxDlg() { + try { + Element.hide('auxDlg'); + } catch (e) { + exception_error("hideAuxDlg", e); + } +} + +function displayNewContentPrompt(id) { + try { + + var msg = "" + + __("New articles available in this feed (click to show)") + ""; + + msg = msg.replace("%s", getFeedName(id)); + + $('auxDlg').innerHTML = msg; + + new Effect.Appear('auxDlg', {duration : 0.5}); - if (op == "scoreL") { - tmp = tmp + "score < " + p.value; + } catch (e) { + exception_error("displayNewContentPrompt", e); + } +} + +function feedBrowserSubscribe() { + try { + + var selected = getSelectedFeedsFromBrowser(); + + var mode = document.forms['feed_browser'].mode; + + mode = mode[mode.selectedIndex].value; + + if (selected.length > 0) { + closeInfoBox(); + + notify_progress("Loading, please wait...", true); + + var query = "?op=rpc&subop=massSubscribe&ids="+ + param_escape(selected.toString()) + "&mode=" + param_escape(mode); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + + var nf = transport.responseXML.getElementsByTagName('num-feeds')[0]; + var nf_value = nf.getAttribute("value"); + + notify_info(__("Subscribed to %d feed(s).").replace("%d", nf_value)); + + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); + } + } }); + + } else { + alert(__("No feeds are selected.")); + } + + } catch (e) { + exception_error("feedBrowserSubscribe", e); + } +} + +function feedArchiveRemove() { + try { + + var selected = getSelectedFeedsFromBrowser(); + + if (selected.length > 0) { + + var pr = __("Remove selected feeds from the archive? Feeds with stored articles will not be removed."); + + if (confirm(pr)) { + Element.show('feed_browser_spinner'); + + var query = "?op=rpc&subop=remarchived&ids=" + + param_escape(selected.toString());; + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + updateFeedBrowser(); + } }); } - if (op == "newerD") { - if (isNaN(parseInt(p.value))) { - alert("This action expects numeric parameter."); - return false; + } else { + alert(__("No feeds are selected.")); + } + + } catch (e) { + exception_error("feedArchiveRemove", e); + } +} + +function uploadIconHandler(rc) { + try { + switch (rc) { + case 0: + notify_info("Upload complete."); + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); } - tmp = tmp + "updated > NOW() - INTERVAL '"+parseInt(p.value)+" days'"; + break; + case 1: + notify_error("Upload failed: icon is too big."); + break; + case 2: + notify_error("Upload failed."); + break; + } + + } catch (e) { + exception_error("uploadIconHandler", e); + } +} + +function removeFeedIcon(id) { + + try { + + if (confirm(__("Remove stored feed icon?"))) { + var query = "backend.php?op=pref-feeds&subop=removeicon&feed_id=" + param_escape(id); + + console.log(query); + + notify_progress("Removing feed icon...", true); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify_info("Feed icon removed."); + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); + } + } }); + } + + return false; + } catch (e) { + exception_error("uploadFeedIcon", e); + } +} + +function uploadFeedIcon() { + + try { + + var file = $("icon_file"); + + if (file.value.length == 0) { + alert(__("Please select an image file to upload.")); + } else { + if (confirm(__("Upload new icon for this feed?"))) { + notify_progress("Uploading, please wait...", true); + return true; } + } - if (op == "newerH") { - if (isNaN(parseInt(p.value))) { - alert("This action expects numeric parameter."); - return false; - } + return false; + + } catch (e) { + exception_error("uploadFeedIcon", e); + } +} + +function addLabel() { + + try { + + var caption = prompt(__("Please enter label caption:"), ""); - tmp = tmp + "updated > NOW() - INTERVAL '"+parseInt(p.value)+" hours'"; + if (caption != undefined) { + + if (caption == "") { + alert(__("Can't create label: missing caption.")); + return false; } - text.value = text.value + tmp; + var query = "?op=pref-labels&subop=add&caption=" + + param_escape(caption); + + notify_progress("Loading, please wait...", true); + + if (inPreferences()) active_tab = "labelConfig"; - p.value = ""; + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + if (inPreferences()) { + infobox_submit_callback2(transport); + } else { + updateFeedList(); + } + } }); } - + } catch (e) { - exception_error("addLabelExample", e); + exception_error("addLabel", e); + } +} + +function quickAddFeed() { + displayDlg('quickAddFeed', '', + function () {$('feed_url').focus();}); +} + +function quickAddFilter() { + displayDlg('quickAddFilter', '', + function () {document.forms['filter_add_form'].reg_exp.focus();}); +} + +function unsubscribeFeed(feed_id, title) { + + var msg = __("Unsubscribe from %s?").replace("%s", title); + + if (title == undefined || confirm(msg)) { + notify_progress("Removing feed..."); + + var query = "?op=pref-feeds&quiet=1&subop=remove&ids=" + feed_id; + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + + closeInfoBox(); + + if (inPreferences()) { + updateFeedList(); + } else { + dlg_frefresh_callback(transport, feed_id); + } + + } }); } return false; } -function labelFieldsCheck(elem) { + +function backend_sanity_check_callback(transport) { + try { - var op = elem[elem.selectedIndex].value; - var p = document.forms["label_edit_form"].label_fields_param; + if (sanity_check_done) { + fatalError(11, "Sanity check request received twice. This can indicate "+ + "presence of Firebug or some other disrupting extension. "+ + "Please disable it and try again."); + return; + } - if (op == "kw_title" || op == "kw_content" || op == "scoreL" || - op == "scoreG" || op == "scoreE" || op == "newerD" || - op == "newerH" ) { - Element.show(p); - } else { - Element.hide(p); + if (!transport.responseXML) { + if (!store) { + fatalError(3, "Sanity check: Received reply is not XML", + transport.responseText); + return; + } else { + init_offline(); + return; + } + } + + if (getURLParam("offline")) { + return init_offline(); } + var reply = transport.responseXML.getElementsByTagName("error")[0]; + + if (!reply) { + fatalError(3, "Sanity check: invalid RPC reply", transport.responseText); + return; + } + + var error_code = reply.getAttribute("error-code"); + + if (error_code && error_code != 0) { + return fatalError(error_code, reply.getAttribute("error-msg")); + } + + console.log("sanity check ok"); + + var params = transport.responseXML.getElementsByTagName("init-params")[0]; + + if (params) { + console.log('reading init-params...'); + + params = JSON.parse(params.firstChild.nodeValue); + + if (params) { + for (var i = 0; i < params.length; i++) { + + var k = params[i].param; + var v = params[i].value; + + if (getURLParam('debug')) console.log(k + " => " + v); + init_params[k] = v; + + if (db) { + db.execute("DELETE FROM init_params WHERE key = ?", [k]); + db.execute("INSERT INTO init_params (key,value) VALUES (?, ?)", + [k, v]); + } + } + } + } + + sanity_check_done = true; + + init_second_stage(); + } catch (e) { - exception_error("labelFieldsCheck", e); + exception_error("backend_sanity_check_callback", e, transport); + } +} + +function has_local_storage() { + try { + return 'localStorage' in window && window['localStorage'] != null; + } catch (e) { + return false; + } +} + +function catSelectOnChange(elem) { + try { + var value = elem[elem.selectedIndex].value; + var def = elem.getAttribute('default'); + if (value == "ADD_CAT") { + + if (def) + dropboxSelect(elem, def); + else + elem.selectedIndex = 0; + + quickAddCat(elem); + } + + } catch (e) { + exception_error("catSelectOnChange", e); + } +} + +function quickAddCat(select) { + try { + var cat = prompt(__("Please enter category title:")); + + if (cat) { + + var query = "?op=rpc&subop=quickAddCat&cat=" + param_escape(cat); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function (transport) { + var response = transport.responseXML; + + var payload = response.getElementsByTagName("payload")[0]; + + if (payload) + select.innerHTML = payload.firstChild.nodeValue; + + } }); + + } + + } catch (e) { + exception_error("quickAddCat", e); } }