/*
<!-- SpaceID=0 robot -->
*/
(function () {
/**
 * YTracks
 *
 * Copyright (C) 2008 Yahoo Japan
 * Dual Licensed under th MIT and GPL Licenses.
 *
 */
var __version__ = 0.2;

if (typeof YTracks != 'undefined') {
  if (__version__ <= YTracks.version) return;
} else {
  var YTracks = window.YTracks = function() {};
}

/**
 * Original Source; jQuery(jquery.com)
 */
var ua = navigator.userAgent.toLowerCase();
YTracks.browser = {
  version: (ua.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
  safari: /webkit/.test(ua),
  opera: /opera/.test(ua),
  msie: /msie/.test(ua) && !/opera/.test(ua),
  mozilla: /mozilla/.test(ua) && !/(compatible|webkit)/.test(ua),
  konqueror: /konqueror/.test(ua),
  khtml : /khtml/.test(ua)
};
(function(){
  this.version = __version__;
  this.prefix = 'yahoo-tracks-';
  this.isReady = false;
  this.created = new Date();
  this.trackerURL = '';
  this.targetId = '';
  this.uuid = '';
  this.clickUrl = '';
  this.label ='';
  this.targetWindow = '_self';
  this.__ready__ = [];
  this.__widget__ = {};
  this.__elem__ = null;

  /************** Utilities *****************/
  this.escape = function(source,type) {
    if(typeof source != 'string') return source;
    switch (type) {
      case 'js' :
        return source.replace(/\\/g,'\\\\').replace(/"/g,'\\"')
          .replace(/'/g,"\\'").replace(/\//g,'\\/');
      case 'url' :
        return encodeURIComponent(source);
      case 'html' :
      default :
        return source.replace(
            /(?:&)(?!(?:[a-z0-9]{2,7}|#[0-9]{2,5}|#x[0-9a-f]{2,5});)/gi,
            '&amp;'
          ).replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&#34;')
          .replace(/'/g,'&#39;').replace(/`/,'&#96');
    }
  }

  this.each = function(args, callback, obj) {
    if(args.length == undefined || args.length == 0) return callback.call(obj,args);
    var result = [];
    for(var i in args) result.push(callback.call(obj,args[i]));
    return result;
  }

  // getElementById
  this.$ = function(elem) {
    return (typeof elem == 'string') ? document.getElementById(elem) : elem;
  }

  // getElementsByClassName
  this.$c = function(name, tag, node) {
    if (node == null) node = document;
    if (tag == null) tag = '*';
    var elems = node.getElementsByTagName(tag);
    var pattern = new RegExp('(?:^|\\s)' + name + '(?:\\s|$)');
    var found = [];
    YTracks.each(elems, function(elem) {
      if(typeof elem == 'object' && pattern.test(elem.className)) found.push(elem);
    });
    return found;
  }

  /************** Core *****************/
  this.init = function() {
    if (!YTracks.isReady) {
      YTracks.isReady = true;
      YTracks.each(YTracks.__ready__,function(fn) {
        if (fn['fn'])
          fn['fn'].call(document,fn['args']);
        delete fn;
      });
      YTracks.__ready__ = null;

      // Prepare Tracking
      YTracks.event.add(window, 'beforeunload', YTracks.ping,false);
      // beforeunload だけだったら失敗するときがあるから念のため
      YTracks.event.add(window, 'unload', YTracks.ping,false);
      YTracks.prepare();
    }
    if (document.removeEventListener)
      document.removeEventListener("DOMContentLoaded", YTracks.init, false );

    YTracks.__elem__ = document.createElement('img');
    YTracks.__elem__.setAttribute('style','visibility: hidden; width:1px; height: 1px;');
    return this;
  }

  this.ready = function(callback,callback_args) {
    bindReady();
    if(YTracks.isReady)
      callback.call(document,callback_args);
    else
      YTracks.__ready__.push({fn : callback, args: callback_args});

    return this;
  }

  this.register = function(args) {
    if(!this.__widget__[args.name]) this.__widget__[args.name] = [];
    var count  = this.__widget__[args.name].length;
    if(args.singleton && count != 0) return this;
    args.id = YTracks.prefix + args.name + '-' + count;
    var widget = new YTracks.widget(args);
    this.__widget__[args.name].push(widget);
    return this;
  }

  this.load = function() {
    for(var label in YTracks.__widget__) {
      var targets = YTracks.$c(YTracks.prefix + label, 'div', document.body);
      if (targets == '') continue;
      for(var i = 0, length = YTracks.__widget__[label].length; i < length; i++) {
        var widget = YTracks.__widget__[label][i];
        var cloneTarget = targets[i].cloneNode(false);
        cloneTarget.innerHTML = widget.tag();
        targets[i].parentNode.replaceChild(cloneTarget, targets[i]);
      }
    }
    return this;
  }

  this.write = function() {
    for(var label in YTracks.__widget__) {
      for(var i = 0, length = YTracks.__widget__[label].length; i < length; i++) {
        var widget = YTracks.__widget__[label][i];
        document.write('<div class="' + YTracks.prefix + label + '">');
        document.write(widget.tag());
        document.write('</div>');
      }
    }
    return this;
  }

  this.prepare = function() {
    // Tracking iframes
    var iframes = document.getElementsByTagName('iframe');
    YTracks.each(iframes, function(iframe) {
      YTracks.event.add(iframe, 'mouseover', function(evt) {
        YTracks.clickUrl = this.src;
        try {
          YTracks.label = this.contentWindow.document.title;
        } catch (e) {
          // FIXME:
          YTracks.label = '';
        }
      }, false);
      YTracks.event.add(iframe, 'mouseout', function(evt) {
        YTracks.clickUrl = '';
        YTracks.label = '';
      }, false);
    });
    // Tracking anchors
    var anchors = document.getElementsByTagName('a');
    YTracks.each(anchors,function(anchor) {
      YTracks.event.add(anchor, 'click', function(evt) {
        YTracks.clickUrl = this.href;
        YTracks.label = this.innerText;
        YTracks.ping(evt);
      }, false);
    });
    return this;
  }

  this.ping = function(evt) {
    var id = YTracks.prefix + 'pinged';
    var elem = YTracks.__elem__.cloneNode(true);
    if (YTracks.$(id)) document.body.removeChild(YTracks.__elem__);
    // image tracking
    // 実際には label 使ってない
    elem.src = YTracks.trackerURL
        + '?ts=' + (new Date()).getTime() // DOM Node Cache 対策
        + '&ref=' + YTracks.escape(document.referrer, 'url')
        + '&url=' + YTracks.escape(document.location, 'url')
        + '&uuid=' + YTracks.escape(YTracks.uuid, 'url')
        + '&label=' + YTracks.escape(YTracks.label, 'url')
        + '&out=' + YTracks.escape(YTracks.clickUrl, 'url');
    document.body.appendChild(elem);
    // return すると safari でダイアログ出る
  }

}).apply(YTracks);

YTracks.event = {
  add : function(target, type, fn,  useCapture) {
    if (typeof target != 'object') return false;
    // this を イベント発生元に切り替える。
    // (IE でこれやらないと、event 時にイベント発生元の情報を上手くとれない)
    var __fn = function(event) { return fn.call(target,event); };
    if (target.addEventListener) {
      target.addEventListener(type,__fn,useCapture);
      return true;
    } else if (target.attachEvent) {
      return target.attachEvent('on' + type, __fn);
    } else {
      target['on' + type] = __fn;
    }
  },

  cancel : function (event) {
    if(event.preventDefault)
      event.preventDefault();
    else
      event.retunValue = false;
  },
  special: {
    ready : {
      setup : function() {
        bindReady();
      }
    }
  }
}
YTracks.Timer = function() {};
YTracks.Timer.prototype = {
  __context__ : null,
  __timer__ : null,
  __object__ : null,
  __function__ : null,
  __handler__ : null,
  __arguments__ : [],
  __next__ : 0,
  init : function (time, obj, fn, args, handle_interval) {
    this.__object__ = obj;
    this.__function__ = fn;
    this.__next__ = time;
    this.__arguments__ = args;
    if(typeof handle_interval == 'function' ) this.handleInterval = handle_interval;

    return this.handleTimer();
  },
  handleTimer : function() {
    if (this.__timer__) {
      clearTimeout(this.__timer__);
      delete this.__timer__;
    }
    var self = this;
    this.__timer__ = setTimeout(function() {
      self.__function__.call(self.__object__, self.__arguments__);
      return self.handleTimer();
    },this.__next__);
    this.__next__ = this.handleInterval(this.__next__);
    return this;
  },
  handleInterval : function(interval) { // default
    return interval * Math.LN10;
  }
}

YTracks.widget = function(args) {
  for(var label in args) this[label] = YTracks.escape(args[label], 'html');
  return this;
}

YTracks.widget.prototype = {
  objectId : function() {
    return this.id + '-object';
  },
  embedId : function() {
    return this.id + '-embed';
  },
  tag : function() {
    return (this.type == 'flash') ? this.flash() : this.image();
  },
  image : function() {
    return [
      '<a href="">',
      '<image src="' +  this.path + '"',
      'stype="width: ' + this.width + ';',
      'height: ' + this.height + ';"',
      'alt="" title="" border="0"',
      '/>',
      '</a>'
    ].join(' ');
  },
  flash : function() {
    var trans_obj = (this.transparent) ? '<param name="wmode" value="transparent" />' : '';
    var trans_emb = (this.transparent) ?  'wmode="transparent" ' : '';
    return [
      '<object id="' + this.objectId()  + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ',
      'name="' + this.objectId() + '" width="' + this.width +'" height="' + this.height + '" ',
      'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" >',
      '<param name="allowScriptAccess" value="' + this.scriptAccess + '" />'  + trans_obj,
      '<param name="movie" value="' + this.path + '" />',
      '<param name="play" value="true"/><param name="loop" value="' + this.loop + '"/>',
      '<param name="menu" value="false"/><param name="quality" value="high"/>',
      '<param name="FlashVars" value="' + this.vars + '"/>',
      '<embed id="' + this.embedId() + '" name="' + this.embedId() + '" ',
      'src="' + this.path + '" loop="' + this.loop + '" menu="false" quality="high" ',
      'swLiveConnect="true" width="' + this.width + '" height="' + this.height + '" ',
      'FlashVars="' + this.vars + '" ' + trans_emb,
      'allowScriptAccess="' + this.scriptAccess + '" type="application/x-shockwave-flash" ',
      'pluginspage="http://www.macromedia.com/go/getflashplayer" />',
      '</object>'
    ].join('');
  }
}

/**
 * Original Source: jQuery
 */
var readyBound = false;
function bindReady() {
  if (readyBound) return;
  readyBound = true;
  if(YTracks.browser.msie || YTracks.browser.safari || YTracks.browser.konqueror){ (function() {
      try {
        if(YTracks.browser.msie || document.readyState != 'loaded' && document.readyState != 'complete')
          document.documentElement.doScroll('left');
      } catch (e){
        return setTimeout(arguments.callee, 50);
      }
      YTracks.init();
    })();
  } else if(document.addEventListener) {
    document.addEventListener('DOMContentLoaded', YTracks.init, false);
  }
  // fail back
  YTracks.event.add(window, 'load', YTracks.init);
}

})();
YTracks.ready(function(args){
  YTracks.trackerURL = 'http:\/\/parts.logoole.yahoo.co.jp\/parts\/trace';
  YTracks.uuid = 'eb2f6fa70aa64bb39f4f3b26b28b0422';
  var timer = (new YTracks.Timer()).init(5000,YTracks,YTracks.ping,null);
}, []).register({
  name: 'widget',
  type: 'flash',
  signleton: true,
  width: '160px',
  height: '345px',
  scriptAccess: 'sameDomain',
  transparent: true,
  loop: false,
  vars: 'visit_id=eb2f6fa70aa64bb39f4f3b26b28b0422&user_id=0&pattern=6&owner_name=Sizenote&owner_image_url=http%3A%2F%2Fproxy.f4.ymdb.yahoofs.jp%2Fmingle%2F495a1b45zc018b577%2Fprofile%2F__tn_%2F680f.jpeg%3FmgINHCLB.ecxV.uT&owner_profile_url=http%3A%2F%2Flogoole.yahoo.co.jp%2Fprofile%3Fuser_id%3D25749&host=http://parts.logoole.yahoo.co.jp',
  path: 'http:\/\/i.yimg.jp\/images\/tracks\/swf\/parts.swf'
}).write();
