/*

  epg_search.js -- EPGデータから、番組表を検索する

  使い方:

  week.html:
    <div>
      <script language="javascript" src="epg_search.js"></script>
    <div id="search">
      <script language="javascript">
        load_programs("KCT","epg.json","#33FF66");
        load_programs("KCT2","epg_207ch.json","#339966");
        form();</script>
    </div>
    </div>

    load_programs(id,url,color);

      id              // チャンネル名(名前空間を分離するためのHTML内でユニークな文字列)
      url_of_epg_json // EPGデータ(epg.json)の URL
      color           // チャンネルの背景色


  $Id$

*/

writeToResultId='';
msie=false;
searchWord='';

if(typeof(g) == 'undefined'){ var g=new Array(); }; // グローバル


function makeRequest(){
//
// HTTP Request を返す
//

  if (window.ActiveXObject){ msie=true; };

  var http_request=false;

  if (window.XMLHttpRequest) { // Mozilla, Safari,...
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
        //http_request.overrideMimeType('text/xml');
        // See note below about this line
    }
  }else if (window.ActiveXObject){ // IE
    try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
    }
  }
  if (!http_request) {
    alert('Giving up :( Cannot create an XMLHTTP instance');
    return false;
  }
  return http_request;

}

function setEventOn(element,ev,cont){

  if(msie){
    element.setAttribute(ev,new Function(cont));
  }else{
    element.setAttribute(ev,cont);
  }

  return true;
}


function form(v){
//
// 検索フォームを返す
//

  f=document.createElement("form");

  q=document.createElement("input");
  q.setAttribute("type","text");
  q.setAttribute("value",v);

  b=document.createElement("input");
  b.setAttribute("type","button");
  b.setAttribute("value","リロード");
  setEventOn(b,"onclick","start()");

  span=document.createElement("span");
  span.style.cssText="font-weight: bold;";
  span.appendChild(document.createTextNode("キーワード検索："));

  w_span=document.createElement("span");
  w_span.style.cssText="font-size: 80%;";

  setEventOn(q,"onkeyup","search(this.value)");
  f.appendChild(span);
  f.appendChild(q);
  f.appendChild(w_span);

  return f;

}


function search_program(v){

  regex=new RegExp();
  p=new Array();

  regex.compile(v,"i");

  var results=new Array();

  for(var id in g){
    for(var pi in g[id].programs){
      if((g[id].programs[pi].title.match(regex)!=null)
         ||(g[id].programs[pi].desc.match(regex)!=null)){
        results[results.length]=new Array(id,g[id].programs[pi]);
      }
    }
  }

  results.sort(function(a,b){ return ((a[1].date*1000000+a[1].start)
                                       -(b[1].date*1000000+b[1].start))});
  return results;

}

function search(v){

  if(v==''||v==searchWord){return;}

  searchWord=v;
  var results=search_program(v);

  writeTo=document.getElementById(writeToResultId);
  writeTo.innerHTML='';

  message=document.createElement('div');
  message.style.cssText="color: red;";
  if(results.length>0){
    message.appendChild(document.createTextNode(results.length+"件見つかりました。"));
    writeTo.appendChild(message);
    writeTo.appendChild(table_of_programs(results));
  }else{
    message.appendChild(document.createTextNode("見つかりません!"));
    writeTo.appendChild(message);
  }

}

function table_of_programs(results){

  table=document.createElement("table");
  table.style.cssText="border-style: none none solid none; border-width: 2px; border-color: silver;"

  tbody=document.createElement("tbody");
  table.appendChild(tbody);

  for(pi in results){
    var id=results[pi][0];
    var prog=results[pi][1];

    var p_day= new Date(Math.floor(prog.date/10000)
                        ,Math.floor(prog.date/100)%100-1
                        ,prog.date%100
                        ,0 ,0 ,0);
    var p_string=" "+(p_day.getMonth()+1)
                  +"/"+p_day.getDate()+"("
                  +["日","月","火","水","木","金","土"][p_day.getDay()]+")";


    var t_string=(" "+Math.floor(prog.start/10000)).slice(-2)
                 +":"+("0"+Math.floor((prog.start%10000)/100)).slice(-2);

    tr_1=document.createElement("tr");
    td_DateTime=document.createElement("td");
    td_DateTime.style.cssText="vertical-align: top; color: blue;"
                           +"border-style: solid none none none;"
                           +"border-width: 2px; border-color: silver;" ;
    td_title=document.createElement("td");
    td_title.style.cssText="font-weight: normal;"
                           +"border-style: solid none none none;"
                           +"border-width: 2px; border-color: silver;" ;

    div_desc=document.createElement("div");
    div_desc.style.cssText="font-size: 80%; color: #888888;";

    td_ch=document.createElement("td");
    td_ch.style.cssText="background-color: "+g[id].color+"; color: #000000;"
                         +"padding: 0.5em;"
                         +"font-size: 80%; color: #000000;"
                         +"border-style: solid none none none;"
                         +"border-width: 2px; border-color: silver;" ;

    for(var c=0;c<id.length;c++){
      td_ch.appendChild(document.createTextNode(id.charAt(c)));
      td_ch.appendChild(document.createElement('br'));
    }

    td_DateTime.appendChild(document.createTextNode(p_string+" "+t_string));
    td_title.appendChild(document.createTextNode(prog.title));
    div_desc.appendChild(document.createTextNode(prog.desc));
    td_title.appendChild(div_desc);

    tr_1.appendChild(td_DateTime)
    tr_1.appendChild(td_ch)
    tr_1.appendChild(td_title)
    tbody.appendChild(tr_1);

  }

  return table;

}



function load_programs(id,url,color){
//
// 番組表を表示するためにデータをリクエストする
//

  g[id]=new Array();       // 名前空間を作成

  g[id].id=id;
  g[id].url=url;
  g[id].color=color; // チャンネル表示色

  g[id].req=makeRequest(); // リクエストオブジェクトを作成
  // ? 以降はキャッシュを無効にするためにつけてます。
  g[id].req.open('GET',g[id].url+"?"+(new Date()).getTime());
  g[id].req.onreadystatechange=function(){
    if(g[id].req.readyState==4 && g[id].req.status==200){
      g[id].programs=eval(g[id].req.responseText);
    }
  }
  g[id].req.send(null);

}

function start(_searchFormId,_writeToResultId){

  writeToResultId=_writeToResultId;
  writeTo=document.getElementById(_searchFormId);
  writeTo.innerHTML='';
  writeTo.appendChild(form(''));

}


