// Requires environ dict to be included first

if (!window['netShelter']) 
	window['netShelter'] = {};

netShelter.ShareTarget = {
	"DELICIOUS":	'delicious',
	"DIGG":			'digg',
	"EMAIL":		'email',
	"EMBED":		'embed',
	"FACEBOOK":		'facebook',
	"GOOGLE_PLUS":	'google_plus',
	"LINKEDIN":		'linkedin',
	"REDDIT":		'reddit',
	"TWITTER":		'twitter'
}

netShelter.getShareMetadata = function(
	contentPath, 
	callback, 
	messageTitle, 
	messageBody, 
	shareTargetList, 
	shareBarMetadata
) {
	/*  getShareMetadata is a wrapper around the NetShelter Sharing API.  It takes the following arguments:
	 *	
	 *  - contentPath is the URL to the content the user is trying to share.
	 *	
	 *	- callback should be a function that takes one argument, sharePath, 
	 *	  which is a dict of share paths, keyed by target (e.g. 
	 *		{'facebook': 'url_to_fb'}).  
	 *	  It should persist the object into the appropriate model, and update the appropriate share buttons.
	 *	
	 *	- messageTitle will be the message shared on Facebook and Twitter, as well as the e-mail subject.
	 *	
	 *	- messageBody will be the e-mail body.
	 *	
	 *	- shareTargetList is a list of services to share one.  Use the constants in netShelter.ShareTarget.
	 *	
	 *	- shareBarMetadata
	 */

	// If the first argument is a dict, use it to populate the arguments.
	if (typeof(contentPath) != 'string') {
		var argumentDict = arguments[0];
		
		contentPath =		argumentDict.contentPath;
		callback =			argumentDict.callback;
		messageTitle =		argumentDict.messageTitle;
		messageBody =		argumentDict.messageBody;
		shareTargetList =	argumentDict.shareTargetList;
		shareBarMetadata =		argumentDict.shareBarMetadata;
	}
	
	if (!netShelter._pendingShareCallback)
		netShelter._pendingShareCallback = [];
	
	var callbackKey = [new Date().valueOf(), Math.round(Math.random() * 1000000000)].join('');
	
	with (netShelter) {
		shareTargetList = shareTargetList || [
			ShareTarget.DELICIOUS,
			ShareTarget.DIGG,
			ShareTarget.EMAIL,
			ShareTarget.FACEBOOK,
			ShareTarget.LINKEDIN,
			ShareTarget.REDDIT,
			ShareTarget.TWITTER
		];
	}	

	messageTitle =	messageTitle	|| "";
	messageBody =	messageBody		|| "I thought you'd enjoy this:\n\n";

	if (shareBarMetadata) {
		shareBarMetadata.title =		shareBarMetadata.title			|| "Shared content";
		shareBarMetadata.bottomAlign =	shareBarMetadata.bottomAlign	|| false;
		shareBarMetadata.height =		shareBarMetadata.height		|| 90;
		shareBarMetadata.useJSON =		shareBarMetadata.useJSON		|| false;
	}

	// Aliasing encodeURIComponent to make the multi-encoded code more readable
	var enc = encodeURIComponent;
	
	var requestDict = {
	 	"cn":	campaignSettings['NAME'],
	 	"st":	shareTargetList.join(','),
	 	"pu":	contentPath,

		// returned data format = {0: XML, 1: JSONP}
		"ft":	1,
		"fn":	"netShelter._pendingShareCallback['" + callbackKey + "']"
	}

	if (shareBarMetadata && shareBarMetadata.hasOwnProperty("path")) {
		requestDict["tu"] = shareBarMetadata['path'];
		requestDict["th"] = shareBarMetadata['height'];
		requestDict["tp"] = Number(shareBarMetadata['bottomAlign']);
		requestDict["rt"] = Number(shareBarMetadata['useJSON']);
		
		if (shareBarMetadata.hasOwnProperty('title'))
			requestDict["pt"] = shareBarMetadata['title'];
	}
	
	function encodeForAPI(dict) {
		var encodedPairs = [];
	
		for (var key in dict) {
			encodedPairs.push(enc(enc(key)) + '=' + enc(enc(dict[key])));
		}
	
		return encodedPairs.join(';');
	}
	
	var requestPath = environ['SHARE_API_PATH'] + encodeForAPI(requestDict);

	netShelter._pendingShareCallback[callbackKey] = function(value) {
		var shareMetadata = {};
		var sharePathSuffix = {};
		
		with (netShelter) {
			sharePathSuffix[ShareTarget.DELICIOUS] = enc(enc("http://www.delicious.com/share/delicious?title=" + enc(messageTitle) + "&url="));
			sharePathSuffix[ShareTarget.DIGG] = enc(enc("http://digg.com/submit?phase=3&title=" + enc(messageTitle) + "&url="));
			sharePathSuffix[ShareTarget.EMAIL] = enc(enc("mailto:?subject=" + enc(messageTitle) + "&body=" + enc(messageBody)));
			sharePathSuffix[ShareTarget.FACEBOOK] = enc(enc("http://www.facebook.com/sharer.php?t=" + enc(messageTitle) + "&u="));
			sharePathSuffix[ShareTarget.LINKEDIN] = enc(enc("http://www.linkedin.com/cws/share?url="));
			sharePathSuffix[ShareTarget.REDDIT] = enc(enc("http://www.reddit.com/submit?title=" + enc(messageTitle) + "&url="));
			sharePathSuffix[ShareTarget.TWITTER] = enc(enc("http://twitter.com/share?text=" + enc(messageTitle) + "&url="));

			for (var i = 0; i < shareTargetList.length; i++) {
				var shareTarget = shareTargetList[i];

				shareMetadata[shareTarget] = {
					"count":	parseInt(value[shareTarget].count),
					"path":		value[shareTarget].url  + sharePathSuffix[shareTarget]
				}
			}
		}

		callback(shareMetadata);
		
		delete netShelter._pendingShareCallback[callbackKey];
	}
	
	var script = document.createElement('script');
	script.setAttribute('type', 'text/javascript');
	script.setAttribute('src', requestPath);
	
	//IE7 doesn't like document.head
	document.getElementsByTagName('head')[0].appendChild(script);
}

netShelter.frameWithShareBar = function(contentPath, contentTitle, storyFeedPath, shareBarSettingsPath) {
	if (!shareBarSettingsPath && campaignSettings && campaignSettings.hasOwnProperty('SHARE_BAR_SETTINGS_PATH'))
		shareBarSettingsPath = campaignSettings['SHARE_BAR_SETTINGS_PATH'];
	
	return environ['SHARE_BAR_FRAMESET_PATH']
		+ "?"
		+ netShelter.dictToQueryString({
			'content_path':			contentPath,
			'content_title':		contentTitle,
			'story_feed_path':		storyFeedPath,
			'settings_path':		shareBarSettingsPath,
			'site':					netShelter.trackingInfo.site,
			'experienceID':			netShelter.trackingInfo.experienceID,
			'parent':				netShelter.trackingInfo.creative
		})
	;
}
