/**
 * Funktionssammlung zur Chatverarbeitung
 * copyright 2009
 * Stefan Lexow
 * www.pixelkinder.com   
 */



/**
 * den Debug-Output ausgeben
 */ 
function writeDebug(debug_message){
  if(pikichat_debug == true){
    if(pikichat_debug_type == 'firebug')
       console.log(pikichat_debug_output_constant+debug_message);  
    }
    if(pikichat_debug_type == 'alert'){
       alert(pikichat_debug_output_constant+debug_message);  
    }    
}



/**
 * startet den Invitation Listener
 */ 
function startInvitationListener()
{
  writeDebug("Funktion: startInvitationListener");
  pikichat_invitation_interval_id = setInterval("checkNewChatInvitation("+pikichat_user_id+")",pikichat_check_invitation_interval);
}


/**
 * stoppt den Invitation Listener
 */ 
function stopInvitationListener()
{
  writeDebug("Funktion: stopInvitationListener");
  clearInterval(pikichat_invitation_interval_id);
}



//öffnet das chat window mit einigen notwendingen parametern.
function openPopUpWindow(url){
  writeDebug("Funktion: openPopUpWindow\nurl: "+url);
  var tmp_date = new Date();
  var win_name = "CHAT"+tmp_date.getTime();
  var win_configs = "status=no,scrollbars=no,resizeable=no,width="+pikichat_popup_window_width+",height="+pikichat_popup_window_height;
  var window_obj;
  var window_obj =  window.open(url,win_name,win_configs);
  return window_obj;
}



/**
 * Checkt in der DB nach neuen Einladungen
 */ 
function checkNewChatInvitation(user_id){
  writeDebug("Funktion: checkNewChatInvitation\nuser_id: "+user_id);

 $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "empfaenger_id="+user_id+"&pikirequest=checkChatInvitation",
   success: function(msg){
     if(msg.invitation_found == true && msg.invitation_id != ''){
       writeDebug("checkChatInvitation--> Invitation found with invitation_id: "+msg.invitation_id);
       stopInvitationListener();
       showChatInvitation(msg.invitation_id);
       startInvitationListener();
     }
     else {
        writeDebug("checkChatInvitation--> No invitation found!");
     }
   }
 });
}


/**
 *  Öffnet das Popup mit dem Einladungsfenster, davor wird die Einladung allerdings angenommen, damit
 *  sie nicht noch einmal dem User präsentiert wird. 
 */ 
function showChatInvitation(invitation_id){
  writeDebug("Funktion: showChatInvitation\ninvitation_id: "+invitation_id);
  if(setInvitationRecognized(invitation_id) == true){
    writeDebug("showChatInvitation --> Einladung angenommen. Öffne nun Popup.");
    var iurl = pikichat_invitation_window_url+"?invitation_id="+invitation_id;
    var win_obj = openPopUpWindow(iurl);
    
    if ( !win_obj || typeof(win_obj) != 'object' || win_obj.closed ) {  //PopUp wurde wahrscheinlich nicht geöffnet
      $('#blocked_url').val(iurl);
      $('#blocked_invitation_id').val(invitation_id);
      $.blockUI({ message: $('#invitation_blocked_helper')}); 
    }    
  }
  else{
    writeDebug("showChatInvitation --> Fehler beim Einladungbestätigen. Kein Popup. Einladung wird dem User nochmals zugestellt.");
  }
}



/**
 * bestätigt die Einladung und retouniert den Erfolgsstatus 
 */ 
function setInvitationRecognized(invitation_id) {
  writeDebug("Funktion: setInvitationRecognized\ninvitation_id: "+invitation_id);
  var ret = false;
  $.ajax({
   type: "POST",
   cache: false,
   async: false,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "invitation_id="+invitation_id+"&pikirequest=setInvitationRecognized",
   success: function(msg){
      if(msg.success == true)
        ret = true;
   }
 });
 writeDebug("setInvitationRecognized -->\nsuccess: "+ret);
 return ret;
}


/**
 * funktion bindet jeweils eine Funktion an den accept und decline button des
 * piki_chat_invitation_windows. außerdem wird noch das timeout initialisiert
 * mit dem das fenster geschlossen wird und die einladung automatisch abgelehnt wird.
 * als aller erstes wird versucht dem fenster den focus zu geben.   
 */ 
function initializeInvitationWindow(invitation_id,chat_id){

  writeDebug("Funktion: initializeInvitationWindow\ninvitation_id: "+invitation_id+" and chat_id: "+chat_id);
  
  window.focus();


 $(document).ready(function() {
  
  $('#accept_invitation').bind("click",function(){
    acceptInvitation(invitation_id,chat_id);
  });  
  
  $('#decline_invitation').bind("click",function(){
    declineInvitation(invitation_id,false);
  });
});
    
  pikichat_wait_for_reaction_on_invitation_timeout_id = setTimeout("declineInvitation("+invitation_id+","+true+")",pikichat_wait_for_reaction_on_invitation_timeout);
}



/**
 * setzt die einladung als akzeptiert und linkt weiter auf das Chatwindow mit der
 * übernommenen chat_id 
 */  
function acceptInvitation(invitation_id,chat_id){
  
  writeDebug("Funktion: acceptInvitation\ninvitation_id: "+invitation_id+" and nchat_id: "+chat_id);
  
  var ret = false;
  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "invitation_id="+invitation_id+"&pikirequest=acceptInvitation",
   success: function(msg){
      if(msg.success == true){
        //timeout clearen
        clearTimeout(pikichat_wait_for_reaction_on_invitation_timeout_id);
        //Chat-Window oeffnen
        var iurl = pikichat_board_window_url+"?chat_id="+chat_id;
        location.href = iurl;
      }
      else{
        alert('Die Einladung konnte nicht angenommen werden. Bitte versuche es noch einmal.');
      }
   }
 });
}



/**
 * setzt die einladung als abgelehnt und reagiert je nach show_timeout_message mit
 * dem schließen des Fensters oder Darstellung der Timeout-Info-Message
 */  
function declineInvitation(invitation_id,show_timeout_message,close_window){
  
  if(close_window == null){
    close_window = 1;
  }
  
  writeDebug("Funktion: declineInvitation\ninvitation_id: "+invitation_id+" and show_timeout_message: "+show_timeout_message);
  
  var ret = false;
  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "invitation_id="+invitation_id+"&pikirequest=declineInvitation",
   success: function(msg){
      if(msg.success == true){
        //timeout clearen
        clearTimeout(pikichat_wait_for_reaction_on_invitation_timeout_id);      
        if(show_timeout_message == true){
          $('#timeout_error_message').show();
          //remove damit kein schabernack getreiben werden kann.
          $('#invitation_window_buttons').remove();
        }  
        else{
          if(close_window == 1){
            window.close();
          }
        }
      }
      else{
        alert('Die Einladung konnte nicht abgelehnt werden. Bitte versuche es noch einmal.');
      }
   }
 });
}



/**
 *  kurze funktion, die das popup aufruft und den empfaenger als parameter mitgibt
 *  empfaenger ist nur der form halber. später wird man mehrere empfaenger auswählen können
 *  und an diese wird einen einladung versendet. hier und heute allerdings nur einer 
 *    
 */  
function openChatInviteWindow(empfaenger_id){
  writeDebug("Funktion: openChatInviteWindow\nempfaenger_id: "+empfaenger_id);
  var iurl = pikichat_invite_window_url+"?empfaenger_id="+empfaenger_id;
  var win23 = openPopUpWindow(iurl);
}



/**
 *
 * initialisert das piki_invite_waiting_window mit einem interval
 * welches checkt ob die einladung angenommen oder abgelehnt wurde und
 * reagiert entsprechend mit message ausgabe oder weiterleitung auf den eigentlichen
 * chat   
 *
 */   
function initInviteWaitingWindow(chat_id){
  writeDebug("Funktion: initInviteWaitingWindow\nchat_id "+chat_id);
  pikichat_check_invitation_recognized_interval_id = setInterval("checkForAcceptedInvitations("+chat_id+")",pikichat_check_invitation_recognized_interval);

}



/**
 * sucht in der DB nach Einladungen mit dieser chat id und sieht nach ob zumindest
 * eine davon accpeted worden ist. wenn ja, wird der user auf den chat weiter-
 * geleitet. wenn alle einladungen decline worden sind, wird die statusmeldung
 * ausgegeben und das interval ausgesetzt.    
 */  
function checkForAcceptedInvitations(chat_id){
  
  writeDebug("Funktion: checkForAcceptedInvitations\nchat_id: "+chat_id);
  
  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "chat_id="+chat_id+"&pikirequest=checkForAcceptedInvitations",
   success: function(msg){
     if(msg.forward_to_chat == true){
       //weiterleiten in den chat
       var iurl = pikichat_board_window_url+"?chat_id="+chat_id;
       location.href = iurl;
     }
     if(msg.show_not_one_accepted == true){
       clearInterval(pikichat_check_invitation_recognized_interval_id);
       $('#status_loader').hide();
       $('#show_status').show();
       $('#cancel_button').removeClass("button-abbrechen");
       $('#cancel_button').addClass("button-schliessen");
     }
  }      
 });
}


/**
 *  funktion initialisiert alle Intervalle für den Chat
 *  Greift auf var my_pikichat_user_id, var my_pikichat_chat_id und var my_pikichat_last_message_id 
 *  zu, welche im chat_board_window gesetzt werden.
 *  
 *  Interval für neue Messages
 *  Interval für neue System Messages (derzeit wahrscheinlich nur online offline meldung der User)
 *  Interval zum Check der Online User 
 *  Binden des Sende-Buttons und des Window-Close eventes
 *  Binden des Chat-Titel setzen buttons       
 *
 */  
function initPikiChatBoardWindow(chat_id,user_id){

  msg = "chat_id:"+chat_id+" user_id: "+user_id;
  writeDebug("Funktion: initPikiChatBoardWindow: "+msg);
  
  window.focus();

  $(document).ready(function() {
  
   $('#send_text').focus();
    
    $('#send_button').bind("click",function(){
      insertNewChatMessage(chat_id);
    });  
    
    $('#leave_button').bind("click",function(){
      var is_close = leaveChat(chat_id,true);
      if(is_close){
      leave_chat_with_button = true;
      window.close();
      }
    });

    $('#titel_save_button').bind("click",function(){
      setNewChatTitel(chat_id);
    });   
    
    $("#chat_workset").keypress(function(e){
        if(e.which==13) $("#send_button").click();
    }); 
    
    
    window.onbeforeunload = function(){
      if(leave_chat_with_button == false){
        leaveChat(chat_id,false);
      }
    };      
    //binder auf close zeichen mit closeChatWindow     
  });


  pikichat_get_new_messages_interval_id = setInterval("getNewChatMessages("+chat_id+")",pikichat_get_new_messages_interval);
  pikichat_update_chat_interval_id = setInterval("updateChat("+chat_id+")",pikichat_update_chat_interval);

}


/**
 *
 *  fügt eine neue Message in die Datenbank ein.
 */  
function insertNewChatMessage(chat_id){
  writeDebug("Funktion: insertNewChatMessage: "+chat_id);
  
  var msg = $('#send_text').val();
  msg = encodeURIComponent(msg);
  
  writeDebug("insertNewChatMessage -->message: "+msg);
  var data = "chat_id="+chat_id+"&pikirequest=insertNewChatMessage&message="+msg;
  //console.log(data);
  
  
  if(msg.length > 0){
  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_url+"pikichat_insert_chat_message.php",
   data: data,
   success: function(msg){
      if(msg.success == true){
        $('#send_text').val('');
        getNewChatMessages(chat_id);
      }
      else
        alert("Nachricht konnte nicht gespeichert werden. Bitte versuche es nocheinmal.");
  }      
 });
 }
}



/**
 * liest die neuen messages aus gibt sie aus.
 */  
function getNewChatMessages(chat_id){

    writeDebug("Funktion: getNewChatMessages: "+chat_id);
  
    var last_message_id = my_pikichat_last_message_id;
    $.ajax({
     type: "POST",
     cache: true,
     async: true,
     dataType: "json",
     url: pikichat_ajax_url+"pikichat_get_chat_messages.php",
     data: "chat_id="+chat_id+"&pikiaction=getNewChatMessages&last_message_id="+last_message_id,
     success: function(messages){
       if(messages.length > 0){
         var messages_list = $('#messages');
         var new_list_items = "";
         var first = true;
          $.each(messages, function(i, message){
            //dieser check schützt uns vor doppelten ausgaben.
            //wir müssen dieses array nur ab einer größe von x wieder löschen
            //um auf nummer sicher zu gehen keine overload zu erzeugen
            //brauchen wir, da wir beim insert gleich wieder die getMessage methode aufrufen
            //um realtime feeling zu erzeugen und es somit aber zu doubletten kommen kann
            //da die last_message_id noch nicht upgedatet wurde.
            if(pikichat_chat_message_array[message.message_id] == undefined){  
              //if(message.verfasser == my_pikichat_user_id)
                //var color = "red";
              //else
                //var color = "blue";
              var stamp = message.time;
              var new_li = '';
              if(last_verfasser != message.verfasser){
                //new_li += '</div>';
                new_li += '<h2><span class="chat-date">'+stamp+'</span>'+message.verfasser_nickname+'</h2>';
                //new_li += '<div class="textbereich">';
                new_li += '<p class="textbereich">'+message.text+'</p>';
                new_li += '<div class="zwischenbalken"></div>'; 
                last_verfasser = message.verfasser;
              }
              else{
                new_li += '<p class="textbereich">'+decodeURIComponent(message.text)+'</p>';
                new_li += '<div class="zwischenbalken"></div>'; 
              }
            
              //var new_li = "<li style=\"color:"+color+"\"><b>"+ message.verfasser_nickname +"</b>: <span class=\"date\">"+ stamp +"</span><br><span style=\"color:black;\">" + message.text + "</span></li><br />";        
            new_list_items += new_li;
            my_pikichat_last_message_id = message.message_id;
            //message_id zum array hinzufügen um dann beim nächsten mal prüfen zu können
            pikichat_chat_message_array[message.message_id] = true;
            pikichat_chat_message_array_inserted_ids++;
            //alert(pikichat_chat_message_array_inserted_ids);
           }
           //else
             //alert("doublette catched");
          });
          messages_list.append(new_list_items);
        
        //message_id_array löschen und counter zurücksetzen.
        if(pikichat_chat_message_array_inserted_ids > pikichat_chat_message_array_delete_size){
          //alert('Deleting pikichat_chat_message_array');
          pikichat_chat_message_array = new Array();
          pikichat_chat_message_array_inserted_ids = 0;
        }
        
         window.focus();
         $('#send_text').focus();
        //scroll to bottom --> jquer 1.3.2 notwendig
        $("#chat_messages").attr({ scrollTop: $("#chat_messages").attr("scrollHeight") });
        }
      }
    });
    
}


/**
 * update Chat: sucht nach neuen Systemmessages, sieht nach welche User in der Chat
 * Tabelle online sind und retouniert alles 
 */  
function leaveChat(chat_id,ask_to_confirm){
  if(ask_to_confirm == true)
    var conf = confirm("Chat wirklich verlassen?");
  else
    conf = true;    
  if(conf == true){
  $.ajax({
   type: "POST",
   cache: false,
   async: false,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "chat_id="+chat_id+"&pikirequest=leaveChat",
   success: function(msg){
  }      
 });
 }
 return conf;
}


/**
 *  chat fenster schließen und vorher den user noch aus der Onlie Tabelle streichen
 * 
 */  
function updateChat(chat_id){

  var old_chat_titel = $('#real_chat_titel').val();

  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_url+"pikichat_update_chat.php",
   data: "chat_id="+chat_id+"&pikirequest=updateChat&last_system_message_id="+my_pikichat_last_system_message_id,
   success: function(msg){
      if(msg.chat_titel != old_chat_titel){
        $('#real_chat_titel').html(msg.chat_titel);
      }
      
      if(msg.new_system_messages == true){
        var new_list_items = '';
        $.each(msg.system_messages, function(i, message){   
          var stamp = message.system_message_time;
          
          var new_li = '';
          new_li += '<h2 class=\"system_info\"><span class=\"chat-date\">'+stamp+'</span>SYSTEM_INFO<span class=\"system-info-2\"> '+message.system_message_text+'</span></h2>';          
          //new_li += '<div class="textbereich">';
          //new_li += '<p class="textbereich">'+message.system_message_text+'</p>'; 
          
          
          //var new_li = "<li><span class=\"date\">"+ stamp +"</span><br><span style=\"color:black;\">" + message.system_message_text + "</span></li><br />";        
          new_list_items += new_li;
          my_pikichat_last_system_message_id = message.system_message_id;
        });
        
        //$('#system_messages').prepend(new_list_items);
        $('#messages').append(new_list_items);
        $("#chat_messages").attr({ scrollTop: $("#chat_messages").attr("scrollHeight") });
        last_verfasser = 0; //zurücksetzen damit nach einer system info wieder der head samt namen bei der nächsten message raus kommt
      }
      
        //var new_list_items = '';
        //$.each(msg.online_users, function(i, message){   
          //var new_li = "<li><span style=\"color:black;\">" + message.nickname + "</span></li>";        
          //new_list_items += new_li;
        //});
        $('#online_members').html(msg.online_users);      
  }      
 });

}




/**
 *  den titel des chats setzen
 */  
function setNewChatTitel(chat_id){
  var titel = $('#chat_titel').val();
  if(titel.length > 0){
  $.ajax({
   type: "POST",
   cache: true,
   async: true,
   dataType: "json",
   url: pikichat_ajax_function_url,
   data: "chat_id="+chat_id+"&pikirequest=setNewChatTitel&titel="+titel,
   success: function(msg){
      if(msg.success == true){
       $('#chat_titel').val('');
       $('#titel_setzen').hide();
      }
   }      
 });
 }
return true;
}


/**
 *  added den smiley code zum chat_eingabefeld;
 */ 
function addSmileyToInputField(smiley_code){
  var tmp = $('#send_text').val();
  tmp += " "+smiley_code;
  $('#send_text').val(tmp);
  $('#send_text').focus();
}


/**
 *  cant believe scrolling title bar - fuck
 *  @deprecated
 */    
function startScrollChatTitle()
{
var msg = " Neue Nachricht auf Dogwalk-Chat ";
var pos = 0;
var spacer = " ... ";
var time_length = 100;
document.title = msg.substring(pos, msg.length) + spacer + msg.substring(0, pos);
pos++;
if (pos > msg.length) pos=0;
setTimeout("startScrollChatTitle()",time_length);
}









