﻿var Highlighter = {      
    GetHighlightedText: function()
    {                
        var text = new String();
        
        if (window.getSelection)
        {
            text = window.getSelection();
        }
        else if (document.getSelection)
        {
            text = document.getSelection();
        }
        else if (document.selection)
        {
            text = document.selection.createRange().text;
        }
        else
        {
            text = "";
        }
                                                  
        return new String(text);                        
    },
    GetEventSrcElement: function(e)
    {
        var srcElement = null;
        
        if(arguments.length > 0 && null != e)
        {
            srcElement = (typeof e.srcElement != "undefined") ? e.srcElement : e.target;            
        }
        
        return srcElement;
    },
    GetXPos: function(e)
    {                
        var xPos = new Number();
        
        if(navigator.appName.toLowerCase().indexOf("microsoft internet explorer") > -1)
        {
            xPos = e.clientX + document.documentElement.scrollLeft;
        }
        else
        {
            xPos = e.pageX;
        }
                
        return xPos;               
    },
    GetYPos: function(e)
    {
        var yPos = new Number();
        
        if(navigator.appName.toLowerCase().indexOf("microsoft internet explorer") > -1)
        {            
            yPos = e.clientY + document.documentElement.scrollTop;
        }
        else
        {
            yPos = e.pageY;
        }
             
        return yPos;
    },    
    GetPageHeight: function()
    {        
        return document.body.scrollHeight;
    },
    GetPageWidth: function()
    {
        return document.body.scrollWidth;
    },    
    ResultsBox: {
        CurrentID: "",
        LeftMargin: 30,
        TopMargin: 15,
        Width: 540,        
        SrcElement: null,
        PrevSrcElement: null,
        SetSrcElement: function(srcElem)
        {
            var prevSrcElem = Highlighter.ResultsBox.SrcElement;
            if(null != prevSrcElem && null != prevSrcElem.data && null != prevSrcElem.data.Revert)
            {
               prevSrcElem.data.Revert();
            } 
            
            Highlighter.ResultsBox.SrcElement = srcElem;
                                    
            if(null != srcElem.data && null != srcElem.data.Clicked)
            {
               srcElem.data.Clicked();
            } 
        },              
        MouseXPos: 0,
        MouseYPos: 0,
        IsOpen: false,
        IsVisible: false,
        IsActivated: true,
        Deactivate: function()
        {
            Highlighter.ResultsBox.Remove();
            Highlighter.ResultsBox.IsActivated = false;
        },
        ShowLoader: function()
        {
            if(null == document.getElementById("HighlighterLoader"))
            {                
                var loader = document.createElement("div");
                loader.id = "HighlighterLoader";           
                loader.style.left = new String(Highlighter.ResultsBox.MouseXPos + "px");
                loader.style.top = new String(Highlighter.ResultsBox.MouseYPos + "px");
                loader.style.display = "none";
                
                var loaderSpinner = document.createElement("img");
                loaderSpinner.src = "http://media.multimedia.msn.com/highlighter/images/spin.gif";
                
                loader.appendChild(loaderSpinner);
                
                loader.onmouseup = function()
                {
                    this.style.display = "none";
                };
                
                document.body.appendChild(loader);
                                                               
                Highlighter.ResultsBox.PositionFromMouse(document.getElementById("HighlighterLoader"));                               
            }
        },
        RemoveLoader: function()
        {
            if(null != document.getElementById("HighlighterLoader"))
            {
                var loader = document.getElementById("HighlighterLoader");
                loader.parentNode.removeChild(loader);
            }
        },
        Draw: function(id)
        {
            if(Highlighter.ResultsBox.IsActivated && document.body && arguments.length >= 1 && typeof id == "string")
            {
                Highlighter.ResultsBox.ShowLoader();
                
                Highlighter.ResultsBox.CurrentID = id;
                                
                if(null == document.getElementById("HighlighterHolder"))
                {
                    var holder = document.createElement("div");
                    holder.id = "HighlighterHolder";                    
                    document.body.appendChild(holder);   
                }
                
                var resultsBox = document.getElementById("HighlighterHolder");
                Highlighter.ResultsBox.Hide();
                Highlighter.ResultsBox.IsOpen = true;
                                          
            }
        },
        PositionFromMouse: function(holder)
        {
            if(null != holder)
            {
                holder.style.display = "block";
                                
                var holderWidth = holder.offsetWidth;
                var holderHeight = holder.offsetHeight;
                var pageWidth = Highlighter.GetPageWidth();
                var pageHeight = Highlighter.GetPageHeight();
                                
                var leftPos = Highlighter.ResultsBox.MouseXPos + Highlighter.ResultsBox.LeftMargin;
                var holderRightEndX = leftPos + holderWidth;
                
                if(holderRightEndX > pageWidth)
                {
                    var xDiff = holderRightEndX - pageWidth;
                    leftPos -= xDiff;
                }
                else if(holderRightEndX < 0)
                {
                    leftPos = 0;
                }
                
                holder.style.left = new String(leftPos+"px");
                
                var topPos = Highlighter.ResultsBox.MouseYPos + Highlighter.ResultsBox.TopMargin;
                var holderBottomEndY = topPos + holderHeight;
                
                if(holderBottomEndY > pageHeight)
                {
                    var yDiff = holderBottomEndY - pageHeight;
                    topPos -= yDiff;
                }
                else if(holderBottomEndY < 0)
                {
                    topPos = 0;
                }
                
                holder.style.top = new String(topPos+"px");
            }
        },
        Show: function()
        {
            if(null != document.getElementById("HighlighterHolder") && Highlighter.ResultsBox.IsActivated)
            {               
                Highlighter.ResultsBox.RemoveLoader();
                
                Highlighter.ResultsBox.PositionFromMouse(document.getElementById("HighlighterHolder"));
                                
                Highlighter.ResultsBox.IsVisible = true;
            }        
        },
        Hide: function()
        {
            if(null != document.getElementById("HighlighterHolder"))
            {  
                document.getElementById("HighlighterHolder").style.display = "none";
                                
                Highlighter.ResultsBox.IsVisible = false;
            }
        },
        Remove: function()
        {
            if(null != document.getElementById("HighlighterHolder"))
            {
                var erase = document.getElementById("HighlighterHolder");
                erase.parentNode.removeChild(erase);
                
                Highlighter.ResultsBox.CurrentID = "";
                Highlighter.ResultsBox.PrevSrcElement = Highlighter.ResultsBox.SrcElement;
                
                var prevElem = Highlighter.ResultsBox.PrevSrcElement;
                if(null != prevElem && null != prevElem.data && null != prevElem.data.Revert)
                {
                    prevElem.data.Revert();
                }
                
                Highlighter.ResultsBox.SrcElement = null;
                Highlighter.ResultsBox.IsOpen = false;
                Highlighter.ResultsBox.IsVisible = false;
            }
        },
        RecordMouseXFromEventObject: function(e)
        {
            if(null != e)
            {
                Highlighter.ResultsBox.MouseXPos = Highlighter.GetXPos(e);
            }
        },
        RecordMouseYFromEventObject: function(e)
        {
            if(null != e)
            {
                Highlighter.ResultsBox.MouseYPos = Highlighter.GetYPos(e);
            }
        }        
    },        
    AppendScriptToHead: function(id,src)
    {
        if(null != document.getElementById(id))
        {
            var eraseBingScript = document.getElementById(id);
            eraseBingScript.parentNode.removeChild(eraseBingScript);
        }
        
        var theScript = document.createElement("script");
        theScript.id = id;
        theScript.src = src;
        theScript.type = "text/javascript";
        
        document.getElementsByTagName("head")[0].appendChild(theScript);
    },
    EscapeQuotes: function(text)
    {        
        text = text.replace(/\'/gi,"\'");
        text = text.replace(/\"/gi,'\"');
        
        return text;
    },
    StripQuotes: function(text)
    {
        text = text.replace(/\'/gi,"");
        text = text.replace(/\"/gi,"");
        
        return text;
    },
    WindowName: "HighlighterWindow",
    OpenWindow: function(url)
    {
        if(typeof url == "string" && null != url)
        {
            window.open(url,Highlighter.WindowName);            
        }
    }, 
    AddClassNameObj: function(obj,outClass,overClass,clickClass)
    {
        obj.className = outClass;
        
        obj.data = {
            Obj: obj,
            OverClass: overClass,
            OutClass: outClass,
            ClickClass: clickClass,                        
            Revert: function()
            {
                this.Obj.className = this.OutClass;
                this.Obj.onmouseover = function()
                {
                    this.className = this.data.OverClass;
                };
                this.Obj.onmouseout = function()
                {
                    this.className = this.data.OutClass;
                };                            
            },
            Clicked: function()
            {                            
                this.Obj.onmouseover = null;
                this.Obj.onmouseout = null;
                this.Obj.className = this.ClickClass;
            }
        };              
            
        obj.onmouseover = function()
        {
            this.className = overClass;
        };
        
        obj.onmouseout = function()
        {
            this.className = outClass;
        };
    },   
    FFAddEventsToTags: function(objs, theEvent, outClass, overClass, clickClass)
    {
        if(null != objs && null != theEvent)
        {   
            for(var x = 0; x < objs.length; x++)
            {                    
                objs[x].onmouseup = theEvent;
                
                if(null != overClass && null != outClass && null != clickClass)
                {
                    Highlighter.AddClassNameObj(objs[x],outClass,overClass,clickClass);
                }                                    
            }            
        }
    },        
    AddEventsToTags: function()
    {
        if(navigator.appName.toLowerCase().indexOf("microsoft internet explorer") > -1)
        {
            var allTags = document.getElementsByTagName("*");
            
            for(var x = 0; x < allTags.length; x++)
            {
                if(typeof allTags[x].getAttribute("name") != "undefined" && null != allTags[x].getAttribute("name"))
                {
                    if(allTags[x].getAttribute("name") == "BingVideoOnMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Video.OnMouseUp;
                        Highlighter.AddClassNameObj(allTags[x],"BingVideoSpan_Out","BingVideoSpan_Over","BingVideoSpan_Click");                        
                    }
                    else if(allTags[x].getAttribute("name") == "BingVideoOnHighlightMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Video.OnHighlightMouseUp;
                    }
                    else if(allTags[x].getAttribute("name") == "BingWebOnMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Web.OnMouseUp;
                        Highlighter.AddClassNameObj(allTags[x],"BingWebSpan_Out","BingWebSpan_Over","BingWebSpan_Click");
                    }
                    else if(allTags[x].getAttribute("name") == "BingWebOnHighlightMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Web.OnHighlightMouseUp;
                    }
                    else if(allTags[x].getAttribute("name") == "BingImageOnMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Image.OnMouseUp;
                        Highlighter.AddClassNameObj(allTags[x],"BingImageSpan_Out","BingImageSpan_Over","BingImageSpan_Click");                       
                    }
                    else if(allTags[x].getAttribute("name") == "BingImageOnHighlightMouseUp")
                    {                        
                        allTags[x].onmouseup = Highlighter.Bing.Image.OnHighlightMouseUp;
                    }                                     
                }
            }
        }
        else
        {            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingVideoOnMouseUp"),Highlighter.Bing.Video.OnMouseUp,"BingVideoSpan_Out","BingVideoSpan_Over","BingVideoSpan_Click");
            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingVideoOnHighlightMouseUp"),Highlighter.Bing.Video.OnHighlightMouseUp, null, null);
            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingImageOnMouseUp"),Highlighter.Bing.Image.OnMouseUp,"BingImageSpan_Out","BingImageSpan_Over","BingVideoSpan_Over","BingImageSpan_Click");
            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingImageOnHighlightMouseUp"),Highlighter.Bing.Image.OnHighlightMouseUp, null, null);
            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingWebOnMouseUp"),Highlighter.Bing.Web.OnMouseUp,"BingWebSpan_Out","BingWebSpan_Over","BingWebSpan_Click");           
            
            Highlighter.FFAddEventsToTags(document.getElementsByName("BingWebOnHighlightMouseUp"),Highlighter.Bing.Web.OnHighlightMouseUp, null, null);            
        }                       
    },    
    Bing: {                
        TrackingID: null,
        TrackingObjectsArray: [
            {domain:"lifestyle.msn.com",id:"LIFPRO"},
            {domain:"autos.msn.com",id:"AO"},
            {domain:"money.msn.com",id:"MSMONY"},
            {domain:"delish.com",id:"DELISH"},
            {domain:"health.msn.com",id:"A8"},
            {domain:"tv.msn.com",id:"ENTPRO"},
            {domain:"music.msn.com",id:"ENTPRO"},
            {domain:"movies.msn.com",id:"ENTPRO"},
            {domain:"entertainment.msn.com",id:"ENTPRO"},
            {domain:"wonderwall.com",id:"CWWWBQ"},
            {domain:"wonderwall.msn.com",id:"CWWWBQ"},
            {domain:"paralleluniverse.msn.com",id:"BC"},
            {domain:"superfans.msn.com",id:"ENTPRO"},
            {domain:"careers.msn.com",id:"AP"},
            {domain:"video.msn.com",id:"CT"},
            {domain:"videoguide.msn.com",id:"CT"}
        ],
        SetTrackingIDFromURL: function()
        {
            if(null == Highlighter.Bing.TrackingID)
            {
                var domain = location.hostname.toLowerCase();
                                                
                for(var x=0; x < Highlighter.Bing.TrackingObjectsArray.length; x++)
                {
                    var tObj = Highlighter.Bing.TrackingObjectsArray[x];
                    var domainX = tObj.domain.toLowerCase();
                    
                    if(domain.indexOf(domainX) > -1)
                    {
                        Highlighter.Bing.TrackingID = tObj.id;
                        break;
                    }                    
                }                              
            }
        },             
        Image: {
            IsActivated: true,              
            AppID: "D41D8CD98F00B204E9800998ECF8427E051F7680",
            Offset: 0,
            Count: 8,
            RowCount: 4,
            Market: "en-us",
            ThumbWidth: 94,
            ThumbHeight: 97,
            Search: function(keywords)
            {                
                if(arguments.length == 1)
                {
                    keywords = (keywords.length > 500) ? keywords.substr(0,500) : keywords;
                    
                    var url = "http://api.search.live.net/json.aspx?Sources=Image&Market="+Highlighter.Bing.Image.Market+"&AppId="+Highlighter.Bing.Image.AppID+"&Market=en-us&Image.Offset="+Highlighter.Bing.Image.Offset+"&Image.Count="+Highlighter.Bing.Image.Count+"&JsonType=callback&JsonCallback=Highlighter.Bing.Image.SetResults";
                    url += "&Query=" + escape(keywords);
                    
                    Highlighter.Bing.SetTrackingIDFromURL();
                                        
                    if(null != Highlighter.Bing.TrackingID)
                    {
                        url += "&FORM=" + Highlighter.Bing.TrackingID;
                    }
                                        
                    Highlighter.AppendScriptToHead("BingScript",url);
                }                
            },
            SetResults: function(data)
            {           
                Highlighter.Bing.Image.IsActivated = false;
                
                if(null != data && null != data.SearchResponse && null != data.SearchResponse.Image && null != data.SearchResponse.Image.Total && null == data.SearchResponse.Errors && data.SearchResponse.Image.Total > 0 && null != data.SearchResponse.Image.Results)
                {            
                    if(null != document.getElementById("HighlighterHolder"))
                    {                       
                        Highlighter.Bing.Image.DrawResults(data);                       
                        
                        Highlighter.ResultsBox.Show();                                                 
                    }                                                  
                }                
                
                Highlighter.Bing.Image.IsActivated = true;            
            },
            DrawResults: function(data)
            {
                var results = data.SearchResponse.Image.Results;
                var total = data.SearchResponse.Image.Total;
                var keywords = data.SearchResponse.Query.SearchTerms;
                var plural = (total != 1) ? true : false;
                
                var html = new String();
                
                var resultPlural = (plural) ? "s" : "";
                var formValue = (null != Highlighter.Bing.TrackingID) ? "FORM="+Highlighter.Bing.TrackingID + "&" : "";
                var defaultFormValue = (null != Highlighter.Bing.TrackingID) ? "?FORM="+Highlighter.Bing.TrackingID : "";
                html += "<div id='BingImageHeader'>" +                        
                        "<div id='BingImageLogo' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/images/search?"+formValue+"q="+keywords+"\");'></div>" +
                        "<div id='BingImageKeywordsHolder'><span id='BingImageKeywords'>"+keywords+"</span><span id='BingImageTotal'>"+total+" result"+ resultPlural +" -</span><span class='BingImageViewAll_Out' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/images/search?"+formValue+"q="+keywords+"\");'  onmouseover='this.className=\"BingImageViewAll_Over\"' onmouseout='this.className=\"BingImageViewAll_Out\"'>View all</span></div>" +
                        "<div id='BingImageClose' onmouseup='Highlighter.ResultsBox.Remove();'></div>" +
                        "</div>";
                        
                html += "<div id='BingImageNavHolder'>" +
                        "<div id='BingImageWebLink' onmouseup='Highlighter.Bing.Web.OnTabUp(\""+keywords+"\")' class='BingImageNavLink_Out' onmouseover='this.className=\"BingImageNavLink_Over\"' onmouseout='this.className=\"BingImageNavLink_Out\"'>Web</div>" +    
                        "<div id='BingImageSelected'>Images</div>" +
                        "<div id='BingImageVideoLink' onmouseup='Highlighter.Bing.Video.OnTabUp(\""+keywords+"\")' class='BingImageNavLink_Out' onmouseover='this.className=\"BingImageNavLink_Over\"' onmouseout='this.className=\"BingImageNavLink_Out\"'>Videos</div>" +  
                        "</div>";  
                
                html += "<div id='BingImageBody'><table id='BingImageTable' cellpadding='0' cellspacing='0'><tr>";
                
                var resultsLength = (results.length <= Highlighter.Bing.Image.Count) ? results.length : Highlighter.Bing.Image.Count;
                var rowCount = 0;
                       
                for(var x = 0; x < resultsLength; x++)
                {
                    var result = results[x];                    
                                        
                    var thumb = (null != result.Thumbnail && null != result.Thumbnail.Url) ? result.Thumbnail.Url : null;
                    var url = (null != result.ClickThroughPageUrl) ? result.ClickThroughPageUrl : "http://www.bing.com/images/"+defaultFormValue;
                    var thumbWidth = (null != result.Thumbnail && null != result.Thumbnail.Width) ? result.Thumbnail.Width : 160;
                    var thumbHeight = (null != result.Thumbnail && null != result.Thumbnail.Height) ? result.Thumbnail.Height : 120;
                                        
                    if(null != thumb)
                    {
                        rowCount++;
                        
                        if(rowCount > Highlighter.Bing.Image.RowCount)
                        {
                            rowCount = 1;                            
                            html += "</tr><tr>";
                        }
                                                
                        var newThumbWidth;
                        var newThumbHeight;
                        var ratio = thumbWidth / thumbHeight;
                        
                        if(thumbWidth > thumbHeight)
                        {
                            newThumbWidth = Highlighter.Bing.Image.ThumbWidth;
                            newThumbHeight = Highlighter.Bing.Image.ThumbWidth / ratio;    
                        }
                        else
                        {
                            newThumbHeight = Highlighter.Bing.Image.ThumbHeight;
                            newThumbWidth = Highlighter.Bing.Image.ThumbWidth * ratio;  
                        } 
                        html += "<td class='BingImageThumbHolder'>" +
                                "<img class='BingImageThumb' onmouseup='Highlighter.OpenWindow(\""+url+"\");' width='"+newThumbWidth+"' height='"+newThumbHeight+"' src='"+thumb+"' />" +
                                "</td>";
                        
                        if(rowCount != Highlighter.Bing.Image.RowCount)
                        {
                            html += "<td class='BingImageThumbDivider'></td>";
                        }                                
                    }
                    else
                    {
                        continue;
                    }
                }
                
                html += "</table></div>";                
                
                html += "<div id='BingImageFooter'></div>";
                
                if(null != document.getElementById("HighlighterHolder"))
                {                    
                    var holder = document.getElementById("HighlighterHolder");
                    holder.className = "BingImageHighlighterHolder";                    
                    holder.innerHTML = html;
                }               
            },
            OnTabUp: function(keywords)
            {
                if(null != keywords)
                {
                    Highlighter.ResultsBox.CurrentID = "BingImageOnTabUp";
                    Highlighter.Bing.Image.Search(keywords);
                }
            },
            OnMouseUp: function(e)
            {
                if (!e)
                { 
                    e = window.event;
                }
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                            
                if(Highlighter.Bing.Image.IsActivated && Highlighter.ResultsBox.IsActivated)
                { 
                    var eventID = "BingImageOnMouseUp";
                    
                    if(srcElem != Highlighter.ResultsBox.SrcElement)
                    {
                        Highlighter.ResultsBox.SetSrcElement(srcElem);                       
                                                                                                                                               
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                        
                        Highlighter.ResultsBox.Draw(eventID);
                         
                        var text = srcElem.innerHTML;
                        text = Highlighter.StripQuotes(text);
                        Highlighter.Bing.Image.Search(text);
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID || Highlighter.ResultsBox.CurrentID.indexOf("OnTabUp") > -1)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                                                        
                }    
            },
            OnHighlightMouseUp: function(e)
            {
                if (!e)
                { 
                    e = window.event;
                }           
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                
                if(Highlighter.Bing.Image.IsActivated && Highlighter.ResultsBox.IsActivated)
                {                
                    var text = Highlighter.GetHighlightedText();
                    text = Highlighter.StripQuotes(text);
                    
                    var eventID = "BingImageOnHighlightMouseUp";
                    
                    if(text.length > 0)
                    {                    
                        Highlighter.ResultsBox.SetSrcElement(srcElem); 
                                                
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                                         
                        Highlighter.ResultsBox.Draw(eventID);
                        Highlighter.Bing.Image.Search(text);            
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                      
                }                    
            }       
        },
        Web: {           
            IsActivated: true,              
            AppID: "D41D8CD98F00B204E9800998ECF8427E051F7680",
            Offset: 0,
            Count: 4,
            Market: "en-us",
            Search: function(keywords)
            {                
                if(arguments.length == 1)
                {
                    keywords = (keywords.length > 500) ? keywords.substr(0,500) : keywords;
                    
                    var url = "http://api.search.live.net/json.aspx?Sources=Web&Market="+Highlighter.Bing.Web.Market+"&AppId="+Highlighter.Bing.Web.AppID+"&Market=en-us&Web.Offset="+Highlighter.Bing.Web.Offset+"&Web.Count="+Highlighter.Bing.Web.Count+"&JsonType=callback&JsonCallback=Highlighter.Bing.Web.SetResults";
                    url += "&Query=" + escape(keywords);
                    
                    Highlighter.Bing.SetTrackingIDFromURL();
                    
                    if(null != Highlighter.Bing.TrackingID)
                    {
                        url += "&FORM=" + Highlighter.Bing.TrackingID;
                    }
                                        
                    Highlighter.AppendScriptToHead("BingScript",url);
                }                
            },
            SetResults: function(data)
            {           
                Highlighter.Bing.Web.IsActivated = false;
                
                if(null != data && null != data.SearchResponse && null != data.SearchResponse.Web && null != data.SearchResponse.Web.Total && null == data.SearchResponse.Errors && data.SearchResponse.Web.Total > 0 && null != data.SearchResponse.Web.Results)
                {            
                    if(null != document.getElementById("HighlighterHolder"))
                    {                       
                        Highlighter.Bing.Web.DrawResults(data);                       
                        
                        Highlighter.ResultsBox.Show();                                                 
                    }                                                  
                }                
                
                Highlighter.Bing.Web.IsActivated = true;            
            },
            DrawResults: function(data)
            {
                var results = data.SearchResponse.Web.Results;
                var total = data.SearchResponse.Web.Total;
                var keywords = data.SearchResponse.Query.SearchTerms;
                var plural = (total != 1) ? true : false;
                
                var html = new String();
                
                var resultPlural = (plural) ? "s" : "";
                var formValue = (null != Highlighter.Bing.TrackingID) ? "FORM="+Highlighter.Bing.TrackingID + "&" : "";
                var defaultFormValue = (null != Highlighter.Bing.TrackingID) ? "?FORM="+Highlighter.Bing.TrackingID : "";
                html += "<div id='BingWebHeader'>" +
                        "<div id='BingWebLogo' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/search?"+formValue+"q="+keywords+"\");'></div>" +
                        "<div id='BingWebKeywordsHolder'><span id='BingWebKeywords'>"+keywords+"</span><span id='BingWebTotal'>"+total+" result"+ resultPlural +" -</span><span class='BingWebViewAll_Out' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/search?"+formValue+"q="+keywords+"\");'  onmouseover='this.className=\"BingWebViewAll_Over\"' onmouseout='this.className=\"BingWebViewAll_Out\"'>View all</span></div>" +
                        "<div id='BingWebClose' onmouseup='Highlighter.ResultsBox.Remove();'></div>" +
                        "</div>";
                        
                html += "<div id='BingWebNavHolder'>" +
                        "<div id='BingWebSelected'>Web</div>" +    
                        "<div id='BingWebImageLink' onmouseup='Highlighter.Bing.Image.OnTabUp(\""+keywords+"\")' class='BingWebNavLink_Out' onmouseover='this.className=\"BingWebNavLink_Over\"' onmouseout='this.className=\"BingWebNavLink_Out\"'>Images</div>" +
                        "<div id='BingWebVideoLink' onmouseup='Highlighter.Bing.Video.OnTabUp(\""+keywords+"\")' class='BingWebNavLink_Out' onmouseover='this.className=\"BingWebNavLink_Over\"' onmouseout='this.className=\"BingWebNavLink_Out\"'>Videos</div>" +  
                        "</div>";
                
                html += "<div id='BingWebBody'>";
                
                var resultsLength = (results.length <= Highlighter.Bing.Web.Count) ? results.length : Highlighter.Bing.Web.Count;
                
                for(var x = 0; x < resultsLength; x++)
                {
                    var result = results[x];                    
                    
                    var title = (null != result.Title) ? result.Title : "";
                    var description = (null != result.Description) ? result.Description : "";
                    var url = (null != result.Url) ? result.Url : "http://www.bing.com/"+defaultFormValue;
                    var displayURL = (null != result.DisplayUrl) ? result.DisplayUrl : "www.bing.com/";
                                                            
                    html += "<div class='BingWebResultHolder'>" +
                            "<div class='BingWebTitle' onmouseup='Highlighter.OpenWindow(\""+url+"\");'>"+title+"</div>" +
                            "<div class='BingWebDescription'>"+description+"</div>" +
                            "<div class='BingWebURL'>"+displayURL+"</div>" +
                            "</div>";                    
                }
                
                html += "</div>";
                
                html += "<div id='BingWebFooter'></div>";
                                                
                if(null != document.getElementById("HighlighterHolder"))
                {                    
                    var holder = document.getElementById("HighlighterHolder");
                    holder.className = "BingWebHighlighterHolder";                    
                    holder.innerHTML = html;
                }               
            },
            OnTabUp: function(keywords)
            {
                if(null != keywords)
                {
                    Highlighter.ResultsBox.CurrentID = "BingWebOnTabUp";
                    Highlighter.Bing.Web.Search(keywords);
                }
            },
            OnMouseUp: function(e)
            {
                if (!e)
                { 
                    e = window.event;
                }
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                            
                if(Highlighter.Bing.Web.IsActivated && Highlighter.ResultsBox.IsActivated)
                { 
                    var eventID = "BingWebOnMouseUp";
                    
                    if(srcElem != Highlighter.ResultsBox.SrcElement)
                    {
                        Highlighter.ResultsBox.SetSrcElement(srcElem);
                                                                                               
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                        
                        Highlighter.ResultsBox.Draw(eventID);
                        
                        var text = srcElem.innerHTML;
                        text = Highlighter.StripQuotes(text);
                        Highlighter.Bing.Web.Search(text);
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID || Highlighter.ResultsBox.CurrentID.indexOf("OnTabUp") > -1)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                                                        
                }    
            },
            OnHighlightMouseUp: function(e)
            {
                if (!e)
                { 
                    e = window.event;
                }           
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                
                if(Highlighter.Bing.Web.IsActivated && Highlighter.ResultsBox.IsActivated)
                {                
                    var text = Highlighter.GetHighlightedText();
                    text = Highlighter.StripQuotes(text);
                                        
                    var eventID = "BingWebOnHighlightMouseUp";
                    
                    if(text.length > 0)
                    {                    
                        Highlighter.ResultsBox.SetSrcElement(srcElem);
                                                
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                                         
                        Highlighter.ResultsBox.Draw(eventID);
                        Highlighter.Bing.Web.Search(text);            
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                      
                }                    
            }
        },    
        Video: {           
            IsActivated: true,            
            AppID: "D41D8CD98F00B204E9800998ECF8427E051F7680",
            Offset: 0,
            Count: 8,
            RowCount: 4,
            Market: "en-us",            
            Search: function(keywords)
            {
                if(arguments.length == 1)
                { 
                    keywords = (keywords.length > 500) ? keywords.substr(0,500) : keywords;
                    
                    var url = "http://api.search.live.net/json.aspx?Sources=Video&Market="+Highlighter.Bing.Video.Market+"&AppId="+Highlighter.Bing.Video.AppID+"&Market=en-us&Video.Offset="+Highlighter.Bing.Video.Offset+"&Video.Count="+Highlighter.Bing.Video.Count+"&JsonType=callback&JsonCallback=Highlighter.Bing.Video.SetResults";
                    url += "&Query=" + escape(keywords);
                    
                    Highlighter.Bing.SetTrackingIDFromURL();
                    
                    if(null != Highlighter.Bing.TrackingID)
                    {
                        url += "&FORM=" + Highlighter.Bing.TrackingID;
                    }
                                                            
                    Highlighter.AppendScriptToHead("BingScript",url);
                }
                
            },
            SetResults: function(data)
            {   
                Highlighter.Bing.Video.IsActivated = false;
                             
                if(null != data && null != data.SearchResponse && null != data.SearchResponse.Video && null != data.SearchResponse.Video.Total && null == data.SearchResponse.Errors && data.SearchResponse.Video.Total > 0 && null != data.SearchResponse.Video.Results)
                {                  
                    if(null != document.getElementById("HighlighterHolder"))
                    {                        
                        Highlighter.Bing.Video.DrawResults(data);                       
                        
                        Highlighter.ResultsBox.Show();
                    }                                                  
                }
                                
                Highlighter.Bing.Video.IsActivated = true;                 
            },
            DrawResults: function(data)
            {               
                var results = data.SearchResponse.Video.Results;
                var total = data.SearchResponse.Video.Total;
                var keywords = data.SearchResponse.Query.SearchTerms;
                var plural = (total != 1) ? true : false;
                
                var html = new String();
                
                var resultPlural = (plural) ? "s" : "";
                var formValue = (null != Highlighter.Bing.TrackingID) ? "FORM="+Highlighter.Bing.TrackingID + "&" : "";
                var defaultFormValue = (null != Highlighter.Bing.TrackingID) ? "?FORM="+Highlighter.Bing.TrackingID : "";
                html += "<div id='BingVideoHeader'>" +
                        "<div id='BingVideoLogo' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/videos/search?"+formValue+"q="+keywords+"\");'></div>" +
                        "<div id='BingVideoKeywordsHolder'><span id='BingVideoKeywords'>"+keywords+"</span><span id='BingVideoTotal'>"+total+" result"+ resultPlural +" -</span><span class='BingVideoViewAll_Out' onmouseup='Highlighter.OpenWindow(\"http://www.bing.com/videos/search?"+formValue+"q="+keywords+"\");'  onmouseover='this.className=\"BingVideoViewAll_Over\"' onmouseout='this.className=\"BingVideoViewAll_Out\"'>View all</span></div>" +
                        "<div id='BingVideoClose' onmouseup='Highlighter.ResultsBox.Remove();'></div>" +
                        "</div>";
                        
                html += "<div id='BingVideoNavHolder'>" +
                        "<div id='BingVideoWebLink' onmouseup='Highlighter.Bing.Web.OnTabUp(\""+keywords+"\")' class='BingVideoNavLink_Out' onmouseover='this.className=\"BingVideoNavLink_Over\"' onmouseout='this.className=\"BingVideoNavLink_Out\"'>Web</div>" +    
                        "<div id='BingVideoImageLink' onmouseup='Highlighter.Bing.Image.OnTabUp(\""+keywords+"\")' class='BingVideoNavLink_Out' onmouseover='this.className=\"BingVideoNavLink_Over\"' onmouseout='this.className=\"BingVideoNavLink_Out\"'>Images</div>" +
                        "<div id='BingVideoSelected'>Videos</div>" +  
                        "</div>";
                
                html += "<div id='BingWebBody'><div class='BingVideoRow'>";
                
                var resultsLength = (results.length <= Highlighter.Bing.Video.Count) ? results.length : Highlighter.Bing.Video.Count;
                var rowCount = 0;
                
                for(var x = 0; x < resultsLength; x++)
                {
                    var result = results[x];                    
                    
                    var title = (null != result.Title) ? result.Title : "";                    
                    var url = (null != result.ClickThroughPageUrl) ? result.ClickThroughPageUrl : "http://www.bing.com/videos/"+defaultFormValue;                    
                    var thumb = (null != result.StaticThumbnail && null != result.StaticThumbnail.Url) ? result.StaticThumbnail.Url : "http://media.multimedia.msn.com/highlighter/images/default_movie_160x120.jpg";
                    
                    rowCount++;
                        
                    if(rowCount > Highlighter.Bing.Video.RowCount)
                    {
                        rowCount = 1;                            
                        html += "</div><div class='BingVideoRow'>";
                    }
                    
                    html += "<div class='BingVideoResultHolder'>" +
                            "<div class='BingVideoThumb' onmouseup='Highlighter.OpenWindow(\""+url+"\");'><img src='"+thumb+"' /></div>" +
                            "<div class='BingVideoTitle_Out' onmouseup='Highlighter.OpenWindow(\""+url+"\");'  onmouseover='this.className=\"BingVideoTitle_Over\"' onmouseout='this.className=\"BingVideoTitle_Out\"'>"+title+"</div>" +
                            "</div>";
                            
                    if(rowCount != Highlighter.Bing.Video.RowCount)
                    {
                        html += "<div class='BingVideoDivider'></div>";
                    }  
                }
                
                html += "</div></div>";
                
                html += "<div id='BingVideoFooter'></div>";
                                      
                if(null != document.getElementById("HighlighterHolder"))
                {                   
                    var holder = document.getElementById("HighlighterHolder");
                    holder.className = "BingVideoHighlighterHolder";                    
                    holder.innerHTML = html;
                } 
            },
            OnTabUp: function(keywords)
            {
                if(null != keywords)
                {
                    Highlighter.ResultsBox.CurrentID = "BingVideoOnTabUp";
                    Highlighter.Bing.Video.Search(keywords);
                }
            },
            OnMouseUp: function(e)
            {                
                if (!e)
                { 
                    e = window.event;
                }
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                                          
                if(Highlighter.Bing.Video.IsActivated && Highlighter.ResultsBox.IsActivated)
                {    
                    var eventID = "BingVideoOnMouseUp";
                                                     
                    if(srcElem != Highlighter.ResultsBox.SrcElement)
                    {
                        Highlighter.ResultsBox.SetSrcElement(srcElem);
                        
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                        
                        Highlighter.ResultsBox.Draw(eventID);
                         
                        var text = srcElem.innerHTML;
                        text = Highlighter.StripQuotes(text);                        
                        Highlighter.Bing.Video.Search(text);
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID || Highlighter.ResultsBox.CurrentID.indexOf("OnTabUp") > -1)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                                                        
                }        
            },
            OnHighlightMouseUp: function(e)
            {
                if (!e)
                { 
                    e = window.event;
                }           
                
                var srcElem = Highlighter.GetEventSrcElement(e);
                
                if(Highlighter.Bing.Video.IsActivated && Highlighter.ResultsBox.IsActivated)
                {                
                    var text = Highlighter.GetHighlightedText();
                    text = Highlighter.StripQuotes(text);
                    
                    var eventID = "BingVideoOnHighlightMouseUp";
                    
                    if(text.length > 0)
                    {                    
                        Highlighter.ResultsBox.SetSrcElement(srcElem);
                                                
                        Highlighter.ResultsBox.RecordMouseXFromEventObject(e);
                        Highlighter.ResultsBox.RecordMouseYFromEventObject(e);
                                                                    
                        Highlighter.ResultsBox.Draw(eventID);
                        Highlighter.Bing.Video.Search(text);            
                    }
                    else if(Highlighter.ResultsBox.CurrentID == eventID)
                    {
                        Highlighter.ResultsBox.Remove()
                    }                      
                }                    
            }
        }
    }            
};   