/**
 * --------------------------------------------------------------------
 * jQuery-Plugin "pngFix"
 * Version: 1.1, 11.09.2007
 * by Andreas Eberhard, andreas.eberhard@gmail.com
 *                      http://jquery.andreaseberhard.de/
 *
 * Copyright (c) 2007 Andreas Eberhard
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
 *
 * Changelog:
 *    11.09.2007 Version 1.1
 *    - removed noConflict
 *    - added png-support for input type=image
 *    - 01.08.2007 CSS background-image support extension added by Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com
 *    31.05.2007 initial Version 1.0
 * --------------------------------------------------------------------
 * @example $(function(){$(document).pngFix();});
 * @desc Fixes all PNG's in the document on document.ready
 *
 * jQuery(function(){jQuery(document).pngFix();});
 * @desc Fixes all PNG's in the document on document.ready when using noConflict
 *
 * @example $(function(){$('div.examples').pngFix();});
 * @desc Fixes all PNG's within div with class examples
 *
 * @example $(function(){$('div.examples').pngFix( { blankgif:'ext.gif' } );});
 * @desc Fixes all PNG's within div with class examples, provides blank gif for input with png
 * --------------------------------------------------------------------
 */

(function($) {

jQuery.fn.pngFix = function(settings) {

	// Settings
	settings = jQuery.extend({
		blankgif: 'blank.gif'
	}, settings);

	var ie55 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 5.5") != -1);
	var ie6 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1);

	if (jQuery.browser.msie && (ie55 || ie6)) {

		//fix images with png-source
		jQuery(this).find("img[@src$=.png]").each(function() {

			jQuery(this).attr('width',jQuery(this).width());
			jQuery(this).attr('height',jQuery(this).height());

			var prevStyle = '';
			var strNewHTML = '';
			var imgId = (jQuery(this).attr('id')) ? 'id="' + jQuery(this).attr('id') + '" ' : '';
			var imgClass = (jQuery(this).attr('class')) ? 'class="' + jQuery(this).attr('class') + '" ' : '';
			var imgTitle = (jQuery(this).attr('title')) ? 'title="' + jQuery(this).attr('title') + '" ' : '';
			var imgAlt = (jQuery(this).attr('alt')) ? 'alt="' + jQuery(this).attr('alt') + '" ' : '';
			var imgAlign = (jQuery(this).attr('align')) ? 'float:' + jQuery(this).attr('align') + ';' : '';
			var imgHand = (jQuery(this).parent().attr('href')) ? 'cursor:hand;' : '';
			if (this.style.border) {
				prevStyle += 'border:'+this.style.border+';';
				this.style.border = '';
			}
			if (this.style.padding) {
				prevStyle += 'padding:'+this.style.padding+';';
				this.style.padding = '';
			}
			if (this.style.margin) {
				prevStyle += 'margin:'+this.style.margin+';';
				this.style.margin = '';
			}
			var imgStyle = (this.style.cssText);

			strNewHTML += '<span '+imgId+imgClass+imgTitle+imgAlt;
			strNewHTML += 'style="position:relative;white-space:pre-line;display:inline-block;background:transparent;'+imgAlign+imgHand;
			strNewHTML += 'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;';
			strNewHTML += 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + jQuery(this).attr('src') + '\', sizingMethod=\'scale\');';
			strNewHTML += imgStyle+'"></span>';
			if (prevStyle != ''){
				strNewHTML = '<span style="position:relative;display:inline-block;'+prevStyle+imgHand+'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;'+'">' + strNewHTML + '</span>';
			}

			jQuery(this).hide();
			jQuery(this).after(strNewHTML);

		});

		// fix css background pngs
		jQuery(this).find("*").each(function(){
			var bgIMG = jQuery(this).css('background-image');
			if(bgIMG.indexOf(".png")!=-1){
				var iebg = bgIMG.split('url("')[1].split('")')[0];
				jQuery(this).css('background-image', 'none');
				jQuery(this).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iebg + "',sizingMethod='scale')";
			}
		});
		
		//fix input with png-source
		jQuery(this).find("input[@src$=.png]").each(function() {
			var bgIMG = jQuery(this).attr('src');
			jQuery(this).get(0).runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + bgIMG + '\', sizingMethod=\'scale\');';
   		jQuery(this).attr('src', settings.blankgif)
		});
	
	}
	
	return jQuery;

};

})(jQuery);

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){$.K.w=5(b,c){2(3.7==0)6;2(14 b==\'15\'){c=(14 c==\'15\')?c:b;6 3.L(5(){2(3.M){3.N();3.M(b,c)}v 2(3.17){4 a=3.17();a.1x(O);a.1y(\'P\',c);a.18(\'P\',b);a.1z()}})}v{2(3[0].M){b=3[0].1A;c=3[0].1B}v 2(Q.R&&Q.R.19){4 d=Q.R.19();b=0-d.1C().18(\'P\',-1D);c=b+d.1E.7}6{t:b,S:c}}};4 q={\'9\':"[0-9]",\'a\':"[A-T-z]",\'*\':"[A-T-1a-9]"};$.1b={1F:5(c,r){q[c]=r}};$.K.U=5(){6 3.1G("U")};$.K.1b=5(m,n){n=$.1H({C:"1I",V:B},n);4 o=D W("^"+$.1J(m.1c(""),5(c,i){6 q[c]||((/[A-T-1a-9]/.1d(c)?"":"\\\\")+c)}).1e(\'\')+"$");6 3.L(5(){4 d=$(3);4 f=D 1f(m.7);4 g=D 1f(m.7);4 h=u;4 j=u;4 l=B;$.L(m.1c(""),5(i,c){g[i]=(q[c]==B);f[i]=g[i]?c:n.C;2(!g[i]&&l==B)l=i});5 X(){x();y();1g(5(){$(d[0]).w(h?m.7:l)},0)};5 Y(e){4 a=$(3).w();4 k=e.Z;j=(k<16||(k>16&&k<10)||(k>10&&k<1h));2((a.t-a.S)!=0&&(!j||k==8||k==1i)){E(a.t,a.S)}2(k==8){11(a.t-->=0){2(!g[a.t]){f[a.t]=n.C;2($.F.1K){s=y();d.G(s.1j(0,a.t)+" "+s.1j(a.t));$(3).w(a.t+1)}v{y();$(3).w(1k.1l(l,a.t))}6 u}}}v 2(k==1i){E(a.t,a.t+1);y();$(3).w(1k.1l(l,a.t));6 u}v 2(k==1L){E(0,m.7);y();$(3).w(l);6 u}};5 12(e){2(j){j=u;6(e.Z==8)?u:B}e=e||1M.1N;4 k=e.1O||e.Z||e.1P;4 a=$(3).w();2(e.1Q||e.1R){6 O}v 2((k>=1h&&k<=1S)||k==10||k>1T){4 p=13(a.t-1);2(p<m.7){2(D W(q[m.H(p)]).1d(1m.1n(k))){f[p]=1m.1n(k);y();4 b=13(p);$(3).w(b);2(n.V&&b==m.7)n.V.1U(d)}}}6 u};5 E(a,b){1o(4 i=a;i<b&&i<m.7;i++){2(!g[i])f[i]=n.C}};5 y(){6 d.G(f.1e(\'\')).G()};5 x(){4 a=d.G();4 b=l;1o(4 i=0;i<m.7;i++){2(!g[i]){f[i]=n.C;11(b++<a.7){4 c=D W(q[m.H(i)]);2(a.H(b-1).1p(c)){f[i]=a.H(b-1);1V}}}}4 s=y();2(!s.1p(o)){d.G("");E(0,m.7);h=u}v h=O};5 13(a){11(++a<m.7){2(!g[a])6 a}6 m.7};d.1W("U",5(){d.I("N",X);d.I("1q",x);d.I("1r",Y);d.I("1s",12);2($.F.1t)3.1u=B;v 2($.F.1v)3.1X(\'1w\',x,u)});d.J("N",X);d.J("1q",x);d.J("1r",Y);d.J("1s",12);2($.F.1t)3.1u=5(){1g(x,0)};v 2($.F.1v)3.1Y(\'1w\',x,u);x()})}})(1Z);',62,124,'||if|this|var|function|return|length||||||||||||||||||||||begin|false|else|caret|checkVal|writeBuffer|||null|placeholder|new|clearBuffer|browser|val|charAt|unbind|bind|fn|each|setSelectionRange|focus|true|character|document|selection|end|Za|unmask|completed|RegExp|focusEvent|keydownEvent|keyCode|32|while|keypressEvent|seekNext|typeof|number||createTextRange|moveStart|createRange|z0|mask|split|test|join|Array|setTimeout|41|46|substring|Math|max|String|fromCharCode|for|match|blur|keydown|keypress|msie|onpaste|mozilla|input|collapse|moveEnd|select|selectionStart|selectionEnd|duplicate|100000|text|addPlaceholder|trigger|extend|_|map|opera|27|window|event|charCode|which|ctrlKey|altKey|122|186|call|break|one|removeEventListener|addEventListener|jQuery'.split('|'),0,{}))

/**
 * Jcrop v.0.9.3 (packed)
 * (c) 2008 Kelly Hallman and DeepLiquid.com
 * More information: http://deepliquid.com/content/Jcrop.html
 * Released under MIT License - this header must remain with code
 */

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('W.1n=7(F,H){d(1q(F)!==\'2e\')F=W(F)[0];d(1q(H)!==\'2e\')H={};d(!(\'2x\'1d H))H.2x=$.31.35?M:N;d(!(\'1T\'1d H))H.1T=$.31.35?M:N;g 3C={2x:M,4f:\'4H\',1g:4z,4b:\'4D\',3Q:.6,46:.4,45:.5,4w:5,47:9,4h:5,4s:14,26:0,1T:N,44:N,4o:N,30:N,4d:N,3s:0,3O:0,3F:8,3T:20,3K:3,24:M,3m:[0,0],2G:[0,0],2J:[0,0],2D:7(){},2v:7(){}};g k=3C;1M(H);g $J=W(F).B({18:\'1c\'});3M($J,k.3s,k.3O);g R=$J.X(),O=$J.Y(),$15=W(\'<15 />\').X(R).Y(O).1g(1Q(\'4J\')).B({18:\'4M\',4u:k.4b});d(k.1g)$15.1g(k.1g);$J.4O($15);g 1A,1B;g 1W=2t(F),1r,1u,3k,4G,3l,32=[0,0,0,0],1v;d(\'3i\'1d k){1A=k.3i[0]/R;1B=k.3i[1]/O}g G=7($){g A=q=z=m=0;u.2m=7(C){C=2X(C);q=A=C[0];m=z=C[1]};u.2d=7(C){C=2X(C);17=C[0]-q;16=C[1]-m;q=C[0];m=C[1]};u.4v=7(){j[17,16]};u.3j=7(3o){g 17=3o[0],16=3o[1];d(0>A+17)17-=17+A;d(0>z+16)16-=16+z;d(O<m+16)16+=O-(m+16);d(R<q+17)17+=R-(q+17);A+=17;q+=17;z+=16;m+=16};u.3J=7(T){g c=V();1z(T){D\'1w\':j[c.q,c.y];D\'13\':j[c.x,c.y];D\'1U\':j[c.q,c.m];D\'1F\':j[c.x,c.m]}};u.V=7(){d(!k.26&&!1u)j 4m();g 1m=k.26?k.26:1u,3n=k.2J,4B=k.2G,1Y=q-A,1X=m-z,2W=K.19(1Y),33=K.19(1X),3r=2W/33,11,12;d(3r<1m){12=m;w=33*1m;11=1Y<0?A-w:w+A;d(11<0){11=0;h=K.19((11-A)/1m);12=1X<0?z-h:h+z}1h d(11>R){11=R;h=K.19((11-A)/1m);12=1X<0?z-h:h+z}}1h{11=q;h=2W/1m;12=1X<0?z-h:z+h;d(12<0){12=0;w=K.19((12-z)*1m);11=1Y<0?A-w:w+A}1h d(12>O){12=O;w=K.19(12-z)*1m;11=1Y<0?A-w:w+A}}j 4A=2P(1C(A,z,11,12))};7 2X(p){d(p[0]<0)p[0]=0;d(p[1]<0)p[1]=0;d(p[0]>R)p[0]=R;d(p[1]>O)p[1]=O;j[p[0],p[1]]};7 1C(A,z,q,m){g 2T=A,3g=q,2Y=z,2S=m;d(q<A){2T=q;3g=A}d(m<z){2Y=m;2S=z}j[K.1K(2T),K.1K(2Y),K.1K(3g),K.1K(2S)]};7 4m(){g 1R=q-A;g 1V=m-z;d(2g&&(K.19(1R)>2g))q=(1R>0)?(A+2g):(A-2g);d(2h&&(K.19(1V)>2h))m=(1V>0)?(z+2h):(z-2h);d(2j&&(K.19(1V)<2j))m=(1V>0)?(z+2j):(z-2j);d(2k&&(K.19(1R)<2k))q=(1R>0)?(A+2k):(A-2k);d(A<0){q-=A;A-=A}d(z<0){m-=z;z-=z}d(q<0){A-=q;q-=q}d(m<0){z-=m;m-=m}d(q>R){g Z=q-R;A-=Z;q-=Z}d(m>O){g Z=m-O;z-=Z;m-=Z}d(A>R){g Z=A-O;m-=Z;z-=Z}d(z>O){g Z=z-O;m-=Z;z-=Z}j 2P(1C(A,z,q,m))};7 2P(a){j{x:a[0],y:a[1],q:a[2],m:a[3],w:a[2]-a[0],h:a[3]-a[1]}};u.4N=7(){};u.1C=1C;j u}(W);g L=7(W){g 4P,4Q,4L,1P,2O=4I;g $3c=$(\'<J />\').3I(\'2z\',$J.3I(\'2z\')).B(\'18\',\'1c\').X(R).Y(O);g $2r=$(\'<15 />\').X(1p(U)).Y(1p(U)).B({1k:4K,18:\'1c\',42:\'3Z\'}).1J($3c);g $25=$(\'<15 />\').X(1p(U)).Y(1p(U)).B({1k:4R});g $2a=$(\'<15 />\').B({18:\'1c\',1k:4t}).4l($J).1J($2r,$25);g 2N={};d(k.30){2N={S:1S(\'3E\').B(\'S\',$.31.35?E(-1):E(0)),3t:1S(\'3E\'),Q:1S(\'3D\'),3A:1S(\'3D\')}}g I={};g 2u=M;g 1i=k.4h;d(k.4d){I.t=1Z(\'n\');I.b=1Z(\'s\');I.r=1Z(\'e\');I.l=1Z(\'w\')}d(k.4o)2Q([\'n\',\'s\',\'e\',\'w\']);d(k.44)2Q([\'1F\',\'13\',\'1w\',\'1U\']);7 1S(1x){g 1L=$(\'<15 />\').B({18:\'1c\',1s:k.46}).1g(1Q(1x));$2r.1J(1L);j 1L};7 2U(T,41){g 1L=$(\'<15 />\').36(3b(T)).B({2R:T+\'-2w\',18:\'1c\',1k:41});$25.1J(1L);j 1L};7 4q(T){j 2U(T,2O++).B({S:E(-1i+1),Q:E(-1i+1),1s:k.45}).1g(1Q(\'I\'))};7 1Z(T){g s=k.47,o=1i,h=s,w=s,t=o,l=o;1z(T){D\'n\':D\'s\':w=1p(U);P;D\'e\':D\'w\':h=1p(U);P}j 2U(T,2O++).X(w).Y(h).B({S:E(-t+1),Q:E(-l+1)})};7 2Q(2I){5k(i 1d 2I)I[2I[i]]=4q(2I[i])};7 34(c){g 3d=K.1K((c.h/2)-1i),3e=K.1K((c.w/2)-1i),5d=5f=-1i+1,29=c.w-1i,28=c.h-1i,x,y;\'e\'1d I&&I.e.B({S:E(3d),Q:E(29)})&&I.w.B({S:E(3d)})&&I.s.B({S:E(28),Q:E(3e)})&&I.n.B({Q:E(3e)});\'1w\'1d I&&I.1w.B({Q:E(29)})&&I.1U.B({S:E(28),Q:E(29)})&&I.1F.B({S:E(28)});\'b\'1d I&&I.b.B({S:E(28)})&&I.r.B({Q:E(29)})};u.4a=7(){d(1P)j 1l()};u.1l=7 1l(){c=G.V();2w(c.w,c.h);3v(c.x,c.y);k.30&&2N[\'3A\'].B({Q:E(c.w-1)})&&2N[\'3t\'].B({S:E(c.h-1)});2u&&34(c);1P||1O();k.2D(2q(c))};7 3v(x,y){$3c.B({S:E(-y),Q:E(-x)});$2a.B({S:E(y),Q:E(x)})};7 2w(w,h){$2a.X(w).Y(h)};u.1O=7 1O(){$2a.1O();$J.B(\'1s\',k.3Q);1P=N};u.1E=7 1E(){1G();$2a.1N();$J.B(\'1s\',1);1P=M};u.1N=7 1N(){1E();$J.B(\'1s\',1);1P=M};7 3H(){g p=G.V();G.2m([p.x,p.y]);G.2d([p.q,p.m])};u.2L=7 2L(){2u=N;34(G.V());$25.1O()};u.1G=7 1G(){2u=M;$25.1N()};u.2s=7 2s(v){(3l=v)?1G():2L()};u.5c=7(){j 32};u.1t=7(){g c=G.V();32=[c.x,c.y,c.q,c.m];2s(M);3H()};1G();$2r.1J($(\'<15 />\').1g(1Q(\'3u\')).36(3b(\'1I\')).B({2R:\'1I\',18:\'1c\',1k:5h,1s:0}));j u}(W);g 1j=7($){g 22=k.3F,$1H=$(\'<15 />\').1g(1Q(\'3u\')).X(R+(22*2)).Y(O+(22*2)).B({18:\'1c\',S:E(-22),Q:E(-22),1k:4i,1s:0}).36(3L),2C=7(){},2B=7(){},2F=k.2x;d(!2F){$1H.2Z(2E).3a(23).5l(23)}7 4e(){d(2F){$(3y).2Z(2E).3a(23)}$1H.B({1k:5j})}7 4g(){d(2F){$(3y).3R(\'2Z\',2E).3R(\'3a\',23)}$1H.B({1k:4i})}7 2E(e){2C(2o(e))};7 23(e){e.2n();e.2p();d(1r){1r=M;2B(2o(e));k.2v(2q(G.V()));4g();2C=7(){};2B=7(){}}j M};u.2M=7(1I,1t){1r=N;2C=1I;2B=1t;4e();j M};u.2i=7(t){$1H.B(\'2R\',t)};$J.5a($1H);j u}(W);g 3h=7($){g $2b=$(\'<4Y 1x="4Z" />\').B({18:\'1c\',Q:\'-50\'}).4X(48).4W(24).4T(3X),$4j=$(\'<15 />\').B({18:\'1c\',42:\'3Z\'}).1J($2b);u.3p=7(){d(k.1T){$2b.1O();$2b.4U()}};7 3X(e){$2b.1N()};7 24(e){d(!k.24)j;g 49=1v,1y;1v=e.51?N:M;d(49!=1v){d(1v&&1r){1y=G.V();1u=1y.w/1y.h}1h 1u=0;L.1l()}e.2p();e.2n();j M};7 2c(e,x,y){G.3j([x,y]);L.4a();e.2n();e.2p()};7 48(e){d(e.52)j N;24(e);g 21=1v?10:1;1z(e.59){D 37:2c(e,-21,0);P;D 39:2c(e,21,0);P;D 38:2c(e,0,-21);P;D 40:2c(e,0,21);P;D 27:L.1E();P;D 9:j N}j M};d(k.1T)$4j.4l($J);j u}(W);7 E(n){j\'\'+1o(n)+\'E\'};7 1p(n){j\'\'+1o(n)+\'%\'};7 1Q(3U){j k.4f+\'-\'+3U};7 2t(F){g x=F.3z||0;g y=F.3B||0;56(F=F.53){x+=F.3z;y+=F.3B}j[K.3n(x),K.3n(y)]};7 2o(e){j[(e.54-1W[0]),(e.55-1W[1])]};7 3P(1x){d(1x!=3k){1j.2i(1x);3k=1x}};7 3q(1b,C){1W=2t(F);1j.2i(1b==\'1I\'?1b:1b+\'-2w\');d(1b==\'1I\')j 1j.2M(4p(C),2K);g 1y=L.V();G.2m(G.3J(3S(1b)));1j.2M(3N(1b,1y),2K)};7 3L(e){1r=N;1W=2t(F);d(1v)1u=1;L.1E();L.1G();3P(\'3f\');G.2m(2o(e));1j.2M(3w,2K);3h.3p();e.2p();e.2n();j M};7 3w(C){G.2d(C);L.1l()};7 2K(C){c=G.V();d(c.w>k.3m[0]&&c.h>k.3m[1]){L.2L();L.1t()}1h{L.1E()}1j.2i(\'3f\')};7 3N(1b,f){j 7(C){d(!k.26&&!1u)1z(1b){D\'e\':C[1]=f.m;P;D\'w\':C[1]=f.m;P;D\'n\':C[0]=f.q;P;D\'s\':C[0]=f.q;P}1h 1z(1b){D\'e\':C[1]=f.y+1;P;D\'w\':C[1]=f.y+1;P;D\'n\':C[0]=f.x+1;P;D\'s\':C[0]=f.x+1;P}G.2d(C);L.1l()}};7 4p(C){g 2H=C;3h.3p();j 7(C){G.3j([C[0]-2H[0],C[1]-2H[1]]);2H=C;L.1l()}};7 3S(T){1z(T){D\'n\':j\'1F\';D\'s\':j\'13\';D\'e\':j\'13\';D\'w\':j\'1w\';D\'1w\':j\'1F\';D\'13\':j\'1U\';D\'1U\':j\'13\';D\'1F\':j\'1w\'}};7 3b(T){j 7(e){1r=N;3q(T,2o(e));e.2p();e.2n();j M}};7 3M($F,w,h){g 13=$F.X(),1D=$F.Y();d((13>w)&&w>0){13=w;1D=(w/$F.X())*$F.Y()}d((1D>h)&&h>0){1D=h;13=(h/$F.Y())*$F.X()}1A=$F.X()/13;1B=$F.Y()/1D;$F.X(13).Y(1D)};7 2q(c){j{x:1o(c.x*1A),y:1o(c.y*1B),q:1o(c.q*1A),m:1o(c.m*1B),w:1o(c.w*1A),h:1o(c.h*1B)}};u.2A=2A;7 2A(a){g A=a[0],z=a[1],q=a[2],m=a[3];d(3l)j;g 2l=G.1C(A,z,q,m);g c=G.V();g 1e=2f=[c.x,c.y,c.q,c.m];g 3Y=k.3T;g x=1e[0];g y=1e[1];g q=1e[2];g m=1e[3];g 3x=2l[0]-2f[0];g 4k=2l[1]-2f[1];g 4n=2l[2]-2f[2];g 4c=2l[3]-2f[3];g 1a=0;g 3G=k.3K;L.2s(N);g 3V=7(){j 7(){1a+=(U-1a)/3G;1e[0]=x+((1a/U)*3x);1e[1]=y+((1a/U)*4k);1e[2]=q+((1a/U)*4n);1e[3]=m+((1a/U)*4c);d(1a<U)2V();1h L.1t();d(1a>=57.8)1a=U;1f(1e)}}();7 2V(){58.5b(3V,3Y)};2V()};u.1f=1f;7 1f(l){G.2m([l[0],l[1]]);G.2d([l[2],l[3]]);L.1l()};7 1M(H){d(1q(H)!=\'2e\')H={};k=W.5i(k,H);d(1q(k.2D)!==\'7\')k.2D=7(){};d(1q(k.2v)!==\'7\')k.2v=7(){}};u.4S=7(){j 2q(G.V())};u.5g=7(){j G.V()};u.1M=7(H){1M(H);d(\'1f\'1d H){1f(H.1f);L.1t()}};d(1q(H)!=\'2e\')H={};d(\'1f\'1d H){1f(H.1f);L.1t()}g 2g=k.2G[0]||0;g 2h=k.2G[1]||0;g 2k=k.2J[0]||0;g 2j=k.2J[1]||0;1j.2i(\'3f\');j u};W.5e.1n=7(k){7 3W(2y){g 43=k.4V||2y.2z;g J=4r 4F();J.4y=7(){W(2y).1N().4x(J);2y.1n=W.1n(J,k)};J.2z=43;j{1M:7(){},2A:7(){}}};d(1q(k)!==\'2e\')k={};u.4C(7(){d(\'1n\'1d u){d(k==\'4E\')j u.1n;1h u.1n.1M(k)}1h u.1n=3W(u)});j u};',62,332,'|||||||function||||||if|||var|||return|options||y2||||x2||||this|||||y1|x1|css|pos|case|px|obj|Coords|opt|handle|img|Math|Selection|false|true|boundy|break|left|boundx|top|ord|100|getFixed|jQuery|width|height|delta||xx|yy|nw||div|oy|ox|position|abs|pcent|mode|absolute|in|animat|setSelect|addClass|else|hhs|Tracker|zIndex|update|aspect|Jcrop|parseInt|pct|typeof|btndown|opacity|done|aspectLock|shift_down|ne|type|fc|switch|xscale|yscale|fixCoords|nh|release|sw|disableHandles|trk|move|append|round|jq|setOptions|hide|show|awake|cssClass|xsize|insertBorder|keySupport|se|ysize|docOffset|rh|rw|insertDragbar||nudge|bound|trackUp|watchShift|hdl_holder|aspectRatio||south|east|sel|keymgr|doNudge|setCurrent|object|initcr|xlimit|ylimit|setCursor|ymin|xmin|animto|setPressed|preventDefault|mouseAbs|stopPropagation|unscale|img_holder|animMode|getPos|seehandles|onSelect|resize|trackDocument|from|src|animateTo|onDone|onMove|onChange|trackMove|trackDoc|maxSize|lloc|li|minSize|doneSelect|enableHandles|activateHandlers|borders|hdep|makeObj|createHandles|cursor|yb|xa|dragDiv|animateStart|rwa|rebound|ya|mousemove|drawBorders|browser|lastsel|rha|moveHandles|msie|mousedown||||mouseup|createDragger|img2|midvert|midhoriz|crosshair|xb|KeyManager|trueSize|moveOffset|lc|animating|minSelect|min|offset|watchKeys|startDragMode|real_ratio|boxWidth|bottom|tracker|moveto|selectDrag|ix1|document|offsetLeft|right|offsetTop|defaults|vline|hline|boundary|velocity|refresh|attr|getCorner|swingSpeed|newSelection|presize|dragmodeHandler|boxHeight|myCursor|bgOpacity|unbind|oppLockCorner|animationDelay|cl|animator|attachWhenDone|onBlur|interv|hidden||zi|overflow|loadsrc|cornerHandles|handleOpacity|borderOpacity|handleSize|parseKey|init_shift|updateVisible|bgColor|iy2|dragEdges|toFront|baseClass|toBack|handleOffset|290|keywrap|iy1|insertBefore|getRect|ix2|sideHandles|createMover|insertHandle|new|edgeMargin|300|backgroundColor|getOffset|handlePad|after|onload|null|last|max|each|black|api|Image|dimmed|jcrop|370|holder|310|dragmode|relative|getActual|wrap|start|end|320|tellSelect|blur|focus|useImg|keyup|keydown|input|radio|30px|shiftKey|ctrlKey|offsetParent|pageX|pageY|while|99|window|keyCode|before|setTimeout|getLastSel|north|fn|west|tellScaled|360|extend|450|for|mouseout'.split('|'),0,{}))

/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008
 * @author Ariel Flesler
 * @version 1.4
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(h){var m=h.scrollTo=function(b,c,g){h(window).scrollTo(b,c,g)};m.defaults={axis:'y',duration:1};m.window=function(b){return h(window).scrollable()};h.fn.scrollable=function(){return this.map(function(){var b=this.parentWindow||this.defaultView,c=this.nodeName=='#document'?b.frameElement||b:this,g=c.contentDocument||(c.contentWindow||c).document,i=c.setInterval;return c.nodeName=='IFRAME'||i&&h.browser.safari?g.body:i?g.documentElement:this})};h.fn.scrollTo=function(r,j,a){if(typeof j=='object'){a=j;j=0}if(typeof a=='function')a={onAfter:a};a=h.extend({},m.defaults,a);j=j||a.speed||a.duration;a.queue=a.queue&&a.axis.length>1;if(a.queue)j/=2;a.offset=n(a.offset);a.over=n(a.over);return this.scrollable().each(function(){var k=this,o=h(k),d=r,l,e={},p=o.is('html,body');switch(typeof d){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(d)){d=n(d);break}d=h(d,this);case'object':if(d.is||d.style)l=(d=h(d)).offset()}h.each(a.axis.split(''),function(b,c){var g=c=='x'?'Left':'Top',i=g.toLowerCase(),f='scroll'+g,s=k[f],t=c=='x'?'Width':'Height',v=t.toLowerCase();if(l){e[f]=l[i]+(p?0:s-o.offset()[i]);if(a.margin){e[f]-=parseInt(d.css('margin'+g))||0;e[f]-=parseInt(d.css('border'+g+'Width'))||0}e[f]+=a.offset[i]||0;if(a.over[i])e[f]+=d[v]()*a.over[i]}else e[f]=d[i];if(/^\d+$/.test(e[f]))e[f]=e[f]<=0?0:Math.min(e[f],u(t));if(!b&&a.queue){if(s!=e[f])q(a.onAfterFirst);delete e[f]}});q(a.onAfter);function q(b){o.animate(e,j,a.easing,b&&function(){b.call(this,r,a)})};function u(b){var c='scroll'+b,g=k.ownerDocument;return p?Math.max(g.documentElement[c],g.body[c]):k[c]}}).end()};function n(b){return typeof b=='object'?b:{top:b,left:b}}})(jQuery);

/*
  @author: remy sharp / http://remysharp.com
  @url: http://remysharp.com/2007/12/28/jquery-tag-suggestion/
  @usage: setGlobalTags(['javascript', 'jquery', 'java', 'json']); // applied tags to be used for all implementations
          $('input.tags').tagSuggest(options);
          
          The selector is the element that the user enters their tag list
  @params:
    matchClass - class applied to the suggestions, defaults to 'tagMatches'
    tagContainer - the type of element uses to contain the suggestions, defaults to 'span'
    tagWrap - the type of element the suggestions a wrapped in, defaults to 'span'
    sort - boolean to force the sorted order of suggestions, defaults to false
    url - optional url to get suggestions if setGlobalTags isn't used.  Must return array of suggested tags
    tags - optional array of tags specific to this instance of element matches
    delay - optional sets the delay between keyup and the request - can help throttle ajax requests, defaults to zero delay
    separator - optional separator string, defaults to ' ' (Brian J. Cardiff)
  @license: Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/
  @version: 1.4
  @changes: fixed filtering to ajax hits
*/

(function ($) {
    var globalTags = [];

    // creates a public function within our private code.
    // tags can either be an array of strings OR
    // array of objects containing a 'tag' attribute
    window.setGlobalTags = function(tags /* array */) {
        globalTags = getTags(tags);
    };
    
    function getTags(tags) {
        var tag, i, goodTags = [];
        for (i = 0; i < tags.length; i++) {
            tag = tags[i];
            if (typeof tags[i] == 'object') {
                tag = tags[i].tag;
            } 
            goodTags.push(tag.toLowerCase());
        }
        
        return goodTags;
    }
    
    $.fn.tagSuggest = function (options) {
        var defaults = { 
            'matchClass' : 'tagMatches', 
            'tagContainer' : 'span', 
            'tagWrap' : 'span', 
            'sort' : true,
            'tags' : null,
            'url' : null,
            'delay' : 0,
            'separator' : ' '
        };

        var i, tag, userTags = [], settings = $.extend({}, defaults, options);

        if (settings.tags) {
            userTags = getTags(settings.tags);
        } else {
            userTags = globalTags;
        }

        return this.each(function () {
            var tagsElm = $(this);
            var elm = this;
            var matches, fromTab = false;
            var suggestionsShow = false;
            var workingTags = [];
            var currentTag = {"position": 0, tag: ""};
            var tagMatches = document.createElement(settings.tagContainer);
            
            function showSuggestionsDelayed(el, key) {
                if (settings.delay) {
                    if (elm.timer) clearTimeout(elm.timer);
                    elm.timer = setTimeout(function () {
                        showSuggestions(el, key);
                    }, settings.delay);
                } else {
                    showSuggestions(el, key);
                }
            }

            function showSuggestions(el, key) {
                workingTags = el.value.split(settings.separator);
                matches = [];
                var i, html = '', chosenTags = {}, tagSelected = false;

                // we're looking to complete the tag on currentTag.position (to start with)
                currentTag = { position: currentTags.length-1, tag: '' };
                
                for (i = 0; i < currentTags.length && i < workingTags.length; i++) {
                    if (!tagSelected && 
                        currentTags[i].toLowerCase() != workingTags[i].toLowerCase()) {
                        currentTag = { position: i, tag: workingTags[i].toLowerCase() };
                        tagSelected = true;
                    }
                    // lookup for filtering out chosen tags
                    chosenTags[currentTags[i].toLowerCase()] = true;
                }

                if (currentTag.tag) {
                    // collect potential tags
                    if (settings.url) {
                        $.ajax({
                            'url' : settings.url,
                            'dataType' : 'json',
                            'data' : { 'tag' : currentTag.tag },
                            'async' : false, // wait until this is ajax hit is complete before continue
                            'success' : function (m) {
                                matches = m;
                            }
                        });
                    } else {
                        for (i = 0; i < userTags.length; i++) {
                            if (userTags[i].indexOf(currentTag.tag) === 0) {
                                matches.push(userTags[i]);
                            }
                        }                        
                    }
                    
                    matches = $.grep(matches, function (v, i) {
                        return !chosenTags[v.toLowerCase()];
                    });

                    if (settings.sort) {
                        matches = matches.sort();
                    }
                    
                    matchesCount = matches.length;
                    
                    if(settings.limit) {
                        if(matches.length > settings.limit) {
                            matchesCount = settings.limit;
                        }
                    }

                    for (i = 0; i < matchesCount; i++) {
                        html += '<' + settings.tagWrap + ' class="_tag_suggestion">' + matches[i] + '</' + settings.tagWrap + '>';
                    }

                    tagMatches.html(html);
                    suggestionsShow = !!(matches.length);
                } else {
                    hideSuggestions();
                }
            }

            function hideSuggestions() {
                tagMatches.empty();
                matches = [];
                suggestionsShow = false;
            }

            function setSelection() {
                var v = tagsElm.val();

                // tweak for hintted elements
                // http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/
                if (v == tagsElm.attr('title') && tagsElm.is('.hint')) v = '';

                currentTags = v.split(settings.separator);
                hideSuggestions();
            }

            function chooseTag(tag) {
                var i, index;
                for (i = 0; i < currentTags.length; i++) {
                    if (currentTags[i].toLowerCase() != workingTags[i].toLowerCase()) {
                        index = i;
                        break;
                    }
                }

                if (index == workingTags.length - 1) tag = tag + settings.separator;

                workingTags[i] = tag;

                tagsElm.val(workingTags.join(settings.separator));
                tagsElm.blur().focus();
                setSelection();
            }

            function handleKeys(ev) {
                fromTab = false;
                var type = ev.type;
                var resetSelection = false;
                
                switch (ev.keyCode) {
                    case 37: // ignore cases (arrow keys)
                    case 38:
                    case 39:
                    case 40: {
                        hideSuggestions();
                        return true;
                    }
                    case 224:
                    case 17:
                    case 16:
                    case 18: {
                        return true;
                    }

                    case 8: {
                        // delete - hide selections if we're empty
                        if (this.value == '') {
                            hideSuggestions();
                            setSelection();
                            return true;
                        } else {
                            type = 'keyup'; // allow drop through
                            resetSelection = true;
                            showSuggestionsDelayed(this);
                        }
                        break;
                    }

                    case 9: // return and tab
                    case 13: {
                        if (suggestionsShow) {
                            // complete
                            chooseTag(matches[0]);
                            
                            fromTab = true;
                            return false;
                        } else {
                            return true;
                        }
                    }
                    case 27: {
                        hideSuggestions();
                        setSelection();
                        return true;
                    }
                    case 32: {
                        setSelection();
                        return true;
                    }
                }

                if (type == 'keyup') {
                    switch (ev.charCode) {
                        case 9:
                        case 13: {
                            return true;
                        }
                    }

                    if (resetSelection) { 
                        setSelection();
                    }
                    showSuggestionsDelayed(this, ev.charCode);            
                }
            }

            tagsElm.after(tagMatches).keypress(handleKeys).keyup(handleKeys).blur(function () {
                if (fromTab == true || suggestionsShow) { // tweak to support tab selection for Opera & IE
                    fromTab = false;
                    tagsElm.focus();
                }
            });

            // replace with jQuery version
            tagMatches = $(tagMatches).click(function (ev) {
                if (ev.target.nodeName == settings.tagWrap.toUpperCase() && $(ev.target).is('._tag_suggestion')) {
                    chooseTag(ev.target.innerHTML);
                }                
            }).addClass(settings.matchClass);

            // initialise
            setSelection();
        });
    };
})(jQuery);

if (!window.jQuery) throw("jQuery must be referenced before using the 'onImagesLoad' plugin.");
/* 
* jQuery 'onImagesLoaded' plugin 1.0.2
* Fires a callback function when all images have loaded within a particular selector.
*
* Copyright (c) Cirkuit Networks, Inc. (http://www.cirkuit.net), 2008.
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* For documentation and usage, visit "http://includes.cirkuit.net/js/jquery/plugins/onImagesLoad/1.0/documentation/"
*/
(function($) {
  $.fn.onImagesLoad = function(options) {
    var opts = $.extend({}, $.fn.onImagesLoad.defaults, options);
    
    return this.each(function() {
      imgs = $('img', this);
      if(imgs.length==0 && opts.callbackIfNoImagesExist && opts.callback) opts.callback(this); //call callback immediately if no images were in selection
      $(imgs).bind('load', {totalImgCnt:imgs.length, loadedImgCnt:0, container:this}, function(event){
        if (++event.data.loadedImgCnt == event.data.totalImgCnt){
          if(opts.callback) opts.callback(event.data.container);
        }
      }).each(function() {
        if(this.complete){ //needed for cached images
          this.src = this.src;
        }
      });
    });

  };

  $.fn.onImagesLoad.defaults = {
    callback: null, //the function you want called when all images within $(yourSelector) have loaded
    callbackIfNoImagesExist: true //if no images exist within $(yourSelector), should the callback be called?
  };

})(jQuery);

/* =========================================================

// jquery.innerfade.js

// Datum: 2008-02-14
// Firma: Medienfreunde Hofmann & Baldes GbR
// Author: Torsten Baldes
// Mail: t.baldes@medienfreunde.com
// Web: http://medienfreunde.com

// based on the work of Matt Oakes http://portfolio.gizone.co.uk/applications/slideshow/
// and Ralf S. Engelschall http://trainofthoughts.org/

 *
 *  <ul id="news"> 
 *      <li>content 1</li>
 *      <li>content 2</li>
 *      <li>content 3</li>
 *  </ul>
 *  
 *  $('#news').innerfade({ 
 *	  animationtype: Type of animation 'fade' or 'slide' (Default: 'fade'), 
 *	  speed: Fading-/Sliding-Speed in milliseconds or keywords (slow, normal or fast) (Default: 'normal'), 
 *	  timeout: Time between the fades in milliseconds (Default: '2000'), 
 *	  type: Type of slideshow: 'sequence', 'random' or 'random_start' (Default: 'sequence'), 
 * 		containerheight: Height of the containing element in any css-height-value (Default: 'auto'),
 *	  runningclass: CSS-Class which the container get’s applied (Default: 'innerfade'),
 *	  children: optional children selector (Default: null)
 *  }); 
 *

// ========================================================= */


(function($) {

    $.fn.innerfade = function(options) {
        return this.each(function() {   
            $.innerfade(this, options);
        });
    };

    $.innerfade = function(container, options) {
        var settings = {
        		'animationtype':    'fade',
            'speed':            'normal',
            'type':             'sequence',
            'timeout':          2000,
            'containerheight':  'auto',
            'runningclass':     'innerfade',
            'children':         null
        };
        if (options)
            $.extend(settings, options);
        if (settings.children === null)
            var elements = $(container).children();
        else
            var elements = $(container).children(settings.children);
        if (elements.length > 1) {
            $(container).css('position', 'relative').css('height', settings.containerheight).addClass(settings.runningclass);
            for (var i = 0; i < elements.length; i++) {
                $(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute').hide();
            };
            if (settings.type == "sequence") {
                setTimeout(function() {
                    $.innerfade.next(elements, settings, 1, 0);
                }, settings.timeout);
                $(elements[0]).show();
            } else if (settings.type == "random") {
            		var last = Math.floor ( Math.random () * ( elements.length ) );
                setTimeout(function() {
                    do { 
												current = Math.floor ( Math.random ( ) * ( elements.length ) );
										} while (last == current );             
										$.innerfade.next(elements, settings, current, last);
                }, settings.timeout);
                $(elements[last]).show();
						} else if ( settings.type == 'random_start' ) {
								settings.type = 'sequence';
								var current = Math.floor ( Math.random () * ( elements.length ) );
								setTimeout(function(){
									$.innerfade.next(elements, settings, (current + 1) %  elements.length, current);
								}, settings.timeout);
								$(elements[current]).show();
						}	else {
							alert('Innerfade-Type must either be \'sequence\', \'random\' or \'random_start\'');
						}
				}
    };

    $.innerfade.next = function(elements, settings, current, last) {
        if (settings.animationtype == 'slide') {
            $(elements[last]).slideUp(settings.speed);
            $(elements[current]).slideDown(settings.speed);
        } else if (settings.animationtype == 'fade') {
            $(elements[last]).fadeOut(settings.speed);
            $(elements[current]).fadeIn(settings.speed, function() {
							removeFilter($(this)[0]);
						});
        } else
            alert('Innerfade-animationtype must either be \'slide\' or \'fade\'');
        if (settings.type == "sequence") {
            if ((current + 1) < elements.length) {
                current = current + 1;
                last = current - 1;
            } else {
                current = 0;
                last = elements.length - 1;
            }
        } else if (settings.type == "random") {
            last = current;
            while (current == last)
                current = Math.floor(Math.random() * elements.length);
        } else
            alert('Innerfade-Type must either be \'sequence\', \'random\' or \'random_start\'');
        setTimeout((function() {
            $.innerfade.next(elements, settings, current, last);
        }), settings.timeout);
    };

})(jQuery);

// **** remove Opacity-Filter in ie ****
function removeFilter(element) {
	if(element.style.removeAttribute){
		element.style.removeAttribute('filter');
	}
}

// $Id: farbtastic.js,v 1.2 2007/01/08 22:53:01 unconed Exp $
// Farbtastic 1.2

jQuery.fn.farbtastic = function (callback) {
  $.farbtastic(this, callback);
  return this;
};

jQuery.farbtastic = function (container, callback) {
  var container = $(container).get(0);
  return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
}

jQuery._farbtastic = function (container, callback) {
  // Store farbtastic object
  var fb = this;

  // Insert markup
  $(container).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
  var e = $('.farbtastic', container);
  fb.wheel = $('.wheel', container).get(0);
  // Dimensions
  fb.radius = 84;
  fb.square = 100;
  fb.width = 194;

  // Fix background PNGs in IE6
  if (navigator.appVersion.match(/MSIE [0-6]\./)) {
    $('*', e).each(function () {
      if (this.currentStyle.backgroundImage != 'none') {
        var image = this.currentStyle.backgroundImage;
        image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
        $(this).css({
          'backgroundImage': 'none',
          'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
        });
      }
    });
  }

  /**
   * Link to the given element(s) or callback.
   */
  fb.linkTo = function (callback) {
    // Unbind previous nodes
    if (typeof fb.callback == 'object') {
      $(fb.callback).unbind('keyup', fb.updateValue);
    }

    // Reset color
    fb.color = null;

    // Bind callback or elements
    if (typeof callback == 'function') {
      fb.callback = callback;
    }
    else if (typeof callback == 'object' || typeof callback == 'string') {
      fb.callback = $(callback);
      fb.callback.bind('keyup', fb.updateValue);
      if (fb.callback.get(0).value) {
        fb.setColor(fb.callback.get(0).value);
      }
    }
    return this;
  }
  fb.updateValue = function (event) {
    if (this.value && this.value != fb.color) {
      fb.setColor(this.value);
    }
  }

  /**
   * Change color with HTML syntax #123456
   */
  fb.setColor = function (color) {
    var unpack = fb.unpack(color);
    if (fb.color != color && unpack) {
      fb.color = color;
      fb.rgb = unpack;
      fb.hsl = fb.RGBToHSL(fb.rgb);
      fb.updateDisplay();
    }
    return this;
  }

  /**
   * Change color with HSL triplet [0..1, 0..1, 0..1]
   */
  fb.setHSL = function (hsl) {
    fb.hsl = hsl;
    fb.rgb = fb.HSLToRGB(hsl);
    fb.color = fb.pack(fb.rgb);
    fb.updateDisplay();
    return this;
  }

  /////////////////////////////////////////////////////

  /**
   * Retrieve the coordinates of the given event relative to the center
   * of the widget.
   */
  fb.widgetCoords = function (event) {
    var x, y;
    var el = event.target || event.srcElement;
    var reference = fb.wheel;

    if (typeof event.offsetX != 'undefined') {
      // Use offset coordinates and find common offsetParent
      var pos = { x: event.offsetX, y: event.offsetY };

      // Send the coordinates upwards through the offsetParent chain.
      var e = el;
      while (e) {
        e.mouseX = pos.x;
        e.mouseY = pos.y;
        pos.x += e.offsetLeft;
        pos.y += e.offsetTop;
        e = e.offsetParent;
      }

      // Look for the coordinates starting from the wheel widget.
      var e = reference;
      var offset = { x: 0, y: 0 }
      while (e) {
        if (typeof e.mouseX != 'undefined') {
          x = e.mouseX - offset.x;
          y = e.mouseY - offset.y;
          break;
        }
        offset.x += e.offsetLeft;
        offset.y += e.offsetTop;
        e = e.offsetParent;
      }

      // Reset stored coordinates
      e = el;
      while (e) {
        e.mouseX = undefined;
        e.mouseY = undefined;
        e = e.offsetParent;
      }
    }
    else {
      // Use absolute coordinates
      var pos = fb.absolutePosition(reference);
      x = (event.pageX || 0*(event.clientX + $('html').get(0).scrollLeft)) - pos.x;
      y = (event.pageY || 0*(event.clientY + $('html').get(0).scrollTop)) - pos.y;
    }
    // Subtract distance to middle
    return { x: x - fb.width / 2, y: y - fb.width / 2 };
  }

  /**
   * Mousedown handler
   */
  fb.mousedown = function (event) {
    // Capture mouse
    if (!document.dragging) {
      $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
      document.dragging = true;
    }

    // Check which area is being dragged
    var pos = fb.widgetCoords(event);
    fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;

    // Process
    fb.mousemove(event);
    return false;
  }

  /**
   * Mousemove handler
   */
  fb.mousemove = function (event) {
    // Get coordinates relative to color picker center
    var pos = fb.widgetCoords(event);

    // Set new HSL parameters
    if (fb.circleDrag) {
      var hue = Math.atan2(pos.x, -pos.y) / 6.28;
      if (hue < 0) hue += 1;
      fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
    }
    else {
      var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
      var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
      fb.setHSL([fb.hsl[0], sat, lum]);
    }
    return false;
  }

  /**
   * Mouseup handler
   */
  fb.mouseup = function () {
    // Uncapture mouse
    $(document).unbind('mousemove', fb.mousemove);
    $(document).unbind('mouseup', fb.mouseup);
    document.dragging = false;
  }

  /**
   * Update the markers and styles
   */
  fb.updateDisplay = function () {
    // Markers
    var angle = fb.hsl[0] * 6.28;
    $('.h-marker', e).css({
      left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
      top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
    });

    $('.sl-marker', e).css({
      left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
      top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
    });

    // Saturation/Luminance gradient
    $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));

    // Linked elements or callback
    if (typeof fb.callback == 'object') {
      // Set background/foreground color
      $(fb.callback).css({
        backgroundColor: fb.color,
        color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
      });

      // Change linked value
      $(fb.callback).each(function() {
        if (this.value && this.value != fb.color) {
          this.value = fb.color;
        }
      });
    }
    else if (typeof fb.callback == 'function') {
      fb.callback.call(fb, fb.color);
    }
  }

  /**
   * Get absolute position of element
   */
  fb.absolutePosition = function (el) {
    var r = { x: el.offsetLeft, y: el.offsetTop };
    // Resolve relative to offsetParent
    if (el.offsetParent) {
      var tmp = fb.absolutePosition(el.offsetParent);
      r.x += tmp.x;
      r.y += tmp.y;
    }
    return r;
  };

  /* Various color utility functions */
  fb.pack = function (rgb) {
    var r = Math.round(rgb[0] * 255);
    var g = Math.round(rgb[1] * 255);
    var b = Math.round(rgb[2] * 255);
    return '#' + (r < 16 ? '0' : '') + r.toString(16) +
           (g < 16 ? '0' : '') + g.toString(16) +
           (b < 16 ? '0' : '') + b.toString(16);
  }

  fb.unpack = function (color) {
    if (color.length == 7) {
      return [parseInt('0x' + color.substring(1, 3)) / 255,
        parseInt('0x' + color.substring(3, 5)) / 255,
        parseInt('0x' + color.substring(5, 7)) / 255];
    }
    else if (color.length == 4) {
      return [parseInt('0x' + color.substring(1, 2)) / 15,
        parseInt('0x' + color.substring(2, 3)) / 15,
        parseInt('0x' + color.substring(3, 4)) / 15];
    }
  }

  fb.HSLToRGB = function (hsl) {
    var m1, m2, r, g, b;
    var h = hsl[0], s = hsl[1], l = hsl[2];
    m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
    m1 = l * 2 - m2;
    return [this.hueToRGB(m1, m2, h+0.33333),
        this.hueToRGB(m1, m2, h),
        this.hueToRGB(m1, m2, h-0.33333)];
  }

  fb.hueToRGB = function (m1, m2, h) {
    h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
    if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
    if (h * 2 < 1) return m2;
    if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
    return m1;
  }

  fb.RGBToHSL = function (rgb) {
    var min, max, delta, h, s, l;
    var r = rgb[0], g = rgb[1], b = rgb[2];
    min = Math.min(r, Math.min(g, b));
    max = Math.max(r, Math.max(g, b));
    delta = max - min;
    l = (min + max) / 2;
    s = 0;
    if (l > 0 && l < 1) {
      s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
    }
    h = 0;
    if (delta > 0) {
      if (max == r && max != g) h += (g - b) / delta;
      if (max == g && max != b) h += (2 + (b - r) / delta);
      if (max == b && max != r) h += (4 + (r - g) / delta);
      h /= 6;
    }
    return [h, s, l];
  }

  // Install mousedown handler (the others are set on the document on-demand)
  $('*', e).mousedown(fb.mousedown);

    // Init color
  fb.setColor('#000000');

  // Set linked elements/callback
  if (callback) {
    fb.linkTo(callback);
  }
}