var _melative_nick = 'RyanA';
var _mygrad,_dgrad;

function getObjectProperty(o, index)
{
  for(var i in o )
  {
   if( index == 0 )
    return i;
   index--;
  }
  return null;
}

function filterObjectProperties(o, filter, index)
{
  if( !index ) index = 0;
  var obj = {};
  for( var i in o )
  {
    var p = getObjectProperty(o[i],index);
    if(filter.indexOf(p))
    {
      if( !obj[p] )
        obj[p] = [];
      
      obj[p].push(o[i][p]);
    }
  }
  return obj;
}

// gay xbrowser compat
var xb = {
  dim: function(n) {
    if( n ) {
      if( n['offsetWidth'] ) {
        return [n.offsetWidth, n.offsetHeight];
      } return [-1,-1];
    } else if( window['innerWidth'] ) {
      return [window.innerWidth,window.innerHeight];
    } else if( document.documentElement && (document.documentElement.clientWidth) ) {
      return [document.documentElement.clientWidth, document.documentElement.clientHeight];
    } else if( document.body && (document.body.clientWidth) ) {
      return [document.body.clientWidth, document.body.clientHeight];
    }
  },
  pos: function(n) {
   if( n && n['offsetLeft'] ) {
     var l = t = 0;
     var p = n;
     do {
       l += p.offsetLeft; t += p.offsetTop;
     } while ( p = p.offsetParent );
     return [l,t];
   }
   return [-1,-1];
  },
  bind: function(o,t,f,b) {
    b = b || false;
    if(o['addEventListener']) {
      o.addEventListener(t, f, b);
    } else if(o.attachEvent) {
      o.attachEvent( "on"+t, f );
    }
  },
  unbind: function(o,t,f,b) {
    b = b || false;
    if(o['removeEventListener']) {
      o.removeEventListener(t,f,b);
    } else if(o.detachEvent) {
      o.detachEvent( "on"+t, f );
    }
  },
  target: function (e){ e = e || window.event;  return e.currentTarget || window.event.srcElement; },
  cancel: function(e) {
    if( e.stopPropagation ){ e.stopPropagation(); e.preventDefault(); }
    else{ window.event.cancelBubble = true; }
  }
};

// Event listeners heirarchy
var EC = {
  currentHandlers: {},
  attach: function (obj,type,fn,bubble)
  {
    if(obj.addEventListener)
    {
      obj.addEventListener(type, fn, bubble);
    }
    else if(obj.attachEvent)
    {
      //obj["e"+type+fn] = fn;
      //obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
      obj.attachEvent( "on"+type, fn );
    }
  },
  
  detach: function (obj,type,fn,bubble)
  {
    if(obj.removeEventListener)
    {
      obj.removeEventListener(type,fn,bubble);
    }
    else if(obj.detachEvent)
    {
      obj.detachEvent( "on"+type, fn );
      //obj[type+fn] = null;
      //obj["e"+type+fn] = null;
    }
  },
  
  target: function (e){ e = e || window.event;  return e.currentTarget || window.event.srcElement; },
  
  assignOwnership: function(id,obj){ EC.currentHandlers[id] = obj; },
  
  cancel: function(e)
  {
    if( e.stopPropagation ){ e.stopPropagation(); e.preventDefault(); }
    else{ window.event.cancelBubble = true; }
  }
};


var MelaMeta = {
 context: null,
 _position: null,
 
 position: function(x,y) {
  this._position = [x,y];
 },
 
 container: function(o)
 {
  var id = "meta-" + o.context.type + o.context.id;
  var odiv = $(id);
  if( odiv )
  {
    odiv.style.visibility = "visible";
    odiv.style.top = (this._position[1] + (window.pageYOffset || document.documentElement.scrollTop)) + "px";
    odiv.style.left = this._position[0] + "px";
    MelaMeta.divTimeout(odiv,true);
  }
  else
  {
    var atags = $('content').getElementsByTagName('a');
    for(var i in atags)
    {
      if( atags[i]['rel'] == 'melative' )
      {
       if( unescape(atags[i].href.replace(/http:\/\/melative\.com/,"").replace(/\+/g," ")) == ("/"+o.context.type+"/"+o.context.name) )
       {
       atags[i]['cid'] = id;
       }
      }
    }
    
    odiv = document.createElement('div');
    odiv.id = id;
    odiv.className = "mcontext-div";
    odiv.style.top = (this._position[1] + (window.pageYOffset || document.documentElement.scrollTop)) + "px";
    odiv.style.left = (this._position[0] + 20) + "px";
    
    var html = "<img src=\"http://images.melative.com" + o.context.image + "_120.jpg\" />";
    html += "<h2><a href=\"http://melative.com/" + o.context.type + "/" + o.context.name +"\">" + o.context.name + "</a></h2> ";
    html += '<div class="cd"> ';
    
    var basic = {};
    if( o['base'] )
    {
      for(var i in o.base )
      {
        var fp = getObjectProperty(o.base[i],0);
        if( !basic[fp] )
          basic[fp] = o.base[i][fp];
      }
      
      if( basic['first'] )
      {
        html += '<small>(' + basic['first'];
        var bf = ['season','format','type'];
        for( var i in bf )
        {
          if( basic[ bf[i] ] )
          {
            var v = basic[ bf[i] ];
            html += ', ' + v.substr(0,1).toUpperCase() + v.substring(1);
          }
        }
        html += ')</small>';
      }
    }
    
    if( o['production'] )
    {
      var production = filterObjectProperties( o['production'], "|creator,director,studio,composition,artist,label,mangaka,author|" );
      var phtml;
      var pfield = ['creator','mangaka','artist','author','director','studio','composition','label'];
      
      for( var p in pfield  )
      {
        var i = pfield[p];
        if( !production[ i ] ) continue;
        
        phtml = ' <span><strong>' + i.substring(0,1).toUpperCase() + i.substring(1) + (production[i].length>1? 's' :  '') + ':</strong> ';
        phtml += production[i].toString() + '</span>';
        html += phtml;
      }
    }
    
    if( o['resources'] )
    {
      var R = o.resources;
      var rhtml = "";
      rhtml += ' <span><strong>Resources:</strong> ';
      for( var i in R )
      {
        rhtml += '<a href="' + R[i].url + '"' + (R[i]['note'] ? ' title="' + R[i]['note'] + '"': "") + '>' + R[i].title + '</a>, ';
      }
      rhtml = rhtml.substring(1,rhtml.lastIndexOf(',')) + '</span> ';
      html += rhtml;
    }
    
    
    if( o['description'] )
    {
      html += '<p>' + o.description + '</p>';
    }
    
    html += '</div>';
    odiv.innerHTML = html;
    
    odiv = document.body.appendChild(odiv);
    
    EC.attach(odiv, 'mouseover', MelaMeta.divOver, false);
    EC.attach(odiv, 'mouseout', MelaMeta.divOut, false);
  }
 },

 listener: function()
 {
  var atags = $('content').getElementsByTagName('a');
  for(var i in atags)
  {
    if( atags[i]['rel'] == 'melative' )
    {
      EC.attach(atags[i], 'mouseover', MelaMeta.over, false);
    }
  }
 },
 
 over: function(e)
 {
  var e = e || window.event;
  var tar = EC.target(e);
  
  EC.detach(tar, "mouseover", MelaMeta.over, false);
  EC.attach(tar, "mouseout", MelaMeta.out, false);
  MelaMeta.position(e.clientX, e.clientY);
  
  var data = /http:\/\/melative.com\/(\w+)\/(.+)\/?/.exec(tar.href);
  MelaMeta.inject( "http://melative.com/api/media.meta.json?callback=MelaMeta.callback&cache=1800&" + data[1] + "=" + data[2] );
 },
 
 out: function(e)
 {
  var tar = EC.target(e);
  EC.detach(tar, "mouseout", MelaMeta.out, false);
  EC.attach(tar, "mouseover", MelaMeta.over, false);
  MelaMeta.divTimeout( $( tar['cid'] ) );
 },
 
 divOver: function(e)
 {
  MelaMeta.divTimeout(EC.target(e),true);
 },
 
 divOut: function(e)
 {
  MelaMeta.divTimeout(EC.target(e));
 },
 
 divTimeout: function(d,clear)
 {
  if( clear )
  {
    if( d['timeout'] )
    {
      window.clearTimeout(d.timeout);
      d['timeout'] = null;
    }
  }
  else if( d )
  {
    d['timeout'] = window.setTimeout(function(){ d.style.visibility = "hidden";}, 50);
  }
 },
 
 inject: function(href)
 {
  var script = $('mela-meta-script');
  if( script )
  {
    var p = script.parentNode;
    p.removeChild(script);
  }
  
  script = document.createElement('script');
  script.type = "text/javascript";
  script.src = href;
  document.body.appendChild(script);
 },
 
 callback: function(o)
 {
  MelaMeta.context = o.context;
  MelaMeta.container(o);
 }
}

function init()
{ 
  if( !/Netscape/.test( navigator.appName ) )
    return;
  
  var a_tags = document.getElementsByTagName('a');
  for( var i in a_tags )
  {
    if( a_tags[i]['href'] && /akaboy/.test(a_tags[i].href.toString()) )
      a_tags[i].href = a_tags[i].href.toString().replace(/akaboy/, 'RyanA');
  }
  
  // make gradient
  _mygrad = new Gradient();
  _mygrad.buildStyle( [34,34,34], [255,255,255], 8 );
  _dgrad = new Gradient();
  _dgrad.buildStyle( [11,11,11], [255,255,255], 7 );

  // get categories
  var li = $('categories').getElementsByTagName('li');
  for(var j=0; j<li.length; j++)
  {
    if( li[j].parentNode && li[j].parentNode.className == "" )
    {
      var c = ListLib.gControl(_mygrad, "#222");
      c.drop = ListLib.gDropper(li[j]);
      li[j]['control'] = c;
      Events.create(li[j], 'mouseover', ListLib.gOver, true);
    }
  }
  
  var li = $('archives').getElementsByTagName('li');
  for(var j=0; j<li.length; j++)
  {
    var c = ListLib.gControl(_dgrad, "#111");
    c.drop = ListLib.gDropper(li[j].firstChild);
    li[j].firstChild['control'] = c;
    Events.create(li[j].firstChild, 'mouseover', ListLib.gOver, true);
  }
  var li = $('linkcat-65').getElementsByTagName('li');
  for(var j=0; j<li.length; j++)
  {
    var c = ListLib.gControl(_dgrad, "#111");
    c.drop = ListLib.gDropper(li[j].firstChild);
    li[j].firstChild['control'] = c;
    Events.create(li[j].firstChild, 'mouseover', ListLib.gOver, true);
  }

}

EC.attach(window, 'load', MelaMeta.listener, false);
EC.attach(window, 'load', init, false);

var ListLib = {
gControl: function (G,s){
  return {'i':0,'g':G,'intr':null,'style':s,'drop':null}
},
gDropper: function (e){ 
  return function (){ 
    if( e.control.i<e.control.g.frames() ){ 
      e.style.background=e.control.g.style(e.control.i++); } 
    else {  e.style.background='';
      e.control.i=0; window.clearInterval( e.control.intr ); }
  }
},
gOver: function (e){
  var t = Events.target(e);
  if( !t.zeroGrad )
  {
  if( t.control && t.control['intr'] ) window.clearInterval(t.control.intr);
  // remove and prepare
  Events.remove(t,'mouseover', ListLib.gOver, true);
  Events.create(t,'mouseout', ListLib.gOut, true);
  // fall through style
  t.style.background=t.control.style;
  }
},
gOut: function (e){
  var t = Events.target(e);
  Events.remove(t,'mouseout', ListLib.gOut, true);
  Events.create(t,'mouseover', ListLib.gOver, true);
  t.control.intr=window.setInterval(t.control.drop, 33);
}
}


function Gradient(){}
Gradient.prototype = {
_frames:0,
frames:function(){ return this._frames},
_style:null,
step: function(s,f,c){ return (f-s +0.00)/c; },
index: function(s,sp,i){ return parseInt(s + sp*i); },
buildStyle: function(rgbI,rgbF,fr){
  var full, step;
    full=[]; this._frames = fr+1;
  step = { r:this.step(rgbI[0],rgbF[0],fr), g:this.step(rgbI[1],rgbF[1],fr), b:this.step(rgbI[2],rgbF[2],fr)};
  for(var i=0; i<fr; i++){
    full.push( "rgb(" + this.index(rgbI[0],step.r,i) +","+ this.index(rgbI[1],step.g,i) +","+ this.index(rgbI[2],step.b,i) +")" );
  }
  full.push( "rgb(" + rgbF[0] +","+ rgbF[1] +","+ rgbF[2] +")" );
  this._style = full;
},
style: function(i){ return this._style[i]; }
}

var Events = {
"currentHandlers":{},
"create": function (obj,type,fn,bubble){
  if(obj.addEventListener){
    obj.addEventListener(type, fn, bubble);
  } else if(obj.attachEvent){
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
    obj.attachEvent( "on"+type, obj[type+fn] );
  }
},
"remove": function (obj,type,fn,bubble){
  if(obj.removeEventListener){
    obj.removeEventListener(type,fn,bubble);
  } else if(obj.detachEvent){
    obj.detachEvent( "on"+type, obj[type+fn] );
    obj[type+fn] = null;
    obj["e"+type+fn] = null;
  }
},
"target": function (e){ e = e || window.event;  return e.currentTarget || e.srcElement; },
"assignOwnership": function(id,obj){ Events.currentHandlers[id] = obj; },
"disablePropagation": function(e){
  if( e.stopPropagation ){ e.stopPropagation(); e.preventDefault(); }
  else{ window.event.cancelBubble = true; }
}
};

function $(id){ return document.getElementById(id); }
