	/*=: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);
	    };
	  }
	};
