  function addEvent(o, evType, f, capture) {
	if(o.addEventListener) {
		o.addEventListener(evType, f, capture);
		return true;
	} else if (o.attachEvent) {
		var r = o.attachEvent("on" + evType, f);
		return r;
	} else {
		 //alert("Handler could not be attached");
	}
} 

function With(o, p) {
	for(var prop in p) {
		o[prop] = p[prop]; 
	}
}

//addNamespace("ProductWiki.Web.Controls");
if(typeof ProductWiki == "undefined") ProductWiki={};
if(typeof ProductWiki.Web == "undefined") ProductWiki.Web={};
if(typeof ProductWiki.Web.Controls == "undefined") ProductWiki.Web.Controls={};
ProductWiki.Web.Controls.Quadrus = Class.create();
ProductWiki.Web.Controls.Quadrus.prototype = {
	getNode: function(event) {
		var e=null;
		if (event.target) e = event.target;
		else e = event.srcElement; 
		return e;
	},
	q_over: function(event) {
		var element = this.getNode(event);
		var idx = element.id.substr(element.id.length-1,1);
		if (!this.q_state.TagState[idx]) 
			this.qt[idx].className='qt'+idx+'_over';
	},
	q_out: function(event) {
		var element = this.getNode(event);
		var idx = element.id.substr(element.id.length-1,1);
		if (!this.q_state.TagState[idx])
			this.qt[idx].className='qt'+idx;
	},
	q_click: function(event) {
		if (this.signedin) {
			var element = this.getNode(event);
			var idx = element.id.substr(element.id.length-1,1);
			
			var value;
			if (idx < this.fixed_tags) {
				var tags = [];
				tags[0] = this.q_state.TagNames[idx];
				
				if (!this.q_state.TagState[idx]) value=ProductWiki.Web.UserControls.ProductQuadrus.TapIt(this.object_label,tags,this.q_state.TagNames).value;
				else value=ProductWiki.Web.UserControls.ProductQuadrus.UnTapIt(this.object_label,tags,this.q_state.TagNames).value;
				this.q_state = value;
				this.redraw();
			}
			else {
				if (!this.q_state.TagState[idx]) {
					if (this.q_input_box.style.display == '')
						this.q_input_box.style.display = 'none';
					else
						this.q_input_box.style.display = '';
						this.q_input_text.focus();
				}
				else {
					value=ProductWiki.Web.UserControls.ProductQuadrus.UnTapIt(this.object_label,this.q_state.OtherTags,this.q_state.TagNames).value;
					this.q_state = value;
					this.redraw();
				}
			}
		}
		else {
			//this.quadrusdiv.style.display='none';
			position_signin(this.qt[0]);
			ProductWiki.Web.BasePage.PWPage.TrackQuadrusClick();
		}
	},
	tagit: function() {
		var tag = this.q_input_text.value;
		var value;
		if (tag.length > 0) {
			var tags = [];
			tags[0] = tag;
			value=ProductWiki.Web.UserControls.ProductQuadrus.TapIt(this.object_label,tags,this.q_state.TagNames).value;
		}
		this.q_state = value;
		this.redraw();
		this.q_input_text.value = '';
	},
	redraw: function() {
		//update selections
		this.q_tag_list.innerHTML = '';
		for (var i=0;i<this.fixed_tags+1;i++) {
			if (this.q_state.TagState[i]) {
				this.qt[i].className='qt'+i+'_on';
				this.qt[i].innerHTML = this.msg_on[i];
				if (i==3) this.q_input_box.style.display = '';
			}
			else {
				this.qt[i].className='qt'+i;
				this.qt[i].innerHTML = this.msg_off[i];
				if (i==3) this.q_input_box.style.display = 'none';
			}
		}
		
		//redraw tags
		for (var i=0;i<this.q_state.OtherTags.length;i++) {
			if (this.q_state.OtherTags[i] != '') {
				this.q_tag_list.innerHTML += '<li>'+this.q_state.OtherTags[i]+' </li>';
			}
		}
		
		//update score
		this.score_element.innerHTML = this.q_state.TotalCount;
	},
	keyup: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				var l = this.q_input_text.value.length;
				if (l>0) {
					if (this.q_input_text.value.charCodeAt(l-1)==10)
						this.q_input_text.value = this.q_input_text.value.substr(0,l-1);
				}
				this.tagit();
				break;
		}
	},
	keydown: function(event) {
		switch(event.keyCode) {
			case 13:	//enter
				return false;
				break;
		}
	},
	keypress: function(event) {
		//return false;
	},
	load: function() {
		for (var i=0;i<this.fixed_tags+1;i++) {
			addEvent(this.qt[i], "mouseover", this.q_over.bind(this));
			addEvent(this.qt[i], "mouseout", this.q_out.bind(this));
			addEvent(this.qt[i], "click", this.q_click.bind(this));
		}
		
		addEvent(this.q_input_text, "keyup", this.keyup.bind(this));
		addEvent(this.q_input_text, "keydown", this.keydown.bind(this));
		addEvent(this.q_input_text, "keypress", this.keypress.bind(this));
		addEvent(this.q_input_arrow, "click", this.tagit.bind(this));
		
		this.redraw();
	},
	initialize: function(control_prefix,object_label,q1_s,q2_s,q3_s,q4_s,t1,t2,t3,q1_tc,q2_tc,q3_tc,q4_tc,ot,tc) {
		this.control_prefix = control_prefix;
		//tag input
		this.q_input_box = document.getElementById(control_prefix+'qt');
		this.q_input_text = document.getElementById('qti');
		this.q_input_arrow = document.getElementById('qtl');
		this.q_tag_list = document.getElementById(control_prefix+'qtt');
		this.score_element = document.getElementById('score');
		
		//signin state
		this.signindiv = document.getElementById('tap_login');
		this.signedin = (this.signindiv == null);
		
		this.fixed_tags = 2;
		
		//div controls
		this.qt = [];
		this.qt[0] = document.getElementById('qt0');
		this.qt[1] = document.getElementById('qt1');
		this.qt[2] = document.getElementById('qt2');
		
		this.msg_on = [];		
		this.msg_on[0] = 'love!';
		this.msg_on[1] = 'hate!';
		this.msg_on[2] = 'tagged!';

		this.msg_off = [];		
		this.msg_off[0] = 'love it';
		this.msg_off[1] = 'hate it';
		this.msg_off[2] = 'tag it';
				
		this.object_label = object_label;
		
		this.q_state = ProductWiki.Web.UserControls.Quadrus.NewQuadrusState().value;
		//Public TotalCount As Integer
		this.q_state.TotalCount = tc;

        //Public TagState(3) As Boolean
		this.q_state.TagState = [];
		this.q_state.TagState[0] = q1_s;
		this.q_state.TagState[1] = q2_s;
		this.q_state.TagState[2] = q3_s;
		
        //Public TagNames(2) As String
		this.q_state.TagNames = [];
		this.q_state.TagNames[0] = t1;
		this.q_state.TagNames[1] = t2;
				
        //Public OtherTags() As String
        this.q_state.OtherTags = ot.split(":");

		addEvent(window, "load", this.load.bind(this));
	},
	gettagname: function(idx) {
		if (idx==0) return 'love';
		else if (idx==1) return 'hate';
		else return '';
	}
};

function c_reg() {
	var e=document.getElementById('q1');
	position_signin(e);
}