/**
*
* Custom Rating voor jquery.
*
*
* Gebruik:
*  - jQuery('rating_tool').rating();
*
* rating_tool wordt toegevoegd door de php rating box,
* dus deze moet actief zijn op de huidige pagina anders gebeurd er niks. 
*
* Op dit moment ondersteund het omhoog en naar beneden stemmen en star rating.
* TODO: uit elkaar halen
*
* HTML welke aanwezig moet zijn in het document voor up/down rating:
*
*  <div class="vote">
*    <div class="votes">5</div>
*    <div class="points">punten</div>
*    <div onclick="voteUp(this, 737);" class="vote_up">+ stem</div>
*  </div>
*
* Vote wordt nu niet uitgevoerd, kan beter in een eigen vote script.
* De vote HTML wordt ook niet via de box gedaan, maar direct in de template zelf.
*
*
* HTML welke aanwezig moet zijn in het document voor star rating,
* wordt toegevoegd door de rating box toe te voegen in middle-top.
*
*  <div class="rating_tool">
*    <div class="rating" id="rating_872">8.0</div>
*    <div class="vote" id="votes_872">5 stemmen</div>
*  </div>
*/

jQuery.fn.rating = function(settings) {

   // Settings to configure the jQuery lightBox plugin how you like
   // geef default waarden
   settings = jQuery.extend({
	rating: 0,
	debug: false,
	maxStars: 5 /* maximaal aantal sterren */
   }, settings);

   var debug = function(s)
   {	
	if(settings.debug) { console.log(s); }
   }
	
   var displayHover = function()
   {
	debug('hover');
	var ids      = jQuery(this).attr('id').split('_'); // star_872_1
	for (var i = 0; i <= parseInt(ids[2]); i++) {
	  jQuery('#star_'+ids[1]+'_'+i).addClass('over');
	}
   }
   var displayNormal = function()
   {
	debug('normal');
	var ids      = jQuery(this).attr('id').split('_'); // star_872_1
	for (var i = 0; i <= parseInt(ids[2]); i++) {
	  jQuery('#star_'+ids[1]+'_'+i).removeClass('over');
	}

	if(justVoted) {
	  //new Effect.Highlight(this.currentElement.firstChild);
	  justVoted = false;
	}		

   }

   var rate = function()
   {
	debug('rate');
	var ids      = jQuery(this).attr('id').split('_'); // star_872_1
		
	jQuery.ajax({
   	  type: "POST",
   	  url: "rating_rate",
	  data: 'articleID=' + ids[1] + '&rating=' + (parseInt(ids[2])+1),
   	  success: completeRating
 	});

   }

   var completeRating = function(msg){ // b.v. 8.0:5
	   if(msg == 'LOGIN') { // niet ingelogd 
		   document.location.href = "/auth_login";
	   } else {
		   debug( "Data Saved: " + msg );
		   var pars    = msg.split(':');
		   var rating  = pars[0];
		   var votes   = pars[1];

		   build(ratingEl, votingEl, rating, votes, true); // ratingEl is gedefinieerd in the main each loop.
		   report(_('U heeft gestemd'), _('Bedankt voor het stemmen'));
		   justVoted = true;
	   }
  }
  
  var dlg; // zelfde als in comments wordt gebruikt, ooit algemeen maken...
  var report = function(title, text) {

     var firstRun = false;
     if(!dlg) {
	     jQuery.ui.dialog.defaults.buttons = {
			Ok: function() {
			  jQuery(this).dialog('close');
			}
		  }
          // create dialog div
          //dlg = jQuery(document.createElement('div'));
          dlg = jQuery('<div>');
          dlg.attr('id', 'dialog');
          jQuery('body').append(dlg);
          firstRun = true;
     }

     dlg.attr('title', title);
     dlg.html(text);

     if(firstRun) {
       dlg.dialog({
		modal: true,
		minHeight: 0 
		});
     } else {
       dlg.dialog("open");
     }	

  }

  var build = function(ratingEl, votingEl, rating, votes, enabled) {
		// verwijder als ie al bestaat
		ratingEl.empty(); // verwijder de rating uit de html
		var container = jQuery('<ul>');

		if (rating > settings.maxStars) {   // kan gebeuren bij switchen van rating methodes.
			rating = settings.maxStars; // zet naar max
		}

		debug('rating:' + rating);
		if(rating < 0) { return; }

		for (var j = 0; j < settings.maxStars; j++)
		{
			var star = jQuery('<li>');
			if (rating >= 1) {
				debug('add full');
				star.addClass('full');
				rating--;
			} else if(rating == 0.5) {
				debug('add half');
				star.addClass('half');
				rating = 0;
			} else {
				debug('add empty');
				star.addClass('empty');
			}

			var widgetId = ratingEl.attr('id').substr(7);

			// add voting behaviour
			if(enabled) {
			  star.attr('id', 'star_'+widgetId+'_'+j)
			  .mouseover(displayHover)
			  .mouseout(displayNormal)
			  .click(rate);
			} else {
			  star.attr('title', _('U moet inloggen om te kunnen stemmen'));
			}
			
			container.append(star);
			ratingEl.append(container);

		} 

		if(votes) { // update vote count
			votingEl.html(votes + ' ' + ((votes == 1) ?  _('stem') : _('stemmen')));
		}
  }

  var startBuild = function(enable) {
	var enable = (enable == '1') ? true : false;
	build(ratingEl, votingEl, rating, votes, enable);
  }
	
  // indien meerdere kan dit niet zo globaal gedefineerd worden...
  var votes = null;
  var justVoted = false;
  var ratingTool = jQuery(this);
  var ratingEl = ratingTool.find('div.rating');
  var votingEl = ratingTool.find('div.vote');
  var rating = parseFloat(ratingEl.html()); // lezen default rating

  this.each(function() {
	jQuery.ajax({
   	  type: "POST",
   	  url: "rating_rate",
	  data: 'action=allowed',
   	  success: startBuild 
 	});
  });

}

// fix ie6 background flicker problem.
if ( jQuery.browser.msie == true ) {
	try {
		//works since IE6SP1
		document.execCommand('BackgroundImageCache', false, true);
	} catch(acold) {/*many will complain, just ignore*/}
}
