$(window).on('load', function() {

//Initialize skrollr and save the instance.
var s = skrollr.init({
	edgeStrategy: 'set',
	constants: {
		myconst: 300,
		my500: function() {
			return 500;
		}
	},
	easing: {
		half1: function() {
			return 0.5
		}
	}
});

//Counts how many assertions will be needed for the tests.
var countAssertions = function(tests) {
	var counter = 0;

	for(var i = 0; i < tests.length; i++) {
		var curTest = tests[i];

		if(curTest.styles) {
			$.each(curTest.styles, function() {
				counter++;
			});
		}

		if(curTest.attributes) {
			$.each(curTest.attributes, function() {
				counter++;
			});
		}

		counter += !!curTest.selector;
	}

	return counter;
};

//A meta-test which runs common tests
//which need synchronization of scrolling and rendering.
var scrollTests = function(offset, tests) {
	module('at scroll position ' + offset);

	asyncTest('rendering', function() {
		//We can't run them in parallel,
		//because they would interfere with each others scroll top offset.
		stop();

		expect(countAssertions(tests));

		//Scroll to offset, which will cause rendering (sooner or later)
		s.setScrollTop(offset, true);

		s.on('render', function(info) {
			//Prevent another render event. Only need one for test.
			s.off('render');

			for(var i = 0; i < tests.length; i++) {
				var curTest = tests[i];

				if(curTest.styles) {
					$.each(curTest.styles, function(k) {
						QUnit.numericCSSPropertyEquals(curTest.element.css(k), curTest.styles[k], curTest.message || 'element\'s (#' + curTest.element[0].id + ') "' + k + '" CSS property is correct');
					});
				}

				if(curTest.attributes) {
					$.each(curTest.attributes, function(k, value) {
						console.log(curTest.element.prop(k));
						QUnit.numericCSSPropertyEquals(curTest.element.attr(k), curTest.attributes[k], curTest.message || 'element\'s (#' + curTest.element[0].id + ') "' + k + '" attribute is correct');
					});
				}

				if(curTest.selector) {
					ok(curTest.element.is(curTest.selector), 'element matches "' + curTest.selector + '"');
				}
			}

			start(2);
		});
	});
};

//
// Now the actual tests.
//

//Add one element dynamically
var newElement = $('<div id="dynamic" data-0="bottom:0px;" data-250="bottom:100px;">TEST</div>').appendTo('body');
s.refresh(newElement[0]);

module('basic stuff');

test('CSS classes present', function() {
	strictEqual($('.skrollable').length, 23, 'All elements have the .skrollable class');

	ok($('html').is('.skrollr'), 'HTML element has skrollr class');
	ok($('html').is(':not(.no-skrollr)'), 'HTML element does not have no-skrollr class');
});

scrollTests(500, [
	{
		message: 'colons inside urls are preserved (#73)',
		element: $('#colon-url'),
		styles: {
			backgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png)'
		}
	},
	{
		message: 'a single period is no number (#74)',
		element: $('#period-number'),
		styles: {
			backgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png?1337)'
		}
	},
	{
		element: $('#simple-numeric'),
		styles: {
			left: '100px',
			top: '50px'
		}
	},
	{
		element: $('#easing'),
		styles: {
			left: '25px'
		}
	},
	{
		element: $('#compound-numeric'),
		styles: {
			marginTop: '30px',
			marginRight: '20px',
			marginBottom: '10px',
			marginLeft: '0px'
		}
	},
	{
		element: $('#rgb-color'),
		styles: {
			color: 'rgb(50, 100, 150)'
		}
	},
	{
		element: $('#rgba-color'),
		styles: {
			color: 'rgba(50, 100, 150, 0.5)'
		}
	},
	{
		element: $('#hsl-color'),
		styles: {
			color: 'rgb(191, 63, 63)'
		}
	},
	{
		element: $('#no-interpolation'),
		styles: {
			right: '100px'
		}
	},
	{
		element: $('#anchor-2'),
		styles: {
			right: '200px'
		}
	},
	{
		element: $('#foreign-anchor'),
		styles: {
			paddingTop: '100px',
			paddingRight: '100px',
			paddingBottom: '100px',
			paddingLeft: '100px'
		}
	},
	{
		element: $('#float'),
		styles: {
			float: 'left'
		}
	},
	{
		message: 'z-index "auto" is no converted to a number (#351)',
		element: $('#auto-z-index'),
		styles: {
			zIndex: 'auto'
		}
	},
	{
		message: 'attribute interpolation',
		element: $('#attr'),
		attributes: {
			title: '0'
		}
	}
]);

scrollTests(0, [
	{
		element: $('#simple-numeric'),
		styles: {
			left: '-100px',
			top: '0px'
		}
	},
	{
		element: $('#easing'),
		styles: {
			left: '25px'
		}
	},
	{
		element: $('#compound-numeric'),
		styles: {
			marginTop: '0px',
			marginRight: '10px',
			marginBottom: '20px',
			marginLeft: '30px'
		}
	},
	{
		element: $('#rgb-color'),
		styles: {
			color: 'rgb(0, 0, 0)'
		}
	},
	{
		element: $('#rgba-color'),
		styles: {
			color: 'rgba(0, 0, 0, 0.2)'
		}
	},
	{
		element: $('#hsl-color'),
		styles: {
			color: 'rgb(0, 0, 0)'
		}
	},
	{
		element: $('#no-interpolation'),
		styles: {
			right: '0px'
		}
	},
	{
		element: $('#end'),
		styles: {
			fontSize: '10px'
		}
	},
	{
		element: newElement,
		styles: {
			bottom: '0px'
		}
	},
	{
		element: $('#float'),
		styles: {
			float: 'none'
		}
	},
	{
		message: 'z-index "auto" is no converted to a number (#351)',
		element: $('#auto-z-index'),
		styles: {
			zIndex: '1'
		}
	},
	{
		message: 'attribute interpolation',
		element: $('#attr'),
		attributes: {
			title: '500',
			'data-test': 'skrollr'
		}
	}
]);

scrollTests(250, [
	{
		element: $('#simple-numeric'),
		styles: {
			left: '0px',
			top: '25px'
		}
	},
	{
		element: $('#easing'),
		styles: {
			left: '25px'
		}
	},
	{
		element: $('#compound-numeric'),
		styles: {
			marginTop: '15px',
			marginRight: '15px',
			marginBottom: '15px',
			marginLeft: '15px'
		}
	},
	{
		element: $('#rgb-color'),
		styles: {
			color: 'rgb(25, 50, 75)'
		}
	},
	{
		element: $('#rgba-color'),
		styles: {
			color: 'rgba(25, 50, 75, 0.35)'
		}
	},
	{
		element: $('#hsl-color'),
		styles: {
			color: 'rgb(79, 47, 47)'
		}
	},
	{
		element: $('#no-interpolation'),
		styles: {
			right: '0px'
		}
	},
	{
		element: $('#anchor-2'),
		styles: {
			right: '100px'
		}
	},
	{
		element: newElement,
		styles: {
			bottom: '100px'
		}
	},
	{
		element: $('#foreign-anchor'),
		styles: {
			paddingTop: '150px',
			paddingRight: '150px',
			paddingBottom: '150px',
			paddingLeft: '150px'
		}
	},
	{
		element: $('#float'),
		styles: {
			float: 'none'
		}
	},
	{
		message: 'attribute interpolation',
		element: $('#attr'),
		attributes: {
			title: '250',
			'data-test': 'skrollr'
		}
	}
]);

//bottom-top + 50%
scrollTests(150, [
	{
		element: $('#relative-percentage-offset'),
		styles: {
			left: '250px'
		}
	}
]);

//200%
scrollTests(600, [
	{
		element: $('#percentage-offset'),
		styles: {
			left: '500px'
		}
	},
	{
		message: 'attribute interpolation',
		element: $('#attr'),
		attributes: {
			'data-test': 'skrollr-test'
		}
	}
]);

//100%
scrollTests(300, [
	{
		element: $('#percentage-offset'),
		styles: {
			left: '250px'
		}
	}
]);

//We scroll to a ridiculous large position so that the browser cuts it at the actual position.
var maxScrollHeight = s.setScrollTop(1e5) && s.getScrollTop();

scrollTests(maxScrollHeight, [
	{
		element: $('#anchor-1'),
		styles: {
			right: '100px'
		}
	},
	{
		element: $('#easing'),
		styles: {
			left: '50px'
		}
	},
	{
		element: $('#easing_with_easing_strategy'),
		styles: {
			left: '25px'
		}
	},
	{
		element: $('#reset-strategy'),
		styles: {
			left: '1337px'
		}
	}
]);


});//DOM ready