@ -0,0 +1,36 @@ |
|||||||
|
twister-html authors |
||||||
|
==================== |
||||||
|
|
||||||
|
Miguel Freitas |
||||||
|
Original javascript code and basic UI functionality |
||||||
|
|
||||||
|
Lucas Leal |
||||||
|
Original theme, CSS + artwork |
||||||
|
|
||||||
|
Msjoinder |
||||||
|
Polyglot support (internationalization), multiple fixes |
||||||
|
|
||||||
|
erkan yüksel |
||||||
|
Image preview, automatic unicode conversion, split long posts, hiding posts with mentions and more. |
||||||
|
|
||||||
|
Hedgehog |
||||||
|
Calm theme, CSS + artwork and more. |
||||||
|
|
||||||
|
Denis Ryabov |
||||||
|
Tox and bitmessage profile fields, multiple fixes |
||||||
|
|
||||||
|
Giacomo Lacava |
||||||
|
i18n branch maintainer, fixes |
||||||
|
|
||||||
|
BlockTester |
||||||
|
Secret key button, exit button, fixes |
||||||
|
|
||||||
|
Dionysis Zindros |
||||||
|
Several visual fixes |
||||||
|
|
||||||
|
digital-dreamer |
||||||
|
Guest mode browsing |
||||||
|
|
||||||
|
Mylène Bressan |
||||||
|
Nin theme |
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) 2013-2014 Miguel Freitas, Lucas Leal and twister project developers. |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in |
||||||
|
all copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
||||||
|
THE SOFTWARE. |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 3.0 KiB |
@ -1,463 +0,0 @@ |
|||||||
// interface_common.js
|
|
||||||
// 2013 Lucas Leal, Miguel Freitas
|
|
||||||
//
|
|
||||||
// Common interface functions to all pages, modal manipulation, button manipulation etc
|
|
||||||
// Profile, mentions and hashtag modal
|
|
||||||
// Post actions: submit, count characters
|
|
||||||
|
|
||||||
//dispara o modal genérico
|
|
||||||
//o modalClass me permite fazer tratamentos específicos de CSS para cada modal
|
|
||||||
function openModal( modalClass ) |
|
||||||
{ |
|
||||||
var $oldModal = $("body").children(".modal-blackout"); |
|
||||||
var $template = $( "#templates" ); |
|
||||||
var $templateModal = $template.find( ".modal-blackout" ).clone(true); |
|
||||||
|
|
||||||
$templateModal.addClass( modalClass ); |
|
||||||
if( $oldModal.length ) { |
|
||||||
$templateModal.show(); |
|
||||||
$oldModal.replaceWith($templateModal); |
|
||||||
} else { |
|
||||||
$templateModal.prependTo( "body" ).fadeIn( "fast" ); |
|
||||||
} |
|
||||||
|
|
||||||
//escondo o overflow da tela
|
|
||||||
var $body = $( "body" ); |
|
||||||
$body.css({ |
|
||||||
"overflow": "hidden", |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
//fecha o modal removendo o conteúdo por detach
|
|
||||||
function closeModal($this) |
|
||||||
{ |
|
||||||
var $body = $( "body" ); |
|
||||||
var $modalWindows = $( "body" ).children( ".modal-blackout" ); |
|
||||||
|
|
||||||
$modalWindows.fadeOut( "fast", function() |
|
||||||
{ |
|
||||||
$modalWindows.detach(); |
|
||||||
}); |
|
||||||
$body.css({ |
|
||||||
"overflow": "auto", |
|
||||||
"margin-right": "0" |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
function checkNetworkStatusAndAskRedirect(cbFunc, cbArg) { |
|
||||||
networkUpdate(function(args) { |
|
||||||
if( !twisterdConnectedAndUptodate ) { |
|
||||||
var redirect = |
|
||||||
window.confirm(polyglot.t("switch_to_network")); |
|
||||||
if( redirect ) |
|
||||||
$.MAL.goNetwork(); |
|
||||||
} else { |
|
||||||
if( args.cbFunc ) |
|
||||||
args.cbFunc(args.cbArg); |
|
||||||
} |
|
||||||
}, {cbFunc:cbFunc,cbArg:cbArg}); |
|
||||||
} |
|
||||||
|
|
||||||
function timeGmtToText(t) { |
|
||||||
var d = new Date(0); |
|
||||||
d.setUTCSeconds(t); |
|
||||||
return d.toString().replace(/GMT.*/g,""); |
|
||||||
} |
|
||||||
|
|
||||||
function timeSincePost(t) { |
|
||||||
var d = new Date(0); |
|
||||||
d.setUTCSeconds(t); |
|
||||||
var now = new Date(); |
|
||||||
var t_delta = Math.ceil((now - d) / 1000); |
|
||||||
var expression = ""; |
|
||||||
if(t_delta < 60) { |
|
||||||
expression = polyglot.t("seconds", t_delta); |
|
||||||
} |
|
||||||
else if(t_delta < 60 * 60) { |
|
||||||
expression = polyglot.t("minutes", Math.floor(t_delta/60)); |
|
||||||
} |
|
||||||
else if(t_delta < 24 * 60 * 60) { |
|
||||||
expression = polyglot.t("hours", Math.floor(t_delta/60/60)); |
|
||||||
} |
|
||||||
else { |
|
||||||
expression = polyglot.t("days", Math.floor(t_delta/24/60/60)); |
|
||||||
} |
|
||||||
return polyglot.t("time_ago", { time: expression }); |
|
||||||
} |
|
||||||
|
|
||||||
//
|
|
||||||
// Profile, mentions, hashtag, and following modal
|
|
||||||
// -----------------------------------
|
|
||||||
|
|
||||||
function newProfileModal(username) { |
|
||||||
var profileModalContent = $( "#profile-modal-template" ).children().clone(true); |
|
||||||
|
|
||||||
updateProfileData(profileModalContent, username); |
|
||||||
|
|
||||||
return profileModalContent; |
|
||||||
} |
|
||||||
|
|
||||||
function openProfileModal(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
|
|
||||||
var $this = $( this ); |
|
||||||
var username = $.MAL.urlToUser( $this.attr("href") ); |
|
||||||
|
|
||||||
var profileModalClass = "profile-modal"; |
|
||||||
openModal( profileModalClass ); |
|
||||||
|
|
||||||
var profileModalContent = newProfileModal( username ); |
|
||||||
profileModalContent.appendTo("." +profileModalClass + " .modal-content"); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
$( "."+profileModalClass + " h3" ).text( polyglot.t("users_profile", { username: username }) ); |
|
||||||
} |
|
||||||
|
|
||||||
function newHashtagModal(hashtag) { |
|
||||||
var hashtagModalContent = $( "#hashtag-modal-template" ).children().clone(true); |
|
||||||
hashtagModalContent.find( ".postboard-news").click(function (){ |
|
||||||
$(this).hide(); |
|
||||||
displayHashtagPending($(".hashtag-modal .postboard-posts")); |
|
||||||
}); |
|
||||||
|
|
||||||
clearHashtagProcessed(); |
|
||||||
updateHashtagModal( hashtagModalContent.find(".postboard-posts"), hashtag ); |
|
||||||
|
|
||||||
return hashtagModalContent; |
|
||||||
} |
|
||||||
|
|
||||||
function openHashtagModal(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
|
|
||||||
var $this = $( this ); |
|
||||||
var hashtag = $this.text().substring(1); |
|
||||||
|
|
||||||
var hashtagModalClass = "hashtag-modal"; |
|
||||||
openModal( hashtagModalClass ); |
|
||||||
$( "."+hashtagModalClass ).attr("data-resource","hashtag"); |
|
||||||
|
|
||||||
var hashtagModalContent = newHashtagModal( hashtag ); |
|
||||||
hashtagModalContent.appendTo("." +hashtagModalClass + " .modal-content"); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
$( "."+hashtagModalClass + " h3" ).text( "#" + hashtag ); |
|
||||||
} |
|
||||||
|
|
||||||
function updateHashtagModal(postboard,hashtag) { |
|
||||||
var $hashtagModalClass = $(".hashtag-modal"); |
|
||||||
if( !$hashtagModalClass.length || $hashtagModalClass.css("display") == 'none' ) |
|
||||||
return; |
|
||||||
|
|
||||||
var resource = $hashtagModalClass.attr("data-resource"); |
|
||||||
|
|
||||||
requestHashtag(postboard,hashtag,resource); |
|
||||||
setTimeout( function() {updateHashtagModal(postboard,hashtag);}, 5000); |
|
||||||
} |
|
||||||
|
|
||||||
function openMentionsModal(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
|
|
||||||
// reuse the same hashtag modal to show mentions
|
|
||||||
var hashtagModalClass = "hashtag-modal"; |
|
||||||
openModal( hashtagModalClass ); |
|
||||||
$( "."+hashtagModalClass ).attr("data-resource","mention"); |
|
||||||
|
|
||||||
var username; |
|
||||||
var $userInfo = $(this).closest("[data-screen-name]"); |
|
||||||
if( $userInfo.length ) |
|
||||||
username = $userInfo.attr("data-screen-name"); |
|
||||||
else |
|
||||||
username = defaultScreenName; |
|
||||||
|
|
||||||
var hashtagModalContent = newHashtagModal( username ); |
|
||||||
hashtagModalContent.appendTo("." +hashtagModalClass + " .modal-content"); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
$( "."+hashtagModalClass + " h3" ).text( polyglot.t("users_mentions", { username: username }) ); |
|
||||||
|
|
||||||
// obtain already cached mention posts from twister_newmsgs.js
|
|
||||||
processHashtag(hashtagModalContent.find(".postboard-posts"), defaultScreenName, getMentionsData() ); |
|
||||||
resetMentionsCount(); |
|
||||||
} |
|
||||||
|
|
||||||
function newFollowingModal(username) { |
|
||||||
var followingModalContent = $( "#following-modal-template" ).children().clone(true); |
|
||||||
|
|
||||||
updateFollowingData(followingModalContent, username); |
|
||||||
|
|
||||||
return followingModalContent; |
|
||||||
} |
|
||||||
|
|
||||||
function openFollowingModal(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
|
|
||||||
var $this = $( this ); |
|
||||||
var username = $.MAL.followingUrlToUser( $this.attr("href") ); |
|
||||||
|
|
||||||
var followingModalClass = "following-modal"; |
|
||||||
openModal( followingModalClass ); |
|
||||||
|
|
||||||
var followingModalContent = newFollowingModal( username ); |
|
||||||
followingModalContent.appendTo("." +followingModalClass + " .modal-content"); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
$( "."+followingModalClass + " h3" ).text( polyglot.t("followed_by", { username: username }) ); |
|
||||||
} |
|
||||||
|
|
||||||
//
|
|
||||||
// Post actions, submit, count characters
|
|
||||||
// --------------------------------------
|
|
||||||
//dispara o modal de retweet
|
|
||||||
var reTwistPopup = function( e ) |
|
||||||
{ |
|
||||||
var reTwistClass = "reTwist"; |
|
||||||
openModal( reTwistClass ); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
$( ".reTwist h3" ).text( polyglot.t("retransmit_this") ); |
|
||||||
|
|
||||||
var postdata = $(this).parents(".post-data").attr("data-userpost"); |
|
||||||
var postElem = postToElem($.evalJSON(postdata),""); |
|
||||||
postElem.appendTo( ".reTwist .modal-content" ); |
|
||||||
|
|
||||||
e.stopPropagation(); |
|
||||||
} |
|
||||||
|
|
||||||
//Expande Área do Novo post
|
|
||||||
var replyInitPopup = function(e, post) |
|
||||||
{ |
|
||||||
var replyClass = "reply"; |
|
||||||
openModal( replyClass ); |
|
||||||
|
|
||||||
//título do modal
|
|
||||||
var fullname = post.find(".post-info-name").text(); |
|
||||||
$( ".reply h3" ).text( polyglot.t("reply_to", { fullname: fullname }) ); |
|
||||||
|
|
||||||
//para poder exibir a thread selecionada...
|
|
||||||
var replyModalContent = $(".reply .modal-content").hide(); |
|
||||||
var retweetContent = $( "#reply-modal-template" ).children().clone(true); |
|
||||||
retweetContent.appendTo(replyModalContent); |
|
||||||
|
|
||||||
var postdata = post.find(".post-data").attr("data-userpost"); |
|
||||||
var postElem = postToElem($.evalJSON(postdata),""); |
|
||||||
postElem.appendTo(replyModalContent); |
|
||||||
|
|
||||||
var replyArea = $(".reply .post-area .post-area-new"); |
|
||||||
replyArea.addClass("open"); |
|
||||||
var replyText = replyArea.find("textarea"); |
|
||||||
var postInlineReplyText = $(".reply .post .post-area-new textarea"); |
|
||||||
|
|
||||||
var attrToCopy = ["placeholder", "data-reply-to"]; |
|
||||||
$.each(attrToCopy, function( i, attribute ) { |
|
||||||
replyText.attr( attribute, postInlineReplyText.attr(attribute) ); |
|
||||||
}); |
|
||||||
composeNewPost(e, replyArea); |
|
||||||
|
|
||||||
replyModalContent.fadeIn( "fast" ); |
|
||||||
} |
|
||||||
|
|
||||||
//abre o menu dropdown de configurações
|
|
||||||
var dropDownMenu = function( e ) |
|
||||||
{ |
|
||||||
var $configMenu = $( ".config-menu" ); |
|
||||||
$configMenu.slideToggle( "fast" ); |
|
||||||
e.stopPropagation(); |
|
||||||
} |
|
||||||
|
|
||||||
//fecha o config menu ao clicar em qualquer lugar da tela
|
|
||||||
var closeThis = function() |
|
||||||
{ |
|
||||||
$( this ).slideUp( "fast" ); |
|
||||||
}; |
|
||||||
|
|
||||||
var postExpandFunction = function( e, postLi ) |
|
||||||
{ |
|
||||||
if( !postLi.hasClass( "original" ) ) { |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
var originalPost = postLi.find(".post-data.original"); |
|
||||||
var $postInteractionText = originalPost.find( ".post-expand" ); |
|
||||||
var $postExpandedContent = originalPost.find( ".expanded-content" ); |
|
||||||
var $postsRelated = postLi.find(".related"); |
|
||||||
|
|
||||||
var openClass = "open"; |
|
||||||
if( !postLi.hasClass( openClass ) ) { |
|
||||||
originalPost.detach(); |
|
||||||
postLi.empty(); |
|
||||||
postLi.addClass( openClass ); |
|
||||||
$postInteractionText.text( polyglot.t("Collapse") ); |
|
||||||
|
|
||||||
var itemOl = $("<ol/>", {class:"expanded-post"}).appendTo(postLi); |
|
||||||
var originalLi = $("<li/>", {class: "module post original"}).appendTo(itemOl); |
|
||||||
originalLi.append(originalPost); |
|
||||||
|
|
||||||
$postExpandedContent.slideDown( "fast" ); |
|
||||||
|
|
||||||
// insert "reply_to" before
|
|
||||||
requestRepliedBefore(originalLi); |
|
||||||
// insert replies to this post after
|
|
||||||
requestRepliesAfter(originalLi); |
|
||||||
// RTs faces and counter
|
|
||||||
requestRTs(originalLi); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
postLi.removeClass( openClass ); |
|
||||||
$postInteractionText.text( polyglot.t("Expand") ); |
|
||||||
|
|
||||||
if( $postsRelated ) $postsRelated.slideUp( "fast" ); |
|
||||||
$postExpandedContent.slideUp( "fast", function() |
|
||||||
{ |
|
||||||
originalPost.detach(); |
|
||||||
postLi.empty(); |
|
||||||
postLi.append(originalPost); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
e.stopPropagation(); |
|
||||||
} |
|
||||||
|
|
||||||
var postReplyClick = function( e ) |
|
||||||
{ |
|
||||||
var post = $(this).closest(".post"); |
|
||||||
if( !post.hasClass( "original" ) ) { |
|
||||||
replyInitPopup(e, post); |
|
||||||
} else { |
|
||||||
var postLiOpen = post.parents(".post.open"); |
|
||||||
if( !postLiOpen.length ) { |
|
||||||
postExpandFunction(e, post); |
|
||||||
} |
|
||||||
var postAreaNew = post.find(".post-area-new") |
|
||||||
composeNewPost(e, postAreaNew); |
|
||||||
} |
|
||||||
e.stopPropagation(); |
|
||||||
} |
|
||||||
|
|
||||||
//Expande Área do Novo post
|
|
||||||
var composeNewPost = function( e, postAreaNew ) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
if( !postAreaNew.hasClass("open") ) { |
|
||||||
postAreaNew.addClass( "open" ); |
|
||||||
//se o usuário clicar fora é pra fechar
|
|
||||||
postAreaNew.clickoutside( unfocusThis ) |
|
||||||
} |
|
||||||
|
|
||||||
var textArea = postAreaNew.find("textarea"); |
|
||||||
textArea.focus(); |
|
||||||
if( textArea.attr("data-reply-to") && !textArea.val().length ) { |
|
||||||
textArea.val(textArea.attr("data-reply-to")); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
//Reduz Área do Novo post
|
|
||||||
var unfocusThis = function() |
|
||||||
{ |
|
||||||
var $this = $( this ); |
|
||||||
$this.removeClass( "open" ); |
|
||||||
} |
|
||||||
|
|
||||||
function replyTextKeypress(e) { |
|
||||||
e = e || event; |
|
||||||
var $this = $( this ); |
|
||||||
var tweetForm = $this.parents("form"); |
|
||||||
if( tweetForm != undefined ) { |
|
||||||
var c = 140 - $this.val().length; |
|
||||||
var remainingCount = tweetForm.find(".post-area-remaining"); |
|
||||||
remainingCount.text(c); |
|
||||||
if( c < 0 ) remainingCount.addClass("warn"); |
|
||||||
else remainingCount.removeClass("warn"); |
|
||||||
|
|
||||||
var tweetAction = tweetForm.find(".post-submit"); |
|
||||||
if( !tweetAction.length ) tweetAction = tweetForm.find(".dm-submit"); |
|
||||||
if( c >= 0 && c < 140 && |
|
||||||
$this.val() != $this.attr("data-reply-to") ) { |
|
||||||
$.MAL.enableButton(tweetAction); |
|
||||||
} else { |
|
||||||
$.MAL.disableButton(tweetAction); |
|
||||||
} |
|
||||||
|
|
||||||
if (e.keyCode === 13) { |
|
||||||
if (!e.ctrlKey) { |
|
||||||
$this.val($this.val().trim()); |
|
||||||
if( !tweetAction.hasClass("disabled") ) { |
|
||||||
tweetAction.click(); |
|
||||||
} |
|
||||||
} else { |
|
||||||
$this.val($this.val() + "\r"); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
var postSubmit = function(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
var $this = $( this ); |
|
||||||
var $replyText = $this.closest(".post-area-new").find("textarea"); |
|
||||||
|
|
||||||
var $postOrig = $this.closest(".post-data"); |
|
||||||
|
|
||||||
if (!$postOrig.length) { |
|
||||||
$postOrig = $this.closest(".modal-content").find(".post-data"); |
|
||||||
} |
|
||||||
|
|
||||||
newPostMsg($replyText.val(), $postOrig); |
|
||||||
|
|
||||||
$replyText.val(""); |
|
||||||
$replyText.attr("placeholder", polyglot.t("Your message was sent!")); |
|
||||||
var tweetForm = $this.parents("form"); |
|
||||||
var remainingCount = tweetForm.find(".post-area-remaining"); |
|
||||||
remainingCount.text(140); |
|
||||||
$replyText.attr("placeholder", "Your message was sent!"); |
|
||||||
closeModal($this); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
var retweetSubmit = function(e) |
|
||||||
{ |
|
||||||
e.stopPropagation(); |
|
||||||
e.preventDefault(); |
|
||||||
var $this = $( this ); |
|
||||||
|
|
||||||
var $postOrig = $this.closest(".modal-wrapper").find(".post-data"); |
|
||||||
|
|
||||||
newRtMsg($postOrig); |
|
||||||
|
|
||||||
closeModal($this); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function initInterfaceCommon() { |
|
||||||
$( "body" ).on( "click", ".cancel" , function() { closeModal($(this)); } ); |
|
||||||
$( ".post-reply" ).bind( "click", postReplyClick ); |
|
||||||
$( ".post-propagate" ).bind( "click", reTwistPopup ); |
|
||||||
$( ".userMenu-config-dropdown" ).bind( "click", dropDownMenu ); |
|
||||||
$( ".config-menu" ).clickoutside( closeThis ); |
|
||||||
$( ".module.post" ).bind( "click", function(e) { |
|
||||||
postExpandFunction(e,$(this)); }); |
|
||||||
$( ".post-area-new" ).bind( "click", function(e) { |
|
||||||
composeNewPost(e,$(this));} ); |
|
||||||
$( ".post-area-new" ).clickoutside( unfocusThis ); |
|
||||||
$( ".post-submit").click( postSubmit ); |
|
||||||
$( ".modal-propagate").click( retweetSubmit ); |
|
||||||
|
|
||||||
var $replyText = $( ".post-area-new textarea" ); |
|
||||||
$replyText.keyup( replyTextKeypress ); |
|
||||||
|
|
||||||
$( ".open-profile-modal").bind( "click", openProfileModal ); |
|
||||||
$( ".open-hashtag-modal").bind( "click", openHashtagModal ); |
|
||||||
$( ".open-following-modal").bind( "click", openFollowingModal ); |
|
||||||
$( ".userMenu-connections a").bind( "click", openMentionsModal ); |
|
||||||
} |
|
@ -1,85 +0,0 @@ |
|||||||
// interface_home.js
|
|
||||||
// 2013 Lucas Leal, Miguel Freitas
|
|
||||||
//
|
|
||||||
// Specific interface functions for home.html
|
|
||||||
|
|
||||||
//***********************************************
|
|
||||||
//******************* DECLARATIONS **************
|
|
||||||
//***********************************************
|
|
||||||
var InterfaceFunctions = function() |
|
||||||
{ |
|
||||||
//faço os binds no init
|
|
||||||
this.init = function() |
|
||||||
{ |
|
||||||
$( ".wrapper .postboard-news").click(function() { |
|
||||||
requestTimelineUpdate("latest",postsPerRefresh,followingUsers);}); |
|
||||||
|
|
||||||
initInterfaceCommon(); |
|
||||||
initUserSearch(); |
|
||||||
initInterfaceDirectMsg(); |
|
||||||
|
|
||||||
initUser(initHome); |
|
||||||
} |
|
||||||
|
|
||||||
function initHome(cbFunc, cbArg) { |
|
||||||
if( !defaultScreenName ) { |
|
||||||
alert(polyglot.t("username_undefined")); |
|
||||||
$.MAL.goLogin(); |
|
||||||
return; |
|
||||||
} |
|
||||||
checkNetworkStatusAndAskRedirect(); |
|
||||||
|
|
||||||
//$("span.screen-name").text('@' + user);
|
|
||||||
var $miniProfile = $(".mini-profile"); |
|
||||||
$miniProfile.find("a.mini-profile-name").attr("href",$.MAL.userUrl(defaultScreenName)); |
|
||||||
$miniProfile.find("a.open-profile-modal").attr("href",$.MAL.userUrl(defaultScreenName)); |
|
||||||
$miniProfile.find(".mini-profile-name").text(defaultScreenName); |
|
||||||
getFullname( defaultScreenName, $miniProfile.find(".mini-profile-name") ); |
|
||||||
getAvatar( defaultScreenName, $miniProfile.find(".mini-profile-photo").find("img") ); |
|
||||||
getPostsCount( defaultScreenName, $miniProfile.find(".posts-count") ); |
|
||||||
getFollowers( defaultScreenName, $miniProfile.find(".followers-count") ); |
|
||||||
|
|
||||||
loadFollowing( function(args) { |
|
||||||
$(".mini-profile .following-count").text(followingUsers.length-1); |
|
||||||
requestLastHave(); |
|
||||||
setInterval("requestLastHave()", 1000); |
|
||||||
initMentionsCount(); |
|
||||||
initDMsCount(); |
|
||||||
requestTimelineUpdate("latestFirstTime",postsPerRefresh,followingUsers); |
|
||||||
|
|
||||||
// install scrollbottom handler to load more posts as needed
|
|
||||||
$(window).scroll(function(){ |
|
||||||
if ($(window).scrollTop() >= $(document).height() - $(window).height() - 20){ |
|
||||||
if( timelineLoaded ) { |
|
||||||
requestTimelineUpdate("older", postsPerRefresh, followingUsers); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
|
||||||
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
|
||||||
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
|
||||||
if( args.cbFunc ) |
|
||||||
args.cbFunc(args.cbArg); |
|
||||||
}, {cbFunc:cbFunc, cbArg:cbArg}); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
//***********************************************
|
|
||||||
//******************* INIT **************
|
|
||||||
//***********************************************
|
|
||||||
var interfaceFunctions = new InterfaceFunctions; |
|
||||||
$( document ).ready( interfaceFunctions.init ); |
|
||||||
|
|
||||||
|
|
||||||
//função no window que fixa o header das postagens
|
|
||||||
function fixDiv() |
|
||||||
{ |
|
||||||
var $cache = $('.postboard h2'); |
|
||||||
if ($(window).scrollTop() > 26) |
|
||||||
$cache.addClass( "fixed" ); |
|
||||||
else |
|
||||||
$cache.removeClass( "fixed" ); |
|
||||||
} |
|
||||||
|
|
||||||
$(window).scroll(fixDiv); |
|
@ -0,0 +1,35 @@ |
|||||||
|
$(function(){ |
||||||
|
$('#showqr').on('click', function(){ |
||||||
|
if($('#qrcode img')[0]) return; |
||||||
|
var skey = document.getElementById('skey').innerText; |
||||||
|
new QRCode(document.getElementById("qrcode"), skey); |
||||||
|
}); |
||||||
|
$('.tox-ctc').on('click', function(){ |
||||||
|
window.prompt('Press Ctrl/Cmd+C to copy then Enter to close', $(this).attr('data')) |
||||||
|
}) |
||||||
|
$('.bitmessage-ctc').on('click', function(){ |
||||||
|
window.prompt('Press Ctrl/Cmd+C to copy then Enter to close', $(this).attr('data')) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
function dhtIndicatorBg(){ |
||||||
|
var bgcolor = ''; |
||||||
|
if(twisterDhtNodes <= 20){bgcolor = '#770900' |
||||||
|
}else if(twisterDhtNodes <= 60){bgcolor = '#773400' |
||||||
|
}else if(twisterDhtNodes <= 90){bgcolor = '#774c00' |
||||||
|
}else if(twisterDhtNodes <= 120){bgcolor = '#776400' |
||||||
|
}else if(twisterDhtNodes <= 150){bgcolor = '#707500' |
||||||
|
}else if(twisterDhtNodes <= 180){bgcolor = '#3f6900' |
||||||
|
}else if(twisterDhtNodes <= 210){bgcolor = '#005f15' |
||||||
|
}else if(twisterDhtNodes >= 250){bgcolor = '#009922' |
||||||
|
} |
||||||
|
$('.userMenu-dhtindicator').animate({'background-color': bgcolor }); |
||||||
|
}; |
||||||
|
setTimeout(dhtIndicatorBg, 300); |
||||||
|
setTimeout(function() {setInterval(dhtIndicatorBg, 2000)}, 400); |
||||||
|
|
||||||
|
|
||||||
|
function homeIntInit () { |
||||||
|
setTimeout(mensAutocomplete, 800); |
||||||
|
} |
@ -0,0 +1,177 @@ |
|||||||
|
// interface_home.js
|
||||||
|
// 2013 Lucas Leal, Miguel Freitas
|
||||||
|
//
|
||||||
|
// Specific interface functions for home.html
|
||||||
|
|
||||||
|
var promotedPostsOnly = false; |
||||||
|
|
||||||
|
//***********************************************
|
||||||
|
//******************* DECLARATIONS **************
|
||||||
|
//***********************************************
|
||||||
|
var InterfaceFunctions = function() |
||||||
|
{ |
||||||
|
//faço os binds no init
|
||||||
|
this.init = function() |
||||||
|
{ |
||||||
|
$( ".wrapper .postboard-news").click(function() { |
||||||
|
requestTimelineUpdate("latest",postsPerRefresh,followingUsers,promotedPostsOnly);}); |
||||||
|
|
||||||
|
|
||||||
|
/*$( ".promoted-posts-only").click(function() { |
||||||
|
promotedPostsOnly = !promotedPostsOnly; |
||||||
|
$(this).text( promotedPostsOnly ? "Switch to Normal posts" : "Switch to Promoted posts" ); |
||||||
|
timelineChangedUser(); |
||||||
|
$.MAL.getStreamPostsParent().empty(); |
||||||
|
requestTimelineUpdate("latestFirstTime",postsPerRefresh,followingUsers,promotedPostsOnly); |
||||||
|
});*/ |
||||||
|
|
||||||
|
|
||||||
|
// Add refresh posts for home link in menu
|
||||||
|
$( ".userMenu-home.current a").click(function() { |
||||||
|
requestTimelineUpdate("latest",postsPerRefresh,followingUsers,promotedPostsOnly);}); |
||||||
|
|
||||||
|
// modified the way promoted posts are shown
|
||||||
|
$( ".promoted-posts-only").click(function() { |
||||||
|
promotedPostsOnly = !promotedPostsOnly; |
||||||
|
//active promoted posts tab
|
||||||
|
$(this).children('.promoted-posts').addClass(promotedPostsOnly ? "active" : "disabled"); |
||||||
|
$(this).children('.normal-posts').addClass(promotedPostsOnly ? "disabled" : "active"); |
||||||
|
$('#postboard-top').removeClass(promotedPostsOnly ? "show" : "hide"); |
||||||
|
//active normal posts
|
||||||
|
$(this).children('.promoted-posts').removeClass(promotedPostsOnly ? "disabled" : "active"); |
||||||
|
$(this).children('.normal-posts').removeClass(promotedPostsOnly ? "active" : "disabled"); |
||||||
|
$('#postboard-top').addClass(promotedPostsOnly ? "hide" : "show"); |
||||||
|
|
||||||
|
timelineChangedUser(); |
||||||
|
$.MAL.getStreamPostsParent().empty(); |
||||||
|
requestTimelineUpdate("latestFirstTime",postsPerRefresh,followingUsers,promotedPostsOnly); |
||||||
|
}); |
||||||
|
|
||||||
|
initInterfaceCommon(); |
||||||
|
initUserSearch(); |
||||||
|
initInterfaceDirectMsg(); |
||||||
|
|
||||||
|
initUser(initHome); |
||||||
|
}; |
||||||
|
|
||||||
|
function initHome(cbFunc, cbArg) { |
||||||
|
checkNetworkStatusAndAskRedirect(); |
||||||
|
|
||||||
|
//$("span.screen-name").text('@' + user);
|
||||||
|
var $miniProfile = $(".mini-profile"); |
||||||
|
if(!defaultScreenName) |
||||||
|
{ |
||||||
|
$(".userMenu-profile > a").text(polyglot.t("Login")); |
||||||
|
$(".userMenu-profile > a").attr("href","login.html"); |
||||||
|
$(".post-area-new > textarea").attr("placeholder",polyglot.t("You have to log in to post messages.")); |
||||||
|
$(".post-area-new > textarea").attr("disabled","true"); |
||||||
|
$miniProfile.find(".mini-profile-name").text("guest"); |
||||||
|
$miniProfile.find(".posts-count").text("0"); |
||||||
|
$miniProfile.find(".following-count").text("0"); |
||||||
|
$miniProfile.find(".followers-count").text("0"); |
||||||
|
$miniProfile.find("a.open-following-page").attr("href","#"); |
||||||
|
$miniProfile.find("a.open-following-page").bind("click", function() |
||||||
|
{ alert(polyglot.t("You are not following anyone because you are not logged in."))} ); |
||||||
|
$miniProfile.find("a.open-followers").bind("click", function() |
||||||
|
{ alert(polyglot.t("You don't have any followers because you are not logged in."))} ); |
||||||
|
$(".dropdown-menu-following").attr("href","#"); |
||||||
|
$(".dropdown-menu-following").bind("click", function() |
||||||
|
{ alert(polyglot.t("You are not following anyone because you are not logged in."))} ); |
||||||
|
twisterRpc("gettrendinghashtags", [10], |
||||||
|
function(args, ret) { |
||||||
|
for( var i = 0; i < ret.length; i++ ) { |
||||||
|
|
||||||
|
var $li = $("<li>"); |
||||||
|
var hashtagLinkTemplate = $("#hashtag-link-template").clone(true); |
||||||
|
hashtagLinkTemplate.removeAttr("id"); |
||||||
|
hashtagLinkTemplate.attr("href",$.MAL.hashtagUrl(ret[i])); |
||||||
|
hashtagLinkTemplate.text("#"+ret[i]); |
||||||
|
$li.append(hashtagLinkTemplate); |
||||||
|
$(".toptrends-list").append($li); |
||||||
|
} |
||||||
|
}, {}, |
||||||
|
function(args, ret) { |
||||||
|
console.log("Error with gettrendinghashtags. Older twister daemon?"); |
||||||
|
}, {}); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
$miniProfile.find("a.mini-profile-name").attr("href",$.MAL.userUrl(defaultScreenName)); |
||||||
|
$miniProfile.find("a.open-profile-modal").attr("href",$.MAL.userUrl(defaultScreenName)); |
||||||
|
$miniProfile.find(".mini-profile-name").text(defaultScreenName); |
||||||
|
getFullname( defaultScreenName, $miniProfile.find(".mini-profile-name") ); |
||||||
|
getAvatar( defaultScreenName, $miniProfile.find(".mini-profile-photo").find("img") ); |
||||||
|
// add avatar in postboard-top
|
||||||
|
getAvatar( defaultScreenName, $("#postboard-top").find("img") ); |
||||||
|
getPostsCount( defaultScreenName, $miniProfile.find(".posts-count") ); |
||||||
|
getFollowers( defaultScreenName, $miniProfile.find(".followers-count") ); |
||||||
|
|
||||||
|
loadFollowing( function(args) { |
||||||
|
$(".mini-profile .following-count").text(followingUsers.length-1); |
||||||
|
requestLastHave(); |
||||||
|
setInterval("requestLastHave()", 1000); |
||||||
|
initMentionsCount(); |
||||||
|
initDMsCount(); |
||||||
|
requestTimelineUpdate("latestFirstTime",postsPerRefresh,followingUsers,promotedPostsOnly); |
||||||
|
|
||||||
|
// install scrollbottom handler to load more posts as needed
|
||||||
|
$(window).scroll(function(){ |
||||||
|
if ($(window).scrollTop() >= $(document).height() - $(window).height() - 20){ |
||||||
|
if( timelineLoaded ) { |
||||||
|
requestTimelineUpdate("older", postsPerRefresh, followingUsers, promotedPostsOnly); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
twisterFollowingO = TwisterFollowing(defaultScreenName); |
||||||
|
|
||||||
|
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
||||||
|
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
||||||
|
setTimeout("getRandomFollowSuggestion(processSuggestion)", 1000); |
||||||
|
|
||||||
|
twisterRpc("gettrendinghashtags", [10], |
||||||
|
function(args, ret) { |
||||||
|
for( var i = 0; i < ret.length; i++ ) { |
||||||
|
|
||||||
|
var $li = $("<li>"); |
||||||
|
var hashtagLinkTemplate = $("#hashtag-link-template").clone(true); |
||||||
|
hashtagLinkTemplate.removeAttr("id"); |
||||||
|
hashtagLinkTemplate.attr("href",$.MAL.hashtagUrl(ret[i])); |
||||||
|
hashtagLinkTemplate.text("#"+ret[i]); |
||||||
|
$li.append(hashtagLinkTemplate); |
||||||
|
$(".toptrends-list").append($li); |
||||||
|
} |
||||||
|
}, {}, |
||||||
|
function(args, ret) { |
||||||
|
console.log("Error with gettrendinghashtags. Older twister daemon?"); |
||||||
|
}, {}); |
||||||
|
|
||||||
|
if( args.cbFunc ) |
||||||
|
args.cbFunc(args.cbArg); |
||||||
|
}, {cbFunc:cbFunc, cbArg:cbArg}); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
//***********************************************
|
||||||
|
//******************* INIT **************
|
||||||
|
//***********************************************
|
||||||
|
var interfaceFunctions = new InterfaceFunctions; |
||||||
|
$( document ).ready( interfaceFunctions.init ); |
||||||
|
$( window ).resize(replaceDashboards); |
||||||
|
|
||||||
|
//função no window que fixa o header das postagens
|
||||||
|
function fixDiv() |
||||||
|
{ |
||||||
|
var $cache = $('.postboard h2'); |
||||||
|
if ($(window).scrollTop() > 26) |
||||||
|
$cache.addClass( "fixed" ); |
||||||
|
else |
||||||
|
$cache.removeClass( "fixed" ); |
||||||
|
} |
||||||
|
$(window).scroll(fixDiv); |
||||||
|
|
@ -0,0 +1,12 @@ |
|||||||
|
/* |
||||||
|
Color animation 1.6.0 |
||||||
|
http://www.bitstorm.org/jquery/color-animation/
|
||||||
|
Copyright 2011, 2013 Edwin Martin <edwin@bitstorm.org> |
||||||
|
Released under the MIT and GPL licenses. |
||||||
|
*/ |
||||||
|
'use strict';(function(d){function h(a,b,e){var c="rgb"+(d.support.rgba?"a":"")+"("+parseInt(a[0]+e*(b[0]-a[0]),10)+","+parseInt(a[1]+e*(b[1]-a[1]),10)+","+parseInt(a[2]+e*(b[2]-a[2]),10);d.support.rgba&&(c+=","+(a&&b?parseFloat(a[3]+e*(b[3]-a[3])):1));return c+")"}function f(a){var b;return(b=/#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(a))?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16),1]:(b=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(a))?[17*parseInt(b[1],16),17*parseInt(b[2], |
||||||
|
16),17*parseInt(b[3],16),1]:(b=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))?[parseInt(b[1]),parseInt(b[2]),parseInt(b[3]),1]:(b=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]*)\s*\)/.exec(a))?[parseInt(b[1],10),parseInt(b[2],10),parseInt(b[3],10),parseFloat(b[4])]:l[a]}d.extend(!0,d,{support:{rgba:function(){var a=d("script:first"),b=a.css("color"),e=!1;if(/^rgba/.test(b))e=!0;else try{e=b!=a.css("color","rgba(0, 0, 0, 0.5)").css("color"), |
||||||
|
a.css("color",b)}catch(c){}return e}()}});var k="color backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor outlineColor".split(" ");d.each(k,function(a,b){d.Tween.propHooks[b]={get:function(a){return d(a.elem).css(b)},set:function(a){var c=a.elem.style,g=f(d(a.elem).css(b)),m=f(a.end);a.run=function(a){c[b]=h(g,m,a)}}}});d.Tween.propHooks.borderColor={set:function(a){var b=a.elem.style,e=[],c=k.slice(2,6);d.each(c,function(b,c){e[c]=f(d(a.elem).css(c))});var g=f(a.end); |
||||||
|
a.run=function(a){d.each(c,function(d,c){b[c]=h(e[c],g,a)})}}};var l={aqua:[0,255,255,1],azure:[240,255,255,1],beige:[245,245,220,1],black:[0,0,0,1],blue:[0,0,255,1],brown:[165,42,42,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgrey:[169,169,169,1],darkgreen:[0,100,0,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkviolet:[148,0,211,1],fuchsia:[255, |
||||||
|
0,255,1],gold:[255,215,0,1],green:[0,128,0,1],indigo:[75,0,130,1],khaki:[240,230,140,1],lightblue:[173,216,230,1],lightcyan:[224,255,255,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],magenta:[255,0,255,1],maroon:[128,0,0,1],navy:[0,0,128,1],olive:[128,128,0,1],orange:[255,165,0,1],pink:[255,192,203,1],purple:[128,0,128,1],violet:[128,0,128,1],red:[255,0,0,1],silver:[192,192,192,1],white:[255,255,255,1],yellow:[255,255, |
||||||
|
0,1],transparent:[255,255,255,0]}})(jQuery); |
@ -0,0 +1,554 @@ |
|||||||
|
/*! |
||||||
|
* jQuery.textcomplete.js |
||||||
|
* |
||||||
|
* Repositiory: https://github.com/yuku-t/jquery-textcomplete
|
||||||
|
* License: MIT |
||||||
|
* Author: Yuku Takahashi |
||||||
|
*/ |
||||||
|
|
||||||
|
;(function ($) { |
||||||
|
|
||||||
|
'use strict'; |
||||||
|
|
||||||
|
/** |
||||||
|
* Exclusive execution control utility. |
||||||
|
*/ |
||||||
|
var lock = function (func) { |
||||||
|
var free, locked; |
||||||
|
free = function () { locked = false; }; |
||||||
|
return function () { |
||||||
|
var args; |
||||||
|
if (locked) return; |
||||||
|
locked = true; |
||||||
|
args = toArray(arguments); |
||||||
|
args.unshift(free); |
||||||
|
func.apply(this, args); |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert arguments into a real array. |
||||||
|
*/ |
||||||
|
var toArray = function (args) { |
||||||
|
var result; |
||||||
|
result = Array.prototype.slice.call(args); |
||||||
|
return result; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the styles of any element from property names. |
||||||
|
*/ |
||||||
|
var getStyles = (function () { |
||||||
|
var color; |
||||||
|
color = $('<div></div>').css(['color']).color; |
||||||
|
if (typeof color !== 'undefined') { |
||||||
|
return function ($el, properties) { |
||||||
|
return $el.css(properties); |
||||||
|
}; |
||||||
|
} else { // for jQuery 1.8 or below
|
||||||
|
return function ($el, properties) { |
||||||
|
var styles; |
||||||
|
styles = {}; |
||||||
|
$.each(properties, function (i, property) { |
||||||
|
styles[property] = $el.css(property); |
||||||
|
}); |
||||||
|
return styles; |
||||||
|
}; |
||||||
|
} |
||||||
|
})(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Default template function. |
||||||
|
*/ |
||||||
|
var identity = function (obj) { return obj; }; |
||||||
|
|
||||||
|
/** |
||||||
|
* Memoize a search function. |
||||||
|
*/ |
||||||
|
var memoize = function (func) { |
||||||
|
var memo = {}; |
||||||
|
return function (term, callback) { |
||||||
|
if (memo[term]) { |
||||||
|
callback(memo[term]); |
||||||
|
} else { |
||||||
|
func.call(this, term, function (data) { |
||||||
|
memo[term] = (memo[term] || []).concat(data); |
||||||
|
callback.apply(null, arguments); |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Determine if the array contains a given value. |
||||||
|
*/ |
||||||
|
var include = function (array, value) { |
||||||
|
var i, l; |
||||||
|
if (array.indexOf) return array.indexOf(value) != -1; |
||||||
|
for (i = 0, l = array.length; i < l; i++) { |
||||||
|
if (array[i] === value) return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Textarea manager class. |
||||||
|
*/ |
||||||
|
var Completer = (function () { |
||||||
|
var html, css, $baseWrapper, $baseList, _id; |
||||||
|
|
||||||
|
html = { |
||||||
|
wrapper: '<div class="textcomplete-wrapper"></div>', |
||||||
|
list: '<ul class="dropdown-menu"></ul>' |
||||||
|
}; |
||||||
|
css = { |
||||||
|
wrapper: { |
||||||
|
position: 'relative' |
||||||
|
}, |
||||||
|
list: { |
||||||
|
position: 'absolute', |
||||||
|
top: 0, |
||||||
|
left: 0, |
||||||
|
zIndex: '100', |
||||||
|
display: 'none' |
||||||
|
} |
||||||
|
}; |
||||||
|
$baseWrapper = $(html.wrapper).css(css.wrapper); |
||||||
|
$baseList = $(html.list).css(css.list); |
||||||
|
_id = 0; |
||||||
|
|
||||||
|
function Completer($el) { |
||||||
|
var focus; |
||||||
|
this.el = $el.get(0); // textarea element
|
||||||
|
focus = this.el === document.activeElement; |
||||||
|
// Cannot wrap $el at initialize method lazily due to Firefox's behavior.
|
||||||
|
this.$el = wrapElement($el); // Focus is lost
|
||||||
|
this.id = 'textComplete' + _id++; |
||||||
|
this.strategies = []; |
||||||
|
if (focus) { |
||||||
|
this.initialize(); |
||||||
|
this.$el.focus(); |
||||||
|
} else { |
||||||
|
this.$el.one('focus.textComplete', $.proxy(this.initialize, this)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Completer's public methods |
||||||
|
*/ |
||||||
|
$.extend(Completer.prototype, { |
||||||
|
|
||||||
|
/** |
||||||
|
* Prepare ListView and bind events. |
||||||
|
*/ |
||||||
|
initialize: function () { |
||||||
|
var $list, globalEvents; |
||||||
|
$list = $baseList.clone(); |
||||||
|
this.listView = new ListView($list, this); |
||||||
|
this.$el |
||||||
|
.before($list) |
||||||
|
.on({ |
||||||
|
'keyup.textComplete': $.proxy(this.onKeyup, this), |
||||||
|
'keydown.textComplete': $.proxy(this.listView.onKeydown, |
||||||
|
this.listView) |
||||||
|
}); |
||||||
|
globalEvents = {}; |
||||||
|
globalEvents['click.' + this.id] = $.proxy(this.onClickDocument, this); |
||||||
|
globalEvents['keyup.' + this.id] = $.proxy(this.onKeyupDocument, this); |
||||||
|
$(document).on(globalEvents); |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Register strategies to the completer. |
||||||
|
*/ |
||||||
|
register: function (strategies) { |
||||||
|
this.strategies = this.strategies.concat(strategies); |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Show autocomplete list next to the caret. |
||||||
|
*/ |
||||||
|
renderList: function (data) { |
||||||
|
if (this.clearAtNext) { |
||||||
|
this.listView.clear(); |
||||||
|
this.clearAtNext = false; |
||||||
|
} |
||||||
|
if (data.length) { |
||||||
|
if (!this.listView.shown) { |
||||||
|
this.listView |
||||||
|
.setPosition(this.getCaretPosition()) |
||||||
|
.clear() |
||||||
|
.activate(); |
||||||
|
this.listView.strategy = this.strategy; |
||||||
|
} |
||||||
|
data = data.slice(0, this.strategy.maxCount); |
||||||
|
this.listView.render(data); |
||||||
|
} |
||||||
|
|
||||||
|
if (!this.listView.data.length && this.listView.shown) { |
||||||
|
this.listView.deactivate(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
searchCallbackFactory: function (free) { |
||||||
|
var self = this; |
||||||
|
return function (data, keep) { |
||||||
|
self.renderList(data); |
||||||
|
if (!keep) { |
||||||
|
// This is the last callback for this search.
|
||||||
|
free(); |
||||||
|
self.clearAtNext = true; |
||||||
|
} |
||||||
|
}; |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Keyup event handler. |
||||||
|
*/ |
||||||
|
onKeyup: function (e) { |
||||||
|
var searchQuery, term; |
||||||
|
if (this.skipSearch(e)) { return; } |
||||||
|
|
||||||
|
searchQuery = this.extractSearchQuery(this.getTextFromHeadToCaret()); |
||||||
|
if (searchQuery.length) { |
||||||
|
term = searchQuery[1]; |
||||||
|
if (this.term === term) return; // Ignore shift-key or something.
|
||||||
|
this.term = term; |
||||||
|
this.search(searchQuery); |
||||||
|
} else { |
||||||
|
this.term = null; |
||||||
|
this.listView.deactivate(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Suppress searching if it returns true. |
||||||
|
*/ |
||||||
|
skipSearch: function (e) { |
||||||
|
if (this.skipNextKeyup) { |
||||||
|
this.skipNextKeyup = false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
switch (e.keyCode) { |
||||||
|
case 40: |
||||||
|
case 38: |
||||||
|
return true; |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
onSelect: function (value) { |
||||||
|
var pre, post, newSubStr; |
||||||
|
pre = this.getTextFromHeadToCaret(); |
||||||
|
post = this.el.value.substring(this.el.selectionEnd); |
||||||
|
|
||||||
|
newSubStr = this.strategy.replace(value); |
||||||
|
if ($.isArray(newSubStr)) { |
||||||
|
post = newSubStr[1] + post; |
||||||
|
newSubStr = newSubStr[0]; |
||||||
|
} |
||||||
|
pre = pre.replace(this.strategy.match, newSubStr); |
||||||
|
this.$el.val(pre + post) |
||||||
|
.trigger('change') |
||||||
|
.trigger('textComplete:select', value); |
||||||
|
this.el.focus(); |
||||||
|
this.el.selectionStart = this.el.selectionEnd = pre.length; |
||||||
|
this.skipNextKeyup = true; |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Global click event handler. |
||||||
|
*/ |
||||||
|
onClickDocument: function (e) { |
||||||
|
if (e.originalEvent && !e.originalEvent.keepTextCompleteDropdown) { |
||||||
|
this.listView.deactivate(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Global keyup event handler. |
||||||
|
*/ |
||||||
|
onKeyupDocument: function (e) { |
||||||
|
if (this.listView.shown && e.keyCode === 27) { // ESC
|
||||||
|
this.listView.deactivate(); |
||||||
|
this.$el.focus(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove all event handlers and the wrapper element. |
||||||
|
*/ |
||||||
|
destroy: function () { |
||||||
|
var $wrapper; |
||||||
|
this.$el.off('.textComplete'); |
||||||
|
$(document).off('.' + this.id); |
||||||
|
if (this.listView) { this.listView.destroy(); } |
||||||
|
$wrapper = this.$el.parent(); |
||||||
|
$wrapper.after(this.$el).remove(); |
||||||
|
this.$el.data('textComplete', void 0); |
||||||
|
this.$el = null; |
||||||
|
}, |
||||||
|
|
||||||
|
// Helper methods
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
/** |
||||||
|
* Returns caret's relative coordinates from textarea's left top corner. |
||||||
|
*/ |
||||||
|
getCaretPosition: function () { |
||||||
|
// Browser native API does not provide the way to know the position of
|
||||||
|
// caret in pixels, so that here we use a kind of hack to accomplish
|
||||||
|
// the aim. First of all it puts a div element and completely copies
|
||||||
|
// the textarea's style to the element, then it inserts the text and a
|
||||||
|
// span element into the textarea.
|
||||||
|
// Consequently, the span element's position is the thing what we want.
|
||||||
|
|
||||||
|
if (this.el.selectionEnd === 0) return; |
||||||
|
var properties, css, $div, $span, position, dir; |
||||||
|
|
||||||
|
dir = this.$el.attr('dir') || this.$el.css('direction'); |
||||||
|
properties = ['border-width', 'font-family', 'font-size', 'font-style', |
||||||
|
'font-variant', 'font-weight', 'height', 'letter-spacing', |
||||||
|
'word-spacing', 'line-height', 'text-decoration', 'text-align', |
||||||
|
'width', 'padding-top', 'padding-right', 'padding-bottom', |
||||||
|
'padding-left', 'margin-top', 'margin-right', 'margin-bottom', |
||||||
|
'margin-left' |
||||||
|
]; |
||||||
|
css = $.extend({ |
||||||
|
position: 'absolute', |
||||||
|
overflow: 'auto', |
||||||
|
'white-space': 'pre-wrap', |
||||||
|
top: 0, |
||||||
|
left: -9999, |
||||||
|
direction: dir |
||||||
|
}, getStyles(this.$el, properties)); |
||||||
|
|
||||||
|
$div = $('<div></div>').css(css).text(this.getTextFromHeadToCaret()); |
||||||
|
$span = $('<span></span>').text('.').appendTo($div); |
||||||
|
this.$el.before($div); |
||||||
|
position = $span.position(); |
||||||
|
position.top += $span.height() - this.$el.scrollTop(); |
||||||
|
if (dir === 'rtl') { position.left -= this.listView.$el.width(); } |
||||||
|
$div.remove(); |
||||||
|
return position; |
||||||
|
}, |
||||||
|
|
||||||
|
getTextFromHeadToCaret: function () { |
||||||
|
var text, selectionEnd, range; |
||||||
|
selectionEnd = this.el.selectionEnd; |
||||||
|
if (typeof selectionEnd === 'number') { |
||||||
|
text = this.el.value.substring(0, selectionEnd); |
||||||
|
} else if (document.selection) { |
||||||
|
range = this.el.createTextRange(); |
||||||
|
range.moveStart('character', 0); |
||||||
|
range.moveEnd('textedit'); |
||||||
|
text = range.text; |
||||||
|
} |
||||||
|
return text; |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* Parse the value of textarea and extract search query. |
||||||
|
*/ |
||||||
|
extractSearchQuery: function (text) { |
||||||
|
// If a search query found, it returns used strategy and the query
|
||||||
|
// term. If the caret is currently in a code block or search query does
|
||||||
|
// not found, it returns an empty array.
|
||||||
|
|
||||||
|
var i, l, strategy, match; |
||||||
|
for (i = 0, l = this.strategies.length; i < l; i++) { |
||||||
|
strategy = this.strategies[i]; |
||||||
|
match = text.match(strategy.match); |
||||||
|
if (match) { return [strategy, match[strategy.index]]; } |
||||||
|
} |
||||||
|
return []; |
||||||
|
}, |
||||||
|
|
||||||
|
search: lock(function (free, searchQuery) { |
||||||
|
var term; |
||||||
|
this.strategy = searchQuery[0]; |
||||||
|
term = searchQuery[1]; |
||||||
|
this.strategy.search(term, this.searchCallbackFactory(free)); |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
/** |
||||||
|
* Completer's private functions |
||||||
|
*/ |
||||||
|
var wrapElement = function ($el) { |
||||||
|
return $el.wrap($baseWrapper.clone().css('display', $el.css('display'))); |
||||||
|
}; |
||||||
|
|
||||||
|
return Completer; |
||||||
|
})(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Dropdown menu manager class. |
||||||
|
*/ |
||||||
|
var ListView = (function () { |
||||||
|
|
||||||
|
function ListView($el, completer) { |
||||||
|
this.data = []; |
||||||
|
this.$el = $el; |
||||||
|
this.index = 0; |
||||||
|
this.completer = completer; |
||||||
|
|
||||||
|
this.$el.on('click.textComplete', 'li.textcomplete-item', |
||||||
|
$.proxy(this.onClick, this)); |
||||||
|
} |
||||||
|
|
||||||
|
$.extend(ListView.prototype, { |
||||||
|
shown: false, |
||||||
|
|
||||||
|
render: function (data) { |
||||||
|
var html, i, l, index, val; |
||||||
|
|
||||||
|
html = ''; |
||||||
|
for (i = 0, l = data.length; i < l; i++) { |
||||||
|
val = data[i]; |
||||||
|
if (include(this.data, val)) continue; |
||||||
|
index = this.data.length; |
||||||
|
this.data.push(val); |
||||||
|
html += '<li class="textcomplete-item" data-index="' + index + '"><a>'; |
||||||
|
html += this.strategy.template(val); |
||||||
|
html += '</a></li>'; |
||||||
|
if (this.data.length === this.strategy.maxCount) break; |
||||||
|
} |
||||||
|
this.$el.append(html); |
||||||
|
if (!this.data.length) { |
||||||
|
this.deactivate(); |
||||||
|
} else { |
||||||
|
this.activateIndexedItem(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
clear: function () { |
||||||
|
this.data = []; |
||||||
|
this.$el.html(''); |
||||||
|
this.index = 0; |
||||||
|
return this; |
||||||
|
}, |
||||||
|
|
||||||
|
activateIndexedItem: function () { |
||||||
|
this.$el.find('.active').removeClass('active'); |
||||||
|
this.getActiveItem().addClass('active'); |
||||||
|
}, |
||||||
|
|
||||||
|
getActiveItem: function () { |
||||||
|
return $(this.$el.children().get(this.index)); |
||||||
|
}, |
||||||
|
|
||||||
|
activate: function () { |
||||||
|
if (!this.shown) { |
||||||
|
this.$el.show(); |
||||||
|
this.completer.$el.trigger('textComplete:show'); |
||||||
|
this.shown = true; |
||||||
|
} |
||||||
|
return this; |
||||||
|
}, |
||||||
|
|
||||||
|
deactivate: function () { |
||||||
|
if (this.shown) { |
||||||
|
this.$el.hide(); |
||||||
|
this.completer.$el.trigger('textComplete:hide'); |
||||||
|
this.shown = false; |
||||||
|
this.data = this.index = null; |
||||||
|
} |
||||||
|
return this; |
||||||
|
}, |
||||||
|
|
||||||
|
setPosition: function (position) { |
||||||
|
this.$el.css(position); |
||||||
|
return this; |
||||||
|
}, |
||||||
|
|
||||||
|
select: function (index) { |
||||||
|
var self = this; |
||||||
|
this.completer.onSelect(this.data[index]); |
||||||
|
// Deactive at next tick to allow other event handlers to know whether
|
||||||
|
// the dropdown has been shown or not.
|
||||||
|
setTimeout(function () { self.deactivate(); }, 0); |
||||||
|
}, |
||||||
|
|
||||||
|
onKeydown: function (e) { |
||||||
|
if (!this.shown) return; |
||||||
|
if (e.keyCode === 38) { // UP
|
||||||
|
e.preventDefault(); |
||||||
|
if (this.index === 0) { |
||||||
|
this.index = this.data.length-1; |
||||||
|
} else { |
||||||
|
this.index -= 1; |
||||||
|
} |
||||||
|
this.activateIndexedItem(); |
||||||
|
} else if (e.keyCode === 40) { // DOWN
|
||||||
|
e.preventDefault(); |
||||||
|
if (this.index === this.data.length - 1) { |
||||||
|
this.index = 0; |
||||||
|
} else { |
||||||
|
this.index += 1; |
||||||
|
} |
||||||
|
this.activateIndexedItem(); |
||||||
|
} else if (e.keyCode === 13 || e.keyCode === 9) { // ENTER or TAB
|
||||||
|
e.preventDefault(); |
||||||
|
|
||||||
|
this.select(parseInt(this.getActiveItem().data('index'), 10)); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
onClick: function (e) { |
||||||
|
var $e = $(e.target); |
||||||
|
e.originalEvent.keepTextCompleteDropdown = true; |
||||||
|
if (!$e.hasClass('textcomplete-item')) { |
||||||
|
$e = $e.parents('li.textcomplete-item'); |
||||||
|
} |
||||||
|
this.select(parseInt($e.data('index'), 10)); |
||||||
|
}, |
||||||
|
|
||||||
|
destroy: function () { |
||||||
|
this.deactivate(); |
||||||
|
this.$el.off('click.textComplete').remove(); |
||||||
|
this.$el = null; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
return ListView; |
||||||
|
})(); |
||||||
|
|
||||||
|
$.fn.textcomplete = function (strategies) { |
||||||
|
var i, l, strategy, dataKey; |
||||||
|
|
||||||
|
dataKey = 'textComplete'; |
||||||
|
|
||||||
|
if (strategies === 'destroy') { |
||||||
|
return this.each(function () { |
||||||
|
var completer = $(this).data(dataKey); |
||||||
|
if (completer) { completer.destroy(); } |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
for (i = 0, l = strategies.length; i < l; i++) { |
||||||
|
strategy = strategies[i]; |
||||||
|
if (!strategy.template) { |
||||||
|
strategy.template = identity; |
||||||
|
} |
||||||
|
if (strategy.index == null) { |
||||||
|
strategy.index = 2; |
||||||
|
} |
||||||
|
if (strategy.cache) { |
||||||
|
strategy.search = memoize(strategy.search); |
||||||
|
} |
||||||
|
strategy.maxCount || (strategy.maxCount = 10); |
||||||
|
} |
||||||
|
|
||||||
|
return this.each(function () { |
||||||
|
var $this, completer; |
||||||
|
$this = $(this); |
||||||
|
completer = $this.data(dataKey); |
||||||
|
if (!completer) { |
||||||
|
completer = new Completer($this); |
||||||
|
$this.data(dataKey, completer); |
||||||
|
} |
||||||
|
completer.register(strategies); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
})(window.jQuery || window.Zepto); |
@ -0,0 +1,361 @@ |
|||||||
|
$(function() { |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
var TwisterOptions = function() |
||||||
|
{ |
||||||
|
this.getOption = function(optionName, defaultValue) { |
||||||
|
var keyName = "options:" + optionName; |
||||||
|
if( $.localStorage.isSet(keyName) ) |
||||||
|
return $.localStorage.get(keyName); |
||||||
|
else |
||||||
|
return defaultValue; |
||||||
|
} |
||||||
|
|
||||||
|
this.setOption = function(optionName, value) { |
||||||
|
var keyName = "options:" + optionName; |
||||||
|
$.localStorage.set(keyName, value); |
||||||
|
} |
||||||
|
|
||||||
|
this.soundNotifOptions = function() { |
||||||
|
$('#notifyForm select').each(function(){ |
||||||
|
this.value = $.Options.getOption(this.id, "false"); |
||||||
|
}); |
||||||
|
|
||||||
|
var player = $('#player'); |
||||||
|
player[0].pause(); |
||||||
|
$('#player').empty(); |
||||||
|
|
||||||
|
$('form#notifyForm').on('change','select',function(){ |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
|
||||||
|
if(this.value == false) {player[0].pause(); return;} |
||||||
|
if (player[0].canPlayType('audio/mpeg;')) { |
||||||
|
player.attr('type', 'audio/mpeg'); |
||||||
|
player.attr('src', 'sound/'+this.value+'.mp3'); |
||||||
|
} else { |
||||||
|
player.attr('type', 'audio/ogg'); |
||||||
|
player.attr('src', 'sound/'+this.value+'.ogg'); |
||||||
|
} |
||||||
|
|
||||||
|
player[0].play(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.volumeControl = function() { |
||||||
|
var playerVol = $('#playerVol'); |
||||||
|
playerVol[0].value = $.Options.getOption(playerVol[0].id, 100); |
||||||
|
$('.volValue').text((playerVol[0].value * 100).toFixed()); |
||||||
|
|
||||||
|
playerVol.on('change',function(){ |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
$('#player')[0].volume = (this.value); |
||||||
|
$('.volValue').text((this.value * 100).toFixed()); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.DMsNotif = function() { |
||||||
|
var sndDM = $.Options.getOption('sndDM', "false"); |
||||||
|
if( sndDM == "false") return; |
||||||
|
var player = $('#player'); |
||||||
|
$('#player').empty(); |
||||||
|
|
||||||
|
if (player[0].canPlayType('audio/mpeg;')) { |
||||||
|
player.attr('type', 'audio/mpeg'); |
||||||
|
player.attr('src', 'sound/'+sndDM+'.mp3'); |
||||||
|
} else { |
||||||
|
player.attr('type', 'audio/ogg'); |
||||||
|
player.attr('src', 'sound/'+sndDM+'.ogg'); |
||||||
|
} |
||||||
|
player[0].volume = $.Options.getOption('playerVol',100); |
||||||
|
player[0].play(); |
||||||
|
} |
||||||
|
|
||||||
|
this.mensNotif = function() { |
||||||
|
var sndMention = $.Options.getOption('sndMention', "false"); |
||||||
|
if(sndMention == "false") return; |
||||||
|
var player = $('#player'); |
||||||
|
$('#playerSec').empty(); |
||||||
|
|
||||||
|
if (player[0].canPlayType('audio/mpeg;')) { |
||||||
|
player.attr('type', 'audio/mpeg'); |
||||||
|
player.attr('src', 'sound/'+sndMention+'.mp3'); |
||||||
|
} else { |
||||||
|
player.attr('type', 'audio/ogg'); |
||||||
|
player.attr('src', 'sound/'+sndMention+'.ogg'); |
||||||
|
} |
||||||
|
player[0].volume = $.Options.getOption('playerVol',100); |
||||||
|
player[0].play(); |
||||||
|
} |
||||||
|
|
||||||
|
this.keysSendDefault = "ctrlenter"; |
||||||
|
this.keysSend = function() { |
||||||
|
$('#keysOpt select')[0].value = $.Options.getOption('keysSend',this.keysSendDefault); |
||||||
|
|
||||||
|
$('#keysOpt select').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
this.keyEnterToSend = function() { |
||||||
|
return $.Options.getOption('keysSend',this.keysSendDefault) == "enter"; |
||||||
|
} |
||||||
|
|
||||||
|
this.setLang = function() { |
||||||
|
$('#language').val($.Options.getOption('locLang','auto')) |
||||||
|
$('#language').on('change', function(){ |
||||||
|
$.Options.setOption('locLang', $(this).val()); |
||||||
|
location.reload(); |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
this.getTheme = function() { |
||||||
|
return $.Options.getOption('theme','original'); |
||||||
|
} |
||||||
|
|
||||||
|
this.setTheme = function() { |
||||||
|
$('#theme').val(this.getTheme()) |
||||||
|
$('#theme').on('change', function(){ |
||||||
|
$.Options.setOption('theme', $(this).val()); |
||||||
|
location.reload(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getLineFeedsOpt = function() { |
||||||
|
return $.Options.getOption('displayLineFeeds',"disable"); |
||||||
|
} |
||||||
|
|
||||||
|
this.setLineFeedsOpt = function() { |
||||||
|
$('#lineFeedsOpt select')[0].value = this.getLineFeedsOpt(); |
||||||
|
|
||||||
|
$('#lineFeedsOpt select').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
this.getShowPreviewOpt = function() { |
||||||
|
return $.Options.getOption('displayPreview',"disable"); |
||||||
|
} |
||||||
|
|
||||||
|
this.setShowPreviewOpt = function () { |
||||||
|
$('#showPreviewOpt select')[0].value = this.getShowPreviewOpt(); |
||||||
|
|
||||||
|
$('#showPreviewOpt select').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getUnicodeConversionOpt = function () { |
||||||
|
return $.Options.getOption('unicodeConversion', "disable"); |
||||||
|
} |
||||||
|
|
||||||
|
this.setUnicodeConversionOpt = function () { |
||||||
|
$("#unicodeConversion")[0].value = this.getUnicodeConversionOpt(); |
||||||
|
|
||||||
|
if (this.getUnicodeConversionOpt() === "custom") |
||||||
|
$("#unicodeConversionOpt .suboptions")[0].style.height = "230px"; |
||||||
|
|
||||||
|
$("#unicodeConversion").on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
if (this.value === "custom") |
||||||
|
$("#unicodeConversionOpt .suboptions")[0].style.height = "230px"; |
||||||
|
else |
||||||
|
$("#unicodeConversionOpt .suboptions")[0].style.height = "0px"; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getConvertPunctuationsOpt = function() { |
||||||
|
return $.Options.getOption('convertPunctuationsOpt', false); |
||||||
|
} |
||||||
|
|
||||||
|
this.setConvertPunctuationsOpt = function () { |
||||||
|
$('#convertPunctuationsOpt')[0].checked = this.getConvertPunctuationsOpt(); |
||||||
|
|
||||||
|
$('#convertPunctuationsOpt').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getConvertEmotionsOpt = function() { |
||||||
|
return $.Options.getOption('convertEmotionsOpt', false); |
||||||
|
} |
||||||
|
|
||||||
|
this.setConvertEmotionsOpt = function () { |
||||||
|
$('#convertEmotionsOpt')[0].checked = this.getConvertEmotionsOpt(); |
||||||
|
|
||||||
|
$('#convertEmotionsOpt').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getConvertSignsOpt = function() { |
||||||
|
return $.Options.getOption('convertSignsOpt', false); |
||||||
|
} |
||||||
|
|
||||||
|
this.setConvertSignsOpt = function () { |
||||||
|
$('#convertSignsOpt')[0].checked = this.getConvertSignsOpt(); |
||||||
|
|
||||||
|
$('#convertSignsOpt').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getConvertFractionsOpt = function() { |
||||||
|
return $.Options.getOption('convertFractionsOpt', false); |
||||||
|
} |
||||||
|
|
||||||
|
this.setConvertFractionsOpt = function () { |
||||||
|
$('#convertFractionsOpt')[0].checked = this.getConvertFractionsOpt(); |
||||||
|
|
||||||
|
$('#convertFractionsOpt').on('change', function(){ |
||||||
|
$.Options.setOption(this.id, this.checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getUseProxyOpt = function () { |
||||||
|
return $.Options.getOption('useProxy', 'disable'); |
||||||
|
} |
||||||
|
|
||||||
|
this.setUseProxyOpt = function () { |
||||||
|
$('#useProxy')[0].value = this.getUseProxyOpt(); |
||||||
|
|
||||||
|
if (this.getUseProxyOpt() === 'disable') |
||||||
|
$('#useProxyForImgOnly').attr('disabled','disabled'); |
||||||
|
|
||||||
|
$('#useProxy').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
|
||||||
|
if (this.value === 'disable') |
||||||
|
$('#useProxyForImgOnly').attr('disabled','disabled'); |
||||||
|
else |
||||||
|
$('#useProxyForImgOnly').removeAttr('disabled'); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getUseProxyForImgOnlyOpt = function () { |
||||||
|
return $.Options.getOption('useProxyForImgOnly', false); |
||||||
|
} |
||||||
|
|
||||||
|
this.setUseProxyForImgOnlyOpt = function () { |
||||||
|
$('#useProxyForImgOnly')[0].checked = this.getUseProxyForImgOnlyOpt(); |
||||||
|
|
||||||
|
$('#useProxyForImgOnly').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.checked); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getSplitPostsOpt = function (){ |
||||||
|
return $.Options.getOption('splitPosts', 'disable'); |
||||||
|
} |
||||||
|
|
||||||
|
this.setSplitPostsOpt = function () { |
||||||
|
$('#splitPosts')[0].value = this.getSplitPostsOpt(); |
||||||
|
|
||||||
|
$('#splitPosts').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getHideRepliesOpt = function () { |
||||||
|
return $.Options.getOption('hideReplies', 'following'); |
||||||
|
} |
||||||
|
|
||||||
|
this.setHideRepliesOpt = function () { |
||||||
|
$('#hideReplies')[0].value = this.getHideRepliesOpt(); |
||||||
|
|
||||||
|
$('#hideReplies').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.getHideCloseRTsOpt = function () { |
||||||
|
return $.Options.getOption('hideCloseRTs', 'disable'); |
||||||
|
}; |
||||||
|
|
||||||
|
this.setHideCloseRTsOpt = function () { |
||||||
|
$('#hideCloseRTs')[0].value = this.getHideCloseRTsOpt(); |
||||||
|
|
||||||
|
if (this.getHideCloseRTsOpt() === 'disable') { |
||||||
|
$('#hideCloseRTsDesc')[0].style.display = 'none'; |
||||||
|
} else { |
||||||
|
$('#hideCloseRTsDesc')[0].style.display = 'inline'; |
||||||
|
} |
||||||
|
|
||||||
|
$('#hideCloseRTs').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
|
||||||
|
if (this.value === 'disable') { |
||||||
|
$('#hideCloseRTsDesc')[0].style.display = 'none'; |
||||||
|
} else { |
||||||
|
$('#hideCloseRTsDesc')[0].style.display = 'inline'; |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
this.getHideCloseRTsHourOpt = function () { |
||||||
|
return parseInt($.Options.getOption('hideCloseRtsHour', '1')); |
||||||
|
}; |
||||||
|
|
||||||
|
this.setHideCloseRTsHourOpt = function () { |
||||||
|
$('#hideCloseRtsHour')[0].value = this.getHideCloseRTsHourOpt().toString(); |
||||||
|
|
||||||
|
$('#hideCloseRtsHour').on('keyup', function () { |
||||||
|
if (/^\d+$/.test(this.value)) { |
||||||
|
this.style.backgroundColor = ''; |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
$(this).next('span').text(polyglot.t('hour(s)')); |
||||||
|
} else { |
||||||
|
this.style.backgroundColor = '#f00'; |
||||||
|
$(this).next('span').text(polyglot.t('only numbers are allowed!')); |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
this.getIsFollowingMeOpt = function () { |
||||||
|
return $.Options.getOption('isFollowingMe'); |
||||||
|
}; |
||||||
|
|
||||||
|
this.setIsFollowingMeOpt = function () { |
||||||
|
$('#isFollowingMe')[0].value = this.getIsFollowingMeOpt(); |
||||||
|
|
||||||
|
$('#isFollowingMe').on('change', function () { |
||||||
|
$.Options.setOption(this.id, this.value); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
this.InitOptions = function() { |
||||||
|
this.soundNotifOptions(); |
||||||
|
this.volumeControl(); |
||||||
|
this.keysSend(); |
||||||
|
this.setLang(); |
||||||
|
this.setTheme(); |
||||||
|
this.setLineFeedsOpt(); |
||||||
|
this.setShowPreviewOpt(); |
||||||
|
this.setUnicodeConversionOpt(); |
||||||
|
this.setConvertPunctuationsOpt(); |
||||||
|
this.setConvertEmotionsOpt(); |
||||||
|
this.setConvertSignsOpt(); |
||||||
|
this.setConvertFractionsOpt(); |
||||||
|
this.setUseProxyOpt(); |
||||||
|
this.setUseProxyForImgOnlyOpt(); |
||||||
|
this.setSplitPostsOpt(); |
||||||
|
this.setHideRepliesOpt(); |
||||||
|
this.setHideCloseRTsHourOpt(); |
||||||
|
this.setHideCloseRTsOpt(); |
||||||
|
this.setIsFollowingMeOpt(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
jQuery.Options = new TwisterOptions; |
||||||
|
|
||||||
|
function localizeLabels() |
||||||
|
{ |
||||||
|
$("label[for=tab_language]").text(polyglot.t("Language")); |
||||||
|
$("label[for=t-2]").text(polyglot.t("Theme")); |
||||||
|
$("label[for=t-3]").text(polyglot.t("Sound")); |
||||||
|
$("label[for=t-4]").text(polyglot.t("Keys")); |
||||||
|
$("label[for=t-5]").text(polyglot.t("Postboard")); |
||||||
|
$("label[for=t-6]").text(polyglot.t("Users")); |
||||||
|
} |
||||||
|
|
||||||
|
$(document).ready(localizeLabels); |
@ -0,0 +1,286 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"/> |
||||||
|
<title>Options</title> |
||||||
|
<link id="stylecss" rel="stylesheet" href="css/style.css" type="text/css"/> |
||||||
|
<script src="js/jquery.min.js"></script> |
||||||
|
<script src="js/jQueryPlugins.js"></script> |
||||||
|
<script src="js/jquery.json-2.4.js"></script> |
||||||
|
<script src="js/jquery.jsonrpcclient.js"></script> |
||||||
|
<script src="js/jquery.storageapi.js"></script> |
||||||
|
<script src="js/options.js"></script> |
||||||
|
<script src="js/mobile_abstract.js"></script> |
||||||
|
<script src="js/twister_io.js"></script> |
||||||
|
<script src="js/twister_network.js"></script> |
||||||
|
<script src="js/twister_user.js"></script> |
||||||
|
<script src="js/interface_common.js"></script> |
||||||
|
<script src="js/interface_login.js"></script> |
||||||
|
<script src="js/polyglot.min.js"></script> |
||||||
|
<script src="js/interface_localization.js"></script> |
||||||
|
<script>$(function(){ |
||||||
|
initInterfaceCommon(); |
||||||
|
$.Options.InitOptions();}) |
||||||
|
changeStyle(); |
||||||
|
</script> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<!-- MENU SUPERIOR INIT --> |
||||||
|
<nav class="userMenu"> |
||||||
|
<ul> |
||||||
|
<li class="userMenu-home"><a href="home.html"><span class="selectable_theme theme_original label">Home</span></a></li> |
||||||
|
<li class="userMenu-options current"><a class="label" href="options.html">Options</a></li> |
||||||
|
<li class="userMenu-config"> |
||||||
|
<a class="userMenu-config-dropdown" href="#"> |
||||||
|
<div class="config-menu dialog-modal"> |
||||||
|
<a class="dropdown-menu-item" href="options.html">Options</a> |
||||||
|
<a class="dropdown-menu-item" href="network.html">Network config</a> |
||||||
|
<a class="dropdown-menu-item" href="profile-edit.html">Setup account</a> |
||||||
|
<a class="dropdown-menu-item" href="following.html">Following users</a> |
||||||
|
<a class="dropdown-menu-item" href="login.html">Change user</a> |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
</nav> |
||||||
|
|
||||||
|
<div class="wrapper"> |
||||||
|
<div class="options"> |
||||||
|
|
||||||
|
<input id="tab_language" name="option_tab" type="radio" checked="checked" class="selectable_theme theme_nin"/> |
||||||
|
<label for="tab_language" class="tabs selectable_theme theme_nin">Language</label> |
||||||
|
<input id="t-2" name="option_tab" type="radio" class="selectable_theme theme_nin"/> |
||||||
|
<label for="t-2" class="tabs selectable_theme theme_nin">Theme</label> |
||||||
|
<input id="t-3" name="option_tab" type="radio" class="selectable_theme theme_nin"/> |
||||||
|
<label for="t-3" class="tabs selectable_theme theme_nin">Sound</label> |
||||||
|
<input id="t-4" name="option_tab" type="radio" class="selectable_theme theme_nin"/> |
||||||
|
<label for="t-4" class="tabs selectable_theme theme_nin">Keys</label> |
||||||
|
<input id="t-5" name="option_tab" type="radio" class="selectable_theme theme_nin"/> |
||||||
|
<label for="t-5" class="tabs selectable_theme theme_nin">Postboard</label> |
||||||
|
<input id="t-6" name="option_tab" type="radio" class="selectable_theme theme_nin" /> |
||||||
|
<label for="t-6" class="tabs selectable_theme theme_nin">Users</label> |
||||||
|
|
||||||
|
<div class="tab-content"> |
||||||
|
|
||||||
|
<div class="language"> |
||||||
|
|
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Use language </p> |
||||||
|
<div> |
||||||
|
<form action="" id="selectLanguage"> |
||||||
|
<select name="" id="language"> |
||||||
|
<option value="auto">Auto</option> |
||||||
|
<option value="pt-BR">Brazilian Portuguese</option> |
||||||
|
<option value="zh">Chinese</option> |
||||||
|
<option value="cs">Czech</option> |
||||||
|
<option value="nl">Dutch</option> |
||||||
|
<option value="en">English</option> |
||||||
|
<option value="fr">French</option> |
||||||
|
<option value="de">German</option> |
||||||
|
<option value="it">Italian</option> |
||||||
|
<option value="ja">Japanese</option> |
||||||
|
<option value="ru">Russian</option> |
||||||
|
<option value="es">Spanish</option> |
||||||
|
<option value="tr">Turkish</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="theme"> |
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Theme </p> |
||||||
|
<div> |
||||||
|
<form action="" id="selectTheme"> |
||||||
|
<select name="" id="theme"> |
||||||
|
<option value="original">Original</option> |
||||||
|
<option value="calm">Calm</option> |
||||||
|
<option value="nin">Nin</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
<span class="selectable_theme theme_calm"> |
||||||
|
For new features check <a href="https://github.com/iHedgehog/twister-calm">twister-calm repository</a>! |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="sounds"> |
||||||
|
|
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Sound notifications </p> |
||||||
|
<div> |
||||||
|
<form action="" id="notifyForm"> |
||||||
|
<div> |
||||||
|
<p class="label">Mentions</p> |
||||||
|
<select name="" id="sndMention" class="sndOpt"> |
||||||
|
<option value="false">none</option> |
||||||
|
<option value="1">beat</option> |
||||||
|
<option value="2">pip</option> |
||||||
|
<option value="3">vibro</option> |
||||||
|
<option value="4">flip</option> |
||||||
|
<option value="5">click</option> |
||||||
|
</select> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<p class="label">Direct Messages</p> |
||||||
|
<select name="" id="sndDM" class="sndOpt"> |
||||||
|
<option value="false">none</option> |
||||||
|
<option value="1">beat</option> |
||||||
|
<option value="2">pip</option> |
||||||
|
<option value="3">vibro</option> |
||||||
|
<option value="4">flip</option> |
||||||
|
<option value="5">click</option> |
||||||
|
</select> |
||||||
|
</div> |
||||||
|
<input type="range" name="playerVol" id="playerVol" min="0" max="1" step="0.01"><span class="volValue">0</span> |
||||||
|
</form> |
||||||
|
<audio id="player"></audio> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="keys"> |
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Keys </p> |
||||||
|
<div> |
||||||
|
<form action="" id="keysOpt"> |
||||||
|
<p class="label">Send key</p> |
||||||
|
<select name="" id="keysSend"> |
||||||
|
<option value="enter">Enter</option> |
||||||
|
<option value="ctrlenter">Ctrl/Cmd+Enter</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="postboard-display"> |
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Postboard displays </p> |
||||||
|
<div> |
||||||
|
<form action="" id="hideRepliesOpt"> |
||||||
|
<p class="label">Posts that begin with mention</p> |
||||||
|
<select name="" id="hideReplies"> |
||||||
|
<option value="disable">Show all</option> |
||||||
|
<option value="only-me">Show only if I am in</option> |
||||||
|
<option value="following">Show if it's between users I follow</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<form action="" id="hideCloseRTsOpt"> |
||||||
|
<p class="label">RTs those are close to original twist</p> |
||||||
|
<select name="" id="hideCloseRTs"> |
||||||
|
<option value="disable">Show all</option> |
||||||
|
<option value="show-if">Show if the original is older than</option> |
||||||
|
</select> |
||||||
|
<div id="hideCloseRTsDesc"> |
||||||
|
<input name="" id="hideCloseRtsHour" maxlength="2" size="3"/> <span class="label">hour(s)</span> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Posts display </p> |
||||||
|
<div> |
||||||
|
<form action="" id="lineFeedsOpt"> |
||||||
|
<p class="label">Line feeds</p> |
||||||
|
<select name="" id="displayLineFeeds"> |
||||||
|
<option value="disable">Ignore</option> |
||||||
|
<option value="enable">Display</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<form action="" id="showPreviewOpt"> |
||||||
|
<p class="label">Inline image preview</p> |
||||||
|
<select name="" id="displayPreview"> |
||||||
|
<option value="disable">Ignore</option> |
||||||
|
<option value="enable">Display</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<form action="" id="useProxyOpt"> |
||||||
|
<p class="label">Use external links behind a proxy</p> |
||||||
|
<select name="" id="useProxy"> |
||||||
|
<option value="disable">none</option> |
||||||
|
<option value="ssl-proxy-my-addr">ssl-proxy.my-addr.org</option> |
||||||
|
<option value="anonymouse">anonymouse.org</option> |
||||||
|
</select> |
||||||
|
<input name="" id="useProxyForImgOnly" type="checkbox" /> <span class="label">Use proxy for image preview only</span> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="post-editor"> |
||||||
|
<div class="module"> |
||||||
|
<p class="label"> Post editor</p> |
||||||
|
<div> |
||||||
|
<form action="" id="unicodeConversionOpt"> |
||||||
|
<p class="label">Automatic unicode conversion options</p> |
||||||
|
<select name="" id="unicodeConversion"> |
||||||
|
<option value="disable">Ignore</option> |
||||||
|
<option value="enable">Convert all</option> |
||||||
|
<option value="custom">Custom</option> |
||||||
|
</select> |
||||||
|
<div class="suboptions unicode-suboptions"> |
||||||
|
<input name="" id="convertPunctuationsOpt" type="checkbox" /> <span class="label">Convert punctuations to unicode</span><br/> |
||||||
|
<div> |
||||||
|
<label class="label">Supported punctuations: </label> |
||||||
|
<span>‥ … ⁇ ⁈ ⁉ ‼ — ⁓</span> |
||||||
|
</div> |
||||||
|
<input name="" id="convertEmotionsOpt" type="checkbox" /> <span class="label">Convert emotions codes to unicode symbols</span> |
||||||
|
<div> |
||||||
|
<label class="label">Supported emotions: </label> |
||||||
|
<span>😃 😇 🍺 😈 ❤ 😕 😢 😞 😎 😊 😊 😗 😆 😛 😉 😉 😮 😱 😐</span> |
||||||
|
</div> |
||||||
|
<input name="" id="convertSignsOpt" type="checkbox" /> <span class="label">Convert common signs to unicode</span><br/> |
||||||
|
<div> |
||||||
|
<label class="label">Supported signs:</label> |
||||||
|
<span>℡ ℻</span> |
||||||
|
</div> |
||||||
|
<input name="" id="convertFractionsOpt" type="checkbox" /> <span class="label">Convert fractions to unicode</span><br/> |
||||||
|
<div> |
||||||
|
<label class="label">Supported fractions:</label> |
||||||
|
<span>½ ⅓ ⅔ ¼ ¾ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅐ ⅛ ⅜ ⅝ ⅞ ⅑ ⅒</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div> |
||||||
|
<form action="" id="splitPostsOpt"> |
||||||
|
<p class="label">Split long posts</p> |
||||||
|
<select name="" id="splitPosts"> |
||||||
|
<option value="disable">Don't split</option> |
||||||
|
<option value="enable">Split all</option> |
||||||
|
<option value="only-new">Split only new post</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="users"> |
||||||
|
<div class="module"> |
||||||
|
<form action="" id="isFollowingMeOpt"> |
||||||
|
<p class="label">Show if a user follows me</p> |
||||||
|
<select name="" id="isFollowingMe"> |
||||||
|
<option value="in-profile">Show at profile modal only</option> |
||||||
|
<option value="everywhere">Show with every user name</option> |
||||||
|
</select> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div><!-- /tab-content --> |
||||||
|
</div><!-- /options --> |
||||||
|
</div><!-- /options --> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1 @@ |
|||||||
|
../../css/OpenSans-Regular.ttf |
@ -0,0 +1,443 @@ |
|||||||
|
/************************************** |
||||||
|
********************* PROFILE PHOTO *** |
||||||
|
***************************************/ |
||||||
|
.profile-card |
||||||
|
{ |
||||||
|
padding: 9px; |
||||||
|
background: rgba( 255, 255, 255, .5 ); |
||||||
|
border: solid 1px rgba( 69, 71, 77, .05 ); |
||||||
|
position: relative; |
||||||
|
background: #43464d; |
||||||
|
} |
||||||
|
.profile-card-main |
||||||
|
{ |
||||||
|
width: 520px; |
||||||
|
padding: 10px; |
||||||
|
text-align: center; |
||||||
|
position: relative; |
||||||
|
transition: all .2s linear; |
||||||
|
background: rgba(255,255,255, .1); |
||||||
|
} |
||||||
|
/*.profile-card-main:before |
||||||
|
{ |
||||||
|
content: ""; |
||||||
|
border: solid 0px #fff; |
||||||
|
transition: all .2s linear; |
||||||
|
position: absolute; |
||||||
|
left: 1px; |
||||||
|
top: 1px; |
||||||
|
right: 1px; |
||||||
|
bottom: 1px; |
||||||
|
z-index: 0; |
||||||
|
}*/ |
||||||
|
.profile-card-main * |
||||||
|
{ |
||||||
|
position: relative; |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
.profile-card-photo |
||||||
|
{ |
||||||
|
width: 74px; |
||||||
|
height: 74px; |
||||||
|
border: solid 3px #45474d; |
||||||
|
border-radius: 10%; |
||||||
|
box-sizing: content-box; |
||||||
|
float:left; |
||||||
|
top: 50%; |
||||||
|
background-color: #3b3c41; |
||||||
|
} |
||||||
|
.profile-card-main h1 |
||||||
|
{ |
||||||
|
font-size: 24px; |
||||||
|
font-weight: bold; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.profile-card-main h2 { |
||||||
|
color: #7691ce; |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main h2 { |
||||||
|
left: 20%; |
||||||
|
top: 19%; |
||||||
|
color: #f8f8f8; |
||||||
|
} |
||||||
|
.profile-card .direct-messages, |
||||||
|
.profile-card .direct-messages-with-user, |
||||||
|
.profile-card .follow, |
||||||
|
.profile-card .profileUnfollow |
||||||
|
{ |
||||||
|
display: block; |
||||||
|
position: absolute; |
||||||
|
bottom: 20px; |
||||||
|
right: 3px; |
||||||
|
padding: 10px 3px; |
||||||
|
font-size: 12px; |
||||||
|
width: 120px; |
||||||
|
text-align: center; |
||||||
|
color: rgba( 0, 0, 0, .7 ); |
||||||
|
background: rgba( 0, 0, 0, .1 ); |
||||||
|
border: none; |
||||||
|
transition: all .2s linear; |
||||||
|
} |
||||||
|
.profile-card .follow, |
||||||
|
.profile-card .profileUnfollow |
||||||
|
{ |
||||||
|
right: 128px; |
||||||
|
} |
||||||
|
.profile-card .direct-messages:hover, |
||||||
|
.profile-card .direct-messages-with-user:hover, |
||||||
|
.profile-card .follow:hover, |
||||||
|
.profile-card .profileUnfollow:hover |
||||||
|
{ |
||||||
|
background: rgba( 0, 0, 0, .3 ); |
||||||
|
} |
||||||
|
.profile-card.forEdition |
||||||
|
{ |
||||||
|
margin: 0 auto; |
||||||
|
width: 540px; |
||||||
|
} |
||||||
|
.forEdition .profile-card-photo |
||||||
|
{ |
||||||
|
border: solid 2px #fff; |
||||||
|
position: relative; |
||||||
|
cursor: pointer; |
||||||
|
transition: all .2s linear; |
||||||
|
z-index: 10; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main:hover:after, |
||||||
|
.forEdition .profile-card-photo:after |
||||||
|
{ |
||||||
|
content: ""; |
||||||
|
width: 36px; |
||||||
|
height: 36px; |
||||||
|
position: absolute; |
||||||
|
top: -5px; |
||||||
|
right: 0px; |
||||||
|
background: url(../img/edit.png) no-repeat right top; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main:hover:before |
||||||
|
{ |
||||||
|
border: solid 5px #fff; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main h2 |
||||||
|
{ |
||||||
|
margin-bottom: 8px; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input |
||||||
|
{ |
||||||
|
display: block; |
||||||
|
margin: 0 auto; |
||||||
|
background: rgba( 255, 255, 255, .8 ); |
||||||
|
border: none; |
||||||
|
padding: 6px 4px; |
||||||
|
margin-bottom: 4px; |
||||||
|
text-align: center; |
||||||
|
transition: all .2s linear; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:hover |
||||||
|
{ |
||||||
|
background: rgba( 255, 255, 255, .7 ); |
||||||
|
} |
||||||
|
.forEdition .profile-card-photo:hover{ |
||||||
|
background: #9096a5; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:focus{ |
||||||
|
background: #fff; |
||||||
|
color: #4d4d4d; |
||||||
|
} |
||||||
|
|
||||||
|
/* inputs placeholders color */ |
||||||
|
.forEdition .profile-card-main input::-webkit-input-placeholder { |
||||||
|
color: #4d4d4d; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:-moz-placeholder { |
||||||
|
color: #4d4d4d; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input::-moz-placeholder { |
||||||
|
color: #4d4d4d; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:-ms-input-placeholder { |
||||||
|
color: #4d4d4d; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:focus::-webkit-input-placeholder { |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:focus:-moz-placeholder { |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:focus::-moz-placeholder { |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main input:focus::-ms-input-placeholder { |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.profile-card-main input.input-name{ |
||||||
|
position: absolute; |
||||||
|
top: 30px; |
||||||
|
right: 20px; |
||||||
|
} |
||||||
|
.profile-card-main input.input-description |
||||||
|
{ |
||||||
|
width: 90%; |
||||||
|
margin-top: 100px; |
||||||
|
} |
||||||
|
.input-name |
||||||
|
{ |
||||||
|
font-size: 20px; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main .input-website, |
||||||
|
.forEdition .profile-card-main .input-city |
||||||
|
{ |
||||||
|
display: inline-block; |
||||||
|
margin-top: 10px; |
||||||
|
} |
||||||
|
.forEdition .profile-card-main .input-tox, |
||||||
|
.forEdition .profile-card-main .input-bitmessage |
||||||
|
{ |
||||||
|
width: 90%; |
||||||
|
margin-top: 10px; |
||||||
|
} |
||||||
|
.profile-edition-buttons |
||||||
|
{ |
||||||
|
padding: 10px; |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
.profile-edition-buttons button { |
||||||
|
background: #f1f1f1; |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
.profile-edition-buttons button:hover { |
||||||
|
background: #fff; |
||||||
|
transition: background-color 300ms ease-in; |
||||||
|
} |
||||||
|
.secret-key-container .label { |
||||||
|
color: #9096a5; |
||||||
|
} |
||||||
|
.secret-key-container .secret-key { |
||||||
|
color: #d2dbf1; |
||||||
|
} |
||||||
|
/************************************* |
||||||
|
****************** PROFILE MODAL |
||||||
|
**************************************/ |
||||||
|
.profile-modal .modal-wrapper |
||||||
|
{ |
||||||
|
width: 580px; |
||||||
|
border-radius: 5px; |
||||||
|
overflow: hidden; |
||||||
|
position: absolute; |
||||||
|
top:5%; |
||||||
|
height: 90%; |
||||||
|
margin-left: -300px; |
||||||
|
|
||||||
|
} |
||||||
|
.profile-modal .modal-header, .profile-modal .profile-card { |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
.profile-modal .modal-content |
||||||
|
{ |
||||||
|
padding: 3px; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
.profile-modal h1.profile-name { |
||||||
|
color: #43464d; |
||||||
|
} |
||||||
|
.profile-modal .profile-location { |
||||||
|
color: #48577d; |
||||||
|
} |
||||||
|
.profile-modal .profile-url { |
||||||
|
font-size: 14px; |
||||||
|
font-style: italic; |
||||||
|
} |
||||||
|
.profile-modal .profile-bio { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
#msngrswr { |
||||||
|
display: none; |
||||||
|
margin-top: 20px; |
||||||
|
height: 30px; |
||||||
|
} |
||||||
|
.profile-extra-contact { |
||||||
|
float: left; |
||||||
|
display: none; |
||||||
|
margin-right: 35px; |
||||||
|
} |
||||||
|
.bitmessage-ctc, .tox-ctc { |
||||||
|
position: absolute; |
||||||
|
height: 30px; |
||||||
|
width: 30px; |
||||||
|
display: inline-block; |
||||||
|
margin-right: 5px; |
||||||
|
border: 1px solid #d6d8dc; |
||||||
|
background: #e3e5ea url(img/clipboard.png) center no-repeat; |
||||||
|
opacity: .8; |
||||||
|
-webkit-border-radius: 0 5px 5px 0; |
||||||
|
-moz-border-radius: 0 5px 5px 0; |
||||||
|
border-radius: 0 5px 5px 0; |
||||||
|
-webkit-transition: all 20ms; |
||||||
|
-moz-transition: all 20ms; |
||||||
|
-ms-transition: all 20ms; |
||||||
|
-o-transition: all 20ms; |
||||||
|
transition: all 20ms; |
||||||
|
font-size: 18px; |
||||||
|
} |
||||||
|
.bitmessage-ctc:hover, .tox-ctc:hover { |
||||||
|
background-color: #f0f2f8; |
||||||
|
opacity: 1; |
||||||
|
cursor: pointer; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
.bitmessage-ctc:active, .tox-ctc:active { |
||||||
|
background-color: #edfced; |
||||||
|
} |
||||||
|
.bitmessage-ctc:after, |
||||||
|
.tox-ctc:after { |
||||||
|
content: '📋'; |
||||||
|
} |
||||||
|
.profile-modal .profile-tox, .profile-modal .profile-bitmessage { |
||||||
|
display: inline-block; |
||||||
|
width: 70px; |
||||||
|
height: 30px; |
||||||
|
border: 1px solid #c0c2c6; |
||||||
|
opacity: .8; |
||||||
|
-webkit-border-radius: 5px 0 0 5px; |
||||||
|
-moz-border-radius: 5px 0 0 5px; |
||||||
|
border-radius: 5px 0 0 5px; |
||||||
|
-webkit-transition: all 200ms; |
||||||
|
-moz-transition: all 200ms; |
||||||
|
-ms-transition: all 200ms; |
||||||
|
-o-transition: all 200ms; |
||||||
|
transition: all 200ms; |
||||||
|
} |
||||||
|
.profile-modal .profile-tox:hover, .profile-modal .profile-bitmessage:hover { |
||||||
|
opacity: 1; |
||||||
|
background-color: #f0f2f8; |
||||||
|
} |
||||||
|
.profile-modal .profile-tox:active, .profile-modal .profile-bitmessage:active { |
||||||
|
background-color: #edfced; |
||||||
|
} |
||||||
|
.profile-modal .profile-tox { |
||||||
|
background: #e3e5ea url(../img/tox.png) center no-repeat; |
||||||
|
} |
||||||
|
.profile-modal .profile-bitmessage { |
||||||
|
background: #e3e5ea url(../img/bm.png) center no-repeat; |
||||||
|
} |
||||||
|
.profile-modal .profile-data |
||||||
|
{ |
||||||
|
display: inline-block; |
||||||
|
margin-left: -4px; |
||||||
|
border-bottom: 0; |
||||||
|
} |
||||||
|
button.follow:hover { |
||||||
|
background: #b2d67b; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.profile-modal button.follow:hover { |
||||||
|
background: #b2d67b; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.profile-card .profileUnfollow:hover { |
||||||
|
background: #e18882; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.profile-modal button.direct-messages-with-user:hover { |
||||||
|
background: #b2d67b; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.profile-modal .separator { |
||||||
|
height: 10px; |
||||||
|
width: 100%; |
||||||
|
background-color: #000; |
||||||
|
} |
||||||
|
.profile-modal .postboard |
||||||
|
{ |
||||||
|
margin-left: 0; |
||||||
|
padding: 5px 0 5px 0; |
||||||
|
height: 60%; |
||||||
|
} |
||||||
|
.profile-modal .postboard h2 { |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
.profile-modal .postboard-posts |
||||||
|
{ |
||||||
|
display: block; |
||||||
|
height: 90%; |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
.profile-modal .postboard h2 span { |
||||||
|
font: 18px/40px 'Open Sans Condensed', sans-serif; |
||||||
|
padding-left: 10px; |
||||||
|
} |
||||||
|
.profile-modal .postboard-posts-wrapper |
||||||
|
{ |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
height: 100%; |
||||||
|
width: 99%; |
||||||
|
box-sizing: border-box; |
||||||
|
border-top: 292px solid transparent; |
||||||
|
overflow: auto; |
||||||
|
z-index: 0; |
||||||
|
} |
||||||
|
.profile-modal .profile-card-main |
||||||
|
{ |
||||||
|
background: #f3f5fb; |
||||||
|
color: #8d8d8d; |
||||||
|
width:100%; |
||||||
|
} |
||||||
|
.profile-modal .profile-card-main a { |
||||||
|
color: #8bb9e0; |
||||||
|
} |
||||||
|
.profile-modal .postboard-posts .post |
||||||
|
{ |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
.profile-modal .post-interactions |
||||||
|
{ |
||||||
|
margin: 2px 10px 3px 60px; |
||||||
|
} |
||||||
|
.profile-modal .profile-card |
||||||
|
{ |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
background: #f3f5fb; |
||||||
|
} |
||||||
|
/* |
||||||
|
.profile-card-main |
||||||
|
{ |
||||||
|
height: 200px; |
||||||
|
} |
||||||
|
*/ |
||||||
|
.profile-modal .direct-messages, |
||||||
|
.profile-modal .direct-messages-with-user, |
||||||
|
.profile-modal .follow, |
||||||
|
.profile-card .profileUnfollow |
||||||
|
{ |
||||||
|
bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
h1.profile-name { |
||||||
|
display: inline; |
||||||
|
} |
||||||
|
h2.profile-screen-name { |
||||||
|
display: inline; |
||||||
|
bottom: 0; |
||||||
|
color: #8f95a4; |
||||||
|
} |
||||||
|
|
||||||
|
.profile-modal .modal-buttons { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.profile-modal h1.profile-name, |
||||||
|
.profile-modal h2.profile-screen-name, |
||||||
|
.profile-modal span.profile-location, |
||||||
|
.profile-modal a.profile-url { |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
.profile-modal span.profile-location:empty, |
||||||
|
.profile-modal a.profile-url:empty, |
||||||
|
.profile-modal a.profile-bio:empty { |
||||||
|
display: none; |
||||||
|
} |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 456 B |
After Width: | Height: | Size: 405 B |
After Width: | Height: | Size: 394 B |
After Width: | Height: | Size: 340 B |
After Width: | Height: | Size: 199 B |
After Width: | Height: | Size: 365 B |
After Width: | Height: | Size: 134 B |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 616 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 254 B |
After Width: | Height: | Size: 691 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 287 B |
After Width: | Height: | Size: 299 B |
After Width: | Height: | Size: 264 B |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 452 B |
After Width: | Height: | Size: 452 B |
After Width: | Height: | Size: 312 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 564 B |
After Width: | Height: | Size: 78 B |
@ -0,0 +1 @@ |
|||||||
|
../../../css/OpenSans-Bold.ttf |
@ -0,0 +1 @@ |
|||||||
|
../../../css/OpenSans-Regular.ttf |