

function MJWidget(scriptId) {
  this.widgetType = 'topiclist';
  this.query = '';
  this.limit = 10;
  this.width = '200px';
  this.height = null;
  this.backgroundColor = null;
  this.border = null;
  this.padding = '6px';
  this.title = null;
  this.titlePanel = null;
  this.overflow = null;
  this.showSearchBox = true;
  this.showDate = true;
  this.showViewCount = false;
  this.showTotalCount = true;
  this.of = 'date';
  this.summaryLength = 120;
  
  this.titleLength = 50;
  this.sumaryLength = null;
  this.fontColor = null;
  this.color = null;
  this.linkTarget = null;
  
  
  this.query='バレーボール　大会';
  
  this.limit = parseInt('10');
  
  this.width='200px';
  
  this.border='1px solid #cccccc';
  
  this.title='『バレーボール　大会』ニュース';
  
  this.titleLength=parseInt('50');
  
  this.summaryLength=parseInt('120');
  
  this.of='date';
  
  this.showSearchBox = '1' == '1';
  
  this.showDate = '1' == '1';
  
  this.showSummary = '1' == '1';
  
  this.fontSize = '12px';
  
  this.linkTarget = '_blank';
  
  
  if(!this.title) {
    if(this.of == 'date') {
      this.title = '最新ニュース';
    }else if(this.of == 'score') {
      this.title = 'トップニュース';
    }
  }

  this.classNamePrefix = "mjw_";
  this.scriptId = scriptId;
  var script = document.getElementById(scriptId);  
  this.panel = document.createElement('div');
  this.panelId = scriptId + '_panel'; 
  
  if(this.width) {
    this.panel.style.width = this.width;
  }
  if(this.height) {
    this.panel.style.height = this.height;
  }
  if(this.backgroundColor) {
    this.panel.style.backgroundColor = this.backgroundColor;
  }  
  if(this.color) {
    this.panel.style.color = this.color;
  }
  if(this.border) {
    this.panel.style.border = this.border;
  }
  if(this.padding) {
    this.panel.style.padding = this.padding;
  }
  
  if(this.overflow) {
    this.panel.style.overflow = this.overflow;
  }
  
  this.panel.className = this.classNamePrefix + 'frame';
  if(this.fontSize) {
    this.panel.style.fontSize = this.fontSize;
  }
  this.panel.style.lineHeight = '16px';
  script.parentNode.insertBefore(this.panel, script);   
  
  var title = document.createElement('div');
  title.className = this.classNamePrefix + 'title';
  title.style.fontWeight='bold';
  var img = document.createElement('img');
  img.src = 'http://mediajam.info/compo/images/widget/icon_favicon.gif';
  img.alt = 'mediajam';
  title.appendChild(img);
  title.appendChild(document.createTextNode(this.title));
  this.panel.appendChild(title);
  this.titlePanel = title;
  
  this.content = document.createElement('div');
  this.panel.appendChild(this.content);
  

  var loader = document.createElement('div');
  loader.style.textAlign='center';
  this.content.appendChild(loader);
  
  loader.appendChild(document.createTextNode('Loading...'));
  
  var pageUrl = encodeURI(window.location);
  var pageTitle = encodeURI(document.title);
  var pageRef = encodeURI(document.referrer);
  
  var loadScript = createLoadScript('mjdataloader_'+this.scriptId, 
                                  'http://mediajam.info/blogparts/topiclist/data.json?jsonp=mjwidget['+"'"+this.scriptId+"'"+'].onLoadData' 
                                   + '&query=' + encodeURI(this.query)
                                   + '&limit=' + this.limit 
                                   + '&of=' + this.of + '&os=desc' 
                                   + '&enc=UTF-8'
                                   + '&wurl=' + pageUrl + '&wtitle=' + pageTitle + '&wtype=' + this.widgetType
                                   + '&ref=' + pageRef);

  this.panel.appendChild(loadScript);
}

function createLoadScript(id, src) {
  var loadScript = document.createElement('script');
  loadScript.id = id;
  loadScript.src = src;
  loadScript.type = 'text/javascript';
  return loadScript;
}


MJWidget.prototype.clearContent = function() {
  var nodes = this.content.childNodes;
  for (var i=0; i < nodes.length; i++) {
    this.content.removeChild(nodes[i]);
  }
}

MJWidget.prototype.onLoadData = function(json) {
  this.clearContent();
  
  if(json.result == 'success') {
    if(json.totalCount > 0) {
      this.renderContent(json);
    }else{
      this.renderEmptyResult(json);
    }
  }else{
    this.renderError(json);
  }
  this.renderFooter(json);
};
MJWidget.prototype.renderContent = function(json) {
  
  for(i = 0;i < json.list.length;i++) {
    var topic = json.list[i];
    var t = document.createElement('div');
    this.content.appendChild(t);
    t.className = this.classNamePrefix + 'topic';
    t.style.margin = '2px 0';
    t.style.padding = '2px 0';
    if(this.border) {
      t.style.borderTop = this.border;
    }
    
    var link = document.createElement('a');
    link.className = this.classNamePrefix + 'title';
    link.href = topic.url;
    if(this.linkTarget) {
      link.target = this.linkTarget;
    }
    var title = topic.article.title;
    if(this.titleLength && title.length > this.titleLength) {
        title = title.substr(0, this.titleLength) + '...';
    }
    link.appendChild(document.createTextNode(title));
    if(this.showViewCount) {
      link.appendChild(document.createTextNode('(' + topic.viewCount + ')'));
    }
    
    t.appendChild(link);
    
    
    var info = document.createElement('span');
    info.className = this.classNamePrefix + 'info';
    
    var span = document.createElement('span');
    span.className = this.classNamePrefix + 'source';
    span.appendChild(document.createTextNode(' - ' + topic.article.source));
    info.appendChild(span);
    
    if(this.showDate) {
      var now = new Date();
      var span = document.createElement('span');
      span.className = this.classNamePrefix + 'date';
      var date = new Date(topic.article.date);
      var text = '';
      if(now.getYear() == date.getYear() && now.getMonth() == date.getMonth() && now.getDate() == date.getDate()) {
        var mm = date.getMinutes();
        text = date.getHours() + ':' + (mm < 10 ? '0' + mm : mm);
      }else{
        text = date.getMonth() + 1 +'/'+ date.getDate();
      }
      span.appendChild(document.createTextNode(' - ' + text));
      info.appendChild(span);
    }
    
    
    if(info.childNodes.length > 0) {
      t.appendChild(info);
    }
    
    if(this.showSummary && topic.article.summary) {
      var div = document.createElement('div');
      div.className = this.classNamePrefix + 'summary';
      var summary = topic.article.summary.replace('　', '');
      if(this.summaryLength && summary.length > this.summaryLength) {
        summary = summary.substr(0, this.summaryLength) + '...';
      }
      div.appendChild(document.createTextNode(summary));
      t.appendChild(div);
    }
  }
};

MJWidget.prototype.renderEmptyResult = function(json) {
  var t = document.createElement('div');
  t.className = this.classNamePrefix + 'error';
  t.style.margin = '2px 0';
  t.style.padding = '2px 0';
  t.appendChild(document.createTextNode('該当する記事は見つかりませんでした。'));
  if(this.border) {
    t.style.borderTop = this.border;
  }
  this.content.appendChild(t);
};

MJWidget.prototype.renderError = function(json) {
  var t = document.createElement('div');
  this.content.appendChild(t);
  t.className = this.classNamePrefix + 'error';
  if(json && json.exception.className == 'com.ubicast.gaia.service.impl.BlankQueryException') {
    t.appendChild(document.createTextNode('該当する記事は見つかりませんでした。'));
  }else{
    t.appendChild(document.createTextNode('該当する記事は見つかりませんでした。'));
  }
};


MJWidget.prototype.renderFooter = function(json) {
  if(this.showSearchBox) {
    var form = document.createElement('form');
    form.className = this.classNamePrefix + 'searchForm';
    
    if(this.border) {
      form.style.borderTop = this.border;
    }
    form.style.margin = '6px 0';
    form.style.padding = '2px 0';
    form.style.textAlign = 'center';
    form.action = 'http://mediajam.info/topic/';
    form.method = 'GET';
    
    var input = document.createElement('input');
    input.name = 'query';
    input.type = 'text';
    input.value = this.query;
    input.size = 15;
    form.appendChild(input);
    
    var submit = document.createElement('input');
    submit.type = 'submit';
    submit.value = '検索';
    
    form.appendChild(submit);
    
    this.content.appendChild(form);
  }
  
  if(json && json.pr) {
    var pr = document.createElement('div');
    pr.className = this.classNamePrefix + 'pr';
    if(this.border) {
      pr.style.borderTop = this.border;
    }
    pr.style.textAlign='center';
    pr.style.margin = '6px 0';
    pr.style.padding = '2px 0';
    pr.style.fontSize = '10px';
    
    for(i = 0;i < json.pr.length;i++) {
      var item = json.pr[i];
      var d = document.createElement('div');
      if(item.type == 'announcement') {
        d.appendChild(document.createTextNode('[告知]'));
      }else if(item.type == 'advertisement') {
        d.appendChild(document.createTextNode('[PR]'));
      }
      var a = document.createElement('a');
      a.href = item.url;
      if(this.linkTarget) {
        a.target = this.linkTarget;
      }
      a.appendChild(document.createTextNode(item.title));
      d.appendChild(a);
      
      pr.appendChild(d);
    }   
    
    this.content.appendChild(pr);
  }
  {
    var info = document.createElement('div');
    info.className = this.classNamePrefix + 'getit';
    info.style.marginTop = '5px';
    info.style.textAlign = 'center';
    
    var a = document.createElement('a');
    a.href = 'javascript:void(0);';
    var _this = this;
    a.onclick = function() {
      var code = document.getElementById(_this.panelId + '_code');
      if(code.style.display == 'block') {
        code.style.display = 'none';
      }else{
        code.style.display = 'block';
      }
    };
    
    var img = document.createElement('img');
    img.src = 'http://mediajam.info/compo/images/widget/btn_duplicate.gif';
    img.alt = 'このブログパーツが欲しい';
    a.appendChild(img);
    info.appendChild(a);
    this.content.appendChild(info);
    
    var codeDiv = document.createElement('div');
    codeDiv.id = this.panelId + '_code';
    codeDiv.style.display = 'none';
    
    var p = document.createElement('p');
    p.appendChild(document.createTextNode('このHTMLコードをページに埋め込んでください。利用者は本ブログパーツを利用することをもって'));
    a = document.createElement('a');
    a.href = 'http://mediajam.info/siteinfo/terms.html';
    a.appendChild(document.createTextNode('利用規約'));
    p.appendChild(a);
    p.appendChild(document.createTextNode('の内容に同意したものとみなします。'));
    codeDiv.appendChild(p);
       
    var code = document.createElement('textarea');
    codeDiv.appendChild(code);
    code.onclick = function() { this.select(); };
    code.style.fontSize = '10px';
    code.cols=30;
    code.rows=3;
    var scriptUrl = 'http://mediajam.info/blogparts/topiclist/script.js?sid=mjw_topiclist&query=%E3%83%90%E3%83%AC%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%AB%E3%80%80%E5%A4%A7%E4%BC%9A&sb=1&dt=1&smr=1&smrlen=120&tlen=50&limit=10&w=200px&border=1px%20solid%20%23cccccc&fs=12px&of=date&enc=UTF-8&ltrg=_blank';
    code.appendChild(document.createTextNode('<script type="text/javascript" id="' + this.scriptId + '" src="' + scriptUrl + '"></script>'));
    
    info.appendChild(codeDiv);
  }
  
  var copy = document.createElement('p');
  copy.className = this.classNamePrefix + 'copyright';
  copy.style.textAlign = 'center';
  copy.style.margin = '8px 0 0';
  copy.style.fontSize = '10px';
  copy.appendChild(document.createTextNode('Generated by '));
  a = document.createElement('a');
  a.href='http://mediajam.info/';
  a.appendChild(document.createTextNode('mediajam'));
  copy.appendChild(a);
  this.content.appendChild(copy);
};


MJWidget.prototype.createXmlHttpRequest = function() {
  var xmlhttp = false;
  if( window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
  } else if(window.ActiveXObject) {
    try {
      xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
    } catch(e) {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlhttp;
};

var mjwidget;

(function() {
  if(mjwidget == undefined) {
    mjwidget = new Object();
  }

  scriptId = 'mjw_topiclist';
  mjwidget[scriptId] = new MJWidget(scriptId);
})()

