 
var AjaxJspTag = {};

/**
 * AjaxTags
 */

AjaxJspTag.Base = function() {};
AjaxJspTag.Base.prototype = {

  resolveParameters: function() {
    // Strip URL of querystring and append it to parameters
    var qs = delimitQueryString(extractQueryString(this.url));
    if (this.options.parameters) {
      this.options.parameters += ',' + qs;
    } else {
      this.options.parameters = qs;
    }
    this.url = trimQueryString(this.url);
    
    if ((this.options.parameters.length > 0 ) && (this.options.parameters.charAt(this.options.parameters.length - 1) === ',')) {
      this.options.parameters = this.options.parameters.substr(0,this.options.parameters.length-1);
    }
  }

};



/**
 * TOGGLE TAG
 */
AjaxJspTag.Toggle = Class.create();
AjaxJspTag.Toggle.prototype = Object.extend(new AjaxJspTag.Base(), {

	// initialize
	initialize: function(url, options) {
    	this.url = url;
    	this.setOptions(options);

    	// create message DIV
    	if (this.options.messageClass) {
      		this.messageContainer = new Insertion.Top($(this.options.source),
        		'<div id="'+ this.options.source +'_message" class="' + this.options.messageClass +'"></div>');
		}

    	this.setListeners();
    	addAjaxListener(this);
	},
  
  	// reload
  	reload: function () {
    	this.setListeners();
  	},
  
  	// setOptions
  	setOptions: function(options) {
    	this.options = Object.extend({
      		parameters: options.parameters || 'rating={ajaxParameter}',
      		parser: options.parser ? options.parser : new ResponseTextParser(),
      		handler: options.handler ? options.handler : this.handler,
     		updateFunction: options.updateFunction || false
    	}, options || {});
    	this.ratingParameter = AJAX_DEFAULT_PARAMETER;
  	},

	// setListeners
  	setListeners: function() {
    	// attach events to anchors
   	 	var elements = $(this.options.source).getElementsByTagName('a');
    	for (var j=0; j<elements.length; j++) {
      		elements[j].onmouseover = this.raterMouseOver.bindAsEventListener(this);
      		elements[j].onmouseout = this.raterMouseOut.bindAsEventListener(this);
      		elements[j].onclick = this.raterClick.bindAsEventListener(this);
    	}
  	},

	// getCurrentRating
  	getCurrentRating: function(list) {
    	var selectedIndex = -1;
    	for (var i=0; i<list.length; i++) {
      		if (Element.hasClassName(list[i], this.options.selectedClass)) {
        		selectedIndex = i;
      		}
    	}
    	return selectedIndex;
  	},

	// getCurrentIndex
  	getCurrentIndex: function(list, elem) {
    	var currentIndex = 0;
    	for (var i=0; i<list.length; i++) {
      		if (elem == list[i]) {
        		currentIndex = i;
      		}
    	}
    	return currentIndex;
  	},

	// raterMouseOver
  	raterMouseOver: function (e) {
    	// get containing div
    	var container = Event.findElement(e, 'div');

    	// get list of all anchors
    	var elements = container.getElementsByTagName('a');

    	// find the current rating
    	var selectedIndex = this.getCurrentRating(elements);
		// console.log("selectedIndex: " + selectedIndex);
    
    	// find the index of the 'hovered' element
    	var currentIndex = this.getCurrentIndex(elements, Event.element(e));
	
		if(currentIndex == 0 && this.options.showDelete == "true") {
			// do no changes at the delet button
		}
		else {
	    	// set message
	    	if (this.options.messageClass) {
	     	 	$(container.id+'_message').innerHTML = Event.element(e).title;
	    	}
	
	    	// iterate over each anchor and apply styles
			for (var i=0; i<elements.length; i++) {
	    		if (selectedIndex > -1) {
	        		if (i <= selectedIndex && i <= currentIndex)
	          			Element.addClassName(elements[i], this.options.selectedOverClass);
	        		else if (i <= selectedIndex && i > currentIndex)
	          			Element.addClassName(elements[i], this.options.selectedLessClass);
	        		else if (i > selectedIndex && i <= currentIndex)
	          			Element.addClassName(elements[i], this.options.overClass);
	      		} 
	      		else {
	        		if (i <= currentIndex) Element.addClassName(elements[i], this.options.overClass);
	      		}
			}
	 	}
  	},

	// raterMouseOut
  	raterMouseOut: function (e) {
    	// get containing div
    	var container = Event.findElement(e, 'div');

    	// get list of all anchors
    	var elements = container.getElementsByTagName('a');

    	// clear message
    	if (this.options.messageClass) {
      		$(container.id+'_message').innerHTML = '';
    	}

    	// iterate over each anchor and apply styles
    	for (var i=0; i<elements.length; i++) {
      		Element.removeClassName(elements[i], this.options.selectedOverClass);
      		Element.removeClassName(elements[i], this.options.selectedLessClass);
      		Element.removeClassName(elements[i], this.options.overClass);
    	}
  	},

	// raterClick
  	raterClick: function (e) {
    	// get containing div
    	var container = Event.findElement(e, 'div');

    	// get list of all anchors
    	var elements = container.getElementsByTagName('a');

    	// find the index of the 'hovered' element
    	var currentIndex = this.getCurrentIndex(elements, Event.element(e));

    	// update styles
    	for (var i=0; i<elements.length; i++) {
      		Element.removeClassName(elements[i], this.options.selectedOverClass);
      		Element.removeClassName(elements[i], this.options.selectedLessClass);
      		Element.removeClassName(elements[i], this.options.overClass);
      		if (i <= currentIndex) {
        		if (Element.hasClassName(container, 'onoff')
              			&& Element.hasClassName(elements[i], this.options.selectedClass)) {
          			Element.removeClassName(elements[i], this.options.selectedClass);
        		} else {
          		Element.addClassName(elements[i], this.options.selectedClass);
        	}
      		} else if (i > currentIndex) {
        		Element.removeClassName(elements[i], this.options.selectedClass);
      		}
    	}

    	// send AJAX
    	var ratingToSend = elements[currentIndex].title;
    	if (Element.hasClassName(container, 'onoff')) {
      		// send opposite of what was selected
      		var ratings = this.options.ratings.split(',');
      		if (ratings[0] == ratingToSend) ratingToSend = ratings[1];
      		else ratingToSend = ratings[0];
      		elements[currentIndex].title = ratingToSend;
    	}
    	this.execute(ratingToSend);

    	// set field (if defined)
    	// if (this.options.state) {
      		// $(this.options.state).value = ratingToSend;
    	// }
  	},

	// execute
  	execute: function(ratingValue) {
    	if (isFunction(this.options.preFunction)){ this.options.preFunction();}
		if (this.options.cancelExecution) {
	    	this.cancelExecution = false;
	    	return ;
      	}
    	// parse parameters and do replacements
    	var ajaxParameters = this.options.parameters || '';
    	var re = new RegExp("(\\{"+this.ratingParameter+"\\})", 'g');
    	ajaxParameters = ajaxParameters.replace(re, ratingValue);
    	var params = buildParameterString(ajaxParameters);

    	var obj = this; // required because 'this' conflict with Ajax.Request
    	var toggleStateFunc = this.getToggleStateValue;
    	
    	var aj = new Ajax.Request(this.url, {
      		asynchronous: true,
      		method: 'post',
      		evalScripts: true,
      		parameters: params,
      		onSuccess: function(request) {
        		obj.options.parser.load(request);
        		var results = obj.options.parser.itemList;
        		obj.options.handler(request, {items: results});
	      	},
	      	onFailure: function(request) {
	        	if (isFunction(obj.options.errorFunction)){ obj.options.errorFunction();}
	      	},
	      	onComplete: function(request) {
	        	if (isFunction(obj.options.postFunction)) {obj.options.postFunction();}
	      	}
    	});
  	},

	// handler
  	handler: function(request, roptions) {
  		//daten in items
  		var erg = roptions.items[0][0] ; // on/off / 1,2,3
  		try  {
  			this.updateFunction(erg);
    		// TODO: anything?
    	} catch (e) {} // muss nicht forhanden sein
  	},

	// getToggleStateValue
  	getToggleStateValue: function(name, results) {
    	for (var i=0; i<results.length; i++) {
      		if (results[i][0] == name) {return results[i][1];}
    	}
    	return "";
  	}

});

/* Hilfreich */
var Helpful = Class.create();

Object.extend(Helpful, {

	setText: function(text) {
		this.helpfulStatsTempl = new Template(text);
	},

	reloadHelpfulStats: function(value, identifier) {

		var form = $('helpfulQuestionForm'+identifier);
		var fullId = $F(form['fullId']);
		
		var answer = value==1?'true':'false';
		var action = $('helpfulQuestionForm'+identifier).action;

	  	new Ajax.Request(action,
	    {
		  	method:'post',
		  	parameters:'fullId='+fullId+'&answer='+answer,
	    	onSuccess: function(transport){
	    		
			     var json = transport.responseText.evalJSON();
	    		
	    		$('helpfulStats'+identifier).update(Helpful.helpfulStatsTempl.evaluate(json));
				// $('helpfulStats'+identifier).innerHTML = transport.responseText || "";
	    	},
		    onFailure: function() { 
		    }
	    });
	    
	    return false;
	}	
});

/* Kommentare */
var Comments = Class.create({
	
	initialize: function (fullId, type, context) {
		
		this.fullId = fullId;
		this.type = type;
		this.context = context;
		
		Event.observe('commentLink', 'click', this.onCommentLink);		
		Event.observe('commentReadLink', 'click', this.onCommentReadLink);		
		Event.observe('comment', 'submit', this.onCommentSubmit.bindAsEventListener(this));		
	},
	
	onCommentLink: function(event) {
		
		Effect.toggle('commentDiv', 
					  'slide', 
					  {duration:0.5}); 
					  
		Comments.resetErrorVisibility(); 
		Comments.resetMessageVisibility(); 
		Comments.resetForm();		

		Event.stop(event);
		
		return false;
	},
	
	onCommentReadLink: function(event) {
		
		Effect.toggle('lastFiveComments', 'slide', {duration:1.0});		
		
		Event.stop(event);
		
		return false;
	},
	
	onCommentSubmit: function(event) {
		
		this.writeComment();

		Event.stop(event);			

		return false;
	},
	
	setWriteFirstCommentLinkText: function(msg) {
		this.writeFirstCommentLinkText = msg;
	},
	setWriteCommentLinkText: function(msg) {
		this.writeCommentLinkText = msg;
	},
	setReadOneCommentLinkText: function(msg) {
		this.readOneCommentLinkText = msg;
	},
	setReadMoreCommentsLinkText: function(msg) {
		this.readMoreCommentsLinkTemplate = new Template(msg);
	},
	
	// Loads the last five comments for this content
	getLastFiveComments: function() {
		var url = this.context+'participant/comments/Comment.do?method=getLastFiveComments&id='+this.fullId+'&_partial_&type='+this.type;
		new Ajax.Request(url, {
			method:'post',
			onSuccess:function(transport) {
				$('lastFiveComments').update(transport.responseText);
			},
			onFailure:function() {
				$('lastFiveComments').hide();
				$('commentReadLinkDiv').hide();
			}
		});	
	},
	
	getNumberOfComments: function() {
		
		var ref = this;
		var url = this.context+'participant/comments/Comment.do?method=getNoOfComments&id='+this.fullId+'&_partial_&type='+this.type;
		new Ajax.Request(url, {
		  method:'post',
		  onSuccess: function(transport){
		     var json = transport.responseText.evalJSON();

		     if (json.no == 0) {
		     	$('commentLink').update(ref.writeFirstCommentLinkText);
				$('commentLinkDiv').show();
				$('commentReadLinkDiv').hide();			 
		     }
		     else if (json.no == 1) {
			 	$('commentLink').update(ref.writeCommentLinkText);
		     	$('commentReadLink').update(ref.readOneCommentLinkText);
				$('commentLinkDiv').show();
				$('commentReadLinkDiv').show();			 		     	
		     }		     
			 else {
			 	$('commentLink').update(ref.writeCommentLinkText);
		     	$('commentReadLink').update(ref.readMoreCommentsLinkTemplate.evaluate(json));
				$('commentLinkDiv').show();
			 	$('commentReadLinkDiv').show();			 		     	
			 }
		   }
		});	
	},
	
	// Validates the input fields and writes the comment
	writeComment: function() {
	
		var error = false;
		
		var title = document.getElementById("comment").title.value;
		var text = document.getElementById("comment").text.value;
		
		Comments.resetErrorVisibility();
		
		if(title == "") {
			error = true;
			$('error1').setStyle({display: 'inline'});
		}
		if(text == "") {
			error = true;
			$('error2').setStyle({display: 'inline'});
		}
		if(text.length > 500) {
			error = true;
			$('error3').setStyle({display: 'inline'});
		}		
		if(error == true) {
			return false;
		}
		
		var formValues = Form.serialize('comment');
		
		var ref = this;
		
		new Ajax.Request($('comment').action, {
			method:'post',
			parameters: formValues,
			onSuccess:function(transport) {

				Comments.resetErrorVisibility();
				
				Effect.SlideUp('commentDiv');
				Effect.Appear('success');

				ref.getLastFiveComments();
				ref.getNumberOfComments();
			}
		});	
		
		return false;
	}
});

Object.extend(Comments, {
	
	// Resets the visibility of the error divs
	resetErrorVisibility: function() {
		
		$('error1').hide();
		$('error2').hide();
		$('error3').hide();
	},
	
	// Resets the visibility of the success message div
	resetMessageVisibility: function() {
		$('success').hide();
	},	
	
	// Resets the form 
	resetForm: function() {
		$('comment').reset();
	}	
});