/*
 * Modernizr JavaScript library 1.1
 * http://modernizr.com/
 *
 * Copyright (c) 2009 Faruk Ates - http://farukat.es/
 * Licensed under the MIT license.
 * http://modernizr.com/license/
 *
 * Featuring major contributions by
 * Paul Irish  - http://paulirish.com
 * Ben Alman   - http://benalman.com/
 */
 window.Modernizr=(function(P,l){var _='1.1', J={},T=true,ab=true,M=100,ad=l.documentElement,U=l.createElement("modernizr"),k=U.style,Z=l.createElement("input"),o="canvas",Y="canvastext",V="rgba",g="hsla",Q="multiplebgs",x="borderimage",D="borderradius",v="boxshadow",X="opacity",B="cssanimations",R="csscolumns",a="cssgradients",p="cssreflections",h="csstransforms",w="csstransforms3d",aa="csstransitions",F="fontface",K="geolocation",e="video",A="audio",d="input",u=d+"types",N="background",b=N+"Color",G="canPlayType",H="localstorage",j="sessionstorage",C="webworkers",O="applicationcache",c=" -o- -moz- -ms- -webkit- ".split(" "),s={},z={},r={},q,S,W,L,n=[];function y(f){k.cssText=f}function E(i,f){return y(c.join(i+";")+(f||""))}function I(i,f){return i.indexOf(f)!==-1}function ac(m,ae){for(var f in m){if(k[m[f]]!==undefined&&(!ae||ae(m[f]))){return true}}}function t(ae,m){var i=ae.charAt(0).toUpperCase()+ae.substr(1),f=[ae,"webkit"+i,"Moz"+i,"moz"+i,"o"+i,"ms"+i];return !!ac(f,m)}s[o]=function(){return !!l.createElement(o).getContext};s[Y]=function(){return !!(s[o]()&&typeof l.createElement(o).getContext("2d").fillText=="function")};s[K]=function(){return !!navigator.geolocation};s[V]=function(){y(N+"-color:rgba(150,255,150,.5)");return I(k[b],V)};s[g]=function(){y(N+"-color:hsla(120,40%,100%,.5)");return I(k[b],V)};s[Q]=function(){y(N+":url(m.png),url(a.png),#f99 url(m.png)");return/(url\s*\(.*?){3}/.test(k[N])};s[x]=function(){return t("borderImage")};s[D]=function(){return t("borderRadius","",function(f){return I(f,"orderRadius")})};s[v]=function(){return t("boxShadow")};s[X]=function(){y("opacity:.5");return I(k[X],"0.5")};s[B]=function(){return t("animationName")};s[R]=function(){return t("columnCount")};s[a]=function(){var m=N+"-image:",i="gradient(linear,left top,right bottom,from(#9f9),to(white));",f="linear-gradient(left top,#9f9, white);";y(m+i+m+"-webkit-"+i+m+"-moz-"+i+m+"-o-"+i+m+"-ms-"+i+m+f+m+"-webkit-"+f+m+"-moz-"+f+m+"-o-"+f+m+"-ms-"+f);return I(k.backgroundImage,"gradient")};s[p]=function(){return t("boxReflect")};s[h]=function(){return !!ac(["transformProperty","webkitTransform","MozTransform","mozTransform","oTransform","msTransform"])};s[w]=function(){return !!ac(["perspectiveProperty","webkitPerspective","MozPerspective","mozPerspective","oPerspective","msPerspective"])};s[aa]=function(){return t("transitionProperty")};s[F]=(function(){var i;if(!(!/*@cc_on@if(@_jscript_version>=5)!@end@*/0)){i=true}else{var aj=l.createElement("style"),ae=l.createElement("span"),ak,af,ah=false,ag=l.body,ai,m;aj.textContent="@font-face{font-family:testfont;src:url('data:font/ttf;base64,AAEAAAAMAIAAAwBAT1MvMliohmwAAADMAAAAVmNtYXCp5qrBAAABJAAAANhjdnQgACICiAAAAfwAAAAEZ2FzcP//AAMAAAIAAAAACGdseWYv5OZoAAACCAAAANxoZWFk69bnvwAAAuQAAAA2aGhlYQUJAt8AAAMcAAAAJGhtdHgGDgC4AAADQAAAABRsb2NhAIQAwgAAA1QAAAAMbWF4cABVANgAAANgAAAAIG5hbWUgXduAAAADgAAABPVwb3N03NkzmgAACHgAAAA4AAECBAEsAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAACAAMDAAAAAAAAgAACbwAAAAoAAAAAAAAAAFBmRWQAAAAgqS8DM/8zAFwDMwDNAAAABQAAAAAAAAAAAAMAAAADAAAAHAABAAAAAABGAAMAAQAAAK4ABAAqAAAABgAEAAEAAgAuqQD//wAAAC6pAP///9ZXAwAAAAAAAAACAAAABgBoAAAAAAAvAAEAAAAAAAAAAAAAAAAAAAABAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEACoAAAAGAAQAAQACAC6pAP//AAAALqkA////1lcDAAAAAAAAAAIAAAAiAogAAAAB//8AAgACACIAAAEyAqoAAwAHAC6xAQAvPLIHBADtMrEGBdw8sgMCAO0yALEDAC88sgUEAO0ysgcGAfw8sgECAO0yMxEhESczESMiARDuzMwCqv1WIgJmAAACAFUAAAIRAc0ADwAfAAATFRQWOwEyNj0BNCYrASIGARQGKwEiJj0BNDY7ATIWFX8aIvAiGhoi8CIaAZIoN/43KCg3/jcoAWD0JB4eJPQkHh7++EY2NkbVRjY2RgAAAAABAEH/+QCdAEEACQAANjQ2MzIWFAYjIkEeEA8fHw8QDxwWFhwWAAAAAQAAAAIAAIuYbWpfDzz1AAsEAAAAAADFn9IuAAAAAMWf0i797/8zA4gDMwAAAAgAAgAAAAAAAAABAAADM/8zAFwDx/3v/98DiAABAAAAAAAAAAAAAAAAAAAABQF2ACIAAAAAAVUAAAJmAFUA3QBBAAAAKgAqACoAWgBuAAEAAAAFAFAABwBUAAQAAgAAAAEAAQAAAEAALgADAAMAAAAQAMYAAQAAAAAAAACLAAAAAQAAAAAAAQAhAIsAAQAAAAAAAgAFAKwAAQAAAAAAAwBDALEAAQAAAAAABAAnAPQAAQAAAAAABQAKARsAAQAAAAAABgAmASUAAQAAAAAADgAaAUsAAwABBAkAAAEWAWUAAwABBAkAAQBCAnsAAwABBAkAAgAKAr0AAwABBAkAAwCGAscAAwABBAkABABOA00AAwABBAkABQAUA5sAAwABBAkABgBMA68AAwABBAkADgA0A/tDb3B5cmlnaHQgMjAwOSBieSBEYW5pZWwgSm9obnNvbi4gIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UuIEtheWFoIExpIGdseXBocyBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDMuYmFlYzJhOTJiZmZlNTAzMiAtIHN1YnNldCBvZiBKdXJhTGlnaHRiYWVjMmE5MmJmZmU1MDMyIC0gc3Vic2V0IG9mIEZvbnRGb3JnZSAyLjAgOiBKdXJhIExpZ2h0IDogMjMtMS0yMDA5YmFlYzJhOTJiZmZlNTAzMiAtIHN1YnNldCBvZiBKdXJhIExpZ2h0VmVyc2lvbiAyIGJhZWMyYTkyYmZmZTUwMzIgLSBzdWJzZXQgb2YgSnVyYUxpZ2h0aHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMAA5ACAAYgB5ACAARABhAG4AaQBlAGwAIABKAG8AaABuAHMAbwBuAC4AIAAgAFIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAdABlAHIAbQBzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALgAgAEsAYQB5AGEAaAAgAEwAaQAgAGcAbAB5AHAAaABzACAAYQByAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAEcAUABMACAAdgBlAHIAcwBpAG8AbgAgADMALgBiAGEAZQBjADIAYQA5ADIAYgBmAGYAZQA1ADAAMwAyACAALQAgAHMAdQBiAHMAZQB0ACAAbwBmACAASgB1AHIAYQBMAGkAZwBoAHQAYgBhAGUAYwAyAGEAOQAyAGIAZgBmAGUANQAwADMAMgAgAC0AIABzAHUAYgBzAGUAdAAgAG8AZgAgAEYAbwBuAHQARgBvAHIAZwBlACAAMgAuADAAIAA6ACAASgB1AHIAYQAgAEwAaQBnAGgAdAAgADoAIAAyADMALQAxAC0AMgAwADAAOQBiAGEAZQBjADIAYQA5ADIAYgBmAGYAZQA1ADAAMwAyACAALQAgAHMAdQBiAHMAZQB0ACAAbwBmACAASgB1AHIAYQAgAEwAaQBnAGgAdABWAGUAcgBzAGkAbwBuACAAMgAgAGIAYQBlAGMAMgBhADkAMgBiAGYAZgBlADUAMAAzADIAIAAtACAAcwB1AGIAcwBlAHQAIABvAGYAIABKAHUAcgBhAEwAaQBnAGgAdABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAAAAAAgAAAAAAAP+BADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAQACAQIAEQt6ZXJva2F5YWhsaQ==')}";l.getElementsByTagName("head")[0].appendChild(aj);ae.setAttribute("style","font:99px _,serif;position:absolute;visibility:hidden");if(!ag){ag=ad.appendChild(l.createElement(F));ah=true}ae.innerHTML="........";ae.id="fonttest";ag.appendChild(ae);ak=ae.offsetWidth;ae.style.font="99px testfont,_,serif";i=ak!==ae.offsetWidth;var f=function(){i=J[F]=ak!==ae.offsetWidth;ad.className=ad.className.replace(/(no-)?font.*?\b/,"")+(i?" ":" no-")+F;ai&&(m=true)&&ai(i);ah&&setTimeout(function(){ag.parentNode.removeChild(ag)},50)};setTimeout(f,M)}J._fontfaceready=function(al){(m||i)?al(i):(ai=al)};return function(){return i||ak!==ae.offsetWidth}})();s[e]=function(){var i=l.createElement(e),f=!!i[G];if(f){f=new Boolean(f);f.ogg=i[G]('video/ogg; codecs="theora, vorbis"');f.h264=i[G]('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')}return f};s[A]=function(){var i=l.createElement(A),f=!!i[G];if(f){f=new Boolean(f);f.ogg=i[G]('audio/ogg; codecs="vorbis"');f.mp3=i[G]("audio/mpeg3;");f.wav=i[G]('audio/wav; codecs="1"');f.m4a=i[G]("audio/x-m4a;")}return f};s[H]=function(){return"localStorage" in P};s[j]=function(){return"sessionStorage" in P};s[C]=function(){return !!P.Worker};s[O]=function(){return !!P.applicationCache};for(L in s){if(s.hasOwnProperty(L)){n.push((!(J[L]=s[L]())&&ab?"no-":"")+L)}}J.addTest=function(f,i){if(this.hasOwnProperty(f)){}i=!!(i());ad.className+=" "+(!i&&ab?"no-":"")+f;J[f]=i};J[d]=(function(m){for(var f in m){r[m[f]]=!!(m[f] in Z)}return r})("autocomplete autofocus list placeholder max min multiple pattern required step".split(" "));J[u]=(function(m){for(var f in m){Z.setAttribute("type",m[f]);z[m[f]]=!!(Z.type!=="text")}return z})("search tel url email datetime date month week time datetime-local number range color".split(" "));y("");U=Z=null;if(T&&!(!/*@cc_on!@*/0)){q="abbr article aside audio canvas datalist details eventsource figure footer header hgroup mark menu meter nav output progress section time video".split(" ");W=q.length+1;while(--W){S=l.createElement(q[W])}S=null}J._enableHTML5=T;J._enableNoClasses=ab;J._version=_;(function(f,i){f[i]=f[i].replace(/\bno-js\b/,"js")})(ad,"className");ad.className+=" "+n.join(" ");return J})(this,this.document);

/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();

  function shw(show)
  {
  	if( $(show) )
  		$(show).removeClassName('rhidden');
  }

  function hde(hide)
  {
  	if( $(hide) )
  		$(hide).addClassName('rhidden');
  }
  
  function reverse(el)
  {
  	if( $(el).hasClassName('rhidden') )
  		shw(el);
  	else
  		hde(el);	
  }
  
 function deleteUNote(nid,bid)
 {
 	if( confirm("Are you sure you want to delete this?") == true )
 		jumpUrl('index.php?page=grammar/individual&id='+bid+'&action=delete_unote&mnote_id='+nid);
 }

Event.observe(document,'click',lKanji);

function lKanji(e)
{
	if( Event.element(e).hasClassName('klook') )
	{
		sendLookupKanji(Event.element(e).innerHTML,false);
	}
}

//super jump features
function dJ(type,args)
{
	loadDict(type == 'v' ? 'vocab' : 'kanji',false);
	var atrans = new Array();
	atrans['v'] = new Array();
	atrans['k'] = new Array();
	atrans['v']['e'] = 'vocab_english'; 
	atrans['v']['j'] = 'vocab_japanese';
	atrans['k']['e'] = 'searchkdef';
	atrans['k']['r'] = 'searchreadings';
	atrans['k']['c'] = 'searchchar';
	atrans['k']['ss'] = 'searchscount_start';
	atrans['k']['se'] = 'searchscount_end';
	atrans['k']['rn'] = 'searchradical';
	for( i in atrans[type] )
		$(atrans[type][i]).value = '';	
	args = args.toQueryParams();
	for( i in args )
	{
		$(atrans[type][i]).value = args[i];
	}
	if( type == 'v' )
		searchVocab(false);
	else
		searchKanji(false);
}

function disableEnter(e)
{
     var key;     
     if(window.event)
          key = window.event.keyCode; //IE
     else
          key = e.which; //firefox     

     return (key != 13);
}

function enterSubmit(e,func)
{
	if( (window.event ? window.event.keyCode : e.which) == 13 )
	{
		
		if( func != undefined && typeof func == 'string' ) //function
		{
			eval(func+"();");
		}
		else
			Event.element(e).up('form').submit();
		return false;
	}
	else
		return true;
}

function playSound(code)
{
	if( Modernizr.audio && Modernizr.audio.mp3 )
	{
	//	alert('here');
		$('audiobox').update("<audio autoplay src='audio="+code+"'></audio>");
	
		return;
	}
	
var flashvars = {url: 'audio='+code, aP: "true", nC: "true", uM: "true", bgC: "0xCDCDCD", bgCC: "0xAAAAAA", pbC: "0x000000", pbCC: "0x000000", sbC: "0xCC0000"};
			var params = {};
			var attributes = {};
			swfobject.embedSWF("http://css.renshuu.org/flash/JPlay.swf", "soundbox", "15", "15", "9.0.0", false, flashvars, params, attributes);
}

function findSWF(movieName) {
  if (navigator.appName.indexOf("Microsoft")!= -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
}


/* possible candidates for toss */

var currKanji = false;
var currData = false;
var currEvent = false;
var currSpan =false;
var currMissed = false;
var holdPos = false;

  function formVal(fid,vname)
  {
  	return Form.getInputs($(fid),'',vname)[0].value;
  }
  
  function formRVal(fid,vname)
  {
  	inputs = Form.getInputs($(fid),'',vname);
  	for( x = 0; x < inputs.length; x++ )
  	{
  		if( inputs[x].checked )
  			return inputs[x].value;
  	}
  	return false;
  }
  
  /* Specific kanji quiz methods */

function KanjiReadChoose()
{	
	var used_ids = $('used_ids').value.split(',');
	var confirmed = false;
	for( i in used_ids )
	{
		if( $('yomi_'+used_ids[i]) && $('yomi_'+used_ids[i]).value == '' && confirmed == false)
		{
			if( confirm("You have not selected readings for all the kanji. Are you sure you want to continue?") == true )
			{
				confirmed = true;
			}
			else
				return;
		}
	
	}
	runquizAjax();
}

function KanjiReadMatch() 
{ 	
     	drag = KanjiReadMatch.arguments[0];
     	drop = KanjiReadMatch.arguments[1];
     	//need to see if it was moved out of another one
     	dragValue = drag.innerHTML;
     	if( drag.parentNode.id.substr(0,8) == 'readings' ) //moved from one kanji to another
     	{
     		aindex = drag.parentNode.id.substr(9);
     		var rexp = new RegExp("(, )?"+dragValue);
     		$('answer_'+aindex).value = $('answer_'+aindex).value.replace(rexp,'');
     	}     	
     	
		aindex = drop.id.substr(drop.id.indexOf('_')+1);
	
		answerArrs[aindex].push(dragValue);
		$('readings_'+aindex).appendChild(drag); 
		$('answer_'+aindex).value = $('answer_'+aindex).value == '' ? dragValue : $('answer_'+aindex).value + ', '+dragValue;		

}

function KanjiReadMatchRet() 
{ 	
	drag = KanjiReadMatchRet.arguments[0];
     	drop = KanjiReadMatchRet.arguments[1];
     	//need to see if it was moved out of another one
     	dragValue = drag.innerHTML;
     	if( drag.parentNode.id.substr(0,8) != 'readings' ) //not moved from a kanji (moved from reading box)
     		return;
	
     	//remove from old kanji
     	aindex = drag.parentNode.id.substr(9);
     	arr = $('answer_'+aindex).value.split(', ');
     	$('answer_'+aindex).value = arr.without(dragValue).join(', ');
   	
     	//put back in box
     	$('reading_box').appendChild(drag);
}

function KRMatchClear()
{
	var len = answerArrs.length;
	for( key = 0; key < len ; key++ ) // in answerArrs )
	{
		//alert(key);
		answerArrs[key] = [];
		$('answer_'+key).value = '';
		reads = $('readings_'+key).childElements();
		if( reads.length > 0 )
		{
			reads.each(function(node){
				$('reading_box').appendChild(node);
 			  });
		}
	}

}

function arrangeDropAnswer()
{
	drag = arrangeDropAnswer.arguments[0];
     drop = arrangeDropAnswer.arguments[1];

   	index = $(drag).down('select').selectedIndex;

   	id = $(drag).down('select').id;
	dropAnswer(drag,drop);
	$(id).selectedIndex = index;
}

  function dropAnswer()
 {
     	drag = dropAnswer.arguments[0];
     	drop = dropAnswer.arguments[1];
     	
     	if( $(drop).down('select') != undefined )
     	{
     		drop_index = $(drop).down('select').selectedIndex; //used in case two get swapped
     	}
     	else
     		drop_index = '';
     	orig = drop.innerHTML; //in case of flipping
		drop.innerHTML = drag.innerHTML;
		aindex = drop.id.substr(drop.id.indexOf('_')+1);
		aval = $('answer_val_'+aindex);
		if( drag.id.substr(0,1) == 'v' ) //a question block, not an answer block
		{	
			hde(drag);
			newval =  drag.id.substr(drag.id.indexOf('_')+1);
			if( aval.value != '' && aval.value != newval) //already an answer in there!
			{
				
				olddrag = $('value_'+aval.value);
				shw(olddrag);		
			}
			//put answer from drag box
			aval.value = newval;
		}
		else //question block dragged onto another question block
		{
			drag.innerHTML = orig;
		//	alert(drop_index == undefined);
			if( drop_index != '')
				$(drag).down('select').selectedIndex = drop_index;
			aindex2 = drag.id.substr(drag.id.indexOf('_')+1);
			aval2 = $('answer_val_'+aindex2);
			aorig = aval.value;
			aval.value = aval2.value;
			aval2.value = aorig;
		}
     }
     
  function estSched()
  {
  	var startTime = new Date();
  	var finishTime = new Date();
  	$('nlessons').innerHTML = "<span style='color:red'>Please fill out all settings above to get a summary of your schedule.</span>";
  	$('nterms').innerHTML = '';
  	errmsg = ferr = false;

	lenfilled = $('timelen').value != '' && $('lenunit').value != '';
	datefilled = $('endday').value != '' && $('endmonth').value != '' && $('endyear').value != '';
	
	if( lenfilled && ($('ltype_len').checked  || !datefilled) )
	{
		ferr = false;
		finishTime.setTime( startTime.getTime() + Math.floor($('timelen').value) * $('lenunit').value * 1000 * 3600 * 24 );
	}
	else if( datefilled )
	{
		finishTime.setFullYear($('endyear').value,$('endmonth').value-1,$('endday').value);
		ferr = false;
	}
	
	if( !ferr )
	{
		if( finishTime.getTime() < startTime.getTime() )
			errmsg ='The ending date is before the starting date.';
		else //range is good
		{
			days = Math.floor(( finishTime.getTime() - startTime.getTime() ) / 1000 / 3600 / 24); //days
		//	alert('days: '+days+" "+startTime.getTime());
			//now, let's see how many lessons we can squeeze out of that
			if( $('freq').value )
			{			
				numLessons = Math.floor(days/$('freq').value);
				if( numLessons > 1 ) //need 2 or more
				{
					if( $('ireview').value == 'rlesson' )
					{
						numReviews = Math.max(Math.floor(numLessons*.20),1);
						$('nlessons').innerHTML = numLessons+" (includes "+numReviews+" review lesson(s))";
					}
					else
					{
						numReviews = 0;
						$('nlessons').innerHTML = numLessons;
					}
					$('nterms').innerHTML = Math.floor(  $('numterms').value / ( numLessons - numReviews ) );
				}
				else
					errmsg = 'The time period is too short and/or the quiz frequency is too low.';
			}
		}

	}
  		
 	if( errmsg != false )
 		$('nlessons').innerHTML = '<span style="color:red;">'+errmsg+'</span>';
  }

     
function lessonFlip(next)
{
	multiTab(next,'less');
	if( next == 'r' )  $('qtype').value = 'review';
	else if( next == 'c' ) $('qtype').value = 'lessons';
}

function cLessonFlip(next)
{
	if( $('custom_booktype').value == next )
	{
		$('custom_booktype').value = next == 'v' ? 'k' : 'v';
	}
	multiTab(next,'cless');

	$('custom_booktype').value = next;
	optbefore = next == 'k' ? 'v' : 'k';
	optpre = next == 'k' ? 'k' : 'v';
//	$('custom_options').update($(optpre+'_options').innerHTML);
	hde(optbefore+"_options");
	shw(optpre+"_options");
	var pages = ['v','k','lv','kv'];
	for( i in pages )
	{
		if( pages[i] == next )
		{
			shw(pages[i]+'_schedlink');
			shw(pages[i]+'pages');
			shw(pages[i]+'pagesb');
		}
		else
		{
			hde(pages[i]+'_schedlink');
			hde(pages[i]+'pages');
			hde(pages[i]+'pagesb');
		}
	}
}


function multiTab(name,ext,cname)
{
	if( name == tabSet[ext] )
		return;
	if( cname != 'utab' && cname != 'ctab' )
		cname = 'tab';

	shw(name+'_'+ext+'tabinner'); 

 	hde(tabSet[ext]+'_'+ext+'tabinner');

	if( $(tabSet[ext]+'_'+ext+'tab') )
	{
		swapClass(tabSet[ext]+'_'+ext+'tab',cname,cname+'_off');
	}
	swapClass(name+'_'+ext+'tab',cname+'_off',cname);
	tabSet[ext] = name;
}

function tabFlip(next,curr)
{
	shw(next+'tabinner'); 
	hde(curr+'tabinner');
	swapClass(curr+'tab','tab','tab_off');
	swapClass(next+'tab','tab_off','tab');
}


  function changeLOption(newEl,lname,lval)
  {  	
  	form = Element.up(newEl,'form');
//  	alert(form);
  	for( i = 0; i < form.elements.length; i++)
  	{
  		if( form.elements[i].name == lname)
  		{
  	//	alert('found it');
  			//$('apples').select('[title="disgusting!"]');
//alert('[id="'+lname+'_'+form.elements[i].value+'"]');
  			oldEl =  form.select('[id="'+lname+'_'+form.elements[i].value+'"]');
  			
  			if( lval == form.elements[i].value )
  				return;
  			form.elements[i].value = lval;
  			break;
  		}
  	}
  	
  	Element.addClassName(newEl,'downbutton');
  	if( oldEl[0] ) 
  		oldEl[0].removeClassName('downbutton');
  	
  }
  

  
  function sendQuiz(index)
{
	if( index ==0 || $('ans').className != 'rhidden' )
	{
		$('radio'+index).checked = 'checked';
		runquizAjax();
	}
}

function checkStrokes()
{
	lastCount = 0;
	for(x=0; x <6; x++ )
	{
		if( !$('answer_val_'+x)	)
		{
			break;
		}
		if(  $('answer_val_'+x).value == '' )
		{
			if ( confirm("Are you sure you want to answer? You haven't moved all the kanji characters into order.") )
			{
				runquizAjax();
				return true;
			}
			else
				return false;
		}
		else 
		{
			enteredCount = parseInt($('select_'+$('answer_val_'+x).value).getValue());
			if( enteredCount != '' && enteredCount < lastCount )
			{
				if( confirm("Are you sure you want to answer? It appears that your stroke numbers are out of order.") )
				{
					
					runquizAjax();
					return;
				}
				else
					return false;
			}
			lastCount = enteredCount;
		}	
		
	}
	runquizAjax();
}

function toggleLink(lnk,sel)
{
	$(lnk).addClassName( sel ? 'bold' : 'tlnk');
	$(lnk).removeClassName(sel ? 'tlnk' : 'bold');
}

//eresources
function eresOwner(id,toggle)
{
	hde('e'+id+'_'+toggle);
	shw('e'+id+'_'+( toggle == 'own' ? 'notown' : 'own' ));
	$('u'+id).update( parseInt($('u'+id).innerHTML) + ( toggle == 'own' ? 1 : -1) );
	new Ajax.Request('index.php?page=community/eresources_back&id='+id+'&action='+toggle);
}

function eresRate(id,rate)
{
	new Ajax.Request('index.php?page=community/eresources_back&id='+id+'&action=rate&rate='+rate);
	tt_Hide(true);
	$('rlink_'+id).update('Thanks');
	toggleLink($('rlink_'+id),true);
}

function meaningRate(id,rate)
{
	new Ajax.Request(
		'index.php?page=grammar/individual_rate&id='+id+'&action=rate&rate='+rate, 
		{
			method: 'get', 
			onComplete: meaningRatePost
		});
	tt_Hide(true);
	$('rlink_'+id).update('Thanks');
	$('rlink_'+id).onclick = '';
	toggleLink($('rlink_'+id),true);
}

function meaningRatePost(xml)
{
	var jsonarr = jsonArr(xml);
	$('rating_'+jsonarr['meaning_id']).style.width = jsonarr['width']+'%';

}

function privStats(type,toggle)
{
	toggleLink(type+'_'+toggle,true);
	toggleLink(type+'_'+( toggle == 'yes' ? 'no' : 'yes' ),false);
	new Ajax.Request('index.php?page=grammar/user_privacy&type='+type+'&toggle='+toggle);
}

function blockGrammar(wid,type)
{
	new Ajax.Request('index.php?page=admin/block_grammar&wid='+wid+'&type='+type);
}

function addBonus(mid,points)
{
	new Ajax.Request('index.php?page=admin/add_mpoints&mid='+mid+'&points='+points);
}

 function hideNews(type,hidebox)
  {
  	if( hidebox != false )
  	{
  		hde('alert');
  		shw('noalert');
    }
    new Ajax.Request('index.php?page=main/news_hide&type='+type);
  }
  
  function loadGHistory(page,ptype)
  {	
  	  	new Ajax.Request(
			'index.php?page=user/genki_history_back&pg='+page+'&ptype='+ptype, 
			{
				onComplete: genPost
			});
  }
  
    function loadUMs(page)
  {
  	shw('um_wait');
  	hde('um_body');

  	new Ajax.Request(
			'index.php?page=user/messages_uback&pg='+page, 
			{
				method: 'get', 
				onComplete: genPost
			});
  
  }

  
  function loadAlerts(page)
  {
  	shw('alert_wait');
  	hde('alertbody');
  	new Ajax.Request(
			'index.php?page=user/messages_back&type=alerts&pg='+page, 
			{
				onComplete: genPost
			}); 
  }
  

    function sendReparse(reibun_id,el)
  {
new Ajax.Request(
			'index.php?page=grammar/model_bad&id='+reibun_id,{method: 'get'});
	el.innerHTML = 'Request sent.';
  }
  
  function searchIUReibun(pageOff,meaning_id,usage_id,sort)
  {
	hde('ureibun_body_'+meaning_id);
	shw('ureibun_body_search_'+meaning_id);
	$('ureibun_body_'+meaning_id).innerHTML = '';
	var page = pageOff ? pageOff : 0;
	if( !reibunSort[meaning_id] )
		reibunSort[meaning_id] = 'new';
	
	var sort = sort ? sort : reibunSort[meaning_id];
	
	
	toggleLink('sort_'+meaning_id+'_'+reibunSort[meaning_id],false);	
	reibunSort[meaning_id] = sort;
	toggleLink('sort_'+meaning_id+'_'+sort,true);
	
  	new Ajax.Request(
			'index.php?page=grammar/individual_back&id='+bunpou_id+'&pg='+page+'&meaning_id='+meaning_id+'&usage_id='+usage_id+'&sort='+sort,
			{
				onComplete: genPost
			});
  }

  function updateUReibun(lnk,newF)
  {
  	if( lnk && $(lnk).down('input') )
	{
		$(lnk).down('input').checked = 'checked';
	}
  	fName = newF;
  	searchUReibun(0);
  }
  
    function searchUReibun(pageOff,sort)
  {

	hde('ureibun_body_inner');
	shw('ureibun_body_search');
	$('ureibun_body_inner').innerHTML = '';
	var page = pageOff ? pageOff : 0;
	if( !sort )
		sort = $('ureibun_form').sort.value;
	$('ureibun_form').sort.value = sort;
	$('ureibun_form').stype.value = fName;

		postArr = $('ureibun_form').serialize(true);
	var stype = $('ureibun_form').stype.value;

  	new Ajax.Request(
			'index.php?page=grammar/user_back&pg='+page,
			{
				method: 'get', 
				parameters: postArr,
				onComplete: genPost
			});
  }

  
  function grammarCat(bcat_id,lnk)
  {  	
	hde('gindex');
	hde('rindex');
	
		if( lnk && $(lnk).down('input') )
		{
			$(lnk).down('input').checked = 'checked';
		}

  	//this uses the other form, so it needs to clear that crap first
  	$('search_txt').value = '';
  	searchGrammar(0,bcat_id,'inline');
  }

  
  function searchGrammar(pageOff,bcat_id,dictOutput)
  {

	var output = !dictOutput ? 'dictionary' : dictOutput;
	if( output == 'inline' )
	{
		if( $('bcat_id') )
		{
			if( bcat_id )
				$('bcat_id').value = bcat_id;
			else
			{
				if( $('bcat_id').value != '' && $('bcat_id_'+$('bcat_id').value) )
				{
					$('bcat_id_'+$('bcat_id').value).removeClassName('bold');
					$('bcat_id_'+$('bcat_id').value).addClassName('tlnk');
				}
				
			}
		}
	
		postArr = $('s_form').serialize(true);
	
		hde('glist_body');
		hde('nogrammar');
		shw('searching');
		
	}
	else //dictionary
	{
		openResults('grammar');
		$('stext_grammar').innerHTML = 'Searching ... ';
		postArr = $('fullform').serialize(true);
		postArr['bcat_id'] = '';
	}
	var page = pageOff ? pageOff : 0;
	
	var search = $('search_txt').value != '' ? '1' : '0';

  	new Ajax.Request(
			'../index.php?page=grammar/search&pg='+page+"&output="+output+"&search="+search, 
			{
				parameters: postArr,
				onComplete: genPost
			});
  
  
  }
  


var showPrefsOutput;
var prefsEl;
function showPrefs(el,page,output)
{
	 showPrefsOutput = output;
	 prefsEl = el;
		new Ajax.Request(
			'../index.php?page=user/prefs_ajax&subpage='+page, 
			{
				method: 'post', 
				onComplete: showPrefsPost
			});

}

function savePrefs()
{
	postArr = $('pref_form').serialize(true);
	showPrefsOutput = 'pref_box';
	shw('pref_box_waiting'); 
hde('pref_box');
	new Ajax.Request(
			'../index.php?page=user/prefs_ajax&saveprefs=1', 
			{
				method: 'post', 
				parameters: postArr,
				onComplete: showPrefsPost
			});
}

function showPrefsPost(xml)
{
	
	var jsonarr = jsonArr(xml);
	if( jsonarr['reload'] )
		window.location.reload();
	else if( showPrefsOutput == 'popup' )
	{
		tt_Hide(true);
 		tip(prefsEl,jsonarr['body'],true,'600','Adjust user settings');
	}
	else //inside the box
	{
	
		shw(showPrefsOutput); 
		hde(showPrefsOutput+"_waiting");
		$(showPrefsOutput).update(jsonarr['body']);
	}
}

var sentRequest = 0;
  function runquizAjax()
  {
	var d = new Date(); 

	if( $('run_quiz') )
	{
		if( $('qlabel_next').className == 'red' && ( d.getTime()/1000 - sentRequest ) < 3 ) //currently waiting
  		{
  			return;
  		}
  		setElapsed(); 
  		if( $('blankbox') )
  		{
  			$('blankbox').value =	$('blankbox').value.replace('~','');
  			
  		}
  		
  		postArr = $('run_quiz').serialize(true);
  		hde('qlabel_box');
		shw('qlabel_next');
	}
	else
		postArr = '';
		
	if( $('blankbox') )
		$('blankbox').blur();
	
	sentRequest = d.getTime()/1000;

  	new Ajax.Request(
			'index.php?page=quiz/run_quiz_ajax', 
			{
				method: 'post', 
				parameters: postArr,
				onComplete: loadRunquiz,
				encoding: 'Shift_JIS'
			});
  
  	return false;
  }
  
  function loadRunquiz(xml)
  {
		sentRequest = 0;
		var jsonarr = genPost(xml);
		if( jsonarr == false ) //redirect
			return;		

		if( $('qlabel' ) )
			hde('qlabel_next');
			
		//$('rquiz_body').innerHTML = jsonarr['body'];

		$('rquiz_body').innerHTML.evalScripts();
		klinks();
		 
		if( $('blankbox') )
			$('blankbox').focus();
		else if( 	$('skip') )
		{			
			$('skip').focus();
		}

  }

  	function adoptList(list_id,action)
  	{
  		if( action == 'save' )
  		{
  			shw('remove_list'); 
			hde('save_list');
  		}
  		else
  		{
  			shw('save_list'); 
			hde('remove_list');
  		}
  		alterList(list_id,action);
  	}
  
  function updateList(row,list_id)
  {
  		$('update_'+row).innerHTML = 'Updated to the newest version.';
  		alterList(list_id,'update');
  }
  
  function alterList(list_id,action)
  {
//	alert('index.php?page=custom/list_adopt&list_id='+list_id+'&action='+action);
//	return;
  	new Ajax.Request(
		'index.php?page=custom/list_adopt&list_id='+list_id+'&action='+action, 
		{
			method: 'get'
		})
  }
   function verifyUR(urei,sel)
   {
   		verify = sel.getValue();
   		$('verify_'+urei).innerHTML = verify;
   		$('verify_'+urei).className = verify == '◎' ? 'green' : 'red';
	   	new Ajax.Request(
		'index.php?page=misc/ureibun_verify&urid='+urei+'&verify='+verify, 
		{
			method: 'get'
		})
	   
   }
  
   function delMsg(bid,dec,force)
   {
		if( force || confirm("Are you sure you want to delete this conversation?") )
	   {
	   		hde('message_'+bid+'_full');
	   		if( dec )
	   			$('newmessages').innerHTML = parseInt($('newmessages').innerHTML)-1;
			new Ajax.Request(
			'index.php?page=user/messages_del&bid='+bid, 
			{
				method: 'get'
			})
	   }
   }
   
     
   function sendSuki(el,id,type)
  {
  	if( !type )
  		type = 'suki';
  	new Ajax.Request('index.php?page=misc/reibun_suki&id='+id+'&type='+type, {}); 
  	el.removeClassName('tlnk');
  	el.update('ありがとう！');
  	el.onclick = '';
  	var curr_points = parseInt($(type+'_'+id).innerHTML);
  	$(type+'_'+id).update(curr_points+1);
  }
  
  function saveBunpou(id,type)
  { 
  	new Ajax.Request('index.php?page=grammar/save&id='+id+'&type='+type, {}); 
  	if( type == 'add' )
  	{
  		hde('bsave_add');
  		shw('bsave_rem');
  	}
  	else
  	{
  		hde('bsave_rem');
  		shw('bsave_add');
  	}
  }
  
  
   function saveUReibun(el,id,type)
  {
  	if( !type )
  		type ='add';
  
  	new Ajax.Request('index.php?page=misc/reibun_saved&id='+id+'&type='+type, {}); 
  	el.removeClassName('tlnk');
  	if( type == 'add' )
  		el.update('saved to sentence library');
  	else
  		el.update('removed from sentence library');
  	el.onclick = '';
  	var curr_saved = parseInt($('saved_'+id).innerHTML);
  	$('saved_'+id).update(curr_saved+(type=='add' ? 1 : -1));
  }
   
   function jumpRecent(sel)
   {
   	value = sel.options[sel.selectedIndex].value;
   if( value.indexOf('/') != -1 )
   	{
   	 	if( document.domain == 'www.renshuu.dev' )
   	 		jumpUrl('http://www.renshuu.dev/index.php?page='+value);
   	 	else
   	 		jumpUrl('http://www.renshuu.org/index.php?page='+value);
	 }	
   }
   
  function jumpUrl(url)
  {

  	var extra ='';
  	var query = window.location.search.substring(1);
	var parms = query.split('&');
  	for (var i=0; i<parms.length; i++) {
		var pos = parms[i].indexOf('=');
		if (pos > 0) {
			var key = parms[i].substring(0,pos);
			var val = parms[i].substring(pos+1);
			if( key == 'PHPSESSID' )
			{
				extra = '&PHPSESSID='+val;
				break;
			}	
		}
	}
	if( url.indexOf('http') == -1 )
	{
		if( document.domain == 'www.renshuu.dev' )
			url = 'http://www.renshuu.dev/'+url;
		else
			url = 'http://www.renshuu.org/'+url;
	}
  	
  	window.location.href = url+extra;
  }

  
  function showBox(name)
  {// Effect.SlideDown('id_of_element', { duration: 3.0 });

  		Effect.SlideDown($(name) );
  		hde(name+"_show");
  		shw(name+"_hide");
  }
  
    function hideBox(name)
  {
  		Effect.SlideUp($(name));
  		hde(name+"_hide");
  		shw(name+"_show");
  }
  
  function flipClassic()
  {
  	$('classic').value = $('classic').value == 1 ? 0 : 1;
  	sendOptions(true);
  }
  
  function swapClass(el,from,to)
  {
  	$(el).removeClassName(from);
  	$(el).addClassName(to);
  }
  
  function sendOptions(holdLessons)
  {
  	//clear the custom links
  	if( $('all_lessons_tab') )
  	{
  		swapClass('all_lessons_tab','rtab','utab_off');
  		swapClass('my_lessons_tab','rtab','utab_off');
  		shw('select_body'); 
hde('custom_body');
  	}
  	opt_ids['category_id'] = $('category_id').value;
  	if( $('classic') )
  		opt_ids['classic'] = $('classic').value;

    if( holdLessons != true )
    {
    	opt_ids['nolessons'] = 0;
    	$('lessonblock').update('Loading lessons...');
    }
    else
    	opt_ids['nolessons'] = 1;
    hde('hajimeru');

    new Ajax.Request(
			'index.php?page=quiz/olookup', 
			{
				method: 'get', 
				parameters: opt_ids,
				onComplete: processOptions
			});
  }
  
  function jumpCreate()
  {
  	$('cquizform').action = "index.php?page=quiz/schedule_create";
  	$('cquizform').submit();
  }
  

  
  function selectLoadCat(sel)
  {
  		value = sel.options[sel.selectedIndex].value;
  		selectLoad($('all_lessons_tab'),'custom/all_lists_direct&cat_id='+value);
  }
  
   function selectLoad(el,page)
  {
  	swapClass('all_lessons_tab','rtab','utab_off');
  	swapClass('my_lessons_tab','rtab','utab_off');
  	swapClass('admin_lessons_tab','rtab','utab_off');
  	swapClass(el,'utab_off','rtab');
  	for( opt_id in opt_ids )
	{
		oldEl = $(opt_id+'_'+opt_ids[opt_id]);
		if( oldEl )
			swapClass(oldEl,'rtab','utab_off');
	}
	
	shw('waiting_body'); 
	hde('select_body');
	hde('custom_body');
  	 new Ajax.Request(
			'index.php?page='+page, 
			{
				method: 'get', 
				onComplete: selectLoadPost
			});
  	
  }
  
  function changeClassic(change,stub,el)
  {
  	multiTab(change,stub);
  	if( change == 'vl' )
  		$(stub).value = 'listen';
  	else
  		$(stub).value = change == 'e' || change == 've' || change == 'ke' ? '0' : '1';
  }
  
  function selectLoadPost(xml)
  {
		var jsonarr = jsonArr(xml);
		$('custom_body').update(jsonarr['body']);
		shw('custom_body'); 
		hde('waiting_body');
  }
  
  function schedPage()
  {
  	args = [];
	opt_ids['category_id'] = $('category_id').value;	
  	for( key in opt_ids )
  		args.push(key+'='+opt_ids[key]);
  	window.location.href='index.php?page=quiz/schedule_create&'+args.join('&');
  }

	function showOpts(name)
  {
  		hde(name+"_plus");
  		Effect.Appear($(name+'_opts'),{scaleX: true});
  }	
  
  function hideOpts(name)
  {
  		if( $(name+"_plus") && $(name+"_plus").className == 'rhidden' )
  		{
  			shw(name+"_plus");
  			Effect.SlideUp($(name+'_opts'),{scaleX: true});
  		}
  }	

	function changeBGroup(oname,oval)
	{
		if( oval != opt_ids[oname] || ( $('custom_body') && $('custom_body').className != 'rhidden' ) )
		{
			oldEl = $(oname+'_'+opt_ids[oname]);
			if( oldEl )
			{
				oldEl.removeClassName('rtab');
				oldEl.addClassName('utab_off');
				hideOpts(oname+'_'+opt_ids[oname]);
			}
			opt_ids[oname] = oval;
		
			$(oname+'_'+oval).addClassName('rtab');
			$(oname+'_'+oval).removeClassName('utab_off');
			$('form_'+oname).value = opt_ids[oname];
			sendOptions();
		}	
	}
	
function changeBGOption(oname,oval,bgroup)
{
	for( bgroup in bgroups )
	{
		if( oval != opt_ids[oname] )
		{
			oldEl = $(oname+'_'+opt_ids[oname]+"_"+bgroup);
			if( oldEl )
			{
				oldEl.removeClassName('downbutton');
				sOption = true;
			}
		}
	//	alert(oname+'_'+oval+"_"+bgroup);
		if( $(oname+'_'+oval+"_"+bgroup) )
			newEl = $(oname+'_'+oval+"_"+bgroup).addClassName('downbutton');
		
	}
	opt_ids[oname] = oval;
	$('form_'+oname).value = opt_ids[oname];
	if(sOption != false )
			sendOptions();
}

   function changeOption(oname,oval,sOption)
  {

  	if( oval != opt_ids[oname] )
  	{
  		oldEl = $(oname+'_'+opt_ids[oname]);
  		if( oldEl )
  			oldEl.removeClassName('downbutton');
  	}
  	opt_ids[oname] = oval;
  	newEl = $(oname+'_'+oval).addClassName('downbutton');
  	$('form_'+oname).value = opt_ids[oname];
  	if(sOption != false )
  		sendOptions();
  }
  
function setElapsed()
{
	var d = new Date(); 
	$('elapsed').value = Math.round(d.getTime()/1000) - $('timestart').value;
}
  
  function radTable(show)
  {
  	if( show )
  	{
  		shw('rad_hide'); 
		hde('rad_show');
  		shw('rad_table');
  		resizeSearch(); 
  	}
  	else
  	{
  		shw('rad_show'); 
		hde('rad_hide');
  		hde('rad_table');
  		resizeSearch();
  	}
  }

	function resizeSearch()
	{
		maxHeight = $('searchbox_nontab').getHeight() - $(tabSet['dict']+'_dicttabinner').getHeight()-25;
		
  		$('stext_'+tabSet['dict']).style.height = maxHeight+'px';
	}

  function loadDict(panel,clear)
  {	  	
 		hde('stext_'+tabSet['dict']);
 		if( $('searchbox').className == 'rhidden' ) //opening up, clear out
 		{
 			$('stext_vocab').update('');
 			$('stext_kanji').update('');
 			$('stext_grammar').update('');
 			$('stext_sent').update('');
 		}
 		//$('stext_'+panel).update('');
 	//	if( clear == true )
  		//	hde('stext_'+panel);
  //		else	
  		shw('stext_'+panel);
  		multiTab(panel,'dict','tab');	

  		bDim = document.viewport.getDimensions();
  		bOff = document.viewport.getScrollOffsets();
  		shw('searchbox');
  		width = $('searchbox').getWidth();
  		$('searchbox_nontab').style.height = (bDim['height']-60)+'px';

  		
  		$('searchbox').style.top = (bOff['top']+20)+'px';
  		$('searchbox').style.left = (bOff['left']+(bDim['width']-width))+'px';
  		shw('dimmer');
  		$('dimmer').style.width = (width+10)+'px';
  		if( panel == 'kanji' && $('rad_table').innerHTML == '' )
  		{
  			$('rad_table').update('Loading radical table...');
  			 new Ajax.Request(
			'../index.php?page=misc/load_text&type=rad_table', 
			{
				method: 'get', 
				onComplete: genPost
			});
  		
  		}
  		
  		
  		resizeSearch();
  }



function sendLookupKanji(kchar,swapDiag)
{
	loadDict('kanji',false);
	params = ['konly=1','kchar='+kchar];
	if( swapDiag )
		params[2] = 'swapdiag=1';
	new Ajax.Request(
			'../index.php?page=misc/lookup_kanji', 
			{
				method: 'post', 
				parameters: params.join('&'), 
				onComplete: genPost
			});
		$('stext_kanji').innerHTML = 'Loading information for '+kchar+' ... ';	
}

  
  function openResults(panel)
  {
  	shw('stext_'+panel);
  	//$('stext_'+panel).update('');
  }
  
  function searchKanji(recent)
  {
  	openResults('kanji');
  	
  	if( $('searchchar').value != '' )
  	{
  		sendLookupKanji($('searchchar').value,false);
  	}
  	else if( $('searchreadings').value != ''  || $('searchscount_start').value != '' || $('searchscount_end') != '' || $('searchkdef').value != '' )
	{
		shw('searches');
		
		params = $('fullform').serialize(true);
	
		new Ajax.Request(
		'../index.php?page=misc/lookup_kanji', 
		{
			method: 'post', 
			parameters: params, 
			onComplete: genPost
		});
		$('stext_kanji').innerHTML = 'Searching ... ';
	}
	return false;
  }
  
  function searchVocab(recent)
  {
  	openResults('vocab');

	  if( $('vocab_japanese').value != '' || $('vocab_english').value != '' )
		{
			params = $('fullform').serialize(true);
			new Ajax.Request(
			'../index.php?page=misc/lookup_vocab', 
			{
				method: 'post', 
				parameters: params,
				onComplete: genPost
			});
			//alert('search');
			$('stext_vocab').innerHTML = 'Searching ... ';
  		}
  		else
  		{
  			//alert('wee');
  			$('stext_vocab').innerHTML = 'Please enter in a japanese word to search for.';
  		}
  		return false;
	}
	
function buildRecent(args,name,select)
{


}

function searchSent(offset)
{

	openResults('sent');
	if( offset )
		$('sent_offset').value = offset;
	else
		$('sent_offset').value = '';
	if( $('sent_jap').value != '' || $('sent_eng').value != '' )
		{
			params = $('fullform').serialize(true);
			new Ajax.Request(
			'../index.php?page=misc/ext_reibun_search', 
			{
				method: 'post', 
				parameters: params,
				onComplete: genPost
			});
			//alert('search');
			$('stext_sent').innerHTML = 'Searching ... ';
  		}
  		else
  		{
  			//alert('wee');
  			$('stext_sent').innerHTML = 'Please enter in some Japanese or English to search for.';
  		}

}

function changeView(view)
{
	
	$('view_'+view).className = 'bold';
	$('view_'+$('display').value).className = 'tlnk';
	$('display').value = view;
	loadList();
}

/* loads the term pages from the back-end */
function loadList(pg)
{

	if( pg == undefined  )
		pg = _pg ? _pg : 0;

	shw('thelist_load');
	hde('thelist');
	var postArgs = $('thelist_form').serialize(true);
	postArgs['pg'] = pg;
	
	new Ajax.Request(
			'index.php', 
			{
				method: 'get', 
				parameters: postArgs,
				onComplete: postLoadList
			});	
	return false;
}

function postLoadList(xml)
{
	//this will handle the listid stuff
	jsonarr = jsonArr(xml);
	idlist = jsonarr['idlist'].split(',');
	_pg = jsonarr['pg'];
	genPost(xml);
}

  function unloadDict()
  {
  	hde('searchbox');
  	hde('dimmer');
  	$('dimmer').style.width = '100%';
  }
  
  function textDiv(txt)
  {
  	var div = new Element('div');
  	div.innerHTML = txt;
  	return div;
  }
  
 
 function quizProblem(el)
 {
 	tt_Hide(true);
 	txt = $('quizerror').innerHTML;
 	tip(el,txt,true,'600','Report a quiz error','quizerror');
 
 }
 
 function reverseResult(el)
 {
 		new Ajax.Request(
		'index.php?page=quiz/reverse_result', 
		{
			method: 'get', 
			parameters: ''
		});
	el.innerHTML = 'Marked';
 }
 
function popMistake(el,wid)
{
	tt_Hide(true);
	showGeneric(el,'misc/term_suggest_correct&id='+wid);
}


function hideAll(hide)
{
	var newtxt = hide ? 'yes' : 'no';
	sendids = [];
	for( i in idlist )
	{
		if( $('btxt_'+idlist[i]) && $('btxt_'+idlist[i]).innerHTML != newtxt )
		{
			$('btxt_'+idlist[i]).innerHTML = newtxt;
			termbox = $('termbox'+idlist[i]);
			if( newtxt == 'yes' )
				termbox.addClassName('hterm');
			else
				termbox.removeClassName('hterm');
			sendids.push(idlist[i]);
		}
	}

	if( sendids.length > 0 )
	{
		new Ajax.Request(
			'index.php?page=quiz/ext_alterboost', 
			{
				method: 'get', 
				parameters: 'wids='+sendids.join(',')+'&alter='+newtxt+'&type='+booktype
			});
	}
}


function popBoost(el,wid,type)
{
	//boost_type = type;
	level = $('btxt_'+wid).innerHTML;
		
	nlevel = level == 'yes' ? 'no' : 'yes';
	$('btxt_'+wid).innerHTML = nlevel;
	if( $('termbox'+wid) )
	{
		termbox = $('termbox'+wid);
		if( nlevel == 'yes' )
		{
			if( window.liquidReload )
				liquidReload();
			termbox.addClassName('hterm');
		}
		else
			termbox.removeClassName('hterm');
	}
	new Ajax.Request(
		'index.php?page=quiz/ext_alterboost', 
		{
			method: 'get', 
			parameters: 'wid='+wid+'&alter='+nlevel+'&type='+type
		});
	
	
}

function loadHelp(hpage)
{
	if( $(hpage).innerHTML != '' )
	{
		reverse(hpage);
		return;
	}
	
	new Ajax.Request(
		'index.php?page=misc/help_item', 
		{
			method: 'get', 
			parameters: 'type='+hpage,
			onComplete: displayHelp
		});
}

function displayHelp(xml)
{
	jsonarr = jsonArr(xml);
	$(jsonarr['type']).innerHTML = jsonarr['response'];
	shw(jsonarr['type']);
}

function popHelp(el,hpage)
{
	return showGeneric(el,'misc/help_item&popup=true&type='+hpage);
}

function remMark(wid,type)
{
	hde('termbox'+wid);
	new Ajax.Request('index.php?page=misc/ext_altermark&wid='+wid+'&action=rem&type='+type);	
}

function setMark(el,wid,type)
{
	
	
	action = el.innerHTML;
	if(  action =='add to list' )
	{
		el.innerHTML = 'remove from list';
		arg = 'add';
	}
	else if( action == 'remove from list' )
	{
		el.innerHTML = 'add to list';
		arg = 'rem';
	}
	
	if( arg )
	{
		new Ajax.Request(
		'index.php?page=misc/ext_altermark', 
		{
			method: 'get', 
			parameters: 'wid='+wid+'&action='+arg+'&type='+type
		});	
	}
}

function popKQuizzes(type)
{
	new Ajax.Request(
		'index.php?page=user/settings_kquiz&kquiztype='+type, 
		{
			onComplete: showKQuizzes
		});	
		
}

function showKQuizzes(xml)
{
	genPost(xml);
	setOffset('kquiz_settings_box',false,20,20);
	shw('dimmer');
}

function setOffset(el,fromTop,td,lr)
{
	var offsets = document.viewport.getScrollOffsets();
	var top = ( fromTop ) ? offsets.top+td : document.viewport.getHeight() - td - $(el).getHeight() + offsets.top;		
	var left = offsets.left+lr;
	$(el).style.top = top+'px';
	$(el).style.left = left+'px';
}

function setCenter(el)
{
	var offsets = document.viewport.getScrollOffsets();
	elWidth = $(el).getWidth();
	elHeight = $(el).getHeight();
	$(el).style.left = (offsets.left+ Math.floor((document.viewport.getWidth()-elWidth)/2) )+'px';
	$(el).style.top = (offsets.top+ Math.floor((document.viewport.getHeight()-elHeight)/2) )+'px';
}

function saveKQuiz(el,type)
{
	//alert(type);
	var postArgs = $(el).up('form').serialize(true);
	var questCount = 0;
	$H(postArgs).each(function(pair) {
		if( pair.value == 'pref' || pair.value == 'normal' )
			questCount++;
	});
	$(type+'_count').innerHTML = questCount;
	
	new Ajax.Request(
			'index.php?page=user/settings_kquiz&kquiztype='+type, 
			{
				method: 'get', 
				parameters: postArgs
			});
	hde('kquiz_settings_box');
	hde('dimmer');
	return;  	
}

function popReadings(el,wid)
{
	return showGeneric(el,'quiz/ext_readings&wid='+wid);
}

function customEPage(pg)
{
	searchERec(false,'page_num='+pg);
}

function searchERec(clear,args,lnk)
{
	args = args.toQueryParams();

	if( lnk )
	{
		swapClass(lnk,'tlnk','bold');
		checkArgs = ['rtype','csearch','sort'];
		for( i in checkArgs )
		{
			if( eArgs[checkArgs[i]] && args[checkArgs[i]] && $(checkArgs[i]+'_'+eArgs[checkArgs[i]]) )
			{

				swapClass(checkArgs[i]+'_'+eArgs[checkArgs[i]],'bold','tlnk');
			}
		}
	}
	
	for( i in args )
	{
		eArgs[i] = args[i];
	}

	new Ajax.Request(
		'index.php?page=community/eresources_list_search', 
		{
			method: 'post', 
			parameters: eArgs,
			onComplete: genPost
		});
	
	$('results').innerHTML = $('elist_searching').innerHTML;
}

function learnedKanji(el,kid)
{
	var tog = el.innerHTML == 'yes' ? 'no' : 'yes';
	$(el).update(tog);
	new Ajax.Request(
		'index.php?page=misc/kanji_learned&kid='+kid+'&toggle='+tog, {});
}


function customPage(pg,type)
{
	cArgs['booktype'] = type;
	searchCLists(false,'page_num='+pg);
}	


function searchCLists(clear,args,lnk)
{
	if( lnk && $(lnk).down('input') )
	{
		$(lnk).down('input').checked = 'checked';
	}
	
	var oldCArgs = cArgs;
	
	if( clear )
		cArgs = new Array();

	args = args.toQueryParams();
	for( i in args )
	{
		cArgs[i] = args[i];
	}
	
	//we want to scan the current box for lesson selectors
	var book_args = [];
	inputs = $(tabSet['cless']+'_clesstabinner').select('[type="radio"]');
	inputs.each(function(s) { 
		if( $F(s) != null )
			book_args.push($F(s));
	});
	book_args = book_args.length > 0 ? '&'+book_args.join('&') : '';

	if( cArgs['scheduler'] )
	{
		preScheduler();
		//need to determine if the list going in is custom or not
		cArgs['sched_custom'] = !oldCArgs['subcat'] && ( oldCArgs['group_id'] || ( oldCArgs['cat_id'] && oldCArgs['cat_id'] != 'admin' && oldCArgs['cat_id'] != 'mysaved' ) )? 'yes' : 'no';
	}
	new Ajax.Request(
		'index.php?page=custom/gen_lists_search'+book_args, 
		{
			method: 'post', 
			parameters: cArgs,
			onComplete: searchCListsPost
		});
	
	$(tabSet['cless']+'_clesstabinner').innerHTML = $('clist_searching').innerHTML;
}

function preScheduler()
{
	var newcount = 0;
	inputs = $('cquizform').select("input[name='lessons[]']");
	var lessons  = [];
	var rlessons = [];
	inputs.each(function(s) { 
		if( s.checked == 'checked' || s.checked == true )
		{
			newcount +=   parseInt($('count_'+s.value).innerHTML);
			lessons.push(s.value);
		}
		else
			rlessons.push(s.value);
		
	
	});
	diff = newcount - parseInt($('termcount').value) ;
	$('numterms').update( Math.max(0,parseInt($('numterms').innerHTML) + diff) );
	cArgs['lessons'] = lessons.join(',');
	cArgs['rlessons'] = rlessons.join(',');
}

function searchCListsPost(xml)
{
	jsonarr = genPost(xml);
	if( jsonarr['redirect'] )
		return;

	if( jsonarr['tcount'] && $('termcount') )
		$('termcount').value = jsonarr['tcount'];
	
	cLessonFlip(jsonarr['currtab']);
}

function rateSentence(sid,rate,el,wid)
{
	new Ajax.Request('../index.php?page=misc/sentence_rate&sid='+sid+'&rate='+rate+'&word_id='+wid);
	ratings = ['useless','useful','incorrect'];
	for( i in ratings )
	{
		if( $(ratings[i]+'_'+sid) )
			$(ratings[i]+'_'+sid).className = ratings[i] == rate ? 'bold' : 'tlnk';
	}
	
	var parent =  el.id == 'rate_box' ? el : $(el).parentNode;
	
	if( rate == 'incorrect' )
	{
		return showGeneric(parent,'misc/reibun_correct&popup=true&sid='+sid+'&action=form');
	}
}

function sentenceCorrect()
{
	
	new Ajax.Request('../index.php?page=misc/reibun_correct', 
	{
		method: 'post',
		parameters: $('reibun_correct').serialize(true)
	});
	tt_Hide(true);

}

function removeSaved(parent,list_id,confirm)
{
	if( confirm )
	{
		new Ajax.Request('../index.php?page=custom/list_delete_ajax&confirm=1&list_id='+list_id, {});
		hde('list_id_'+list_id);
		tt_Hide(true);
	}
	else
		return showGeneric(parent,'custom/list_delete_ajax&list_id='+list_id);
}

function modelRequest(el,urid)
{
	hde(el);
	new Ajax.Request('../index.php?page=grammar/user_model_suggest&urid='+urid, {});
}

function modelRConfirm(urid,result,mid)
{
	reibun = $('spaced_'+urid) ? $('spaced_'+urid).value : '';

	new Ajax.Request('../index.php?page=grammar/user_model_suggest&confirm='+result+'&urid='+urid+'&spaced='+reibun, {});
	delMsg(mid,false,true);
}

function fetchKWords(el,kid)
{	
	hde(el);
	new Ajax.Request('index.php?page=quiz/ext_kwords&kid='+kid, 
		{
			onComplete: genPost
		});
	$('kwords_'+kid).innerHTML = 'Loading vocabulary...';
}

  function jsonArr(response)
  {
  	if( response.responseText == null )
	{
		return [];
	}
  	
  	firstPos = response.responseText.indexOf('{');
	if( firstPos != 0 )
	{
		res = response.responseText.substr(firstPos);
	}
	else
		res = response.responseText;

	return res.evalJSON();
  }

function genPost(xml)
{
	jsonarr = jsonArr(xml);
	if( jsonarr['redirect'] )
	{
		window.location.href = jsonarr['redirect'];
		return jsonarr;
	}
	for( i in jsonarr )
	{	

		if( i == 'show' )
		{			
			jsonarr[i].split(',').each(function(s) { shw(s);  });					
		} 
		else if( i == 'hide' )
		{			
			jsonarr[i].split(',').each(function(s) { hde(s);  });	
		}
		else if ( i == '_fvalue' )
		{
			for( fkey in jsonarr[i] )
			{
				if( $(fkey) )
					$(fkey).value = jsonarr[i][fkey];
			}
		}
		else if( $(i) )
		{ 
			$(i).update(jsonarr[i]); 
		}
	}
	return jsonarr;
}

function grammarHelp(el,type)
{
	return showGeneric(el,'grammar/type_info&type='+type);

}

function popShowReibun(pg,el,wid,target,restrict)
{
	if( typeof restrict == 'undefined' )
		restrict = '';

	if( target != 'popup' )
	{
		$('reibuns_'+wid).innerHTML = ' <span class="red">Searching for the sentences...</span>';
		new Ajax.Request(
			'../index.php?page=misc/ext_reibuns&wid='+wid+'&pg='+pg+'&target='+target+'&restrict='+restrict, 
			{
				onComplete: genPost
			});
	}
	else
	{
		if( pg != '0' )
			holdPos = true;
		return showGeneric(el,'../misc/ext_reibuns&wid='+wid+'&pg='+pg+'&target=popup&restrict='+restrict);
	}
}

    function getReibuns(suffix,search,offset)
  {
  	if( !search )
  	{
  		var search = $('reibun_search_'+suffix).value;
  		
		var offset = 0;
	}
	var esearch = $('reibun_esearch_'+suffix) ? $('reibun_esearch_'+suffix).value : '';

	shw('suggest_reibuns_'+suffix);
	$('suggest_reibuns_'+suffix).innerHTML = ' <span class="red">Searching for the sentences...</span>';

  	new Ajax.Request(
			'index.php?page=misc/ext_reibun_search&search='+search+'&offset='+offset+'&meaning_id='+suffix+'&esearch='+esearch, 
			{
				onComplete: genPost
			});
  }
  

function showHistory(el,id,type)
{
	showGeneric(el,'user/stats_quiz&id='+id+'&type='+type);
}

function showGeneric(el,url)
{
		tt_Hide(true);
	  tip(el,"Please wait while your data is loaded..",true,600,"Loading your data...");	
	//waitingbox! after, send the info on over
	//tip(el,$('genericbox').innerHTML,true,500);
	currSpan = el;
	new Ajax.Request(
		'../index.php?page='+url, 
		{
			method: 'post', 
			parameters: '', 
			onComplete: resultGeneric
		});
	return false;
}

function resultGeneric(xml)
{
	jsonarr = jsonArr(xml);
	inner = '';
	if( jsonarr['results'] ) //valid
	{
		if( jsonarr['output'] && jsonarr['output'] == 'raw' )
			inner = jsonarr['results'];
		else
		{
			inner = '';
			for( i = 0; i < jsonarr['results'].length; i++)//i in jsonarr['results'] )
			{
				inner += "<div class='indent'>"+jsonarr['results'][i][0]+" - "+jsonarr['results'][i][1]+"</div>";
			}
		}
	}
	else
		inner = jsonarr['error'];
	
	var use_width = jsonarr['width'] ? jsonarr['width'] : 600;
	
	tt_Hide(true);
   tip(currSpan,inner,true,use_width,jsonarr['title']);
   holdPos = false;
}

function showTerm(id)
{
	el = $(id);
	if( el.style.display == 'hidden' )
		el.style.display = 'block';
	else
		el.style.display = 'hidden';
}

function checkBoxes(stub,tails)
{
	tails = tails.split(',');
	for( x in tails )
	{
		$(stub+"_"+tails[x]).checked = !$(stub+"_"+tails[x]).checked;
	}
}

function unhideMessage(mid)
{
	hde('hidemsg_'+mid);
	shw('showmsg_'+mid);
}

function sendMistake(el)
{
	postArr =  el.up('form').serialize(true);
	//alert(tform);
	
	wid = $('mwid').value;

	tt_Hide(true);
	$('mistake'+wid).innerHTML = '<span style="color:red; text-decoration: underline">message sent!</span>';
	new Ajax.Request(
		'index.php?page=quiz/mistake_ajax', 
		{
			method: 'post', 
			parameters: postArr
		});
	tt_Hide(true);
}	

function selectCLessons(select,count)
{
	if( !count )
		count = 999;

	rows = $(tabSet['cless']+'_clesstabinner').select("[class=set_boxes]");
	if( rows == '' ) //direct set selection, there is no set_box
		rows = [$(tabSet['cless']+'_clesstabinner')];
	rows.each(function(s) {
	
			inputs = s.select("input[name='lessons[]']");
			inputs.each(function(s) { 
			if( count > 0 ) { s.checked = select ? 'checked' : '' ; count--;}  
			});

	
	});
	
}





function selectLessons(select,fm) //used for schedule page to select/deselect a bunch of checkboxes
{
	inputs = $(fm).getInputs('checkbox');
	inputs.each(function(s) { s.checked = select ? 'checked' : '' ;});
}


  function processOptions(response)
  {

  		if( opt_ids.length == 0 )
  			return;

  		jsonarr = jsonArr(response);

  		if( jsonarr['options'] && $('oinstruct') )
  		{

  			$('oinstruct').innerHTML = jsonarr['options'];
  			
  		}
  		shw('hajimeru');

  		if( jsonarr['error'] )
  			alert('bad lessons!');
  		else
  		{	
  			if( $('rtermsdiv') )
  			{
  				if( jsonarr['booktype'] == 'kanji' )
  					hde('rtermsdiv');
  				else
  					shw('rtermsdiv');
  			}
  		
  			//this sets up the actual lesson block;
  			if( !jsonarr['lessons'] )
  				return;
  			
  		$('lessonblock').innerHTML = jsonarr['lessons']; //jsonarr['olessons'];	
  		if( $('slink') )
  			$('slink').update(jsonarr['slink']);
  		if( $('screate') )
  			$('screate').update(jsonarr['screate']);
  		return;
	}  		
  }
  



function make_visible(lnk) {
	//$('debuginner').update($('debuginner').innerHTML+'ENTER');
	if( $('ans').className != 'rhidden' )
	{
	//	$('debuginner').update($('debuginner').innerHTML+'HIDE');
		shw(lnk);
		hde('ans');
	}
	else
	{
	//	$('debuginner').update($('debuginner').innerHTML+'SHOW');
		shw('ans');
		hde(lnk);
	}
	lnk.blur();
	return false;
}


/* This notice must be untouched at all times.

wz_tooltip.js    v. 3.25

The latest version is available at
http://www.walterzorn.com
or http://www.devira.com
or http://www.walterzorn.de

Copyright (c) 2002-2003 Walter Zorn. All rights reserved.
Created 1. 12. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
Last modified: 21. 4. 2004

Cross-browser tooltips working even in Opera 5 and 6,
as well as in NN 4, Gecko-Browsers, IE4+, Opera 7 and Konqueror.
No onmouseouts required.
Appearance of tooltips can be individually configured
via commands within the onmouseovers.

This program is free software;
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License
at http://www.gnu.org/copyleft/gpl.html for more details.
*/


var tt_obj, tt_spwidth = '',
tt_objW = 0, tt_objH = 0,  // width and height of tt_obj
tt_sticky = false,
tempStage = true;

function tt_SetDivPos(t_x, t_y)
{
	if( holdPos == true )
		return;
	tt_obj.style.left = t_x+'px';
	tt_obj.style.top = t_y+'px';
}


function tt_ShowDiv(t_x)
{
	tt_obj.style.visibility = t_x? 'visible' : 'hidden';
}

function omo(e)
{
	if (!e) var e = window.event;
	var tg = Event.element(e);

	try {
		var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
		if( reltg == curr_el || $(reltg).up('.curr_tip') != undefined )
			return;
	}
	catch( err ){}
	tt_Hide();
}



function tip(el,txt,sticky,spwidth,title,altobj)
{
	if( !tt_sticky && !sticky && tt_obj && curr_el == el ) //same non-sticky mouseover, ignore
		return;
	if( !tt_obj || !tt_sticky || ( tt_sticky && sticky ) )
	{
		objname = altobj ? altobj : 'ttip';
		var tipobj = $(objname);
	//	alert(objname);

		var innerbody =   $('ttip_inner');
		tipobj.style.width = '';
		tt_sticky = ( sticky == true );
		if( objname == 'ttip' )
		{
			innerbody.innerHTML = txt;
			innerbody.innerHTML.evalScripts();
			if( title )
			{
				$('tiptitle_text').innerHTML = title;
				$('tiptitle').style.display='block';
			}
			else
				$('tiptitle').style.display='none';
		}
		
		$(el).observe('mouseout',omo);

		if( spwidth )
		{
			tt_spwidth = spwidth;
			tipobj.style.width = spwidth+'px';
		}
		else
			tt_spwidth = '';
		tt_Show(tipobj,el);
	}
}

curr_el = false;
function tt_Show(t_obj,el)
{

	curr_el = el;
	$(curr_el).addClassName('curr_tip'); //used for searching on omo()
	if (tt_obj) tt_Hide();
	
	tt_obj = t_obj;

	tt_objW = $(tt_obj).getWidth();
	tt_objH = $(tt_obj).getHeight();
	newwidth = tt_objW > 600 && tt_spwidth == '' ? '600px' : tt_objW+'px';
	tt_obj.style.width = newwidth;

	if( tt_sticky )
	{
		thepos = Element.cumulativeOffset(el)
		tt_Pos(thepos['left'],thepos['top']);		
		tt_ShowDiv(true);
	}
	else
	{
		tempStage = true;
	}

	Event.observe(document,'mousemove',tt_Move);

}

function tt_Pos(xpos,ypos)
{
	viewport = document.viewport.getDimensions();
	offsets = document.viewport.getScrollOffsets();
	
	if( xpos+18+tt_objW > document.viewport.getWidth() )
	{
		if(  xpos-18-tt_objW < offsets['left'] )
		{
			xpos = offsets['left'] + Math.floor(viewport['width']/2) - Math.floor(tt_objW/2);
		}
		else
		{
			xpos = xpos-18-tt_objW;
		}
	}
	
	if( ypos+18+tt_objH > document.viewport.getHeight() )
	{
		if(  ypos-18-tt_objH < offsets['top'] )
		{
			ypos = offsets['top'] + Math.floor(viewport['height']/2) - Math.floor(tt_objH/2);
		}
		else
		{
			ypos = ypos-18-tt_objH;
		}
	}
		
	tt_SetDivPos(xpos+18, ypos+18);
}

function tt_Move(t_ev)
{
	if( curr_el == false || $(curr_el).up('body') == undefined ) //element disappeared (mouseover a sentence, then sentence disappears
	{
		if( !tt_sticky )
		{
			tt_Hide(true);
			return;
		}
	}
	
	if (!tt_obj || tt_sticky ) return;
	var t_e = t_ev || window.event;

	if( tempStage )
	{
		tt_ShowDiv(true);
		tt_Pos(Event.pointerX(t_e),Event.pointerY(t_e));	
		tempStage = false;
	}
}



function tt_Hide(force)
{	
	if(tt_obj && ( !tt_sticky || force == true ) )
	{
		if( curr_el )
			$(curr_el).removeClassName('curr_tip');
		if( $('ttip_inner') )
			$('ttip_inner').update('');
		curr_el = false;
		tt_ShowDiv(false);
		tt_obj = null;
		Event.stopObserving(document,'mousemove',tt_Move);
	}
}


/**
 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 * Version : 2.01.A
 * By Binny V A
 * License : BSD
 */
shortcut = {
	'all_shortcuts':{},//All the shortcuts are stored in this array
	'add': function(shortcut_combination,callback,opt) {
		//Provide a set of default options
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		}
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}

		var ele = opt.target
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();

		//The function to be called at keypress
		var func = function(e) {
			e = e || window.event;
			
			if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;

				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
	
			//Find Which key is pressed
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			
			//var code = (e.charCode) ? e.charCode : e.keyCode;

			var character = String.fromCharCode(code);
			var re = /^([A-Z])$/;
			if( re.test(character) )
				character = character.toLowerCase();

			if(code == 188) character=","; //If the user presses , when the type is onkeydown
			if(code == 190) character="."; //If the user presses , when the type is onkeydown
	
			var keys = shortcut_combination.split("+");
			//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
			var kp = 0;
			
			//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			}
			//Special Keys - and their codes
			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
	
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
				
				'pause':19,
				'break':19,
				
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
				
				'pageup':33,
				'page_up':33,
				'pu':33,
	
				'pagedown':34,
				'page_down':34,
				'pd':34,
	
				'left':37,
				'up':38,
				'right':39,
				'down':40,
	
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123,
				'`':192
			}
	
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	//Meta is Mac specific
			};
                        
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
                        
			for(var i=0; k=keys[i],i<keys.length; i++) {
				//Modifiers
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;

				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;

				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1 || k == '`') { //If it is a special key
					if(special_keys[k] == code) kp++;
					
				} else if(opt['keycode']) {
					if(opt['keycode'] == code) kp++;

				} else { //The special keys did not match
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}

			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
	
				if(!opt['propagate']) { //Stop the event
					//e.cancelBubble is supported by IE - this will kill the bubbling process.
					e.cancelBubble = true;
					e.returnValue = false;
	
					//e.stopPropagation works in Firefox.
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		}
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		//Attach the function with the event
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},

	//Remove the shortcut - just specify the shortcut and I will remove the binding
	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination])
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];

		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
}

function clearShortcuts(ids)
{
	for( i in ids )
	{
		shortcut.remove(ids[i]+"");
	}
}	

function toggleBox(id)
{
	$(id).checked  = ( $(id).checked == 'checked' || $(id).checked == true ) ? '' : 'checked';
	//alert($(id).checked);
}

var logJsErrors = true;
function ErrorSetting(msg, file_loc, line_no) {
	var url = window.location;
	
    if(logJsErrors){
    	new Ajax.Request(
		'index.php?page=misc/js_error&url='+url+'&line='+line_no+'&err='+msg,
		{
			encoding: 'Shift_JIS',
			method: 'post'
		}
		);
    }
     return true;
}

//window.onerror = ErrorSetting; 

/* used for autosizing textboxes */
if (window.Widget == undefined) window.Widget = {}; 

Widget.Textarea = Class.create({
  initialize: function(textarea, options)
  {
    this.textarea = $(textarea);
    this.options = $H({
      'min_height' : 30
    }).update(options);

    this.textarea.observe('keyup', this.refresh.bind(this));
    this.textarea.observe('focus', this.refresh.bind(this));

    this._shadow = new Element('div').setStyle({
      lineHeight : this.textarea.getStyle('lineHeight'),
      fontSize : this.textarea.getStyle('fontSize'),
      fontFamily : this.textarea.getStyle('fontFamily'),
      position : 'absolute',
      top: '-10000px',
      left: '-10000px',
      width: this.textarea.getWidth() + 'px'
    });
    this.textarea.insert({ after: this._shadow });
    this.refresh();  
  },

  refresh: function()
  { 
  	
    this._shadow.update($F(this.textarea).replace(/\n/g, '<br/>'));
    this.textarea.setStyle({
      height: Math.max(parseInt(this._shadow.getHeight()) + parseInt(this.textarea.getStyle('lineHeight').replace('px', '')), this.options.get('min_height')) + 'px'
    });
	
  }
});

function loadAutoResize(evt)
{
	el = Event.element(evt);
	new Widget.Textarea(el.id);
	Event.stopObserving(el,'click');
}

function addG(index,code)
	{
		$(index).value += code + " ";
		$(index).focus();
	}


function loadIkes()
{
	new Ajax.Request(
		'../index.php?page=user/ikes', 
		{
			onComplete: showIkes
		});	
		
}

function showIkes(xml)
{
	genPost(xml);
	
	//need to fix the height if the page is too small
	
	bDim = document.viewport.getDimensions();
  	bOff = document.viewport.getScrollOffsets();
  	$('ikes_box').style.maxHeight = (bDim['height']-40)+'px';
//	alert((bDim['height']-40)+'px');
	
	setOffset('ikes_box',false,20,20);
	shw('ikes_box');
	shw('dimmer');
}

function saveIkes()
{
	var postArgs = $('ikes_form').serialize(true);
	
	new Ajax.Request(
			'../index.php?page=user/ikes',
			{
				method: 'post', 
				parameters: postArgs,
				onComplete: genPost
			});
	hde('ikes_error');
	shw('ikes_save');
	return;  	
}

var masteryBox = false;
function loadMastery(el,wid,vector,btype)
{
	masteryBox = el;
	new Ajax.Request(
			'index.php?page=misc/mastery_alter&wid='+wid+'&vector='+vector+'&booktype='+btype,
			{
				method: 'get', 
				onComplete: displayMastery
			});
}

function displayMastery(xml)
{
	var jsonarr = jsonArr(xml);
	tt_Hide(true);
 	tip(masteryBox,jsonarr['body'],true,'300');
}

function setMastery(wid,vector,level,btype)
{
	tt_Hide(true);
	new Ajax.Request(
			'index.php?page=misc/mastery_alter&level='+level+'&wid='+wid+'&vector='+vector+'&booktype='+btype,
			{
				method: 'get', 
				onComplete: reloadMastery
			});
}

function reloadMastery(xml)
{
	var jsonarr = jsonArr(xml);
	masteryBox.update(jsonarr['body']);
}

function deleteERev(erid,rev_id)
{
	if( confirm("Are you sure you want to delete this review?") == true )
		jumpUrl('index.php?page=community/eresources_single&id='+erid+'&action=delete_review&review_id='+rev_id);
}

function uLesson(el,set_id)
{
	$(el).down('input').checked="checked";
	sets = $(el).up('div[class~="innerbody"]').select('[class~="set_boxes"]');
	sets.each(function(s) { 
		
		if( s.id == 'set_id_'+set_id )
			shw($(s));
		else
			hde($(s));
	});
}

function rateSentenceFind(rating)
{
	if( $('rate_box') )
	{	
		rateSentence($('rate_rid').value,rating,$('rate_box'),$('rate_wid').value);
	}
}

function loadUpcoming(sid,pg)
{
	new Ajax.Request(
			'index.php?page=quiz/schedule_lesson_liquid_upcoming&sched_id='+sid+'&pg='+pg,
			{
				method: 'get', 
				onComplete: genPost
			});
}

function showLHistory(el,id,type)
{
	showGeneric(el,'user/stats_list&id='+id+'&type='+type);
}

function shBox(id,show)
{
	if( show )
	{
		shw(id);
		shw(id+'_hide');
		hde(id+'_show');
		val = 'show';
	}
	else
	{
		hde(id);
		shw(id+'_show');
		hde(id+'_hide');	
		val = 'hide';
	}
	new Ajax.Request('index.php?page=quiz/select_lesson_hidelinks&id='+id+'&show='+val,{});
}

var graphSets = new Array();

function ofc_get_data( id )
{
	return graphSets[id];
}

function usageAddEx(uid,mid)
{
	var args = [];
	args['search'] = $F('addex_'+uid+'_'+mid);
	args['usage_id'] = uid;
	args['meaning_id'] = mid;
		
	new Ajax.Request(
			'index.php?page=grammar/individual_addex',
			{
				method: 'post',
				parameters: args,
				onComplete: genPost
			});

}

function usageAddExAlter(uid,mid,term,el)
{
	var args = [];
	args['usage_id'] = uid;
	args['meaning_id'] = mid;
	args['word_id'] = term;
	sel = $('term_'+uid+'_'+mid+'_'+term);
	sel.parentNode.removeChild(sel);
	if( $F(el) == 'on' || $F(el) == true ) //move to accepted
	{		
		$('addex_accept_'+uid+'_'+mid).appendChild(sel);	
		args['action'] = 'add';
	}
	else
	{
		$('addex_res_'+uid+'_'+mid).appendChild(sel);
		args['action'] = 'rem';
	}

	new Ajax.Request(
			'index.php?page=grammar/individual_addex',
			{
				method: 'post',
				parameters: args
			});

}

function suggestAdviser(el)
{
	tt_Hide(true);
	tip(el,$('suggest_adviser').innerHTML,true,'600','Become an adviser','suggest_adviser');
}

function suggestPolite(el,mid)
{
	tt_Hide(true);
	$('pmeaning_id').value = mid;
	tip(el,$('suggest_polite').innerHTML,true,'600','Suggest politeness levels','suggest_polite');

}

function suggestRelated(el,mid)
{
	tt_Hide(true);
	$('meaning_id').value = mid;
	tip(el,$('suggest_meaning').innerHTML,true,'600','Suggest a related meaning','suggest_meaning');

}

function rateNote(mnote_id,el,val)
{
	if( el.className == 'bold' )	return;
	el.className = 'bold';
	var otherRate = val == 'up' ? 'down' : 'up';
	$('rnote_'+otherRate+'_'+mnote_id).className = 'tlnk';
	$('urate_'+mnote_id).innerHTML = val == 'up' ? parseInt($('urate_'+mnote_id).innerHTML)+1 : parseInt($('urate_'+mnote_id).innerHTML)-1;
	 new Ajax.Request(
		'index.php?page=grammar/individual_nrate&mnote_id='+mnote_id+'&rate='+val, 
		{
			method: 'get'
		})
}

function setPref(key,value)
{
	new Ajax.Request('index.php?page=user/prefs_ajax_single&key='+key+'&value='+value); 
}

/**
 * jscolor, JavaScript Color Picker
 *
 * @version 1.3.1
 * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
 * @author  Jan Odvarko, http://odvarko.cz
 * @created 2008-06-15
 * @updated 2010-01-23
 * @link    http://jscolor.com
 */


var jscolor = {


	dir : 'http://img.renshuu.org/picker/', // location of jscolor directory (leave empty to autodetect)
	bindClass : 'color', // class name
	binding : true, // automatic binding via <input class="...">
	preloading : true, // use image preloading?


	install : function() {
		jscolor.addEvent(window, 'load', jscolor.init);
	},


	init : function() {
		if(jscolor.binding) {
			jscolor.bind();
		}
		if(jscolor.preloading) {
			jscolor.preload();
		}
	},


	getDir : function() {
		if(!jscolor.dir) {
			var detected = jscolor.detectDir();
			jscolor.dir = detected!==false ? detected : 'jscolor/';
		}
		return jscolor.dir;
	},


	detectDir : function() {
		var base = location.href;

		var e = document.getElementsByTagName('base');
		for(var i=0; i<e.length; i+=1) {
			if(e[i].href) { base = e[i].href; }
		}

		var e = document.getElementsByTagName('script');
		for(var i=0; i<e.length; i+=1) {
			if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {
				var src = new jscolor.URI(e[i].src);
				var srcAbs = src.toAbsolute(base);
				srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
				srcAbs.query = null;
				srcAbs.fragment = null;
				return srcAbs.toString();
			}
		}
		return false;
	},


	bind : function() {
		var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i');
		var e = document.getElementsByTagName('input');
		for(var i=0; i<e.length; i+=1) {
			var m;
			if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {
				var prop = {};
				if(m[3]) {
					try {
						eval('prop='+m[3]);
					} catch(eInvalidProp) {}
				}
				e[i].color = new jscolor.color(e[i], prop);
			}
		}
	},


	preload : function() {
		for(var fn in jscolor.imgRequire) {
			if(jscolor.imgRequire.hasOwnProperty(fn)) {
				jscolor.loadImage(fn);
			}
		}
	},


	images : {
		pad : [ 181, 101 ],
		sld : [ 16, 101 ],
		cross : [ 15, 15 ],
		arrow : [ 7, 11 ]
	},


	imgRequire : {},
	imgLoaded : {},


	requireImage : function(filename) {
		jscolor.imgRequire[filename] = true;
	},


	loadImage : function(filename) {
		if(!jscolor.imgLoaded[filename]) {
			jscolor.imgLoaded[filename] = new Image();
			jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;
		}
	},


	fetchElement : function(mixed) {
		return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
	},


	addEvent : function(el, evnt, func) {
		if(el.addEventListener) {
			el.addEventListener(evnt, func, false);
		} else if(el.attachEvent) {
			el.attachEvent('on'+evnt, func);
		}
	},


	fireEvent : function(el, evnt) {
		if(!el) {
			return;
		}
		if(document.createEventObject) {
			var ev = document.createEventObject();
			el.fireEvent('on'+evnt, ev);
		} else if(document.createEvent) {
			var ev = document.createEvent('HTMLEvents');
			ev.initEvent(evnt, true, true);
			el.dispatchEvent(ev);
		} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
			el['on'+evnt]();
		}
	},


	getElementPos : function(e) {
		var e1=e, e2=e;
		var x=0, y=0;
		if(e1.offsetParent) {
			do {
				x += e1.offsetLeft;
				y += e1.offsetTop;
			} while(e1 = e1.offsetParent);
		}
		while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {
			x -= e2.scrollLeft;
			y -= e2.scrollTop;
		}
		return [x, y];
	},


	getElementSize : function(e) {
		return [e.offsetWidth, e.offsetHeight];
	},


	getMousePos : function(e) {
		if(!e) { e = window.event; }
		if(typeof e.pageX === 'number') {
			return [e.pageX, e.pageY];
		} else if(typeof e.clientX === 'number') {
			return [
				e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
				e.clientY + document.body.scrollTop + document.documentElement.scrollTop
			];
		}
	},


	getViewPos : function() {
		if(typeof window.pageYOffset === 'number') {
			return [window.pageXOffset, window.pageYOffset];
		} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
			return [document.body.scrollLeft, document.body.scrollTop];
		} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
			return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
		} else {
			return [0, 0];
		}
	},


	getViewSize : function() {
		if(typeof window.innerWidth === 'number') {
			return [window.innerWidth, window.innerHeight];
		} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
			return [document.body.clientWidth, document.body.clientHeight];
		} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
			return [document.documentElement.clientWidth, document.documentElement.clientHeight];
		} else {
			return [0, 0];
		}
	},


	URI : function(uri) { // See RFC3986

		this.scheme = null;
		this.authority = null;
		this.path = '';
		this.query = null;
		this.fragment = null;

		this.parse = function(uri) {
			var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);
			this.scheme = m[3] ? m[2] : null;
			this.authority = m[5] ? m[6] : null;
			this.path = m[7];
			this.query = m[9] ? m[10] : null;
			this.fragment = m[12] ? m[13] : null;
			return this;
		};

		this.toString = function() {
			var result = '';
			if(this.scheme !== null) { result = result + this.scheme + ':'; }
			if(this.authority !== null) { result = result + '//' + this.authority; }
			if(this.path !== null) { result = result + this.path; }
			if(this.query !== null) { result = result + '?' + this.query; }
			if(this.fragment !== null) { result = result + '#' + this.fragment; }
			return result;
		};

		this.toAbsolute = function(base) {
			var base = new jscolor.URI(base);
			var r = this;
			var t = new jscolor.URI;

			if(base.scheme === null) { return false; }

			if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {
				r.scheme = null;
			}

			if(r.scheme !== null) {
				t.scheme = r.scheme;
				t.authority = r.authority;
				t.path = removeDotSegments(r.path);
				t.query = r.query;
			} else {
				if(r.authority !== null) {
					t.authority = r.authority;
					t.path = removeDotSegments(r.path);
					t.query = r.query;
				} else {
					if(r.path === '') { // TODO: == or === ?
						t.path = base.path;
						if(r.query !== null) {
							t.query = r.query;
						} else {
							t.query = base.query;
						}
					} else {
						if(r.path.substr(0,1) === '/') {
							t.path = removeDotSegments(r.path);
						} else {
							if(base.authority !== null && base.path === '') { // TODO: == or === ?
								t.path = '/'+r.path;
							} else {
								t.path = base.path.replace(/[^\/]+$/,'')+r.path;
							}
							t.path = removeDotSegments(t.path);
						}
						t.query = r.query;
					}
					t.authority = base.authority;
				}
				t.scheme = base.scheme;
			}
			t.fragment = r.fragment;

			return t;
		};

		function removeDotSegments(path) {
			var out = '';
			while(path) {
				if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {
					path = path.replace(/^\.+/,'').substr(1);
				} else if(path.substr(0,3)==='/./' || path==='/.') {
					path = '/'+path.substr(3);
				} else if(path.substr(0,4)==='/../' || path==='/..') {
					path = '/'+path.substr(4);
					out = out.replace(/\/?[^\/]*$/, '');
				} else if(path==='.' || path==='..') {
					path = '';
				} else {
					var rm = path.match(/^\/?[^\/]*/)[0];
					path = path.substr(rm.length);
					out = out + rm;
				}
			}
			return out;
		}

		if(uri) {
			this.parse(uri);
		}

	},


	/*
	 * Usage example:
	 * var myColor = new jscolor.color(myInputElement)
	 */

	color : function(target, prop) {


		this.required = true; // refuse empty values?
		this.adjust = true; // adjust value to uniform notation?
		this.hash = false; // prefix color with # symbol?
		this.caps = true; // uppercase?
		this.valueElement = target; // value holder
		this.styleElement = target; // where to reflect current color
		this.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1
		this.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1

		this.pickerOnfocus = true; // display picker on focus?
		this.pickerMode = 'HSV'; // HSV | HVS
		this.pickerPosition = 'bottom'; // left | right | top | bottom
		this.pickerFace = 10; // px
		this.pickerFaceColor = 'ThreeDFace'; // CSS color
		this.pickerBorder = 1; // px
		this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
		this.pickerInset = 1; // px
		this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
		this.pickerZIndex = 10000;


		for(var p in prop) {
			if(prop.hasOwnProperty(p)) {
				this[p] = prop[p];
			}
		}


		this.hidePicker = function() {
			if(isPickerOwner()) {
				removePicker();
			}
		};


		this.showPicker = function() {
			if(!isPickerOwner()) {
				var tp = jscolor.getElementPos(target); // target pos
				var ts = jscolor.getElementSize(target); // target size
				var vp = jscolor.getViewPos(); // view pos
				var vs = jscolor.getViewSize(); // view size
				var ps = [ // picker size
					2*this.pickerBorder + 4*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0],
					2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1]
				];
				var a, b, c;
				switch(this.pickerPosition.toLowerCase()) {
					case 'left': a=1; b=0; c=-1; break;
					case 'right':a=1; b=0; c=1; break;
					case 'top':  a=0; b=1; c=-1; break;
					default:     a=0; b=1; c=1; break;
				}
				var l = (ts[b]+ps[b])/2;
				var pp = [ // picker pos
					-vp[a]+tp[a]+ps[a] > vs[a] ?
						(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
						tp[a],
					-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
						(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
						(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
				];
				drawPicker(pp[a], pp[b]);
			}
		};


		this.importColor = function() {
			if(!valueElement) {
				this.exportColor();
			} else {
				if(!this.adjust) {
					if(!this.fromString(valueElement.value, leaveValue)) {
						styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
						styleElement.style.color = styleElement.jscStyle.color;
						this.exportColor(leaveValue | leaveStyle);
					}
				} else if(!this.required && /^\s*$/.test(valueElement.value)) {
					valueElement.value = '';
					styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
					styleElement.style.color = styleElement.jscStyle.color;
					this.exportColor(leaveValue | leaveStyle);

				} else if(this.fromString(valueElement.value)) {
					// OK
				} else {
					this.exportColor();
				}
			}
		};


		this.exportColor = function(flags) {
			if(!(flags & leaveValue) && valueElement) {
				var value = this.toString();
				if(this.caps) { value = value.toUpperCase(); }
				if(this.hash) { value = '#'+value; }
				valueElement.value = value;
				
				$('normal_png').style.backgroundColor = '#'+value;
				$('inverted_png').style.backgroundColor = '#'+value;
			}
			if(!(flags & leaveStyle) && styleElement) {
				styleElement.style.backgroundColor =
					'#'+this.toString();
				styleElement.style.color =
					0.213 * this.rgb[0] +
					0.715 * this.rgb[1] +
					0.072 * this.rgb[2]
					< 0.5 ? '#FFF' : '#000';
			}
			if(!(flags & leavePad) && isPickerOwner()) {
				redrawPad();
			}
			if(!(flags & leaveSld) && isPickerOwner()) {
				redrawSld();
			}
		};


		this.fromHSV = function(h, s, v, flags) { // null = don't change
			h<0 && (h=0) || h>6 && (h=6);
			s<0 && (s=0) || s>1 && (s=1);
			v<0 && (v=0) || v>1 && (v=1);
			this.rgb = HSV_RGB(
				h===null ? this.hsv[0] : (this.hsv[0]=h),
				s===null ? this.hsv[1] : (this.hsv[1]=s),
				v===null ? this.hsv[2] : (this.hsv[2]=v)
			);
			this.exportColor(flags);
		};


		this.fromRGB = function(r, g, b, flags) { // null = don't change
			r<0 && (r=0) || r>1 && (r=1);
			g<0 && (g=0) || g>1 && (g=1);
			b<0 && (b=0) || b>1 && (b=1);
			var hsv = RGB_HSV(
				r===null ? this.rgb[0] : (this.rgb[0]=r),
				g===null ? this.rgb[1] : (this.rgb[1]=g),
				b===null ? this.rgb[2] : (this.rgb[2]=b)
			);
			if(hsv[0] !== null) {
				this.hsv[0] = hsv[0];
			}
			if(hsv[2] !== 0) {
				this.hsv[1] = hsv[1];
			}
			this.hsv[2] = hsv[2];
			this.exportColor(flags);
		};


		this.fromString = function(hex, flags) {
			var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
			if(!m) {
				return false;
			} else {
				if(m[1].length === 6) { // 6-char notation
					this.fromRGB(
						parseInt(m[1].substr(0,2),16) / 255,
						parseInt(m[1].substr(2,2),16) / 255,
						parseInt(m[1].substr(4,2),16) / 255,
						flags
					);
				} else { // 3-char notation
					this.fromRGB(
						parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,
						parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,
						parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,
						flags
					);
				}
				return true;
			}
		};


		this.toString = function() {
			return (
				(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +
				(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +
				(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)
			);
		};


		function RGB_HSV(r, g, b) {
			var n = Math.min(Math.min(r,g),b);
			var v = Math.max(Math.max(r,g),b);
			var m = v - n;
			if(m === 0) { return [ null, 0, v ]; }
			var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
			return [ h===6?0:h, m/v, v ];
		}


		function HSV_RGB(h, s, v) {
			if(h === null) { return [ v, v, v ]; }
			var i = Math.floor(h);
			var f = i%2 ? h-i : 1-(h-i);
			var m = v * (1 - s);
			var n = v * (1 - s*f);
			switch(i) {
				case 6:
				case 0: return [v,n,m];
				case 1: return [n,v,m];
				case 2: return [m,v,n];
				case 3: return [m,n,v];
				case 4: return [n,m,v];
				case 5: return [v,m,n];
			}
		}


		function removePicker() {
			delete jscolor.picker.owner;
			document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);
		}


		function drawPicker(x, y) {
			if(!jscolor.picker) {
				jscolor.picker = {
					box : document.createElement('div'),
					boxB : document.createElement('div'),
					pad : document.createElement('div'),
					padB : document.createElement('div'),
					padM : document.createElement('div'),
					sld : document.createElement('div'),
					sldB : document.createElement('div'),
					sldM : document.createElement('div')
				};
				for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {
					var seg = document.createElement('div');
					seg.style.height = segSize+'px';
					seg.style.fontSize = '1px';
					seg.style.lineHeight = '0';
					jscolor.picker.sld.appendChild(seg);
				}
				jscolor.picker.sldB.appendChild(jscolor.picker.sld);
				jscolor.picker.box.appendChild(jscolor.picker.sldB);
				jscolor.picker.box.appendChild(jscolor.picker.sldM);
				jscolor.picker.padB.appendChild(jscolor.picker.pad);
				jscolor.picker.box.appendChild(jscolor.picker.padB);
				jscolor.picker.box.appendChild(jscolor.picker.padM);
				jscolor.picker.boxB.appendChild(jscolor.picker.box);
			}

			var p = jscolor.picker;

			// recompute controls positions
			posPad = [
				x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset,
				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];
			posSld = [
				null,
				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];

			// controls interaction
			p.box.onmouseup =
			p.box.onmouseout = function() { target.focus(); };
			p.box.onmousedown = function() { abortBlur=true; };
			p.box.onmousemove = function(e) { holdPad && setPad(e); holdSld && setSld(e); };
			p.padM.onmouseup =
			p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };
			p.padM.onmousedown = function(e) { holdPad=true; setPad(e); };
			p.sldM.onmouseup =
			p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };
			p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); };

			// picker
			p.box.style.width = 4*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] + 'px';
			p.box.style.height = 2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1] + 'px';

			// picker border
			p.boxB.style.position = 'absolute';
			p.boxB.style.clear = 'both';
			p.boxB.style.left = x+'px';
			p.boxB.style.top = y+'px';
			p.boxB.style.zIndex = THIS.pickerZIndex;
			p.boxB.style.border = THIS.pickerBorder+'px solid';
			p.boxB.style.borderColor = THIS.pickerBorderColor;
			p.boxB.style.background = THIS.pickerFaceColor;

			// pad image
			p.pad.style.width = jscolor.images.pad[0]+'px';
			p.pad.style.height = jscolor.images.pad[1]+'px';

			// pad border
			p.padB.style.position = 'absolute';
			p.padB.style.left = THIS.pickerFace+'px';
			p.padB.style.top = THIS.pickerFace+'px';
			p.padB.style.border = THIS.pickerInset+'px solid';
			p.padB.style.borderColor = THIS.pickerInsetColor;

			// pad mouse area
			p.padM.style.position = 'absolute';
			p.padM.style.left = '0';
			p.padM.style.top = '0';
			p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';
			p.padM.style.height = p.box.style.height;
			p.padM.style.cursor = 'crosshair';

			// slider image
			p.sld.style.overflow = 'hidden';
			p.sld.style.width = jscolor.images.sld[0]+'px';
			p.sld.style.height = jscolor.images.sld[1]+'px';

			// slider border
			p.sldB.style.position = 'absolute';
			p.sldB.style.right = THIS.pickerFace+'px';
			p.sldB.style.top = THIS.pickerFace+'px';
			p.sldB.style.border = THIS.pickerInset+'px solid';
			p.sldB.style.borderColor = THIS.pickerInsetColor;

			// slider mouse area
			p.sldM.style.position = 'absolute';
			p.sldM.style.right = '0';
			p.sldM.style.top = '0';
			p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';
			p.sldM.style.height = p.box.style.height;
			try {
				p.sldM.style.cursor = 'pointer';
			} catch(eOldIE) {
				p.sldM.style.cursor = 'hand';
			}

			// load images in optimal order
			switch(modeID) {
				case 0: var padImg = 'hs.png'; break;
				case 1: var padImg = 'hv.png'; break;
			}
			p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat";
			p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat";
			p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat";

			// place pointers
			redrawPad();
			redrawSld();

			jscolor.picker.owner = THIS;
			document.getElementsByTagName('body')[0].appendChild(p.boxB);
		}


		function redrawPad() {
			// redraw the pad pointer
			switch(modeID) {
				case 0: var yComponent = 1; break;
				case 1: var yComponent = 2; break;
			}
			var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));
			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));
			jscolor.picker.padM.style.backgroundPosition =
				(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +
				(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';

			// redraw the slider image
			var seg = jscolor.picker.sld.childNodes;

			switch(modeID) {
				case 0:
					var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
					for(var i=0; i<seg.length; i+=1) {
						seg[i].style.backgroundColor = 'rgb('+
							(rgb[0]*(1-i/seg.length)*100)+'%,'+
							(rgb[1]*(1-i/seg.length)*100)+'%,'+
							(rgb[2]*(1-i/seg.length)*100)+'%)';
					}
					break;
				case 1:
					var rgb, s, c = [ THIS.hsv[2], 0, 0 ];
					var i = Math.floor(THIS.hsv[0]);
					var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);
					switch(i) {
						case 6:
						case 0: rgb=[0,1,2]; break;
						case 1: rgb=[1,0,2]; break;
						case 2: rgb=[2,0,1]; break;
						case 3: rgb=[2,1,0]; break;
						case 4: rgb=[1,2,0]; break;
						case 5: rgb=[0,2,1]; break;
					}
					for(var i=0; i<seg.length; i+=1) {
						s = 1 - 1/(seg.length-1)*i;
						c[1] = c[0] * (1 - s*f);
						c[2] = c[0] * (1 - s);
						seg[i].style.backgroundColor = 'rgb('+
							(c[rgb[0]]*100)+'%,'+
							(c[rgb[1]]*100)+'%,'+
							(c[rgb[2]]*100)+'%)';
					}
					break;
			}
		}


		function redrawSld() {
			// redraw the slider pointer
			switch(modeID) {
				case 0: var yComponent = 2; break;
				case 1: var yComponent = 1; break;
			}
			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));
			jscolor.picker.sldM.style.backgroundPosition =
				'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';
		}


		function isPickerOwner() {
			return jscolor.picker && jscolor.picker.owner === THIS;
		}


		function blurTarget() {
			if(valueElement === target) {
				THIS.importColor();
			}
			if(THIS.pickerOnfocus) {
				THIS.hidePicker();
			}
		}


		function blurValue() {
			if(valueElement !== target) {
				THIS.importColor();
			}
		}


		function setPad(e) {
			var posM = jscolor.getMousePos(e);
			var x = posM[0]-posPad[0];
			var y = posM[1]-posPad[1];
			switch(modeID) {
				case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;
				case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;
			}
		}


		function setSld(e) {
			var posM = jscolor.getMousePos(e);
			var y = posM[1]-posPad[1];
			switch(modeID) {
				case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;
				case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;
			}
		}


		var THIS = this;
		var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;
		var abortBlur = false;
		var
			valueElement = jscolor.fetchElement(this.valueElement),
			styleElement = jscolor.fetchElement(this.styleElement);
		var
			holdPad = false,
			holdSld = false;
		var
			posPad,
			posSld;
		var
			leaveValue = 1<<0,
			leaveStyle = 1<<1,
			leavePad = 1<<2,
			leaveSld = 1<<3;

		// target
		jscolor.addEvent(target, 'focus', function() {
			if(THIS.pickerOnfocus) { THIS.showPicker(); }
		});
		jscolor.addEvent(target, 'blur', function() {
			if(!abortBlur) {
				window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);
			} else {
				abortBlur = false;
			}
		});

		// valueElement
		if(valueElement) {
			var updateField = function() {
				THIS.fromString(valueElement.value, leaveValue);
			};
			jscolor.addEvent(valueElement, 'keyup', updateField);
			jscolor.addEvent(valueElement, 'input', updateField);
			jscolor.addEvent(valueElement, 'blur', blurValue);
			valueElement.setAttribute('autocomplete', 'off');
		}

		// styleElement
		if(styleElement) {
			styleElement.jscStyle = {
				backgroundColor : styleElement.style.backgroundColor,
				color : styleElement.style.color
			};
		}

		// require images
		switch(modeID) {
			case 0: jscolor.requireImage('hs.png'); break;
			case 1: jscolor.requireImage('hv.png'); break;
		}
		jscolor.requireImage('cross.gif');
		jscolor.requireImage('arrow.gif');

		this.importColor();
	}

};


jscolor.install();

function addGSentence(mid)
{
	form = $('add_gsentence_'+mid);
	params = form.serialize(true);
	
		new Ajax.Request(
		'../index.php?page=grammar/individual_add_gsentence', 
		{
			method: 'post', 
			parameters: params, 
			onComplete: addGPost
		});
	$('addg_button_'+mid).disable();
}

function addGPost(xml)
{
	var jsonarr = jsonArr(xml);
	$('g_japanese_'+jsonarr['meaning_id']).value = '';
	$('g_english_'+jsonarr['meaning_id']).value='';
	$('addg_button_'+jsonarr['meaning_id']).enable();
	$('added_sentences_'+jsonarr['meaning_id']).update(jsonarr['added_sentences_'+jsonarr['meaning_id']]);
	genPost(xml);
}

var bindSentenceEl;
function bindUReibun(el,rid,revid)
{
	 tip(el,"Please wait while your sentence is loaded..",true,600,"Loading your data...");	
	bindSentenceEl = el;
	new Ajax.Request(
			'index.php?page=user/ureibun_setraw&urid='+rid+'&rev_id='+revid+'&action=load', 
			{
				method: 'post', 
				onComplete: bindUPost
			});
}

function bindUPost(xml)
{
	var jsonarr = jsonArr(xml);
	tt_Hide(true);
	
	if( !jsonarr['finish'] )
		tip(bindSentenceEl,jsonarr['body'],true,'800','Bind sentence to vocabulary');
	else
	{
		$('bindlnk_'+jsonarr['reibun_id']).update('edit bindings');
		$('display_'+jsonarr['reibun_id']).update(jsonarr['fsentence']);
	}
}

function bindUSend(rid,revid,action)
{
	var form = $('uparse_'+rid+'_'+revid);
	
	if( action == 'reparse' )
	{	
		$('reparse_'+rid+'-'+revid).value = 'Parsing...';
		$('reparse_'+rid+'-'+revid).disable();
	}
	
	new Ajax.Request(
	'index.php?page=user/ureibun_setraw&urid='+rid+'&rev_id='+revid+'&action='+action, 
	{
		method: 'post', 
		onComplete: bindUPost,
		parameters: form.serialize(true)
	});

}