//http://turi2.net/blog/930.html
//http://hisasann.com/housetect/2008/11/prototypejsdomloadedie.html
//http://p2b.jp/1190046144
//http://developer.cybozu.co.jp/takesako/2007/06/opera_img-jsonp.html
//http://d.hatena.ne.jp/os0x/20080728/opera95

(function ()
{
  window.__adSpots = {};
  if (typeof document.getElementsByClassName == "undefined") {
    document.getElementsByClassName = function(className, pElement, tagName) {
      var d = document, nodes = [], item;
      try { 
        var xp = d.evaluate(
          './/'+(tagName || '*')+'[contains(concat(" ", @class, " "), " '+className+' ")]',
          (pElement || d), null, XPathResult.ANY_TYPE, null
        );
        for (item = xp.iterateNext(); item; item = xp.iterateNext()){
          nodes.push(item);
        }
      } catch(e){ 
        var cls, items = (pElement || d).getElementsByTagName((tagName || '*'));
        for(var i = 0, l = items.length; i < l; i++){
          item = items[i];
          if(item.className){
            cls = item.className.split(/\s+/);
            for(var j = 0, k = cls.length; j < k; j++){
              if(cls[j]==className){
                nodes[nodes.length] = item; break;
              }
            }
          }
        }
      } 
      return nodes.length > 0 ? nodes : null;
    }
  }

  function getASIValue() {
    var rsi_segs = [];
    var segs_beg = document.cookie.indexOf("rsi_segs=");
    if (segs_beg >= 0){
      segs_beg=document.cookie.indexOf('=',segs_beg)+1; 
      if(segs_beg>0){ 
        var segs_end=document.cookie.indexOf(';',segs_beg); 
        if (segs_end==-1) { 
          segs_end = document.cookie.length; 
        }
        rsi_segs= decodeURIComponent(document.cookie.substring(segs_beg,segs_end)).split('|'); 
      }
    }
    var segQS  = '';
    var segLen = (20 < rsi_segs.length) ? 20 : rsi_segs.length;
    for (var i=0;i<segLen;i++){ 
      if(i != 0) { segQS += '|';}
      segQS+=(rsi_segs[i]);
    }
    return segQS;
  } 

  function setAttributes(element, attributes) {
     for(var k in attributes) {
        element.setAttribute(k, attributes[k]);
     }
  }
  function setStyles(element, styles) {
    for(var k in styles) {
       element.style[k] = styles[k];
    }
  }
 
  var callBack = function(arg, sid){ 
     var ad_spot = window.__adSpots[sid];
     removeChild(ad_spot.element);

     if (!arg['type']) {return;}
     var creative_type = arg['type'];
     var is_iframe = ad_spot.container == 'iframe' || creative_type == 'html' || creative_type == 'js';
     var container = document.createElement(is_iframe ? "iframe" : "div");
 
     var target_container = container;
     var container_origin = document;
     if (is_iframe) {
       setAttributes(container, {"frameBorder" : "0", "marginHeight" : "0", "marginWidth" : "0", 
                                 "vspace" : "0", "hspace" : "0", "allowTransparency" : "true", "scrolling" : "no",
                                 "border" : "0", "framespacing" : "0"} );
     }
     if (arg['width']  && arg['height'] && !existKey("autosize")) {
       if (arg['width'] != "auto" && arg['height'] != "auto") {
         container.style.width  = arg['width']  + "px";
         container.style.height = arg['height'] + "px";
       }
     }

     ad_spot.element.appendChild(container);
     if (is_iframe) {
       var iframe = container.contentDocument ? container.contentDocument : container.contentWindow.document;
       if (creative_type != "html") {
         iframe.writeln("<head></head><body></body>");
         iframe.close();
         container_origin = iframe;
         target_container = iframe.body;
         setStyles(target_container, {"margin" : "0", "padding" : "0", "backgroupColor" : "transparent"});  
       }
     }

     var getElement = function(tagname, attributes, styles) {
       var element = container_origin.createElement(tagname); 
       setAttributes(element, attributes);
       setStyles(element, styles);
       return element;
     }

     var getElementA = function(attributes, styles) {
       if (attributes['target'] == "_mixi") {
         delete attributes['target'];
         var link_to = "mixi.util.requestExternalNavigateTo('" + attributes['href'] + "');"
         attributes['href'] = "javascript:void(0);"
         attributes['onclick'] = link_to;
       }
       return getElement("a", attributes, styles);
     }

     var createTableElement = function(ad_spot, arg) {
         var colors = ad_spot['color'];
         var table = getElement("table", {"width" : arg['width'], "height" : arg['height'], "cellspacing" : "0", "cellpadding" : "0", 
                                          "vspace" : "0", "border" : "0"}, 
                                         {"background" : colors[2], "verticalAlign" : "top"/*,
                                          "border-color" : "#0000ff", "border": "1px", "border-style" : "solid"*/});
         var tbody = getElement("tbody", {}, {"verticalAlign" : "top"});
         var disposition = arg['disposition'];
         var x = disposition == 'VERTICAL' ? 1 : arg['ads'].length;
         var y = disposition == 'VERTICAL' ? arg['ads'].length : 1;
         var mergin = ~~(100 / arg['ads'].length) + "%";
         var index = 0;
         for(var i = 0; i < y; i++) {
           var tr = getElement("tr", disposition == 'VERTICAL' ? {} : {'height': mergin}, {});
           for(var j = 0; j < x ; j++) {
             // thunbnail
             var ad = arg['ads'][index++];
             var td = getElement("td", disposition != 'VERTICAL' ? {'width' : mergin} : {}, {});
             if (ad['src']) {
               var a1 = getElementA({"href" : ad['href'], "target" : ad['target']}, {"color" : "#E773A9", "textDecoration" : "none"});
               var div1 = getElement("div", {}, {"cssFloat" : "left", "styleFloat" : "left"} );
               var img = getElement("img", {"src" : ad['src']}, {"border" : "0", "padding" : "1px"});
               a1.appendChild(img);
               div1.appendChild(a1);
               td.appendChild(div1);
             }
             // title-text
             var title  = container_origin.createTextNode(decodeURIComponent(ad['title']));
             var div_title  = getElement("div", {}, {"fontSize" : "12px", "fontWeight" : "bold"});
             var div_text   = getElement("div", {}, {"fontSize" : "12px", "color" : colors[1]});

             var a2 = getElementA({"href" : ad['href'], "target" : ad['target']}, {"color" : colors[0], "textDecoration" : "none"});
             var div2 = getElement("div", {}, {});
             a2.appendChild(title);             
             div_title.appendChild(a2);
             div_text.innerHTML = decodeURIComponent(ad['text']);
             div2.appendChild(div_title);
             div2.appendChild(div_text);
             if (ad['domain']) {
               var domain = container_origin.createTextNode(decodeURIComponent(ad['domain']))
               var div_domain = getElement("div", {}, {"fontSize" : "10px"});
               var a3 = getElementA({"href" : ad['href'], "target" : ad['target']}, {"color" : colors[4], "textDecoration" : "none"});
               a3.appendChild(domain);
               div_domain.appendChild(a3);
               div2.appendChild(div_domain);
             }
             td.appendChild(div2);
             tr.appendChild(td);
           }
           tbody.appendChild(tr);
         }
         table.appendChild(tbody) 
         return table;
     }

     var creativeFormat = {
       "swf"     : function(ad_spot, container, arg) {
         var flashVer = deconcept.SWFObjectUtil.getPlayerVersion();
         var enableFlash = flashVer && flashVer.major >= 6 ? true : false
         if (typeof(arg['alter']) != "undefined" && !enableFlash) {
           arg['type'] = arg['alter']['type'];
           var alter_creative = arg['alter']['type'] == 'img' ? 'src' : 'string';
           arg[alter_creative] = arg['alter'][alter_creative];
           creativeFormat[arg['type']](ad_spot,target_container,arg);
         } 
         else {
           var so = new SWFObject(arg['src'], 'testtest', arg['width'], arg['height'], "6", null);
           so.addVariable("clickTAG",  arg['href']);
           so.addVariable("targetTAG", arg['target']);
           so.addParam("allowScriptAccess", "always");
           if (is_iframe) {
             target_container.innerHTML = so.getSWFHTML();  
           } else {
             var div = getElement("div", {},{});
             target_container.appendChild(div);
             so.write(div);
           }
         }
       },
       "img"     : function(ad_spot, container, arg) {
         var anchor = getElementA({"href" : arg['href'], "target" : arg['target']}, {});
         var image  = getElement("img", 
                      { "src" : arg['src'], "alt" : decodeURIComponent(arg["alt"]), 
                        "border" : "0", "width" : arg['width'], "height" : arg["height"]},{});
         anchor.appendChild(image);
         target_container.appendChild(anchor);           
       }, 
       //
       "text"    : function(ad_spot, container, arg) {
          var table = createTableElement(ad_spot, arg);
          target_container.appendChild(table);  
       },
       "html"    : function(ad_spot, container, arg) {
          target_container.src = arg['iframeLocation']
       },
       "js"      : function(ad_spot, container, arg) {
          target_container.src = arg['iframeLocation']
       } ,
       "multiple" : function(ad_spot, container, arg) {
         var use_list = existKey(ad_spot, "uselist");
         var div1 = getElement(use_list ? "ul" : "div", {}, {});         
         for(var i = 0; i < arg['ads'].length; i++) {
           var ad = arg['ads'][i];
           var ad_text = container_origin.createTextNode(decodeURIComponent(ad['string']));
           var anchor  = getElementA({"href" : ad['href'], "target" : ad['target']});
           anchor.appendChild(ad_text);
           var div2 = getElement(use_list ? "li" : "div", {}, {});
           div2.appendChild(anchor);
           div1.appendChild(div2);
         }
         target_container.appendChild(div1);  
       } ,
       "giftext" : function(ad_spot, container, arg) {
         // 0:title, 1:text, 2:bg, 3:border 4:url
         var table = createTableElement(ad_spot, arg);
         target_container.appendChild(table); 
       }
       // 複数テキスト
     };

     creativeFormat[creative_type](ad_spot,target_container,arg);
//   BaseContainerを考慮していない divが1階層構造
     //if (existKey(ad_spot, 'rorate')) {
     //  setTimeout(function(){getJsonP(getRequestURI(sid))}, 20000);
     // }
  };

  function removeChild(element) {
    for (i = element.childNodes.length - 1 ; i >= 0; i--) {
      element.removeChild(element.childNodes[i]);
    }
  }
  
  function existKey(h, key) {
    for(var i in h) { if (i == key) { return true; }}
    return false;
  }

  function getParams(params) {
    var param = params.split("_");
   return {"k" : param[0], "v" : param[1]};
  }


  function getJsonP(url) {
    __getInnerJsonP = function() {
      var script  = document.createElement("script");
      script.type = "text/javascript";
      script.charset = "UTF-8";
      script.src = url;         // ここでCallBackが呼ばれる  // opera??
      document.body.appendChild(script); 
    }
    if (!!window.opera) {
      var img = document.createElement("img");
      img.onerror = __getInnerJsonP;
      setAttributes(img, {"width" : 0, "height" : 0, src : url});
      document.body.appendChild(img)
    } else {
      __getInnerJsonP.apply();
    }
  }


  function getRequestURI(ad_spot_id) {
    var host = "http://a.t.webtracker.jp/ad/jsonp/?"
    host += 'sid='   + ad_spot_id +
            '&url='  + escape(document.URL) +
            '&ref='  + escape(document.referrer);
    if (existKey(window.__adSpots[ad_spot_id], 'rehearsal')) {
      host += '&rehearsal=1';
    }
    if (!!window.__adParams && window.__adParams != "") {
      host += "&cparam=" + window.__adParams;
    }
    return host;
  }

  function getRequestURIByFrame(ad_spot) {
    var classname  = ad_spot.className.split(" ");
    var ad_spot_id = getParams(classname[1]).v;
    if (!window.__adSpots[ad_spot_id]) {
      window.__adSpots[ad_spot_id] = {};
      window.__adSpots[ad_spot_id].element = ad_spot;
      for (var i = 1; i < classname.length; i++) {
         var p = getParams(classname[i]);
         window.__adSpots[ad_spot_id][p.k] = p.k == 'color' ? p.v.split("-") : p.v
         // title, text, bg, border url
      }
    }
    return getRequestURI(ad_spot_id);
  }

  function DomContentLoaded(){
    window.__adCallBack = callBack;
    var loadAds = function () {
      var meta_tags = document.getElementsByTagName("meta");
      for(var i =0; i < meta_tags.length; i++) {
        var meta = meta_tags[i]
        if (!!meta.getAttribute("name") && meta.getAttribute("name") == "ad_params") {
           window.__adParams = meta.getAttribute("content");
        }
      }
      var asi = getASIValue();
      if (!!asi && asi != "") {
        if (!!window.__adParams && window.__adParams != "") {
          window.__adParams += ("|" + asi);
        } else {
          window.__adParams = asi;
        }
      } 
      var frames = document.getElementsByClassName("ad_frame"); 
      if (frames) { 
        for(var i = 0; i < frames.length; i++) { 
          getJsonP(getRequestURIByFrame(frames[i])); 
        }
      }
    }

    var packages = [ "http://a.t.webtracker.jp/js/swfobject.js" ]
    var script = document.createElement("script");
    script.charset = "utf-8";
    script.src = packages[0];
    if (window.ActiveXObject) { 
      script.onreadystatechange = function () {
        if (script.readyState == "complete" || script.readyState == "loaded") {
          loadAds();
        }
      }
    }
    else {
      script.onload = function() { 
        loadAds();
      }
    }
    document.body.appendChild(script);
  }
  
  if (!!(window.attachEvent && !window.opera)) {
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");  
    document.getElementById("__onDOMContentLoaded").onreadystatechange = function() {  
      if (this.readyState == "complete") {  
        this.onreadystatechange = null;  
        DomContentLoaded(); 
      }  
    }
  } else {
    if (!!window.opera) {
      var version = parseFloat(window.opera.version());
      var eventName = version < 9 ? "load"   : "DOMContentLoaded";
      var useCapture = version < 9.5 ? false : true;
      var target = version < 9 ? window : version < 9.5 ? document : window;
      target.addEventListener("DOMContentLoaded", DomContentLoaded, useCapture);
    }
    else if (!!document.addEventListener) {
      // FireFox Chrome
      document.addEventListener("DOMContentLoaded", DomContentLoaded, true);
    } else {
      window.onload = DomContentLoaded();
    }
  }
})();
