var dsgn_rating = {};

dsgn_rating.vars = {
	templatePath: 'design/widgets/ratingwidget.tpl',
	editAction: 'DSGNRateItemForCurrentUser',
	ratingContainer: 'ratingcontainer'
}

dsgn_rating.rateItem = function(value, itemid) {
	dsgn_rating.doRateItem(itemid, value);
}

dsgn_rating.doRateItem = function(itemid, rating) {
	
	var postObject = JSON.encode({
		'action': dsgn_rating.vars.editAction, 
		'id': itemid, 
		'templatePath': dsgn_rating.vars.templatePath, 
		'rating': rating
	});
	
	var request = new Request.JSON({
		url: '/sbeos/ajax/JsonCall.php?item='+itemid + '&rnd=' + Math.random(),
		data: {json: postObject},
		onComplete: dsgn_rating.onRateItemComplete.bindWithEvent(window, [itemid])
	}).send();
	
}

dsgn_rating.onRateItemComplete = function(JsonResponse, itemid) {
	
	if(JsonResponse.success != true && JsonResponse.success != 'true') {
		alert(JsonResponse.message);
	} else if($chk(JsonResponse.template)) {
		dsgn_rating.setRateingView(JsonResponse.template);
		RatingController = new dsgn_rating.RatingObject('itemrating', JsonResponse.generalrating, JsonResponse.userrating);
	}
	
}

dsgn_rating.setRateingView = function(tplstring) {
	
	var oldContainer = $(dsgn_rating.vars.ratingContainer);
	oldContainer.id = oldContainer.id+'_old';

	var tmpElm = new Element('div');
	tmpElm.innerHTML = tplstring;

	tmpElm.getFirst().replaces(oldContainer);
}

dsgn_rating.RatingObject = new Class({
	
	target: null,
	
	currentRating: null,
	
	stars: null,
	
	tmr: null,
	
	initialize:function(target, currentRating) {
		this.target = target;
		this.currentRating = currentRating;
		this.initStars();
	},
	
	getStars: function() {
		
		if(this.stars == null) {
			this.stars = $(this.target).getChildren();
		}
		return this.stars;
	},
	
	initStars: function() {
		
		for(var i=0;i<this.getStars().length;i++) {
			this.getStars()[i].addEvent('mouseover', this.startStarMouseOverBehaviour.bindWithEvent(this, [i]));
			this.getStars()[i].addEvent('mouseout', this.startStarTimer.bind(this));			
			this.getStars()[i].setStyle('cursor', 'pointer');
		}
		
		//Set target action
		$(this.target).addEvent('mouseover', this.startRatingMouseOverBehaviour.bindWithEvent(this, [i]));
		$(this.target).addEvent('mouseout', this.startRatingMouseOutBehaviour.bindWithEvent(this, [i]));
		$(this.target).setStyle('cursor', 'pointer');
	},
	
	startRatingMouseOverBehaviour: function(e) {
		//window.console.log('Switch to user rating');	
	},

	startRatingMouseOutBehaviour: function(e) {
		//window.console.log('Restore');
	},

	
	startStarMouseOverBehaviour: function(e, index) {
		this.killStarTimer();
		this.displayUserRating(index);
	},
	
	displayUserRating: function(index) {
		for(var i=0;i<this.getStars().length;i++) {	
			if(i>index) {
				this.getStars()[i].src = '/images/rating/stars/dot.gif'
			} else {
				this.getStars()[i].src = '/images/rating/stars/star.gif'
			}
		}
	},
	
	displayGeneralRating: function(index) {
		for(var i=0;i<this.getStars().length;i++) {	
			if(i<index) {
				this.getStars()[i].src = '/images/rating/stars/star.gif'
			} else {
				this.getStars()[i].src = '/images/rating/stars/emptystar.gif'
			} 
		}
	},
	
	killStarTimer: function() {
		if(this.tmr !== null) {
			clearTimeout(this.tmr);
			this.tmr = null;
		}
	},
	
	startStarTimer: function() {
		this.killStarTimer();
		this.tmr = setTimeout(this.restore.bind(this), 500);
	},
	
	restore: function() {
		this.killStarTimer();
		this.displayGeneralRating(this.currentRating);
	}
  	
});


var RatingController = new dsgn_rating.RatingObject('itemrating', currentrating);