// $Id: jquery.js,v 1.12.2.3 2008/06/25 09:38:39 goba Exp $ 

/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008)
 * Rev: 5685
 */
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}('(H(){J w=1b.4M,3m$=1b.$;J D=1b.4M=1b.$=H(a,b){I 2B D.17.5j(a,b)};J u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/,62=/^.[^:#\\[\\.]*$/,12;D.17=D.44={5j:H(d,b){d=d||S;G(d.16){7[0]=d;7.K=1;I 7}G(1j d=="23"){J c=u.2D(d);G(c&&(c[1]||!b)){G(c[1])d=D.4h([c[1]],b);N{J a=S.61(c[3]);G(a){G(a.2v!=c[3])I D().2q(d);I D(a)}d=[]}}N I D(b).2q(d)}N G(D.1D(d))I D(S)[D.17.27?"27":"43"](d);I 7.6Y(D.2d(d))},5w:"1.2.6",8G:H(){I 7.K},K:0,3p:H(a){I a==12?D.2d(7):7[a]},2I:H(b){J a=D(b);a.5n=7;I a},6Y:H(a){7.K=0;2p.44.1p.1w(7,a);I 7},P:H(a,b){I D.P(7,a,b)},5i:H(b){J a=-1;I D.2L(b&&b.5w?b[0]:b,7)},1K:H(c,a,b){J d=c;G(c.1q==56)G(a===12)I 7[0]&&D[b||"1K"](7[0],c);N{d={};d[c]=a}I 7.P(H(i){R(c 1n d)D.1K(b?7.V:7,c,D.1i(7,d[c],b,i,c))})},1g:H(b,a){G((b==\'2h\'||b==\'1Z\')&&3d(a)<0)a=12;I 7.1K(b,a,"2a")},1r:H(b){G(1j b!="49"&&b!=U)I 7.4E().3v((7[0]&&7[0].2z||S).5F(b));J a="";D.P(b||7,H(){D.P(7.3t,H(){G(7.16!=8)a+=7.16!=1?7.76:D.17.1r([7])})});I a},5z:H(b){G(7[0])D(b,7[0].2z).5y().39(7[0]).2l(H(){J a=7;1B(a.1x)a=a.1x;I a}).3v(7);I 7},8Y:H(a){I 7.P(H(){D(7).6Q().5z(a)})},8R:H(a){I 7.P(H(){D(7).5z(a)})},3v:H(){I 7.3W(19,M,Q,H(a){G(7.16==1)7.3U(a)})},6F:H(){I 7.3W(19,M,M,H(a){G(7.16==1)7.39(a,7.1x)})},6E:H(){I 7.3W(19,Q,Q,H(a){7.1d.39(a,7)})},5q:H(){I 7.3W(19,Q,M,H(a){7.1d.39(a,7.2H)})},3l:H(){I 7.5n||D([])},2q:H(b){J c=D.2l(7,H(a){I D.2q(b,a)});I 7.2I(/[^+>] [^+>]/.11(b)||b.1h("..")>-1?D.4r(c):c)},5y:H(e){J f=7.2l(H(){G(D.14.1f&&!D.4n(7)){J a=7.6o(M),5h=S.3h("1v");5h.3U(a);I D.4h([5h.4H])[0]}N I 7.6o(M)});J d=f.2q("*").5c().P(H(){G(7[E]!=12)7[E]=U});G(e===M)7.2q("*").5c().P(H(i){G(7.16==3)I;J c=D.L(7,"3w");R(J a 1n c)R(J b 1n c[a])D.W.1e(d[i],a,c[a][b],c[a][b].L)});I f},1E:H(b){I 7.2I(D.1D(b)&&D.3C(7,H(a,i){I b.1k(a,i)})||D.3g(b,7))},4Y:H(b){G(b.1q==56)G(62.11(b))I 7.2I(D.3g(b,7,M));N b=D.3g(b,7);J a=b.K&&b[b.K-1]!==12&&!b.16;I 7.1E(H(){I a?D.2L(7,b)<0:7!=b})},1e:H(a){I 7.2I(D.4r(D.2R(7.3p(),1j a==\'23\'?D(a):D.2d(a))))},3F:H(a){I!!a&&D.3g(a,7).K>0},7T:H(a){I 7.3F("."+a)},6e:H(b){G(b==12){G(7.K){J c=7[0];G(D.Y(c,"2A")){J e=c.64,63=[],15=c.15,2V=c.O=="2A-2V";G(e<0)I U;R(J i=2V?e:0,2f=2V?e+1:15.K;i<2f;i++){J d=15[i];G(d.2W){b=D.14.1f&&!d.at.2x.an?d.1r:d.2x;G(2V)I b;63.1p(b)}}I 63}N I(7[0].2x||"").1o(/\\r/g,"")}I 12}G(b.1q==4L)b+=\'\';I 7.P(H(){G(7.16!=1)I;G(b.1q==2p&&/5O|5L/.11(7.O))7.4J=(D.2L(7.2x,b)>=0||D.2L(7.34,b)>=0);N G(D.Y(7,"2A")){J a=D.2d(b);D("9R",7).P(H(){7.2W=(D.2L(7.2x,a)>=0||D.2L(7.1r,a)>=0)});G(!a.K)7.64=-1}N 7.2x=b})},2K:H(a){I a==12?(7[0]?7[0].4H:U):7.4E().3v(a)},7b:H(a){I 7.5q(a).21()},79:H(i){I 7.3s(i,i+1)},3s:H(){I 7.2I(2p.44.3s.1w(7,19))},2l:H(b){I 7.2I(D.2l(7,H(a,i){I b.1k(a,i,a)}))},5c:H(){I 7.1e(7.5n)},L:H(d,b){J a=d.1R(".");a[1]=a[1]?"."+a[1]:"";G(b===12){J c=7.5C("9z"+a[1]+"!",[a[0]]);G(c===12&&7.K)c=D.L(7[0],d);I c===12&&a[1]?7.L(a[0]):c}N I 7.1P("9u"+a[1]+"!",[a[0],b]).P(H(){D.L(7,d,b)})},3b:H(a){I 7.P(H(){D.3b(7,a)})},3W:H(g,f,h,d){J e=7.K>1,3x;I 7.P(H(){G(!3x){3x=D.4h(g,7.2z);G(h)3x.9o()}J b=7;G(f&&D.Y(7,"1T")&&D.Y(3x[0],"4F"))b=7.3H("22")[0]||7.3U(7.2z.3h("22"));J c=D([]);D.P(3x,H(){J a=e?D(7).5y(M)[0]:7;G(D.Y(a,"1m"))c=c.1e(a);N{G(a.16==1)c=c.1e(D("1m",a).21());d.1k(b,a)}});c.P(6T)})}};D.17.5j.44=D.17;H 6T(i,a){G(a.4d)D.3Y({1a:a.4d,31:Q,1O:"1m"});N D.5u(a.1r||a.6O||a.4H||"");G(a.1d)a.1d.37(a)}H 1z(){I+2B 8J}D.1l=D.17.1l=H(){J b=19[0]||{},i=1,K=19.K,4x=Q,15;G(b.1q==8I){4x=b;b=19[1]||{};i=2}G(1j b!="49"&&1j b!="H")b={};G(K==i){b=7;--i}R(;i<K;i++)G((15=19[i])!=U)R(J c 1n 15){J a=b[c],2w=15[c];G(b===2w)6M;G(4x&&2w&&1j 2w=="49"&&!2w.16)b[c]=D.1l(4x,a||(2w.K!=U?[]:{}),2w);N G(2w!==12)b[c]=2w}I b};J E="4M"+1z(),6K=0,5r={},6G=/z-?5i|8B-?8A|1y|6B|8v-?1Z/i,3P=S.3P||{};D.1l({8u:H(a){1b.$=3m$;G(a)1b.4M=w;I D},1D:H(a){I!!a&&1j a!="23"&&!a.Y&&a.1q!=2p&&/^[\\s[]?H/.11(a+"")},4n:H(a){I a.1C&&!a.1c||a.2j&&a.2z&&!a.2z.1c},5u:H(a){a=D.3k(a);G(a){J b=S.3H("6w")[0]||S.1C,1m=S.3h("1m");1m.O="1r/4t";G(D.14.1f)1m.1r=a;N 1m.3U(S.5F(a));b.39(1m,b.1x);b.37(1m)}},Y:H(b,a){I b.Y&&b.Y.2r()==a.2r()},1Y:{},L:H(c,d,b){c=c==1b?5r:c;J a=c[E];G(!a)a=c[E]=++6K;G(d&&!D.1Y[a])D.1Y[a]={};G(b!==12)D.1Y[a][d]=b;I d?D.1Y[a][d]:a},3b:H(c,b){c=c==1b?5r:c;J a=c[E];G(b){G(D.1Y[a]){2U D.1Y[a][b];b="";R(b 1n D.1Y[a])1X;G(!b)D.3b(c)}}N{1U{2U c[E]}1V(e){G(c.5l)c.5l(E)}2U D.1Y[a]}},P:H(d,a,c){J e,i=0,K=d.K;G(c){G(K==12){R(e 1n d)G(a.1w(d[e],c)===Q)1X}N R(;i<K;)G(a.1w(d[i++],c)===Q)1X}N{G(K==12){R(e 1n d)G(a.1k(d[e],e,d[e])===Q)1X}N R(J b=d[0];i<K&&a.1k(b,i,b)!==Q;b=d[++i]){}}I d},1i:H(b,a,c,i,d){G(D.1D(a))a=a.1k(b,i);I a&&a.1q==4L&&c=="2a"&&!6G.11(d)?a+"2X":a},1F:{1e:H(c,b){D.P((b||"").1R(/\\s+/),H(i,a){G(c.16==1&&!D.1F.3T(c.1F,a))c.1F+=(c.1F?" ":"")+a})},21:H(c,b){G(c.16==1)c.1F=b!=12?D.3C(c.1F.1R(/\\s+/),H(a){I!D.1F.3T(b,a)}).6s(" "):""},3T:H(b,a){I D.2L(a,(b.1F||b).6r().1R(/\\s+/))>-1}},6q:H(b,c,a){J e={};R(J d 1n c){e[d]=b.V[d];b.V[d]=c[d]}a.1k(b);R(J d 1n c)b.V[d]=e[d]},1g:H(d,e,c){G(e=="2h"||e=="1Z"){J b,3X={30:"5x",5g:"1G",18:"3I"},35=e=="2h"?["5e","6k"]:["5G","6i"];H 5b(){b=e=="2h"?d.8f:d.8c;J a=0,2C=0;D.P(35,H(){a+=3d(D.2a(d,"57"+7,M))||0;2C+=3d(D.2a(d,"2C"+7+"4b",M))||0});b-=29.83(a+2C)}G(D(d).3F(":4j"))5b();N D.6q(d,3X,5b);I 29.2f(0,b)}I D.2a(d,e,c)},2a:H(f,l,k){J e,V=f.V;H 3E(b){G(!D.14.2k)I Q;J a=3P.54(b,U);I!a||a.52("3E")==""}G(l=="1y"&&D.14.1f){e=D.1K(V,"1y");I e==""?"1":e}G(D.14.2G&&l=="18"){J d=V.50;V.50="0 7Y 7W";V.50=d}G(l.1I(/4i/i))l=y;G(!k&&V&&V[l])e=V[l];N G(3P.54){G(l.1I(/4i/i))l="4i";l=l.1o(/([A-Z])/g,"-$1").3y();J c=3P.54(f,U);G(c&&!3E(f))e=c.52(l);N{J g=[],2E=[],a=f,i=0;R(;a&&3E(a);a=a.1d)2E.6h(a);R(;i<2E.K;i++)G(3E(2E[i])){g[i]=2E[i].V.18;2E[i].V.18="3I"}e=l=="18"&&g[2E.K-1]!=U?"2F":(c&&c.52(l))||"";R(i=0;i<g.K;i++)G(g[i]!=U)2E[i].V.18=g[i]}G(l=="1y"&&e=="")e="1"}N G(f.4g){J h=l.1o(/\\-(\\w)/g,H(a,b){I b.2r()});e=f.4g[l]||f.4g[h];G(!/^\\d+(2X)?$/i.11(e)&&/^\\d/.11(e)){J j=V.1A,66=f.65.1A;f.65.1A=f.4g.1A;V.1A=e||0;e=V.aM+"2X";V.1A=j;f.65.1A=66}}I e},4h:H(l,h){J k=[];h=h||S;G(1j h.3h==\'12\')h=h.2z||h[0]&&h[0].2z||S;D.P(l,H(i,d){G(!d)I;G(d.1q==4L)d+=\'\';G(1j d=="23"){d=d.1o(/(<(\\w+)[^>]*?)\\/>/g,H(b,a,c){I c.1I(/^(aK|4f|7E|aG|4T|7A|aB|3n|az|ay|av)$/i)?b:a+"></"+c+">"});J f=D.3k(d).3y(),1v=h.3h("1v");J e=!f.1h("<au")&&[1,"<2A 7w=\'7w\'>","</2A>"]||!f.1h("<ar")&&[1,"<7v>","</7v>"]||f.1I(/^<(aq|22|am|ak|ai)/)&&[1,"<1T>","</1T>"]||!f.1h("<4F")&&[2,"<1T><22>","</22></1T>"]||(!f.1h("<af")||!f.1h("<ad"))&&[3,"<1T><22><4F>","</4F></22></1T>"]||!f.1h("<7E")&&[2,"<1T><22></22><7q>","</7q></1T>"]||D.14.1f&&[1,"1v<1v>","</1v>"]||[0,"",""];1v.4H=e[1]+d+e[2];1B(e[0]--)1v=1v.5T;G(D.14.1f){J g=!f.1h("<1T")&&f.1h("<22")<0?1v.1x&&1v.1x.3t:e[1]=="<1T>"&&f.1h("<22")<0?1v.3t:[];R(J j=g.K-1;j>=0;--j)G(D.Y(g[j],"22")&&!g[j].3t.K)g[j].1d.37(g[j]);G(/^\\s/.11(d))1v.39(h.5F(d.1I(/^\\s*/)[0]),1v.1x)}d=D.2d(1v.3t)}G(d.K===0&&(!D.Y(d,"3V")&&!D.Y(d,"2A")))I;G(d[0]==12||D.Y(d,"3V")||d.15)k.1p(d);N k=D.2R(k,d)});I k},1K:H(d,f,c){G(!d||d.16==3||d.16==8)I 12;J e=!D.4n(d),40=c!==12,1f=D.14.1f;f=e&&D.3X[f]||f;G(d.2j){J g=/5Q|4d|V/.11(f);G(f=="2W"&&D.14.2k)d.1d.64;G(f 1n d&&e&&!g){G(40){G(f=="O"&&D.Y(d,"4T")&&d.1d)7p"O a3 a1\'t 9V 9U";d[f]=c}G(D.Y(d,"3V")&&d.7i(f))I d.7i(f).76;I d[f]}G(1f&&e&&f=="V")I D.1K(d.V,"9T",c);G(40)d.9Q(f,""+c);J h=1f&&e&&g?d.4G(f,2):d.4G(f);I h===U?12:h}G(1f&&f=="1y"){G(40){d.6B=1;d.1E=(d.1E||"").1o(/7f\\([^)]*\\)/,"")+(3r(c)+\'\'=="9L"?"":"7f(1y="+c*7a+")")}I d.1E&&d.1E.1h("1y=")>=0?(3d(d.1E.1I(/1y=([^)]*)/)[1])/7a)+\'\':""}f=f.1o(/-([a-z])/9H,H(a,b){I b.2r()});G(40)d[f]=c;I d[f]},3k:H(a){I(a||"").1o(/^\\s+|\\s+$/g,"")},2d:H(b){J a=[];G(b!=U){J i=b.K;G(i==U||b.1R||b.4I||b.1k)a[0]=b;N 1B(i)a[--i]=b[i]}I a},2L:H(b,a){R(J i=0,K=a.K;i<K;i++)G(a[i]===b)I i;I-1},2R:H(a,b){J i=0,T,2S=a.K;G(D.14.1f){1B(T=b[i++])G(T.16!=8)a[2S++]=T}N 1B(T=b[i++])a[2S++]=T;I a},4r:H(a){J c=[],2o={};1U{R(J i=0,K=a.K;i<K;i++){J b=D.L(a[i]);G(!2o[b]){2o[b]=M;c.1p(a[i])}}}1V(e){c=a}I c},3C:H(c,a,d){J b=[];R(J i=0,K=c.K;i<K;i++)G(!d!=!a(c[i],i))b.1p(c[i]);I b},2l:H(d,a){J c=[];R(J i=0,K=d.K;i<K;i++){J b=a(d[i],i);G(b!=U)c[c.K]=b}I c.7d.1w([],c)}});J v=9B.9A.3y();D.14={5B:(v.1I(/.+(?:9y|9x|9w|9v)[\\/: ]([\\d.]+)/)||[])[1],2k:/75/.11(v),2G:/2G/.11(v),1f:/1f/.11(v)&&!/2G/.11(v),42:/42/.11(v)&&!/(9s|75)/.11(v)};J y=D.14.1f?"7o":"72";D.1l({71:!D.14.1f||S.70=="6Z",3X:{"R":"9n","9k":"1F","4i":y,72:y,7o:y,9h:"9f",9e:"9d",9b:"99"}});D.P({6W:H(a){I a.1d},97:H(a){I D.4S(a,"1d")},95:H(a){I D.3a(a,2,"2H")},91:H(a){I D.3a(a,2,"4l")},8Z:H(a){I D.4S(a,"2H")},8X:H(a){I D.4S(a,"4l")},8W:H(a){I D.5v(a.1d.1x,a)},8V:H(a){I D.5v(a.1x)},6Q:H(a){I D.Y(a,"8U")?a.8T||a.8S.S:D.2d(a.3t)}},H(c,d){D.17[c]=H(b){J a=D.2l(7,d);G(b&&1j b=="23")a=D.3g(b,a);I 7.2I(D.4r(a))}});D.P({6P:"3v",8Q:"6F",39:"6E",8P:"5q",8O:"7b"},H(c,b){D.17[c]=H(){J a=19;I 7.P(H(){R(J i=0,K=a.K;i<K;i++)D(a[i])[b](7)})}});D.P({8N:H(a){D.1K(7,a,"");G(7.16==1)7.5l(a)},8M:H(a){D.1F.1e(7,a)},8L:H(a){D.1F.21(7,a)},8K:H(a){D.1F[D.1F.3T(7,a)?"21":"1e"](7,a)},21:H(a){G(!a||D.1E(a,[7]).r.K){D("*",7).1e(7).P(H(){D.W.21(7);D.3b(7)});G(7.1d)7.1d.37(7)}},4E:H(){D(">*",7).21();1B(7.1x)7.37(7.1x)}},H(a,b){D.17[a]=H(){I 7.P(b,19)}});D.P(["6N","4b"],H(i,c){J b=c.3y();D.17[b]=H(a){I 7[0]==1b?D.14.2G&&S.1c["5t"+c]||D.14.2k&&1b["5s"+c]||S.70=="6Z"&&S.1C["5t"+c]||S.1c["5t"+c]:7[0]==S?29.2f(29.2f(S.1c["4y"+c],S.1C["4y"+c]),29.2f(S.1c["2i"+c],S.1C["2i"+c])):a==12?(7.K?D.1g(7[0],b):U):7.1g(b,a.1q==56?a:a+"2X")}});H 25(a,b){I a[0]&&3r(D.2a(a[0],b,M),10)||0}J C=D.14.2k&&3r(D.14.5B)<8H?"(?:[\\\\w*3m-]|\\\\\\\\.)":"(?:[\\\\w\\8F-\\8E*3m-]|\\\\\\\\.)",6L=2B 4v("^>\\\\s*("+C+"+)"),6J=2B 4v("^("+C+"+)(#)("+C+"+)"),6I=2B 4v("^([#.]?)("+C+"*)");D.1l({6H:{"":H(a,i,m){I m[2]=="*"||D.Y(a,m[2])},"#":H(a,i,m){I a.4G("2v")==m[2]},":":{8D:H(a,i,m){I i<m[3]-0},8C:H(a,i,m){I i>m[3]-0},3a:H(a,i,m){I m[3]-0==i},79:H(a,i,m){I m[3]-0==i},3o:H(a,i){I i==0},3S:H(a,i,m,r){I i==r.K-1},6D:H(a,i){I i%2==0},6C:H(a,i){I i%2},"3o-4u":H(a){I a.1d.3H("*")[0]==a},"3S-4u":H(a){I D.3a(a.1d.5T,1,"4l")==a},"8z-4u":H(a){I!D.3a(a.1d.5T,2,"4l")},6W:H(a){I a.1x},4E:H(a){I!a.1x},8y:H(a,i,m){I(a.6O||a.8x||D(a).1r()||"").1h(m[3])>=0},4j:H(a){I"1G"!=a.O&&D.1g(a,"18")!="2F"&&D.1g(a,"5g")!="1G"},1G:H(a){I"1G"==a.O||D.1g(a,"18")=="2F"||D.1g(a,"5g")=="1G"},8w:H(a){I!a.3R},3R:H(a){I a.3R},4J:H(a){I a.4J},2W:H(a){I a.2W||D.1K(a,"2W")},1r:H(a){I"1r"==a.O},5O:H(a){I"5O"==a.O},5L:H(a){I"5L"==a.O},5p:H(a){I"5p"==a.O},3Q:H(a){I"3Q"==a.O},5o:H(a){I"5o"==a.O},6A:H(a){I"6A"==a.O},6z:H(a){I"6z"==a.O},2s:H(a){I"2s"==a.O||D.Y(a,"2s")},4T:H(a){I/4T|2A|6y|2s/i.11(a.Y)},3T:H(a,i,m){I D.2q(m[3],a).K},8t:H(a){I/h\\d/i.11(a.Y)},8s:H(a){I D.3C(D.3O,H(b){I a==b.T}).K}}},6x:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,2B 4v("^([:.#]*)("+C+"+)")],3g:H(a,c,b){J d,1t=[];1B(a&&a!=d){d=a;J f=D.1E(a,c,b);a=f.t.1o(/^\\s*,\\s*/,"");1t=b?c=f.r:D.2R(1t,f.r)}I 1t},2q:H(t,o){G(1j t!="23")I[t];G(o&&o.16!=1&&o.16!=9)I[];o=o||S;J d=[o],2o=[],3S,Y;1B(t&&3S!=t){J r=[];3S=t;t=D.3k(t);J l=Q,3j=6L,m=3j.2D(t);G(m){Y=m[1].2r();R(J i=0;d[i];i++)R(J c=d[i].1x;c;c=c.2H)G(c.16==1&&(Y=="*"||c.Y.2r()==Y))r.1p(c);d=r;t=t.1o(3j,"");G(t.1h(" ")==0)6M;l=M}N{3j=/^([>+~])\\s*(\\w*)/i;G((m=3j.2D(t))!=U){r=[];J k={};Y=m[2].2r();m=m[1];R(J j=0,3i=d.K;j<3i;j++){J n=m=="~"||m=="+"?d[j].2H:d[j].1x;R(;n;n=n.2H)G(n.16==1){J g=D.L(n);G(m=="~"&&k[g])1X;G(!Y||n.Y.2r()==Y){G(m=="~")k[g]=M;r.1p(n)}G(m=="+")1X}}d=r;t=D.3k(t.1o(3j,""));l=M}}G(t&&!l){G(!t.1h(",")){G(o==d[0])d.4s();2o=D.2R(2o,d);r=d=[o];t=" "+t.6v(1,t.K)}N{J h=6J;J m=h.2D(t);G(m){m=[0,m[2],m[3],m[1]]}N{h=6I;m=h.2D(t)}m[2]=m[2].1o(/\\\\/g,"");J f=d[d.K-1];G(m[1]=="#"&&f&&f.61&&!D.4n(f)){J p=f.61(m[2]);G((D.14.1f||D.14.2G)&&p&&1j p.2v=="23"&&p.2v!=m[2])p=D(\'[@2v="\'+m[2]+\'"]\',f)[0];d=r=p&&(!m[3]||D.Y(p,m[3]))?[p]:[]}N{R(J i=0;d[i];i++){J a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];G(a=="*"&&d[i].Y.3y()=="49")a="3n";r=D.2R(r,d[i].3H(a))}G(m[1]==".")r=D.5m(r,m[2]);G(m[1]=="#"){J e=[];R(J i=0;r[i];i++)G(r[i].4G("2v")==m[2]){e=[r[i]];1X}r=e}d=r}t=t.1o(h,"")}}G(t){J b=D.1E(t,r);d=r=b.r;t=D.3k(b.t)}}G(t)d=[];G(d&&o==d[0])d.4s();2o=D.2R(2o,d);I 2o},5m:H(r,m,a){m=" "+m+" ";J c=[];R(J i=0;r[i];i++){J b=(" "+r[i].1F+" ").1h(m)>=0;G(!a&&b||a&&!b)c.1p(r[i])}I c},1E:H(t,r,h){J d;1B(t&&t!=d){d=t;J p=D.6x,m;R(J i=0;p[i];i++){m=p[i].2D(t);G(m){t=t.8r(m[0].K);m[2]=m[2].1o(/\\\\/g,"");1X}}G(!m)1X;G(m[1]==":"&&m[2]=="4Y")r=62.11(m[3])?D.1E(m[3],r,M).r:D(r).4Y(m[3]);N G(m[1]==".")r=D.5m(r,m[2],h);N G(m[1]=="["){J g=[],O=m[3];R(J i=0,3i=r.K;i<3i;i++){J a=r[i],z=a[D.3X[m[2]]||m[2]];G(z==U||/5Q|4d|2W/.11(m[2]))z=D.1K(a,m[2])||\'\';G((O==""&&!!z||O=="="&&z==m[5]||O=="!="&&z!=m[5]||O=="^="&&z&&!z.1h(m[5])||O=="$="&&z.6v(z.K-m[5].K)==m[5]||(O=="*="||O=="~=")&&z.1h(m[5])>=0)^h)g.1p(a)}r=g}N G(m[1]==":"&&m[2]=="3a-4u"){J e={},g=[],11=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2D(m[3]=="6D"&&"2n"||m[3]=="6C"&&"2n+1"||!/\\D/.11(m[3])&&"8q+"+m[3]||m[3]),3o=(11[1]+(11[2]||1))-0,d=11[3]-0;R(J i=0,3i=r.K;i<3i;i++){J j=r[i],1d=j.1d,2v=D.L(1d);G(!e[2v]){J c=1;R(J n=1d.1x;n;n=n.2H)G(n.16==1)n.4q=c++;e[2v]=M}J b=Q;G(3o==0){G(j.4q==d)b=M}N G((j.4q-d)%3o==0&&(j.4q-d)/3o>=0)b=M;G(b^h)g.1p(j)}r=g}N{J f=D.6H[m[1]];G(1j f=="49")f=f[m[2]];G(1j f=="23")f=6u("Q||H(a,i){I "+f+";}");r=D.3C(r,H(a,i){I f(a,i,m,r)},h)}}I{r:r,t:t}},4S:H(b,c){J a=[],1t=b[c];1B(1t&&1t!=S){G(1t.16==1)a.1p(1t);1t=1t[c]}I a},3a:H(a,e,c,b){e=e||1;J d=0;R(;a;a=a[c])G(a.16==1&&++d==e)1X;I a},5v:H(n,a){J r=[];R(;n;n=n.2H){G(n.16==1&&n!=a)r.1p(n)}I r}});D.W={1e:H(f,i,g,e){G(f.16==3||f.16==8)I;G(D.14.1f&&f.4I)f=1b;G(!g.24)g.24=7.24++;G(e!=12){J h=g;g=7.3M(h,H(){I h.1w(7,19)});g.L=e}J j=D.L(f,"3w")||D.L(f,"3w",{}),1H=D.L(f,"1H")||D.L(f,"1H",H(){G(1j D!="12"&&!D.W.5k)I D.W.1H.1w(19.3L.T,19)});1H.T=f;D.P(i.1R(/\\s+/),H(c,b){J a=b.1R(".");b=a[0];g.O=a[1];J d=j[b];G(!d){d=j[b]={};G(!D.W.2t[b]||D.W.2t[b].4p.1k(f)===Q){G(f.3K)f.3K(b,1H,Q);N G(f.6t)f.6t("4o"+b,1H)}}d[g.24]=g;D.W.26[b]=M});f=U},24:1,26:{},21:H(e,h,f){G(e.16==3||e.16==8)I;J i=D.L(e,"3w"),1L,5i;G(i){G(h==12||(1j h=="23"&&h.8p(0)=="."))R(J g 1n i)7.21(e,g+(h||""));N{G(h.O){f=h.2y;h=h.O}D.P(h.1R(/\\s+/),H(b,a){J c=a.1R(".");a=c[0];G(i[a]){G(f)2U i[a][f.24];N R(f 1n i[a])G(!c[1]||i[a][f].O==c[1])2U i[a][f];R(1L 1n i[a])1X;G(!1L){G(!D.W.2t[a]||D.W.2t[a].4A.1k(e)===Q){G(e.6p)e.6p(a,D.L(e,"1H"),Q);N G(e.6n)e.6n("4o"+a,D.L(e,"1H"))}1L=U;2U i[a]}}})}R(1L 1n i)1X;G(!1L){J d=D.L(e,"1H");G(d)d.T=U;D.3b(e,"3w");D.3b(e,"1H")}}},1P:H(h,c,f,g,i){c=D.2d(c);G(h.1h("!")>=0){h=h.3s(0,-1);J a=M}G(!f){G(7.26[h])D("*").1e([1b,S]).1P(h,c)}N{G(f.16==3||f.16==8)I 12;J b,1L,17=D.1D(f[h]||U),W=!c[0]||!c[0].32;G(W){c.6h({O:h,2J:f,32:H(){},3J:H(){},4C:1z()});c[0][E]=M}c[0].O=h;G(a)c[0].6m=M;J d=D.L(f,"1H");G(d)b=d.1w(f,c);G((!17||(D.Y(f,\'a\')&&h=="4V"))&&f["4o"+h]&&f["4o"+h].1w(f,c)===Q)b=Q;G(W)c.4s();G(i&&D.1D(i)){1L=i.1w(f,b==U?c:c.7d(b));G(1L!==12)b=1L}G(17&&g!==Q&&b!==Q&&!(D.Y(f,\'a\')&&h=="4V")){7.5k=M;1U{f[h]()}1V(e){}}7.5k=Q}I b},1H:H(b){J a,1L,38,5f,4m;b=19[0]=D.W.6l(b||1b.W);38=b.O.1R(".");b.O=38[0];38=38[1];5f=!38&&!b.6m;4m=(D.L(7,"3w")||{})[b.O];R(J j 1n 4m){J c=4m[j];G(5f||c.O==38){b.2y=c;b.L=c.L;1L=c.1w(7,19);G(a!==Q)a=1L;G(1L===Q){b.32();b.3J()}}}I a},6l:H(b){G(b[E]==M)I b;J d=b;b={8o:d};J c="8n 8m 8l 8k 2s 8j 47 5d 6j 5E 8i L 8h 8g 4K 2y 5a 59 8e 8b 58 6f 8a 88 4k 87 86 84 6d 2J 4C 6c O 82 81 35".1R(" ");R(J i=c.K;i;i--)b[c[i]]=d[c[i]];b[E]=M;b.32=H(){G(d.32)d.32();d.80=Q};b.3J=H(){G(d.3J)d.3J();d.7Z=M};b.4C=b.4C||1z();G(!b.2J)b.2J=b.6d||S;G(b.2J.16==3)b.2J=b.2J.1d;G(!b.4k&&b.4K)b.4k=b.4K==b.2J?b.6c:b.4K;G(b.58==U&&b.5d!=U){J a=S.1C,1c=S.1c;b.58=b.5d+(a&&a.2e||1c&&1c.2e||0)-(a.6b||0);b.6f=b.6j+(a&&a.2c||1c&&1c.2c||0)-(a.6a||0)}G(!b.35&&((b.47||b.47===0)?b.47:b.5a))b.35=b.47||b.5a;G(!b.59&&b.5E)b.59=b.5E;G(!b.35&&b.2s)b.35=(b.2s&1?1:(b.2s&2?3:(b.2s&4?2:0)));I b},3M:H(a,b){b.24=a.24=a.24||b.24||7.24++;I b},2t:{27:{4p:H(){55();I},4A:H(){I}},3D:{4p:H(){G(D.14.1f)I Q;D(7).2O("53",D.W.2t.3D.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("53",D.W.2t.3D.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3D";I D.W.1H.1w(7,19)}},3N:{4p:H(){G(D.14.1f)I Q;D(7).2O("51",D.W.2t.3N.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("51",D.W.2t.3N.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3N";I D.W.1H.1w(7,19)}}}};D.17.1l({2O:H(c,a,b){I c=="4X"?7.2V(c,a,b):7.P(H(){D.W.1e(7,c,b||a,b&&a)})},2V:H(d,b,c){J e=D.W.3M(c||b,H(a){D(7).4e(a,e);I(c||b).1w(7,19)});I 7.P(H(){D.W.1e(7,d,e,c&&b)})},4e:H(a,b){I 7.P(H(){D.W.21(7,a,b)})},1P:H(c,a,b){I 7.P(H(){D.W.1P(c,a,7,M,b)})},5C:H(c,a,b){I 7[0]&&D.W.1P(c,a,7[0],Q,b)},2m:H(b){J c=19,i=1;1B(i<c.K)D.W.3M(b,c[i++]);I 7.4V(D.W.3M(b,H(a){7.4Z=(7.4Z||0)%i;a.32();I c[7.4Z++].1w(7,19)||Q}))},7X:H(a,b){I 7.2O(\'3D\',a).2O(\'3N\',b)},27:H(a){55();G(D.2Q)a.1k(S,D);N D.3A.1p(H(){I a.1k(7,D)});I 7}});D.1l({2Q:Q,3A:[],27:H(){G(!D.2Q){D.2Q=M;G(D.3A){D.P(D.3A,H(){7.1k(S)});D.3A=U}D(S).5C("27")}}});J x=Q;H 55(){G(x)I;x=M;G(S.3K&&!D.14.2G)S.3K("69",D.27,Q);G(D.14.1f&&1b==1S)(H(){G(D.2Q)I;1U{S.1C.7V("1A")}1V(3e){3B(19.3L,0);I}D.27()})();G(D.14.2G)S.3K("69",H(){G(D.2Q)I;R(J i=0;i<S.4W.K;i++)G(S.4W[i].3R){3B(19.3L,0);I}D.27()},Q);G(D.14.2k){J a;(H(){G(D.2Q)I;G(S.3f!="68"&&S.3f!="1J"){3B(19.3L,0);I}G(a===12)a=D("V, 7A[7U=7S]").K;G(S.4W.K!=a){3B(19.3L,0);I}D.27()})()}D.W.1e(1b,"43",D.27)}D.P(("7R,7Q,43,85,4y,4X,4V,7P,"+"7O,7N,89,53,51,7M,2A,"+"5o,7L,7K,8d,3e").1R(","),H(i,b){D.17[b]=H(a){I a?7.2O(b,a):7.1P(b)}});J F=H(a,c){J b=a.4k;1B(b&&b!=c)1U{b=b.1d}1V(3e){b=c}I b==c};D(1b).2O("4X",H(){D("*").1e(S).4e()});D.17.1l({67:D.17.43,43:H(g,d,c){G(1j g!=\'23\')I 7.67(g);J e=g.1h(" ");G(e>=0){J i=g.3s(e,g.K);g=g.3s(0,e)}c=c||H(){};J f="2P";G(d)G(D.1D(d)){c=d;d=U}N{d=D.3n(d);f="6g"}J h=7;D.3Y({1a:g,O:f,1O:"2K",L:d,1J:H(a,b){G(b=="1W"||b=="7J")h.2K(i?D("<1v/>").3v(a.4U.1o(/<1m(.|\\s)*?\\/1m>/g,"")).2q(i):a.4U);h.P(c,[a.4U,b,a])}});I 7},aL:H(){I D.3n(7.7I())},7I:H(){I 7.2l(H(){I D.Y(7,"3V")?D.2d(7.aH):7}).1E(H(){I 7.34&&!7.3R&&(7.4J||/2A|6y/i.11(7.Y)||/1r|1G|3Q/i.11(7.O))}).2l(H(i,c){J b=D(7).6e();I b==U?U:b.1q==2p?D.2l(b,H(a,i){I{34:c.34,2x:a}}):{34:c.34,2x:b}}).3p()}});D.P("7H,7G,7F,7D,7C,7B".1R(","),H(i,o){D.17[o]=H(f){I 7.2O(o,f)}});J B=1z();D.1l({3p:H(d,b,a,c){G(D.1D(b)){a=b;b=U}I D.3Y({O:"2P",1a:d,L:b,1W:a,1O:c})},aE:H(b,a){I D.3p(b,U,a,"1m")},aD:H(c,b,a){I D.3p(c,b,a,"3z")},aC:H(d,b,a,c){G(D.1D(b)){a=b;b={}}I D.3Y({O:"6g",1a:d,L:b,1W:a,1O:c})},aA:H(a){D.1l(D.60,a)},60:{1a:5Z.5Q,26:M,O:"2P",2T:0,7z:"4R/x-ax-3V-aw",7x:M,31:M,L:U,5Y:U,3Q:U,4Q:{2N:"4R/2N, 1r/2N",2K:"1r/2K",1m:"1r/4t, 4R/4t",3z:"4R/3z, 1r/4t",1r:"1r/as",4w:"*/*"}},4z:{},3Y:H(s){s=D.1l(M,s,D.1l(M,{},D.60,s));J g,2Z=/=\\?(&|$)/g,1u,L,O=s.O.2r();G(s.L&&s.7x&&1j s.L!="23")s.L=D.3n(s.L);G(s.1O=="4P"){G(O=="2P"){G(!s.1a.1I(2Z))s.1a+=(s.1a.1I(/\\?/)?"&":"?")+(s.4P||"7u")+"=?"}N G(!s.L||!s.L.1I(2Z))s.L=(s.L?s.L+"&":"")+(s.4P||"7u")+"=?";s.1O="3z"}G(s.1O=="3z"&&(s.L&&s.L.1I(2Z)||s.1a.1I(2Z))){g="4P"+B++;G(s.L)s.L=(s.L+"").1o(2Z,"="+g+"$1");s.1a=s.1a.1o(2Z,"="+g+"$1");s.1O="1m";1b[g]=H(a){L=a;1W();1J();1b[g]=12;1U{2U 1b[g]}1V(e){}G(i)i.37(h)}}G(s.1O=="1m"&&s.1Y==U)s.1Y=Q;G(s.1Y===Q&&O=="2P"){J j=1z();J k=s.1a.1o(/(\\?|&)3m=.*?(&|$)/,"$ap="+j+"$2");s.1a=k+((k==s.1a)?(s.1a.1I(/\\?/)?"&":"?")+"3m="+j:"")}G(s.L&&O=="2P"){s.1a+=(s.1a.1I(/\\?/)?"&":"?")+s.L;s.L=U}G(s.26&&!D.4O++)D.W.1P("7H");J n=/^(?:\\w+:)?\\/\\/([^\\/?#]+)/;G(s.1O=="1m"&&O=="2P"&&n.11(s.1a)&&n.2D(s.1a)[1]!=5Z.al){J i=S.3H("6w")[0];J h=S.3h("1m");h.4d=s.1a;G(s.7t)h.aj=s.7t;G(!g){J l=Q;h.ah=h.ag=H(){G(!l&&(!7.3f||7.3f=="68"||7.3f=="1J")){l=M;1W();1J();i.37(h)}}}i.3U(h);I 12}J m=Q;J c=1b.7s?2B 7s("ae.ac"):2B 7r();G(s.5Y)c.6R(O,s.1a,s.31,s.5Y,s.3Q);N c.6R(O,s.1a,s.31);1U{G(s.L)c.4B("ab-aa",s.7z);G(s.5S)c.4B("a9-5R-a8",D.4z[s.1a]||"a7, a6 a5 a4 5N:5N:5N a2");c.4B("X-9Z-9Y","7r");c.4B("9W",s.1O&&s.4Q[s.1O]?s.4Q[s.1O]+", */*":s.4Q.4w)}1V(e){}G(s.7m&&s.7m(c,s)===Q){s.26&&D.4O--;c.7l();I Q}G(s.26)D.W.1P("7B",[c,s]);J d=H(a){G(!m&&c&&(c.3f==4||a=="2T")){m=M;G(f){7k(f);f=U}1u=a=="2T"&&"2T"||!D.7j(c)&&"3e"||s.5S&&D.7h(c,s.1a)&&"7J"||"1W";G(1u=="1W"){1U{L=D.6X(c,s.1O,s.9S)}1V(e){1u="5J"}}G(1u=="1W"){J b;1U{b=c.5I("7g-5R")}1V(e){}G(s.5S&&b)D.4z[s.1a]=b;G(!g)1W()}N D.5H(s,c,1u);1J();G(s.31)c=U}};G(s.31){J f=4I(d,13);G(s.2T>0)3B(H(){G(c){c.7l();G(!m)d("2T")}},s.2T)}1U{c.9P(s.L)}1V(e){D.5H(s,c,U,e)}G(!s.31)d();H 1W(){G(s.1W)s.1W(L,1u);G(s.26)D.W.1P("7C",[c,s])}H 1J(){G(s.1J)s.1J(c,1u);G(s.26)D.W.1P("7F",[c,s]);G(s.26&&!--D.4O)D.W.1P("7G")}I c},5H:H(s,a,b,e){G(s.3e)s.3e(a,b,e);G(s.26)D.W.1P("7D",[a,s,e])},4O:0,7j:H(a){1U{I!a.1u&&5Z.9O=="5p:"||(a.1u>=7e&&a.1u<9N)||a.1u==7c||a.1u==9K||D.14.2k&&a.1u==12}1V(e){}I Q},7h:H(a,c){1U{J b=a.5I("7g-5R");I a.1u==7c||b==D.4z[c]||D.14.2k&&a.1u==12}1V(e){}I Q},6X:H(a,c,b){J d=a.5I("9J-O"),2N=c=="2N"||!c&&d&&d.1h("2N")>=0,L=2N?a.9I:a.4U;G(2N&&L.1C.2j=="5J")7p"5J";G(b)L=b(L,c);G(c=="1m")D.5u(L);G(c=="3z")L=6u("("+L+")");I L},3n:H(a){J s=[];G(a.1q==2p||a.5w)D.P(a,H(){s.1p(3u(7.34)+"="+3u(7.2x))});N R(J j 1n a)G(a[j]&&a[j].1q==2p)D.P(a[j],H(){s.1p(3u(j)+"="+3u(7))});N s.1p(3u(j)+"="+3u(D.1D(a[j])?a[j]():a[j]));I s.6s("&").1o(/%20/g,"+")}});D.17.1l({1N:H(c,b){I c?7.2g({1Z:"1N",2h:"1N",1y:"1N"},c,b):7.1E(":1G").P(H(){7.V.18=7.5D||"";G(D.1g(7,"18")=="2F"){J a=D("<"+7.2j+" />").6P("1c");7.V.18=a.1g("18");G(7.V.18=="2F")7.V.18="3I";a.21()}}).3l()},1M:H(b,a){I b?7.2g({1Z:"1M",2h:"1M",1y:"1M"},b,a):7.1E(":4j").P(H(){7.5D=7.5D||D.1g(7,"18");7.V.18="2F"}).3l()},78:D.17.2m,2m:H(a,b){I D.1D(a)&&D.1D(b)?7.78.1w(7,19):a?7.2g({1Z:"2m",2h:"2m",1y:"2m"},a,b):7.P(H(){D(7)[D(7).3F(":1G")?"1N":"1M"]()})},9G:H(b,a){I 7.2g({1Z:"1N"},b,a)},9F:H(b,a){I 7.2g({1Z:"1M"},b,a)},9E:H(b,a){I 7.2g({1Z:"2m"},b,a)},9D:H(b,a){I 7.2g({1y:"1N"},b,a)},9M:H(b,a){I 7.2g({1y:"1M"},b,a)},9C:H(c,a,b){I 7.2g({1y:a},c,b)},2g:H(k,j,i,g){J h=D.77(j,i,g);I 7[h.36===Q?"P":"36"](H(){G(7.16!=1)I Q;J f=D.1l({},h),p,1G=D(7).3F(":1G"),46=7;R(p 1n k){G(k[p]=="1M"&&1G||k[p]=="1N"&&!1G)I f.1J.1k(7);G(p=="1Z"||p=="2h"){f.18=D.1g(7,"18");f.33=7.V.33}}G(f.33!=U)7.V.33="1G";f.45=D.1l({},k);D.P(k,H(c,a){J e=2B D.28(46,f,c);G(/2m|1N|1M/.11(a))e[a=="2m"?1G?"1N":"1M":a](k);N{J b=a.6r().1I(/^([+-]=)?([\\d+-.]+)(.*)$/),2b=e.1t(M)||0;G(b){J d=3d(b[2]),2M=b[3]||"2X";G(2M!="2X"){46.V[c]=(d||1)+2M;2b=((d||1)/e.1t(M))*2b;46.V[c]=2b+2M}G(b[1])d=((b[1]=="-="?-1:1)*d)+2b;e.3G(2b,d,2M)}N e.3G(2b,a,"")}});I M})},36:H(a,b){G(D.1D(a)||(a&&a.1q==2p)){b=a;a="28"}G(!a||(1j a=="23"&&!b))I A(7[0],a);I 7.P(H(){G(b.1q==2p)A(7,a,b);N{A(7,a).1p(b);G(A(7,a).K==1)b.1k(7)}})},9X:H(b,c){J a=D.3O;G(b)7.36([]);7.P(H(){R(J i=a.K-1;i>=0;i--)G(a[i].T==7){G(c)a[i](M);a.7n(i,1)}});G(!c)7.5A();I 7}});J A=H(b,c,a){G(b){c=c||"28";J q=D.L(b,c+"36");G(!q||a)q=D.L(b,c+"36",D.2d(a))}I q};D.17.5A=H(a){a=a||"28";I 7.P(H(){J q=A(7,a);q.4s();G(q.K)q[0].1k(7)})};D.1l({77:H(b,a,c){J d=b&&b.1q==a0?b:{1J:c||!c&&a||D.1D(b)&&b,2u:b,41:c&&a||a&&a.1q!=9t&&a};d.2u=(d.2u&&d.2u.1q==4L?d.2u:D.28.5K[d.2u])||D.28.5K.74;d.5M=d.1J;d.1J=H(){G(d.36!==Q)D(7).5A();G(D.1D(d.5M))d.5M.1k(7)};I d},41:{73:H(p,n,b,a){I b+a*p},5P:H(p,n,b,a){I((-29.9r(p*29.9q)/2)+0.5)*a+b}},3O:[],48:U,28:H(b,c,a){7.15=c;7.T=b;7.1i=a;G(!c.3Z)c.3Z={}}});D.28.44={4D:H(){G(7.15.2Y)7.15.2Y.1k(7.T,7.1z,7);(D.28.2Y[7.1i]||D.28.2Y.4w)(7);G(7.1i=="1Z"||7.1i=="2h")7.T.V.18="3I"},1t:H(a){G(7.T[7.1i]!=U&&7.T.V[7.1i]==U)I 7.T[7.1i];J r=3d(D.1g(7.T,7.1i,a));I r&&r>-9p?r:3d(D.2a(7.T,7.1i))||0},3G:H(c,b,d){7.5V=1z();7.2b=c;7.3l=b;7.2M=d||7.2M||"2X";7.1z=7.2b;7.2S=7.4N=0;7.4D();J e=7;H t(a){I e.2Y(a)}t.T=7.T;D.3O.1p(t);G(D.48==U){D.48=4I(H(){J a=D.3O;R(J i=0;i<a.K;i++)G(!a[i]())a.7n(i--,1);G(!a.K){7k(D.48);D.48=U}},13)}},1N:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1N=M;7.3G(0,7.1t());G(7.1i=="2h"||7.1i=="1Z")7.T.V[7.1i]="9m";D(7.T).1N()},1M:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1M=M;7.3G(7.1t(),0)},2Y:H(a){J t=1z();G(a||t>7.15.2u+7.5V){7.1z=7.3l;7.2S=7.4N=1;7.4D();7.15.45[7.1i]=M;J b=M;R(J i 1n 7.15.45)G(7.15.45[i]!==M)b=Q;G(b){G(7.15.18!=U){7.T.V.33=7.15.33;7.T.V.18=7.15.18;G(D.1g(7.T,"18")=="2F")7.T.V.18="3I"}G(7.15.1M)7.T.V.18="2F";G(7.15.1M||7.15.1N)R(J p 1n 7.15.45)D.1K(7.T.V,p,7.15.3Z[p])}G(b)7.15.1J.1k(7.T);I Q}N{J n=t-7.5V;7.4N=n/7.15.2u;7.2S=D.41[7.15.41||(D.41.5P?"5P":"73")](7.4N,n,0,1,7.15.2u);7.1z=7.2b+((7.3l-7.2b)*7.2S);7.4D()}I M}};D.1l(D.28,{5K:{9l:9j,9i:7e,74:9g},2Y:{2e:H(a){a.T.2e=a.1z},2c:H(a){a.T.2c=a.1z},1y:H(a){D.1K(a.T.V,"1y",a.1z)},4w:H(a){a.T.V[a.1i]=a.1z+a.2M}}});D.17.2i=H(){J b=0,1S=0,T=7[0],3q;G(T)ao(D.14){J d=T.1d,4a=T,1s=T.1s,1Q=T.2z,5U=2k&&3r(5B)<9c&&!/9a/i.11(v),1g=D.2a,3c=1g(T,"30")=="3c";G(T.7y){J c=T.7y();1e(c.1A+29.2f(1Q.1C.2e,1Q.1c.2e),c.1S+29.2f(1Q.1C.2c,1Q.1c.2c));1e(-1Q.1C.6b,-1Q.1C.6a)}N{1e(T.5X,T.5W);1B(1s){1e(1s.5X,1s.5W);G(42&&!/^t(98|d|h)$/i.11(1s.2j)||2k&&!5U)2C(1s);G(!3c&&1g(1s,"30")=="3c")3c=M;4a=/^1c$/i.11(1s.2j)?4a:1s;1s=1s.1s}1B(d&&d.2j&&!/^1c|2K$/i.11(d.2j)){G(!/^96|1T.*$/i.11(1g(d,"18")))1e(-d.2e,-d.2c);G(42&&1g(d,"33")!="4j")2C(d);d=d.1d}G((5U&&(3c||1g(4a,"30")=="5x"))||(42&&1g(4a,"30")!="5x"))1e(-1Q.1c.5X,-1Q.1c.5W);G(3c)1e(29.2f(1Q.1C.2e,1Q.1c.2e),29.2f(1Q.1C.2c,1Q.1c.2c))}3q={1S:1S,1A:b}}H 2C(a){1e(D.2a(a,"6V",M),D.2a(a,"6U",M))}H 1e(l,t){b+=3r(l,10)||0;1S+=3r(t,10)||0}I 3q};D.17.1l({30:H(){J a=0,1S=0,3q;G(7[0]){J b=7.1s(),2i=7.2i(),4c=/^1c|2K$/i.11(b[0].2j)?{1S:0,1A:0}:b.2i();2i.1S-=25(7,\'94\');2i.1A-=25(7,\'aF\');4c.1S+=25(b,\'6U\');4c.1A+=25(b,\'6V\');3q={1S:2i.1S-4c.1S,1A:2i.1A-4c.1A}}I 3q},1s:H(){J a=7[0].1s;1B(a&&(!/^1c|2K$/i.11(a.2j)&&D.1g(a,\'30\')==\'93\'))a=a.1s;I D(a)}});D.P([\'5e\',\'5G\'],H(i,b){J c=\'4y\'+b;D.17[c]=H(a){G(!7[0])I;I a!=12?7.P(H(){7==1b||7==S?1b.92(!i?a:D(1b).2e(),i?a:D(1b).2c()):7[c]=a}):7[0]==1b||7[0]==S?46[i?\'aI\':\'aJ\']||D.71&&S.1C[c]||S.1c[c]:7[0][c]}});D.P(["6N","4b"],H(i,b){J c=i?"5e":"5G",4f=i?"6k":"6i";D.17["5s"+b]=H(){I 7[b.3y()]()+25(7,"57"+c)+25(7,"57"+4f)};D.17["90"+b]=H(a){I 7["5s"+b]()+25(7,"2C"+c+"4b")+25(7,"2C"+4f+"4b")+(a?25(7,"6S"+c)+25(7,"6S"+4f):0)}})})();',62,669,'|||||||this|||||||||||||||||||||||||||||||||||if|function|return|var|length|data|true|else|type|each|false|for|document|elem|null|style|event||nodeName|||test|undefined||browser|options|nodeType|fn|display|arguments|url|window|body|parentNode|add|msie|css|indexOf|prop|typeof|call|extend|script|in|replace|push|constructor|text|offsetParent|cur|status|div|apply|firstChild|opacity|now|left|while|documentElement|isFunction|filter|className|hidden|handle|match|complete|attr|ret|hide|show|dataType|trigger|doc|split|top|table|try|catch|success|break|cache|height||remove|tbody|string|guid|num|global|ready|fx|Math|curCSS|start|scrollTop|makeArray|scrollLeft|max|animate|width|offset|tagName|safari|map|toggle||done|Array|find|toUpperCase|button|special|duration|id|copy|value|handler|ownerDocument|select|new|border|exec|stack|none|opera|nextSibling|pushStack|target|html|inArray|unit|xml|bind|GET|isReady|merge|pos|timeout|delete|one|selected|px|step|jsre|position|async|preventDefault|overflow|name|which|queue|removeChild|namespace|insertBefore|nth|removeData|fixed|parseFloat|error|readyState|multiFilter|createElement|rl|re|trim|end|_|param|first|get|results|parseInt|slice|childNodes|encodeURIComponent|append|events|elems|toLowerCase|json|readyList|setTimeout|grep|mouseenter|color|is|custom|getElementsByTagName|block|stopPropagation|addEventListener|callee|proxy|mouseleave|timers|defaultView|password|disabled|last|has|appendChild|form|domManip|props|ajax|orig|set|easing|mozilla|load|prototype|curAnim|self|charCode|timerId|object|offsetChild|Width|parentOffset|src|unbind|br|currentStyle|clean|float|visible|relatedTarget|previousSibling|handlers|isXMLDoc|on|setup|nodeIndex|unique|shift|javascript|child|RegExp|_default|deep|scroll|lastModified|teardown|setRequestHeader|timeStamp|update|empty|tr|getAttribute|innerHTML|setInterval|checked|fromElement|Number|jQuery|state|active|jsonp|accepts|application|dir|input|responseText|click|styleSheets|unload|not|lastToggle|outline|mouseout|getPropertyValue|mouseover|getComputedStyle|bindReady|String|padding|pageX|metaKey|keyCode|getWH|andSelf|clientX|Left|all|visibility|container|index|init|triggered|removeAttribute|classFilter|prevObject|submit|file|after|windowData|inner|client|globalEval|sibling|jquery|absolute|clone|wrapAll|dequeue|version|triggerHandler|oldblock|ctrlKey|createTextNode|Top|handleError|getResponseHeader|parsererror|speeds|checkbox|old|00|radio|swing|href|Modified|ifModified|lastChild|safari2|startTime|offsetTop|offsetLeft|username|location|ajaxSettings|getElementById|isSimple|values|selectedIndex|runtimeStyle|rsLeft|_load|loaded|DOMContentLoaded|clientTop|clientLeft|toElement|srcElement|val|pageY|POST|unshift|Bottom|clientY|Right|fix|exclusive|detachEvent|cloneNode|removeEventListener|swap|toString|join|attachEvent|eval|substr|head|parse|textarea|reset|image|zoom|odd|even|before|prepend|exclude|expr|quickClass|quickID|uuid|quickChild|continue|Height|textContent|appendTo|contents|open|margin|evalScript|borderTopWidth|borderLeftWidth|parent|httpData|setArray|CSS1Compat|compatMode|boxModel|cssFloat|linear|def|webkit|nodeValue|speed|_toggle|eq|100|replaceWith|304|concat|200|alpha|Last|httpNotModified|getAttributeNode|httpSuccess|clearInterval|abort|beforeSend|splice|styleFloat|throw|colgroup|XMLHttpRequest|ActiveXObject|scriptCharset|callback|fieldset|multiple|processData|getBoundingClientRect|contentType|link|ajaxSend|ajaxSuccess|ajaxError|col|ajaxComplete|ajaxStop|ajaxStart|serializeArray|notmodified|keypress|keydown|change|mouseup|mousedown|dblclick|focus|blur|stylesheet|hasClass|rel|doScroll|black|hover|solid|cancelBubble|returnValue|wheelDelta|view|round|shiftKey|resize|screenY|screenX|relatedNode|mousemove|prevValue|originalTarget|offsetHeight|keyup|newValue|offsetWidth|eventPhase|detail|currentTarget|cancelable|bubbles|attrName|attrChange|altKey|originalEvent|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|font|gt|lt|uFFFF|u0128|size|417|Boolean|Date|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|wrap|contentWindow|contentDocument|iframe|children|siblings|prevAll|wrapInner|nextAll|outer|prev|scrollTo|static|marginTop|next|inline|parents|able|cellSpacing|adobeair|cellspacing|522|maxLength|maxlength|readOnly|400|readonly|fast|600|class|slow|1px|htmlFor|reverse|10000|PI|cos|compatible|Function|setData|ie|ra|it|rv|getData|userAgent|navigator|fadeTo|fadeIn|slideToggle|slideUp|slideDown|ig|responseXML|content|1223|NaN|fadeOut|300|protocol|send|setAttribute|option|dataFilter|cssText|changed|be|Accept|stop|With|Requested|Object|can|GMT|property|1970|Jan|01|Thu|Since|If|Type|Content|XMLHTTP|th|Microsoft|td|onreadystatechange|onload|cap|charset|colg|host|tfoot|specified|with|1_|thead|leg|plain|attributes|opt|embed|urlencoded|www|area|hr|ajaxSetup|meta|post|getJSON|getScript|marginLeft|img|elements|pageYOffset|pageXOffset|abbr|serialize|pixelLeft'.split('|'),0,{}));
// $Id: drupal.js,v 1.41.2.4 2009/07/21 08:59:10 goba Exp $

var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'themes': {}, 'locale': {} };

/**
 * Set the variable that indicates if JavaScript behaviors should be applied
 */
Drupal.jsEnabled = document.getElementsByTagName && document.createElement && document.createTextNode && document.documentElement && document.getElementById;

/**
 * Attach all registered behaviors to a page element.
 *
 * Behaviors are event-triggered actions that attach to page elements, enhancing
 * default non-Javascript UIs. Behaviors are registered in the Drupal.behaviors
 * object as follows:
 * @code
 *    Drupal.behaviors.behaviorName = function () {
 *      ...
 *    };
 * @endcode
 *
 * Drupal.attachBehaviors is added below to the jQuery ready event and so
 * runs on initial page load. Developers implementing AHAH/AJAX in their
 * solutions should also call this function after new page content has been
 * loaded, feeding in an element to be processed, in order to attach all
 * behaviors to the new content.
 *
 * Behaviors should use a class in the form behaviorName-processed to ensure
 * the behavior is attached only once to a given element. (Doing so enables
 * the reprocessing of given elements, which may be needed on occasion despite
 * the ability to limit behavior attachment to a particular element.)
 *
 * @param context
 *   An element to attach behaviors to. If none is given, the document element
 *   is used.
 */
Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

/**
 * Encode special characters in a plain-text string for display as HTML.
 */
Drupal.checkPlain = function(str) {
  str = String(str);
  var replace = { '&': '&amp;', '"': '&quot;', '<': '&lt;', '>': '&gt;' };
  for (var character in replace) {
    var regex = new RegExp(character, 'g');
    str = str.replace(regex, replace[character]);
  }
  return str;
};

/**
 * Translate strings to the page language or a given language.
 *
 * See the documentation of the server-side t() function for further details.
 *
 * @param str
 *   A string containing the English string to translate.
 * @param args
 *   An object of replacements pairs to make after translation. Incidences
 *   of any key in this array are replaced with the corresponding value.
 *   Based on the first character of the key, the value is escaped and/or themed:
 *    - !variable: inserted as is
 *    - @variable: escape plain text to HTML (Drupal.checkPlain)
 *    - %variable: escape text and theme as a placeholder for user-submitted
 *      content (checkPlain + Drupal.theme('placeholder'))
 * @return
 *   The translated string.
 */
Drupal.t = function(str, args) {
  // Fetch the localized version of the string.
  if (Drupal.locale.strings && Drupal.locale.strings[str]) {
    str = Drupal.locale.strings[str];
  }

  if (args) {
    // Transform arguments before inserting them
    for (var key in args) {
      switch (key.charAt(0)) {
        // Escaped only
        case '@':
          args[key] = Drupal.checkPlain(args[key]);
        break;
        // Pass-through
        case '!':
          break;
        // Escaped and placeholder
        case '%':
        default:
          args[key] = Drupal.theme('placeholder', args[key]);
          break;
      }
      str = str.replace(key, args[key]);
    }
  }
  return str;
};

/**
 * Format a string containing a count of items.
 *
 * This function ensures that the string is pluralized correctly. Since Drupal.t() is
 * called by this function, make sure not to pass already-localized strings to it.
 *
 * See the documentation of the server-side format_plural() function for further details.
 *
 * @param count
 *   The item count to display.
 * @param singular
 *   The string for the singular case. Please make sure it is clear this is
 *   singular, to ease translation (e.g. use "1 new comment" instead of "1 new").
 *   Do not use @count in the singular string.
 * @param plural
 *   The string for the plural case. Please make sure it is clear this is plural,
 *   to ease translation. Use @count in place of the item count, as in "@count
 *   new comments".
 * @param args
 *   An object of replacements pairs to make after translation. Incidences
 *   of any key in this array are replaced with the corresponding value.
 *   Based on the first character of the key, the value is escaped and/or themed:
 *    - !variable: inserted as is
 *    - @variable: escape plain text to HTML (Drupal.checkPlain)
 *    - %variable: escape text and theme as a placeholder for user-submitted
 *      content (checkPlain + Drupal.theme('placeholder'))
 *   Note that you do not need to include @count in this array.
 *   This replacement is done automatically for the plural case.
 * @return
 *   A translated string.
 */
Drupal.formatPlural = function(count, singular, plural, args) {
  var args = args || {};
  args['@count'] = count;
  // Determine the index of the plural form.
  var index = Drupal.locale.pluralFormula ? Drupal.locale.pluralFormula(args['@count']) : ((args['@count'] == 1) ? 0 : 1);

  if (index == 0) {
    return Drupal.t(singular, args);
  }
  else if (index == 1) {
    return Drupal.t(plural, args);
  }
  else {
    args['@count['+ index +']'] = args['@count'];
    delete args['@count'];
    return Drupal.t(plural.replace('@count', '@count['+ index +']'));
  }
};

/**
 * Generate the themed representation of a Drupal object.
 *
 * All requests for themed output must go through this function. It examines
 * the request and routes it to the appropriate theme function. If the current
 * theme does not provide an override function, the generic theme function is
 * called.
 *
 * For example, to retrieve the HTML that is output by theme_placeholder(text),
 * call Drupal.theme('placeholder', text).
 *
 * @param func
 *   The name of the theme function to call.
 * @param ...
 *   Additional arguments to pass along to the theme function.
 * @return
 *   Any data the theme function returns. This could be a plain HTML string,
 *   but also a complex object.
 */
Drupal.theme = function(func) {
  for (var i = 1, args = []; i < arguments.length; i++) {
    args.push(arguments[i]);
  }

  return (Drupal.theme[func] || Drupal.theme.prototype[func]).apply(this, args);
};

/**
 * Parse a JSON response.
 *
 * The result is either the JSON object, or an object with 'status' 0 and 'data' an error message.
 */
Drupal.parseJson = function (data) {
  if ((data.substring(0, 1) != '{') && (data.substring(0, 1) != '[')) {
    return { status: 0, data: data.length ? data : Drupal.t('Unspecified error') };
  }
  return eval('(' + data + ');');
};

/**
 * Freeze the current body height (as minimum height). Used to prevent
 * unnecessary upwards scrolling when doing DOM manipulations.
 */
Drupal.freezeHeight = function () {
  Drupal.unfreezeHeight();
  var div = document.createElement('div');
  $(div).css({
    position: 'absolute',
    top: '0px',
    left: '0px',
    width: '1px',
    height: $('body').css('height')
  }).attr('id', 'freeze-height');
  $('body').append(div);
};

/**
 * Unfreeze the body height
 */
Drupal.unfreezeHeight = function () {
  $('#freeze-height').remove();
};

/**
 * Wrapper around encodeURIComponent() which avoids Apache quirks (equivalent of
 * drupal_urlencode() in PHP). This function should only be used on paths, not
 * on query string arguments.
 */
Drupal.encodeURIComponent = function (item, uri) {
  uri = uri || location.href;
  item = encodeURIComponent(item).replace(/%2F/g, '/');
  return (uri.indexOf('?q=') != -1) ? item : item.replace(/%26/g, '%2526').replace(/%23/g, '%2523').replace(/\/\//g, '/%252F');
};

/**
 * Get the text selection in a textarea.
 */
Drupal.getSelection = function (element) {
  if (typeof(element.selectionStart) != 'number' && document.selection) {
    // The current selection
    var range1 = document.selection.createRange();
    var range2 = range1.duplicate();
    // Select all text.
    range2.moveToElementText(element);
    // Now move 'dummy' end point to end point of original range.
    range2.setEndPoint('EndToEnd', range1);
    // Now we can calculate start and end points.
    var start = range2.text.length - range1.text.length;
    var end = start + range1.text.length;
    return { 'start': start, 'end': end };
  }
  return { 'start': element.selectionStart, 'end': element.selectionEnd };
};

/**
 * Build an error message from ahah response.
 */
Drupal.ahahError = function(xmlhttp, uri) {
  if (xmlhttp.status == 200) {
    if (jQuery.trim($(xmlhttp.responseText).text())) {
      var message = Drupal.t("An error occurred. \n@uri\n@text", {'@uri': uri, '@text': xmlhttp.responseText });
    }
    else {
      var message = Drupal.t("An error occurred. \n@uri\n(no information available).", {'@uri': uri, '@text': xmlhttp.responseText });
    }
  }
  else {
    var message = Drupal.t("An HTTP error @status occurred. \n@uri", {'@uri': uri, '@status': xmlhttp.status });
  }
  return message;
}

// Global Killswitch on the <html> element
if (Drupal.jsEnabled) {
  // Global Killswitch on the <html> element
  $(document.documentElement).addClass('js');
  // 'js enabled' cookie
  document.cookie = 'has_js=1; path=/';
  // Attach all behaviors.
  $(document).ready(function() {
    Drupal.attachBehaviors(this);
  });
}

/**
 * The default themes.
 */
Drupal.theme.prototype = {

  /**
   * Formats text for emphasized display in a placeholder inside a sentence.
   *
   * @param str
   *   The text to format (plain-text).
   * @return
   *   The formatted text (html).
   */
  placeholder: function(str) {
    return '<em>' + Drupal.checkPlain(str) + '</em>';
  }
};
;

$(document).ready(function() {

  // Attach onclick event to document only and catch clicks on all elements.
  $(document.body).click(function(event) {
    // Catch only the first parent link of a clicked element.
    $(event.target).parents("a:first,area:first").andSelf().filter("a,area").each(function() {

      var ga = Drupal.settings.googleanalytics;
      // Expression to check for absolute internal links.
      var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i");
      // Expression to check for special links like gotwo.module /go/* links.
      var isInternalSpecial = new RegExp("(\/go\/.*)$", "i");
      // Expression to check for download links.
      var isDownload = new RegExp("\\.(" + ga.trackDownloadExtensions + ")$", "i");

      // Is the clicked URL internal?
      if (isInternal.test(this.href)) {
        // Is download tracking activated and the file extension configured for download tracking?
        if (ga.trackDownload && isDownload.test(this.href)) {
          // Download link clicked.
          var extension = isDownload.exec(this.href);
          _gaq.push(["_trackEvent", "Downloads", extension[1].toUpperCase(), this.href.replace(isInternal, '')]);
        }
        else if (isInternalSpecial.test(this.href)) {
          // Keep the internal URL for Google Analytics website overlay intact.
          _gaq.push(["_trackPageview", this.href.replace(isInternal, '')]);
        }
      }
      else {
        if (ga.trackMailto && $(this).is("a[href^=mailto:],area[href^=mailto:]")) {
          // Mailto link clicked.
          _gaq.push(["_trackEvent", "Mails", "Click", this.href.substring(7)]);
        }
        else if (ga.trackOutgoing && this.href) {
          if (ga.trackOutboundAsPageview) {
            // Track all external links as page views after URL cleanup.
            // Currently required, if click should be tracked as goal.
            _gaq.push(["_trackPageview", '/outbound/' + this.href.replace(/^(https?|ftp|news|nntp|telnet|irc|ssh|sftp|webcal):\/\//i, '').split('/').join('--')]);
          }
          else {
            // External link clicked.
            _gaq.push(["_trackEvent", "Outbound links", "Click", this.href]);
          }
        }
      }
    });
  });
});
;
/*
 * jQuery JSON Plugin
 * version: 2.1 (2009-08-14)
 *
 * This document is licensed as free software under the terms of the
 * MIT License: http://www.opensource.org/licenses/mit-license.php
 *
 * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org 
 * website's http://www.json.org/json2.js, which proclaims:
 * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
 * I uphold.
 *
 * It is also influenced heavily by MochiKit's serializeJSON, which is 
 * copyrighted 2005 by Bob Ippolito.
 */
 
(function($) {
    /** jQuery.toJSON( json-serializble )
        Converts the given argument into a JSON respresentation.

        If an object has a "toJSON" function, that will be used to get the representation.
        Non-integer/string keys are skipped in the object, as are keys that point to a function.

        json-serializble:
            The *thing* to be converted.
     **/
    $.toJSON = function(o)
    {
        if (typeof(JSON) == 'object' && JSON.stringify)
            return JSON.stringify(o);
        
        var type = typeof(o);
    
        if (o === null)
            return "null";
    
        if (type == "undefined")
            return undefined;
        
        if (type == "number" || type == "boolean")
            return o + "";
    
        if (type == "string")
            return $.quoteString(o);
    
        if (type == 'object')
        {
            if (typeof o.toJSON == "function") 
                return $.toJSON( o.toJSON() );
            
            if (o.constructor === Date)
            {
                var month = o.getUTCMonth() + 1;
                if (month < 10) month = '0' + month;

                var day = o.getUTCDate();
                if (day < 10) day = '0' + day;

                var year = o.getUTCFullYear();
                
                var hours = o.getUTCHours();
                if (hours < 10) hours = '0' + hours;
                
                var minutes = o.getUTCMinutes();
                if (minutes < 10) minutes = '0' + minutes;
                
                var seconds = o.getUTCSeconds();
                if (seconds < 10) seconds = '0' + seconds;
                
                var milli = o.getUTCMilliseconds();
                if (milli < 100) milli = '0' + milli;
                if (milli < 10) milli = '0' + milli;

                return '"' + year + '-' + month + '-' + day + 'T' +
                             hours + ':' + minutes + ':' + seconds + 
                             '.' + milli + 'Z"'; 
            }

            if (o.constructor === Array) 
            {
                var ret = [];
                for (var i = 0; i < o.length; i++)
                    ret.push( $.toJSON(o[i]) || "null" );

                return "[" + ret.join(",") + "]";
            }
        
            var pairs = [];
            for (var k in o) {
                var name;
                var type = typeof k;

                if (type == "number")
                    name = '"' + k + '"';
                else if (type == "string")
                    name = $.quoteString(k);
                else
                    continue;  //skip non-string or number keys
            
                if (typeof o[k] == "function") 
                    continue;  //skip pairs where the value is a function.
            
                var val = $.toJSON(o[k]);
            
                pairs.push(name + ":" + val);
            }

            return "{" + pairs.join(", ") + "}";
        }
    };

    /** jQuery.evalJSON(src)
        Evaluates a given piece of json source.
     **/
    $.evalJSON = function(src)
    {
        if (typeof(JSON) == 'object' && JSON.parse)
            return JSON.parse(src);
        return eval("(" + src + ")");
    };
    
    /** jQuery.secureEvalJSON(src)
        Evals JSON in a way that is *more* secure.
    **/
    $.secureEvalJSON = function(src)
    {
        if (typeof(JSON) == 'object' && JSON.parse)
            return JSON.parse(src);
        
        var filtered = src;
        filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
        filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
        filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
        
        if (/^[\],:{}\s]*$/.test(filtered))
            return eval("(" + src + ")");
        else
            throw new SyntaxError("Error parsing JSON, source is not valid.");
    };

    /** jQuery.quoteString(string)
        Returns a string-repr of a string, escaping quotes intelligently.  
        Mostly a support function for toJSON.
    
        Examples:
            >>> jQuery.quoteString("apple")
            "apple"
        
            >>> jQuery.quoteString('"Where are we going?", she asked.')
            "\"Where are we going?\", she asked."
     **/
    $.quoteString = function(string)
    {
        if (string.match(_escapeable))
        {
            return '"' + string.replace(_escapeable, function (a) 
            {
                var c = _meta[a];
                if (typeof c === 'string') return c;
                c = a.charCodeAt();
                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
            }) + '"';
        }
        return '"' + string + '"';
    };
    
    var _escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
    
    var _meta = {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"' : '\\"',
        '\\': '\\\\'
    };
})(jQuery);
;
function gtc(clientdiv){
	this.div = $(clientdiv);
	//$('<link rel="stylesheet" type="text/css" href="/css/gtc.css" >').appendTo("head");
	$(this.div).addClass("gtc");
	
	//this.divinstrument = $('<div id="instrument"></div>');
	/*$(this.div).append('<div id="instrument"></div>');
	$(this.div).append('<div id="scaletable"></div>');
	//Controls
	//this.divcontrolcontainer = $('<div id="controlcontainer"></div>');
	$(this.div).append($('<div id="controlcontainer"></div>'));
	//this.divcontrols = $('<div id="controls"></div>');
	$('#controlcontainer').append('<div id="controls"></div>');
	//this.divchords = $('<div id="Chords"></div>');
	$('#controlcontainer').append('<div id="Chords"></div>');
	//this.divscales = $('<div id="Scales"></div>');
	$('#controlcontainer').append('<div id="Scales"></div>');
	//this.divtiming = $('<div id="timing"></div>');
	$('#controlcontainer').append('<div id="timing"></div>');
	//end Controls
	
	//Tab
	this.divtabcontainer = $('<div id="tabcontainer"></div>');
	$(this.div).append(this.divtabcontainer);
	this.divtabdisplay = $('<div id="tabdisplay"></div>');
	$(this.divtabcontainer).append(this.divtabdisplay);
	this.divtabcontrol = $('<div id="tabcontrol"></div>');
	$(this.divtabcontainer).append(this.divtabcontrol);
	//$$('head')[0].appendChild(script);
	//javascript
	/*
	$.ajaxSetup({async: false});
	$.getScript('sites/all/modules/gtc/js/guitar.js', function() {
		 // alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/timing.js', function() {
		//  alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/scales.js', function() {
		 // alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/chords.js', function() {
		//  alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/guitarfunctions.js', function() {
		//  alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/tabcontrol.js', function() {
		//  alert('Load was performed.');
		});
	$.getScript('sites/all/modules/gtc/js/tabcreator.js', function(eventData) 
		ctrltab = new tabcreator($('#tabdisplay'));
		ctrltab.adddiv($('tabdisplay'));
		ctrltab.tabctrl.allbuttons($('#tabcontrol')); 
		ctrltab.chords.showControl($('#Chords')); 
		   ctrltab.scales.showControl($('#Scales')); 
		   ctrltab.tabfunk.allbuttons($('#controls'));
			 ctrltab.timing.showControl($('#timing'));

			ctrltab.inst.display($('#instrument'));
			$('muteoff').show();
			ctrltab.printtab();
		});
	$.ajaxSetup({async: true});
	
	this.facebookjs = new Element("script", {id: "facebookjs", src: "http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US", type: "text/javascript"});
	$('head').appendChild(this.facebookjs);
	this.guitarjs = new Element("script", {src: "js/guitar.js", type: "text/javascript"});
	$('head').appendChild(this.guitarjs);
	this.timingjs = new Element("script", {src: "js/timing.js", type: "text/javascript"});
	$('head').appendChild(this.timingjs);
	this.scalesjs = new Element("script", {src: "js/scales.js", type: "text/javascript"});
	$('head').appendChild(this.scalesjs);
	this.chordsjs = new Element("script", {src: "js/chords.js", type: "text/javascript"});
	$('head').appendChild(this.chordsjs);
	this.guitarfuntionsjs = new Element("script", {src: "js/guitarfunctions.js", type: "text/javascript"});
	$('head').appendChild(this.guitarfuntionsjs);
	this.tabcontroljs = new Element("script", {src: "js/tabcontrol.js", type: "text/javascript"});
	$('head').appendChild(this.tabcontroljs);
	this.tabcreatorjs = new Element("script", {id: "tabcreatorjs", src: "js/tabcreator.js", type: "text/javascript"});
	$('head').appendChild(this.tabcreatorjs);
	
	
	
	Event.observe(this.tabcreatorjs,'load',function(){
		ctrltab = new tabcreator(this.divtabdisplay);
		ctrltab.adddiv(this.divtabdisplay);
		ctrltab.tabctrl.allbuttons(this.divtabcontrol); 
		ctrltab.chords.showControl(this.divchords); 
		   ctrltab.scales.showControl(this.divscales); 
		   ctrltab.tabfunk.allbuttons(this.divcontrols);
			 ctrltab.timing.showControl(this.divtiming);

			ctrltab.inst.display(this.divinstrument);
			document.getElementById("muteoff").style.visibility = 'visible';
			ctrltab.printtab();
	}.bindAsEventListener(this));
*/
	
	
	

}

$('document').keypress(function(e) {
	var keynum = (e.which) ? e.which : e.keyCode;
	if (keynum == 72 || keynum == 104){ //h
		ctrltab.insertElem('h');
		} else if (keynum == 66 || keynum == 98){//b
			ctrltab.insertElem('b');
		} else if (keynum == 80 || keynum == 112){//p
			ctrltab.insertElem('p');
		} else if (keynum == 82 || keynum == 114){//r
			ctrltab.insertElem('r');
		} else if (keynum == 191 || keynum == 47){// /
			ctrltab.insertElem('/');
		} else if (keynum == 220  || keynum == 92){// \
			ctrltab.insertElem('\\');
		} else if (keynum == 86  || keynum == 118){// v
			ctrltab.insertElem('v');
		} else if (keynum == 37 || keynum == 8 || keynum == 46){// v
			ctrltab.erase();
		} else if (keynum == 39){// v
			 ctrltab.AS();
		} else if (keynum == 13){// v
			 ctrltab.NL();
		}

			return true;
});


function closead(){
	$('#ads').slideUp();
};
/*
function callPublish(msg, attachment, action_link) {
	  FB.init("ee6e38ab835278ddd353ca781ed16c9c");
		FB.ensureInit(function () {
			var message = "";//ctrltab.printfb();
			//var props = message.evalJSON();
			var attachment = { 'name': 'made with www.guitartabcreator.com', 
							   'href': 'http://www.guitartabcreator.com', 
							   'caption': '{*actor*} created tab using Guitar Tab Creator',
							   'properties' : ctrltab.printfb()}; 
			var action_links = [{'text':'Try Guitar Tab Creator', 'href':'http://www.guitartabcreator.com'}];
	    FB.Connect.streamPublish(message, attachment, action_link);
	  });
	}
*/

		;
// JavaScript Document
/**********
* Copyright 2007 Gregg B Larson
* All Rights reserved
***********/



function guitar(tctrl){
	this.tabcreator = tctrl;
	
	this.table = document.createElement('table');
	$(this.table).addClass("gtc_table")
	$(this.table).attr("border",0);
	$(this.table).attr("cellpadding",0);
	this.tbody = document.createElement("tbody");
	
	this.tr1 = document.createElement('tr');
	this.tr1.style.backgroundColor = "#FFFFFF";

	this.td1 = document.createElement('td');
	this.td1.rowspan ="8";
	$(this.tr1).append(this.td1);
	$(this.tbody).append(this.tr1);//tbody = table
	
	this.createscale = function(val){
		if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}

	
		var offset = Array("C","C#/Db","D","D#/Eb","E","F","F#/Gb","G","G#/Ab","A","A#/Bb","B").indexOf(val);
		var flatsharp_scale = Array("0","F","S","F","S","F","F","S","F","S","F","S");
		var flatsharp = flatsharp_scale[offset];
		var chromatic_scale = Array("C","CsDb","D","DsEb","E","F","FsGb","G","GsAb","A","AsBb","B");
		//var cofval;
		//debug(val + ": " + offset);
		for(var i=0;i<12;i++){
		//val = i + offset;
			if(i==0){
				if(i < offset){
					for(i;i<offset;i++){
//						$cofval = chromatic_scale.shift();
						chromatic_scale.push(chromatic_scale.shift());
					}
				}
			}
			
		}
		return chromatic_scale;
		
	}
	
	
	//end of the init
	
	//begin of functions
	this.ClrBrd = function (){
		for(i=5;i>=0;i--){
			for(j=0;j<=21;j++){
				var strID = "#note_" + (i+1) + "" + j;
				var strElem = "#notetitle_" + (i+1) + "" + j;
				$(strElem).html("");
				$(strID).removeClass("showscale"); //.css("background-image", "");
				$(strID).removeClass("shownote");
			}
		}
	}
	
	this.display = function(vDiv){
			this.div = vDiv;
			for(var j=0;j<=21;j++)
			{	
				var numnode = document.createElement('td');
				$(numnode).addClass("numnode");
				$(numnode).html(j);
				$(this.tr1).append(numnode);
			}
		
	var notes = new Array("E","A","D","G","B","E");
	var markers = new Array(3,5,7,9,12,15,17);
	var stringwidths = new Array(4,3,3,3,2,2);
	for(var i=6;i>=1;i--){
		var gtrow = document.createElement('tr');
		$(gtrow).attr('class','gtrow');
		var tdnut = document.createElement('td');
		$(tdnut).attr('class','tdnut');
		$(tdnut).html(notes[i-1]);
		$(gtrow).append(tdnut);
		var scale = this.createscale(notes[i-1]);
	//	debug(scale);
		for(j=0;j<=21;j++){	//onMouseOut=\"MM_swapImgRestore()\" onMouseOver=\"MM_swapImage('Image_" .$i . $j. "','','empty2.gif',1)\"
			 if(j < 12){
				 id = scale[j]; 
			 }else{
			 	id = scale[j-12];
			 }
			var tdfret = document.createElement('td');
			$(tdfret).attr('class','tdfret');
			$(tdfret).attr("border",0);
			var fretdiv = document.createElement('div');
			fretdiv.id = i + "" + j;
			fretdiv.title = id;
			if(jQuery.inArray(j,markers) > 0){
					if(j == 12){
						if(i == 2 || i == 4){
							$(fretdiv).attr('class','fretdiv_lower');
						} else if (i==3 || i == 5){
							$(fretdiv).attr('class','fretdiv_upper');
						} else {
							$(fretdiv).attr('class','fretdiv');
						}
					} else {
						if(i == 3){
							$(fretdiv).attr('class','fretdiv_lower');
						} else if (i==4){
							$(fretdiv).attr('class','fretdiv_upper');
						} else {
							$(fretdiv).attr('class','fretdiv');
						}
					}
			} else {
				$(fretdiv).attr('class','fretdiv');
			}
			
			var notediv = document.createElement('div');
			$(notediv).attr('id',"note_" + i + "" + j);//#note_
			$(notediv).attr('i',i);
			$(notediv).attr('j',j);
			//notediv.title = id;
			$(notediv).addClass('notediv');

			var notetitle = document.createElement('div');
			$(notetitle).attr('id',"notetitle_" + i + "" + j);
			$(notetitle).addClass('notetitle');
			
			$(fretdiv).mouseover(function(event){
				var element = event.currentTarget;
				$(element).addClass('fretdiv_over');
			});

			$(fretdiv).mouseout(function(event){
				var element = event.currentTarget;
				$(element).removeClass('fretdiv_over');
			});
			$(fretdiv).bind('click', {msg: this}, function(event){
				//click on a fret (this is the first event)
				var element = $(this);//event.currentTarget.firstElementChild;
				if($(element).hasClass('showscale')){
					$(element).removeClass('showscale');
				}
				$(element).find(">.notediv").addClass('shownote');
				var notediv = $(this).find('div');
					$(notediv).html(element.title);
					var arg1 = $(notediv).attr('i');
					var arg2 = $(notediv).attr('j');
					event.data.msg.tabcreator.tabbit(arg1, arg2);
				});						
			$(fretdiv).append(notediv);
			$(fretdiv).append(notetitle);
			$(tdfret).append(fretdiv);
			$(gtrow).append(tdfret);
			$(this.tbody).append(gtrow); //tbody = table
		}
		
	}
	this.tr2 = document.createElement('tr');
	this.tr2.style.backgroundColor = "#FFFFFF";
	
	this.td2 = document.createElement('td');
	this.td2.width ="10";
	this.td2.height = "20";
	
	$(this.tr2).append(this.td2);
	for(var j=0;j<=21;j++)
	{	
		var numnode = document.createElement('td');
		$(numnode).addClass("numnode")
		$(numnode).html(j);
		$(this.tr2).append(numnode);
	}
	$(this.tbody).append(this.tr2);//tbody = table
	$(this.table).append(this.tbody); //added
	$(this.div).append(this.table);
	}
	this.echo = function(){
		return "guitar";
	}
};
// JavaScript Document

// JavaScript Document
function timing(tctrl){
		this.tabcreator = tctrl;
		this.time = new Array();
		this.messageopen = false;
		this.imgsrc = "/images/";
		this.timelegend = "(W|WW) Whole  (H|HH) Half  (Q|QQ) Quarter  (E|EE) 8th (S|SS) 16th  (T|TT) 32nd (X|XX) 64th";
		
	//button return image
		this.btnreturn = new Image();	
		this.btnreturn.src = this.imgsrc + "button.gif";
		//this.btnv.id = "btnv";
		//this.btnv.title = "Vibrato'";
		this.btnreturn.alt = "return";
		this.btnreturn.width = "10";
		this.btnreturn.height = "10";
		
		//Timing Select Dropdown
	this.selTime = document.createElement('select');
	this.selTime.name = "selTime";
	this.selTime.id = "selTime";
	this.selTime.options[0] = new Option("none", "none",true);
	this.selTime.options[1] = new Option("Whole", "W",false);
	this.selTime.options[2] = new Option("Half", "H",false);
	this.selTime.options[3] = new Option("Quarter", "Q",false);
	this.selTime.options[4] = new Option("8th", "E",false);
	this.selTime.options[5] = new Option("16th", "S",false);
	this.selTime.options[6] = new Option("32nd", "T",false);
	this.selTime.options[7] = new Option("64th", "X",false);
	
	this.checkbox = document.createElement('input');
	this.checkbox.type = 'checkbox';
	this.checkbox.name = 'checkboxName';
	this.checkbox.defaultChecked = false;
	this.checkbox.style.visibility = 'visible';
	this.checkbox.value = 'Use Timing';
	
	this.showControl = function(div){
		this.div = div;
		this.table = document.createElement('table');
		
	this.table.border = "0";
		this.table.width = "100%";
		this.table.style.backgroundColor = "#999999";
		
		this.tbody = document.createElement('tbody');
		
		this.tr1 = document.createElement('tr');

		this.td1 = document.createElement('td');
		this.td1.style.backgroundColor = "#003366";
		this.td1.style.fontSize = "10px";
		this.td1.style.color = "#FFFFFF";
		this.td1.height="10px";
		this.td1.width = "118px";
		this.td1.align="left";
		
		this.helplink = document.createElement('a');
		this.helplink.setAttribute('class', 'tiny_help');
		this.helplink.setAttribute('target', 'help');
		this.helplink.setAttribute('href', 'http://blog.guitartabcreator.com/2010/02/timing-added-to-guitar-tab-creator.html');
		this.helplink.innerHTML = "help";
		
		this.spanlabel = document.createElement('span');
		this.spanlabel.id="lbltiming";
		this.spanlabel.innerHTML = "Timing Controls";
		$(this.spanlabel).append(this.helplink);
	
	
		$(this.td1).append(this.btnreturn);
		$(this.td1).append(this.spanlabel);	
		
		this.tr2 = document.createElement('tr');
		this.td2 = document.createElement('td');
		this.td2.style.backgroundColor = "#999999";
		this.td2div = document.createElement('div');
		this.td2div.id="timingctrl";
		this.td2div.style.visibility = 'visible';
		this.td2div.align="center";
		
		this.spanlabel2 = document.createElement('label');
		this.spanlabel2.innerHTML = "use timing";
		
		$(this.td2div).append(this.selTime);
		$(this.td2div).append(document.createElement('br'));
		//this.td2div.appendChild(this.checkbox);
		//this.td2div.appendChild(this.spanlabel2);
		document.createElement('br')


		$(this.tr1).append(this.td1)
				$(this.td2).append(this.td2div);
				$(this.tr2).append(this.td2);
		
				$(this.tbody).append(this.tr1);
				$(this.tbody).append(this.tr2);
				$(this.table).append(this.tbody);
		
				$(this.div).append(this.table);
	
	}

	
	//respond to format forum check
	$(this.selTime).bind('change', {msg: this}, function(event){
		if($(this.selTime).val() != 'none'){
			if(event.data.msg.tabcreator.hasnote(0)){
				alert("you must enable timing before you begin creating tab!  You'll need to start over if you want to use timing.")
				event.data.msg.selTime.value = "none";
				event.data.msg.checkbox.checked = false;
		
			} else {
				event.data.msg.checkbox.checked = true;
			}
			event.data.msg.tabcreator.printtab(0);
		}else{
			event.data.msg.$(this).checkbox.checked = false;
			
			event.data.msg.tabcreator.printtab(0);
			/*
				this.tabcreator.timing.time.pop();
				this.tabcreator.timing.time.push(Event.element(event).value);
				this.tabcreator.printtab(0);
			*/
		}
	});
	/*
	Event.observe($(this.selTime), 'change', function(event){
		if($(this.selTime).value != 'none'){
			if(this.tabcreator.hasnote(0)){
				alert("you must enable timing before you begin creating tab!  You'll need to start over if you want to use timing.")
				this.selTime.value = "none";
				this.checkbox.checked = false;
		
			} else {
				this.checkbox.checked = true;
			}
			this.tabcreator.printtab(0);
		}else{
			this.checkbox.checked = false;
			
			this.tabcreator.printtab(0);
			//
				this.tabcreator.timing.time.pop();
				this.tabcreator.timing.time.push(Event.element(event).value);
				this.tabcreator.printtab(0);
			//
		}
	}.bindAsEventListener(this));
	*/
	//respond to format forum check
	$(this.checkbox).click(function(){
		//should the tab be enabled
		if(ctrltab.hasnote(0)){
			alert("you must enable timing before you begin creating tab!  You'll need to start over if you want to use timing.")
				ctrltab.timing.checkbox.checked = false;
		}
			this.printtab(0);
	});
	/*
	Event.observe($(this.checkbox), 'click', function(event){
	//should the tab be enabled
	if(ctrltab.hasnote(0)){
		alert("you must enable timing before you begin creating tab!  You'll need to start over if you want to use timing.")
			ctrltab.timing.checkbox.checked = false;
	}
		this.printtab(0);
	}.bindAsEventListener(this.tabcreator));
	*/
	
	this.showlegend = function(){
		if(this.checkbox.checked){
			return('\r\n' +this.timelegend + '\r\n');
		} else {
			return('');
		}
	}
	
	this.tostring = function(hist){
		var header = 't:';
		var footer = '';
		if(this.checkbox.checked){
				return(header + this.printarray() + footer);
			} else {
				return("");
			}
	}
	
	this.addtoarray = function(tabcounter,isElem){
		if(this.messageopen){
			Effect.BlindUp('ads');
			this.messageopen = false;
		}
		if(isElem){
			this.time[tabcounter] = this.selTime.value;
		} else {
			this.time[tabcounter] = this.selTime.value;
		}
	}
	
	this.printarray = function(){
		var tmpstring = '';//this.tabcreator.spacey(" ");
		var j;
		var stringtime;
		for(j=0;j<=this.tabcreator.tabcounter;j++){
			if(j==0){
				tmpstring = this.tabcreator.spacey(" ");
			}
			if(this.tabcreator.iselem(j,7)){
					//if(!this.hasvib(j)){
						tmpstring = tmpstring.substring(0,tmpstring.length-1);
					//}
			} else if(this.tabcreator.hasnote(j)){
				if(this.tabcreator.isbig(j)){
					stringtime = this.time[j] + this.time[j];
				} else {
					stringtime = this.time[j];
				}
				tmpstring += stringtime + this.tabcreator.spacey(" ");
			} 
		}
		if(tmpstring ==''){
			tmpstring = this.tabcreator.spacey(" ");
		}
		return(tmpstring);
	}
	
	this.showMessage = function(div){
			this.messageopen = true;

		this.btnTimeOn = document.createElement('input');
		this.btnTimeOn.value = "Enable Timing";
		this.btnTimeOn.type = "button";
		this.btnTimeOn.id = "btnTimingOn";
		this.btnTimeOn.title = "Enable Timing.";
		this.btnTimeOn.name = "btnTimingOn";
		
		this.msgh = document.createElement('span');
		this.msgh.className="lblmsg";
		this.msgh.innerHTML = "Visit the <a href=\"http://blog.guitartabcreator.com/2010/02/timing-added-to-guitar-tab-creator.html\">blog</a> for information on how to use the new functions: timing, formating for forums and posting to facebook.";
		
		this.msgf = document.createElement('span');
		this.msgf.className="lblmsg";
		this.msgf.innerHTML = " BEFORE you start creating tab. Timing will be disabled once you start";
		
		Event.observe($(this.btnTimeOn), 'click', function(event){
			ctrltab.timing.checkbox.checked = true;
			ctrltab.timing.messageopen = false;
			Effect.BlindUp('ads');
			ctrltab.printtab(0);
		}.bindAsEventListener(this.tabcreator));
		
		//this.div = div;
		//$(div).appendChild(this.msgh);
	//	this.div.appendChild(this.btnTimeOn);
	//	this.div.appendChild(this.msgf);
		
	}
		
};
// Guitar Theory

/**********
* Copyright 2007 Gregg B Larson
* All Rights reserved
***********/

function Scales(tctrl){
	this.tabcreator = tctrl;
	this.fs = 'S';
	this.isopen = true;
	this.imgsrc = "/images/";
		
	//Key Select Dropdown
	this.selKey = document.createElement('select');
	this.selKey.name = "selKey";
	this.selKey.id = "selKey";
	this.selKey.options[0] = new Option("none", "none",true);
	this.selKey.options[1] = new Option("C", "C",false);
	this.selKey.options[2] = new Option("Cs", "C#/Db",false);
	this.selKey.options[3] = new Option("D", "D",false);
	this.selKey.options[4] = new Option("Ds", "D#/Eb",false);
	this.selKey.options[5] = new Option("E", "E",false);
	this.selKey.options[6] = new Option("F", "F",false);
	this.selKey.options[7] = new Option("Fs", "F#/Gb",false);
	this.selKey.options[8] = new Option("G", "G",false);
	this.selKey.options[9] = new Option("Gs", "G#/Ab",false);
	this.selKey.options[10] = new Option("A", "A",false);
	this.selKey.options[11] = new Option("As", "A#/Bb",false);
	this.selKey.options[12] = new Option("B", "B",false);
	
	
	//Mode Select Dropdown
	this.selMode = document.createElement('select');
	this.selMode.name = "selMode";
	this.selMode.id = "selMode";
//	this.selMode.options[0] = new Option("none", "none",true);
	this.selMode.options[0] = new Option("Ionian (major)", "ionian",true);
	this.selMode.options[1] = new Option("Aeolian", "aeolian",false);
	this.selMode.options[2] = new Option("Harmonic minor", "harmonicminor",false);
	this.selMode.options[3] = new Option("Melodic minor", "melodicminor",false);
	this.selMode.options[4] = new Option("Diminished", "diminished",false);
	this.selMode.options[5] = new Option("Dorian", "dorian",false);
	this.selMode.options[6] = new Option("Phrygian", "phrygian",false);
	this.selMode.options[7] = new Option("Lydian", "lydian",false);
	this.selMode.options[8] = new Option("Mixolydian", "mixolydian",false);
	this.selMode.options[9] = new Option("Locrian", "locrian",false);
	this.selMode.options[10] = new Option("Major Pent", "majorpent",false);
	this.selMode.options[11] = new Option("Minor Pent", "minorpent",false);
	this.selMode.options[12] = new Option("Minor Blues", "minorblues",false);
	
	//button return image
	this.btnreturn = new Image();	
	this.btnreturn.src = this.imgsrc + "button.gif";
	//this.btnv.id = "btnv";
	//this.btnv.title = "Vibrato'";
	this.btnreturn.alt = "return";
	this.btnreturn.width = "10";
	this.btnreturn.height = "10";
	
	//button clear image
	this.btnclear = new Image();	
	this.btnclear.src = "images/btnclear.gif";
	this.btnclear.alt = "clear";

	
	//button show image
	this.btnshow = new Image();	
	this.btnshow.src = "images/btnshow.gif";
	//this.btnv.id = "btnv";
	//this.btnv.title = "Vibrato'";
	this.btnshow.alt = "show";
	
	this.table = document.createElement('table');
	$(this.table).attr('class','scale_table');
	//this.table.border = "0";
	//this.table.width = "100%";
	//this.table.style.backgroundColor = "#999999";
	
	this.tr1 = document.createElement('tr');

	this.td1 = document.createElement('td');
	this.td1.style.backgroundColor = "#003366";
	this.td1.style.fontSize = "10px";
	this.td1.style.color = "#FFFFFF";
	this.td1.height="10";
	this.td1.align="left";
	
		
	this.helplink = document.createElement('a');
	this.helplink.setAttribute('class', 'tiny_help');
	this.helplink.setAttribute('target', 'help');
	this.helplink.setAttribute('href', 'http://blog.guitartabcreator.com/2010/02/using-scale-helper.html');
	this.helplink.innerHTML = "help";
		
	this.spanlabel = document.createElement('span');
	//this.spanlabel.class="style7";
	this.spanlabel.id="lblcontrols";
	this.spanlabel.innerHTML = "Scale Helper";
	$(this.spanlabel).append(this.helplink);
	
	$(this.td1).append(this.btnreturn);
	$(this.td1).append(this.spanlabel);
	$(this.tr1).append(this.td1);
	//this.table.appendChild(this.tr1);
	
	this.tr2 = document.createElement('tr');
	this.td2 = document.createElement('td');
	//this.td2.style.backgroundColor = "#E7EBF0";
	this.td2div = document.createElement('div');
	this.td2div.id="muteoff";
	$(this.td2div).attr('class','common_block_style');
	this.td2div.align="left";
	$(this.td2).append(this.td2div);
	$(this.tr2).append(this.td2);
	this.tbody = document.createElement('tbody');
	$(this.tbody).append(this.tr1);
	$(this.tbody).append(this.tr2);
	$(this.table).append(this.tbody);
	
		//table to format button positions
		this.tableFormat = document.createElement('table');
		$(this.tableFormat).attr('class','scale_table_format');
		//this.tableFormat.border = "0";
		this.tableFormat.cellPadding = "0";
		this.tableFormat.cellSpacing = "0";
		//this.tableFormat.width = "135px";
		//this.tableFormat.style.backgroundColor = "#999999";
		
		this.tableFormat_tr1 = document.createElement('tr');

		this.tableFormat_td1 = document.createElement('td');
		//this.td1.style.backgroundColor = "#003366";
		//this.tableFormat_td1.style.fontSize = "12px";
		//this.tableFormat_td1.style.color = "#000000";
		//this.tableFormat_td1.height="10";
		//this.tableFormat_td1.align="right";
		//this.tableFormat_td1.align="left";
		$(this.tableFormat_td1).append(this.selKey);
		$(this.tableFormat_tr1).append(this.tableFormat_td1);
		this.tableFormat_tr2 = document.createElement('tr');
		this.tableFormat_td2 = document.createElement('td');
		//this.tableFormat_td2.style.backgroundColor = "#999999";
		$(this.tableFormat_td2).append(this.selMode);
		$(this.tableFormat_tr2).append(this.tableFormat_td2);
		this.tableFormat_tr3 = document.createElement('tr');
		this.tableFormat_td3 = document.createElement('td');
		this.tableFormat_td3.style.backgroundColor = "#999999";
		this.tableFormat_td3.colSpan = "2";
		this.tableFormat_td3.align="center";
		//this.tableFormat_td3.appendChild(this.btnshow);
		//this.tableFormat_td3.appendChild(this.btnclear);
		$(this.tableFormat_tr3).append(this.tableFormat_td3);
		this.tableFormat_tbody = document.createElement('tbody');
		$(this.tableFormat_tbody).append(this.tableFormat_tr1);
		$(this.tableFormat_tbody).append(this.tableFormat_tr2);
		$(this.tableFormat_tbody).append(this.tableFormat_tr3);
		$(this.tableFormat).append(this.tableFormat_tbody);
		//just keep it open
		$(this.td2div).append(this.tableFormat);
		//end table to format button positions
		//Key Change
		$(this.selKey).bind('change', {msg: this}, function(event){
			if($('#selKey option:selected').val() != 'none'){
				event.data.msg.tabcreator.inst.ClrBrd(0);
				event.data.msg.SM("F");
			}else{
				event.data.msg.tabcreator.inst.ClrBrd(0);
				$('#scaletable').fadeOut();
			}
		});

		//Mode Change
		$(this.selMode).bind('change', {msg: this}, function(event){
			if($('#selKey option:selected').val() != 'none'){
				event.data.msg.tabcreator.inst.ClrBrd(0);
				event.data.msg.SM("F");
			}else{
				event.data.msg.tabcreator.inst.ClrBrd(0);
				//Effect.Fade('scaletable');
			}
		});

		//show scales
		$(this.td1).click(function(event){
			// this.DisplayScale();
		});

		//clear scale
		$(this.btnclear).click(function(event){
			 this.tabcreator.inst.ClrBrd(0);
			Effect.Fade('scaletable');
		});

		//show scale
		$(this.btnshow).click(function(event){
			 this.tabcreator.inst.ClrBrd(0);
			 this.SM("F");
		});

	this.showControl = function(div){
		this.div = div;
		$(this.div).append(this.table);
		
	}

	
	this.drawscale = function (i,j,notearray){
		var noteval = notearray.split("_");
		var h;
		if(j+4>21){
			h = 21;
		} else {
			h =j+4;
		}	
				
		for(i=6;i>=1;i--){
			for(k=j;k<=h;k++){
			//	alert(k);
				for(l=0;l<noteval.length;l++){
					if(noteval[l] != ""){
								if(noteval[l].toString().length == 1){
									if(noteval[l] == $("#" + i + "" + k).title){
										$("#note_" + i + "" + k).addClass("notered");
									}
								} else {
									if($("#" + i + "" + k).title.toString().indexOf(noteval[l].toString()) != -1 ){
											$("#note_" + i + "" + k).addClass("notered");
									}
								}
					}
				}
			}
		}
		
	}
	
	this.scale = function (noteval,notearray){
				//create a scale
	this.showscale(notearray);
	var i = 1;
	for(j=0;j<=21;j++){
		//need to check the id name against an array that represents the mode
		if(noteval.toString().length == 1){
			if(noteval == $(i + "" + j).title){
					this.drawscale(i,j,notearray);
			}
		} else {
			if($(i + "" + j).title.toString().indexOf(noteval.toString()) != -1 ){
				this.drawscale(i,j,notearray);
			}
		}			
	}
	ctrltab.PB();
	}
	
	/*
	function SS(){
			for(i=6;i>=1;i--){
				for(j=0;j<=21;j++){
					MM_swapImage("Image_" + i + "" + j,'','images/' + document.getElementsByName("Image_" + i + "" + j)[0].id + '.gif',1);
				}
			}
	}
	*/
	
	this.SM = function (flatsharp){
			//create a scale
				var kval = $('#selKey option:selected').attr('value');   //document.frmTabCreator.selKey.options[document.frmTabCreator.selKey.selectedIndex].value;
				var mval = $('#selMode option:selected').attr('value');  //document.frmTabCreator.selMode.options[document.frmTabCreator.selMode.selectedIndex].value;
				var fsval;
				if(flatsharp == "F"){
					fsval = flatsharp;
				} else if(flatsharp == "S"){
					fsval = flatsharp;
				} else if(flatsharp == "C"){
					//need to choose
					if(document.frmTabCreator.rgSharpFlat != null){
						for (var i=0; i < document.frmTabCreator.rgSharpFlat.length; i++)
						{
						   if (document.frmTabCreator.rgSharpFlat[i].checked)
							  {
							  fsval = document.frmTabCreator.rgSharpFlat[i].value;
							  }
						}
					} else {
						fsval = "S";
					}
				}
				if(typeof console != "undefined"){
					console.log('/sites/all/modules/gtc/cof.php?' + 'keyval=' + kval + '&modeval=' + mval + '&funct=PS' + '&fs=' + fsval + '');
				}
				$('#scaletable').load('/sites/all/modules/gtc/cof.php',{keyval:kval,modeval:mval,funct:'PS',fs:fsval},function(){
					$('#scaletable').fadeIn();
				});
				$.ajax({
					  url: '/sites/all/modules/gtc/cof.php',
					  type: 'POST',
					  data: { keyval: kval, 
							  modeval: mval,
							  funct: "CS",
							  fs: fsval},
					  context: document.body,
					  success: function(t){
						var noteval = t.split("_");
						var k = 0;
						var strID;
						var strElem;
						for(i=6;i>=1;i--)
						{
								for(j=0;j<=21;j++)
								{
									//need to check the id name against an array that represents the mode
									for(k=0;k<noteval.length;k++)
									{
										strID = "#" + i + "" + j; 
										strElem = "#notetitle_" + i + "" + j; 
										if(noteval[k] != ""){
											if($(strID).attr('title').indexOf(noteval[k].toString()) >= 0 && (noteval[k].toString().length == $(strID).attr('title').length || noteval[k].toString().length == 2)){
													$(strElem).html(noteval[k].replace(/s/,"#"));
													if(!$(strID).hasClass("shownote")){
														$(strID).find(">.notediv").addClass('showscale');
														
													}
													k=noteval.length;
											} 
										}
										
									}
									
								}
						} 
						ctrltab.PB();
					  }
					});
	}
	
	this.showscale = function (notearray)
		{
			var noteval = notearray.split("_");
			//debug(notearray);
			//debug(noteval.length);
			var k = 0;
			var strID;
			var strElem;
			var noteval = t.split("_");
			var k = 0;
			var strID;
			var strElem;
			for(i=6;i>=1;i--)
			{
					for(j=0;j<=21;j++)
					{
						//need to check the id name against an array that represents the mode
						for(k=0;k<noteval.length;k++)
						{
							strID = "#" + i + "" + j; 
							strElem = "#notetitle_" + i + "" + j; 
							if(noteval[k] != ""){
								if(noteval[k].toString().length == 1 && noteval[k].toString() == $(strID).attr('title')){
										$(strElem).html(noteval[k].replace(/s/,"#"));
										if(!$(strID).hasClass("shownote")){
											$(strID).addClass('showscale');
										}
										k=noteval.length;
								} else if(noteval[k].toString().length != 1 && $(strID).attr('title') != -1 ){
										
										$(strElem).html(noteval[k].replace(/s/,"#"));
										if(!$(strID).hasClass("shownote")){
											$(strID).addClass('showscale');
										}
										k=noteval.length;
								}
							}
							
						}
						
					}
			} 
			
		}

	
	this.DisplayScale = function(){
		
		if($('#lblcontrols').html() == "click to open scale tool"){
			//document.frmTabCreator.btnChord.value = "Record a Chord";
			//chord = 0;l
			//new Ajax.Updater('muteoff', 'scale.php', {onComplete:function(){ new Effect.Highlight('muteoff');},asynchronous:true, evalScripts:true});
			//this.td2div.appendChild(this.selKey);
			//this.td2div.appendChild(this.selMode);
			//this.td2div.appendChild(this.btnshow);
			//Effect.BlindDown('muteoff');
			this.isopen = true;
			$(this.td2div).append(this.tableFormat);
			$('#lblcontrols').html("click to close scale tool");
			
			
		} else {
			this.isopen = false;
			this.tabcreator.inst.ClrBrd();
			ctrltab.PB();
			//document.getElementById('scaletable').innerHTML  = "";
			//document.getElementById('muteoff').innerHTML  = "";
			//Effect.BlindUp('muteoff');
			$('scaletable').fadeIn();
			$('muteoff').html("");
			$('#lblcontrols').html("click to open scale tool");
	
		}
		
					
	}
};
// JavaScript Document
/**********
* Copyright 2007 Gregg B Larson
* All Rights reserved
***********/
function Chords(tctrl){
		this.tabcreator = tctrl;
		//this.imgsrc = "/images/"
		this.imgsrc = "/sites/all/themes/greenNblack/";
		
		//btnMute
		this.btnMute = document.createElement('input');
		this.btnMute.type = "button";
		this.btnMute.id = "btnMute";
		this.btnMute.value = "Mute Strings";
		this.btnMute.title = "Click here to mute a string.";
		this.btnMute.name = "btnMute";
		
		//btnNextChord
		this.btnNextChord = document.createElement('input');
		this.btnNextChord.type = "button";
		this.btnNextChord.id = "btnMutliNote1";
		this.btnNextChord.value = "Next Chord";
		this.btnNextChord.title = "add another chord to the tab";
		this.btnNextChord.name = "btnNextChord";
		
						//button next image
		this.btnnext = new Image();	
		this.btnnext.src = this.imgsrc + "images/img_trans.png";
		this.btnnext.id = "btnnext";
		this.btnnext.title = "Add another chord to the tab";
		$(this.btnnext).attr('class','control_button');
		this.btnnext.alt = "next";
		//this.btnnext.width = "125";
		//this.btnnext.height = "25";
		
				
				//button start chord image
		this.btnrecord = new Image();	
		this.btnrecord.src = this.imgsrc + "images/img_trans.png";
		this.btnrecord.id = "btnnc";
		this.btnrecord.title = "Start a New Chord";
		this.btnrecord.alt = "New Chord";
		$(this.btnrecord).addClass('rechord');
		//this.btnrecord.width = "125";
		//this.btnrecord.height = "25";
		
						//button end chord image
		this.btnendchrd = new Image();	
		this.btnendchrd.src = this.imgsrc + "images/img_trans.png";
		this.btnendchrd.id = "btnec";
		this.btnendchrd.title = "End Making a Chord";
		this.btnendchrd.alt = "End Chord";
		//this.btnendchrd.width = "125";
		$(this.btnendchrd).addClass('rechord');
		$(this.btnendchrd).addClass('hide');
		$(this.btnendchrd).hide();
		//this.btnendchrd.height = "25";
		
		//button return image
		this.btnreturn = new Image();	
		this.btnreturn.src = this.imgsrc + "images/button.gif";
		//this.btnv.id = "btnv";
		//this.btnv.title = "Vibrato'";
		this.btnreturn.alt = "return";
		this.btnreturn.width = "10";
		this.btnreturn.height = "10";
		
		this.table = document.createElement('table');
		this.table.border = "0";
		this.table.width = "150px";
		$(this.table).addClass('chord_table');
		//this.table.style.backgroundColor = "#999999";
		
		this.tr1 = document.createElement('tr');

		this.td1 = document.createElement('td');
		this.td1.style.backgroundColor = "#003366";
		this.td1.style.fontSize = "10px";
		this.td1.style.color = "#FFFFFF";
		this.td1.height="10";
		this.td1.align="left";
		
			this.helplink = document.createElement('a');
		this.helplink.setAttribute('class', 'tiny_help');
		this.helplink.setAttribute('target', 'help');
		this.helplink.setAttribute('href', 'http://blog.guitartabcreator.com/2008/04/creating-chords-on-guitar-tab-creator.html');
		this.helplink.innerHTML = "help";
		
		this.spanlabel = document.createElement('span');
	//	this.spanlabel.class="style7";
		this.spanlabel.id="lblcontrols";
		this.spanlabel.innerHTML = "Create Chords";
		$(this.spanlabel).append(this.helplink);
		
		$(this.td1).append(this.btnreturn);
		$(this.td1).append(this.spanlabel);
		$(this.tr1).append(this.td1);
	//	this.table.appendChild(this.tr1);
		
		this.tr2 = document.createElement('tr');
		this.td2 = document.createElement('td');
		$(this.td2).addClass("control_section");
		//this.td2.style.backgroundColor = "#999999";
		this.td2div = document.createElement('div');
		this.td2div.id="muteon";
		this.td2div.align="center";
		$(this.td2).append(this.td2div);
		$(this.tr2).append(this.td2);
		//this.tbody = document.createElement('tbody');
		$(this.table).append(this.tr1);
		$(this.table).append(this.tr2);
		//$(this.table).append(this.tbody);
		
		
		//table to format button positions
		this.tableFormat = document.createElement('table');
		this.tableFormat.border = "0";
		//this.tableFormat.width = "130px";
		//this.tableFormat.style.backgroundColor = "#999999";
		this.tableFormat.cellPadding = "0";
		this.tableFormat.cellSpacing = "0";
		this.tableFormat_tr1 = document.createElement('tr');

		this.tableFormat_td1 = document.createElement('td');
		//this.td1.style.backgroundColor = "#003366";
		this.tableFormat_td1.align="center";
		//this.tableFormat_td1.style.backgroundColor = "#999999";
	//	this.tableFormat_td1.appendChild(this.btnstart);
		$(this.tableFormat_tr1).append(this.tableFormat_td1);
		this.tableFormat_tr2 = document.createElement('tr');
		this.tableFormat_td3 = document.createElement('td');
		$(this.tableFormat_td3).attr('id','td3');
		//this.tableFormat_td3.style.backgroundColor = "#999999";
		this.tableFormat_td3.align="center";
		$(this.tableFormat_td3).append(this.btnnext);
		$(this.tableFormat_tr2).append(this.tableFormat_td3);
		
		this.tableFormat_tr3 = document.createElement('tr');
		this.tableFormat_td4 = document.createElement('td');
		$(this.tableFormat_td4).attr('id','td4');
		//this.tableFormat_td4.style.backgroundColor = "#999999";
		this.tableFormat_td4.align="center";
		$(this.tableFormat_td4).append(this.btnrecord);
		$(this.tableFormat_td4).append(this.btnendchrd);
		$(this.tableFormat_tr3).append(this.tableFormat_td4);
		
		this.tableFormat_tbody = document.createElement('tbody');
		$(this.tableFormat_tbody).append(this.tableFormat_tr3);
		//this.tableFormat_tbody.appendChild(this.tableFormat_tr1);
		$(this.tableFormat_tbody).append(this.tableFormat_tr2);
		$(this.tableFormat).append(this.tableFormat_tbody);
		//just keep the thing open
		$(this.td2div).append(this.tableFormat);
		//end table to format button positions
		//show chords
		$(this.td1).click(function(event){
			// this.ChngChord();
		});

		//record
		$(this.btnrecord).bind('click', {msg: this}, function(event){
			event.data.msg.tabcreator.chord =1;
			$(event.data.msg.btnrecord).addClass('hide');
			$(event.data.msg.btnrecord).hide();
			$(event.data.msg.btnendchrd).removeClass('hide');
			$(event.data.msg.btnendchrd).show();
			//$('#td4').html(event.data.msg.btnendchrd);		 
	});

			//end record
		$(this.btnendchrd).bind('click', {msg: this}, function(event){
			event.data.msg.StopRecording();
			//$('#td4').html(event.data.msg.btnrecord);
			$(event.data.msg.btnendchrd).addClass('hide');
			$(event.data.msg.btnendchrd).hide();
			$(event.data.msg.btnrecord).removeClass('hide');
			$(event.data.msg.btnrecord).show();
	});

	//next
		$(this.btnnext).bind('click', {msg: this}, function(event){
			event.data.msg.NextChord();
		});
		/*
		Event.observe($(this.btnnext), 'click', function(event){
			 this.NextChord();
		}.bindAsEventListener(this));
	*/
		this.NextChord = function (){
		if(this.tabcreator.ischord(this.tabcreator.tabcounter)){
			this.tabcreator.tabcounter += 1; 
		} else {
			alert("you have not created a chord yet");
		}
	}
	
	this.showControl= function(div){
		this.div = div;
		$(this.div).append(this.table);
	}
	
	this.StopRecording =  function(){
		//need to backfill the unused fret positions
			for(i=5;i>=0;i--){
				if( this.tabcreator.strings[i][this.tabcreator.tabcounter] == null){
							this.tabcreator.strings[i][this.tabcreator.tabcounter] = ".";
					}
			}
		
			this.tabcreator.chord =0;
			this.tabcreator.mute=0;

			if(this.tabcreator.ischord(this.tabcreator.tabcounter)){
				this.tabcreator.tabcounter += 1; //Spacing + tabcounter;
			}
}
	
	this.ChngChord = function ()
	{
		if(this.tabcreator.mute == 1){
		  new Effect.Highlight('muteon');
		  return;
		}
		if(this.spanlabel.innerHTML == "Click to open chord tool"){
			$(this.td2div).append(this.tableFormat);
			this.spanlabel.innerHTML = "Click to close chord tool";	
		}else{
			//need to backfill the unused fret positions
		//	Effect.BlindUp('muteon');
		this.StopRecording();
			$('muteon').innerHTML  = "";
		//	document.getElementById("muteoff").style.visibility = 'visible';
			//make sure to add on the extra
			this.spanlabel.innerHTML = "Click to open chord tool";
		}
		
	}
		

};
// JavaScript Document
function guitarfunctions(tctrl){
		this.tabcreator = tctrl;
		this.imgpath = "/sites/all/themes/greenNblack/";

//Hammer On Button
	this.btnh = new Image();	
	this.btnh.src = this.imgpath + "images/img_trans.png";
	this.btnh.id = "btnh";
	$(this.btnh).attr('class','btnh');
	this.btnh.title = "Use this to place a 'Hammer On'";
	this.btnh.alt = "Hammer On";
	
//Bend
	this.btnb = new Image();	
	this.btnb.src = this.imgpath + "images/img_trans.png";
	this.btnb.id = "btnb";
	$(this.btnb).attr('class','btnb');
	this.btnb.title = "Use this to bend the strings'";
	this.btnb.alt = "Bend";

//Pull Up
	this.btnp = new Image();	
	this.btnp.src = this.imgpath + "images/img_trans.png";
	this.btnp.id = "btnp";
	$(this.btnp).attr('class','btnp');
	this.btnp.title = "Use this button to pull up'";
	this.btnp.alt = "Pull Up";

//Release
	this.btnr = new Image();	
	this.btnr.src = this.imgpath + "images/img_trans.png";
	this.btnr.id = "btnr";
	$(this.btnr).attr('class','btnr');
	this.btnr.title = "Use this to Release the string'";
	this.btnr.alt = "Release";

//Slide Up
	this.btnfs = new Image();	
	this.btnfs.src = this.imgpath + "images/img_trans.png";
	this.btnfs.id = "btnfs";
	$(this.btnfs).attr('class','btnfs');
	this.btnfs.title = "Slide Up'";
	this.btnfs.alt = "Slide Up";
	
//Slide Down
	this.btnbs = new Image();	
	this.btnbs.src = this.imgpath + "images/img_trans.png";
	this.btnbs.id = "btnbs";
	$(this.btnbs).attr('class','btnbs');
	this.btnbs.title = "Slide Down'";
	this.btnbs.alt = "Slide Down";
	
//Vibrato
	this.btnv = new Image();	
	this.btnv.src = this.imgpath + "images/img_trans.png";
	this.btnv.id = "btnv";
	$(this.btnv).attr('class','btnv');
	this.btnv.title = "Vibrato'";
	this.btnv.alt = "Vibrato";
	
//Bar
	this.btnbar = new Image();	
	this.btnbar.src = this.imgpath + "images/img_trans.png";
	this.btnbar.id = "btnbar";
	$(this.btnbar).attr('class','btnbar');
	this.btnbar.title = "Bar'";
	this.btnbar.alt = "Bar";
	
//Rest
	this.btnrest = new Image();	
	this.btnrest.src = this.imgpath + "images/img_trans.png";
	this.btnrest.id = "btnrest";
	this.btnrest.title = "Rest";
	this.btnrest.alt = "Rest";
	
//Go Back
	this.btnback = new Image();	
	this.btnback.src = this.imgpath + "images/img_trans.png";
	this.btnback.id = "btnback";
	this.btnback.title = "Go Back";
	this.btnback.alt = "Go Back";
	
			//button return image
		this.btnreturn = new Image();	
		this.btnreturn.src = this.imgpath + "images/button.gif";
		//this.btnv.id = "btnv";
		//this.btnv.title = "Vibrato'";
		this.btnreturn.alt = "return";
		this.btnreturn.width = "10";
		this.btnreturn.height = "10";
	
		
		
		//hammer on
		$(this.btnh).bind('click', {msg: this}, function(event){
			// $('#btnh').attr('src',event.data.msg.imgpath + "images/btnh_hl.gif");										  
			$('#btnh').addClass("btnh_hl");
			event.data.msg.tabcreator.insertElem('h',$('#btnh'));
		});

		//bend
		$(this.btnb).bind('click', {msg: this}, function(event){
			 //$('#btnb').attr('src',event.data.msg.imgpath + "images/btnb_hl.gif");										  
			$('#btnb').addClass("btnb_hl");	
			event.data.msg.tabcreator.insertElem('b',$('#btnb'));
		});


		//pullup
		$(this.btnp).bind('click', {msg: this}, function(event){
			// $('#btnp').attr('src',event.data.msg.imgpath + "images/btnp_hl.gif");										  
			 $('#btnp').addClass("btnp_hl");
			 event.data.msg.tabcreator.insertElem('p',$('#btnp'));
		});

		//release
		$(this.btnr).bind('click', {msg: this}, function(event){
			// $('#btnr').attr('src',event.data.msg.imgpath + "images/btnr_hl.gif");										  
			$('#btnr').addClass("btnr_hl");
			event.data.msg.tabcreator.insertElem('r',$('#btnr'));
		});

		//slide up
		$(this.btnfs).bind('click', {msg: this}, function(event){
			// $('#btnfs').attr('src',event.data.msg.imgpath + "images/btnfs_hl.gif");										  
			$('#btnfs').addClass("btnfs_hl");
			event.data.msg.tabcreator.insertElem('/',$('#btnfs'));
		});
		
		//slide down
		$(this.btnbs).bind('click', {msg: this}, function(event){
			// $('#btnbs').attr('src',event.data.msg.imgpath + "images/btnbs_hl.gif");										  
			$('#btnbs').addClass("btnbs_hl");
			event.data.msg.tabcreator.insertElem('\\',$('#btnbs'));
		});

		//vibrato
		$(this.btnv).bind('click', {msg: this}, function(event){
			// $('#btnv').attr('src',event.data.msg.imgpath + "images/btnv_hl.gif");										  
			$('#btnv').addClass("btnv_hl");
			event.data.msg.tabcreator.insertElem('v');
		});

		//bar
		$(this.btnbar).bind('click', {msg: this}, function(event){									  
			 event.data.msg.tabcreator.AB();
		});

		//rest
		$(this.btnrest).bind('click', {msg: this}, function(event){							  
			 event.data.msg.tabcreator.AS();
		});

		//
		$(this.btnback).bind('click', {msg: this}, function(event){								  
			 event.data.msg.tabcreator.erase();
		});

	this.resetbuttons = function(){
		//$('#btnh').attr('src',this.imgpath + 'images/btnh.gif');
		$('#btnh').removeClass("btnh_hl");
		$('#btnp').removeClass("btnp_hl");//.attr('src',this.imgpath + 'images/btnp.gif');
		$('#btnb').removeClass("btnb_hl");//.attr('src',this.imgpath + 'images/btnb.gif');	
		$('#btnr').removeClass("btnr_hl");//.attr('src',this.imgpath + 'images/btnr.gif');	
		$('#btnfs').removeClass("btnfs_hl");//.attr('src',this.imgpath + 'images/btnfs.gif');	
		$('#btnbs').removeClass("btnbs_hl");//.attr('src',this.imgpath + 'images/btnbs.gif');
		$('#btnv').removeClass("btnv_hl");//.attr('src',this.imgpath + 'images/btnv.gif');
	}
	

	this.allbuttons = function(div){
		this.div = div;
		this.table = document.createElement('table');
		
	this.table.border = "0";
		this.table.width = "100%";
		this.table.style.backgroundColor = "#999999";
		
		this.tbody = document.createElement('tbody');
		
		this.tr1 = document.createElement('tr');

		this.td1 = document.createElement('td');
		this.td1.style.backgroundColor = "#003366";
		this.td1.style.fontSize = "10px";
		this.td1.style.color = "#FFFFFF";
		this.td1.height="10px";
		this.td1.width = "118px";
		this.td1.align="left";
			
			this.helplink = document.createElement('a');
		this.helplink.setAttribute('class', 'tiny_help');
		this.helplink.setAttribute('target', 'help');
		this.helplink.setAttribute('href', 'http://blog.guitartabcreator.com/2010/02/how-to-add-hammer-on-pull-offs-bends.html');
		this.helplink.innerHTML = "help";
		
		this.spanlabel = document.createElement('span');
	//	this.spanlabel.class="style7";
		this.spanlabel.id="lblcontrols";
		this.spanlabel.innerHTML = "Tab Controls";
		$(this.spanlabel).append(this.helplink);
	
		$(this.td1).append(this.btnreturn);
		$(this.td1).append(this.spanlabel);	
		
		this.tr2 = document.createElement('tr');
		this.td2 = document.createElement('td');
		this.td2.style.backgroundColor = "#999999";
		this.td2div = document.createElement('div');
		this.td2div.id="crtls";
		this.td2div.align="center";
		
		$(this.td2div).append(this.btnh);
		$(this.td2div).append(this.btnb);
		$(this.td2div).append(this.btnp);
		$(this.td2div).append(this.btnr);
		$(this.td2div).append(document.createElement('br'));
		$(this.td2div).append(this.btnfs);
		$(this.td2div).append(this.btnbs);
		$(this.td2div).append(this.btnv);
		$(this.td2div).append(this.btnbar);
		$(this.td2div).append(document.createElement('br'));
		$(this.td2div).append(this.btnrest);
		$(this.td2div).append(this.btnback);
		

		$(this.tr1).append(this.td1)
		$(this.td2).append(this.td2div);
		$(this.tr2).append(this.td2);
		
		$(this.tbody).append(this.tr1);
		$(this.tbody).append(this.tr2);
		$(this.table).append(this.tbody);
		
		//this.table.appendChild(this.tr2);
		$(this.div).append(this.table);
	
	}


	//	this.div.appendChild(btnh);

};

// JavaScript Document
/**********
* Copyright 2007 Gregg B Larson
* All Rights reserved
***********/

function tabcontrol(tctrl){
		this.tabcreator = tctrl;
		this.ssLabel = document.createElement('label');
		this.ssLabel.innerHTML = "Spacing";
		
		//the Spacing dropdown
		this.selSpace = document.createElement('select');
		this.selSpace.name = "selSpace";
		this.selSpace.id = "selSpace";
		this.selSpace.options[0] = new Option("1", "2",false);
		this.selSpace.options[1] = new Option("2", "3",true);
		this.selSpace.options[1].selected = true;
		this.selSpace.options[2] = new Option("3", "4",false);
		this.selSpace.options[3] = new Option("4", "5",false);
		this.selSpace.options[4] = new Option("5", "6",false);
		
	//Clipboard button
		this.btnForum = document.createElement('input');
		this.btnForum.value = "Format for Forums";
		this.btnForum.type = "button";
		this.btnForum.id = "btnForum";
		this.btnForum.title = "Format tab to be used in forums like phpbb or vbulletin.";
		this.btnForum.name = "btnForum";
		
		this.chkForum = document.createElement('input');
	this.chkForum.type = 'checkbox';
	this.chkForum.name = 'ForumFormat';
	this.chkForum.id = 'ForumFormat';
	this.chkForum.defaultChecked = false;
	this.chkForum.value = 'Format for Forums';
	this.chkForum.title = "Format tab to be used in forums like phpbb or vbulletin.";
	
	this.spanlabel = document.createElement('span');
		this.spanlabel.id="lbltiming";
		this.spanlabel.innerHTML = "Forum Format";

		
		//Clipboard button
		/*this.btnClipboard = document.createElement('input');
		this.btnClipboard.value = "Copy Tab to Clipboard";
		this.btnClipboard.type = "button";
		this.btnClipboard.id = "btnClipboard";
		this.btnClipboard.title = "If you are using IE, it will copy to the clipboard, for everyone else, it will highlight it and you have to manually copy it.";
		this.btnClipboard.name = "btnClipboard";
		*/
				//btnEmail
		//this.btnEmail = document.createElement('input');
		//this.btnEmail.type = "button";
		//this.btnEmail.id = "btnEmail";
		//this.btnEmail.value = "Email Tab";
		//this.btnEmail.title = "Email the tab.";
		//this.btnEmail.name = "btnEmail";
		
		//btnClear
		this.btnClear = document.createElement('input');
		this.btnClear.type = "button";
		this.btnClear.id = "btnClear";
		this.btnClear.value = "Start Over";
		this.btnClear.title = "Click here to start over with a new tab.";
		this.btnClear.name = "btnClear";
			
		//btnRF
		this.btnRF = document.createElement('input');
		this.btnRF.type = "button";
		this.btnRF.id = "btnRF";
		this.btnRF.value = "Refresh Fretboard";
		this.btnRF.title = "clear data";
		this.btnRF.name = "btnRF";	
				
		//btnsave
		this.btnsave = document.createElement('input');
		this.btnsave.type = "button";
		this.btnsave.id = "btnsave";
		this.btnsave.value = "Save";
		this.btnsave.title = "save your tab as a cookie";
		this.btnsave.name = "btnsave";	
						
		//btnrecall
		//this.btnrecall = document.createElement('input');
		//this.btnrecall.type = "button";
		//this.btnrecall.id = "btnrecall";
		//this.btnrecall.value = "Load";
		//this.btnrecall.title = "Use this to retrieve the tab you saved";
		//this.btnrecall.name = "btnrecall";	
		
		//btnAddRow
		this.btnAddRow = document.createElement('input');
		this.btnAddRow.type = "button";
		this.btnAddRow.id = "btnAddRow";
		this.btnAddRow.value = "New Row";
		this.btnAddRow.title = "Add another Row to the tab.  Note: You will not be able to edit the tab after this action.";
		this.btnAddRow.name = "btnAddRow";	
		
		//btnPlayback
		this.btnPlayback = document.createElement('input');
		this.btnPlayback.type = "button";
		this.btnPlayback.id = "btnPlayback";
		this.btnPlayback.value = "Numbering";
		this.btnPlayback.title = "Show the sequence to play the tab";
		this.btnPlayback.name = "btnPlayback";	
		
		//btnFacebook
		//this.btnFacebook = document.createElement('input');
		//this.btnFacebook.type = "button";
		//this.btnFacebook.src = "/images/fb_share.png";
		//this.btnFacebook.id = "btnFacebook";
		//this.btnFacebook.value = "Share Tab on Facebook";
		//this.btnFacebook.title = "Share your tab to facebook";
		//this.btnFacebook.name = "btnFacebook";
		
		//help link
		this.helplink = document.createElement('a');
		this.helplink.setAttribute('class', 'help');
		this.helplink.setAttribute('target', 'help');
		this.helplink.setAttribute('href', '/help/using-tab-controls');
		this.helplink.innerHTML = "help";
		

		this.allbuttons = function(div){
			this.div = div;
			//put em all in the div
			$(this.div).append(this.ssLabel);
			$(this.div).append(this.selSpace);
			//this.div.appendChild(this.btnClipboard);
			$(this.div).append(this.chkForum);
			$(this.div).append(this.spanlabel);		
			$(this.div).append(this.btnClear);
			//this.div.appendChild(this.btnRF);
			//$(this.div).append(this.btnsave);
			$(this.div).append(this.btnrecall);
			//$(this.div).append(this.btnEmail);
			$(this.div).append(this.btnAddRow);
			$(this.div).append(this.btnPlayback);
			$(this.div).append(this.btnFacebook);
			$(this.div).append(this.helplink);
	
			//these are the event captures for each control
			/*
			$(this.btnFacebook).click(function(event){
				//callPublish('',null,null);
				return false;
			});
			
			Event.observe($(this.btnFacebook), 'click', function(event){
				callPublish('',null,null);
				return false;
			}.bindAsEventListener(this.tabcreator));
			*/
			$('#selSpace').bind('change', {msg: this}, function(event){
				event.data.msg.Spacing = event.currentTarget.value;
				 event.data.msg.tabcreator.printtab(0);
			});

			//press the clipboard
			/*
			$(this.btnClipboard).click(function(event){
				  if (this.tabout.createTextRange) 
				  {
					var range = this.tabout.createTextRange();
					if (range && BodyLoaded==1)
					  range.execCommand('Copy');
				  } else 
				  {
					var flashcopier = 'flashcopier';
					if(!document.getElementById(flashcopier)) {
					  var divholder = document.createElement('div');
					  divholder.id = flashcopier;
					  document.body.appendChild(divholder);
					}
					document.getElementById(flashcopier).innerHTML = '';
					var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+encodeURIComponent(this.tabout.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
					document.getElementById(flashcopier).innerHTML = divinfo;
				  }
			});
			*/
			/*
			Event.observe($(this.btnClipboard), 'click', function(event){
				  if (this.tabout.createTextRange) 
				  {
					var range = this.tabout.createTextRange();
					if (range && BodyLoaded==1)
					  range.execCommand('Copy');
				  } else 
				  {
					var flashcopier = 'flashcopier';
					if(!document.getElementById(flashcopier)) {
					  var divholder = document.createElement('div');
					  divholder.id = flashcopier;
					  document.body.appendChild(divholder);
					}
					document.getElementById(flashcopier).innerHTML = '';
					var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+encodeURIComponent(this.tabout.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
					document.getElementById(flashcopier).innerHTML = divinfo;
				  }
			}.bindAsEventListener(this.tabcreator));
			*/
			//StartOver
			$(this.btnClear).bind('click', {msg: this}, function(event){
				if(confirm("Continuing will delete your current work.  Are you sure you want to continue?")){									
					event.data.msg.tabcreator.SO();
				}
			});
/*
			$(this.btnEmail).bind('click', {msg: this}, function(event){
				//event.data.msg.tabcreator.email();
			});
*/
			//save tab to harddrive
			/*
			$(this.btnsave).bind('click', {msg: this}, function(event){
				event.data.msg.tabcreator.savetab();
			});
			*/
			/*
			Event.observe($(this.btnsave), 'click', function(event){
				 this.savetab();
			}.bindAsEventListener(this.tabcreator));
			*/
			
			//retrieve tab from HD
			$(this.btnrecall).bind('click', {msg: this}, function(event){
				//event.data.msg.recall();
			});
			/*
			Event.observe($(this.btnrecall), 'click', function(event){
				 this.recall();
			}.bindAsEventListener(this.tabcreator));
			*/
			//respond to format forum check
			$(this.chkForum).bind('click', {msg: this}, function(event){
				//event.data.msg.tabcreator.formatForum();
			});
			
			//add row
			$(this.btnAddRow).bind('click', {msg: this}, function(event){
				if(confirm("You will not be able to go back and edit the previous line.  Are you sure you want to continue?")){		
					event.data.msg.tabcreator.NL();
				}
			});

			//show numbers 
			$(this.btnPlayback).bind('click', {msg: this}, function(event){
				event.data.msg.tabcreator.InitializeTimer();
			});

		}
		
}

;
// JavaScript Document
function tabcreator(div,txtarea,tabjson,tabhist){
		
		this.div = div;
		this.tabctrl = new tabcontrol(this);
		this.tabfunk = new guitarfunctions(this);
		this.chords = new Chords(this);
		this.scales =  new Scales(this);
		this.inst = new guitar(this);
		this.timing = new timing(this);
		
		this.Spacing;
		this.selString;
		this.spacer = "-";
		this.notes = new Array("E","A","D","G","B","E");
		this.tabfooter = "\t\t\t\t\t\t\thttp://www.guitartabcreator.com";
		this.chord = 0;
		this.mute = 0;
		
		//this.tracecount = 0;

		this.secs = 0;
		this.timerID = null;
		this.timerRunning = false;
		this.delay = 1000;
		this._insertelem = 0;
		this.bDone = false;
		this.instrument;
		
		this.tablegend = "(/) Slide Up  (\\) Slide Down  (h) Hammer On  (p) Pull Off  (b) Bend (r) Release (v) Vibrato\r\n";
		this.tablegend = "(/) Slide Up  (\\) Slide Down  (h) Hammer On  (p) Pull Off  (b) Bend (r) Release (v) Vibrato\r\n";
		if(txtarea != null){
			//this.tabout = '#' + $(txtarea).attr('id');
			this.tabout = txtarea;
			$(this.tabout).addClass('taboutput');
			//$(this.tabout).attr("disabled", "disabled");//.attr('readonly','readonly');
		} else {
			this.tabout = document.createElement('textarea');
			this.tabout.id = "taboutput";
			this.tabout.className = "taboutput";
			this.tabout.name = "textarea";
			this.tabout.cols = "95";
			this.tabout.rows = "16";
			//make textarea read only
			//$(this.tabout).attr("disabled", "disabled");//.attr('readonly','readonly');

		}
		//this.googlead = "<script type=\"text/javascript\"><!--google_ad_client = \"pub-4367478993079936\";/* 728x90, created 3/16/08 */google_ad_slot = \"4402083990\";google_ad_width = 728;google_ad_height = 90;google_cpa_choice = \"\"; // on file//-->// --&gt;// --&gt;// --&gt;// --&gt;</script><script type=\"text/javascript\" src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\"></script>";
		$(this.div).append(this.tabout);
		//this.div.appendChild(this.googlead);
		
		this.elems = new Array("/","\\","^","h","p","b","v","r");
		this.tracemax = 50;

		this.control = new Array(this.tracemax);
		this.strings = new Array(6);
		
		this.createStrings = function(){
			this.strings = new Array(6);
			this.strings[0] = new Array();
			this.strings[1] = new Array();
			this.strings[2] = new Array();
			this.strings[3] = new Array();
			this.strings[4] = new Array();
			this.strings[5] = new Array();
			this.tabcounter = 0;
		}

		this.formatfooter = function(bVal){
			if(bVal){
				return("[url]http://www.guitartabcreator.com[/url]");
			} else {
				return("\t\t\t\t\t\t\thttp://www.guitartabcreator.com");
			}
		}
		
		this.insertElem = function (sVal, objBtn){
			//this.timing.addtoarray(this.tabcounter,true);
			if (this._insertelem == 1){
				alert("Please select a note before inserting another Element");
				 $(objBtn).src = "images/" + $(objBtn).id + ".gif";	
				return;
			}
			if ( this.tabcounter == 0){
				alert("You must place a note before you place an element");
				$(objBtn).src = "images/" + $(objBtn).id + ".gif";		
				return;
			}	
			if(this.chord == 1){
				alert("You cannot add an element while creating a chord");
				$(objBtn).src = "images/" + $(objBtn).id + ".gif";		
				return;
			}

			if (this.tabcounter <= this.tracemax){
				this.strings[this.selString][this.tabcounter] = sVal;
				//backfill other strings with .
						for(i=0;i<=5;i++){
							if(this.strings[i][this.tabcounter] == null){
								this.strings[i][this.tabcounter] = ".";
							}
						}
				this.tabcounter += 1;
				if(sVal != "v"){
					this._insertelem = 1;	
				}
			}
			this.printtab(0);
		}	
		
		this.addcodewrapper = function(type,bVal){
			if(bVal){
				if(type == 'begin'){
					return("[code]"+ this.cr);
				} else if(type == 'end') {
					return("[/code]"+ this.cr);
				} else {
					return("");
				}
			} else {
				return("");
			}
		}
		
				this.isElem = function (strchr){
			var i;
			var z = 0;
			for(i=0;i<this.elems.length;i++){
				if(strchr == this.elems[i]){
					z=1;
				}
			}
			if(z){
				return true;
			} else {
				return false;
			}
		}

		this.ElemVal = function(index){
				//scan the index and next two columns for an element
				if(index >= this.tabcounter){
					return false;
				}
				var bval = false;
				for(i=5;i>=0;i--){
					if(this.isElem(this.strings[i][index])){
						bval = true;
					} else if(this.isElem(this.strings[i][index+1])){
						bval = true;
					}
				}
				return bval;	
		}

		
		this.addspace = function(j){
			var tmpstring = "";
				if(!this.ElemVal(j)){
					tmpstring = tmpstring + this.spacey();
				}
			return tmpstring;
		}
		
		
		this.S2N = function (val){
			
			if(val != "."){
				return parseInt(val);
			} else {
				return 0;
			}
		}

		this.spacey = function(type){
			var j;
			var sF = "";
			var space_type;
			if(type==null){
				space_type = this.spacer;
			} else {
				space_type = type;
			}
			if($('#selSpace').length > 0){
				spaceopt = $('#selSpace option:selected').text();
			} else {
				spaceopt = 2;
			}
			for(j=0;j<parseInt(spaceopt);j++){ 
				sF = sF + space_type; //this.spacer;
			}
			return sF;
		}
		
		this.iselem = function (wb,k){
				for(i=5;i>=0;i--){
					if(this.isElem(this.strings[i][wb])){
						if(k != i){
							return true;
						}
					} 
				}
			return false; 
		}
		
		this.hasvib =  function (wb){
				for(i=5;i>=0;i--){
					if(this.strings[i][wb] == "v"){
							return true;
					} 
				}
			return false; 
		}
		 this.hasrest = function (wb){
				for(i=5;i>=0;i--){
					if(this.strings[i][wb] == "_"){
							return true;
					} 
				}
			return false; 
		}
		
		this.ischord = function (wb){
			var count=0;
				for(i=5;i>=0;i--){
					if(this.strings[i][wb] != "." && this.strings[i][wb] != null){
							count+=1;
					}
				}
			if(count>1){
				return true;
			} else{
				return false;
			} 
		}
		
		this.hasnote = function (wb){
			var count=0;
				for(i=5;i>=0;i--){
					if(this.strings[i][wb] != "." && this.strings[i][wb] != null && !this.isElem(this.strings[i][wb])){
							count+=1;
					}
				}
			if(count>=1){
				return true;
			} else{
				return false;
			} 
		}
		
		this.isbig = function (wb,k){
				for(i=5;i>=0;i--){
					if(String(this.strings[i][wb]).length > 1){
						if(String(this.strings[i][wb]).charAt(0) != "x"){
							return true;
						}
					}
				}
			return false; 
		}



		this.tostring = function(i){
			var tmpstring = "";
			var j;
				for(j=0;j<=this.tabcounter;j++){
					if(this.strings[i][j] != null){
					if(this.iselem(j,i)){
						if(this.hasvib(j)){
							tmpstring = tmpstring + this.spacer + this.spacey();
						} else {
							tmpstring = tmpstring + this.spacer;// + this.spacey();
						}
					} else if(this.isbig(j,i)){
						if(this.ischord(j,i)){
							if(this.strings[i][j] == "."){
								tmpstring = tmpstring + this.spacer + this.spacer;
							} else if(String(this.strings[i][j]).indexOf('x') >= 0){
								tmpstring = tmpstring + String(this.strings[i][j]).substring(0,1) + this.spacer; // + String(strings[i][j]).substring(1)
							} else {
								if(this.S2N(this.strings[i][j]) <= 9){
									tmpstring = tmpstring + this.strings[i][j] + this.spacer;
								} else {
									tmpstring = tmpstring + this.strings[i][j];
								}
							}
						} else {
							if(this.strings[i][j] == "."){
								tmpstring = tmpstring + this.spacer + this.spacer;
							} else {
									tmpstring = tmpstring + this.strings[i][j];
							}
						}
						tmpstring += this.addspace(j);
					} else if(this.S2N(this.strings[i][j]) < 10){
		
						if(this.ischord(j,i)){
							if(this.strings[i][j] == "."){
								tmpstring = tmpstring + this.spacer;
							}else {	
								tmpstring = tmpstring + this.strings[i][j];
							}
						} else {
							if(this.strings[i][j] == "."){
								tmpstring = tmpstring + this.spacer;
							}  else {
								tmpstring = tmpstring + this.strings[i][j];
							}
						}
						tmpstring += this.addspace(j);
					}else if(String(this.strings[i][j]).indexOf('x') >= 0){
								tmpstring = tmpstring + String(this.strings[i][j]).substring(0,1) + this.spacey(); // + String(strings[i][j]).substring(1)
					} else if(this.strings[i][j] == "."){
							tmpstring = tmpstring + this.spacer;
					} else if(this.strings[i][j] == "|"){
								tmpstring = tmpstring + this.strings[i][j] + this.spacey();
					}  else if(this.strings[i][j] == "v"){
								tmpstring = tmpstring + this.strings[i][j] + this.spacey();
					}  else if(this.strings[i][j] == "_"){
								tmpstring = tmpstring + this.spacey();
					}  else { 
						tmpstring = tmpstring + this.strings[i][j];
					}
				}
			}
			
			return(tmpstring);
		}
		
		this.printtab = function(){
			var i,j;
			var staging = "";
				for(i=5;i>=0;i--){
					staging = staging + this.notes[i] + "|" + this.spacey() + this.tostring(i)  + this.cr; //"|" + 
				}
			//format forum check
			//$('#taboutput')

				$(this.tabout).val(this.addcodewrapper('begin',$('#ForumFormat').is(':checked')) + this.tablegend + this.timing.showlegend() + this.tabhistory  + this.cr + this.timing.tostring() + this.cr + staging + this.addcodewrapper('end',$('#ForumFormat').is(':checked')) +  this.formatfooter($('#ForumFormat').is(':checked')));
				$(this.tabout).scrollTop = $(this.tabout).scrollHeight;
				$('#edit-field-tab-json-0-value').val(JSON.stringify(this.strings));
				
		}
		
		this.PB = function (){
			this.printtab(0);
			var count = 1;
			var strID;
			var i,j;
			for(j=0;j<=this.tabcounter;j++){
				for(i=5;i>=0;i--){
					if(this.strings[i][j] !=  null){
						if(this.strings[i][j] !=  "."){
							if(isNaN(this.strings[i][j])){
								if(String(this.strings[i][j]).indexOf('x') >= 0){
									if(String(this.strings[i][j]).length == 2){
										strID = "#" + (i+1) + "" + String(this.strings[i][j]).substring(1,2);
									} else if(String(this.strings[i][j]).length == 3){
										strID = "#" + (i+1) + "" + String(this.strings[i][j]).substring(1,3);
									}
								}  else {
									strID = "#" + (i+1) + "" + String(this.strings[i][j+1]);
								}
							} else {
								strID = "#" + (i+1) + "" + String(this.strings[i][j]);
							}
							var strElem = "#note_" + (i+1) + "" + String(this.strings[i][j]);
							if(String(this.strings[i][j]).indexOf('x') >= 0){
									$(strElem).html("X");
							}
							if($(strElem) != null){
								//$(strElem).addClass('noteblue');
								$(strElem).addClass('showscale');
							}
						}
					}
				}
			}
		}
		
		this.cr = "\r\n";
		if(tabhist != null){
			this.tabhistory = $(tabhist).val();
		} else {
			this.tabhistory = "";
		}
		
		
		this.addinst = function(type){
			this.instrument = type;
			debug(this.instrument.echo());
			
		}
		
		//format forum
		
		this.formatForum = function(){
			this.printtab(0);
		}
		
		this.email = function(){
			var i,j;
			var staging = "";
				for(i=5;i>=0;i--){
					staging = staging + this.notes[i] + "|" + this.spacey() + this.tostring(i)  + "%0D%0A"; //"|" + 
				}

			var ebody = this.tablegend + "%0D%0A" + "%0D%0A" + this.tabhistory.replace(/\r\n/g,"%0D%0A")  + "%0D%0A" + staging + "%0D%0A" + this.tabfooter;
			window.location.href = 'mailto:?body='+ebody+'';
			return false;
		}
		
		this.adddiv = function(vDiv){
			this.div = vDiv;
		}
	
		this.addcontrol = function(div){
			this.tabctrl.div = div;
			this.tabctrl.allbuttons();
		}
	
		
		this.autopop = function(){
			var i,j;
			for(i=0;i<=5;i++){
				while(this.strings[i].length != 0)
				{
					this.strings[i].pop();
				}
			}
		}
		
		this.tabbit = function(a,b) {
			var i,k,l;
			//k=a[0]-1;
			//l=a[1];
			k=a-1;
			l=b;
			if (this._insertelem == 1 && k != this.selString){
				alert("you must choose a note on the same string as the Symbol you just entered");
			} else {
				if (this.tabcounter <= this.tracemax){
					//this will place the initial value
					if(this.mute == 1){
						this.strings[k][this.tabcounter] = 'x' + l;
					} else {
						this.strings[k][this.tabcounter] = l;
					} 
					//fill in every other k with a "." when //not making chords
					if(!this.chord){
						for(i=0;i<=5;i++){
							if(i != k){
								this.strings[i][this.tabcounter] = ".";
							}
						}
					} else{
						//look for numbers and leave alone
						for(i=0;i<=5;i++){
							if(this.strings[i][this.tabcounter] == null){
								this.strings[i][this.tabcounter] = ".";
							}
						}
					}
					this.timing.addtoarray(this.tabcounter,false);
					this.tabcounter +=1;
					if(this.chord == 1){
						this.tabcounter-=1;
			
					}
						this._insertelem = 0;
						this.tabfunk.resetbuttons();
				}

				this.selString = k; 
				if(!this.scales.isopen){
					this.inst.ClrBrd(0);
				}
				this.PB(0);
			}
		
		}
		
		this.printfb = function(){
			var i,j;
			var staging = "";
			var retarray = "{"; //new Array();
			var jsonObj = {};


				for(i=5;i>=0;i--){
					staging = staging + this.notes[i] + "|" + this.spacey() + this.tostring(i) + "\n"; // + this.cr; //"|" + 
					retarray += '"' + this.notes[i] + '" : "'+ '|' + this.spacey() + this.tostring(i) +'",';		   
					//retarray +=  this.notes[i] + ':' + "'|" + this.spacey() + this.tostring(i) +"',";		   
					jsonObj[this.notes[i]] = '|' + this.spacey() + this.tostring(i);
					//retarray[this.notes[i] + i] = this.spacey() + this.tostring(i);
				}
				retarray += "}";

				return(jsonObj);
		}
		

		
		
		
		this.erase = function (){
			var i,j,k;

			if (this.tabcounter > 0){
				for(i=5;i>=0;i--){
					this.strings[i][this.tabcounter-1] = ".";
				}
				this.inst.ClrBrd(0);
				this.PB(0);
				this.tabcounter -=1;
			}

		//	this.printtab(0);
			
		}
		
		this.AB = function (){
			var i;
			for(i=5;i>=0;i--){
				this.strings[i][this.tabcounter] = "|";
			}
			this.tabcounter +=1;
			this.printtab(0);
			$(this.tabfunk.btnbar).src = "images/btnbar.gif";
		}

		this.AS = function (){
			var i;
			if(!this._insertelem){
				for(i=5;i>=0;i--){
					this.strings[i][this.tabcounter] = "_";
				}
				this.tabcounter +=1;
				this.printtab(0);
			}
		}
		
		this.SO = function (){
			//start over
			this.inst.ClrBrd(0);
			for(i=5;i>=0;i--){
				while(this.strings[i].length != 0)
				{
					this.strings[i].pop();	
				}
			}
			this.tabhistory ="";
			this.tabcounter = 0;
			this.printtab(0);	
		}
		

		
	this.NL = function (){
		//newline
			var i;
			var staging = "";
			for(i=5;i>=0;i--){
				staging = staging + this.notes[i] + "|" + this.spacey() + this.tostring(i)  + this.cr; //"|" + 
			}
			this.tabhistory = this.tabhistory + this.cr + this.timing.tostring("history") + this.cr + staging + this.cr;
			this.tabcounter = 0;
			$('#edit-field-tab-history-0-value').val(this.tabhistory);
			//alert(escape($(this.strings).toJSON()));
			//var timestamp = Math.round(date.getTime() / 1000);
			/*
			var node_object = {
					"type": "guitar_tab",
					"nid": 0,  // Set value to 0 for node.save. Use nid (int) for node.update
					"uid": 1, 
					"name": "admin",
					"title": "My First Node",
					"body": "Hello World!",
					"status": 1 // Set to 1 for Published. O for unpublished.
			};
			
			
			var dataObj = {
        		"method" : "node.save",
        		 "node" : node_object
			}
			//alert(Object.toJSON(dataObj));
			new Ajax.Request('http://www.tabdit.com/?q=services/json', {
				method: 'get',
				contentType: "text/x-json",
				parameters: "strJSON=" + Object.toJSON(dataObj),
				});
			*/
			this.clean(0);
	}
		
		this.clean = function (){
			this.inst.ClrBrd(0);
			this.autopop(0);
			this.printtab(0);
			this._insertelem=0;
		}
		
		this.savetab = function(){
			this.createCookie('gtc_history', $.toJSON(this.tabhistory),365);
  			this.createCookie('gtc_staging', $.toJSON(this.strings),365);
		}

		this.recall = function(){
			for(var i=0;i<=5;i++){
				for(var j=0;j<=this.tabcounter;j++){
					this.strings[i][j] = ".";
				}
			}
			this.strings = this.readCookie('gtc_staging').evalJSON();
			this.tabcounter = this.strings[1].length;
			this.tabhistory = this.readCookie('gtc_history').evalJSON();
			this.PB(0);
		}

		this.createCookie = function (name,value,days) {
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}
			else var expires = "";
			document.cookie = name+"="+value+expires+"; path=/";
			}

		this.readCookie = function (name)
		{
		  var ca = document.cookie.split(';');
		  var nameEQ = name + "=";
		  for(var i=0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
			}
		  return null;
		}
	
		this.eraseCookie = function (name)
		{
		  this.createCookie(name, "", -1);
		}
		
		this.InitializeTimer = function ()
		{
			var i,j;
			for(j=this.tracemax;j>0;j--){
				for(i=5;i>=0;i--){
								var tick = this.tracemax-j;
								if(tick<=this.tabcounter && this.strings[i][tick] != "." && this.strings[i][tick] != null){
									var strID = (i+1) + "" +  this.strings[i][tick];
									var strElem = "#notetitle_" + strID;
									$(strElem).html(tick+1);
								}
					}
			}
		}	
		
		if(tabjson != null){
			if(tabjson.val() != ""){
				this.obj = JSON.parse(tabjson.val());
				$('#debug').html("test");
				this.strings = 	JSON.parse(tabjson.val());
				this.tabcounter = $(this.strings[0]).length;
			} else{
				this.createStrings();
			}
		} else {
			this.createStrings();
		}	

}


;
/*
    http://www.JSON.org/json2.js
    2011-02-23

    Public Domain.

    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

    See http://www.JSON.org/js.html


    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html

    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.


    This file creates a global JSON object containing two methods: stringify
    and parse.

        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.

            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.

            space       an optional parameter that specifies the indentation
                        of nested structures. If it is omitted, the text will
                        be packed without extra whitespace. If it is a number,
                        it will specify the number of spaces to indent at each
                        level. If it is a string (such as '\t' or '&nbsp;'),
                        it contains the characters used to indent at each level.

            This method produces a JSON text from a JavaScript value.

            When an object value is found, if the object contains a toJSON
            method, its toJSON method will be called and the result will be
            stringified. A toJSON method does not serialize: it returns the
            value represented by the name/value pair that should be serialized,
            or undefined if nothing should be serialized. The toJSON method
            will be passed the key associated with the value, and this will be
            bound to the value

            For example, this would serialize Dates as ISO strings.

                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n < 10 ? '0' + n : n;
                    }

                    return this.getUTCFullYear()   + '-' +
                         f(this.getUTCMonth() + 1) + '-' +
                         f(this.getUTCDate())      + 'T' +
                         f(this.getUTCHours())     + ':' +
                         f(this.getUTCMinutes())   + ':' +
                         f(this.getUTCSeconds())   + 'Z';
                };

            You can provide an optional replacer method. It will be passed the
            key and value of each member, with this bound to the containing
            object. The value that is returned from your method will be
            serialized. If your method returns undefined, then the member will
            be excluded from the serialization.

            If the replacer parameter is an array of strings, then it will be
            used to select the members to be serialized. It filters the results
            such that only members with keys listed in the replacer array are
            stringified.

            Values that do not have JSON representations, such as undefined or
            functions, will not be serialized. Such values in objects will be
            dropped; in arrays they will be replaced with null. You can use
            a replacer function to replace those with JSON values.
            JSON.stringify(undefined) returns undefined.

            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.

            If the space parameter is a non-empty string, then that string will
            be used for indentation. If the space parameter is a number, then
            the indentation will be that many spaces.

            Example:

            text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'


            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'

            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    'Date(' + this[key] + ')' : value;
            });
            // text is '["Date(---current time---)"]'


        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.

            The optional reviver parameter is a function that can filter and
            transform the results. It receives each of the keys and values,
            and its return value is used instead of the original value.
            If it returns what it received, then the structure is not modified.
            If it returns undefined then the member is deleted.

            Example:

            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.

            myData = JSON.parse(text, function (key, value) {
                var a;
                if (typeof value === 'string') {
                    a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
                    if (a) {
                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
                    }
                }
                return value;
            });

            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
                var d;
                if (typeof value === 'string' &&
                        value.slice(0, 5) === 'Date(' &&
                        value.slice(-1) === ')') {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });


    This is a reference implementation. You are free to copy, modify, or
    redistribute.
*/

/*jslint evil: true, strict: false, regexp: false */

/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    lastIndex, length, parse, prototype, push, replace, slice, stringify,
    test, toJSON, toString, valueOf
*/


// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

var JSON;
if (!JSON) {
    JSON = {};
}

(function () {
    "use strict";

    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }

    if (typeof Date.prototype.toJSON !== 'function') {

        Date.prototype.toJSON = function (key) {

            return isFinite(this.valueOf()) ?
                this.getUTCFullYear()     + '-' +
                f(this.getUTCMonth() + 1) + '-' +
                f(this.getUTCDate())      + 'T' +
                f(this.getUTCHours())     + ':' +
                f(this.getUTCMinutes())   + ':' +
                f(this.getUTCSeconds())   + 'Z' : null;
        };

        String.prototype.toJSON      =
            Number.prototype.toJSON  =
            Boolean.prototype.toJSON = function (key) {
                return this.valueOf();
            };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
            var c = meta[a];
            return typeof c === 'string' ? c :
                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"' : '"' + string + '"';
    }


    function str(key, holder) {

// Produce a string from holder[key].

        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

// What happens next depends on the value's type.

        switch (typeof value) {
        case 'string':
            return quote(value);

        case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

            return isFinite(value) ? String(value) : 'null';

        case 'boolean':
        case 'null':

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.

            return String(value);

// If the type is 'object', we might be dealing with an object or an array or
// null.

        case 'object':

// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.

            if (!value) {
                return 'null';
            }

// Make an array to hold the partial results of stringifying this object value.

            gap += indent;
            partial = [];

// Is the value an array?

            if (Object.prototype.toString.apply(value) === '[object Array]') {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                v = partial.length === 0 ? '[]' : gap ?
                    '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
                    '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }

// If the replacer is an array, use it to select the members to be stringified.

            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    if (typeof rep[i] === 'string') {
                        k = rep[i];
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {

// Otherwise, iterate through all of the keys in the object.

                for (k in value) {
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

            v = partial.length === 0 ? '{}' : gap ?
                '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
                '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }

// If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

            var i;
            gap = '';
            indent = '';

// If the space parameter is a number, make an indent string containing that
// many spaces.

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }

// If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === 'string') {
                indent = space;
            }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                    typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.

            return str('', {'': value});
        };
    }


// If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

            var j;

            function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.prototype.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

            text = String(text);
            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

            if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                j = eval('(' + text + ')');

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');
        };
    }
}());
;
Drupal.behaviors.gtc = function (context) {

  // Search for A elements wrapped with an element that has the class
  // "more-help-link" within the given context. Also, make sure this A element
  // does not have the CSS class "modalframe-more-help-processed".
  
$('#edit-field-tablature-tab-0-value',context)
 	.addClass('modalframe-more-help-processed')
 	.click(function() {	  
 		//Drupal.modalFrame.open({url: window.location.pathname + '?modalframe_cck_editor=field_can_tab',width: 800,height: 600});
  		$.colorbox({inline:true, href:"#edit-field-tablature-tab-0-value"});
  });

	$('#block-menu-menu-genre li.leaf').each(function(){
		$(this).hover(
				  function () {
				    $(this).addClass("active");
				  },
				  function () {
				    $(this).removeClass("active");
				  }
				);
	});

	$(' .views-row').each(function(){
		
		$(this).hover(
				  function () {
				    $(this).addClass("hover");
				  },
				  function () {
				    $(this).removeClass("hover");
				  }
				);
	});
	
	var tcreator = new gtc(this);
	if($('#edit-field-tablature-tab-0-value').length){
		tabout = $('#edit-field-tablature-tab-0-value');
	}else{
		tabout = null;
	}
	if($('#edit-field-tab-json-0-value').length){
		tabjson = $('#edit-field-tab-json-0-value');
	}else{
		tabjson = null;
	}
	if($('#edit-field-tab-history-0-value').length){
		tabhistory = $('#edit-field-tab-history-0-value');
	}else{
		tabhistory = null;
	}
	if (typeof ctrltab == 'undefined'){
		ctrltab = new tabcreator($('#tabdisplay'),tabout,tabjson,tabhistory);//$('#edit-field-tablature-tab-0-value')
		ctrltab.adddiv($('#tabdisplay'));
	    ctrltab.tabctrl.allbuttons($('#tabcontrol')); 
	    ctrltab.chords.showControl($('#Chords')); 
	    ctrltab.scales.showControl($('#Scales')); 
	    ctrltab.tabfunk.allbuttons($('#controls'));
	    ctrltab.timing.showControl($('#timing'));
	    ctrltab.inst.display($('#instrument'));
	    $('muteoff').show();
	    ctrltab.printtab();
	}
	$('#gtc', context).each(function () {
	

	});
	
}
$(document).ready(function() {
	  // Handler for .ready() called.
	val = $('#edit-field-tab-json-0-value');
	if (typeof $('#edit-field-tab-json-0-value').val() == 'undefined'){
		ctrltab.createStrings();
		ctrltab.clean();
	} else {
		this.strings = 	JSON.parse($('#edit-field-tab-json-0-value').val());
		this.tabcounter = $(this.strings).length;
	}
	ctrltab.PB(0);
	});
;
/*
 * jQuery Form Plugin
 * version: 2.25 (08-APR-2009)
 * @requires jQuery v1.2.2 or later
 * @note This has been modified for ajax.module
 * Examples and documentation at: http://malsup.com/jquery/form/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
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($){$.B.1s=5(u){2(!4.G){R(\'1b: 2M 9 2N - 2O 2P 1t\');6 4}2(S u==\'5\')u={T:u};3 v=4.14(\'1c\')||1d.2Q.2R;v=(v.2S(/^([^#]+)/)||[])[1];v=v||\'\';u=$.1n({1e:v,H:4.14(\'1u\')||\'1Q\'},u||{});3 w={};4.L(\'C-1R-1S\',[4,u,w]);2(w.1T){R(\'1b: 9 1U 1o C-1R-1S L\');6 4}2(u.1v&&u.1v(4,u)===I){R(\'1b: 9 1f 1o 1v 1V\');6 4}3 a=4.1w(u.2T);2(u.J){u.O=u.J;K(3 n 1x u.J){2(u.J[n]2U 15){K(3 k 1x u.J[n])a.D({7:n,8:u.J[n][k]})}E a.D({7:n,8:u.J[n]})}}2(u.1y&&u.1y(a,4,u)===I){R(\'1b: 9 1f 1o 1y 1V\');6 4}4.L(\'C-9-1W\',[a,4,u,w]);2(w.1T){R(\'1b: 9 1U 1o C-9-1W L\');6 4}3 q=$.1z(a);2(u.H.2V()==\'1Q\'){u.1e+=(u.1e.2W(\'?\')>=0?\'&\':\'?\')+q;u.J=F}E u.J=q;3 x=4,V=[];2(u.2X)V.D(5(){x.1X()});2(u.2Y)V.D(5(){x.1Y()});2(!u.16&&u.17){3 y=u.T||5(){};V.D(5(a){$(u.17).2Z(a).P(y,1Z)})}E 2(u.T)V.D(u.T);u.T=5(a,b){K(3 i=0,M=V.G;i<M;i++)V[i].30(u,[a,b,x])};3 z=$(\'W:31\',4).18();3 A=I;K(3 j=0;j<z.G;j++)2(z[j])A=Q;2(u.20||A){2(u.21)$.32(u.21,1A);E 1A()}E $.33(u);4.L(\'C-9-34\',[4,u]);6 4;5 1A(){3 h=x[0];2($(\':W[7=9]\',h).G){35(\'36: 37 22 38 39 3a 3b "9".\');6}3 i=$.1n({},$.23,u);3 s=$.1n(Q,{},$.1n(Q,{},$.23),i);3 j=\'3c\'+(1B 3d().3e());3 k=$(\'<20 3f="\'+j+\'" 7="\'+j+\'" 24="25:26" />\');3 l=k[0];k.3g({3h:\'3i\',27:\'-28\',29:\'-28\'});3 m={1f:0,19:F,1g:F,3j:0,3k:\'n/a\',3l:5(){},2a:5(){},3m:5(){},3n:5(){4.1f=1;k.14(\'24\',\'25:26\')}};3 g=i.2b;2(g&&!$.1C++)$.1h.L("3o");2(g)$.1h.L("3p",[m,i]);2(s.2c&&s.2c(m,s)===I){s.2b&&$.1C--;6}2(m.1f)6;3 o=0;3 p=0;3 q=h.U;2(q){3 n=q.7;2(n&&!q.1i){u.O=u.O||{};u.O[n]=q.8;2(q.H=="X"){u.O[7+\'.x\']=h.Y;u.O[7+\'.y\']=h.Z}}}1j(5(){3 t=x.14(\'17\'),a=x.14(\'1c\');h.1k(\'17\',j);2(h.2d(\'1u\')!=\'2e\')h.1k(\'1u\',\'2e\');2(h.2d(\'1c\')!=i.1e)h.1k(\'1c\',i.1e);2(!u.3q){x.14({3r:\'2f/C-J\',3s:\'2f/C-J\'})}2(i.1D)1j(5(){p=Q;11()},i.1D);3 b=[];2g{2(u.O)K(3 n 1x u.O)b.D($(\'<W H="3t" 7="\'+n+\'" 8="\'+u.O[n]+\'" />\').2h(h)[0]);k.2h(\'1l\');l.2i?l.2i(\'2j\',11):l.3u(\'2k\',11,I);h.9()}3v{h.1k(\'1c\',a);t?h.1k(\'17\',t):x.3w(\'17\');$(b).2l()}},10);3 r=0;5 11(){2(o++)6;l.2m?l.2m(\'2j\',11):l.3x(\'2k\',11,I);3 c=Q;2g{2(p)3y\'1D\';3 d,N;N=l.2n?l.2n.2o:l.2p?l.2p:l.2o;2((N.1l==F||N.1l.2q==\'\')&&!r){r=1;o--;1j(11,2r);6}m.19=N.1l?N.1l.2q:F;m.1g=N.2s?N.2s:N;m.2a=5(a){3 b={\'3z-H\':i.16};6 b[a]};2(i.16==\'3A\'||i.16==\'3B\'){3 f=N.1E(\'1F\')[0];m.19=f?f.8:m.19}E 2(i.16==\'2t\'&&!m.1g&&m.19!=F){m.1g=2u(m.19)}d=$.3C(m,i.16)}3D(e){c=I;$.3E(i,m,\'2v\',e)}2(c){i.T(d,\'T\');2(g)$.1h.L("3F",[m,i])}2(g)$.1h.L("3G",[m,i]);2(g&&!--$.1C)$.1h.L("3H");2(i.2w)i.2w(m,c?\'T\':\'2v\');1j(5(){k.2l();m.1g=F},2r)};5 2u(s,a){2(1d.2x){a=1B 2x(\'3I.3J\');a.3K=\'I\';a.3L(s)}E a=(1B 3M()).3N(s,\'1G/2t\');6(a&&a.2y&&a.2y.1p!=\'3O\')?a:F}}};$.B.3P=5(c){6 4.2z().2A(\'9.C-1q\',5(){$(4).1s(c);6 I}).P(5(){$(":9,W:X",4).2A(\'2B.C-1q\',5(e){3 a=4.C;a.U=4;2(4.H==\'X\'){2(e.2C!=12){a.Y=e.2C;a.Z=e.3Q}E 2(S $.B.2D==\'5\'){3 b=$(4).2D();a.Y=e.2E-b.29;a.Z=e.2F-b.27}E{a.Y=e.2E-4.3R;a.Z=e.2F-4.3S}}1j(5(){a.U=a.Y=a.Z=F},10)})})};$.B.2z=5(){4.2G(\'9.C-1q\');6 4.P(5(){$(":9,W:X",4).2G(\'2B.C-1q\')})};$.B.1w=5(b){3 a=[];2(4.G==0)6 a;3 c=4[0];3 d=b?c.1E(\'*\'):c.22;2(!d)6 a;K(3 i=0,M=d.G;i<M;i++){3 e=d[i];3 n=e.7;2(!n)1H;2(b&&c.U&&e.H=="X"){2(!e.1i&&c.U==e)a.D({7:n+\'.x\',8:c.Y},{7:n+\'.y\',8:c.Z});1H}3 v=$.18(e,Q);2(v&&v.1r==15){K(3 j=0,2H=v.G;j<2H;j++)a.D({7:n,8:v[j]})}E 2(v!==F&&S v!=\'12\')a.D({7:n,8:v})}2(!b&&c.U){3 f=c.1E("W");K(3 i=0,M=f.G;i<M;i++){3 g=f[i];3 n=g.7;2(n&&!g.1i&&g.H=="X"&&c.U==g)a.D({7:n+\'.x\',8:c.Y},{7:n+\'.y\',8:c.Z})}}6 a};$.B.3T=5(a){6 $.1z(4.1w(a))};$.B.3U=5(b){3 a=[];4.P(5(){3 n=4.7;2(!n)6;3 v=$.18(4,b);2(v&&v.1r==15){K(3 i=0,M=v.G;i<M;i++)a.D({7:n,8:v[i]})}E 2(v!==F&&S v!=\'12\')a.D({7:4.7,8:v})});6 $.1z(a)};$.B.18=5(a){K(3 b=[],i=0,M=4.G;i<M;i++){3 c=4[i];3 v=$.18(c,a);2(v===F||S v==\'12\'||(v.1r==15&&!v.G))1H;v.1r==15?$.3V(b,v):b.D(v)}6 b};$.18=5(b,c){3 n=b.7,t=b.H,1a=b.1p.1I();2(S c==\'12\')c=Q;2(c&&(!n||b.1i||t==\'1m\'||t==\'3W\'||(t==\'1J\'||t==\'1K\')&&!b.1L||(t==\'9\'||t==\'X\')&&b.C&&b.C.U!=b||1a==\'13\'&&b.1M==-1))6 F;2(1a==\'13\'){3 d=b.1M;2(d<0)6 F;3 a=[],1N=b.3X;3 e=(t==\'13-2I\');3 f=(e?d+1:1N.G);K(3 i=(e?d:0);i<f;i++){3 g=1N[i];2(g.1t){3 v=g.8;2(!v)v=(g.1O&&g.1O[\'8\']&&!(g.1O[\'8\'].3Y))?g.1G:g.8;2(e)6 v;a.D(v)}}6 a}6 b.8};$.B.1Y=5(){6 4.P(5(){$(\'W,13,1F\',4).2J()})};$.B.2J=$.B.3Z=5(){6 4.P(5(){3 t=4.H,1a=4.1p.1I();2(t==\'1G\'||t==\'40\'||1a==\'1F\')4.8=\'\';E 2(t==\'1J\'||t==\'1K\')4.1L=I;E 2(1a==\'13\')4.1M=-1})};$.B.1X=5(){6 4.P(5(){2(S 4.1m==\'5\'||(S 4.1m==\'41\'&&!4.1m.42))4.1m()})};$.B.43=5(b){2(b==12)b=Q;6 4.P(5(){4.1i=!b})};$.B.2K=5(b){2(b==12)b=Q;6 4.P(5(){3 t=4.H;2(t==\'1J\'||t==\'1K\')4.1L=b;E 2(4.1p.1I()==\'2L\'){3 a=$(4).44(\'13\');2(b&&a[0]&&a[0].H==\'13-2I\'){a.45(\'2L\').2K(I)}4.1t=b}})};5 R(){2($.B.1s.46&&1d.1P&&1d.1P.R)1d.1P.R(\'[47.C] \'+15.48.49.4a(1Z,\'\'))}})(4b);',62,260,'||if|var|this|function|return|name|value|submit||||||||||||||||||||||||||||fn|form|push|else|null|length|type|false|data|for|trigger|max|doc|extraData|each|true|log|typeof|success|clk|callbacks|input|image|clk_x|clk_y||cb|undefined|select|attr|Array|dataType|target|a_fieldValue|responseText|tag|ajaxSubmit|action|window|url|aborted|responseXML|event|disabled|setTimeout|setAttribute|body|reset|extend|via|tagName|plugin|constructor|a_ajaxSubmit|selected|method|beforeSerialize|a_formToArray|in|beforeSubmit|param|fileUpload|new|active|timeout|getElementsByTagName|textarea|text|continue|toLowerCase|checkbox|radio|checked|selectedIndex|ops|attributes|console|GET|pre|serialize|veto|vetoed|callback|validate|a_resetForm|a_clearForm|arguments|iframe|closeKeepAlive|elements|ajaxSettings|src|about|blank|top|1000px|left|getResponseHeader|global|beforeSend|getAttribute|POST|multipart|try|appendTo|attachEvent|onload|load|remove|detachEvent|contentWindow|document|contentDocument|innerHTML|100|XMLDocument|xml|toXml|error|complete|ActiveXObject|documentElement|a_ajaxFormUnbind|bind|click|offsetX|offset|pageX|pageY|unbind|jmax|one|a_clearFields|a_selected|option|skipping|process|no|element|location|href|match|semantic|instanceof|toUpperCase|indexOf|resetForm|clearForm|html|apply|file|get|ajax|notify|alert|Error|Form|must|not|be|named|jqFormIO|Date|getTime|id|css|position|absolute|status|statusText|getAllResponseHeaders|setRequestHeader|abort|ajaxStart|ajaxSend|skipEncodingOverride|encoding|enctype|hidden|addEventListener|finally|removeAttr|removeEventListener|throw|content|json|script|httpData|catch|handleError|ajaxSuccess|ajaxComplete|ajaxStop|Microsoft|XMLDOM|async|loadXML|DOMParser|parseFromString|parsererror|a_ajaxForm|offsetY|offsetLeft|offsetTop|a_formSerialize|a_fieldSerialize|merge|button|options|specified|a_clearInputs|password|object|nodeType|a_enable|parent|find|debug|jquery|prototype|join|call|jQuery'.split('|'),0,{}));
/**
 * Automatic ajax validation
 *
 * @see http://drupal.org/project/ajax
 * @see irc://freenode.net/#drupy
 * @depends Drupal 6
 * @author brendoncrawford
 * @note This file uses a 79 character width limit.
 * 
 *
 */

Drupal.Ajax = new Object;

Drupal.Ajax.plugins = {};

Drupal.Ajax.firstRun = false;

/**
 * Init function.
 * This is being executed by Drupal behaviours.
 * See bottom of script.
 * 
 * @param {HTMLElement} context
 * @return {Bool}
 */
Drupal.Ajax.init = function(context) {
  var f, s;
  if (f = $('.ajax-form', context)) {
    if (!Drupal.Ajax.firstRun) {
      Drupal.Ajax.invoke('init');
      Drupal.Ajax.firstRun = true;
    }
    s = $('input[type="submit"]', f);
    s.click(function(){
      this.form.ajax_activator = $(this);
      return true;
    });
    f.each(function(){
      this.ajax_activator = null;
      $(this).submit(function(){
        if (this.ajax_activator === null) {
          this.ajax_activator = $('#edit-submit', this);
        }
        if (this.ajax_activator.hasClass('ajax-trigger')) {
          Drupal.Ajax.go($(this), this.ajax_activator);
          return false;
        }
        else {
          return true;
        }
      });
      return true;
    });
  }
  return true;
};

/**
 * Invokes plugins
 * 
 * @param {Object} formObj
 * @param {Object} submitter
 */
Drupal.Ajax.invoke = function(hook, args) {
  var plugin, r, ret;
  ret = true;
  for (plugin in Drupal.Ajax.plugins) {
    r = Drupal.Ajax.plugins[plugin](hook, args);
    if (r === false) {
      ret = false;
    }
  }
  return ret;
};

/**
 * Handles submission
 * 
 * @param {Object} submitter_
 * @return {Bool}
 */
Drupal.Ajax.go = function(formObj, submitter) {
  var submitterVal, submitterName, extraData;
  Drupal.Ajax.invoke('submit', {submitter:submitter});
  submitterVal = submitter.val();
  submitterName = submitter.attr('name');
  submitter.val(Drupal.t('Loading...'));
  extraData = {};
  extraData[submitterName] = submitterVal;
  extraData['drupal_ajax'] = '1';
  formObj.a_ajaxSubmit({
    extraData : extraData,
    beforeSubmit : function(data) {
      data[data.length] = {
        name : submitterName,
        value : submitterVal
      };
      data[data.length] = {
        name : 'drupal_ajax',
        value : '1'
      };
      return true;
    },
    dataType : 'json',
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      window.alert(Drupal.t('ajax.module: An unknown error has occurred.'));
      if (window.console) {
        console.log('error', arguments);
      }
      return true;
    },
    success: function(data){
      submitter.val(submitterVal);
      Drupal.Ajax.response(submitter, formObj, data);
      return true;
    }
  });
  return false;
};

/**
 * Handles scroller
 * 
 * @param {Object} submitter
 * @return {Bool}
 */
Drupal.Ajax.scroller = function(submitter) {
  var scroll_weight, box, found, timer;
  scroll_weight = 100;
  timer = window.setInterval(function() {
    box = submitter;
    found = false;
    // Watch for thickbox
    while (box.parentNode !== null &&
        Drupal.Ajax.invoke('scrollFind', {container:box})) {
      box = box.parentNode;
      // Document
      if (box === document) {
        if (box.documentElement.scrollTop &&
            box.documentElement.scrollTop > 0) {
          box.documentElement.scrollTop -= scroll_weight;
          found = true;
        }
      }
      // Body
      else if (box === document.body) {
        if (box.scrollTop &&
            box.scrollTop > 0) {
          box.scrollTop -= scroll_weight;
          found = true;
        }
      }
      // Window
      else if (box === window) {
        if ((window.pageYOffset && window.pageYOffset > 0) ||
            (window.scrollY && window.scrollY > 0)) {
          window.scrollBy(0, -scroll_weight);
          found = true;
        }
      }
      // Any other element
      else {
        if (box.scrollTop &&
            box.scrollTop > 0) {
          box.scrollTop -= scroll_weight;
          found = true;
        }
      }
    }
    // Check if completed
    if (!found) {
      window.clearInterval(timer);
    }
    return true;
  }, 100);
  return true;
};

/**
 * Handles messaging
 * 
 * @param {Object} formObj
 * @param {Object} submitter
 * @param {Object} data
 * @param {Object} options
 * @return {Bool}
 */
Drupal.Ajax.message = function(formObj, submitter, data, options) {
  var args;
  args = {
    formObj : formObj,
    submitter : submitter,
    data : data,
    options : options
  };
  if (Drupal.Ajax.invoke('message', args)) {
    Drupal.Ajax.writeMessage(args.formObj, args.submitter, args.options);
  }
  return true;
};

/**
 * Writes message
 * 
 * @param {Object} formObj
 * @param {Object} submitter
 * @param {Object} options
 * @return {Bool}
 */
Drupal.Ajax.writeMessage = function(formObj, submitter, options) {
  var i, _i, thisItem, log, errBox, h;
  if (options.action === 'notify') {
    // Cleanups
    $('.messages, .ajax-preview', formObj).remove();
    $('input, textarea').removeClass('error status warning required');
    // Preview
    if (options.type === 'preview') {
      log = $('<div>').addClass('ajax-preview');
      log.html(options.messages);
      formObj.prepend(log);
    }
    // Status, Error, Message
    else {
      log = $('<ul>');
      errBox = $(".messages." + options.type, formObj[0])
      for (i = 0, _i = options.messages.length; i < _i; i++) {
        thisItem = $('#' + options.messages[i].id, formObj[0])
        thisItem.addClass(options.type);
        if (options.messages[i].required) {
          thisItem.addClass('required');
        }
        log.append('<li>' + options.messages[i].value + '</li>');
      }
      if (errBox.length === 0) {
        errBox = $("<div class='messages " + options.type + "'>");
        formObj.prepend(errBox);
      }
      errBox.html(log);
    }
  }
  else if (options.action === 'clear') {
    $('.messages, .ajax-preview', formObj).remove();
  }
  Drupal.Ajax.scroller(submitter[0]);
  return true;
};

/**
 * Updates message containers
 * 
 * @param {Object} updaters
 * @return {Bool}
 */
Drupal.Ajax.updater = function(updaters) {
  var i, _i, elm;
  for (i = 0, _i = updaters.length; i < _i; i++) {
    elm = $(updaters[i].selector);
    // HTML:IN
    if (updaters[i].type === 'html_in') {
      elm.html(updaters[i].value);
    }
    // HTML:OUT
    else if (updaters[i].type === 'html_out') {
      elm.replaceWith(updaters[i].value);
    }
    // FIELD
    else if (updaters[i].type === 'field') {
      elm.val(updaters[i].value);
    }
    // REMOVE
    else if(updaters[i].type === 'remove') {
      elm.remove();
    }
  }
  return true;
};

/**
 * Handles data response
 * 
 * @param {Object} submitter
 * @param {Object} formObj
 * @param {Object} data
 * @return {Bool}
 */
Drupal.Ajax.response = function(submitter, formObj, data){
  var newSubmitter;
  data.local = {
    submitter : submitter,
    form : formObj
  };
  /**
   * Failure
   */
  if (data.status === false) {
    Drupal.Ajax.updater(data.updaters);
    Drupal.Ajax.message(formObj, submitter, data, {
      action : 'notify',
      messages : data.messages_error,
      type : 'error'
    });
  }
  /**
   * Success
   */
  else {
    // Display preview
    if (data.preview !== null) {
      Drupal.Ajax.updater(data.updaters);
      Drupal.Ajax.message(formObj, submitter, data, {
        action : 'notify',
        messages : decodeURIComponent(data.preview),
        type : 'preview'
      });
    }
    // If no redirect, then simply show messages
    else if (data.redirect === null) {
      if (data.messages_status.length > 0) {
        Drupal.Ajax.message(formObj, submitter, data, {
          action : 'notify',
          messages : data.messages_status,
          type : 'status'
        });
      }
      if (data.messages_warning.length > 0) {
        Drupal.Ajax.message(formObj, submitter, data, {
          action : 'notify',
          messages : data.messages_warning,
          type : 'warning'
        });
      }
      if (data.messages_status.length === 0 &&
          data.messages_warning.length === 0) {
        Drupal.Ajax.message(formObj, submitter, data, {action:'clear'});
      }
    }
    // Redirect
    else {
      if (Drupal.Ajax.invoke('complete', data)) {
        Drupal.Ajax.redirect( data.redirect );
      }
      else {
        Drupal.Ajax.updater(data.updaters);
        if (data.messages_status.length === 0 &&
            data.messages_warning.length === 0) {
          Drupal.Ajax.message(formObj, submitter, data, {action:'clear'});
        }
        else {
          Drupal.Ajax.message(formObj, submitter, data, {
            action : 'notify',
            messages : data.messages_status,
            type : 'status'
          });
        }
      }
    }
  }
  return true;
};


/**
 * Redirects to appropriate page
 * 
 * @todo
 *   Some of this functionality should possibly hapen on
 *   the server instead of client.
 * @param {String} url
 */
Drupal.Ajax.redirect = function(url) {
  window.location.href = url;
};

Drupal.behaviors.Ajax = Drupal.Ajax.init;


;

