/*
 * Copyright 2011 Geoffrey Dunn. geoff@warmage.com 
 */

function getBuzzwords() {
    
	var texts = [];
    $("#buzzwords input:text").each(function() {
        var word = $.trim(this.value);
        if (word != "") {
            texts.push(word);
        }
    });
    
	return texts;
}

function addWildcard(words) {
	words.splice(12, 0, "*");
	return words;
}

function buildTable(words) {
	var div = document.createElement("div");
	var table = document.createElement("table");
	var tableBody = document.createElement("tbody");
	table.appendChild(tableBody);
    div.appendChild(table);
	
	for (var i=0; i<5; ++i)	{
		var tableRow = document.createElement("tr");
		for (var j=0; j<5; ++j)	{
			var tableData = document.createElement("td");
			var text = document.createTextNode(words[(i*5) + j]);
			tableData.appendChild(text);
            if (words[(i*5) + j] == "*") {
                tableData.className = "highlight";
            }
            
			tableRow.appendChild(tableData);
		}
		tableBody.appendChild(tableRow);
	}
    
    var expand = document.createElement("a");
    expand.href = "#";
    expand.className = "hidden";
    expand.appendChild(document.createTextNode("Expand"));
    
    div.appendChild(expand);
	
	return div;
}

function insertBoard(board) {
	var place = document.getElementById("bingo_boards");
	while (place.childNodes.length > 0) {
		place.removeChild(place.firstChild);
	}
	place.appendChild(board);
}

function AddRow() {
    // Normal
    $("#buzzwords tbody").append('<tr><td><input type="text" /></td><td><input type="text" /></td><td><input type="text" /></td></tr>');
    // mobile
    $("ul#buzzwords").append('<li><input type="text" /></li><li><input type="text" /></li><li><input type="text" /></li>');
}

function Shuffle(words) {
	words.sort(function(a, b) {
		return (Math.random() * 3) - 2;
	});
    return words;
}

function winnerCheck(tableElement) {
	for (var i=0; i<5; ++i)	{
        // Horizontal
        var hmatches = tableElement.find("tr:eq(" + i + ") td.highlight");
        if (hmatches.length == 5) {
            hmatches.addClass("winner");
        }

        // Vertical
        var vmatches = tableElement.find("tr").find("td:eq(" + i + ")").filter(".highlight");
        if (vmatches.length == 5) {
            vmatches.addClass("winner");
        }
    }
    
    // Diagonal
    var topLeftTd = tableElement.find("td:eq(0),td:eq(6),td:eq(12),td:eq(18),td:eq(24)").filter(".highlight");
    var topRightTd = tableElement.find("td:eq(4),td:eq(8),td:eq(12),td:eq(16),td:eq(20)").filter(".highlight");

    if (topLeftTd.length == 5) {
        topLeftTd.addClass("winner");
    }
    if (topRightTd.length == 5) {
        topRightTd.addClass("winner");
    }
}

function tdClick() {
    $(this).toggleClass("highlight");

    winnerCheck($(this).closest('table'));
}

function expandClick(event) {
    if (event.target.nodeName == "DIV" || event.target.nodeName == "A")
    {
        event.preventDefault();
        event.stopPropagation();
        var clickedDiv = $(this).closest('div');
        clickedDiv.toggleClass("fullscreen");
        $("html").toggleClass("modal");
        if (clickedDiv.hasClass("fullscreen")) {
            clickedDiv.find('a').text("Shrink");
            window.scrollTo(0,1);
            $("#bingo_boards div.fullscreen").click(expandClick);
        } else {
            clickedDiv.find('a').text("Expand");
        }
    }
}

function generate() {
    var count = parseInt($("#count").attr('value'));
    if (count < 0) count = 1;

    var frag = document.createDocumentFragment();

    for (var i=0; i<count; i++) {
        var words = Shuffle(getBuzzwords());
        if (words.length < 24) {
            alert("Enter more words");
            return;
        } else if (words.length == 24) {
            words = addWildcard(words);
        }

        frag.appendChild(buildTable(words));
    }

    insertBoard(frag);

    // Highlight on click
    $("#bingo_boards td").click(tdClick);

    $("#bingo_boards a").click(expandClick);
}

$(document).ready(function() {
    
    $("#morewords a").click(function (event) {
        event.preventDefault();
        AddRow();
    });
    
    $("#generate").click(function () {
        generate();
    });
    
    $("#savewords").click(function () {
        var words = getBuzzwords();
        var encodedWords = $.toJSON(words);
        encodedWords = escape(encodedWords);
        
        // Change to the # key
        location.hash = '#words_' + encodedWords;
        
        // Display a message that it's saved
        $("#message").text("Bookmark now to save the words.")
    });
    
    // Load words
    var hashString = new String(location.hash);
    if (location.hash.match(/^#words_.+/)) {
        var wordsString = location.hash.substring(7);
        var words = $.parseJSON(unescape(wordsString));
        
        var inputCount = $("#buzzwords input:text").length;
        while (inputCount < words.length) {
            AddRow();
            inputCount += 3;
        }
        
        var i=0;
        
        $("#buzzwords input:text").each(function() {
            if (i < words.length) {
                this.value = words[i++];
            } else {
                this.value = '';
            }
        });
        
    }

    // Submits click generate
    $("form").submit(function (event) {
        event.preventDefault();
        generate();
    });

});
