//
// ユーザプロフィールを表示する
//
function displayUserProfile(e) {
  document.getElementById('user').style.display = 'block'; //'block !important';
  //if( document.getElementById('user').uid == g_uid_guest ) { document.getElementById('login_uid').focus(); }
  if( document.getElementById('user').uid == g_uid_guest ) {
    loginForm();
  }
  else {
          userProfile(getUID());
  }
  // AdSense の内容が上に重なってしまうため，これを一時的に隠す
  if( document.getElementById('adsense') ) { document.getElementById('adsense').style.visibility = 'hidden'; }
  stopDefaultAndPropagation(e);
  return false;
}
//
// ユーザプロフィールを隠す
//
function hideUserProfile(e) {
  // AdSense を再表示
  if( document.getElementById('adsense') ) { document.getElementById('adsense').style.visibility = 'visible'; }
  document.getElementById('user').style.display = 'none';
  stopDefaultAndPropagation(e);
  return false;
}




////////////////////////////////////////////////////////////////////////////////
//
// ユーザプロフィールを生成する
//
////////////////////////////////////////////////////////////////////////////////
function userProfile(uid) {
  var user_ = document.getElementById('user_');
  var user  = document.getElementById('user'); user.innerHTML = '';

  // プロフィールエリア
  var profile = document.createElement('div'); profile.id = 'user_profile';
  profile.innerHTML = 'データを読み込んでいます．．．';
  user.appendChild(profile);
  //
  //
  var foot_user = document.createElement('div'); foot_user.id = 'foot_user';
  // 閉じるアイコン
  var img_close = document.createElement('img');  img_close.src = dir('img', 0) + 'common/icons/user_close.png';
  img_close.title = 'プロフィールを閉じます．';
  addListener(img_close, 'click', hideUserProfile, false);
  foot_user.appendChild(img_close);
  user.appendChild(foot_user);
  // ログアウトボタン
  var div_logout = document.createElement('div'); div_logout.style.textAlign = 'right';
  var input_logout = document.createElement('input');
  input_logout.id = 'logout_submit';
  input_logout.className = 'btn';
  input_logout.type = 'button';
  input_logout.value = 'Logout';
  input_logout.title = 'ログアウトします．';
  addListener(input_logout, 'click', logout, false);
  user.appendChild(document.createElement('br'));
  div_logout.appendChild(input_logout);
  foot_user.appendChild(div_logout);


  var userProfile_ = function(e) {
    userProfile(getTargetElement(e).uid);
    return;
  }
  //
  // プロフィールの生成
  //
  var func = function(xml) {
    profile.innerHTML = '';
    var xml_user = getNode(xml, 'user', 0);
    var i;
    ////////////////////////////////////////////////////////////////
    //
    // ユーザ名
    //
    ////////////////////////////////////////////////////////////////
    var h3 = document.createElement('h3'); h3.innerHTML = 'ようこそ ' + getUName() + ' さん';
    profile.appendChild(h3);

    ////////////////////////////////////////////////////////////////
    //
    // 表示エリアの配置
    //
    ////////////////////////////////////////////////////////////////
    var div_menu = document.createElement('div'); div_menu.id = 'menu_profile';
    var profile_left  = document.createElement('div'); profile_left.id = 'profile_left';
    var profile_right = document.createElement('div'); profile_right.id = 'profile_right';
    profile.appendChild(div_menu);
    profile.appendChild(profile_left);
    profile.appendChild(profile_right);

    //
    // フラグ
    //
    var flg_notFriend = true;
    var flg_waiting = false;
    for( i = 0; i < getNode(xml, 'friend', -1).length; i++ ) {
      // 表示ユーザの友だちリストに自分がいれば，このユーザは友だちである
      if( getNodeValue(getNode(xml, 'friend', i), 'uid', 0) == getUID() ) { flg_notFriend = false; break; }
    }
    if( uid != getUID()  &&  flg_notFriend ) {
      if( definedXMLTagName(xml, 'request') ) {
        for( i = 0; i < getNode(xml, 'request', -1).length; i++ ) {
          if( getNodeValue(getNode(xml, 'request', i), 'uid', 0) == getUID() ) { flg_waiting = true; break; }
        }
      }
    }
    
    ////////////////////////////////////////////////////////////////
    //
    // メニュー
    //
    ////////////////////////////////////////////////////////////////
    //
    // 戻る（本人以外表示時）
    //
    //if( uid != getUID() ) {
    if( true ) {
      var a = document.createElement('a');
      a.uid = getUID();
      a.innerHTML = '戻る';
      a.title = getUName() + ' さんのプロフィールに戻ります．';
      addListener(a, 'click', userProfile_, false);
      div_menu.appendChild(a);
    }
    //
    // 友人を招待する（本人表示時）
    //
    if( uid == getUID() ) { //div_menu.parentNode.removeChild(div_menu);
      var a = document.createElement('a');
      a.uid = getUID();
      a.innerHTML = '友だちを招待する';
      a.title = '新しく友だちを招待します．';
      addListener(a, 'click', confirmInvitation, false); 
      div_menu.appendChild(a);
    }



    ////////////////////////////////////////////////////////////////
    //
    // 【左】お知らせ（本人表示時）
    //
    ////////////////////////////////////////////////////////////////
    if( uid == getUID() ) {
      var div_news = document.createElement('div'); div_news.className = 'group';
      var h4_news = document.createElement('h4'); h4_news.innerHTML = 'お知らせ';
      div_news.appendChild(h4_news);
      var ul_news = document.createElement('ul');
      //
      // 友達リスト追加リクエストがきている
      //   この部分は，自分のプロフィールのときのみ
      //
      if( definedXMLTagName(xml, 'request') ) {
        for( i = 0; i < getNode(xml, 'request', -1).length; i++ ) {
          var xml_request = getNode(xml, 'request', i);
          var li = document.createElement('li');
          var a = document.createElement('a'); a.className = 'linklike';
          a.uid = getNodeValue(xml_request, 'uid', 0);
          a.uname = getNodeValue(xml_request, 'uname', 0);
          a.innerHTML = getNodeValue(xml_request, 'uname', 0) + ' さんから，友だちリスト追加のリクエストがありました．ここをクリック後，承認・拒否の選択をしてください．';
          a.title = getNodeValue(xml_request, 'uname', 0) + ' さんから，友だちリスト追加のリクエストがありました．';
          addListener(a, 'click', acceptForm_friend, false);
          li.appendChild(a);
          ul_news.appendChild(li);
        }
      }
      //
      // 誰かを招待中である
      //
      if( definedXMLTagName(xml, 'invite') ) {
        var li = document.createElement('li');
        li.innerHTML = '現在，' + getNode(xml, 'invite', -1).length + ' 人の友だちを招待中です．';
        ul_news.appendChild(li);
      }
      
      //
      // お知らせがない = ul_news 内の li の数が 0
      //
      if( ul_news.getElementsByTagName('li').length == 0 ) {
        var li = document.createElement('li');
        li.innerHTML = '現在お知らせはありません．';
        ul_news.appendChild(li);
      }
      div_news.appendChild(ul_news);
      profile_left.appendChild(div_news);
    }
    ////////////////////////////////////////////////////////////////
    //
    // 【左】友だちリストに加えますか？（本人でなく，友人でもない場合）
    //
    ////////////////////////////////////////////////////////////////
    else if( flg_notFriend  &&  !flg_waiting ) {
      var div = document.createElement('div'); div.className = 'group';
      var h4 = document.createElement('h4'); h4.innerHTML = '友だちリストに加えますか？';
      var p = document.createElement('p');
      var a = document.createElement('a');
      a.className = 'linklike';
      a.innerHTML = getNodeValue(xml_user, 'name', 0) + ' さんを友だちリストに加えます．ここをクリック後，メッセージを添えてリクエストを送信してください．';
      a.title =  getNodeValue(xml_user, 'name', 0) + ' さんを友だちリストに加えます．';
      a.uid = uid;
      addListener(a, 'click', requestForm_friend, false);
      p.appendChild(a); p.className = 'item';
      div.appendChild(h4);
      div.appendChild(p);
      profile_left.appendChild(div);
    }
    ////////////////////////////////////////////////////////////////
    //
    // 【左】友だちリストに加えますか？（本人でなく，友人でもない場合）
    //
    ////////////////////////////////////////////////////////////////
    else if( !flg_notFriend ) {
      var div = document.createElement('div'); div.className = 'group';
      var h4 = document.createElement('h4'); h4.innerHTML = '友だちリストに入っています';
      var p = document.createElement('p');
      p.innerHTML = getNodeValue(xml_user, 'name', 0) + ' さんは友だちリストに入っています．';
      div.appendChild(h4);
      div.appendChild(p);
      profile_left.appendChild(div);
    }

    ////////////////////////////////////////////////////////////////
    //
    // 【左】承認待ち（本人でなく，友人でもないが，リクエストは送った場合）
    //
    ////////////////////////////////////////////////////////////////
    else if( flg_waiting ) {
      var div = document.createElement('div'); div.className = 'group';
      var h4 = document.createElement('h4'); h4.innerHTML = '現在承認待ちです'
      var p = document.createElement('p');
      p.innerHTML = getNodeValue(xml_user, 'name', 0) + ' さんが承認すれば，あなたの友だちリストに追加されます．';
      div.appendChild(h4);
      div.appendChild(p);
      profile_left.appendChild(div);
    }


    ////////////////////////////////////////////////////////////////
    //
    // 【右】ユーザ
    //
    ////////////////////////////////////////////////////////////////
    var div_user = document.createElement('div'); div_user.className = 'group';
    var h4_user = document.createElement('h4');
    var img_user = document.createElement('img');
    h4_user.style.textAlign = 'left';
    h4_user.innerHTML = getNodeValue(xml_user, 'name', 0);
    div_user.style.textAlign = 'center'; // IE対策
    img_user.style.display = 'block';
    img_user.style.margin = '0 auto 6px auto';
    if( definedXMLTagName(xml_user, 'img') ) {

    }
    else {
      img_user.src = dir('usr', 0) + 'nofoto.png';
    }
    div_user.appendChild(h4_user);
    div_user.appendChild(img_user);
    profile_right.appendChild(div_user);
    
    ////////////////////////////////////////////////////////////////
    //
    // 【右】友だちリスト
    //
    ////////////////////////////////////////////////////////////////
    var div_friendlist = document.createElement('div'); div_friendlist.className = 'group';
    var h4_friendlist = document.createElement('h4'); h4_friendlist.innerHTML = '友だちリスト （' + getNode(xml, 'friend', -1).length + '）';
    div_friendlist.appendChild(h4_friendlist);
    var ul_friendlist = document.createElement('ul');
    ul_friendlist.style.listStyle = 'none'; ul_friendlist.id = 'friendlist';
    for( i = 0; i < getNode(xml, 'friend', -1).length; i++ ) {
      var xml_friend = getNode(xml, 'friend', i);
      var li = document.createElement('li');
      var a = document.createElement('a');
      var img = document.createElement('img');
      img.src = dir('usr', 0) + getNodeValue(xml_friend, 'img', 0);
      a.className = 'friend';
      a.title = getNodeValue(xml_friend, 'uname', 0) + ' さんのプロフィールを表示します．';
      img.uid = a.uid = getNodeValue(xml_friend, 'uid', 0);
      addListener(a, 'click', userProfile_, false);
      a.appendChild(img);
      a.appendChild(document.createElement('br'));;
      a.appendChild(document.createTextNode(getNodeValue(xml_friend, 'uname', 0)));
      li.appendChild(a);
      ul_friendlist.appendChild(li);
    }
    div_friendlist.appendChild(ul_friendlist); div_friendlist.appendChild(document.createElement('br'));
    profile_right.appendChild(div_friendlist);


    return;
  }
  var query = new Array();
  query.push('cmd=profile');
  query.push('uid=' + uid);
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_profile' + uid, true);
  return;
}




////////////////////////////////////////////////////////////////////////////////
//
// リクエスト送信フォームを生成する
//
////////////////////////////////////////////////////////////////////////////////
function requestForm_friend(e) {
  var target = getTargetElement(e);
  var user = document.getElementById('user');
  var form = document.createElement('div'); form.id = 'message';
  form.style.left = '80px'; //e.clientX - getPosition(user).x + 16 + 'px';
  form.style.top = getPosition(target).y - getPosition(user).y - 36 + 'px';
  form.uid = target.uid;
  user.appendChild(form);
  removeListener(target, 'click', requestForm_friend, false);

  var p = document.createElement('p'); p.innerHTML = 'メッセージを入力後， “Send” ボタンを押してください．中止する場合は “Cancel” ボタンを押してください．';
  form.appendChild(p);
  //
  // テキストエリア
  //
  var checkTextarea = function(e) {
    var target = getTargetElement(e);
    document.getElementById('request_send').disabled
      = target.value.match(/^\s*$/)  ?  true  :  false;
    return;
  }
  var textarea = document.createElement('textarea');
  textarea.id = 'request_text';
  textarea.style.height = '8em';
  addListener(textarea, 'keyup', checkTextarea, false);
  addListener(textarea, 'blur', checkTextarea, false);
  form.appendChild(textarea);

  //
  //
  // ボタン群
  //
  //
  var div_foot = document.createElement('div');
  div_foot.style.marginTop = '1em';
  div_foot.style.paddingTop = '.66em';
  div_foot.style.textAlign = 'right';
  div_foot.style.borderTop = '#ffcc99 1px dotted';
  form.appendChild(div_foot);
  //
  // Cancel ボタン
  //
  var cancel = function() {
    addListener(target, 'click', requestForm_friend, false);
    user.removeChild(form);
    return;
  }
  var button_cancel = document.createElement('input');
  button_cancel.id = 'request_cancel';
  button_cancel.className = 'btn';
  button_cancel.type = 'button';
  button_cancel.value = 'Cancel';
  button_cancel.title = '友だちリスト追加リクエストの送信を中止します．';
  addListener(button_cancel, 'click', cancel, false);
  div_foot.appendChild(button_cancel);
  //
  // Send ボタン
  //
  var button_send = document.createElement('input');
  button_send.id = 'request_send';
  button_send.className = 'btn';
  button_send.type = 'button';
  button_send.value = 'Send';
  button_send.title = '友だちリスト追加リクエストを送信します．';
  addListener(button_send, 'click', sendRequest_friend, false);
  button_send.disabled = true;
  div_foot.appendChild(button_send);
  
  textarea.focus();
  return;
}
////////////////////////////////////////////////////////////////////////////////
//
// 友だちリスト追加リクエストを送る
//
////////////////////////////////////////////////////////////////////////////////
function sendRequest_friend(e) {
  var target = getTargetElement(e);
  var form = target.parentNode.parentNode;//document.getElementById('message');
  var uid = getUID();
  var uid_request = form.uid;
  var message = text2queryValue(form.getElementsByTagName('textarea')[0].value); //text2queryValue(document.getElementById('request_text').value);

  var func = function(xml) {
    userProfile(uid_request);
    return;
  }
  var query = new Array();
  query.push('cmd=friend_request');
  query.push('uid=' + uid);
  query.push('uid_request=' + uid_request);
  query.push('message=' + message);
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_request_add.' + uid + '.' + uid_request, true);
  return;
}




////////////////////////////////////////////////////////////////////////////////
//
// 承認・拒否選択フォームを生成する
//
////////////////////////////////////////////////////////////////////////////////
function acceptForm_friend(e) {
  var target = getTargetElement(e);
  var user = document.getElementById('user');
  var form = document.createElement('div'); form.id = 'message';
  form.style.left = '80px'; //e.clientX - getPosition(user).x + 16 + 'px';
  form.style.top = getPosition(target).y - getPosition(user).y - 36 + 'px';
  form.uid = target.uid;
  user.appendChild(form);
  removeListener(target, 'click', acceptForm_friend, false);

  form.innerHTML = 'データを読み込んでいます．．．';

  var func = function(xml) {
    form.innerHTML = '';

    //
    // メッセージ
    //
    var p0 = document.createElement('p'); p0.innerHTML = target.uname + ' さんからのメッセージです．';
    form.appendChild(p0);
    var div_message = document.createElement('div');
    div_message.style.margin = '1em 0';
    div_message.style.padding = '6px 8px';
    div_message.style.borderTop = div_message.style.borderLeft = '#000000 1px solid';
    div_message.style.borderRight = div_message.style.borderBottom = '#ffcc99 1px solid';
    div_message.innerHTML = getNodeValue(xml, 'message', 0);
    form.appendChild(div_message);

    //
    // 文
    //
    var p1 = document.createElement('p'); p1.innerHTML = target.uname + ' さんを友だちリストに加える場合， “Accept” ボタンを押してください．拒否する場合は “Refuse” ボタンを押してください．';
    var p2 = document.createElement('p'); p2.innerHTML = 'なお，どちらを選択しても，' + target.uname + ' さんへは通知されません．';
    form.appendChild(p1);
    form.appendChild(p2);

    //
    //
    // ボタン群
    //
    //
    var div_foot = document.createElement('div');
    div_foot.style.marginTop = '1em';
    div_foot.style.paddingTop = '.66em';
    div_foot.style.textAlign = 'right';
    div_foot.style.borderTop = '#ffcc99 1px dotted';
    form.appendChild(div_foot);
    //
    // Accept ボタン
    //
    var button_accept = document.createElement('input');
    button_accept.id = 'request_accept';
    button_accept.className = 'btn';
    button_accept.type = 'button';
    button_accept.value = 'Accept';
    button_accept.title = target.uname + ' さんからの友だちリスト追加リクエストを承認します．';
    addListener(button_accept, 'click', acceptRequest_friend, false);
    div_foot.appendChild(button_accept);
    //
    // Refuse ボタン
    //
    var button_refuse = document.createElement('input');
    button_refuse.id = 'request_refuse';
    button_refuse.className = 'btn';
    button_refuse.type = 'button';
    button_refuse.value = 'Refuse';
    button_refuse.title = target.uname + ' さんからの友だちリスト追加リクエストを拒否します．';
    addListener(button_refuse, 'click', refuseRequest_friend, false);
    div_foot.appendChild(button_refuse);
    
    return;
  }
  var query = new Array();
  query.push('cmd=friend_request_view');
  query.push('uid=' + getUID());
  query.push('uid_request=' + form.uid);
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_request_view.' + getUID() + '.' + form.uid, true);
  return;
}
////////////////////////////////////////////////////////////////////////////////
//
// 友だちリスト追加リクエストを承認する
//
////////////////////////////////////////////////////////////////////////////////
function acceptRequest_friend(e) {
  var form = getTargetElement(e).parentNode.parentNode;
  var func = function(xml) {
    userProfile(getUID());
    return;
  }
  var query = new Array();
  query.push('cmd=friend_request_accept');
  query.push('uid=' + getUID());
  query.push('uid_request=' + form.uid);
  query.push('time=' + parseInt((new Date()).getTime() / 1000));
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_request_accept.' + getUID() + '.' + form.uid, true);

  return;
}
////////////////////////////////////////////////////////////////////////////////
//
// 友だちリスト追加リクエストを拒否する
//
////////////////////////////////////////////////////////////////////////////////
function refuseRequest_friend(e) {
  var form = getTargetElement(e).parentNode.parentNode;
  var func = function(xml) {
    userProfile(getUID());
    return;
  }
  var query = new Array();
  query.push('cmd=friend_request_refuse');
  query.push('uid=' + getUID());
  query.push('uid_request=' + form.uid);
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_request_refuse.' + getUID() + '.' + form.uid, true);
  return;
}




////////////////////////////////////////////////////////////////////////////////
//
// 友だちを招待するかを確認する
//
////////////////////////////////////////////////////////////////////////////////
function confirmInvitation(e) {
  var target = getTargetElement(e);
  var user = document.getElementById('user');

  var uid = target.uid;
  removeListener(target, 'click', confirmInvitation, false);
  
  var message = document.createElement('div'); message.id = 'message';
  message.style.left = '80px'; //e.clientX - getPosition(user).x + 16 + 'px';
  message.style.top = '60px'; //getPosition(target).y - getPosition(user).y - 36 + 'px';
  message.uid = target.uid;
  user.appendChild(message);
  //
  // メッセージ
  //
  message.innerHTML = '<p>新たに友だちを招待しますか？</p><p>招待する場合は “Invite” ボタンを，中止する場合は “Cancel” ボタンを押してください．</p>';
  //
  // ボタン群
  //
  var div_foot = document.createElement('div');
  div_foot.style.marginTop = '1em';
  div_foot.style.paddingTop = '.66em';
  div_foot.style.textAlign = 'right';
  div_foot.style.borderTop = '#ffcc99 1px dotted';
  message.appendChild(div_foot);
  //
  // Cancel ボタン
  //
  var cancel = function() {
    addListener(target, 'click', confirmInvitation, false);
    user.removeChild(message);
    return;
  }
  var button_cancel = document.createElement('input');
  button_cancel.id = 'invite_cancel';
  button_cancel.className = 'btn';
  button_cancel.type = 'button';
  button_cancel.value = 'Cancel';
  button_cancel.title = '友だちの招待を中止します．';
  addListener(button_cancel, 'click', cancel, false);
  div_foot.appendChild(button_cancel);
  //
  // Invite ボタン
  //
  var invite = function() {
    user.removeChild(message);
    generateInvitationCode(uid);
    return;
  }
  var button_invite = document.createElement('input');
  button_invite.id = 'invite_invite';
  button_invite.className = 'btn';
  button_invite.type = 'button';
  button_invite.value = 'Invite';
  button_invite.title = '友だちを招待します．';
  addListener(button_invite, 'click', invite, false);
  div_foot.appendChild(button_invite);

  return;
}
////////////////////////////////////////////////////////////////////////////////
//
// 友だちを招待するためのコードを生成する
//
////////////////////////////////////////////////////////////////////////////////
function generateInvitationCode(uid) {
  var user = document.getElementById('user');
  
  var code = hex_hmac_md5((parseInt((new Date()).getTime())).toString(), uid);
  var func = function(xml) {
    var message = document.createElement('div'); message.id = 'message';
    message.style.left = '80px'; //e.clientX - getPosition(user).x + 16 + 'px';
    message.style.top = '60px'; //getPosition(target).y - getPosition(user).y - 36 + 'px';
    message.uid = uid;
    user.appendChild(message);

    //
    // メッセージ
    //
    message.innerHTML = '<p>以下の文面を，招待したい友だちに送ってください．新規登録時，この招待コード （Invitation Code） の対の入力が必要となります．</p><p>なお，この招待コード （Invitation Code） の対は，現在より1週間のみ有効です．</p>';
    //
    // 招待コード
    //
    var div = document.createElement('div'); div.className = 'group';
    div.innerHTML = 'Invitation Code 1: ' + uid + '<br />Invitation Code 2: ' + code + '<br /><br />登録は http://www.imasaramario2.com から行えます．';
    message.appendChild(div);
    //
    // ボタン群
    //
    var div_foot = document.createElement('div');
    div_foot.style.marginTop = '1em';
    div_foot.style.paddingTop = '.66em';
    div_foot.style.textAlign = 'right';
    div_foot.style.borderTop = '#ffcc99 1px dotted';
    message.appendChild(div_foot);
    //
    // Close ボタン
    //
    var closeMessage = function(e) {
      user.removeChild(message);
      userProfile(getUID());
      return;
    }
    var button_close = document.createElement('input');
    button_close.id = 'invite_close';
    button_close.className = 'btn';
    button_close.type = 'button';
    button_close.value = 'Close';
    button_close.title = 'このメッセージを閉じます．';
    addListener(button_close, 'click', closeMessage, false);
    div_foot.appendChild(button_close);

    return;
  }
  var query = new Array();
  query.push('cmd=friend_invite');
  query.push('uid=' + getUID());
  query.push('code=' + code);
  httpXMLRequest(dir('cgi', 0) + 'user.cgi', 'POST', array2queryString(query), func, httpError, 'cgi_user_invite.' + getUID(), true);
  return;
}



