// Student Unions & Activities
// University of Minnesota

var $E = YAHOO.util.Event;
var $D = YAHOO.util.Dom;
var $C = YAHOO.util.Connect;
var $ = $D.get;

var GAMEWIDTH = 600;
var GAMEHEIGHT = 400;

// Rotated sideways
var WII_UP = 177;//175;
var WII_DOWN = 178;//176;
var WII_RIGHT = 176;//177;
var WII_LEFT = 175;//178;
var WII_1 = 172;
var WII_2 = 173;

// Directional Bits
var UP = 1;
var DOWN = 2;
var LEFT = 4;
var RIGHT = 8;

// Bitfield
var keyDir = 0;

// Timer reference
var moveTimer;

var badguys = new Array();

var andy = null;

var paused = false;
var overlayed = false;

var keys = 0;

var score = 0;

var konamied = 0;

var ticks = 0;
var gameSpeed = 250;

var questionURL = '';


$E.addListener(window, 'load', setup);

function setup() {
    if (!window.waitForClearance || 1 > window.waitForClearance) {
	initAndy();
	
	initBadguys();
	
	updateScore(0);
	updateKeys(0);
	
	$('game').focus();
	
	//http://developer.yahoo.com/yui/docs/YAHOO.util.KeyListener.html
	/*
    if (navigator.appVersion.indexOf('MSIE') != -1) {
        $E.on(document, 'keydown', keyHandler);
    } else {
        $E.on(document, 'keypress', keyHandler);
    }
    */
	$E.on(document, 'keydown', keyHandler);
	$E.on(document, 'keyup', keyHandler);
	$('action').innerHTML = 'CLICK ME OR PRESS THE SPACE BAR TO PLAY!';
	$('action').onclick = function () {hideOverlay(); return false;}
	showOverlay();
	moveBadguys();
    }
}

function initAndy() {
    andy = new Andy($('andy'));
    andy.setX(250);
    andy.setY(150);
}


function moveBadguys() {
    if (!paused && !overlayed) {
        var i;
        for (i = 0; i < badguys.length; i++) {
            if (badguys[i].alive) {
                badguys[i].move(ticks);
            }
        }
    }
    
    ticks += gameSpeed;
    
    setTimeout(moveBadguys, gameSpeed);
}


function moveAndy() {
    clearTimeout(moveTimer);
    
    if (keyDir & UP) {
        andy.up();
    } else if (keyDir & DOWN) {
        andy.down();
    }

    if (keyDir & LEFT) {
        andy.left();
    } else if (keyDir & RIGHT) {
        andy.right();
    }
    
    andy.hitAnything();
    
    if (keyDir) {
        moveTimer = setTimeout(moveAndy, 75);
    }
}


function keyHandler( e ) {
    //var target = $E.getTarget( e );
    //var targetTag = target.nodeName;
    var keycode = $E.getCharCode( e );
    
    var dir = 0;
    if (!paused && !overlayed) {
        switch (keycode) {
            // Left
            case 63234:
            case 37:
            // a/A
            case 65:
            case 97:
            case WII_LEFT:
                dir = LEFT;
                //andy.left();
                break;

            // Up
            case 63232:
            case 38:
            // w/W
            case 87:
            case 119:
            case WII_UP:
                dir = UP;
                //andy.up();
                break;

            // Right
            case 63235:
            case 39:
            // d/D
            case 68:
            case 100:
            case WII_RIGHT:
                dir = RIGHT;
                //andy.right();
                break;

            // Down
            case 63233:
            case 40:
            // s/S
            case 83:
            case 115:
            case WII_DOWN:
                dir = DOWN;
                //andy.down();
                break;
        }
        
        if (e.type == 'keydown') {
            if (!keyDir) {
                keyDir |= dir; //multiple directions
                clearTimeout(moveTimer);
                moveAndy();
            } else {
                keyDir |= dir; //multiple directions
            }
        } else if (e.type == 'keyup') {
            keyDir &= ~dir;
        }
    }
    
    if (overlayed && e.type == 'keydown') {
        switch (keycode) {
            // space
            case 32:
            // return
            case 13:
            case WII_1:
            case WII_2:
                var action = $('action');
                if (action) {
                    action.onclick();
                }
                break;
                
            // 0
            case 48:
                //answer(0);
                break;
                
            // 1
            case 49:
                answer(1);
                break;

            // 2
            case 50:
                answer(2);
                break;

            // 3
            case 51:
                answer(3);
                break;

            // 4
            case 52:
                answer(4);
                break;
            
            // 5
            case 53:
                answer(5);
                break;

            // 6
            case 54:
                //answer(6);
                break;

            // 7
            case 55:
                //answer(7);
                break;

            // 8
            case 56:
                //answer(8);
                break;

            // 9
            case 57:
                //answer(9);
                break;
        }
    }
    
    switch (keycode) {
        /*
        // p/P
        case 80:
        case 112:
            if (!overlayed) {
                paused = !paused;
            }
            break;
        */
        
        // just here temporarily to show alison and abby the error screen
        /*case 80:
        case 112:
            showOverlay('foo.html');
            break;*/
        
        case 13:
        case 32:
        case 63234:
        case 37:
        case 63232:
        case 38:
        case 63235:
        case 39:
        case 63233:
        case 40:
        case WII_UP:
        case WII_DOWN:
        case WII_LEFT:
        case WII_RIGHT:
            $E.stopEvent(e);
            break;
        
        default:
            //$('keycode').innerHTML = keycode;
            break;
    }
}


function showOverlay(url, postVars) {
    overlayed = true;
    
    keyDir = 0;
    
    var screenDiv = $('screen');
    var overlayDiv = $('overlay');
    
    if (url) {
        loadUrl(url, overlayDiv, postVars);
    }
    
    $D.setStyle(screenDiv, 'visibility', 'visible');
    $D.setStyle(screenDiv, 'opacity', 0.8);
    $D.setStyle(overlayDiv, 'visibility', 'visible');
}


function hideOverlay() {
    overlayed = false;
    
    var screenDiv = $('screen');
    var overlayDiv = $('overlay');
    
    $D.setStyle(screenDiv, 'visibility', 'hidden');
    $D.setStyle(screenDiv, 'opacity', 0.0);
    $D.setStyle(overlayDiv, 'visibility', 'hidden');
    
    overlayDiv.innerHTML = '';
}


function loadUrl(url, div, postVars) {
    var callback = {
        success: function( o ) {
            var a = o.responseText.match(/<script.*>([\s\S]*)<\/script>/m);
            var js = '';
            if (a) {
                js = a[1];
            }
            var html = o.responseText.replace(/<script.*>[\s\S]*<\/script>/m, '');
            $(div).innerHTML = html;
            eval(js);
        },

        failure: function( o ) {
            // For debugging:
            //alert( 'loadUrl() error! URL: ' + url + ' / ERROR: ' + o.toString() );
            
            // Not using YUI here on purpose:
            var d = document.getElementById('ajaxError');
            d.style.visibility = 'visible';
        },
        
        argument: null,

        timeout: 15000
    };
    
    // Make score available to ajax'ed pages
    if (postVars) {
        postVars += '&score='+score;
    } else {
        postVars = 'score='+score;
    }
    
    $(div).innerHTML = '<p class="message">LOADING...</p>';
    
    $C.asyncRequest(
        'POST',
        url,
        callback,
        postVars
    );
}


function updateScore(points) {
    score += points;
    
    var s = '00000000'+Math.abs(score);
    
    if (score >= 0) {
        $('score').innerHTML = 'SCORE: '+s.substr(s.length - 8);
    } else {
        $('score').innerHTML = 'SCORE: -'+s.substr(s.length - 7);
    }
    
    if (score < 0 && konamied) {
        triggerSound('gameover');
        showOverlay('/handyandy/keyquest/ajax/gameover.php');	
    }
}


function updateKeys(numberFound) {
    keys += numberFound;
    $('keys').innerHTML = 'x '+keys;
    triggerSound('key1');
}


function ask(url) {
    questionURL = url;
    showOverlay(url, '');
}


function answer(choice) {
    if (questionURL) {
        showOverlay(questionURL, 'answer='+choice);
        
        // comment the next line out for easier response testing
        questionURL = '';
    }
}


function fiveAndKey(foo) {
    if (foo && overlayed) {
        if (foo % 2) {
            $D.setStyle('fiveandkey', 'background-position', 'top right');
        } else {
            $D.setStyle('fiveandkey', 'background-position', 'top left');
        }
        
        foo--;
        setTimeout(function () {fiveAndKey(foo);}, 750);
    }
}
