
// require_once 'classes/Math.js';
// require_once 'classes/ProjectileLab/Question.js';

ProjectileLab = {
    
    Version: '1.0.0',
    Author: 'Edward Z. Yang',
    
    plot_interval: .01,
    plot_interval_low: .02,
    animate_interval: 10,
    needs_low: ['Explorer', 'Opera'],
    low_mode: null,
    
    // in pixels, must match values in CSS
    height: 200,
    width: 500,
    px_per_meter: 5,
    
    plotProjectile: function (speed, angle, height, range, x_offset) {
        
        if (this.low_mode === null) {
            if (this.needs_low.include(BrowserDetect.browser)) {
                this.low_mode = true;
                this.plot_interval = .02; // lower resolution
            } else {
                this.low_mode = false;
            }
        }
        
        if (!x_offset) x_offset = 0;
        
        // some bound checking
        if (angle  < 0  ||
            angle  > 90 ||
            height < 0  ||
            speed  < 0  ||
            range  < 0
        ) {
            return Array();
        }
        if (height == 0 && (angle == 0 || speed == 0)) {
            return Array(Array(x_offset,0));
        }
        
        var rad = angle * Math.RpD;
        var speed_x = speed * Math.cos(rad);
        var speed_y = speed * Math.sin(rad); // will change
        var x_max = this.width / this.px_per_meter;
        
        var x = 0;
        var y = height;
        var points = Array();
        points.push(Array(x + x_offset, y));
        
        // i is time in seconds
        for (i = 0; y >= 0; i += this.plot_interval) {
            x = speed_x * i;
            y = height + speed_y * i - 4.9 * i * i;
            points.push(Array(x + x_offset, y));
            if (x > x_max) break;
            if (x > range) break;
        }
        
        return points;
    },
    
    animateProjectile: function (id, points, speedOfTank, distanceToTank) {
        
        // speedOfTank and distanceToTank are optional
        
        // nothing to do
        if (points.length == 0) return;
        
        // plot the points
        var area = $(id);
        var dots = Array();
        for (i = 0; i < points.length; i++) {
            var dot = document.createElement('div');
            dot.className = 'hidden-dot';
            ProjectileLab.setCoordinates(dot, points[i]);
            area.appendChild(dot);
            dots.push(dot);
        }
        
        // animate the points
        var frame = -1; // first increment clicks up to zero
        var callback = function () {
            if (++frame >= dots.length) {
                clearInterval(interval_id1);
                clearInterval(interval_id2);
                clearInterval(interval_id3);
                clearInterval(interval_id4);
                clearInterval(interval_id5);
                animationEnd();
                return;
            }
            dots[frame].className = 'dot';
            if (speedOfTank) { // animate the tank
                ProjectileLab.setCoordinates($('tank'),
                    [distanceToTank - speedOfTank * frame *
                        ProjectileLab.plot_interval, 0],
                    ProjectileLab.calculateTargetOffset());
            }
        };
        
        var interval_id1 = setInterval(callback, this.animate_interval);
        var interval_id2 = setInterval(callback, this.animate_interval);
        var interval_id3 = setInterval(callback, this.animate_interval);
        var interval_id4 = setInterval(callback, this.animate_interval);
        var interval_id5 = setInterval(callback, this.animate_interval);
    },
    
    setCoordinates: function(element, point, offset) {
        if (!point[0]) point[0] = 0;
        if (!point[1]) point[1] = 0;
        if (!offset) offset = Array();
        if (!offset[0]) offset[0] = 0;
        if (!offset[1]) offset[1] = 0;
        var left   = (Math.roundPlaces(point[0] * ProjectileLab.px_per_meter, 2) + offset[0]) + "px";
        var bottom = (Math.roundPlaces(point[1] * ProjectileLab.px_per_meter, 2) + offset[1]) + "px";
        var style = 'left: ' + left + ';' +
                    'bottom: ' + bottom + ';';
        if ( typeof( element.style.cssText ) != 'undefined' ) {
            element.style.cssText = style;
        } else {
            element.setAttribute('style', style);
        }
    },
    
    target_size: 25, // target must be square
    
    generateTarget: function(answer) {
        var target = document.createElement('div');
        ProjectileLab.setCoordinates(target, answer, ProjectileLab.calculateTargetOffset());
        target.className = 'target';
        return target;
    },
    
    calculateTargetOffset: function () {
        var i = - (ProjectileLab.target_size - 1) / 2 + 1;
        return [i, i];
    }
    
}

function animationEnd() {}
