/// <summary>
        /// Imports posts into the Sitecore
        /// </summary>
        /// <param name="postList"></param>
				public void ImportPosts(PercolatePostList postList)
        {
            try
            {
                Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase(Sitecore.Configuration.Settings.GetSetting("Percolate.Sitecore.MasterDBName"));

                BlogHomeItem blogItem = master.Items.GetItem(SettingsManager.GetSettingsValue("Blog Id"));
								
								//check blog exists
								if (blogItem != null) {
										Template template = TemplateManager.GetTemplate(blogItem.BlogSettings.EntryTemplateID, master);

										BranchItem masterBranch = master.Branches.GetMaster(Sitecore.Modules.WeBlog.Settings.BlogBranchIDString);

										int successCount = 0;

										Log.Info("Percolate Module (PercolateManager ImportPosts()) - Importing posts into Sitecore: " + postList.Count + " posts found", this);

										foreach (PercolatePost post in postList)
										{
											try
											{
												//TODO: lookup the post based on the id first

												string postTitle = ItemUtil.ProposeValidItemName(SettingsManager.GetFieldMapping(PercolateConstants.Fields.Title, post));

												//Switch to user we wish to post as
												Sitecore.Security.Accounts.User scUser = Sitecore.Security.Accounts.User.FromName(post.User.Name, false);

												using (new UserSwitcher(scUser))
												{

													if (!_testMode)
													{

														//add post
														EntryItem entryItem = ItemManager.AddFromTemplate(postTitle, template.ID, blogItem);

														//add field values

														entryItem.BeginEdit();

														entryItem.Title.Field.Value = postTitle;
														entryItem.Content.Field.Value =
																SettingsManager.GetFieldMapping(PercolateConstants.Fields.Content, post);
														entryItem.Tags.Field.Value =
																SettingsManager.GetFieldMapping(PercolateConstants.Fields.Tags, post);
														entryItem.InnerItem.Fields[FieldIDs.Created].Value =
																DateUtil.ToIsoDate(DateTime.Parse(post.CreatedAt));

														//add image and assign to field
														if (!string.IsNullOrEmpty(post.Media.Src))
														{
															MediaItem image = CreateMedia(post);
															AssignMediaItem(entryItem.InnerItem.Fields[PercolateConstants.Fields.Image], image);
														}

														//add categories
														if (post.Categories != null)
														{
															if (post.Categories.Count > 0)
															{
																List<string> cats = new List<string>();
																foreach (PercolateCategory category in post.Categories)
																{
																	try
																	{
																		CategoryItem categoryItem =
																			ManagerFactory.CategoryManagerInstance.Add(category.Name, blogItem);
																		cats.Add(categoryItem.ID.ToString());
																	}
																	catch (Exception ex)
																	{
																		Log.Error(
																			"Percolate Module (PercolateManager ImportPosts()) - caused an unhandled exception",
																			ex, this);
																	}
																}
																if (cats.Count > 0)
																{
																	entryItem.Category.Field.Value = string.Join("|", cats.ToArray());
																}
															}
														}

														entryItem.EndEdit();

														successCount += 1;
													}
													else
													{
														Log.Info(
																"Percolate Module (PercolateManager ImportPosts()) - post details:"
																+ " title > " + postTitle + ", "
																+ " body (truncated) > " +
																SettingsManager.GetFieldMapping(PercolateConstants.Fields.Content, post).Substring(0, 40) + "..., "
																+ " tags > " +
																SettingsManager.GetFieldMapping(PercolateConstants.Fields.Tags, post) + ", "
																+ " date > " + DateUtil.ToIsoDate(DateTime.Parse(post.CreatedAt)) + ", "
																, this);
													}
												}

											}
											catch (Exception ex)
											{
												Log.Error("Percolate Module (PercolateManager ImportPosts()) - post: " + post.Title + " - caused an unhandled exception", ex, this);
											}

										}

										if (!_testMode)
										{
											//update the last run date
											SettingsManager.SetSettingsValue(PercolateConstants.SettingsFields.LastRunDate,
													DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
										}

										Log.Info("Percolate Module (PercolateManager ImportPosts()) - Import Complete - " + successCount + " posts imported", this);

										if (_testMode)
										{
											Log.Info("Percolate Module (PercolateManager ImportPosts()) - TEST MODE COMPLETE", this);
										}
								}
								else
								{
									Log.Error("Percolate Module (Percolate Manager Importposts()) - You must enter a valid Blog Id", new Exception(), this);
								} 
            }
            catch (Exception ex)
            {
                Log.Error("Percolate Module (PercolateManager ImportPosts()) - caused an unhandled exception", ex, this);
            }
        }
        /// <summary>
        /// get posts from the Percolate API
        /// </summary>
        /// <returns></returns>
				public PercolatePostList GetPosts()
        {
            Log.Info("Percolate Module (Percolate Manager GetPosts()) - Getting posts from Percolate", this);

						PercolatePostList totalPostList = new PercolatePostList();
						PercolatePostList postList = new PercolatePostList();

            try
            {
							//get paramaters from settings and Sitecore
              string toDays = Configuration.Settings.GetSetting("Percolate.ImportDateToDays");
              string startDateSetting = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.ImportFromDate);
              string startDate = DateTime.Parse(startDateSetting).ToString("yyyy-MM-dd");
              string endDate = DateTime.Now.AddDays(int.Parse(toDays)).ToString("yyyy-MM-dd");
              string channelId = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.ChannelId);
              string licenceId = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.LicenceId);
              string apiKey = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.APIKey);
							string limit = Configuration.Settings.GetSetting("Percolate.PostLimit");

							//check API Key and Licence Id are populated
	            if (!string.IsNullOrEmpty(apiKey) && !string.IsNullOrEmpty(licenceId))
	            {
		            //pick up last run date and move startdate to this if it is set.
		            string lastRunDateSetting = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.LastRunDate);
		            if (!string.IsNullOrEmpty(lastRunDateSetting))
		            {
			            startDate = DateTime.Parse(lastRunDateSetting).ToString("yyyy-MM-dd");
		            }

		            Log.Info("Percolate Module (Percolate Manager GetPosts()) - Start Date: " + startDate, this);

		            //build request url
		            string reqbaseUrl = Configuration.Settings.GetSetting("Percolate.Weblog.BaseUrl");
		            string reqPostUrl = Configuration.Settings.GetSetting("Percolate.Weblog.PostSetApiUrl");

		            string reqApiUrl = string.Format("{0}?api_key={1}&license_id={2}", reqPostUrl, apiKey, licenceId);
		            string reqParams = string.Format(
			            "&created_at_start={0}&created_at_end={1}&order_direction=desc&limit={2}", startDate, endDate, limit);

		            if (!string.IsNullOrEmpty(channelId))
		            {
			            reqParams = reqParams + string.Format("&channel_ids={0}", channelId);
		            }

		            //call the API 1 or more times (depending on pages found)
		            postList = MakeAPIRequest(string.Format("{0}{1}{2}", reqbaseUrl, reqApiUrl, reqParams));

		            if (postList != null)
		            {
			            //get pages
			            int totalPages = (int.Parse(postList.Paging.Total) + int.Parse(postList.Paging.Limit) - 1)/
			                             int.Parse(postList.Paging.Limit);

			            //add to main list
			            if (postList.Count > 0)
			            {
				            totalPostList.AddRange(postList);
				            totalPostList.Paging = postList.Paging;
			            }

			            //if totalPages is more than 1 then get the next pages
			            for (int i = 1; i < totalPages; i++)
			            {
				            int pageNo = i + 1;

				            //call the API again
				            postList = MakeAPIRequest(string.Format("{0}{1}{2}&page={3}", reqbaseUrl, reqApiUrl, reqParams, pageNo));
				            if (postList.Count > 0)
				            {
					            //add to main list
					            totalPostList.AddRange(postList);
				            }
			            }
		            }
	            }
	            else
	            {
								Log.Error("Percolate Module (Percolate Manager Getposts()) - You must enter your API Key and Licence Id", new Exception(), this);
	            }
            }
						catch (WebException ex)
						{
							string resp;
							using (Stream dataStream = ex.Response.GetResponseStream())
							{
								using (StreamReader reader = new StreamReader(dataStream))
								{
									resp = reader.ReadToEnd();
								}
							}

							Log.Error("Percolate Module (Percolate Manager Getposts()) - Web Request - caused an unhandled exception: " + resp, ex, this);
						}
            catch (Exception ex)
            {
                Log.Error("Percolate Module (Percolate Manager Getposts()) - caused an unhandled exception", ex, this); 
            }

            return totalPostList;
        }
				/// <summary>
				/// Calls Percolate API
				/// </summary>
				/// <param name="requestString"></param>
				/// <returns></returns>
				public PercolatePostList MakeAPIRequest(string requestString)
				{
					PercolatePostList postList = new PercolatePostList();

					HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestString);
					request.Method = WebRequestMethods.Http.Get;
					request.Accept = "application/json";

					// Get response  
					using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
					{
						// Get the response stream  
						StreamReader reader = new StreamReader(response.GetResponseStream());

						// Serialise to object
						var json = reader.ReadToEnd();

						var paging = JObject.Parse(json).SelectToken("pagination").ToString();

						var pagingInfo = (PercolatePaging)JsonConvert.DeserializeObject(paging.ToString(), typeof(PercolatePaging));

						var posts = JObject.Parse(json).SelectToken("data").ToString();

						if (posts != null)
						{
							postList = (PercolatePostList)JsonConvert.DeserializeObject(posts.ToString(), typeof(PercolatePostList));
							postList.Paging = pagingInfo;
						}
					}

					return postList;
				}