NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Flight Rising Helper // @namespace Flight Rising // @author Jonathon Braswell // @description A powerful, feature-rich toolbox for Flight Rising. // @include http://flightrising.com/* // @version 2.4 // @license MIT // ==/UserScript== /** * MIT License * Copyright (c) 2017 Jonathon Braswell * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * Flight Rising Helper * @namespace FlightRisingHelper * @dependency jQuery (included on site) * @author Jonathon Braswell */ var FlightRisingHelper = (($) => { /** UTILITY FUNCTIONS **/ let /* * Send async AJAX POST request. * @function _request * @private * @param payload {object} Data payload to [path]. * @param path {string} Directory or URL path to send [payload] to. */ _request = (payload, path) => { // Simply return AJAX promise. return $.ajax({ type: 'POST' ,data: payload || {} ,url: path ,cache: false }); } /* * Extract a dragon's unique identifier from a given [card] element. * @function _extractDragonIdFromCard * @private * @param card {HTMLDomElement|jQuery Object} Element from which to extract a dragon's unique identifier. */ ,_extractDragonIdFromCard = (card) => { // Find the icon's anchor element and extract the unique identifier from its URL. let anchor = $(card).find('a[rel]') ,link = $(anchor).attr('rel') || '' ,id = (link.split('id=')[1] || '').trim(); return id; } /* * Extract a query string variable from the given [searchString]. * @function _getUrlVar * @private * @param key {string} Variable name to return value for. * @param (searchString) {string} Optional. Source query string for search. */ ,_getUrlVar = (key, searchString) => { // Determine whether we're trying to query the parameter or the current URL and grab the variables. let query = (typeof searchString !== 'undefined' ? searchString.split('?')[1] : window.location.search.substring(1)) ,vars = query.split('&'); // Iterate the variables array until we find what we're looking for, then return the found value. for (var i = 0; i < vars.length; i++) { let pair = vars[i].split("="); if (pair[0] == key) return pair[1]; } } /* * Invoke the site's "assay dragons" functionality and create representation in the current DOM. * @function _assayDragons * @private * @param firstDragonId {int} A dragon's unique identifier. * @param secondDragonId {int} A dragon's unique identifier. */ ,_assayDragons = (firstDragonId, secondDragonId) => { // Invoke the site's native [showNewbies] function if it exists. if (typeof showNewbies === 'function') showNewbies(); else return; // Construct a payload and send a request to the site's scrying handler. let payload = { id1: firstDragonId ,id2: secondDragonId }; _request(payload, 'includes/ol/scryer_bloodlines.php').done((result) => { // Upon request completion determine if the given dragons are capable of // "breeding", construct a box in the DOM to display the determination, and // cache this element's intended parent. let canMate = (result.toLowerCase().indexOf('success') > -1) ,canBreedBoxCss = { padding: '20px' ,margin: '20px' ,textAlign: 'center' ,fontSize: '15px' ,background: (canMate ? 'lightgreen' : 'lightpink') } ,nestBoxParent = $('.nestbox').parent(); // Apply style the box and prepend it to the intended parent. $('<div />').attr('id', 'can-breed').css(canBreedBoxCss).prependTo(nestBoxParent); // Place situational text in the display box. $('#can-breed').html('These dragons <b>are' + (canMate ? '</b>' : ' not</b>') + ' eligible to breed as assayed.'); // Place "Breed" button. if (canMate) { let breedLink = $('<a href="" class="redbutton anybutton" target="_blank"></a>').text('Breed'); $(breedLink).attr('href', 'http://flightrising.com/main.php?p=lair&tab=nest&dids=' + firstDragonId + ',' + secondDragonId); $('[onclick="showNewbies()"]').parent().css('width', '210px').append(breedLink); } }); } /* * Mark all visible checkboxes as the parameter value. * @function _markAllCheckboxes * @private * @param checkValue {bool} Value to mark all visible checkboxes. */ ,_markAllCheckboxes = (checkValue) => { // Mark all checkboxes as the boolean value of the parameter. $('input[type="checkbox"]:visible').prop('checked', checkValue); } /* * Recurrently perform the site's "exalt" functionality on an array of dragons. * @function _multiExalt * @private * @param index {int} Index of current iteration over the given [dragonIds] array. * @param dragonIds {array} Array of dragons' unique identifiers to "exalt." * @param callback {function} Callback function to invoke after the last array element's invocation. */ ,_multiExalt = (index, dragonIds, callback) => { // Determine the current iteration's dragon, whether this is the last iteration, and construct a payload. let currentDragonId = dragonIds[index] ,isLast = (currentDragonId === dragonIds[dragonIds.length - 1]) ,payload = { dragon: currentDragonId }; // Send a request to the site's dragon "exile" handler. _request(payload, 'includes/ol/exiledragon.php').done(() => { // Upon request completion invoke this function if the [currentDragonId] isn't the last element of [dragonIds]. // Othwerise invoke the given [callback] function. if (!isLast) _multiExalt(++index, dragonIds, callback); else callback(); }); } /* * Return stored "offspring" records from [localStorage]. * @function _loadOffspring * @private */ ,_loadOffspring = () => { // Ensure the data exists in [localStorage] and return JSON parsed data. if (typeof localStorage.fhr_offspring === 'undefined') localStorage.fhr_offspring = '[]'; return JSON.parse(localStorage.fhr_offspring); } /* * Update stored "offspring" in [localStorage] with the given [offpsring] array. * @function _updateOffspring * @private * @param offspring {array} Updated array of "offspring" records for the current [localStorage] instance. */ ,_updateOffspring = (offspring) => { // Simply save the given stringified [offspring] onto [localStorage]. localStorage.fhr_offspring = JSON.stringify(offspring); }; /** UTILITY CONSTANTS **/ const // Minified CSS for various functionalities. CSS = '#bonding{min-height:280px!important;}/* safari and chrome */ @-webkit-keyframes wiggle { 0% {-webkit-transform:rotate(4deg);} 50% {-webkit-transform:rotate(-4deg);} 100% {-webkit-transform:rotate(4deg);} } /* firefox */ @-moz-keyframes wiggle { 0% {-moz-transform:rotate(4deg);} 50% {-moz-transform:rotate(-4deg);} 100% {-moz-transform:rotate(4deg);} } /* anyone brave enough to implement the ideal method */ @keyframes wiggle { 0% {transform:rotate(4deg);} 50% {transform:rotate(-4deg);} 100% {transform:rotate(4deg);} }' // Icon data or location URLs for various functionalities. ,ICONS = { NEST: 'http://puu.sh/wJ9Rr/b889eca68f.png' ,HOARD: 'http://flightrising.com/images/layout/vault/vault_active.png' ,WRENCH: 'data:image/png;base64,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' ,COATHANGER: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9YAAAImCAYAAAC2DBIfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAASAAAAEgARslrPgAAbARJREFUeNrt3XdgVGXe9vHrpEAaHZFepffeiwo2Et1V4FEpFoQklIAKBBQMKGoCCAEDSQALgrs+gDXYlgDSpUsv0jtIEwglJLnfPx7xVRckk3amfD9/rew5w5WQzDnX/O65xzLGCAAAOI+0tDRz8OBB7d69W/v371dKSoouXLigS5cuKSUlRVeuXJEkFShQQEFBQQoMDFShQoVUpEgRValSRdWqVVO5cuUsu78OAAA8hY/dAQAA8GSpqalm7dq1Wrx4sX766Sft2rVL+/btU2pqarYeNzAw0FSvXl3VqlVT8+bNdd9996lu3bqyLIvCDQBADrOYWAMAkLc2bdpkvv/+ey1ZskQrV65USkpKnvy9xYsXV4cOHXTvvfeqc+fOqlChAiUbAIAcQLEGACAPHD9+3MybN0+zZs3Spk2b7I4jSWrcuLF69uypHj16qFixYpRsAACyiGINAEAuSU9PN/Pnz9d7772nRYsWKSMjw+5It+Tv769//OMfCg0NVfv27SnYAAA4iGINAEAOu3Hjhvn3v/+tt956S7t377Y7jkNatWql4cOHKzg4mPdjAwCQSRRrAAByyNWrV83MmTM1fvx4HTlyxO442dKoUSO98sorevzxxynYAADcAcUaAIAcsGDBAhMREaEDBw7YHSVHNWnSRNOmTVPTpk0p1wAA3IaX3QEAAHBlx44dM7169TIhISFuV6olaf369WrVqpUGDRpkLl68yKvxAADcAhNrAACyID093UyYMEGvv/66rly5YnecPFG6dGlNmTJFTzzxBNNrAAD+gGINAICDTp8+bXr27Kn//Oc/dkexRc+ePZWQkKCAgAAKNgAAolgDAOCQJUuWmO7du+vEiRN2R7FVrVq1NHfuXNWuXZtyDQDweBRrAAAyISMjw4wePVpvvvlmnn0eddGiRVWtWjVVr15dhQoVUmBgoAoVKqSCBQsqLS1NKSkpunDhgi5duqSzZ89qz5492rNnj1JSUvIkX4ECBTR9+nQ9+eSTlGsAgEejWAMAcAepqanmmWee0SeffJJrf0dAQIDatGmje++9V61bt1bNmjVVvHjxLBXWw4cPmx07dmjZsmVasmSJ1q9fr7S0tFzJbVmW3nrrLQ0fPpxyDQDwWBRrAAD+xuXLl83jjz+uhQsX5vhjFytWTE899ZS6du2qFi1aKF++fLlSTi9dumQWL16sf//73/ryyy917dq1HP87Bg0apIkTJ8rLy4uCDQDwOBRrAABu45dffjGdO3fWunXrcuwxvby89Oijj+qZZ57RI488kmtl+nZ+/fVXM2/ePL3//vtavXp1jj72008/rQ8++CDPvyYAAOxGsQYA4BZOnz5t2rdvr127duXI4/n6+qp79+4aPny4qlev7hTFc9myZebNN9/M0d3NO3furM8//1y+vr5O8TUCAJAXKNYAAPzFpUuXzH333af169dn+7G8vLz0/PPP69VXX1XFihWdsmyuW7fOvPrqqzm23L1nz56aNWuWLMtyyq8XAICcRrEGAOAPUlNTzaOPPqrvv/8+24/VoEEDTZs2TS1btnSJgpmUlGQGDBigw4cPZ/ux+vfvr7i4OJf4ugEAyC4vuwMAAOAsMjIyTM+ePbNdqoOCgvTuu+9q/fr1LlOqJSkkJMTatm2bBg8eLC+v7N0iTJ06VePHj+fVewCAR2BiDQDAb0aMGGGio6Oz9Rh169bV3LlzVaNGDZcp1Lfy3XffmV69eumXX37J8mNYlqX58+fr8ccfd+nvBQAAd0KxBgBA0rfffmuCg4OVkZGR5cfo2bOnEhISFBAQ4BZF8tSpU6Znz57Zeu914cKFtWHDBlWuXNktvicAANwKxRoA4PGOHj1qGjZsqDNnzmTpfG9vb8XFxSksLMztymN6errp16+fpk+fnuXHaNq0qVasWMHHcAEA3BbvsQYAeLS0tDTz9NNPZ7lU58uXT//617/cslRLkre3t5WYmGhlZ4n8unXrNGzYMLu/FAAAcg3FGgDg0caOHavly5dn6dwCBQro22+/Vbdu3dyyVP9RZGSkFRcXl+VNzaZMmaKvv/6aZXIAALfEUnAAgMfau3evqVu3rq5du+bwufny5dOCBQvUqVMnty/VfzRt2jTTv3//LJ1bvnx57dixQ4GBgR71PQMAuD8m1gAAjxUREZGlUu3t7a2PP/7Y40q1JPXr18965ZVXsnTu4cOHld1d1wEAcEZMrAEAHmnu3Lnmf/7nf7J07vTp09WnTx+PK9U3GWNMnz599N577zl8bv78+bV582ZVr17dY79/AAD3Q7EGAHicS5cumZo1a+rYsWMOn9u/f3/FxcV5fCm8ceOGadeunX788UeHz+3YsaMWLlzo8d9DAID7YCk4AMDjTJkyJUulul69eho/frzd8Z2Cr6+vNXfuXBUrVszhc5OTk7Vw4UJe2QcAuA0m1gAAj3LlyhVTsWJF/fLLLw6dFxQUpPXr17OE+S++/vprExISIkfvJ9q3b68ffviB7yUAwC0wsQYAeJTExESHS7UkxcbGUqpvoXPnztYLL7zg8HlLly7VihUreHUfAOAWmFgDADzG9evXTZUqVRxeBt6sWTOtXr1aXl5eFOtbOHfunKlRo4bDL1g89NBD+vbbb/meAgBcHhNrAIDHmDVrlsOl2sfHR9OnT6dU/42iRYtaWfkYre+++04bN27kFX4AgMujWAMAPMaMGTMcPqd///6qX78+pfoOnnvuObVs2dLh87LybwIAgLNhKTgAwCPs3LnT1KpVy6Fz/Pz8tH//fpUqVYpinQkLFy40DzzwgEPnFC1aVMePH1f+/Pn5HgMAXBYTawCAR/joo48cPqdPnz6Uagd06tTJatWqlUPnnDt3Tl9//bXd0QEAyBaKNQDA7WVkZJiPP/7YoXN8fX318ssv2x3d5URGRjp8zuzZs+2ODQBAtlCsAQBu74cfftCRI0ccOuepp55ShQoVmFY7KCQkRI4uuf/mm2907tw53psGAHBZFGsAgNv79ttvHT7nueeeszu2S7Isy+rVq5dD56SmpmrRokV2RwcAIMso1gAAt7d48WKHjq9QoYLatWtnd2yX1bNnT3l7ezt0zpIlS+yODQBAllGsAQBu7cKFC2bz5s0OndOzZ08+tzobSpcubd17770OnePoix8AADgTijUAwK398MMPSk9Pd+icbt262R3b5T355JMOHb97924dPXqU91kDAFwSxRoA4NYcnYSWKFFCderUsTu2y+vYsaPD57AcHADgqijWAAC3tn79eoeOv++++2RZFsvAs6lChQpW5cqVHTrH0X8rAACcBcUaAODW9uzZ49Dxjr43GLd33333OXT87t277Y4MAECWUKwBAG7rzJkz5uzZsw6d07ZtW7tjuw1Hv5cUawCAq6JYAwDclqNF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aO/evXZHAdxGxYoVtWXLFhUoUIByDQAehqXgAOCBhgwZQqkGctjBgwc1dOhQu2MAAGzAxBoAPMx3331nHnnkEZaAA7nAsix99dVXCg4OZmoNAB6EYg0AHuTIkSOmUaNGOnPmjN1RALdVuHBhrV+/XlWqVKFcA4CHoFgDgIe4fv26adeundauXWt3FNyBj4+PqlSpoqCgoD/9+dmzZ3Xw4EG74yETGjZsqJUrV8rf359yDQAegGINAB4iLCzMJCYm2h0Dt1GkSBGFhIToiSeeUKdOnW5byM6ePWuSkpL02WefaeHChbp27Zrd0XEbvXr10ocffijLsijXAODmKNYA4AGio6PNiBEj7I6Bv/D29tajjz6qvn376v7775evr69DBezSpUvmyy+/VHx8vFatWmX3l4NbGDVqlF5//XWKNQC4OYo1ALi5Tz75xDz99NNsVuZEChcurF69eunFF19UxYoVc6R0bdq0ySQkJGjOnDm6cuWK3V8i/iAuLk79+/enXAOAG6NYA4AbS05ONp07d1ZqaqrdUSCpZs2aGjp0qJ566in5+fnlStE6e/asmT59umJjY3X69Gm7v2To/94z//nnn7NTOAC4MYo1ALipFStWmIcffliXL1+2O4rHq1u3roYMGaLu3bvL29s7T8rV9evXzaxZs/TGG2/o6NGjdn8LPF6+fPk0f/58hYSEUK4BwA1RrAHADa1cudI8/PDDunTpkt1RPFqDBg30yiuvqEuXLrZtYJWammo++eQTjR07Vj///LPd3xKPRrkGAPdFsQYAN7N8+XLzyCOPMKm2UfPmzfX666/rgQcecJoClZaWZubMmaMxY8bwkV028vPz0xdffKEHH3zQaX42AADZR7EGADeyePFi89hjj1GqbVKvXj298cYbevTRR522NKWmppqZM2dq7NixOnHihN1xPJKfn58++eQTPfbYY077cwIAcIyX3QEAADnj888/N507d6ZU26BixYpKTEzUxo0bnbpUS1K+fPmsfv36WQcOHFBiYqLuvvtuuyN5nGvXrumJJ55QQkIC0w0AcBNMrAHADUyZMsW8+OKLysjIsDuKRylfvryioqLUq1cv+fj4OHWhvp2LFy+aSZMm6Z133uE9+TYYM2aMXnvtNZf82QEA/H8UawBwYcYYM2bMGI0ZM8buKB4lKChIL7/8siIjI+Xv7+8Wpejs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rAFwSEpKinnjjTc0YcIEpaen2x3H7RUvXlwjR47UgAED5O3tzXM2gN9RrAH8bseOHWbo0KH65ptv7I7iEe69917Fx8erevXq3JwByJaffvrJhIaGau3atXZH8Qg1a9bUuHHjFBwczPM3AElsXgZA//d+vdDQUFOvXj1KdR4oWbKkZs2apcWLF1uUagA5oUGDBtbq1auVmJioggUL2h3H7e3cuVMhISHq1KmT2bJlC1MqAEysAU+WkpJi4uLi9Oabb+rSpUt2x3F7NzcnmzRpkooVK0ahBpArTpw4YSIjIzV79my7o3gELy8vde/eXTExMSpVqhTP7YCHolgDHigjI8PMmTNHw4cP14kTJ+yO4xHq1aunhIQEtWzZkpsuAHliwYIFZsCAATp06JDdUTxCYGCgBgwYoFdffVUFChTguR7wMBRrwMMkJyebIUOGaPPmzXZH8QgBAQEaOnSoXnnlFeXLl48bLQB56sqVK2bcuHF6++23lZqaanccj1CmTBm99tpr6t27NxucAR6EYg14iJ07d5phw4ZpwYIFdkfxGMHBwYqLi+OzTwHYbsuWLSYsLEyrV6+2O4rHqF27tsaPH6+HH36YawDgAdi8DHBzZ86cMYMGDTJ169alVOeRUqVKadasWUpKSrIo1QCcQb169ayVK1dq1qxZKlasmN1xPML27dv1yCOPqFOnTmbr1q1MsgA3x8QacFNXrlwx7777rt566y1dvHjR7jgewcvLSy+88ILGjx+vggULUqgBOKWTJ0+aYcOGsblZHvLx8dHzzz+v119/XXfffTfXB8ANUawBN2OMMfPnz9fQoUPZsCYPNWjQQImJiWrWrBk3TABcwpIlS0x4eLh2795tdxSPERQUpJdfflmRkZHy9/fnegG4EYo14EYWL15shgwZok2bNtkdxWMEBgZq1KhRGjJkCJvUAHA5V69eNTExMYqOjtb169ftjuMxypYtq1GjRumFF16Ql5cX1w7ADVCsATewe/duM2rUKM2bN8/uKB4lODhYU6dOVfny5bkpAuDS9uzZY/r166dFixbZHcWjNGnSRBMmTFD79u25jgAujs3LABd29uxZM2jQIFOnTh1KdR4qU6aM5s+fr6SkJItSDcAdVKtWzVq4cKFmzZql4sWL2x3HY6xfv14dOnRQp06dzPbt25l2AS6MiTXggq5evWpiY2MVHR3N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lE6fPm13HGRSlSpVNHXqVD344IM8cQIAgFyxYMECM3DgQB08eNDuKMikfPnyKSwsTGPGjFHhwoW5T3RBFGsXc3On7xEjRmjfvn12x0Em+fr66qWXXtLo0aPZDRIAAOS6K1eumHHjxuntt99Wamqq3XGQSUWLFtWwYcPYQdwFUaxdyOrVq83QoUO1cuVKu6PAAW3btlVCQoJq1arFkyMAAMhTW7ZsMWFhYVq9erXdUeCA8uXL69VXX9ULL7wgLy8v7iFdAJuXuYBdu3aZbt26mVatWlGqXUiRIkUUGxurH374gVINAABsUa9ePWvlypWaNWuWihUrZnccZNLhw4cVGhqq5s2ba/HixUxCXQATayd27Ngx8/rrr+v9999XWlqa3XHggK5du2rq1Km66667KNQAAMApnDx50gwbNozNzVxQx44dNWHCBNWvX597SydFsXZCly9fNlOnTtWbb76pS5cu2R0HDrjnnnsUHx+vjh078qQHAACc0pIlS0x4eLh2795tdxQ44OYO4uPGjVPFihW513QyFGsncnOn79dee02nTp2yOw4ccHNzsjFjxih//vw80QEAAKd29epVExMTo+joaF2/ft3uOHBAQECABg4cqBEjRqhQoULcdzoJirWTSEpKMi+//LJ+/vlnu6PAQe3bt1dCQoJq1KjBExsAAHApP//8swkPD9eiRYvsjgIHFStWTEOHDtXgwYMZ7DgBirXNli9fboYOHao1a9bYHQUOKlGihN555x316NGDJzIAAOCyjDHm/fff17Bhw3Tu3Dm748BB99xzj9566y116dJFlmVxX2oTirVN9uzZY0aOHKl58+bZHQUOsixLPXr00MSJE1W8eHGevAAAgFs4d+6cGTFihGbMmCE6gutp2rSpJkyYoHbt2nF/agOKdR47e/asGT9+vCZNmqTU1FS748BB1apVU3x8vO677z6esAAAgFtatmyZCQsL086dO+2Ogizo2LGjYmNjVbt2be5X8xCfY51HUlNTzeTJk02VKlUUExNDqXYx/v7+ioqK0tatWynVAADArbVr187avHmzoqOj5efnZ3ccOCg5OVkNGzZUaGioOX36NFPUPMLEOpcZY8z8+fMVGRmpAwcO2B0HWXDvvfcqPj5e1atXp1ADAACPsm/fPtOvXz/95z//sTsKsiAoKEgvv/yyhg8fLj8/P+5lcxHF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' ,SELECT_ALL: 'http://flightrising.com/images/layout/vault/select_all.png' ,SELECT_NONE: 'http://flightrising.com/images/layout/vault/select_none.png' } // Query variables. ,QUERY = { DID: _getUrlVar('did') ,DIDS: _getUrlVar('dids') ,DRAGON: _getUrlVar('dragon') ,ID: _getUrlVar('id') ,PAGE: _getUrlVar('p') ,TAB: _getUrlVar('tab') ,VIEW: _getUrlVar('view') }; /** SETUP/FUNCTIONALITY FUNCTIONS **/ let /* * Initialize functionality for the currency management system. * @function _setupCurrencyManagement * @private */ _setupCurrencyManagement = () => { // Apply CSS to the page. $('<style type="text/css" />').text(CSS).appendTo('head'); // Grab the "gem" and "treasure" currency containers, counts, and create deposit buttons for each. let gemContainer = $('#usertab').children().last() ,treasureContainer = $(gemContainer).prev() ,gemCount = parseInt($('#user_gems').text()) || 0 ,treasureCount = parseInt($('#user_treasure').text()) || 0 ,gemDepositBtn = $('<img />') .attr('id', 'gem-deposit') .attr('src', ICONS.HOARD) .attr('width', '15px') .attr('height', '15px') .click((event) => { // On "gem" deposit button click. // Construct a payload and send a request to the vault transaction handler. let payload = { trans: 'deposit' ,curr: 1 ,amount: gemCount } ,button = event.target; _request(payload, 'includes/ol/vault_withdep.php').done(() => { // Upon request completion show a temporary message to the user for validation. $('#user_gems').text('Deposited!'); setTimeout(() => { $('#user_gems').text('0'); $(button).remove(); }, 2000); }); } ) ,treasureDepositBtn = $('<img />') .attr('id', 'treasure-deposit') .attr('src', ICONS.HOARD) .attr('width', '15px') .attr('height', '15px') .click((event) => { // On "treasure" deposit button click. // Construct a payload and send a request to the vault transaction handler. let payload = { trans: 'deposit' ,curr: 0 ,amount: treasureCount } ,button = event.target; _request(payload, 'includes/ol/vault_withdep.php').done(() => { // Upon request completion show a temporary message to the user for validation. $('#user_treasure').text('Deposited!'); setTimeout(() => { $('#user_treasure').text('0'); $(button).remove(); }, 2000); }); } ); // If the user has "treasure" or "gem" currency available, add these buttons to the DOM. if (treasureCount) $(treasureDepositBtn).appendTo(treasureContainer); if (gemCount) $(gemDepositBtn).appendTo(gemContainer); } /* * Initialize functionality for familiar icon replacement with full art. * @function _setupFamiliarIconReplacement * @private */ ,_setupFamiliarIconReplacement = () => { $('img[src^="/images/cms/familiar"]').each((i, familiar) => { if (!familiar.src.includes('art')) { familiar.src = familiar.src.replace('familiar', 'familiar/art'); } }); } /* * Initialize functionality for bestiary familiar art coloration. * @function _setupBestiaryColoration * @private */ ,_setupBestiaryColoration = () => { $('img[src^="/images/cms/familiar"]').each((i, familiar) => { if (familiar.src.includes('gray')) { $(familiar).addClass('frh-locked'); } }); $('.frh-locked').hover(function () { let familiar = $(this); if ($(familiar).attr('src').includes('gray')) { $(familiar).attr('src', $(familiar).attr('src').replace('_gray', '')); } }, function () { let familiar = $(this); if (!$(familiar).attr('src').includes('gray')) { $(familiar).attr('src', $(familiar).attr('src').replace('.png', '_gray.png')); } }); } /* * Initialize functionality for the "progeny" functionality shortcuts. * @function _setupProgenyShortcuts * @private */ ,_setupProgenyShortcuts = () => { // New up an array to track selected dragon unique identifiers. let selectedDragonIds = []; $('.dragoncard .miniclue').click((event) => { // On dragon card's "gender" icon click. // Prevent bubble. event.preventDefault(), event.stopPropagation(); // Cache the clicked element and extract this dragon's unique identifier. let button = event.target ,id = _extractDragonIdFromCard($(button).closest('.dragoncard')); // Add this dragon's unique identifier to the list of selected dragons. selectedDragonIds.push(id); // Change the border appearance to show that this is a selected entry. $(button).closest('.dragoncard').css('border', '3px dashed #9f9a8f'); // If this is the second dragon selected, open a new window to the "progeny" page, then reset all the cards' border appearances. if(selectedDragonIds.length > 1) { let dIds = selectedDragonIds.join(','); window.open('http://flightrising.com/main.php?p=scrying&view=progeny&dids=' + dIds, '_blank'); selectedDragonIds = []; $('.dragoncard').each((i, card) => { $(card).css('border', '1px solid #9f9a8f'); }); } }); } /* * Initialize functionality for the "morphology" shortcuts. * @function _setupMorphologyShortcuts * @private */ ,_setupMorphologyShortcuts = () => { // Begin "dragon" tab functionality suite. if (QUERY.TAB === 'dragon') { // Cache the "morph" button container, create a button for the user, and append it to the container. let btnContainer = $('.main'); $('<a />') .addClass('morph-btn beigebutton thingbutton') .text('Morph') .css({ position: 'absolute' ,top: '46px' ,right: '360px' ,zIndex: '2' }) .attr('href', 'http://flightrising.com/main.php?p=scrying&view=morphintime&did=' + QUERY.DID) .attr('target', '_blank') .prependTo(btnContainer); } // Iterate all the dragon cards on the page. $('.dragoncard').each((i, card) => { // Extract this dragon's unique identifier, "morph" URL, and container. Create a wrench tool image. let id = _extractDragonIdFromCard(card) ,img = $('<img />') .attr('src', ICONS.WRENCH) .height('25') .width('25') .css('float', 'left') ,anchor = $('<a />') .attr('href', 'http://flightrising.com/main.php?p=scrying&view=morphintime&did=' + id) .attr('target', '_blank') ,container = $(card).children().last().children().last(); // Add the wrench tool image to the container. $(img).appendTo($(anchor).prependTo(container)); // Add CSS animation effects to this card on hover. $(card).hover( () => { $(card).find('.dragonthmb').css({ '-webkit-animation': 'wiggle 0.5s infinite' ,'-moz-animation': 'wiggle 0.5s infinite' ,'animation': 'wiggle 0.5s infinite' }); } ,() => { $(card).find('.dragonthmb').css({ '-webkit-animation': 'none' ,'-moz-animation': 'none' ,'animation': 'none' }); } ); }); } /* * Initialize functionality for the "bonding" shortcuts. * @function _setupBondingShortcuts * @private */ ,_setupBondingShortcuts = () => { // Create an invisible DOM element for storing a "bonding" action frame element. let bondBin = $('<div />') .attr('id', 'bond-bin') .css('display', 'none') .appendTo('body'); // Change the cursor style on the "famicon" button image. $('img[src$="famicon.png"]') .css('cursor', 'pointer') .click((event) => { // On "famicon" button click. // Cache this button and extract this dragon's URL. let button = event.target ,url = $(button).closest('.dragoncard').find('a[rel]').attr('href'); // Load the dragon's URL into the bond bin and activate the "bond" functionality. // Yes this ugly page scraping is the result of this site having no sense of APIs. :P $(bondBin).load(url, () => { $(bondBin).find('img[src$="button_bond.png"]').click(); $(bondBin).empty(); }); }); } /* * Initialize functionality for the "dressing room" shortcuts. * @function _setupDressingRoomShortcuts * @private */ ,_setupDressingRoomShortcuts = () => { // Define a scoped function for submitting a dragon's unique identifier to the "dressing room" functionality page. let dressingRoomFormSubmit = (dragonId) => { let input = $('<input id="dragon" name="dragon" type="text" />') ,form = $('<form action="http://www1.flightrising.com/dressing/outfit" method="POST" target="_blank"></form>'); $(form).hide().appendTo('body').append($(input).val(dragonId)).submit().remove(); }; // Begin "dragon" tab functionality suite. if (QUERY.TAB === 'dragon') { // Cache button container, create and append an action button to this container. let btnContainer = $('.main'); $('<a />') .addClass('dressing-room-btn beigebutton thingbutton') .text('Dress') .css({ position: 'absolute' ,top: '46px' ,right: '270px' ,zIndex: '2' }).prependTo(btnContainer) .click(() => { dressingRoomFormSubmit(QUERY.DID); }); // On "dress" button click: invoke [dressingRoomformSubmit] with the current page's dragon's unique identifier. } else if (QUERY.ID && !QUERY.TAB) { // All other tab/id combo suite. // Iterate each dragon card on the page. $('.dragoncard').each((i, card) => { // Create a "dress" button using this dragon's unique identifier. let id = _extractDragonIdFromCard(card) ,img = $('<img />') .attr('src', ICONS.COATHANGER) .css({ height: '15px' ,width: '25px' ,float: 'left' ,marginTop: '5px' ,marginLeft: '-8px' ,cursor: 'pointer' }) .click(() => { dressingRoomFormSubmit(id); }) ,container = $(card).children().last().children().last(); // Append it to this iteration's container. $(img).appendTo(container); }); } } /* * Initialize functionality for the "progeny" functionality page. * @function _setupInitializedProgeny * @private */ ,_setupInitializedProgeny = () => { // Only act if the query has unique identifiers. if (QUERY.DIDS) { // Grab the two query string identifier values. let firstId = QUERY.DIDS.split(',')[0] ,secondId = QUERY.DIDS.split(',')[1]; // Place them into the "progeny" form. $('#id10t1').val(firstId), $('#id10t2').val(secondId); // Invoke our [_assayDragons] function with these values. _assayDragons(firstId, secondId); } } /* * Initialize functionality for the "morphology" functionality page. * @function _setupInitializedMorphology * @private */ ,_setupInitializedMorphology = () => { // Set the form's input value to the current query's unique identifier and invoke the site's [AEGBAGA] (???) function to submit. let id = QUERY.DID; $('#greenranger').val(id), AEGBAGA(); setTimeout(() => { // Wait a bit and flip the age of the dragon to adult, then refres the current view by invoking the site's [lolRedRanger] (again, ???) function. $('#setage').val(1), lolRedRanger(); }, 1000); } /* * Initialize functionality for the " */ ,_setupInitializedNest = () => { if ((QUERY.TAB === 'nest') && QUERY.DIDS) { let firstId = QUERY.DIDS.split(',')[0] ,secondId = QUERY.DIDS.split(',')[1]; if ($('#dad').find('option[value="' + firstId + '"]').length) { console.log('first id is dad'); $('#dad').val(firstId).change(); } else if ($('#mom').find('option[value="' + firstId + '"]').length) { console.log('first id is mom'); $('#mom').val(firstId).change(); } if ($('#mom').find('option[value="' + secondId + '"]').length) { console.log('second id is mom'); $('#mom').val(secondId).change(); } else if ($('#dad').find('option[value="' + secondId + '"]').length) { console.log('second id is dad'); $('#dad').val(secondId).change(); } if (typeof showBabies === 'function') setTimeout(showBabies, 1000); } } /* * Initialize "hoard" functionality page. * @function _setupHoard * @private */ ,_setupHoard = () => { // Remove functionality we're replacing. $('#food').parent().remove(); // Redefine the site's [uncheckAll] and [checkAll] functions with our versions. uncheckAll = () => { _markAllCheckboxes(false); } ,checkAll = () => { _markAllCheckboxes(true); }; // Create check and uncheck buttons for pages that don't have them. let container = $('#invent').children().last() ,checkLeft = (QUERY.PAGE === 'hoard' ? '0' : '415px') ,uncheckLeft = (QUERY.PAGE === 'hoard' ? '53px' : '470px'); // Only act if the check and uncheck buttons we need don't exist. if (!$('img[onclick="checkAll(invent)"]:visible').length) { // Create an uncheck all button, add a click event handler, and append it to the DOM. $('<img />') .attr('src', ICONS.SELECT_NONE) .prependTo(container) .click(() => { _markAllCheckboxes(false); }) .css({ position: 'absolute' ,left: uncheckLeft ,top: '0' }) // Create a check all button, add a click event handler, and append it to the DOM. ,$('<img />') .attr('src', ICONS.SELECT_ALL) .prependTo(container) .click(() => { _markAllCheckboxes(true); }) .css({ position: 'absolute' ,left: checkLeft ,top: '0' }); } // Begin "vault" page functionality suite. if (QUERY.PAGE === 'vault') { // Grab "treausure" and "gem" currency counts. let treasureCount = $('#nodiving').text().trim() ,gemCount = $('#bling').text().trim(); // Create "treasure" withdraw button. $('img[src="../images/layout/icon_treasure.png"]') .css('cursor', 'pointer') .unbind() .click(() => { // On "treasure" withdraw button click. // Construct a payload and send a request to the vault transaction handler. let payload = { trans: 'withdraw' ,curr: 0 ,amount: treasureCount }; _request(payload, 'includes/ol/vault_withdep.php').done(() => { // Upon request completion show a temporary message to the user for validation. $('#nodiving').text('Withdrawn!'); setTimeout(() => { $('#nodiving').text('0'); }, 2000); }); }) // Create "gem" withdraw button. ,$('img[src="../images/layout/icon_gems.png"]') .css('cursor', 'pointer') .unbind() .click(() => { // On "gem" withdraw button click. // Construct a payload and send a request to the vault transaction handler. let payload = { trans: 'withdraw' ,curr: 1 ,amount: gemCount }; _request(payload, 'includes/ol/vault_withdep.php').done(() => { // Upon request completion show a temporary message to the user for validation. $('#bling').text('Withdrawn!'); setTimeout(() => { $('#bling').text('0'); }, 2000); }); }); } } /* * Initialize the "multiple-exalt" tool and custom functionality. * @function _setupMultiExaltTool * @private */ ,_setupMultiExaltTool = () => { // Init a selecting flag, an array to hold dragon identifiers. let isSelecting = false ,exaltees = [] ,btnContainer = $('#tunak').prev().children().last() ,marquee = $('<div />') // Create an element to act as a marquee to relay info to the user. .css('text-align', 'center') .html('<h2>Select the dragons that you wish to exalt and then click the Exalt button above.</h2>') .hide() ,marqueePrev = $('form').prev().after(marquee) // Apply it to the DOM. ,handleExalteeSelection = (event) => { // Scoped function to handle dragon selection. // Prevent bubble. event.preventDefault(), event.stopPropagation(); // Grab the current card and extract its dragon's unique identifier. let card = $(event.target).closest('.dragoncard') ,id = _extractDragonIdFromCard(card); // If selected id is in the [exaltees] array, remove it. Otherwise add it. if (exaltees.indexOf(id) > -1) { exaltees.splice(exaltees.indexOf(id), 1); $(card).css('border', '1px solid #9f9a8f'); } else { exaltees.push(id); $(card).css('border', '3px dashed #9f9a8f'); } }; // Create an action button to toggle selection status/submission for "multiple-exalt" custom functionality. $('<button />') .addClass('multi-exalt-btn beigebutton thingbutton') .text('Multi-Exalt') .css({ position: 'absolute' ,top: '7px' ,left: '-125px' }).prependTo(btnContainer) .click((event) => { // On "Multi-Exalt" button click. // Cache action button. let button = event.target; // If not already selecting, toggle selecting and init click event on all dragon cards. if (!isSelecting) { isSelecting = true; $(button).removeClass('thingbutton beigebutton').addClass('redbutton anybutton').text('Exalt'); $('.dragoncard').click(handleExalteeSelection); $(marquee).show(); } else { // If selecting, remove click event handler and reset selection form. isSelecting = false; $('.dragoncard').unbind('click', handleExalteeSelection); $(marquee).hide(); $('.dragoncard').each((i, card) => { $(card).css('border', '1px solid #9f9a8f'); }); $(button).removeClass('redbutton anybutton').addClass('beigebutton thingbutton').text('Multi-Exalt'); // If submitting and there are dragons to "exalt". if (exaltees.length) { // Confirm the user wants to "exalt" all the selected dragons. $(button).text('Exalting...'); let isSingle = (exaltees.length === 1) ,confirmation = confirm('Are you sure you wish to exalt ' + (isSingle ? 'this' : 'these') + ' ' + exaltees.length + ' dragon' + (isSingle ? '': 's') + '?'); if (confirmation) { // If user confirms, invoke our [_multiExalt] function starting at the 0th index of [exaltees] with callback of reloading the page. _multiExalt(0, exaltees, () => { window.location.reload(); }); } else { // If the user cancels, reset the [exaltees] array, and reset the GUI. exaltees = []; $(button).removeClass('redbutton anybutton').addClass('beigebutton thingbutton').text('Multi-Exalt'); } } } }); } /* * Initialize the "saved offspring" tool and custom functionality. * @function _setupSavedOffspringTool * @private */ ,_setupSavedOffspringTool = () => { // Gather saved offspring from [localStorage] and create a box to show the offspring in. let savedOffspring = _loadOffspring() ,savedBox = $('<div class="saved-box" />') .css({ background: '#dedacf', borderRadius: '5px', border: '1px solid #000', textAlign: 'center', width: '100%', marginTop: '20px' }).html('<h2>Saved Offspring</h2>') // Scoped function to draw "saved offspring" functionality display box in the DOM. ,drawSavedOffspring = (saveBox) => { // Ensure any previous instance is removed--gracefully. $('.saved-box').empty().html('<h2>Saved Offspring</h2>').remove(); // Iterate each saved "offspring." $(savedOffspring).each((i, offspring) => { // Find the offspring URL that matches current URL. if (offspring.url === window.location.search) { // Append the drawn box to the DOM. $('input[value="Preview"]').parent().after(saveBox); // Only act if there are offspring. if (offspring.offspring.length) { // Iterate each offspring. $(offspring.offspring).each((i, image) => { // Create an image of the saved offspring. let img = $('<img src="' + image + '" />') .click(() => { // On offspring icon click. // Confirm the user wants to remove saved offspring. let confirmation = confirm('Are you sure you wish to remove this saved offspring?'); // If confirmed, remove this offspring and update the save. Then redraw the box. if (confirmation) { offspring.offspring.splice(offspring.offspring.indexOf(image), 1); _updateOffspring(savedOffspring); drawSavedOffspring(saveBox); } }); // Append the image to the saved box. $(savedBox).append(img); }); } else { // No offspring detected. $(saveBox).append('<b>No offspring saved for this pair.</b><br/><br/>'); } return; } }); } /* * Save clicked dragon as offspring for pair on the current page. * @function offspringSavingHandler * @private * @param event {object} Click event object. */ ,offspringSavingHandler = (event) => { // Prevent bubble. event.preventDefault(), event.stopPropagation(); // Cache clicked element and confirmation from user. let image = event.target ,confirmation = confirm('Do you wish to save this offspring possibility for future reference?'); // Only act if the user confirmed. if (confirmation) { // Declare flag. let thisPageExists = false; // Iterate each saved "offspring." $(savedOffspring).each((i, offspring) => { // If this offspring matches the current page, flip the flag. if (offspring.url === window.location.search) { thisPageExists = true; return; } }); // If this page doesn't exist in the offspring, save it to the offspring array. if (!thisPageExists) { let offspring = { url: window.location.search, offspring: [$(image).attr('src')] }; savedOffspring.push(offspring); _updateOffspring(savedOffspring); } else { // Otherwise update the existing entry for this offspring. $(savedOffspring).each((i, offspring) => { if (offspring.url === window.location.search) { if (typeof offspring.offspring === 'undefined') offspring.offspring = []; if (offspring.offspring.indexOf($(image).attr('src')) === -1) { offspring.offspring.push($(image).attr('src')); _updateOffspring(savedOffspring); } return; } }); } // Redraw the "saved offspring" display box. drawSavedOffspring(savedBox); } } // If there are "saved offspring" entries, draw the "saved offspring" display box. if (savedOffspring.length) drawSavedOffspring(savedBox); // Scoped function to initialize the click event handler on the preview button on this page. let initializer = () => { $('#preview img') .unbind('click') .click(offspringSavingHandler); }; // Register [initializer] to doc ready and AJAX.oncomplete. $(document).ready(initializer).ajaxComplete(initializer); } /* * Initialize the "setup lineage" tool and custom functionality. */ ,_setupLineagePreviewTool = () => { // If there is no "lineage preview" display box, draw one in the DOM. if (!$('#lineage-preview').length) { $('<div id="lineage-preview" style="position: fixed; display: none; border: 1px solid #000; background: #dad6c8; border-radius: 1em; padding:20px;"></div>').appendTo('body'); } // Scoped function to handle "ancestor" name mouse hover. let hoverHandler = (event) => { // Cache clicked name. let link = event.target; // If the "lineage preview" display box is visible, hide it. if ($('#lineage-preview').is(':visible')) { $('#lineage-preview').hide(); } else { // Otherwise grab the link's source and grab the dragon's unique identifier from this source. let href = $(link).attr('href') || $(link).attr('src') ,dId = _getUrlVar('did', href) || _getUrlVar('dragon', href); // Load dragon image from their page into the "lineage preview" display box. $('#lineage-preview') .load('http://flightrising.com/main.php?dragon=' + dId + ' #dragbuttons', () => { if (!$('#lineage-preview').children().length) { $('#lineage-preview') .load('http://flightrising.com/main.php?dragon=' + dId + ' span[style="width:350px; height:350px; margin-bottom:20px; margin-top:28px; margin-left:15px; display:inline-block;"]', () => { let left = (event.clientX - 420) + 'px' ,top = (event.clientY - 420) + 'px' ,div = document.getElementById('lineage-preview'); div.style.left = left; div.style.top = top; $('#lineage-preview').show(); }); } else { let left = (event.clientX - 420) + 'px' ,top = (event.clientY - 420) + 'px' ,div = document.getElementById('lineage-preview'); div.style.left = left; div.style.top = top; $('#lineage-preview').show(); } }); } }; // Apply the [hoverHandler] function as hover event handlers to "ancestor" names on the page. $('a[style="color:#000; font-weight:bold; text-decoration:underline;"]').on('mouseenter mouseleave', hoverHandler); $('.itemicon.ah-listing-icon img').on('mouseenter mouseleave', hoverHandler); $('#lineage-preview').hover((event) => { $(event.target).hide(); }); } /* * Replaces breeding cooldown icons with their numerical values. * @function _replaceBreedingCooldownIcons * @private */ ,_replaceBreedingCooldownIcons = () => { let eggElements = $('a[title^="This dragon will not be available to breed"]'); $(eggElements).each((i, element) => { let cooldown = $(element).attr('title').replace(/\D/g, ''); $(element).find('img').replaceWith('<span style="font-size: 18px; color: #731d08; font-weight: bold;">' + cooldown + '</span>'); }); }; /** INITIALIZATION **/ /* * Initialize script functionality! * @function _init * @private */ let _init = () => { // Initialize currency management on all pages. _setupCurrencyManagement(); // Switch on current page. switch (QUERY.PAGE) { // Initialize hoard custom functionalities and set AJAX.oncomplete handler. case 'hoard': case 'vault': _setupHoard(), $(document).ajaxComplete(_setupHoard), $(document).ajaxComplete(_setupFamiliarIconReplacement); break; // Initialize "multiple-exalt" and "bonding" shortcut tools. case 'lair': _setupMultiExaltTool(), _setupBondingShortcuts(), _setupInitializedNest(), _replaceBreedingCooldownIcons(); // Initialize "progeny" and "morphology" shortcut tools. case 'view': _setupProgenyShortcuts(), _setupMorphologyShortcuts(); // Begin "dragon" tab, "" dragon, and AH Dragons functionality suite. // Initialize the "lineage preview" tool and the "dressing room" shortcuts tool. if (QUERY.TAB === 'dragon' || QUERY.DRAGON !== '' || window.location.pathname === '/auction-house/buy/realm/dragons') _setupLineagePreviewTool(); _setupDressingRoomShortcuts(); break; // Initialize "initialized progeny, morphology" and "saved offspring" tools. case 'scrying': switch (QUERY.VIEW) { case 'progeny': _setupInitializedProgeny(), _setupSavedOffspringTool(); break; case 'morphintime': _setupInitializedMorphology(); break; }; break; // Initialize "bestiary familiar coloration" tool. case 'bestiary': _setupBestiaryColoration(); break; }; }; return { /* * Initialize! * @method init * @memberof FlightRisingHelper * @public */ init: _init }; })($); // Attach FRH.init as doc.ready event handler. $(document).ready(FlightRisingHelper.init); // EOF