<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ajgraham.com</title>
	<atom:link href="http://www.ajgraham.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajgraham.com</link>
	<description>web design, development and consultation in Prague</description>
	<lastBuildDate>Fri, 02 Jul 2010 21:55:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Retrieve Facebook page status with no authenticating or permissions issues</title>
		<link>http://www.ajgraham.com/2010/07/get-facebook-page-stream-simple-easy/</link>
		<comments>http://www.ajgraham.com/2010/07/get-facebook-page-stream-simple-easy/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 21:42:11 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[key]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[retrieve]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[scraping]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[status]]></category>
		<category><![CDATA[stream]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=451</guid>
		<description><![CDATA[If you&#8217;re just looking to read the &#8216;Stream&#8217; or &#8216;Statuses&#8217; of a Facebook fan page (not a normal Profile page) it can be done very easily. Due to all Fan Pages being public (their are 2 settings: published or unpublished), as long as the Fan page is published then you [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re just looking to read the &#8216;Stream&#8217; or &#8216;Statuses&#8217; of a Facebook fan page (<em>not</em> a normal Profile page) it can be done very easily. Due to all Fan Pages being public (their are 2 settings: published or unpublished), as long as the Fan page is published then you can retrieve any data from it, no authentication, no API, no messing around.</p>
<p>Step 1 &#8211; Find the page feed for the Fan Page<br />
The basic URL format of a Facebook fan page feed is:</p>
<pre><code>https://graph.facebook.com/ID of Page/feed</code></pre>
<p>If you can&#8217;t find your unique Page ID <a target="_blank" rel="nofollow" href="http://help.wildfireapp.com/faqs/tutorials/how-to-find-out-your-facebook-fan-page-public-profile-id">read this guide</a>.<br />
<a target="_blank" rel="nofollow" href="https://graph.facebook.com/ID of Page/feed">Test it by opening the link in another browser window</a>. If you get a whole load of data in square and curly brackets (it&#8217;s JSON) that contains posts from your fan page then you&#8217;re set for Step 2.</p>
<p>*Please note that this URL gets every post from your Wall/Stream limited to about the 50 most recent from what I&#8217;ve seen. This includes everything that other people have posted as well in the form of their posts or comments, etc.</p>
<p>Step 2 &#8211; Extract the last status from the feed URL data</p>
<p>Here comes the basic PHP code, you need to put in the Page ID for the
<pre><code>$pageID</code></pre>
<p> variable:</p>
<pre><code>$pageID = "ID of Page"
$url = "https://graph.facebook.com/". $pageID ."/feed";
$json = file_get_contents($url);
$jsonData = json_decode($json);

foreach($jsonData->data as $val) {
	if($val->from->id == $pageID) { //find the first matching post/status by a fan page admin
		$message = $val->message;
		echo $message;
		break; //stop looping on most recent status posted by page admin
	}
}</code></pre>
<h3>Things to consider</h3>
<p>Extracting the data from Facebook directly using a server-side approach should not be used for production as it&#8217;s really inefficient as it adds a noticeable pause to page loading times and will break if Facebook is slow in responding. I provided a basic demo to show how easy it can be done, but you should expand on this by storing the data extracted in a database or file on your server via CRON jobs. Another alternative would be to do it client-side with JavaScript, it depends on the frequency the Fan page data you want is expected to change and what you&#8217;re doing with it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/07/get-facebook-page-stream-simple-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JQuery: Open external links in new window</title>
		<link>http://www.ajgraham.com/2010/05/jquery-open-external-links-in-new-window/</link>
		<comments>http://www.ajgraham.com/2010/05/jquery-open-external-links-in-new-window/#comments</comments>
		<pubDate>Mon, 24 May 2010 18:00:29 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[rel="external"]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=396</guid>
		<description><![CDATA[Finally got round to writing a small bit of code to automatically force anchor links to open in new windows if they are for different domains:
$(document).ready(function() {
	var myDomain = ["www.ajgraham.com", "testing.ajgraham.com", "lifestream.ajgraham.com"]; //do NOT include the http:// pls!
	$("a[href^='http://']").each(function() {
		var slicedHref = $(this).attr('href').slice(7);
		var slashPosition = slicedHref.indexOf("/");
		if (slashPosition != -1) {
			slicedHref = [...]]]></description>
			<content:encoded><![CDATA[<p>Finally got round to writing a small bit of code to automatically force anchor links to open in new windows if they are for different domains:</p>
<pre><code>$(document).ready(function() {
	var myDomain = ["www.ajgraham.com", "testing.ajgraham.com", "lifestream.ajgraham.com"]; //do NOT include the http:// pls!
	$("a[href^='http://']").each(function() {
		var slicedHref = $(this).attr('href').slice(7);
		var slashPosition = slicedHref.indexOf("/");
		if (slashPosition != -1) {
			slicedHref = slicedHref.slice(0,(slashPosition));
		}
		var matchCounter = 0;
		for (i=0;i&lt;myDomain.length;i++) {
			if (slicedHref.indexOf(myDomain[i]) == -1) {
				matchCounter++;
			}
		}
		if (matchCounter == myDomain.length) {
			$(this).attr("target","_blank").attr("rel","external").append("&lt;img class='new-window-link' alt='new window' src='http://www.ajgraham.com/wp-content/themes/ajgrahampro/images/external.png' style='padding-left:2px' /&gt;");
		}
	});
});</code></pre>
<p><a target="_blank" href="http://www.ajgraham.com/codestore/linksinnewwindow/anchorlinkstest.html">See Demo</a></p>
<p><a href="http://www.ajgraham.com/codestore/linksinnewwindow/newWindowLinks.zip">Download basic example</a></p>
<p>Just remember to change
<pre><code>var myDomain = ["www.ajgraham.com", "testing.ajgraham.com", "lifestream.ajgraham.com"];</code></pre>
<p> to your internal domain(s). You can use as many as you like, just don&#8217;t include the http:// bit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/05/jquery-open-external-links-in-new-window/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple but powerful JQuery Form Validation</title>
		<link>http://www.ajgraham.com/2010/05/simple-but-powerful-jquery-form-validation/</link>
		<comments>http://www.ajgraham.com/2010/05/simple-but-powerful-jquery-form-validation/#comments</comments>
		<pubDate>Thu, 20 May 2010 01:29:46 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Field]]></category>
		<category><![CDATA[Form]]></category>
		<category><![CDATA[Input]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Validator]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=363</guid>
		<description><![CDATA[I wrote a relatively simple and intuitive form validation script for a client, which they kindly allowed me to release into the open-source community.
Contents
The Objective
The Basics
Including The JavaScript
Explaining The Code
Core Functions
Expanded Functions
Options
HTML
Examples
Download
License
To-Do&#8217;s
Change-log
The Objective
The aim was to develop a simple JavaScript form validator plugin to be:

JQuery based
Fast and efficient
Automated (via CSS [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a relatively simple and intuitive form validation script for a client, which they kindly allowed me to release into the open-source community.</p>
<h2>Contents</h2>
<p><a href="#objective">The Objective</a><br />
<a href="#basics">The Basics</a><br />
<a href="#include-the-javascript">Including The JavaScript</a><br />
<a href="#explain-code">Explaining The Code</a><br />
<a href="#core-functions">Core Functions</a><br />
<a href="#expanded-functions">Expanded Functions</a><br />
<a href="#options">Options</a><br />
<a href="#html">HTML</a><br />
<a href="#examples">Examples</a><br />
<a href="#download">Download</a><br />
<a href="#license">License</a><br />
<a href="#to-dos">To-Do&#8217;s</a><br />
<a href="#change-log">Change-log</a></p>
<h2 id="objective">The Objective</h2>
<p>The aim was to develop a simple JavaScript form validator plugin to be:</p>
<ul>
<li>JQuery based</li>
<li>Fast and efficient</li>
<li>Automated (via CSS Classes)</li>
<li>Adjustable (via option settings)</li>
<li>Easily expandable</li>
</ul>
<h2 id="basics">The Basics</h2>
<p>From a simplistic overview, the plugin loops around any form with a submit button and validates input elements based on its CSS classes.<br />
The standard CSS classes it works on are:<br />
<strong>required</strong> &#8211; if an input is marked as &#8216;required&#8217; it simply makes sure the field is not empty.<br />
<strong>email</strong> &#8211; it does a simple regex check to ensure the format is correct.<br />
<strong>digit</strong> &#8211; it checks whether the field only contains numbers 0 to 9.<br />
<strong>alpha</strong> &#8211; checks if the field contains characters a to z and A to Z.</p>
<h2 id="include-the-javascript">Including the JavaScript</h2>
<p>First include JQuery, supports 1.3.2 &#8211; 1.4.2:</p>
<pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;</code></pre>
<p>Then include our <a href="#download">script</a>:</p>
<pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;options.validate-form.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;validate-form.js&quot;&gt;&lt;/script&gt;</code></pre>
<h2 id="explain-code">Explaining the Code</h2>
<p>Attaching the code automatically to all Forms is carried out by:</p>
<pre><code>$().ready(function() {
	//attach plugin to all forms with a submit button (except for ignored forms)
	$('form:not('+ formsToIgnore() +')').submit(function() {
		var formId = $(this).attr('id');
		var matchingElements = $('form#'+ formId +' input[type=text], form#'+ formId +' textarea, form#'+ formId +' input[type=checkbox]');
		if (!matchingElements == &quot;&quot;) {
			var formError = validateForm(formId, matchingElements);
			if (formError == true) {
				return false
			} else {
				return true;
			}
		}
	});
});</code></pre>
<p>If you need eager validation (it annoys me, but some people seem to love it #shake-head), set the options variable <em>eagerValidation=true</em> (see script options or examples), or if you don&#8217;t need it, remove it.</p>
<pre><code>//check whether to eagerly validate each field
	if (eagerValidation == true) {
		$('form input[type=text], form textarea, form input[type=checkbox]').focusout(function() {
			var fieldId = $(this).attr('id');
			var formId = $('#'+fieldId).parents('form').attr('id');
			if (validateField(formId, fieldId) == false) {
				removeFieldError(formId, fieldId);
			}
			removeFormError(formId);
			addFormError(formId);
		});
	}</code></pre>
<h2 id="core-functions">Core Functions</h2>
<pre><code>function validateField(formId, fieldId) {
	if (fieldId) {
		removeFieldError(formId, fieldId);

		var element = buildElement(formId, fieldId);
		var fieldValue = jQuery.trim(jQuery(element).val());
		var fieldLength = fieldValue.length;
		var fieldErrorMessage = &quot;&quot;;

		if ($(element).hasClass('text')) {
			if ($(element).hasClass('alpha') &#038;&#038; fieldLength &gt; 0) { // from string start to end, only contains '-' &quot;whitespace&quot; or 'aA'-'zZ'
				if (validateAlpha(fieldValue) == false) {
					fieldErrorMessage = alphaFieldError;
				}
			} else if ($(element).hasClass('digit') &#038;&#038; fieldLength &gt; 0) {
				if (validateDigit(fieldValue) == false) {
					fieldErrorMessage = digitFieldError;
				}
			} else if ($(element).hasClass('email') &#038;&#038; fieldLength &gt; 0) {
				if (validateEmail(fieldValue) == false) {
					fieldErrorMessage = emailFieldError;
				}
			} else if ($(element).hasClass('required') &#038;&#038; fieldLength == 0) {
				fieldErrorMessage = requiredTextError;
			}
		} else if ($(element).is('.textarea.required') &#038;&#038; fieldLength == 0) {
			fieldErrorMessage = requiredTextareaError;
		} else if ($(element).is('.checkbox.required') &#038;&#038; !$(element).is(':checked')) {
			fieldErrorMessage = requiredCheckboxError;
		}

		if (!fieldErrorMessage) {
			return false;
		} else {
			if (customErrorSelectors.length &gt; 0) {
				for (i=0;i&lt;customErrorSelectors.length;i++) { //check for overrides
					if (customErrorSelectors[i] == element) {
						fieldErrorMessage = customErrorMessages[i];
					}
				}
			}
			addFieldError(formId, fieldId, fieldErrorMessage);
			return true;
		}
	}
}

function validateForm(formId, matchingElements) {
	removeAllErrors(formId);

	matchingElements.each(function(index) {
		var elementId = $(this).attr('id');
		var fieldErrorStatus = validateField(formId, elementId);
	});

	if (countFormErrors(formId) &gt; 0) {
		if (focusFirstError == true) {
			focusOnFirstError(formId);
		}
		if (errorSummary == true) {
			addFormError(formId);
		}
		return true;
	} else {
		if (errorSummary == true) {
			removeFormError(formId);
		}
		return false;
	}
}</code></pre>
<h2 id="expanded-functions">Expanded Functions</h2>
<pre><code>function buildElement(formId, fieldId) {
	var element = &quot;form#&quot;+formId+&quot; #&quot;+fieldId;
	return element;
}

function focusOnFirstError(formId) {
	$('form#'+formId+' input.'+inputErrorClass+':first').focus();
}

function formsToIgnore() { //check for forms to ignore
	var formIgnoreItems = &quot;&quot;;
	for (i=0;i&lt;ignoreForms.length;i++) {
		if (i&gt;0) {
			formIgnoreItems += &quot;, &quot;;
		}
		formIgnoreItems += ignoreForms[i];
	}
	return formIgnoreItems;
}

function countFormErrors(formId) {
	var errorCounter = $('form#'+formId+' '+inputWrapper+'.'+inputWrapperErrorClass).size();
	return errorCounter;
}

function addFormError(formId) {
	var formSelector = 'form#'+formId;
	var errorMessageSelector = formSelector+' p.error-summary';
	var errorCounter = countFormErrors(formId);
	if (errorCounter &gt; 0) {
		if ($(errorMessageSelector).length) {
			$(errorMessageSelector).html(errorCounter + ' field(s) are invalid.');
		} else {
			$(formSelector).prepend('&lt;p class=\&quot;error-summary\&quot;&gt;' + errorCounter + ' field(s) are invalid.&lt;/p&gt;');
		}
	}
}

function removeAllErrors(formId) {
	removeFormError(formId);
	removeAllFieldErrors(formId);
}

function removeFormError(formId) {
	$('form#'+formId+' p.error-summary').remove();
}

function removeAllFieldErrors(formId) {
	var formSelector = 'form#'+formId;
	$(formSelector+' '+inputWrapper).removeClass(inputWrapperErrorClass);
	$(formSelector+' input[type=text], '+formSelector+' textarea, '+formSelector+' input[type=checkbox]').removeClass(inputErrorClass);
	$(formSelector+' '+inputWrapper+' p.error-message').remove();
}

function addFieldError(formId, fieldId, fieldErrorMessage) {
	var element = buildElement(formId, fieldId);
	$(element).addClass(inputErrorClass)
			  .parents(inputWrapper).addClass(inputWrapperErrorClass)
									.append('&lt;p class=\&quot;error-message\&quot;&gt;&gt;' + fieldErrorMessage + '&lt;/p&gt;');
}

function removeFieldError(formId, fieldId) {
	var element = buildElement(formId, fieldId);
	$(element).removeClass(inputErrorClass)
			  .parents(inputWrapper).removeClass(inputWrapperErrorClass);
	$(element).parents(inputWrapper).children('p.error-message').remove();
}

function validateAlpha(alpha) {
	var regex = /^[-\sa-zA-Z]+$/
	return regex.test(alpha);
}

function validateDigit(digit) {
	var regex = /^[0-9]+$/
	return regex.test(digit);
}

function validateEmail(email) {
	var regex = /^(([^&lt;&gt;()[\]\\.,;:\s@\&quot;]+(\.[^&lt;&gt;()[\]\\.,;:\s@\&quot;]+)*)|(\&quot;.+\&quot;))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
	return regex.test(email);
}</code></pre>
<h2 id="options">Options</h2>
<pre><code>//Validator options
var eagerValidation = false; //true/false   if set to true, form will eagerly validate each field. False will validate only ever on form submission
var errorSummary = true; //true/false    if set to true will show error summary at the top of the form
var focusFirstError = true; //true/false    if set to true will refocus user input to first error field on form submission
var inputErrorClass = &quot;error&quot;;    //set the class name that will be appended to the form input/textarea when an error is detected
var inputWrapper = &quot;p&quot;;    //set the element type that is used to wrap the form input/textarea in your forms
var inputWrapperErrorClass = &quot;err&quot;;    //set the class name that will be appended to the wrapper of the input/textarea when an error is detected

//Error Messages
var requiredTextError = &quot;cannot be empty&quot;; //Textbox error
var requiredTextareaError = &quot;cannot be empty&quot;; //Textarea error
var requiredCheckboxError = &quot;needs to be ticked&quot;; //Checkbox error
var alphaFieldError = &quot;characters only, no numbers&quot;; //Alpha Textbox error
var digitFieldError = &quot;numbers only, no characters&quot;; //Numeric Textbox error
var emailFieldError = &quot;valid email address only&quot;; //email Textbox error

var ignoreForms = ['#search-form']; //add any forms you need want the form to ignore, e.g search forms, etc. This can be ignored as long as none of the form inputs have 'required' or other validation classes attached

var customErrorSelectors = ['form#testform #el_0','form#testform #el_2']; //include form Id and element Id!
var customErrorMessages = ['this is an error message override, as specified in the config options','this is another error message override']; //Relates directly to customErrorSelectors</code></pre>
<h2 id="html">HTML</h2>
<p>The script assumes an element wrapper is used, and must be included in the options under inputWrapper, the default is &lt;p&gt;. See the examples included for the structure of HTML compatible.</p>
<h2 id="examples">Examples</h2>
<p><a target="_blank" href="http://www.ajgraham.com/codestore/jqueryformvalidator/formvalidation-basic.html">Simple Example</a><br />
<a target="_blank" href="http://www.ajgraham.com/codestore/jqueryformvalidator/formvalidation-complex.html">More Complex Example</a></p>
<h2 id="download">Download</h2>
<p>Options script &#8211; <strong>required for validation script to work</strong></p>
<p><a href="http://www.ajgraham.com/codestore/jqueryformvalidator/jquery.form-validator.zip">Download everything in 1 zipped package</a></p>
<h2 id="license">License</h2>
<p>Released under <a href="http://www.ajgraham.com/codestore/jqueryformvalidator/MIT-LICENSE.txt">MIT License</a>.</p>
<h2 id="to-dos">To Do&#8217;s</h2>
<ul>
<li>Improve the efficiency of the code execution.</li>
<li>Add min-length class options for fields.</li>
</ul>
<h2 id="change-log">Change-log</h2>
<p>2010/05/20: v0.2 released</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/05/simple-but-powerful-jquery-form-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tracking Email Signature click throughs</title>
		<link>http://www.ajgraham.com/2010/05/tracking-analytics-by-email-campaign/</link>
		<comments>http://www.ajgraham.com/2010/05/tracking-analytics-by-email-campaign/#comments</comments>
		<pubDate>Thu, 13 May 2010 21:23:51 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[campaign]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[tracking]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=352</guid>
		<description><![CDATA[A while ago I thought about how best to create a more modern and useful email signature. At the same time I was doing some work with Google Analytics and thought it might be useful to track how many people click on my website link in my signature. I decided [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I thought about how best to create a more modern and useful email signature. At the same time I was doing some work with Google Analytics and thought it might be useful to track how many people click on my website link in my signature. I decided to use the following bit of code which would track it:</p>
<pre><code>&lt;a style="color:#353535" title="www.ajgraham.com/" href="http://www.ajgraham.com/?utm_source=Signature&#038;utm_medium=Email&#038;utm_term=Gmail&#038;utm_campaign=Email%2BSignature"&gt;
www.ajgraham.com/
&lt;/a&gt;</code></pre>
<p>The inline colour is used so the line isn&#8217;t the nasty default blue, change the #colour to anything you like.<br />
Change the title attribute to whatever you like, or omit it.</p>
<p>The only problem with using the above is that using it natively within GMail or an online web based email will not process it, and the only way to use it would be to use the full (nasty) URL like:
<pre><code>http://www.ajgraham.com/?utm_source=Signature&#038;utm_medium=Email&#038;utm_term=Gmail&#038;utm_campaign=Email%2BSignature</code></pre>
<p>There&#8217;s a workaround though, but it forces you to use a mail client like Thunderbird or Outlook and use it as part of a signature, which is a bit of a hassle simply to track email signature clicks. Unfortunately, until GMail allows full HTML in its online signatures then this is the only automated way of doing this.</p>
<p>It is interesting how many people click on it though, and the level of potential granularity if you wanted to take it even further to track different sets of email correspondents.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/05/tracking-analytics-by-email-campaign/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Website redevelopment</title>
		<link>http://www.ajgraham.com/2010/04/website-redevelopment/</link>
		<comments>http://www.ajgraham.com/2010/04/website-redevelopment/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 15:40:06 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[redesign]]></category>
		<category><![CDATA[site]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=270</guid>
		<description><![CDATA[I moved to Prague about a month ago, despite a lack of blog posts, I have been both a live and working (although not doing any bank manager pleasing work in the sense of making any money). Just managed to finish my own website redesign which I&#8217;d spent a while [...]]]></description>
			<content:encoded><![CDATA[<p>I moved to Prague about a month ago, despite a lack of blog posts, I have been both a live and working (although not doing any bank manager pleasing work in the sense of making any money). Just managed to finish my own website redesign which I&#8217;d spent a while on as I was really working hard on creating something both a little different to the usual corporate uber serious looking websites while not wanting it to be too over the top as to scare people. I hope I&#8217;ve found a pleasant middle ground using some semi transparency affects using transparent .png&#8217;s, although I would have used the new RGBA CSS3 rules had Internet Explorer supported them <img src='http://www.ajgraham.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>I also decided to create it using Wordpress as having completed 1 Wordpress website recently, and working on another one at the moment, I&#8217;ve learnt an alot about it and grown rather fond of it.</p>
<p>I&#8217;ve also been developing my own JQuery plugin, which I&#8217;m going to release under a GPL license in the next few days. I&#8217;ll post more details soon&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/04/website-redevelopment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adjusting Google Chromes default search to English</title>
		<link>http://www.ajgraham.com/2010/02/changing-google-chromes-default-search-to-english/</link>
		<comments>http://www.ajgraham.com/2010/02/changing-google-chromes-default-search-to-english/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:02:46 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[General IT]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[default]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=216</guid>
		<description><![CDATA[Go to google.com, click on &#8220;Google in English&#8221;. Only after doing this will your cookie be saved. Google Chrome will respect the homepage setting, and should use whatever base URL for Google you get when you visit google.com. After doing the above change, restart the browser and wait ten seconds. [...]]]></description>
			<content:encoded><![CDATA[<p>Go to google.com, click on &#8220;Google in English&#8221;. Only after doing this will your cookie be saved. Google Chrome will respect the homepage setting, and should use whatever base URL for Google you get when you visit google.com. After doing the above change, restart the browser and wait ten seconds. At that point, the {google:baseURL} entry should point to google.com.</p>
<p>Hurrah! No more google.xx which you didn&#8217;t want <img src='http://www.ajgraham.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/02/changing-google-chromes-default-search-to-english/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SEO analysis for dummies: links</title>
		<link>http://www.ajgraham.com/2010/01/seo-analysis-for-dummies-links/</link>
		<comments>http://www.ajgraham.com/2010/01/seo-analysis-for-dummies-links/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 11:13:42 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[analysis]]></category>
		<category><![CDATA[basics]]></category>
		<category><![CDATA[dummies]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[statistic]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=207</guid>
		<description><![CDATA[What follows are the basic few steps I start with when analysing a site:
1/ Checking backlinks (also known as incoming links, inbound links, inlinks, and inward links &#8211; basically they&#8217;re pages that link to your website/page)
Use a Google Advanced Search: for example http://www.google.co.uk/search?as_lq=google.com&#038;btnG=Search
The basic idea here is to see what [...]]]></description>
			<content:encoded><![CDATA[<p>What follows are the basic few steps I start with when analysing a site:</p>
<p>1/ Checking backlinks (also known as incoming links, inbound links, inlinks, and inward links &#8211; basically they&#8217;re pages that link to your website/page)</p>
<p>Use a <a href="http://www.google.co.uk/advanced_search">Google Advanced Search</a>: for example <a href="http://www.google.co.uk/search?as_lq=google.com&#038;btnG=Search">http://www.google.co.uk/search?as_lq=google.com&#038;btnG=Search</a></p>
<p>The basic idea here is to see what websites link to your website. Google (and other Search Engines) use both the number of links and the weight of the website linking to you. I.e the more popular the site that links to you, the more &#8216;weight&#8217; it adds to your website, the more &#8216;weight&#8217; your website has the higher up the search ranking your site will be. There are even more complicated factors involved in this algorithm but it&#8217;s probably too in depth for this brief guide.</p>
<p>2/ Assuming you have some websites/pages that link to your website it&#8217;s a good idea to analyse them for quality. Ideally you want links from reputable websites with a good amount of visitors, this ensures that  some of there kudos &#8216;rubs&#8217; off on you when they link to you.</p>
<p>I&#8217;ll continue this subject in another post as I want to cover keyword usage, link formatting and optimising websites&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2010/01/seo-analysis-for-dummies-links/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Checking Java version and installing via batch file/command line</title>
		<link>http://www.ajgraham.com/2009/12/checking-java-version-and-installing-via-batch-filecommand-line/</link>
		<comments>http://www.ajgraham.com/2009/12/checking-java-version-and-installing-via-batch-filecommand-line/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 17:07:39 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[General IT]]></category>
		<category><![CDATA[batch file]]></category>
		<category><![CDATA[check]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=200</guid>
		<description><![CDATA[Unusual situation the other day. I got asked to add an Intranet page with a guide to explain how end users can check the version (or versions) of Java they have installed. I thought to myself there has to be a better and more efficient way of doing this, and [...]]]></description>
			<content:encoded><![CDATA[<p>Unusual situation the other day. I got asked to add an Intranet page with a guide to explain how end users can check the version (or versions) of Java they have installed. I thought to myself there has to be a better and more efficient way of doing this, and making it easier for the end user at the same time.</p>
<p><strong>First</strong> I had the idea of pointing them to the official Java install test page at <a href="http://www.java.com/en/download/help/testvm.xml">Sun Micro</a>, or the more detailed and thorough page over at <a href="http://www.javatester.org/version.html">http://www.javatester.org/version.html</a>. I thought this was a decent solution, until I found out that if a user has more than 1 version of Java installed then a users Web browser can be set to use a different version of Java than the one that might be getting used for other applications.</p>
<p><strong>Second</strong> solution was to use a batch file that would show all versions of Java that were installed on a machine:</p>
<blockquote><p>
java -version<br />
pause
</p></blockquote>
<p>This worked fine I thought. Just create a batch file, put it on an accessible network source and fire round an email with a link to it.</p>
<p><strong>Third</strong> solution. I spoke to a friend who is great with Desktop Support/Windows/etc. He managed to write a script that checks the specific version of Java that was needed (in this case jre-1_5_0_18-windows-i586-p.exe) and if its not installed, installs it from a network resource.</p>
<blockquote><p>
@Echo off<br />
cls<br />
Echo Installing Java 1.5.0_18, Please be patient</p>
<p>set temp_file_a=c:\temp_a.txt<br />
set net2=0<br />
if exist %temp_file_a%  del %temp_file_a% echo clear temp file</p>
<p>rem get java installations<br />
regedit /e %temp_file_a% &#8220;HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Plug-in\1.5.0_18&#8243;<br />
if exist %temp_file_a% set net2=1<br />
echo checked registry</p>
<p>if %net2% == 0  echo Java 1.5.0_18 Not Installed if %net2% == 1  echo Java 1.5.0_18 Already Installed if %net2% == 1  goto ta05 echo.<br />
echo Installing Java 1.5.0_18. Please be patient \\&#8221;jre-1_5_0_18-windows-i586-p.exe&#8221; /passive<br />
:ta05</p>
<p>if exist %temp_file_a%  del %temp_file_a% cls Echo Java 1.5.0_18 Installed.<br />
pause
</p></blockquote>
<p> This got rolled out via a run once group policy for the 400 users required. From Web Developer to Desktop Support in 3 easy steps <img src='http://www.ajgraham.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2009/12/checking-java-version-and-installing-via-batch-filecommand-line/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classifying your website and content</title>
		<link>http://www.ajgraham.com/2009/10/classifying-your-website-and-content/</link>
		<comments>http://www.ajgraham.com/2009/10/classifying-your-website-and-content/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 00:13:18 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[categorise]]></category>
		<category><![CDATA[classify]]></category>
		<category><![CDATA[filter content]]></category>
		<category><![CDATA[FOSI]]></category>
		<category><![CDATA[ICRA]]></category>
		<category><![CDATA[label]]></category>
		<category><![CDATA[self regulation]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=189</guid>
		<description><![CDATA[When creating a website for any company or organisation its important to adhere to as many generally accepted web standards as possible. Due to the huge amount of content on the Internet, and the range of it too, the market in Internet filtering software continues to grow. There&#8217;s no legal [...]]]></description>
			<content:encoded><![CDATA[<p>When creating a website for any company or organisation its important to adhere to as many generally accepted web standards as possible. Due to the huge amount of content on the Internet, and the range of it too, the market in Internet filtering software continues to grow. There&#8217;s no legal obligation to categorise a websites content, but from an ethical point of view you should do if your content is not suitable for children.</p>
<p>You may also want to categorise your content simply to ensure it isn&#8217;t wrongly categorised by filtering software.</p>
<p>I use a method devised by <abbr title="Family Online Safety Institute">FOSI</abbr> who are a non-profit organisation who have been devising Internet categorisation techniques since 1994.</p>
<p><a href="http://www.icra.org/webmasters/">Find out more about FOSI.</a></p>
<p><a href="http://www.icra.org/support/howtolabel/">How to label your website or content.</a></p>
<p><a href="http://www.icra.org/label/generator/">Start labelling your website or content.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2009/10/classifying-your-website-and-content/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Image/Text Wrapping</title>
		<link>http://www.ajgraham.com/2009/10/dynamic-image-text-wrapping/</link>
		<comments>http://www.ajgraham.com/2009/10/dynamic-image-text-wrapping/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 22:06:04 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[clear]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[landscape]]></category>
		<category><![CDATA[portrait]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[wrapping]]></category>

		<guid isPermaLink="false">http://www.ajgraham.com/?p=136</guid>
		<description><![CDATA[Update 01/02/2010: In hindsight I should have just used JQuery to check that the page had been loaded, e.g:

$(document).ready(function(){
	$('img.wrap').each(function() {
		var img_width = $(this).attr('width');
		if(img_width>=375) {
			$('#content').style.clear='left';
		}
	});
})

A couple of months ago I encountered an issue with one of the sites I was developing, www.howdenparkcentre.co.uk. The basic page template for the main content area [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update 01/02/2010</strong>: In hindsight I should have just used JQuery to check that the page had been loaded, e.g:</p>
<pre><code>
$(document).ready(function(){
	$('img.wrap').each(function() {
		var img_width = $(this).attr('width');
		if(img_width>=375) {
			$('#content').style.clear='left';
		}
	});
})
</code></pre>
<p>A couple of months ago I encountered an issue with one of the sites I was developing, <a href="http://www.howdenparkcentre.co.uk/" target="_blank">www.howdenparkcentre.co.uk</a>. The basic page template for the main content area for most pages includes a primary image, title, sub-title and main text. Due to the way the websites columns are percentage based, i.e. they flex depending on browser resolution, there was an issue where sometimes the customer wanted the text to wrap round the image if the image was portrait, or to drop below if it was landscape. Otherwise there was a risk of text running too narrowly along the side of wider images. Due to all of the websites pages being content managed, and potentially the images being very different dimensions I needed to put in a fix for this.</p>
<p>Below shows the HTML code that calls the JavaScript function. </p>
<h4>HTML</h4>
<pre><code>&lt;body onLoad="checkImage('ImageId','TextContainerId');"&gt;</code></pre>
<p>*Please note after having tested the <code>onLoad</code> option on the actual image (which would have been preferable) it being clear this caused further issues. Due to the way images are cached for the second and subsequent visits to a page the JavaScript would not work as often the image had finished loading (due to it being cached) before the text had even been rendered, which meant the code was not executed properly. Therefore the <code>body onload</code> was required</p>
<h4>JavaScript:</h4>
<pre><code>function checkImage(imageId,textId) {
	if(document.getElementById(imageId) &#038;&#038; document.getElementById(textId)) {
		var id = document.getElementById(imageId);
		if(id.width>=375) {
			var textShift = document.getElementById(textId);
			textShift.style.clear='left';
		}
	}
}</code></pre>
<p>The above code checks if the image is equal or wider than 375px, and if so sets the text container to clear left.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajgraham.com/2009/10/dynamic-image-text-wrapping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
