
var SocialEngineAPI = {

  version : '0.1.0alpha'

};



SocialEngineAPI.Base = new Class({

  // Methods
  initialize: function()
  {
    this.version = SocialEngineAPI.version;
  },
  
  
  
  RegisterModule: function(moduleObject)
  {
    moduleObject.Base = this;
  }

});
SocialEngineAPI.Core = new Class({
  
  // Properties
  Base: {},
  
  settings: {},
  
  plugins: {},
  
  options : {
    ajaxURL : 'js_api.php'
  },

  
  
  
  // Methods
  initialize: function()
  {
    
  },

  
  
  
  // Import Methods
  ImportSettings: function(settings)
  {
    this.settings = settings;
  },

  
  
  
  // Import Methods
  ImportPlugins: function(plugins)
  {
    this.plugins = plugins;
  }
  
});
if( typeof(SocialEngineAPI)=="undefined" )
  var SocialEngineAPI = {};

SocialEngineAPI.Language = new Class({
  
  // Properties
  Base: {},

  
  
  
  // Methods
  initialize: function()
  {
    this.languageVariables = new Hash();
  },
  
  
  Translate: function(id)
  {
    var rawValue = this.languageVariables.get(id) || 'Missing Language Variable #' + id;
    return rawValue;
  },
  
  
  TranslateFormatted: function(id, params)
  {
    var rawValue = this.languageVariables.get(id) || 'Missing Language Variable #' + id;
    params.unshift(rawValue);
    var formattedValue = sprintf.run(params);
    return formattedValue;
  },
  
  
  
  
  // Import Methods
  Import: function(languageVariableObject)
  {
    if( $type(languageVariableObject)=="object" )
      this.languageVariables.extend(languageVariableObject);
  }
  
});



// Backwards compatibilty
var SocialEngineLanguage = SocialEngineAPI.Language;
SocialEngineAPI.URL = new Class({
  
  // Properties
  Base: {},
  
  url_base : null,
  
  url_info : {},
  
  
  
  // Methods
  initialize: function()
  {
    
  },
  
  
  url_create: function(name, user, id1, id2, id3)
  {
    var url_template = ( SocialEngine.Core.settings.setting_url ? this.url_info[name].url_subdirectory : this.url_info[name].url_regular );
    if( !url_template ) return false;
    
    url_template = url_template.replace('$user', user);
    url_template = url_template.replace('$id1', id1);
    url_template = url_template.replace('$id2', id2);
    url_template = url_template.replace('$id3', id3);
    
    return this.url_base + url_template;
  },
  
  
  url_userdir: function(user_id)
  {
    //alert(user_id + ' ' + ((user_id - 1) % 1000).toString());
    return 'uploads_user/' + (user_id + 999 - ((user_id - 1) % 1000)).toString() + '/' + user_id + '/';
  },
  
  
  
  
  
  // Import methods
  ImportURLBase: function(url_base)
  {
    this.url_base = url_base;
  },
  
  ImportURLInfo: function(url_info)
  {
    this.url_info = url_info;
  }
  
  
});
// Required language variables: 39,155,175,182,183,184,185,187,784,787,829,830,831,832,833,834,835,854,856,891,1025,1026,1032,1034,1071

SocialEngineAPI.Comments = new Class({
  
  // Class
	Implements: [Options],
  
  
  
  
  // Properties
  Base: {},
  
  page: 1,
  
  total: 0,
  
  changed: false,
  
  isEditing: false,
  
  
  options: {
    // Controls ajax request options
    'ajaxURL' : 'misc_js.php',
    'ajaxMethod' : 'post',
    'ajaxSecure' : false,
    
    // Can the viewer comment
    'canComment' : false,
    'commentHTML' : false,
    'commentCode' : false,
    
    // Controls the height of the comment box
    'originalHeight' : 70,
    
    // The type of comment ex. 'media'
    'type' : false,
    
    // The column that identifies the type ex. 'media_id'
    'typeIdentifier' : false,
    
    // The actual ID of the object commented on
    'typeID' : false,

    // Pagination Info
    'paginate' : false,
    'cpp' : false,

    // Comment links
    'commentLinks' : {'reply' : false, 'walltowall' : false},
    
    // Some other stuff to identify the object
    'object_owner' : false,
    'object_owner_id' : false,
    'typeTab' : false,
    'typeCol' : false,
    'typeTabParent' : false,
    'typeColParent' : false,
    'typeChild' : false
  },
  
  
  
  
  // Methods
  initialize: function(options)
  {
    this.setOptions(options);
    
    if( this.options.initialTotal ) this.total = this.options.initialTotal;

    var bind = this;
    window.addEvent('domready', function()
    {
      bind.showPostComment();
      
      bind.options.originalHeight = textarea_autogrow('comment_body');
      bind.getComments(1);
    });
  },
  
  
  
  
  showPostComment: function()
  {
    var innerHTML = "";
    
    // POST COMMENT
    innerHTML += 
      "<div class='comment_headline'>" +
        this.Base.Language.Translate(854) +
        " (<span class='tc' id='" + this.options.type + '_' + this.options.typeID + '_totalcomments' + "'>" + this.total + "</span>)" +
      "</div>";
      
    if( this.options.canComment )
    {
      innerHTML += 
        "<form action='misc_js.php' method='post' target='ajaxframe'>" +
          "<div class='profile_postcomment'>" +
            "<textarea name='comment_body' id='comment_body' cols='25' class='comment_area'>" + this.Base.Language.Translate(829) + "</textarea>";
      
      if( this.options.commentHTML ) innerHTML += 
            "<div style='margin-top: 5px;'>" +
              this.Base.Language.TranslateFormatted(1034, [this.options.commentHTML]) +
            "</div>";
      
      if( this.options.commentCode ) innerHTML += 
            "<div style='float: left; margin-top: 5px;'>" +
              "<a href='javascript:void(0);' onClick=\"this.blur();$('secure_image').src=$('secure_image').src+'?'+(new Date()).getTime();\">" +
                "<img src='./images/secure.php' id='secure_image' border='0' height='20' width='67' class='signup_code'>" + 
              "</a>" +
              " <input type='text' name='comment_secure' id='comment_secure' class='text' size='6' maxlength='10'> " +
              "<img src='./images/icons/tip.gif' border='0' class='Tips1' style='vertical-align: middle;' title='" + this.Base.Language.Translate(856) + "'>" +
            "</div>";
      
      innerHTML += 
            "<div style='text-align: right; margin-top: 5px;'>" +
            "<input type='submit' id='comment_submit' class='button' value='" + this.Base.Language.Translate(833) + "'>" +
            "<input type='hidden' name='task' value='comment_post'>" +
            "<input type='hidden' name='type' value='" + this.options.type + "'>" +
            "<input type='hidden' name='iden' value='" + this.options.typeIdentifier + "'>" +
            "<input type='hidden' name='value' value='" + this.options.typeID + "'>";
      
      if( this.options.object_owner && this.options.object_owner_id )
      {
        innerHTML += '<input type="hidden" name="object_owner" value="' + this.options.object_owner + '">' +
		     '<input type="hidden" name="object_owner_id" value="' + this.options.object_owner_id + '">';
      } else {
        innerHTML += '<input type="hidden" name="user" value="' + this.Base.Owner.user_info.user_username + '">';
      }

      if( this.options.typeTab ) innerHTML += 
            "<input type='hidden' name='tab' value='" + this.options.typeTab + "'>";
      
      if( this.options.typeCol ) innerHTML += 
            "<input type='hidden' name='col' value='" + this.options.typeCol + "'>";
      
      if( this.options.typeTabParent ) innerHTML += 
          '<input type="hidden" name="tab_parent" value="' + this.options.typeTabParent + '">';
      
      if( this.options.typeColParent ) innerHTML += 
          '<input type="hidden" name="col_parent" value="' + this.options.typeColParent + '">';
      
      if( this.options.typeChild ) innerHTML += 
          '<input type="hidden" name="child" value="1">';
      
      innerHTML += 
            "</div>" +
            "<div id='comment_error' style='color: #FF0000; display: none;'></div>" +
          "</div>" +
        "</form>";
    }
    
    // DELETE COMMENT
    innerHTML += 
      '<div style="display: none;" id="confirmcommentdelete">' +
        '<div style="margin-top: 10px;">' +
          this.Base.Language.Translate(1026) +
        '</div>' +
        '<br />' +
        '<form action="misc_js.php" method="post" target="ajaxframe">' +
        '<input type="submit" class="button" value="' + this.Base.Language.Translate(175) + '" onClick="parent.TB_remove();"> ' +
        '<input type="button" class="button" value="' + this.Base.Language.Translate(39) + '" onClick="parent.TB_remove();">' +
        '<input type="hidden" name="task" value="comment_delete">' +
        '<input type="hidden" name="comment_id" id="del_comment_id" value="0">' +
        '<input type="hidden" name="type" value="' + this.options.type + '">' +
        '<input type="hidden" name="iden" value="' + this.options.typeIdentifier + '">' +
        '<input type="hidden" name="value" value="' + this.options.typeID + '">';

    if( this.options.object_owner && this.options.object_owner_id )
    {
      innerHTML += '<input type="hidden" name="object_owner" value="' + this.options.object_owner + '">' +
		   '<input type="hidden" name="object_owner_id" value="' + this.options.object_owner_id + '">';
    } else {
      innerHTML += '<input type="hidden" name="user" value="' + this.Base.Owner.user_info.user_username + '">';
    }

    if( this.options.typeTab ) innerHTML += 
        '<input type="hidden" name="tab" value="' + this.options.typeTab + '">';
    
    if( this.options.typeCol ) innerHTML += 
        '<input type="hidden" name="col" value="' + this.options.typeCol + '">';
    
    if( this.options.typeTabParent ) innerHTML += 
        '<input type="hidden" name="tab_parent" value="' + this.options.typeTabParent + '">';
    
    if( this.options.typeColParent ) innerHTML += 
        '<input type="hidden" name="col_parent" value="' + this.options.typeColParent + '">';
    
    if( this.options.typeChild ) innerHTML += 
        '<input type="hidden" name="child" value="1">';

  
    
    innerHTML += 
        '</form>' +
      '</div>';
    
    
    
    var postCommentContainerElement = $(this.options.type + '_' + this.options.typeID + '_postcomment');
    postCommentContainerElement.innerHTML = innerHTML;
    
    
    // Add events
    var bind = this;
    if( this.options.canComment )
    {
      postCommentContainerElement.getElement('form').addEvent('submit', function()    { bind.checkText();       });
      postCommentContainerElement.getElement('textarea').addEvent('focus', function() { bind.removeText(this);  });
      postCommentContainerElement.getElement('textarea').addEvent('blur', function()  { bind.addText(this);     });
    }
    
  },
  
  
  
  
  getComments: function(direction)
  {
    if( direction=='next' )
      this.page++;
    else if( direction=='previous' )
      this.page--;
    else if( $type(direction) )
      this.page = direction;
    
    if( this.options.paginate ) {
      window.scroll(0,0);
    } else {
      this.options.cpp = this.total;
    }

    if( this.options.object_owner && this.options.object_owner_id )
    {
      var object_owner = this.options.object_owner;
      var object_owner_id = this.options.object_owner_id;
      var user = '';
    } else {
      var object_owner = '';
      var object_owner_id = '';
      var user = this.Base.Owner.user_info.user_username;      
    }

    // AJAX
    var bind = this;
    var request = new Request.JSON({
      'url' : this.options.ajaxURL,
      'method' : this.options.ajaxMethod,
      'secure' : this.options.ajaxSecure,
      'data' : {
        'task'  : 'comment_get',
        'user'  : user,
	'object_owner' : object_owner,
	'object_owner_id' : object_owner_id,
        'type'  : this.options.type,
        'iden'  : this.options.typeIdentifier,
        'value' : this.options.typeID,
        'cpp'   : this.options.cpp,
        'p'     : this.page
      },
      'onComplete' : function(responseObject, responseText)
      {
        bind.updateComments(responseObject);
      }
    });
    
    request.send();
  },
  
  
  
  
  // THIS FUNCTION UPDATES THE COMMENTS
  updateComments: function(responseObject)
  {
    if( $type(responseObject)!="object" )
    {
      alert('There was an error processing the request.');
      return false;
    }
    
    
    // Prepare
    this.total  = parseInt(responseObject.total_comments) || 0;
    this.page   = responseObject.p;
    
    var maxpage = responseObject.maxpage;
    var p_start = responseObject.p_start;
    var p_end   = responseObject.p_end;
    
    var totalCommentElement     = $(this.options.type + '_' + this.options.typeID + '_totalcomments');
    var commentContainerElement = $(this.options.type + '_' + this.options.typeID + '_comments');
    var comments = $H(responseObject.comments);
    
    // UPDATE TOTAL COMMENTS AND PAGE VARS
    totalCommentElement.innerHTML = this.total;

    // CREATE DIV TO HOLD COMMENT BODY FOR CLEANING
    var commentBodyDiv = document.createElement('div');
    
    // EMPTY CONTAINER 
    commentContainerElement.empty();
    
    // LOOP OVER COMMENTS
    var bind = this;
    if(bind.Base.Core.settings.setting_url) { var querySeparator = '?'; } else { var querySeparator = '&'; }
    comments.each(function(commentObject, commentID)
    {
      var newComment = new Element('div', {
        'id' : 'comment_' + commentID
      });
      
      // BUILD COMMENT
      var newCommentInnerHTML = "<div style='margin-top: 10px; margin-bottom: 20px;'>";
      
      // AUTHOR PHOTO
      if( commentObject.comment_authoruser_id && commentObject.comment_authoruser_exists )
        newCommentInnerHTML += "<div style='float: left; text-align: center; width: 90px;'><a href='" + commentObject.comment_authoruser_url + "'><img src='" + commentObject.comment_authoruser_photo + "' class='photo' width='" + commentObject.comment_authoruser_photo_width + "' border='0'></a></div>";
      else
        newCommentInnerHTML += "<div style='float: left; text-align: center; width: 90px;'><img src='./images/nophoto.gif' class='photo' width='75' border='0'></div>";
      
      newCommentInnerHTML += "<div style='overflow: hidden;'>";
      
      // AUTHOR NAME/LINK
      if( !commentObject.comment_authoruser_id )
        newCommentInnerHTML += "<div class='profile_comment_author'><b>" + bind.Base.Language.Translate(835) + "</b></div>";
      else if( !commentObject.comment_authoruser_exists )
        newCommentInnerHTML += "<div class='profile_comment_author'><b>" + bind.Base.Language.Translate(1071) + "</b></div>";
      else
        newCommentInnerHTML += "<div class='profile_comment_author'><a href='" + commentObject.comment_authoruser_url + "'><b>" + commentObject.comment_authoruser_displayname + "</b></a></div>";
      
      // COMMENT DATE
      newCommentInnerHTML += "<div class='profile_comment_date'>" + commentObject.comment_date + "</div>";
      
      // COMMENT BODY
      newComment.setProperty('html', commentObject.comment_body);
      
      newCommentInnerHTML += "<div class='profile_comment_body' id='profile_comment_body_" + commentID + "'>" + commentObject.comment_body + "&nbsp;</div>";
      newCommentInnerHTML += "<div class='profile_comment_links'>";
      
      // COMMENT LINKS
      var links = new Array();
      if( bind.Base.Viewer.user_exists && commentObject.comment_authoruser_id && commentObject.comment_authoruser_exists )
      {

        // REPLY LINK (VISIBLE ONLY TO OWNER)
	if(bind.options.commentLinks.reply && bind.Base.Viewer.user_info.user_id == bind.Base.Owner.user_info.user_id && bind.Base.Viewer.user_info.user_id != commentObject.comment_authoruser_id) 
        { 
          links.push("<a href='"+commentObject.comment_authoruser_url+querySeparator+"v=comments'>" + bind.Base.Language.Translate(787) + "</a>"); 
        }

	// WALL-TO-WALL (VISIBLE ONLY IF USER CAN SEE AUTHOR'S PROFILE)
	if(bind.options.commentLinks.walltowall && commentObject.comment_authoruser_id != bind.Base.Owner.user_info.user_id && commentObject.comment_authoruser_private == false) 
	{ 
	  links.push("<a href=\"javascript:TB_show('" + bind.Base.Language.Translate(1032) + "', 'profile_comments.php?user=" + bind.Base.Owner.user_info.user_username +"&user2=" + commentObject.comment_authoruser_username + "&TB_iframe=true&height=450&width=550', '', './images/trans.gif');\">" + bind.Base.Language.Translate(891) + "</a>");
        }

        // MESSAGE (VISIBLE IF USER IS NOT AUTHOR)
        if( commentObject.comment_authoruser_id!=bind.Base.Viewer.user_info.user_id )
        {
          links.push("<a href=\"javascript:TB_show('" + bind.Base.Language.Translate(784) + "', 'user_messages_new.php?to_user=" + commentObject.comment_authoruser_displayname + "&to_id=" + commentObject.comment_authoruser_username + "&TB_iframe=true&height=400&width=450', '', './images/trans.gif');\">" + bind.Base.Language.Translate(834) + "</a>");
        }
        
        // EDIT (VISIBLE IF USER IS AUTHOR)
        if( commentObject.comment_authoruser_id==bind.Base.Viewer.user_info.user_id )
        {
          links.push("<a class=\"commentEditLink\" href=\"javascript:void(0);\" id='comment_edit_link_" + commentID + "'>" + bind.Base.Language.Translate(187) + "</a>");
        }
        
      }

      // DELETE (VISIBLE IF USER IS AUTHOR OR USER IS OWNER)
      if((commentObject.comment_authoruser_exists && commentObject.comment_authoruser_id == bind.Base.Viewer.user_info.user_id) || (bind.Base.Viewer.user_exists && bind.Base.Viewer.user_info.user_id == bind.Base.Owner.user_info.user_id))
      {
        links.push("<a class=\"commentDeleteLink\" href=\"javascript:void(0);\" id='comment_delete_link_" + commentID + "'>" + bind.Base.Language.Translate(155) + "</a>");
      }
      
      newCommentInnerHTML += links.join('&nbsp;-&nbsp;');
      newCommentInnerHTML += "&nbsp;</div></div></div>";
      
      // ADD NEW INNERHTML
      newComment.setProperty('html', newCommentInnerHTML);
      newComment.inject(commentContainerElement);
      
      // ADD EVENTS
      if( newComment.getElement('.commentEditLink') ) newComment.getElement('.commentEditLink').addEvent('click', function()
      {
        bind.editComment(commentID);
      });
      
      if( newComment.getElement('.commentDeleteLink') ) newComment.getElement('.commentDeleteLink').addEvent('click', function()
      {
        bind.confirmDelete(commentID);
      });
    });
    
    // CREATE PAGINATION DIV
    if(this.options.paginate && this.total > this.options.cpp) { 
      var commentPaginationTop = new Element('div', {'styles': {'text-align' : 'center'}});
      var commentPaginationBottom = new Element('div', {'styles': {'text-align' : 'center'}});
      if(this.page > 1) {
        var paginationHTMLTop = "<a href='javascript:void(0);' id='comment_last_page_top'>&#171; " + bind.Base.Language.Translate(182) + "</a>";
        var paginationHTMLBottom = "<a href='javascript:void(0);' id='comment_last_page_bottom'>&#171; " + bind.Base.Language.Translate(182) + "</a>";
      } else {
        var paginationHTMLTop = "<font class='disabled'>&#171; " + bind.Base.Language.Translate(182) + "</font>";
        var paginationHTMLBottom = "<font class='disabled'>&#171; " + bind.Base.Language.Translate(182) + "</font>";
      }
      if(p_start == p_end) {
        paginationHTMLTop += "&nbsp;|&nbsp; " + this.Base.Language.TranslateFormatted(184, [p_start, this.total]) + "&nbsp;|&nbsp;";
        paginationHTMLBottom += "&nbsp;|&nbsp; " + this.Base.Language.TranslateFormatted(184, [p_start, this.total]) + "&nbsp;|&nbsp;";
      } else {
        paginationHTMLTop += "&nbsp;|&nbsp; " + this.Base.Language.TranslateFormatted(185, [p_start, p_end, this.total]) + "&nbsp;|&nbsp;";
        paginationHTMLBottom += "&nbsp;|&nbsp; " + this.Base.Language.TranslateFormatted(185, [p_start, p_end, this.total]) + "&nbsp;|&nbsp;";
      }
      if(this.page != maxpage) {
        paginationHTMLTop += "<a href='javascript:void(0);' id='comment_next_page_top'>" + bind.Base.Language.Translate(183) + " &#187;</a>";
        paginationHTMLBottom += "<a href='javascript:void(0);' id='comment_next_page_bottom'>" + bind.Base.Language.Translate(183) + " &#187;</a>";
      } else {
        paginationHTMLTop += "<font class='disabled'>" + bind.Base.Language.Translate(183) + " &#187;</font>";
        paginationHTMLBottom += "<font class='disabled'>" + bind.Base.Language.Translate(183) + " &#187;</font>";
      }
      commentPaginationTop.setProperty('html', paginationHTMLTop);
      commentPaginationBottom.setProperty('html', paginationHTMLBottom);
      commentPaginationTop.inject(commentContainerElement, 'top');
      commentPaginationBottom.inject(commentContainerElement);

      // ADD EVENTS
      if( commentPaginationTop.getElement('a[id=comment_last_page_top]') ) commentPaginationTop.getElement('a[id=comment_last_page_top]').addEvent('click', function()
      {
        bind.getComments('previous');
      });

      if( commentPaginationBottom.getElement('a[id=comment_last_page_bottom]') ) commentPaginationBottom.getElement('a[id=comment_last_page_bottom]').addEvent('click', function()
      {
        bind.getComments('previous');
      });
      
      if( commentPaginationTop.getElement('a[id=comment_next_page_top]') ) commentPaginationTop.getElement('a[id=comment_next_page_top]').addEvent('click', function()
      {
        bind.getComments('next');
      });

      if( commentPaginationBottom.getElement('a[id=comment_next_page_bottom]') ) commentPaginationBottom.getElement('a[id=comment_next_page_bottom]').addEvent('click', function()
      {
        bind.getComments('next');
      });
    }

  },
  
  
  // Adds a comment
  addComment: function(is_error, comment_body, comment_date)
  {
    if( !this.options.canComment )
      return false;
    
    if( is_error )
    {
      $('comment_error').style.display = 'block';
      if( !comment_body.trim() )
      {
        this.addText($('comment_body'));
        $('comment_error').innerHTML = this.Base.Language.Translate(831);
      }
      else
      {
        $('comment_error').innerHTML = this.Base.Language.Translate(832);
      }
      $('comment_submit').value = this.Base.Language.Translate(833);
      $('comment_submit').disabled = false;
    }
    else
    {
      $('comment_error').style.display = 'none';
      $('comment_error').innerHTML = '';
      
      $('comment_body').value = '';
      $('comment_body').style.height = this.options.originalHeight + 'px';
      this.addText($('comment_body'));
      
      $('comment_submit').value = this.Base.Language.Translate(833);
      $('comment_submit').disabled = false;
      
      if( $('comment_secure') )
      {
        $('comment_secure').value = '';
        $('secure_image').src = $('secure_image').src + '?' + (new Date()).getTime();
      }
      
      // INPUT COMMENTS
      this.page = 1;
      this.total++;
      this.getComments();
    }
  },
  
  
  
  editComment: function(commentID)
  {
    var bind = this;
    if( this.isEditing ) return false;
    this.isEditing = true;
    
    
    //var commentContainerElement = $(this.options.type + '_' + this.options.typeID + '_comments');
    //var commentElement = commentContainerElement.getElement('profile_comment_body_' + commentID);
    var commentElement = $('profile_comment_body_' + commentID);
    
    var height = commentElement.offsetHeight + 10;
    var commentText = commentElement.innerHTML.replace(/<br>/gi, '\r\n').replace(/>/gi, '&gt;');
    
    var innerHTML = '';
    innerHTML += "<form action='misc_js.php' method='post' target='ajaxframe' name='editCommentForm'>";
    innerHTML += "<textarea name='comment_edit' id='comment_edit_" + commentID + "' style='height: " + height +" px; width: 100%;'>" + commentText + "</textarea>";
    innerHTML += "<input type='hidden' name='task' value='comment_edit'>";
    innerHTML += "<input type='hidden' name='comment_id' value='" + commentID + "'>";
    innerHTML += "<input type='hidden' name='type' value='" + this.options.type + "'>";
    innerHTML += "<input type='hidden' name='iden' value='" + this.options.typeIdentifier + "'>";
    innerHTML += "<input type='hidden' name='value' value='" + this.options.typeID + "'>";
    
    if( this.options.typeTab ) innerHTML += 
        '<input type="hidden" name="tab" value="' + this.options.typeTab + '">';
    
    if( this.options.typeCol ) innerHTML += 
        '<input type="hidden" name="col" value="' + this.options.typeCol + '">';
    
    if( this.options.typeTabParent ) innerHTML += 
        '<input type="hidden" name="tab_parent" value="' + this.options.typeTabParent + '">';
    
    if( this.options.typeColParent ) innerHTML += 
        '<input type="hidden" name="col_parent" value="' + this.options.typeColParent + '">';
    
    if( this.options.typeChild ) innerHTML += 
        '<input type="hidden" name="child" value="1">';
    
    
    innerHTML += "</form>";
    
    
    // Inject
    commentElement.innerHTML = innerHTML;
    textarea_autogrow('comment_edit_' + commentID);
    $('comment_edit_' + commentID).focus();
    
    
    // Add events
    $('comment_edit_' + commentID).addEvent('blur', function()
    {
      document.editCommentForm.submit();
      bind.isEditing = false;
    });
  },
  
  
  
  confirmDelete: function(commentID)
  {
    $('del_comment_id').value = commentID;
    TB_show(this.Base.Language.Translate(1025), '#TB_inline?height=100&width=300&inlineId=confirmcommentdelete', '', '../images/trans.gif');
  },
  
  
  
  
  
  
  
  // UI Methods
  removeText: function(commentBody)
  {
    if( !this.changed )
    {
      commentBody.value = '';
      commentBody.style.color = '#000000';
      this.changed = true;
    }
  },
  
  
  
  addText: function(commentBody)
  {
    if( !commentBody.value.trim() )
    {
      commentBody.value = this.Base.Language.Translate(829);
      commentBody.style.color = '#888888';
      this.changed = false;
    }
  },
  
  
  
  checkText: function(commentBody)
  {
    if( !this.changed )
      $('comment_body').value='';
    
    $('comment_submit').value = this.Base.Language.Translate(830);
    $('comment_submit').disabled = true;
  }
  
});

// Required language variables: 39,1212,1213,1214,1215,1228

SocialEngineAPI.Tags = new Class({
  
  // Class
	Implements: [Options],
  
  
  
  
  // Properties
  Base: {},
  
  isTagging: false,

  newtag : false,

  tags : [],
  
  
  options: {
    // Controls ajax request options
    'ajaxURL' : 'misc_js.php',
    'ajaxMethod' : 'post',
    'ajaxSecure' : false,
    
    // Can the viewer media
    'canTag' : false,
    
    // The type of media ex. 'group'
    'type' : false,
    
    // The actual ID of the object being tagged
    'media_id' : false,

    // Path to the image
    'media_dir' : false,
    
    // Some other stuff to identify the object
    'object_owner' : false,
    'object_owner_id' : false
  },
  
  
  
  
  // Methods
  initialize: function(options)
  {
    this.setOptions(options);
    
    if( this.options.initialTotal ) this.total = this.options.initialTotal;

    var bind = this;
    window.addEvent('domready', function()
    {
      bind.showTagForm();
    });
  },
  
  
  
  showTagForm : function()
  {
    var innerHTML = "";
    var bind = this;

    if( this.options.canTag ) 
    {
      innerHTML +=
	"<div class='media_photo_tagform_titlebar'><img src='images/icons/photos16.gif' class='icon' />" + this.Base.Language.Translate(1212) + "</div>" +
	"<div style='padding: 7px;'>" +
	"<div style='text-align: left;'>" +
	"<div style='font-size: 7pt; margin-bottom: 5px;'>" + this.Base.Language.Translate(1213) + "</div>" +
	"<div style='text-align: center;'><input type='text' style='width: 130px; padding-left: 4px; font-size: 8pt;' name='media_photo_tag' id='media_photo_tag' class='text' maxlength='40'/></div>" +
	"</div>" +
	"<div id='media_photo_friendlist' class='media_photo_friendlist'>";

      if( bind.Base.Viewer.user_exists ) 
      {
        innerHTML += "<div><a href='javascript:void(0)' id='tag_me'>" + bind.Base.Viewer.user_displayname + bind.Base.Language.Translate(1214) + "</a></div>";
      }

      innerHTML += "</div>" +
        "<div>" +
	"<input type='button' class='button' name='save' id='tag_save' value='" + bind.Base.Language.Translate(1215) + "' />&nbsp;&nbsp;" +
	"<input type='button' class='button' id='tag_cancel' name='cancel' value='" + bind.Base.Language.Translate(39) + "' />" +
	"</div>" +
        "</div>";

      var newTagForm = new Element('div', {
        'id' : 'media_photo_tagform',
        'class' : 'media_photo_tagform',
        'html' : innerHTML
      });

      var mediaContainer = $('media_photo_div');
      newTagForm.inject(mediaContainer);

      // ADD EVENTS
      if( newTagForm.getElement('input[id=tag_cancel]') ) newTagForm.getElement('input[id=tag_cancel]').addEvent('click', function()
      {
        bind.cancelTag();
      });
      if( newTagForm.getElement('input[id=tag_save]') ) newTagForm.getElement('input[id=tag_save]').addEvent('click', function()
      {
        bind.saveTag(0);
      });
      if( newTagForm.getElement('a[id=tag_me]') ) newTagForm.getElement('a[id=tag_me]').addEvent('click', function()
      {
        bind.saveTag(bind.Base.Viewer.user_info.user_id);
      });

      var request = new Request.JSON({secure: false, url: 'misc_js.php?task=friends_all',
		onComplete: function(jsonObj) { 
			bind.addFriendToList(jsonObj.friends);
		}
      }).send();
    }
  },
  
  
  
  addFriendToList : function(friends)
  {
    var bind = this;

    friends.each(function(friend) {
      for(var x in friend) {

	var newDiv = new Element("div", {'id' : 'friend_div_'+x});
	var newAnchor = new Element("a", {'href' : 'javascript:void(0)', 
			'id' : 'friend_link_'+x,
			'html' : friend[x]
		}).inject(newDiv);

	newDiv.inject($('media_photo_friendlist'));

	$('friend_link_'+x).addEvent('click', function() { bind.saveTag(x); });
      }
    });
  },
  
  
  
  insertTag : function(tag_id, tag_link, tag_text, tag_x, tag_y, tag_width, tag_height, tagged_user)
  {
    var newHTML = '';
    var bind = this;

    if($('media_tags').style.display == 'none') 
    {
      $('media_tags').style.display = 'block';
    } else if(bind.tags.length != 0) 
    {
      newHTML = '<span id="tag_comma_'+tag_id+'">, </span>';
    }

    var newSpan = new Element("span", {'id' : 'full_tag_'+tag_id, 'html' : newHTML});
    if(tag_link != '') 
    {
      var newAnchor = new Element("a", {'href' : tag_link, 
			'id' : 'tag_link_'+tag_id,
			'html' : tag_text
		}).inject(newSpan);
    } 
    else {
      var newAnchor = new Element("span", {'id' : 'tag_link_'+tag_id,
				'html' : tag_text,
				'styles' : {'cursor' : 'pointer'}
			}).inject(newSpan);
    } 

    if( bind.Base.Viewer.user_exists && (bind.Base.Viewer.user_info.user_username == tagged_user || bind.Base.Viewer.user_info.user_username == bind.Base.Owner.user_info.user_username)) 
    {
      var media_tags_text = $(newSpan).get('html');
      $(newSpan).set('html', media_tags_text, ' (<a href=\'javascript:void(0);\' id=\'new_removetag_link\'>' + bind.Base.Language.Translate(1228) + '</a>)');
    }

    newSpan.inject($('media_tags'));

    bind.createTag(tag_id, tag_text, tag_x, tag_y, tag_width, tag_height);

    $('tag_link_'+tag_id).addEvent('mouseover', function() { bind.showTag(tag_id); });
    $('tag_link_'+tag_id).addEvent('mouseout', function() { bind.hideTag(tag_id); });

    if($('new_removetag_link')) {
      $('new_removetag_link').addEvent('click', function() { bind.removeTag(tag_id); });
      $('new_removetag_link').set('id', 'removetag_link_'+tag_id);
    }

    bind.tags.push(tag_id);
  },
  
  
  
  createTag : function(tag_id, label_text, tag_x, tag_y, tag_width, tag_height)
  {
    var bind = this;
  
    // CREATE TAG AND LABEL
    new Element("div", {'id' : 'tag_'+tag_id, 'html' : '<img src="./images/trans.gif" width="100%" height="100%" />', 'class' : 'tag_div_hidden', 'styles' : {'width' : (parseInt(tag_width)-4)+'px', 'height' : (parseInt(tag_height)-4)+'px', 'top' : tag_x+'px', 'left' : tag_y+'px'}}).inject($('media_photo_div'));
    new Element("div", {'id' : 'tag_label_'+tag_id, 'html' : label_text, 'class' : 'tag_label', 'styles' : {'display' : 'none', 'top' : (parseInt(tag_x)+parseInt(tag_height)+10)+'px', 'left' : tag_y+'px'}}).inject($('media_photo_div'));

    // ADD MOUSEOVER/MOUSEOUT EVENTS
    $('tag_'+tag_id).addEvent('mouseover', function() { bind.showTag(tag_id); });
    $('tag_'+tag_id).addEvent('mouseout', function() { bind.hideTag(tag_id); });
  },
  
  
  
  showTag : function(tag_id)
  {
    $('tag_'+tag_id).className = 'tag_div';
    $('tag_label_'+tag_id).style.display = 'block';
  },
  
  
  
  hideTag : function(tag_id)
  {
    $('tag_'+tag_id).className = 'tag_div_hidden';
    $('tag_label_'+tag_id).style.display = 'none';
  },
  
  
  
  addTag : function()
  {
    if(!this.isTagging) {
      this.isTagging = true;
      this.newtag = new MooCrop('media_photo');
 
      var bind = this;

      var indicator = $('media_photo_tagform').inject(bind.newtag.wrapper);
      indicator.setStyles({'top' : this.newtag.crop.bottom+10, 'left' : this.newtag.crop.right+10, 'display' : 'block'});

      this.newtag.addEvent('onBegin', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'none'); });
      this.newtag.addEvent('onCrop', function(imgsrc, crop, bound, hanlde) { indicator.setStyles({'top' : crop.bottom+10, 'left' : crop.right+10, 'display' : 'none'}); });
      this.newtag.addEvent('onComplete', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'block'); });
    }
  },
  
  
  
  cancelTag : function()
  {
    if(this.isTagging) {
      $('media_photo_tag').value = '';
      $('media_photo_tagform').inject('media_photo_div').setStyle('display', 'none');
      var stopTagging = this.newtag.removeOverlay.bind(this.newtag);
      stopTagging();
      this.isTagging = false;
    }
  },
  
  
  
  saveTag : function(mediatag_user_id)
  {
    if(this.isTagging) {

      if( this.options.object_owner && this.options.object_owner_id )
      {
        var object_owner = this.options.object_owner;
        var object_owner_id = this.options.object_owner_id;
        var user = '';
      } else {
        var object_owner = '';
        var object_owner_id = '';
        var user = this.Base.Owner.user_info.user_username;      
      }

      var url = "misc_js.php?task=tag_do" +
                "&mediatag_user_id=" + mediatag_user_id +
		"&mediatag_text=" + encodeURIComponent($('media_photo_tag').value) +
		"&mediatag_x=" + this.newtag.crop.top +
		"&mediatag_y=" + this.newtag.crop.left +
		"&mediatag_height=" + this.newtag.crop.height +
		"&mediatag_width=" + this.newtag.crop.width +
		"&user=" + user +
		"&object_owner=" + object_owner +
		"&object_owner_id=" + object_owner_id +
		"&type=" + this.options.type +
		"&media_id=" + this.options.media_id +
		"&media_dir=" + this.options.media_dir;

      $('ajaxframe').src = url;

      $('media_photo_tag').value = '';
      $('media_photo_tagform').inject('media_photo_div').setStyle('display', 'none');
      var stopTagging = this.newtag.removeOverlay.bind(this.newtag);
      stopTagging();
      this.isTagging = false;
    }
  },
  
  
  
  removeTag : function(tag_id)
  {

    if( this.options.object_owner && this.options.object_owner_id )
    {
      var object_owner = this.options.object_owner;
      var object_owner_id = this.options.object_owner_id;
      var user = '';
    } else {
      var object_owner = '';
      var object_owner_id = '';
      var user = this.Base.Owner.user_info.user_username;      
    }

    var url = "misc_js.php?task=tag_remove" +
                "&mediatag_id=" + tag_id +
		"&user=" + user +
		"&object_owner=" + object_owner +
		"&object_owner_id=" + object_owner_id +
		"&type=" + this.options.type +
		"&media_id=" + this.options.media_id;

    $('ajaxframe').src = url;

    $('tag_'+tag_id).destroy();
    $('tag_label_'+tag_id).destroy();

    $('full_tag_'+tag_id).destroy();

    if(this.tags.indexOf(tag_id) == 0 && $('tag_comma_'+this.tags[1])) {
      $('tag_comma_'+this.tags[1]).destroy();
    }

    this.tags.splice(this.tags.indexOf(tag_id), 1);

    if(this.tags.length == 0) {
      $('media_tags').style.display = 'none';
    }
  }


  
});








/***
 * MooCrop (v. rc-1 - 2007-10-24 )
 *
 * @version			rc-1
 * @license			BSD-style license
 * @author			nwhite - < nw [at] nwhite.net >
 * @infos			http://www.nwhite.net/MooCrop/
 * @copyright		Author
 * 

 */
var MooCrop = new Class({

	calculateHandles : true,
	current : {},

	options : {
		maskColor : 'black',
		maskOpacity : '.3',
		handleColor : '#FFFFFF',
		handleWidth : '5px',
		handleHeight : '5px',
		cropBorder : '1px dashed #FFFFFF',
		min : { 'width' : 50, 'height' : 50 },
		showMask : true, // false to remove, helps on slow machines
		showHandles : false // hide handles on drag
	},

	initialize: function(el, options){
		this.setOptions(options);
		this.img = $(el);
//		if ( this.img.get('tag') != 'img') return false; // commented by Mahak because Its creating error 14_04_2010

		this.resizeFunc = this.refresh.bindWithEvent(this);
		this.removeFunc = this.removeListener.bind(this);

		this.buildOverlay();
		this.setup();
	},

	setup: function(){
		$(this.cropArea).setStyles({
			'width': this.options.min.width, 
			'height': this.options.min.height,
			'top' : (this.img.height - this.options.min.height)/2,
			'left': (this.img.width - this.options.min.width) / 2 
		});

		this.current.crop = this.crop = this.getCropArea();
		this.handleWidthOffset = this.options.handleWidth.toInt() / 2;
		this.handleHeightOffset = this.options.handleHeight.toInt() /2;

		this.fixBoxModel();
		this.drawMasks();
		this.positionHandles();
	},

	getCropArea : function(){
		var crop = this.cropArea.getCoordinates();
		crop.left -= this.offsets.x; crop.right -= this.offsets.x; // calculate relative (horizontal)
		crop.top -= this.offsets.y; crop.bottom  -= this.offsets.y; // calculate relative (vertical)
		return crop;
	},

	fixBoxModel : function(){
		var diff = this.boxDiff = (this.crop.width - this.options.min.width)/2;

		var b = this.bounds = { 'top' : diff, 'left' : diff, 
			'right' : this.img.width+(diff*2), 'bottom' : this.img.height+(diff*2),
			'width' : this.options.min.width+(diff*2), 'height' : this.options.min.height+(diff*2) };

		this.wrapper.setStyles({
			'width' : b.right, 'height' : b.bottom,
			'background' : 'url('+this.img.src+') no-repeat '+diff+'px '+diff+'px'
		});

		this.north.setStyle('width',b.right);
		this.south.setStyle('width',b.right);
	},

	activate : function(event,handle){
		event.stop();
		this.current = { 'x' : event.page.x, 'y' : event.page.y, 'handle' : handle, 'crop' : this.current.crop };
		if(this.current.handle == 'NESW' && !this.options.showHandles) this.hideHandles();
		this.fireEvent('onBegin',[this.img.src,this.getCropInfo(),this.bounds,handle]);
		document.addEvent('mousemove', this.resizeFunc);
		document.addEvent('mouseup', this.removeFunc);
	},

	removeListener : function(){
		if( this.current.handle == 'NESW' && !this.options.showHandles) this.showHandles();
		document.removeEvent('mousemove', this.resizeFunc);
		document.removeEvent('mouseup', this.removeFunc);
		this.crop = this.current.crop;
		this.fireEvent('onComplete',[this.img.src,this.getCropInfo(),this.bounds,this.current.handle]);
	},

	refresh : function(event){
		var xdiff = this.current.x - event.page.x;
		var ydiff = this.current.y - event.page.y;

		var b = this.bounds;  var c = this.crop;  var handle = this.current.handle; var styles = {}; //saving bytes
		var dragging = (handle.length > 2) ? true : false;
		
		if( handle.contains("S") ){//SOUTH
			if(c.bottom - ydiff > b.bottom ) ydiff = c.bottom - b.bottom; // box south
			if(!dragging){
				if( (c.height - ydiff) < b.height ) ydiff = c.height - b.height; // size south
				styles['height'] = c.height - ydiff; // South handles only
			}
		}
		if( handle.contains("N") ){//NORTH
			if(c.top - ydiff < b.top ) ydiff = c.top; //box north
			if(!dragging){
				if( (c.height + ydiff ) < b.height ) ydiff = b.height - c.height; // size north
				styles['height'] = c.height + ydiff; // North handles only
			}
			styles['top'] = c.top - ydiff; // both Drag and N handles
		}
		if( handle.contains("E") ){//EAST
			if(c.right - xdiff > b.right) xdiff = c.right - b.right; //box east
			if(!dragging){
				if( (c.width - xdiff) < b.width ) xdiff = c.width - b.width; // size east
				styles['width'] = c.width - xdiff;
			}
		}
		if( handle.contains("W") ){//WEST
			if(c.left - xdiff < b.left) xdiff = c.left; //box west
			if(!dragging){
				if( (c.width + xdiff) < b.width ) xdiff = b.width - c.width; //size west
				styles['width'] = c.width + xdiff;
			}
			styles['left'] = c.left - xdiff; // both Drag and W handles
		}
		var preCssStyles = $merge(styles);
		if( $defined(styles.width)) styles.width -= this.boxDiff*2;
		if( $defined(styles.height)) styles.height -= this.boxDiff*2;

		this.cropArea.setStyles(styles);
		this.getCurrentCoords(preCssStyles);
		this.drawMasks();
		this.positionHandles();
		this.fireEvent('onCrop',[this.img.src,this.getCropInfo(),b,handle]);
	},

	getCurrentCoords : function(changed){
		var current = $merge(this.crop);
		
		if($defined(changed.left)){
			current.left = changed.left;
			if($defined(changed.width)) current.width = changed.width;
			else current.right = current.left + current.width;
		}
		if($defined(changed.top)){
			current.top = changed.top;
			if($defined(changed.height)) current.height = changed.height;
			else current.bottom = current.top + current.height;
		}
		if($defined(changed.width) && !$defined(changed.left)){
			current.width = changed.width; current.right = current.left + current.width;
		}
		if($defined(changed.height) && !$defined(changed.top)){
			current.height = changed.height; current.bottom = current.top + current.height;
		}
		this.current.crop = current;
	},

	drawMasks : function(){
		if(!this.options.showMask) return;
		var b = this.bounds;  var c = this.current.crop; var handle = this.current.handle;

		this.north.setStyle('height', c.top + 'px' );
		this.south.setStyle('height', b.bottom  - c.bottom  + 'px');
		this.east.setStyles({ height: c.height + 'px', width: b.right  - c.right + 'px',  top: c.top  + 'px', left: c.right + 'px'});
		this.west.setStyles({ height: c.height + 'px', width: c.left + 'px', top: c.top + 'px'});
	},

	positionHandles: function(){
		if(!this.calculateHandles) return;
		var c = this.current.crop; var wOffset = this.handleWidthOffset; var hOffset = this.handleHeightOffset;

		this.handles.get('N').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('NE').setStyles({'left' : c.width - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('E').setStyles({ 'left' : c.width - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('SE').setStyles({'left' : c.width - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('S').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('SW').setStyles({'left' : - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('W').setStyles({'left' : - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('NW').setStyles({'left' : - wOffset + 'px', 'top' : - hOffset + 'px'});
	},

	hideHandles: function(){
		this.calculateHandles = false;
		this.handles.each(function(handle){
			handle.setStyle('display','none');
		});
	},

	showHandles: function(){
		this.calculateHandles = true;
		this.positionHandles();
		this.handles.each(function(handle){
			handle.setStyle('display','block');
		});
	},

	buildOverlay: function(){
		var o = this.options;

		this.wrapper = new Element("div", {
			'styles' : {'z-index' : 100, 'position' : 'relative', 'width' : this.img.width, 'height' : this.img.height, 'background' : 'url('+this.img.src+') no-repeat' , 'float' : this.img.getStyle('float') , 'margin-left' : 'auto' , 'margin-right' : 'auto'  }
		}).injectBefore(this.img);

		this.img.setStyle('display','none');

		this.offsets = { x : this.wrapper.getLeft(), y : this.wrapper.getTop() };

		// SET WRAPPER MOUSEOVER TO STOP PROPAGATION OF MOUSEOVER EVENT
		this.wrapper.addEvent('mouseover', function(event) { return false; });

		if(this.options.showMask){		// optional masks
			var maskStyles = { 'position' : 'absolute', 'overflow' : 'hidden', 'background-color' : o.maskColor, 'opacity' : o.maskOpacity};
			this.north = new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
			this.south = new Element("div", {'styles' : $merge(maskStyles,{'bottom':'0px', 'left':'0px'})}).injectInside(this.wrapper);
			this.east =  new Element("div", {'styles' : maskStyles}).injectInside(this.wrapper);
			this.west =  new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
		}

		this.cropArea = new Element("div", { 'styles' : { 'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'border' : o.cropBorder, 'cursor' : 'move' },
		'events' : {
			'dblclick' : function(){ this.fireEvent('onDblClk',[this.img.src,this.getCropInfo(),this.bounds])}.bind(this),
			'mousedown' : this.activate.bindWithEvent(this,'NESW')}
		}).injectInside(this.wrapper);

		this.handles = new Hash();
		['N','NE','E','SE','S','SW','W','NW'].each(function(handle){
			this.handles.set(handle, new Element("div", {
			'styles' : { 'position' : 'absolute', 'background-color' : o.handleColor, 
						 'width' : o.handleWidth, 'height' : o.handleHeight, 'overflow' : 'hidden', 'cursor' : (handle.toLowerCase()+'-resize')},
			'events' : {'mousedown' : this.activate.bindWithEvent(this,handle)}
			}).injectInside(this.cropArea));
		},this);
	},

	getCropInfo : function(){
		var c = $merge(this.current.crop);
		c.width -= this.boxDiff*2; c.height -= this.boxDiff*2;
		return c;
	},

	removeOverlay: function(){
		this.wrapper.destroy();
		this.img.setStyle('display','');
	}

});
MooCrop.implement(new Events, new Options);
SocialEngineAPI.User = new Class({
  
  // Properties
  Base: {},
  
  user_exists : false,
  
  user_displayname : false,
  
  user_displayname_short : false,
  
  user_info : {},
  
  profile_info : {},
  
  level_info : {},
  
  usersetting_info : {},
  
  options : {
    'displayname_order' : 'standard'
  },
  
  
  
  // Methods
  initialize: function()
  {
    
  },
  
  
  userPhotoFullPath: function()
  {
    // No URL class
    if( !this.Base.URL )
      return false;
    
    // No user photo
    if( !this.user_info.user_photo )
      return this.Base.URL.url_base + 'images/nophoto.gif';
      
    return this.Base.URL.url_base + this.Base.URL.url_userdir(this.user_info.user_id) + this.user_info.user_photo;
  },
  
  
  
  
  
  // Import methods
  ImportUserInfo: function(user_info)
  {
    // Handle anonymous users
    if( !user_info || $type(user_info)!="object" || !user_info.user_exists )
    {
      this.user_exists = false;
      return;
    }
    
    this.user_exists = true;
    
    // Prepare data
    user_info.user_id = parseInt(user_info.user_id);
    delete user_info.user_exists;
    
    // Save user info
    this.user_info = user_info;
    
    // Generate display name
    this.user_info.user_fname = this.user_info.user_fname.trim();
    this.user_info.user_lname = this.user_info.user_lname.trim();
    
    if( this.user_info.user_fname && this.user_info.user_lname )
    {
      // Asian
      if( this.options.displayname_order=="asian" )
      {
        this.user_displayname_short = this.user_info.user_lname;
        this.user_displayname = this.user_info.user_lname + ' ' + this.user_info.user_fname;
      }
      
      // Standard
      else
      {
        this.user_displayname_short = this.user_info.user_fname;
        this.user_displayname = this.user_info.user_fname + ' ' + this.user_info.user_lname;
      }
    }
    
    else if( this.user_info.user_fname )
    {
      this.user_displayname = this.user_displayname_short = this.user_info.user_fname;
    }
    
    else if( this.user_info.user_lname )
    {
      this.user_displayname = this.user_displayname_short = this.user_info.user_lname;
    }
    
    else if( this.user_info.user_username )
    {
      this.user_displayname = this.user_displayname_short = this.user_info.user_username;
    }
  }
  
});