var UID = 0;


function getImageSource( cardname )
{
    if( cardname === undefined || cardname.length == 0 )
    {
        return;
    }

    var prefix = "http://www.wizards.com/global/images/magic/general/";
    var filename = cardname + ".jpg";
    filename = filename.toLowerCase();
    filename = filename.replace( / /g, "_" );
    filename = filename.replace( /'/g, "" ); //'
    filename = filename.replace( /,/g, "" );
    filename = filename.replace( /-/g, "_" );
    filename = filename.replace( /\/\//g, "_" );
    return prefix + filename;
}

function installCardTags()
{
    var elements = document.getElementsByTagName("div");
    var elementsZeta = document.getElementsByTagName("td"); 

    for( var ix = 0; ix < elementsZeta.length; ix++ )
    {
        if( elementsZeta[ix].className == "c_post" )
        {
            fixPost( elementsZeta[ix] );
        }
        
        if( elementsZeta[ix].className == "pformright")
        {
            inEl = elementsZeta[ix].getElementsByTagName("input");
            if(     inEl.length > 0 
                &&  inEl[0].className == "codebuttons" )
            {
                addButtons( elementsZeta[ix] );
            }
        }
    }   
    
    for( ix = 0; ix < elements.length; ix++ )
    {
        if( elements[ix].className == "postcolor" )
        {
            fixPost( elements[ix].parentNode );
        }
    }
}

var CARD_open = 0;
var SPOILER_open = 0;
var CENSOR_open = 0;
var CARDIMG_open = 0;

function makeSimpleTagButton( tagName )
{
        this[tagName + "_open"] = 0;
    
    var button = document.createElement("input");
    button.setAttribute("type", "button");
    button.setAttribute("value", " " + tagName + " ");
    button.className = "codebuttons";
    button.name = tagName;
    button.setAttribute("onclick", "simpletag('" + tagName + "')");

    return button;
}

function addButtons( inner )
{

    var el = inner.getElementsByTagName("input");
    var lastEl = el[el.length - 1];

    while (lastEl.className != "codebuttons") {
        lastEl = lastEl.previousSibling;
    }

    var spoilerButton = makeSimpleTagButton("SPOILER");
    var censorButton = makeSimpleTagButton("CENSOR");
    var deckButton = makeSimpleTagButton("DECK");
    var cardButton = makeSimpleTagButton("CARD");
    var cardImgButton = makeSimpleTagButton("CARDIMG");

    lastEl.parentNode.insertBefore(spoilerButton, lastEl.nextSibling);
    lastEl.parentNode.insertBefore(censorButton, lastEl.nextSibling);
    lastEl.parentNode.insertBefore(cardButton, lastEl.nextSibling);
    lastEl.parentNode.insertBefore(cardImgButton, lastEl.nextSibling);
    lastEl.parentNode.insertBefore(deckButton, lastEl.nextSibling);    

    lastEl.parentNode.insertBefore(document.createElement("br"), lastEl.nextSibling);
}

function newWindow( url )
{
    window.open(url,'Gatherer','width=725,height=600,resizable=yes'); 
}


function replaceTags( toscan, tag, getReplacement )
{
    var begin, end;     
    
    var opening = "[" + tag + "]";
    var closing = "[/" + tag + "]";

    var result = "";
    
    // Work from the end so that a hanging beginning tag screws up less.
    while( -1 != (begin = toscan.toLowerCase().lastIndexOf(opening)))
    {
        if( -1 == (end = toscan.toLowerCase().indexOf(closing, begin)))
        {
            break;
        }
                
        var innerText = toscan.substring( begin + opening.length, end );
        var replacement = getReplacement( innerText );
                
        if( undefined != replacement )
        {
            result = replacement + toscan.substring(end + closing.length) + result;
            toscan = toscan.substring(0,begin);
            found = true;
        }
        else
        {
            break;
        }
    }

    return toscan + result;
}


// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return { x : scrOfX, y : scrOfY };
}

//http://www.quirksmode.org/js/findpos.html
function findPos(obj) {
    var curleft = curtop = 0;
    if (obj) {
        do {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    }
    return { left: curleft, top: curtop };
}


function Hover(){};

Hover.lastID = 0;

Hover.show = function( cardname, hid)
{
    Hover.hide();
    
    Hover.sib = document.getElementById( "id-" + hid );
    
    if( Hover.sib != undefined && Hover.sib.parentNode != undefined )
    {
        var offsets = getScrollXY();
        var pos = findPos( Hover.sib );
    
        Hover.el = document.createElement("div");
        Hover.el.style.border= "3px solid #000000";
        Hover.el.style.position = "absolute";
        Hover.el.style.left = pos.left + "px";
        
        var divHeight = 291;
        var topAbove = pos.top - divHeight;
        
        if( topAbove >= offsets.y )
        {
            Hover.el.style.top = pos.top - divHeight + "px";
        }
        else
        {
            Hover.el.style.top = pos.top + Hover.sib.offsetHeight + "px";
        }

        
        var img = document.createElement("img");
        img.src = cardname;
    
        Hover.el.appendChild( img );
        setTimeout( "if( Hover.el != undefined ) { document.body.appendChild( Hover.el ); }", 200 ); 
    }
};

Hover.hide = function()
{
    if( Hover.el != undefined )
    {
        if(  Hover.el.parentNode != undefined )
        {
            Hover.el.parentNode.removeChild( Hover.el );
        }
    }
    
    Hover.sib = undefined;
    Hover.el = undefined;
    
};

function toggleDiv( id )
{
    var button = document.getElementById( "spoiler-button-" + id );
    var div = document.getElementById("spoiler-div-" + id );
    
    if( button != undefined && div != undefined )
    {
        if( button.value == "Hide" )
        {
            div.style.display = "none";
            button.value = "Show";
        }
        else
        {
            div.style.display = "block";
            button.value = "Hide";
        }
    }
}

function toggleCensor( id, mode )
{
    var span = document.getElementById("censor-span-" + id );
    
    if( span != undefined )
    {
        if( mode == "show" )
        {
            span.style.color = span.parentNode.style.color;
            span.style.backgroundColor = span.parentNode.style.backgroundColor;
        }
        else
        {
            span.style.color = "#000000";
            span.style.backgroundColor = "#000000";
        }
    }

}

function proxyWindow( deck ) {
    OpenWindow = window.open("", "newwin", "toolbar=no,menubar=no,scrollbars=yes");
    OpenWindow.document.write("<TITLE>Printable Proxies</TITLE>");
    
    var lines = deck.split ("&");
            
    var text = "";
    for (var i = 0; i < lines.length - 1; i++) {
        text += "<img src=" + lines[i] + " />";
    }
    
    OpenWindow.document.write(text);
    OpenWindow.document.write("</BODY></HTML>");

    OpenWindow.document.close();
}


function timeto(to) {
    var diff = new Date(to) - new Date();
    if(diff <= 0) {
        return "FIN.";
    }
    var one_second = 1000;
    var one_minute = one_second * 60;
    var one_hour = one_minute * 60;
    var one_day = one_hour * 24;
    var days = Math.floor(diff / one_day);
    diff -= days * one_day;
    var hours = Math.floor(diff / one_hour);
    diff -= hours * one_hour;
    var minutes = Math.floor(diff / one_minute);
    diff -= minutes * one_minute
    var seconds = Math.floor(diff / one_second);
    diff -= seconds * one_second;
    return days + ' days, ' + hours + ' hours, ' + minutes + ' minutes, ' + seconds + ' seconds';    
}

function fixPost( post )
{
    var innerHTML = post.innerHTML;
    var initial = innerHTML;
    
    innerHTML = replaceTags( innerHTML,
                 "poker",
                 function( inner )
                 {
                     var base = '<img src="http://goodgamery.com/mt2/cards/';
                     var end = '.gif">';
                 	
                     var rx = /\[([\dTJQKA][csdh])\]/g;
                     inner = inner.replace( rx, base+'$1'+end );
                 	
                     rx = /\[([\dTJQKA][csdh]) ([\dTJQKA][csdh])\]/g;
                     inner = inner.replace( rx, base+'$1'+end+base+'$2'+end );
                 	
                     rx = /\[([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh])\]/g;
                     inner = inner.replace( rx, base+'$1'+end+base+'$2'+end+base+'$3'+end );
                 	
                     rx = /\[([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh])\]/g;
                     inner = inner.replace( rx, base+'$1'+end+base+'$2'+end+base+'$3'+end+base+'$4'+end );                 	

                     rx = /\[([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh]) ([\dTJQKA][csdh])\]/g;
                     inner = inner.replace( rx, base+'$1'+end+base+'$2'+end+base+'$3'+end+base+'$4'+end+base+'$5'+end );    
                 	
                     inner = inner.replace( /\*\*\* SHOW DOWN \*\*\*(.*)\n\n/, "[spoiler]$1[/spoiler]\n\n" );
                 	
                     return inner;
                 } );

    innerHTML = replaceTags( innerHTML,
                 "censor",
                 function( inner )
                 {
                    var id = UID++;         
                    var span = '<span onmouseover="toggleCensor(' 
                                + id 
                                + ', \'show\')" onmouseout="toggleCensor(' 
                                + id 
                                + ', \'hide\')" style="background-color: #000000; color: #000000" id="censor-span-' 
                                + id 
                                + '">'
                                + inner
                                + "</span>";
                    return span;
                    
                 } );

    innerHTML = replaceTags( innerHTML,
                 "spoiler",
                 function( inner )
                 {
                    var id = UID++;
                    var button = '<input type="Button" value="Show" onclick="toggleDiv(' 
                                + id 
                                + ')" id="spoiler-button-' 
                                + id 
                                + '">';
                                
                    var div = '<div style="display: none" id="spoiler-div-' 
                                + id 
                                + '">' 
                                + inner 
                                + "</div>";
                                
                    return '<div style="border: 1px solid #000000">' + button + div + '</div>';
                 } );
                 

    innerHTML = replaceTags( innerHTML,
                 "deck",
                 function( inner )
                 {
                    inner = inner.replace( /<br>/gi, "\n" );
                    
                    var lines = inner.split("\n");
                    
                    var text = "";
                    var cardList = "";
                    for( var ix = 0; ix < lines.length; ix++ )
                    {
                        var parsed = parseLine( lines[ix] );
                        
                        if( parsed == undefined )
                        {
                            text += lines[ix] + "<br>";
                        }
                        else
                        {
                            text += parsed.count + " [card]" + parsed.name + "[/card]<br>";
                            for (var jx = 0; jx < parsed.count; jx++)
                            {
                                cardList += getImageSource(parsed.name) + "&";
                            }
                        }
                    }

                    var anchor = "";
                    anchor += "<a onclick=";
                    anchor += "proxyWindow(";
                    anchor += "\'" + cardList + "\'";
                    anchor += ")>Print Proxies</a>";
                    text += "<br>" + anchor + "<br>";
                    
                    return text;
                 
                 } );

    innerHTML = replaceTags( innerHTML,
                "card", 
                function( inner )
                {
                    var defoiled = inner.replace( / \(FOIL\)$/, "");
                    var escaped = defoiled.replace( /'/g, "\\'" ); //'"
                    var strID = "" + ++Hover.lastID;
                    var imgURL = "http://ww2.wizards.com/gatherer/CardDetails.aspx?name=" + escaped;
                    var href = 'javascript:newWindow(\'' + imgURL + '\');';
                    var mouseover = 'Hover.show(\'' + getImageSource(defoiled) + '\', ' + strID + ');"';
                    var mouseout = 'Hover.hide();';
                    var nonbreaking_inner = inner.replace(" ", "&nbsp;")
                    
                    var anchor = "";
                    anchor += '<a id="' + 'id-' + strID + '" ';
                    anchor += ' href="' + href + '" ';
                    anchor += ' onmouseover="' + mouseover + '" ';
                    anchor += ' onmouseout="' + mouseout + '" ';
                    anchor += '>' + nonbreaking_inner + '</a>';
                    
                    return anchor;
                } );
                
    innerHTML = replaceTags( innerHTML,
                "cardimg",
                function cardImgReplace( inner )
                {
                    var url = getImageSource( inner );
                    if( url != undefined )
                    {
                        return '<img style="border: 3px solid #000000" src="' + url + '" alt="' + inner + '"/>';
                    }
    
                    return undefined;
                } );
                 
    innerHTML = replaceTags( innerHTML,
                "youtube",
                function youtubeReplace(inner) {
                    var id = inner.split('=')[1];

                    if (id != null && /^[-_A-Za-z0-9]+$/.test(id)) {
                        var tubestring = "<object width='425' height='350'>";
                        tubestring += "<param name='movie' value='http://www.youtube.com/v/" + id + "'></param>";
                        tubestring += "<embed src='http://www.youtube.com/v/" + id + "' type='application/x-shockwave-flash' width='425' height='350'></embed>";
                        tubestring += "</object>";

                        return tubestring;
                    }
                } );
                 
    innerHTML = replaceTags( innerHTML,
                "draftcap",
                function draftcapReplace(inner) {
                  inner = inner.replace(/<br>/g, "\n");
                  
                  var input_array = trim_whitespace(inner).split("\n");
                  var output = "";
  
                  while (input_array.length > 0) {
                    // handle pack
                    var pack_line = input_array.shift();
                    var pack_array = pack_line.split("%");
                    
                    while (pack_array.length > 0) {
                      var card = pack_array.shift();
                      if (card == "") { continue; }
                      
                      var set = pack_array.shift();
                      
                      var color = "black";
                      
                      if (card.match(/FOIL/) != null) {
                        color = "silver";
                      }
                      
                      output += "<img src='" + get_image(card, set) + "' style='height:143px; width:100px; margin:5px; border:4px solid " + color + ";'>";
                    }
                    
                    output += "<br/>";
                    
                    // handle pick
                    var pick = input_array.shift();
                    var set = input_array.shift();
                    output += "<img src='" + get_image(pick, set) + "' style='height:143px; width:100px; margin:5px; border:4px solid gold;'>";
                    output += "<br/><br/>";
                  }
                                  
                  output += "This draft converter created by <a href='mailto:ben@mundy.net'>Benjamin Peebles-Mundy</a>.<br/>\n";
                  output += "Visit the <a href='http://www.zizibaloob.com/'>draft converter</a> today!";
                  
                  return output;
                } );
                
    innerHTML = replaceTags( innerHTML,
                "countdown",
                function(inner) {
                    var id = 'countdown_' + UID++;         
                    setInterval(function() {
                        var t = timeto(inner)
                        var el = document.getElementById(id);
                        el.innerHTML = t;
                    }, 1000);
                    return "<span id='" + id + "'>" + inner + "</span>";                    
                });
                
    if(initial != innerHTML)
    {
        post.innerHTML = innerHTML;
    }
}

function trim_whitespace(s) {
    while (s.charAt(0).match(/\s/)) {
        s = s.substring(1, s.length);
    }

    while (s.charAt(s.length - 1).match(/\s/)) {
        s = s.substring(0, s.length - 1);
    }

    return s;
}

function get_image(cardname, set) {
  cardname = cardname.toLowerCase();

  // ignore foils
  cardname = cardname.replace(/ \(foil\)/g, "");
  cardname = cardname.replace(/ \(FOIL\)/g, "");

  // handle special characters
  cardname = cardname.replace(/ /g, "_");
  cardname = cardname.replace(/:/g, "");
  cardname = cardname.replace(/'/g, "");
  cardname = cardname.replace(/,/g, "");
  cardname = cardname.replace(/-/g, "_");
  cardname = cardname.replace(/\/\//g, "_");
  cardname = cardname.replace(new RegExp(String.fromCharCode(230), "g"), "ae");

  if (set == "CON") {
    set = "general";
  }

  return "http://www.wizards.com/global/images/magic/" + set + "/" + cardname + ".jpg";
}
