if(!Opinion) {
	var Opinion = new Class({
		options: {
			container:	null,
			url:		'',
			showCounter:true,
			graphWidth: null,
			totalMessage:'Total vote : %d'
		},
		initialize: function(id, options){
			this.setOptions(options);
			
			this.id = id;
			
			this.errorMessage = null;
			this.opinionTitle = null;
			this.opinionItems = [];
			
			this.totalVotes	= 0;
			
			var maxGraphWidth = $('poll' + id).offsetWidth;
			
			if(!this.options.graphWidth || this.options.graphWidth > maxGraphWidth)
				this.options.graphWidth = maxGraphWidth;
			
			var form = $('poll' + id).getElement('form');
			if(form) form.addEvent('submit', this.getResult.bind(this));
		},
		getResult: function(ev) {
			ev.stop();
			var s = $('poll' + this.id).getElements('input[type=radio]').filter(function(elm){
				return elm.checked == true;
			});
			var uniqId = $('poll' + this.id).getElement('input[type=hidden]').value;
			if(!s.length) return;
			$('poll' + this.id).getElement('input[type=submit]').setStyle('display','none');
			TSF.post(this.options.url, 'poll_key_ID='+s[0].value+'&uniqId='+uniqId, this.parseResult.bind(this));
		},
		parseResult: function(xml) {
			xml = xml.replace(/\n/gi,'');
			
			var reg = new RegExp(".*?<error>(.*?)<.*","gi");
			this.errorMessage = xml.replace(reg,'$1');
			
			var reg = new RegExp(".*?<pollerTitle>(.*?)<.*","gi");
			this.opinionTitle = xml.replace(reg,'$1');
			
			var options = xml.split(/<option>/gi);
			for(var i=1; i<options.length; i++) {
				var elements = options[i].split(/</gi);
				var item = {};
				for(var j=0; j<elements.length; j++) {
					if(elements[j].substring(0,1)!='/'){
						var key		= elements[j].replace(/^(.*?)>.*$/gi,'$1');
						var value	= elements[j].replace(/^.*?>(.*)$/gi,'$1');
						item[key]	= value;
						
						if(key == 'votes') this.totalVotes += value/1;
					}
				}
				this.opinionItems.push(item);
			}
			
			this.displayResult();
		},
		displayResult: function() {
			var contains = $('poll' + this.id).empty();
			var e = new Element('DIV');
				e.className = 'pollError';
				e.innerHTML = this.errorMessage;
				contains.appendChild(e);
	
			var t = new Element('DIV');
				t.className = 'pollTitle';
				t.innerHTML = this.opinionTitle;
				contains.appendChild(t);
			
			this.opinionItems.each(function(option){
				var self = this;
				
				var keyId= 'p_' + this.id + '_' + option['optionId']; 
				
				var ow = (option['votes'] * this.options.graphWidth) / this.totalVotes;
				
				if (this.totalVotes == 0) 
					var op = 0;
				else 
					var op = (option['votes'] * 100) / this.totalVotes;

				var o = new Element('DIV');
					o.style.width = this.options.graphWidth + 'px';
					o.innerHTML = '<div class="optionTitle">'+option['optionText']+(self.options.showCounter ? '<span class="pipeCounter">('+Math.round(op)+'%)</span>':'')+'</div>'
								+ '<div class="pipeContent">'
								//+ (self.options.showCounter ? '<span class="pipeCounter">% '+Math.round(op)+'</span>':'')
								+ '<div id="'+keyId+'" class="pipe">&nbsp;</div>'
								+ '</div>';
					contains.appendChild(o);
				
				new Fx.Style(keyId, 'width').start(0, ow);
				
			}.bind(this));
			
			if(this.options.totalMessage) {
				var r = new Element('DIV');
				r.className = 'pollTotal';
				r.innerHTML = this.options.totalMessage.replace('%d', this.totalVotes);
				contains.appendChild(r);
			}
		}
	});
	Opinion.implement(new Events, new Options);
}