/**
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=
 * AOL Local Global JavaScript 
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=
 * common JS functions and variables for AOL Local
 */
 
/**
 * rating star set on click
 *
 *	external rating page should fire rateStarState() 
 *	to change state of stars or return failure message.
 */ 
function rateStar(which, rating)
{
	var ratingURL = eval("starLink_" + which) + "&rating=" + rating + "&star=" + which;
	jsLoader(ratingURL, 'sendrating', 'body');// send rating data
	eval(which + "Rating = " + rating);
}//rateStar()

/**
 * change color of rated stars
 */
function rateStarState(which, rating)
{
	for (i = 1; i <= rating; i++)
	{
		var toChange = which + "_rating_" + i;
		document.getElementById(toChange).src = starOn;
	}
	for (i = 5; i > rating ; i--)
	{
		var toChange = which + "_rating_" + i;
		document.getElementById(toChange).src = starOff;
	}
}//rateStarState()

/**
 * rating star over selection
 */ 
function starRate(which, rating)
{
	if(rating == -1)
	{	//if -1 reset value on mouse out
		var rating = eval(which + "Rating");
		rateStarState(which, rating);
		return;
	}
	for (i = 1; i <= rating; i++)
	{
		var toChange = which + "_rating_" + i;
		document.getElementById(toChange).src = starHover;
	}
	for (i = 5; i > rating ; i--)
	{
		var toChange = which + "_rating_" + i;
		document.getElementById(toChange).src = starUnrated;
	}
}//starRate()

/**
 * my locations drop-down menu controls
 */
function myLocations(evt)
{
	var evt = (evt) ? evt : ((window.event) ? event : null);
	if(evt && evt.type == "click")	
	{	// eval myloc drop-downs
		for (var nv in myLocationsObject)
		{
			if(myLocationsObject[nv] == 1 && myLocationsLock != nv)
			{	
				var fId = document.getElementById(nv);			
				if((fId.style.visibility == "visible"))
				{	//hide
					if(document.getElementById("mylocrecent" + nv.substring(8)))
					{	//hide recent flyout
						myLocationsRecent("mylocrecent" + nv.substring(8), 0);
					}
					fId.style.visibility = "hidden";
				}
				else if (myLocationsLock != nv)
				{	//show
					fId.style.visibility = "visible";
				}
			}
			else if (myLocationsLock != nv)
			{
				myLocationsRecent("mylocrecent" + nv.substring(8), 0);
				document.getElementById(nv).style.visibility = "hidden";
			}		
		}
		hidePoiRollovers();
	}
}//myLocations()
function myLocationsRecent(fId, fAction)
{
	if(document.getElementById(fId))
	{
		var fId = document.getElementById(fId);
		if (fAction == 1)
		{
			fId.style.visibility = "visible";
		}
		else
		{
			fId.style.visibility = "hidden";
		}
	}
}//myLocationsRecent()
var myLocationsObject 	= new Object();
var myLocationsLock 		= "";
  
/**
 *	js Loader - loads or reloads a .js file
 * usage: jsLoader(file name, id name, head or body)
 */
function jsLoader(file, id, parent)
{	
	var body			= document.getElementsByTagName(parent).item(0)
	var scriptTag	= document.getElementById(id);
	if(scriptTag) body.removeChild(scriptTag);
	script			= document.createElement('script');
	script.src		= file;
	script.type		= 'text/javascript';
	script.id		= id;
	body.appendChild(script)
}//jsLoader()

/**
 * JS redirect
 * submits new URL
 */
function redirect(furl)
{
	window.location = furl;
}//redirect()

/**
 * add eventlistener to browsers that will support one
 * usage: addEvent(object, "event", function);
 */
function addEvent(obj, evType, fn)
{
	if (obj.addEventListener)
	{	// moz, opera
		obj.addEventListener(evType, fn, true);
		return true;
	}
	else if (obj.attachEvent)
	{	// IE
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	else
	{	// old and busted browsers
		var old = obj['on' + evType];
		obj['on' + evType] = function()
		{ 
			(typeof old == 'function') && old(); 
			fn(new addEventOld(obj)); 
		}			
	}
}//addEvent()
function addEventOld(currentTarget)
{	// ol' browser event support	
	this.currentTarget = currentTarget;
	return this;
}//addEventOld()

/**
 * xhtml compliant mod for target="" attr
 * usage: <a href="http://mapquest.com" rel="external">link</a>
 */
function targetBlank()
{
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++)
	{
		var anchor = anchors[i];
		if (anchor.getAttribute("href"))
		{
			switch (anchor.getAttribute("rel"))
			{
			 	case "external":
					anchor.target = "_blank";
				break;
				case "new":
					anchor.target = "_new";
				break;
				case "self":
					anchor.target ="_self";
				break;
			}
			statusTitle(anchor);// set event handlers for statusbar text changes
		}
	}
}// targetBlank()
 
/**
 * validate variables
 */
function paramExists(varname)
{
	if (typeof varname != 'undefined')
	{
		return true;
	}
	return false;
}// paramExists()

/**
 * pop-up new windows
 * usage: URL is only required param
 * url, window name, width, height, scrollbars (yes,no), center (true,false)
 * <a href="http://mapquest.com" onclick="newWin(this.href,'name','400','400','no', true);return false;">link</a>
 * <a href="javascript: newWin('http://mapquest.com','name','400','400','no', true);" onclick="">link</a>
 */
function newWin(fPage, fName, fWidth, fHeight, fScroll, fCenter)
{
	if(paramExists(fPage) == false)
	{	// no url to open
		return;
	}
	if(paramExists(fName) == false)
	{	// if no name, create one
		var fName = "newWin"+ Math.random();
	}
	if(paramExists(fScroll) == false)
	{	// scrollbar defaults to 'no'
		var fScroll = "no";
	}
	if((paramExists(fCenter) == false) || (fCenter == false))
	{	// auto-center defaults to "false"
		fCenter = false;
		var winl = wint = 10;
	}
	else if (fCenter == true)
	{
		var winl = (screen.width - fWidth) / 2;
		var wint = (screen.height - fHeight) / 2;
	}
	if(paramExists(fWidth) == false)
	{	// default width = 400
		var fWidth = 400;
	}
	if(paramExists(fHeight) == false)
	{	// default height = 400
		var fHeight = 400;
	}
	var winprops = 'height='+fHeight+',width='+fWidth+',top='+wint+',left='+winl+',scrollbars='+fScroll+',directories=no,resizable=yes';
	win = window.open(fPage, fName, winprops);
	if (parseInt(navigator.appVersion) >= 4)
	{
		win.window.focus();
	}
}// newWin()

/**
 * legacy workarounds
 * functions to port old function calls from external sources into newer equivalents
 */
function lmadPopUp(fUrl, fName)
{	// old pop-up call for listing corrections
	newWin(fUrl, fName, 600, 400, "yes", true);
}

/**
 * show more info drop-down layer on Listings pages
 */
function showMoreListings(fId,fType)
{	// toogle img and change text
	if(fType == 1)
	{	// if 0, map is automatically displayed and no toggle button or label is shown 
		var fText 		= document.getElementById(fId + "Txt");
		var fButton 	= document.getElementById(fId + "Btn");
	}
	var fLayer 			= document.getElementById(fId + "Lyr");
	var fImage			= eval(fId + "Img");
	if(!paramExists(mapBrand))
	{
		var mapBrand 	= "";
	}
	var fButtonOpen 	= artUrl + "button_expander_open" + mapBrand;
	var fButtonClosed	= artUrl + "button_expander_closed" + mapBrand;
	if(fLayer.className == "hidden")
	{	//show
		if(fType == 1)
		{
			fText.innerHTML = "Hide Info"; 
			if(fId.indexOf("movie") < 0)
			{
				fText.innerHTML += " &amp; Map";
			}
			fButton.src = fButtonOpen;
		}
		fLayer.className = "";
		if(fImage.length > 1)
		{	//load vendor image
			swapImage(fImage, fId + "Img");
		}
		if(fId.indexOf("movie") < 0)
		{	// movie listings don't have maps
			fMap = eval(fId + "Map");
			if(paramExists(fMap.mapSessionId) == false)
			{	// Map's not been called before
				getNewMap('', fMap.id);
				eval("activeMaps." + fMap.id + "= 'visible';");
			}
		}
	}
	else
	{	//hide
		fLayer.className = "hidden";
		fText.innerHTML = "Show More Info";
		if(fId.indexOf("movie") < 0)
		{
			fText.innerHTML += " &amp; Map";
		}
		fButton.src = fButtonClosed;
		//reset map data to generate new map session
		if(fId.indexOf("movie") < 0)
		{	// movie listings don't have maps
			fMap = eval(fId + "Map");
			if(paramExists(fMap.mapSessionId) == true)
			{
				delete fMap.mapSessionId;
				swapImage(fMap.mapLoadUrl, fId + "Map");
				hidePoiRollovers(); // hide any active pois
				eval("activeMaps." + fMap.id + "= 'hidden'");
			}
		}		
	}
}//showMoreListings()

/**
 * replace image
 */
function swapImage(fUrl, fId)
{
	var element = document.getElementById(fId);
	if(element)
	{
		element.src = fUrl;
	}
}//swapImage()

/**
 * get the XY coordinates
 * returns an array containing the event target id, and xy data for page and target
 */
function getXY(evt)
{
   if (!document.createElement || !document.getElementsByTagName) return;
   if(!document.createElementNS)
	{	// to work in html and xml namespaces
      document.createElementNS = function(ns,elt)
		{
         return document.createElement(elt);
      }
   }  
	if(document.addEventListener && typeof evt.pageX == "number")
	{	// Moz and Opera
		var Element							= evt.target;
		var CalculatedTotalOffsetLeft	= CalculatedTotalOffsetTop = 0;
		while (Element.offsetParent)
		{
			CalculatedTotalOffsetLeft += Element.offsetLeft;
			CalculatedTotalOffsetTop += Element.offsetTop;
			Element = Element.offsetParent;
		}
		var OffsetXForNS6	= evt.pageX - CalculatedTotalOffsetLeft;
		var OffsetYForNS6	= evt.pageY - CalculatedTotalOffsetTop;
		var imgX				= OffsetXForNS6;
		var imgY				= OffsetYForNS6;
		var pageX			= evt.pageX;
		var pageY			= evt.pageY;
		var eventId			= evt.target.id;
	}
	else if(window.event && typeof window.event.offsetX == "number")
	{
		var eventId	= window.event.srcElement.id;
		var imgX		= event.offsetX;
		var imgY		= event.offsetY;
		var mapX		= event.offsetX;
		var mapY		= event.offsetY;	
		var pageX	= 0; var pageY = 0;
		var element	= document.getElementById(eventId);
		while (element)
		{
			pageX += element.offsetLeft;
			pageY += element.offsetTop;
			element = element.offsetParent;
		}
		pageX += imgX;
		pageY += imgY;
	}
	var xyData = new Array(eventId, imgX, imgY, pageX, pageY);
	return xyData;
}//getXY()

/**
 * attach event handler to links with title
 */
function statusTitle(fElement)
{	// called from targetBlank function
	if(fElement.getAttribute("title"))
	{
		addEvent(fElement, "mouseover", statusSwap);
		addEvent(fElement, "mouseout", statusSwap);
	}
}//statusTitle()

/**
 * change statusbar on mouseover and mouseout
 */
function statusSwap(evt)
{
	if(document.addEventListener)
	{	// Moz and Opera
		var eventTitle	= evt.target.title;
		var eventType	= evt.type;
	}
	else if(window.event)
	{
		var eventTitle	= window.event.srcElement.title;
		var eventType	= window.event.type;
	}
	if(eventType == "mouseover")
	{
		window.status	= eventTitle;
	}
	else
	{
		window.status	= "";
	}
	return true;
}//statusSwap()

/**
 * validate rating and review form
 */
function ratingReviewCheck()
{

	//check stars
	var d = 0;
	for (var i = 0; i < 5; i++)
	{
		if(eval("document.forms[0]." + ratingReviewForm.starName + "[i].checked"))	{
			d++;
		}
	}
	// check title field content
	if(ratingReviewForm.titleId.value.length > 0)
	{
		d++;
	}
	// check text field length
	if(ratingReviewForm.textId.value.length  >= ratingReviewForm.textCount)
	{	
		ratingReviewForm.textId.value = ratingReviewForm.textId.value.substring(0, ratingReviewForm.textCount-1);
		alert("This field has a limit of " + ratingReviewForm.textCount + " characters.");
	}
	else	{
		d++;
	}
	
	if(d == 3)	{
		if (paramExists(ratingReviewForm.sendId.getAttribute("disabled")))
		{
			ratingReviewForm.sendId.removeAttribute("disabled");
		}
	}
	else
	{
		ratingReviewForm.sendId.setAttribute("disabled","disabled");
	}	
}//ratingReviewCheck()

/**
 * strip whitespace from form fields
 */
function trim(thisId)
{
	if(thisId.value.length > 0)
	{
		if(
			(thisId.value.substring(0, 1) == ' ') || 
			(thisId.value.substring(0, 1) == '&nbsp;')
		)
		{
			thisId.value = thisId.value.substring(1, thisId.value.length);
		}
		if(
			(thisId.value.substring(thisId.value.length - 1, 1) == ' ') ||
			(thisId.value.substring(thisId.value.length - 1, 1) == '&nbsp;')
		)
		{
			thisId.value = thisId.value.substring(0, thisId.value.length - 1);
		}
	}
}//trim()

// =~=~=~=~=~=~=~=~=~=~=~=~=~=
//initiate on script load
function ls3Init()
{
	addEvent(document.getElementsByTagName("body").item(0), "click", myLocations); // set mylocations menu handler
	targetBlank();// xhtml compliant target="" for links
}
addEvent(window, "load", ls3Init);

