/* Semi-automatic image watcher, version [0.0.3a]
Originally from: http://en.wiki.x.io/wiki/User:Splarka/watchimages.js
Operation:
* Checks which images are being used on a page
* Sorts out those from commons, builds a list of those local or missing
* Passes this list to Special:Watchlist/raw (but does not save, being a test script).
* When saved, returns to the original page.
Notes:
* The logic of which images to watch is easily changed (see below)
* This avoids ajax editing (which is a pain). Possibly the API actions will be enabled later.
To do after more testing:
* Abort if no matching images are found.
* Check page more specifically for a content type (page has ID? etc).
* Auto-submit if so desired.
*/
if(mw.config.get('wgNamespaceNumber') != -1) addOnloadHook(watchAllImagesButton)
function watchAllImagesButton() {
mw.util.addPortletLink('p-tb','javascript:watchAllImages()','Watch images','t-wai','Add all images on this page to your watchlist.');
}
function watchAllImages() {
var wai = document.getElementById('t-wai');
if(wai) {
wai.getElementsByTagName('a')[0].style.display = 'none';
var prog = document.createElement('img');
prog.setAttribute('id','wai-prog');
prog.setAttribute('src',stylepath + '/common/images/spinner.gif');
wai.appendChild(document.createTextNode('Working...'));
wai.appendChild(prog);
}
var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') +'/api.php?action=query&format=json&callback=watchAllImagesCB&generator=images&prop=imageinfo&iiprop=&iilimit=1&titles=' + encodeURIComponent(mw.config.get('wgPageName'))
var scriptElem = document.createElement('script');
scriptElem.setAttribute('src',url);
scriptElem.setAttribute('type','text/javascript');
document.getElementsByTagName('head')[0].appendChild(scriptElem);
}
function watchAllImagesCB(obj) {
document.getElementById('wai-prog').style.display = 'none';
var towatch = '';
if(!obj['query'] || !obj['query']['pages']) return
var images = obj['query']['pages'];
for(var i in images) {
// Logic variables to determine which images to watch
// islocal = image is local, rather than shared (from commons).
// haspage = has a description page, all local and some shared images have this.
// hasmedia = the image exists, either locally or shared.
var islocal = (images[i]['imagerepository'] == 'local')
var haspage = i > 0
var hasmedia = (images[i]['imagerepository'] != '')
//(!hasmedia || islocal) => all local images, as well as all missing (deleted or soon to be uploaded) images
if(!hasmedia || islocal) {
towatch += images[i]['title'] += '\n';
}
}
var url = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace(/\$1/,'Special:Watchlist/raw') + '?fromtitle=' + encodeURIComponent(mw.config.get('wgPageName')) + '&towatch=' + encodeURIComponent(towatch);
document.location.href = url;
}
if(queryString('towatch') && mw.config.get('wgCanonicalSpecialPageName') == 'Watchlist') addOnloadHook(addToWatchlist)
function addToWatchlist() {
var txt = document.getElementById('titles');
var towatch = decodeURIComponent(queryString('towatch'));
if(!txt) return
if(queryString('fromtitle')) {
var forms = document.forms;
for(var i=0;i<forms.length;i++) {
if(forms[i].action.indexOf('Watchlist') != -1) {
forms[i].action += '&pleasereturnto=' + queryString('fromtitle');
}
}
}
txt.value += towatch;
alert('Note: the following images will be added to your watchlist upon save:\n' + towatch);
}
if(queryString('pleasereturnto') && mw.config.get('wgCanonicalSpecialPageName') == 'Watchlist') addOnloadHook(addToWatchlistDone)
function addToWatchlistDone() {
var url = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace(/\$1/,decodeURIComponent(queryString('pleasereturnto')));
document.location.href = url;
}
function queryString(p) {
var re = RegExp('[&?]' + p + '=([^&]*)');
var matches;
if (matches = re.exec(document.location)) {
try {
return decodeURI(matches[1]);
} catch (e) {
}
}
return null;
}