/*!
 * JS Redirection Mobile
 *
 * Developed by
 * Sebastiano Armeli-Battana (@sebarmeli) - http://sebarmeli.com
 * Release under the MIT licence
 */	
/*
	Copyright (c) 2011 Sebastiano Armeli-Battana (http://sebarmeli.com)
	
	Permission is hereby granted, free of charge, to any person obtaining
	a copy of this software and associated documentation files (the
	"Software"), to deal in the Software without restriction, including
	without limitation the rights to use, copy, modify, merge, publish,
	distribute, sublicense, and/or sell copies of the Software, and to
	permit persons to whom the Software is furnished to do so, subject to
	the following conditions:

	The above copyright notice and this permission notice shall be
	included in all copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
	LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
	OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
	WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
	*/

	/*
	 * This script will cover a basic scenario of full JS mobile redirection.
	 * The user will be redirected to the mobile version of the site (home page)
	 * if it's trying to access the site from a mobile device. This check is
	 * mainly done checking the User-Agent string. 
	 * The mobile URL will be obtained appending a prefix (default is "m") to 
	 * the hostname of the current URL. It's used a naked domain to avoid conflict with
	 * www.
	 * 
	 * In some cases the user needs to be redirected to the Desktop version of the site 
	 * from a mobile device. This happens when the user clicks on a link such as "Go to full site"
	 * or when there is a specific parameter in the querystring.
	 *
	 * In that case a new key/value in sessionStorage (for modern browsers) 
	 * will be set and until the user doesn't close browser window or tab it will access
	 * to the desktop version from a mobile device. There is a fallback for old browsers that
	 * donít support sessionStorage, and it will use a cookie. The cookie will expiry in one hour 
	 * (default value) or you configure the expiry time.
	 * 
* To use this function, you need to call it as SA.redirection_mobile(config);
	 * E.g. SA.redirection_mobile ({redirection_paramName : "modile_redirect", mobile_prefix : "mobile", cookie_hours : "2" })
	 * or
	 * E.g. SA.redirection_mobile ({mobile_url : "mobile.whatever.com/example", mobile_sheme : "https" })
	 * or
	 * E.g. SA.redirection_mobile ({mobile_prefix : "mobile", mobile_scheme : "https"})
	 * or
	 * E.g. SA.redirection_mobile ({mobile_prefix : "mobile", mobile_scheme : "https", redirection_paramName : "modile_redirect"})
	 *
	 * @link http://github.com/sebarmeli/JS-Redirection-Mobile-Site/
	 * @author Sebastiano Armeli-Battana
	 * @version 0.7
	 * @date 21/01/2011 
	 * 
*/
	
/*globals window,document, navigator, SA */
if (!window.SA) {window.SA = {};}

/*
* @param config object containing three properties:
*			- mobile_prefix : prefix appended to the hostname (such as "m" to redirect to "m.domain.com")
*			- mobile_url : mobile url to use for the redirection (such as "whatever.com" to redirect to "whatever.com" )
*			- mobile_scheme : url scheme (http/https) of the mobile site domain
*			- cookie_hours : number of hours the cookie needs to exist after redirection to desktop site
*			- redirection_paramName : parameter to pass in the querystring of the URL to avoid the redirection (the value must be equal to "false").
*									It's also the name of the item in the localStorage (or cookie name) to avoid mobile
*									redirection. Default value is "mobile_redirect". Eg: http://domain.com?mobile_redirect=false
*/
SA.redirection_mobile = function(config) {

	// Helper function for adding time to the current date
	var addTimeToDate = function(msec) {

		// Get the current date
		var exdate = new Date();

		// Add time to the date
		exdate.setTime(exdate.getTime() + msec);

		//Return the new Date
		return exdate;

	};

	// Helper function for getting a value from a parameter in the querystring
	var getQueryValue = function(param) {

		if (!param) {
			return;
		}

		var querystring = document.location.search,
			queryStringArray = querystring && querystring.substring(1).split("&"),
			i = 0,
			length = queryStringArray.length;

		for (; i < length; i++) {
			var token = queryStringArray[i],
				firstPart = token && token.substring(0, token.indexOf("="));
			if (firstPart === param ) {
				return token.substring(token.indexOf("=") + 1, token.length);
			}
		}

	};
				
	// Retrieve the User Agent of the browser
	var agent = navigator.userAgent.toLowerCase(),
	
		// Constants
		FALSE = "false",

		// configuration object
		config = config || {};
	
		// parameter to pass in the URL to avoid the redirection
		redirection_param = config.redirection_paramName || "mobile_redirect",
		
		// prefix appended to the hostname
		mobile_prefix = config.mobile_prefix || "m",
		
		// new url for the mobile site domain 
		mobile_url = config.mobile_url,
		
		// protocol for the mobile site domain 
		mobile_protocol = config.mobile_scheme ?
							config.mobile_scheme + ":" :
								document.location.protocol,
		
		// URL host of incoming request
		host = document.location.host,

		// value for the parameter passed in the URL to avoid the redirection
		queryValue = getQueryValue(redirection_param),

		// Compose the mobile hostname considering "mobile_url" or "mobile_prefix" + hostname
		mobile_host = mobile_url ||
						(mobile_prefix + "." + 
							(!!host.match(/^www\./i) ?
								host.substring(4) : 
									host)),

		// Expiry hours for cookie
		cookie_hours = config.cookie_hours || 1,

		// Check if the UA is a mobile one (iphone, ipod, ipad, android, blackberry)
// *disabled 8/17/11 by JEO		isUAMobile =!!(agent.match(/(iPhone|iPod|iPad|blackberry|android|htc|kindle|lg|midp|mmp|mobile|nokia|opera mini|palm|pocket|psp|sgh|smartphone|symbian|treo mini|Playstation Portable|SonyEricsson|Samsung|MobileExplorer|PalmSource|Benq|Windows Phone|Windows Mobile|IEMobile|Windows CE|Nintendo Wii)/i));
		isUAMobile =!!(agent.match(/(blackberry|android|htc|kindle|lg|midp|mmp|nokia|opera mini|palm|pocket|psp|sgh|smartphone|symbian|treo mini|Playstation Portable|SonyEricsson|Samsung|MobileExplorer|PalmSource|Benq|Windows Phone|Windows Mobile|IEMobile|Windows CE)/i));


	// Check if the referrer was a mobile page (probably the user clicked "Go to full site") or in the 
	// querystring there is a parameter to avoid the redirection such as "?mobile_redirect=false"
	// (in that case we need to set a variable in the sessionStorage or in the cookie)
	if (document.referrer.indexOf(mobile_host) >= 0 || queryValue === FALSE ) {

		if (window.sessionStorage) {
			window.sessionStorage.setItem(redirection_param, FALSE);
		} else {
			document.cookie = redirection_param + "=" + FALSE + ";expires="+
								addTimeToDate(3600*1000*cookie_hours).toUTCString();
		}
	}

	// Check if the sessionStorage contain the parameter
	var isSessionStorage = (window.sessionStorage) ? 
							(window.sessionStorage.getItem(redirection_param) === FALSE) :
								false,
		
		// Check if the Cookie has been set up
		isCookieSet = document.cookie ? 
						(document.cookie.indexOf(redirection_param) >= 0) :
							false;

	// Check that User Agent is mobile, cookie is not set or value in the sessionStorage not present
	if (isUAMobile && !(isCookieSet || isSessionStorage)) {
		document.location.href = mobile_protocol + "//" + mobile_host;
	} 
};	
