var temp = function(o, c){
    if(o && c && typeof c == 'object'){
        for(var p in c) { o[p] = c[p]; }
    }
    return o;
}(Function.prototype, {
    delegate : function(obj, args, appendArgs){
        var method = this;
        return function() {
            var callArgs = args || arguments;
            if(appendArgs === true){
                callArgs = Array.prototype.slice.call(arguments, 0);
                callArgs = callArgs.concat(args);
            }else if(typeof appendArgs == "number"){
                callArgs = Array.prototype.slice.call(arguments, 0);
                var applyArgs = [appendArgs, 0].concat(args);
                Array.prototype.splice.apply(callArgs, applyArgs);
            }
            return method.apply(obj || window, callArgs);
        };
    }
});

/**
 * «Мухоконтроллер»
 * @author ter [terart.net.ua]
 **/

var flyController = function() {
	var direct_time = 2000,
		step_time = 200,
		dx = 1,
		// мухоконфиг
		flyes = {
			f1 : {
				box : { top : 100, left : 100, width : 225, height : 250 }
			},
			f2 : {
				box : {	top : 300, left : 200, width : 370, height : 165 }				
			},
			f3: {
				box : {	top : 5, left : 350, width : 225, height : 90 }				
			}, 
			f4: {
				box : {	top : 80, left : 180, width : 400, height : 300	}				
			},
			f5: {
				box : {	top : 360, left : 455, width : 100, height : 100 }				
			}
		};
	
	return {
		init : function() {
			for (var k in flyes) {
				var box = flyes[k].box;
				var fly = $('<div class="fly"></div>').appendTo('body');
				
				flyes[k] = {
					fly 			: fly,
					box				: box,
					current_point	: {
										x : box.left,
										y : box.top
									  },
					direct_point	: {
										x : box.left + box.width,
										y : box.top	+ box.height				
									  }				
				}
			}
			
			window.setInterval(this.nextDirect.delegate(this), direct_time);
			window.setInterval(this.nextPoint.delegate(this), step_time);	
		},
		nextPoint: function() {
			for (var k in flyes) {		
				var current_point = flyes[k].current_point;
				var direct_point = flyes[k].direct_point;

				var nx = (current_point.x < direct_point.x) ? current_point.x + dx : current_point.x - dx;
				var ddx = (direct_point.x - current_point.x) != 0 ? (direct_point.x - current_point.x) : 1;
				var ny = ((nx - current_point.x) * (direct_point.y - current_point.y))/ddx + current_point.y;
				
				flyes[k].current_point = {
					x : nx,
					y : ny
				}
				
				flyes[k].fly.css({
					top: flyes[k].current_point.y,
					left: flyes[k].current_point.x
				});
			}
		},
		nextDirect: function() {
			for (var k in flyes) {	
				var box = flyes[k].box;
				flyes[k].direct_point = {
					x : box.left + Math.round(Math.random() * box.width),
					y : box.top + Math.round(Math.random() * box.height)
				};
			}
		}
	}
}();

$(document).ready(flyController.init.delegate(flyController));
