// ==UserScript==
// @name		deviantNotes - Flag Notes
// @namespace		http://www.youkai.de/da-scripts
// @description		Flag Notes for later use ("Mark as unread", in a way)
// @include		http://*.deviantart.com/*
// @include		http://deviantart.com/*
// @exclude		http://*.deviantart.com/store/*
// @exclude		http://shop.deviantart.com/*
// @exclude		http://www.deviantart.com/deviation/*/favourites/*
// @exclude		http://deviantart.com/deviation/*/favourites/*
// @exclude		http://www.deviantart.com/view/*/favourites/*
// @exclude		http://deviantart.com/view/*/favourites/*
// @exclude		http://www.deviantart.com/print/*
// @exclude		http://chat.deviantart.com/chat/*
// @exclude		http://shout.deviantart.com/*
// @exclude		http://my.deviantart.com/settings/*
// @exclude		http://my.deviantart.com/profile/*
// @exclude		http://my.deviantart.com/account/*
// @exclude		http://my.deviantart.com/orders/*
// @exclude		http://services.deviantart.com/prints/help/*
// @exclude		http://*.deviantart.com/wishlist/*
// ==/UserScript==

// Written by NekoDramon - http://nekodramon.deviantart.com
// Version 1.0 (Nov 26, 2005)

(function(){
var devarr = new Array();
var flagarr = new Array();
var notearr = new Array();
var devname, devmeta, devregexp, devgroup, flaglist, flagcount;
var isflagged, insimg, insblank, currentloc, i, k, notegroup, notecurr, notenum;
var flagicon, flagh, flagw, unflagicon, unflagh, unflagw, delovergroup, deloverbut;
var barmain, bargroup, barinsertpoint, barins;

flagicon = "http://e.deviantart.com/emoticons/s/smile.gif";
flagw = 15;
flagh = 15;
unflagicon = "http://e.deviantart.com/emoticons/i/invisible.gif";
unflagw = 15;
unflagh = 15;

// /------------------------\
// | Update Counter Display |
// \------------------------/

function countupdate()
{
	switch (flagcount)
	{
		case 0:
			barins.innerHTML='';
			break;
		case 1:
			barins.innerHTML=' and <a href="http://my.deviantart.com/notes/">a flagged note</a>';
			break;
		default:
			barins.innerHTML=' and <a href="http://my.deviantart.com/notes/">'+flagcount+' flagged notes</a>';
			break;
	}
}

// /-------------\
// | Toggle Flag |
// \-------------/

function flagtoggle()
{
	var l, m, checklist, checkcurrent, toggleid;
	checklist = GM_getValue("flag_"+devname, "none");
	if (checklist!=flaglist)
	{
		flaglist=checklist;
		if (flaglist=="none")
		{
			flagcount=0;
		}
		else
		{
			flagarr = flaglist.split(",");
			flagcount=flagarr.length;
		}

		for(l=0; l<notearr.length; l++)
		{
			isflagged = false;
			checkcurrent = document.getElementById("nekomsgflag"+notearr[l]);
			for(m=0; m<flagcount; m++)
			{
				if (flagarr[m]==notearr[l])
				{
					isflagged=true;
					break;
				}
			}
			if(isflagged)
			{
				checkcurrent.setAttribute("src", flagicon);
				checkcurrent.setAttribute("width", flagw);
				checkcurrent.setAttribute("height", flagh);
				checkcurrent.setAttribute("title", "Flagged");
			}
			else
			{
				checkcurrent.setAttribute("src", unflagicon);
				checkcurrent.setAttribute("width", unflagw);
				checkcurrent.setAttribute("height", unflagh);
				checkcurrent.setAttribute("title", "Not flagged");
			}
		}
		countupdate();
	}
	else
	{
		toggleid = this.id;
		toggleid = toggleid.slice(11);
		if(this.getAttribute('src')==flagicon) // Flag -> Unflag
		{
			this.setAttribute("src", unflagicon);
			this.setAttribute("width", unflagw);
			this.setAttribute("height", unflagh);
			this.setAttribute("title", "Not flagged");
			for (l=0; l<flagcount; l++)
			{
				if(toggleid == flagarr[l]) {flagarr.splice(l, 1); break;}
			}
		}
		else
		{
			this.setAttribute("src", flagicon);
			this.setAttribute("width", flagw);
			this.setAttribute("height", flagh);
			this.setAttribute("title", "Flagged");
			flagarr.push(toggleid);
		}
		flagcount=flagarr.length;
		if(flagcount==0) {flaglist="none";}
		else {flaglist=flagarr.join(",");}
		countupdate();
		GM_setValue("flag_"+devname, flaglist);
	}
}

// /--------------------------------\
// | /----------------------------\ |
// | | General part for all pages | |
// | \----------------------------/ |
// \--------------------------------/

// /--------------\
// | Get Username |
// \--------------/

devgroup = document.evaluate("//meta[@name='deviantMETA']", document, null, XPathResult.ANY_TYPE, null);
devmeta = devgroup.iterateNext();
if (!devmeta) {return;}
devname = devmeta.getAttribute('content');
devregexp = new RegExp("http:\/\/([^\.]*)\.deviantart\.com");	// http://username.deviantart.com
devarr = devname.match(devregexp);
devname = devarr[1];	// Only username

// /-----------\
// | Get Flags |
// \-----------/

flaglist = GM_getValue("flag_"+devname, "none");
if (flaglist=="none")
{
	flagcount=0;
}
else
{
	flagarr = flaglist.split(",");
	flagcount=flagarr.length;
}

// /--------------------\
// | Insert Flagcounter |
// \--------------------/

barmain = document.getElementById('bar-deviant');
bargroup = document.evaluate("//a[@href='http://www.deviantart.com/users/logout']", barmain, null, XPathResult.ANY_TYPE, null);
barinsertpoint = bargroup.iterateNext();
if (!barinsertpoint) {return;}
barinsertpoint = barinsertpoint.previousSibling;
barins = document.createElement('span');
barins.id = "nekomsgcount";
countupdate();
barinsertpoint.parentNode.insertBefore(barins, barinsertpoint);

// /---------------------------------\
// | /-----------------------------\ |
// | | Specific part for Note page | |
// | \-----------------------------/ |
// \---------------------------------/

// /--------------\
// | Insert Flags |
// \--------------/

currentloc = window.location.href;
if (currentloc.slice(0, 30) != "http://my.deviantart.com/notes") {return;}
notegroup = document.getElementsByName('noteids[]');
if (!notegroup) {return;}
for(k=0; k<notegroup.length; k++)
{
	notecurr = notegroup.item(k);
	isflagged=false;
	notenum = notecurr.getAttribute('value');
	if(k==notegroup.length-1)
	{
		if(document.getElementById("nekomsgflag"+notenum)) {break;}
	}
	for(i=0; i<flagcount; i++)
	{
		if (flagarr[i]==notenum)
		{
			isflagged=true;
			break;
		}
	}
	notearr.push(notenum);
	insimg = document.createElement('img');
	insimg.id = "nekomsgflag"+notenum;
	if(isflagged)
	{
		insimg.setAttribute("src", flagicon);
		insimg.setAttribute("width", flagw);
		insimg.setAttribute("height", flagh);
		insimg.setAttribute("alt", "");
		insimg.setAttribute("title", "Flagged");
	}
	else
	{
		insimg.setAttribute("src", unflagicon);
		insimg.setAttribute("width", unflagw);
		insimg.setAttribute("height", unflagh);
		insimg.setAttribute("alt", "");
		insimg.setAttribute("title", "Not flagged");
	}
	notecurr.parentNode.insertBefore(insimg, notecurr.nextSibling.nextSibling.nextSibling);
	insimg.addEventListener("click", flagtoggle, true);
	insblank = document.createTextNode(" ");
	notecurr.parentNode.insertBefore(insblank, insimg);
}

// /------------------\
// | Delete-Overrides |
// \------------------/

delovergroup = document.evaluate("//input[@value='Delete Selected']", document, null, XPathResult.ANY_TYPE, null);
deloverbut = delovergroup.iterateNext();
if (!deloverbut) {return;}
while(deloverbut)
{
	deloverbut.addEventListener("click", deflag, true);
	deloverbut = delovergroup.iterateNext();
}
delovergroup = document.evaluate("//input[@value='Delete']", document, null, XPathResult.ANY_TYPE, null);
deloverbut = delovergroup.iterateNext();
if (deloverbut) {deloverbut.addEventListener("click", directdeflag, true);}

function deflag()
{
	var y, checknote, checkimg, z;
	for (y=0; y<notearr.length; y++)
	{
		checkimg = document.getElementById("nekomsgflag"+notearr[y]);
		checknote = checkimg.parentNode;
		checknote = checknote.getElementsByTagName("input").item(0);
		if (checknote.checked)
		{
			checkimg.setAttribute("src", unflagicon);
			checkimg.setAttribute("width", unflagw);
			checkimg.setAttribute("height", unflagh);
			checkimg.setAttribute("title", "Not flagged");
			for (z=0; z<flagcount; z++)
			{
				if(notearr[y] == flagarr[z]) {flagarr.splice(z, 1); break;}
			}
			flagcount=flagarr.length;
			if(flagcount==0) {flaglist="none";}
			else {flaglist=flagarr.join(",");}
			countupdate();
			GM_setValue("flag_"+devname, flaglist);
		}
	}
}

function directdeflag()
{
	var locarr = new Array();
	var locnote, directnote, x;
	locarr = currentloc.split("/");
	locnote = locarr.pop();
	directnote = document.getElementById("nekomsgflag"+locnote);
	directnote = directnote.parentNode;
	directnote = directnote.getElementsByTagName("input").item(0);
	for (x=0; x<flagcount; x++)
	{
		if(locnote == flagarr[x]) {flagarr.splice(x, 1); break;}
	}
	flagcount=flagarr.length;
	if(flagcount==0) {flaglist="none";}
	else {flaglist=flagarr.join(",");}
	GM_setValue("flag_"+devname, flaglist);
}

})();