browse by category or date

This was an improvement from my previous post. We will slowly scroll the snippets using “Window.setTimeout()” functionality.

The modified code (modification is shown in bold) is as follows:

header.php

var myObject;
var myrules = {
	'.codeclicker' : {
		onclick : function() {
			//alert(this.parentNode.tagName);
			var o = this.parentNode;
			if (o.style.overflow == 'hidden') {
				myObject = this.parentNode;
				o.style.overflow = 'scroll';
				var i = 0;
				var increment = 10;
				var loopNum = 48;
				for (i=1; i<=loopNum; i++){
					window.setTimeout('myObject.style.height=''+increment*i+'px';',increment*i);
				}
				window.setTimeout('myObject.style.height='100%';',i*increment);
			}
			else {
				myObject = this.parentNode;
				o.style.height = '21px';
				//window.setInterval('Collapse()',50);
				o.style.overflow = 'hidden';
			}
		}
	}
};
Behavior.register(myrules);

Smaller value of increment and bigger value of loopNum will increase the smoothness. If you have better/cooler idea please share with us 🙂

About Hardono

Howdy! I'm Hardono. I am working as a Software Developer. I am working mostly in Windows, dealing with .NET, conversing in C#. But I know a bit of Linux, mainly because I need to keep this blog operational. I've been working in Logistics/Transport industry for more than 11 years.

Possibly relevant:

I was reading Wikipedia on social bookmarking which lead me to this social-bookmarking-button-generator. It’s really useful so I use it immediately. After selecting all website, I download the zipped file. I extract and upload the images to the server (at “/images” folder) and then i modify ‘single.php’ by copy-paste and modify the content into

single.php

<?php
	$current_url = 'http://'.$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
	$current_url = str_replace(":", "%3A", $current_url);
	$current_url = str_replace("/", "%2F", $current_url);
	$current_url = str_replace("&", "%26", $current_url);
	$current_title = urlencode(the_title("","",FALSE));
?>

<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td><a href='http://digg.com/submit?phase=2&url=<?php 
echo $current_url; ?>&title=<?php  echo $current_title; ?>' target='_self'>
<img border='0' src='/images/digg.png?x74012' alt='Digg This' title='Digg This' /></a></td>

<td><a href='http://del.icio.us/post?url=<?php echo $current_url; ?>&title=<?php 
echo $current_title; ?>' target='_self'><img border='0' 
src='/images/delicious.png?x74012' alt='del.icio.us' title='del.icio.us' /></a></td>

<td><a href='http://reddit.com/submit?url=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' 
 target='_self'><img border='0' src='/images/reddit.png?x74012' alt='Reddit' title='Reddit' /></a></td>

<td><a href='http://www.spurl.net/spurl.php?url=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/spurl.png?x74012' alt='Spurl' title='Spurl' /></a></td>

<td><a href='http://www.furl.net/storeIt.jsp?u=<?php 
 echo $current_url; ?>&t=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/furl.png?x74012' alt='Furl' title='Furl' /></a></td>

<td><a href='http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=<?php 
echo $current_url; ?>&Title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/blinklist.png?x74012' alt='BlinkList' title='BlinkList' /></a></td>

<td><a href='http://ma.gnolia.com/bookmarklet/add?url=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/magnolia.png?x74012' alt='ma.gnolia.com' title='ma.gnolia.com' /></a></td>

<td><a href='http://www.newsvine.com/_tools/seed&save?u=<?php 
echo $current_url; ?>&h=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/newsvine.png?x74012' alt='Newsvine' title='Newsvine' /></a></td>

<td><a href='http://www.simpy.com/simpy/LinkAdd.do?href=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/simpy.png?x74012' alt='Simpy' title='Simpy' /></a></td>

<td><a href='http://technorati.com/faves?add=<?php 
echo $current_url; ?>' target='_self'><img border='0' src='/images/technorati.png?x74012' 
alt='Technorati' title='Technorati' /></a></td>

<td><a href='http://cgi.fark.com/cgi/fark/edit.pl?new_url=<?php 
 echo $current_url; ?>&new_comment=<?php echo $current_title; 
?>&linktype=Misc' target='_self'><img border='0' src='/images/fark.png?x74012' alt='Fark' 
title='Fark' /></a></td>

<td><a href='http://www.blinkbits.com/bookmarklets/save.php?v=1&source_url=<?php
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
lt;img border='0' src='/images/blinkbits.png?x74012' alt='Blinkbits' title='Blinkbits' /></a></td>

<td><a href='http://tailrank.com/share/?text=&link_href=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/tailrank.png?x74012' alt='TailRank' title='TailRank' /></a></td>

<td><a href='http://www.netvouz.com/action/submitBookmark?url=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>&description=<?php 
echo $current_title; ?>' target='_self'><img border='0' src='/images/netvouz.png?x74012' 
alt='Netvouz' title='Netvouz' /></a></td>

<td><a href='http://www.mister-wong.de/index.php?action=addurl&bm_url=<?php
echo $current_url; ?>' target='_self'><img border='0' src='/images/mrwong.png?x74012' 
alt='Mr. Wong' title='Mr. Wong' /></a></td>

<td><a href='http://myweb2.search.yahoo.com/myresults/bookmarklet?u=<?php 
echo $current_url; ?>&t=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/yahoomyweb.png?x74012' alt='YahooMyWeb' title='YahooMyWeb' /></a></td>

<td><a href='http://blogmarks.net/my/new.php?mini=1&simple=1&url=<?php 
echo $current_url; ?>&title=<?php echo $current_title; ?>' target='_self'>
<img border='0' src='/images/blogmarks.png?x74012' alt='Blogmarks' title='Blogmarks' /></a></td>

</tr>
</table>

Have fun with yours =)

About Hardono

Howdy! I'm Hardono. I am working as a Software Developer. I am working mostly in Windows, dealing with .NET, conversing in C#. But I know a bit of Linux, mainly because I need to keep this blog operational. I've been working in Logistics/Transport industry for more than 11 years.

Possibly relevant:

I was roaming at digg when i stumble upon this page:CSS+Javascript power. Fancy menu. Inside, i was amazed to see the way the snippets presented. In an expandable box. You can even see the box expanding line by line.

If you see my post yesterday, I tried my best to reproduce the same effect. But I failed.

To successfully create the expandable box, modify the following files of your active WordPress template/theme by adding the snippet:
style.css

.codediv
{
	height:21px; width:470px;
	overflow:hidden;
	border: #333333 thin solid;
	font-size: 11px;
	display: block;
	background-color: #fff;
}
.codeclicker
{
	cursor:pointer;
}


header.php

<script language="javascript" type="text/javascript" src="<?php bloginfo('wpurl') ?>/js/behavior.js" ></script>
<script language="javascript" type="text/javascript" src="<?php bloginfo('wpurl') ?>/js/selector.js" ></script>
<script language="javascript" type="text/javascript">
var myrules = {
	'.codeclicker' : {
		onclick : function() {
			//alert(this.parentNode.tagName);
			var o = this.parentNode;
			if (o.style.overflow == 'hidden') {
				o.style.height = '100%';
				o.style.overflow = 'scroll';
			}
			else {
				o.style.height = '21px';
				o.style.overflow = 'hidden';
			}
		}
	}
};
Behavior.register(myrules);
</script>

Create a folder called “js” on your WordPress installation folder and create the following files on that folder:


selector.js

/* document.getElementsBySelector(selector)
- returns an array of element objects from the current document
matching the CSS selector. Selectors can contain element names,
class names and ids and can be nested. For example:elements = document.getElementsBySelect('div#main p a.external')
Will return an array of all 'a' elements with 'external' in their
class attribute that are contained inside 'p' elements that are
contained inside the 'div' element which has id="main"
New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
See http://www.w3.org/TR/css3-selectors/#attribute-selectors
Version 0.4 - Simon Willison, March 25th 2003
-- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
-- Opera 7 fails
*/

function getAllChildren(e) {
	// Returns all children of element. Workaround required for IE5/Windows. Ugh.
	return e.all ? e.all : e.getElementsByTagName('*');
}

document.getElementsBySelector = function(selector) {
	// Attempt to fail gracefully in lesser browsers
	if (!document.getElementsByTagName) {
		return new Array();
	}
	
	// Split selector in to tokens
	var tokens = selector.split(' ');
	var currentContext = new Array(document);
	for (var i = 0; i < tokens.length; i++) {
		token = tokens[i].replace(/^s+/,'').replace(/s+$/,'');
		if (token.indexOf('#') > -1) {
			// Token is an ID selector
			var bits = token.split('#');
			var tagName = bits[0];
			var id = bits[1];
			var element = document.getElementById(id);
			if (tagName && element.nodeName.toLowerCase() != tagName) {
				// tag with that ID not found, return false
				return new Array();
			}
			
			// Set currentContext to contain just this element
			currentContext = new Array(element);
			continue; // Skip to next token
		}
		if (token.indexOf('.') > -1) {
			// Token contains a class selector
			var bits = token.split('.');
			var tagName = bits[0];
			var className = bits[1];
			if (!tagName) {
				tagName = '*';
			}
			
			// Get elements matching tag, filter them for class selector
			var found = new Array;
			var foundCount = 0;
			for (var h = 0; h < currentContext.length; h++) {
				var elements;
				if (tagName == '*') {
					elements = getAllChildren(currentContext[h]);
				} else {
					elements = currentContext[h].getElementsByTagName(tagName);
				}
				
				for (var j = 0; j < elements.length; j++) {
					found[foundCount++] = elements[j];
				}
			}
			currentContext = new Array();
			var currentContextIndex = 0;
			
			for (var k = 0; k < found.length; k++) {
				if (found[k].className && found[k].className.match(new RegExp('b'+className+'b'))) {
					currentContext[currentContextIndex++] = found[k];
				}
			}
			continue; // Skip to next token
		}
		// Code to deal with attribute selectors
		if (token.match(/^(w*)[(w+)([=~|^$*]?)=?"?([^]"]*)"?]$/)) {
			var tagName = RegExp.$1;
			var attrName = RegExp.$2;
			var attrOperator = RegExp.$3;
			var attrValue = RegExp.$4;
			if (!tagName) {
				tagName = '*';
			}
			// Grab all of the tagName elements within current context
			var found = new Array;
			var foundCount = 0;
			for (var h = 0; h < currentContext.length; h++) {
				var elements;
				if (tagName == '*') {
					elements = getAllChildren(currentContext[h]);
				} else {
					elements = currentContext[h].getElementsByTagName(tagName);
				}
				for (var j = 0; j < elements.length; j++) {
					found[foundCount++] = elements[j];
				}
			}
			currentContext = new Array();
			var currentContextIndex = 0;
			var checkFunction; // This function will be used to filter the elements
			switch (attrOperator) {
				case '=': // Equality
					checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
					break;
				case '~': // Match one of space seperated words
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('b'+attrValue+'b'))); };
					break;
				case '|': // Match start with value followed by optional hyphen
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
					break;
				case '^': // Match starts with value
					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
					break;
				case '$': // Match ends with value - fails with "Warning" in Opera 7
					checkFunction = function(e) {
						return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); 
					};
					break;
				case '*': // Match ends with value
					checkFunction = function(e) { 
						return (e.getAttribute(attrName).indexOf(attrValue) > -1); 
					};
					break;
				default :
					// Just test for existence of attribute
					checkFunction = function(e) { return e.getAttribute(attrName); };
			}
			currentContext = new Array();
			var currentContextIndex = 0;
			for (var k = 0; k < found.length; k++) {
				if (checkFunction(found[k])) {
					currentContext[currentContextIndex++] = found[k];
				}
			}
			// alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
			continue; // Skip to next token
		}
		
		// If we get here, token is JUST an element (not a class or ID selector)
		tagName = token;
		var found = new Array();
		var foundCount = 0;
		for (var h = 0; h < currentContext.length; h++) {
			var elements = currentContext[h].getElementsByTagName(tagName);
			for (var j = 0; j < elements.length; j++) {
				found[foundCount++] = elements[j];
			}
		}
		
		currentContext = found;
	}
	return currentContext;	
}

/* That revolting regular expression explained
/^(w+)[(w+)([=~|^$*]?)=?"?([^]"]*)"?]$/
---/  ---/-------------/    -------/
|      |         |               |
|      |         |           The value
|      |    ~,|,^,$,* or =
|   Attribute
Tag
*/

behavior.js

// behavior.js - by Dave Herman
// Copyright (C) 2005 by Dave Herman
//
// Based on behaviour.js by Ben Nolan, June 2005
// and getElementBySelector.js by Simon Willison, 2004.
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or (at
// your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
// License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// =============================================================================
// Class: HandlerSet
// =============================================================================

function HandlerSet() {
	this.clearHandlers();
}

HandlerSet.prototype = {
	addHandler : function(f, key) {
		key = key || this.uniqueID++;
		this.installedHandlers[key] = f;
		return key;
	},
	removeHandler : function(key) {
		delete this.installedHandlers[key];
	},
	clearHandlers : function() {
		this.installedHandlers = { };
		this.uniqueID = 0;
	},
	replaceHandlers : function(f, key) {
		clearHandlers();
		return addHandler(f, key);
	},
	applyAll : function(object, arguments) {
		for (var handler in this.installedHandlers) {
			this.installedHandlers[handler].apply(object, arguments);
		}
	},
	debug : function() {
		var str = "";
		for (var p in this.installedHandlers) {
			str += p + " => " + this.installedHandlers[p] + "n";
		}
		alert(str);
	}
};

// =============================================================================
// Function Class: EventHandler
// =============================================================================
function isEventHandler(x) {
	return (typeof x == 'function' && 
		x.handlers &&
		x.handlers.constructor == HandlerSet);
}

function makeEventHandler(original) {
	var handlers = new HandlerSet();
	if (typeof original == 'function') {
		handlers.addHandler(original);
	}
	
	// The event handler is a function, so it can be used with the DOM.
	// But when it's called, we apply all the handlers in the set.
	var result = function() {
		handlers.applyAll(this, arguments);
	};
	
	// We also expose its handler set so we can get at it later.
	result.handlers = handlers;
	return result;
}

// =============================================================================
// Module: Behavior
// =============================================================================
var Behavior = {
	registry : new Array,
	register : function(sheet) {
		Behavior.registry.push(sheet);
	},
	registerEventHandlers : function(element, handlers) {
		for (var event in handlers) {
			if (!isEventHandler(element[event])) {
				element[event] = makeEventHandler(element[event]);
			}
			element[event].handlers.addHandler(handlers[event]);
		}
	},
	apply : function() {
		for (var i = 0; i < Behavior.registry.length; i++) {
			var sheet = Behavior.registry[i];
			for (var selector in sheet) {
				var list = document.getElementsBySelector(selector);
				if (!list) {
					continue;
				}
				for (var j = 0; j < list.length; j++) {
					Behavior.registerEventHandlers(list[j], sheet[selector]);
				}
			}
		}
	},
	addLoadHandler : function(handler) {
		var oldHandler = window.onload;
		if (typeof oldHandler != 'function') {
			window.onload = handler;
		}
		else {
			window.onload = function() {
				oldHandler();
				handler();
			};
		}
	}
};

Behavior.addLoadHandler(function() { Behavior.apply(); });


To use create the snippets use the following structure:

<pre class="codediv"><img src="/images/codeclicker.gif?x74012" class="codeclicker" border="0" />
<!-- put your snippet content here -->
</pre>

Don’t forget to create the “codeclicker.gif” that will be put on folder “images” in your WordPress installation folder (use bloginfo(‘wpurl’); ) the image height should be 20px (if more the image will be hidden since its overflow the “pre” tag)


Note:
I tried to add changing the background color using CSS “background-color = “#bbbbbb”;” on the onclick event handler, but somehow it prevents the script running. Any idea? I also have yet to be able to slowly scroll the snippet box. Again, any idea??
Thank you for reading. Critics and comments are welcome 🙂

About Hardono

Howdy! I'm Hardono. I am working as a Software Developer. I am working mostly in Windows, dealing with .NET, conversing in C#. But I know a bit of Linux, mainly because I need to keep this blog operational. I've been working in Logistics/Transport industry for more than 11 years.

Possibly relevant: