<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: xpath code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 27 Jul 2008 03:29:06 GMT</pubDate>
    <description>DZone Snippets: xpath code</description>
    <item>
      <title>Adding helpful error messages to your Ruby code</title>
      <link>http://snippets.dzone.com/posts/show/5446</link>
      <description>This Ruby code raises an error if the XPath query fails because the attribute being queried did not exist for the given element. &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  def map_pattr(node, fieldx, valuex)&lt;br /&gt;    begin&lt;br /&gt;    parameter = node.root.elements["parameter[@field='#{fieldx}']"]&lt;br /&gt;    parameter.add_attribute('value', valuex)&lt;br /&gt;    parameter&lt;br /&gt;    &lt;br /&gt;    rescue&lt;br /&gt;      puts 'feedpopulated.rb: map_attr() the field ' + fieldx + ' was not found in params.'&lt;br /&gt;      raise&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Notice that a raise statement is used to ensure that the system error message is raised and any further code execution is halted.&lt;br /&gt;&lt;br /&gt;Without adding a customized helpful message I would be left scratching my head trying to work out what the following system error message meant.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;./feedpopulated.rb:27:in `map_pattr': undefined method `add_attribute' for nil:NilClass (NoMethodError)&lt;br /&gt;     from ./feedpopulated.rb:51:in `create_record'&lt;br /&gt;     from ./feedpopulated.rb:49:in `each'&lt;br /&gt;     from ./feedpopulated.rb:49:in `create_record'&lt;br /&gt;     from ./recordx.rb:91:in `call_create'&lt;br /&gt;     from ./s3fileuploader_handler.rb:14:in `call'&lt;br /&gt;     from ./s3fileuploader_handler.rb:40:in `invoke'&lt;br /&gt;     from ./uploadtwitteraudio.rb:22:in `initialize'&lt;br /&gt;     from /usr/lib/ruby/1.8/rexml/element.rb:890:in `each'&lt;br /&gt;     from /usr/lib/ruby/1.8/rexml/xpath.rb:53:in `each'&lt;br /&gt;     from /usr/lib/ruby/1.8/rexml/element.rb:890:in `each'&lt;br /&gt;     from ./uploadtwitteraudio.rb:18:in `initialize'&lt;br /&gt;     from ./uploadtwitteraudio.rb:72:in `new'&lt;br /&gt;     from ./uploadtwitteraudio.rb:72&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Reference: &lt;a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html"&gt;Programming Ruby: The Pragmatic Programmer's Guide - Exceptions, Catch, and Throw&lt;/a&gt; [ruby-doc.org]</description>
      <pubDate>Wed, 30 Apr 2008 11:40:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5446</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Helpful XPath examples</title>
      <link>http://snippets.dzone.com/posts/show/5443</link>
      <description>A few XPath examples copied from &lt;a href="http://www.w3schools.com/XPath/xpath_syntax.asp"&gt;XPath Syntax&lt;/a&gt; [w3schools.com]&lt;br /&gt;&lt;br /&gt;Predicates&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/bookstore/book[1] 	# Selects the first book element that is the child of the bookstore element. &lt;br /&gt;                        # Note: IE5 and later has implemented that [0] should be the first node, &lt;br /&gt;                        # but according to the W3C standard it should have been [1]!!&lt;br /&gt;/bookstore/book[last()] 	# Selects the last book element that is the child of the bookstore element&lt;br /&gt;/bookstore/book[last()-1] 	# Selects the last but one book element that is the child of the bookstore element&lt;br /&gt;/bookstore/book[position()&lt;3] 	# Selects the first two book elements that are children of the bookstore element&lt;br /&gt;//title[@lang] 	# Selects all the title elements that have an attribute named lang&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Selecting Unknown Nodes&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/bookstore/* 	# Selects all the child nodes of the bookstore element&lt;br /&gt;//* 	# Selects all elements in the document&lt;br /&gt;//title[@*] 	# Selects all title elements which have any attribute&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Selecting Several Paths&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//book/title | //book/price  	# Selects all the title AND price elements of all book elements&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 29 Apr 2008 23:34:28 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5443</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Deleting a redundant shape message from the whiteboard queue</title>
      <link>http://snippets.dzone.com/posts/show/5325</link>
      <description>This code is used to remove a message from the whiteboard queue containing a shape which has recently moved it's position (x and y coordinates) on the board. Code extract from whiteboardqueue.rb&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  def call_delete_shape(params)&lt;br /&gt;    #get the shape's message id.&lt;br /&gt;    doc = Document.new(params)&lt;br /&gt;    shape_id = doc.root.elements["param[@var='id']"].text.to_s&lt;br /&gt;    initialize_doc&lt;br /&gt;&lt;br /&gt;    doc_xml = Document.new(decode2(@doc_file.root.to_s))&lt;br /&gt;    id = doc_xml.root.elements["records/message/body/*[@id='#{shape_id}']"].parent.parent.attributes.get_attribute('id')&lt;br /&gt;    delete_record(id)&lt;br /&gt;    save_file&lt;br /&gt;  end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;*update 10:04pm*&lt;br /&gt;Added the link to the project code http://github.com/jrobertson/whiteboardqueue/tree</description>
      <pubDate>Sat, 05 Apr 2008 19:39:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5325</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Some simple javascript xpath examples</title>
      <link>http://snippets.dzone.com/posts/show/5272</link>
      <description>// Some simple javascript xpath examples&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var canCElC = document.evaluate( '//a[@class="canc"]' ,document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;&lt;br /&gt;for (var m = 0; m &lt; canCElC.snapshotLength; m++){&lt;br /&gt;&lt;br /&gt;	var im = canCElC.snapshotItem(m);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var mems = document.evaluate( '//a[contains(@href, "profile")][ not( @class = "skyblue" )]' ,document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;&lt;br /&gt;for (var l = 0; l &lt; mems.snapshotLength; l++){&lt;br /&gt;&lt;br /&gt;	var cThis = mems.snapshotItem(l);&lt;br /&gt;&lt;br /&gt;}	&lt;br /&gt;&lt;br /&gt;var canHazPics = document.evaluate( '//a[@title= "Click for large image"]' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;&lt;br /&gt;&lt;br /&gt;document.evaluate( 'html/body/div/div[7]/table/tbody/tr[2]/td[ not( contains(@id, "main") )]' ,document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;&lt;br /&gt;for(...&lt;br /&gt;&lt;br /&gt;//bravo's xpath function shortcut&lt;br /&gt;// if you don't have $x already&lt;br /&gt;function $x(p, c) {&lt;br /&gt;	var i, r = [], x = document.evaluate(p, c || document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);&lt;br /&gt;	while(i=x.iterateNext()) r.push(i);&lt;br /&gt;	return r;&lt;br /&gt;}&lt;br /&gt;//&lt;br /&gt;// a function to change history days in links&lt;br /&gt;//&lt;br /&gt;// Usage: ChangeDays(n); where n is 1, 3, 7, 14, 30 or 60 - not sure what other values may do to poor Simones Site&lt;br /&gt;//&lt;br /&gt;function ChangeDays(d) {&lt;br /&gt;	$x('//a[contains(@href, "/forum-user.cfm?id=")][not(contains(@href, "days="))]').forEach(function(e) {&lt;br /&gt;		e.setAttribute('href', e.getAttribute('href').replace(/cfm\?id=/, 'cfm?days='+d+'&amp;id='));&lt;br /&gt;	});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// more bravo stuff&lt;br /&gt;&lt;br /&gt;// getById&lt;br /&gt;function $i(id) {&lt;br /&gt;	return document.getElementById(id);&lt;br /&gt;}&lt;br /&gt;// xpath unordered nodes&lt;br /&gt;function $xu(p, c) {&lt;br /&gt;	var i, r = [], x = document.evaluate(p, c || document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);&lt;br /&gt;	while(i=x.iterateNext()) r.push(i);&lt;br /&gt;	return r;&lt;br /&gt;}&lt;br /&gt;// xpath ordered nodes&lt;br /&gt;function $xo(p, c) {&lt;br /&gt;	var i, r = [], x = document.evaluate(p, c || document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);&lt;br /&gt;	while(i=x.iterateNext()) r.push(i);&lt;br /&gt;	return r;&lt;br /&gt;}&lt;br /&gt;// xpath single first node&lt;br /&gt;function $xf(p, c) {&lt;br /&gt;	return document.evaluate(p, c || document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;&lt;br /&gt;}&lt;br /&gt;// xpath single any node&lt;br /&gt;function $xa(p, c) {&lt;br /&gt;	return document.evaluate(p, c || document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;&lt;br /&gt;}&lt;br /&gt;// getByCLASS(className, orderedFlag);&lt;br /&gt;// untested!!&lt;br /&gt;function $c(cls, o) {&lt;br /&gt;	var fn=$xu;&lt;br /&gt;	if(o) fn=$xo;&lt;br /&gt;	return fn('//*[@class = "'+cls+'"' +&lt;br /&gt;				' or contains(@class, " '+cls+' ")' +&lt;br /&gt;				' or starts-with(@class, "' +cls+' ")' +&lt;br /&gt;				' or substring(@class,string-length(@class)-'+cls.length+')=" '+cls+'"]');&lt;br /&gt;}&lt;br /&gt;// create Element&lt;br /&gt;function $ec(type, attributes){&lt;br /&gt;	var node = document.createElement(type);&lt;br /&gt;	for (var attr in attributes) if (attributes.hasOwnProperty(attr)){&lt;br /&gt;		node.setAttribute(attr, attributes[attr]);&lt;br /&gt;	}&lt;br /&gt;	return node;&lt;br /&gt;}&lt;br /&gt;// delete Element&lt;br /&gt;function $ed(element) {&lt;br /&gt;	element.parentNode.removeChild(element);&lt;br /&gt;}&lt;br /&gt;// insert element after&lt;br /&gt;function $ea(newNode, node) {&lt;br /&gt;	return node.parentNode.insertBefore(newNode, node.nextSibling);&lt;br /&gt;}&lt;br /&gt;// insert element before&lt;br /&gt;function $eb(newNode, node) {&lt;br /&gt;	return node.parentNode.insertBefore(newNode, node);&lt;br /&gt;}&lt;br /&gt;// make element first child of par&lt;br /&gt;function $ef(newNode, par) {&lt;br /&gt;	return par.insertBefore(newNode, par.firstChild);&lt;br /&gt;}&lt;br /&gt;// make element last child of par&lt;br /&gt;function $el(newNode, par) {&lt;br /&gt;	return par.appendChild(newNode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 23 Mar 2008 04:54:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5272</guid>
      <author>Yansky (Yansky)</author>
    </item>
    <item>
      <title>Display a filtered list using XSLT</title>
      <link>http://snippets.dzone.com/posts/show/5177</link>
      <description>Following on from the post &lt;a href="http://snippets.dzone.com/posts/show/5174"&gt;A simple XSLT example&lt;/a&gt; [dzone.com], this code lists all files which have the type 'rb' (equivalent to ls *.rb).&lt;br /&gt;&lt;br /&gt;file: dir.xsl&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;br /&gt;&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;&lt;br /&gt;      &lt;br /&gt;    &lt;xsl:template match="dir"&gt;&lt;br /&gt;    &lt;div id="articles"&gt;&lt;br /&gt;      &lt;ul&gt;&lt;br /&gt;      &lt;xsl:apply-templates select="records/file[@type='rb']"/&gt;&lt;br /&gt;      &lt;/ul&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;xsl:template match="records/file[@type='rb']"&gt;&lt;br /&gt;      &lt;li&gt;&lt;xsl:value-of select="."/&gt;&lt;/li&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;output:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;div id='articles'&gt;&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;projxmlhelper.rb&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;feedpopulated.rb&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;squrl_handler.rb&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;password_handler.rb&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;category.rb&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;gwd.rb&lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;*update 11:58am 26-Feb*&lt;br /&gt;Here's a filter I will be using in my projects&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;br /&gt;&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;&lt;br /&gt;      &lt;br /&gt;    &lt;xsl:template match="dir"&gt;&lt;br /&gt;    &lt;div id="articles"&gt;&lt;br /&gt;      &lt;ul&gt;&lt;br /&gt;      &lt;xsl:apply-templates select="records/file"/&gt;&lt;br /&gt;      &lt;/ul&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;xsl:template match="records/file"&gt;&lt;br /&gt;      &lt;xsl:if test="@type=$type"&gt;&lt;br /&gt;        &lt;li&gt;&lt;xsl:value-of select="."/&gt;&lt;/li&gt;&lt;br /&gt;      &lt;/xsl:if&gt;&lt;br /&gt;    &lt;/xsl:template&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 26 Feb 2008 11:47:59 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5177</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Using XPath in JavaScript (Mozilla based)</title>
      <link>http://snippets.dzone.com/posts/show/5100</link>
      <description>The following JavaScript code uses XPath to select a specific element. Note: This code works for Firefox, but Internet Explorer has it's own implementation of XPath. see &lt;a href="http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript"&gt;Introduction to using XPath in JavaScript&lt;/a&gt; [mozilla.org]&lt;br /&gt;&lt;br /&gt;doc (xml document)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;codes&gt;&lt;br /&gt;  &lt;codex value='bQ' index='Q'/&gt;&lt;br /&gt;  &lt;codex value='S' index='R'/&gt;&lt;br /&gt;  &lt;codex value='PU' index='S'/&gt;&lt;br /&gt;  &lt;codex value='ji' index='T'/&gt;&lt;br /&gt;  &lt;codex value='0' index='U'/&gt;&lt;br /&gt;  &lt;codex value='33' index='V'/&gt;&lt;br /&gt;  &lt;codex value='A' index='W'/&gt;&lt;br /&gt;  &lt;codex value='tO' index='X'/&gt;&lt;br /&gt;  &lt;codex value='fW' index='Y'/&gt;&lt;br /&gt;  &lt;codex value='P' index='Z'/&gt;&lt;br /&gt;  &lt;codex value='4h' index='a'/&gt;&lt;br /&gt;  &lt;codex value='B' index='b'/&gt;&lt;br /&gt;  &lt;codex value='m' index='c'/&gt;&lt;br /&gt;  &lt;codex value='qf' index='d'/&gt;&lt;br /&gt;  &lt;codex value='uJ' index='e'/&gt;&lt;br /&gt;&lt;/codes&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assuming the doc object below contains the XML data from above.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var nodesSnapshot = doc.evaluate("codes/codex[@index='a']", doc, null, XPathResult.&lt;br /&gt;  UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;node = nodesSnapshot.snapshotItem(0);&lt;br /&gt;msg = "The secret code for '" + node.getAttribute('index') + "' is " + node.getAttribute('value');&lt;br /&gt;alert(msg);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;output (value from the alert box)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;"The secret code for 'a' is 4h"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;see also: &lt;a href="http://snippets.dzone.com/posts/show/5091"&gt;Reading an XML file using JavaScript&lt;/a&gt;</description>
      <pubDate>Sun, 03 Feb 2008 22:26:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5100</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>DOM Mouse-Over Element Selection and Isolation</title>
      <link>http://snippets.dzone.com/posts/show/4513</link>
      <description>DOM ISO.v.0.3.0.7.bookmarklet.js&lt;br /&gt;bookmarklet for selecting and isolating an element on a page.&lt;br /&gt;&lt;br /&gt;two sections:&lt;br /&gt;section 1:  Mouseover DOM, setup and handle mouse events and show information about element in informational div.  Click to select, Any key to cancel.&lt;br /&gt;section 2:  Element Isolation with help of XPath.  prompt user for XPath expression  e.g., //DIV[@id='post-body'].  then use XPath to select all elements not(ancestor or descendant or self), then delete those elements.  also ignore self-or-descendants of head and title.&lt;br /&gt;&lt;br /&gt;tools:&lt;br /&gt;Ruderman's javascript development environment:  https://www.squarefree.com/bookmarklets/webdevel.html#jsenv&lt;br /&gt;Mielczarek's js to bookmarklet generator:  http://ted.mielczarek.org/code/mozilla/bookmarklet.html&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;(function() {&lt;br /&gt;	//GLOBALS&lt;br /&gt;		//globals for classMausWork&lt;br /&gt;		var gSelectedElement;	//currently only one selection&lt;br /&gt;		var gHoverElement;		//whatever element the mouse is over&lt;br /&gt;		var gHovering=false;	//mouse is over something&lt;br /&gt;		var gObjArrMW=[];	//global array of classMausWork objects.  for removing event listeners when done selecting.&lt;br /&gt;		&lt;br /&gt;		//extended	&lt;br /&gt;		var infoDiv;		//currently just container for InfoDivHover, might add more here&lt;br /&gt;		var infoDivHover;	//container for hoverText text node.&lt;br /&gt;		var hoverText;		//show information about current element that the mouse is over&lt;br /&gt;		//const EXPERIMENTAL_NEW_CODE=true;	//debugging. new features.&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	//START&lt;br /&gt;	SetupDOMSelection();	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;		&lt;br /&gt;	//(Section 1) Element Selection&lt;br /&gt;	function SetupDOMSelection()&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;		{&lt;br /&gt;			//setup event listeners&lt;br /&gt;			//var pathx="//div | //span | //table | //td | //tr | //ul | //ol | //li | //p";&lt;br /&gt;			var pathx="//div | //span | //table | //th | //td | //tr | //ul | //ol | //li | //p | //iframe";&lt;br /&gt;			var selection=$XPathSelect(pathx);&lt;br /&gt;			for(var element, i=0;element=selection(i);i++)&lt;br /&gt;			{			&lt;br /&gt;				if(element.tagName.match(/^(div|span|table|td|tr|ul|ol|li|p)$/i))	//redundant check.&lt;br /&gt;				{&lt;br /&gt;					var m = new classMausWork(element);&lt;br /&gt;					gObjArrMW.push(m);&lt;br /&gt;					attachMouseEventListeners(m);&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			document.body.addEventListener('mousedown',MiscEvent,false);&lt;br /&gt;			document.body.addEventListener('mouseover',MiscEvent,false);&lt;br /&gt;			document.body.addEventListener('mouseout',MiscEvent,false);&lt;br /&gt;			document.addEventListener('keypress',MiscEvent,false);&lt;br /&gt;		}&lt;br /&gt;		{&lt;br /&gt;			//setup informational div to show which element the mouse is over.&lt;br /&gt;			infoDiv=document.createElement('div');&lt;br /&gt;			var s=infoDiv.style;&lt;br /&gt;			s.position='fixed';&lt;br /&gt;			s.top='0';&lt;br /&gt;			s.right='0';&lt;br /&gt;			&lt;br /&gt;			s.display='block';&lt;br /&gt;			s.width='auto';&lt;br /&gt;			s.padding='0px';&lt;br /&gt;&lt;br /&gt;			document.body.appendChild(infoDiv);&lt;br /&gt;			infoDivHover=document.createElement('div');&lt;br /&gt;&lt;br /&gt;			s=infoDivHover.style;&lt;br /&gt;			s.fontWeight='bold';			&lt;br /&gt;			s.padding='3px';&lt;br /&gt;			s.Opacity='0.8';&lt;br /&gt;			s.borderWidth='thin';&lt;br /&gt;			s.borderStyle='solid';&lt;br /&gt;			s.borderColor='white';&lt;br /&gt;			s.backgroundColor='black';&lt;br /&gt;			s.color='white';&lt;br /&gt;			&lt;br /&gt;			infoDiv.appendChild(infoDivHover);			&lt;br /&gt;			hoverText=document.createTextNode('selecting');&lt;br /&gt;			infoDivHover.appendChild(hoverText);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function CleanupDOMSelection()&lt;br /&gt;	{&lt;br /&gt;		for(var m; m=gObjArrMW.pop(); )&lt;br /&gt;		{&lt;br /&gt;			detachMouseEventListeners(m);&lt;br /&gt;		}&lt;br /&gt;		ElementRemove(infoDiv);&lt;br /&gt;		document.body.removeEventListener('mousedown',MiscEvent,false);&lt;br /&gt;		document.body.removeEventListener('mouseover',MiscEvent,false);&lt;br /&gt;		document.body.removeEventListener('mouseout',MiscEvent,false);		&lt;br /&gt;		document.removeEventListener('keypress',MiscEvent,false);&lt;br /&gt;	}	&lt;br /&gt;&lt;br /&gt;	function attachMouseEventListeners(c)&lt;br /&gt;	{&lt;br /&gt;		//c is object of class classMausWork&lt;br /&gt;		c.element.addEventListener("mouseover",c.mouse_over,false);				&lt;br /&gt;		c.element.addEventListener("mouseout",c.mouse_out,false);	&lt;br /&gt;		c.element.addEventListener("mousedown",c.mouse_click,false);		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	function detachMouseEventListeners(c)&lt;br /&gt;	{&lt;br /&gt;		//c is object of class classMausWork&lt;br /&gt;		c.resetElementStyle();&lt;br /&gt;		c.element.removeEventListener("mouseover",c.mouse_over,false);				&lt;br /&gt;		c.element.removeEventListener("mouseout",c.mouse_out,false);	&lt;br /&gt;		c.element.removeEventListener("mousedown",c.mouse_click,false);		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	//mouse event  handling class for element, el.&lt;br /&gt;	function classMausWork(element)&lt;br /&gt;	{	&lt;br /&gt;		//store information about the element this object is assigned to handle. element,  original style, etc.	&lt;br /&gt;		this.element=element;&lt;br /&gt;		&lt;br /&gt;		var elementStyle=element.getAttribute('style');&lt;br /&gt;		var target;&lt;br /&gt;		&lt;br /&gt;		this.mouse_over=function(ev)&lt;br /&gt;		{	&lt;br /&gt;			if(gHovering)return;&lt;br /&gt;			var e=element;			&lt;br /&gt;			var s=e.style;&lt;br /&gt;			s.backgroundColor='yellow';&lt;br /&gt;			s.borderWidth='thin';&lt;br /&gt;			s.borderColor='lime';&lt;br /&gt;			s.borderStyle='solid';					&lt;br /&gt;			InfoMSG(ElementInfo(e),'yellow','blue','yellow');&lt;br /&gt;			gHoverElement=e;&lt;br /&gt;			gHovering=true;&lt;br /&gt;			target=ev.target;&lt;br /&gt;			ev.stopPropagation();		&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.mouse_out=function(ev)&lt;br /&gt;		{&lt;br /&gt;			if(!gHovering)return;&lt;br /&gt;			if(gHoverElement!=element ||ev.target!=target)return;&lt;br /&gt;			var e=element;&lt;br /&gt;			e.setAttribute('style',elementStyle);&lt;br /&gt;			InfoMSG('-','white','black','white');	&lt;br /&gt;			gHoverElement=null;&lt;br /&gt;			gHovering=false;&lt;br /&gt;			target=null;&lt;br /&gt;			//ev.stopPropagation();&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.mouse_click=function(ev)&lt;br /&gt;		{&lt;br /&gt;			if(!gHovering)return;&lt;br /&gt;			if(gHoverElement!=element ||ev.target!=target)return;&lt;br /&gt;			var e=element;&lt;br /&gt;			e.setAttribute('style',elementStyle);&lt;br /&gt;			ev.stopPropagation();			&lt;br /&gt;			CleanupDOMSelection();			&lt;br /&gt;			gHoverElement=null;&lt;br /&gt;			gHovering=false;&lt;br /&gt;			target=null;&lt;br /&gt;			&lt;br /&gt;			if(ev.button==0)&lt;br /&gt;			{&lt;br /&gt;				gSelectedElement=e;&lt;br /&gt;				ElementSelected(e);	//finished selecting, cleanup then move to next part (section 2), element isolation.&lt;br /&gt;			}&lt;br /&gt;		};&lt;br /&gt;		&lt;br /&gt;		this.resetElementStyle=function()&lt;br /&gt;		{&lt;br /&gt;			element.setAttribute('style',elementStyle);&lt;br /&gt;		};		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	function MiscEvent(ev)		//keypress, and mouseover/mouseout/mousedown event on body.  cancel selecting.&lt;br /&gt;	{&lt;br /&gt;		if(ev.type=='mouseout' &amp;&amp; !gHovering)&lt;br /&gt;		{&lt;br /&gt;			InfoMSG('-','white','black','white');&lt;br /&gt;		}&lt;br /&gt;		else if(ev.type=='mouseover' &amp;&amp; !gHovering)&lt;br /&gt;		{&lt;br /&gt;			InfoMSG('cancel','yellow','red','yellow');&lt;br /&gt;		}&lt;br /&gt;		else //keypress on document or mousedown on body, cancel ops.&lt;br /&gt;		{&lt;br /&gt;			CleanupDOMSelection();&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function InfoMSG(text,color,bgcolor,border)&lt;br /&gt;	{&lt;br /&gt;		&lt;br /&gt;		var s=infoDivHover.style;&lt;br /&gt;		if(color)s.color=color;&lt;br /&gt;		if(bgcolor)s.backgroundColor=bgcolor;&lt;br /&gt;		if(border)s.borderColor=border;&lt;br /&gt;		if(text)hoverText.data=text;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	//(Section 2) Element Isolation&lt;br /&gt;	function ElementSelected(element)	//finished selecting element.  setup string to prompt user.&lt;br /&gt;	{&lt;br /&gt;		PromptUserXpath(ElementInfo(element));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	function PromptUserXpath(defaultpath)		//prompt user, isolate element.&lt;br /&gt;	{&lt;br /&gt;		var userpath = prompt("XPath of elements to isolate : ", defaultpath);&lt;br /&gt;		if(userpath &amp;&amp; userpath.length&gt;0)&lt;br /&gt;		{&lt;br /&gt;			var addPredicate = "[count(./ancestor-or-self::head)=0][count(./ancestor-or-self::title)=0]";	//exclude head &amp; title elements from selection so they aren't removed&lt;br /&gt;			var addPath = "//script | //form | //object | //embed";	//include these elements in selection for removal&lt;br /&gt;			var pathx=TransformXPath_NoAncestorDescendentSelf(userpath, addPredicate, addPath);		//the xpath selection of all elements to be removed/deleted.&lt;br /&gt;			&lt;br /&gt;			try&lt;br /&gt;			{&lt;br /&gt;				var element;&lt;br /&gt;				var elements=$XPathSelect(pathx);	&lt;br /&gt;				for(var i=0;element=elements(i);i++)&lt;br /&gt;				{			&lt;br /&gt;&lt;br /&gt;					if(!element.nodeName.match(/^(head|title)$/i))	//redundant check.&lt;br /&gt;					{&lt;br /&gt;						ElementRemove(element);&lt;br /&gt;					}&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;			catch(err)&lt;br /&gt;			{&lt;br /&gt;				alert("wtf: "+err);&lt;br /&gt;			}&lt;br /&gt;			&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;		&lt;br /&gt;	&lt;br /&gt;	//support&lt;br /&gt;	function $XPathSelect(p, context) &lt;br /&gt;	{&lt;br /&gt;	  if (!context) context = document;&lt;br /&gt;	  var i, arr = [], xpr = document.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);&lt;br /&gt;	  return function(x) { return xpr.snapshotItem(x); };	//closure.  wooot!  returns function-type array of elements (usually elements, or something else depending on the xpath expression).&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function ElementRemove(e)&lt;br /&gt;	{&lt;br /&gt;		if(e)e.parentNode.removeChild(e);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	function ElementInfo(element)&lt;br /&gt;	{&lt;br /&gt;		var txt='';&lt;br /&gt;		if(element)&lt;br /&gt;		{&lt;br /&gt;			txt=element.tagName.toLowerCase();		//txt=element.tagName;&lt;br /&gt;			txt=attrib(txt,element,'id');&lt;br /&gt;			txt=attrib(txt,element,'class');	&lt;br /&gt;			txt='//'+txt;&lt;br /&gt;		}&lt;br /&gt;		return txt;&lt;br /&gt;		&lt;br /&gt;		function attrib(t,e,a)&lt;br /&gt;		{			&lt;br /&gt;			if(e.hasAttribute(a))&lt;br /&gt;			{&lt;br /&gt;				t+="[@"+a+"='"+e.getAttribute(a)+"']";&lt;br /&gt;			}&lt;br /&gt;			return t;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;	//function to 'invert' the XPath by selecting all elements that are not ancestor and not descendent and not self.&lt;br /&gt;	function TransformXPath_NoAncestorDescendentSelf(u, includePredicates, includePaths)&lt;br /&gt;	{	&lt;br /&gt;		&lt;br /&gt;		//sample input (u):					//div[@class='sortbox']&lt;br /&gt;		//sample output						//*[  not(./descendant-or-self::*=//div[@class='sortbox'])][  not(./ancestor-or-self::*=//div[@class='sortbox'])]&lt;br /&gt;		//sample output with additional conditions:		//*[  not(./descendant-or-self::*=//div[@class='sortbox'])][  not(./ancestor-or-self::*=//div[@class='sortbox'])][count(./ancestor-or-self::head)=0][count(./ancestor-or-self::title)=0]&lt;br /&gt;		&lt;br /&gt;			//obsolete method.  much faster but can only be used for limited types of (simple) xpath expressions -- unlike the current version, which should be able to convert any xpath.&lt;br /&gt;			//input:			table[@id='topbar']&lt;br /&gt;			//output:			//*[not(./descendant-or-self::table[@id='topbar']) and not(./ancestor-or-self::table[@id='topbar'])]&lt;br /&gt;			//output (alternative):	//*[count(./descendant-or-self::table[@id='topbar'])=0 and count(./ancestor-or-self::table[@id='topbar'])=0]&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		var o1=	'./descendant-or-self::*='+gr(u);&lt;br /&gt;		o1=	'not' + gr(o1);&lt;br /&gt;		o1=	nt(o1);	&lt;br /&gt;		var o2= './ancestor-or-self::*='+gr(u);&lt;br /&gt;		o2=	'not' + gr(o2);&lt;br /&gt;		o2=	nt(o2);&lt;br /&gt;&lt;br /&gt;		var o=	'//*'+o1+o2;&lt;br /&gt;		if(includePredicates &amp;&amp; includePredicates.length&gt;0)	o += includePredicates;&lt;br /&gt;		if(includePaths &amp;&amp; includePaths.length&gt;0) o += ' | ' + includePaths;&lt;br /&gt;		return o;&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		function nt(term){return wrap(term,'[]');}	//node test; predicate - enclose with bracket.&lt;br /&gt;		function gr(term){return wrap(term,'()');}	//group - parenthesize.&lt;br /&gt;		function wrap(term, enclosure){return enclosure.charAt(0)+term+enclosure.charAt(1);}&lt;br /&gt;	}	&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;})();&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 09 Sep 2007 01:25:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4513</guid>
      <author>jczerg68 (Jon C)</author>
    </item>
    <item>
      <title>Get XPath</title>
      <link>http://snippets.dzone.com/posts/show/4349</link>
      <description>Given a node this will return an array containing the XPath&lt;br /&gt;Usage:&lt;br /&gt;&lt;br /&gt;getXPath(document.getElementById('myelement'));&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;      function getXPath(node, path) {&lt;br /&gt;        path = path || [];&lt;br /&gt;        if(node.parentNode) {&lt;br /&gt;          path = getXPath(node.parentNode, path);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if(node.previousSibling) {&lt;br /&gt;          var count = 1;&lt;br /&gt;          var sibling = node.previousSibling&lt;br /&gt;          do {&lt;br /&gt;            if(sibling.nodeType == 1 &amp;&amp; sibling.nodeName == node.nodeName) {count++;}&lt;br /&gt;            sibling = sibling.previousSibling;&lt;br /&gt;          } while(sibling);&lt;br /&gt;          if(count == 1) {count = null;}&lt;br /&gt;        } else if(node.nextSibling) {&lt;br /&gt;          var sibling = node.nextSibling;&lt;br /&gt;          do {&lt;br /&gt;            if(sibling.nodeType == 1 &amp;&amp; sibling.nodeName == node.nodeName) {&lt;br /&gt;              var count = 1;&lt;br /&gt;              sibling = null;&lt;br /&gt;            } else {&lt;br /&gt;              var count = null;&lt;br /&gt;              sibling = sibling.previousSibling;&lt;br /&gt;            }&lt;br /&gt;          } while(sibling);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if(node.nodeType == 1) {&lt;br /&gt;          path.push(node.nodeName.toLowerCase() + (node.id ? "[@id='"+node.id+"']" : count &gt; 0 ? "["+count+"]" : ''));&lt;br /&gt;        }&lt;br /&gt;        return path;&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 23 Jul 2007 20:57:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4349</guid>
      <author>sprsquish (Jeff Smick)</author>
    </item>
    <item>
      <title>Java DOM: Sample XPath Query</title>
      <link>http://snippets.dzone.com/posts/show/4012</link>
      <description>&lt;code&gt;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;      XPath xpath = XPathFactory.newInstance().newXPath();&lt;br /&gt;      Element e = (Element) xpath.evaluate("/Archive/Section/Description", parentNode,&lt;br /&gt;          XPathConstants.NODE);&lt;br /&gt;      printXmlNode(e);&lt;br /&gt;    }&lt;br /&gt;    catch (XPathExpressionException e)&lt;br /&gt;    {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 14 May 2007 09:22:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4012</guid>
      <author>thitiv (Thiti V. Sintopchai)</author>
    </item>
    <item>
      <title>Greasemonkey script to get all xpath expressions of 'a' and 'input type=submit' elements in a document</title>
      <link>http://snippets.dzone.com/posts/show/3755</link>
      <description>This greasemonkey script uses the JS files loading mechanism that Carlo Zottmann's uses in his YUI GM script (http://ajaxian.com/archives/using-yui-in-greasemonkey-scripts)&lt;br /&gt;&lt;br /&gt;The one JS file it loads (which you must host somewhere) must contain 3 functions: getElementXPath(), getElementIdx(), and gm_showXPath()&lt;br /&gt;&lt;br /&gt;You will find getElementXPath and getElementIdx in a previous post of mine.&lt;br /&gt;&lt;br /&gt;gm_showXPath() is provided here together with the GM script that loads the file and inserts a DIV on top of the HTML page with a link that when pressed will generate a pop-up and write all the XPATH expressions of 'a' and input submit elements in the document.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First the JS function that will call getElementXPath() for each doc element we are intersted on.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function gm_showXPath()&lt;br /&gt;{&lt;br /&gt;	var win = window.open("", window.location, "width="+700+",height="+300+",menubar=no,toolbar=no,directories=no,scrollbars=yes,status=no,left=0,top=0,resizable=yes");&lt;br /&gt;	var xpathInfo = "";	&lt;br /&gt;	var elt = null;&lt;br /&gt;	var links = document.getElementsByTagName('a');&lt;br /&gt;	var inputs = document.getElementsByTagName('input');&lt;br /&gt;	// add click events&lt;br /&gt;	xpathInfo +=  "&lt;h2&gt;" + window.location + "&lt;/h2&gt;";&lt;br /&gt;	for (var i=0; i &lt; links.length; i++)&lt;br /&gt;	{&lt;br /&gt;		elt = links[i];&lt;br /&gt;		var id = elt.getAttribute('id');&lt;br /&gt;		if (id != "gm_showxpath")&lt;br /&gt;		{&lt;br /&gt;			xpathInfo += "href=" + elt.getAttribute('href') + ",xpath="+getElementXPath(links[i]);&lt;br /&gt;                        xpathInfo += "&lt;br&gt;";&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	for (var j=0; j &lt; inputs.length; j++)&lt;br /&gt;	{&lt;br /&gt;		elt = inputs[j];&lt;br /&gt;		var type = elt.getAttribute('type');&lt;br /&gt;		if (type != null &amp;&amp; type.toLowerCase() == 'submit')&lt;br /&gt;		{&lt;br /&gt;			xpathInfo += "href=" + elt.getAttribute('href') + ",xpath="+getElementXPath(links[i]);&lt;br /&gt;			xpathInfo += "&lt;br&gt;";&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	win.document.write(xpathInfo);&lt;br /&gt;	win.document.close();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the GM script that loads the JS file hosting the 3 functions  I mentioned above. The SHOWXP.run function at the bottom of this GM script is the one that inserts the DIV at the top left corner of the page with a link to generate the XPATH "report"&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name            Show xpaths.&lt;br /&gt;// @namespace       http://snippets.dzone.com&lt;br /&gt;// @description     Demo description goes here&lt;br /&gt;// @include         http*://*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;var hostname = "http://your_host_name:xyz";&lt;br /&gt;&lt;br /&gt;// Settings used by the loader&lt;br /&gt;var GM_YUILOADER_CONFIG = {&lt;br /&gt;    // List of JS libraries and CSS files to load. obj is used for the object&lt;br /&gt;    // detection used in the loader. Basically, if the object already exists,&lt;br /&gt;    // the script is not injected in the page.&lt;br /&gt;    assets: [&lt;br /&gt;		{ type: 'js', obj: 'XPATH', url: hostname + '/sandbox/xpath/xpath.js',  onload: null}&lt;br /&gt;    ],&lt;br /&gt;&lt;br /&gt;    // What should be the max allowed loading time? In this example, the&lt;br /&gt;    // script has 6 seconds to load the libraries and CSS files.&lt;br /&gt;    timeout: 6000,&lt;br /&gt;&lt;br /&gt;    // How often should the script check if everything was loaded?&lt;br /&gt;    interval: 300,&lt;br /&gt;&lt;br /&gt;    // What to trigger once all assets are loaded (a string). Example: execute&lt;br /&gt;    // SHOWXP.run() (this will be eval()'ed later on, hence the string)&lt;br /&gt;    runFunction: 'SHOWXP.run()',&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// START LOADER CODE //////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;var DEMO;&lt;br /&gt;var GM_YUILOADER = {&lt;br /&gt;    // Version of the loader&lt;br /&gt;    VERSION: 20070103,&lt;br /&gt;&lt;br /&gt;    // Simple internal timer to keep track of the passed time.&lt;br /&gt;    loaderTimer: 0,&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// This function checks whether everything was loaded yet; if not, it'll wait&lt;br /&gt;// some more and call itself again. It'll do so until either all assets are&lt;br /&gt;// loaded or the max loading time (GM_YUILOADER.loaderTimer.timeout) is&lt;br /&gt;// reached.&lt;br /&gt;&lt;br /&gt;GM_YUILOADER.loaderCheck = function() {&lt;br /&gt;    var ud = unsafeWindow.document;&lt;br /&gt;&lt;br /&gt;    // Do we have a green light yet?&lt;br /&gt;    if (ud.GM_YUILOADER_DOC.go) {&lt;br /&gt;        DEMO = unsafeWindow.DEMO;&lt;br /&gt;        delete ud.GM_YUILOADER_DOC;&lt;br /&gt;        GM_YUILOADER.run();&lt;br /&gt;    }&lt;br /&gt;    // Nope, not yet. Rinse &amp; repeat!&lt;br /&gt;    else {&lt;br /&gt;        GM_YUILOADER.loaderTimer += GM_YUILOADER_CONFIG.interval;&lt;br /&gt;&lt;br /&gt;        if (GM_YUILOADER.loaderTimer &gt;= GM_YUILOADER_CONFIG.timeout) {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        setTimeout(GM_YUILOADER.loaderCheck, GM_YUILOADER_CONFIG.interval);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Main function that initiates loading the external JS and/or CSS files&lt;br /&gt;&lt;br /&gt;GM_YUILOADER.loader = function() {&lt;br /&gt;    if (document.contentType != 'text/html' || !document.body) { return; }&lt;br /&gt;&lt;br /&gt;    var ud = unsafeWindow.document;&lt;br /&gt;&lt;br /&gt;    // This object holds the important stuff to make this work. It's a property&lt;br /&gt;    // of GM's unsafeWindow.document object.&lt;br /&gt;&lt;br /&gt;    ud.GM_YUILOADER_DOC = {&lt;br /&gt;        // Number of JS libraries loaded so far (increased by countLoaded()&lt;br /&gt;        // below)&lt;br /&gt;        numberLoaded: 0,&lt;br /&gt;&lt;br /&gt;        // Total number of JS files.&lt;br /&gt;        numberTotal: 0,&lt;br /&gt;&lt;br /&gt;        // If this is bool true, we're good to go! This is checked by&lt;br /&gt;        // GM_YUILOADER.loaderCheck().&lt;br /&gt;        go: false,&lt;br /&gt;&lt;br /&gt;        // This function will be called by the onLoad events.&lt;br /&gt;        countLoaded: function() {&lt;br /&gt;            if (++this.numberLoaded == this.numberTotal) { this.go = true; }&lt;br /&gt;        }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    // Now let's add the extra tags to the page that'll load the libraries and&lt;br /&gt;    // CSS files.&lt;br /&gt;	var head = document.getElementsByTagName('head').item(0);&lt;br /&gt;	&lt;br /&gt;    var numAssets = GM_YUILOADER_CONFIG.assets.length;&lt;br /&gt;&lt;br /&gt;    for (var a = 0; a &lt; numAssets; a++) {&lt;br /&gt;        var tag;&lt;br /&gt;        var asset = GM_YUILOADER_CONFIG.assets[a];&lt;br /&gt;&lt;br /&gt;        switch (asset.type) {&lt;br /&gt;            // CSS file&lt;br /&gt;            case 'css':&lt;br /&gt;                tag = document.createElement('link');&lt;br /&gt;                tag.href = asset.url;&lt;br /&gt;                tag.type = 'text/css';&lt;br /&gt;                tag.rel = 'stylesheet';&lt;br /&gt;                break;&lt;br /&gt;&lt;br /&gt;            // Javascript library.&lt;br /&gt;            case 'js':&lt;br /&gt;                var injectScript = true;&lt;br /&gt;&lt;br /&gt;                // Object detection&lt;br /&gt;                try {&lt;br /&gt;                    injectScript = eval('window.' + asset.obj + ' === undefined');&lt;br /&gt;                }&lt;br /&gt;                catch (e) {}&lt;br /&gt;&lt;br /&gt;                if (injectScript) {&lt;br /&gt;                    tag = document.createElement('script');&lt;br /&gt;                    tag.src = asset.url;&lt;br /&gt;&lt;br /&gt;                    // The crucial part: triggering document.GM_YUILOADER.countLoaded()&lt;br /&gt;                    // means keeping track whether all scripts are loaded yet.&lt;br /&gt;&lt;br /&gt;                    tag.setAttribute('onload', 'document.GM_YUILOADER_DOC.countLoaded();');&lt;br /&gt;&lt;br /&gt;                    // How many JS libraries are we dealing with again? Let's keep&lt;br /&gt;                    // track.&lt;br /&gt;&lt;br /&gt;                    ud.GM_YUILOADER_DOC.numberTotal++;&lt;br /&gt;                }&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;	    head.appendChild(tag);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Did we actually include anything in the page? If so, trigger the&lt;br /&gt;    // GM_YUILOADER.loaderCheck "watchdog". If not, just tell it to run the&lt;br /&gt;    // main part of the script.&lt;br /&gt;&lt;br /&gt;    if (ud.GM_YUILOADER_DOC.numberTotal &gt; 0) {&lt;br /&gt;        setTimeout(GM_YUILOADER.loaderCheck, GM_YUILOADER_CONFIG.interval);&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        ud.GM_YUILOADER_DOC.go = true;&lt;br /&gt;        GM_YUILOADER.loaderCheck();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;GM_YUILOADER.run = function() {&lt;br /&gt;    // When we're here, we're good to go!&lt;br /&gt;    eval(GM_YUILOADER_CONFIG.runFunction);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// The initial GM_YUILOADER trigger.&lt;br /&gt;setTimeout(GM_YUILOADER.loader, 500);&lt;br /&gt;&lt;br /&gt;// END LOADER CODE ////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// START PAYLOAD SECTION //////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;var SHOWXP = {&lt;br /&gt;  &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// This function is triggered by the loader engine once the scripts are loaded&lt;br /&gt;SHOWXP.run = function() {&lt;br /&gt;	var divElt = document.createElement('div');&lt;br /&gt;	divElt.setAttribute("id", "getxpath");&lt;br /&gt;	divElt.setAttribute("style", "background-color: black; font-weight: bold; font-size: 14px; top:0; left:0; position: absolute; border: 1px solid black;");&lt;br /&gt;	divElt.innerHTML = "&lt;a style='color: FF0000' id='gm_showxpath' href='javascript:gm_showXPath()'&gt;Show XPaths&lt;/a&gt;";&lt;br /&gt;	document.body.appendChild(divElt);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// END PAYLOAD SECTION ////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Apr 2007 19:42:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3755</guid>
      <author>earce (Emilio Arce)</author>
    </item>
  </channel>
</rss>
