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

    };

  }

};




