var loaderImg = document.createElement("img");
loaderImg.src = "../img/ajax-loader.gif";
loaderImg.alt = "Now Loading...";
loaderImg.width = 32;
loaderImg.height = 32;
var loader = document.createElement("div");
loader.id = "loaderImage";
loader.appendChild(loaderImg);

// 形態素解析オブジェクト
var g = new GamMo();
// 本文のマルコフ辞書
var m = new Markov();
// タイトルのマルコフ辞書
var titleDic = new Markov();
// ボタン
var addB, generateB;
// エントリ ID カウンター
var entryID = 0;



function generate() {
  var title = titleDic.generator(35);
  var text =  m.generator(100);
  if (title && text) {
    title = title.join(""), text = text.join("");
    generateB.value("Now Making...");
    entryID++;
    var result = document.getElementById("result");
    result.insertBefore(loader, result.firstChild);
    var entry = document.createElement("div");
    entry.id = "entries" + entryID;
    entry.className = "entry";
    var h = document.createElement("h3");
    h.appendChild(document.createTextNode(title));
    entry.appendChild(h);
    result.insertBefore(entry, result.firstChild);
    getImage(text);
    setTimeout(function() {
      var p = document.createElement("p");
      //p.appendChild(document.createTextNode(text));
      p.innerHTML = text.replace("([<>\"])", function(m0, m1) {
        return {"<": "&lt;", ">": "&gt;", '"': "&quot;"}[m1];
      });
      entry.appendChild(p);
      if ($("loaderImage")) $("loaderImage").parentNode.removeChild($("loaderImage"));
      generateB.Off();
    }, 5000);
  } else {
    getRSS();
  }
}


function getImage(text) {
  var s = [];
  if (g.Kanji(text)) s = s.concat(g.Kanji(text));
  if (g.Katakana(text)) s = s.concat(g.Katakana(text));
  if (g.Word(text)) s = s.concat(g.Word(text));
  if (s.length) {
    getFlickrImagePipe(s.rand());
  }
}

function getRSS() {
  var feed = $('inputFeed').value;
  var feed2 = $("inputFeed2").value;
  if (!(feed || feed2)) {
    alert("フィードの URL を入力してください");
    generateB.Off();
    return;
  }
  addB.value("Loading...");
  generateB.value("Feed Loading...");
  $("result").insertBefore(loader, $("result").firstChild);
  getRSSPipe(feed, feed2);

}

/* -------------------------  callback function  ---------------------------- */
function responseRSS(json) {
  if (json) {
    var items = json.value.items;
    for (var i = 0, len = items.length; i < len; i++) {
      titleDic.add(g.parse(items[i].title));
      m.add(g.parse(items[i].description || items[i].title));
    }
    $("loaderImage").parentNode.removeChild($("loaderImage"));
    if (!items.length) {
      alert("フィードを読み込めませんでした。\n正しいフィードか確認してください。");
      addB.Off();
      generateB.Off();
      return;
    }
    addB.Off();
    generate();
  }
}

function responseImage(json) {
  if (json) {
    var images = [];
    var items = json.value.items;
    for (var i = 0; i < items.length; i++) {
      images.push({"link": items[i].link,
        "src": items[i]["y:flickr"].img,
        "title": items[i].title});
    }
    if (images.length) {
      var image = images.rand();
      var a = document.createElement("a");
      a.href = image.link;
      a.target = "_blank";
      a.title = image.title;
      var img = document.createElement("img");
      img.src = image.src;
      img.alt = image.title;
      img.className = "randomImage";
      a.appendChild(img);
      $("entries" + entryID).appendChild(a);
    }
  }
}

/* =============================== Yahoo! Pipes ============================= */

function getRSSPipe(feed, feed2) {
  var pr = new PipesRequest();
  pr.query.id = "BHDIKOni2xG9TdW6y6ky6g";
  pr.query.callback = "responseRSS";
  pr.inputQuery = {"s": feed, "s2": feed2};
  pr.set();
}

function getFlickrImagePipe(word) {
  var w = encodeURIComponent(word);
  var pr = new PipesRequest();
  pr.query.id = "MltAVZLR2xGacwKMJphxuA";
  pr.query.callback = "responseImage";
  pr.inputQuery = {"n": 10, "q": w};
  pr.set();
}
/* ========================================================================= */

function buttonDisable(b) {
  var self = this;
  this.button = b;
  this.dv = b.value;
  this.On = function() {return this.button.disabled = true;};
  this.Off = function() {
    this.button.disabled = false;
    this.button.value = this.dv;
  };
  this.value = function(v) {return this.button.value = v;};
  //this.defaultValue = function() {return };
  this.set = function() {return addEvent(this.button, "click", function(){self.On();}, false);
  }
}

addEvent(window, "load", function() {
  addB = new buttonDisable($("addButton"));
  generateB = new buttonDisable($("generateButton"));
  addB.set(), generateB.set();
}, false);
