/*
    Usage:
      remote include this library (ex: <scr_pt src="http://esqsoft.com/tools/expose.js"></scr_pt>)
      call expose method, passing object and optional HTML container for results
        <sc_ipt>expose(location,document.getElementById("r"))</sc_ipt>
*/
window.expose = function(obj, output_to, mWidth){

  if(!obj){ alert('error: missing object'); return }
  if(typeof(obj) != 'object'){ alert('error: must pass object as an object'); return }
  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-color:#dddddd;">' /* too late for defining css class */
  +'<tr style="background-color:#aaaaaa;">'
  +'<td width="150" style="color:white; font-weight:bold;">Property</td>'
  +'<td style="color:white;"><font style="font-weight:bold;">Value</font>&nbsp;&nbsp;&nbsp;&nbsp;(click prop or value to cut/paste)</td></tr>'

  for(var i in obj){
    var tmp = '(error)'
    if(i.match(/^(expose|header|footer|ivn|dygolk|ad_)/))
      tmp = '(excluding as a known custom method or property)'
    else{
      try{ tmp = obj[i] } catch(e){}
    }
    str += ''
    +'<tr>'
    +'<td onclick="return ivnHClick(this)" '
    +'  style="background-color:#cccccc; font-family:verdana, sans-serif; font-size:8pt; cursor:hand;" '
    +'>'+i+'</td>'
    +'<td style="background-color:#eeeeee;" '
    +'><xmp onclick="return ivnHClick(this)" '
    +'  style="margin:0; font-family:verdana, sans-serif; font-size:8pt; cursor:hand;" '
    +'>'+tmp+'</xmp></td>'
    +'</tr>'
  }

  str += ''
  +'<tr>'
  +'<td align="right" colspan="2" '
  +' style="background-color:#eeeeee; font-family:arial; font-size:7pt;">'
  +'Script: <b>Expose</b> (expose DOM element)'
  +' -- &lt;&lt; <a href="" onclick="return ivnHClick(this,1)">click here to copy code</a> &gt;&gt;'
  +'<br><b>JavaScript Error Reporting</b>: kennyng.sytes.net'
  +'</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){
  if(obj && window.clipboardData){
    var str = obj.innerHTML || 0
    if(getCode) str = '<scr'+'ipt src="http://esqsoft.com/tools/expose.js"></scr'+'ipt>\n<scr'+'ipt>expose(location)</scr'+'ipt>'
    if(!str) return
    var bResult = window.clipboardData.setData('Text',str); 
    if(!this.init){ this.init=1; alert('The code has been copied to your clipboard.\nPress CTRL-V to paste the code in your page.\n(This message won\'t display again.)') }
  } else { alert('error: Your browser doesn\'t appear to support this'); }

  return false
}



window.errorHandler = function(e) {
  if(!e){ try{ e=event }catch(e){ alert('error: your browser crashed js, but won\'t tell why'); return}}
  alert('Unexpected Error: '+e);
  return true;
}
window.onerror = window.errorHandler;