// Wolffauer's KoL Scripts
// Questions, comments, bug reports or donations to: Wolffauer (#1137554)
//
// ==UserScript==
// @name          Wolffauer's Clan Attack List
// @namespace     http://www.knauer.org/mike/kol/
// @description   Version 1.00
// @include       *kingdomofloathing.com/clan_attack.php*
// @include       */clan_attack.php*
// @include       *kingdomofloathing.com/clan_war.php*
// @include       *kingdomofloathing.com/main.php*
// @exclude       http://images.kingdomofloathing.com/*
// @exclude       http://forums.kingdomofloathing.com/*
// ==/UserScript==
//
/********************************** Recent Changes *****************************************
Recent Updates:
Version 1.00: Testing done, updating version number to 1.0 (no new features)
Version 0.10: First release
Version 0.01: Initial version of the script - does little to nothing
********************************************************************************************/

// ---------------------------------------------------------------------------
// Picklish's VERSION CHECKER 1.3 

// - BEGIN MANUAL SECTION -
var currentVersion = "1.00";
var scriptURL = "http://www.knauer.org/mike/kol/WolffauerClanAttackList.user.js";
var scriptName = "Wolffauer's Clan Attack List";
// The version checker will show non-errors if and only if this boolean
// is false and GM_getValue("showOnlyErrors") is false or unset.
var showOnlyErrors = true;

// The elements of resources are five element arrays which contain a
// resource name (for displaying), a resource link (for downloading
// the resource), a downloaded value name (for storing the result of the
// resource in a greasemonkey variable of that name), and a time in days
// before re-checking this resource, and finally a variable to set to "1" 
// whenever a variable has been gotten.
var resources = "";
//var resources = new Array(
//    new Array(
//        "Item Database",
//        useitemdb,
//        "useitemdb",
//        2,
//        gotNewItemDB
//    )
//);

// - END MANUAL SECTION -

// - BEGIN CUT AND PASTE SECTION -
var datePrefix = "CheckTime-";

function MakeBullet(message)
{
    return "<tr><td><font size=-2>&nbsp;&#42;" + message + "</font></td></tr>";
}

// Check for an updated script version and print the result box...
function CheckScriptVersion()
{
    // Preemptively set error, in case request fails...
    GM_setValue("webVersion", "Error")

    GM_xmlhttpRequest({
        method: "GET",
        url: scriptURL,
        headers:
        {
            "User-agent": "Mozilla/4.0 (compatible) Greasemonkey",
            "Accept": "text/html",
        },
        onload: function(responseDetails)
        {
            if (responseDetails.status == "200")
            {
                var m = responseDetails.responseText.match(
                    /description\s*Version (\w+(?:\.\w+)?)/);
                if (m && !isNaN(m[1]))
                {
                    GM_setValue("webVersion", m[1]);
                }
            }

            var message;
            var warningLevel = 0;
            var forceGet = false;

            var webVer = parseFloat(GM_getValue("webVersion"));
            if (GM_getValue("webVersion", "Error") == "Error")
            {
                message = "Failed to check website for updated version of script.";
                warningLevel = 1;
            }
            else if (isNaN(webVer))
            {
                message = "Couldn't find suitable version number.";
                warningLevel = 1;
            }
            else
            {
                if (webVer > parseFloat(currentVersion))
                {
                    message = "Right click <a href='" + scriptURL + "' TARGET='_blank'>here</a> and select 'Install User Script' for Version " + webVer + ".";
                    warningLevel = 2;
                }
                else
                {
                    if (webVer < parseFloat(currentVersion))
                    {
                        message = "Script is newer than web version.";
                        warningLevel = 0;
                        forceGet = true;
                    }
                    else
                    {
                        message = "Script is latest version.";
                        warningLevel = 0;
                    }
                }
            }

            // In either case, check remaining resources...
            CheckResource(0, warningLevel, MakeBullet(message), forceGet);
        }
    });
}

function CheckResource(index, warningLevel, message, forceGet)
{
    if (index >= resources.length)
    {
        PrintCheckVersionBox(warningLevel, message, forceGet);
        return;
    }

    var name = resources[index][0];
    var url = resources[index][1];
    var varname = resources[index][2];
    var daylimit = parseFloat(resources[index][3]);
    var gotvar = resources[index][4];

    var now = new Date();

    // if the script version has changed, update resource.
    var oldVersion = GM_getValue(varname + "_version", "0.0");
    if (parseFloat(oldVersion) < parseFloat(currentVersion))
    {
        forceGet = true;
    }

    // if don't need to get...
    if (!forceGet && GM_getValue(datePrefix + varname, 0) != 0 &&
        (now.getTime() <= Date.parse(GM_getValue(datePrefix + varname)) +
        daylimit * 86400000))
    {
        var timeString;
        if (daylimit == 1.0)
            timeString = daylimit + " day";
        else
            timeString = daylimit + " days";
        message += MakeBullet(name + ": Less than " + timeString + 
            " old, using cached version.");
        CheckResource(index + 1, warningLevel, message, forceGet);
        return;
    }

    // otherwise we need to get this resource...
    GM_xmlhttpRequest({
        method: 'GET',
        url: url,
        headers: {'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
            'Accept': 'text/html',},
        varname: varname,
        name: name,
        index: index,
        gotvar: gotvar,
        onload: function(responseDetails)
        {
            if (responseDetails.status != 200)
            {
                GM_log("Error getting " + this.name + "@" + this.url + ": " + 
                    responseDetails.status);
                
                if (GM_getValue(varname, "") == "")
                {
                    if (warningLevel < 2)
                        warningLevel = 2;
                    message += MakeBullet(this.name + ": Error accessing resource.  No cached version to use.");
                }
                else
                {
                    if (warningLevel < 1)
                        warningLevel = 1;
                    message += MakeBullet(this.name + ": Error accessing stale resource.  Using cached version.");
                }
            }
            else
            {
                GM_setValue(this.varname, responseDetails.responseText);
                var size = GM_getValue(this.varname).length;
                message += MakeBullet(this.name + ": Downloaded new version (" + size + " bytes.)");
                GM_log("Got " + this.varname + " (" + size + " bytes)");

                var now = new Date();
                GM_setValue(datePrefix + this.varname, now.toString());

                GM_setValue(gotvar, 1);
                GM_setValue(varname + "_version", currentVersion);
            }

            CheckResource(index + 1, warningLevel, message, forceGet);
        }
    });
}

function PrintCheckVersionBox(resourceWarningLevel, resourceMessage, forceBox)
{
    // set color from warning level
    var color;
    if (resourceWarningLevel > 1)
    {
        color = "red";
    }
    else if (resourceWarningLevel > 0)
    {
        color = "orange";
    }
    else
    {
        color = "blue";

        // if no errors, return...
        if (!forceBox && (showOnlyErrors || 
            GM_getValue("showOnlyErrors", false)))
        {
            return;
        }
    }

    var span = document.createElement("center");
    span.innerHTML = "<table style='border: 1px solid " + color + "; margin-bottom: 4px;' width=95% cellpadding=1 cellspacing=0><tr><td bgcolor=" + color + "><font color=white size=-2><b>" + scriptName + "</b> " + currentVersion + ":</font></td></tr>" + resourceMessage + "</table>";

    document.body.insertBefore(span, document.body.firstChild);
}

if (window.location.pathname == "/main.php")
{
    CheckScriptVersion();
}
// - END CUT AND PASTE SECTION -
// ---------------------------------------------------------------------------



if (window.location.pathname == "/clan_attack.php")
{
	var	attackClans = GM_getValue('attackClans',"[]");
	attackClans = attackClans.toLowerCase()
	var	avoidClans = GM_getValue('avoidClans',"[]");
	avoidClans = avoidClans.toLowerCase()
	var bThing = document.getElementsByTagName('b');
	var len = bThing.length;
	
	for (var i=4; i<len; i++)
	{	
		var temp = bThing[i];
		if (avoidClans.indexOf(temp.textContent.toLowerCase()) > -1)
		{
			temp.style.color = "red";
			temp.style.textDecoration = "line-through";
		} 
		else if (attackClans.indexOf(temp.textContent.toLowerCase()) > -1)
		{
			temp.style.color = "green";
			temp.style.textDecoration = "underline";
		}
	}
}

if (window.location.pathname == "/clan_war.php")
{
	var centerThing = document.getElementsByTagName('center');
	var len = centerThing.length;
	var found = false;

	for (var i=1; i<len; i++)
	{	
		var temp = centerThing[i];
		if (temp.textContent == "Back to Clan Hall")
		{
			centerThing = temp; 
			found = true;
			break;
		}
	}
	if (found)
	{
		//create preference title bar
		prefTitle = document.createElement('div');
		with(prefTitle) {
			appendChild(document.createTextNode('Clan Attack List'));
			style.textAlign = "center";
			style.textDecoration = "underline";
			style.fontWeight = "bold";
		}
		
		//create wrapper for preference content (helps with alignment)
		prefContent = document.createElement('div');
		with(prefContent) {
			style.textAlign = "center";
			style.lineHeight = "2em";
			style.padding = "5px";
		}
			   
		//create attack form, and button to toggle it
		toggleAttackForm = document.createElement('span');
		attackForm = document.createElement('form');
		with(toggleAttackForm) {
				style.cursor = "pointer";
				appendChild(document.createTextNode('Change Attack List'));
				style.textDecoration = "underline";
				className = "preferenceButton";
				addEventListener('click',function(evt) {toggle(attackForm);evt.preventDefault();},true);
		}
			
		//create Add Attack button
		addAttackButton = document.createElement('font');
		with(addAttackButton) {
			size = "+1";
			appendChild(document.createTextNode('+'));
			addEventListener('click',createBlankAttack,false);
			setAttribute('style','cursor:pointer;font-weight:bold;float:right;text-decoration:none;'); // 
		}
	
		submitAttack = document.createElement('input');
		with(submitAttack) {
			style.marginTop = "5px";
			className = "button";
			type="submit";
			value="submit";
		}
		
		attackFieldHolder = document.createElement('div');
		attackFieldHolder.style.textAlign = "left";
		generateAttack();
		
		with(attackForm) {
			style.display = "none";
			style.marginBottom = "-1em";
			appendChild(document.createElement('hr'));
			appendChild(document.createTextNode('Safe Clans to Attack:'));
			appendChild(addAttackButton);
			appendChild(document.createElement('br'));
			appendChild(attackFieldHolder);
			appendChild(submitAttack);
			appendChild(document.createElement('hr'));
			addEventListener('submit',readAttack,true);
		}
	
		//create avoid form, and button to toggle it
		toggleAvoidForm = document.createElement('span');
		avoidForm = document.createElement('form');
		with(toggleAvoidForm) {
				style.cursor = "pointer";
				appendChild(document.createTextNode('Change Avoid List'));
				style.textDecoration = "underline";
				className = "preferenceButton";
				addEventListener('click',function(evt) {toggle(avoidForm);evt.preventDefault();},true);
		}
			
		//create Add Avoid button
		addAvoidButton = document.createElement('font');
		with(addAvoidButton) {
			size = "+1";
			appendChild(document.createTextNode('+'));
			addEventListener('click',createBlankAvoid,false);
			setAttribute('style','cursor:pointer;font-weight:bold;float:right;text-decoration:none;'); // 
		}
	
		submitAvoid = document.createElement('input');
		with(submitAvoid) {
			style.marginTop = "5px";
			className = "button";
			type="submit";
			value="submit";
		}
		
		avoidFieldHolder = document.createElement('div');
		avoidFieldHolder.style.textAlign = "left";
		generateAvoid();
		
		with(avoidForm) {
			style.display = "none";
			style.marginBottom = "-1em";
			appendChild(document.createElement('hr'));
			appendChild(document.createTextNode('Unsafe Clans to Attack:'));
			appendChild(addAvoidButton);
			appendChild(document.createElement('br'));
			appendChild(avoidFieldHolder);
			appendChild(submitAvoid);
			appendChild(document.createElement('hr'));
			addEventListener('submit',readAvoid,true);
		}
	
		with(prefContent) {
			appendChild(toggleAttackForm);
			appendChild(attackForm);
			appendChild(document.createElement('br'));
			appendChild(toggleAvoidForm);
			appendChild(avoidForm);
		}
		
		//create main wrapper form
		prefWrapper = document.createElement('div');
		with(prefWrapper) {
			style.marginBottom = "4px";
			style.width = "30%";
			appendChild(prefTitle);
			appendChild(prefContent);
			appendChild(document.createElement('br'));
		}

 		var parentDiv = centerThing.parentNode;
		parentDiv.insertBefore(prefWrapper, centerThing);
	}
}

function toggle(item)
{
   if (!item)return;
   item.style.display = (item.style.display == "none") ? "block" : "none";
}

function createBlankAttack() {
	var attfield = document.createElement('input');
	with(attfield) {
		type="text";
		className = "attackField";
	}
	attackFieldHolder.appendChild(attfield); 
	attackFieldHolder.appendChild(document.createElement('br'));
}

function readAttack(evt) {
	var tempArray = new Array();
	v=attackFieldHolder.getElementsByTagName('input');
	for(var i=0;i<v.length;i++) {
		if(v[i].value != "" && v[i].value != " ") {
			tempArray.push(v[i].value);
		}
	}
	tempArray.sort();
	GM_setValue('attackClans',uneval(tempArray));
	while ( attackFieldHolder.hasChildNodes() ) { attackFieldHolder.removeChild(attackFieldHolder.firstChild);}
	generateAttack();
	alert('Clans to attack updated');
	evt.preventDefault();
}

function generateAttack() {
	var	existingWords = eval(GM_getValue('attackClans',"[]"));
	if(existingWords.length > 0) {
		for(var i=0;i<existingWords.length;i++) {
			//generate number of fields
			var attfield = document.createElement('input');
			with(attfield) {
				type="text";
				className = "attackField";
				value=existingWords[i];
			}
			attackFieldHolder.appendChild(attfield);
			attackFieldHolder.appendChild(document.createElement('br'));
		}
	} else {
		createBlankAttack();
	}
}

function createBlankAvoid() {
	var avdfield = document.createElement('input');
	with(avdfield) {
		type="text";
		className = "avoidField";
	}
	avoidFieldHolder.appendChild(avdfield); 
	avoidFieldHolder.appendChild(document.createElement('br'));
}

function readAvoid(evt) {
	var tempArray = new Array();
	v=avoidFieldHolder.getElementsByTagName('input');
	for(var i=0;i<v.length;i++) {
		if(v[i].value != "" && v[i].value != " ") {
			tempArray.push(v[i].value);
		}
	}
	tempArray.sort();
	GM_setValue('avoidClans',uneval(tempArray));
	while ( avoidFieldHolder.hasChildNodes() ) { avoidFieldHolder.removeChild(avoidFieldHolder.firstChild);}
	generateAvoid();
	alert('Clans to avoid updated');
	evt.preventDefault();
}

function generateAvoid() {
	var	existingWords = eval(GM_getValue('avoidClans',"[]"));
	if(existingWords.length > 0) {
		for(var i=0;i<existingWords.length;i++) {
			//generate number of fields
			var avdfield = document.createElement('input');
			with(avdfield) {
				type="text";
				className = "avoidField";
				value=existingWords[i];
			}
			avoidFieldHolder.appendChild(avdfield);
			avoidFieldHolder.appendChild(document.createElement('br'));
		}
	} else {
		createBlankAvoid();
	}
}

