//Bench Sketch Tool Tip
// Good Tip From BenchSketch.com
// Use it !!
// email benchsketch@gmail.com if you want to get in on this project

(function ($) {
    $.fn.extend({
        bstip: function (options) {

            // get user extensions
            var opts = $.extend({}, $.fn.bstip.defaults, options);

            //start to build tips
            return this.each(function (i) {
                //load properties then create tip
                var nowid = $(this).id, nowtitle = $(this).attr("title"), here = $(this);
                var nowclass = here.attr("class"), nowrel = here.attr("rel");

                here.addClass("souniqueithurts");

                // I hacked a little bit. Sorry. Let me know if you have a better solution to grabbing the unique selector
                if (nowclass == "") {
                    newclass = "";
                } else {
                    newclass = nowclass;
                    newclass = newclass.replace(/ /, "");
                }
                if (nowid == "") {
                    newid = "";
                } else {
                    newid = nowid;
                }
                if (nowrel == "") {
                    newrel = "";
                } else {
                    newrel = nowrel;
                }


                //Generate Tip Type
                // Tip will get a title :: Menu will get a div based on id from title
                if (opts.type == "tip") {

                    // If you edit this make sure to back this up
                    $("body").append("<div class='" + opts.color + "' id='bs" + i + newclass + newid + newrel + "'>" + opts.forewrap + nowtitle + opts.backwrap + "</div>");

                } else if (opts.type == "menu") {

                    // get menu values
                    nextitem = $('#' + nowtitle);
                    nextcont = nextitem.html();

                    // If you edit this make sure to back this up
                    $("body").append("<div class='" + opts.color + "' id='bs" + i + newclass + newid + newrel + "'>" + opts.forewrap + nextcont + opts.backwrap + "</div>");

                    // Removes The Item
                    nextitem.remove();

                }

                // Our Position Starts Here
                var bs_tooltip = $("#bs" + i + newclass + newid + newrel); // This is our tooltip

                tipwidth = bs_tooltip.width()// Get Tip Width
                tipheight = bs_tooltip.height()//get Tip Height

                //Math Vars	
                offset = here.offset(); // this items offset
                left = offset.left;
                right = offset.right;
                nwidth = $(this).width(); // this items width
                nheight = $(this).height(); // this items height

                // Generate Positions

                // Position Left And Right
                if (opts.hook == "bottom-right" || opts.hook == "mid-right" || opts.hook == "top-right") {
                    bleft = offset.left + nwidth + opts.xnudge;
                } else if (opts.hook == "bottom-mid" || opts.hook == "mid-mid" || opts.hook == "top-mid") {
                    bleft = offset.left + (nwidth / 2) - (tipwidth / 2) + opts.xnudge;
                } else if (opts.hook == "bottom-left" || opts.hook == "mid-left" || opts.hook == "top-left") {
                    bleft = offset.left - opts.xnudge - tipwidth;
                }
                //Position Up and Down
                if (opts.hook == "top-right" || opts.hook == "top-mid" || opts.hook == "top-left") {
                    btop = offset.top - opts.ynudge - tipheight;
                } else if (opts.hook == "mid-right" || opts.hook == "mid-mid" || opts.hook == "mid-left") {
                    btop = offset.top + opts.ynudge;
                } else if (opts.hook == "bottom-right" || opts.hook == "bottom-mid" || opts.hook == "bottom-left") {
                    btop = offset.top + nheight + opts.ynudge;
                }

                // Adjust the css
                bs_tooltip.css({ top: btop, left: "1px", position: "absolute", display: "none" });


                //Check for Stick Type	
                if (opts.sticky == "none") {
                    // Adjust the Mouse over with no sticky
                    $(this).removeAttr("title").hover(function () {
                        bs_tooltip.css({ "opacity": opts.opacity }).fadeIn(opts.speed);
                    }, function () {
                        //Time out tack
                        t = setTimeout(function () {
                            bs_tooltip.fadeOut(opts.speed);
                        }, opts.tack);
                    });
                    bs_tooltip.hover(function () {
                        clearTimeout(t);
                    }, function () {
                        t = setTimeout(function () {
                            bs_tooltip.fadeOut(opts.speed);
                        }, opts.tack);
                    });

                } else if (opts.sticky == "move") {
                    //Adjust the settings for mouse move
                    $(this).removeAttr("title").mouseover(function () {
                        bs_tooltip.css({ opacity: opts.opacity, display: "none" }).fadeIn(opts.speed);
                    }).mousemove(function (kmouse) {
                        //We need some math to adjust for the hook
                        tipwidth = bs_tooltip.width()// Get Tip Width
                        tipheight = bs_tooltip.height()//get Tip Height
                        // Position Left And Right
                        if (opts.hook == "bottom-right" || opts.hook == "mid-right" || opts.hook == "top-right") {
                            bleft = kmouse.pageX + opts.xnudge;
                        } else if (opts.hook == "bottom-mid" || opts.hook == "mid-mid" || opts.hook == "top-mid") {
                            bleft = kmouse.pageX - (tipwidth / 2) + opts.xnudge;
                        } else if (opts.hook == "bottom-left" || opts.hook == "mid-left" || opts.hook == "top-left") {
                            bleft = kmouse.pageX - opts.xnudge - tipwidth;
                        }
                        //Position Up and Down
                        if (opts.hook == "top-right" || opts.hook == "top-mid" || opts.hook == "top-left") {
                            btop = kmouse.pageY - tipheight - opts.ynudge;
                        } else if (opts.hook == "mid-right" || opts.hook == "mid-mid" || opts.hook == "mid-left") {
                            btop = kmouse.pageY - (tipheight / 2) + opts.ynudge;
                        } else if (opts.hook == "bottom-right" || opts.hook == "bottom-mid" || opts.hook == "bottom-left") {
                            btop = kmouse.pageY + opts.ynudge;
                        }

                        bs_tooltip.css({ left: bleft, top: btop });
                    }).mouseout(function () {
                        bs_tooltip.fadeOut(opts.speed);
                    });
                } else if (opts.sticky == "slide") {
                    //Adjust the settings for mouse move
                    $(this).removeAttr("title").mouseover(function () {
                        bs_tooltip.css({ opacity: opts.opacity, display: "none" }).fadeIn(opts.speed);
                    }).mousemove(function (kmouse) {
                        //We need some math to adjust for the hook

                        // Position Left And Right
                        if (opts.hook == "bottom-right" || opts.hook == "mid-right" || opts.hook == "top-right") {
                            bleft = kmouse.pageX + opts.xnudge;
                        } else if (opts.hook == "bottom-mid" || opts.hook == "mid-mid" || opts.hook == "top-mid") {
                            bleft = kmouse.pageX - (tipwidth / 2) + opts.xnudge;
                        } else if (opts.hook == "bottom-left" || opts.hook == "mid-left" || opts.hook == "top-left") {
                            bleft = kmouse.pageX - opts.xnudge - tipwidth;
                        }
                        //Position Up and Down
                        if (opts.hook == "top-right" || opts.hook == "top-mid" || opts.hook == "top-left") {
                            btop = top - opts.ynudge - tipheight;
                        } else if (opts.hook == "mid-right" || opts.hook == "mid-mid" || opts.hook == "mid-left") {
                            btop = top + opts.ynudge;
                        } else if (opts.hook == "bottom-right" || opts.hook == "bottom-mid" || opts.hook == "bottom-left") {
                            btop = top + nheight + opts.ynudge;
                        }

                        bs_tooltip.css({ left: bleft, top: btop });
                    }).mouseout(function () {

                        //Time out tack
                        t = setTimeout(function () {
                            bs_tooltip.fadeOut(opts.speed);
                        }, opts.tack);
                    });

                    bs_tooltip.hover(function () {
                        clearTimeout(t);
                    }, function () {
                        t = setTimeout(function () {
                            bs_tooltip.fadeOut(opts.speed);
                        }, opts.tack);
                    });

                }


            }); // end return this.each
        } // end bstip: function()
    }); // end $.fn.extend



    // True Plugin Defaults
    $.fn.bstip.defaults = {
        sticky: 'move',
        forewrap: '<p>',
        backwrap: '</p>',
        hook: 'bottom-right',
        color: 'bstip',
        speed: 'fast',
        type: 'tip',
        tack: 0,
        keep: 2000,
        ynudge: 15,
        xnudge: 15,
        opacity: .8
    };


})(jQuery);   // end (function($){
