/*	Developed by Eung Chan Park
	Date: 2008-03-06
*/
function MM_findObj(n, d) { //v4.01
	var p,i,x;	if(!d) d=document;	if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function addEvent(obj, evType, fn){
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, true);
        return true;
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {
	    return false;
    }
}

function detachEvent(obj, evType, fn)	{
    if (obj.removeEventListener) {
        obj.removeEventListener(evType, fn, true);
        return true;
    } else if (obj.detachEvent) {
        var r = obj.detachEvent("on"+evType, fn);
        return r;
    } else {
	    return false;
    }
}

var aObject = new Array();
var aButton = new Array();
var aInterval = new Array();
var aBoundary = new Array();
var aRating = new Array();
var sCurrentID = "";
var iMousePos = 0;

var Boundary = function()	{
	this.Left = 0;
	this.Right = 0;
}

var RateBar = function(sButtonID, arrInterval, iDefault)	{
	var iaccum = 0;

	this.sButtonID = sButtonID;
	this.oParent = null;
	this.iDefault = iDefault;
	this.arrInterval = arrInterval;
	this.ButtonOffsetLeft = 0;
	
	aObject[this.sButtonID] = this;
	
	if (this.arrInterval)	{
		aInterval[this.sButtonID] = new Array();
		if (this.iDefault && (this.iDefault > 0 && this.iDefault <= this.arrInterval.length))	{
			aRating[this.sButtonID] = this.iDefault;
		}
		else	{
			aRating[this.sButtonID] = 1;
		}
	}
	
	this.Init = function()	{
		aBoundary[this.sButtonID] = new Boundary();
		aButton[this.sButtonID] = MM_findObj(this.sButtonID);

		if (aButton[this.sButtonID])	{
			this.oParent = aButton[this.sButtonID].parentNode;
			for (var i = 0; i < this.arrInterval.length; i++)	{
				iaccum += this.arrInterval[i];
				aInterval[this.sButtonID][i] = iaccum;
			}
			aButton[this.sButtonID].style.left = "0px";
		}

		if (aButton[this.sButtonID] && this.oParent)	{
			aBoundary[this.sButtonID].Right = this.oParent.offsetWidth - aButton[this.sButtonID].offsetWidth;

			addEvent(aButton[this.sButtonID], 'mousedown', OnMouseDown);
		}
		Snap(this.sButtonID, this.iDefault);
	};
	
	this.GetRate = function()	{
		return (aRating[this.sButtonID]);
	}
}

function getObjectID(event)	{
	var obj;
	var bFound = false;
	
	if (event.srcElement)	{
		obj = event.srcElement;
	} else {
		obj = event.target;
	}
	
	while (!bFound)	{
		for (var key in aButton)	{
			if (aButton[key] == obj)	{
				bFound = true;
			} else	{
				obj = obj.parentNode;
			}
		}
	}
	
	if (obj) { return obj.id; }
	else { return ""; }
}

function OnMouseDown(e)	{
	sCurrentID = getObjectID(e);
	
	if (sCurrentID)	{
		iMousePos = getMouseX(e);
		addEvent(document, 'mousemove', OnMouseMove);
	}
}

function getMouseX(e)	{
	if (document.all) { // grab the x-y pos.s if browser is IE
		return (event.clientX + document.body.scrollLeft);
	} else { // grab the x-y pos.s if browser is NS
		return (e.pageX);
	}
}

function Snap(sID, iDefault)	{
	var style;
	var tempX, tempLeft, tempRight;
	var iIndex;

	if (sID)	{
		style = aButton[sID].style;

		if (style)	{
			if (iDefault)	{
				tempX = aInterval[sID][iDefault - 1];
			}
			else	{
				tempX = (style.left) ? style.left.replace("px","") : 0;
			}
			
			for (var i = 0; i < aInterval[sID].length; i++)	{
				if (tempX != 0 && tempX <= aInterval[sID][i])	{
					iIndex = i;
					tempLeft = aInterval[sID][iIndex-1];
					tempRight = aInterval[sID][iIndex];
					break;
				} else {
					iIndex = 0;
				}
			}
			// snap to the nearest slot
			if ((tempX - tempLeft) < (tempRight - tempX))	{
				tempX = tempLeft;
				iIndex--;
			}
			else	{
				tempX = tempRight;
			}
		}
		aRating[sID] = iIndex + 1;
		aButton[sID].style.left = tempX + "px";
	}
}

function OnMouseMove(e)	{
	var tempX;
	var buttonX;
	var bUpdateMousePos;
	
	if (sCurrentID)	{
		buttonX = parseInt(aButton[sCurrentID].style.left.replace("px",""));
		tempX = (getMouseX(e) - iMousePos) + buttonX;
		
		bUpdateMousePos = true;
		if (tempX < 0) { tempX = 0; bUpdateMousePos = false; }
		if (aBoundary[sCurrentID].Right == 0)	{
			var oParent = aButton[sCurrentID];
			if (oParent)	{
				aBoundary[sCurrentID].Right = oParent.offsetWidth - aButton[sCurrentID].offsetWidth;
			}
		}
		if (tempX > aBoundary[sCurrentID].Right) { tempX = aBoundary[sCurrentID].Right; bUpdateMousePos = false; }
		
		aButton[sCurrentID].style.left = tempX + "px";
		if (bUpdateMousePos)	{
			iMousePos = getMouseX(e);
		}
	}
}

function OnMouseUpGlobal(e)	{
	if (sCurrentID)	{
		Snap(sCurrentID);
	}
	detachEvent(document, 'mousemove', OnMouseMove);
}

addEvent(document, 'mouseup', OnMouseUpGlobal);
addEvent(document, 'dragstart', function() {return false;});
addEvent(document, 'selectstart', function() {return false;});
