var test;
;(function($) { // hide the namespace 
 $.fn.extend({
	rating: function(url, options) {
		var defaults = {
			url: '',
			maxValue: 5,
			curValue: 0,
			avgValue: 0,
			hoverClass: 'star_hover',
			onClass: 'star_on',
			cancelClass: 'cancel',
			readOnlyClass: 'star_readonly',
			clickedClass: 'star_clicked',
			loadingClass: 'star_loading',
			showLoading: true,
			postData: {},
			titleTip: ['Cancel Rating', 'Very Poor', 'Poor', 'Good', 'Very Good', 'Excellent'],
			readOnly: false,
			editable: true,
			callBack: null
		};
		if(options.readOnly)options.editable = false;
		if((options.maxValue == 1) && options.showLoading !== true)options.showLoading = false;
		options = $.extend({}, defaults, options);
		options = $.extend({}, options, {curValue: Math.ceil(options.curValue),url: url, cancel: (options.editable && (options.maxValue > 1) && (options.cancel !== false))});
		return this.each(function() {
			var $this;
			var loading = false;
			if(url == null) return;
			$this = $(this);
			var div = '';
			if(options.cancel == true){
				var tip = options.titleTip ? options.titleTip[0] : 'Cancel Rating';
				 div += '<div class="'+options.cancelClass+'"><a href="#0" title="Cancel Rating">Cancel Rating</a></div>';
			}
			for(var i= 1; i <= options.maxValue ; i++){
				div += '<div class="star"><a href="#'+i+'">'+i+'</a></div>';
			}
			$this.append(div);
			var stars = $(this).children('.star');
			var cancel = $(this).children('.' + options.cancelClass);
			var event = {
				fill: function(el){
					this.drain();
					$(el).prevAll('.star').andSelf().addClass(options.hoverClass);
				},
				drain: function(){
					stars.removeClass(options.onClass).removeClass(options.hoverClass).removeClass(options.clickedClass);
				},
				reset: function(curValue, cls){
					this.drain();
					curValue = (curValue >= 0) ? curValue : options.curValue;
					stars.slice(0,curValue).addClass(cls ? cls : options.onClass);
				},
				disable: function(){
					stars.unbind();
					stars.addClass(options.readOnlyClass);
					stars.children('a').attr('title', options.titleTip ? options.titleTip[options.curValue] :options.curValue + '/'+options.maxValue);
					if(cancel){
						cancel.addClass(options.readOnlyClass);
						cancel.unbind();
					}
				},
				enable: function(){
					stars.removeClass(options.readOnlyClass);
					stars.each(function(i){
						$(this).children('a').attr('title', options.titleTip ? options.titleTip[i+1] : 'Give it ' + (i + 1) + '/'+ options.maxValue)
					});
					stars.mouseover(function(){
						event.fill(this);
					}).mouseout(function(){
						event.reset();
					}).focus(function(){
						event.fill(this)
					}).blur(function(){
						event.reset();
					}).click(function(){
						if(options.maxValue == 1){
							$(this).toggleClass(options.onClass);
						}
						event.click(this);
						return false;
					});
					if(cancel){
						cancel.removeClass(options.readOnlyClass);
						cancel.mouseover(function(){
							event.drain();
							$(this).addClass(options.onClass)
						}).mouseout(function(){
							event.reset();
							$(this).removeClass(options.onClass)
						}).focus(function(){
							event.drain();
							$(this).addClass(options.onClass)
						}).blur(function(){
							event.reset();
							$(this).removeClass(options.onClass)
						}).click(function(){
							event.drain();
							options.curValue = 0;
							event.click(this);
							return false;
						});
					}

				},
				click: function(el){
					var rating = (options.maxValue == 1) ? (options.curValue ? 0 : 1) : $(el).children('a:first')[0].href.split('#')[1];
					var postData = $.extend({},options.postData, {'rating': rating});
					this.reset(postData.rating, options.clickedClass);
					event.disable();
					if(options.showLoading && !loading){
						$this.append('<div class="'+options.loadingClass+'"><a href="#"></a></div>');
						loading = true;
					}
					$.post(options.url, postData, function(json){
						if(json.newValue >= 0)options.curValue = Math.ceil(json.newValue);
						if(loading){
							$this.children(':last').remove();
							loading = false;
						}
						if(options.editable)event.enable();
						event.reset();
						if(options.callBack) options.callBack.apply(this, [json]);
					}, "json");
				}
			}        
			if(options.readOnly){
				event.disable();
			}else{
				event.enable();
			}
			event.reset();
 
		});
		return(this);	
	}
 })
})(jQuery);
$.cookie = function(name, value, options) {
	if(typeof value != 'undefined'){
		options = options || {};
		if(value === null) {value = '';options.expires = -1;}
		var expires = '';
		if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
			var date;
			if(typeof options.expires == 'number'){
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			}else{date = options.expires;}
			expires = '; expires=' + date.toUTCString();
		}
		var path = options.path ? '; path=' + (options.path) : '';
		var domain = options.domain ? '; domain=' + (options.domain) : '';
		var secure = options.secure ? '; secure' : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	}else{
		var cookieValue = null;
		if(document.cookie && document.cookie != '') {
			var cookies = document.cookie.split(';');
			for(var i = 0; i < cookies.length; i++) {
				var cookie = jQuery.trim(cookies[i]);
				if(cookie.substring(0, name.length + 1) == (name + '=')) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return cookieValue;
	}
};
