
/**
* Voornamelijk schoonmaken van divs etc. is niet nodig in jquery
* Functionaleit nu:
*
* comment activate:
* - activeer 'expander' met een toggle even. 
* - Haal standaard bericht uit html (defaultMessage) 
* - Loop door de li's, en activeer de, hover, mouseout en click functies. 
*
* functionaliteit:
*
*  - activeer reply_article button, als deze aanwezig is.
*  - vervolgens alle 'comment' div's oppakken en het gedrag toevoegen via de 'comment_activate' functie
*  - activeren reply_submit_button en reply_cancel button
*  - bepalen titel van het commentaar, aan de hand van parsen van de titel uit de h1 header, of anders de parent titel.
*  - functie voor het resetten van het formulier aanroepen. 
*
*/
 //
 // create closure
 //
 (function($) {
   //
   // plugin definition
   //
   var opts; 
   $.fn.comments = function(options) {
     // debug(this);

     // build main options before element iteration
     opts = $.extend({}, $.fn.comments.defaults, options);
     var defaultMessage, currentElement;

     // setup captcha (indien aanwezig)
     $('div.captcha').each(function() {
	$(this).find('img').addClass('pointer').click(function() {
          refreshCaptcha();
          $(this).find('input').focus();
	});
     });

     var finishPost = function(response,s,d) {
		debug(s);
		debug(d);
		$('#spinner').hide();
		if(response.status == 'OK') {
		    showComment(response);
		    resetForm();
		} else {
		    if(response.text) {
		      $.fn.comments.alert(_('Foutmelding'), response.text);
		    } else {
		      $.fn.comments.alert(_('Foutmelding'), _('Onbekende fout'));
		    }
		    refreshCaptcha();
		}
     };

     var showComment = function(response) {
	debug('show comment');
			     var commentID = $('#reply_commentID').val();

			     $('#comment_reply').fadeOut();

			     if(commentID !== '') {
				     var editDiv = $('#comment_'+commentID); // de li waar comment inzit 
				     editDiv.find('.comment_text').html(response.text);

				     // als smilies is geladen vervang dan de smilies in de post
				     if(typeof jQuery.fn.emoticons != 'undefined') {
				        editDiv.find('.comment_text').emoticons();
				     }

				     // php zend alleen text terug, dus pak titel vanuit formulier.
				     editDiv.find('.comment_title').html(this.replyForm.elements.reply_title.value);

				     //	$('#comment_reply').fadeOut();
				     editDiv.show();
				     //new Effect.Fade(this.replyFormDiv, {queue: 'first' });
				     //new Effect.Appear(this.editDiv, {queue: 'end'});
				     //new Effect.Highlight(this.editDiv, {queue: 'end'});
			     } else {

				     // als dit het eerste commentaar is, is de bar nog niet zichbaar 
				     $('#comment_bar').show();

				     // update comment count recursief omhoog
				     // Form.enable(this.replyForm);
				     //this.replyFormDiv.style.display = 'none';
				     if($('#comment_reply').parent().attr('id') == 'comments') {

					// voeg toe bovenaan, dit kan makkelijker met jquery..
					var uls = $('#comments ul');
					if(uls.length > 0) {
					   parentUL = uls[0];
					} else {
					   alert('Geen UL gevonden');
					}
				     } else {
					parentUL = $('#comment_reply').parent().nextSibling;
				     }

				     var li = document.createElement('li');
				     li.className = 'comment_item new'; // nieuw krijgt new ipv odd of even
				     li.innerHTML = response.text;

				     // als smilies is geladen vervang dan de smilies in de post
				     if(typeof jQuery.fn.emoticons != 'undefined') {
					jQuery(li).emoticons();
				     }

				     parentUL.appendChild(li);

			             // nog herschrijven.
				     $.fn.comments.updateCommentCount($(parentUL), 1);

				     //var commentDiv = document.getElementsByClassName('comment', li)[0];
				     var commentDiv = jQuery(li).find('div.comment');
				     $(document).scrollTo(li);

				     $.fn.comments.comment_activate(commentDiv); // zorg dat ook hier de buttons werken.
				     //new Effect.Highlight(li);

			     }
     };

	var resetForm = function() {
	// reset formulier en editor
		refreshCaptcha();
		$('#reply_message').val('');
		if($('#reply_name')) { $('#reply_name').val(''); }
		$('#reply_title').val(_('Re:')+' '+opts.title);
		$('#reply_commentID').val('');
	};

     var refreshCaptcha = function() {
	debug('refresh captcha');

	$('div.captcha').each(function() {
	  var input = $(this).find('input').val('');
	  var imgs  = $(this).find('img');
	  imgs.attr('src', imgs.attr('src').replace(/(ts=.*)/,'ts='+new Date().getTime()));


	});
     };

     var submitForm = function(ev) {
		// Event.stop(ev);

		 // bepaal of geedit of toegevoegd wordt. ah van commentID
		 if($('#reply_message').val() === ""){
		         $.fn.comments.alert('', "Commentaar is een vereist veld, u zult deze in moeten vullen voordat u verder kan gaan.");
		         return false;
		 }

		 var captcha = $('input[name=reply[captcha]]');
		 if(captcha.length && captcha.val() == ""){
		         $.fn.comments.alert('', "U zult een captcha code moeten invullen.");
		         return false;
		 }

		 var action = (jQuery('#reply_commentID').val() !== '') ? 'edit' : 'insert';	

		 var reply_name = jQuery('#reply_name');
		 if(reply_name.length == 1 && (reply_name.attr('type') != 'hidden' && reply_name.val().length < 2)) {
		         $.fn.comments.alert('', _("Om een reactie te plaatsen zult u een naam moeten invullen."));
		         return false;
		 }

          var inputs = [];
          jQuery('#commentForm :input').each(function() {
		var val;  

		// juist afhandelen utf-8
		if (encodeURIComponent) { val = encodeURIComponent(this.value); } else { val = escape(this.value); } 

              inputs.push(this.name + '=' + val);
          });

	  jQuery('#spinner').show();
	  // now if I join our inputs using '&' we'll have a query string
	  debug(inputs);
	  jQuery.fn.comments.xpost(inputs.join('&'), finishPost);

	  // var ajax = new Ajax.Request('/comment_xpost', { method: 'post', parameters: pars, onComplete: this.finishPost.bind(this), onException: this.exception.bind(this) });
	   return false;

	};

     var reply_article = function() {

		debug('show reply form');

		if(typeof $('document').scrollTo == 'undefined') {
			alert('jquery.scrollTo.js is niet geladen');
			return false;
		}
		resetForm();
		// toon comment reply formulier

		$('#comment_reply').show();

		// scroll naar het formulier toe
		$(document).scrollTo('#comment_reply');

		// zet de focus op het titel invoer veld
		$('#reply_message').focus();


		return false;

     };


    // Einde ToolButton Callbacks

     jQuery.fn.comments.comment_activate = function(cElement) {

		// comment_count anchor
		// if(cElement.lastChild.lastChild.firstChild.className != 'comment_tool_info') {		
		//	// alleen als er een expander is
		//      Event.observe(cElement.lastChild.lastChild.firstChild, 'click', this.toggle_event.bindAsEventListener(this) );
		// }

		debug('comment_activate');
		// comment_tools div	
		var ct_info =  $(cElement).find('.comment_tool_info');
		var defaultMessage = ct_info.html(); // Maak uw keuze
		var currentMessage;

		// de li's van de ul
		$(cElement).find('.comment_tools ul li a')
		.mouseover(function() {
			// hover function
			currentMessage = $(this).attr('title');
			ct_info.html(currentMessage);
			$(this).attr('title', ''); // zet title hovering uit 

		})
		.mouseout(function() {
			ct_info.html(defaultMessage);
			$(this).attr('title', currentMessage); // zet title terug
		})
		.click(function(event) {
			debug('click');
			event.preventDefault(); // block volgen van links 
			// gebruik comment_* classname als callback, classes met relevante acties starten met comment_
			var callback = $(this).parent().attr('class').match(/comment_\w+/);

			// registreer huidige comment Element..	
			commentElement = $(cElement);
			debug('calling:'+callback);

			jQuery.fn.comments.actions[callback](commentElement.attr('id').match(/\d+/));

			return false;
		});

	};


     // iterate and reformat each matched element

     return this.each(function() {

	debug('loop');

	var ra = $('#reply_article');
	if(ra.length) {
	  ra.click(reply_article);
	}

	// activeer de submit actie
	$('#reply_submit_button').click(submitForm);
	$('#reply_cancel_button').click(reply_article);

	// pak alle comments in deze comments div.
	var comments = $(this).find('.comment');
	comments.each(function() {
		// activeer het commentaar.
		$.fn.comments.comment_activate(this);
        });

     });

   };

   //
   // private function for debugging
   //
   function debug($obj) {
	   if(opts.debug) {
		   if (window.console && window.console.log) {
			   window.console.log($obj);
		   }
	   }
   }

   //
   // define and expose our format function
   //

   jQuery.fn.comments.format = function(txt) {
     return '<strong>' + txt + '</strong>';
   };

   //
   // plugin defaults
   //
   jQuery.fn.comments.defaults = {
     title: '',
     debug: false 
   };

/*
$.ajaxSetup({ 
        scriptCharset: "utf-8" , 
        contentType: "application/json; charset=utf-8"
});
*/

   // send ajax request
   $.fn.comments.xpost = function(parameters, onSuccess) {
	  jQuery('#spinner').show();
          jQuery.ajax({
	    dataType: 'json',
	    type: 'POST',
      	    encoding:"UTF-8",
            data: parameters,
            url: '/comment_xpost',
            timeout: 2000,
            error: function() {
              debug("Failed to submit");
              debug(this);
            },
	    complete: function(XMLHttpRequest, textStatus) {
	  	jQuery('#spinner').hide();
	    },
	    success: onSuccess

          }); 
	};

    jQuery.fn.comments.dlg = null;
    jQuery.fn.comments.alert = function(title, text) {
	var buttons = {
			"Ok": function() {
			  jQuery(this).dialog("close");
			}
		    };
	jQuery.fn.comments.report(title, text, buttons);
    };

    jQuery.fn.comments.confirm = function(title, text, okFunction) {
	var buttons = {
			"Ok": function() {
			  this.func = okFunction;	
			  this['func']();
			  $(this).dialog("close");
			  return true;
			},
			"Annuleren": function() {
			  $(this).dialog("close");
			  return false;
			}
		    };
	jQuery.fn.comments.report(title, text, buttons);
    };

   jQuery.fn.comments.report = function(title, text, buttons) {

	    if($.fn.comments.dlg) {
			    $($.fn.comments.dlg).remove();
	    }

	    jQuery.ui.dialog.defaults.bgiframe = true;
	    jQuery.ui.dialog.defaults.modal = false;
	    //jQuery.ui.dialog.defaults.modal = true;

	    // create dialog div
	    $.fn.comments.dlg = $(document.createElement('div'));
	    $.fn.comments.dlg.attr('id', 'dialog');
	    $('body').append($.fn.comments.dlg);

	   $.fn.comments.dlg.attr('title', title);
	   $.fn.comments.dlg.html('<div class="text"><p>'+text+'</p></div>');

	   $.fn.comments.dlg.dialog(
			   {
			     minHeight: 0,
			     modal: true,
			     buttons: buttons
			   });
	   $.fn.comments.dlg.dialog('open'); // rare constructie maar voorkomt dat dialoog niet meer opent bij de tweede keer aanroepen.
   };

   $.fn.comments.updateCommentCount = function(el, x) {

	//debug('updateCommentCount:'+nr);
	//updateCommentCount: function(el, x) {
	/* TODO: moet werken tijdens genest
	var cd; // comment div
	var cel; // counter element 
	var textNode, nr;
	while(el && el.id != 'comments') { // omhoog tot de comments div zelf.
		if(el.className == 'comment_item') {
			Element.cleanWhitespace(el);
			cd = el.childNodes[1]; // comment div

			if(cd.lastChild) {
				Element.cleanWhitespace(cd.lastChild);
			}

			cel = cd.getElementsByClassName('comment_count')[0];

			if(cel) {
				textNode = Element.cleanWhitespace(cel).lastChild;
				if(textNode.nodeValue) { // bug. 
					nr = parseInt(textNode.nodeValue.match(/\d+/)); // het aantal
					if(x < 0) {
						this.updateCounter(textNode, x);
						if(nr == 1) { cel.style.display = 'none'; }
					} else {
						cel.style.display = '';
						this.updateCounter(textNode, x);
					}
				}
			}

		}
		el = el.parentNode;
	}
	*/
	// update ook nog het totaal
	$.fn.comments.updateCounter('#comment_total', x);
			
	//},

   };
	$.fn.comments.updateCounter = function(cElement, x) {
		cElement = $(cElement);	
		var nr = parseInt(cElement.html().match(/\d+/)); // het aantal
		if(x < 0) {
			if(nr == 1) {
				cElement.html('0');
			} else if(nr == 2) {
				cElement.html(_('1 reactie op dit commentaar'));	
			} else if(nr !== 0) {
				cElement.html(cElement.html().replace(nr, nr+x));
			}
		} else {
			if(nr === 0) {
				cElement.html(_('1 reactie op dit commentaar'));	
			} else if(nr == 1) {
				cElement.html(_('2 reacties op dit commentaar'));	
			} else {
				cElement.html(cElement.html().replace(nr, nr+x));
			}
		}

	};

   // ToolButton Callbacks
   $.fn.comments.actions = {
	comment_abuse: function(commentID) {
	// $(document).scrollTo('#comment_reply');
	// Element.scrollTo(commentLi.parentNode, {offset: -50});

	// eventueel, reden van abuse opslaan.. 
	// now if I join our inputs using '&' we'll have a query string
		debug('send query');

		$.fn.comments.xpost('action=abuse&commentID='+commentID, function() { 
			$.fn.comments.alert('', _('Commentaar is gemarkeerd als ongewenst'));
			jQuery('#comment_'+commentID).parent().hide('slow', function() { $(this).remove(); }); // de li waar comment inzit
			});


       },
       comment_edit: function(commentID) {

jQuery('#comment_'+commentID).each(function() {

    var comment_text = jQuery(this).find('.comment_text');
    comment_text.hide();

    var edit = jQuery(document.createElement('div'));
    edit.attr('id', 'comment_editor');

    jQuery(comment_text).before(edit);

    var area = jQuery(document.createElement('textarea')).
               attr('name', 'ced').
               html(comment_text.html()).
               blur(function() {
                    comment_text.html(jQuery(this).val());
                    jQuery(edit).remove();
                    jQuery(comment_text).show();
               });
    // TODO: daadwerkelijk bewaren.

    jQuery(edit).append(area);
    area.focus();

 });

	},
       comment_remove: function(commentID) {
			
			var commentLi = jQuery('#comment_'+commentID).parent(); // de li waar comment inzit
			var commentUl = commentLi.parent(); 
		 
			var pars = 'action=remove&commentID='+commentID;
			var comment_count = commentLi.find('.comment_count div span:last');

			var nr = parseInt(comment_count.html().match(/\d+/)) + 1; // het aantal
			debug(nr);
			$.fn.comments.updateCommentCount(commentLi, -nr);

			// scroll naar het formulier toe
			$(document).scrollTo(commentLi.parent());
			$.fn.comments.xpost('action=remove&commentID='+commentID, function() { 

				$.fn.comments.confirm(_('Commentaar verwijderen'), _('Weet u zeker dat u dit commentaar wilt verwijderen ?'),
				function() { 
					jQuery('#comment_'+commentID).parent().hide('slow', function() {
						$(this).remove();
						// $.fn.comments.alert(_('Commentaar is verwijderd'), _('Het commentaar is verwijderd.'));
						}); // de li waar comment inzit
					}
				);
				// zorg dat replyForm op standaard plaats komt te staan, zodat deze niet
				// per ongeluk weggooid wordt bij het verwijderen van de div. 


				// TODO: controleer of dit de enige comment is, zo ja verberg de uitklap en reset de melding.
				// if($('comments').getElementsByClassName('comment_item').length == 0) {
				//  $('comment_total').innerHTML = '0';
				//  $('comment_bar').style.display = 'none';
				//}
			});

			return false;
				
        }

   };

 //
 // end of closure
 //
})(jQuery);

/*
Laad vanuit de comments module zelf zodat we informatie kunnen doorgeven over het artikel
jQuery(document).ready(function($){
	$('div.comments').comments();
});
*/
