public override object GetValue(global::Sitecore.Data.Items.Item item,  ISitecoreService service)
        {

            var itemField = base.GetField(item);

            if (itemField == null || itemField.Value.Trim().IsNullOrEmpty()) return null;
            
            

            Link link = new Link();
            LinkField field = new LinkField(itemField);

            switch (field.LinkType)
            {
                case "anchor":
                    link.Url = field.Anchor;
                    link.Type = LinkType.Anchor;
                    break;
                case "external":
                    link.Url = field.Url;
                    link.Type = LinkType.External;
                    break;
                case "mailto":
                    link.Url = field.Url;
                    link.Type = LinkType.MailTo;
                    break;
                case "javascript":
                    link.Url = field.Url;
                    link.Type = LinkType.JavaScript;
                    break;
                case "media":
                    global::Sitecore.Data.Items.MediaItem media = new global::Sitecore.Data.Items.MediaItem(field.TargetItem);
                    link.Url = global::Sitecore.Resources.Media.MediaManager.GetMediaUrl(media);
                    link.Type = LinkType.Media;
                    link.TargetId = field.TargetID.Guid;

                    break;
                case "internal":
                    if (field.TargetItem == null) link.Url = string.Empty;
                    else link.Url = LinkManager.GetItemUrl(field.TargetItem);
                    link.Type = LinkType.Internal;
                    link.TargetId = field.TargetID.Guid;

                    break;
                default:
                    return null;
                    break;

            }
            

            link.Anchor = field.Anchor;
            link.Class = field.Class;
            link.Text = field.Text;
            link.Title = field.Title;
            link.Target = field.Target;
            link.Query = field.QueryString;

            return link;
        }
        /// <summary>
        /// Render HTML for a link
        /// </summary>
        /// <param name="link">The link to render</param>
        /// <param name="attributes">Addtiional attributes to add. Do not include href or title</param>
        /// <param name="contents">Content to go in the link instead of the standard text</param>
        /// <returns>An "a" HTML element </returns>
        public string RenderLink(FieldTypes.Link link, NameValueCollection attributes, string contents)
        {
            if (link == null)
            {
                return("");
            }
            if (attributes == null)
            {
                attributes = new NameValueCollection();
            }

            string format = "<a href='{0}{1}' title='{2}' target='{3}' class='{4}' {5}>{6}</a>";

            string cls    = attributes.AllKeys.Any(x => x == "class") ? attributes["class"] : link.Class;
            string anchor = link.Anchor.IsNullOrEmpty() ? "" : "#" + link.Anchor;
            string target = attributes.AllKeys.Any(x => x == "target") ? attributes["target"] : link.Target;


            AttributeCheck(attributes, "class", link.Class);
            AttributeCheck(attributes, "target", link.Target);
            AttributeCheck(attributes, "title", link.Title);

            attributes.Remove("href");


            return(format.Formatted(link.Url, anchor, link.Title, target, cls, Utility.ConvertAttributes(attributes), contents.IsNullOrEmpty() ?  link.Text : contents));
        }
 /// <summary>
 /// Render HTML for a link
 /// </summary>
 /// <param name="link">The link to render</param>
 /// <param name="attributes">Addtiional attributes to add. Do not include href or title</param>
 /// <returns>An "a" HTML element </returns>
 public string RenderLink(FieldTypes.Link link, NameValueCollection attributes)
 {
     return(RenderLink(link, attributes, string.Empty));
 }
        public void GetItem_Test1()
        {

            //Assign 
            GeneralFluentFixtureNS.BasicTemplate test = null;

            //Act
            using (new SecurityDisabler())
            {
                test = _sitecore.GetItem<GeneralFluentFixtureNS.BasicTemplate>("/sitecore/content/Configuration/Fluent/GeneralFluent/GetItemTest1");
            }
            var getTestItem1 = _db.GetItem("/sitecore/content/Configuration/Fluent/GeneralFluent/GetItemTest1");
            //Assert

            #region SitecoreId

            Assert.AreEqual(getTestItem1.ID.Guid, test.Id);

            #endregion

            #region Fields
            #region SimpleTypes

            Assert.IsTrue(test.Checkbox);

            Assert.AreEqual(new DateTime(2011, 05, 01), test.Date);

            Assert.AreEqual(new DateTime(2011, 06, 01, 06, 30, 00), test.DateTime);


            var file=new File(){
                    Id = new Guid("{368A358E-5835-458B-AFE6-BA5F80334F5A}"),
                    Src ="~/media/Files/SimpleTextFile.ashx"
                };
            Assert.AreEqual(file.Id, test.File.Id);
            Assert.AreEqual(file.Src, test.File.Src);

            var image = new Image()
            {
                Alt = "Alternate Text  Test",
                Border = "",
                Class = "",
                Height = 540,
                HSpace = 50,
                MediaId = new Guid("{223EEAE5-DF4C-4E30-95AC-17BE2F00E2CD}"),
                Src = "~/media/Files/Kitten1.ashx",
                VSpace = 60,
                Width = 720,
            };
            Assert.AreEqual(image.Alt, test.Image.Alt);
            Assert.AreEqual(image.Border, test.Image.Border);
            Assert.AreEqual(image.Class, test.Image.Class);
            Assert.AreEqual(image.Height, test.Image.Height);
            Assert.AreEqual(image.HSpace, test.Image.HSpace);
            Assert.AreEqual(image.MediaId, test.Image.MediaId);
            Assert.AreEqual(image.Src, test.Image.Src);
            Assert.AreEqual(image.VSpace, test.Image.VSpace);
            Assert.AreEqual(image.Width, test.Image.Width);

            Assert.AreEqual(456, test.Integer);

            Assert.AreEqual(456f, test.Float);

            Assert.AreEqual(456d, test.Double);

            Assert.AreEqual(456m, test.Decimal);

            Assert.AreEqual("Multi Line Text Test", test.MultiLineText);

            Assert.AreEqual(789, test.Number);

            Assert.AreEqual("Password Test", test.Password);

            Assert.AreEqual("<p>Rich Text Test</p>", test.RichText.Trim());

            Assert.AreEqual("Single Line Text Test", test.SingleLineText);

            #endregion

            #region List Types

            Assert.AreEqual(2, test.CheckList.Count());
            Assert.AreEqual(_check1.ID.Guid, test.CheckList.First().Id);
            Assert.AreEqual(_check2.ID.Guid, test.CheckList.Last().Id);

            Assert.AreEqual(TestEnum.Test1, test.DropList);

            Assert.AreEqual(_test3.ID.Guid, test.GroupedDropLink.Id);

            Assert.AreEqual(TestEnum.Test3, test.GroupedDropList);

            Assert.AreEqual(_multiList1.ID.Guid, test.MultiList.First().Id);

            Assert.AreEqual(_treeList1.ID.Guid, test.Treelist.First().Id);

            Assert.AreEqual(_treeList2.ID.Guid, test.TreeListEx.First().Id);

            #endregion
            #region Link Types

            Assert.AreEqual(_link1.ID.Guid, test.DropLink.Id);

            Assert.AreEqual(_link2.ID.Guid, test.DropTree.Id);

            var link = new Link(){
                Anchor = "",
                Class = "Style Class Test",
                Target = "_blank",
                TargetId = Guid.Empty,
                Text = "Link Description Test",
                Title = "Alternate Text Test",
                Url = "http://www.google.com"
            };
            Assert.AreEqual(link.Anchor, test.GeneralLink.Anchor);
            Assert.AreEqual(link.Class, test.GeneralLink.Class);
            Assert.AreEqual(link.Target, test.GeneralLink.Target);
            Assert.AreEqual(link.TargetId, test.GeneralLink.TargetId);
            Assert.AreEqual(link.Text, test.GeneralLink.Text);
            Assert.AreEqual(link.Title, test.GeneralLink.Title);
            Assert.AreEqual(link.Url, test.GeneralLink.Url);


            #endregion

            #region Developer Types

            Assert.AreEqual("/sitecore/shell/Themes/Standard/Applications/48x48/about.png", test.Icon);

            Assert.AreEqual(TriState.No, test.TriState);

            #endregion

            #region System Types

            Console.WriteLine("Attachment not tested");

            #endregion
            #endregion

            #region SitecoreInfo

            Assert.AreEqual(getTestItem1.Paths.ContentPath, test.ContentPath);

            Assert.AreEqual(getTestItem1.DisplayName, test.DisplayName);

            Assert.AreEqual(getTestItem1.Paths.FullPath, test.FullPath);

            Assert.AreEqual(getTestItem1.Key, test.Key);

            Console.WriteLine("Not test media URL");

            Assert.AreEqual(getTestItem1.Paths.Path, test.Path);

            Assert.AreEqual(getTestItem1.TemplateID.Guid, test.TemplateId);

            Assert.AreEqual(getTestItem1.TemplateName, test.TemplateName);

            Assert.AreEqual(LinkManager.GetItemUrl(getTestItem1), test.Url);

            Assert.AreEqual(getTestItem1.Version.Number, test.Version);

            #endregion

            #region SitecoreChildren

            Assert.AreEqual(getTestItem1.Children.Count, test.Children.Count());
            Assert.AreEqual(getTestItem1.Children.First().ID.Guid, test.Children.First().Id);

            #endregion

            #region SitecoreParent

            Assert.AreEqual(getTestItem1.ParentID.Guid, test.Parent.Id);

            #endregion

            #region SitecoreQuery

            //we have to use the security disabler because we are outside of an ASP.NET context
            //if you do this without the disabler the role manager throws an exception
            using (new SecurityDisabler())
            {
                Assert.AreEqual(3, test.Query.Count());
                Assert.AreEqual(_query1.ID.Guid, test.Query.First().Id);
                Assert.AreEqual(_query2.ID.Guid, test.Query.Skip(1).First().Id);
            }
            #endregion

        }
 /// <summary>
 /// Render HTML for a link
 /// </summary>
 /// <param name="link">The link to render</param>
 /// <returns>An "a" HTML element </returns>
 public string RenderLink(FieldTypes.Link link)
 {
     return(RenderLink(link, null, string.Empty));
 }
        public void SetValue_NoField()
        {
            //Assign
            Item item = _db.GetItem(new ID(_itemId));

            string expected = "";

            SitecoreProperty property = new SitecoreProperty()
            {
                Attribute = new SitecoreFieldAttribute(),
                Property = new FakePropertyInfo(typeof(Link), "NoField")
            };
            _handler.ConfigureDataHandler(property);

            Link link = new Link();

                //Act
                _handler.SetValue(item, link, null);

            //Assert
            //should be no errors, but nothing to test

        }
        public void SetValue_LinkNoValues()
        {
            //Assign
            Item item = _db.GetItem(new ID(_itemId));

            string expected = "";

            SitecoreProperty property = new SitecoreProperty()
            {
                Attribute = new SitecoreFieldAttribute(),
                Property = new FakePropertyInfo(typeof(Link), "GeneralLink")
            };
            _handler.ConfigureDataHandler(property);

            Link link = new Link();

            string result = string.Empty;

            using (new SecurityDisabler())
            {
                item.Editing.BeginEdit();

                //Act
                _handler.SetValue(item, link, null);
                result = item.Fields["GeneralLink"].Value;

                item.Editing.CancelEdit();
            }

            //Assert

            Assert.AreEqual(expected, result);

        }
        public void SetValue_JavaScript()
        {
            //Assign
            Item item = _db.GetItem(new ID(_itemId));

            string expected = "<link text=\"Test\" linktype=\"javascript\" url=\"javascript:JavaScript\" anchor=\"\" title=\"text\" class=\"class\" />";

            SitecoreProperty property = new SitecoreProperty()
            {
                Attribute = new SitecoreFieldAttribute(),
                Property = new FakePropertyInfo(typeof(Link), "GeneralLink")
            };
            _handler.ConfigureDataHandler(property);

            Link link = new Link();
            link.Text = "TestDesc";
            link.Type = LinkType.JavaScript;
            link.Anchor = "TestAnch";
            link.Query = "TestQuery";
            link.Title = "TestAlt";
            link.Target = "_blank";
            link.Class = "TestClass";
            link.Url = "javascript:JavaScript";


            string result = string.Empty;

            using (new SecurityDisabler())
            {
                item.Editing.BeginEdit();

                //Act
                _handler.SetValue(item, link, null);
                LinkField field = new LinkField(item.Fields["GeneralLink"]);


                //Assert
                Assert.AreEqual("TestAnch", field.Anchor);
                Assert.AreEqual("TestClass", field.Class);
                Assert.AreEqual("javascript", field.LinkType);
                Assert.AreEqual("TestQuery", field.QueryString);
                Assert.AreEqual("TestDesc", field.Text);
                Assert.AreEqual("TestAlt", field.Title);
                Assert.AreEqual("javascript:JavaScript", field.Url);

                item.Editing.CancelEdit();
            }

        }
        public void SetValue_Media()
        {
            //Assign
            Item item = _db.GetItem(new ID(_itemId));

            string expected = "<link text=\"TestDesc\" linktype=\"media\" url=\"/Files/Kitten1\" title=\"TestText\" class=\"TestClass\" target=\"_blank\" id=\"{223EEAE5-DF4C-4E30-95AC-17BE2F00E2CD}\" />";

            SitecoreProperty property = new SitecoreProperty()
            {
                Attribute = new SitecoreFieldAttribute(),
                Property = new FakePropertyInfo(typeof(Link), "GeneralLink")
            };
            _handler.ConfigureDataHandler(property);

            Link link = new Link();
            link.Text = "TestDesc";
            link.Type = LinkType.Media;
            link.Anchor = "TestAnch";
            link.Query = "TestQuery";
            link.Title = "TestAlt";
            link.Target = "_blank";
            link.Class = "TestClass";
            link.TargetId = new Guid("{223EEAE5-DF4C-4E30-95AC-17BE2F00E2CD}");

            string result = string.Empty;

            using (new SecurityDisabler())
            {
                item.Editing.BeginEdit();

                //Act
                _handler.SetValue(item, link, null);
                LinkField field = new LinkField(item.Fields["GeneralLink"]);


                //Assert
                Assert.AreEqual("TestAnch", field.Anchor);
                Assert.AreEqual("TestClass", field.Class);
                Assert.AreEqual("media", field.LinkType);
                Assert.AreEqual("TestQuery", field.QueryString);
                Assert.AreEqual(new Guid("{223EEAE5-DF4C-4E30-95AC-17BE2F00E2CD}"), field.TargetID.Guid);
                Assert.AreEqual("TestDesc", field.Text);
                Assert.AreEqual("TestAlt", field.Title);

                item.Editing.CancelEdit();
            }

        }
        public void SetValue_Internal()
        {
            //Assign
            Item item = _db.GetItem(new ID(_itemId));

            string expected = "<link text=\"TestDesc\" linktype=\"internal\" url=\"/Home.aspx\" anchor=\"TestAnch\" querystring=\"TestQuery\" title=\"TestAlt\" class=\"TestClass\" target=\"_blank\" id=\"{98F907F7-CD1A-4C88-AF11-8F38A21A7FE1}\" />";

            SitecoreProperty property = new SitecoreProperty()
            {
                Attribute = new SitecoreFieldAttribute(),
                Property = new FakePropertyInfo(typeof(Link), "GeneralLink")
            };
            _handler.ConfigureDataHandler(property);

            Link link = new Link();
            link.Text = "TestDesc";
            link.Type = LinkType.Internal;
            link.Anchor = "TestAnch";
            link.Query = "TestQuery";
            link.Title = "TestAlt";
            link.Target = "_blank";
            link.Class = "TestClass";
            link.TargetId = new Guid("{98F907F7-CD1A-4C88-AF11-8F38A21A7FE1}");

            string result = string.Empty;

            using (new SecurityDisabler())
            {
                item.Editing.BeginEdit();

                //Act
                _handler.SetValue(item, link, null);
                LinkField field = new LinkField(item.Fields["GeneralLink"]);

                Assert.AreEqual( "TestAnch", field.Anchor);
                Assert.AreEqual( "TestClass",  field.Class);
                Assert.AreEqual("internal", field.LinkType);
                Assert.AreEqual("TestQuery", field.QueryString);
                Assert.AreEqual(new Guid("{98F907F7-CD1A-4C88-AF11-8F38A21A7FE1}"), field.TargetID.Guid);
                Assert.AreEqual("TestDesc", field.Text);
                Assert.AreEqual("TestAlt", field.Title);
                    
                item.Editing.CancelEdit();
            }



           

        }