/**
 * $Id$
 * 
 * Project:		DNI Site: Javascript Component
 * Version:		0.0.1a
 * Author:		alucas
 * 
 */


if (typeof(discovery) == "undefined") var discovery = {};
if (typeof(discovery.site) == "undefined") discovery.site = {};
if (typeof(discovery.site.env) == "undefined") discovery.site.env = {};
if (typeof(discovery.site.advertising) == "undefined") discovery.site.ui = {};
if (typeof(discovery.site.ui) == "undefined") discovery.site.ui = {};
if (typeof(discovery.site.ui.hat) == "undefined") discovery.site.ui.hat = {};




//#SITE PACKAGE

discovery.site = (function() {
	
	
	//PUBLIC INTERFACE
	
	return {
		
		/**
		 * @void
		 * Initialise modules
		 */
		init: function() {
			
			this.env.init();
		}
	}
})();


//#UPDATE USER OBJECT

if (discovery.USER)
	if (!discovery.USER.info) discovery.USER.info ={};
	
discovery.USER.info.getGeoCode = function() {
	
	var e, geoCode = /**/(e = "US")/**/
			.indexOf("$") >= 0 ? null : e;
			
	discovery.USER.info.getGeoCode = function() {
		return geoCode;
	}
	return geoCode;
}



//#SITE ENVIRONMENT MODULE

discovery.site.env = (function() {
	
	
	//PRIVATE VARS
	
	_initialised = false;
	
	
	//PUBLIC INTERFACE
	
	return {
		
		/**
		 * @void
		 * Initialise module
		 */
		init: function() {
		
			var doc = window.document;
			this.processDocument(doc);
			var adId = 1;
			window.getAdPosition = function() {
				return adId++;
			}
			_initialised = true;
		},
		
		/**
		 * Checks whether the current window has
		 * been initialised
		 * 
		 * @return	{Boolean}
		 */
		isReady: function() {
			
			return _initialised;
		},
		
		/**
		 * @void
		 * Prepares document environment
		 * 
		 * @param	{HTMLDocument}	doc
		 */
		processDocument: function(doc) {
			
			if (doc)
				doc.domain = doc.domain
						.replace(/^.*\.([^\.]*)(\.co\.uk|\.com|\.de)$/,
								"$1$2");
		}
		
	}
})();



//#SITE UI PACKAGE

discovery.site.ui = (function() {
	
	//PRIVATE VARS
	
	var CONFIG = {};
	var _isVoid = function(){};
	
	var HANDLERS = {
		'INIT_IE_FLICKER_FIX': function () {
			try {
				document.execCommand("BackgroundImageCache", false, true);
			} catch(e) {}
			HANDLERS['INIT_IE_FLICKER_FIX'] = _isVoid;
		}
	}
	
	
	//PRIVATE METHODS
	
	function parseSetting(name, obj) {
		var val;
		if ((val = obj[name]))
			(HANDLERS[name]||_isVoid)();
	}
	
	
	//PUBLIC INTERFACE
	
	return {
		
		/**
		 * @void
		 * Initialise modules
		 */
		init: function() {
			
			this.hat.init();
		},
		
		/**
		 * @void
		 * Updates the global site ui config
		 */
		updateConfig: function(conf) {
			
			parseSetting("INIT_IE_FLICKER_FIX", conf);
		}
	}
})();



	//#SITE UI ADVERTISING MODULE
	
	discovery.site.ui.advertising = (function() {
		
		
		//EXTERNALS
		
		var utils = {
			mergeObjects:	discovery.common.object.mergeObjects	
		}
		
		//PRIVATE VARS
		
		var _initialised = false;
		
		var _defaults = {
				
			LEADERBOARD: {
				target: "dni-advertising-leaderboard-wrapper",
				delayInit: true, params: { position: "topbanner" }
			},
			SKYSCRAPER: {
				target: "dni-advertising-skyscraper-wrapper",
				delayInit: true, params: { position: "skyscraper" }
			},
			MPU: {
				target: "dni-advertising-mpu-wrapper",
				delayInit: true, params: { position: "mpu" }
			}
		}
		
		//PRIVATE METHODS
		
		function overrideParams() {
			
			var returnValue;
			
			/**/
			var _CO = "";
			var _COUNTRY = "US";
			/**/
			
			var _GROUPING = document.location.href
					.replace(/.*?\/\/.*?(\/[^\?]*\/).*/, "$1")
			
			if (_CO.indexOf("$") < 0) {
				
				var params = {
					co: _CO, grouping: _GROUPING,
					country: _COUNTRY
				}
				returnValue = params;
				
			} else {
				returnValue = null;
			}
			
			overrideParams = function() { return returnValue }
			return returnValue;
		}
		
		//PUBLIC INTERFACE
		
		return {
			
	
			/**
			 * @void
			 * Initialise page advertising.
			 */
			init: function() {
			
				var advertising;
				if ((advertising = discovery.advertising)) {
					
					var adManager = advertising.createManager(window);
					discovery.PAGE.ADVERTISING = adManager;
	
					var oParams;
					if ((oParams = overrideParams()))
						this.createDefaultPositions(adManager,
								{params: oParams});
						
					_initialised = true;
				}
			},
			
			/**
			 * Checks whether the current page's
			 * advertising has been initialised
			 * 
			 * @return	{Boolean}
			 */
			isReady: function() {
				
				return _initialised;
			},
			
			/**
			 * @void
			 * Creates default ad positions overriding
			 * specified parameters
			 * 
			 * @param	{AdManager}		adManager
			 * @param	{Object}		params
			 */
			createDefaultPositions: function(adManager, params) {
				var merge = utils.mergeObjects;
			
				for (var i in _defaults)
					adManager.createPosition(i, merge({},
							[ _defaults[i], params ]));
			}
			
		}
		
	})();


	
	
	//#HAT MODULE
	
	discovery.site.ui.hat = (function() {
		
		
		//EXTERNALS
		
		var userInfo = discovery.USER.info;
		var services = discovery.authentication.getServices;
		
		var utils = {
			fbLogOut:				discovery.authentication.fb.logUserOut,
			httpGet:				discovery.common.xhr.httpGet,
			each:					discovery.common.object.each,
			getElementsByClassName:	discovery.common.dom.getElementsByClassName,
			addEventListener:		discovery.common.dom.addEventListener
		}
		
		//PRIVATE VARS
		
		var _ids = {
			hat: "dni-hat",
			searchButton: "dni-hat-search-button",
			profile: "dni-profile-info",
			fbLogOut: "facebook-logout"
		}
		
		var _regex = {
			'RETURN_URL': {
				match: /(.*\?(|.*\&)returnUrl=)([^\&]*)/i,
				replace: "$1" + escape(document.location.href)
			}
		}
		
		//EXCEPTIONS
		
		var ProfileInfoNotFound = function(id) {
			throw new Error("Profile Info Element Not Found. Id: " + id);
		}
		
		//PRIVATE METHODS
		
			function replaceButton() {
				if (typeof(this.tagName) !== "undefined") {
					
					var className = this.className;
					var newButton = document.createElement("a");
					newButton.className = this.id + " " + className;
					newButton.innerHTML = this.value;
					newButton.href = "#";
					
					var form = this.form;
					utils.addEventListener.call(newButton, "click",
						function() { form.submit(); return false; }
					);
					
					this.parentNode.insertBefore(newButton,this);
					this.parentNode.removeChild(this);
				}
			}
			
			function replaceSearchButton () {
				
				var element, buttonId = _ids.searchButton;
				if ((element = document.getElementById(buttonId))) {
					replaceButton.call(element);
					return true;
				} else
					return false;
			}
			
			
			//PROFILE WIDGET
			
			function attachFacebookLogout() {
				if (userInfo.isLoggedInViaFacebook()) {
					
					var link;
					var elements = utils.getElementsByClassName
							.call(this.getElement(),
									_ids.fbLogOut);
					
					if (elements.length > 0)
						utils.addEventListener.call(
							elements[0].getElementsByTagName("a")[0],
							"click",
							function() {
								utils.fbLogOut();
								return false;
							}
						);
				}
			}
		
		
		//PUBLIC INTERFACE
		
		return {
			
			/**
			 * Returns the hat element.
			 * 
			 * @return {HTMLElement}
			 */
			getElement: function() {
				
				var element, id = _ids.hat;
				if ((element = document.getElementById(id)))
					this.getElement = function() {
						return element;
					}
				
				return element;
			},
			
			/**
			 * @void
			 * Initialise hat.
			 */
			init: function() {
				var self = this;
				
				if (!this.getElement()) {
					
					utils.addEventListener.call(window, "ready", function() {
						replaceSearchButton();
						attachFacebookLogout.call(self);
					})
				} else {
					
					replaceSearchButton();
					attachFacebookLogout.call(self);
				}
			},
			
			/**
			 * @void
			 * Reloads the UA profile widget.
			 *
			 * @param	{Function}	callback
			 */
			reloadProfileInfo: function(callback) {
				
				var self = this;
				var id = _ids.profile;	
				var regex = _regex['RETURN_URL'];
				
				if ((element = document.getElementById(id))) {
					
					this.reloadProfileInfo = function(callback) {
						
						utils.httpGet(services().PROFILE_WIDGET, function(xhr){
							if (xhr.status.toString()[0] !== "5") {
								
								element.innerHTML = xhr.responseText;
								utils.each(element.getElementsByTagName("a"),
										function() {
									
									var href;
									if ((href = this.href))
										this.href = href.replace(regex.match,
											regex.replace);
								});
								
								if (callback) callback();
								attachFacebookLogout.call(self);
							}
						});
					}
					this.reloadProfileInfo();
				} else
					ProfileInfoNotFound(id);
			}
			
		}
		
	})();
