
function jQueryBrowserSupport()
{
    var userAgent = navigator.userAgent.toLowerCase();

    // Figure out what browser is being used
    $.browser = {
        version: (userAgent.match(/.+(?:rv|it|ra|ie|me)[\/: ]([\d.]+)/) || [])[1],
        chrome: /chrome/.test(userAgent),
        safari: /webkit/.test(userAgent) && !/chrome/.test(userAgent),
        opera: /opera/.test(userAgent),
        msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
        mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
    };
}


// Expanding nodes
function hookExpandingNodes()
{
	$('.expanding-node-item').live('click', function ()
	{
		var item = $(this);
		var pane = item.next();
		item.toggleClass('expanded-node-item');
		pane.slideToggle();
	});
}

// --- JQuery Extensions ---

$.fn.visible = function (value)
{
	if (value === undefined)
		return $(this).is(":visible");
	else
	{
		if (value)
			$(this).show();
		else
			$(this).hide();
	}
};

$.fn.enabled = function (value)
{
    if (value === undefined)
        return $(this).is(":enabled");
    else
    {
        if (!value)
            $(this).attr('disabled', 'disabled');
        else
            $(this).attr('disabled', '');
    }
};

$.fn.checked = function (value)
{
    if (value === undefined)
        return $(this).is(':checked');
    else
    {
        $(this).attr('checked', value);
    }
}


// --- String extensions ---

String.prototype.trim = function ()
{
	return this.replace(/^\s+|\s+$/g, "");
};

String.prototype.contains = function (what)
{
	return (this.indexOf(what) != -1);
};

String.prototype.startsWith = function (what)
{
    if (this.length < what.length)
        return false;

    return (this.substring(0, what.length) == what);
};

String.prototype.trimStart = function (what)
{
    if (this.length < what.length)
        return "";

    return this.substring(what.length);
};



// OPEN ID SELECTOR --------------------------------------------

/*
Simple OpenID Plugin
http://code.google.com/p/openid-selector/

This code is licenced under the New BSD License.
*/

var providers;

var openid = {
	version: '1.2', // version constant
	demo: false,
	demo_text: null,
	cookie_expires: 6*30,	// 6 months.
	cookie_name: 'openid_provider',
	cookie_path: '/',
	
	img_path: '../Images/',
	lang: null, // language, is set in openid-jquery-<lang>.js
	signin_text: null, // text on submit button on the form
	input_id: null,
	provider_url: null,
	provider_id: null,
	all_small: false, // output large providers w/ small icons
	no_sprite: false, // don't use sprite image
	image_title: '{provider}', // for image title
	
    init: function(input_id) {
        providers = $.extend({}, providers_large, providers_small);
        
        var openid_btns = $('#openid_btns');
        
        this.input_id = input_id;
        
        $('#openid_choice').show();
        $('#openid_input_area').empty();
        
        var i = 0;
        // add box for each provider
        for (id in providers_large) {
        	if (this.all_small) {
        		openid_btns.append(this.getBoxHTML(id, providers_large[id], 'small', i++));	
        	} else
           	openid_btns.append(this.getBoxHTML(id, providers_large[id], 'large', i++));
        }
        if (providers_small) {
        	openid_btns.append('<br/>');
        	
	        for (id in providers_small) {
	        
	           	openid_btns.append(this.getBoxHTML(id, providers_small[id], 'small', i++));
	        }
        }
        
        $('#openid_form').submit(this.submit);
        
        var box_id = this.readCookie();
        if (box_id) {
        	this.signin(box_id, true);
        }  
    },
    getBoxHTML: function(box_id, provider, box_size, index) {
    	if (this.no_sprite) {
    	  var image_ext = box_size == 'small' ? '.ico.gif' : '.gif';
  	      return '<a title="'+this.image_title.replace('{provider}', provider["name"])+'" href="javascript:openid.signin(\''+ box_id +'\');"' +
    			' style="background: #FFF url(' + this.img_path + '../images.' + box_size + '/' + box_id + image_ext + ') no-repeat center center" ' + 
    			'class="' + box_id + ' openid_' + box_size + '_btn"></a>';    
    	}
   	  	var x = box_size == 'small' ? -index*24 : -index*100;
   	  	var y = box_size == 'small' ? -60 : 0;
        return '<a title="'+this.image_title.replace('{provider}', provider["name"])+'" href="javascript:openid.signin(\'' + box_id + '\');"' +
    			' style="background: #FFF url(' + this.img_path + 'openid-providers-' + this.lang + '.png); background-position: ' + x + 'px ' + y + 'px" ' +
    			'class="' + box_id + ' openid_' + box_size + '_btn"></a>';
    },
    /* Provider image click */
    signin: function(box_id, onload) {
    
    	var provider = providers[box_id];
  		if (! provider) {
  			return;
  		}
		
		this.highlight(box_id);
		this.setCookie(box_id);
		
		this.provider_id = box_id;
		this.provider_url = provider['url'];
		
		// prompt user for input?
		if (provider['label']) {
			this.useInputBox(provider);
		} else {
			$('#openid_input_area').empty();
			if (! onload) {
				$('#openid_form').submit();
			}
		}
    },
    /* Sign-in button click */
    submit: function() {
        
    	var url = openid.provider_url; 
    	if (url) {
    		url = url.replace('{username}', $('#openid_username').val());
    		openid.setOpenIdUrl(url);
    	}
    	if(openid.demo) {
    		alert(openid.demo_text + "\r\n" + document.getElementById(openid.input_id).value);
    		return false;
    	}
    	return true;
    },
    setOpenIdUrl: function (url) {
    
    	var hidden = document.getElementById(this.input_id);
    	if (hidden != null) {
    		hidden.value = url;
    	} else {
    		$('#openid_form').append('<input type="hidden" id="' + this.input_id + '" name="' + this.input_id + '" value="'+url+'"/>');
    	}
    },
    highlight: function (box_id) {
    	
    	// remove previous highlight.
    	var highlight = $('#openid_highlight');
    	if (highlight) {
    		highlight.replaceWith($('#openid_highlight a')[0]);
    	}
    	// add new highlight.
    	$('.'+box_id).wrap('<div id="openid_highlight"></div>');
    },
    setCookie: function (value) {
    
		var date = new Date();
		date.setTime(date.getTime()+(this.cookie_expires*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
		
		document.cookie = this.cookie_name+"="+value+expires+"; path=" + this.cookie_path;
    },
    readCookie: function () {
		var nameEQ = this.cookie_name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
    },
    useInputBox: function (provider) {
   	
		var input_area = $('#openid_input_area');
		
		var html = '';
		var id = 'openid_username';
		var value = '';
		var label = provider['label'];
		var style = '';
		
		if (label) {
			html = '<p>' + label + '</p>';
		}
		if (provider['name'] == 'OpenID') {
			id = this.input_id;
			value = 'http://';
			style = 'background:#FFF url('+this.img_path+'openid-inputicon.gif) no-repeat scroll 0 50%; padding-left:18px;';
		}
		html += '<input id="'+id+'" type="text" style="'+style+'" name="'+id+'" value="'+value+'" />' + 
					'<input id="openid_submit" type="submit" value="'+this.signin_text+'"/>';
		
		input_area.empty();
		input_area.append(html);

		$('#'+id).focus();
    },
    setDemoMode: function (demoMode) {
    	this.demo = demoMode;
    }
};

var providers_large = {
    google: {
        name: 'Google',
        url: 'https://www.google.com/accounts/o8/id'
    },
    yahoo: {
        name: 'Yahoo',
        url: 'http://me.yahoo.com/'
    },
    aol: {
        name: 'AOL',
        label: 'Enter your AOL screenname.',
        url: 'http://openid.aol.com/{username}'
    },
    myopenid: {
        name: 'MyOpenID',
        label: 'Enter your MyOpenID username.',
        url: 'http://{username}.myopenid.com/'
    },
    openid: {
        name: 'OpenID',
        label: 'Enter your OpenID.',
        url: null
    }
};

var providers_small = {
    livejournal: {
        name: 'LiveJournal',
        label: 'Enter your Livejournal username.',
        url: 'http://{username}.livejournal.com/'
    },
    /* flickr: {
    name: 'Flickr',        
    label: 'Enter your Flickr username.',
    url: 'http://flickr.com/{username}/'
    }, */
    /* technorati: {
    name: 'Technorati',
    label: 'Enter your Technorati username.',
    url: 'http://technorati.com/people/technorati/{username}/'
    }, */
    wordpress: {
        name: 'Wordpress',
        label: 'Enter your Wordpress.com username.',
        url: 'http://{username}.wordpress.com/'
    },
    blogger: {
        name: 'Blogger',
        label: 'Your Blogger account',
        url: 'http://{username}.blogspot.com/'
    },
    verisign: {
        name: 'Verisign',
        label: 'Your Verisign username',
        url: 'http://{username}.pip.verisignlabs.com/'
    },
    /* vidoop: {
    name: 'Vidoop',
    label: 'Your Vidoop username',
    url: 'http://{username}.myvidoop.com/'
    }, */
    /* launchpad: {
    name: 'Launchpad',
    label: 'Your Launchpad username',
    url: 'https://launchpad.net/~{username}'
    }, */
    claimid: {
        name: 'ClaimID',
        label: 'Your ClaimID username',
        url: 'http://claimid.com/{username}'
    },
    clickpass: {
        name: 'ClickPass',
        label: 'Enter your ClickPass username',
        url: 'http://clickpass.com/public/{username}'
    },
    google_profile: {
        name: 'Google Profile',
        label: 'Enter your Google Profile username',
        url: 'http://www.google.com/profiles/{username}'
    }
};

openid.lang = 'en';
openid.demo_text = 'In client demo mode. Normally would have submitted OpenID:';
openid.signin_text = 'Sign-In';
openid.image_title = 'log in with {provider}';


/**
* jQuery.ScrollTo - Easy element scrolling using jQuery.
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL.
* Date: 5/25/2009
* @author Ariel Flesler
* @version 1.4.2
*
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html
*/
; (function (d) { var k = d.scrollTo = function (a, i, e) { d(window).scrollTo(a, i, e) }; k.defaults = { axis: 'xy', duration: parseFloat(d.fn.jquery) >= 1.3 ? 0 : 1 }; k.window = function (a) { return d(window)._scrollable() }; d.fn._scrollable = function () { return this.map(function () { var a = this, i = !a.nodeName || d.inArray(a.nodeName.toLowerCase(), ['iframe', '#document', 'html', 'body']) != -1; if (!i) return a; var e = (a.contentWindow || a).document || a.ownerDocument || a; return d.browser.safari || e.compatMode == 'BackCompat' ? e.body : e.documentElement }) }; d.fn.scrollTo = function (n, j, b) { if (typeof j == 'object') { b = j; j = 0 } if (typeof b == 'function') b = { onAfter: b }; if (n == 'max') n = 9e9; b = d.extend({}, k.defaults, b); j = j || b.speed || b.duration; b.queue = b.queue && b.axis.length > 1; if (b.queue) j /= 2; b.offset = p(b.offset); b.over = p(b.over); return this._scrollable().each(function () { var q = this, r = d(q), f = n, s, g = {}, u = r.is('html,body'); switch (typeof f) { case 'number': case 'string': if (/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)) { f = p(f); break } f = d(f, this); case 'object': if (f.is || f.style) s = (f = d(f)).offset() } d.each(b.axis.split(''), function (a, i) { var e = i == 'x' ? 'Left' : 'Top', h = e.toLowerCase(), c = 'scroll' + e, l = q[c], m = k.max(q, i); if (s) { g[c] = s[h] + (u ? 0 : l - r.offset()[h]); if (b.margin) { g[c] -= parseInt(f.css('margin' + e)) || 0; g[c] -= parseInt(f.css('border' + e + 'Width')) || 0 } g[c] += b.offset[h] || 0; if (b.over[h]) g[c] += f[i == 'x' ? 'width' : 'height']() * b.over[h] } else { var o = f[h]; g[c] = o.slice && o.slice(-1) == '%' ? parseFloat(o) / 100 * m : o } if (/^\d+$/.test(g[c])) g[c] = g[c] <= 0 ? 0 : Math.min(g[c], m); if (!a && b.queue) { if (l != g[c]) t(b.onAfterFirst); delete g[c] } }); t(b.onAfter); function t(a) { r.animate(g, j, b.easing, a && function () { a.call(this, n, b) }) } }).end() }; k.max = function (a, i) { var e = i == 'x' ? 'Width' : 'Height', h = 'scroll' + e; if (!d(a).is('html,body')) return a[h] - d(a)[e.toLowerCase()](); var c = 'client' + e, l = a.ownerDocument.documentElement, m = a.ownerDocument.body; return Math.max(l[h], m[h]) - Math.min(l[c], m[c]) }; function p(a) { return typeof a == 'object' ? a : { top: a, left: a} } })(jQuery);


