// JScript source code for ranking system
// Author: Adam Druzd
// How to use;
// Create rank
//      - createRank('Ranking ID', NumberOfElements, DefaultSelectedElement, 'action.ext');
// Draw rank
//      - drawRank('Ranking ID') or drawRank(0)
// Create rank and draw it
//      - createRankAndDraw('Ranking ID', NumberOfElements, DefaultSelectedElement, 'action.ext');

// ------------ GLOBAL Variables ---------
var arrRank= new Array(); // Array of rankings
var arrImg= new Array();  // Array of icons for each raning
    arrImg["g_s"]="star_g_s.gif";   // selected elements
    arrImg["g_us"]="star_g_us.gif"; // empty elements
    arrImg["y_s"]="star_y_s.gif";   // highlighted selected element
    arrImg["y_us"]="star_y_us.gif"; // highlighted empty element
    arrImg["y_sb"]="star_y_sb.gif"; // highlighted choosen element

// -------------- AJAX BEGIN ------------------
function ajaxStarClick(url, oRank, rankInd) {
	var objAjax = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		objAjax = new XMLHttpRequest();
		
		if (objAjax.overrideMimeType) {
			objAjax.overrideMimeType('application/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			objAjax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				objAjax = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!objAjax) {
		if(obj!=null) obj.innerHTML='Poddaję się :( Nie mogę stworzyć instancji obiektu XMHTTP';
		return false;
	}
	objAjax.open('GET', url, true);
	
	objAjax.onreadystatechange = function() { ajaxUpdateRankReadyState(objAjax, oRank, rankInd); };
	objAjax.send(null);
}
function ajaxUpdateRankReadyState(objAjax, oRank, rankInd) {
	var obj;
	if (objAjax.readyState == 4) {
		if (objAjax.status == 200) {
			try{
				var nSelected= eval(objAjax.responseText);
				updateRank(oRank, rankInd, nSelected);
			} catch(e) 
			{
				// alert(e);
			}
			
		} else {
			// if(obj!=null) obj.innerHTML='Wystąpił problem z zapytaniem.';
		}
	} 
}
// -------------- AJAX END   ------------------

function updateRank(oRank, rankInd, nSel)
{
    arrRank[rankInd]=new Rank(oRank.rankID,oRank.numberOfStars,nSel, oRank.hlink);
	starOut(rankInd);
}


function rankImages(img, imgSel, imgH, imgHSel, imgHSelA)
{
    arrImg["g_s"]=imgSel;
    arrImg["g_us"]=img;
    arrImg["y_s"]=imgHSel;
    arrImg["y_us"]=imgH;
    arrImg["y_sb"]=imgHSelA;
}
function Rank(rankID, il, ilz, hlink)
{
    this.hlink=hlink;
    this.rankID=rankID;
    this.numberOfStars=il;
    this.numerOfSelected=ilz;
    
    this.arrStars=new Array();
    for(ind=0; ind<this.numberOfStars; ind++)
    {
        if(ind<this.numerOfSelected)
        {
            this.arrStars[ind]=1;
        } else {
            this.arrStars[ind]=0;
        }
    }
}
function starOver(rankInd, starInd)
{
    var nos=arrRank[rankInd].numberOfStars;
    for(ind=0;ind<nos;ind++)
    {
        var img=document.getElementById('star'+rankInd+','+ind);
        if(img)
        {
            img.src=arrImg['y_us'];
        }
    }
    for(ind=0;ind<=starInd;ind++)
    {
        var img=document.getElementById('star'+rankInd+','+ind);
        if(img)
        {
            if(ind==starInd)
            {
                img.src=arrImg['y_sb'];
            } else {
                img.src=arrImg['y_s'];
            }
        }
    }
}
function starOut(rankInd)
{
    var nos=arrRank[rankInd].numberOfStars;
    for(ind=0;ind<nos;ind++)
    {
        var img=document.getElementById('star'+rankInd+','+ind);
        if(img)
        {
            if(arrRank[rankInd].arrStars[ind]==1)
            {
                img.src=arrImg['g_s'];
            } else {
                img.src=arrImg['g_us'];
            }
        }
    }
}
function createRank(rankID, il, ilz, hlink)
{
    if(il<ilz)
    {
        document.write("Nieprawidlowa deklaracja");
        return false;
    }
    arrRank[arrRank.length]=new Rank(rankID,il,ilz, hlink);
}
function drawRanks()
{
    
    var nRank=arrRank.length;
    for(indR=0; indR<nRank;indR++) 
    {
        drawStars(arrRank[indR],indR);
        document.write('<br />');
    }
}
function rankGetIndex(rankID)
{
    var result=-1;
    for(ind=0; ind<arrRank.length;ind++)
    {
        if(arrRank[ind].rankID==rankID)
        {
            result=ind;
        }
    }
    return result;
}
function drawRank(ind)
{
    if(isNaN(ind))
    {
        var inda=rankGetIndex(ind);
        if(inda !=-1)
        {
            drawStars(arrRank[inda],inda);
        }
    } else {
        if(ind<arrRank.length)
        {
            drawStars(arrRank[ind],ind);
        }
    }
}
function createRankAndDraw(rankID, il, ilz, hlink)
{
    if(il<ilz)
    {
        document.write("Nieprawidlowa deklaracja");
        return false;
    }
    arrRank[arrRank.length]=new Rank(rankID,il,ilz, hlink);
    drawStars(arrRank[arrRank.length-1],arrRank.length-1);
}
function starClick(rankInd, starInd)
{
    if(rankInd>=arrRank.length) return false;
    var oRank=arrRank[rankInd];
    var ajaxUrl=oRank.hlink;
    ajaxUrl+=ajaxUrl.indexOf('?')!=-1?'':'?';
    ajaxUrl+=ajaxUrl.indexOf('=')!=-1?'&':'';
    ajaxUrl+='RID='+oRank.rankID;
    ajaxUrl+='&eInd='+starInd;
	ajaxStarClick(ajaxUrl, oRank, rankInd)
}
function drawStars(elem,parInd)
{
    
    for(ind=0; ind<elem.arrStars.length; ind++)
    {
        if(elem.arrStars[ind]==1)
        {
            document.write('<img style="cursor:hand; cursor:pointer;" src="'+arrImg['g_s']+'" id="star'+parInd+','+ind+'" onMouseOver="starOver('+parInd+','+ ind + ');" onMouseOut="starOut('+parInd+')" onClick=starClick('+parInd+','+ ind + '); border="0" alt="" />');
        } else {
            document.write('<img style="cursor:hand; cursor:pointer;" src="'+arrImg['g_us']+'" id="star'+parInd+','+ind+'" onMouseOver="starOver('+parInd+','+ ind + ');" onMouseOut="starOut('+parInd+')" onClick=starClick('+parInd+','+ ind + '); border="0" alt="" />');
        }
   }
}
