function ParseXML( xml ){if( window.ActiveXObject && window.GetObject ){var dom = new ActiveXObject( "Microsoft.XMLDOM" );dom.loadXML( xml );return( dom );}if( window.DOMParser ){return( new DOMParser().parseFromString( xml, "text/xml" ) );throw new Error( "No XML parser available" );}}
function urldecode( str ) {var histogram = {};var ret = str.toString();var replacer = function(search, replace, str) {var tmp_arr = [];tmp_arr = str.split(search);return tmp_arr.join(replace);};histogram["'"]   = '%27';histogram['(']   = '%28';histogram[')']   = '%29';histogram['*']   = '%2A';histogram['~']   = '%7E';histogram['!']   = '%21';histogram['%20'] = '+';histogram['\u00DC'] = '%DC';histogram['\u00FC'] = '%FC';histogram['\u00C4'] = '%D4';histogram['\u00E4'] = '%E4';histogram['\u00D6'] = '%D6';histogram['\u00F6'] = '%F6';histogram['\u00DF'] = '%DF';histogram['\u20AC'] = '%80';histogram['\u0081'] = '%81';histogram['\u201A'] = '%82';histogram['\u0192'] = '%83';histogram['\u201E'] = '%84';histogram['\u2026'] = '%85';histogram['\u2020'] = '%86';histogram['\u2021'] = '%87';histogram['\u02C6'] = '%88';histogram['\u2030'] = '%89';histogram['\u0160'] = '%8A';histogram['\u2039'] = '%8B';histogram['\u0152'] = '%8C';histogram['\u008D'] = '%8D';histogram['\u017D'] = '%8E';histogram['\u008F'] = '%8F';histogram['\u0090'] = '%90';histogram['\u2018'] = '%91';histogram['\u2019'] = '%92';histogram['\u201C'] = '%93';histogram['\u201D'] = '%94';histogram['\u2022'] = '%95';histogram['\u2013'] = '%96';histogram['\u2014'] = '%97';histogram['\u02DC'] = '%98';histogram['\u2122'] = '%99';histogram['\u0161'] = '%9A';histogram['\u203A'] = '%9B';histogram['\u0153'] = '%9C';histogram['\u009D'] = '%9D';histogram['\u017E'] = '%9E';histogram['\u0178'] = '%9F';for (replace in histogram) {search = histogram[replace];ret = replacer(search, replace, ret)}ret = decodeURIComponent(ret);return ret;}

var $Share = function()
{
	this.parameters =	null;

	//Builds service information returns a JSON object
	this.BuildService = function( parameters )
	{
		var newService			= new Object();
		var uri					= "";
		var serviceNode			= this.GetServiceById( parameters.service );
		var serviceAttributes 	= serviceNode.childNodes;
		
		//Adding URI host + path to application that will handle the requests.
		uri 					+= serviceNode.getAttribute( "uri" ) + "?";

		for( var i = 0; i < serviceAttributes.length; i++ )
		{
			var paramValue = serviceAttributes.item( i ).getAttribute( "value" );
			
			//Adding key into querystring
			uri += serviceAttributes.item( i ).getAttribute( "var" ) + "=";
			
			if( paramValue.indexOf( "$" ) != -1 )
			{
				//Adding dynamic key value into querystring
				uri += encodeURIComponent( parameters[ paramValue.replace( "$", "" ) ] );
			}
			else
			{
				//Adding static key value into querystring
				uri += encodeURIComponent( paramValue );
			}

			if( i + 1 != serviceAttributes.length )
			{
				uri += "&";
			}	
		}
		
		//If request for service icon
		if( parameters.getImages === true )
		{
			newService.image		= new Image();
			newService.image.src	= "http://projects.yvonviger.com/share/inc/images/services/" + serviceNode.getAttribute( "id" ) + ".png";
		}
		
		//Setting service values and returning them
		newService.id			= serviceNode.getAttribute( "id" );
		newService.name			= serviceNode.getAttribute( "name" );
		newService.link			= uri;
		
		return newService;
	};
	
	this.BuildServices = function( parameters )
	{
		var results		= new Array();
		for( var i = 0; i < parameters.services.length; i++ )
		{
			parameters.service = parameters.services[ i ];
			results.push( this.BuildService( parameters ) );
		}

		return parameters.method( results );
	};

	this.GetServiceById = function( id )
	{
		if( !$serviceData )
		{
			throw new Error( "Service Data XML has not been set!" );
		}
		var services = $serviceData.documentElement.childNodes;
		for( var i = 0; i < services.length; i++ )
		{
			if( services.item( i ).getAttribute( "id" ) == id ) return services.item( i );
		}
	};
	
	this.SetParameters = function( parameters )
	{
		this.parameters = parameters;
	};
	
	this.Generate = function()
	{
		return this.BuildServices( this.parameters )
	}
	return this;
};
$serviceData = ParseXML( urldecode( '%3C%3Fxml+version%3D%221.0%22%3F%3E%3Cmcmsh%3Aroot+xmlns%3Amcmsh%3D%22http%3A%2F%2Fshare.dev.thinkmcmillan.com%2Fns%2Fmcmsh%2F1.0%22%3E%3Cmcmsh%3Aservice+id%3D%22digg%22+name%3D%22Digg%22+uri%3D%22http%3A%2F%2Fdigg.com%2Fsubmit%22%3E%3Cmcmsh%3Aparam+var%3D%22phase%22+value%3D%222%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22delicious%22+name%3D%22del.icio.us%22+uri%3D%22http%3A%2F%2Fdel.icio.us%2Fpost%22%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22facebook%22+name%3D%22Facebook%22+uri%3D%22http%3A%2F%2Fwww.facebook.com%2Fshare.php%22%3E%3Cmcmsh%3Aparam+var%3D%22t%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22u%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22google%22+name%3D%22Google%22+uri%3D%22http%3A%2F%2Fwww.google.com%2Fbookmarks%2Fmark%22%3E%3Cmcmsh%3Aparam+var%3D%22op%22+value%3D%22edit%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22bkmk%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22linkedin%22+name%3D%22LinkedIn%22+uri%3D%22http%3A%2F%2Fwww.linkedin.com%2FshareArticle%22%3E%3Cmcmsh%3Aparam+var%3D%22mini%22+value%3D%22true%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22source%22+value%3D%22%24source%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22summary%22+value%3D%22%24summary%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22live%22+name%3D%22Live%22+uri%3D%22https%3A%2F%2Ffavorites.live.com%2Fquickadd.aspx%22%3E%3Cmcmsh%3Aparam+var%3D%22marklet%22+value%3D%221%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22magnolia%22+name%3D%22Ma.gnolia%22+uri%3D%22http%3A%2F%2Fma.gnolia.com%2Fbookmarklet%2Fadd%22%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22myspace%22+name%3D%22MySpace%22+uri%3D%22http%3A%2F%2Fwww.myspace.com%2FModules%2FPostTo%2FPages%2F%22%3E%3Cmcmsh%3Aparam+var%3D%22t%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22c%22+value%3D%22%24summary%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22u%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22newsvine%22+name%3D%22NewsVine%22+uri%3D%22http%3A%2F%2Fwww.newsvine.com%2F_tools%2Fseed%26amp%3Bsave%22%3E%3Cmcmsh%3Aparam+var%3D%22h%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22u%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22reddit%22+name%3D%22Reddit%22+uri%3D%22http%3A%2F%2Freddit.com%2Fsubmit%22%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22slashdot%22+name%3D%22Slashdot%22+uri%3D%22http%3A%2F%2Fslashdot.org%2Fbookmark.pl%22%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22stumbleupon%22+name%3D%22StumbleUpon%22+uri%3D%22http%3A%2F%2Fwww.stumbleupon.com%2Fsubmit%22%3E%3Cmcmsh%3Aparam+var%3D%22title%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22url%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22technorati%22+name%3D%22Technorati%22+uri%3D%22http%3A%2F%2Ftechnorati.com%2Ffaves%22%3E%3Cmcmsh%3Aparam+var%3D%22add%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22twitter%22+name%3D%22TwitThis%22+uri%3D%22http%3A%2F%2Ftwitter.com%2Fhome%22%3E%3Cmcmsh%3Aparam+var%3D%22status%22+value%3D%22%24link%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3Cmcmsh%3Aservice+id%3D%22yahoo%22+name%3D%22Yahoo%21+Buzz%22+uri%3D%22http%3A%2F%2Fbuzz.yahoo.com%2Fsubmit%2F%22%3E%3Cmcmsh%3Aparam+var%3D%22submitHeadline%22+value%3D%22%24title%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22submitUrl%22+value%3D%22%24link%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22submitSummary%22+value%3D%22%24summary%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22submitCategory%22+value%3D%22%3F%3F%3Ftype%3F%3F%22+%2F%3E%3Cmcmsh%3Aparam+var%3D%22submitAssetType%22+value%3D%22text%22+%2F%3E%3C%2Fmcmsh%3Aservice%3E%3C%2Fmcmsh%3Aroot%3E' ) );