Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name Heise.de Forum: all comments on one page
- // @description All comments on one page, iReply, quick-vote, user-scores.
- // @include http://*heise.de/*/foren/*
- // @include http://*heise.de/foren/*
- // @version 21.03.2012
- // ==/UserScript==
- /*global console, unsafeWindow, window, prompt, escape */
- /*global GM_log, opera */
- if(typeof unsafeWindow === 'undefined') {
- unsafeWindow = window;
- }
- (function(HACOOP, $, undefined) {
- /********************************************
- * USER SETTINGS
- ********************************************/
- HACOOP.Settings = {
- RemoteStorageKeyPrefix: "HACOOP",
- // User score is scaled by this value and then fitted into 0-10
- PosterScoreScaleFactor: 0.3,
- OverviewPagePostCount: 16,
- MaxJoinedPosts: 16 * 10, // in overview, add x posts * y pages
- MaxJoinedPostsInThread: 80,
- BranchBorderStyle: '1px dashed',
- RemarkTagPrefix: "!-!",
- // Reply stuff
- EnableIReply: 1,
- EnableAutoQuote: 1,
- EnableQuickVote: 1,
- // Colors used for different branch levels
- GetBranchColor: function(level) {
- switch(level % 8) {
- case 0: return "#999999";
- case 1: return "#445599";
- case 2: return "#995544";
- case 3: return "#449955";
- case 4: return "#994455";
- case 5: return "#554499";
- case 6: return "#CC77CC";
- case 7: return "#554499";
- }
- },
- // Colors used for coloring quote levels
- GetQuoteColor: function(level) {
- switch(level) {
- case 2: return "#668811";
- case 3: return "#445599";
- case 4: return "#995544";
- case 5: return "#449955";
- case 6: return "#994455";
- case 7: return "#554499";
- case 8: return "#CC77CC";
- case 9: return "#554499";
- // ...
- default: return "";
- }
- }
- };
- HACOOP.Conventions = {
- IsNoTextSubject: function(html) {
- var kT = html.match(/(kwT)|(k\.w\.T\.)|\((kT|k\.T\.|k T|nT|n\.T\.|kein Text|nix)\)/i) !== null;
- var re = html.match(/\bRe: /i) !== null;
- return kT && !re;
- },
- GetQuoteLevel: function(html) {
- var patternLength = 10;
- var m = html.match(/^((?:> )+)/);
- if(m === null) {
- return 0;
- }
- return m[0].length / patternLength;
- }
- };
- /********************************************
- * THE CODE
- ********************************************/
- HACOOP.Browser = {
- Log: function(msg) {
- if(typeof console !== 'undefined') {
- if(typeof console.log !== 'undefined') {
- console.log(msg);
- }
- }
- else if(typeof GM_log !== 'undefined') {
- GM_log(msg);
- }
- else if(typeof opera !== 'undefined') {
- opera.postError(msg);
- }
- else {
- // TODO
- // alert(msg);
- }
- },
- AjaxRequest: function(url, callback, args) {
- var xmlHttp = new XMLHttpRequest();
- url = HACOOP.Page.EnsureAbsoluteUrl(url);
- xmlHttp.open('GET', url, true);
- xmlHttp.onreadystatechange = function () {
- if(xmlHttp.readyState === 4 &&
- xmlHttp.status === 200) {
- callback(url, xmlHttp.responseText, args);
- }
- };
- xmlHttp.send(null);
- }
- };
- function encodeHTML(text) {
- return $('<div/>').text(text).html();
- }
- HACOOP.Helpers = {
- Trim: function(str) {
- var a = str.replace(/^\s+/, '');
- return a.replace(/\s+$/, '');
- },
- GetFirstMatching: function(jquerySelectors, context){
- for(var i = 0; i < jquerySelectors.length; i++) {
- var selector = jquerySelectors[i];
- var res = $(selector, context);
- if(res.length > 0) {
- return res;
- }
- }
- return null;
- },
- IsRemarkTag: function(tag) {
- return tag.match("^"+HACOOP.Settings.RemarkTagPrefix);
- }
- };
- HACOOP.Images = {
- BranchOpt_Collapse: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAn5JREFUeNrEV01oE0EU/mY3ie1BUfHiQSmiJwVFDyIVCv5URFREpTftSejVQ/AHj6IEEXoq9FQFhUAxiEIg1YOFHDwIChEFxV+EIpYehNZsdnd8b3Y32V1isxvi5JEvmze7+963732zmRFSSqxmQoh2w5nR25iFgdNw8bhyBedozG53Yaf46oLV0MbMwzfx6MYDSNt6L/nIPo93FT8lAS/5Q8iFxadydn5IHdn/F4lO8UWKFnDy4vA2nL04MoVnryea1xzZM4V7LyZQ/YTS8+s4T0NO0hYkJZA9VsDXA0PYfGZfHi8/FOiE+kDdTV/7d+RRelVA9SNKc9daJHpBIHviDhYObsfGozvHUPteRMMJznEC73eWir9ryxjm3hYx/w7l8lWcYmH2gsD6k3ex5LgUjbBiAfcvzaDyZrxJYHT3DC5Mj2MwR9PDoF4RnlzGOrr9d6f4GSQwCraXDhsIuUO3UBbChuT6C68F7HMFKnkcJ7dOWCQYSWInIbBM+EL44ZPgunnhAxGI5lN+JiwRGoSVXhGwfITM9ZKLkO8ZJ/+JFJZBSuOcjluPEGBfoDvLdHOTywUJtcCNF+h/E3CkHa2AtPUScBFtgfJ1EVAaIJELs6VB5evWgPQzSvRBA66sI/zIytcuQjPm90WE6IMIPdFZEQKOfg1Ykb8a5euchqz6YKHU9LVWQNhRDQjtIoy1QLcG7NgssHW/isNvQvRHA95/AS/3WIzsQzsBw1+J6SbAK14z18CagWA96PmmoYeAbCyjOjldG3bd1qBh1MDjwT4llaZS7o7XErYSNsXI84vgF+Eb7wXS7I7TEuCkg4QBRCaievI//lLcTkPgrwADAJGtdBYZQxi9AAAAAElFTkSuQmCC',
- BranchOpt_Expand: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkxJREFUeNrkVz1IHEEU/uZ2NaeFGEhloensY2chORuJgthY2KWxFFFEsBGs/CEYxNLWzkYEzWFx6hZ26dKkCKiFECwUDYm3Pze+Nze3t3fRc1e9ucKBx/LN3/vm/cy+EVJK1GpCiCi0B1ew7QNDBV7GQsMpEhvY3ZvFCPX40QWP7W8jWWth5WujM/B8rZ1YNNkCk1tfhnic5CbJhkkJpIMC0Jruxrfv41o98KlnA9zP4/UmIKQ+uNBScoO2tEi4X2ICCNVYoQeeoPaZBIJCUFQqItgUgeKh85CagNRYmLRAQbqUe2UXKGySgA+3wgUKmyQgZSUBadICrDMghcIqB7/CRmOg5IIobkgQRrHRe6DKAoFxCzTaBT6ZXFo6AzQ2mgV84lKZEOLXFwOpRqZhI4NQaJMLUS4FAhi/CfNVLsibs4BUd79XLMvCf4EHWUcCzcOryAdU9Pgkrsu/X68iBhj71DWwhN823Q8Wyc403tCQ+xIEWm7/IJf5iP73XUUCF39/VLiA8ecxYtoMnJwCB4fI6RL9UQKpOC7fn8d0dhfOz18EOPjuEe7ncZ7H81VoxGhxCPwjOT9axlQuC+fkjMxGdkvpqpi/jLmfx3kez9fr4tT5sZ5mrO4tSWffLL5mBtHH7uC4YH8rs+/BcVaUcqKCS5WdMZ5makItiTQm8Y7kA5E4WnAgN88h+cuY+/W4lWR/kfBxGloiM4f1dDt6b69wfLCIieqTx32cJiUQJdFB0kZyrX3+n/J6ESilL6dZE4mnA85/yMW12p0AAwDSETpC4pZz6QAAAABJRU5ErkJggg==',
- End: ''
- };
- HACOOP.Page = {
- BaseUrl: 'http://' + document.location.host,
- EnsureAbsoluteUrl: function(url) {
- if(!url) { return url; }
- if(url.match(/^\//)) {
- url = this.BaseUrl + url;
- }
- return url;
- },
- Styles: {
- Add: function(css) {
- var style = document.createElement("style");
- style.type = "text/css";
- style.innerHTML = css;
- document.body.appendChild(style);
- }
- },
- Scripts: {
- AddByCode: function(code) {
- var script = document.createElement("script");
- script.type = "text/javascript";
- script.innerHTML = code;
- document.body.appendChild(script);
- },
- AddByURL: function(url) {
- var script = document.createElement("script");
- script.type = "text/javascript";
- script.src = url;
- document.body.appendChild(script);
- }
- }
- };
- HACOOP.DB = {
- Remote: {
- MasterPrefix: 'HACOOP',
- GetRemoteStorage: function() {
- if(window.remoteStorage) {
- return window.remoteStorage;
- }
- if((typeof unsafeWindow !== 'undefined') &&
- unsafeWindow.remoteStorage) {
- return unsafeWindow.remoteStorage;
- }
- HACOOP.Browser.Log('Remote storage not loaded. Can\'t get value.');
- return null;
- },
- Get: function(prefix, key, callback) {
- var rs = this.GetRemoteStorage();
- var cb = function(string, key) {
- var obj;
- try {
- obj = JSON.parse(string);
- }
- catch(ex) {
- HACOOP.Browser.Log('Couldn\'t parse remotely stored value: ' + string);
- obj = ex;
- }
- callback(obj);
- };
- rs.getItem(this.MasterPrefix + '-' + prefix + '-' + key, cb);
- },
- // max. 64kB per key
- // TODO: store in multiple strings
- Set: function(prefix, key, value) {
- var rs = this.GetRemoteStorage();
- var string = JSON.stringify(value);
- rs.setItem(this.MasterPrefix + '-' + prefix + '-' + key, string);
- }
- },
- Local: {
- Get: function(key, defaultValue) {
- if(!window.localStorage) {
- HACOOP.Browser.Log('Local storage not available. Can\'t get value.');
- return;
- }
- var string = window.localStorage.getItem(key);
- if(string === null) {
- return defaultValue;
- }
- try {
- return JSON.parse(string);
- }
- catch(ex) {
- HACOOP.Browser.Log('Couldn\'t parse locally stored value:' + string);
- return null;
- }
- },
- Set: function(key, value) {
- if(!window.localStorage) {
- HACOOP.Browser.Log('Local storage not available. Can\'t save.');
- return;
- }
- var string = JSON.stringify(value);
- window.localStorage.setItem(key, string);
- }
- },
- Settings: {
- Prefix: 'Settings',
- DB: null,
- Get: function() {
- if(this.DB) {
- return this.DB;
- }
- this.DB = HACOOP.DB.Local.Get(this.Prefix, {});
- HACOOP.Browser.Log("Settings from local DB:", this.DB);
- return this.DB;
- },
- Set: function(settings) {
- this.DB = settings;
- HACOOP.Browser.Log("Settings to local DB:", this.DB);
- HACOOP.DB.Local.Set(this.Prefix, this.DB);
- }
- },
- UserScores: {
- Prefix: 'score_',
- GetPosterScore: function(author) {
- author = HACOOP.Helpers.Trim(author);
- return HACOOP.DB.Local.Get(this.Prefix + author);
- },
- ScorePoster: function(author, score) {
- author = HACOOP.Helpers.Trim(author);
- var oldScore = this.GetPosterScore(author);
- HACOOP.DB.Local.Set(this.Prefix + author, oldScore + score);
- }
- },
- UserTags: {
- Prefix: "UserTags",
- DB: null,
- Load: function() {
- if(this.DB) {
- return;
- }
- this.DB = HACOOP.DB.Local.Get(this.Prefix, {});
- },
- Save: function() {
- HACOOP.DB.Local.Set(this.Prefix, this.DB);
- },
- Clear: function() {
- this.DB = {};
- this.Save();
- },
- _knownTagsCache: null,
- GetKnownTags: function() {
- if(this._knownTagsCache) {
- return this._knownTagsCache;
- }
- var tags = {};
- for(var userName in this.DB) {
- if(this.DB.hasOwnProperty(userName)) {
- var entry = this.DB[userName];
- for(var tag in entry) {
- if(entry.hasOwnProperty(tag)) {
- if(HACOOP.Helpers.IsRemarkTag(tag)) {
- continue;
- }
- if(!tags[tag]) {
- tags[tag] = 0;
- }
- tags[tag]++;
- }
- }
- }
- }
- this._knownTagsCache = tags;
- return tags;
- },
- SanizeUserName: function(userName) {
- userName = HACOOP.Helpers.Trim(userName);
- return userName;
- },
- GetUserEntry: function(userName) {
- userName = this.SanizeUserName(userName);
- this.Load();
- var entry = this.DB[userName];
- if(!entry) {
- this.DB[userName] = {};
- entry = this.DB[userName];
- }
- return entry;
- },
- Get: function(userName, tag) {
- var userEntry = this.GetUserEntry(userName);
- return userEntry[tag];
- },
- Set: function(userName, tag, val) {
- var userEntry = this.GetUserEntry(userName);
- userEntry[tag] = val;
- this._knownTagsCache = null;
- this.Save();
- },
- Inc: function(userName, tag, offVal) {
- var oldVal = this.Get(userName, tag);
- HACOOP.Browser.Log("Inc(): UserName=", userName, ", Tag=", tag, ", OffVal=", offVal);
- HACOOP.Browser.Log("Inc(): oldVal=", oldVal);
- if(!oldVal) {
- oldVal = 0;
- }
- var newVal = oldVal + offVal;
- this.Set(userName, tag, newVal);
- return newVal;
- }
- },
- LoadFromRemote: function(prefix, callback) {
- this.Remote.Get(prefix, 'Settings', function(o) {
- if(o) {
- HACOOP.DB.Settings.Set(o);
- }
- HACOOP.Browser.Log("Retrieved Settings:", o);
- callback(o);
- });
- this.Remote.Get(prefix, 'UserTags', function(o) {
- if(o) {
- HACOOP.DB.UserTags.DB = o;
- HACOOP.DB.UserTags.Save();
- }
- HACOOP.Browser.Log("Retrieved UserTags:", o);
- callback(o);
- });
- },
- SaveToRemote: function(prefix) {
- this.Remote.Set(prefix, 'Settings', this.Settings.DB);
- this.Remote.Set(prefix, 'UserTags', this.UserTags.DB);
- }
- };
- HACOOP.Heise = {
- PageTypes: {}, // defined below
- Urls: {
- SearchUrl: HACOOP.Page.BaseUrl + '/foren/suche?q=',
- GetSearchURLForUser: function(userName) {
- return this.SearchUrl + encodeURIComponent(userName);
- },
- GetScoreBarCodeImageCode: function(absScore) {
- // TODO: think about making it logarithmical
- var score = absScore * HACOOP.Settings.PosterScoreScaleFactor;
- score += 5;
- if(score >= 4 && score <= 6) {
- return null;
- }
- score = Math.min(score, 10);
- score = Math.max(score, 0);
- score += 1;
- score = Math.round(score);
- return "<img src=\"/icons/forum/wertung_" + score + ".gif\" title=\"User-Score: " + absScore + "\"/>";
- },
- GetPosterScoreBarCode: function(userName) {
- var absScore = HACOOP.DB.UserScores.GetPosterScore(userName);
- if (absScore === undefined) {
- return null;
- }
- return this.GetScoreBarCodeImageCode(absScore);
- }
- },
- RegExps: {
- PostingBody: /((<div class="vote_posting">[\s\S]*?)?(?=(<div class="posting_date">))\3[\s\S]*?(?=(<div class="tovote_links">))\4[\s\S]*?<\/div>)/,
- TitleLinkURL: /<a[^>]*? href="([\s\S]*?)"[^>]*? title=(["'])[\s\S]*?\2[^>]*?>/i,
- TitleLinkURL2: /<a[^>]*? title=(["'])[\s\S]*?\2[^>]*? href="([\s\S]*?)"[^>]*?>/i
- },
- GetTitleLinkURL: function(html) {
- var res = html.match(this.RegExps.TitleLinkURL);
- if(res) {
- return res[1];
- }
- res = html.match(this.RegExps.TitleLinkURL2);
- if(res) {
- return res[2];
- }
- return null;
- },
- EnsureShowThreadLinks: function() {
- $('a').each(function(index, element) {
- if(element.href.match(/\/read\//)) {
- element.href = element.href.replace(/\/read\/(?!showthread-1)/, '/read/showthread-1/');
- }
- });
- },
- GetPageType: function(url, content) {
- for(var propName in this.PageTypes) { if(true) {
- var pageType = this.PageTypes[propName];
- if(url.match(pageType.RegExp)) {
- return pageType;
- }
- if(pageType.ContentMatch(content)) {
- return pageType;
- }
- }}
- return null;
- }
- };
- // http://www.heise.de/developer/artikel/foren/forum-223899/write/
- // http://www.heise.de/foren/forum-7320/write/
- HACOOP.Heise.PageTypes.NewThread = (function() {
- function onPageLoad() {
- }
- return {
- Name: 'New Thread',
- ContentMatch: function(html) { return false; },
- RegExp: /\/foren\/forum-\d+\/write\//i,
- OnPageLoad: onPageLoad
- };
- })();
- HACOOP.Heise.PageTypes.EditPage = (function() {
- function onPageLoad() {
- }
- return {
- Name: 'Edit Page',
- ContentMatch: function(html) { return false; },
- RegExp: /^a$/i, // TODO
- OnPageLoad: onPageLoad
- };
- })();
- // http://www.heise.de/open/foren/forum-91253/msg-16549489/write/
- // http://www.heise.de/ix/foren/forum-222910/msg-21507591/write/
- // http://www.heise.de/developer/artikel/foren/forum-223899/msg-21561448/write/
- // http://www.heise.de/foren/forum-7265/msg-21538411/write/
- HACOOP.Heise.PageTypes.ReplyPage = (function() {
- function autoQuote() {
- if(document.getElementsByName("message")[0].value !== "") {
- return;
- }
- // select the right button the ultra hacky way
- document.getElementsByName("quote")[0].click();
- }
- function cleanUpReplyPage()
- {
- var form = HACOOP.Helpers.GetFirstMatching(['div.forum_content', '#mitte_forum']);
- var html = form[0].innerHTML;
- // messy but working
- html = html.replace(/(Unsere Foren|Dieses Forum)[\s\S]*<textarea/i, "<textarea");
- html = html.replace(/<i>\([^)]+\)<\/i>/ig, "");
- document.body.innerHTML = html;
- }
- function onPageLoad() {
- // if it's inlined...
- if(window !== top) {
- if(HACOOP.Settings.EnableAutoQuote) {
- autoQuote();
- }
- cleanUpReplyPage();
- return;
- }
- }
- return {
- Name: 'Reply Page',
- ContentMatch: function(html) {
- return html.match(/<span class="red">Um die Übersichtlichkeit[^<]+kürzen.</);
- },
- RegExp: /\/foren\/forum-\d+\/msg-\d+\/write\//i,
- OnPageLoad: onPageLoad
- };
- })();
- // http://www.heise.de/open/foren/S-heise-open-mit-neuem-Layout-und-neuer-Struktur/forum-91253/msg-16549489/read/showthread-1/
- // http://www.heise.de/newsticker/foren/S-Warum-ueberhaupt-Warnungen/forum-224299/msg-21576375/read/showthread-1/
- // http://www.heise.de/ix/foren/S-1-2-OT-einfache-Intranet-Suche/forum-222910/msg-21507591/read/showthread-1/
- // http://www.heise.de/tp/foren/S-Viel-zu-kompliziert-gedacht-DAK-schiesst-sich-mit-Studie-selbst-ins-Knie/forum-224387/msg-21583811/read/
- // http://www.heise.de/tp/foren/S-Re-Viel-zu-kompliziert-gedacht-DAK-schiesst-sich-mit-Studie-selbst-ins-Knie/forum-224387/msg-21584200/read/
- // http://www.heise.de/developer/artikel/foren/S-Da-regen-sich-alle-ueber-Vorratsdatenspeicherung-auf/forum-223899/msg-21561448/read/showthread-1/
- // http://www.heise.de/foto/foren/S-Re-Was-tun/forum-134009/msg-21576590/read/showthread-1/
- HACOOP.Heise.PageTypes.ThreadPost = (function() {
- function quickVoteFunctionBuilder(voteLink, url, author) {
- return function() {
- HACOOP.Browser.Log("voted for author: " + author);
- // mark as voted
- voteLink.style.backgroundColor = "yellow";
- // extract score
- var matches = url.match(/postvote-(-?\d)/);
- if(!matches) { return; }
- var score = parseInt(matches[1], 10);
- HACOOP.Browser.Log("score: " + score);
- // score the author
- HACOOP.DB.UserScores.ScorePoster(author, score);
- };
- }
- function countLevel(el) {
- var lvl = 1;
- // limit loop, just to be sure
- for(var i = 0; i < 10000; i++) {
- var par = el.parentNode;
- el = par;
- if(par === null) { break; }
- if(par.className === "thread_tree") { break; }
- if(par.className === "nextlevel" ||
- par.className === "nextlevel_line") {
- lvl++;
- }
- }
- return lvl;
- }
- function colorizeQuotes(div) {
- $('p span.quote', div).each(function(i, element) {
- var quoteLevel = HACOOP.Conventions.GetQuoteLevel(element.innerHTML);
- if(quoteLevel > 0) {
- var color = HACOOP.Settings.GetQuoteColor(quoteLevel);
- if(color !== "") {
- element.innerHTML = "<span style=\"color: " + color + "\">" + element.innerHTML + "</span>";
- }
- }
- });
- }
- function buildDropdownMenu(specialEntries, entryKeyVals) {
- // make some ordinary container
- var container = document.createElement('div');
- container.setAttribute('class', 'dropDown');
- // fill it with some crazy HTML
- var code = "<ul>";
- for(var skey in entryKeyVals) {
- var sval = entryKeyVals[skey];
- code += '<li key="'+escape(sval)+'" val="'+escape(skey)+'">' +
- encodeHTML(skey) +
- '</li>';
- }
- code += "</ul><ul>";
- for(var key in specialEntries) {
- var val = specialEntries[key];
- code += '<li class="special" key="'+escape(val)+'" val="'+escape(key)+'">' +
- encodeHTML(key) +
- '</li>';
- }
- code += "</ul>";
- container.innerHTML = code;
- document.body.appendChild(container);
- return $(container);
- }
- var newTagText = 'new...';
- var newRemarkTagText = 'remark...';
- function handleAddTagButtonClick() {
- var button = $(this);
- var knownTags = HACOOP.DB.UserTags.GetKnownTags();
- var specialVals = {};
- specialVals[newTagText] = -1;
- specialVals[newRemarkTagText] = -1;
- var ddm = buildDropdownMenu(specialVals, knownTags);
- ddm.slideUp(0);
- function handleAddTagEntryClick() {
- var entry = $(this);
- var tag = entry.attr('val');
- if(tag === newTagText) {
- tag = prompt("Name für neues Tag?");
- if(!tag) {
- return;
- }
- }
- else if(tag === newRemarkTagText) {
- tag = prompt("Kommentar?");
- if(!tag) {
- return;
- }
- tag = HACOOP.Settings.RemarkTagPrefix + tag;
- }
- var tagContainer = button.closest('div.userTagsContainer');
- var userName = tagContainer.attr('HACOOP-userName');
- HACOOP.DB.UserTags.Inc(userName, tag, 1);
- fillUserTagContainer(tagContainer[0]);
- }
- $(ddm).find('li').click(handleAddTagEntryClick);
- ddm.css('top', button.offset().top + button.height());
- ddm.css('left', button.offset().left);
- ddm.slideDown(300);
- return false;
- }
- function handleTagScoreChange(userTagDiv, val) {
- var tagScoreSpan = $(userTagDiv).find('span.tagScore');
- var userTagsDiv = $(userTagDiv).closest('div.userTagsContainer');
- if(!userTagsDiv.length) {
- alert("Can't find score userName!");
- }
- if(!userTagDiv.length) {
- alert("Can't find score tag!");
- }
- var userName = userTagsDiv.attr('HACOOP-userName');
- var userTag = userTagDiv.attr('HACOOP-tag');
- HACOOP.Browser.Log("UserName: ", userName, ", Tag: ", userTag);
- var newVal = HACOOP.DB.UserTags.Inc(userName, userTag, val);
- HACOOP.Browser.Log("New value: ", newVal);
- $(tagScoreSpan)[0].innerHTML = newVal;
- }
- function handleTagScoreLeft() {
- handleTagScoreChange($(this), 1);
- return false;
- }
- function handleTagScoreRight() {
- handleTagScoreChange($(this), -1);
- return false;
- }
- function fillUserTagContainer(containerDivObj) {
- var userName = containerDivObj.getAttribute('HACOOP-userName');
- containerDivObj.innerHTML = '<span class="addUserTagButton">+</span>';
- var userTagsEntry = HACOOP.DB.UserTags.GetUserEntry(userName);
- for(var tag in userTagsEntry) {
- var tagScore = userTagsEntry[tag];
- if(tagScore === 0) {
- continue;
- }
- var tagDiv = document.createElement('div');
- tagDiv.setAttribute('HACOOP-tag', tag);
- if(HACOOP.Helpers.IsRemarkTag(tag)) {
- tagDiv.setAttribute('class', 'userTag remarkTag');
- tag = tag.substring(HACOOP.Settings.RemarkTagPrefix.length);
- }
- else {
- tagDiv.setAttribute('class', 'userTag');
- }
- tagDiv.innerHTML = '<span class="' + ((tagScore > 0) ? 'positive' : 'negative')+ '">'+encodeHTML(tag)+'</span><span class="tagScore">'+tagScore+'</span>';
- containerDivObj.appendChild(tagDiv);
- }
- $('span.addUserTagButton', containerDivObj).click(handleAddTagButtonClick);
- $('div.userTag', containerDivObj).click("contextmenu", handleTagScoreLeft);
- $('div.userTag', containerDivObj).bind("contextmenu", handleTagScoreRight);
- }
- function processMessageDiv(div, messageUrl, pageInfo) {
- // link username to search
- var userIs = HACOOP.Helpers.GetFirstMatching(['div.user_info i a', 'div.user_info i'], div);
- var userI = null;
- if(userIs.length) {
- userI = userIs[0];
- }
- var userName;
- if(userI !== null) {
- userName = userI.innerHTML.replace(/^(.*?), .*$/, "$1");
- userI.innerHTML = "<a href=\"" + HACOOP.Heise.Urls.GetSearchURLForUser(userName) + "\">" + userI.innerHTML + "</a>";
- var scoreImgCode = HACOOP.Heise.Urls.GetPosterScoreBarCode(userName);
- if(scoreImgCode !== null) {
- userI.innerHTML += " " + scoreImgCode;
- }
- var userTagsDivObj = document.createElement('div');
- userTagsDivObj.setAttribute('class', 'userTagsContainer');
- userTagsDivObj.setAttribute('HACOOP-userName', userName);
- $(userTagsDivObj).insertAfter($('div.user_info', div));
- fillUserTagContainer(userTagsDivObj);
- // HACOOP.Browser.Log("Known Tags:");
- // HACOOP.Browser.Log(HACOOP.DB.UserTags.GetKnownTags());
- // HACOOP.DB.UserTags.Set(userName, 'toast', 123);
- // HACOOP.DB.UserTags.Set(userName, 'bread', 123);
- // HACOOP.DB.UserTags.Clear();
- }
- else {
- userName = "?";
- HACOOP.Browser.Log("Could not find username div!");
- }
- colorizeQuotes(div);
- // set the reply & edit links
- if(pageInfo.ReplyLink) {
- var replyLinkInlineA = "<a style=\"color: #6673DD\" onclick=\"iReply('" + div.getAttribute("replyFrameID") +
- "', '" + pageInfo.ReplyLink + "')\">iReply</a>";
- var replyLinkA = "<a href=\"" + pageInfo.ReplyLink + "\">Beantworten</a>";
- if(userI) {
- userI.innerHTML += " --- " + replyLinkA + (HACOOP.Settings.EnableIReply ? " / " + replyLinkInlineA : "");
- if(pageInfo.EditLink) {
- var editLinkA = "<a href=\"" + pageInfo.EditLink + "\">Editieren</a>";
- userI.innerHTML += " / " + editLinkA;
- }
- }
- }
- // link posting title to posting
- var postingSubject = $('h3.posting_subject', div);
- if(postingSubject.length)
- {
- if(HACOOP.Conventions.IsNoTextSubject(postingSubject[0].innerHTML))
- {
- var postingText = $('p.posting_text', div)[0];
- postingText.style.color = "#CCCCCC";
- postingText.style.margin = "0.3em";
- // postingSubject.style.color = "#AA00AA"; // colorize title is better
- }
- postingSubject[0].innerHTML = "<a href=\"" + messageUrl + "\">" + postingSubject[0].innerHTML + "</a>";
- }
- else {
- HACOOP.Browser.Log("Posting subject not found!");
- }
- // var voteLinksDiv = xpath(".//div[@class='tovote_links'][1]", div);
- // if(voteLinksDiv !== null)
- // voteLinksDiv.style.float = "right";
- // TODO: float
- // relink voting buttons
- if(HACOOP.Settings.EnableQuickVote) {
- $('div.tovote_links a', div).each(function(i, voteLink) {
- var url = voteLink.href;
- voteLink.removeAttribute("href");
- voteLink.addEventListener("click",
- quickVoteFunctionBuilder(voteLink, url, userName),
- true);
- voteLink.setAttribute("onclick", "sendVote(this, '" + url + "');");
- });
- }
- }
- function appendReplyFrame(div, id, divPost)
- {
- if(div === null) {
- HACOOP.Browser.Log("div to attach reply frame to is null");
- return;
- }
- var iReplyFrame = document.createElement('iframe');
- iReplyFrame.id = "reply" + id;
- iReplyFrame.style.display = 'none';
- iReplyFrame.style.width = '100%';
- iReplyFrame.style.height = '38em';
- divPost.setAttribute("replyFrameID", iReplyFrame.id);
- var divReply = document.createElement('div');
- divReply.style.marginLeft = divPost.style.marginLeft;
- divReply.appendChild(iReplyFrame);
- div.appendChild(divReply);
- }
- // parse stuff directly out of the HTML
- function parsePostingPageHTML(html) {
- // pre-check the posting for performance issues
- // else match can lock up
- if(html.indexOf('<div class="posting_date">') === -1 ||
- html.indexOf('<div class="tovote_links">') === -1) {
- HACOOP.Browser.Log("No known posting:");
- HACOOP.Browser.Log(html);
- return null;
- }
- var mtchs = html.match(HACOOP.Heise.RegExps.PostingBody);
- if(mtchs === null) {
- HACOOP.Browser.Log("Could not parse posting.");
- return null;
- }
- var postHtml = mtchs[1];
- if(!postHtml) {
- HACOOP.Browser.Log("Could not parse posting (2).");
- return null;
- }
- var replyLinks = html.match(/<a href="([^"]*)"\s*>Beantworten<\/a>/);
- var replyLink = (replyLinks !== null) ? replyLinks[1] : "";
- var editLinks = html.match(/<a href="([^"]*)"[^>]*>\s*Editieren<\/a>/);
- var editLink = (editLinks !== null) ? editLinks[1] : "";
- replyLink = HACOOP.Page.EnsureAbsoluteUrl(replyLink);
- editLink = HACOOP.Page.EnsureAbsoluteUrl(editLink);
- return {
- PostHTML: postHtml,
- ReplyLink: replyLink,
- EditLink: editLink
- };
- }
- function callbackThread(url, html, args)
- {
- HACOOP.Browser.Log('Processing post from ' + url);
- var pageInfo;
- try
- {
- pageInfo = parsePostingPageHTML(html);
- if(!pageInfo)
- {
- HACOOP.Browser.Log('Error processing post HTML: No page info.');
- return;
- }
- }
- catch(e)
- {
- HACOOP.Browser.Log('Error processing post HTML: ' + e);
- return;
- }
- try
- {
- // insert the relevant part into the DOM
- args.Div.innerHTML = pageInfo.PostHTML;
- // manipulate it further
- processMessageDiv(args.Div, url, pageInfo);
- }
- catch(ex)
- {
- HACOOP.Browser.Log('Error processing post DOM: ' + ex);
- }
- }
- function collapseBranch() {
- var button = $(this);
- var branch;
- if(button.attr('class') === 'treeCollapseButton') {
- var hid = button.next().attr('HACOOP-id');
- branch = $('div.HACOOP-posting[HACOOP-id="'+hid+'"]').closest('div.HACOOP-branch');
- }
- else {
- branch = button.closest('div.HACOOP-branch');
- }
- if(branch.attr('collapsed')) {
- branch.height('');
- branch.attr('collapsed', '');
- button.attr('src', HACOOP.Images.BranchOpt_Collapse);
- }
- else {
- branch.css('overflow', 'hidden');
- branch.height('4em');
- branch.attr('collapsed', '1');
- button.attr('src', HACOOP.Images.BranchOpt_Expand);
- }
- }
- function floatThreadTree() {
- function getCentermostPosting() {
- function getYDistanceFromCenter(obj) {
- if($(obj).parents('div.HACOOP-branch[collapsed="1"]').length) {
- return 10000000;
- }
- var winMidY = $(window).scrollTop() + $(window).height() / 2;
- var objMidY = $(obj).position().top + $(obj).height() / 2;
- return Math.abs(winMidY - objMidY);
- }
- function comparator(a, b) {
- return getYDistanceFromCenter(a) - getYDistanceFromCenter(b);
- }
- return $(".HACOOP-posting").sort(comparator)[0];
- }
- // move the content to the left
- var mainContainer = $('#container');
- mainContainer.css('margin', '0');
- // add a container for the thread tree
- var treeContainerObj = document.createElement('div');
- treeContainerObj.id = "treeContainer";
- document.body.appendChild(treeContainerObj);
- var contentContainer = $('#container_content');
- var treeContainer = $('#treeContainer');
- treeContainer.css('background-color', 'white');
- treeContainer.css('position', 'absolute');
- treeContainer.css('left', contentContainer.width());
- // put the thread tree in a div and move it right
- var threadTree = $('ul.thread_tree');
- threadTree.appendTo(treeContainer);
- // click on a topic = scroll to it
- threadTree.find('div.thread_title').click(function(){
- var id = $(this).closest('div').attr('hacoop-id');
- var postingDiv = $('.HACOOP-posting[hacoop-id="'+id+'"]');
- if(postingDiv) {
- $(window).scrollTop(postingDiv.position().top);
- return false;
- }
- return true;
- });
- // doubleclick on a topic = open it regularly
- threadTree.find('a').dblclick(function(){
- window.location.href = $(this).attr('href');
- return false;
- });
- function updateFloatTreePosition() {
- var centerPost = getCentermostPosting();
- var id = centerPost.getAttribute('HACOOP-id');
- var nonActiveTreePosts = treeContainer.find('div.thread_title[HACOOP-id!="'+id+'"]');
- nonActiveTreePosts.each(function(i) {
- $(this).css("background", "none");
- });
- var activeTreePost = treeContainer.find('div.thread_title[HACOOP-id="'+id+'"]');
- if(activeTreePost.length === 1) {
- activeTreePost.css("background-color", "#FFFFBB");
- }
- var topOffset;
- if(treeContainer.outerHeight() > $(window).height()) {
- topOffset = $(window).height() / 2 - activeTreePost.position().top;
- }
- else {
- topOffset = ($(window).height() - treeContainer.outerHeight()) / 2;
- }
- treeContainer.css('top', $(window).scrollTop() + topOffset);
- }
- $(window).scroll(updateFloatTreePosition);
- $(window).resize(updateFloatTreePosition);
- // show collapse buttons
- var baseLevel = countLevel($('div.thread_title[HACOOP-id="0"]', threadTree)[0]);
- $('div.thread_title', threadTree).each(function() {
- var line = $(this);
- //if(!line.attr('HACOOP-id') || countLevel(line[0]) != 1 + baseLevel) {
- // return;
- //}
- var collapseImgObj = document.createElement('img');
- collapseImgObj.setAttribute('class', 'treeCollapseButton');
- collapseImgObj.setAttribute('src', HACOOP.Images.BranchOpt_Collapse);
- document.body.appendChild(collapseImgObj);
- line.before(collapseImgObj);
- $(collapseImgObj).click(collapseBranch);
- });
- updateFloatTreePosition();
- }
- function doit() {
- var divStack = [];
- divStack.peek = function() { return this[this.length - 1]; };
- var threadsList = $('ul.thread_tree');
- if(!threadsList.length) {
- HACOOP.Browser.Log("Thread tree not found - activate it!");
- return;
- }
- // create a container for all the replies
- var repliesDiv = document.createElement('div');
- repliesDiv.id = "repliesContainer";
- threadsList[0].parentNode.insertBefore(repliesDiv, threadsList[0]);
- divStack.push(repliesDiv);
- var threadMsgs = $('div.thread_title', threadsList);
- var maxJoinCnt = Math.min(threadMsgs.length, HACOOP.Settings.MaxJoinedPostsInThread);
- var afterActive = 0;
- var cntJoined = 0;
- var rootAbsoluteDepth = 0;
- for(var i = 0; i < threadMsgs.length && cntJoined <= maxJoinCnt; i++) {
- var msgDiv = threadMsgs[i];
- var isActive = 0;
- // search the currently selected beitrag
- if(msgDiv.innerHTML.match("beitrag_aktiv") ||
- msgDiv.innerHTML.match("active_post")) {
- afterActive = 1;
- isActive = 1;
- rootAbsoluteDepth = countLevel(msgDiv);
- msgDiv.setAttribute("HACOOP-id", 0);
- continue;
- }
- else if(afterActive === 0) { continue; }
- // count the number of next_levels upwards
- var curRelativeDepth = countLevel(msgDiv) - rootAbsoluteDepth;
- // only show current subnode
- if(curRelativeDepth <= 0) { break; }
- // find the URL
- var url = HACOOP.Heise.GetTitleLinkURL(msgDiv.innerHTML);
- if(!url || url.match(/^\s*$/)) {
- HACOOP.Browser.Log("Error parsing: " + msgDiv.innerHTML);
- continue;
- }
- HACOOP.Browser.Log("URL: " + url);
- // create div for the branch
- var divBranch = document.createElement('div');
- if(!isActive) {
- divBranch.style.marginLeft = "20px";
- }
- $(divBranch).addClass('HACOOP-branch');
- divBranch.style.borderLeft = HACOOP.Settings.BranchBorderStyle + " " + HACOOP.Settings.GetBranchColor(curRelativeDepth);
- divBranch.innerHTML = '<div class="HACOOP-branchOptions">' +
- '<img class="collapseBranchButton" src="'+HACOOP.Images.BranchOpt_Collapse+'" title="collapse/expand branch" />'+
- '</div>';
- $('.collapseBranchButton', divBranch).click(collapseBranch);
- // create div for the post
- var divPost = document.createElement('div');
- $(divPost).addClass('HACOOP-posting');
- divPost.style.border = "1px dashed #DDDDDD";
- divPost.style.marginLeft = "8px"; // some space from the border
- divPost.setAttribute("HACOOP-id", i);
- msgDiv.setAttribute("HACOOP-id", i);
- // decend down to current level
- while(curRelativeDepth < divStack.length) { divStack.pop(); }
- // add it
- divStack.peek().appendChild(divBranch);
- divBranch.appendChild(divPost);
- // create the ireply frame
- appendReplyFrame(divBranch, cntJoined, divPost);
- // remember current branch
- divStack.push(divBranch);
- // grep it
- HACOOP.Browser.AjaxRequest(url, callbackThread, { Nr: i, Div: divPost});
- cntJoined++;
- }
- }
- function joinThreadPosts()
- {
- var rootPostDiv = HACOOP.Helpers.GetFirstMatching([
- 'div.forum_content',
- '#mitte_forum',
- '#mitte',
- 'td.f-content'
- ]);
- if(rootPostDiv === null) {
- HACOOP.Browser.Log("Root div not found!");
- return;
- }
- var rootPostText = rootPostDiv.children('p.posting_text');
- appendReplyFrame(rootPostText[0], -1, rootPostDiv[0]);
- rootPostText.attr("HACOOP-id", 0);
- $(rootPostText).addClass('HACOOP-posting');
- var pageInfo = parsePostingPageHTML(rootPostDiv[0].innerHTML);
- processMessageDiv(rootPostDiv[0], document.location.href, pageInfo);
- doit();
- if(HACOOP.DB.Settings.Get().chkFloatThreadTree) {
- floatThreadTree();
- }
- }
- function addHelperScripts() {
- // iReply
- HACOOP.Page.Scripts.AddByCode(
- 'function iReply(frameId, replyUrl) {' +
- 'var frm = document.getElementById(frameId);' +
- 'frm.src = replyUrl;' +
- 'frm.style.display = ""' +
- '}');
- // QuickVote
- HACOOP.Page.Scripts.AddByCode(
- 'function sendVote(target, voteUrl) {' +
- 'var xmlHttp = new XMLHttpRequest();' +
- 'xmlHttp.open(\'GET\', voteUrl, true);' +
- 'xmlHttp.send(null);' +
- 'target.style.backgroundColor = "yellow";' +
- '}');
- }
- function onPageLoad() {
- addHelperScripts();
- joinThreadPosts();
- }
- return {
- Name: 'Thread Post Page',
- ContentMatch: function(html) { return false; },
- RegExp: /\/foren\/S-.*\/forum-\d+\/msg-\d+\/read\//i,
- OnPageLoad: onPageLoad
- };
- })();
- // http://www.heise.de/newsticker/foren/S-Gespraeche-ueber-freiwillige-Two-Strikes-Regelung-gescheitert/forum-224299/list/
- // http://www.heise.de/mobil/artikel/foren/
- // http://www.heise.de/ix/foren/
- // http://www.heise.de/ix/foren/S-Steter-Strom/forum-222619/list/
- // http://www.heise.de/ix/foren/S-Ausgangskontrolle/forum-222616/list/
- // http://www.heise.de/tp/foren/
- // http://www.heise.de/foto/foren/llist/
- // http://www.heise.de/foto/foren/llist/hs-16/
- // http://www.heise.de/foto/foren/S-Kaufberatung/forum-134019/list/hs-48/
- // http://www.heise.de/foto/foren/
- // http://www.heise.de/developer/foren/S-Ajax/forum-146167/list/
- // http://www.heise.de/tp/foren/S-Studie-zur-Wirkung-des-Nichtraucherschutzesgesetzes-in-Deutschland-ist-fragwuerdig/forum-224387/list/
- // http://www.heise.de/developer/artikel/foren/
- // http://www.heise.de/developer/artikel/foren/hs-16/
- // http://www.heise.de/developer/artikel/foren/S-Ein-erster-Entwicklerblick-auf-die-Windows-8-Consumer-Preview/forum-223899/list/c-all/hs-0/
- HACOOP.Heise.PageTypes.BoardOverview = (function() {
- function addPosterScores(root) {
- $('div.thread_user', root).each(function(index, element) {
- var imgCode = HACOOP.Heise.Urls.GetPosterScoreBarCode(
- HACOOP.Helpers.Trim(element.innerHTML));
- if(imgCode !== null) {
- element.innerHTML += " "+imgCode;
- }
- });
- }
- function callbackOverviewPage(url, txt, startli)
- {
- var matches = txt.match(/<ul class=\"(thread_tree|fora_list)\">([\s\S]*)<\/ul>[\s\S]*?<ul class="forum_navi">/i);
- if(!matches) {
- startli.innerHTML = "<b><i>Fehler beim Laden</i></b>";
- return;
- }
- var lis = matches[2];
- lis = lis.replace(/\/read(?!\/showthread-1)/g, "/read/showthread-1");
- startli.innerHTML = "<ul style=\"padding-left: 0px; list-style-type: none\">" + lis + "</ul>";
- addPosterScores(startli);
- }
- function extractPostStart(url)
- {
- var matches = url.match(/\/hs-(\d+)/);
- if(!matches) {
- return -1;
- }
- return parseInt(matches[1], 10);
- }
- function insertPostStart(url, nr)
- {
- var eall = "";
- if(document.location.href.match(/\/e-all/)) {
- eall = "/e-all";
- }
- return url.replace(/(\/(list|foren)\/hs)-\d+/, "$1-" + nr + eall);
- }
- function getFirstLastPageNr() {
- // find the first and last of the page URLs
- var nextPageURL = "", lastPageURL = "";
- var pageLinks = $('ul.forum_navi li');
- for(var i = 0; i < pageLinks.length; i++) {
- var pageLink = pageLinks[i];
- if(pageLink.innerHTML.match(/>Neuere</)) { break; }
- // plain number, no link => current page, start counting
- if(pageLink.innerHTML.match(/^\d+$/)) { nextPageURL = ""; }
- // find the URL
- var url = HACOOP.Heise.GetTitleLinkURL(pageLink.innerHTML);
- if(!url) { continue; }
- nextPageURL = nextPageURL || url;
- lastPageURL = url;
- }
- if(!nextPageURL || !lastPageURL) {
- HACOOP.Browser.Log("found no page URLs");
- return null;
- }
- // extract the post numbers
- var nextPostNr = extractPostStart(nextPageURL);
- var lastPostNr = extractPostStart(lastPageURL);
- if(nextPostNr < 0 || lastPostNr < 0) {
- HACOOP.Browser.Log("found no post numbers");
- return null;
- }
- return {
- NextPostNr: nextPostNr,
- LastPostNr: lastPostNr,
- NextURL: nextPageURL
- };
- }
- function onPageLoad() {
- // add poster scores
- addPosterScores(document);
- // get page bounds
- var pageBounds = getFirstLastPageNr();
- if(pageBounds === null) {
- return;
- }
- // limit pages to users setting
- var limited = false;
- if(pageBounds.LastPostNr - pageBounds.NextPostNr > HACOOP.Settings.MaxJoinedPosts) {
- pageBounds.LastPostNr = pageBounds.NextPostNr + HACOOP.Settings.MaxJoinedPosts;
- limited = true;
- }
- // add list items and load the overview pages into them
- var threadTrees = HACOOP.Helpers.GetFirstMatching(['ul.thread_tree', 'ul.fora_list']);
- if(!threadTrees) {
- HACOOP.Browser.Log("no forum_navi or thread_tree");
- return;
- }
- var threadTree = threadTrees[0];
- for(var j = pageBounds.NextPostNr;
- j <= pageBounds.LastPostNr;
- j += HACOOP.Settings.OverviewPagePostCount)
- {
- var srcUrl = HACOOP.Page.EnsureAbsoluteUrl(insertPostStart(pageBounds.NextURL, j));
- // append a placeholder
- var li = document.createElement('li');
- li.innerHTML = "<b>Beiträge ab Nr. " + j + "</b>";
- threadTree.appendChild(li);
- li = document.createElement('li');
- li.innerHTML = "<i>Lade...</i>";
- threadTree.appendChild(li);
- // request the content
- HACOOP.Browser.AjaxRequest(srcUrl, callbackOverviewPage, li);
- }
- // add links to navigate
- if(pageBounds.NextPostNr > HACOOP.Settings.OverviewPagePostCount) {
- var li_bck = document.createElement('li');
- li_bck.innerHTML = "<a href=\"" + HACOOP.Page.EnsureAbsoluteUrl(insertPostStart(pageBounds.NextURL, pageBounds.NextPostNr - HACOOP.Settings.MaxJoinedPosts)) + "\"><b>Zurück...</b></a>";
- threadTree.insertBefore(li_bck, threadTree.childNodes[0]);
- }
- if(limited) {
- var li_fwd = document.createElement('li');
- li_fwd.innerHTML = "<a href=\"" + HACOOP.Page.EnsureAbsoluteUrl(insertPostStart(pageBounds.NextURL, pageBounds.LastPostNr + HACOOP.Settings.OverviewPagePostCount)) + "\"><b>Weiter...</b></a>";
- threadTree.appendChild(li_fwd);
- }
- }
- return {
- Name: 'Board Overview',
- ContentMatch: function(html) { return false; },
- RegExp: /\/foren\//i,
- OnPageLoad: onPageLoad
- };
- })();
- HACOOP.Page.Styles.Add(
- "img.treeCollapseButton { cursor: pointer; float:left; height: 1em; } " +
- "div.HACOOP-branchOptions { float: left; }" +
- "div.HACOOP-branchOptions img { cursor: pointer; width: 1.2em !important; }" +
- "span.addUserTagButton { cursor: pointer; border: 1px solid black; background-color: #EEDDAA; }" +
- "div.userTagsContainer { display: inline; border: 1px solid #DDFFFF; background-color: #EFFFFF; }" +
- "div.userTag { display: inline; margin-left: 1.0em; font-size: 80%; }" +
- "div.userTag span.positive { color: green; }" +
- "div.userTag span.negative { color: red; }" +
- "div.remarkTag span { color: gray !important; }" +
- "span.tagScore { margin-left: 0.5em; font-weight: bold; }" +
- "div.dropDown { position: absolute; background-color: white; border: 2px solid #FFEEAA; padding: 0 1em 0 1em; }" +
- "div.dropDown ul { font-size: 80%; padding: 0em; } " +
- "div.dropDown ul li { cursor: pointer; } " +
- "div.dropDown ul li.special { cursor: pointer; font-weight: bold; } "
- );
- // menu
- HACOOP.Page.Styles.Add("@media print { #HACOOPmenuButton { display: none; } }");
- HACOOP.Page.Styles.Add(
- "#HACOOPmenuButton { background-color: #eeeeee; font-size: 70%; position: fixed; top: 50px; right: -0.5em; border-bottom: 0; padding: 6px 0 6px 0; }" +
- "#HACOOPoptionDialog { position: fixed; top: 80px; right: 0; z-index: 1001; }" +
- ".ghhpane { position: absolute; color: #333333; background-color: #fcfcfc; border: 1px solid #cccccc; -moz-border-radius: 4px; padding: 0.25em 1.5em; font-size: 13px; display: none} " +
- "#tabStripDiv {margin:0 -1.5em;padding:0 3px 0 8px;border-bottom:1px solid #ccc;} #tabStrip { padding-bottom:0;} " +
- "#tabStrip button{color:#555;background-color:#f5f5f5;margin:0 2px 0 0;border:1px solid #ccc;padding:1px 2px;height:22px;-moz-border-radius:2px;} " +
- "#tabStrip .currentTab { background-color: #fcfcfc; border-bottom-color: #fcfcfc; }" +
- ".HACOOPmenuTab { margin-top: 1em; height: 19em; overflow-y: scroll; border: 1px solid #333; display: none; } " +
- "#tabContainer div.currentTab { display: block !important; } "
- );
- HACOOP.Page.Styles.Add("div.ghhider{color:#888;} div.ghhider:hover{background-color:#eee;} " +
- "button.ghhider{color:#555;background-color:#fcfcfc;font-size:0.85em;margin:auto 2px;border:1px solid #ccc;-moz-border-radius:4px;padding:2px 3px;} " +
- "button.ghhider:hover{color:#000;background:#ff8;} .ghh1time{background:#eee;} .inlinediv{display:inline;} " +
- ".ghhbtn{color:#555;background-color:#f0f0f0;margin:auto 2px;border:1px solid #ccc;-moz-border-radius:4px;padding:2px 3px;} " +
- ".ghhbtn:hover{color:#000;background:#ff8;} " +
- ".ghhhost{display:block;padding:0 0.25em;cursor:pointer;} #ghhutil{text-align:center;margin:0.5em 0 1em 0;border:1px solid #ccc;-moz-border-radius:4px;padding:3px 0;} " +
- ".ghhinfo{font-size:12px;line-height:9px;position:absolute;top:0;right:0;z-index:1001;border:4px solid transparent;-moz-border-radius-bottomleft:8px;-moz-border-radius-topleft:8px;margin-top:1px;padding-left:1px} " +
- ".ghhdel{text-decoration:line-through;color:#333;} .ghhpb{text-decoration:none;color:#f00;} " +
- ".ghhblk{text-decoration:none;color:#333;} .ghhd{position:relative;line-height:1.2em;cursor:pointer;} " +
- ".ghhindent{position:absolute;left:350px;top:-3px;} #btnedit p{margin:2px 4px 4px 4px;} #ghhblockform input[type='radio'], #HACOOPoptionDialog input[type='radio']{vertical-align:bottom;margin-top:5px;margin-bottom:1px} " +
- ".ghhtbl{border:1px solid black;border-collapse:collapse} .ghhtbl td, .ghhtbl th{border:1px solid black;padding:2px 4px;} ");
- function readSettingsFromForm() {
- var settings = {};
- settings['HACOOPokvPassword'] = $('#HACOOPokvPassword').val();
- settings['chkSaveRegularly'] = $('#chkSaveRegularly').attr('checked');
- settings['chkShowUserTags'] = $('#chkShowUserTags').attr('checked');
- settings['chkFloatThreadTree'] = $('#chkFloatThreadTree').attr('checked');
- HACOOP.Browser.Log("Settings from form:", settings);
- return settings;
- }
- function showSettingsInForm(settings) {
- HACOOP.Browser.Log("Settings to form:", settings);
- if(!settings) {
- return;
- }
- $('#HACOOPokvPassword').val(settings['HACOOPokvPassword']);
- $('#chkSaveRegularly').attr('checked', settings['chkSaveRegularly']);
- $('#chkShowUserTags').attr('checked', settings['chkShowUserTags']);
- $('#chkFloatThreadTree').attr('checked', settings['chkFloatThreadTree']);
- }
- function showManageForm(e) {
- var optionDialogs = $("#HACOOPoptionDialog");
- if (!optionDialogs.length) {
- addOptionDialog();
- }
- showSettingsInForm(HACOOP.DB.Settings.Get());
- $('#HACOOPoptionDialog').css('display', 'block');
- }
- function addOptionDialog() {
- function tbtChangeTab() {
- var tbt = $(this);
- var tabid = tbt.attr('data-tabid');
- var currentTab = $('#tabContainer div.currentTab');
- currentTab.removeClass("currentTab");
- var currentTabBtn = $('#tabStrip button.currentTab');
- currentTabBtn.removeClass("currentTab");
- var newTab = $('#'+tabid);
- newTab.addClass("currentTab");
- tbt.addClass("currentTab");
- }
- function getSettings() {
- var settings = readSettingsFromForm();
- HACOOP.DB.Settings.Set(settings);
- return settings;
- }
- function btLoadClicked() {
- var settings = getSettings();
- HACOOP.DB.LoadFromRemote(settings.HACOOPokvPassword, function(o) {
- if(!o) {
- alert('Error retrieving! :(');
- }
- else {
- showSettingsInForm(HACOOP.DB.Settings.Get());
- }
- });
- }
- function btSaveClicked() {
- var settings = getSettings();
- HACOOP.DB.SaveToRemote(settings.HACOOPokvPassword);
- }
- function btCloseClicked() {
- getSettings();
- $('#HACOOPoptionDialog').css('display', 'none');
- }
- var mfd = document.createElement("div");
- mfd.id = "HACOOPoptionDialog";
- mfd.className = "ghhpane";
- mfd.setAttribute("style", "display: none;");
- mfd.innerHTML =
- ' <form onsubmit="return false;">' +
- ' <div id="tabStripDiv">' +
- ' <p id="tabStrip" style="margin:6px 0 -1px 0">' +
- ' <b>HACOOP</b>' +
- ' <button title="Saving stuff online." data-tabid="tabSync" class="tabButton currentTab" id="tbtRemote">Sync</button>' +
- ' <button title="Settings" data-tabid="tabOptions" class="tabButton" id="tbtOptions">Options</button>' +
- ' </p>' +
- ' </div>' +
- '' +
- ' <div style="width: 30em" id="tabContainer">' +
- ' <div class="HACOOPmenuTab currentTab" id="tabSync">' +
- '' +
- ' <p style="padding:0.25em; margin:0.25em">' +
- ' Preferences and data are stored in the browsers <i>localStorage</i>.' +
- ' This storage location can be cleared, just as other local stores (like cookies).' +
- ' </p>' +
- ' <p style="padding: 0.25em; margin: 0.25em">' +
- ' You can load or save your HACOOP-specific data from/to <b>openkeyval.com</b>.' +
- ' To do this, choose your private "password" and press <i>Load/Save</i>.' +
- ' </p>' +
- '' +
- ' <p style="border-top:1px solid #000; padding:0.45em; margin:0.85em">' +
- ' Prefix (Password): <input id="HACOOPokvPassword" type="text" /><br>' +
- ' <input type="checkbox" id="chkSaveRegularly" name="chk1click">save regularly<br>' +
- '' +
- ' <button id="btLoad">Load</button>' +
- ' <button id="btSave">Save</button>' +
- ' </p>' +
- ' </div>' +
- '' +
- ' <div class="HACOOPmenuTab" id="tabOptions">' +
- ' <p style="padding: 0.25em; margin: 0.25em">' +
- ' <input type="checkbox" id="chkShowUserTags">Show user tags.<br>' +
- ' <input type="checkbox" id="chkFloatThreadTree">Float thread tree.<br>' +
- ' </p>' +
- ' </div>' +
- ' </div>' +
- '' +
- ' <p style="text-align: right;">' +
- ' <button id="btClose">OK</button>' +
- ' </p>' +
- ' </form>'
- ;
- document.body.appendChild(mfd);
- $('#btLoad').click(btLoadClicked);
- $('#btSave').click(btSaveClicked);
- $('#btClose').click(btCloseClicked);
- $('button.tabButton').click(tbtChangeTab);
- }
- function addMenuButton()
- {
- var mbtn = document.createElement("button");
- mbtn.id = "HACOOPmenuButton";
- mbtn.setAttribute("title", "Manage Heise ACOOP Settings");
- mbtn.addEventListener("click", showManageForm, true);
- mbtn.appendChild(document.createTextNode("ACOOP"));
- document.body.appendChild(mbtn);
- }
- HACOOP.Menu = (function() {
- function initMenu() {
- addMenuButton();
- }
- return {
- Init: initMenu
- };
- })();
- HACOOP.Main = function() {
- HACOOP.Browser.Log('HACOOP Startup!');
- function backgroundClick() {
- $('div.dropDown').remove();
- }
- this.Page.Scripts.AddByURL('http://cdn.openkeyval.org/statics/openkeyval.packed.js');
- this.Heise.CurrentPageType = this.Heise.GetPageType(
- document.location.href, document.body.innerHTML);
- HACOOP.Browser.Log("Detected page type: " + (typeof this.Heise.CurrentPageType));
- this.Heise.EnsureShowThreadLinks();
- this.Menu.Init();
- $(document).click(backgroundClick);
- if(this.Heise.CurrentPageType === null) {
- alert("Unknown page type");
- }
- else {
- HACOOP.Browser.Log("Calling page's OnPageLoad");
- this.Heise.CurrentPageType.OnPageLoad();
- }
- };
- // let's do it!
- HACOOP.Main();
- // Heise comes with some antique jQuery we can use
- }( window.HACOOP = window.HACOOP || {}, unsafeWindow.jQuery) );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement