	/************** Ranking question type code *****************/
	var cur_urnk_id = new Array();
	var cur_rnk_id = new Array();
	var rnk_sel = new Array();



	function do_sel(theObj) { // Select the item in the list presented by theObj (contaner element)
		var x = theObj.parentNode;
		for(var j=0;j<x.childNodes.length;j++) if(x.childNodes[j].hasChildNodes()) x.childNodes[j].className='qb_rnk_item';
		theObj.className='qb_rnk_item_sel';
	}

	function sel_urank(mq_id, rnk_id, theObj) { // Select an item in the unranked list (left)
		cur_urnk_id[mq_id]=rnk_id;
		do_sel(theObj);
	}

	function sel_rank(mq_id, rnk_id, theObj) { // Select an item in the ranked list (right)
		cur_rnk_id[mq_id]=rnk_id;
		do_sel(theObj);
	}

	function sel_rank_ie(mq_id, rnk_id, theObj) { // Select an item in the ranked list (right - IE version to handle invocation stuff)
		this.mq_id=mq_id;
		this.rnk_id=rnk_id;
		this.theObj=theObj;
		var me=this;
		this.invoke=function () {
			sel_rank(me.mq_id, me.rnk_id, me.theObj)
		}
		
	}

	function rem_rank(mq_id) { // Remove an item from the ranked list
		if(cur_rnk_id[mq_id]!="" && typeof cur_rnk_id[mq_id]!="undefined") {
			var rnked = get_object("mq_rnk_"+mq_id);
			var urnked = get_object("mq_urnk_"+mq_id);
			urnk_sel[mq_id][cur_rnk_id[mq_id]]=cur_rnk_id[mq_id];
	
			var nrnk_sel = new Array();
			for(i=0;i<rnk_sel[mq_id].length;i++) {
				if(rnk_sel[mq_id][i]!=cur_rnk_id[mq_id]) {
					nrnk_sel[nrnk_sel.length]=rnk_sel[mq_id][i];				
				}
			}
			rnk_sel[mq_id] = nrnk_sel;
			
			o = get_object('urnk_item_'+cur_rnk_id[mq_id]);
			o.style.display="block";
			o.className="qb_rnk_item";
			
			gen_rank_list(rnked, mq_id);
			cur_urnk_id[mq_id]="";
			cur_rnk_id[mq_id]="";

			rnk_sel_obj = get_object('rnk_sel_'+mq_id);
			urnk_sel_obj = get_object('urnk_sel_'+mq_id);			
			rnk_sel_obj.value--;
			urnk_sel_obj.value++;
			
		}
	}

	function rem_rank_dbl_ie(mq_id, rnk_id, theObj) { // For double click actions in IE on the ranked list - selects and removes the item
		this.mq_id=mq_id;
		this.rnk_id=rnk_id;
		this.theObj=theObj;
		var me=this;		
		this.invoke=function () {
			if(cur_rnk_id[me.mq_id]!="" && typeof cur_rnk_id[me.mq_id]!="undefined") {			
				sel_rank(me.mq_id, me.rnk_id, me.theObj);			
				rem_rank(me.mq_id);
				cur_urnk_id[mq_id]="";
				cur_rnk_id[mq_id]="";
			}
		}
	}

	function add_rank(mq_id) { 	// Add the item to the ranked list from the unranked list. No function needed to handle the double click on this side as
								 	// the list is not dynaically generated on the client

		if(cur_urnk_id[mq_id]!="" && typeof cur_urnk_id[mq_id]!="undefined") {
			var rnked = get_object("mq_rnk_"+mq_id);
			var urnked = get_object("mq_urnk_"+mq_id);
	
			rnk_sel[mq_id][rnk_sel[mq_id].length]=cur_urnk_id[mq_id];
			urnk_sel[mq_id][cur_urnk_id[mq_id]]="";
	
			o = get_object('urnk_item_'+cur_urnk_id[mq_id]);
			o.style.display="none";
			gen_rank_list(rnked, mq_id);
			cur_urnk_id[mq_id]="";
			cur_rnk_id[mq_id]="";
			
			rnk_sel_obj = get_object('rnk_sel_'+mq_id);
			urnk_sel_obj = get_object('urnk_sel_'+mq_id);			
			rnk_sel_obj.value++;
			urnk_sel_obj.value--;
			
		}
	}

	function update_rank(mq_id) {
		var mqr = get_object("module_question_rank_"+mq_id);
		var s="";
		for(var i=0;i<rnk_sel[mq_id].length;i++) {
			s+=(s.length>0) ? "," : "";
			s+=rnk_sel[mq_id][i];			
		}
		mqr.value = s;
	}

	function moveup_rank(mq_id) { 

		if(cur_rnk_id[mq_id]!="" && typeof cur_rnk_id[mq_id]!="undefined") {
			var rnked = get_object("mq_rnk_"+mq_id);
			var urnked = get_object("mq_urnk_"+mq_id);
			
			var nrnk_sel = new Array();
			for(i=0;i<rnk_sel[mq_id].length;i++) {
				if(rnk_sel[mq_id][i]!=cur_rnk_id[mq_id] || i==0) {
					nrnk_sel[nrnk_sel.length]=rnk_sel[mq_id][i];		
				} else if(i>0 && rnk_sel[mq_id][i]==cur_rnk_id[mq_id]) {				
					nrnk_sel[nrnk_sel.length-1]=rnk_sel[mq_id][i];
					nrnk_sel[nrnk_sel.length]=rnk_sel[mq_id][i-1];
					var n = rnked.childNodes[i];
				}
			}
			rnk_sel[mq_id] = nrnk_sel;
			
			var theObj = gen_rank_list(rnked, mq_id);	
			sel_rank(mq_id, cur_rnk_id[mq_id], theObj);		
		}
	}
	
	function movedown_rank(mq_id) { 
		if(cur_rnk_id[mq_id]!="" && typeof cur_rnk_id[mq_id]!="undefined") {
			var rnked = get_object("mq_rnk_"+mq_id);
			var urnked = get_object("mq_urnk_"+mq_id);
			
			var nrnk_sel = new Array();
			var j=0;
			for(i=0;i<rnk_sel[mq_id].length;i++) {
				if(rnk_sel[mq_id][i]!=cur_rnk_id[mq_id] && i<rnk_sel[mq_id].length) {
					nrnk_sel[j]=rnk_sel[mq_id][i];		
					j++;
				} else if(rnk_sel[mq_id][i]==cur_rnk_id[mq_id] && i==rnk_sel[mq_id].length-1) {	
					nrnk_sel[j]=rnk_sel[mq_id][i];
					var n = rnked.childNodes[i];
				}
				if(rnk_sel[mq_id][i-1]==cur_rnk_id[mq_id]) {				
					if(i<rnk_sel[mq_id].length-1) {
						nrnk_sel[j]=rnk_sel[mq_id][i-1];
						nrnk_sel[j+1]=rnk_sel[mq_id][i];
						j++;
					} else if(i==rnk_sel[mq_id].length-1) { 
						nrnk_sel[j-1]=rnk_sel[mq_id][i];
						nrnk_sel[j]=rnk_sel[mq_id][i-1];
					}
					var n = rnked.childNodes[i];
				}
			}
			rnk_sel[mq_id] = nrnk_sel;
			
			var theObj = gen_rank_list(rnked, mq_id);	
			sel_rank(mq_id, cur_rnk_id[mq_id], theObj);		
		}
	}	

	function strip_tags( str ){
		// http://kevin.vanzonneveld.net
		// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// *     example 1: strip_tags('Kevin <br />van <i>Zonneveld</i>');
		// *     returns 1: 'Kevin van Zonneveld'
	 
		return str.replace(/<\/?[^>]+>/gi, '');
	}

	function html_entity_decode( string ) {
		// http://kevin.vanzonneveld.net
		// +   original by: john (http://www.jd-tech.net)
		// +      input by: ger
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
		
		// *     returns 1: 'Kevin & van Zonneveld'
	 
		var ret, tarea = document.createElement('textarea');
		tarea.innerHTML = strip_tags(string);
		ret = tarea.value;
		return ret;
	}

	function gen_rank_list(rnked, mq_id) { // Dynamically generate the ranked list
		var a;
		var atr;
		var e;
		var ev;
		var fu;
		var dbl_fu;
		var ret_obj;
		var x = rnk_sel[mq_id];
		var rank_order;
		for(var j=rnked.childNodes.length-1;j>=0;j--) {
			rnked.removeChild(rnked.childNodes[j]);
		}
		for(var i=0;i<rnk_sel[mq_id].length;i++) {
			e = document.createElement('A');
			e.className="qb_rnk_item";
			e.href="javascript:void(0);";
			e.style.display="block";
			rank_order = (i+1);
			rank_order = rank_order.toString();
			if(rank_order.length==1) rank_order="0"+rank_order;
			//atr = document.createTextNode(rank_order+". "+rnk[mq_id][rnk_sel[mq_id][i]]);
			//e.appendChild(atr);
			e.setAttribute("id", document.uniqueID);
			if(browser_type=="ie") {
				fu = new sel_rank_ie(mq_id, rnk_sel[mq_id][i], e);					
				dbl_fu = new rem_rank_dbl_ie(mq_id, rnk_sel[mq_id][i], e);
				e.attachEvent('onclick', fu.invoke);
				e.attachEvent('ondblclick', dbl_fu.invoke);
			} else {
				e.setAttribute("onclick", "sel_rank("+mq_id+", "+rnk_sel[mq_id][i]+", this);");
				e.setAttribute("ondblclick", "sel_rank("+mq_id+", "+rnk_sel[mq_id][i]+", this);rem_rank("+mq_id+");");
			}
			rnked.appendChild(e);
			$(e).html(rank_order+". "+rnk[mq_id][rnk_sel[mq_id][i]]);
			if(rnk_sel[mq_id][i]==cur_rnk_id[mq_id]) ret_obj=e;
		}		
		update_rank(mq_id);		
		return ret_obj;
	}
	
	function toggle_rank_display(mq_id) {
		rank_display = Math.abs(rank_display - 1);
		
		var display_style = "block";
		if (rank_display) var display_style = "none";
		
		o = get_object('mq_urnk_'+mq_id); o.style.display=display_style;
		o = get_object('mq_rnk_'+mq_id); o.style.display=display_style;
		o = get_object('qb_rnk_button_holder_hoz'); o.style.display=display_style;
		o = get_object('qb_rnk_button_holder_vert'); o.style.display=display_style;
		
	}