// code yanked from the Yahoo media player. Thanks, Yahoo.
// via http://ajaxian.com/archives/graceful-degradation-of-firebug-console-object
if (! ("console" in window) || !("firebug" in console)) {
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group"
                 , "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
    for (var i = 0; i <names.length; ++i) window.console[names[i]] = function() {};
}

// Load global object
if (app == undefined)
{
	var app = {};
}

// Load global command object
app.stage = {
        position: {
            	bottom_right: {top: -400, left: -1940, copy: {top: 80, left: 60, width: 280}, next_id: "top_right", current_id: "bottom_right"}, // bottom_right
            	bottom_center: {top: -400, left: -970, copy: {top: 60, left: 540, width: 380}, next_id: "bottom_right", current_id: "bottom_center"}, // bottom_center
            	bottom_left: {top: -400, left: 0, copy: {top: 70, left: 70, width: 260}, next_id: "bottom_center", current_id: "bottom_left"}, // bottom_left
            	top_left: {top: 0, left: 0, copy: {top: 100, left: 700, width: 200}, next_id: "bottom_left", current_id: "top_left"}, // top_left		            	
            	top_center: {top: 0, left: -970, copy: {top: 70, left: 60, width: 220}, next_id: "top_left", current_id: "top_center"}, // top_center		            			 
            	top_right: {top: 0, left: -1940, copy: {top: 70, left: 760, width: 220}, next_id: "top_center", current_id: "top_right"} // top_right
		},
		default_position: "bottom_center",
		move: {
			left: 37,
			up: 38,
			right: 39,
			down: 40,
			is_from_center: function()
			{				
				return ($('.case:visible').hasClass('center'));
			},
			is_from_left: function()
			{				
				return ($('.case:visible').hasClass('left'));
			},
			is_from_right: function()
			{				
				return ($('.case:visible').hasClass('right'));
			},
			is_from_top: function()
			{				
				return ($('.case:visible').hasClass('top'));
			},
			is_from_bottom: function()
			{				
				return ($('.case:visible').hasClass('bottom'));
			}			
		},
		first_run: true,
        /**
         * Preload
         * @see http://stackoverflow.com/questions/3877027/jquery-callback-on-image-load-even-when-the-image-is-cached
         */
        run: function()
        {
            console.log('run with' + Env.stylesheetDirectory);
            // Prepare page for Javascript
            // enable JS preloader and style
            $("#preloader").show();
            $("h3").addClass('blue');
            // preload 
            $("<img src='"+Env.stylesheetDirectory+"/images/stage_content.jpg'/>")
            .one('load', function(){
                app.stage.init()
            }).each(function(){
                if (this.complete)
                {
                    $(this).load();
                }
            })
        },
		init: function()
		{			
            var dfd = $.Deferred();
            var actions = {
                removePreloader: function()
                {
                    $("#preloader").remove();
                },
                presentActor: function()
                {
                    $('<div id="actor"></div>')                    
                    .prependTo("#stage");
                },
                hideCases: function()
                {
                    $('.case').hide(0);
                },
                addEvents: function()
                {
                    // Bind arrow keys
                    //37 - left
                    //38 - up
                    //39 - right
                    //40 - down
                    $(document).keydown(function(e){
                        if (e.keyCode > 36 && e.keyCode <= 40)
                        {
                            if (app.stage.move.is_from_center)
                            {
                                switch (e.keyCode)
                                {
                                    case app.stage.move.left:
                                        console.log('is left');								
                                        if (app.stage.move.is_from_center())
                                        {
                                            if (app.stage.move.is_from_top())
                                            {									
                                                app.stage.update(app.stage.position.top_left);
                                            }
                                            else if (app.stage.move.is_from_bottom())
                                            {									
                                                app.stage.update(app.stage.position.bottom_left);								
                                            }	
                                        } else if (app.stage.move.is_from_right()){
                                            if (app.stage.move.is_from_top())
                                            {									
                                                app.stage.update(app.stage.position.top_center);								
                                            }
                                            else if (app.stage.move.is_from_bottom())
                                            {									
                                                app.stage.update(app.stage.position.bottom_center);								
                                            }	
                                        } else {
                                            app.stage.warn();
                                        }

                                        break;
                                    case app.stage.move.down:
                                        console.log('is down');
                                        if (app.stage.move.is_from_top())
                                        {
                                            if (app.stage.move.is_from_center())
                                            {									
                                                app.stage.update(app.stage.position.bottom_center);								
                                            }
                                            else if (app.stage.move.is_from_left())
                                            {								
                                                app.stage.update(app.stage.position.bottom_left);											
                                            } 
                                            else if (app.stage.move.is_from_right())
                                            {
                                                app.stage.update(app.stage.position.bottom_right);
                                            }									
                                        } else {
                                            app.stage.warn();
                                        }
                                        break;
                                    case app.stage.move.up:
                                        console.log('is up');
                                        if (app.stage.move.is_from_bottom())
                                        {
                                            if (app.stage.move.is_from_center())
                                            {									
                                                app.stage.update(app.stage.position.top_center);								
                                            }
                                            else if (app.stage.move.is_from_left())
                                            {								
                                                app.stage.update(app.stage.position.top_left);											
                                            } 
                                            else if (app.stage.move.is_from_right())
                                            {
                                                app.stage.update(app.stage.position.top_right);
                                            }									
                                        } else {
                                            app.stage.warn();
                                        }
                                        break;
                                    case app.stage.move.right:
                                        console.log('is right');
                                        if (app.stage.move.is_from_center())
                                        {
                                            if (app.stage.move.is_from_top())
                                            {									
                                                app.stage.update(app.stage.position.top_right);								
                                            }
                                            else if (app.stage.move.is_from_bottom())
                                            {									
                                                app.stage.update(app.stage.position.bottom_right);								
                                            }	
                                        } else if (app.stage.move.is_from_left()){
                                            if (app.stage.move.is_from_top())
                                            {									
                                                app.stage.update(app.stage.position.top_center);								
                                            }
                                            else if (app.stage.move.is_from_bottom())
                                            {									
                                                app.stage.update(app.stage.position.bottom_center);								
                                            }	
                                        } else {
                                            app.stage.warn();
                                        }
                                        break;
                                }			    		

                            } else {
                                console.log('is at edge');

                            }
                            return false;
                        }			    
                    });                    
                },
                addUxEvents: function()
                {
                    $("#actor")
                    .data("next_move", app.stage.default_position)
                    .click(function(){	

                        var case_item = null;

                        if (app.stage.first_run)
                        {						
                            case_item = app.stage.position[app.stage.default_position];
                        } else {
                            case_item = app.stage.position[$("#actor").data("next_move")];						
                        }
                        app.stage.update(case_item);
                        app.stage.first_run = false;
                    })
                    .click();
                }                
            }
            console.log('run init');
            
            // run init sequence
            dfd.done(
                actions.removePreloader,
                actions.presentActor,
                actions.hideCases,
                actions.addEvents,
                actions.addUxEvents
            ).resolve();

		},
        warn: function()
        {
            $("#stage").effect("shake",{"distance": 4, "times": 3},100,function(){});  
        },
		update: function(case_item, class_name)
		{			
			if (case_item === undefined)
			{
				console.log('yes, it\'s undefined alright ');
												
			} else if (case_item === null){
				console.log('is like, totally null');	
			}
			console.log(case_item);	
			// Use case item
			var dfd = $.Deferred();
			var actions = {
				move_bg: function()
				{
					console.log('move bg');
					// Move case graphic
					$("#actor")					
					.data("next_move", case_item.next_id)
					.stop()
					.animate({backgroundPosition : case_item.left + "px " + case_item.top +" px"},1200);
				},
				move_copy: function()
				{
					console.log('move copy' + case_item.current_id);
					// Move case copy
					$('#stage')
						.find('.case')
						.hide(0)
					.end()	
					.find("." + case_item.current_id)
						.css('top', '0px')
						.css('left', '0px')
						.show(300)
						.animate({left : case_item.copy.left + "px", top: case_item.copy.top + "px", width: case_item.copy.width},300);					
					
				}					
			}
			dfd.done(actions.move_bg, actions.move_copy).resolve();			
		}
}
