﻿/// <reference path="jquery-1.5-vsdoc.js" />
/*
		Umbraco / JQuery Glossary
		BKA Interactive (http://www.bka.co.nz)		
*/
(function ($) {
    $.fn.extend({
        glossary: function (options) {
            var actionHandlers = {
                getDescription: function (name, arr) {
                    for (var i = 0; i < arr.length; i++) {
                        if (name.toLowerCase() == arr[i].name.toLowerCase()) {
                            return arr[i].value;
                        }
                    }
                },
                displayIt: function (element) {
                    //get rid of any old ones
                    $("." + element.data.wrapperClass).remove();
                    element.retain = false;

                    var name = $(element).text();
                    var allData = element.data.data;
                    var des = actionHandlers.getDescription(name, allData);

                    var id = "gloss-" + Math.floor(Math.random() * 1001);
                    var container = '<div class="' + element.data.wrapperClass + '" id="' + id + '">' + des + "</div>";
                    $("body").append(container);
                    container = $("#" + id);
                    element.container = container;
                    container[0].anchor = element;

                    var offsetX = $(element).offset().left - (container.width() / 2) + element.data.offsetX;
                    var offsetY = $(element).offset().top - container.height() + element.data.offsetY;

                    container.css("left", offsetX + "px").css("top", offsetY + "px");
                    container.mouseenter(function () {
                        this.anchor.retain = true;
                    }).mouseleave(function () {
                        $("." + element.data.wrapperClass).remove();
                    });
                },
                hover: function (e) {
                    actionHandlers.displayIt(this);
                },
                leave: function (e) {
                    setTimeout(function () {
                        if (!e.target.retain) {
                            $("#" + e.target.container.attr("id")).remove();
                        }
                    }, 100);
                },
                click: function (e) {
                    actionHandlers.displayIt(this);
                }
            }

            var defaults = {
                data: null,
                anchorClass: "glossaryKey",
                wrapperClass: "glossaryDes",
                showOnClick: false,
                showOnHover: true,
                offsetY: 0,
                offsetX: 0
            };

            var options = $.extend(defaults, options);

            if (!options.data) {
                throw "glossary: no data specified";
            }

            for (var i = 0; i < options.data.length; i++) {
                var curWord = options.data[i].name;
                var regexp = new RegExp("(\\b" + curWord + "\\b)(?![^<>]*</a>)(?![^<>]*</span>)(?![^<>]*</h2>)(?![^<>]*</h2>)(?![^<>]*\")(?=([^<>]*<[^>]+>[^<>]*)+$|[^<>]*)", "i");
                var replaced = false;
                this.each(function () {
                    var block = $(this);
                    var html = block.html();
                    if (html.match(regexp) != null && !replaced) {
                        
                        block.html(html.replace(regexp, '<a href="javascript:void();" class="' + options.anchorClass + '">$1</a>'));
                        var createdChilds = block.find("." + options.anchorClass);
                        createdChilds.each(function () {
                            this.data = options;
                        });
                        if (options.showOnClick) {
                            createdChilds.click(actionHandlers.click).mouseleave(actionHandlers.leave);
                        }
                        if (options.showOnHover) {
                            createdChilds.mouseenter(actionHandlers.hover).mouseleave(actionHandlers.leave);
                        }

                        replaced = true;
                    }
                });
            }
        }
    });
})(jQuery);
