"use strict";
/*
Global Math, Raphael, document, jQuery, setTimeout
jslint browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, strict: true, newcap: true, immed: true */

(function ($) {
	var sheep, field, game;

// GAME 
game = function () {
	var score = 0,
	    targetScore = 0,
	    increaseScore, 
	    decreaseScore,
	    setTargetScore,
	    getTime,
	    startTime,
	    getScore,
	    displayScore;
	
	startTime = new Date();
	
	setTargetScore = function (int) {
		targetScore = int;
	};
	
	displayScore = function () {
		$("#score").html('<span class="user">' + getScore() + '</span> <span class="total">' + targetScore + '</span>' );		
	};
	
	increaseScore = function () {		
		score = score + 1;
		displayScore();

	};

	decreaseScore = function () {
		score = score - 1;
		displayScore();
	};	
	
	getScore = function () {
	
		return score;
	};
	
	getTime = function () {

		// take current time away from start time
	};
	
	return {
		getTime : getTime,
		getScore : getScore,
		setTargetScore : setTargetScore,
		decreaseScore : decreaseScore,
		increaseScore : increaseScore,
		displayScore : displayScore
	};
};

// SHEEP
sheep = function (paper, x, y, rotation, baseSpeed, field) {
    var node = paper.image("sheep.png", x - 18, y - 13, 38, 27),
        sheepPos = { x : x, y: y, rotation: rotation },
		move,
		projectMove,
		penned = false,
		returnObj = {},
		setState;
		
    node.attr(sheepPos);
    
	projectMove = function (mouse) {
	    var adjside, 
		    oppside, 
			distance, 
			angle, 
			speed = baseSpeed,
			newX,
			newY;
	   
       adjside = mouse.x - sheepPos.x;
       oppside = -1 * ( mouse.y - sheepPos.y);				
       distance = Math.sqrt((adjside * adjside) + (oppside * oppside));
  
	   if(distance < 150) {	
			if(distance < 100) {
			   speed = baseSpeed * 2;
			}				
	        angle = Math.round(Math.atan2(oppside, adjside)/Math.PI*180);
	        angle = (-1*(angle)) - 180;	
	        
			newX = sheepPos.x + (speed * Math.cos(angle*Math.PI/180));
			newY = sheepPos.y + (speed * Math.sin(angle*Math.PI/180));

	        return {
	            x : newX,
	            y : newY,
	            rotation : angle
	        };
	        
		} else {
		    return false;	
		}
				
	};
    
    
	move = function (mouse) {
		var pos = projectMove(mouse);
		
		if(pos !== false) {
			sheepPos.x = pos.x;
			sheepPos.y = pos.y;
			sheepPos.rotation = pos.rotation;
			node.attr({ x : (sheepPos.x - 18), y : (sheepPos.y - 13), rotation : sheepPos.rotation });	
		}
				
	};
	
	setState = function (string) {
		if(string === 'penned' && penned === false) {
			penned = true;
			$(returnObj).trigger("penned");
		} else if(string === 'free' && penned === true){
			penned = false;
			$(returnObj).trigger("free");			
		}
		
	};
	
	// these will be made public
	returnObj.move = move;
	returnObj.projectMove = projectMove;
	returnObj.setState = setState;	
	return returnObj;
 
};


// FIELD 
field = function () {
    var tiles = [],
	    display,
		hittest,
		tilesize = 40;
	
	tiles.push([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,1,2,2,2,1,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,1,2,2,2,1,0,0,0,0,0,1]);
	tiles.push([1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1]);
	tiles.push([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);
	
	
	/* This is only used to provide an overlay of the tiles */	
	display = function () {
	    var i, j, tiles = [], top = 0, left = 0;
		
		for(i = 0; i < tiles.length; i = i + 1) {
		   top = i * tilesize;
		   for(j = 0; j < tiles[i].length; j = j + 1) {		        
		        left = j * tilesize;
		        $("#hedge").append($('<div style="top : '+ top +'px; left : '+ left +'px;" class="tile tile-' + tiles[i][j] + '">' + i + ' x ' + j + '</div>'));	
		   }
		}
	};
	
	hittest = function (pos) {
		var x, y;
	    x = Math.floor(pos.x / tilesize);
		y = Math.floor(pos.y / tilesize);
	
	    return tiles[y][x];
	};
	
	return {
	    display : display,
		hittest : hittest
	};
};
 

$(document).ready(function () {
	var paper = Raphael("field", 640, 480),
	    mouse = { x : 0, y : 0},
		i,
		flock = [],
		field1 = field(),
		game1 = game(),
		move,
		flockSize = 10;
	
	
	game1.setTargetScore(flockSize);
	game1.displayScore();
	//field1.display();
		
		for(i = 0; i<flockSize; i = i + 1) {
		    flock.push(sheep(paper,50 + (Math.random() * 500), 50 + (Math.random() * 200),(Math.random() * 360),5, field1));
		    $(flock[i]).bind('penned', game1.increaseScore );
		    $(flock[i]).bind('free', game1.decreaseScore );
		}
 
		move = function () {
		    var i, pos, hitResult;
		    for(i = 0; i < flock.length; i = i + 1) {
		        pos = flock[i].projectMove(mouse);
		        if (pos !== false) {
                    hitResult = field1.hittest(pos);
                    if (hitResult === 0) {
                        flock[i].move(mouse);
                        flock[i].setState("free");
                    } else if (hitResult === 2) {
                        flock[i].move(mouse);
                        flock[i].setState("penned");
                    } else {
                    } // end if
                } // end if
			} // end for loop
			setTimeout(move, 10);
		};
		
		$(document).mousemove(function (e) {
			mouse.x = e.pageX;
            mouse.y = e.pageY;			
		});
 
 
		$("#field").click(function (e) {
		mouse.x = e.pageX;
                    mouse.y = e.pageY;			
	});		
	move();
	
});
	
}(jQuery));