var EXPLORER          = "MSIE";
var SAFARI            = "AppleWebKit";
var OPERA             = "Opera";
var FIREFOX           = "Firefox";

var browser           = navigator.appVersion;
var flurlVersion      = 1.2;
var currentURL        = "";
var flurlSwf          = null;
var callbackMethods   = Array();
var f                 = null;
var l                 = location;

/*
 * PRIVATE
 */

_getHash = function()
{
	return decodeURI(l.href).split('#')[1] || '';
}

_checkForHashChange = function()
{
	s = _getHash();
	if(s != currentURL)
	{
		currentURL = s;
		for (var i = callbackMethods.length - 1; i >= 0; i--)
		{
			eval("flurlSwf."+callbackMethods[i]+"('"+s+"')");
		}
	}

	setTimeout(_checkForHashChange, 250);
}

_iFrameLoaded = function(hash)
{
	//IE only, fixes history bug.
	l.hash = hash;
}

_browserIs = function(s)
{
	return browser.indexOf(s) > -1;
}

_init = function()
{
	currentURL = _getHash();
	
	if(_browserIs(EXPLORER))
	{
		var iframeHTML = '<iframe id="flurlFrame" src="javascript:false" style="display:none"></iframe>';
		document.write(iframeHTML);
		f = document.getElementById("flurlFrame");
	}
	
	_checkForHashChange();
}

_init();

/*
 * PUBLIC
 */

setFlurlSwf = function(id)
{
	flurlSwf = document.getElementById(id);
	if(!flurlSwf)
	flurlSwf = document.getElementsByName(id)[0];	
	
	return (flurlSwf != null);
}

addFlurlCallback = function(listener)
{
	if(callbackMethods[listener] != null)
	return;

	callbackMethods.push(listener);
}

removeFlurlCallback = function(listener)
{
	callbackMethods.splice(callbackMethods.indexOf(listener),1)
}

setFlurlURL = function(urlString, append)
{		
	if(urlString == null || urlString == "/") urlString = "";
	
	if(urlString == currentURL)
	return;
	
	if(append)
	currentURL += String(urlString);
	else
	currentURL = String(urlString);
		
	if(_browserIs(SAFARI))
	{
		var evt = document.createEvent("MouseEvents");
		evt.initEvent("click",true,true);
		var lnk = document.createElement("a");
		lnk.href="#"+currentURL;
		lnk.dispatchEvent(evt);
	}
	else 
	{
		l.hash = "#"+currentURL;
	}	
	
	if(f)
	{
		var doc = document.getElementById("flurlFrame").contentWindow.document;
		doc.open("javascript:'<html></html>'");
	    doc.write("<html><head><scri" + "pt type=\"text/javascript\">parent._iFrameLoaded('"+currentURL+"');</scri" + "pt></head><body></body></html>");
	    doc.close();
	}
}

getFlurlURL = function()
{
	return currentURL;
}

setPageTitle = function(title, append)
{		
	if(title == null) title = "";
	
	if(append)
	document.title += String(title);
	else
	document.title = String(title);		
}

getPageTitle = function()
{
	return document.title;
}

updateWidth = function(w)
{
	w += "px";
	flurlSwf.style.width = w;
}

updateHeight = function(h)
{
	h += "px";
	flurlSwf.style.height = h;
}

flurlStatus = function()
{
	status  = "Flurl Version: "+flurlVersion+"\n";
	status += "currentURL: "+currentURL+"\n";
	status += "Main swf loaded: "+(flurlSwf != null)+"\n";
	status += "No. Callback Methods: "+callbackMethods.length+"\n";
	status += "Using iFrame: "+(f!=null)+"\n";
	status += "Browser: "+browser;
	alert(status);
}
