var coinMeat = 200;

var which;
var gotPulverize;

var items;
var pulverizeds;

var whichHippyElement = document.getElementById( 'whichHippy' );
var whichFratElement = document.getElementById( 'whichFrat' );
var whichBothElement = document.getElementById( 'whichBoth' );
var gotPulverizeElement = document.getElementById( 'gotPulverize' );

var mallElement = document.getElementById( 'mall' );
var smashElement = document.getElementById( 'smash' );
var coinsElement = document.getElementById( 'coins' );
var sellElement = document.getElementById( 'sell' );

var smashSectionElement = document.getElementById( 'smashSection' );


function Setup()
    {
    // Default values.
    which = 'both';
    gotPulverize = 'yes';

    // Get cookie values.
    GetVars();

    if ( which == 'hippy' )
	whichHippyElement.checked = true;
    else if ( which == 'frat' )
	whichFratElement.checked = true;
    else if ( which == 'both' )
	whichBothElement.checked = true;

    gotPulverizeElement.checked = gotPulverize == 'yes';

    acme.utils.HttpGet( 'warmeat.xml', OkCallback );
    }


function OkCallback( request )
    {
    var response = TraverseDocument( request.responseXML.documentElement );
    items = response.items;
    pulverizeds = response.pulverizeds;
    Display();
    }


function WhichChanged( newWhich )
    {
    which = newWhich;
    SaveVars();
    Display();
    }


function GotPulverizeChanged()
    {
    gotPulverize = gotPulverizeElement.checked ? 'yes' : 'no';
    SaveVars();
    Display();
    }


function Display()
    {
    if ( gotPulverize == 'yes' )
	smashSectionElement.style.display = '';
    else
	smashSectionElement.style.display = 'none';

    acme.utils.ClearElement( mallElement );
    acme.utils.ClearElement( smashElement );
    acme.utils.ClearElement( coinsElement );
    acme.utils.ClearElement( sellElement );
    var mallTbodyElement = StartTable( mallElement );
    var smashTbodyElement = StartTable( smashElement );
    var coinsTbodyElement = StartTable( coinsElement );
    var sellTbodyElement = StartTable( sellElement );
    var nMall = 0;
    var nSmash = 0;
    var nCoins = 0;
    var nSell = 0;

    for ( var i = 0; i < items.length; ++i )
	{
	var item = items[i];

	if ( which == 'hippy' && item.drop == 'frat' ||
	     which == 'frat' && item.drop == 'hippy' )
	    continue;

	// Figure out the expected meat return for each of the four options.
	if ( item.mall == '-' )
	    item.mallMeat = 0;
	else
	    item.mallMeat = parseInt( item.mall );
	item.nElements = 0;
	if ( item.smash == '-' )
	    item.smashMeat = 0;
	else
	    {
	    var parts = item.smash.split( ',' );
	    if ( parts.length != 2 )
		{
		alert( 'Bad smash syntax for ' + item.name );
		item.smashMeat = 0;
		}
	    else
		{
		var products = parts[0].split( '/' );
		var elements = parts[1].split( '/' );
		item.nElements = elements.length - 1;
		var meat = 0.0;
		var n = 0;
		for ( var p = 0; p < products.length; ++p )
		    {
		    var wads = 0;
		    var nuggets = 0;
		    var powders = 0;
		    if ( products[p] == '4W' )
			wads = 4;
		    else if ( products[p] == '3W' )
			wads = 3;
		    else if ( products[p] == '2W' )
			wads = 2;
		    else if ( products[p] == '1W3N' )
			{ wads = 1; nuggets = 3; }
		    else if ( products[p] == '1W' )
			wads = 1;
		    else if ( products[p] == '4N' )
			nuggets = 4;
		    else if ( products[p] == '3N' )
			nuggets = 3;
		    else if ( products[p] == '2N' )
			nuggets = 2;
		    else if ( products[p] == '1N3P' )
			{ nuggets = 1; powders = 3; }
		    else if ( products[p] == '1N' )
			nuggets = 1;
		    else if ( products[p] == '4P' )
			powders = 4;
		    else if ( products[p] == '3P' )
			powders = 3;
		    else if ( products[p] == '2P' )
			powders = 2;
		    else if ( products[p] == '1P' )
			powders = 1;
		    for ( var e = 0; e < elements.length; ++e )
			{
			if ( elements[e] == 'co' )
			    {
			    meat += 0.99 * wads * pulverizeds['cold wad'].mall + 0.01 * wads * pulverizeds['glacial sapphire'].mall;
			    meat += nuggets * pulverizeds['cold nuggets'].mall;
			    meat += powders * pulverizeds['cold powder'].mall;
			    }
			else if ( elements[e] == 'ho' )
			    {
			    meat += 0.99 * wads * pulverizeds['hot wad'].mall + 0.01 * wads * pulverizeds['steamy ruby'].mall;
			    meat += nuggets * pulverizeds['hot nuggets'].mall;
			    meat += powders * pulverizeds['hot powder'].mall;
			    }
			else if ( elements[e] == 'sl' )
			    {
			    meat += 0.99 * wads * pulverizeds['sleaze wad'].mall + 0.01 * wads * pulverizeds['tawdry amethyst'].mall;
			    meat += nuggets * pulverizeds['sleaze nuggets'].mall;
			    meat += powders * pulverizeds['sleaze powder'].mall;
			    }
			else if ( elements[e] == 'sp' )
			    {
			    meat += 0.99 * wads * pulverizeds['spooky wad'].mall + 0.01 * wads * pulverizeds['unearthly onyx'].mall;
			    meat += nuggets * pulverizeds['spooky nuggets'].mall;
			    meat += powders * pulverizeds['spooky powder'].mall;
			    }
			else if ( elements[e] == 'st' )
			    {
			    meat += 0.99 * wads * pulverizeds['stench wad'].mall + 0.01 * wads * pulverizeds['effluvious emerald'].mall;
			    meat += nuggets * pulverizeds['stench nuggets'].mall;
			    meat += powders * pulverizeds['stench powder'].mall;
			    }
			else if ( elements[e] == 'tw' )
			    {
			    meat += wads * pulverizeds['twinkly wad'].mall;
			    meat += nuggets * pulverizeds['twinkly nuggets'].sell;
			    meat += powders * pulverizeds['twinkly powder'].sell;
			    }
			++n;
			}
		    }
		meat = meat / n;
		item.smashMeat = Math.round( meat );
		}
	    }
	if ( item.coins == '-' )
	    item.coinsMeat = 0;
	else
	    item.coinsMeat = parseInt( item.coins ) * coinMeat;
	if ( item.sell == '-' )
	    item.sellMeat = 0;
	else
	    item.sellMeat = parseInt( item.sell );

	// Decide which option is best.
	if ( gotPulverize == 'yes' &&
	     ( item.mallMeat > item.smashMeat &&
	       item.mallMeat > item.coinsMeat &&
	       item.mallMeat > item.sellMeat * 2 ) ||
	     gotPulverize != 'yes' &&
	     ( item.mallMeat > item.coinsMeat &&
	       item.mallMeat > item.sellMeat * 2 ) )
	    {
	    AddItem( mallTbodyElement, item, 'mall' );
	    ++nMall;
	    }
	else if ( gotPulverize == 'yes' &&
	          ( item.smashMeat > item.coinsMeat &&
	            item.smashMeat > item.sellMeat ) )
	    {
	    AddItem( smashTbodyElement, item, 'smash' );
	    ++nSmash;
	    }
	else if ( item.coinsMeat > item.sellMeat )
	    {
	    AddItem( coinsTbodyElement, item, 'coins' );
	    ++nCoins;
	    }
	else
	    {
	    AddItem( sellTbodyElement, item, 'sell' );
	    ++nSell;
	    }
	}

    // Clear out any sections that didn't get any items.
    if ( nMall == 0 )
	{
	acme.utils.ClearElement( mallElement );
	mallElement.innerHTML = 'Nothing worth selling in the mall.'
	}
    if ( nSmash == 0 )
	{
	acme.utils.ClearElement( smashElement );
	smashElement.innerHTML = 'Nothing worth smashing.'
	}
    if ( nCoins == 0 )
	{
	acme.utils.ClearElement( coinsElement );
	coinsElement.innerHTML = 'Nothing worth trading for coins.'
	}
    if ( nSell == 0 )
	{
	acme.utils.ClearElement( sellElement );
	sellElement.innerHTML = 'Nothing worth autoselling.'
	}
    }


function StartTable( element )
    {
    var tableElement = acme.utils.AppendElement( element, 'table', { border: 1 } );
    var tbodyElement = acme.utils.AppendElement( tableElement, 'tbody', {} );
    var trElement = acme.utils.AppendElement( tbodyElement, 'tr', {} );
    var th1Element = acme.utils.AppendElement( trElement, 'th', {} );
    var th2Element = acme.utils.AppendElement( trElement, 'th', {} );
    th2Element.innerHTML = '&nbsp;&nbsp;mall&nbsp;&nbsp;';
    if ( gotPulverize == 'yes' )
	{
	var th3Element = acme.utils.AppendElement( trElement, 'th', {} );
	th3Element.innerHTML = '&nbsp;smash&nbsp;';
	}
    var th4Element = acme.utils.AppendElement( trElement, 'th', {} );
    th4Element.innerHTML = '&nbsp;coins&nbsp;';
    var th5Element = acme.utils.AppendElement( trElement, 'th', {} );
    th5Element.innerHTML = 'autosell';
    return tbodyElement;
    }


function AddItem( tbodyElement, item, highlight )
    {
    var trElement = acme.utils.AppendElement( tbodyElement, 'tr', {} );
    var td1Element = acme.utils.AppendElement( trElement, 'td', {} );
    td1Element.innerHTML = item.name;
    if ( item.nElements > 0 )
	td1Element.className = 'elements' + item.nElements;
    var td2Element = acme.utils.AppendElement( trElement, 'td', {} );
    td2Element.innerHTML = item.mall == '-' ? '-' : Round10( item.mallMeat );
    if ( highlight == 'mall' )
	td2Element.className = 'highlight';
    if ( gotPulverize == 'yes' )
	{
	var td3Element = acme.utils.AppendElement( trElement, 'td', {} );
	td3Element.innerHTML = item.smash == '-' ? '-' : Round10( item.smashMeat );
	if ( highlight == 'smash' )
	    td3Element.className = 'highlight';
	}
    var td4Element = acme.utils.AppendElement( trElement, 'td', {} );
    td4Element.innerHTML = item.coins == '-' ? '-' : item.coinsMeat;
    if ( highlight == 'coins' )
	td4Element.className = 'highlight';
    var td5Element = acme.utils.AppendElement( trElement, 'td', {} );
    td5Element.innerHTML = item.sell;
    if ( highlight == 'sell' )
	td5Element.className = 'highlight';
    }


function Round10( n )
    {
    return Math.round( ( n + 5 ) / 10.0 ) * 10;
    }


var cookieName = 'WarMeat';

function GetVars()
    {
    var cookie = acme.utils.GetCookie( cookieName );
    if ( cookie )
	{
	var cookieParts = cookie.split( ',' );
	for ( var i = 0; i < cookieParts.length; ++i )
	    {
	    var nameval = cookieParts[i].split( '=' );
	    if ( nameval.length == 2 )
		{
		var name = nameval[0];
		var val = nameval[1];
		if ( name == 'which' )
		    which = val;
		else if ( name == 'gotPulverize' )
		    gotPulverize = val;
		}
	    }
	}
    }

function SaveVars()
    {
    acme.utils.SaveCookie( cookieName, 'which=' + which + ',gotPulverize=' + gotPulverize );
    }


function TraverseDocument( element )
    {
    var response = {};
    var child = element.firstChild;
    while ( child )
	{
	if ( child.nodeName == 'items' )
	    response.items = TraverseItems( child );
	else if ( child.nodeName == 'pulverizeds' )
	    response.pulverizeds = TraversePulverizeds( child );
	child = child.nextSibling;
	}
    return response;
    }

function TraverseItems( element )
    {
    var items = [];
    var child = element.firstChild;
    while ( child )
	{
	if ( child.nodeName == 'item' )
	    items.push( TraverseItem( child ) );
	child = child.nextSibling;
	}
    return items;
    }

function TraverseItem( element )
    {
    var item = {};
    item.drop = element.getAttribute( 'drop' );
    item.coins = element.getAttribute( 'coins' );
    item.sell = element.getAttribute( 'sell' );
    item.smash = element.getAttribute( 'smash' );
    item.mall = element.getAttribute( 'mall' );
    item.name = acme.utils.GetXmlText( element );
    return item;
    }

function TraversePulverizeds( element )
    {
    var pulverizeds = [];
    var child = element.firstChild;
    while ( child )
	{
	if ( child.nodeName == 'pulverized' )
	    {
	    var pulverized = TraversePulverized( child );
	    pulverizeds[pulverized.name] = pulverized;
	    }
	child = child.nextSibling;
	}
    return pulverizeds;
    }

function TraversePulverized( element )
    {
    var pulverized = {};
    pulverized.sell = parseInt( element.getAttribute( 'sell' ) );
    pulverized.mall = parseInt( element.getAttribute( 'mall' ) );
    pulverized.name = acme.utils.GetXmlText( element );
    return pulverized;
    }

