﻿/*=:project
scalable Inman Flash Replacement (sIFR) version 3, revision 436.

Provides debug information about sIFR.

=:file
Copyright: 2006 Mark Wubben.
Author: Mark Wubben, <http://novemberborn.net/>

=:license
* This software is licensed and provided under the CC-GNU LGPL
* See <http://creativecommons.org/licenses/LGPL/2.1/>    
*/

sIFR.debug = new function() {
	function Errors() {
		this.fire = function(id) {
			if (this[id + 'Alert']) alert(this[id + 'Alert']);
			throw new Error(this[id]);
		};

		this.isFile = 'sIFR: Did not activate because the page is being loaded from the filesystem.';
		this.isFileAlert = 'Hi!\n\nThanks for using sIFR on your page. Unfortunately sIFR couldn\'t activate, because it was loaded '
                        + 'directly from your computer.\nDue to Flash security restrictions, you need to load sIFR through a web'
                        + ' server.\n\nWe apologize for the inconvenience.';
	};

	sIFR.errors = new Errors();

	function log(msg) {
		if (!sIFR.ua.safari && window.console && console.log) console.log(msg);
		else alert(msg);
	}

	this.ua = function() {
		var info = [];

		for (var prop in sIFR.ua) {
			if (sIFR.ua[prop] == Object.prototype[prop]) continue;

			info.push(prop, ': ', sIFR.ua[prop], '\n');
		}

		log(info.join(''));
	};

	this.domains = function() {
		if (sIFR.domains.length == 0) {
			log('No domain verification used.');
			return;
		}

		var domain = sIFR.util.domain();
		var matches = [], nonMatches = [];

		for (var i = 0; i < sIFR.domains.length; i++) {
			var match = sIFR.domains[i];
			if (sIFR.util.domainMatches(domain, match)) matches.push(match);
			else nonMatches.push(match);
		}

		var msg = ['The domain "', domain, '"'];
		if (matches.length > 0) msg.push(' matches:\n* ', matches.join('\n* '));
		if (matches.length > 0 && nonMatches.length > 0) msg.push('\nbut');
		if (nonMatches.length > 0) msg.push(' does not match:\n* ', nonMatches.join('\n* '));
		log(msg.join(''));
	};

	this.ratios = function(kwargs, mergeKwargs) {
		if (mergeKwargs) kwargs = sIFR.util.copyProperties(kwargs, mergeKwargs);

		if (!kwargs.selector && !kwargs.elements) {
			log('Cannot calculate ratios, no selector or element given.');
			return;
		}

		delete kwargs.wmode;
		delete kwargs.transparent;
		delete kwargs.opaque;

		if (kwargs.css) {
			kwargs.css = sIFR.util.convertCssArg(kwargs.css);
			sIFR.util.extractFromCss(kwargs.css, '.sIFR-root', 'leading', true);
		}

		var running = false;
		kwargs.onReplacement = function(cb) {
			if (running) return; // Prevent duplicate results
			running = true;

			sIFR.debug.__ratiosCallback[cb.id] = function(ratios) {
				ratios = '[' + ratios.join(', ') + ']';
				setTimeout(function() {
					var before = new Date();
					prompt('The ratios for ' + kwargs.selector + ' are:', ratios);
					if (sIFR.ua.ie && before - new Date < 200) {
						alert("Press Control+C to copy the text of this alert box. Then paste it into your favorite text editor.\n"
                + "The numbers between the braces, including the braces, are the ratios. You have to add those to your sIFR configuration.\n\n"
                + "Tip: try calculating the ratios in Firefox instead, it'll be easier to copy the ratios.\n\n"
                + ratios);
					}
					cb.resetMovie();
				}, 0);
			};
			cb.call('calculateRatios');
		};

		sIFR.replace(kwargs);
	};

	this.__ratiosCallback = function(id, ratios) {
		if (this.__ratiosCallback[id]) this.__ratiosCallback[id](ratios);
	};

	function verifyResource(uri, fail, ok) {
		if (sIFR.ua.ie && uri.charAt(0) == '/') {
			uri = window.location.toString().replace(/([^:]+)(:\/?\/?)([^\/]+).*/, '$1$2$3') + uri;
		}

		var xhr = new XMLHttpRequest();
		xhr.open('GET', uri, true);
		xhr.onreadystatechange = function() {
			if (xhr.readyState == 4) {
				if (xhr.status != 200) log(fail);
				else log(ok);
			}
		};
		xhr.send('');
	}

	this.test = function(kwargs, mergeKwargs) {
		kwargs = merge(kwargs, mergeKwargs);

		var src = kwargs.src;
		var checked = false;
		if (typeof (src) != 'string') {
			if (src.src) src = src.src;

			if (typeof (src) != 'string') {
				var versions = [];
				for (var version in src) if (src[version] != Object.prototype[version]) versions.push(version);
				versions.sort().reverse();

				var result = '';
				var i = -1;
				while (!result && ++i < versions.length) {
					if (parseFloat(versions[i]) <= ua.flashVersion) result = src[versions[i]];
					var msg = '<' + src[versions[i]] + '>, flash ' + parseFloat(versions[i]);
					verifyResource(src[versions[i]], 'FAILED: ' + msg, 'OK: ' + msg);
				}

				src = result;
				checked = true;
			}
		}

		if (!src) log('Could not determine appropriate source.');
		else if (!checked) verifyResource(src, 'FAILED: <' + src + '>', 'OK: <' + src + '>');
	};

	this.forceTest = function() {
		var replace = sIFR.replace;
		sIFR.replace = function(kwargs, mergeKwargs) {
			sIFR.debug.test(kwargs, mergeKwargs);
			replace.call(sIFR, kwargs, mergeKwargs);
		};
	}
};