+/* austlii.js
+ * Bookmarklet to add annotation tools to AustLII cases.
+ * Invoke with:
+ * javascript:var d=document;var s=d.createElement("script");s.src="http://splintax.ucc.asn.au/austlii/austlii.js";s.type="text/javascript";d.getElementsByTagName('head').item(0).appendChild(s); */
+
+window.austlii = {
+ VERSION: '0.1',
+ load: function(url, cb) {
+ // Load an arbitrary JavaScript file and fire cb.
+ var s = document.createElement("script");
+ s.src = url; s.type = "text/javascript"; s.onload = cb;
+ document.getElementsByTagName('head').item(0).appendChild(s); return;
+ },
+ style: function(url) {
+ // dynamically add a new stylesheet
+ var s = document.createElement("link");
+ s.rel = "stylesheet"; s.type = "text/css"; s.href = url;
+ document.getElementsByTagName('head').item(0).appendChild(s); return;
+ },
+ main: function() {
+ austlii.prune("austlii", "jquery");
+ if (window.location.host.slice(-14) != "austlii.edu.au" ||
+ window.location.pathname.slice(0,10) != "/au/cases/" ||
+ window.location.pathname.slice(-5) != ".html")
+ console.log("You're not looking at a case on AustLII.");
+ else
+ austlii.paintMenu();
+ },
+ prune: function() {
+ // Remove all but the newest script tag containing the queries passed in as arguments.
+ for (var i = 0; i < arguments.length; i++) {
+ var $els = $("head script[src*="+arguments[i]+"]");
+ var toRemove = $els.slice(0,-1);
+ if (toRemove.length > 0) {
+ toRemove.remove();
+ console.log("Removed "+toRemove.length+" stale scripts matching '"+arguments[i]+"'...");
+ }
+ }
+ },
+};
+
+austlii.paintMenu = function() {
+
+ austlii.style("http://splintax.ucc.asn.au/austlii/austlii.css");
+
+ // remove text nodes ([] surrounding "Download", etc)
+ var textNodes = $("body").contents().filter(function(){return this.nodeType == 3;}).remove();
+ // hide other unnecessary menu elements
+ var $els = $("body").children(); // excludes text nodes
+ var index = 0;
+ while ($els[index].tagName != "H1") {
+ $els[index].style.display = "none"; index++;
+ }
+ // add back to top
+ $("h1").eq(1).wrap('<a name="top">');
+
+ // highlight case title
+ $("center i").first().parent().addClass("citation");
+
+ // find and markup judges
+ var judgeExp = /([A-Zc, ]+)(( | )C?JJ?\.)/g;
+ var replacementText = document.body.innerHTML.replace(judgeExp, '<a class="judge" name="$1">$1$2</a>');
+ document.body.innerHTML = replacementText;
+
+ // add menu
+ var $menu = $('<div id="menu"><a href="#top">Top</a></div>');
+ // add jumplinks for each judge
+ var $judges = $('<ol id="judges"></ol>');
+ $("a.judge").each(function(){
+ var $li = $('<li><a href="#' + this.name + '">' + $(this).html() + '</a></li>');
+ $judges.append($li);
+ }); $menu.append($judges);
+ // add annotation features
+ $menu.append($('<a id="trigger-highlight" href="#">Highlight</a>'));
+ $("body").append($menu);
+
+ // enable smooth scrolling on anchors
+ austlii.load("http://splintax.ucc.asn.au/cases/jquery.scrollTo-1.4.2-min.js", function() {
+ austlii.load("http://splintax.ucc.asn.au/cases/jquery.localscroll-1.2.7-min.js", function() {
+ $.localScroll({duration: '200'});
+ });
+ });
+
+
+ $("#trigger-highlight").click(austlii.highlight);
+
+};
+
+austlii.highlight = function(event) {
+ event.preventDefault();
+ var sel = document.getSelection();
+ if (sel.type == "Range") {
+ // add highlight
+ var range = sel.getRangeAt(0);
+ var $note = $('<span style="background-color: yellow;" />');
+ range.surroundContents($note[0]);
+
+ console.log(sel);
+ var $menu = $('<div style="position: absolute;" />');
+ var $removeLink = $('<a href="#">Remove</a>');
+ $note.append($menu);
+ $menu.append($removeLink);
+ $removeLink.click((function($hilite) {
+ var text = $hilite.text();
+ $hilite.after(text).remove();
+ })($(this)));
+ }
+ else {console.log("You haven't highlighted anything.")}
+};
+
+console.log("Loaded austlii.js v"+austlii.VERSION+".");
+austlii.load('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', austlii.main);