goog.require('goog.array');
goog.require('goog.dom');
goog.require('goog.events');
goog.require('goog.math');
goog.require('goog.style');

IMAGES_ = [
    'http://farm4.static.flickr.com/3581/3553718234_30b46aed60_m.jpg',
    'http://farm4.static.flickr.com/3608/3552911845_4c011ae4a2_m.jpg',
    'http://farm4.static.flickr.com/3365/3553719978_9da26f82b0_m.jpg',
    'http://farm4.static.flickr.com/3590/3553720784_6cf2ff94dc_m.jpg',
    'http://farm4.static.flickr.com/3392/3552914203_b14232806f_m.jpg',
    'http://farm3.static.flickr.com/2015/3553722402_62599e1ca3_m.jpg',
    'http://farm4.static.flickr.com/3314/3552915891_64659b49dc_m.jpg',
    'http://farm3.static.flickr.com/2459/3552916811_588708dd31_m.jpg',
    'http://farm4.static.flickr.com/3347/3553724996_a720eaf524_m.jpg',
    'http://farm4.static.flickr.com/3381/3553725958_56d9d24d07_m.jpg',
    'http://farm4.static.flickr.com/3553/3552919581_a8ae1326d1_m.jpg',
    'http://farm3.static.flickr.com/2421/3552920493_b23bfdc91d_m.jpg',
    'http://farm4.static.flickr.com/3353/3552921305_f2843f477b_m.jpg'];

function go () {
    var img = goog.dom.getElement('img');
    var msg = goog.dom.getElement('msg');
    var follower = new Follower(img, IMAGES_);
    
    goog.array.forEach(IMAGES_, loadImage);
    var frozen = goog.dom.getElement('frozen');
    if (frozen) {
      goog.style.showElement(frozen, false);
    }
      goog.style.showElement(msg, false);
}

function loadImage(src) {
    var img = goog.dom.createElement('img');
    img.src = src;
}

function Follower(elem, photoMap) {
    this.elem_ = elem;
    this.photoMap_ = photoMap;
    goog.events.listen(goog.dom.getDocument().body, 'mousemove',
		       goog.bind(this.handleMouseMove_, this));
};

Follower.prototype.handleMouseMove_ = function(e) {
    var elemRect = goog.style.getBounds(this.elem_);
    var eventCoord = new goog.math.Coordinate(e.clientX, e.clientY);

    var elemCenter = new goog.math.Coordinate(
	elemRect.left + elemRect.width / 2,
	elemRect.top + elemRect.height / 2);

    var overBox = elemRect.toBox().contains(eventCoord);
    goog.style.showElement(goog.dom.getElement('msg'), overBox);
    if (overBox) {
      this.setPhoto_(0);
      return;
    }
    var diff = goog.math.Coordinate.difference(eventCoord, elemCenter);
    diff.y = -diff.y;

    var radians;
    if (diff.x == 0) {
	if (diff.y > 0) {
	    radians = Math.PI / 2;
	} else {
	    radians = - Math.PI / 2;
	}
    } else {
	var slope = diff.y / diff.x;
	radians = Math.atan(slope);
	
	if (diff.x < 0) {
	    radians = radians + Math.PI;
	}
    }

    var val = goog.math.modulo(radians / (2 * Math.PI), 1);
    val = goog.math.modulo(Math.round(val * 12 - 3), 12);
    // counter clockwise to clockwise
    val = Math.abs(val - 12);

    if (val == 0) val = 12;
    this.setPhoto_(val)
}

Follower.prototype.setPhoto_ = function(index) {
    this.elem_.src = this.photoMap_[index];
};