var djConfig = {isDebug:false, parseOnLoad:true};

var apa = new Object();

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (obj, start) {
    for (var i = (start || 0); i < this.length; i++) {
      if (this[i] == obj) {
        return i;
      }
    }
    return -1;
  }
}

apa.common = new function() {

	// ______________________________________________________________________________________
	
	// a convenient way to store objects used... 
	var _myObjects = new Array();
	var _myLoadFunctions = new Array();
	var _myModules = new Array();
	
	//var _dojoRoot = 'http://ajax.googleapis.com/ajax/libs/dojo/1.6/';
	var _dojoRoot = '/inc/javascript/dojo-release-1.6.1/';

	var _siteroot = '/';

	function _createToggle(ToggleName) {
		this.ToggleName = ToggleName;
		this.CurrentElementID = null;
		this.ElementIDs = new Array();
		return this;
	}

	return {
	
	SetSiteRoot : function(newroot) {
		_siteroot = newroot;
	},
	
	AddModule : function(properties) {
		if (properties.name=='toolkit') {
			//document.write('<script src="', _dojoRoot, 'dojo/dojo.xd.js', '" type="text/JavaScript"><\/script>');
			document.write('<script src="', _dojoRoot, 'dojo/dojo.js', '" type="text/JavaScript"><\/script>');
		} else if (properties.name=='toolkit_styles') {
			document.write('<link rel="stylesheet" href="', _dojoRoot, 'dijit/themes/claro/claro.css" type="text/css" />');
		} else if (properties.name=='apa.popbox') {
			document.write('<link rel="stylesheet" href="' + _siteroot + 'inc/css/popbox.css" type="text/css" charset="utf-8"/>');
			document.write('<script src="', _siteroot + 'inc/javascript/highslide/highslide-with-html.js', '" type="text/JavaScript"><\/script>');
			document.write('<script src="', _siteroot + 'inc/javascript/' + properties.name + '.js', '" type="text/JavaScript"><\/script>');
		} else if (properties.name=='apa.popbox2') {
			document.write('<link rel="stylesheet" href="' + _siteroot + 'inc/css/popbox.css" type="text/css" charset="utf-8"/>');
			document.write('<script src="', _siteroot + 'inc/javascript/' + properties.name + '.js', '" type="text/JavaScript"><\/script>');
		} else if (properties.name=='apa.prototype') {
			document.write('<link rel="stylesheet" href="' + _siteroot + 'inc/css/prototype.css" type="text/css" charset="utf-8"/>');
			document.write('<script src="', _siteroot + 'inc/javascript/apa.prototype.js', '" type="text/JavaScript"><\/script>');
		} else if (properties.location!=null) {
			document.write('<script src="', properties.location, '" type="text/JavaScript"><\/script>');			
		} else {
			document.write('<script src="', _siteroot + 'inc/javascript/' + properties.name + '.js', '" type="text/JavaScript"><\/script>');
		}
	},
	
	AddOnLoad : function(functionPointer) {
		_myLoadFunctions[_myLoadFunctions.length] = functionPointer;
	},

	Init : function() {
		for (var i = 0; i<_myLoadFunctions.length;i++) {
			_myLoadFunctions[i]();
		}
	},

	DojoExists : function() {return (typeof(window['dojo'])=='undefined') ? false : true},

	HitUrl : function(url) {
		if (this.DojoExists()==true) {
			dojo.xhrGet({
				url: url,
				handleAs: 'text',
				error: function(error,args) {
					console.warn("error!",error);
				}
			});
		} else {this.ThrowException('Dojo is required for HitUrl().');}
	},

	SimpleAjaxPost: function() {
		var xmlhttp, bComplete = false;
		try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch (e) { try { xmlhttp = new XMLHttpRequest(); xmlhttp.overrideMimeType("application/xml"); }  
		catch (e) { xmlhttp = false; }}}
		if (!xmlhttp) return null;
	    this.IsComplete = function() {return bComplete;};
		this.connect = function(sURL, sVars, fnDone, properties)
		  {
		    if (!xmlhttp) return false;
		    bComplete = false;
		    try {
    	    	xmlhttp.open('POST', sURL, true);
	    	    xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
	        	xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		      xmlhttp.onreadystatechange = function(){
		       if (xmlhttp.readyState == 4 && !bComplete)
        		{
		          bComplete = true;
        		  fnDone(xmlhttp, properties);
		        }};
		      xmlhttp.send(sVars);
		    }
		    catch(z) { return false; } return true;
		  };
	  return this;
	},

	LoginUser : function(loginProperties) {
		myLoader = new apa.common.SimpleAjaxPost();

		var connectUrl;
		if (loginProperties.rememberme_inputID) {
			var rememberMe = ((document.getElementById(loginProperties.rememberme_inputID).checked==true) ? 'true' : 'false');
			connectUrl = 'UserName=' + document.getElementById(loginProperties.username_inputID).value + '&Password=' + document.getElementById(loginProperties.password_inputID).value + '&RememberMe=' + rememberMe;
		} else {
			connectUrl = 'UserName=' + document.getElementById(loginProperties.username_inputID).value + '&Password=' + document.getElementById(loginProperties.password_inputID).value;
		}

		myLoader.connect('/!cms/login.xml', connectUrl,
																																								  
		function(xmlResponse, myProperties) {


			if (xmlResponse.responseText.indexOf('.response_success')==-1) {

				var myErrorElementID = ((myProperties.errorelementID==null) ? 'myapa_login_error' : myProperties.errorelementID);
				var myButtonElementID = ((myProperties.buttonelementID==null) ? 'myapa_login_button' : myProperties.buttonelementID);
				var myLoadingElementID = ((myProperties.loadingelementID==null) ? 'myapa_login_loading' : myProperties.loadingelementID);
				
				 document.getElementById(myLoadingElementID).style.display='none'; document.getElementById(myButtonElementID).style.display='inline'; 

				if (document.getElementById(myErrorElementID)) {
					document.getElementById(myErrorElementID).innerHTML=xmlResponse.responseText;
					apa.common.ShowDisplay(myErrorElementID);
				} else alert(xmlResponse.responseText);
				if (document.getElementById(myButtonElementID)) {
					document.getElementById(myButtonElementID).innerHTML='Try Again';
				}
				
			} else {
				window.location.reload();
			}
		},
		loginProperties);
	},
	LogoutUser : function() {
		myLoader = new this.SimpleAjaxPost();
		myLoader.connect(_siteroot + '!cms/login.xml', 'Logout=true', function() {window.location.reload();});
	},

	LoadAdHocContent : function(loadProperties) {
		if (this.DojoExists()==true) {
			if (loadProperties.adhoccode) {
				var myUrl = _siteroot + '!cms/!adhoccontent/' + loadProperties.adhoccode + '.xml';
				dojo.xhrGet({
					url: myUrl,
					handleAs: 'text',
					load: function(data, args) {
						if (loadProperties.elementID) dojo.byId(loadProperties.elementID).innerHTML = data; 
						// NEED TO IMPLEMENT SPECIFIC TEST FOR FAILURE
						if (loadProperties.oncomplete) {
							loadProperties.oncomplete();
						}
					},
					error: function(error,args) {
						console.warn("error!",error);
					}
				});
			} else {this.ThrowException('adhoccode is a required property for LoadAdHocContent().');}
		} else {this.ThrowException('Dojo is required for LoadAdHocContent().');}
	},


	LoadContentBlock : function(loadProperties) {
		if (this.DojoExists()==true) {
			if (loadProperties.contentblock) {
				var myUrl = _siteroot + '!cms/!contentblock/' + loadProperties.contentblock + '.xml';
				if (loadProperties.querystring) myUrl += '?' + loadProperties.querystring;
				dojo.xhrGet({
					url: myUrl,
					handleAs: 'text',
					form: loadProperties.formID,
					load: function(data, args) {
						if (loadProperties.elementID) { 
							if (loadProperties.haswidgets==true) {
								var myElement = dijit.byId(loadProperties.elementID);
								if (myElement) {
									myElement.attr({content: data});
								}
							} else {
								document.getElementById(loadProperties.elementID).innerHTML = data; 
							}
						}
						if (loadProperties.successurl) {
							document.location.href=loadProperties.successurl;
						}
						if (typeof(loadProperties.oncomplete)=='function') {
							loadProperties.oncomplete();
						}
						// NEED TO IMPLEMENT SPECIFIC TEST FOR FAILURE
						if (typeof(loadProperties.onsuccess)=='function') {
							loadProperties.onsuccess();
						}
					},
					error: function(error,args) {
						console.warn("error!",error);
						alert(error);
					}
				});
			} else {this.ThrowException('contentblock is a required property for LoadContentBlock().');}
		} else {this.ThrowException('Dojo is required for LoadContentBlock().');}
	},

	CreateElement : function(properties) {
		var elementType = 'div';
		if (properties.type!=null) elementType = properties.type;
		var newElement = document.createElement(properties.type);
		if (properties.ID!=null) {
			var newIDAttribute = document.createAttribute('id');
			newIDAttribute.nodeValue = properties.ID;
			newElement.setAttributeNode(newIDAttribute);
		}

		if (properties.classname!=null) {
			var newAttribute = document.createAttribute('class');
			newAttribute.nodeValue = properties.classname;
			newElement.setAttributeNode(newAttribute);
		}

		if (properties.style!=null) {
			var newAttribute = document.createAttribute('style');
			newAttribute.nodeValue = properties.style;
			newElement.setAttributeNode(newAttribute);
		}

		if (properties.parentID!=null) {
			document.getElementById(properties.parentID).appendChild(newElement);
		} else {
			document.body.appendChild(newElement);
		}
		return newElement;
	},

	GetFormValue : function(formElement) {
			switch(formElement.type)  {
				case 'select-one':
					return formElement.options[formElement.selectedIndex].value;					
					break;
				case 'defailt' :
					return formElement.value
			}
				
	},
	
	SubmitForm : function(loadProperties) {
		if (this.DojoExists()==true) {
			if (loadProperties.contentblock && loadProperties.formID) {
				var myUrl = _siteroot + '!cms/!contentblock/' + loadProperties.contentblock + '.xml';
				dojo.xhrPost({
					url: myUrl,
					form: loadProperties.formID,
					handleAs: 'xml',
					handle: function(data, args) {
						if(typeof data == 'error') {
							if (loadProperties.onfailure) {
								loadProperties.onfailure();
							}
							// THERE IS PROBABLY A BETTER ERROR HANDLING SOLUTION HERE
							console.warn("error!",args);
						}else{
							var responseID = data.documentElement.getAttribute('id');
							var errorAlert = true;
							if (responseID==null) {
								if (typeof(loadProperties.onfailure)=='function') {
									loadProperties.onfailure();
								}								
							} else if (responseID.indexOf('.response_success')==-1) {
								if (typeof(loadProperties.onfailure)=='function') {
									loadProperties.onfailure();
									errorAlert = false;
								}
								if (loadProperties.errorelementID!= null && data.documentElement.getAttribute('adhoccode')!=null) {
									apa.common.LoadAdHocContent({elementID: loadProperties.errorelementID, adhoccode: data.documentElement.getAttribute('adhoccode')}); 
									errorAlert = false;
								} else if (loadProperties.errorelementID!= null) {
									document.getElementById(loadProperties.errorelementID).innerHTML = data.documentElement.getAttribute('errortext');
								}
								if (errorAlert==true) alert('There was an error submitting the form.');
							} else {
								loadProperties.passthroughID = responseID.replace('.response_success', '');

								if (typeof(loadProperties.onsuccess)=='function') {
									loadProperties.onsuccess();
								}
							}
						}
					}
				});
			} else {this.ThrowException('contentblock and formID are required properties for SubmitForm().');}
		} else {this.ThrowException('Dojo is required for SubmitForm().');}
	},

	ShowDisplay : function(elementID) {
		document.getElementById(elementID).style.display='block';
	},

	HideDisplay : function(elementID) {
		document.getElementById(elementID).style.display='none';
	},

	SwitchDisplay : function(elementID) {
		if (document.getElementById(elementID).style.display=='none') document.getElementById(elementID).style.display='block';
		else  document.getElementById(elementID).style.display='none';
	},

	ToggleDisplay : function(ToggleName, ElementID) {
		if (!_myObjects['toggle', ToggleName]) 
		this.AddToggleRootElement(ToggleName);

		var toggleObject = _myObjects['toggle', ToggleName];
			if (toggleObject.CurrentElementID==null) {
				for (var i=0; i < toggleObject.ElementIDs.length; i++) {
					this.HideDisplay(toggleObject.ElementIDs[i]);
				}
			} else this.HideDisplay(toggleObject.CurrentElementID);
			this.ShowDisplay(ElementID);
			toggleObject.CurrentElementID = ElementID;
	},
	
	ClearToggle : function(ToggleName) {
		_myObjects['toggle', ToggleName] = null;
	},

	AddToggleRootElement : function(ToggleName) {
		toggleRootElement = document.getElementById(ToggleName);
		for (var i=0; i < toggleRootElement.childNodes.length; i++) {
			this.AddToggleElement(ToggleName, toggleRootElement.childNodes[i].id);
		}
	},	

	AddToggleElement : function(ToggleName, ElementID) {
		if (!_myObjects['toggle', ToggleName]) _myObjects['toggle', ToggleName] = new _createToggle(ToggleName);
			var toggleObject = _myObjects['toggle', ToggleName];
			// NOTE... DOES NOT CHECK IF ELEMENT HAS ALREADY BEEN ADDED
			toggleObject.ElementIDs.push(ElementID);
	},

	AddToggleElements : function(ToggleName, ElementIDs) {
		// NOT YET IMPLEMENTED
	},

	RotateAd : function(AdBlockCode, slots, time, spot) {
		var slotnumber = (spot==null) ? (Math.floor(Math.random()*(slots)) + 1) : spot;
		slotnumber= (slotnumber >= slots) ? 1 : slotnumber;
		apa.common.ToggleDisplay('adcontainer.' + AdBlockCode, AdBlockCode + '.adslot' + String(slotnumber));
		setTimeout('apa.common.RotateAd("' + AdBlockCode + '", ' + String(slots) + ',' + String(time) + ',' + String(slotnumber + 1) + ')', time*1000);
	},
	
		AdClick : function(AdID) {
		myLoader = new this.SimpleAjaxPost();
		myLoader.connect(_siteroot + '!cms/!contentblock/ads_adclick.xml', 'AdID=' + String(AdID), function() {});
	},

	// ______________________________________________________________________________________
	// BELOW ARE METHODS FOR SITEWIDE NAVIGATION MENUS
	// ______________________________________________________________________________________

	NavigationOver : function(inID) {
		document.getElementById(inID).style.display = 'block';
	},
		
		
	NavigationOut : function(inID) {
		document.getElementById(inID).style.display = 'none';
	},

	// ______________________________________________________________________________________
	// BELOW ARE METHODS FOR ERROR HANDLING
	// ______________________________________________________________________________________

	ThrowException : function(Message) {
		alert('apa.common script error: ' + Message);
	},
	
	// ______________________________________________________________________________________
		
	FocusSearch : function() {
		var     input = document.getElementById('google');
		if(input.className == 'google') {
			input.className = 'nogoogle';
			input.value = '';
		}
	},
	
	// ______________________________________________________________________________________
	
	ReduceImgSize : function(maxHeight, maxWidth, elementID) {
		if(document.getElementById(elementID)){
			if(document.getElementById(elementID).width > maxWidth){
				document.getElementById(elementID).style.width = maxWidth + 'px';
			}
			if(document.getElementById(elementID).height > maxHeight){
				document.getElementById(elementID).style.height = maxHeight + 'px';
			}
		}
	},

	// ______________________________________________________________________________________
	
	GetCheckValue : function(formElement)
		{
		var c_value = "";
		for (var i=0; i < formElement.length; i++)
		   {
		   if (formElement[i].checked)
			  {
			  c_value = c_value + formElement[i].value + "\n";
			  }
		   }
		return c_value
		},

	// ______________________________________________________________________________________
	
	SetLoading : function(elementID, isLoading) {
		myElement=document.getElementById(elementID);
		if (myElement!=null) {
			if (isLoading==true) {
				myElement.className = 'loading';
				myElement.parentNode.className = 'loading_wrapper';
				myElement.style.filter = 'alpha(opacity=20%)'; 
				
			} else {
				myElement.className = '';
				myElement.style.filter = 'alpha(opacity=100%)'; 
			}
		} 
	},
	
	SetClass : function(elementID, className) {
		myElement=document.getElementById(elementID);
		myElement.className = className;
	},
	
	CharacterCounter : function (elementID, maxLength, displayElementID) {
		var thisElement=document.getElementById(elementID);
		if (thisElement!=null) {
			if (thisElement.value.length > maxLength) // if too long...trim it!
				thisElement.value = thisElement.value.substring(0, maxLength);
			else
				document.getElementById(displayElementID).innerHTML = thisElement.value.length;
		}
	},



	// ______________________________________________________________________________________
	
	
	// resizes textareas (and other similar elements) to the total height of content...
	ResizeBox : function (elementID, shrink) {
		var myElement = document.getElementById(elementID);
		myElement.style.height = myElement.scrollHeight + 'px';
	},


	checkEnter : function(e) { //e is event object passed from function invocation
		var characterCode;

		if(e && e.which){ //if which property of event object is supported (NN4)
			e = e;
			characterCode = e.which; //character code is contained in NN4's which property
		}
		else{
			e = event;
			characterCode = e.keyCode; //character code is contained in IE's keyCode property
		}
		
		if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
			return true;
		}
		else{
			return false;
		}

	},

	
	// ______________________________________________________________________________________
	//pass the id of the select option on the page and the value you want it set to.
	
	selectValueSet : function(SelectName, Value) {
	  eval('SelectObject = document.getElementById("' + 
		SelectName + '");');
	  for(index = 0; 
		index < SelectObject.length; 
		index++) {
	   if(SelectObject[index].value == Value)
		 SelectObject.selectedIndex = index;
	   }
	},
	
	// ______________________________________________________________________________________
	// redirects to HTTPS (SSL) if not already
	RedirectHttps : function() {
	    var loc = location.href.split(':');
        if(loc[0]=='http' && location.hostname=='www.planning.org'){
        	location.href='https:'+loc[1];
        }
        },
	
	
	//______________________________________________________________________________________

	TestAlert : function() {alert('Hi! ')}

	};
};


window.onload = apa.common.Init;



//-----------MOBILE DETECTION-----------------------

//Optional: Store values for quickly accessing same info multiple times.
//Note: These values are not set automatically.
//Stores whether the device is an iPhone or iPod Touch.
var isIphone = false; 
//Stores whether the device is an Android phone or multi-media player.
var isAndroidPhone = false; 
//Stores whether is the Tablet (HTML5-capable, larger screen) tier of devices.
var isTierTablet = false; 
//Stores whether is the iPhone tier of devices.
var isTierIphone = false; 
//Stores whether the device can probably support Rich CSS, but JavaScript support is not assumed. (e.g., newer BlackBerry, Windows Mobile)
var isTierRichCss = false; 
//Stores whether it is another mobile device, which cannot be assumed to support CSS or JS (eg, older BlackBerry, RAZR)
var isTierGenericMobile = false; 

//Initialize some initial string variables we'll look for later.
var engineWebKit = "webkit";
var deviceIphone = "iphone";
var deviceIpod = "ipod";
var deviceIpad = "ipad";
var deviceMacPpc = "macintosh"; //Used for disambiguation

var deviceAndroid = "android";
var deviceGoogleTV = "googletv";
var deviceXoom = "xoom"; //Motorola Xoom
var deviceHtcFlyer = "htc_flyer"; //HTC Flyer

var deviceNuvifone = "nuvifone"; //Garmin Nuvifone

var deviceSymbian = "symbian";
var deviceS60 = "series60";
var deviceS70 = "series70";
var deviceS80 = "series80";
var deviceS90 = "series90";

var deviceWinPhone7 = "windows phone os 7"; 
var deviceWinMob = "windows ce";
var deviceWindows = "windows";
var deviceIeMob = "iemobile";
var devicePpc = "ppc"; //Stands for PocketPC
var enginePie = "wm5 pie";  //An old Windows Mobile

var deviceBB = "blackberry";
var vndRIM = "vnd.rim"; //Detectable when BB devices emulate IE or Firefox
var deviceBBStorm = "blackberry95"; //Storm 1 and 2
var deviceBBBold = "blackberry97"; //Bold
var deviceBBTour = "blackberry96"; //Tour
var deviceBBCurve = "blackberry89"; //Curve 2
var deviceBBTorch = "blackberry 98"; //Torch
var deviceBBPlaybook = "playbook"; //PlayBook tablet

var devicePalm = "palm";
var deviceWebOS = "webos"; //For Palm's line of WebOS devices
var deviceWebOShp = "hpwos"; //For HP's line of WebOS devices

var engineBlazer = "blazer"; //Old Palm browser
var engineXiino = "xiino";

var deviceKindle = "kindle"; //Amazon Kindle, eInk one.

//Initialize variables for mobile-specific content.
var vndwap = "vnd.wap";
var wml = "wml";

//Initialize variables for random devices and mobile browsers.
//Some of these may not support JavaScript
var deviceTablet = "tablet"; //Generic term for slate and tablet devices
var deviceBrew = "brew";
var deviceDanger = "danger";
var deviceHiptop = "hiptop";
var devicePlaystation = "playstation";
var deviceNintendoDs = "nitro";
var deviceNintendo = "nintendo";
var deviceWii = "wii";
var deviceXbox = "xbox";
var deviceArchos = "archos";

var engineOpera = "opera"; //Popular browser
var engineNetfront = "netfront"; //Common embedded OS browser
var engineUpBrowser = "up.browser"; //common on some phones
var engineOpenWeb = "openweb"; //Transcoding by OpenWave server
var deviceMidp = "midp"; //a mobile Java technology
var uplink = "up.link";
var engineTelecaQ = 'teleca q'; //a modern feature phone browser

var devicePda = "pda";
var mini = "mini";  //Some mobile browsers put 'mini' in their names.
var mobile = "mobile"; //Some mobile browsers put 'mobile' in their user agent strings.
var mobi = "mobi"; //Some mobile browsers put 'mobi' in their user agent strings.

//Use Maemo, Tablet, and Linux to test for Nokia's Internet Tablets.
var maemo = "maemo";
var linux = "linux";
var qtembedded = "qt embedded"; //for Sony Mylo and others
var mylocom2 = "com2"; //for Sony Mylo also

//In some UserAgents, the only clue is the manufacturer.
var manuSonyEricsson = "sonyericsson";
var manuericsson = "ericsson";
var manuSamsung1 = "sec-sgh";
var manuSony = "sony";
var manuHtc = "htc"; //Popular Android and WinMo manufacturer

//In some UserAgents, the only clue is the operator.
var svcDocomo = "docomo";
var svcKddi = "kddi";
var svcVodafone = "vodafone";

//Disambiguation strings.
var disUpdate = "update"; //pda vs. update



//Initialize our user agent string.
var uagent = "";
if (navigator && navigator.userAgent)
    uagent = navigator.userAgent.toLowerCase();


//**************************
// Detects if the current device is an iPhone.
function DetectIphone()
{
   if (uagent.search(deviceIphone) > -1)
   {
      //The iPad and iPod Touch say they're an iPhone! So let's disambiguate.
      if (DetectIpad() || DetectIpod())
         return false;
      //Yay! It's an iPhone!
      else 
         return true;
   }
   else

      return false;
}

//**************************
// Detects if the current device is an iPod Touch.
function DetectIpod()
{
   if (uagent.search(deviceIpod) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is an iPad tablet.
function DetectIpad()
{
   if (uagent.search(deviceIpad) > -1  && DetectWebkit())
      return true;
   else
      return false;
}

//**************************
// 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 *any* iOS device: iPhone, iPod Touch, iPad.
function DetectIos()
{
   if (DetectIphoneOrIpod() || DetectIpad())
      return true;
   else
      return false;
}

//**************************
// Detects *any* Android OS-based device: phone, tablet, and multi-media player.
// Also detects Google TV.
function DetectAndroid()
{
   if ((uagent.search(deviceAndroid) > -1) || DetectGoogleTV())
      return true;
   //Special check for the HTC Flyer 7" tablet. It should report here.
   if (uagent.search(deviceHtcFlyer) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is a (small-ish) Android OS-based device
// used for calling and/or multi-media (like a Samsung Galaxy Player).
// Google says these devices will have 'Android' AND 'mobile' in user agent.
// Ignores tablets (Honeycomb and later).
function DetectAndroidPhone()
{
   if (DetectAndroid() && (uagent.search(mobile) > -1))
      return true;
   //Special check for Android phones with Opera Mobile. They should report here.
   if (DetectOperaAndroidPhone())
      return true;
   //Special check for the HTC Flyer 7" tablet. It should report here.
   if (uagent.search(deviceHtcFlyer) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is a (self-reported) Android tablet.
// Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
function DetectAndroidTablet()
{
   //First, let's make sure we're on an Android device.
   if (!DetectAndroid())
      return false;

   //Special check for Opera Android Phones. They should NOT report here.
   if (DetectOperaMobile())
      return false;
   //Special check for the HTC Flyer 7" tablet. It should NOT report here.
   if (uagent.search(deviceHtcFlyer) > -1)
      return false;
         
   //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
   if (uagent.search(mobile) > -1)
      return false;
   else
      return true;
}


//**************************
// Detects if the current device is an Android OS-based device and
//   the browser is based on WebKit.
function DetectAndroidWebKit()
{
   if (DetectAndroid() && DetectWebkit())
      return true;
   else
      return false;
}


//**************************
// Detects if the current device is a GoogleTV.
function DetectGoogleTV()
{
   if (uagent.search(deviceGoogleTV) > -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;
}

//**************************
// 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 a 
// Windows Phone 7 device.
function DetectWindowsPhone7()
{
   if (uagent.search(deviceWinPhone7) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a Windows Mobile device.
// Excludes Windows Phone 7 devices. 
// Focuses on Windows Mobile 6.xx and earlier.
function DetectWindowsMobile()
{
   //Exclude new Windows Phone 7.
   if (DetectWindowsPhone7())
      return false;
   //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;
   //Test for Windows Mobile PPC but not old Macintosh PowerPC.
   if ((uagent.search(devicePpc) > -1) && 
       !(uagent.search(deviceMacPpc) > -1))
      return true;
   //Test for Windwos Mobile-based HTC devices.
   if (uagent.search(manuHtc) > -1 &&
       uagent.search(deviceWindows) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a BlackBerry of some sort.
// Includes the PlayBook.
function DetectBlackBerry()
{
   if (uagent.search(deviceBB) > -1)
      return true;
   if (uagent.search(vndRIM) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is on a BlackBerry tablet device.
//    Example: PlayBook
function DetectBlackBerryTablet()
{
   if (uagent.search(deviceBBPlaybook) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a BlackBerry device AND uses a
//    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
//    Examples: Torch. Includes the Playbook.
function DetectBlackBerryWebKit()
{
   if (DetectBlackBerry() &&
       uagent.search(engineWebKit) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a BlackBerry Touch
//    device, such as the Storm or Torch. Excludes the Playbook.
function DetectBlackBerryTouch()
{
   if (DetectBlackBerry() &&
        ((uagent.search(deviceBBStorm) > -1) ||
        (uagent.search(deviceBBTorch) > -1)))
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a BlackBerry OS 5 device AND
//    has a more capable recent browser. Excludes the Playbook.
//    Examples, Storm, Bold, Tour, Curve2
//    Excludes the new BlackBerry OS 6 browser!!
function DetectBlackBerryHigh()
{
   //Disambiguate for BlackBerry OS 6 (WebKit) browser
   if (DetectBlackBerryWebKit())
      return false;
   if (DetectBlackBerry())
   {
     if (DetectBlackBerryTouch() ||
        uagent.search(deviceBBBold) > -1 || 
        uagent.search(deviceBBTour) > -1 || 
        uagent.search(deviceBBCurve) > -1)
        return true;
     else
        return false;
   }
   else
      return false;
}

//**************************
// Detects if the current browser is a BlackBerry device AND
//    has an older, less capable browser. 
//    Examples: Pearl, 8800, Curve1.
function DetectBlackBerryLow()
{
   if (DetectBlackBerry())
   {
     //Assume that if it's not in the High tier or has WebKit, then it's Low.
     if (DetectBlackBerryHigh() || DetectBlackBerryWebKit())
        return false;
     else
        return true;
   }
   else

      return false;
}


//**************************
// Detects if the current browser is on 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)
   {
     //Make sure it's not WebOS first
     if (DetectPalmWebOS())
        return false;
     else
        return true;
   }
   else
      return false;
}

//**************************
// Detects if the current browser is on a Palm device
//   running the new WebOS.
function DetectPalmWebOS()
{
   if (uagent.search(deviceWebOS) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is on an HP tablet running WebOS.
function DetectWebOSTablet()
{
   if (uagent.search(deviceWebOShp) > -1 &&
       uagent.search(deviceTablet) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a
//   Garmin Nuvifone.
function DetectGarminNuvifone()
{
   if (uagent.search(deviceNuvifone) > -1)
      return true;
   else
      return false;
}


//**************************
// Check to see whether the device is a 'smartphone'.
//   You might wish to send smartphones to a more capable web page
//   than a dumbed down WAP page. 
function DetectSmartphone()
{
   if (DetectIphoneOrIpod() 
      || DetectAndroidPhone()
      || DetectS60OssBrowser()
      || DetectSymbianOS()
      || DetectWindowsMobile()
      || DetectWindowsPhone7()
      || DetectBlackBerry()
      || DetectPalmWebOS()
      || DetectPalmOS()
      || DetectGarminNuvifone())
      return true;

   //Otherwise, return false.
   return false;
};

//**************************
// Detects if the current device is an Archos media player/Internet tablet.
function DetectArchos()
{
   if (uagent.search(deviceArchos) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects whether the device is a Brew-powered device.
function DetectBrewDevice()
{
   if (uagent.search(deviceBrew) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects the Danger Hiptop device.
function DetectDangerHiptop()
{
   if (uagent.search(deviceDanger) > -1 ||
       uagent.search(deviceHiptop) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is on one of 
// the Maemo-based Nokia Internet Tablets.
function DetectMaemoTablet()
{
   if (uagent.search(maemo) > -1)
      return true;
   //For Nokia N810, must be Linux + Tablet, or else it could be something else.
   if ((uagent.search(linux) > -1) 
       && (uagent.search(deviceTablet) > -1)
       && !DetectWebOSTablet()
       && !DetectAndroid())
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is a Sony Mylo device.
function DetectSonyMylo()
{
   if (uagent.search(manuSony) > -1)
   {
     if (uagent.search(qtembedded) > -1 ||
         uagent.search(mylocom2) > -1)
        return true;
     else
        return false;
   }
   else
      return false;
}

//**************************
// Detects if the current browser is Opera Mobile or Mini.
function DetectOperaMobile()
{
   if (uagent.search(engineOpera) > -1)
   {
     if (uagent.search(mini) > -1 ||
         uagent.search(mobi) > -1)
        return true;
     else
        return false;
   }
   else
      return false;
}

//**************************
// Detects if the current browser is Opera Mobile 
// running on an Android phone.
function DetectOperaAndroidPhone()
{
   if ((uagent.search(engineOpera) > -1) &&
      (uagent.search(deviceAndroid) > -1) &&
      (uagent.search(mobi) > -1))
      return true;
   else
      return false;
}

//**************************
// Detects if the current browser is Opera Mobile 
// running on an Android tablet.
function DetectOperaAndroidTablet()
{
   if ((uagent.search(engineOpera) > -1) &&
      (uagent.search(deviceAndroid) > -1) &&
      (uagent.search(deviceTablet) > -1))
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is a Sony Playstation.
function DetectSonyPlaystation()
{
   if (uagent.search(devicePlaystation) > -1)
      return true;
   else
      return false;
};

//**************************
// Detects if the current device is a Nintendo game device.
function DetectNintendo()
{
   if (uagent.search(deviceNintendo) > -1   || 
        uagent.search(deviceWii) > -1 ||
        uagent.search(deviceNintendoDs) > -1)
      return true;
   else
      return false;
};

//**************************
// Detects if the current device is a Microsoft Xbox.
function DetectXbox()
{
   if (uagent.search(deviceXbox) > -1)
      return true;
   else
      return false;
};

//**************************
// Detects if the current device is an Internet-capable game console.
function DetectGameConsole()
{
   if (DetectSonyPlaystation())
      return true;
   if (DetectNintendo())
      return true;
   if (DetectXbox())
      return true;
   else
      return false;
};

//**************************
// Detects if the current device is a Kindle.
function DetectKindle()
{
   if (uagent.search(deviceKindle) > -1)
      return true;
   else
      return false;
}

//**************************
// Detects if the current device is a mobile device.
//  This method catches most of the popular modern devices.
//  Excludes Apple iPads and other modern tablets.
function DetectMobileQuick()
{
   //Let's exclude tablets.
   if (DetectTierTablet())
      return false;

   //Most mobile browsing is done on smartphones
   if (DetectSmartphone())
      return true;

   if (uagent.search(deviceMidp) > -1 ||
        DetectBrewDevice())
      return true;

   if (DetectOperaMobile())
      return true;

   if (uagent.search(engineNetfront) > -1)
      return true;
   if (uagent.search(engineUpBrowser) > -1)
      return true;
   if (uagent.search(engineOpenWeb) > -1)
      return true;

   if (DetectDangerHiptop())
      return true;
      
   if (DetectMaemoTablet())
      return true;
   if (DetectArchos())
      return true;

   if ((uagent.search(devicePda) > -1) &&
        !(uagent.search(disUpdate) > -1)) 
      return true;
   if (uagent.search(mobile) > -1)
      return true;

   if (DetectKindle())
      return true;
      
   return false;
};


//**************************
// Detects in a more comprehensive way if the current device is a mobile device.
function DetectMobileLong()
{
   if (DetectMobileQuick())
      return true;
   if (DetectGameConsole())
      return true;
   if (DetectSonyMylo())
      return true;

   //Detect for certain very old devices with stupid useragent strings.
   if (uagent.search(manuSamsung1) > -1 ||
        uagent.search(manuSonyEricsson) > -1 || 
        uagent.search(manuericsson) > -1)
      return true;

   if (uagent.search(svcDocomo) > -1)
      return true;
   if (uagent.search(svcKddi) > -1)
      return true;
   if (uagent.search(svcVodafone) > -1)

      return true;


   return false;
};


//*****************************
// For Mobile Web Site Design
//*****************************

//**************************
// The quick way to detect for a tier of devices.
//   This method detects for the new generation of
//   HTML 5 capable, larger screen tablets.
//   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
function DetectTierTablet()
{
   if (DetectIpad() 
        || DetectAndroidTablet()
        || DetectBlackBerryTablet()
        || DetectWebOSTablet())
      return true;
   else
      return false;
};

//**************************
// The quick way to detect for a tier of devices.
//   This method detects for devices which can 
//   display iPhone-optimized web content.
//   Includes iPhone, iPod Touch, Android, WebOS, etc.
function DetectTierIphone()
{
   if (DetectIphoneOrIpod())
      return true;
   if (DetectAndroidPhone())
      return true;
   if (DetectBlackBerryWebKit() && DetectBlackBerryTouch())
      return true;
   if (DetectPalmWebOS())
      return true;
   if (DetectGarminNuvifone())
      return true;
   else
      return false;
};

//**************************
// The quick way to detect for a tier of devices.
//   This method detects for devices which are likely to be 
//   capable of viewing CSS content optimized for the iPhone, 
//   but may not necessarily support JavaScript.
//   Excludes all iPhone Tier devices.
function DetectTierRichCss()
{
    if (DetectMobileQuick())
    {
       if (DetectTierIphone())
          return false;
          
       //The following devices are explicitly ok.
       if (DetectWebkit())
          return true;
       if (DetectS60OssBrowser())
          return true;

       //Note: 'High' BlackBerry devices ONLY
       if (DetectBlackBerryHigh())
          return true;
          
       //WP7's IE-7-based browser isn't good enough for iPhone Tier.
       if (DetectWindowsPhone7())
          return true;
       if (DetectWindowsMobile())
          return true;
          
       if (uagent.search(engineTelecaQ) > -1)
          return true;
          
       else
          return false;
    }
    else
      return false;
};

//**************************
// The quick way to detect for a tier of devices.
//   This method detects for all other types of phones,
//   but excludes the iPhone and RichCSS Tier devices.
// NOTE: This method probably won't work due to poor
//  support for JavaScript among other devices. 
function DetectTierOtherPhones()
{
    if (DetectMobileLong())
    {
       //Exclude devices in the other 2 categories
       if (DetectTierIphone() || DetectTierRichCss())
          return false;

       //Otherwise, it's a YES
       else
          return true;
    }
    else
      return false;
};


//**************************
// Initialize Key Stored Values.
function InitDeviceScan()
{
    //We'll use these 4 variables to speed other processing. They're super common.
    isIphone = DetectIphoneOrIpod();
    isAndroidPhone = DetectAndroidPhone();
    isTierIphone = DetectTierIphone();
    isTierTablet = DetectTierTablet();

    //Optional: Comment these out if you don't need them.
    isTierRichCss = DetectTierRichCss();
    isTierGenericMobile = DetectTierOtherPhones();
};

//Now, run the initialization method.
InitDeviceScan()
