/*   Class that defines a standard ratings component. */
function minprintf()
{
	var fmt = arguments[0];
	for (var i = 1; i < arguments.length; i++) {
		var re = new RegExp("%" + i, "g");
		fmt = fmt.replace(re, arguments[i]);
		re = null;
	}
	return fmt;
}

// Messages for display above the individual ratings units. The length of the
// array also defines how many units to include in the component.
YmbRatings.Msgs = new Array (
YAHOO.MB_Strings['1_star_msg'], 
YAHOO.MB_Strings['2_star_msg'], 
YAHOO.MB_Strings['3_star_msg'], 
YAHOO.MB_Strings['4_star_msg'], 
YAHOO.MB_Strings['5_star_msg']
);

// Image for set units.
YmbRatings.UnitY = YAHOO.MB_Strings['img_path'] + "star_red16.gif";

// Image for set units <= the mouse over point.
YmbRatings.UnitYMouseOver = YAHOO.MB_Strings['img_path'] + "star_g_r16.gif";

// Image for set units > the mouse over point.
YmbRatings.UnitYMouseLess = YAHOO.MB_Strings['img_path'] + "star_brdr_red16.gif";

// Image for unset units.
YmbRatings.UnitN = YAHOO.MB_Strings['img_path'] + "star_brdr_g16.gif";

// Image for unset units <= the mouse over point.
YmbRatings.UnitNMouseOver = YAHOO.MB_Strings['img_path'] + "star_g16.gif";

function YmbRatings(id, board)
{
	// The id parameter is the name (a string) of the variable to which the
	// instance is assigned. (The variable is sent along to event handlers,
	// so it must be in the global scope.)
	var i, t;
	var d = document;

	this.rating = 0;
	this.defaultMsg = YAHOO.MB_Strings['rate_it_text'];
	this.board = board;

	this.parent = document.getElementById(id);
	this.images = this.parent.getElementsByTagName("img");
	this.msg = document.getElementById("yratemsg" + id);
	this.msg.style.fontWeight = "bold"; // initially
	this.id = id;
}

function YmbRatingsSet(n, oFlag)
{
	// The n parameter is the unit to set (starting at 1). Set oflag to
	// true when the mouse is outside of the ratings component, or you're
	// not sure.
	if (arguments.length < 2)
		oFlag = true;   
	this.rating = n;
	this.defaultMsg = minprintf(YmbRatings.Msgs[n-1], this.board);
	this.update(n, oFlag);
}

function YmbRatingsSetMsg(m)
{
	var children = this.msg.childNodes;
	var node;

	for (var i = 0; i <  children.length; i++) {
		node = children[i];

		if (node.nodeType == 3) {
			var s = document.getElementById("yratemsg" + this.id);
			s.style.fontWeight = "bold";
			node.nodeValue = (m == "" || m == 
                YAHOO.MB_Strings['rate_it_text']) 
				? this.defaultMsg : m;
		}
	}
}

function YmbRatingsGet()
{
	return this.rating;
}

function YmbRatingsUpdate(n, oFlag)
{
	// The oFlag parameter is true when the mouse is outside of the ratings
	// component.
	if (oFlag)
		this.setMsg(this.defaultMsg);
	else
		this.setMsg(minprintf(YmbRatings.Msgs[n-1], this.board));

	for (i = 1; i <= YmbRatings.Msgs.length; i++) {
		if (oFlag) {
			this.images[i - 1].src = (i <= this.rating) ? YmbRatings.UnitY : YmbRatings.UnitN;
		} else {
			if (i <= n) {
				this.images[i - 1].src = (i <= this.rating) ? YmbRatings.UnitYMouseOver : YmbRatings.UnitNMouseOver;
			} else {
				this.images[i - 1].src = (i <= this.rating) ? YmbRatings.UnitYMouseLess : YmbRatings.UnitN;
			}
		}
	}

	return true;
}

function YmbRatingsClick(evt, args)
{
	var obj = args.obj;
	var n = args.star_num;

	a = obj.id.split("Rating");
	num = a[1];
    frm = YUD.get("form_"+num);
	frm.rt.value = n;
    var rtg_name = "Rating"+num+"_";
    eval("frm."+rtg_name+".value = n;");
	obj.set(n, false);

	return true;
}

function YmbRatingsMouseOver(evt, args)
{
	var obj = args.obj;
	var n = args.star_num;

	obj.update(n, false);
	return true;
}

function YmbRatingsMouseOut(evt, args)
{
	var obj = args.obj;
	obj.update(0, true);
	return true;
}

// This function sends the request to the server

function YmbRatingsRateMessage(evt, args)
{
	var num = args.num;
	var isUserLoggedIn = args.mb_loginchk;
    YmbRatingsClick(evt, args);

	var url ='/ratemsg?';
    frm = document.getElementById("form_"+num);
	if (isUserLoggedIn == '0') {
		frm.submit();
		return;
	}
        bn = frm.bn.value;
        mid = frm.mid.value;
        crumb = document.getElementById('crumb').value;
        done = document.getElementById('done').value;
        n = frm.rt.value;

	bn = urlencode(bn);
	mid = urlencode(mid);
	done = urlencode(done);
	crumb = urlencode(crumb);
	url = url + 'bn=' + bn + '&mid=' + mid + '&_crumb=' + crumb + 
		'&Rating' + mid + '_=' + n + '&_done=' + done;
	if (crumb == "") {
               obj.set(n, false);
               return true;
	} else {
		YAHOO.util.Connect.initHeader('X-HTTP-METHOD', 'json');
		var transaction = YAHOO.util.Connect.asyncRequest('GET', url, ratingsCallBack, null);
        YmbRatingsRemoveListeners(args);
	}
	return false;
}

function YmbRatingsRemoveListeners(args) {
    for (var i = 1; i <= 5; i++) {
        YUE.removeListener('mbstar'+args.num+'_'+i, 'mouseover');
    	YUE.removeListener('mbstar'+args.num+'_'+i, 'click');
    }
}

var ratingsCallBack = 
{
	success:function (o) {
		eval("var objResponse = " + o.responseText);
		var st = objResponse.ymb.response['status'];
		var fatal = objResponse.ymb.response['fatal'];
		var txt = objResponse.ymb.response.text;
		var rating = objResponse.ymb.response.rating;
		var title = objResponse.ymb.response.response_content;

		var ratingControl = objResponse.ymb.widget;
		var threadList = objResponse.ymb.threads;

		if (st == 1) {
			var t = document.getElementById("rmsg"+mid);
			// the nbsp was needed as a workaround to FF bug
			t.innerHTML = title + "&nbsp;";

			var rc = document.getElementById("ylsquickrt"+mid);
			rc.innerHTML = ratingControl;

			var rcmsg = document.getElementById("rcmsg"+mid);
			if (rcmsg) {
				rcmsg.innerHTML = threadList;
			}
			return;
		}
		if (st == 2) {
			var rc = document.getElementById("ylsquickrt"+mid);
			rc.innerHTML = ratingControl;
			return;
		}
		if (st == 0 && fatal == 1) {
			window.location.href = title;
			return;
		}
	},
	failure:function (o) {
		var rc = document.getElementById("ylsquickrt"+mid);
		rc.innerHTML = YAHOO.MB_Strings['rating_err_msg'];
	}
}

function urlencode(text3s)
{
	// The javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" + // Numeric
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + // Alphabetic
	"abcdefghijklmnopqrstuvwxyz" +
	"-_.!~*'()"; // RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";
	var plaintext = text3s;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
		if (ch == " ") {
			encoded += "+"; // x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch)!= -1) {
			encoded += ch;
		} else {
			var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} 
	return encoded;
}

YmbRatings.prototype.set = YmbRatingsSet;
YmbRatings.prototype.setMsg = YmbRatingsSetMsg;
YmbRatings.prototype.get = YmbRatingsGet;
YmbRatings.prototype.update = YmbRatingsUpdate;
