User:Zocky/PicturePopups.js

//

// Picture Popups for Mediawiki

// (c)2005 User:Zocky

// Released under GPL

if (mw.config.get('skin')=='vector') { importScript('User:Zocky/PicturePopupsVector.js'); }

else {

importStylesheetURI('https://en.wikipedia.org/w/index.php?action=raw&ctype=text/css&title=User%3AZocky%2FPicturePopups.css');

//Handle clicks on document until content is loaded

function firstClick(e)

{

var c=document.getElementById('content')||document.getElementById('article');

if (c) {

c.addEventListener('click',imageClick,false);

document.removeEventListener('click',firstClick,true); }

}

document.addEventListener('click',firstClick,true);

//Handle clicks on images

function imageClick(e)

{

if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.target.tagName=='IMG')

{

var t=e.target;

var caption=t.getAttribute('alt');

while (t.tagName!='A' && t.parentNode) { t=t.parentNode; }

if(!t) return;

var realurl = t.href;

var pictitle = decodeURIComponent(realurl.match(/(\/wiki\/|title=)File:([^&]*)/)[2].replace(/_/g," "));

if (caption!='Enlarge')

{

try

{

var captiondiv=t.nextSibling.nextSibling;

if (captiondiv.getAttribute('class')=='thumbcaption') {caption=captiondiv.innerHTML}

}

catch (er){}

x=Math.round(Math.random()*200);

y=Math.round(Math.random()*200);

var note_content_div=new_note(x, y, '[ > ] '+pictitle, 'loading...',caption);

note_content_div.addEventListener('click',noteContentClick,true);

var cbSuccess=function(x,c)

{

note_content_div.innerHTML='';

note_content_div.appendChild(findDescendantById(c,'file')) || (note_content_div.innerHTML="Failed. retry");

try { note_content_div.appendChild(findDescendantById(c,'imageLicense')); } catch(er) {};

return true;

}

var cbFailure=function(x,c)

{

note_content_div.innerHTML==x.statusText;

return true;

}

loadText(realurl,cbSuccess,cbFailure);

}

else

{

var img = t.parentNode.parentNode.parentNode.firstChild.firstChild;

if (img.hasAttribute('thumbwidth'))

{

var dummy=img.getAttribute('thumbwidth')

img.setAttribute('thumbwidth',img.width);

img.width=dummy;

img.parentNode.parentNode.style.width=(img.width+2) + "px";

var dummy=img.getAttribute('thumbheight')

img.setAttribute('thumbheight',img.height);

img.height=dummy;

}

else

{

img.setAttribute('thumbwidth',img.width);

img.setAttribute('thumbheight',img.height);

var cbSuccess=function(x,c)

{

var dummy=findDescendantById(c,'file');

if (dummy.firstChild.tagName=='IMG')

{

img.src=dummy.firstChild.src;

img.width=dummy.firstChild.width;

img.height=dummy.firstChild.height;

}

else

{

img.width=dummy.firstChild.firstChild.width;

img.height=dummy.firstChild.firstChild.height;

img.src=dummy.firstChild.firstChild.src;

}

img.parentNode.parentNode.style.width=(img.width+2) + "px";

return true;

}

var cbFailure=function(x,c)

{

return true;

}

loadText(realurl,cbSuccess,cbFailure);

}

}

e.preventDefault();

}

}

//Stop popup images from linking to hi-res pages

function noteContentClick(e)

{

e.target.tagName=='IMG' && e.preventDefault() ;

}

//NOTES

var note_top=100;

var active_note;

var note_back='globalWrapper';

function note_icons(n)

{

return '[ - ] '

+ '[ x ]';

}

function new_note(x,y,title,content,caption)

{

var note_container=document.getElementById(note_back)

note_top++;

var note = document.createElement("div");

note.id = "note_" + note_top;

note.setAttribute('class', "imagenote");

note.setAttribute('minimized', "0");

x>0 && (note.style.left = x + "px") || (note.style.right = -x + "px");

y>0 && (note.style.top = y + "px") || (note.style.bottom = -y + "px");

note.style.zIndex=note_top;

note.innerHTML = '

'

+ '

'

+ '

'

+ '

'

+ '

' + title + ' ' + note_icons(note.id) + '
'+content+'
'+caption+'
';

note_container.appendChild(note);

note.addEventListener("mousedown", pick_note, true);

note.addEventListener("click", click_note, true);

active_note=note;

return document.getElementById(note.id+'_content');

}

function close_note(n)

{

var note_container=document.getElementById(note_back);

note_container.removeChild(document.getElementById(n));

}

function toggle_note(n)

{

var note=document.getElementById(n);

note.setAttribute('minimized', 1-note.getAttribute('minimized'));

}

var note_dragging;

function pick_note(e)

{

active_note=e.currentTarget;

note_top++;

active_note.style.zIndex = note_top;

mouse_x = e.clientX; mouse_y = e.clientY;

active_note_top = parseInt(active_note.style.top); active_note_left = parseInt(active_note.style.left);

document.addEventListener("mousemove", drag_note, false);

document.addEventListener("mouseup", drop_note, false);

e.preventDefault();

note_dragging=false;

}

function drag_note(e)

{

var x = e.clientX;

var y = e.clientY;

active_note.style.top = (y - mouse_y + active_note_top) + "px"; active_note.style.left = (x - mouse_x + active_note_left) + "px";

note_dragging=true;

}

function drop_note(e)

{

document.removeEventListener("mousemove", drag_note, false);

document.removeEventListener("mouseup", drop_note, false);

}

function click_note(e)

{

note_dragging && e.preventDefault();

}

//DOWNLOADER

function loadText(url,cb1,cb2) {

var x = window.XMLHttpRequest ? new XMLHttpRequest()

: window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP")

: false;

var c=document.createElement("div");

if (x) {

x.onreadystatechange=function() {

x.readyState==4 && textLoaded(x,c,cb1,cb2)};

x.open("GET",url,true);

x.setRequestHeader('Accept','text/*');

x.send(null); }

}

function textLoaded(x,c,cb1,cb2) {

x.status==200

&& ((c.innerHTML=x.responseText) && cb1 && cb1(x,c))

|| ( cb2 && cb2(x,c) || alert(x.statusText));

}

//XML helper functions

function findDescendantById(node, id) {

if (node.id == id) { return node; }

var i, c;

for (i = node.firstChild; i != null; i=i.nextSibling) {

c = findDescendantById(i,id);

if (c != null)

return c; }

return null;

}

}

//