(function($) { var kwtoicon = {}; var opts; $.fn.iconselector = function( options ) { opts = $.extend({}, $.fn.iconselector.defaults, options ); $.fn.iconselector.owner = $(this); if( opts.selectorButtons ) { $(opts.selectorButtons) .click(function(e) { _open.apply( $.fn.iconselector.owner, [ opts ] ); e.preventDefault(); }); } return $(this); }; // selected icon $.fn.iconselector.selected = null; // selected keyword $.fn.iconselector.selectedKeyword = null; $.fn.iconselector.defaults = { title: 'Choose Icon', width: "70%", height: $(window).height() * 0.8, selectedClass: "iconselector_selected", onSelect: function() {}, selectorButtons: null, // user options metatext: true, smallicons: false }; function _dialogHTML() { return "
\
\ \ Search: \ \ \ Meta text / No meta text\ Meta text / No meta text\ \ \ Small images / Large images\ Small images / Large images\ \
\ \
\ \
\
\
Loading...
\
"; }; function _selectContainer($container, keyword, replaceKwMenu) { $("#"+$.fn.iconselector.selected).removeClass(opts.selectedClass); if ( $container.length == 0 ) return; $.fn.iconselector.selected = $container.attr("id"); $container.addClass(opts.selectedClass); $container.show(); if ( keyword != null ) { // select by keyword $.fn.iconselector.selectedKeyword = keyword; } else { // select by picid (first keyword) $.fn.iconselector.selectedKeyword = $container.data("defaultkw"); } if ( replaceKwMenu ) { var $keywords = $container.find(".keywords"); $(".iconselector_top .keywords", $.fn.iconselector.instance) .replaceWith($keywords.clone()); if ($keywords.length > 0) $("#iconselector_select").prop("disabled", false); else $("#iconselector_select").prop("disabled", true); } else { $(".iconselector_top .selected", $.fn.iconselector.instance) .removeClass("selected"); } // can't rely on a cached value, because it may have been replaced $(".iconselector_top .keywords", $.fn.iconselector.instance) .find("a.keyword") .filter(function() { return $(this).text() == $.fn.iconselector.selectedKeyword; }) .addClass("selected"); } function _selectByKeyword(keyword) { var iconcontainer_id = kwtoicon[keyword]; if ( iconcontainer_id ) _selectContainer($("#"+iconcontainer_id), keyword, true); } function _selectByKeywordClick(event) { var $keyword = $(event.target).closest("a.keyword"); if ( $keyword.length > 0 ) { var keyword = $keyword.text(); var iconcontainer_id = kwtoicon[keyword]; if ( iconcontainer_id ) _selectContainer($("#"+iconcontainer_id), keyword, false); } event.stopPropagation(); event.preventDefault(); } function _selectByClick(event) { var $icon = $(event.target).closest("li"); var $keyword = $(event.target).closest("a.keyword"); _selectContainer($icon, $keyword.length > 0 ? $keyword.text() : null, true); event.stopPropagation(); event.preventDefault(); }; function _selectByEnter(event) { if (event.keyCode && event.keyCode === $.ui.keyCode.ENTER) { var $originalTarget = $(event.originalTarget); if ($originalTarget.hasClass("keyword")) { $originalTarget.click(); } else if ($originalTarget.is("a")) { return; } _selectCurrent(); } } function _selectCurrent() { if ($.fn.iconselector.selectedKeyword) { $.fn.iconselector.owner.val($.fn.iconselector.selectedKeyword); $.fn.iconselector.owner.trigger("change"); opts.onSelect.apply($.fn.iconselector.owner[0]); $.fn.iconselector.instance.dialog("close"); } } function _filterPics(event) { var val = $("#iconselector_search").val().toLocaleUpperCase(); $("#iconselector_icons_list li").hide().each(function(i, item) { if ( $(this).data("keywords").indexOf(val) != -1 || $(this).data("comment").indexOf(val) != -1 || $(this).data("alt").indexOf(val) != -1 ) { $(this).show(); } }); var $visible = $("#iconselector_icons_list li:visible"); if ( $visible.length == 1 ) _selectContainer($visible, null, true); }; function _persist( option, value ) { var params = {}; params[option] = value; // this is a best effort thing, so be silent about success/error $.post( "/__rpc_iconbrowser_save", params ); } function _open () { if ( ! $.fn.iconselector.instance ) { $.fn.iconselector.instance = $(_dialogHTML()); $.fn.iconselector.instance.dialog( { title: opts.title, width: opts.width, height: opts.height, dialogClass: "iconselector", modal: true, close: function() { $("#iconselect").focus(); }, resize: function() { $("#iconselector_icons").height( $.fn.iconselector.instance.height() - $.fn.iconselector.instance.find('.iconselector_top').height() - 5 ); } } ) .keydown(_selectByEnter); $("#iconselector_image_size_toggle a").click(function(e, init) { if ($(this).hasClass("half_image") ) { $("#iconselector_icons, #iconselector_image_size_toggle, #iconselector_icons_list").addClass("half_icons"); if ( ! init ) _persist( "smallicons", true ); } else { $("#iconselector_icons, #iconselector_image_size_toggle, #iconselector_icons_list").removeClass("half_icons"); if ( ! init ) _persist( "smallicons", false ); } //refocus $("#iconselector_image_size_toggle a:visible:first").focus(); return false; }).filter( opts.smallicons ? ".half_image" : ":not(.half_image)" ) .triggerHandler("click", true); $("#iconselector_image_text_toggle a").click(function(e, init) { if ($(this).hasClass("no_meta_text") ) { $("#iconselector_icons, #iconselector_image_text_toggle, #iconselector_icons_list").addClass("no_meta"); if ( ! init ) _persist( "metatext", false ); } else { $("#iconselector_icons, #iconselector_image_text_toggle, #iconselector_icons_list").removeClass("no_meta"); if ( ! init ) _persist( "metatext", true ); } // refocus because we just hid the link we clicked on $("#iconselector_image_text_toggle a:visible:first").focus(); return false; }).filter( opts.metatext ? ":not(.no_meta_text)" : ".no_meta_text" ) .triggerHandler("click", true); $("#iconselector_icons").height( $.fn.iconselector.instance.height() - $.fn.iconselector.instance.find('.iconselector_top').height() - 5 ); $("button", $.fn.iconselector.instance.siblings()).prop("disabled", true); $(":input", $.fn.iconselector.instance).prop("disabled", true); $("#iconselector_search", $.fn.iconselector.instance).bind("keyup click", _filterPics); var url = Site.currentJournalBase ? "/" + Site.currentJournal + "/__rpc_userpicselect" : "/__rpc_userpicselect"; $.getJSON(url, function(data) { if ( !data ) { $("#iconselector_icons").html("

Error

Unable to load icons data

"); return; } if ( data.alert ) { $("#iconselector_icons").html("

Error

"+data.alert+"

"); return; } var $iconslist = $(""); var pics = data.pics; $.each(data.ids, function(index,id) { var icon = pics[id]; var idstring = "iconselector_item_"+id; var $img = $("").attr( { src: icon.url, alt: icon.alt, height: icon.height, width: icon.width } ).wrap("
").parent(); var $keywords = ""; if ( icon.keywords ) { $keywords = $("
"); var last = icon.keywords.length - 1; $.each(icon.keywords, function(i, kw) { kwtoicon[kw] = idstring; $keywords.append( $("").text(kw) ); if ( i < last ) $keywords.append(document.createTextNode(", ")); }); } var $comment = ( icon.comment != "" ) ? $("
").text( icon.comment ) : ""; var $meta = $("
").append($keywords).append($comment); var $item = $("
").append($img).append($meta); $("
  • ").append($item).appendTo($iconslist) .data( "keywords", icon.keywords.join(" ").toLocaleUpperCase() ) .data( "comment", icon.comment.toLocaleUpperCase() ) .data( "alt", icon.alt.toLocaleUpperCase() ) .data( "defaultkw", icon.keywords[0] ) .attr( "id", idstring ); }); $("#iconselector_icons").empty().append($iconslist); $("button", $.fn.iconselector.instance.siblings()).prop("disabled", false); $(":input:not([id='iconselector_select'])", $.fn.iconselector.instance).prop("disabled", false); $("#iconselector_icons_list") .click(_selectByClick) .dblclick(function(e) { _selectByClick(e); _selectCurrent(); }); $(".iconselector_top .kwmenu", $.fn.iconselector.instance) .click(_selectByKeywordClick) .dblclick(function(e) { _selectByKeywordClick(e); _selectCurrent(); }); $("#iconselector_search").focus(); $("#iconselector_select").click(_selectCurrent); $(document).bind("keydown.dialog-overlay", _selectByEnter); // initialize _selectByKeyword($.fn.iconselector.owner.val()); }); } else { // reinitialize _selectByKeyword($.fn.iconselector.owner.val()); $.fn.iconselector.instance.dialog("open"); $("#iconselector_search").focus(); $(document).bind("keydown.dialog-overlay", _selectByEnter); } }; })(jQuery); jQuery(function($) { var browseButton = $("#lj_userpicselect"); if (browseButton.length > 0) { $("#prop_picture_keyword").iconselector({ selectorButtons: "#lj_userpicselect, .lj_userpicselect_extra", metatext: browseButton.data("iconbrowserMetatext"), smallicons: browseButton.data("iconbrowserSmallicons") }); } });