/**
 *
 * twiparts plugin.
 *
 * Copyright 2011, NTT Prime Square Inc. & Primal Corp. 
 *
 * Redistributions of files must retain the above copyright notice.
 * @copyright       Copyright 2011,  NTT Prime Square Inc. & Primal Corp. 
 * @link            http://www.nttps.co.jp/ NTT Prime Square Inc. http://www.primal-biz.co.jp/ Primal Corp. 
 * @version         0.0.1
 * @lastmodified    $Date: 2011-01-12 22:00:00 +0900 (Wed, 12 Jan 2011) $
 * @license         http://www.gnu.org/licenses/gpl.html The GNU General Public Licence
*/

/* settingsファイル設定 */
document.write('<script type="text/javascript" src="js/twiparts/twiparts-settings.js"></script>');

$(document).ready(function(){
  /** キーワードのデータを取得 */
  $.ajax({
      url:'//search.twitter.com/search.json?q='+encodeURIComponent(settings.keyword)+'&lang='+settings.language,
      type:'get',
      dataType:'jsonp',
      success:function(data){
         var loopCnt=0;
         var twipartsDiv=$('#twiparts');
         //アイテムリスト生成
         var twipartsUl=document.createElement("ul");
         twipartsUl.className="twipartsListUl";
         //データ日付ソート
         data.results=itemSort(data.results,settings.itemTweetTimeOrder);
         //検索結果のつぶやき数を保持
         //つぶやきリスト作成
         $.each(data.results,function(i,item){
             if(loopCnt<settings.displayCount){
                 // リスト成処理
                 twipartsUl.appendChild(createNode(item));
                 // カウンター加算
                 loopCnt++;
             }else{
                 return;
             }
         });
         //つぶやきリスト設定
         twipartsDiv.append(twipartsUl);
         //スライド実行
         if(settings.itemSlide){ slideAnimate(); }
      }
   })
});

// 配列日付ソート
function itemSort(data,sortOrderStr) {
   if(sortOrderStr=='asc'){
        return data.sort ( function (b1, b2) { return new Date(b1['created_at']) > new Date(b2['created_at']) ? 1 : -1; } );
   } else if (sortOrderStr=='desc') { 
        return data.sort ( function (b1, b2) { return new Date(b1['created_at']) < new Date(b2['created_at']) ? 1 : -1; } );
   }
   return data;
}

/*
 * つぶやき情報リスト加工処理
 * @param tweet 検索キーワードを元にjsonより習得したつぶやき情報リスト
 */
function createNode(tweet){
    //投稿写真URLを含むツイート限定表示可否フラグ判定
    if(settings.imgOnly){
        //投稿写真URLを含むツイート限定表示処理
        if(!(tweet.text.search(/\/\/twitpic.com/)>=0)&&!(tweet.text.search(/\/\/yfrog.com/)>=0)){
            return;
        }
    }
    //ループ用LIエレメント作成
    var twipartsLi=document.createElement("li");
    twipartsLi.style.listStyleType = 'none';
    //アイテムがスライド設定時は、[display：none]設定。
    if(settings.itemSlide){ twipartsLi.style.display = "none"; }

    //ハッシュタグリンク設定
    var text=tweet.text.replace(/http:\/\/[0-9a-z.\/]+/ig,'<a href="$&">$&</a>');
    text=text.replace(/#[0-9a-z._\/]+/ig,function(str){
        return '<a href="//search.twitter.com/search?q='+encodeURIComponent(str)+'" target="_blank">'+str+'</a>';
    });

    //プロフィール写真追加処理
    if(settings.profileImage){
        //プロフィール写真設定用外枠DIV生成
        var item1Div=document.createElement("div");
        item1Div.className="twiparts-tweet-item1";
        //プロフィール写真設定用DIV生成
        var headDiv=document.createElement("div");
        headDiv.className="twiparts-profile-image"
        //リンク設定
        var headA=document.createElement("a");
        headA.href="//twitter.com/"+tweet.from_user;
        headA.target="_blank";
        //写真設定
        var headImg=document.createElement("img");
        headImg.src=tweet.profile_image_url;
        headImg.alt=tweet.from_user;
        //リンクに写真を設定
        headA.appendChild(headImg);
        //Divに画像を設定
        headDiv.appendChild(headA);
        //外枠にリンク写真を設定
        item1Div.appendChild(headDiv);
        //リストに設定
        twipartsLi.appendChild(item1Div);
    }

    //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用外枠DIV生成
    var item2Div=document.createElement("div");
    item2Div.className="twiparts-tweet-item2";

    //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用処理
    for(key in settings.displayItems){
        switch(settings.displayItems[key]){
        case "name":
            //ユーザー名設定用DIV生成
            var nameDiv=document.createElement("div");
                nameDiv.className="twiparts-name";
                //リンク生成
                nameA=document.createElement("a");
                nameA.href="//twitter.com/"+tweet.from_user;
                nameA.innerHTML=tweet.from_user;
                //DIVに設定
                nameDiv.appendChild(nameA);
                //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用外枠DIVに設定
                item2Div.appendChild(nameDiv);
            break;
        case "text":
            //つぶやき内容設定用DIV生成
            var textDiv=document.createElement("div");
                textDiv.className="twiparts-text";
                var mainText='';
                mainText=text;
                //サムネイル変換済み画像URLを削除
                if(!settings.photosUrlShow) {
                   for (i=0;i<settings.thumbnailShowMax;i++){
                      //画像切り取り
                      var thumbStr=mainText.match('<a href=\"\/\/yfrog.com\/.*.<\/a>|<a href=\"\/\/twitpic.com\/.*.<\/a>');
                      if (thumbStr!=null){
                         mainText=mainText.replace(thumbStr, "");
                      }
                   }
                }
                //つぶやき内容を設定
                textDiv.innerHTML=mainText;
                //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用外枠DIVに設定
                item2Div.appendChild(textDiv);
            break;
        case "reply":
            //replyリンク設定用DIV生成
            var replyDiv=document.createElement("div");
            replyDiv.className="twiparts-reply";
            //リンク設定
            replyDiv.innerHTML='<a href="//twitter.com/?status=@'+tweet.from_user+'&in_reply_to_status='+tweet.id+'&in_reply_to='+tweet.from_user+'" target="_blank">'+settings.replyLinkStr+'</a>';
            //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用外枠DIVに設定
            item2Div.appendChild(replyDiv);
            break;
        case "time":
            //つぶやき日時設定用DIV生成
            var timeDiv=document.createElement("div");
            timeDiv.className="twiparts-time";
            //日時表示フォーマット判定
            if(settings.timeType=="ago" || settings.timeType=="enAgo"){
                //ago形式で日時表示
                timeDiv.innerHTML=agoDateChange(tweet.created_at);
            }else{
                //標準形式で日時表示
                timeDiv.innerHTML=nomalDateChange(tweet.created_at);
            }
            item2Div.appendChild(timeDiv);
            break;
        case "thumb":
            //写真のサムネイル変換処理
            if(settings.thumbnail){
                //twitpic変換処理
                var thumbText=text.replace(/\">\/\/twitpic.com\/[0-9a-z]+/ig, "$&\"/>");
                if(settings.thumbnailSize=='mini') {
                   thumbText=thumbText.replace(/\">\/\/twitpic.com\//ig,'\"><img width="60" height="60" src=\"http://twitpic.com/show/'+settings.thumbnailSize+'/');
                } else {
                   thumbText=thumbText.replace(/\">\/\/twitpic.com\//ig,'\"><img width="150" height="150" src=\"http://twitpic.com/show/'+settings.thumbnailSize+'/');
                }
                //yfrog変換処理
                thumbText=thumbText.replace(/\">\/\/yfrog.com\/[0-9a-z]+/ig, "$&.th.jpg\"/>");
                thumbText=thumbText.replace(/\">\/\/yfrog.com\//ig,'\"><img width="60" height="60" src=\"http://yfrog.com/');
            };
            var thumbDiv=document.createElement("div");
            thumbDiv.className="twiparts-thumb";
            var thumbLine='';
            for (i=0;i<settings.thumbnailShowMax;i++){
               //画像切り取り
               var thumbStr=thumbText.match('<a href=\"\/\/yfrog.com\/.*.<\/a>|<a href=\"http:\/\/twitpic.com\/.*.<\/a>');
               if (thumbStr!=null){
                  if(thumbLine!=''){ thumbLine = thumbLine+"<span class='twiparts-thumb-span'></span>"+thumbStr; }
                  else{ thumbLine=thumbStr }
                  //サムネイル先読み処理
                  var src=thumbText.match('\/\/yfrog.com\/[0-9a-z]*.th.jpg|http:\/\/twitpic.com\/show\/'+settings.thumbnailSize+'\/[0-9a-z]*');
                  $('<img />').attr('src', src).load();
                  //サムネイルを設定
                  thumbText=thumbText.replace(thumbStr,'');
               }
            }
            if (thumbLine!='') {
               thumbDiv.innerHTML=thumbLine;
               //ユーザー名、つぶやき内容、replyリンク、つぶやき時間設定用外枠DIVに設定
               item2Div.appendChild(thumbDiv);
            }
            break;
        }
    }
    //リストに設定
    twipartsLi.appendChild(item2Div);

    // HR表示処理
    if(settings.hrShow){
      var hrItem=document.createElement("hr")
      hrItem.className="twiparts-hr";
      twipartsLi.appendChild(hrItem);
    }

    return twipartsLi;
}

/*
 * 標準形式変換処理
 * @param changeDate つぶやき時刻データ
 * @return timeStr フォーマット変換後データ
 */
function nomalDateChange(changeDate){
    if(changeDate==null){
        return "";
    }
    var createdTime=new Date(changeDate);
    if(createdTime=="NaN"){
        return "";
    }
    var Hours = createdTime.getHours();
    var Minutes = createdTime.getMinutes();
    var Seconds = createdTime.getSeconds();
    if(Hours<10){Hours="0"+Hours}
    if(Minutes<10){Minutes="0"+Minutes}
    if(Seconds<10){Seconds="0"+Seconds}
    
    //表記方法切り替え
    if(settings.timeLanguage=='en'){
        var weekLi = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
        var monthLi = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
        return weekLi[createdTime.getDay()]+" "+monthLi[createdTime.getMonth()] +" "+createdTime.getDate()+ " "+createdTime.getFullYear()+" "+Hours+":"+Minutes+":"+Seconds;
    } else {
        return createdTime.getFullYear()+"年"+(createdTime.getMonth()+1)+"月"+createdTime.getDate()+"日 "+Hours+"時"+Minutes+"分"+Seconds+"秒";
    }
}

/*
 * ago形式変換処理
 * @param changeDate つぶやき時刻データ
 * @return timeStr フォーマット変換後データ
 */
function agoDateChange(changeDate){
    if(changeDate==null){
        return "";
    }
    var createdTime=new Date(changeDate);
    if(createdTime=="NaN"){
        return "";
    }
    //表記方法切り替え
    if(settings.timeLanguage=='en'){
       var strparts = [" month ago "," days ago"," hours ago"," minute ago"," seconds ago"];
    } else {
       var strparts = ["月","日","時間前","分前","秒前"];
    }
    var timeStr="";
    var now=new Date();
    var second=(Date.parse(now) - Date.parse(createdTime))/1000;
    if(second>=3600*24){
        timeStr=(createdTime.getMonth()+1)+strparts[0]+createdTime.getDate()+strparts[1];
    }else if(second>=0){
        var hour=parseInt(second%(3600*24)/3600);
        var min=parseInt(second%3600/60);
        if(hour>0){
            timeStr=hour+strparts[2];
        }else if(min>0){
            timeStr=min+strparts[3];
        }else{
            timeStr=second+strparts[4];
        }
    }
    return timeStr;
}

/*
 * つぶやきリストスライド処理
 */
function slideAnimate(){
    var items = [];
    var height;
    var itemList=$('ul.twipartsListUl');
    itemList.find('> li').each(function () {
        items.push('<li>' + $(this).html() + '</li>');
    });
    //リストの先頭へ要素挿入
    var addItem=$(items[(items.length-1)]).css({
        height : 0,
        opacity : 0,
        display : 'inline-block'
    }).prependTo(itemList);
    //最後尾の要素のheightを取得
    height = itemList.find('> li:last').height();
    addItem.animate({ height : height }, settings.itemOpacitySpeed).animate({ opacity : 1 }, settings.itemOpacitySpeed);

    //一番最後のデータを削除
    itemList.find('> li:last').animate({ opacity : 0}, settings.itemOpacitySpeed , function () {
       itemList.find('> li:last').remove();
    });
    setTimeout(slideAnimate,settings.itemSlideSpeed);
}


