/*
----------------------------------------------------------------
  XMLファイル 読込処理クラス
----------------------------------------------------------------
*/
var JWVCst = function (url) {
  this._root = window // global object
  this._xmlPath  = [];
  this._elements = [];
  if(url) this._xmlPath.push(url)
}
JWVCst.prototype._index = 0;
JWVCst.prototype._res   = [];
JWVCst.prototype._async = true;

JWVCst.prototype.addPath = function(url){
   this._xmlPath.push(url)
}

// @ele:{xmlpath, parser}
JWVCst.prototype.addElements = function(url, cls){
   this._elements.push({url:url, targetClass:cls})
}

JWVCst.prototype.load = function(){
  this._res.push(this.getXMLHttpRequest())
  var res = this._res[this._res.length-1]
  var ele = this._elements[this.getCrtIndex()]

  if(ele.url){
    var d  = new Date()
    var ex =Math.floor((Math.random()*100000)).toString()
    var http = new JKL.ParseXML( ele.url+"?f="+ ex);    // JKL.ParseXMLオブジェクトを生成
    http.async( this.onCompReq(this, ele.targetClass) );// 呼び出し先関数を指定する
    http.parse();
  }
  
  // 負荷を考慮し微少時間間隔をあけて実行
  if(this.hasNextUrl()) {
    var self = this
    setTimeout(function(){self.load()}, 75)
  }
}

JWVCst.prototype.onCompReq = function(scope, cls){
  var self   = scope
  var targetClass = cls

  return function(){
    // SCORP -> this:XMLHttpRequest, self:JWVCst
    targetClass.execute(arguments[0])
  }
  
}

JWVCst.prototype.parseItem = function(xml){
  this.parse(xml);
}

JWVCst.prototype.getCrtIndex = function(){
  var n =this._index;
  //if(this._xmlPath.length-1 < this._index++) n = this._index = 0;
  return n;
}

JWVCst.prototype.hasNextUrl = function(){
  var flg = true;
  ++this._index;
  if(this._elements.length-1 < this._index) {
    this._index = 0
    flg = false
  }
  return  flg;
}

JWVCst.prototype.getXMLHttpRequest = function(){
  var xhr;
  var fucns = [
      function () { return new XMLHttpRequest(); },
      function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
      function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
      function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }
  ];
  for (var i = 0; i < fucns.length; i++) {
      var func = fucns[i];
      try {
          xhr = func;
          return func();
      } catch (e) {
          //alert(e);
      }
  }
  return xhr;
}



/*
----------------------------------------------------------------
  Utils
----------------------------------------------------------------
*/
var JWVUtils = function(){}

JWVUtils.prototype.$ = function(id){
  return document.getElementById(id)
}

JWVUtils.prototype.getClassArea = function(tagname, clsname, element){
  var ele  = element || document
  var tag  = tagname || "*" // タグ指定
  var cls  = clsname || ""
  var list = ele.getElementsByTagName(tag)
  var len  = list.length
  var data = []

  for(var i=0; i<len; i++){
    if(!cls){
      data.push(list[i])
    }else if(list[i]["className"] == cls ){
      data.push(list[i])
    }
  }
  return data;
}

JWVUtils.prototype.parseObjectToArray = function(xmldata){
  var xml = xmldata
  var d = []
  
  // オブジェクトは配列形式にまとめる
  if(typeof(xml) == "object" && 0 < xml.length ){
    return xml
  }else if(typeof(xml) == "object" && xml.length === undefined){
    d.push(xml)
    return d
  }else{
    return d
  }
}

JWVUtils.prototype.addEvent = function(event, ele, func){
	try{
		ele.addEventListener(event,func,false);
	}catch(e){
		ele.attachEvent("on"+event,func)
	}
}

JWVUtils.prototype.removeEvent = function(event, ele, func){
	try{
		ele.removeEventListener(event,func,false);
	}catch(e){
		ele.detachEvent("on"+event,func)
	}
}



/*
---------------------------------------------------------------
  MINI BANNER
----------------------------------------------------------------
*/
function MiniBanner(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
MiniBanner.prototype = new JWVUtils()
MiniBanner.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
MiniBanner.prototype.parse = function(){
  var list = []
  var p = (this.xml.minibanner !== undefined) ? this.parseObjectToArray(this.xml.minibanner.data) : []
  var l = p.length
  
  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    ele["file_name"]= p[i].file_name
    ele["link"]     = p[i].link
    ele["target"]   = p[i].target
    list.push(ele)
  }

  this.constArea(list)
}

MiniBanner.prototype.constArea = function(xmldata){
  PATH = "http://www.j-wave.co.jp/top/img/minibanner/"
  var items = xmldata
  var len   = items.length || 0
  var outer = this.$(this.id)
  //var spot  = this.getClassArea("div", "boxS-rep", this.$(this.id))[0]

  if(0 < len){
    outer.style.paddingTop = "7px"
    var entry = []
    entry.push("<div class='boxS-btm'>")
    entry.push("<div class='boxS-rep'>")
    entry.push("<ul>")
  
    for(var i=0; i<len; i++){
      entry.push("\t<li>")
      entry.push("<a href='"+items[i]["link"]+"' target='"+items[i]["target"]+"'><img src='"+PATH+items[i]["file_name"]+"' /></a>")
      entry.push("</li>")
    }
    entry.push("</ul>")
    entry.push(outer.innerHTML)
    entry.push("</div>")
    entry.push("</div>")
    outer.innerHTML = entry.join("\n")
  } else {
    // 動的表示でないバナーがあればDOMを削除しない
    var childNode = this.getClassArea("div", "", outer)[0]
    if(childNode == undefined){
      outer.parentNode.removeChild(outer)
    } else {
      var entry = []
      entry.push("<div class='boxS-btm'>")
      entry.push("\t<div class='boxS-rep'>")
      entry.push("\t\t"+outer.innerHTML)
      entry.push("\t</div>")
      entry.push("</div>")
      outer.innerHTML = entry.join("\n")
    }
  }
}



/*
---------------------------------------------------------------
  NOW ON AIR
----------------------------------------------------------------
*/
function NowOnAir(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
  this.prevNavigator = ""// NAVIGATOR
}
NowOnAir.prototype = new JWVUtils()
NowOnAir.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
NowOnAir.prototype.parse = function(){
  var list = []
  var p = this.xml.items
  var q = this.parseObjectToArray(this.xml.items.now_on_air.item)
  var l = q.length

  // 0番目は COMMENT, GUEST情報のみ
  //list.push({comment:p.comment, guest:p.guest})
  
  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    ele["file_name"]    = q[i].file_name
    ele["nfile_name"]   = q[i].nfile_name
    ele["navi_photo1"]  = q[i].navi_photo1
    ele["navi_photo2"]  = q[i].navi_photo2
    ele["navigator"]    = q[i].navigator 
    ele["twitter"]      = q[i].twitter || ""
    ele["twitter_hash"] = q[i].twitter_hash || ""
    ele["email"]        = q[i].email || ""
    ele["guest_p"]      = q[i].guest_p || ""
    ele["link"]         = q[i].link
    ele["p_name"]       = q[i].p_name || ""
    ele["target"]       = q[i].target || ""
    ele["time"]         = q[i].time || ""
    ele["week"]         = q[i].week || ""
    ele["parents"]      = q[i].parents || 0
    ele["parents_photo"]= q[i].parents_photo || 0
    ele["comment_p"]    = q[i].comment_p || ""

    // 改行が半角スペースにエスケープされているため、半角スペースを改行コードとみなす
    ele["comment_p"] = ele["comment_p"].replace(/\s/,"<br />")
    ele["guest_p"]   = ele["guest_p"].replace(/\s/,"<br />")
    
    
    list.push(ele)
  }

  this.constArea(list)
}

NowOnAir.prototype.constArea = function(xmldata){
  var items = xmldata
  var nowPrg = this.divideProgram(items)


  // NOW ON AIR
  this.makeNOADetail(nowPrg)
  
  // NEXT PROGRAM
  this.makeNXPDetail(items)
  //this.makeNextPrograms(items)
}


// 番組中にコーナーがあるかを振分け
NowOnAir.prototype.divideProgram = function(items){
  var p   = items
  var len = p.length
  var res = [] //NOAカレントのデー
  var isTop = true
  
  for(var i=0; i<len; i++){
    var parents = p[i].parents

    // 先頭のデータ
    if( isTop ) {
      isTop = false
      res.push(p.splice(i, 1))
      len--
      i--
      if(parents == 0) break;
      
    // 2番目以降のデータ
    } else {
      // 番組のコーナー
      if(parents == 1){
        res.push(p.splice(i, 1))
        len--
        i--
      // コーナー以外
      } else {
        break;
      }
    }
  }

  return res
}


NowOnAir.prototype.makeNOADetail = function(list){
  var spot = this.getClassArea("div", "spot-prg", this.$(this.id))[0]
  var p = list

  for(var i=0; i<p.length; i++){
    var q = p[i][0]
    
    if(i == 0){
      spot.appendChild(this.makeSpotSche(q))
      spot.appendChild(this.makeSpotPrgInfo(q))
    } else {
      spot.appendChild(this.makeSpotScheInPrg(q))
      spot.appendChild(this.makeSpotPrgInfoInPrg(q))
    }
  }
}

NowOnAir.prototype.makeNXPDetail = function(list){
  var p = list
  var nodes = []
  while(p.length){
    nodes.push(this.divideProgram(p))
  }

  var nextPrg = this.$("NextPrg")
  for(var i=0; i<nodes.length; i++){
    var spot = document.createElement("div")
    spot.className = "spot-prg"
    var z = nodes[i]

    for(var j=0; j<z.length; j++){
      var q = z[j][0]
      
      if(j == 0){
        spot.appendChild(this.makeSpotSche(q, true))
        spot.appendChild(this.makeSpotPrgInfo(q, true))
      } else {
        spot.appendChild(this.makeSpotScheInPrg(q, true))
        spot.appendChild(this.makeSpotPrgInfoInPrg(q, true))
      }
      // ノードを挿入
      nextPrg.appendChild(spot)
    }
    
    /*if(nodes[i] instanceof Array){
      q = nodes[i][0]
    } else {
      q = nodes[i]
    }*/
    if((i%2)){
      spot.style.backgroundImage = "url(../common/img/bg-even.gif)"
      spot.style.backgroundPosition = "center 0"
      spot.style.backgroundRepeat   = "repeat-y"
    }

  }
  //nextPrg.appendChild(spot)
}

NowOnAir.prototype.makeSpotSche = function(data){
  var d = data
  var dl_date = document.createElement("dl")
  dl_date.className = "spot-sche"
  
  var dt_date = document.createElement("dt")
  var dd_date = document.createElement("dd")
  dt_date.className = "youbi"
  dd_date.className = "oa-time"

  var str = ""
  //str += '<img src="img/ico-sat.gif">\n'
  str += "<span class='t_week'>"+d["week"]+'</span>\n<p>\n'
  if(d["twitter_hash"]) str += d["twitter_hash"]+'\n'
  if(d["twitter"])      str += '<a href="http://twitter.com/'+d["twitter"]+'" target="_blank" ><img src="common/img/ico_twitter.gif" /></a>\n'
  if(d["email"])        str += '<a href="mailto:'+d["email"]+'"><img src="common/img/ico_mail.gif" /></a>\n'
  str += '</p>\n'

  dt_date.innerHTML = str
  dd_date.innerHTML = d["time"]
  
//  dl_date.innerHTML = dt_date + dd_date
  dl_date.appendChild(dt_date)
  dl_date.appendChild(dd_date)
  return dl_date
}

NowOnAir.prototype.makeSpotPrgInfo = function(data, prgstatus){
  var PATH_PRG = "http://www.j-wave.co.jp/top/img/noa/"
  var PATH_NAV = "http://www.j-wave.co.jp/top/img/navi/"
  var d  = data
  var ex = prgstatus ? "" : "_now"
  var dl_info = document.createElement("dl")
  dl_info.className = "spot-prg-info"
  
  var info = ""
  info += '<dt class="prg-title"><img src="common/img/ico-title'+ex+'.gif" /></dt>\n'
  info += '<dd class="prg-title-t"><a href="'+d["link"]+'"><strong>'+d["p_name"]+'</strong></a><br />\n'
  if(!prgstatus) {info += '<a href="'+d["link"]+'"><img src="'+PATH_PRG+d["nfile_name"]+'" /></a>\n'} // [NEXT PROGRAM]では非表示
  info += '</dd>\n'

  info += '<dt class="prg-nav"><img src="common/img/ico-navigator'+ex+'.gif" /></dt>\n'
  info += '<dd class="prg-nav-t"><strong>'+d["navigator"]+'</strong><br />\n'

  if(d["navi_photo1"]){ info += '<img src="'+PATH_NAV+d["navi_photo1"]+'" />\n' }
  if(d["navi_photo2"]){ info += '<img src="'+PATH_NAV+d["navi_photo2"]+'" />\n' }
  info += '</dd>\n'
  
  info += '<dt class="prg-info"><img src="common/img/ico-info'+ex+'.gif" /></dt>\n'
  info += '<dd>'+d["comment_p"]+'</dd>\n'

  info += '<dt class="prg-guest"><img src="common/img/ico-guest'+ex+'.gif" /></dt>\n'
  info += '<dd>'+d["guest_p"]+'<br /></dd>\n'

  dl_info.innerHTML = info
  
  // 直前のnavigatorを保持 NowOnAirのときに利用するため
  this.prevNavigator = d["navigator"]
  return dl_info
}


// 番組内のコーナー用
NowOnAir.prototype.makeSpotScheInPrg = function(data){
  var d = data
  var dl_date = document.createElement("dl")
  dl_date.className = "spot-sche"
  
  var dt_date = document.createElement("dt")
  var dd_date = document.createElement("dd")
  dt_date.className = "youbi yb-ico-r"
  dd_date.className = "oa-time inner-prg"

  var str = ""
//  str += "<span class='t_week'>"+d["week"]+'</span>\n<p>\n'
  if(d["twitter_hash"]) str += d["twitter_hash"]+'\n'
  if(d["twitter"])      str += '<a href="http://twitter.com/'+d["twitter"]+'" target="_blank" ><img src="common/img/ico_twitter.gif" /></a>\n'
  if(d["email"])        str += '<a href="mailto:'+d["email"]+'"><img src="common/img/ico_mail.gif" /></a>\n'
  str += '</p>\n'

  dt_date.innerHTML = str
  dd_date.innerHTML = d["time"]
  
  dl_date.appendChild(dt_date)
  dl_date.appendChild(dd_date)
  return dl_date
}

// 番組内のコーナー用
NowOnAir.prototype.makeSpotPrgInfoInPrg = function(data, prgstatus){
  var PATH_PRG = "http://www.j-wave.co.jp/top/img/noa/"
  var PATH_NAV = "http://www.j-wave.co.jp/top/img/navi/"
  var d  = data
  var ex = prgstatus ? "" : "_now"
  var dl_info = document.createElement("dl")
  dl_info.className = "spot-prg-info"
  
  var info = ""
  info += '<dt class="prg-title"><img src="common/img/ico-title'+ex+'.gif" /></dt>\n'
  info += '<dd class="prg-title-t"><a href="'+d["link"]+'"><strong>'+d["p_name"]+'</strong></a><br />\n'
  
  //if(!prgstatus) {info += '<a href="'+d["link"]+'"><img width="110" src="'+PATH_PRG+d["nfile_name"]+'" /></a>\n'} 
  info += '<a href="'+d["link"]+'"><img src="'+d["parents_photo"]+'" /></a>\n'

  info += '</dd>\n'

  // 同じnavigatorが連続するときは表示しない
  if(this.prevNavigator !=  d["navigator"]){
    info += '<dt class="prg-nav"><img src="common/img/ico-navigator'+ex+'.gif" /></dt>\n'
    info += '<dd class="prg-nav-t"><strong>'+d["navigator"]+'</strong><br />\n'
  }

  //if(d["navi_photo1"]){ info += '<img src="'+PATH_NAV+d["navi_photo1"]+'" />\n' }
  //if(d["navi_photo2"]){ info += '<img src="'+PATH_NAV+d["navi_photo2"]+'" />\n' }

  info += '</dd>\n'
  
  info += '<dt class="prg-info"><img src="common/img/ico-info'+ex+'.gif" /></dt>\n'
  info += '<dd>'+d["comment_p"]+'</dd>\n'

  info += '<dt class="prg-guest"><img src="common/img/ico-guest'+ex+'.gif" /></dt>\n'
  info += '<dd>'+d["guest_p"]+'<br /></dd>\n'

  dl_info.innerHTML = info
  
  // 直前のnavigatorを保持
  this.prevNavigator = d["navigator"]
  return dl_info
}



NowOnAir.prototype.makeNextPrograms = function(data){
  // NEXT PROGRAM
  var items = data
  var nextPrg = this.$("NextPrg")
  var len   = items.length || 0
  var doc   = document
  for(var i=0; i<len; i++){
    var outer = doc.createElement("div")
    outer.className = "spot-prg"
    if((i%2)){
      outer.style.backgroundImage = "url(../common/img/bg-even.gif)"
      outer.style.backgroundPosition = "center 0"
      outer.style.backgroundRepeat   = "repeat-y"
    }
    var cur = items[i]
    outer.appendChild(this.makeSpotSche(cur))
    outer.appendChild(this.makeSpotPrgInfo(cur, 1))
    
    nextPrg.appendChild(outer)
  }
}



/*
---------------------------------------------------------------
  NOW ON AIR SONG
----------------------------------------------------------------
*/
function NowOnAirSong(id, func, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
NowOnAirSong.prototype = new JWVUtils()
NowOnAirSong.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
NowOnAirSong.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.now_on_air_song.data)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["noa_url"]    = p[i].noa_url
    ele["cd_url"]     = p[i].cd_url
    ele["information"]= p[i].information.toString()
    list.push(ele)
  }
  
  this.areaConstruction(list)
}

NowOnAirSong.prototype.areaConstruction = function(xmldata){
  var items  = xmldata
  var len    = items.length || 0
  var doc    = document
  
  if(0 < len){
    var spot   = this.getClassArea("div", "", this.$(this.id))[0]
    var pretxt = this.getClassArea("p"  , "", this.$(this.id))[0] // replace TEXT [now loading...]
    var p = doc.createElement("p")
    var a = doc.createElement("a")
    var outW = spot.offsetWidth
    
    a.setAttribute("href", items[0]["cd_url"])
    a.style.visibility = "hidden"
    a.style.position   = "absolute"
    a.innerHTML = items[0]["information"].replace(/(\s*)(?=[0-9]{1,2}:[0-9]{1,2})/, "　")

    this.$("container").appendChild(a)
    var songW = a.offsetWidth
    p.style.width = songW+"px"
    p.style.position = "absolute"
    p.style.top  = "0px"
    p.style.left = "0px"

    this.$("container").removeChild(a)
    p.appendChild(a)
    a.style.visibility = "visible"
    spot.replaceChild(p, pretxt)


    var moving = function(){
      var q = p
      if((songW + currentLeft) < 0){
        currentLeft = outW
      }
      q.style.left = currentLeft +"px"
      currentLeft -= 6
      
      setTimeout(moving, 180)
    }
    
    var currentLeft = 0
    if(outW < songW) {
      setTimeout(moving, 3000)
    }
    
  }
}



/*
---------------------------------------------------------------
  PICK UP
----------------------------------------------------------------
*/
function PickUp(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
PickUp.prototype = new JWVUtils()
PickUp.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
PickUp.prototype.parse = function(){
  var list = []
  var p = (this.xml.pickup !== undefined) ? this.parseObjectToArray(this.xml.pickup.data) : []
  var l = p.length

  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    ele["text"]      = p[i]["#text"]
    ele["file_name"] = p[i].file_name
    ele["link"]      = p[i].link
    ele["target"]    = p[i].target
    list.push(ele)
  }

  this.areaConstruction(list)
}

PickUp.prototype.areaConstruction = function(xmldata){
  var PATH  = "http://www.j-wave.co.jp/top/img/pickup/"
  var items = xmldata
  var len   = items.length || 0
  var spot_div = this.$(this.id)
  var doc   = document
  
  for(var i=0; i<len; i++){ 
    var li = doc.createElement("li")
    var div_top = doc.createElement("div")
    var div_btm = doc.createElement("div")
    var div_rep = doc.createElement("div")
    div_top.className = "hot boxHot-top"
    div_btm.className = "boxHot-btm"
    div_rep.className = "boxHot-rep"
    div_top.appendChild(div_btm)
    div_btm.appendChild(div_rep)
    
    var h3 = doc.createElement("h3")
    h3.innerHTML = '<!--img width="113" height="15" src="common/img/tit_ichioshi.gif"-->'

    var dl = doc.createElement("dl")
    var dt = doc.createElement("dt")
    var dd = doc.createElement("dd")
    var img= doc.createElement("img")
    img.setAttribute("src", PATH+items[i]["file_name"])

    var a1  = doc.createElement("a")
    var a2  = doc.createElement("a")
    a1.setAttribute("href", items[i]["link"])
    a1.setAttribute("target", items[i]["target"])
    a1.appendChild(img);
    a2.setAttribute("href", items[i]["link"])
    a2.setAttribute("target", items[i]["target"])
    a2.appendChild(doc.createTextNode(items[i]["text"]));
    
    dl.appendChild(dt)
    dl.appendChild(dd)
    dt.appendChild(a1)
    dd.appendChild(a2)
    
    div_rep.appendChild(h3)
    div_rep.appendChild(dl)
    
    // ノードに追加
    spot_div.appendChild(div_top)
  }

  //spot_div.appendChild(div_top)
}



/*
---------------------------------------------------------------
  TOPICS
----------------------------------------------------------------
*/
function Topics(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
Topics.prototype = new JWVUtils()
Topics.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
Topics.prototype.parse = function(){
  var list = []
  var p = this.parseObjectToArray(this.xml.topics.item)
  var l = p.length

  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    ele["text"]   = p[i]["#text"]
    ele["link"]   = p[i].link
    ele["target"] = p[i].target || "_self"
    list.push(ele)
  }

    this.areaConstruction(list)
}

Topics.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var doc   = document
  var spot_ul = doc.createElement("ul")
  
  for(var i=0; i<len; i++){
    var li = doc.createElement("li")
    var a  = doc.createElement("a")
    a.setAttribute("href", items[i]["link"])
    a.setAttribute("target", items[i]["target"])
    a.appendChild(doc.createTextNode(items[i]["text"]));
    li.appendChild(a)
    spot_ul.appendChild(li)
  }
  
  var place = this.getClassArea("div", "boxS-rep", this.$(this.id))[0]
  var dl = this.getClassArea("dl", "", place)
  // PR要素が存在してたらノード入替
  if(0 < dl.length){
    place.insertBefore(spot_ul, dl[0])
  }else{
    place.appendChild(spot_ul)
  }
}



/*
---------------------------------------------------------------
  PR
----------------------------------------------------------------
*/
function Pr(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
Pr.prototype = new JWVUtils()
Pr.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
Pr.prototype.parse = function(){
  var list = []
  var p = (this.xml.pr !== undefined) ? this.parseObjectToArray(this.xml.pr.item) : []

  var l = p.length

  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    ele["text"]   = p[i]["#text"]
    ele["link"]   = p[i].link
    ele["target"] = p[i].target || "_self"
    list.push(ele)
  }

    this.areaConstruction(list)
}

Pr.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var doc   = document
  var spot_dl = doc.createElement("dl")
  var ICON  = "common/img/tit_pr.gif"
  
  if(0 < len){
    for(var i=0; i<len; i++){
      var dt = doc.createElement("dt")
      var dd = doc.createElement("dd")
      var img= doc.createElement("img")
      var a  = doc.createElement("a")
      img.setAttribute("src", ICON)
      a.setAttribute("href", items[i]["link"])
      a.setAttribute("target", items[i]["target"])
      a.appendChild(doc.createTextNode(items[i]["text"]));
      dt.appendChild(img)
      dd.appendChild(a)
      
      spot_dl.appendChild(dt)
      spot_dl.appendChild(dd)
    }
    
    // 
    var place = this.getClassArea("div", "boxS-rep", this.$(this.id))[0]
    place.appendChild(spot_dl)
  }
}



/*
---------------------------------------------------------------
  USTREAM
----------------------------------------------------------------
*/
function Ustream(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
Ustream.prototype = new JWVUtils()
Ustream.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
Ustream.prototype.parse = function(){
  var list = []
  var p = this.parseObjectToArray(this.xml.ustream)
  var l = p.length

  // FIELD SET
  var ele = {}
  ele["comment"]  = p[0].comment
  ele["link_url"] = p[0].link_url
  ele["ust_url"]  = p[0].ust_url
  list.push(ele)

 this.areaConstruction(list)
}

Ustream.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var spot  = document.createElement("div")
  spot.innerHTML = items[0]["ust_url"]
  
  // 
  this.$(this.id).replaceChild(spot, this.getClassArea("img", "", this.$(this.id))[0])
}



/*
---------------------------------------------------------------
  TOKIO HOT100
----------------------------------------------------------------
*/
function TokioHot(id, limit){
  this.id   = id          // AREA
  this.limit= limit || 10 // LIMIT COUNT
  this.xml  = {}          // XML DATA
}
TokioHot.prototype = new JWVUtils()
TokioHot.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
TokioHot.prototype.parse = function(){
  var list = []
  var p = this.parseObjectToArray(this.xml.rss.channel.item)
  var l = p.length
  // FIELD SET
  for(var i=0;i<l;i++){
    var ele = {}
    // 数値であることが条件
    if(p[i].title !== "" && isNaN(p[i].title) == false){
      var item      = p[i]["description"]
      ele["title"]  = p[i].title
      ele["song"]   = item.match(/<song>(.*)?<\/song>/)[1]     || ""
      ele["artist"] = item.match(/<artist>(.*)?<\/artist>/)[1] || ""
      ele["list"]   = item.match(/<link>(.*)?<\/link>/)[1]     || ""
      ele["buycd"]  = item.match(/<BUYCD>(.*)?<\/BUYCD>/) ? item.match(/<BUYCD>(.*)?<\/BUYCD>/)[1] : ""
//      ele["target"] = item.match(/<tgt>(.*)?<\/tgt>/)[1] || ""
      list.push(ele)
    }
  }

 this.areaConstruction(list)
}

TokioHot.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var ul  = this.$(this.id)
  var doc = document
  
  for(var i=0; i<len; i++){
    var li  = doc.createElement("li")
    li.className = "clrfix"
  
    var dl  = doc.createElement("dl")
    var dt  = doc.createElement("dt")
    var dd1 = doc.createElement("dd")
    var dd2 = doc.createElement("dd")
    var img = doc.createElement("img")
    var a   = doc.createElement("a")
    dd1.className = "song-title"
    dd2.className = "song-artist"
    a.setAttribute("href", "http://www.neowing.co.jp/JWAVE/detailview.html?KEY="+items[i]["buycd"])
    
    dt.innerHTML  = '<img src="common/img/ico_r'+items[i]["title"]+'.gif" class="setRank" /><img src="http://www.j-wave.co.jp/blog/tokio_system/images/photo'+items[i]["title"]+'.jpg" width="67" height="67" />'
    dd1.innerHTML = items[i]["song"]
    dd2.innerHTML = items[i]["artist"]

    dl.appendChild(dt)
    dl.appendChild(dd1)
    dl.appendChild(dd2)
//    li.appendChild(dl)
//    a.appendChild(li)
//    ul.appendChild(a)
    a.appendChild(dl)
    li.appendChild(a)
    ul.appendChild(li)
    
    this.addEvent("mouseover" , a, function(m, n, c){return function(){m.style.color = n.style.color = c}}(dd1,dd2, "#ffffff"))
    this.addEvent("mouseout"  , a, function(m, n, c){return function(){m.style.color = n.style.color = c}}(dd1,dd2, "#999999"))
  }
}



/*
---------------------------------------------------------------
  CD ONLINE
----------------------------------------------------------------
*/
function CdOnLine(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
CdOnLine.prototype = new JWVUtils()
CdOnLine.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
CdOnLine.prototype.parse = function(){
  var list =[]
  var p = this.parseObjectToArray(this.xml.cd.item)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["title"]     = p[i].title
    ele["file_name"] = p[i].file_name
    ele["url"]       = "http://www.j-wave.co.jp/cd/"
    list.push(ele)
  }
  
  // 指定したDOM要素がなければreturn
  if(!!!this.$(this.id)) return
  this.areaConstruction(list)
}

CdOnLine.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var doc   = document
  var h4 = doc.createElement("h4")
  var dl = doc.createElement("dl")
  var dt = doc.createElement("dt")
  var dd = doc.createElement("dd")
  
  h4.innerHTML = '<a href="http://www.j-wave.co.jp/cd/"><img height="26" width="108" alt="" src="common/img/cd-online.gif" /></a>\n'
  dt.innerHTML = '<a href="'+items[0]["url"]+'"><img src="http://www.j-wave.co.jp/top/img/cd/'+items[0]["file_name"]+'" /></a>\n'
  dd.innerHTML = '<a href="http://www.j-wave.co.jp/cd/">'+items[0]["title"]+'</a>\n'
  dl.appendChild(dt)
  dl.appendChild(dd)
  
  this.$(this.id).appendChild(h4)
  this.$(this.id).appendChild(dl)
}



/*
---------------------------------------------------------------
  TICKET ONLINE
----------------------------------------------------------------
*/
function TicketOnLine(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
TicketOnLine.prototype = new JWVUtils()
TicketOnLine.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
TicketOnLine.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.ticket.item)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["title"]     = p[i].title
    ele["file_name"] = p[i].file_name
    ele["target"]    = p[i].target
    ele["url"]       = p[i]["#cdata-section"]
    list.push(ele)
  }
  
  // 指定したDOM要素がなければreturn
  if(!!!this.$(this.id)) return
  this.areaConstruction(list)
}

TicketOnLine.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var doc   = document
  var h4 = doc.createElement("h4")
  var dl = doc.createElement("dl")
  var dt = doc.createElement("dt")
  var dd = doc.createElement("dd")
  
  h4.innerHTML = '<a href="http://www.j-wave.co.jp/ticket/"><img height="26" width="108" alt="" src="common/img/tick-online.gif" /></a>\n'
  dt.innerHTML = '<a target="'+items[0]["target"]+'" href="'+items[0]["url"]+'"><img src="http://www.j-wave.co.jp/top/img/ticket/'+items[0]["file_name"]+'" /></a>\n'
  dd.innerHTML = '<a href="http://www.j-wave.co.jp/ticket/">'+items[0]["title"]+'</a>\n'
  dl.appendChild(dt)
  dl.appendChild(dd)
  
  this.$(this.id).appendChild(h4)
  this.$(this.id).appendChild(dl)
}



/*
---------------------------------------------------------------
  BOOK ONLINE
----------------------------------------------------------------
*/
function BookOnLine(id, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
BookOnLine.prototype = new JWVUtils()
BookOnLine.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
BookOnLine.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.ticket.item)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["title"]     = p[0].title
    ele["file_name"] = p[0].file_name
    ele["url"]       = "http://www.j-wave.co.jp/book/"
    list.push(ele)
  }

  // 指定したDOM要素がなければreturn
  if(!!!this.$(this.id)) return
  this.areaConstruction(list)
}

BookOnLine.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var doc   = document
  var h4 = doc.createElement("h4")
  var dl = doc.createElement("dl")
  var dt = doc.createElement("dt")
  var dd = doc.createElement("dd")
  
  h4.innerHTML = '<a href="http://www.j-wave.co.jp/book/"><img height="26" width="125" alt="" src="common/img/book-online.gif" /></a>\n'
  dt.innerHTML = '<a href="'+items[0]["url"]+'"><img src="http://www.j-wave.co.jp/top/img/book/'+items[0]["file_name"]+'" /></a>\n'
  dd.innerHTML = '<a href="http://www.j-wave.co.jp/book/">'+items[0]["title"]+'</a>\n'
  dl.appendChild(dt)
  dl.appendChild(dd)
  
  this.$(this.id).appendChild(h4)
  this.$(this.id).appendChild(dl)
}



/*
---------------------------------------------------------------
  BLOG NEWS
----------------------------------------------------------------
*/
function BlogNews(id, func, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
BlogNews.prototype = new JWVUtils()
BlogNews.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
BlogNews.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.blog_news.item)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["date"]  = p[i].date
    ele["title"] = p[i].title
    ele["name"]  = p[i].name
    ele["url"]   = p[i].link
    ele["target"]= p[i].target
    list.push(ele)
  }

  this.areaConstruction(list)
}

BlogNews.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var spot  = this.getClassArea("div", "boxS-rep", this.$(this.id))[0]
  var doc   = document
  var dl = doc.createElement("dl")
  for(var i=0; i<len; i++){
    var dt = doc.createElement("dt")
    var dd = doc.createElement("dd")
    var a  = doc.createElement("a")
    
    dt.innerHTML = items[i]["name"]
    a.setAttribute("href", items[i]["url"])
    a.setAttribute("target", items[i]["target"])
    a.innerHTML = items[i]["title"]
    
    dd.appendChild(a)
    dl.appendChild(dt)
    dl.appendChild(dd)
  }
  
  spot.appendChild(dl)
}



/*
---------------------------------------------------------------
  NEWS
----------------------------------------------------------------
*/
function News(id, func, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
News.prototype = new JWVUtils()
News.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
News.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.news.data)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["text"]  = p[i]["#text"]
    ele["url"]   = p[i].link
    ele["target"]= p[i].target
    ele["baloon"]= p[i].baloon
    ele["file_name"]  = p[i].file_name
    list.push(ele)
  }
  this.areaConstruction(list)
}

News.prototype.areaConstruction = function(xmldata){
  var items = xmldata
  var len   = items.length || 0
  var spot  = this.getClassArea("div", "boxS-rep", this.$(this.id))[0]
  var anc   = document.createElement("a")
  var p     = document.createElement("p")
  
  if(0 < len){
    p.className = "tpc-check"
    p.innerHTML = items[0].text
    p.style.backgroundImage = "url(../../top/data/news/"+items[0].file_name+")"
/*    p.style.backgroundPosition = "0 0"
    p.style.backgroundRepeat   = "no-repeat"*/
    anc.setAttribute("href",items[0].url)
    anc.setAttribute("_target",items[0].target)
    
    anc.appendChild(p)
    var ul = this.getClassArea("ul", "", spot)
    var dl = this.getClassArea("dl", "", spot)
    if( 0 < ul.length  ){
      spot.insertBefore(anc, ul[0])
    } else if( 0 < dl.length) {
      spot.insertBefore(anc, dl[0])
    } else {
      spot.appendChild(anc)
    }
  }
}



/*
---------------------------------------------------------------
  GreenDay
----------------------------------------------------------------
*/
function GreenDay(id, func, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
GreenDay.prototype = new JWVUtils()
GreenDay.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}
GreenDay.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.data.month)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["month"]  = p[i]["num"]
    ele["day"]    = []
    
    var q = this.parseObjectToArray(p[i]["day"])
    //console.log(this.parseObjectToArray(p[i]["day"]))
    for(var j=0; j< q.length; j++){
      ele["day"][j] = q[j]["num"]
    }
    list.push(ele)
  }
  
  // 現在の日時取得
  var url = location.protocol +"//"+ location.hostname
  var checker = new JWVCst()
  var ct  = new CurrentDate()
  ct.setEventParams(this, this.areaConstruction, list)
  checker.addElements(url + "/top/xml/date_information.xml", ct);
  checker.load()
}

GreenDay.prototype.areaConstruction = function(xmldata){
  var d  = arguments[0] // GREEN DAY 対象日時データ
  var now= arguments[1] ? arguments[1].split("/") : [] // [0]year [1]month [2]day
  var isMatch = false;

  for(var i=0; i<d.length; i++){
    if(parseInt(now[1]) === parseInt(d[i]["month"])){
      for(var j=0; j<d[i]["day"].length; j++){
        //console.log(parseInt(now[2])+" => "+parseInt(d[i]["day"][j]))
        if(parseInt(now[2]) === parseInt(d[i]["day"][j])){
          isMatch = true
          break;
        }
      }
      // 日付が一致していたらループから抜ける
      if(isMatch) break;
    }
  }
  
  // GREEN DAY対象日はバナー表示
  if(isMatch) this.build()
}

GreenDay.prototype.build = function(){
  var d  = document.getElementById(this.id)
  var div= document.createElement("div")
  var a  = document.createElement("a")
  div.className = "green-cast-day"
  div.style.cssText = "text-align:center; margin:0px 0 20px;"
  a.setAttribute("href","http://www.j-wave.co.jp/special/greenday/")
  a.setAttribute("target","_blank")
  a.innerHTML = "<img src='/common/img/holiday/greencasting.jpg' />"
  div.appendChild(a)
  if( d ){
    d.parentNode.insertBefore(div, d)
  }
}



/*
---------------------------------------------------------------
  CURRENT DATE
----------------------------------------------------------------
*/
function CurrentDate(id, func, limit){
  this.id   = id         // AREA
  this.limit= limit || 5 // LIMIT COUNT
  this.xml  = {}         // XML DATA
}
CurrentDate.prototype = new JWVUtils()
CurrentDate.prototype.execute = function(xml){
  this.xml = xml;
  this.parse();
}

CurrentDate.prototype.parse = function(xml){
  var list =[]
  var p = this.parseObjectToArray(this.xml.date_information.data)
  var l = p.length

  for(var i=0; i<l; i++){
    var ele = {}
    ele["date"]  = p[i]["date"]
    list.push(ele)
  }
  
  this.dispatch(list[0]["date"])
}

CurrentDate.prototype.setEventParams = function(scope, func, list){
  this.scope = scope
  this.func  = func
  this.data  = list
}

CurrentDate.prototype.dispatch = function(currentdate){
  this.func.apply(this.scope, [this.data, currentdate])
}





/*
---------------------------------------------------------------
  Utility 
----------------------------------------------------------------
*/

function addEventToElement(id, cls){
  var cls = cls
  var doc = document
  var ele = doc.getElementById(id).getElementsByTagName("img")
  var len = ele.length
  
  for(var i=0;i<len;i++){
    if(ele[i].className == cls){
      var res = ele[i].src.match(/(.+\/)(.+\.(jpg|gif|png))/)
      if(res){
        var p    = ele[i]
        var path = res[1]
        var mouse_on  = res[2].replace(/.+(\..+)/, res[2].match(/(.+)?\./)[1]+"_on"+res[2].match(/.+(\..+)/)[1])
        var mouse_off = res[2]
        var imgsrc_on = doc.createElement("img")
        imgsrc_on.src = path+mouse_on
        
        this.addEvent("mouseover", p, function(m, n){return function(){m.src = n}}(p, imgsrc_on.src))
        this.addEvent("mouseout" , p, function(m, n){return function(){m.src = n}}(p,path+mouse_off))
      }
    }
  }
}

function initialAct(){
  setOrientation()
}

function setOrientation(){
  if( window.orientation != undefined) rePosition( (Math.abs(window.orientation)==90) )
}

function rePosition(rotation){
  if(rotation){
    document.getElementById("area-blog").style.margin = "0"
    document.getElementById("area-onairlist").style.margin = "0 0 0 9px"
  } else {
    document.getElementById("area-blog").style.margin = "0 0 0 9px"
    document.getElementById("area-onairlist").style.margin = "0"
  }
}



/*---------------------------------------------------------------
  EXECUTE
----------------------------------------------------------------*/
JWVUtils.prototype.addEvent("load", window,(function(){
  var DBG = "http://www.j-wave.co.jp"
  if(location.protocol && location.hostname) // ESCAPE CROSSDOMAIN
    DBG = location.protocol +"//"+ location.hostname
  
  var jwc     = new JWVCst()
  var jwcLoop = new JWVCst() // AUTO RELOAD INSTANCE

  jwc.addElements(DBG + "/top/xml/now_on_air_top.xml" , new NowOnAir("NowOnAir"));
  jwc.addElements(DBG + "/top/xml/topics.xml"         , new Topics("topicsArea"));
  jwc.addElements(DBG + "/top/xml/minibanner.xml"     , new MiniBanner("salse-banner"));
  jwc.addElements(DBG + "/top/xml/pickup.xml"         , new PickUp("pickUp"));
  jwc.addElements(DBG + "/top/xml/pr.xml"             , new Pr("topicsArea"));
  jwc.addElements(DBG + "/blog/tokio_system/index.xml", new TokioHot("rankList"));
  jwc.addElements(DBG + "/top/xml/news.xml"           , new News("topicsArea"));
  jwc.addElements(DBG + "/top/xml/cd_online.xml"      , new CdOnLine("cd-online"));
  jwc.addElements(DBG + "/top/xml/ticket_online.xml"  , new TicketOnLine("ticket-online"));
  jwc.addElements(DBG + "/top/xml/book_online.xml"    , new BookOnLine("book-online"));
  jwc.addElements(DBG + "/top/xml/blog_news.xml"      , new BlogNews("blog-latest"));
  jwc.addElements(DBG + "/top/xml/ustream.xml"        , new Ustream("ust"));
  jwc.addElements(DBG + "/top/xml/greenday/"+new Date().getFullYear()+".xml"  ,new GreenDay("programArea"));
  //jwc.addElements(DBG + "/top/xml/greenday/2011.xml"  , new GreenDay("programArea"));
 
  jwcLoop.addElements(DBG + "/top/xml/now_on_air_song.xml", new NowOnAirSong("now-playing"));

  // MAIN
  jwcLoop.load()
  jwc.load()
  setInterval(function(){jwcLoop.load.apply(jwcLoop)}, 180000)
  
  // ADD HEADER ROLLOVER EVENT
  addEventToElement.apply(JWVUtils.prototype,["header", "hover"])
}) )

