HKGalden Icon+

More Icons for HKGalden Forum

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name                        HKGalden Icon+
// @version                     2.1.7.2049
// @description         More Icons for HKGalden Forum
// @icon                https://i.na.cx/0vDGt.gif
// @require       	http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js
// @include             https://*hkgalden.com/view*
// @include             http://*hkgalden.com/view*
// @include             https://*hkgalden.com/reply*
// @include             http://*hkgalden.com/reply*
// @include             https://*hkgalden.com/post*
// @include             http://*hkgalden.com/post*
// @namespace https://greasyfork.org/users/2476
// ==/UserScript==

//HKGalden Icon+ Script is brought to you by: BB_Warrior (HKgalden ID:3794)

var win=this.unsafeWindow;
var id = new Array();
var thumbnail = new Array();
var iconSets = new Array();
var codeSets = new Array();
var oimg = ['369', 'adore', 'agree', 'angel', 'angry', 'ass', 'banghead', 'biggrin', 'bomb', 'bouncer', 'bouncy', 'bye', 'censored', 'chicken', 'clown', 'cry', 'dead', 'devil', 'donno', 'fire', 'flowerface', 'frown', 'fuck', '@', 'good', 'hehe', 'hoho', 'kill2', 'kill', 'kiss', 'love', 'no', 'offtopic', 'oh', 'photo', 'shocking', 'slick', 'smile', 'sosad', 'surprise', 'tongue', 'wink', 'wonder2', 'wonder', 'yipes', 'z'];
var ocode = ['[369]','#adore#','#yup#','O:-)',':-[','#ass#','[banghead]',':D','[bomb]','[bouncer]','[bouncy]','#bye#','[censored]','#cn#',':o)',':~(','xx(',':-]','#ng#','#fire#','[flowerface]',':-(','fuck','@_@','#good#','#hehe#','#hoho#','#kill2#','#kill#','^3^','#love#','#no#','[offtopic]',':O','[photo]','[shocking]','[slick]',':)','[sosad]','#oh#',':P',';-)','???','?_?','[yipes]','Z_Z'];
var chosen = "toggemt";
//alert(chosen);
var show = true;
var loaded = false;
var thisversionname = "2.1.7";
var thisversion = "2.1";
//var $ = function (selector) {
//        return document.querySelector(selector);
//}
var mobile = false;
if(document.URL.indexOf("m.hkgalden") != -1)
	mobile = true;

var $$ = function (selector) {
	return document.querySelectorAll(selector);
}

var doc = document.querySelector('head');

//what to do after that set of icon is clicked
function chooseActions(btn) {
	//alert(btn.id);
	// if icons are already showing
	if ( show){
      	
	//if clicked iconset is different from the showing iconsets, an animated silde and change iconset
	if ( chosen != btn.id){
	silde();
	setTimeout( function(t){
	changeiconset(btn.id);
	chosen = btn.id;
	$('#loadgif').show();
	GM_setValue("chosen", btn.id);
	},100);
	
	setTimeout( function(t){silde();$('#loadgif').hide();},1100);
	
	//if not, just silde out
	}else{
	silde();
	show = false;
	}
      
      //show icons
    }else{
      	if ( chosen != btn.id){
        	changeiconset(btn.id);
        	chosen = btn.id;
        	$('#loadgif').show();
        	GM_setValue("chosen", btn.id);
        	setTimeout( function(t){silde();show = true;$('#loadgif').hide();},1100);        	
	}else{
      	 silde();
   	 show = true;
   	
	}
   	}
}

//to slide in and out (show and hide) the icons
function silde(){
	var script = document.createElement('script');
	script.innerHTML = "$('#gae .emt').slideToggle(150);";
	document.body.appendChild(script);
	document.body.removeChild(document.body.lastChild);
}

//replace each icon with that specific set of icon
function changeiconset(bid){
	var icons = document.querySelector(".emt");
	
	//different if the chosen set is the original set
	if ( bid == "toggemt"){
	for (var j = 0; j < 46; j++) {
	icons.childNodes[j*2].setAttribute("data-code", ocode[j]);
	icons.childNodes[j*2].setAttribute("title", ocode[j]);
	icons.childNodes[j*2].setAttribute("alt", ocode[j]);
	icons.childNodes[j*2].childNodes[0].src = '/face/hkg/' +oimg[j] +'.gif';
	}
	}else{
	for (var j = 0; j < 46; j++) {
	if( !mobile){
	icons.childNodes[j*2].setAttribute("data-code", codeSets[bid.substr(7)][j]);
	icons.childNodes[j*2].setAttribute("title", codeSets[bid.substr(7)][j]);
	icons.childNodes[j*2].setAttribute("alt", codeSets[bid.substr(7)][j]);
	}else{
	  icons.childNodes[j*2].setAttribute("data-code", "[img]"+iconSets[bid.substr(7)][j]+"[/img]");
	  icons.childNodes[j*2].setAttribute("title", "[img]"+iconSets[bid.substr(7)][j]+"[/img]");
	  icons.childNodes[j*2].setAttribute("alt", "[img]"+iconSets[bid.substr(7)][j]+"[/img]");
	}
	icons.childNodes[j*2].childNodes[0].src = iconSets[bid.substr(7)][j];
	}
	}
	setTimeout(function(t){}, 3000);
}


//start altering the interface
function addIcons() {
	
	//get the original biggrin thumbnail
    var originalBtn = document.querySelector("#toggemt");
        
    // original icons chosen and shown by default
    originalBtn.parentNode.chosenBtn = "";
    originalBtn.parentNode.allHidden = false;
	
	// clone button and pad its id
	for ( var val in id){
	var cloneID = val;
	var cloneBtn = document.querySelector("#toggemt").cloneNode(true);
	originalBtn.parentNode.appendChild(cloneBtn);
	cloneBtn.id += cloneID;
	var firstBtn;
	if ( cloneBtn.id == GM_getValue("chosen"))
	firstBtn = cloneBtn;
	 
	//change thumbnail and disable onclick toggle function
	cloneBtn.childNodes[0].setAttribute('src', thumbnail[val]);
	cloneBtn.setAttribute('title', val);
	cloneBtn.setAttribute('alt', val);
	cloneBtn.setAttribute('onclick', "");
	
	//activate chooseActions function while specific thumbnail was clicked
	if ( cloneID != "separate")
	cloneBtn.addEventListener("click", (function(c) { return function(e){ chooseActions(this, iconSets[c]); } })(cloneID), false);
	else
	cloneBtn.addEventListener("click",(function(){}));
	}
	var loadgif = originalBtn.cloneNode(true);
	loadgif.id = "loadgif";
	loadgif.childNodes[0].setAttribute('src', "http://i.na.cx/p6JO9.gif");
	loadgif.setAttribute('onclick', "");
	
	//originalBtn.setAttribute('onclick', "");
	originalBtn.parentNode.appendChild(loadgif);
	
	// add click event to original icon btn
	
	
	originalBtn.setAttribute('onclick', "");
	originalBtn.addEventListener("click", function(e) {chooseActions(this, "")}, false);
	
	if ( firstBtn != null)
	chooseActions(firstBtn, iconSets[firstBtn.id.substr(7)]);
	
	$('#loadgif').hide();
	
}

function submitfasthack(form, button, reply){
	$('#temp_' + form).remove();
	var fr = $('#' + form); 
	fr.clone(true, true).attr('id','temp_' + form).insertAfter(fr).hide();
	
	var text = $('#' + form + ' #ta').val();
	for ( var id in codeSets)
	for ( var j in codeSets[id]){
	while (text.indexOf(codeSets[id][j]) != -1)
	text = text.replace(codeSets[id][j],'[img]'+iconSets[id][j]+'[/img]');
	}
	
	$('#temp_' + form + ' #ta').val(text);
	var script = document.createElement('script');
	
	//alert(document.URL);
    script.innerHTML = "$(document).on('click','#temp_" + button +"',function(e){e.preventDefault();if($('#gae #ta').val().length > 0){$('#temp_" + button +"').attr('disabled',true);$.ajax({type:'POST',url:'/ajax/fastreply',data:$('#temp_" + form + "').serialize(),success: function(data){if(data.status == 'success'){$('#reply_content').val('');window.location.reload();}else if(data.status == 'error'){alert('Error:'+data.msg);window.location.reload();}}});}else{notify('請輸入回覆內容');}});";
	script.innerHTML +="$(document).on('keydown','#gae #ta',function(f){if(f.ctrlKey && f.keyCode == 13){$('#temp_" + button + "').click();}});";
    document.body.appendChild(script);
	document.body.removeChild(document.body.lastChild);
    
    //
}

function submitreplyhack(form, button, reply){
	$('#temp_' + form).remove();
	var fr = $('#' + form); 
	fr.clone(true, true).attr('id','temp_' + form).insertAfter(fr).hide();
	
	var text = $('#' + form + ' #ta').val();
	for ( var id in codeSets)
	for ( var j in codeSets[id]){
	while (text.indexOf(codeSets[id][j]) != -1)
	text = text.replace(codeSets[id][j],'[img]'+iconSets[id][j]+'[/img]');
	}
	
	$('#temp_' + form + ' #ta').val(text);
	var script = document.createElement('script');
	
	//alert(document.URL);
    script.innerHTML = "$(document).on('click','#temp_" + button +"',function(e){e.preventDefault();if($('#gae #ta').val().length > 0){$('#temp_" + button +"').attr('disabled',true);$.ajax({xhr:function(){var xhr = new window.XMLHttpRequest();xhr.upload.addEventListener('progress',function(evt){if(evt.lengthComputable){var percentComplete = Math.round((evt.loaded/evt.total)*100);$('#prog-bar .prog').css({'width':percentComplete+'%'});$('#prog-bar .perc').html(percentComplete +'%');}},false);return xhr;},type:'POST',url:'/ajax/" + reply + "',data:$('#temp_" + form + "').serialize(),success:function(data){console.dir(data);if(data.status == 'success'){$('#prog-bar').remove();location.href = data.return;}else{$('#new_topic').attr('disabled',false);$('#prog-bar .prog').css({'width':0});$('#prog-bar .perc').empty()}},});}else{notify('請輸入回覆內容');}})";
	

    document.body.appendChild(script);
	document.body.removeChild(document.body.lastChild);
    
}

function previewhack(form, button, reply){
	$('#temp_' + form).remove();
	var fr = $('#' + form); 
	fr.clone(true, true).attr('id','temp_' + form).insertAfter(fr).hide();
	
	var text = $('#' + form + ' #ta').val();
	for ( var id in codeSets)
	for ( var j in codeSets[id]){
	while (text.indexOf(codeSets[id][j]) != -1)
	text = text.replace(codeSets[id][j],'[img]'+iconSets[id][j]+'[/img]');
	}
	
	$('#temp_' + form + ' #ta').val(text);
	var script = document.createElement('script');
  script.innerHTML = "$(document).on('click','#temp_" + button + "',function(e){e.preventDefault();$.fancybox.showActivity;if($('#gae #ta').val().length > 0){$.ajax({type:'POST',url:'/ajax/preview/" + reply + "',data:$('#temp_" + form + "' ).serialize(),success:function(data){$.fancybox({minWidth:'70%',minHeight:'70%','content':data,});$.fancybox.hideActivity;}});}else{notify('請輸入回覆內容');}});";
	document.body.appendChild(script);
	document.body.removeChild(document.body.lastChild);

}

win.icontocode = function(text){
	for ( var id in iconSets)
	for ( var j in iconSets[id]){
	//alert(iconSets[id][j]);
	while (text.indexOf('[img]'+iconSets[id][j]+'[/img]') != -1)
	text = text.replace('[img]'+iconSets[id][j]+'[/img]', codeSets[id][j]);
	}
	return text;
}

function quotehack(){
	
	$('.fast_quote').each(function(){
	var newquote = $(this).clone().attr('class', 'temp_fast_quote');
	newquote.insertAfter($(this).hide());});

	var script = document.createElement('script');
  script.innerHTML = "$(document).on('click','.temp_fast_quote',function(){mQuoteVals = {'quote_type':$(this).attr('data-type'),'quote_id':$(this).attr('data-id')}; $.ajax({type:'POST',url:'/ajax/quote/',data:mQuoteVals,dataType:'json',success:function(rdata){$('#fpy').addClass('fcs');$('#gae #ta').focus().val('').val(icontocode(rdata.quote_content)+'\\n');}});});";
	document.body.appendChild(script);
	document.body.removeChild(document.body.lastChild);
	
}

function buttonhack(){

    
	//hack all fastquote
	quotehack();
	
	//hack fast - preview
	$("#preview_fast_reply").attr('id','temp_preview_fast_reply');
	$("#temp_preview_fast_reply").attr("type", "button");
	$("#temp_preview_fast_reply").click(function(){previewhack("fast_reply", "preview_fast_reply", "reply")});
	
	//hack newpost, reply - preview
	$("#preview_topic").attr('id','temp_preview_topic');
	$("#temp_preview_topic").attr("type", "button");
	if (document.URL.indexOf("post") == -1)
	$("#temp_preview_topic").click(function(){previewhack("reply_topic", "preview_topic", "reply")});
	else
	$("#temp_preview_topic").click(function(){previewhack("post_new_topic", "preview_topic", "topic")});
	
	//hack fast - submit	
	$("#submit_fast_reply").attr('id','temp_submit_fast_reply');
	$("#temp_submit_fast_reply").attr("type", "button");
	$("#temp_submit_fast_reply").click(function(){submitfasthack("fast_reply","submit_fast_reply", "reply")});
	
	//hack reply - submit	
	$("#reply").attr('id','temp_reply');
	$("#temp_reply").attr("type", "button");
	$("#temp_reply").click(function(){submitreplyhack("reply_topic","reply", "reply")});
	
	//hack newpost - submit	
	if (document.URL.indexOf("post") != -1){
	var board = document.URL.substr(document.URL.indexOf("post")+5,2);
	$("#post_topic").attr('id','temp_post_topic');
	$("#temp_post_topic").attr("type", "button");
	$("#temp_post_topic").click(function(){submitreplyhack("post_new_topic","post_topic", "post/" + board)});
	}
    
    	
    $(document).on('keydown','#gae #ta',function(e){if(e.ctrlKey && e.keyCode == 13){$('#temp_reply').click();$('#temp_submit_fast_reply').click();$('#temp_post_topic').click();}});
	
}

//change the img tag to icon+ code right after reply page is loaded
function tahack(){
	var text = $("#gae #ta").val();
	for ( var id in iconSets)
	for ( var j in iconSets[id]){
	//alert(iconSets[id][j]);
	while (text.indexOf('[img]'+iconSets[id][j]+'[/img]') != -1)
	text = text.replace('[img]'+iconSets[id][j]+'[/img]', codeSets[id][j]);
	}
	$("#gae #ta").val(text);
}

win.icondialog = function(message){
    var ans = confirm(message);
	if (ans)
		window.location.href = "https://greasyfork.org/scripts/2124-hkgalden-icon/code/HKGalden%20Icon+.user.js";
}

function updatedialog(message){
    var ans = confirm(message);
	if (ans)
		window.location.href = "https://greasyfork.org/scripts/2124-hkgalden-icon/code/HKGalden%20Icon+.user.js";
}

win.faildialog = function(message){
    var ans = confirm(message);
	if (ans)
		window.location.href = "http://www.gmail.com";
}

function errordialog(message){
    var ans = confirm(message);
	if (ans)
		window.location.href = "http://www.gmail.com";
}

function actp(s){
		
	
	var a = document.createElement('a');
	a.innerHTML = "Icon+";
	if ( s == "fail"){
		var message = "HKGalden Icon+ Script Error!\\n\\nLogin (or logout) Gmail after pressing OK for fixing it.";
		a.setAttribute('onclick', 'faildialog("'+message+'")');
	}else{
		var message = "HKGalden Icon+ Script V" + thisversionname + "\\n\\nWritten by BB_Warrior (ID:3794) @ HKGalden\\n\\nYou could press OK to install the latest update.";
	    a.setAttribute('onclick', 'icondialog("'+message+'")');
	}
	$(a).insertBefore($(".actp a:nth-child(2)"));
	//var script = document.createElement('script');
	//script.innerHTML = "$(window).scroll(function(){if($(document).height() > $(window).height()+8 && $(this).scrollTop() > 0){$('#gb').addClass('zx');}else if($(this).scrollTop() == 0){$('#gb').removeClass('zx');}if($(this).scrollTop() > 400){$('#iconplus').fadeIn(250);}else{$('#iconplus').fadeOut(250);}});});";
	//document.body.appendChild(script);
	//document.body.removeChild(document.body.lastChild);
}

// reply/post content not yet loaded on run
function contentCheck() {
	if (document.querySelector("#gae")) {
	loaded = true;
	if (document.URL.indexOf("reply") != -1)
	tahack();
	if (!mobile)
	buttonhack();
	addIcons();
	actp("normal");
	} else {
	setTimeout(contentCheck, 300);
	}
}

//if loginned user cannot load the google api callback, prompt out the notice.
function LoadedCheck() {
        if (!loaded && document.querySelector('.actp').childNodes.length == 3) {
            errordialog("HKGalden Icon+ Script Error!\n\nLogin (or logout) Gmail after pressing OK for fixing it.");
            actp("fail");
        } 
}


win.mainfunction = function (json) {

	//to fetch the data from the google spreadsheet
	var obj = json.feed.entry[0];
	var update = true;
	for (var key in obj){
	if ( key.indexOf("script") != -1 ){
	var version = obj[key].$t;
	if ( version.indexOf(thisversion) != -1) update = false;
	if ( version.indexOf("error") != -1) update = null;
	}
	if( key.indexOf("gsx")==0 && key.indexOf("script") == -1){
	id[key.substr(4)] = key.substr(4);
	thumbnail[key.substr(4)]=obj[key].$t;
	}
	}
	if (update == true) updatedialog("Latest HKGalden Icon+ Script (V" + thisversionname + ") released! \n\nPress OK and install this script again for update.");
	if (update == null) alert("HKGalden Icon+ Script is not compatible with the latest HKGalden Forum! \n\nPlease temporarily disable this script. \n\nKeep an eye on the posts in HKGalden of Icon+ Script and wait for the next update.");
	var numOfRows = json.feed.entry.length;
	for ( var val in id){
	iconSets[val] = new Array();
	codeSets[val] = new Array();
	for ( var j = 1; j < numOfRows; j++){                           
	var entry = json.feed.entry[j];
	iconSets[val][j-1] = entry["gsx$" + val].$t;
	//alert(iconSets[val][j-1]);
	codeSets[val][j-1] = ocode[j-1].substr(0,1) + val + ocode[j-1].substr(1);
	}
	}
	 
	//check if the interface is loaded
	setTimeout(contentCheck, 300);
}

var jsonapi = document.createElement('script');
jsonapi.src = 'https://spreadsheets.google.com/feeds/list/0ApEyQph2NSyNdDA2WmNpR2tPQkdsR2JtRnYwcy1NRHc/od6/public/values?alt=json-in-script&callback=mainfunction';
var doc = document.querySelector('head');
doc.appendChild(jsonapi);

setTimeout(LoadedCheck, 10000);