// smartPhone.js
//
// Primary methods:
//
// Call smartPhoneIDRedirect(page, ID) to redirect a specific smart phone 'ID' to URL 'page'.
// Call smartPhoneIDRedirect(ID) to redirect a specific smart phone 'ID' to a hardcoded URL in this js file.
// Call smartPhoneRedirect(page) to redirect all smart phones to URL 'page'.
// Call smartPhoneRedirect() to redirect all smart phones to a hardcoded URL in this js file.
//
// Example from <body> of an <html> page:
/*

// example with URL redirect declared in function:
<script type="text/javascript" src="smartPhone.js"></script>
<script type="text/javascript">
	smartPhoneIDRedirect("http://google.com", "iphone");
	smartPhoneIDRedirect("http://mozilla.com", "windowsmobile");
	smartPhoneIDRedirect("http://apple.com", "blackberry");
	smartPhoneIDRedirect("http://msn.com", "palm");
	smartPhoneRedirect("http://yahoo.com");
</script>

// example with URL redirect defined in this js file:
<script type="text/javascript" src="smartPhone.js"></script>
<script type="text/javascript">
	smartPhoneIDRedirect("iphone");
	smartPhoneRedirect();
</script>

*/

// Device constants
var deviceIphone = "iphone";
var deviceIpod = "ipod";
var deviceWinMob = "windows ce";
var enginePie = "wm5 pie";
var deviceIeMob = "iemobile";
var deviceBB = "blackberry";
var devicePalm = "palm";
var engineXiino = "xiino";
var engineBlazer = "blazer";
var deviceAndroid = "android";
var opera = "opera";
var mini = "mini";
var deviceSymbian = "symbian";
var deviceS60 = "series60";
var deviceS60 = "series60";
var deviceS70 = "series70";
var deviceS80 = "series80";
var deviceS90 = "series90";
var engineWebKit = "webkit";

// Initialize our user agent string in lower case
var uagent = navigator.userAgent.toLowerCase();

// ID of current device with default "unkown"
var currentDevice = "unknown";
// Possible values for currentDevice:
// iphone	(this includes the iPod Touch)
// windowsmobile
// blackbery
// palm
// android
// operamini
// symbian

// default redirect URLs
var defaultRedirect = "http://www.bankofamerica.com/promos/jump/package/mobile/";
var defaultRedirectID = "http://www.bankofamerica.com/promos/jump/package/iPhone/";

// Redirect for smart phone,
function smartPhoneRedirect(page)
{
	// if currentValue isn't set to null and it's a smart phone redirect.
	if (currentDevice != null && detectSmartPhone() > -1)
		location.replace(page);
}

// Redirect for smart phone,
function smartPhoneRedirect()
{
	// if currentValue isn't set to null and it's a smart phone redirect.
	if (currentDevice != null && detectSmartPhone() > -1)
		location.replace(defaultRedirect);
}

// Redirect for smart phone ID,
function smartPhoneIDRedirect(page, ID)
{
	// if the current device has no ID get one,
	if (currentDevice == "unknown") 
		currentDevice = IDSmartPhone();
	// if IDs match and it's not null load page,
	// convert ID to lowercase to avoid unwanted capitals,
	if (ID != null && ID.toLowerCase() == currentDevice)
	{
		// set currentDevice to null to cancel any smartPhoneRedirect(page) redirect,
		currentDevice = null;
		// redirect.
		location.replace(page);
	}
}

// Redirect for smart phone ID,
function smartPhoneIDRedirect(ID)
{
	// if the current device has no ID get one,
	if (currentDevice == "unknown") 
		currentDevice = IDSmartPhone();
	// if IDs match and it's not null load page,
	// convert ID to lowercase to avoid unwanted capitals,
	if (ID != null && ID.toLowerCase() == currentDevice)
	{
		// set currentDevice to null to cancel any smartPhoneRedirect(page) redirect,
		currentDevice = null;
		// redirect.
		location.replace(defaultRedirectID);
	}
}

// Detect smart phone (returns Boolean).
function detectSmartPhone()
{
	// Look for iPhone and iPod Touch,
	if (detectIphoneOrIpod())
		return true;
	
	// Windows Mobile,
	if (detectWindowsMobile())
		return true;
	
	// BlackBerry,
	if (detectBlackBerry())
		return true;
	
	// PalmOS,
	if (detectPalmOS())
		return true;
	
	// Android,
	if (detectAndroid())
		return true;
		
	// Opera Mini
	if (detectOperaMini())
		return true;
		
	// 60 Open Source Browser on S60 release 3,
	if (detectS60OssBrowser())
		return true;
	
	// Other Symbian devices - older S60, UIQ, other,
	if (detectSymbianOS())
		return true;
	
	// Otherwise, return false.
	return false;
}

// ID smart phone (returns ID string).
function IDSmartPhone()
{
	// Look for iPhone and iPod Touch,
	if (detectIphoneOrIpod())
		return "iphone";
	
	// Windows Mobile,
	if (detectWindowsMobile())
		return "windowsmobile";
	
	// BlackBerry,
	if (detectBlackBerry())
		return "blackberry";
	
	// PalmOS,
	if (detectPalmOS())
		return "palm";
	
	// Android,
	if (detectAndroid())
		return "android";
		
	// Opera Mini
	if (detectOperaMini())
		return "operamini";
		
	// 60 Open Source Browser on S60 release 3,
	if (detectS60OssBrowser())
		return "symbian";
	
	// Other Symbian devices - older S60, UIQ, other,
	if (detectSymbianOS())
		return "symbian";
	
	// Otherwise, return false.
	return null;
}

// Detects if the current device is an iPhone or iPod Touch.
function detectIphoneOrIpod()
{
	// We repeat the searches here because some iPods 
	//  may report themselves as an iPhone, which is ok.
	if (uagent.search(deviceIphone) > -1 ||
		uagent.search(deviceIpod) > -1)
		return true;
	else
		return false;
}

// Detects if the current device is a Windows Mobile device.
function detectWindowsMobile()
{
	// Most devices use 'Windows CE', but some report 'iemobile' 
	// and some older ones report as 'PIE' for Pocket IE. 
	if (uagent.search(deviceWinMob) > -1 ||
		uagent.search(deviceIeMob) > -1 ||
		uagent.search(enginePie) > -1)
		return true;
	else
		return false;
}

// Detects if the current device is on a BlackBerry device.
function detectBlackBerry()
{
	if (uagent.search(deviceBB) > -1)
		return true;
	else
		return false;
}

// Detects if the current device is a PalmOS device.
function detectPalmOS()
{
	// Most devices nowadays report as 'Palm', 
	// but some older ones reported as Blazer or Xiino.
	if (uagent.search(devicePalm) > -1 ||
		uagent.search(engineBlazer) > -1 ||
		uagent.search(engineXiino) > -1)
		return true;
	else
		return false;
}

// Detects if the current device is an Android OS-based device.
function detectAndroid()
{
	if (uagent.search(deviceAndroid) > -1)
		return true;
	else
		return false;
}

// Detects if the current browser is based on Opera Mini.
function detectOperaMini()
{
	if (uagent.search(opera) > -1 && 
		uagent.search(mini) > -1)
		return true;
	else
		return false;
}

// Detects if the current browser is the Nokia S60 Open Source Browser.
function detectS60OssBrowser()
{
	if (detectWebkit())
	{
		if (uagent.search(deviceS60) > -1 || 
			uagent.search(deviceSymbian) > -1)
			return true;
		else
			return false;
	}
	else
		return false;
}

// Detects if the current device is any Symbian OS-based device,
// including older S60, Series 70, Series 80, Series 90, and UIQ, 
// or other browsers running on these devices.
function detectSymbianOS()
{
	if (uagent.search(deviceSymbian) > -1 ||
		uagent.search(deviceS60) > -1 ||
		uagent.search(deviceS70) > -1 ||
		uagent.search(deviceS80) > -1 ||
		uagent.search(deviceS90) > -1)
		return true;
	else
		return false;
}

// Detects if the current browser is based on WebKit.
function detectWebkit()
{
	if (uagent.search(engineWebKit) > -1)
		return true;
	else
		return false;
}
