
var MokaRun = {
    
    /**
     * Holds instant messenger data when activated
     */
    messenger: {
        salutation: ''
    },
  
  /**
   * Constructor
   */
  _construct: function(){
    $(document).bind(Moka.eStringsLoaded, MokaRun.init);
    
    MokaRun.contactForm_AutoSize();
    
  },
  
  contactForm_AutoSize: function(){
      
    var lbls = $('form.moka-contact label');
      
    // Autosize labels on forms
    lbls.css({
        'float': 'left',
        marginRight: 5,
        display: 'block'
    })
    
    var max = 0;
    lbls.each(function(){
        if ($(this).width() > max)
            max = $(this).width();    
    });
    lbls.width(max);
  },
  

  /**
   * Handles the submit of the contact form
   */
  contactForm_Submit: function(evt){
      
      var $this = $(this);

      // Check for valid email
      var inputEmail = $this.find("input[name=email]");
      if(inputEmail.length > 0 ){
            var email = inputEmail.val();
            var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
            var address = email;
            if(reg.test(address) == false) {
              inputEmail.css('outline', 'solid 2px red');
              alert(strings.pleaseValidemail);
              return false;
            }
      }
      
      // Check mandatory fields
      var mandatory = $this.find("input.mandatory, select.mandatory, textarea.mandatory");
      var mandatorySuccess = true;
      
      mandatory.each(function(){
          var $this = $(this);
          
          if(!$this.val()){
              mandatorySuccess = false;
              $this.css('outline', 'solid 2px red');
          }
      });
      
      if(!mandatorySuccess){
          alert(strings.checkMandatoryFieldsInRed);
          return false;
      }


      var fields = {'site': MOKA_NAME, 'location': document.location + ''};

      var inputs = $(this).find('input, textarea, select');

      for(var i = 0; i <= inputs.length; i++){
          if(inputs.eq(i).attr('type') == "submit") continue;
          fields[inputs.eq(i).attr('name')] = inputs.eq(i).val();
      }

      $(this).empty().append( $('<p>').append(strings.sendingMessage) );

      Moka.command('contact', fields, function(data){
          $('form.moka-contact').empty().append($('<p>').append(strings.thanksMessageSent));

          if(!data.success){
              alert(data.message);
          }
      });

      return false;
  },
  
  /**
   * Creates the Instant Messenger on the passed object
   * 
   */
  createInstantMessenger: function(container){
      
      MokaRun.messenger.container = container;
      
      Moka.command('get-instant-message-sessions', {}, function(data){
          
          if(!data.sessions){
              console.log("No sessions arrived");
          }
          
          //console.log(data)
          
          var found = false;
          
         for(var i in data.sessions){
            if(data.sessions[i].isoperator == "1"){
                found = true;
                break;
            }  
         } 
         
         if(found){
             
             MokaRun.createInstantMessenger_Callback(MokaRun.messenger.container)
         }else{
             //console.log("InstantMessegner: No operators found")
         }
      });
      
  },
  
  createInstantMessenger_Callback: function(container){
      
      // Extract messenger
      var m = MokaRun.messenger;
      
      // Check messenger is not yet initialized
      if(m.initialized){
        //console.log("createInstantMessenger: Only one instance supported");
        return;
      }
      
      // Check container is only one
      if(container.length != 1){ 
        //console.log("createInstantMessenger: Container must have length of 1"); 
        return; 
      }
      
      // Set container as a relative positioned object
      if(container.css('position') != 'absolute')
        container.css('position', 'relative');
      
      // Empty container
      container.empty();
      
      // Mark container
      container.addClass('instant-messenger');
      
      // Create components
      m.form = $('<form>').appendTo(container);              // Form to detect text send
      m.text = $('<input type=text>').appendTo(m.form);      // Textbox to enter messages
      m.messages = $('<div>').appendTo(container);           // Div to display messages
      
      // Assign handlers
      m.form.submit(MokaRun.messengerForm_Submit);
      
      // Position components
      m.form.css({
         position: 'absolute',
         margin: 0, 
         padding: 0 ,
         left: 0,
         right: 0,
         bottom: 0,
         height: '2em'
      });
      
      m.text.css({
          position:'absolute',
          top: 0,
          left: 0,
          right: 0,
          bottom: 0,
          margin: 0
      });
      
      m.messages.css({
          position: 'absolute',
          top: 0,
          left: 0,
          right: 0,
          overflow: 'auto',
          bottom: m.text.outerHeight()
      });
      
      // Format components
      m.messages.css({
          background: 'white',
          border: 'solid 1px gray',
          borderBottom: 'none'
      });
      
      m.text.css({
         border: 'solid 1px gray' ,
         outline: 'none'
      });
      
      if($.browser.msie){
          m.text.css('width', '100%');
          m.messages.css('border-bottom', 'solid 1px gray');
      }
      
      m.messages.append($('<div>').text(m.salutation).css('color', 'navy'));
      
      m.text.val("Escribe aquí...").focus(function(){
          var $this = $(this);
          if(!$this.data('erased')){
              $this.data('erased', true);
              $this.val('')
          }
      });
      
      // Flag messenger as initialized
      m.initialized = true;
      
      // Start message retrieveing loop
      MokaRun.getInstantMessages();
      
      // Start ping loop
      MokaRun.pingInstantMessageSession();
  },
  
  /**
   * Retrieves the id of the rendered content
   */
  getIdContent: function(){
    return $('.content-body input[name=idcontent]').val();
  },
  
  
  /**
   * Retrieves last 10 instant messages and prints those not printed yet
   */
  getInstantMessages: function(){
      Moka.command('get-instant-messages', {}, 
          function(data){
             
             var m = MokaRun.messenger;
             var newMessages = 0;
             
             if(!data.success || !('messages' in data)){
                 //Console.log("MokaRun.getInstantMessages: Can't get messages.")
                 return;
             }
             
             // Create added array if not exists
             if(!m.addedMessages) m.addedMessages = [];
             
             for(var i in data.messages){
                 
                 var found = false;
                 var msg = data.messages[i];
                 
                 // Scan addedMessages
                 for(var j = 0; j < m.addedMessages.length; j++){
                     if(m.addedMessages[j] == msg.idinstantmessage){
                         found = true;
                         break;
                     }
                 }
                 
                 if(!found){
                     
                     // Add to added list
                     m.addedMessages.push(msg.idinstantmessage); 
                     
                     var divMsg = Moka.createInstantMessageElement(msg);
                     
                     m.messages.append(divMsg);
                     newMessages++;
                 }
                 
                 
             }// End Message scan
             
             if(newMessages > 0)
                 // Scroll to bottom
                 m.messages.animate({ scrollTop: m.messages.attr("scrollHeight") }, 1000);
             
             // Re-retrieve in 3 seconds
             setTimeout('MokaRun.getInstantMessages()', 3000);
             
          });
  },
  
  /*
   * Initializes the class
   **/
  init: function(){
    MokaRun.initComments();
    MokaRun.initRater();
    MokaRun.initContactForm();
    MokaRun.initLogInForm();
  },
  
  /**
   * Initializes comments, if allowed.
   */
  initComments: function(){
    var element = $('.content-comments');

    if(element.length != 1) return;
    
     
     // Create comments UI
     var commentsTitle = $('<h2>').text(strings.comments);
     var commentsContainer = $('<div>').addClass('content-comments-container');
     
     var lbl = $('<div>').css({
                           'margin': 5,
                           'font-size': '12pt'
                         });
     var txt = $('<input type=text>').css({
                           'margin': 5,
                           'font-size': '12pt'
                         });
     var commentForm = $('<div>').addClass('comment-form')
     var lblOptional = $('<span>').addClass('frmOptional').text(strings.frmOptional);
     var lblRequired = $('<span>').addClass('frmRequired').text(strings.frmRequired);
     
     var addCommentTitle = $('<h2>').addClass('comments-title').text(strings.addComment).css({'clear': 'both'});
     var lblName = lbl.clone().text(strings.yourName + ":");
     var txtName = txt.clone().attr({
                     id: 'txtCommentName'
                   });
     var lblMail = lbl.clone().text(strings.yourMail + ":");
     var txtMail = txt.clone().attr({
                     id: 'txtCommentMail'
                   });
     var lblSubject = lbl.clone().text(strings.subject + ":");
     var txtSubject = txt.clone().attr({
                     id: 'txtCommentSubject'
                   });
     var lblText = lbl.clone().text(strings.comment + ":");
     var txtText = $('<textarea>').attr({
                     id: 'txtCommentText'
                   }).css({
                     'width': '400px',
                     'height': '10em'
                   });
     var lblCaptcha = lbl.clone().text(strings.writeThis + ":");
     var imgCaptcha = $('<img>').attr({
                        'align': 'absmiddle',
                        'src': MOKA_CALL + '?command=captcha'
                       }); 
     var txtCaptcha = txt.clone().attr({
                           id: 'txtCommentCaptcha'
                       });
     var btnAddComment = $('<button>').text(strings.postComment).attr({
                                         'id': 'btnPostComment'
                                       }).click(MokaRun.postComment);
     var waiter = $('<div>').attr('id', 'comment-waiter').append(
       $('<img>').attr({
         'align': 'absmiddle',
         'src': MOKA_PATH + "cms/imgs/login-loader.gif" 
       })
     ).append(strings.postingComment).css('display', 'none');
     
    element
      .empty()
      .append(commentsTitle)
      .append(commentsContainer)
      .append(addCommentTitle)
      .append(commentForm);
      
    commentForm
      .append(lblName.append(lblOptional.clone()))
      .append(txtName)
      .append(lblMail.append(lblOptional.clone()))
      .append(txtMail)
      .append(lblSubject .append(lblOptional.clone()))
      .append(txtSubject)
      .append(lblText.append(lblRequired.clone()))
      .append(txtText)
      .append(lblCaptcha.append(imgCaptcha).append(lblRequired.clone()))
      .append(txtCaptcha)
      .append(lbl.clone())
      .append(btnAddComment)
      .append(waiter);
      
   MokaRun.loadComments();
    
  },

  /**
   * Initializes contact form.
   * Moka contact forms should be classed: moka-contact
   */
  initContactForm: function(){
       $('form.moka-contact').submit(MokaRun.contactForm_Submit);
  },

  /**
   * Initializes contact form.
   * Moka contact forms should be classed: moka-contact
   */
  initLogInForm: function(){
       $('form.moka-login').submit(MokaRun.loginForm_Submit);
  },
  
  /**
   * Initializes rater, if enabled
   */
  initRater: function(){
    $('.content-rater-star')
      .mouseenter(MokaRun.star_MouseEnter)
      .mouseleave(MokaRun.star_MouseLeave)
      .click(MokaRun.star_Click)
  },
  
  /**
   * Loads the specified page of comments
   */
  loadComments: function(page, pagesize){
    
    if(typeof(pagesize) == 'undefined'){
      pagesize = 5;
    }
    
    if(typeof(page) == 'undefined'){
      page = 1;
    }
    
    var ct = $('.content-comments-container').empty().append( 
                               $('<div>').css({
                                 'margin': '3em',
                                 'text-align': 'center'
                               })
                               .append(
                                 $('<img>').attr({
                                   'align': 'absmiddle',
                                   'src': MOKA_PATH + 'cms/imgs/initial-loader.gif'
                                 }).css({
                                   'margin-right' : '1em'
                                 })
                               )
                               .append(
                                 $('<span>').text(' ' + strings.loadingComments)
                               )
                            );
    
    Moka.command('get-comments', {idcontent: MokaRun.getIdContent(), page: page, pagesize: pagesize}, MokaRun.loadComments_CallBack);
    
  },
  
  /**
   * Handles arrive of comments
   */
  loadComments_CallBack: function(data){
    
    var pages = parseInt(data.pages, 10);
    var page = parseInt(data.page, 10);
    var element = $('.content-comments-container'); 
    var pager = $('<div>').addClass('content-comments-pager');
    var pageNumber = $('<div>').attr('href', '#').click($.noop).addClass('content-comments-page-number');
    
    if(pages > 1){ 
      for(var i = pages; i >= 1; i--){
        pager.append(
          pageNumber.clone()
            .text(i)
            .data('page', i)
            .addClass('comments-page-number' + (page == i ? '-selected' : ''))
            .attr('title', strings.gotoComPage + ' ' + i)
            .click(function(){MokaRun.loadComments($(this).data('page'));})
          )
      }
      
      pager.append(
        $('<div>').text(strings.page + ':').addClass('comments-page-label')
      );
    }
    
    element.empty();
    
    if(data.pages == 0){
      element.append($('<blockquote>').text(strings.noCommentsYet));
    }
    
    element.append(pager.clone(true));
    
    for(var i in data.comments){
      var c = data.comments[i];
      var celem = MokaRun.renderComment(c).appendTo(element);     
    }
    
    element.append(pager.clone(true));
  },

  /**
   * Handles submit of automated log-in forms
   */
  loginForm_Submit: function(evt){
      var form = $(this);
      var user = form.find('input[name="user"]');
      var pass = form.find('input[name="pass"]');

      form.data('original-content', form.html());
      form.html(strings.wait);

      Moka.command('log-in', {user: user.val(), pass: pass.val()},
            MokaRun.loginForm_Submit_CallBack);

      return false;
  },

  /**
   * Callback for loginForm_Submit
   */
  loginForm_Submit_CallBack: function(data){
      var form = $('form.moka-login');
      form.html(form.data('original-content'));

      if(!data.success){    
          alert(data.message);
      }else{
          var redirect = form.find('input[name=redirect]');
          
          if(redirect.length > 0){
              document.location = redirect.val();
          }else{
              document.location = document.location;
          }

      }

  },
  
  /**
   * Handles submit of form in instant messenger
   */
  messengerForm_Submit: function(){
      
      var m = MokaRun.messenger;
      
      try{
          
          m.text.attr('disabled', 'disabled');
          
          Moka.command('send-instant-message', {message: m.text.val()},
            function(data){
                if(!data.success){
                    MokaRun.messenger.messages.append(
                        $('<div>')
                            .text(strings.messageNotDelivered)
                            .css({
                                color: 'red',
                                margin: 10
                            }));
                }else{
                    MokaRun.messenger.text.val('');
                }
                
                MokaRun.messenger.text.attr('disabled', ''); 
            });
      }catch(ex){
          //console.log(ex);
      }
      
      // Cancel submit
      return false;
  },
  
  /**
   * Pings the instant messaging machine
   */
  pingInstantMessageSession: function(){
      Moka.command('ping-instant-message', {}, 
        function(data){
            setTimeout('MokaRun.pingInstantMessageSession()', 11000); 
        });
  },
  
  /**
   * Posts a comment
   */
  postComment: function(){
    
    $('#btnPostComment').hide();
    $('#comment-waiter').show();
    
    Moka.command('new-comment', {
      idcontent: MokaRun.getIdContent(),
      name:     $('#txtCommentName').val(), 
      mail:     $('#txtCommentMail').val(),
      subject:  $('#txtCommentSubject').val(),
      text:     $('#txtCommentText').val(),
      captcha:  $('#txtCommentCaptcha').val()
    }, MokaRun.postComment_CallBack)
    
  },
  
  /**
   * CallBack of postComment
   */
  postComment_CallBack: function(data){
    
    $('#btnPostComment').show();
    $('#comment-waiter').hide();
    
    if(data.success){
      var c = {
        idcontent: MokaRun.getIdContent(),
        name:     $('#txtCommentName').val(),
        mail:     $('#txtCommentMail').val(),
        title:    $('#txtCommentSubject').val(),
        text:     $('#txtCommentText').val(),
        captcha:  $('#txtCommentCaptcha').val(),
        created:     ''
      };
      
      
      var element = $('.content-comments-container'); 
      element.prepend(MokaRun.renderComment(c));
      
      $('.comment-form input, .comment-form textarea').val('');
    }else{
      alert(data.message);
    }
    
  },
  
  /**
   * Renders a comment
   * 
   * @param c {object}  Comment object
   */
  renderComment: function(c){
    var celem = $('<div>').addClass('content-comment');
    var name = $('<div>').addClass('comment-name').text(c.name).appendTo(celem);
    var subject = $('<div>').addClass('comment-title').text(c.title).appendTo(celem);
    var txt = $('<div>').addClass('comment-text').text(c.text).appendTo(celem);
    var date = $('<div>').addClass('comment-date').text(c.created).appendTo(celem);
    
    return celem;
  },
  
  star_MouseEnter: function(evt){
    
    var star = $(this);
    var index = star.index();
    
    // Set hot stars
    var stars = $('.content-rater .content-rater-star');
   
    for(var i = 0; i <= stars.length; i++){
      
      if( i <= index){
        stars.eq(i)
          //.removeClass('content-rater-star-off')
          //.removeClass('content-rater-star-on')
          .addClass('content-rater-star-hot')
      }else{ 
        stars.eq(i)
          //.removeClass('content-rater-star-on')
          //.removeClass('content-rater-star-hot')
          //.addClass('content-rater-star-off');
       }
    }
    
    $('.content-rater .content-rater-title').text(strings.rateNow + ' ' + (index + 1) + "/" + stars.length);
    
  },
  
  star_MouseLeave: function(evt){
    var star = $(this);
    var index = parseInt($('.content-rater').attr('current-rating'), 10);

    // Set hot stars
    var stars = $('.content-rater .content-rater-star');
    
    for(var i = 0; i <= stars.length; i++){
      if( i < index)
        stars.eq(i)
          .removeClass('content-rater-star-off')
          .removeClass('content-rater-star-hot')
          .addClass('content-rater-star-on');
      else
        stars.eq(i)
          .removeClass('content-rater-star-on')
          .removeClass('content-rater-star-hot')
          .addClass('content-rater-star-off');
    }
    
    $('.content-rater .content-rater-title').text(strings.rate);
  },
  
  /**
   * Handles clicks on stars
   */
  star_Click: function(evt){
    
    // Set loading label
    $('.content-rater .content-rater-title')
      .text(strings.ratingNow)
      .append(
        $('<img>').attr({
           'align' : 'absmiddle',
           'src' :  MOKA_PATH + 'cms/imgs/login-loader.gif'
        })
      );
    
    var star = $(this);
    var index = star.index();
    
    Moka.command('new-rating', {idcontent: MokaRun.getIdContent(), rating: (index + 1)}, MokaRun.star_Click_CallBack);
  },
  
  /**
   * Callback for star_Click
   */
  star_Click_CallBack: function(data){
    
    if(!data.success){
      alert(data.message);
    }
    
    var index = data.rating - 1;
    
    $('.content-rater').attr('current-rating', index);   
    
    $('.content-rater .content-rater-title').text(strings.thanksForRating);
  }
  
};


$(function(){
  MokaRun._construct();
})

