(function($){ // secure the $ jQuery alias
/*****************************************************************************/		  
// jquery.utils.js - compiled useful jquery extensions...
// updated: 2008-01-15
// requires: jquery.js (1.2+) 
// includes: png support, mousewheel, dimensions, bgiframe, metadata

/*****************************************************************************/
// FIX PNG SUPPORT IN IE6...
$.fn.fixPng = $.fn.png = function(){ // IE PNG SUPPORT
	var img, re = /(?:^|\s)url\((?:'|")?([a-z0-9\-_\/\.:]+\.png)(?:'|")?\)(?:\s|$)/i;
	if ($.browser.msie && $.browser.version<7) 
		return this.each(function(i){ 
			img = $(this).css("backgroundImage") || 'none';
			if (re.test(img)) $(this).css({
				'backgroundImage': 'none',
				'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='"+RegExp.$1+"')"
				});
			});
	else return this;
	};
	
/*****************************************************************************/
// jquery.bgiframe.js $Rev: 1546 $
// Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)

$.fn.bgIframe = $.fn.bgiframe = function(s){
	if ($.browser.msie && $.browser.version<7){
		s = $.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});
		var prop = function(n){ return (n&&n.constructor==Number)?(n+'px'):(n); },
		html = '<iframe class="bgiframe" frameborder="0" tabindex="-1" src="'+s.src+'" style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';"/>';
		return this.each(function(){
			if (!$('iframe.bgiframe',this)[0]) 
				this.insertBefore(document.createElement(html),this.firstChild); 
			});
		}
	else return this; 
	};
/*****************************************************************************/
// jquery.metadata.js - Metadata - jQuery plugin for parsing metadata from elements
// Copyright (c) 2006 John Resig, Yehuda Katz, Jorn Zaefferer, Paul McLanahan
// Revision: $Id: jquery.metadata.js 3640 2007-10-11 18:34:38Z pmclanahan $

$.fn.metadata = function(opts){ return $.metadata.get(this[0],opts); };
$.extend({
	metadata : {
		defaults : {
			type: 'attr',
			name: 'meta',
			cre: /({.*})/,
			single: 'metadata'
			},
		setType: function( type, name ){
			this.defaults.type = type;
			this.defaults.name = name;
			},
		get: function( elem, opts ){
			var settings = $.extend({},this.defaults,opts); 
			if ( !settings.single.length ) settings.single = 'metadata';
			var data = $.data(elem, settings.single);
			if ( data ) return data; // returned cached data if it already exists
			data = "{}";
			if ( settings.type == "class" ) {
				var m = settings.cre.exec( elem.className );
				if ( m ) data = m[1];
				} 
			else if ( settings.type == "elem" ) {
				if( !elem.getElementsByTagName ) return;
				var e = elem.getElementsByTagName(settings.name);
				if ( e.length ) data = $.trim(e[0].innerHTML);
				} 
			else if ( elem.getAttribute != undefined ) {
				var attr = elem.getAttribute( settings.name );
				if ( attr ) data = attr;
				}
			if ( data.indexOf( '{' ) <0 ) data = "{" + data + "}";
			data = eval("(" + data + ")");
			$.data( elem, settings.single, data ); // cache the data
			return data;
			}
		}
	});

/* Copyright (c) 2006 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * $LastChangedDate$
 * $Rev$
 *
 * Version: @VERSION
 * 
 * Requires: $ 1.2.2+
 */
$.fn.mousewheel = function(fn) {
	return fn ? this.bind("mousewheel",fn) : this.trigger("mousewheel");
	};
$.event.special.mousewheel = {
	setup: function() {
		var handler = $.event.special.mousewheel.handler;
		// Fix pageX, pageY, clientX and clientY for mozilla
		if ( $.browser.mozilla )
			$(this).bind('mousemove.mousewheel', function(event) {
				$.data(this, 'mwcursorposdata', {
					pageX: event.pageX,
					pageY: event.pageY,
					clientX: event.clientX,
					clientY: event.clientY
					});
				});
		if ( this.addEventListener )
			this.addEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
		else this.onmousewheel = handler;
		},
	teardown: function() {
		var handler = $.event.special.mousewheel.handler;
		$(this).unbind('mousemove.mousewheel');
		if ( this.removeEventListener )
			this.removeEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
		else this.onmousewheel = function(){};
		$.removeData(this, 'mwcursorposdata');
		},
	handler: function(event) {
		var args = Array.prototype.slice.call( arguments, 1 );
		event = $.event.fix(event || window.event);
		// Get correct pageX, pageY, clientX and clientY for mozilla
		$.extend( event, $.data(this, 'mwcursorposdata') || {} );
		var delta = 0, returnValue = true;
		if ( event.wheelDelta ) delta = event.wheelDelta/120;
		if ( event.detail     ) delta = -event.detail/3;
		if ( $.browser.opera  ) delta = -event.wheelDelta;
		event.data = event.data || {};
		event.type = "mousewheel";
		// Add delta to the front of the arguments
		args.unshift(delta);
		// Add event to the front of the arguments
		args.unshift(event);
		return $.event.handle.apply(this, args);
		}
	};
/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $LastChangedDate: 2007-09-11 02:38:31 +0000 (Tue, 11 Sep 2007) $
 * $Rev: 3238 $
 *
 * Version: @VERSION
 *
 * Requires: jQuery 1.2+
 */
	
$.dimensions = { version: '@VERSION' };

// Create innerHeight, innerWidth, outerHeight and outerWidth methods
$.each( [ 'Height', 'Width' ], function(i, name){
	
	// innerHeight and innerWidth
	$.fn[ 'inner' + name ] = function() {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		return this[ name.toLowerCase() ]() + num(this, 'padding' + torl) + num(this, 'padding' + borr);
	};
	
	// outerHeight and outerWidth
	$.fn[ 'outer' + name ] = function(options) {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		options = $.extend({ margin: false }, options || {});
		
		return this[ name.toLowerCase() ]()
				+ num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width')
				+ num(this, 'padding' + torl) + num(this, 'padding' + borr)
				+ (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0);
	};
});

// Create scrollLeft and scrollTop methods
$.each( ['Left', 'Top'], function(i, name) {
	$.fn[ 'scroll' + name ] = function(val) {
		if (!this[0]) return;
		
		return val != undefined ?
		
			// Set the scroll offset
			this.each(function() {
				this == window || this == document ?
					window.scrollTo( 
						name == 'Left' ? val : $(window)[ 'scrollLeft' ](),
						name == 'Top'  ? val : $(window)[ 'scrollTop'  ]()
					) :
					this[ 'scroll' + name ] = val;
			}) :
			
			// Return the scroll offset
			this[0] == window || this[0] == document ?
				self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] ||
					$.boxModel && document.documentElement[ 'scroll' + name ] ||
					document.body[ 'scroll' + name ] :
				this[0][ 'scroll' + name ];
	};
});

$.fn.extend({
	position: function() {
		var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results;
		
		if (elem) {
			// Get *real* offsetParent
			offsetParent = this.offsetParent();
			
			// Get correct offsets
			offset       = this.offset();
			parentOffset = offsetParent.offset();
			
			// Subtract element margins
			offset.top  -= num(elem, 'marginTop');
			offset.left -= num(elem, 'marginLeft');
			
			// Add offsetParent borders
			parentOffset.top  += num(offsetParent, 'borderTopWidth');
			parentOffset.left += num(offsetParent, 'borderLeftWidth');
			
			// Subtract the two offsets
			results = {
				top:  offset.top  - parentOffset.top,
				left: offset.left - parentOffset.left
			};
		}
		
		return results;
	},
	
	offsetParent: function() {
		var offsetParent = this[0].offsetParent;
		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') )
			offsetParent = offsetParent.offsetParent;
		return $(offsetParent);
	}
});

var num = function(el, prop) {
	return parseInt($.css(el.jquery?el[0]:el,prop))||0;
};

/*****************************************************************************/
})(jQuery) // secure the $ jQuery alias
