- // ==UserScript==
- // @name Kaskus-Head-Scroller
- // @namespace http://userscripts.org/scripts/show/Kaskus-Head-Scroller
- // @include *.kaskus.co.id/*
- // @version 0.1
- // @dtversion 1404260001
- // @timestamp 1398534731798
- // @description simple script do scroll to top at header (*.kaskus.co.id)
- // @author tuxie.forte;
- // @license (CC) by-nc-sa 3.0
- //
- // -!--latestupdate
- //
- // v0.1 - 2014-04-26
- // init
- //
- // -/!latestupdate---
- //
- //
- //
- // ==/UserScript==
- //
-
- (function(){
- // Initialize Global Variables
- var gvar=function() {};
-
- /*
- window.alert(new Date().getTime());
- */
- //========-=-=-=-=--=========
- gvar.__DEBUG__ = !1; // development
- //========-=-=-=-=--=========
-
-
-
- // =====
- // START
- function start_Main(){
- var $el = $D(gvar.target_selector);
- if( !$el ){
- clog('missing target node');
- return;
- }
-
- if( !gvar.is_mobile )
- $el = $el[0];
- else{
- GM_addGlobalStyle(rSRC.getMobCSS_patch(), 'patch_head', 1);
-
- if( $D('#mqr-content-wrapper') ){ // mqr already has something todo w/ design and event
-
- }
- else{
- GM_addGlobalStyle(rSRC.getMobCSS(), 'fixed_head', 1);
-
- Dom.Ev(window, 'scroll', function(){
- var nVScroll = document.documentElement.scrollTop || document.body.scrollTop,
- el_ = $D('#site-header');
- if( nVScroll > 0 ){
- !hasClass('fx', el_) && addClass('fx', el_);
- }
- else{
- removeClass('fx', el_);
- }
- });
- }
- }
-
- if( $el )
- _o('click', $el, function(e){
- var el = e.target||e;
- if(el && el.nodeName == 'A')
- return !1;
-
- nat_scrollTo(document.body, 0, 234);
- });
- }
-
-
-
- // -
- // -
- // -
- // -
- //=========
- // code below should adapting current QR Engine for this plugins works
- // leave code below as wot it is, as long you know what todo
- //========= Common Functions && Global Var Init ====
- // static routine
- function isDefined(x) { return !(x == null && x !== null); }
- function isUndefined(x) { return x == null && x !== null; }
- function isString(x) { return (typeof(x)!='object' && typeof(x)!='function'); }
- function trimStr(x) { return (typeof(x)=='string' && x ? x.replace(/^\s+|\s+$/g,"") : '') };
-
- function _o(m,e,f){Dom.Ev(e,m,function(e){typeof(f)=='function'?f(e):void(0)});}
- function hasClass(cName, Obj){
- if(cName=="" || !cName) return;
- var re, cCls = (Obj.className ? Obj.className : '');
- if( !cCls )
- return !1;
- else{
- re = new RegExp('\\b'+cName+'\\b', "i");
- return re.test( cCls );
- }
- }
- function addClass(cName, Obj){
- if(cName=="") return;
- var neocls = (Obj.className ? Obj.className : '');
- if(neocls.indexOf(cName)!=-1) return;
- neocls+=(neocls!=''?' ':'')+cName;
- Obj.setAttribute('class', neocls);
- }
- function removeClass(cName, Obj){
- if(!cName || !Obj) return;
- var neocls, rmvclss = getAttr('class', Obj);
- neocls = getAttr('class', Obj);
- rmvclss = cName.split(' ');
- for(var i=0; i<rmvclss.length; ++i)
- neocls = neocls.replace(rmvclss[i], '');
- neocls = trimStr(neocls);
- setAttr('class', neocls, Obj);
- }
- function createTextEl(a) {
- return document.createTextNode(a)
- }
- function createEl(type, attrArray, html){
- var node = document.createElement(type);
- for (var attr in attrArray)
- if (attrArray.hasOwnProperty(attr))
- node.setAttribute(attr, attrArray[attr]);
- if(html) node.innerHTML = html;
- return node;
- }
- function getAttr(name, Obj){
- if("string" === typeof name && "object" === typeof Obj && Obj)
- return Obj.getAttribute(name)||'';
- else
- return;
- }
- function setAttr(name, value, Obj){
- if("string" === typeof name && "object" === typeof Obj)
- return Obj.setAttribute(name, value);
- }
-
-
- var GM_addGlobalStyle = function (a, b, c) {
- var d, e;
- if (a.match(/^https?:\/\/.+/)) {
- d = createEl("link", { type: "text/css", rel:'stylesheet', href:a });
- }else{
- d = createEl("style", { type: "text/css" });
- d.appendChild(createTextEl(a));
- }
- if (isDefined(b) && isString(b)) d.setAttribute("id", b);
- if (isDefined(c) && c) {
- document.body.insertBefore(d, document.body.firstChild)
- } else {
- e = document.getElementsByTagName("head");
- if (isDefined(e[0]) && e[0].nodeName == "HEAD") gvar.$w.setTimeout(function () {
- e[0].appendChild(d)
- }, 100);
- else document.body.insertBefore(d, document.body.firstChild)
- }
- return d
- };
- // Get Elements
- var $D = function (q, root, single) {
- if (root && typeof root == 'string') {
- root = $D(root, null, true);
- if (!root) { return null; }
- }
- if( !q ) return false;
- if ( typeof q == 'object') return q;
- root = root || document;
- if (q[0]=='/' || (q[0]=='.' && q[1]=='/')) {
- if (single) { return document.evaluate(q, root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }
- return document.evaluate(q, root, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- }
- else if (q[0]=='.') { return root.getElementsByClassName(q.substr(1)); }
- else { return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) ); }
- return root.getElementsByTagName(q);
- };
- // utk add - remove element
- var Dom = {
- g: function(el) {
- if(!el) return false;
- return ( isString(el) ? document.getElementById(el) : el );
- },
- add: function(el, dest) {
- var el = this.g(el);
- var dest = this.g(dest);
- if(el && dest) dest.appendChild(el);
- },
- remove: function(el) {
- var el = this.g(el);
- if(el && el.parentNode)
- el.parentNode.removeChild(el);
- },
- Ev: function() {
- if (window.addEventListener) {
- return function(el, type, fn, ph) {
- if(typeof(el)=='object')
- this.g(el).addEventListener(type, function(e){fn(e);}, (isUndefined(ph) ? false : ph));
- };
- }else if (window.attachEvent) {
- return function(el, type, fn) {
- var f = function() { fn.call(this.g(el), window.event); };
- this.g(el).attachEvent('on' + type, f);
- };
- }
- }()
- };
-
- // native scrollTo
- function nat_scrollTo(element, to, duration) {
- var start = element.scrollTop,
- change = to - start,
- currentTime = 0,
- increment = 20;
-
- var animateScroll = function(){
- currentTime += increment;
- var val = Math.easeInOutQuad(currentTime, start, change, duration);
- element.scrollTop = val;
- if(currentTime < duration) {
- setTimeout(animateScroll, increment);
- }
- };
- animateScroll();
- }
-
- //t = current time
- //b = start value
- //c = change in value
- //d = duration
- Math.easeInOutQuad = function (t, b, c, d) {
- t /= d/2;
- if (t < 1) return c/2*t*t + b;
- t--;
- return -c/2 * (t*(t-2) - 1) + b;
- };
-
-
- var rSRC = {
- getMobCSS: function(){
- return ''
- +'#site-header.fx{ position:relative}'
- +'#site-header.fx #site-nav{ width:620px;position:fixed;top:0;z-index:99999}'
- +'#site-header.fx .main-h.r{margin-top:30px}'
- ;
- },
- getMobCSS_patch: function(){
- return ''
- +'#site-nav h1{ text-align:left}'
- +'#site-nav h1 > a{ display:inline-block; height:25px;}'
- ;
- }
-
- };
-
- // ----my ge-debug--------
- function show_alert(msg, force) {
- if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
- GM_log('('+arguments.callee.counter+') '+msg);
- if(force==0) { return; }
- }
- function clog(msg) {
- if(!gvar.__DEBUG__) return;
- show_alert(msg);
- }
- // -end static
- //=========
-
-
- function init(){
- gvar.is_mobile = /^https?:\/\/m\.kaskus\./i.test(location.href);
- gvar.head_id_desktop = 'site-header';
- gvar.head_class_mobile = 'meta-header';
-
- gvar.target_selector = (gvar.is_mobile ? '#'+gvar.head_id_desktop : '.meta-header');
-
-
- start_Main();
- }
-
-
- // ------
- init();
- })()
- /* tF. */