- /*=====================================================================================*\
- | Port Monkey - GreaseMonkey Script for Hollywood Stock Exchange |
- | (c) 2009-2016 by Eduardo Zepeda |
- | A logical and effective re-tuning of the HSX portfolio re-design, including a |
- | sidebar trade panel, price trend arrows, custom tagging, color styler, estimated |
- | bond adjust fetch, info pop-ups, and configurable options. Works with Opera |
- | and Chrome (most features). |
- \*=====================================================================================*/
-
- // ==UserScript==
- // @name HSX Port Monkey
- // @namespace edzep.scripts
- // @version 5.3.8
- // @author EdZep at HSX
- // @description Port tuneup with sidebar trade panel, trend arrows, tagging, options, etc.
- // @include https://*hsx.com/portfolio/*
- // @exclude https://*hsx.com/portfolio/bank*
- // @exclude https://*hsx.com/portfolio/limit*
- // @exclude https://*hsx.com/portfolio/history*
- // @exclude https://*hsx.com/portfolio/chart*
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_deleteValue
- // @grant GM_setClipboard
- // @grant GM_addStyle
- // @grant GM_xmlhttpRequest
- // @grant GM_getResourceText
- // @grant GM_log
- // @resource jscolorXS https://greasyfork.org/scripts/25223-jscolorxs/code/jscolorXS.js?version=160404
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALHRFWHRDcmVhdGlvbiBUaW1lAFN1biAxMCBBcHIgMjAxMSAxMToyNTo1OCAtMDUwMF3oDl8AAAAHdElNRQfbBAsOKR27crm1AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGPC/xhBQAAAA9QTFRF////AAAAAAD///8AgAAADJhXAAAAAAF0Uk5TAEDm2GYAAAC5SURBVHjajZNBFsQgCENN9f5nnhFBE+hry6YVvhFEGl6s4Xq0AO72MgD0YotYwIz7tvjCCQNsNcwQP8OJCVCcACf+QMT5CAe6lRlxzi+AfgAp42xghUieBRZAOQ5kAasiASzAZe4jWMAvStIUAblJ1BJ2L04hLrBS12aVXuARkG5eOP3u1G0C2t2DaQIUAgoUAtPHQCJgLgGEwPIoQATckYBNINZ8D/xeeHTS6O1xKKN3CCTHh+F9sR+bJgggaRbXggAAAABJRU5ErkJggg==
- // ==/UserScript==
-
- // Start
-
- (function() {
-
- //--- global object references, etc
-
- var refSymbol = "";
- var refQuantity = "";
- var refTradeConfirm = "";
- var refNavbar = "";
- var refMainDataDiv = "";
- var refObjectTemp = "";
- var holdStatus = "";
- var url = "";
- var bondBuffer = "";
- var hotkeysActive = true;
- var mouseDown = false;
- var positions = new Array(); // 0=movies, 1=bonds, 2=deriv, 3=funds
-
- //--- copy data to system clipboard
-
- function put2clipboard(sectionName) {
- var table = document.getElementById(sectionName);
- var clipboard = '';
- var chunk = new Array();
-
- if(table != null) {
- for(var r = 1, n = table.rows.length; r < n; r++) {
- // get values for entire row
- for(var j=0; j<10; j++) {
- chunk[j]= table.rows[r].cells[j].textContent+' ';
- var h = chunk[j].indexOf("H$"); // remove H$, which makes ss text of numbers
- if(h>-1) chunk[j]=chunk[j].slice(h+2);
- }
- // revert to HSX original long/short indicators
- chunk[2]="long ";
- if(chunk[1].indexOf('-')>-1) {
- chunk[2]="short ";
- chunk[1]=chunk[1].slice(1); // remove invisible - on short share numbers
- }
- // remove % sign on last column
- GM_log(chunk[9]);
- chunk[9] = chunk[9].slice(0,-2);
- GM_log(chunk[9]);
-
- clipboard += chunk[0] + chunk[1] + chunk[2] + chunk[3] + chunk[4] + chunk[5] + chunk[6] + chunk[7] + chunk[8] + chunk[9] + "\n";
- }
- }
- GM_setClipboard(clipboard);
- }
-
- //--- find missing MovieStocks
-
- function idMissingMovies() {
-
- // find all securities
- var findsecurities = document.evaluate("//div[@class='twelve columns last']//a[contains(@href,'security/view')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-
- var strAllOwnedMovies = "";
- for(var i=0; i<positions[0]; i++) strAllOwnedMovies += findsecurities.snapshotItem(i).textContent + ",";
-
- // *** perform 5 searches; results of each expected to be about 300-350 items
- // *** HSX can return 500 results per search; if any of the 5 search results
- // *** exceeds 500, this whole process will become inaccurate
- var doc = new Array();
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/search/?keyword=&status=ACT&type=1&minprice=min&maxprice=.06&action=submit_advanced',
- onload: function(response) {
- doc[1] = document.createElement('div');
- doc[1].innerHTML = response.responseText;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/search/?keyword=&status=ACT&type=1&minprice=.07&maxprice=.40&action=submit_advanced',
- onload: function(response) {
- doc[2] = document.createElement('div');
- doc[2].innerHTML = response.responseText;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/search/?keyword=&status=ACT&type=1&minprice=.41&maxprice=4&action=submit_advanced',
- onload: function(response) {
- doc[3] = document.createElement('div');
- doc[3].innerHTML = response.responseText;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/search/?keyword=&status=ACT&type=1&minprice=4.01&maxprice=14&action=submit_advanced',
- onload: function(response) {
- doc[4] = document.createElement('div');
- doc[4].innerHTML = response.responseText;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/search/?keyword=&status=ACT&type=1&minprice=14.01&maxprice=max&action=submit_advanced',
- onload: function(response) {
- doc[5] = document.createElement('div');
- doc[5].innerHTML = response.responseText;
-
- var findDoc1WB = document.evaluate("//div[@class='whitebox_content']", doc[1], null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var doc1Whitebox = findDoc1WB.snapshotItem(0);
-
- // merge search results 2,3,4,5 into the first
- for(i=2; i<6; i++) {
- var findTable = document.evaluate("//table[@class='sortable']", doc[i], null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var docTable = findTable.snapshotItem(0);
- doc1Whitebox.insertBefore(docTable, doc1Whitebox.firstChild);
- }
-
- var findAllMovies = document.evaluate("//div[@class='whitebox_content']//a[contains(@href,'security/view')]", doc[1], null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-
- var resultsText="Moviestocks listed below are not held in your portfolio.<p>";
-
- var availableCount = 0;
- var missingCount = 0;
- // each stock will appear TWICE in findAllMovies, so count by 2s
- for(i=0; i<findAllMovies.snapshotLength; i+=2) {
- var item = findAllMovies.snapshotItem(i);
- var title = item.textContent;
- var ppNode = item.parentNode.parentNode;
- var ticker = ppNode.childNodes[3].textContent;
- var status = ppNode.childNodes[7].textContent;
-
- if(status!="IPO") {
- availableCount++;
- var missingMovie = true;
- if(strAllOwnedMovies.indexOf(ticker) > -1) missingMovie = false;
- if(missingMovie==true) {
- resultsText += "<a href='https://www.hsx.com/security/view/" + ticker + " 'target='_new'>" + ticker + "</a> - " + title + "<br>";
- missingCount++;
- }
- }
- }
-
- resultsText += "<p>Active Moviestocks: " + availableCount + "<br>Not held: " + missingCount;
- var width = 400;
- var height = 400;
- var left = parseInt((screen.width/2) - (width/2));
- var top = parseInt((screen.height/2) - (height/2));
- var windowFeatures = "width=" + width + ",height=" + height +
- ",status,resizable,left=" + left + ",top=" + top +
- "screenX=" + left + ",screenY=" + top + ",scrollbars=yes";
-
- var resultsWindow = window.open("data:text/html," + encodeURIComponent(resultsText),"_blank", windowFeatures);
- resultsWindow.focus();
- }
- });
- }
- });
- }
- });
- }
- });
- }
- });
- }
-
-
- //--- center "fixed" element in browser
-
- function centerThis(e) {
- var eRef = document.getElementById(e);
- var x = (document.documentElement.clientWidth - eRef.offsetWidth) / 2;
- var y = (document.documentElement.clientHeight - eRef.offsetHeight) * .4;
- eRef.style.left = x + "px";
- eRef.style.top = parseInt(y) + "px";
- }
-
- //--- color picker functions
-
- function colorShowHide() {
- var optColor = document.getElementById("colorPanel");
- if(optColor.style.left == "-1000px") {
- optShowHide();
- document.getElementById("opt_cutCorn").checked = GM_getValue("opt_cutCorn", false);
- document.getElementById("opt_cutGrad").checked = GM_getValue("opt_cutGrad", false);
- document.getElementById("opt_cutGrid").checked = GM_getValue("opt_cutGrid", false);
- document.getElementById("opt_cutPx").checked = GM_getValue("opt_cutPx", false);
- document.getElementById("opt_cutBrd").checked = GM_getValue("opt_cutBrd", false);
- document.getElementById("opt_cutJlogo").checked = GM_getValue("opt_cutJlogo", false);
- centerThis("colorPanel");
- }
- else {
- // don't hide, just move, so picker can initialize and work properly
- optColor.style.left = "-1000px";
-
- var findInputs = document.evaluate("//div[@id='colorPanel']//input[@class='color']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for(var i=0; i<findInputs.snapshotLength; i++) {
- var inputID = findInputs.snapshotItem(i).id;
- GM_setValue(inputID, document.getElementById(inputID).value);
- }
-
- GM_setValue("opt_cutCorn", document.getElementById("opt_cutCorn").checked);
- GM_setValue("opt_cutGrad", document.getElementById("opt_cutGrad").checked);
- GM_setValue("opt_cutGrid", document.getElementById("opt_cutGrid").checked);
- GM_setValue("opt_cutPx", document.getElementById("opt_cutPx").checked);
- GM_setValue("opt_cutBrd", document.getElementById("opt_cutBrd").checked);
- GM_setValue("opt_cutJlogo", document.getElementById("opt_cutJlogo").checked);
- }
- }
-
- function colorDefaults() {
- alert("Refresh port to see changes,\nor to further edit colors.");
- document.getElementById("colorPanel").style.left = "-1000px";
-
- var findInputs = document.evaluate("//div[@id='colorPanel']//input[@class='color']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for(var i=0; i<findInputs.snapshotLength; i++) {
- var inputID = findInputs.snapshotItem(i).id;
- GM_deleteValue(inputID);
- }
- }
-
- function insertPickerCode() {
- var scriptNode = document.createElement("script");
- scriptNode.textContent = GM_getResourceText("jscolorXS");
- scriptNode.setAttribute("type", "text/javascript");
- document.getElementsByTagName("head")[0].appendChild(scriptNode);
- }
-
- //--- display expected bond adjust info
-
- function showBondInfo(clickX, clickY, mode, currentVal, isBond) {
- var tempBuffer = bondBuffer;
-
- // get data freshness date
- var bondInfoDate = tempBuffer.substring(0,tempBuffer.indexOf('\n')-1);
-
- // find and format bond ticker & adjust info
- var ticker = refSymbol.value;
- if(mode == "inPort") {
- ticker = refObjectTemp.getAttribute("alt");
- currentVal = parseFloat(refObjectTemp.textContent.slice(2));
- }
- var future = "the future is hazy";
- var info = new Array();
- var locate = tempBuffer.indexOf(',' + ticker +','); // mcg
-
- if(locate > -1 && currentVal != -1) {
-
- if(locate > 20) {
- do {
- locate -= 1;
- ch = tempBuffer.charAt(locate);
- }
- while(ch != '\n');
- locate = locate+=1;
- }
- else locate = 0; // top, for first remaining
-
- tempBuffer = tempBuffer.substring(locate);
- for(var i=0; i<3; i++) {
- locate = tempBuffer.indexOf(',')+1;
- info[i] = tempBuffer.substring(0,locate-1);
- tempBuffer = tempBuffer.substring(locate);
- }
- info[3] = tempBuffer.substring(0,tempBuffer.indexOf('\n')-1);
- var futureVal = parseFloat(info[3]).toFixed(2);
- var futureStyled = "<b>H$" + futureVal + "</b>";
-
- if(parseFloat(futureVal) > currentVal) futureStyled = "<span class=pmGreen>H$" + futureVal + "</span>";
- if(parseFloat(futureVal) < currentVal) futureStyled = "<span class=pmRed>H$" + futureVal + "</span>";
- future = futureStyled + " with " + info[1] + ", " + info[0];
- }
-
- var position = "absolute";
- if(mode == "symbol") {
- position = "fixed";
- clickX = parseInt(document.getElementById("tradePanel").style.width) - 12;
- clickY = parseInt(document.getElementById("topLinkPanel").style.height) * 3.4;
- }
-
- if(currentVal == -1) currentVal = "Error!";
- else currentVal = "H$" + currentVal.toFixed(2);
- var bigstr = "<table class='calc'><tr><td style='font-weight:bold'><a href='https://www.hsx.com/security/view/" + ticker + "' target='pm_a'>" + ticker + "</a></td><td width=90%><a href='javascript:closeTipPm();' style='display:block; text-align:right'>X </a></td></tr><tr><td colspan=2>Current: <b>" + currentVal + "</b></td></tr>";
- if(isBond) bigstr += "<tr><td colspan=2>Estimated: " + future + "</td></tr>";
- bigstr += "<tr><td colspan=2>";
- if(currentVal != "Error!" && isBond) bigstr += "<a href='http://www.kaigee.com/SBO/" + ticker + "' target='pm_b' title='Last update: " + bondInfoDate + "'>Details at KaiGee.com</a></td></tr></table>";
-
- displayTip(bigstr,clickX,clickY,3,position);
- }
-
- //--- fetch bond adjust info, regular click on current price
-
- function fetchBondInfoA(clickX, clickY, mode) {
- if(mode == "symbol") {
- // get data from HSX
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/security/view/' + refSymbol.value,
- onload: function(response) {
-
- var doc = document.createElement('div');
- var price = -1;
- doc.innerHTML = response.responseText;
- try {
- var findvalue = document.evaluate("//p[@class='value']", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- price = parseFloat(findvalue.snapshotItem(0).textContent.slice(2));
- }
- catch(err) {}
-
- var isBond = false, ttext = "";
- try {
- findvalue = document.evaluate("//title", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- ttext = findvalue.snapshotItem(0).textContent.toLowerCase();
- }
- catch(err) {}
-
- if(ttext.indexOf('starbond') > -1 && ttext.indexOf('movie fund') < 0)
- { isBond = true; }
-
- if(bondBuffer != "" || isBond == false)
- { showBondInfo(clickX, clickY, mode, price, isBond); }
- else {
- // get data from the-numbers
- fetchBondInfoB(clickX, clickY, mode, price, isBond);
- }
- }
- });
- }
- else {
- // mode = "inPort"
- if(bondBuffer != "")
- { showBondInfo(clickX, clickY, mode, 0, true); }
- else {
- // get data from the-numbers
- fetchBondInfoB(clickX, clickY, mode, 0, true);
- }
- }
- }
-
- function fetchBondInfoB(clickX, clickY, mode, price, isBond) {
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'http://www.kaigee.com/Lists/PM.csv',
- onload: function(response) {
- bondBuffer = response.responseText;
- showBondInfo(clickX, clickY, mode, price, isBond);
- }
- });
- }
-
- //--- retrieve description for SECURITY, click-hold on price paid
-
- function showDescription(clickX, clickY) {
- var ticker = refObjectTemp.getAttribute("alt");
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'https://www.hsx.com/security/view/' + ticker,
- onload: function(response) {
- var doc = document.createElement('div');
- doc.innerHTML = response.responseText;
-
- var findparagraph = document.evaluate("//div[@class='whitebox_content']//p", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var bigstr = findparagraph.snapshotItem(0).textContent;
-
- if (bigstr.indexOf('nception') > -1 && (bigstr.indexOf('ate') > -1 || bigstr.indexOf('und') > -1))
- { bigstr = findparagraph.snapshotItem(1).textContent; }
- bigstr = "<table class='calc'><tr><td style='font-weight:bold'>" + ticker + "</td></tr><tr><td>" + ltrim(bigstr) + "</td></tr></table>";
- if (mouseDown) { displayTip(bigstr,clickX,clickY,2,"absolute"); }
- }
- });
- }
-
- //--- set up window for SECURITY intraday graph fetch, click on today's change
-
- function intraday() {
- var ticker = refObjectTemp.getAttribute("alt");
- var wURL = "http://theun4gven.com/hsx/daily.php?sec=" + ticker;
- var wh = "width=" + "450" + ",height=" + "320";
- var windowRef = window.open(wURL, "iday", wh);
- }
-
- //--- do calculations for MOVIE, click-hold on current price
-
- function showCalc(clickX, clickY) {
- var price = refObjectTemp.textContent.slice(2);
- var ticker = refObjectTemp.getAttribute("alt");
- var ch = String.fromCharCode(247); //proper divide sign
- var calc2 = (price / 2.0).toFixed(2);
- var calc3 = (price / 2.2).toFixed(2);
- var calc1 = (price / 2.7).toFixed(2);
- var calc4 = (price / 4.8).toFixed(2);
-
- var newHTML = "<table class='calc'><tr><td colspan=5 style='font-weight:bold'>" + ticker + "</td></tr><tr><td>" + price + "</td><td>" + ch + "</td><td>2.0</td><td>=</td><td style='text-align:right'>" + calc2 + "</td></tr><tr><td></td><td>" + ch + "</td><td>2.2</td><td>=</td><td style='text-align:right'>" + calc3 + "</td></tr><tr><td></td><td><b>" + ch + "</b></td><td><b>2.7</b></td><td><b>=</b></td><td style='text-align:right'><b>" + calc1 + "</b></td></tr><tr><td></td><td>" + ch + "</td><td>4.8</td><td>=</td><td style='text-align:right'>" + calc4 + "</td></tr></table>";
-
- displayTip(newHTML,clickX,clickY,1,"absolute");
- }
-
- //--- display calculation, description or bond tooltip box
-
- function displayTip(newHTML,clickX,clickY,mode,position) {
- var calcDiv = document.getElementById("calcTip");
- calcDiv.innerHTML = newHTML;
-
- calcDiv.style.color = GM_getValue("opt_qLnk","#3597B2");
- calcDiv.style.top = clickY + 15 + "px";
- calcDiv.style.left = clickX + 25 + "px";
- calcDiv.style.zIndex = "103";
- calcDiv.style.width = "auto";
- calcDiv.style.position = position;
-
- // mode 1 = calc division; mode 2 = description; mode 3 = bond info
- if (mode == 2) { calcDiv.style.width = document.documentElement.clientWidth - clickX - 50 + "px"; }
- if (mode == 3) { calcDiv.style.zIndex = "203"; }
-
- //keep calc display from appearing below screen edge
- var divHeight = calcDiv.offsetHeight;
- var pageBottom = window.innerHeight + window.scrollY;
-
- if (parseInt(calcDiv.style.top) > pageBottom - divHeight + 25)
- { calcDiv.style.top = pageBottom - divHeight + 25 + "px"; }
- //not sure why 25 is the magic number for bottom-edge tuning
- calcDiv.style.visibility = "visible";
- }
-
- //--- read tag data for tagger and for building table
-
- function readTag(ticker) {
-
- var tagChar = "";
- var tagColor = "";
- var tagNote = "";
- var tagAllTickers = GM_getValue("tagTickers", "");
- ticker += " ";
- ticker = ticker.slice(0,7);
- var tickerIdx = tagAllTickers.indexOf(ticker);
-
- if(tickerIdx > -1) {
- var setIdx = tickerIdx / 7 * 3 + 1; // this type of array starts at 1
- var splitCh = String.fromCharCode(255);
- var tagAllNotes = new Array();
- var tempStr = unescape(GM_getValue("tagNotes", ""));
- tagAllNotes = tempStr.split(splitCh);
-
- tagChar = tagAllNotes[setIdx];
- tagColor = tagAllNotes[setIdx+1];
- tagNote = tagAllNotes[setIdx+2];
- }
-
- return [tagChar,tagColor,tagNote];
- }
-
- //--- tag weeder; kill off tags for sold or delisted items
-
- function tagWeeder() {
- var tagTickers = GM_getValue("tagTickers", "");
- var arrowTickers = GM_getValue("prevTickers", "");
- if(arrowTickers == "") return;
-
- // get each tag ticker and see if it still exists in the full port ticker list
- for(var i=0; i<tagTickers.length/7; i++) {
- var ticker = tagTickers.substr(i*7,7);
- if( !(arrowTickers.indexOf(ticker) > -1) ) {
- // did NOT find it, so call to have it deleted from tag set
- writeTag('delete',ticker);
- }
- }
- }
-
- //--- write data from tagger
-
- function writeTag(mode, ticker) {
-
- var tagDiv = document.getElementById("tagPanel"); // get values from form
- var movie = document.getElementById("tagMovie").value;
- var tagChar = document.getElementById("tagChar").value;
- var tagColor = document.getElementById("tagColor").value;
- var tagNote = document.getElementById("tagNote").value;
-
- var tagAllTickers = GM_getValue("tagTickers", "");
-
- var tagWeeder = true; // ticker param. usually omitted, so tagWeeder will become false
- if (typeof ticker == "undefined") {
- var ticker = movie.substring(0,movie.indexOf('-')-1) + " ";
- ticker = ticker.slice(0,7);
- tagWeeder = false; // false will by typical use
- // if NO ticker has been passed, extract from available info; may be a save or normal delete
- // if ticker HAS been passed, should also be mode = 'delete'; we are weeding an orphaned tag
- }
-
- var tickerIdx = tagAllTickers.indexOf(ticker);
- var setIdx = tickerIdx / 7 * 3 + 1; // this type of array starts at 1
-
- var splitCh = String.fromCharCode(255);
- var tagAllNotes = new Array();
- var tempStr = unescape(GM_getValue("tagNotes", ""));
- tagAllNotes = tempStr.split(splitCh);
-
- if(mode == "save" && tagChar != "" && tagChar != " ") { // new or edited; char must exist and be visible
- if ( !(tickerIdx > -1) ) { // add new tag
- tagAllTickers += ticker;
- GM_setValue("tagTickers", tagAllTickers);
- tagAllNotes.push(tagChar); tagAllNotes.push(tagColor); tagAllNotes.push(tagNote);
- }
- else { // modify existing tag; tickerIdx = 0,7,14; setIdx = 0,3,6
- tagAllNotes[setIdx] = tagChar;
- tagAllNotes[setIdx+1] = tagColor;
- tagAllNotes[setIdx+2] = tagNote;
- }
- refObjectTemp.textContent = tagChar;
- refObjectTemp.setAttribute("style","color:" + tagColor);
- refObjectTemp.title = tagNote;
-
- // save current values as defaults for next use
- GM_setValue("tagPrevChar", tagChar);
- GM_setValue("tagPrevColor", tagColor);
- GM_setValue("tagPrevNote", tagNote);
-
- }
- else if(mode == "delete") {
- var newAllTickers = "";
- if(tickerIdx > 0) newAllTickers = tagAllTickers.substring(0,tickerIdx);
- newAllTickers += tagAllTickers.substr(tickerIdx+7);
- GM_setValue("tagTickers", newAllTickers);
- tagAllNotes.splice(setIdx,3);
-
- if(tagWeeder == false) { // if weeding, there's nothing on screen to clear
- refObjectTemp.textContent = "!|!";
- refObjectTemp.setAttribute("style","color:" + GM_getValue("opt_grayTxt", "#999999"));
- refObjectTemp.title = "";
- }
- }
-
- // finalize and write the notes; tickers have already been written,above
- tempStr = tagAllNotes.join(splitCh);
- GM_setValue("tagNotes", escape(tempStr));
- GM_setValue("tagUsePrev", document.getElementById("tagUsePrev").checked);
-
- tagDiv.style.visibility = "hidden";
- }
-
- //--- tagger panel
-
- function showTagger() {
- var tagDiv = document.getElementById("tagPanel");
- var movie = refObjectTemp.getAttribute("movie");
-
- if(tagDiv.style.visibility == "hidden") {
- document.getElementById("tagMovie").value = movie;
- var ticker = movie.substring(0,movie.indexOf('-')-1);
- var tagData = readTag(ticker);
-
- var tagUsePrev = GM_getValue("tagUsePrev", false);
- document.getElementById("tagUsePrev").checked = tagUsePrev;
-
- if(tagData[0] == "" || tagUsePrev) { // new or checkbox; put values from last use
- document.getElementById("tagChar").value = GM_getValue("tagPrevChar", "&");
- document.getElementById("tagColor").value = GM_getValue("tagPrevColor", "blue");
- document.getElementById("tagNote").value = GM_getValue("tagPrevNote", "");
- if(tagData[0] == "") document.getElementById("tagDelete").disabled = true;
- else document.getElementById("tagDelete").disabled = false;
- }
- else { // use what we read for edit
- document.getElementById("tagChar").value = tagData[0];
- document.getElementById("tagColor").value = tagData[1];
- document.getElementById("tagNote").value = tagData[2];
- document.getElementById("tagDelete").disabled = false;
- }
- centerThis("tagPanel");
- tagDiv.style.visibility = "visible";
- document.getElementById("tagNote").focus();
- }
- }
-
- //--- manage read/write of settings from the options panel
-
- function optShowHide() {
-
- var optDiv = document.getElementById("optionsPanel");
- if(optDiv.style.visibility == "hidden") { // then read
- document.getElementById("optnav").checked = GM_getValue("optnav", true);
-
- if(GM_getValue("optarrowmode", "change") == "trend")
- { document.getElementById("optarrow3").checked = true; }
- else document.getElementById("optarrow4").checked = true;
-
- if(GM_getValue("optmjump", "top") == "top")
- { document.getElementById("optmjump1").checked = true; }
- else document.getElementById("optmjump2").checked = true;
-
- document.getElementById("pmQtyAt").value = GM_getValue("pmQtyAt", "75k");
- document.getElementById("pmQtyBt").value = GM_getValue("pmQtyBt", "50k");
- document.getElementById("pmQtyCt").value = GM_getValue("pmQtyCt", "25k");
- document.getElementById("pmQtyAq").value = GM_getValue("pmQtyAq", "75000");
- document.getElementById("pmQtyBq").value = GM_getValue("pmQtyBq", "50000");
- document.getElementById("pmQtyCq").value = GM_getValue("pmQtyCq", "25000");
- document.getElementById("optpanelw").value = GM_getValue("optpanelw", "130");
- document.getElementById("optpanelh").value = GM_getValue("optpanelh", "420");
- document.getElementById("optpanelf").value = GM_getValue("optpanelf", "13");
- document.getElementById("optpgwidth").value = GM_getValue("optpgwidth", "900");
- centerThis("optionsPanel");
- optDiv.style.visibility = "visible";
- }
- else { // write
- GM_setValue("optnav",document.getElementById("optnav").checked);
-
- if(document.getElementById("optarrow3").checked == true)
- { GM_setValue("optarrowmode","trend"); }
- else GM_setValue("optarrowmode","change");
-
- if(document.getElementById("optmjump1").checked == true)
- { GM_setValue("optmjump","top"); }
- else GM_setValue("optmjump","MovieStocks");
-
- GM_setValue("pmQtyAt", document.getElementById("pmQtyAt").value);
- GM_setValue("pmQtyBt", document.getElementById("pmQtyBt").value);
- GM_setValue("pmQtyCt", document.getElementById("pmQtyCt").value);
- GM_setValue("pmQtyAq", document.getElementById("pmQtyAq").value);
- GM_setValue("pmQtyBq", document.getElementById("pmQtyBq").value);
- GM_setValue("pmQtyCq", document.getElementById("pmQtyCq").value);
- GM_setValue("optpanelw", document.getElementById("optpanelw").value);
- GM_setValue("optpanelh", document.getElementById("optpanelh").value);
- GM_setValue("optpanelf", document.getElementById("optpanelf").value);
- GM_setValue("optpgwidth", document.getElementById("optpgwidth").value);
- optDiv.style.visibility = "hidden";
- }
- }
-
- //--- receive and place orders from sidepanel links, via event listener
-
- function placeOrder(orderType) {
-
- if(refSymbol.value == "") return;
- if(refQuantity.value == "") refQuantity.value = "max";
-
- var buildURL = "https://www.hsx.com/trade/?symbol=" + refSymbol.value + "&shares=" + refQuantity.value + "&action=place+order" + "&tradeType=" + orderType;
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: buildURL,
- onload: function(response) {
- var doc = document.createElement('div');
- doc.innerHTML = response.responseText;
- //GM_log(response.responseText);
-
- var h1 = doc.getElementsByTagName("h1");
- if(h1[0].textContent != "Trade Placed") {
- refTradeConfirm.innerHTML = "<p class='pmSize para1'><span style='color:" + GM_getValue('opt_redTxt','#E30000') + "; font-weight:bold'>Trade Failed!</span></p>";
- }
- else {
- refTradeConfirm.innerHTML = "<p class='pmSize para1'><strong>Submitted</strong><br><span style='font-size:80%'>" + refSymbol.value + ", " + refQuantity.value + ", " + orderType + "</span></p>";
- }
- }
- });
- }
-
- //--- find first decimal in string; cut it and 2 places right, but preserve end
-
- function stripDeci(str_in) {
-
- var str_out = str_in;
- var idx = str_in.indexOf('.');
-
- if(idx > -1) str_out = str_in.substring(0,idx) + str_in.substring(idx+3);
- return str_out;
- }
-
- //--- remove commas, and possibly spaces
-
- function numberClean(numStr) {
- var newStr = "";
- for(var i=0; i<numStr.length; i++) {
- if(numStr.charCodeAt(i) >= 48 && numStr.charCodeAt(i) <= 57) newStr += numStr.charAt(i);
- }
- return newStr;
- }
-
- //--- access correct LTD standings page for ranktip amount; called by onceDaily
-
- function doRankTip() {
- var ranklink = document.getElementById("ranklink");
- var idx = ranklink.textContent.indexOf(':');
- var rank = numberClean(ranklink.textContent.substring(idx+1));
- var tiptext = "It's good to be the Queen!";
- var urlLTD = "https://www.hsx.com/leader/?type=ltd&page=" + parseInt((rank-2)/100);
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: urlLTD,
- onload: function(response) {
- var doc = document.createElement('div');
- doc.innerHTML = response.responseText;
-
- if(rank > 1) {
- if((rank-1) % 100 == 0) { // current player and higher port are on different pages
- var findRow = document.evaluate("//table[@class='sortable']//tr", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var rowNode = findRow.snapshotItem(100);
- var higherPort = rowNode.childNodes[9].textContent;
- }
- else { // both on same page
- var findRank = document.evaluate("//table[@class='sortable']//td[ . = " + rank + "]", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var rankNode = findRank.snapshotItem(0);
- var higherPort = rankNode.parentNode.previousElementSibling.childNodes[9].textContent;
- }
- tiptext = "Next port to beat: H$" + higherPort;
- }
- ranklink.title = tiptext; // tooltip will show over Rank link
- GM_setValue("rankTipText",tiptext);
- }
- });
- }
-
- //--- called after HSX reset, or by manual arrow reset
-
- function onceDaily() {
- tagWeeder();
- doRankTip();
- GM_setValue("prevTickers", "");
- GM_setValue("prevPrices", "");
- }
-
- //--- find document position of any object
-
- function ObjectPosition(obj) {
- // this function by Peter-Paul Koch, http://www.quirksmode.org/js/findpos.html
- var curleft = 0;
- var curtop = 0;
- if (obj.offsetParent) {
- do {
- curleft += obj.offsetLeft;
- curtop += obj.offsetTop;
- } while (obj = obj.offsetParent);
- }
- return [curleft,curtop];
- }
-
- //--- this section jump method avoids side-shift of existing anchors within table
-
- function sectionJump(param) {
- var offseth = 0;
- var clienth = document.documentElement.clientHeight;
- switch(param) {
- case 1: // movies top
- var objpos = ObjectPosition(document.getElementById(GM_getValue("optmjump", "top"))); break;
- case 2: // bonds top
- case 5: // movies bottom
- var objpos = ObjectPosition(document.getElementById("StarBonds")); break;
- case 3: // derivitives top
- case 6: // bonds bottom
- var objpos = ObjectPosition(document.getElementById("Derivatives")); break;
- case 4:
- case 7:
- var objpos = ObjectPosition(document.getElementById("MovieFunds")); break;
- }
- if(param == 5 || param == 6 || param == 7) offseth = clienth + 12;
- scrollTo(pageXOffset,objpos[1]-12-offseth);
- }
-
- //--- specific object event handlers, etc.
-
- function putTicker(event) {
- refSymbol.value = event.target.textContent;
- holdStatus = event.target.getAttribute('alt');
- }
-
- function hotkeysOff(event) {
- hotkeysActive = false;
- refObjectTemp = event.target; // used in keypress handler to see if Symbol box has focus
- }
-
- function hotkeysOn() { hotkeysActive = true; }
-
- function clearHoldStatus() {
- holdStatus = "";
- hotkeysActive = true;
- }
-
- function getParam(tempstr) {
- var paren1 = tempstr.indexOf('(');
- var paren2 = tempstr.indexOf(')');
- return tempstr.substring(paren1+2,paren2-1);
- }
-
- function ltrim(stringToTrim) {
- return stringToTrim.replace(/^\s+/,"");
- }
-
- //--- global event listeners allow working across scopes
-
- document.addEventListener('keydown', function(e) {
- if(!e) e=window.event;
- var key = e.keyCode;
- var quash = false;
-
- if(url.indexOf('hsx.com/portfolio') > -1) {
- var tagPanelStyle = document.getElementById("tagPanel").style;
- if(key == 27 && tagPanelStyle.visibility == "visible")
- { tagPanelStyle.visibility = "hidden"; quash=true; }
-
- if(key == 113) { // F2
- if (refNavbar.style.visibility == "hidden") {
- refNavbar.style.visibility = "visible";
- refMainDataDiv.style.top = "-45px";
- GM_setValue("optnav",true);
- }
- else {
- refNavbar.style.visibility = "hidden";
- refMainDataDiv.style.top = "-80px";
- GM_setValue("optnav",false);
- }
- quash=true;
- }
- }
- if(quash == true) {
- e.stopPropagation();
- e.preventDefault();
- }
- }, true);
-
- document.addEventListener('keypress', function(e) {
- if(!e) e=window.event;
- var key = e.keyCode ? e.keyCode : e.which;
- var quash = false;
- //GM_log(key + " " + e.keyCode + " " + e.which);
- if(key == 13) {
- if(url.indexOf('hsx.com/trade') > -1) { window.close(); }
- else if(refObjectTemp.getAttribute('id') == "Symbol") {
- refSymbol.value = refSymbol.value.toUpperCase();
- fetchBondInfoA(0, 0, "symbol");
- refSymbol.select();
- }
- }
-
- if(url.indexOf('hsx.com/portfolio') > -1) {
-
- if(hotkeysActive == false) return;
-
- var tagPanelStyle = document.getElementById("tagPanel").style;
- if(key == 13 && tagPanelStyle.visibility == "visible") { writeTag('save'); quash=true; }
-
- if(document.getElementById("optionsPanel").style.visibility == "visible" || tagPanelStyle.visibility == "visible") { return; }
-
- if(key == 44) { sectionJump(1); quash=true; } // < unshift
- if(key == 91) { sectionJump(2); quash=true; } // [
- if(key == 93) { sectionJump(6); quash=true; } // ]
- if(key == 61) { sectionJump(7); } // + unshift // w/FF4, quash killed zoom keys
- if(e.keyCode == 0 && e.which == 45) { sectionJump(3); } // - !insert
- if(e.keyCode == 0 && e.which == 46) { sectionJump(5); quash=true; } // > unshift !delete
- }
-
- if(quash == true) {
- e.stopPropagation();
- e.preventDefault();
- }
- }, true);
-
- document.addEventListener('mouseup', function(event) {
-
- var calcDiv = document.getElementById("calcTip");
- // using zIndex value 103 to ID click-hold from click-clickable 203
- if (calcDiv.style.zIndex == "103") calcDiv.style.visibility = "hidden";
- mouseDown = false;
- }, true);
-
- document.addEventListener('mousedown', function(event) {
-
- var tempstr = new String(event.target);
- if(tempstr.indexOf('4div') > -1) {
- refObjectTemp = event.target;
- showCalc(event.pageX, event.pageY);
- event.stopPropagation();
- event.preventDefault();
- }
- if(tempstr.indexOf('info') > -1) {
- refObjectTemp = event.target;
- showDescription(event.pageX, event.pageY);
- mouseDown = true;
- event.stopPropagation();
- event.preventDefault();
- }
- if(tempstr.indexOf('iday') > -1) {
- refObjectTemp = event.target;
- intraday();
- event.stopPropagation();
- event.preventDefault();
- }
- }, true);
-
- document.addEventListener('click', function(event) {
- var tempstr = new String(event.target);
- var quash = false;
-
- if(tempstr.indexOf('putAmountPm') > -1) {
- var p = getParam(tempstr);
- if (p == "M") p = "max"
- else if (p == "75") p = GM_getValue("pmQtyAq", "75000")
- else if (p == "50") p = GM_getValue("pmQtyBq", "50000")
- else if (p == "25") p = GM_getValue("pmQtyCq", "25000")
- else p = "1"
- refQuantity.value = p;
- quash = true;
- }
-
- if(event.target.id == "tagOK")
- { writeTag('save'); quash = true; }
-
- if(event.target.id == "tagDelete")
- { writeTag('delete'); quash = true; }
-
- if(event.target.id == "tagCancel") {
- GM_setValue("tagUsePrev", document.getElementById("tagUsePrev").checked);
- document.getElementById("tagPanel").style.visibility = "hidden";
- quash = true;
- }
-
- if(event.target.id == "optButtonOKpm" || event.target == "javascript:optShowHide();")
- { optShowHide(); quash = true; }
-
- if(event.target.id == "optButtonColors" || event.target.id == "colorOK")
- { colorShowHide(); quash = true; }
-
- if(event.target.id == "colorDefaults")
- { colorShowHide(); colorDefaults(); quash = true; }
-
- if(tempstr.indexOf('tagger') > -1)
- { refObjectTemp = event.target; showTagger(); quash = true; }
-
- if(tempstr.indexOf('4div') > -1 || tempstr.indexOf('info') > -1 || tempstr.indexOf('iday') > -1)
- { quash = true; } //kill here; handled in mousedown
-
- if(tempstr.indexOf('bondP') > -1) {
- // from bond owned in the port
- refObjectTemp = event.target;
- fetchBondInfoA(event.pageX, event.pageY, "inPort");
- quash = true;
- }
-
- if(tempstr.indexOf('bondS') > -1) {
- // from symbol in the SBL box
- if (document.getElementById("calcTip").style.visibility == "hidden")
- { fetchBondInfoA(0, 0, "symbol"); }
- else document.getElementById("calcTip").style.visibility = "hidden";
- quash = true;
- }
-
- if(tempstr.indexOf('closeTipPm') > -1) {
- document.getElementById("calcTip").style.visibility = "hidden";
- quash = true;
- }
-
- if(tempstr.indexOf('placeOrderPm') > -1) {
- refTradeConfirm.innerHTML = "";
- var tradetype = getParam(tempstr);
- placeOrder(tradetype);
- quash = true;
- }
-
- if(tempstr.indexOf('arrowReset') > -1) {
- onceDaily();
- alert('Arrows will reset on port refresh.');
- quash = true;
- }
-
- if(tempstr.indexOf('2clip') > -1) {
- if(tempstr.indexOf('movies') > -1) put2clipboard("sortable_MovieStocks");
- else put2clipboard("sortable_StarBonds");
- quash = true;
- }
-
- if(tempstr.indexOf('idMissingMovies') > -1) {
- idMissingMovies();
- quash = true;
- }
-
- if(tempstr.indexOf('sectionJump') > -1)
- { sectionJump(parseInt(tempstr.substr(23,1))); quash = true; }
-
- if(quash == true) {
- //quash any further actions of events handled here
- event.stopPropagation();
- event.preventDefault();
- }
-
- }, true);
-
- //--- main script block from this point
-
- function HSXPortMonkey_Run() {
- insertPickerCode();
- url = window.location.href; // get URL, determine whether port or trade page; save for later use
-
- var panelFontSize = GM_getValue("optpanelf", "13") + "px";
- var panelBG = GM_getValue("opt_panelBG","#F3F3F3");
-
- // revise HSX base styles
- GM_addStyle('#bodywrap {color:' + GM_getValue("opt_dataTxt","#444444") + '}' +
- 'p {color:' + GM_getValue("opt_panelTxt","#444444") + '}' +
- 'h1,h2,h4 {color:' + GM_getValue("opt_panelTxt","#444444") + '}' +
- 'h3 {color:' + GM_getValue("opt_dataTxt","#444444") + '}' +
- 'div.table_label p {color:' + GM_getValue("opt_grayTxt","#999999") + '}' +
- 'div.whitebox_content {background:' + GM_getValue("opt_dataBG","#FFFFFF") + '}' +
- 'body {background:' + GM_getValue("opt_pageBG","#FFFFFF") + '}' +
- 'a, a:visited {color:' + GM_getValue("opt_regLnk","#3597B2") + '; text-decoration:none}' +
- 'a:hover {color:' + GM_getValue("opt_regHov","#84B84B") + '}' +
- 'table,col,tr {border-color: ' + GM_getValue("opt_grid","#DDDDDD") + '}' +
- 'tr {border-top: solid 1px ' + GM_getValue("opt_grid","#DDDDDD") + '}' +
- 'th {color: ' + GM_getValue("opt_colLab","#FFFFFF") + '}' +
- 'thead {background-color: ' + GM_getValue("opt_colBG","#555555") + '}' +
- '.sorttable_sorted, .sorttable_sorted_reverse {background-color: #919191}' +
- 'h2 {font-size:1.6em; margin-bottom:.7em}');
-
- if(GM_getValue("opt_cutGrad", false)) GM_addStyle('#bodywrap {background: url() #1A1A1A}');
- if(GM_getValue("opt_cutGrid", false)) GM_addStyle('table,col,tr {border:none}');
-
- // text & link colors
- GM_addStyle('.pmGray {color: ' + GM_getValue("opt_grayTxt","#999999") + '}' +
- '.pmBlack {color: ' + GM_getValue("opt_dataTxt","#444444") + '; font-weight: bold}' +
- '.pmRed {color: ' + GM_getValue("opt_redTxt","#E30000") + '; font-weight: bold; font-style: italic}' +
- '.pmGreen {color: ' + GM_getValue("opt_greenTxt","#038013") + '; font-weight: bold}' +
- '.jlink, .jlink:visited {color: ' + GM_getValue("opt_jumpLnk","#84B84B") + '}' +
- '.jlink:hover {color: ' + GM_getValue("opt_jumpHov","#3597B2") + '}' +
- '.plink, .plink:visited {color: ' + GM_getValue("opt_panLnk","#3597B2") + '}' +
- '.plink:hover {color: ' + GM_getValue("opt_panHov","#84B84B") + '}' +
- '.qlink, .qlink:visited {color: ' + GM_getValue("opt_qLnk","#3597B2") + '; display: block; text-align: center}' +
- '.qlink:hover {color: ' + GM_getValue("opt_qHov","#84B84B") + '}' +
- 'a.pmbutton, a.pmbutton:visited {color: ' + GM_getValue("opt_butTxt","#3597B2") + '}' +
- 'a.pmbutton:hover {color: ' + GM_getValue("opt_butHov","#84B84B") + '}' +
- '.tlink {color: ' + GM_getValue("opt_dataTxt","#444444") + '}' +
- '.tlink:hover {color:black}');
-
- // tables
- GM_addStyle('table.pmtrade td {border: 1px solid ' + panelBG + '; padding: 4px 3px 0; text-align: center; font-family: sans-serif; font-size:' + panelFontSize + '; line-height: 1}');
- GM_addStyle('table.pmqty {border: 2px ridge silver; text-align:center; margin:0; padding: 0} table.pmqty td {background-color: ' + GM_getValue("opt_popQ","#FFF9E3") + '; text-align: center; font-family: sans-serif; font-size:' + panelFontSize + '; border: 1px solid ' + GM_getValue("opt_popQ","#FFF9E3") + '}');
- GM_addStyle('table.calc {border: 2px ridge #FBEDBB} table.calc td {background-color: ' + GM_getValue("opt_popQ","#FFF9E3") + '; border: 1px solid ' + GM_getValue("opt_popQ","#FFF9E3") + '; padding: 0 3px}');
-
- // buttons
- GM_addStyle('.pmbutton {font-family: sans-serif; border: 1px solid ' + GM_getValue("opt_buttonShd","#000066") + '; background: ' + GM_getValue("opt_button","#D4E4ED") + '; display: block; text-align: center; border-width : 0px 1px 1px 0px; padding: 3px} .pmbutton:hover {font-weight: normal; border: 1px solid ' + GM_getValue("opt_buttonShd","#000066") + '; background: ' + GM_getValue("opt_buttonHov","#EBFFE9") + '; border-width : 0px 1px 1px 0px} .pmbutton:active {border: 1px solid #DA0808; background: ' + GM_getValue("opt_buttonHov","#EBFFE9") + '; border-width : 0px 1px 1px 0px}');
-
- // misc.
- GM_addStyle('input.color {text-align: center; width: 6em; font-size: 1.1em; line-height:1; margin:0em; padding: 3px}' +
- 'input.pmInput {color: ' + GM_getValue("opt_inTxt","#444444") + '; background: ' + GM_getValue("opt_inBG","#FFFFFF") + '; width:98%; font-size: 1em; line-height:1; margin:0em; padding: 0}' +
- 'input.w3 {width:2.5em}' +
- '.pmSize {font-size:' + panelFontSize + '}' +
- 'td.center,th.center {text-align: center}' +
- 'p.para1 {line-height:115%; margin-bottom: .7em}');
-
- // Firefox 3.5+ every other line in different color
- GM_addStyle('table.sortable > tbody > tr:nth-child(2n) {background-color:' + GM_getValue("opt_stripe","#EBFFE9") + '}');
-
- // overall width
- var oaWidth = GM_getValue("optpgwidth", "900");
- GM_addStyle('div.column.twelve,div.columns.twelve { width: ' + oaWidth + 'px ! important} ' +
- 'div#container,div.container { width: ' + oaWidth + 'px ! important} ' +
- 'div#navigation { width: ' + oaWidth + 'px ! important} ' +
- 'div#navigation form#search-form {right: ' + (oaWidth<971?10:oaWidth-970+10) + 'px ! important} '); // search bar placement
-
- // tweak column widths
- GM_addStyle("table col.symbol { width:85px ! important} \
- table col.quantity_held { width:95px ! important} \
- table col.trade_transaction_type_id { width:20px ! important} \
- table col.avg_price_paid { width:119px ! important} \
- table col.price { width:123px ! important} \
- table col.price_change { width:115px ! important} \
- table col.pct_price_change { width:20px ! important} \
- table col.tot_worth { width:150px ! important} \
- table col.worth_change { width:150px ! important} \
- table col.pct_worth_change { width:70px ! important} \
- table col.trade_button { width:20px ! important}"); // had been 930 total
-
- //--- make new add-in panel for portfolio info and trading
-
- var networth = document.getElementById("net-worth").firstChild.nextSibling.textContent;
- var cash = document.getElementById("cash-on-hand").firstChild.textContent;
- var findtodaychange = document.evaluate("//span[@class='label']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var todaychange = findtodaychange.snapshotItem(0).nextSibling.nextSibling.textContent;
-
- var todaySpan = stripDeci(todaychange);
- if(todaySpan.indexOf('-') > -1) todaySpan = "<span style='color:" + GM_getValue('opt_redTxt','#E30000') + "'>" + todaySpan + "</span>";
-
- var findrankspan = document.evaluate("//span[@class='rank']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var ranklink = findrankspan.snapshotItem(0).firstChild;
- ranklink.setAttribute("id","ranklink"); // for later access
- ranklink.setAttribute("class","plink");
- ranklink.setAttribute("title",GM_getValue("rankTipText", ""));
- var rankspan = findrankspan.snapshotItem(0).innerHTML;
- var idx = rankspan.indexOf(')');
- rankspan = rankspan.substring(0,idx+1) + "<br>" + rankspan.substring(idx+4);
-
- var tradeDiv = document.createElement("div");
- var tradeDivHtml = "<div style='padding:0 0 0 4px'><h2>My Portfolio</h2>" + "<p class='pmSize para1'><strong>Net Worth:</strong><br>" + stripDeci(networth) + "<p class='pmSize para1'><strong>Cash:</strong><br>" + stripDeci(cash) +
-
- "<p class='pmSize para1'><strong>Today:</strong><br>" + todaySpan + " <a href='javascript:optShowHide();' class='plink' title='Set options'>" + String.fromCharCode(9829) + "</a>" +
-
- "<p class='pmSize' style='line-height:115%; margin-bottom: .6em'>" + rankspan + "<br><a href='/leader/watchlist.php' class='plink'>Watchlist</a> - <a href='/portfolio/chart.php' class='plink'>Chart</a></div>" +
-
- "<table class=pmtrade><tr><td align=right><a href='javascript:bondS;' class='plink'>SBL:</a></td><td><input class='pmInput' type=text id=Symbol maxlength=8 onfocus='this.select();' onblur='this.value = this.value.toUpperCase();' /></td></tr>" +
-
- "<tr><td align=right style='color:" + GM_getValue("opt_panelTxt","#444444") + "'>QTY:</td><td><input type=text class='pmInput' id=Quantity maxlength=6 onfocus='this.select();' onblur='this.value = this.value.toLowerCase(); if(this.value != \"max\" && !(parseInt(this.value)>0)) this.value=\"\";' /></td></tr><tr><td colspan=2 style='padding-bottom: 3px'></td></tr><tr><td rowspan=4 valign=top>" +
-
- "<table class=pmqty><tr><td><a href='javascript:putAmountPm(\"M\");' class=qlink>Max</a></td></tr><tr><td><a href='javascript:putAmountPm(\"75\");' class=qlink>" + GM_getValue("pmQtyAt","75k") + "</a></td></tr><tr><td><a href='javascript:putAmountPm(\"50\");' class=qlink>" + GM_getValue("pmQtyBt","50k") + "</a></td></tr><tr><td><a href='javascript:putAmountPm(\"25\");' class=qlink>" + GM_getValue("pmQtyCt","25k") + "</a></td></tr><tr><td style='padding-bottom: 3px'><a href='javascript:putAmountPm(\"R\");' class=qlink>1</a></td></tr></table>" +
-
- "</td><td><a href='javascript:placeOrderPm(\"buy\");' class=pmbutton>Buy</a></td></tr><tr><td><a href='javascript:placeOrderPm(\"sell\");' class=pmbutton>Sell</a></td></tr><tr><td><a href='javascript:placeOrderPm(\"short\");' class=pmbutton>Short</a></td></tr><tr><td><a href='javascript:placeOrderPm(\"cover\");' class=pmbutton>Cover</a></td></tr></table>" +
-
- "<div id=TradeConfirm style='padding:0 0 0 4px; margin-top:-.8em; font-size:" + panelFontSize + "'></div>";
-
- tradeDiv.innerHTML = tradeDivHtml;
- tradeDiv.id = "tradePanel";
- tradeDiv.style.position = "fixed";
- tradeDiv.style.top = "111px";
- tradeDiv.style.backgroundColor = panelBG;
- tradeDiv.style.padding = "7px 5px";
- tradeDiv.style.height = GM_getValue("optpanelh", "420") + "px";
- tradeDiv.style.width = GM_getValue("optpanelw", "130") + "px";
- tradeDiv.style.zIndex = "101";
- tradeDiv.style.borderWidth = "1px";
- tradeDiv.style.borderStyle = "solid";
- tradeDiv.style.borderColor = GM_getValue("opt_cutBrd", false)?panelBG:"#151515";
-
- //--- make new add-in panel for top-left links
-
- var topDiv = document.createElement("div");
- topDiv.innerHTML = "<p class='pmSize' style='line-height:155%; margin-bottom: 1em'><a href='javascript:sectionJump(1);' class='jlink' title='Keyboard shortcuts: < or > (unshifted) to top/bottom'>Moviestocks</a><br><a href='javascript:sectionJump(2);' class='jlink' title='Keyboard shortcuts: [ or ] to top/bottom'>Starbonds</a><br><a href='javascript:sectionJump(3);' class='jlink' title='Keyboard shortcuts: - or + (unshifted) to top/bottom'>Derivatives</a><br><a href='javascript:sectionJump(4);' class='jlink'>Movie Funds</a>";
-
- topDiv.id = "topLinkPanel";
- topDiv.style.position = "fixed";
- topDiv.style.padding = "10px";
- topDiv.style.height = "92px";
- topDiv.style.width = parseInt(tradeDiv.style.width) - 8 + "px";
- topDiv.style.zIndex = "102";
- topDiv.style.backgroundColor = panelBG;
- if(GM_getValue("opt_cutJlogo", false)) document.getElementById("top").style.left = "-148px";
- else topDiv.style.background = "url(/images/logo.jpg)";
-
- //--- make new add-in panel for Port Monkey options
-
- var optDiv = document.createElement("div");
- var optDivHtml = "<p><b><u>OPTIONS</u> - <a href='https://greasyfork.org/en/scripts/24422-hsx-port-monkey' class='plink' title='Port Monkey homepage' target='_new'>Port Monkey</a></b> by EdZep" +
-
- "<p>Show HSX nav bar: <input id='optnav' type='checkbox' /> (use keyboard F2 for live toggle)<br>" +
-
- "Arrow mode: <input id='optarrow3' name='optarrowmode' type='radio' /> <a href='javascript:;' class='plink' title='A trend arrow remains until price movement changes direction' onclick='document.getElementById(\"optarrow3\").checked = true;'>trend</a> <input id='optarrow4' name='optarrowmode' type='radio' /> <a href='javascript:;' class='plink' title='A change arrow shows only if a price has changed since the last reload' onclick='document.getElementById(\"optarrow4\").checked = true;'>change</a><br>" +
-
- "Movietsocks jump link / hotkey: <input id='optmjump1' name='optmjump' type='radio' /> to page top <input id='optmjump2' name='optmjump' type='radio' /> to section start</p>" +
-
- "<p style='margin-bottom:-.6em'>Custom quantities (button text): <input id='pmQtyAt' type='text' maxlength='3' class=w3 /> <input id='pmQtyBt' type='text' maxlength='3' class=w3 /> <input id='pmQtyCt' type='text' maxlength='3' class=w3 /> from top, after Max<br>" +
-
- "Custom quantities (amounts): <input id='pmQtyAq' type='text' maxlength='5' style='width:3.5em' /> <input id='pmQtyBq' type='text' maxlength='5' style='width:3.5em' /> <input id='pmQtyCq' type='text' maxlength='5' style='width:3.5em' /> (no commas)<br>" +
-
- "Sidepanel width: <input id='optpanelw' type='text' maxlength='3' class=w3 /> height: <input id='optpanelh' type='text' maxlength='3' class=w3 /> font size: <input id='optpanelf' type='text' maxlength='2' style='width:2em' /> (all in pixels)<br>" +
-
- "Overall content width: <input id='optpgwidth' type='text' maxlength='4' class=w3 /> px</p>" +
-
- "<hr><p style='margin-top:-.1em; margin-bottom:0'>Most changes occur on port refresh<p style='margin-top:.4em; margin-bottom:0'><input id='optButtonOKpm' type='button' value=' OK ' />";
- optDivHtml += " <input id='optButtonColors' type='button' value=' Color Styler ' />";
-
- optDiv.innerHTML = optDivHtml;
- optDiv.id = "optionsPanel";
- optDiv.style.position = "fixed";
- optDiv.style.visibility = "hidden";
- optDiv.style.backgroundColor = panelBG;
- optDiv.style.padding = "10px";
- optDiv.style.zIndex = "103";
- optDiv.style.borderWidth = "5px";
- optDiv.style.borderStyle = "ridge";
- optDiv.style.borderColor = "gray";
-
- //--- make new add-in panel for tagger
-
- var tagDiv = document.createElement("div");
- tagDiv.innerHTML = "<p><b><u>TAGGER</u></b><form style='margin-bottom:1.2em'><p>Security: <input id='tagMovie' type='text' disabled='disabled' style='width:23em' /><br>Tag character: <input id='tagChar' onblur='document.getElementById(\"tagNote\").focus();' type='text' maxlength='1' onfocus='this.select()' style='width:1.5em' /> " +
-
- "Tag color: <select id='tagColor' onchange='document.getElementById(\"tagNote\").focus();'><option>Black</option>.<option>Red</option><option>Purple</option><option>Magenta</option><option>Green</option><option>Lime</option><option>Blue</option><option>Turquoise</option></select><br>" +
-
- "<p style='line-height:190%; margin-top:-.8em; margin-bottom:-.6em'>Tooltip note:<br><input id='tagNote' type='text' onfocus='this.select()' maxlength='60' style='width:28em' />" +
-
- "<p style='margin-top:-.3em; margin-bottom:-.1em'>For edits, last values entered override existing: <input id='tagUsePrev' type='checkbox' /> <a href='javascript:;' class='plink' onclick='document.getElementById(\"tagUsePrev\").checked = !document.getElementById(\"tagUsePrev\").checked' title='OK, Cancel or Delete will save this setting.'>note</a></form>" +
-
- "<hr><p style='margin-top:.8em; margin-bottom:0'><input id='tagOK' type='button' value=' OK ' /> <input id='tagCancel' type='button' value=' Cancel ' /> <input id='tagDelete' type='button' value=' Delete ' /></p>";
-
- tagDiv.id = "tagPanel";
- tagDiv.style.position = "fixed";
- tagDiv.style.visibility = "hidden";
- tagDiv.style.backgroundColor = panelBG;
- tagDiv.style.padding = "10px";
- tagDiv.style.zIndex = "103";
- tagDiv.style.borderWidth = "5px";
- tagDiv.style.borderStyle = "ridge";
- tagDiv.style.borderColor = "gray";
-
- //--- div panel for calculation pseudo-tooltip
-
- var calcDiv = document.createElement("div");
- calcDiv.id = "calcTip";
- calcDiv.style.position = "absolute";
- calcDiv.style.zIndex = "103";
- calcDiv.style.visibility = "hidden";
-
- //--- div panel for color picker
-
- var colorDiv = document.createElement("div");
- colorDiv.innerHTML = "<p><b><u>COLOR STYLER</u></b> - Click and pick!</p><div><div style='float:left'><p style='line-height:115%'>" +
- "<input id='opt_pageBG' type='text' value='" + GM_getValue("opt_pageBG", "#FFFFFF") + "' class='color' /> Page background<br>" +
- "<input id='opt_panelBG' type='text' value='" + GM_getValue("opt_panelBG", "#F3F3F3") + "' class='color' /> Panel background<br>" +
- "<input id='opt_dataBG' type='text' value='" + GM_getValue("opt_dataBG", "#FFFFFF") + "' class='color' /> Data background<br>" +
- "<input id='opt_panelTxt' type='text' value='" + GM_getValue("opt_panelTxt", "#444444") + "' class='color' /> Panel text<br>" +
- "<input id='opt_dataTxt' type='text' value='" + GM_getValue("opt_dataTxt", "#444444") + "' class='color' /> Data text<br>" +
- "<input id='opt_grayTxt' type='text' value='" + GM_getValue("opt_grayTxt", "#999999") + "' class='color' /> Data accent text<br>" +
- "<input id='opt_greenTxt' type='text' value='" + GM_getValue("opt_greenTxt", "#038013") + "' class='color' /> Positive text<br>" +
- "<input id='opt_redTxt' type='text' value='" + GM_getValue("opt_redTxt", "#E30000") + "' class='color' /> Negative text<br>" +
- "<input id='opt_colBG' type='text' value='" + GM_getValue("opt_colBG", "#555555") + "' class='color' /> Column header<br>" +
- "<input id='opt_colLab' type='text' value='" + GM_getValue("opt_colLab", "#FFFFFF") + "' class='color' /> Column label<br>" +
- "<input id='opt_grid' type='text' value='" + GM_getValue("opt_grid", "#DDDDDD") + "' class='color' /> Data grid<br>" +
- "<input id='opt_stripe' type='text' value='" + GM_getValue("opt_stripe", "#EBFFE9") + "' class='color' /> Data stripe<br>" +
- "<input id='opt_inBG' type='text' value='" + GM_getValue("opt_inBG", "#FFFFFF") + "' class='color' /> Input background<br>" +
- "<input id='opt_inTxt' type='text' value='" + GM_getValue("opt_inTxt", "#444444") + "' class='color' /> Input text" +
-
- "</p></div><div style='float:right; padding:0 0 0 18px'><p style='line-height:115%'>" +
- "<input id='opt_regLnk' type='text' value='" + GM_getValue("opt_regLnk", "#3597B2") + "' class='color' /> Data links<br>" +
- "<input id='opt_regHov' type='text' value='" + GM_getValue("opt_regHov", "#84B84B") + "' class='color' /> Data hover<br>" +
- "<input id='opt_jumpLnk' type='text' value='" + GM_getValue("opt_jumpLnk", "#84B84B") + "' class='color' /> Jump links<br>" +
- "<input id='opt_jumpHov' type='text' value='" + GM_getValue("opt_jumpHov", "#3597B2") + "' class='color' /> Jump hover<br>" +
- "<input id='opt_panLnk' type='text' value='" + GM_getValue("opt_panLnk", "#3597B2") + "' class='color' /> Panel links<br>" +
- "<input id='opt_panHov' type='text' value='" + GM_getValue("opt_panHov", "#84B84B") + "' class='color' /> Panel hover<br>" +
- "<input id='opt_qLnk' type='text' value='" + GM_getValue("opt_qLnk", "#3597B2") + "' class='color' /> Quick-pick links<br>" +
- "<input id='opt_qHov' type='text' value='" + GM_getValue("opt_qHov", "#84B84B") + "' class='color' /> Quick-pick hover<br>" +
- "<input id='opt_butTxt' type='text' value='" + GM_getValue("opt_butTxt", "#3597B2") + "' class='color' /> Button text<br>" +
- "<input id='opt_butHov' type='text' value='" + GM_getValue("opt_butHov", "#84B84B") + "' class='color' /> Button text hover<br>" +
- "<input id='opt_button' type='text' value='" + GM_getValue("opt_button", "#D4E4ED") + "' class='color' /> Button face<br>" +
- "<input id='opt_buttonHov' type='text' value='" + GM_getValue("opt_buttonHov", "#EBFFE9") + "' class='color' /> Button face hover<br>" +
- "<input id='opt_buttonShd' type='text' value='" + GM_getValue("opt_buttonShd", "#000066") + "' class='color' /> Button shadow<br>" +
- "<input id='opt_popQ' type='text' value='" + GM_getValue("opt_popQ", "#FFF9E3") + "' class='color' /> Pop-up/Q-pick BG" +
- "</p></div></div>" +
- "<p><input id='opt_cutCorn' type='checkbox' /> Remove rounded white corners <input id='opt_cutGrid' type='checkbox' /> Remove data grid<br><input id='opt_cutGrad' type='checkbox' /> Remove gray gradient <input id='opt_cutBrd' type='checkbox' /> Remove panel border<br><input id='opt_cutJlogo' type='checkbox' /> Match jump link BG to panel <input id='opt_cutPx' type='checkbox' /> Shift data 4px left</p><hr><input id='colorOK' type='button' value=' OK ' /> <input type='button' onclick='document.getElementById(\"colorPanel\").style.left=\"-1000px\"' value=' Cancel ' /><input style='float:right' id='colorDefaults' type='button' value=' Default Colors ' />";
-
- colorDiv.id = "colorPanel";
- colorDiv.style.position = "fixed";
- colorDiv.style.left = "-1000px";
- colorDiv.style.backgroundColor = panelBG;
- colorDiv.style.padding = "10px";
- colorDiv.style.zIndex = "103";
- colorDiv.style.borderWidth = "5px";
- colorDiv.style.borderStyle = "ridge";
- colorDiv.style.borderColor = "gray";
-
- //--- place new panels into HTML
-
- var item = document.getElementsByTagName("body")[0];
- item.insertBefore(topDiv, item.firstChild);
- item.insertBefore(tradeDiv, item.firstChild);
- item.insertBefore(optDiv, item.firstChild);
- item.insertBefore(tagDiv, item.firstChild);
- item.insertBefore(calcDiv, item.firstChild);
- item.insertBefore(colorDiv, item.firstChild);
-
- //--- store global references to trade inputs, etc. for later use
-
- refSymbol = document.getElementById("Symbol");
- refSymbol.addEventListener("focus", hotkeysOff, false);
- refSymbol.addEventListener("blur", clearHoldStatus, false);
- refQuantity = document.getElementById("Quantity");
- refQuantity.addEventListener("focus", hotkeysOff, false);
- refQuantity.addEventListener("blur", hotkeysOn, false);
- refTradeConfirm = document.getElementById("TradeConfirm");
-
- //--- reformat page features
-
- // adjust width, and move content to leave space at left
- var bodywrapstyle = document.getElementById("bodywrap").style;
- bodywrapstyle.width = parseInt(oaWidth) + 8 + "px";
- bodywrapstyle.left = parseInt(tradeDiv.style.width) + (GM_getValue("opt_cutPx", false)?8:12) + "px";
-
- // put time display and see if it's time to clear trend arrows
- var findTime = document.getElementsByTagName("dt");
- var hsxTime = findTime[1].textContent;
- var item = document.getElementById("account-actions");
- item.setAttribute("style","color: dimgray");
- item.innerHTML = item.innerHTML + "<br>" + hsxTime;
- var cutItem = item.parentNode.childNodes[5]; // WHO YOU OWN slogan, to remove
- try { cutItem.parentNode.removeChild(cutItem); }
- catch(err) {}
-
- var idx = hsxTime.indexOf(':');
- var newTime = hsxTime.substr(idx+2,2) + hsxTime.substr(idx+5,2);
- lastRefresh = GM_getValue("lastRefresh", "0000");
- if(newTime < lastRefresh) onceDaily(); //reset actions
- GM_setValue("lastRefresh", newTime);
-
- // delete original top panels, jump links
- var cutpanel = document.getElementById("announce_bar");
- try { cutpanel.parentNode.removeChild(cutpanel); }
- catch(err) {}
-
- var findpanel = document.evaluate("//div[@class='four columns']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var cutpanel0 = findpanel.snapshotItem(0);
- var cutpanel1 = findpanel.snapshotItem(1);
- var cutpanel2 = findpanel.snapshotItem(1).nextSibling.nextSibling;
- cutpanel0.parentNode.removeChild(cutpanel0);
- cutpanel1.parentNode.removeChild(cutpanel1);
- cutpanel2.parentNode.removeChild(cutpanel2);
-
- findpanel = document.evaluate("//div[@class='column-row secondary_nav']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- cutpanel = findpanel.snapshotItem(0);
- cutpanel.parentNode.removeChild(cutpanel);
-
- findpanel = document.evaluate("//p[@class='top']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for(var i=0; i<findpanel.snapshotLength; i++) {
- cutpanel = findpanel.snapshotItem(i);
- cutpanel.parentNode.removeChild(cutpanel);
- }
-
- // remove rounded corners; needed to allow non-white data backgrounds
- if(GM_getValue("opt_cutCorn", false)) {
- findpanel = document.evaluate("//div[@class='whitebox_start']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- cutpanel = findpanel.snapshotItem(0);
- cutpanel.parentNode.removeChild(cutpanel);
- findpanel = document.evaluate("//div[@class='whitebox_stop']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- cutpanel = findpanel.snapshotItem(0);
- cutpanel.parentNode.removeChild(cutpanel);
- findpanel = document.evaluate("//div[@class='whitebox_content']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- findpanel.snapshotItem(0).style.padding = "10px 10px 5px";
- }
-
- // use/not use nav bar, and adjust vertical position of main data panel
- refNavbar = document.getElementById("navigation"); // global reference for later use
- findpanel = document.evaluate("//div[@class='column-row']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- refMainDataDiv = findpanel.snapshotItem(1); // global reference for later use
-
- if(GM_getValue("optnav", true) == true) refMainDataDiv.style.top = "-45px";
- else {
- refNavbar.style.visibility = "hidden";
- refMainDataDiv.style.top = "-80px";
- }
-
- // tidy up section summary info
- findInfo = document.evaluate("//span[@class='summary_shares']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-
- for(var i=0; i<findInfo.snapshotLength; i++)
- {
- var item1 = findInfo.snapshotItem(i);
- var item2 = item1.nextSibling.nextSibling;
- var item3 = item2.nextSibling.nextSibling;
- var item0 = item1.parentNode.firstChild.nextSibling;
-
- item3.removeAttribute("class");
- item3.textContent = "Gain: " + stripDeci(item3.textContent);
- item3.setAttribute("style","position: absolute; left: 330px");
- var linkyText = '';
-
- // before moving stuff, get positions counts, for use in main loop, stocks not owned, etc.
- var pText = item0.textContent;
- positions[i] = parseInt(pText.substr(0,pText.indexOf(' ')));
-
- if (i == 0) {
- var item4 = item3.nextSibling.nextSibling;
- item4.removeAttribute("class");
- item4.setAttribute("style","position: absolute; right: 0px");
- item4.firstChild.textContent = "Sort: ";
-
- linkyText = "<b><a href='javascript:movies2clip();' title='Copy Moviestock holdings to clipboard'>" + String.fromCharCode(8623) + "</a> <a href='javascript:idMissingMovies();' title='List Moviestocks not owned'>" + String.fromCharCode(8800) + "</a><a href='javascript:arrowReset();' title='Reset arrows'>" + String.fromCharCode(9650) + "</a> |</b> ";
- }
-
- if (i == 1) {
- linkyText = "<b><a href='javascript:bonds2clip();' title='Copy Starbond holdings to clipboard'>" + String.fromCharCode(8623) + "</a> |</b> ";
- }
-
- item0.innerHTML = linkyText + item0.innerHTML + " <b>|</b> " + item3.innerHTML;
- item3.parentNode.removeChild(item3);
- item2.parentNode.removeChild(item2);
- item1.parentNode.removeChild(item1);
- }
-
- // add missing column dividers
- var findtables = document.evaluate("//table[@class='sortable']//colgroup", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var item = "", nodeToday = "", nodeGain = "", nodeGainPct = "";
-
- for(var i=0; i<findtables.snapshotLength; i++)
- {
- try { // potential problem in some browsers
- item = findtables.snapshotItem(i);
- nodeToday = item.childNodes[10];
- nodeGain = item.childNodes[16];
- nodeGainPct = item.childNodes[18];
- nodeToday.removeAttribute("style");
- nodeGain.removeAttribute("style");
- if (i==0) nodeGainPct.removeAttribute("style");
- }
- catch(err) {}
- }
-
- // tweak table headings
- var findtables = document.evaluate("//th[@class='sorttable_alpha']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var item = "", pNode = "";
- //var nodeShares = "", nodeCurrent = "", nodeValue = "";
- var nodeHeld = "", nodePaid = "", nodeToday = "";
- var nodeTodayPct = "", nodeGain = "", nodeGainPct = "", nodeButton = "";
-
- for(var i=0; i<findtables.snapshotLength; i++)
- {
- item = findtables.snapshotItem(i);
- pNode = item.parentNode;
-
- //nodeShares = pNode.childNodes[3];
- nodeHeld = pNode.childNodes[5];
- nodePaid = pNode.childNodes[7];
- //nodeCurrent = pNode.childNodes[9];
- nodeToday = pNode.childNodes[11];
- nodeTodayPct = pNode.childNodes[13];
- //nodeValue = pNode.childNodes[15];
- nodeGain = pNode.childNodes[17];
- nodeGainPct = pNode.childNodes[19];
- nodeButton = pNode.childNodes[21];
-
- nodeHeld.textContent = "&"; //String.fromCharCode(8727); //notes 9834, 9835; asterisks 8727, 10033
- nodeHeld.setAttribute("class","center");
- nodeHeld.setAttribute("title", "Tags (semi-sortable if page has been reloaded since tag entry)");
- nodePaid.textContent = "Paid";
- nodeToday.textContent = "Today";
- nodeTodayPct.textContent = String.fromCharCode(9650); //up-arrow
- nodeTodayPct.setAttribute("title", "Price movement arrows (not sortable)");
- nodeGain.textContent = "Gain / Loss";
- nodeGainPct.textContent = String.fromCharCode(177); //plus-minus
-
- nodeButton.setAttribute("class","center");
- if (i==0) {
- nodeButton.textContent = String.fromCharCode(9733); //star
- nodeButton.setAttribute("title", "Phase (not sortable)"); //916, delta
- }
- }
-
- //--- tweak data for every single security
-
- var findsecurities = document.evaluate("//div[@class='twelve columns last']//a[contains(@href,'security/view')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var item = "", ppNode = "", held = "", nodePaid = "";
- var nodeShares = "", nodeHeld = "", nodeCurrent = "", nodeToday = "";
- var nodeTodayPct = "", nodeValue = "", nodeGain = "", nodeGainPct = "", nodeButton = "";
-
- var tagChar = "", tagColor = ""; tagNote = ""; ititle = "";
- var lightGray = GM_getValue("opt_grayTxt", "#999999");
- var tagAllTickers = GM_getValue("tagTickers", "");
- var arrowmode = GM_getValue("optarrowmode", "change");
- var ticker = "", price = "", paddedTicker = "";
- var allTickersNew = "", allPricesNew = "";
- var allTickersOld = GM_getValue("prevTickers", "---"); // get trend info
- var allPricesOld = GM_getValue("prevPrices", "---");
-
- // pre-format trend arrows
- var pkgarrowup = "<span class='pmGreen'>" + String.fromCharCode(9650) + "</span>";
- var pkgarrowdown = "<span class='pmRed'>" + String.fromCharCode(9660) + "</span>";
-
- // bigass loop; main impact on speed is here
- for(var i=0; i<findsecurities.snapshotLength; i++)
- {
- item = findsecurities.snapshotItem(i);
- ppNode = item.parentNode.parentNode;
-
- nodeShares = ppNode.childNodes[3];
- nodeHeld = ppNode.childNodes[5];
- nodePaid = ppNode.childNodes[7];
- nodeCurrent = ppNode.childNodes[9];
- nodeToday = ppNode.childNodes[11];
- nodeTodayPct = ppNode.childNodes[13];
- nodeValue = ppNode.childNodes[15];
- nodeGain = ppNode.childNodes[17];
- nodeGainPct = ppNode.childNodes[19];
- nodeButton = ppNode.childNodes[21];
-
- ticker = item.textContent;
- ititle = item.title; //used for tagger and phase
- item.addEventListener("mouseover", putTicker, false);
- held = nodeHeld.textContent;
-
- if (held == "short") { nodeShares.innerHTML = "<span style='display:none;'>-</span><span class='pmRed'>" + nodeShares.textContent + "</span>"; }
- else { nodeShares.innerHTML = "<span class='pmGreen'>" + nodeShares.textContent + "</span>"; }
-
- var gainToday = nodeToday.textContent;
-
- var todayColor = "tlink";
- if (nodeToday.firstChild.getAttribute("class") == "down")
- {
- nodeToday.innerHTML = "<span class='pmRed'>-" + gainToday + "</span>";
- todayColor = "pmRed";
- }
- else if (gainToday.substring(2) > 0)
- {
- nodeToday.innerHTML = "<span class='pmGreen'>" + gainToday + "</span>";
- todayColor = "pmGreen";
- }
- else nodeToday.innerHTML = gainToday;
-
- nodeHeld.removeAttribute("style");
- nodeHeld.setAttribute("class","center");
-
- nodePaid.innerHTML = "<a href='javascript:info;' alt='" + ticker + "' class='tlink'>" + nodePaid.textContent + "</a>";
-
- // processes that only occur for movie section
- if(i < positions[0]) {
- var phase = ititle.charAt(ititle.lastIndexOf('(') + 1);
- nodeButton.innerHTML = phase;
- nodeButton.setAttribute("class","pmGray center"); // phase color default
- if (phase == 'C') {
- nodeButton.setAttribute("class","pmRed center");
- nodeButton.setAttribute("style","font-style:normal");
- }
- if (phase == 'D') nodeButton.setAttribute("class","pmBlack center");
- if (phase == 'P') nodeButton.setAttribute("class","pmGreen center");
- ititle = ititle.substring(0,ititle.lastIndexOf('(')-1); //shortened, for tagger
- nodeCurrent.innerHTML = "<a href='javascript:4div;' alt='" + ticker + "' class='tlink'>" + nodeCurrent.textContent + "</a>";
- nodeToday.innerHTML = "<a href='javascript:iday;' alt='" + ticker + "' class='" + todayColor + "'>" + nodeToday.textContent + "</a>";
- }
- else nodeButton.innerHTML = ""; //remove trade button on lower sections
-
- // processes that only occur for starbonds
- if(i >= positions[0] && i < positions[0] + positions[1]) {
- nodeCurrent.innerHTML = "<a href='javascript:bondP;' alt='" + ticker + "' class='tlink'>" + nodeCurrent.textContent + "</a>";
- }
-
- // put tags in place
- tagChar = "!|!";
- tagColor = lightGray;
- tagNote = "";
-
- paddedTicker = ticker + " ";
- paddedTicker = paddedTicker.slice(0,7); // also used below, for arrow read
-
- if(tagAllTickers.indexOf(paddedTicker) > -1) { // this is ticker pre-scan
- var tagInfo = readTag(ticker); // switch back to all function call by removing condition around this
- if(tagInfo[0] != "") {
- tagChar = tagInfo[0];
- tagColor = tagInfo[1];
- tagNote = tagInfo[2];
- }
- }
-
- nodeHeld.innerHTML = "<a href='javascript:tagger;' style='color:" + tagColor + "' title='" + tagNote + "' movie='" + ticker + " - " + ititle + "'>" + tagChar + "</a>";
-
- nodeValue.textContent = stripDeci(nodeValue.textContent);
-
- // format gain/loss and percent data
- var gaintext = stripDeci(nodeGain.textContent);
-
- if (nodeGainPct.textContent.indexOf('-') > -1)
- { nodeGain.innerHTML = "<span class='pmRed'>-H$" + gaintext + "</span>"; }
- else if (parseInt(gaintext) > 0)
- { nodeGain.innerHTML = "<span class='pmGreen'>H$" + gaintext + "</span>"; }
- else nodeGain.innerHTML = "H$" + gaintext;
-
- var gainPct = nodeGainPct.textContent;
- nodeGainPct.innerHTML = gainPct.substring(1,gainPct.length-5) + "%";
-
- // trend arrows
- price = nodeCurrent.textContent.slice(2);
- var indicator = " ";
- var tickerIdx = allTickersOld.indexOf(paddedTicker);
- if (tickerIdx > -1) {
- var oldPrice = parseFloat(allPricesOld.substr(tickerIdx,6));
- if(arrowmode == "trend") indicator = allPricesOld.substr(tickerIdx + 6,1);
-
- if (price > oldPrice) indicator = "^";
- if (price < oldPrice) indicator = "v";
- }
-
- if (indicator == "v") nodeTodayPct.innerHTML = pkgarrowdown;
- else if (indicator == "^") nodeTodayPct.innerHTML = pkgarrowup;
- else nodeTodayPct.textContent = "";
-
- allTickersNew += paddedTicker;
- price = price + " ";
- price = price.slice(0,6) + indicator;
- allPricesNew += price;
- }
-
- // save trend info after loop concludes
- GM_setValue("prevTickers", allTickersNew);
- GM_setValue("prevPrices", allPricesNew);
- }
-
- HSXPortMonkey_Run();
-
- })();
- // End