// Init Global vars
var FPS = 30;
var Stages = {} ;
var Level = 1 ;
var Layouts = {} ;
var timers = {} ;
var Game = null ;

// -- Init scene prototype
var app = function(opts) {
	
	this.name = "Wyrian - A Tyrian Arcade Game Clone" ;
	this.version = '0.2a' ;
	
	// Init uniqId
	this.uniqId = 0 ;
	
	// Default settings
	var settings = {
		libs: {}
	} ;
	$.extend(true, settings, opts);
	this.settings = settings ;
	
	// Set Scene size
	this.width = $(document).width() ;
	this.height = $(document).height() ;
	
	// Listen for inputs
	this.input = new this.Input() ;
	 
	// Return object
	return this;
} ;

// -- Bind init call
app.prototype.init = function() {
	
	var self = this ;
	
	require({
	      baseUrl: "js/",
	      urlArgs: "bust=" + GameVersion
	    },
	    
	    // -- Layout to load
	    self.settings.layers,
	    
	    // -- All objects are loaded => can run
	    function() {
			$(document).trigger('gameLoaded') ;
		}
	);	
	
	if ( typeof this.settings.init == 'function') {
		this.settings.init() ;
	}
} ;

// -- A log function
app.prototype.log = function(txt) {
	try {
		console.log(txt);
	} catch(e) {} ;
}

// -- Call all canvas updates if declared as 'running'
app.prototype.loopAnimation = function() {	
	
	// -- Search for elements that have to be updated
	Game.activeElements = 0 ;
	for ( var i in Layouts ) {
		var _layout = Layouts[i] ;
		if ( _layout && _layout.running ) {
			_layout.update() ;
		}
	}
	
	// -- Get level
	Level = Math.floor((Game.score||0)/1000) ;
	
	// -- Create ennemies if needed
	var numEnnemies = 0 ;
	if ( Layouts.Ennemies ) {
		for ( var i in Layouts.Ennemies.els ) {
			var _el = Layouts.Ennemies.els[i] ;
			if ( ! _el.deleteAfter ) numEnnemies++ ;
		}
		for ( var i = numEnnemies-1 ; i < Level + 3 ; i++ ) {
			Layouts.Ennemies.createRandom() ;
		}
	}
	
	// -- Init loops counter
	Game.loops = Game.loops||0 ;
	
	// -- Init vars
	if ( Game.loops == 0 ) {
 		this.frameCount = 0;
 		this.fps = 0;
 		this.maxfps = 1 / (FPS / 1000);
 		this.lastTime = new Date();
	}
	
	// -- Calculate time deltas and find fps value
	var nowTime = new Date();
    var diffTime = Math.ceil((nowTime.getTime() - this.lastTime.getTime()));
    if (diffTime >= 1000) {
       this.fps = this.frameCount;
       this.frameCount = 0;
       this.lastTime = nowTime;
    }
    this.frameCount++;
	
	// -- Increase loop counter
	Game.loops++ ;
	
	// -- Refresh Scores and HUD informations
	$('#score span').html(Game.score) ;
	$('#activeElements span').html(Game.activeElements) ;
	$('#fpsCounter span').html(this.fps) ;
}

// -- Bind Inputs
app.prototype.Input = function() {

    this.keyboard = {};
    var that = this;
    this.mousedown = false;
    this.keydown = true;

    // this is handling WASD, and arrows keys
    function update_keyboard(e, val) {
        if(e.keyCode==40 || e.keyCode==83)
            that.keyboard['down'] = val;
        if(e.keyCode==38 || e.keyCode==87)
            that.keyboard['up'] = val;
        if(e.keyCode==39 || e.keyCode==68)
            that.keyboard['right'] = val;
        if(e.keyCode==37 || e.keyCode==65)
            that.keyboard['left'] = val;
        if(e.keyCode==32) {
            that.keyboard['space'] = val;
            e.preventDefault() ;
            e.stopPropagation() ;            
        }
        if(e.keyCode==17)
            that.keyboard['ctrl'] = val;
        if(e.keyCode==13)
            that.keyboard['enter'] = val;
    };

    document.ontouchstart = function(event) {
        that.mousedown = true;
    }
    document.ontouchend = function(event) {
        that.mousedown = false;
    }
    document.ontouchmove = function(event) {}

    document.onmousedown = function(event) {
        that.mousedown = true;
    }
    document.onmouseup = function(event) {
        that.mousedown = false;
    }
    document.onclick = function(event) {
        //that.click(event);
    }
    /*
    document.onmousemove = function(event) {
        that.xmouse = event.clientX;
        that.ymouse = event.clientY;
    }
    */
    document.onkeydown = function(e) {
        that.keydown = true;
        update_keyboard(e, true);
    };
    document.onkeyup = function(e) {
        that.keydown = false;
        update_keyboard(e, false);
    };
    // can be used to avoid key jamming
    document.onkeypress = function(e) {
    	if ( that.keyboard.space ) {
			e.preventDefault() ;
			e.stopPropagation() ;
		}
    };
    // make sure that the keyboard is rested when
    // the user leave the page
    window.onblur = function (e) {
        that.keyboard = {}
        that.keydown = false;
        that.mousedown = false;
    }
}