/**
* Class to handle comments display and functionality
*/
var AMEXComments = new Class(
{
options: {
urlAdd : null ,
formAdd : null ,
updateAdd : null ,
urlFlag : null ,
updateFlag : null ,
xmlPath : null ,
submitButton : null ,
onComplete : null ,
btnSubmit : null
},
tmp: {
},
xhrFlag : null ,
xhrAdd : null ,
// Object containing parsed XML comment data
commentData: {},
commentCount: 0,
initialize: function ( pOptions )
{
// Store passed options to this instance's options object
this.options.formAdd = pOptions.formAdd;
this.options.urlFlag = pOptions.urlFlag;
this.options.urlAdd = pOptions.urlAdd;
this.options.updateAdd = pOptions.updateAdd;
this.options.updateFlag = pOptions.updateFlag;
this.options.xmlPath = pOptions.xmlPath;
this.options.xmlPath = pOptions.xmlPath;
this.options.onFlagComplete = pOptions.onFlagComplete;
this.options.onAddComplete = pOptions.onAddComplete;
this.options.submitButton = pOptions.submitButton;
},
formatQuantity: function ( pQuantity , pSingular , pPlural )
{
if ( pQuantity == 1 )
{
return pQuantity + " " + pSingular;
}
return pQuantity + " " + pPlural;
},
clearComments: function ( )
{
$( 'comments' ).setHTML( "" );
$( 'comments_new' ).setHTML( "" );
if ( $( 'comment_preview' ) )
{
$( 'comment_preview' ).remove();
}
//this.updateCommentCount( -1 );
$( this.options.formAdd ).reset();
},
/**
* Writes the comments HTML.
*/
writeComments: function ( pCommentData , pParams )
{
var target = pParams.target;
var questionID = pParams.questionID;
target.commentData = pCommentData;
target.clearComments();
target.commentCount = 0;
var flaggedComments = Cookie.get( 'amex.comments_flag_' + questionID );
if ( !flaggedComments ) flaggedComments = "";
var curComment;
if ( target.commentData.comments[0].comment )
{
for ( iComment = 0 ; iComment < target.commentData.comments[0].comment.length ; iComment++ )
{
curComment = target.commentData.comments[0].comment[ iComment ];
if ( flaggedComments.indexOf( "c" + curComment[ 'id' ] + "," ) < 0 )
{
target.writeComment(
'comments' ,
curComment.id ,
curComment.display_name ,
curComment.display_date ,
curComment._text ,
questionID
);
++target.commentCount;
}
}
}
target.updateCommentCount( target.commentCount );
// Update styles, showing everything
$( 'panel_comments' ).set( { 'styles':{ 'display':'block' } } );
$( 'pane_main' ).set( { 'styles':{ 'width':'480px' , 'margin-right':'20px' } } );
$( 'pane_side' ).set( { 'styles':{ 'display':'block' } } );
$( 'comments' ).set( { 'styles':{ 'display':'block' } } );
},
updateCommentCount: function ( pCommentCount )
{
if ( pCommentCount >= 0 )
{
this.commentCount = pCommentCount;
$( 'comments_count' ).setHTML( "(" + this.formatQuantity( this.commentCount , "comment" , "comments" ) + ")" );
return;
}
if ( $( 'comments_count' ) ) $( 'comments_count' ).setHTML( "" );
},
/**
* Loads and parses comment data.
*/
loadComments: function ( pQuestionID )
{
// Clear old comments
this.clearComments();
// Show loading message
$( 'comments_loading' ).set( { 'styles':{ 'display':'block' } } );
//var urlXML = this.options.xmlPath + pQuestionID + ".xml?rnd=" + ( Math.floor( Math.random() * 99999 ) );
var urlXML = this.options.xmlPath + "view.php?vid="+pQuestionID+"&rnd=" + ( Math.floor( Math.random() * 99999 ) );
var ajaxXML = new Ajax( urlXML , { method:'get' } ).request();
ajaxXML.eventObj = {
target:this ,
questionID:pQuestionID
};
ajaxXML.addEvent(
'onComplete' ,
function ( pStrXML ) {
this.eventObj.xml = pStrXML;
this.eventObj.target.onCommentsLoaded( this.eventObj )
}
);
},
onCommentsLoaded: function ( pEvtObj )
{
if (document.implementation.createDocument) { // mozilla
var parser = new DOMParser();
doc = parser.parseFromString( pEvtObj.xml , 'text/xml' );
} else if ( window.ActiveXObject ) { // ie
doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async = 'false';
doc.loadXML( pEvtObj.xml );
}
// Hide loading message
$( 'comments_loading' ).set( { 'styles':{ 'display':'none' } } );
var object = parseXML( doc );
pEvtObj.target.writeComments( object , pEvtObj );
},
writeComment: function ( pTarget , pID , pDisplayName , pDisplayDate , pText , pQuestionID )
{
var commentHTML = '';
// Wrap with preview tag/message if writing preview
if ( pID == 'NA' )
{
commentHTML += '
';
}
commentHTML += '';
$( pTarget ).setHTML( $( pTarget ).innerHTML + commentHTML );
},
/*
truncateComment: function ( pCommentID )
{
var len = 100;
var p = document.getElementById('truncateMe');
if (p) {
var trunc = p.innerHTML;
if (trunc.length > len) {
// Truncate the content of the P, then go back to the end of the
// previous word to ensure that we don't truncate in the middle of
// a word
trunc = trunc.substring(0, len);
trunc = trunc.replace(/\w+$/, '');
// Add an ellipses to the end and make it a link that expands
// the paragraph back to its original size /
trunc += '' +
'...<\/a>';
p.innerHTML = trunc;
}
}
}
*/
/**
* Flags the specified comment as inappropriate and temporarily hides it.
*/
flagComment: function ( pQuestionID , pCommentID )
{
if ( pCommentID == undefined || pCommentID == 'NA' ) return;
this.updateCommentCount( this.commentCount - 1 );
// Hide comment
$( 'comment' + pCommentID ).set( { 'styles':{ 'display':'none' } } );
// Set cookie
var flaggedIDs = Cookie.get( "amex.comments_flag_" + pQuestionID );
if ( !flaggedIDs ) flaggedIDs = '';
flaggedIDs += "c" + pCommentID + ",";
Cookie.set( "amex.comments_flag_" + pQuestionID , flaggedIDs , { duration:0.05 } ); // Expires in ~1 hour
// Create new mootools Ajax instance
this.xhrFlag = new XHR({ method:'get' }).send( this.options.urlFlag , "id=" + pCommentID );
this.xhrFlag.addEvent( 'onSuccess' , this.onFlagComplete );
//onComplete:this.options.onFlagComplete });
return false;
},
onFlagComplete: function ( )
{
},
/**
* Adds a submitted comment view the defined form.
*/
addComment: function ( pQuestionID )
{
// Create new mootools Ajax instance
this.xhrAdd = new XHR({ method:'post' }).send( this.options.urlAdd , $( this.options.formAdd ).toQueryString() );
this.xhrAdd[ 'referrer' ] = this;
this.xhrAdd.addEvent( 'onSuccess' , this.onAddComplete );
this.tmp.questionID = pQuestionID;
return false;
},
onAddComplete: function ( )
{
this[ 'referrer' ].updateCommentCount( this[ 'referrer' ].commentCount + 1 );
// Check if user prefers full name or initials
var displayName = Cookie.get( 'amex.user_name' );
if ( $( 'radInitials' ).checked ) displayName = Cookie.get( 'amex.user_initials' );
// Create JSON object for cookie and set it
var jsonData =
{
commentID: this.response.text ,
commentData:
{
displayName: displayName ,
displayDate: this[ 'referrer' ].getDateAsString() ,
text: $( 'comments_form_commenttxt' ).getValue() ,
questionID: this[ 'referrer' ].tmp.questionID
}
}
// Clear input
this[ 'referrer' ].addClear();
// Write added comment
this[ 'referrer' ].writeComment(
"comments" ,
jsonData.commentID ,
jsonData.commentData.displayName ,
jsonData.commentData.displayDate ,
jsonData.commentData.text ,
jsonData.commentData.questionID
);
},
/**
* Called when the add comment textarea changes.
*/
onAddTextChange: function ( )
{
var textValue = $( 'comments_form_commenttxt' ).getValue();
// Check if user prefers full name or initials
var displayName = Cookie.get( 'amex.user_name' );
if ( $( 'radInitials' ).checked ) displayName = Cookie.get( 'amex.user_initials' );
// If there is text and no new comment element, create it
if ( textValue.length > 0 && $( 'comment_preview' ) == undefined )
{
this.writeComment( 'comments_new' , 'NA' , displayName , this.getDateAsString() , textValue , 'NA' );
}
// If there is text and a new comment element, update comment
else if ( textValue.length > 0 )
{
$( 'copy_preview_cNA' ).setText( textValue );
}
// Otherwise, remove the new comment area
else
{
this.addClear();
}
},
focusAdd: function ( )
{
$( 'comments_form_commenttxt' ).focus();
},
getDateAsString: function ( )
{
var dteCurrent = new Date();
var arrMonths = [ "January" , "February" , "March" , "April" , "May" , "June" , "July", "August" , "September" , "November" , "December" ];
return arrMonths[ dteCurrent.getMonth() ] + " " + dteCurrent.getDate() + ", " + dteCurrent.getFullYear();
},
getTimestamp: function ( )
{
var dteCurrent = new Date();
return "" + ( dteCurrent.getMonth() + 1 ) + dteCurrent.getDate() + dteCurrent.getHours() + dteCurrent.getMinutes() + dteCurrent.getSeconds() + dteCurrent.getMilliseconds();
},
addClear: function ( )
{
$( this.options.formAdd ).reset();
// Clear new comments area
$( 'comments_new' ).setHTML( "" );
}
});
' + pText + '
'; commentHTML += '' + pText + '
'; commentHTML += '