// ==UserScript== // @name Jump to Flickr Page Exercise // @namespace http://www.dopiaza.org/flickr/greasemonkey/ // @description Jump to a specific Flickr page in a paginated set of pages. // @include http://www.flickr.com/* // @include http://flickr.com/* // ==/UserScript== var paginators = document.evaluate( "//div[@class='Paginator']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0; i < paginators.snapshotLength; i++) { var paginator = paginators.snapshotItem(i); // Find the max page number var anchors = paginator.getElementsByTagName('A'); // find the number of the last page linked var lastPageNum = 1; for (var j = 0; j < anchors.length; j++) { var children = anchors[j].childNodes; if (children.length > 0) { var child = children[0]; if (child.nodeType == 3) // Text Node { var pageVal = child.nodeValue; if (!isNaN(pageVal)) { lastPageNum = Math.max(lastPageNum, parseInt(pageVal)); } } } } // Place the text box immediately before the "next" item, which is the last // non-text element in the paginator (There is whitespace after it, which shows // up as a text node. It may be an anchor or a span, depending on whether we are // at the last page or not. var paginatorChildren = paginator.childNodes; var nextElement; for (var j = paginatorChildren.length - 1; j >= 0; j--) { if (paginatorChildren[j].nodeType == 1) // Element Node { nextElement = paginatorChildren[j]; break; } } var inputBox = document.createElement('input'); inputBox.setAttribute("type", "text"); inputBox.setAttribute("size", "3"); paginator.insertBefore(inputBox, nextElement); inputBox.addEventListener('keypress', function(evt) { var keyVal = evt.which; var key = String.fromCharCode(keyVal); if (key == '\r') { var pageNum = evt.target.value; if (pageNum <= 0 || pageNum > lastPageNum) { evt.target.value = ""; evt.preventDefault(); } else { // So, where are we now? var loc = window.location.href; // Remove any existing page number loc = loc.replace(/page\d+(\/)?$/, ''); // Append the new page number loc += 'page' + pageNum + '/'; // And go to the new page window.location.href = loc; } } else { if (key != '\b' && isNaN(key)) { evt.preventDefault(); } } }, true); }