// ==UserScript== // @name The-west Market Helper // @version 1.2.8.3 // @description Market Helper, allows you to see towns from where you need to collect items // @author darkyndy // @namespace http://darkyndy.com/projects/thewestmarkethelper // @include http://*.the-west.*/game.php* // ==/UserScript== /** * Market Helper * * @version 1.2.8.3 * Fix number of items * * @version 1.2.8.2 * Change icon position * Fix script for game versions with old market layout * * @version 1.2.8.1 * Fix duplicate items issue * Add support back for 1.33 and new version (1.34 and 1.35) * * @version 1.2.8 * Fix to work for 1.35 game version * Update script icon * * @version 1.2.7 * Fix bug on item count after minimize * Add loading at collect all purchased items * * @version 1.2.6 * Improve market purchase items filters, link filters with towns displayed on map * Run auto-update check maximum once per 24 hours (use less bandwidth) * * @version 1.2.5 * Improve speed for collect all functionality * Increase market helper window size * Filter towns and items by auction ended, in progress or display all * * @version 1.2.4 * Fix duplicate items from purchase * Show items that are still in auction * Display items for purchase in main window * * @version 1.2.3 * Fix when current location is a town from where you can collect items * Improve collect all functionality * * @version 1.2.2 * Minimize and restore market helper window * Add Help tab * * @version 1.2.1 * Fix auto-update for FireFox * * @version 1.2.0 * Remove register using TheWestApi, issues from TheWestApi * Async script initialization and auto-update * Show items that need to be purchased for each town * Button for collect all items from a town (you must be in that town) * Button to open town overview or center map on town * * @version 1.1.1 * Fix button position, overlap with minimap when town has own forts * Fix auto-update logic * * @version 1.1 * Display loading icon until data is calculated * Auto update functionality, register using TheWestApi for version compatibility * * @version 1.0 * Display a list of towns from where you need to collect purchased items * */ var dyMarketHelperGeneral = (function () { "use strict"; var SCRIPT_VERSION = "1.2.8.3", SCRIPT_WEBSITE = "http://userscripts.org/scripts/show/119454", PREFIX = "dyMarketHelper"; return { getVersion: function () { return SCRIPT_VERSION; }, getWebsite: function () { return SCRIPT_WEBSITE; }, getPrefix: function () { return PREFIX; } }; }()); var dyMarketHelperCode = function (currentVersion, scriptWebsite) { "use strict"; /*global window, document, alert, jQuery, WMap, wman, pos, console, TheWestApi, dyMarketHelper, AjaxWindow, Market, Ajax*/ var lastPageParsed = -1, townInfo = [], townCoords = [], townIndex = 0, townCoordsIndex = 0, townIdToIndex = {}, currentLocationXY = "", prefix = "dyMarketHelper", scriptName = "The-west market helper", scriptAuthor = "darkyndy", marketHelperTab = null, marketHelperTabContent = null, marketHelperTabLoader = null, $mapEl = null, $filtersEl = null, $townsEl = null, $helpEl = null, mapWidth = 761, mapHeight = 137, debug = false, gameUrl = "http://" + window.location.hostname + "/game.php", marketItemsPerPage = 11, lastMarketOfferId = 0, isVersionWithNewMarket = true, marketHelperTabReopenEventInProgress = false, scriptIconSrc = "data:image/png;base64," + "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", collectIconSrc = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB" + "HElEQVR4nJWSwY6CMBCGp9ga9AK8gN58BxITOfOiHrl5IOHAG/AI6AESL40REminnT10lxhl1/U7" + "dTrzd2b+lBERfAJ/vbLW9n0PAEII3/ffC7quy7IMAHa7XRzH7wVENI4jACDia9b71+APsMeljTF5" + "njdNY4wBAMbYer1O0zSKovkOi8XicDhMaSHEfr9/rH7u4Ljf70VR3G63JEm22+3zTERkjLler1JK" + "+kFKeT6frbUu7Pu+bVutNRF5AKCUKsuyqqrplTAMN5sNY8yFdV2fTqeu68DZSkSIiIjW2llnjDGI" + "6IbnAICISqnL5XI8HmcFWuvpzJ05QRAMwzBbDQCc89Vq5Xnet0tE5Bb6TeBYLpeMsRlb/+bjr/EF" + "KZOnkChfTOoAAAAASUVORK5CYII="; /** * Get custom style */ function getStyle() { var customStyle = ".tw2gui_window." + prefix + " {" + "height: 655px;" + "}" + ".tw2gui_window." + prefix + " div.tw2gui_window_inset {" + "background: transparent url(/images/window/premium/premium_buy_bg.jpg) no-repeat;" + "}" + "#" + prefix + "Map {" + "width: " + mapWidth + "px;" + "height: " + mapHeight + "px;" + "border: 0;" + "position: relative;" + "background: #847a3c;" + "margin: 0 12px;" + "}" + "#" + prefix + "Filters {" + "width: " + mapWidth + "px;" + "height: 50px;" + "border: 0;" + "position: relative;" + "margin: 5px 12px;" + "}" + "#" + prefix + "Filters input, #" + prefix + "Filters label {" + "cursor: pointer;" + "}" + "#" + prefix + "Towns {" + "width: " + mapWidth + "px;" + "height: 320px;" + "border: 0;" + "position: relative;" + "margin: 0 12px;" + "overflow: auto;" + "}" + "." + prefix + "Square {" + "width: 75px;" + "height: 33px;" + "float:left;" + "border: 1px solid #000;" + "border-left: 0;" + "border-top: 0;" + "position: relative;" + "}" + "." + prefix + "Square.top {" + "border-top: 1px solid #000;" + "}" + "." + prefix + "Square.left {" + "border-left: 1px solid #000;" + "}" + "." + prefix + "Clear {" + "clear: both;" + "}" + "#" + prefix + "Message, ." + prefix + "Message {" + "text-align: center;" + "font-weight: bold;" + "text-style: italic;" + "}" + "." + prefix + "Town {" + "position: absolute;" + "z-index: 9;" + "top: 0;" + "right: 0;" + "width: 7px;" + "height: 7px;" + "line-height: 7px;" + "font-size: 5px;" + "background: #F00;" + "cursor: pointer;" + "text-align: center;" + "}" + "." + prefix + "Town.hover {" + "z-index: 10;" + "width: 5px;" + "height: 5px;" + "border: 2px solid #000;" + "}" + "." + prefix + "LocationRow {" + "width: 365px;" + "float: left;" + "margin: 4px 5px 0 0;" + "border-bottom: 2px solid #000;" + "}" + "." + prefix + "LocationTownRow {" + "height: 16px;" + "line-height: 16px;" + "float: left;" + "}" + "." + prefix + "LocationName {" + "cursor: pointer;" + "float: left;" + "}" + "." + prefix + "LocationCollect {" + "cursor: pointer;" + "float: left;" + "background: transparent url(" + collectIconSrc + ") no-repeat;" + "width: 16px;" + "height: 16px;" + "margin-right: 3px;" + "}" + "." + prefix + "LocationItemsRow {" + "float: left;" + "margin: 3px 0 3px 0;" + "}" + "." + prefix + "TownCenter {" + "cursor: pointer;" + "margin-right: 3px;" + "background: transparent url(images/icons/center.png) no-repeat;" + "width: 16px;" + "height: 16px;" + "float: left;" + "}" + "." + prefix + "ItemBlock {" + "float: left;" + "border: 1px solid transparent;" + "}" + "." + prefix + "ItemBlock." + prefix + "ItemPurchaseProgress {" + "border: 1px solid #F00;" + "}" + /* Filter town with purchased items */ "#" + prefix + "Map." + prefix + "FilterPurchaseProgress ." + prefix + "Town ," + "#" + prefix + "Map." + prefix + "FilterPurchaseFinish ." + prefix + "Town ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseProgress ." + prefix + "LocationRow ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseFinish ." + prefix + "LocationRow {" + "display: none;" + "}" + "#" + prefix + "Towns." + prefix + "FilterPurchaseProgress ." + prefix + "TownPurchaseProgress ." + prefix + "ItemBlock ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseFinish ." + prefix + "TownPurchaseFinish ." + prefix + "ItemBlock {" + "display: none;" + "}" + /* Filter town with purchased items - progress state*/ "#" + prefix + "Map." + prefix + "FilterPurchaseProgress ." + prefix + "TownPurchaseProgress ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseProgress ." + prefix + "TownPurchaseProgress ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseProgress ." + prefix + "TownPurchaseProgress ." + prefix + "ItemPurchaseProgress {" + "display: block;" + "}" + /* Filter town with purchased items - finish state*/ "#" + prefix + "Map." + prefix + "FilterPurchaseFinish ." + prefix + "TownPurchaseFinish ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseFinish ." + prefix + "TownPurchaseFinish ," + "#" + prefix + "Towns." + prefix + "FilterPurchaseFinish ." + prefix + "TownPurchaseFinish ." + prefix + "ItemPurchaseFinish {" + "display: block;" + "}" + /* end filters */ "." + prefix + "BagItemSmall .bag_item_count {" + "background: transparent url(/images/inventory/bag_small.png) no-repeat;" + "position: absolute;" + "width: 31px;" + "height: 25px;" + "left: 3px;" + "bottom: 0px;" + "color: white;" + "font-weight: bold;" + "z-index: 2;" + "overflow: hidden;" + "opacity: 0.7;" + "}" + "." + prefix + "BagItemSmall .bag_item_count > p {" + "text-align: center;" + "font-size: 14px;" + "line-height: 19px;" + "padding: 0 3px 0 0;" + "margin: 3px 3px 0 0;" + "}" + "#" + prefix + "HelpContent {" + "margin: 0 12px;" + "}" + "." + prefix + "Current {" + "background: #FF8000;" + "}"; return customStyle; } /** * Insert custom style */ function insertStyle() { var head = document.getElementsByTagName("head")[0], style; if (!head) { return; } style = document.createElement("style"); style.setAttribute("type", "text/css"); style.textContent = getStyle(); head.appendChild(style); } /** * Modify The-west base functions */ function modifyBaseFunction(Obj, objMethod, objString) { //TODO: var func = "", modifyIdentifier = objString + "-" + objMethod, modifyWasMade = true, customChange = false; try { if (!Obj) { return; } if (modifyIdentifier === "Market-prepareTraderControl") { customChange = true; func = Obj.prototype[objMethod].toString(); func = func.replace("n>1&&false", "n > 1"); Obj.prototype[objMethod] = eval("(" + func + ")"); } else { modifyWasMade = false; } if (modifyWasMade && !customChange) { Obj[objMethod] = eval("(" + func + ")"); } } catch (ex) { console.log("modifyBaseFunction error"); } } /** * Start loading */ function startLoading() { marketHelperTabContent.toggle(false); marketHelperTabLoader.toggle(true); } /** * End loading */ function endLoading() { marketHelperTabContent.toggle(true); marketHelperTabLoader.toggle(false); } /** * Initialize market parameters */ function initializeParams() { var initTown = {"name": "current location", "x": 0, "y": 0, "extraClass": prefix + "Current", "id": "currentLocation"}, initCoordsX = 0, initCoordsY = 0; lastPageParsed = -1; townInfo = []; townCoords = []; townIndex = 0; townCoordsIndex = 0; townIdToIndex = {}; initCoordsX = pos.x; initCoordsY = pos.y; initTown.x = initCoordsX; initTown.y = initCoordsY; townInfo[townIndex] = initTown; currentLocationXY = initCoordsX + "_" + initCoordsY; //townCoords[townIndex] = currentLocationXY; townIndex = townIndex + 1; lastMarketOfferId = 0; } function getAjaxUrl(actionName) { var finalUrl = gameUrl, actionParam = "mode"; if (isVersionWithNewMarket) { actionParam = "action"; } switch (actionName) { case "fetch_bids": finalUrl = finalUrl + "?window=building_market&" + actionParam +"=fetch_bids" break; } if (isVersionWithNewMarket) { finalUrl = finalUrl + "&h=" + h; } return finalUrl; } /** * Set heading message */ function setMessage(msg) { msg = msg || ""; jQuery("#" + prefix + "Message").html(msg); } /** * Create help tab content */ function createTabHelpContent() { var $helpContent = jQuery("#" + prefix + "HelpContent"), helpContentHtml = ""; if ($helpContent.length === 0) { helpContentHtml = '<b>General</b><br/>' + 'Version: ' + currentVersion + '<br/>' + 'Website: <a href="' + scriptWebsite + '" target="_blank" title="' + scriptWebsite + ', open in new tab">' + scriptWebsite + '</a><br/>' + '<br/>'; $helpContent = jQuery("<div>") .attr({"id": prefix + "HelpContent"}) .css({"display": "none"}) .html(helpContentHtml); marketHelperTabContent.append($helpContent); } } /** * Market Helper, main window, tab click */ function marketHelperTabClick(tabObj, tabId) { var displayHelpData = false; if (tabId === prefix) { setMessage("towns from where you need to collect purchased items"); } else { displayHelpData = true; setMessage("Help"); } jQuery("#" + prefix + "Map").toggle(!displayHelpData); jQuery("#" + prefix + "Filters").toggle(!displayHelpData); jQuery("#" + prefix + "Towns").toggle(!displayHelpData); jQuery("#" + prefix + "HelpContent").toggle(displayHelpData); marketHelperTab.activateTab(tabId); } /** * Build popup window */ function buildWindow() { var html = '<h2 id="' + prefix + 'Message">Loading</h2><br/>', tabName = "Market purchase", $marketHelperTab = null; marketHelperTab = wman.open(prefix).setMiniTitle(tabName).setSize(840, 655) .addTab(tabName, prefix, marketHelperTabClick) .addTab("Help", prefix + "Help", marketHelperTabClick); $marketHelperTab = jQuery(marketHelperTab.divMain); marketHelperTabContent = $marketHelperTab.find(".tw2gui_window_content_pane"); marketHelperTabLoader = $marketHelperTab.find(".tw2gui_window_pane div.loader"); marketHelperTabContent.append(html); startLoading(); } /** * Functions to be executed at reload for market helper tab */ function marketHelperTabReopenEvent() { if (!marketHelperTabReopenEventInProgress) { marketHelperTabReopenEventInProgress = true; initializeParams(); buildWindow(); getPurchase(); } } /** * Attach event for reopen market helper window */ function marketHelperTabReopen() { //console.log("marketHelperTabReopen"); var tabIdReg = "^" + prefix + "$"; wman.registerReopenHandler(tabIdReg, function () { marketHelperTabReopenEvent(); }); } /** * Get town info */ function getTownInfo() { return townInfo; } /** * Get market helper tab */ function getMarketHelperTab() { return marketHelperTab; } /** * Get HTML for clear element */ function getClearHtml() { var clearHtml = '<div class="' + prefix + 'Clear"></div>'; return clearHtml; } /** * Test if player is at specified location */ function isPlayerAtLocation(locationX, locationY) { var currentX = parseInt(pos.x, 10), currentY = parseInt(pos.y, 10), isAtLocation = false; if (currentX === locationX && currentY === locationY) { isAtLocation = true; } return isAtLocation; } /** * Callback function executed after all purchased items ware collected */ function afterCollectAllPurchasedItems($townPurchasedItemsTabClose) { $townPurchasedItemsTabClose.trigger("click"); //reload market purchase marketHelperTabReopenEvent(); } /** * Function executed after collect all was clicked for purchased items */ function collectAllPurchasedItems(locationId, townPurchasedItemsTab) { var $townPurchasedItemsTab = null, $townPurchasedItemsTabClose = null, $townPurchasedItemsTabLoad = null; if (townPurchasedItemsTab) { if (locationId > 0) { $townPurchasedItemsTab = jQuery(townPurchasedItemsTab.divMain); //close window $townPurchasedItemsTabClose = $townPurchasedItemsTab.find(".tw2gui_window_buttons_close"); $townPurchasedItemsTab.find(".tw2gui_window_pane div.loader").toggle(true); Ajax.remoteCall('building_market', 'fetch_all', { townId: locationId }, function (data) { var hasError = false; if (data) { if (data.error && data.error === true) { hasError = true; } } if (hasError) { alert(data.msg); } afterCollectAllPurchasedItems($townPurchasedItemsTabClose); }); } } } /** * Paint town purchased items */ function paintTownPurchasedItems(location, $container, bigSizeItems, displayHeadingInfo, townPurchasedItemsTab) { var contentHtml = "", locationName = location.name, locationId = parseInt(location.id, 10), locationX = location.x, locationY = location.y, locationItems = {}, locationItem = {}, itemId = 0, $itemBlock = null, itemBlockHtml = "", itemBlockCssClass = "", $itemCollect = null, itemCollectHtml = "", marketOfferIdsForItem = [], marketOfferIdsForItemLength = 0, marketOfferIds = [], marketOfferIdsLength = 0, playerAtLocation = false, divClear = getClearHtml(), i = 0, locationItemCount = 0, locationItemCountInAuction = 0, locationItemCountToCollect = 0, locationItemTitle = '', itemCountHtml = '', $townPurchasedItemsTab = null, $townPurchasedItemsTabClose = null, hasItemPurchaseFinish = false, hasItemPurchaseProgress = false, hasTownPurchaseFinish = false, hasTownPurchaseProgress = false, townPurchaseFlags = {}; bigSizeItems = bigSizeItems || false; displayHeadingInfo = displayHeadingInfo || false; if (location.items) { locationItems = location.items; playerAtLocation = isPlayerAtLocation(locationX, locationY); if (displayHeadingInfo) { //set HTML for heading if (playerAtLocation) { //purchase all itemCollectHtml = '<a class="button_wrap button" href="javascript:void(0);">' + '<span class="button_left"></span>' + '<span class="button_middle">Collect all</span>' + '<span class="button_right"></span>' + '<span style="clear: both;"></a></span>'; } else { itemCollectHtml = "To collect all items you need to be in " + locationName + " town"; } $itemCollect = jQuery("<div>") .html(itemCollectHtml); $container.append(divClear).append($itemCollect).append(divClear); } //parse all items for location for (itemId in locationItems) { itemId = parseInt(itemId, 10); if (!isNaN(itemId) && itemId > 0) { hasItemPurchaseFinish = false; hasItemPurchaseProgress = false; locationItem = locationItems[itemId]; locationItemCount = locationItem.count; locationItemCountInAuction = locationItem.countItemInAuction; locationItemCountToCollect = locationItemCount - locationItemCountInAuction; if (locationItemCountToCollect > 0) { hasItemPurchaseFinish = true; } if (locationItemCountInAuction > 0) { hasItemPurchaseProgress = true; } locationItemTitle = locationItem.name; locationItemTitle = locationItemTitle + '<br/> You can collect ' + locationItemCountToCollect + ', ' + locationItemCountInAuction + ' are still in auction'; itemCountHtml = '<div class="bag_item_count" style="cursor: default; "><p>' + locationItemCount + '</p></div>'; if (bigSizeItems) { itemBlockHtml = '<span class="bag_item"><div class="bag_item yield auctionable">' + '<img src="' + locationItem.image + '" alt="' + locationItem.name + '" title="' + locationItemTitle + '" style="max-height: 73px;" />' + itemCountHtml + '</div></span>'; } else { itemBlockHtml = '<div class="popup_yield_image ' + prefix + 'BagItemSmall">' + '<img src="' + locationItem.image_micro + '" alt="' + locationItem.name + '" title="' + locationItemTitle + '" style="max-height: 43px;" />' + itemCountHtml + '</div>'; } itemBlockHtml = itemBlockHtml + divClear; if (playerAtLocation) { marketOfferIdsForItem = locationItem.marketOfferIds; marketOfferIdsForItemLength = marketOfferIdsForItem.length; if (marketOfferIdsForItemLength > 0) { for (i = 0; i < marketOfferIdsForItemLength; i = i + 1) { marketOfferIds.push(marketOfferIdsForItem[i]); } } } itemBlockCssClass = prefix + "ItemBlock"; //add under auction specific class if (hasItemPurchaseProgress) { itemBlockCssClass = itemBlockCssClass + " " + prefix + "ItemPurchaseProgress"; } if (hasItemPurchaseFinish) { itemBlockCssClass = itemBlockCssClass + " " + prefix + "ItemPurchaseFinish"; } $itemBlock = jQuery("<div>") .attr({"class": itemBlockCssClass}) .html(itemBlockHtml); $container.append($itemBlock); } if (!hasTownPurchaseProgress && hasItemPurchaseProgress) { hasTownPurchaseProgress = true; } if (!hasTownPurchaseFinish && hasItemPurchaseFinish) { hasTownPurchaseFinish = true; } } if (playerAtLocation && displayHeadingInfo) { marketOfferIdsLength = marketOfferIds.length; if (marketOfferIdsLength > 0) { $itemCollect.click(function () { collectAllPurchasedItems(locationId, townPurchasedItemsTab); }); } } } townPurchaseFlags = { hasTownPurchaseProgress: hasTownPurchaseProgress, hasTownPurchaseFinish: hasTownPurchaseFinish }; return townPurchaseFlags; } /** * Town purchase items window */ function townPurchasedItemsWindow(location) { var townPurchasedItemsTab = null, $townPurchasedItemsTab = null, townPurchasedItemsTabContent, locationName = location.name, locationId = parseInt(location.id, 10), tabIdentifier = "", $tabHeader = null, $tabHtml = null; tabIdentifier = prefix + locationId + "Items"; townPurchasedItemsTab = wman.open(tabIdentifier + " nominimize noreload").setMiniTitle(locationName) .addTab(locationName, tabIdentifier, function () {}); $townPurchasedItemsTab = jQuery(townPurchasedItemsTab.divMain); townPurchasedItemsTabContent = $townPurchasedItemsTab.find(".tw2gui_window_content_pane"); $tabHeader = jQuery("<h2>").attr({"class": prefix + "Message"}).html("Items to be purchased from " + locationName); $tabHtml = jQuery("<div>").css({"margin": "5px", "overflow": "auto", "height": "355px"}); paintTownPurchasedItems(location, $tabHtml, true, true, townPurchasedItemsTab); townPurchasedItemsTabContent.append($tabHeader).append($tabHtml); } /** * Paint location */ function paintTown(location) { var x, y, $townEl, townStyle = "", setClass = "", locationX = 0, locationY = 0, locationId = "", locationName = "", $locationRow = null, $locationTownRow = null, $locationTown = null, $locationTownCenter = null, $locationCollect = null, baseId = prefix + "Location", baseLocationId = "", $locationItems = null, townPurchaseFlags = {}; locationX = location.x; locationY = location.y; locationId = parseInt(location.id, 10); if (isNaN(locationId) || locationId < 0) { locationId = 0; } locationName = location.name; baseLocationId = baseId + locationId; x = Math.round(locationX / 1000 * parseInt(mapWidth, 10) - 3); y = Math.round(locationY / 1000 * parseInt(mapHeight, 10) - 3); townStyle = "top: " + y + "px;right: " + x + "px;"; setClass = prefix + "Town"; if (location.extraClass) { setClass = setClass + " " + location.extraClass; } $townEl = jQuery("<div>") .attr({"id": baseLocationId + "OnMap", "class": setClass, "style": townStyle, "title": "Center map on: " + locationName}) .click(function () { WMap.scroll_map_to_pos(locationX, locationY); }); $mapEl.append($townEl); //append town to towns list $locationRow = jQuery("<div>") .attr({"id": baseLocationId + "Row", "class": baseId + "Row"}); $locationItems = jQuery("<div>") .attr({"id": baseLocationId + "ItemsRow", "class": baseId + "ItemsRow"}); $locationTownRow = jQuery("<div>") .attr({"id": baseLocationId + "TownRow", "class": baseId + "TownRow"}); $locationTownCenter = jQuery("<div>") .attr({"class": prefix + "TownCenter", "title": "Center map on: " + locationName}) .click(function () { WMap.scroll_map_to_pos(locationX, locationY); }); $locationTown = jQuery("<div>") .attr({"id": baseLocationId, "class": baseId + "Name"}) .html(locationName) .hover( function () { jQuery("#" + baseLocationId + "OnMap").addClass("hover"); }, function () { jQuery("#" + baseLocationId + "OnMap").removeClass("hover"); } ); $locationCollect = jQuery("<div>") .attr({"class": baseId + "Collect", "title": "Click to see items that can be collected from " + locationName}) .click(function () { townPurchasedItemsWindow(location); }); if (location.itemsCount && location.itemsCount > 0) { $locationTown .attr({"title": "Open town " + locationName}) .click(function () { var townLocation = null; if (locationId > 0) { townLocation = {"town_id": locationId}; } AjaxWindow.show("town", townLocation, locationX + "_" + locationY); }); townPurchaseFlags = paintTownPurchasedItems(location, $locationItems, false, false, null); if (townPurchaseFlags.hasTownPurchaseProgress) { $townEl.addClass(prefix + "TownPurchaseProgress"); $locationRow.addClass(prefix + "TownPurchaseProgress"); } if (townPurchaseFlags.hasTownPurchaseFinish) { $townEl.addClass(prefix + "TownPurchaseFinish"); $locationRow.addClass(prefix + "TownPurchaseFinish"); } } else { //no items to collect from here $locationCollect.css({"display": "none"}); } $locationTownRow.append($locationTownCenter).append($locationCollect).append($locationTown); $locationRow.append($locationTownRow).append(getClearHtml()).append($locationItems); $townsEl.append($locationRow); } /** * Create HTML block */ function createHtmlBlock(blockId, emptyBlock) { var $block = jQuery("#" + prefix + blockId); emptyBlock = emptyBlock || true; if ($block.length === 0) { $block = jQuery("<div>") .attr({"id": prefix + blockId}); } if (emptyBlock) { $block.html(""); } return $block; } /** * Populate filters block */ function populateFiltersBlock($filters) { var filtersHtml = '', divClear = getClearHtml(), $purchasedItemsAll = null, purchasedItemsAllLabel = '', $purchasedItemsFinish = null, purchasedItemsFinishLabel = '', $purchasedItemsProgress = null, purchasedItemsProgressLabel = ''; $filters.html(""); filtersHtml = "Purchased items: "; //all $purchasedItemsAll = jQuery("<input>") .attr({"type": "radio", "name": prefix + "PurchasedItemsFilter", "id": prefix + "PurchasedItemsFilterAll", "checked": "checked"}) .click(function () { $mapEl.removeClass(); $townsEl.removeClass(); }); purchasedItemsAllLabel = '<label for="' + prefix + 'PurchasedItemsFilterAll" ' + 'title="Show all towns and items">All</label>'; //finish $purchasedItemsFinish = jQuery("<input>") .attr({"type": "radio", "name": prefix + "PurchasedItemsFilter", "id": prefix + "PurchasedItemsFilterFinish"}) .click(function () { $mapEl.removeClass().addClass(prefix + "FilterPurchaseFinish"); $townsEl.removeClass().addClass(prefix + "FilterPurchaseFinish"); }); purchasedItemsFinishLabel = '<label for="' + prefix + 'PurchasedItemsFilterFinish" ' + 'title="Show only towns and items that you can collect now">Finished</label>'; //progress $purchasedItemsProgress = jQuery("<input>") .attr({"type": "radio", "name": prefix + "PurchasedItemsFilter", "id": prefix + "PurchasedItemsFilterProgress"}) .click(function () { $mapEl.removeClass().addClass(prefix + "FilterPurchaseProgress"); $townsEl.removeClass().addClass(prefix + "FilterPurchaseProgress"); }); purchasedItemsProgressLabel = '<label for="' + prefix + 'PurchasedItemsFilterProgress" ' + 'title="Show only towns and items from where you have placed bids and auction didn\'t finished">Progress</label>'; $filters.append(divClear).append(filtersHtml) .append($purchasedItemsAll).append(purchasedItemsAllLabel) .append($purchasedItemsFinish).append(purchasedItemsFinishLabel) .append($purchasedItemsProgress).append(purchasedItemsProgressLabel) .append(divClear); return $filters; } /** * Plot market purchase data */ function plotData() { var i = 0, j = 0, otherClass = [], $map, $filters = null, $towns, $square, clearHtml = getClearHtml(); setMessage("towns from where you need to collect purchased items"); $map = createHtmlBlock("Map"); $filters = createHtmlBlock("Filters", false); $filters = populateFiltersBlock($filters); $towns = createHtmlBlock("Towns"); for (j = 1; j < 5; j = j + 1) { for (i = 1; i < 11; i = i + 1) { otherClass = []; if (i === 1) { otherClass.push("left"); } if (j === 1) { otherClass.push("top"); } otherClass.push(prefix + "Square"); otherClass = otherClass.join(" "); $square = jQuery("<div>").attr({"id": prefix + "Square" + i + "_" + j, "class": otherClass}); $map.append($square); } $map.append(clearHtml); } marketHelperTabContent.append($map).append($filters).append($towns); $mapEl = jQuery("#" + prefix + "Map"); $filtersEl = jQuery("#" + prefix + "Filters"); $townsEl = jQuery("#" + prefix + "Towns"); for (i = 0; i < townIndex; i = i + 1) { paintTown(townInfo[i]); if (i % 2 === 1) { $townsEl.append(clearHtml); } } createTabHelpContent(); endLoading(); marketHelperTabReopenEventInProgress = false; } /** * Set townIndex for townId */ function setTownIndexForId(townId, townIndex) { townIdToIndex[townId] = townIndex; } /** * Get townIndex based on townId */ function getTownIndexForId(townId) { return townIdToIndex[townId]; } /** * Check if auction for item is in progress */ function isAuctionInProgress(itemData) { var auctionInProgress = false, auctionEndIn = 0, currentBid = 0, maxPrice = 0; auctionEndIn = parseInt(itemData.auction_ends_in, 10); if (auctionEndIn > 0) { maxPrice = parseInt(itemData.max_price, 10); if (isNaN(maxPrice)) { auctionInProgress = true; } else { currentBid = parseInt(itemData.current_bid, 10); if (currentBid < maxPrice) { auctionInProgress = true; } } } return auctionInProgress; } /** * Test if market offer wasn't added to town purchased items */ function testUniqueMarketOfferId(usedTownIndex, thisItemId, thisMarketOfferId) { var isUnique = true, thisMarketOfferIds = []; if (townInfo[usedTownIndex]) { if (townInfo[usedTownIndex].items[thisItemId]) { if (townInfo[usedTownIndex].items[thisItemId].marketOfferIds) { thisMarketOfferIds = townInfo[usedTownIndex].items[thisItemId].marketOfferIds; if (thisMarketOfferIds.indexOf(thisMarketOfferId) > -1) { isUnique = false; } } } } return isUnique; } /** * Add purchased item to town */ function addPurchaseItemToTown(purchaseData, itemsData) { var itemCount = 1, usedTownIndex = 0, marketTownId = 0, itemData = {}, thisItemId = 0, townItems = {}, townItemsCount = 0, oldItemCount = 0, townData = {}, oldItemInAuction = 0, addCountItemInAuction = 0, isItemInAuction = false, thisMarketOfferId = 0, marketOfferIdUnique = false; marketTownId = purchaseData.market_town_id; usedTownIndex = getTownIndexForId(marketTownId); if (townInfo[usedTownIndex]) { townData = townInfo[usedTownIndex]; townItems = townData.items; thisItemId = purchaseData.item_id; thisMarketOfferId = purchaseData.market_offer_id; marketOfferIdUnique = testUniqueMarketOfferId(usedTownIndex, thisItemId, thisMarketOfferId); itemCount = parseInt(purchaseData.item_count, 10); if (thisMarketOfferId) { if (townItems[thisItemId]) { itemData = townItems[thisItemId]; oldItemCount = itemData.count; oldItemInAuction = itemData.countItemInAuction; itemCount = oldItemCount + itemCount; } else { if (isVersionWithNewMarket) { itemData = Object.create(ItemManager.get(thisItemId)); } else { if (itemsData[thisItemId]) { itemData = Object.create(itemsData[thisItemId]); } else { return; } } itemData.marketOfferIds = []; } isItemInAuction = isAuctionInProgress(purchaseData); if (isItemInAuction) { addCountItemInAuction = 1; } itemData.countItemInAuction = oldItemInAuction + addCountItemInAuction; itemData.count = itemCount; itemData.marketOfferIds.push(thisMarketOfferId); townItemsCount = townData.itemsCount + itemCount - oldItemCount; townInfo[usedTownIndex].items[thisItemId] = itemData; townInfo[usedTownIndex].itemsCount = townItemsCount; } } } /** * Filter response from AJAX */ function filterMarketPurchaseResponse(data, itemsData) { var dataLength = data.length, i = 0, marketTownId = "", marketTownName = "", marketTownX = "", marketTownY = "", marketTownCoords = "", purchaseData = {}, isCurrentLocation = false, useTownIndex = 0, startParseFrom = 0, firstMarketOfferId = 0; if (dataLength === marketItemsPerPage) { if (lastMarketOfferId !== 0) { firstMarketOfferId = data[0].market_offer_id; if (firstMarketOfferId === lastMarketOfferId) { startParseFrom = 1; } } lastMarketOfferId = firstMarketOfferId = data[10].market_offer_id; } for (i = startParseFrom; i < dataLength; i = i + 1) { purchaseData = data[i]; marketTownId = purchaseData.market_town_id; marketTownName = purchaseData.market_town_name; marketTownX = purchaseData.market_town_x; marketTownY = purchaseData.market_town_y; marketTownCoords = marketTownX + "_" + marketTownY; isCurrentLocation = false; useTownIndex = townIndex; if (currentLocationXY === marketTownCoords) { isCurrentLocation = true; useTownIndex = 0; } if (townCoords.indexOf(marketTownCoords) === -1) { //town isn't added in the list of towns if (marketTownName === null) { marketTownName = "ghost town"; } if (isCurrentLocation) { townInfo[useTownIndex].name = townInfo[0].name + " (" + marketTownName + ")"; } else { townInfo[useTownIndex] = {"name": marketTownName, "x": marketTownX, "y": marketTownY}; } townInfo[useTownIndex].id = marketTownId; townInfo[useTownIndex].items = {}; townInfo[useTownIndex].itemsCount = 0; townCoords[townCoordsIndex] = marketTownCoords; setTownIndexForId(marketTownId, useTownIndex); if (!isCurrentLocation) { townIndex = townIndex + 1; } townCoordsIndex = townCoordsIndex + 1; } //add purchase item to town info addPurchaseItemToTown(purchaseData, itemsData); } } /** * Parse market purchase response */ function parseResponse(data, isPurchase) { var itemsData = {}, itemsAtPage = 0, endOfMarketRequests = true; isPurchase = isPurchase || true; if (data) { if (data.msg) { if (data.msg.item_info) { itemsData = data.msg.item_info; } if (data.msg.search_result) { itemsAtPage = data.msg.search_result.length; if (itemsAtPage > 0) { if (isPurchase) { //parse market purchase filterMarketPurchaseResponse(data.msg.search_result, itemsData); if (!isVersionWithNewMarket && itemsAtPage === marketItemsPerPage) { endOfMarketRequests = false; getPurchase(); } } else { //parse market sell } } } else { console.log(" cannot get data.msg.search_result"); } } else { console.log(" cannot get data.msg"); } } else { console.log(" cannot get data"); } if (endOfMarketRequests) { if (isPurchase) { //end of market purchase plotData(); } else { //end of market sell } } } /** * Get purchase data */ function getPurchase() { lastPageParsed = lastPageParsed + 1; jQuery.ajax({ url: getAjaxUrl("fetch_bids"), type: "POST", data: {page: lastPageParsed}, dataType: "json", success: function (data) { //console.log(data); parseResponse(data, true); } }); } /** * Calculate */ function calculate() { if (marketHelperTabReopenEventInProgress) { alert("Market Helper is loading, please wait"); } else { marketHelperTabReopenEventInProgress = true; initializeParams(); buildWindow(); marketHelperTabReopen(); if (!debug) { getPurchase(); } } } /** * Add market helper icon/button */ function addButton() { var $scriptButton = jQuery("#" + prefix + "Button"); if ($scriptButton.length === 0) { $scriptButton = jQuery("<img>") .attr({"src": scriptIconSrc, "id": prefix + "Button", "alt": scriptName, "title": scriptName, "style": "position:absolute;left:310px;top:10px;cursor:pointer;"}); jQuery('#footer_minimap_icon').parent().after($scriptButton); } $scriptButton.unbind().click(function () { dyMarketHelper.calculate(); }); } /** * Register script with the-west */ function registerScript() { var minVersion = "1.33", maxVersion = "1.34"; if (TheWestApi) { TheWestApi.register(prefix, scriptName, minVersion, maxVersion, scriptAuthor, scriptWebsite); } } /** * Callback function to prompt user for update */ function updateCallback(currentVersion, latestVersion) { var autoUpdateTab = null, autoUpdateTabContent, updatePrefix = prefix + "Updater", $updateHtml = null, $updateHeader = null, contentHtml = ""; autoUpdateTab = wman.open(updatePrefix + " nominimize noreload").setMiniTitle("Market Helper update") .addTab("MH updater", updatePrefix, function () {}); autoUpdateTabContent = jQuery(autoUpdateTab.divMain).find(".tw2gui_window_content_pane"); $updateHeader = jQuery("<h2>").attr({"class": prefix + "Message"}).html("Market helper - new version available"); contentHtml = 'You are using version: ' + currentVersion + '<br/>' + 'Latest version is: ' + latestVersion + '<br/>' + 'Please visit <a href="' + scriptWebsite + '" target="_blank">' + scriptWebsite + '</a> ' + 'and update to the latest version.<br/>' + 'After update refresh this page, or click on the link: ' + '<a href="' + gameUrl + '">' + gameUrl + '</a>'; $updateHtml = jQuery("<div>").css({"margin": "5px"}).html(contentHtml); autoUpdateTabContent.append($updateHeader).append($updateHtml); } /** * Check if game version is 1.34 */ function checkVersionWithNewMarket() { if (TheWestApi && TheWestApi.version) { if (TheWestApi.version === "1.34" || TheWestApi.version === "1.35") { isVersionWithNewMarket = true; } else { isVersionWithNewMarket = false; } insertStyle(); addButton(); } else { window.setTimeout(function () { checkVersionWithNewMarket(); }, 100); } } /** * Initialize script */ function init(waitCounter) { waitCounter = waitCounter || 0; if (waitCounter < 10) { waitCounter = waitCounter + 1; if (typeof jQuery === "undefined") { window.setTimeout(function () { init(waitCounter); }, 100); } else { checkVersionWithNewMarket(); //comment register script, TheWestApi not working properly //registerScript(); } } } //public return { calculate: calculate, init: init, updateCallback: updateCallback, getTownInfo: getTownInfo, getMarketHelperTab: getMarketHelperTab, modifyBaseFunction: modifyBaseFunction, newMarketVersion: function () {return isVersionWithNewMarket;} }; }; /** * Greasemonkey base support * @copyright 2009, 2010 James Campos * @license cc-by-3.0; http://creativecommons.org/licenses/by/3.0/ */ /*global localStorage, GM_addStyle, GM_deleteValue, GM_getValue, GM_log, GM_setValue, console */ if (typeof GM_deleteValue === "undefined") { GM_addStyle = function (css) { var style = document.createElement('style'); style.textContent = css; document.getElementsByTagName('head')[0].appendChild(style); }; GM_deleteValue = function (name) { localStorage.removeItem(name); }; GM_getValue = function (name, defaultValue) { var value = localStorage.getItem(name), type = ""; if (!value) { return defaultValue; } type = value[0]; value = value.substring(1); switch (type) { case 'b': return value == "true"; case 'n': return Number(value); default: return value; } }; GM_log = function (message) { console.log(message); }; GM_setValue = function (name, value) { value = (typeof value)[0] + value; localStorage.setItem(name, value); }; } /** * Auto update */ var dyAutoUpdate = (function () { "use strict"; /*global ActiveXObject, XMLHttpRequest, dyMarketHelperGeneral, GM_xmlhttpRequest, GM_addStyle, GM_deleteValue, GM_getValue, GM_setValue, GM_log, navigator*/ var updateAvailable = false, currentVersion = dyMarketHelperGeneral.getVersion(), prefix = "", latestVersion = "0", alwaysCheck = false, checkAfterDays = 1; function getUpdateAvailable() { return updateAvailable; } function getCurrentVersion() { return currentVersion; } function getLatestVersion() { return latestVersion; } function runUpdateScript() { var dyMarketHelperUpdateJsString = "dyMarketHelperUpdate_js", dyMarketHelperUpdateJs = null, dyMarketHelperUpdateString = "if (dyMarketHelper) { dyMarketHelper.updateCallback('" + currentVersion + "', '" + latestVersion + "'); }"; dyMarketHelperUpdateJs = document.getElementById(dyMarketHelperUpdateJsString); if (!dyMarketHelperUpdateJs) { dyMarketHelperUpdateJs = document.createElement("SCRIPT"); dyMarketHelperUpdateJs.setAttribute("id", dyMarketHelperUpdateJsString); dyMarketHelperUpdateJs.innerHTML = dyMarketHelperUpdateString; document.getElementsByTagName("body")[0].appendChild(dyMarketHelperUpdateJs); } else { dyMarketHelperUpdateJs.innerHTML = dyMarketHelperUpdateString; } } /** * Transform version string to number */ function versionToNumber(versionString) { var versionNumber = 0; versionNumber = versionString.replace(/\./g, ""); versionNumber = parseInt(versionNumber, 10); if (isNaN(versionNumber) || versionNumber < 0) { versionNumber = 0; } return versionNumber; } /** * Check for update */ function parseUrlResponse(data) { var currentVersionNumber = 0, latestVersionNumber = 0, versionReg = /Version:<\/b>\s*([0-9\.]+)/; currentVersionNumber = versionToNumber(currentVersion); latestVersion = data.match(versionReg)[1]; latestVersionNumber = versionToNumber(latestVersion); if (latestVersionNumber > 0 && currentVersionNumber < latestVersionNumber) { updateAvailable = true; runUpdateScript(); } } function errorAtXhr() { //loadScript(); } /** * Greasemonkey AJAX */ function doGreasemonkeyAjax(reqMethod, reqUrl, reqData, successFn, errorFn) { GM_xmlhttpRequest({ method: reqMethod, url: reqUrl, headers: { "User-Agent": navigator.userAgent, "Referer": document.location }, onload: function (responseDetails) { if (successFn) { successFn(responseDetails.responseText); } } }); } /** * XHR */ function doAjax(reqMethod, reqUrl, reqData, successFn, errorFn) { var xhr = null, aSync = true, noCache = true, concatString = "?"; try { xhr = new XMLHttpRequest(); //FireFox, Safari, Chrome, Opera ... } catch (e) { //console.log(e.message); try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); //IE } catch (e2) { //console.log(e2.message); try { xhr = new ActiveXObject('Microsoft.XMLHTTP'); //IE } catch (e3) { //console.log(e3.message); //XMLHttpRequest not supported } } } if (xhr) { xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { //XHR request is ok //xhr.responseText; if (successFn) { successFn(xhr.responseText); } } else { //ERROR if (errorFn) { errorFn(xhr.status); } } } }; try { if (noCache === true) { reqUrl = reqUrl + "?" + (new Date()).getTime(); concatString = "&"; } if (reqMethod.toUpperCase() === "GET") { reqUrl = reqUrl + concatString + reqData; reqData = null; } xhr.open(reqMethod, reqUrl, aSync); try { xhr.send(reqData); } catch (eS) { //we have error when sending request console.log(eS.message); } } catch (eL) { //we have error when loading request console.log(eL.message); } } else { //cannot execute request } } /** * XHR request */ function doRequest(reqMethod, reqUrl, reqData, successFn, errorFn) { if (GM_xmlhttpRequest) { doGreasemonkeyAjax(reqMethod, reqUrl, reqData, successFn, errorFn); } else { doAjax(reqMethod, reqUrl, reqData, successFn, errorFn); } } /** * Test for update script */ function testUpdate() { var executeRequest = false, lastUpdateTime = 0, currentTime = 0, maxDiference = 0, checkDifference = 0; if (alwaysCheck) { executeRequest = true; } else { lastUpdateTime = parseInt(GM_getValue(prefix + "LastCheck", 0), 10); currentTime = (new Date()).getTime(); checkDifference = currentTime - lastUpdateTime; maxDiference = checkAfterDays * 24 * 60 * 60 * 1000; if (checkDifference >= maxDiference) { GM_setValue(prefix + "LastCheck", currentTime); executeRequest = true; } } if (executeRequest) { doRequest("GET", dyMarketHelperGeneral.getWebsite(), "", parseUrlResponse, errorAtXhr); } } /** * Initialize auto-update */ function init(appPrefix) { prefix = appPrefix; testUpdate(); } //public return { init: init, errorAtXhr: errorAtXhr, doRequest: doRequest, getUpdateAvailable: getUpdateAvailable, getCurrentVersion: getCurrentVersion, getLatestVersion: getLatestVersion }; }()); /** * add MarketHelper script */ function loadMarketHelperScript() { "use strict"; /*global document, dyMarketHelperGeneral*/ var dyMarketHelperJsString = "dyMarketHelper_js", dyMarketHelperJs = null, currentVersion = dyMarketHelperGeneral.getVersion(), scriptWebsite = dyMarketHelperGeneral.getWebsite(), dyMarketHelperString = "", dyMarketHelperParams = ""; dyMarketHelperParams = "'" + currentVersion + "', '" + scriptWebsite + "'"; dyMarketHelperString = "var dyMarketHelper = (" + dyMarketHelperCode.toString() + "(" + dyMarketHelperParams + "));dyMarketHelper.init();"; dyMarketHelperJs = document.getElementById(dyMarketHelperJsString); if (!dyMarketHelperJs) { dyMarketHelperJs = document.createElement("SCRIPT"); dyMarketHelperJs.setAttribute("id", dyMarketHelperJsString); dyMarketHelperJs.innerHTML = dyMarketHelperString; document.getElementsByTagName("body")[0].appendChild(dyMarketHelperJs); } else { dyMarketHelperJs.innerHTML = dyMarketHelperString; } } //init script if (location.href.indexOf(".the-west.") !== -1 && location.href.indexOf("game.php") !== -1) { loadMarketHelperScript(); //check for updates dyAutoUpdate.init(dyMarketHelperGeneral.getPrefix()); }
0 comments:
Post a Comment