//alert('successfully included expose'); //debug

window.expose = function(obj, output_to, mWidth){
  /*
    Descrip: Expose DOM Object Properties and Methods
    Author: Thomas Ballard, http://thomas.ballard.ws
    © Copyright 2002-2007  E.S.Q. Software, http://www.esqsoft.com
    More Web Stuff: Tools, How-To, Design, Games, Hosting @ http://esqsoft.com

    Usage:
      include this library in the page you want to test (you can include it remotely if you are nice, my paypal is... j/k ;-)
        ex: <script src="http://esqsoft.com/tools/expose.js"></script>

      call expose method, passing object and optional HTML container for results
        ex 1: (simplest)

              "<script>expose(window)</script>"
              (this will create a div at the bottom of your document and populate it with 
               the properties of the "window" object, in this case.)

        ex 2: (or you can direct output to your own containers)
              "<script>expose(location,document.getElementById("my_results_container"))</script>"
  */

  if(!obj){ alert('error: missing object'); return }
  if(typeof(obj) != 'object'){ alert('error: es necesario pasar el objeto como objeto'); return }
  //debugger;
  /*
    // crawl obj's parent chain and try to establish a persistent connection for accessing nested properties after the fact
    pobj = obj (hmmm... no such luck... developing)
  */

  var w = (mWidth || 600) + 'px'; if(mWidth && mWidth.match && mWidth.match(/\%|px/)) w = mWidth
  var str = ''

  +'<table cellspacing="1" cellpadding="2" '
  +'  style="width:'+w+'; table-layout:fixed; background:#ddd;">' /* too late for defining css class */

  var s =  obj.nodeName || obj || '?'
  if(s){ 
    str += '<tr style="background:#aaa;">'
    +'<td colspan="2" style="color:#fff; font-weight:bold;">' + s +'</td></tr>'
  }

  str += ''
  +'<tr style="background:#aaa;">'
  +'<td width="150" style="color:white; font-weight:bold;">Property</td>'
  +'<td style="color:white;"><font style="font-weight:bold;">Value</font>'
  if(window.clipboardData) str+='&nbsp;&nbsp;&nbsp;&nbsp;(click prop or value to cut/paste)'
  +'</td></tr>'

  for(var i in obj){
    try{ /* IE7 was blowing up on certain values added this try/catch block to mitigate */
      var tmp = '(error)'
      var clk = 'return ivnHClick(this)'
      if(i.match && i.match(/^(expose|header|footer|ivn|dygolk|ad_)/))
        tmp = '(excluding as a known custom method or property)'
      else{
        try{ tmp = obj[i] } catch(e){}
  
        // allow nested objects to be exposed
        var tmp2 = tmp; if(tmp2 && typeof(tmp2)!='string'){
          tmp2=tmp2.toString();
          if(tmp2.match(/\[object/)){
            clk = 'expose('+eval(obj).i+'); return false'; 
          } 
        }
      }
      str += ''
      +'<tr>'
      +'<td onclick="'+clk+'" '
      +'  style="background:#ccc; font-family:arial,sans-serif;font-size:9px;cursor:pointer;" '
      +'>'+i+'</td>'
      +'<td style="background:#eee;" '
      +'><xmp onclick="'+clk+'" '
      +'  style="margin:0; font-family:arial,sans-serif;font-size:9px;cursor:pointer;" '
      +'>'+tmp+'</xmp></td>'
      +'</tr>'
    } catch(e){ 
      str+='<tr><td colspan="2" style="background:#fcc; font-family:arial,sans-serif;font-size:9px;">'
      +'Error: catch handler processed exception while polling "'+i+'", caught "'+e+'"'
      +'</td></tr>'
    }
  }

  str += ''
  +'<tr>'
  +'<td align="right" colspan="2" '
  +' style="background:#eee; font-family:arial; font-size:7pt;">'
  +' &lt;&lt; <a href="" onclick="return ivnHClick(this,1)">Copiar detalle del error en el portapapeles</a> &gt;&gt;'
  +'<br><b>ITEC</b>: Sistema Experto CTE'
  +'</td>'
  +'</tr>'
  str += '</table>'

  if(output_to){
    if(output_to == 'popup'){
      esqExpChild = window.open()
      esqExpChild.document.write(str)
      esqExpChild.document.close()
      return
    }
    else obj = output_to
  }

  if(obj && obj.tagName && obj.tagName.match(/(DIV|SPAN|TD|BODY|P)/)){} else obj = document.body
  if(obj && obj.innerHTML !== undefined) obj.innerHTML += str 
  else{
    str = '<html><head></head><body><sc'+'ript>if(!window.ivnHClick){window.ivnHClick = '+window.ivnHClick+'}</sc'+'ript>'+str+'</body></html>'
    document.write(str)
  }
}



window.ivnHClick = function(obj, getCode){

  /* nested object? */
  var s = obj.innerHTML; if(s.match(/\[object/)){ 
    expose(obj)
  }

  if(obj){
    if(window.clipboardData){
      var str = obj.innerHTML || 0
      if(getCode) str = document.getElementById("mensajesErrorJavascript").innerHTML;
      if(!str) return
      var bResult = window.clipboardData.setData('Text',str); 
      if(!this.init){ this.init=1; alert('Codigo copiado al portapapeles.\nPresione CTRL-V para pegar su contenido donde lo desee.\n') }
    }
    else{
      try{ obj.innerHTML.select(); } catch(e){}
    }
  }

  return false
}



window.errorHandler = function(e) {
  if(!e){ 
    try{ 
        e= window.event;
    }catch(e){ 
        alert('error: your browser crashed js, but won\'t tell why'); return
    }
  }//if
  try{
    var evt = window.event;
    if (evt != undefined)
    {
        var objmsg = document.getElementById("mensajesErrorJavascript");
        if(evt.type == 'error')
        {
            var fallo_txt = '({"errorMessage" : "' + evt.errorMessage + '", "errorUrl" : "' + evt.errorUrl + '", "errorLine" : "' + evt.errorLine + '","errorCode" : "' + evt.errorCode + '"})';
            var fallo = eval(fallo_txt);
            expose(fallo, objmsg);
        }
    }
    else
    {
        alert('Unexpected Error: '+ e);
    } 
  }catch(fail){
    alert('Unexpected Error: '+ fail);
  }
  
  return true;
}
window.onerror = window.errorHandler;




