diff options
Diffstat (limited to 'webclient/lib')
| -rw-r--r-- | webclient/lib/alias.js | 144 | ||||
| -rw-r--r-- | webclient/lib/jquery.tabs.js | 121 | ||||
| -rw-r--r-- | webclient/lib/jquery.tipTip.js | 191 |
3 files changed, 329 insertions, 127 deletions
diff --git a/webclient/lib/alias.js b/webclient/lib/alias.js index bae01cc..521b492 100644 --- a/webclient/lib/alias.js +++ b/webclient/lib/alias.js @@ -28,7 +28,7 @@ var Alias = { /** * Return the status of a contact * @param {jQuery} contact The contact - * @return {Int} The status' number + * @return {Number} The status' number * @see Alias.Status */ getPresence: function(contact) { @@ -117,8 +117,20 @@ var Alias = { } else $('#roster ul').append(contact); + + // init tooltip + contact.tipTip({ + content: "<ul><li>Jid: " + jid + "</li><li><a>Start Chat</a></li></ul>", + defaultPosition: "right", + keepAlive: true + }); }, + /** + * Update the roster when receiving a presence stanza + * @param {XMLElement} presence The presence stanza + * @returns {Boolean} + */ onPresence: function(presence) { var who = $(presence).attr('from'); var type = $(presence).attr('type'); @@ -150,7 +162,7 @@ var Alias = { /** * Rebuild the contact list when receiving a roster iq - * @param iq + * @param {XMLElement} iq * @return {Boolean} */ onRoster: function(iq) { @@ -175,7 +187,6 @@ var Alias = { /** * Called when the status of Strophe's connection changes. * This function is passed to the Strophe's connect function - * * @param {Int} status The new status */ onStatusChanged: function(status) { @@ -195,7 +206,9 @@ var Alias = { }, /** - * Alias initialization after connection + * Initialization after connection + * + * Set the interface and the handlers */ onConnect: function() { Alias.getRoster(); @@ -305,129 +318,6 @@ var Alias = { }; -/** - * Light jQuery tab plugin - * - * the html structure is: - * - * <div id="generalid"> - * <ul class="tabbar"> - * <li><a href="#tab-1">Title 1</a></li> - * </ul> - * <div id="tab-1"> - * Content 1 - * </div> - * </div> - */ -(function( $ ){ - - var methods = { - - /** - * Initialise the general tab area - * @return this (to preserve chainability) - */ - init: function() { - var tabs = this; - this.find('ul.tabbar li').bind('click.tabs', function(event){ - event.preventDefault(); - tabs.tabs('select',$(this).find('a').attr('href')); - }); - this.data('tabs',{}); - return this; - }, - - /** - * Select a tab - * @param {String} id The tab id with # - * @return this - */ - select: function(id) { - var selectedId = this.data('tabs').selected; - - if ( selectedId == id) { - return this; - } - - this.find('ul.tabbar li a[href="' + selectedId + '"]').parent().removeClass('selected'); - this.find('ul.tabbar li a[href="' + id + '"]').parent().addClass('selected'); - $(selectedId).hide(); - $(id).show(); - this.data('tabs').selected = id; - return this; - }, - - /** - * Add a tab - * @param {String} name The tab Title - * @param {String} id The tab id without # - * @pram {Bool} remove Wether the tab should be closable - * return this - */ - add: function(name, id, remove) { - var tabs = this; - var li = $('<li><a href="#' + id + '">' + name +'</a></li>'); - - if ( remove ) { - li.append('<span class="tab-close"/>'); - li.find('.tab-close').bind('click', function() { - tabs.tabs('remove', '#'+id); - }); - } - - li.bind('click.tabs',function(event){ - event.preventDefault(); - tabs.tabs('select',$(this).find('a').attr('href')); - }); - $(this).find('ul.tabbar').append(li); - $(this).append('<div class="tab" id="' + id + '"></div>'); - return this; - }, - - /** - * Test if a tab exists - * @param {String} id The tab id with # - * @return {Bool} - */ - exist: function(id) { - return (this.find('ul.tabbar li a[href="' + id + '"]').length != 0); - }, - - /** - * Remove a tab - * @param {String} id The tab id with # - * @return this - */ - remove: function(id) { - this.find('ul.tabbar li a[href="' + id + '"]').parent().remove(); - $(id).remove(); - - if (this.data('tabs').selected == id) { - var first = this.find('ul.tabbar li:first a').attr('href'); - this.tabs('select', first); - } - } - }; - - /* - * Register the 'tabs' method to the jQuery objects - * the first argument of this method is the submethod - * you want to call - */ - $.fn.tabs = function(method) { - if ( methods[method] ) { - return methods[method].apply(this, Array.prototype.slice - .call(arguments, 1)); - } else if ( typeof method === 'object' || !method ) { - return methods.init.apply(this, arguments); - } else { - $.error('Method ' + method + ' does not exist on jQuery.tabs'); - } - }; - -})(jQuery); - - function log(msg, color) { $('#log').append($('<div></div>').css('background-color', color).text(msg)); } diff --git a/webclient/lib/jquery.tabs.js b/webclient/lib/jquery.tabs.js new file mode 100644 index 0000000..7898afa --- /dev/null +++ b/webclient/lib/jquery.tabs.js @@ -0,0 +1,121 @@ +/** + * Light jQuery tab plugin + * + * the html structure is: + * + * <div id="generalid"> + * <ul class="tabbar"> + * <li><a href="#tab-1">Title 1</a></li> + * </ul> + * <div id="tab-1"> + * Content 1 + * </div> + * </div> + */ +(function( $ ){ + + var methods = { + + /** + * Initialise the general tab area + * @return this (to preserve chainability) + */ + init: function() { + var tabs = this; + this.find('ul.tabbar li').bind('click.tabs', function(event){ + event.preventDefault(); + tabs.tabs('select',$(this).find('a').attr('href')); + }); + this.data('tabs',{}); + return this; + }, + + /** + * Select a tab + * @param {String} id The tab id with # + * @return this + */ + select: function(id) { + var selectedId = this.data('tabs').selected; + + if ( selectedId == id) { + return this; + } + + this.find('ul.tabbar li a[href="' + selectedId + '"]').parent().removeClass('selected'); + this.find('ul.tabbar li a[href="' + id + '"]').parent().addClass('selected'); + $(selectedId).hide(); + $(id).show(); + this.data('tabs').selected = id; + return this; + }, + + /** + * Add a tab + * @param {String} name The tab Title + * @param {String} id The tab id without # + * @pram {Bool} remove Wether the tab should be closable + * return this + */ + add: function(name, id, remove) { + var tabs = this; + var li = $('<li><a href="#' + id + '">' + name +'</a></li>'); + + if ( remove ) { + li.append('<span class="tab-close"/>'); + li.find('.tab-close').bind('click', function() { + tabs.tabs('remove', '#'+id); + }); + } + + li.bind('click.tabs',function(event){ + event.preventDefault(); + tabs.tabs('select',$(this).find('a').attr('href')); + }); + $(this).find('ul.tabbar').append(li); + $(this).append('<div class="tab" id="' + id + '"></div>'); + return this; + }, + + /** + * Test if a tab exists + * @param {String} id The tab id with # + * @return {Bool} + */ + exist: function(id) { + return (this.find('ul.tabbar li a[href="' + id + '"]').length != 0); + }, + + /** + * Remove a tab + * @param {String} id The tab id with # + * @return this + */ + remove: function(id) { + this.find('ul.tabbar li a[href="' + id + '"]').parent().remove(); + $(id).remove(); + + if (this.data('tabs').selected == id) { + var first = this.find('ul.tabbar li:first a').attr('href'); + this.tabs('select', first); + } + } + }; + + /* + * Register the 'tabs' method to the jQuery objects + * the first argument of this method is the submethod + * you want to call + */ + $.fn.tabs = function(method) { + if ( methods[method] ) { + return methods[method].apply(this, Array.prototype.slice + .call(arguments, 1)); + } else if ( typeof method === 'object' || !method ) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.tabs'); + } + }; + +})(jQuery);
\ No newline at end of file diff --git a/webclient/lib/jquery.tipTip.js b/webclient/lib/jquery.tipTip.js new file mode 100644 index 0000000..7eacf35 --- /dev/null +++ b/webclient/lib/jquery.tipTip.js @@ -0,0 +1,191 @@ + /* + * TipTip + * Copyright 2010 Drew Wilson + * www.drewwilson.com + * code.drewwilson.com/entry/tiptip-jquery-plugin + * + * Version 1.3 - Updated: Mar. 23, 2010 + * + * This Plug-In will create a custom tooltip to replace the default + * browser tooltip. It is extremely lightweight and very smart in + * that it detects the edges of the browser window and will make sure + * the tooltip stays within the current window size. As a result the + * tooltip will adjust itself to be displayed above, below, to the left + * or to the right depending on what is necessary to stay within the + * browser window. It is completely customizable as well via CSS. + * + * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +(function($){ + $.fn.tipTip = function(options) { + var defaults = { + activation: "hover", + keepAlive: false, + maxWidth: "200px", + edgeOffset: 3, + defaultPosition: "bottom", + delay: 400, + fadeIn: 200, + fadeOut: 200, + attribute: "title", + content: false, // HTML or String to fill TipTIp with + enter: function(){}, + exit: function(){} + }; + var opts = $.extend(defaults, options); + + // Setup tip tip elements and render them to the DOM + if($("#tiptip_holder").length <= 0){ + var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>'); + var tiptip_content = $('<div id="tiptip_content"></div>'); + var tiptip_arrow = $('<div id="tiptip_arrow"></div>'); + $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>'))); + } else { + var tiptip_holder = $("#tiptip_holder"); + var tiptip_content = $("#tiptip_content"); + var tiptip_arrow = $("#tiptip_arrow"); + } + + return this.each(function(){ + var org_elem = $(this); + if(opts.content){ + var org_title = opts.content; + } else { + var org_title = org_elem.attr(opts.attribute); + } + if(org_title != ""){ + if(!opts.content){ + org_elem.removeAttr(opts.attribute); //remove original Attribute + } + var timeout = false; + + if(opts.activation == "hover"){ + org_elem.hover(function(){ + active_tiptip(); + }, function(){ + if(!opts.keepAlive){ + deactive_tiptip(); + } + }); + if(opts.keepAlive){ + tiptip_holder.hover(function(){}, function(){ + deactive_tiptip(); + }); + } + } else if(opts.activation == "focus"){ + org_elem.focus(function(){ + active_tiptip(); + }).blur(function(){ + deactive_tiptip(); + }); + } else if(opts.activation == "click"){ + org_elem.click(function(){ + active_tiptip(); + return false; + }).hover(function(){},function(){ + if(!opts.keepAlive){ + deactive_tiptip(); + } + }); + if(opts.keepAlive){ + tiptip_holder.hover(function(){}, function(){ + deactive_tiptip(); + }); + } + } + + function active_tiptip(){ + opts.enter.call(this); + tiptip_content.html(org_title); + tiptip_holder.hide().removeAttr("class").css("margin","0"); + tiptip_arrow.removeAttr("style"); + + var top = parseInt(org_elem.offset()['top']); + var left = parseInt(org_elem.offset()['left']); + var org_width = parseInt(org_elem.outerWidth()); + var org_height = parseInt(org_elem.outerHeight()); + var tip_w = tiptip_holder.outerWidth(); + var tip_h = tiptip_holder.outerHeight(); + var w_compare = Math.round((org_width - tip_w) / 2); + var h_compare = Math.round((org_height - tip_h) / 2); + var marg_left = Math.round(left + w_compare); + var marg_top = Math.round(top + org_height + opts.edgeOffset); + var t_class = ""; + var arrow_top = ""; + var arrow_left = Math.round(tip_w - 12) / 2; + + if(opts.defaultPosition == "bottom"){ + t_class = "_bottom"; + } else if(opts.defaultPosition == "top"){ + t_class = "_top"; + } else if(opts.defaultPosition == "left"){ + t_class = "_left"; + } else if(opts.defaultPosition == "right"){ + t_class = "_right"; + } + + var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); + var left_compare = (tip_w + left) > parseInt($(window).width()); + + if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ + t_class = "_right"; + arrow_top = Math.round(tip_h - 13) / 2; + arrow_left = -12; + marg_left = Math.round(left + org_width + opts.edgeOffset); + marg_top = Math.round(top + h_compare); + } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ + t_class = "_left"; + arrow_top = Math.round(tip_h - 13) / 2; + arrow_left = Math.round(tip_w); + marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); + marg_top = Math.round(top + h_compare); + } + + var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); + var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; + + if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ + if(t_class == "_top" || t_class == "_bottom"){ + t_class = "_top"; + } else { + t_class = t_class+"_top"; + } + arrow_top = tip_h; + marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); + } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ + if(t_class == "_top" || t_class == "_bottom"){ + t_class = "_bottom"; + } else { + t_class = t_class+"_bottom"; + } + arrow_top = -12; + marg_top = Math.round(top + org_height + opts.edgeOffset); + } + + if(t_class == "_right_top" || t_class == "_left_top"){ + marg_top = marg_top + 5; + } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ + marg_top = marg_top - 5; + } + if(t_class == "_left_top" || t_class == "_left_bottom"){ + marg_left = marg_left + 5; + } + tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); + tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); + + if (timeout){ clearTimeout(timeout); } + timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); + } + + function deactive_tiptip(){ + opts.exit.call(this); + if (timeout){ clearTimeout(timeout); } + tiptip_holder.fadeOut(opts.fadeOut); + } + } + }); + } +})(jQuery);
\ No newline at end of file |
