/******************************************************************
Global variables
******************************************************************/
var screen_name = '';
var profile_image_url = '';
var lastTweet = new Object();

/******************************************************************
Calls for each purposes
******************************************************************/
function updateTweets(form, account, id, location){
  var regStr = '@' + account;
  var rObj = new RegExp('(' + regStr + ')');

  if(form.status.value.match(rObj)){
    var vals = new Array(createHidden('status', form.status.value));
    var arg = new Array('tweet', id, location);
    execPost('http://twitter.com/statuses/update.xml', form, vals, afterUpdate, arg);
  } else {
    reWriteText('new_status', '文頭に「@ + アカウント名」を付けてこのTwitterアカウントに対してつぶやこう！');
  }
}

function followIt(form, id, location){
  var vals = new Array();
  var arg = new Array('follow', id, location);
  execPost('http://twitter.com/friendships/create/' + form.account.value + '.xml', form, vals, afterUpdate, arg);
}

function getTweets(func, screen_name, param){
  getJsonp('http://twitter.com/statuses/user_timeline.json?screen_name=' + screen_name + '&callback=' + func + (param ? '&' + param : ''));
}

function searchTweets(func, query, param){
  query=(encodeURI(query)).replace('#', '%23');
  getJsonp('http://search.twitter.com/search.json?callback=' + func + '&q=' + query + (param ? '&' + param : ''));
}

function searchTweetsByYats(func, query, param){
  query=(encodeURI(query)).replace('#', '%23');
  getJsonp('http://pcod.no-ip.org/yats/search?json=' + func + '&' + 'query=' + query + (param ? '&' + param : ''));
}

function getRelativeTweetsByYats(func, account, keywords, param){
  var query = '';
  for(var i = 0; i<keywords.length; i++){
    if(i != 0) query += ' or ';
    query += keywords[i];
  }
  searchTweetsByYats(func, query + ' -user:' + account, param);
}

/******************************************************************
Callbacks for each purposes
******************************************************************/
/* callback for account's credential */
function funcOwnCredential(arr) {
  var str = '';
  screen_name = arr.screen_name;
  profile_image_url = arr.profile_image_url;
}

/* callback for owner status */
function funcOwnerStatus(arr) {
  var obj = new dataStatus(arr[0]);
  var str = urlActivate(obj.description);
  $('.owner_status').html(str);
}

/* callback for What's new contents */
function funcWhatsNew(arr) {
  var loopnum = 1;
  var hashtag = '#twinavinews';
  var j = 0;
  for (var i=0; i<arr.length; i++) {
    var obj = new dataStatus(arr[i]);
    if(obj.description.substring(0,hashtag.length) === hashtag){
      j++;
      obj.description = obj.description.replace(hashtag, '');
      var str = viewWhatsNew(obj);

      if(j >= loopnum) break;
    }
  }
  $('.api_whats_new').html(str);
}

/* callback for account's tweets */
function funcOwnTweets(arr) {
  var str = '';
  for (var i=0; i<arr.length; i++) {
    var obj = new dataStatus(arr[i]);
    str += viewTweetAsset(obj, (i%2 ? '' : ' gray'), (i == arr.length - 1 ? ' last' : ''), ' tm', 0);
  }
  $('.api_own_tweets').html(str);
}

/* callback for search a tweet */
function funcSearchTweet(arr) {
  var str = '';
  var j = 0;

  for (var i=0; i<arr.results.length; i++) {
    var obj = new dataSearch(arr.results[i]);
    if(checkNG(obj.screen_name, obj.description)){
      j++;
      if(obj.updated > lastTweet.updated){
        lastTweet = obj;

        str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.results.length - 1 ? ' last' : ''), ' ts', 0);
      }

      if(j >= 1){
        break;
      }
    }
  }
  $('.api_search_tweets').prepend(str);
}

/* callback for search a tweet */
function funcSearchTweet2(arr) {
  var str = '';
  var j = 0;

  for (var i=0; i<arr.results.length; i++) {
    var obj = new dataSearch(arr.results[i]);
    if(checkNG(obj.screen_name, obj.description)){
      j++;
      if(obj.updated > lastTweet.updated){
        lastTweet = obj;

        str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.results.length - 1 ? ' last' : ''), ' ts', 1);
      }

      if(j >= 1){
        break;
      }
    }
  }
  $('.api_search_tweets').prepend(str);
}

/* callback for search tweets */
function funcSearchTweets(arr) {
  var str = '';
  var j = 0;

  for (var i=0; i<arr.results.length; i++) {
    var obj = new dataSearch(arr.results[i]);
    if(checkNG(obj.screen_name, obj.description)){
      if(j == 0) lastTweet = obj;

      j++;
      str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.results.length - 1 ? ' last' : ''), ' ts', 0);
    }
  }
  $('.api_search_tweets').append(str);
}

/* callback for search tweets */
function funcSearchTweets2(arr) {
  var str = '';
  var j = 0;

  for (var i=0; i<arr.results.length; i++) {
    var obj = new dataSearch(arr.results[i]);
    if(checkNG(obj.screen_name, obj.description)){
      if(j == 0) lastTweet = obj;

      j++;
      str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.results.length - 1 ? ' last' : ''), ' ts', 1);
    }
  }
  $('.api_search_tweets').append(str);
}

/* callback for search a tweet by yats */
function funcSearchTweetByYats(arr) {
  var str = '';
  var j = 0;

  for (var i=0; i<arr.length; i++) {
    var obj = new dataYats(arr[i]);
    if(checkNG(obj.screen_name, obj.description)){
      j++;
      if(obj.updated > lastTweet.updated){
        lastTweet = obj;

        str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.length - 1 ? ' last' : ''), ' ts', 1);
      }

      if(j >= 1){
        break;
      }
    }
  }
  $('.api_search_tweets').prepend(str);
}

/* callback for search tweets by yats */
function funcSearchTweetsByYats(arr) {
  var loopnum = 12;
  var str = '';
  var j = 0;

  for (var i=0; i<arr.length; i++) {
    var obj = new dataYats(arr[i]);
    if(checkNG(obj.screen_name, obj.description)){
      if(j == 0) lastTweet = obj;
      j++;
      str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.length - 1 ? ' last' : ''), ' ts', 1);
      if(j >= loopnum){
        break;
      }
    }
  }
  $('.api_search_tweets').append(str);
}

/* callback for relative tweets by yats */
function funcRelativeTweetsByYats(arr) {
  var loopnum = 12;
  var str = '';
  var j = 0;

  for (var i=0; i<arr.length; i++) {
    var obj = new dataYats(arr[i]);
    if(checkNG(obj.screen_name, obj.description)){
      if(j == 0) lastTweet = obj;
      j++;
      str += viewTweetAsset(obj, (j%2 ? ' gray' : ''), (i == arr.length - 1 ? ' last' : ''), ' ts', 0);
      if(j >= loopnum){
        break;
      }
    }
  }
  $('#relative_tweets_yats').append(str);
}

/******************************************************************
Views for each purposes
******************************************************************/
/* view for plain tweet */
function viewPlain(obj) {
  var str = '';
  str += urlActivate(obj.description) + '<br />';
  str += sinceTime(obj.updated);
  return str;
}

/* view for plain tweet */
function viewWhatsNew(obj) {
  var str = '';
  str += '<div class="floatlefter">';
  str += '<a href="http://twitter.com/' + obj.screen_name + '" target="_blank"><img src="' + obj.profile_image_url + '" alt="' + obj.screen_name + '" /></a>';
  str += '</div>';
  str += '<div class="account_set floatlefter">';
  str += '<div class="account tm"><a href="http://twitter.com/' + obj.screen_name + '" target="_blank">' + obj.screen_name + '</a></div>';
  str += '<div class="account_name">Twitterの最新情報を日々つぶやいています。</div>';
  str += '</div>';
  str += '<div class="floatstopper"></div>';
  str += '<div class="box_cont gray solo">';
  str += '<p>' + urlActivate(obj.description) + '<br />' + sinceTime(obj.updated) + '</p>';
  str += '</div>';
  return str;
}

/* view for tweet asset */
function viewTweetAsset(obj, gray, last, t_logo, flg) {
  var str = '';
  str += '<div class="box_cont' + gray + last + '">';
  str += '<div class="floatlefter">';
  str += '<a href="' + 'http://twitter.com/' + obj.screen_name + '" target="_blank">';
  str += '<img width="48" src="' + obj.profile_image_url + '" alt="" />';
  str += '</a>';
  str += '</div>';
  str += '<div class="account_set floatlefter">';
  str += '<div class="account' + t_logo + '"><a href="' + 'http://twitter.com/' + obj.screen_name + '" target="_blank">' + obj.screen_name + '</a></div>';
  str += '<p>';

  if(flg == 1){
    str += urlActivate(obj.description);
    str += '</p>';
    str += '<p class="datetime">';
  } else {
    str += urlActivate(obj.description) + '<br />';
  }

  str += sinceTime(obj.updated);
  str += '</p>';

  if(flg == 1){
    str += '<form>';
    str += '<input type="image" class="reply" src="/img/btn_reply_s.png" title="リプライする" onclick="replyAction(\'@' + obj.screen_name + '\');return false;" />';
    str += ' <input type="image" class="retweet" src="/img/btn_rt_s.png" title="引用してリトゥィートする" onclick="replyAction(\'RT @' + obj.screen_name + ': ' + obj.description + '\');return false;" />';
    str += '</form>';
  }

  str += '</div>';
  str += '<div class="floatstopper"></div>';
  str += '<!-- box_cont --></div>';
  return str;
}

/******************************************************************
Datas for each APIs
******************************************************************/
/* datas one by one */
function dataByEach(a, b, c) {
  this.screen_name = a;
  this.description = b;
  this.profile_image_url = c;
  this.updated = (new Date()).getTime();
}
/* datas for rest api status */
function dataStatus(obj) {
  var t = obj.created_at.split(' ');

  this.screen_name = obj.user.screen_name;
  this.profile_image_url = obj.user.profile_image_url;
  this.description = obj.text;
  this.updated = (new Date(t[1] + ' ' + t[2] + ',' + t[5] + ' ' + t[3] + ' ' + t[4])).getTime();
}

/* datas for search api */
function dataSearch(obj) {
  var t = obj.created_at.split(' ');

  this.screen_name = obj.from_user;
  this.profile_image_url = obj.profile_image_url;
  this.description = obj.text;
  this.updated = (new Date(t[2] + ' ' + t[1] + ',' + t[3] + ' ' + t[4] + ' ' + t[5])).getTime();
}

/* datas for yats api */
function dataYats(obj) {
  var week = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

  var d_parts = obj.time2.split('T');
  var d = d_parts[0].split('-');
  var t = d_parts[1].substring(0, 8);
  var zone = d_parts[1].substring(8, 13).replace(':', '');
  this.updated = (new Date(week[d[1] - 1] + ' ' + d[2] + ',' + d[0] + ' ' + t + ' ' + zone)).getTime();

  this.screen_name = obj.user;
  this.profile_image_url = obj.image;
  this.description = obj.content;
}

/******************************************************************
General logics
******************************************************************/
function getJsonp(url){
  var s = document.createElement('script');
  var head = document.getElementsByTagName('head').item(0);

  s.setAttribute('type', 'text/javascript');
  s.setAttribute('src', url);
  s.setAttribute('charset', 'UTF-8');
  head.appendChild(s);
}
function execPost(url, form, vals, func, arg){
  // Only if screen_name is '', generate interval, so that you can avoid losing timerID.
  if(screen_name == '') {
    // try getting credentials
    getJsonp('http://twitter.com/account/verify_credentials.json?callback=funcOwnCredential');

    // initialize timerID
    if( window.timerID != undefined ) {
      clearInterval(timerID);
      timerID = null;
    }

    // sleep logic
    timerID = setInterval( function(){
      if(screen_name != ''){
        clearInterval(timerID);
        timerID = null;

        updateTwitter(url, form, vals);
        if(func != 0) func(arg);
      }
    },1000);
  } else {
    updateTwitter(url, form, vals);
    if(func != 0) func(arg);
  }
}
function updateTwitter(url, form, vals){
  var f = this.document.getElementById('TwiterAPIForm');
  if (!f) {
    f = this.document.createElement('form');
    f.id = 'TwiterAPIForm';
    f.method = 'POST';
    f.target = 'TwiterAPIFrame';
    f.style.display = 'none';
    var i = this.document.createElement('iframe');
    i.name = 'TwiterAPIFrame';
    f.appendChild(i);
    this.document.body.appendChild(f);
    i.contentWindow.name = i.name;
  }
  f.action = url;
  var children = f.childNodes;
  var dels = new Array();
  for (var i=0; i<children.length; i++) {
    var c = children[i];
    if (c.tagName.toLowerCase() == 'input') {
      dels.push(c);
    }
  }
  for (var i=0; i<dels.length; i++) { f.removeChild(dels[i]); }
  if (vals) {
    for (var i=0; i<vals.length; i++) { f.appendChild(vals[i]); }
  }
  f.submit();
}
function sinceTime(date) {
  var now = (new Date()).getTime();
  var difmilsec = now - date;
  return '(' + (Math.floor(difmilsec/(60 * 1000)) < 60 ? Math.floor(difmilsec/(60 * 1000)) + '分前' : (Math.floor(difmilsec/(3600 * 1000)) < 24 ? Math.floor(difmilsec/(3600 * 1000)) + '時間前' : Math.floor(difmilsec/(86400 * 1000)) + '日前')) + ')';
}
function urlActivate(str) {
  var rObj = new RegExp(/(http|https):\/\/([\w-]+\.)+[\w-]{2,4}(:\d+)?(\/[\w%=@&~,:+!{}`_\-\.\/\?\[\]]*)?/g);
  if(str.match(rObj)){
    var link = String(str.match(rObj)).split(",");
    link = array_unique(link);
    for(var i in link){
      str = str.replace(link[i], '<a href="' + link[i] + '" target="_blank" >' + link[i] + '</a>');
    }
  }

  var rObj = new RegExp(/#([\w-]+)/g);
  if(str.match(rObj)){
    var link = String(str.match(rObj)).split(",");
    link = array_unique(link);
    for(var i in link){
      str = str.replace(link[i], '<span class="link" onClick="getResults(\'' + link[i] + '\', \'' + link[i] + '\', 1, 1);" >' + link[i] + '</span>');
    }
  }

  var rObj = new RegExp(/@([\w-]+)/g);
  if(str.match(rObj)){
    var link = String(str.match(rObj)).split(",");
    link = array_unique(link);
    for(var i in link){
      str = str.replace(link[i], '<span class="link" onClick="getResults(\'' + link[i] + '\', \'' + link[i] + '\', 1, 1);" >' + link[i] + '</span>');
    }
  }

/*
  var rObj = new RegExp(/(http|https):\/\/([\w-]+\.)+[\w-]{2,4}(:\d+)?(\/[\w%=@&~,:+!{}`_\-\.\/\?\[\]]*)?/);
  var text = str;
  if(str.match(rObj)){
    var link = str.match(rObj)[0];
    text = str.replace(rObj, '<a href="' + link + '" target="_blank" >' + link + '</a>');
  }
*/
  return str;
}
function checkNG(from, text){
  var ret = true;
  var rObj = new Array(

// ▼▼▼ NGワード編集ここから ▼▼▼
    new RegExp(/舐め/),
    new RegExp(/[sSＳ][eEＥ][xXＸ]/),
    new RegExp(/[セｾせ][ッｯっツﾂつ][クｸく][スｽす]/),
    new RegExp(/[セｾせ][クｸく][スｽす]/),
    new RegExp(/(盗|はめ|ハメ|隠し)撮/),
    new RegExp(/[わワ割][れレ][めメ目]/),
    new RegExp(/[ちチ][んン]([こコ]|[ぽポ]|[ちチ][んン])/),
    new RegExp(/[まマ][んン][こコ]/),
    new RegExp(/[おオ][めメ][こコ]/),
    new RegExp(/[氏死][ねネ]/),
    new RegExp(/流出.*(動画|画像)/),
    new RegExp(/ロリコン/),
    new RegExp(/(おっぱい|オッパイ)/),
    new RegExp(/(エッチ|えっち)/),
    new RegExp(/(アフィリエイト|ｱﾌｨﾘｴｲﾄ)/),
    new RegExp(/風俗/),
    new RegExp(/AV女優/),
    new RegExp(/潮吹き/),
    new RegExp(/フェラ[^ー][^リ]/),
    new RegExp(/性欲/),
    new RegExp(/乱交|性交/),
    new RegExp(/不倫/),
    new RegExp(/パンチラ/),
    new RegExp(/ゲイ/),
    new RegExp(/レズ/),
    new RegExp(/アナル/),
    new RegExp(/フェチ/),
    new RegExp(/陰(茎|唇|毛|部|核)/),
    new RegExp(/ヌード/),
    new RegExp(/カリビアン.*コム/),
    new RegExp(/デリ(バリー)?ヘル(ス)?/),
    new RegExp(/boob/),
    new RegExp(/レイプ/),
    new RegExp(/虐待/),
    new RegExp(/パイパン/),
    new RegExp(/陵辱/),
    new RegExp(/おさわり/),
    new RegExp(/ラブホ/),
    new RegExp(/セクハラ/),
    new RegExp(/浣腸|エネマ/),
    new RegExp(/アイコラ/),
    new RegExp(/姦/),
    new RegExp(/出会掲示板/),
    new RegExp(/乳首/),
    new RegExp(/(お宝|無料)動画/),
    new RegExp(/白濁液/),
    new RegExp(/淫乱/),
    new RegExp(/騎乗位/),
    new RegExp(/輪姦/),
    new RegExp(/どすけべ/),
    new RegExp(/(巨|暴|美)乳/)
// ▲▲▲  編集ここまで  ▲▲▲
  );

  for(var i = 0; i < rObj.length; i++){
    if(text.match(rObj[i])) ret = false;
  }

  var ngaccounts = new Array(
// ▼▼▼ NGアカウント編集ここから ▼▼▼
  'sample1',
  'sample2',
  'sample3'
// ▲▲▲  編集ここまで  ▲▲▲
  );

  for(var i = 0; i < ngaccounts.length; i++){
    if(from.match(ngaccounts[i])) ret = false;
  }

  return ret;
}
function reWriteText(className, str){
  $('.' + className).fadeOut('slow',function() {
    $('.' + className).val(str);
    $('.' + className).fadeIn('slow');
  });
}
function createHidden(name, value) {
  var h = this.document.createElement('input');
  h.type = 'hidden';
  h.name = name;
  h.value = value;
  return h;
}

function array_unique(Arr){
  var storeArr = new Array;
  var ret = new Array;
  i=0;
  f=0;
  while(Arr[i] != null){
    if(Arr[i] != ""){
      if(storeArr[String(Arr[i])]){
      }else{
        storeArr[String(Arr[i])] = 1;
        ret[f]=Arr[i];
        f++;
      }
    }
    i++;
  }
  return ret;
}
