
/** Simple rating Widget **
 * by Tristan Michael
 * for ApartmentRatings.com
 
Usage:

spawnRatingWidget({
	 "container_id":"srw_container"
	,"base_url":"/images/"
	,"thumbs_up"  :function(){}
	,"thumbs_down":function(){}
	,"flags":{
		 "Hilarious" :function(){}
		,"Helpful"	 :function(){}
		,"Best of"	 :function(){}
		,"Poor taste":function(){}
		,"Removeable":function(){}
		,"Whatever"  :function(){}
	}
});  
 
 
NOTE: all, yes ALL, parameters are optional
 
 *
 *
 */


// Utilities
////////
function getTarget( e ){
	var targ = e;
	if(!e) var e = window.event;
	if(e.target) targ = e.target;
	else if(e.srcElement) targ = e.srcElement;
	return targ;
}

function setElmntOpacity( elmnt, value ){
	try{ elmnt.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + value + ")"; }catch(ex){}
	try{ elmnt.style.opacity = value/100; }catch(ex){}
	elmnt.opacity = value;
}


function closeAllFlagAs(){

}

// Engine
//////////


var SRW_open = null;
document.onclick = closeOpenList;

function closeOpenList(e){
//alert(SRW_open);
//alert((getTarget(e).uid+"" == "undefined"));
//alert(getTarget(e).uid);
	if(SRW_open && ((getTarget(e).uid != SRW_open.uid) || getTarget(e).id == "srw_container_"+getTarget(e).uid)){
		try{ document.getElementById("srw_flag_as_list_" + SRW_open.uid).style.visibility = "hidden"; }catch(ex){ alert(ex); }
			document.getElementById("PFB"+SRW_open.uid).style.visibility = "visible";
		SRW_open = null;
	}
}

var SRW_selectedElement = new Array();
function selectClickEvent( e ){
	var targ = getTarget(e);

	
	//reset currently selected button
	if( SRW_selectedElement[targ.uid] != null ){
		SRW_selectedElement[targ.uid].onmouseover = changeOpacityMouseOverEvent;
		SRW_selectedElement[targ.uid].onmouseout = changeOpacityMouseOutEvent;
		SRW_selectedElement[targ.uid].onclick = selectClickEvent;		
		SRW_selectedElement[targ.uid].style.fontWeight = "normal";
		setElmntOpacity(SRW_selectedElement[targ.uid], 50);
	}
	else{
		closeFlagAsList;
	}
	
	//set current button	
	var selectedFlag = document.getElementById("srw_selected_flag_" + targ.uid);
	if( targ.className == "srw_flag_item" ){		
		selectedFlag.onmouseover = null;
		selectedFlag.onmouseout = null;
		setElmntOpacity(selectedFlag, 99);
		SRW_selectedElement[targ.uid] = selectedFlag;
		
		selectedFlag.innerHTML = targ.innerHTML;
		selectedFlag.style.fontWeight = "bold";
	}
	else{
		targ.onmouseover = changeOpacityMouseOverEvent;
		targ.onmouseout = changeOpacityMouseOutEvent;
		targ.onclick = selectClickEvent;
		setElmntOpacity(targ, 99);
		SRW_selectedElement[targ.uid] = targ;
		
		document.getElementById("PFB"+targ.uid).style.visibility = "visible";
		selectedFlag.innerHTML = "Flag review";
		selectedFlag.style.fontWeight = "normal";
	}

	
	closeFlagAsList(e);	
	targ.todoOnClick(e);
	
	//feedback behavior
	if( targ.id != "srw_selected_flag_" + targ.uid ){
		var statusElmnt = document.getElementById("srw_status_" + targ.uid);
		statusElmnt.innerHTML = "Thank you!";
		setElmntOpacity(statusElmnt, 100);
		fadeOutElmnt( statusElmnt );
	}
}
function changeOpacityMouseOverEvent( e ){
	var targ = getTarget(e);
	setElmntOpacity(targ, 100);
}
function changeOpacityMouseOutEvent( e ){
	var targ = getTarget(e);
	setElmntOpacity(targ, 50);
}
function setupButton( elmnt, onClickFunction, uid ){
	elmnt.style.cursor = "pointer";
	elmnt.style.margin = "1px";
	elmnt.onmouseover = changeOpacityMouseOverEvent;
	elmnt.onmouseout = changeOpacityMouseOutEvent;
	elmnt.todoOnClick = onClickFunction;
	elmnt.onclick = selectClickEvent;;

	elmnt.uid = uid;
	setElmntOpacity(elmnt, 50);
}

function openFlagAsList(e){
	document.getElementById("PFB"+getTarget(e).uid).style.visibility = "hidden";
	try{ document.getElementById("srw_flag_as_list_" + getTarget(e).uid).style.visibility = "visible"; }catch(ex){ alert(ex); }
	SRW_open = getTarget(e);
}

function closeFlagAsList(e){
	SRW_open = null;
	try{ document.getElementById("srw_flag_as_list_" + getTarget(e).uid).style.visibility = "hidden"; }catch(ex){ alert(ex); }
}

function fadeOutElmnt(elmnt){
	setElmntOpacity(elmnt, elmnt.opacity - 3);
	
	if( elmnt.opacity - elmnt.opacity/3 <= 1 ){
		setElmntOpacity(elmnt, 0);
		return;
	}
	else{
		setTimeout(function(){ fadeOutElmnt(elmnt); }, 50);
	}
}


// Init
////////
function spawnRatingWidget( params ){
	var uid = Math.round( Math.random() * 100000 );
	
	//process container
	var containerElmnt = null;
	if( typeof params.container_id != "undefined"){
		containerElmnt = document.getElementById( params.container_id );
		if( containerElmnt == null ) alert("SimpleRatingWidget error: cannot find element with id = '" + params.container_id + "'");
	}
	else{
		document.write("<div id='srw_container_" + uid + "'></div>");
		containerElmnt = document.getElementById("srw_container_" + uid);
	}
	containerElmnt.uid = uid;
	
	
	//Rate this review
	var titleElmnt = document.createElement("div");
	titleElmnt.innerHTML = "<b>Rate this "+params.type+"</b>&nbsp;";
	titleElmnt.className = "flagStatus";
	containerElmnt.appendChild( titleElmnt );
	
	//Feedback thing
	var statusElmnt = document.createElement("div");
	statusElmnt.id = "srw_status_" + uid;
	statusElmnt.className = "flagStatus";
	statusElmnt.style.width = "100px";
	statusElmnt.innerHTML = "Rate";
	setElmntOpacity(statusElmnt, 0);
	containerElmnt.appendChild( statusElmnt );
	
	containerElmnt.appendChild( document.createElement("br") );
	
	//process rest of configuration
	var base_url = ""; //where the thumbs images are
	if( typeof params.base_url != "undefined"){
		base_url = params.base_url;
	}
	
	if( typeof params.thumbs_up != "undefined"){
		var imgElmnt = document.createElement("img");
		imgElmnt.src = base_url + "thumbs_up.gif";
		imgElmnt.alt = "thumbs up";
		imgElmnt.className = "thumbImg";
		setupButton( imgElmnt, params.thumbs_up, uid );
		containerElmnt.appendChild( imgElmnt );
	}

	if( typeof params.thumbs_down != "undefined"){
		var imgElmnt = document.createElement("img");
		imgElmnt.src = base_url + "thumbs_down.gif";
		imgElmnt.alt = "thumbs down";
		imgElmnt.className = "thumbImg";		
		setupButton( imgElmnt, params.thumbs_down, uid );
		containerElmnt.appendChild( imgElmnt );
	}
	
	if( typeof params.flags != "undefined"){
		var flagAsList = document.createElement("div");

		flagAsList.id = "srw_flag_as_list_" + uid;
		flagAsList.style.visibility = "hidden";
		flagAsList.style.display = "inline";
		flagAsList.style.position = "absolute";
		flagAsList.style.padding = "2px";
		flagAsList.style.backgroundColor = "#E7ECEE";
		flagAsList.style.border = "1px solid #111111";
		
		for(var flag in params.flags) {
			var linkLabel = flag;
			var onClickFunction = params.flags[flag];
			
			var flagRow = document.createElement("div");
			flagRow.className = "srw_flag_item";
			flagRow.style.width = "90px";
			setupButton( flagRow, onClickFunction, uid );
			flagRow.appendChild( document.createTextNode(linkLabel) );
			flagAsList.appendChild( flagRow );
		}
		
		containerElmnt.appendChild( flagAsList );
		
		var flagAsText = document.createElement("span");
		flagAsText.id = "PFB"+uid;
		flagAsText.style.verticalAlign = "top";
		flagAsText.innerHTML = "Problem, Funny, Best of? <br />";
		containerElmnt.appendChild( flagAsText );
		
		
		flagAsLink = document.createElement("span");
		flagAsLink.id = "srw_selected_flag_" + uid;
		flagAsLink.className = "flagAs";
		flagAsLink.style.verticalAlign = "top";		
		flagAsLink.innerHTML = "Flag review";
		setupButton( flagAsLink, openFlagAsList, uid );
		
		containerElmnt.appendChild( flagAsLink );
	}

}