/* Silently create the discover namespace if it doesn't exist already */
if (typeof discover === 'undefined') {
	var discover = {};
}

/**
 * The Discover ZIG Tracking Library
 * 
 * Note: This is a module, not a constructor. 
 * 
 * @namespace discover
 * @class     discover.zig
 * @author    Michael Girouard (mgirouard@mcdpartners.com)
 */
discover.zig = function () {
	
	/**
	 * Converts an object to a query string
	 * 
	 * @param   {Object} obj Any enumerable object
	 * @return  {String}
	 * @private
	 */
	var objectToQuerySring = function (obj) {
		var out = [];
		
		for (var paramName in obj) {
			var paramValue = obj[paramName];
			out.push(paramName + '=' + encodeURIComponent(paramValue));
		}
		
		return out.join(discover.zig.argumentSeparator);
	};
	
	/**
	 * Insures that default parameters are set in the provided query string
	 * 
	 * @param   {Object} queryString An object of name/value pairs
	 * @return  {Object}
	 * @private
	 */
	var prepareDefaultParams = function (queryString) {
		queryString = queryString || {};
		
		var out = {};
		
		/* Copy all original values into the out object. This prevents unwanted
		 * modification of the original object which is passed by reference. */
		for (var i in queryString) {
			out[i] = new String(queryString[i]);
		}
		
		if (!out.log) {
			out.log = 1;
		}
		
		if (!out.dt) {
			out.dt = document.title;
		}
		
		if (!out.dr) {
			out.dr = document.referrer;
		}
		
		if (!out.dd) {
			out.dd = document.location.hostname;
		}
		
		if (!out.dl) {
			out.dl = document.location.pathname;
		}
		
		if (!out.cb) {
			out.cb = new Date().getTime();
		}
		
		return out;
	};
	
	/**
	 * Creates a new Image instance & sets a trackable src attribute
	 * 
	 * @param {Object} queryString The query string to append to the image
	 */
	var callZagImage = function (queryString) {
		var tempImage = new Image();
		tempImage.src = discover.zig.zagPath + '?' + objectToQuerySring(queryString);
	};
	
	/* The Public API */
	return {
		
		/**
		 * The path to the tracking image
		 * 
		 * @type {String}
		 */
		zagPath : '/zag.gif',
		
		/**
		 * The character to use as a argument separator in the query string
		 * 
		 * Defaults to "&". In most cases this won't need to change, but some 
		 * configurations use a semicolon (;) as an argument separator.
		 * 
		 * @type {String}
		 */
		argumentSeparator : '&',
		
		/**
		 * A document-organized tracking campaign
		 * 
		 * Provides a container to store an entire tracking campaign into a 
		 * single document-organized structure.
		 * 
		 * @type {Object}
		 */
		campaign : {},
		
		/**
		 * Prepares an tracking campaign on a page
		 * 
		 * @param    {Object} pageCampaign An ID-sorted
		 * @requires mcd.dom
		 * @requires mcd.event 
		 */
		preparePageCampaign : function (pageCampaign) {
			if (typeof mcd === 'undefined' || 
				!('dom' in mcd) || 
				!('event' in mcd)) {
				
				throw "Missing dependencies: mcd.dom, mcd.event";
				return;
			}
			
			pageCampaign = pageCampaign || {};
			
			for (var elementId in pageCampaign) {
				var element        = mcd.dom.getElement(elementId);
				
				if (element) {
					mcd.event.add(element, 'click', function () {
						discover.zig.track(pageCampaign[this.id]);
					});
				}
			}
		},
		
		/**
		 * Manual track method
		 * 
		 * This is useful for custom configurations, callbacks, and complex
		 * rich-media calls.
		 * 
		 * @param {Object} queryString an object of name/value pairs
		 */
		track : function (queryString) {
			queryString = prepareDefaultParams(queryString);
			callZagImage(queryString);
		}
	};
	
}(); /* Self invoke to create a private API via closure */
