/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo._base.query"]){
dojo._hasResource["dojo._base.query"]=true;
if(typeof dojo!="undefined"){
dojo.provide("dojo._base.query");
dojo.require("dojo._base.NodeList");
dojo.query=function(_1,_2,_3){
_3=_3||dojo.NodeList;
if(!_1){
return new _3();
}
if(_1.constructor==_3){
return _1;
}
if(!dojo.isString(_1)){
return new _3(_1);
}
if(dojo.isString(_2)){
_2=dojo.byId(_2);
if(!_2){
return new _3();
}
}
return dojo.Sizzle(_1,_2,new _3());
};
dojo._filterQueryResult=function(_4,_5){
return dojo.Sizzle.filter(_5,_4);
};
}
(function(ns){
var _6=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,_7=0,_8=Object.prototype.toString;
var _9=function(_a,_b,_c,_d){
_c=_c||[];
_b=_b||document;
if(_b.nodeType!==1&&_b.nodeType!==9){
return [];
}
if(!_a||typeof _a!=="string"){
return _c;
}
var _e=[],m,_f,_10,_11,_12,_13,_14=true;
_6.lastIndex=0;
while((m=_6.exec(_a))!==null){
_e.push(m[1]);
if(m[2]){
_13=RegExp.rightContext;
break;
}
}
if(_e.length>1&&_15.match.POS.exec(_a)){
if(_e.length===2&&_15.relative[_e[0]]){
var _16="",_17;
while((_17=_15.match.POS.exec(_a))){
_16+=_17[0];
_a=_a.replace(_15.match.POS,"");
}
_f=_9.filter(_16,_9(_a,_b));
}else{
_f=_15.relative[_e[0]]?[_b]:_9(_e.shift(),_b);
while(_e.length){
var _18=[];
_a=_e.shift();
if(_15.relative[_a]){
_a+=_e.shift();
}
for(var i=0,l=_f.length;i<l;i++){
_9(_a,_f[i],_18);
}
_f=_18;
}
}
}else{
var ret=_d?{expr:_e.pop(),set:_19(_d)}:_9.find(_e.pop(),_e.length===1&&_b.parentNode?_b.parentNode:_b);
_f=_9.filter(ret.expr,ret.set);
if(_e.length>0){
_10=_19(_f);
}else{
_14=false;
}
while(_e.length){
var cur=_e.pop(),pop=cur;
if(!_15.relative[cur]){
cur="";
}else{
pop=_e.pop();
}
if(pop==null){
pop=_b;
}
_15.relative[cur](_10,pop);
}
}
if(!_10){
_10=_f;
}
if(!_10){
throw "Syntax error, unrecognized expression: "+(cur||_a);
}
if(_8.call(_10)==="[object Array]"){
if(!_14){
_c.push.apply(_c,_10);
}else{
if(_b.nodeType===1){
for(var i=0;_10[i]!=null;i++){
if(_10[i]&&(_10[i]===true||_10[i].nodeType===1&&_1a(_b,_10[i]))){
_c.push(_f[i]);
}
}
}else{
for(var i=0;_10[i]!=null;i++){
if(_10[i]&&_10[i].nodeType===1){
_c.push(_f[i]);
}
}
}
}
}else{
_19(_10,_c);
}
if(_13){
_9(_13,_b,_c,_d);
}
return _c;
};
_9.matches=function(_1b,set){
return _9(_1b,null,null,set);
};
_9.find=function(_1c,_1d){
var set,_1e;
if(!_1c){
return [];
}
for(var i=0,l=_15.order.length;i<l;i++){
var _1f=_15.order[i],_1e;
if((_1e=_15.match[_1f].exec(_1c))){
var _20=RegExp.leftContext;
if(_20.substr(_20.length-1)!=="\\"){
_1e[1]=(_1e[1]||"").replace(/\\/g,"");
set=_15.find[_1f](_1e,_1d);
if(set!=null){
_1c=_1c.replace(_15.match[_1f],"");
break;
}
}
}
}
if(!set){
set=_1d.getElementsByTagName("*");
}
return {set:set,expr:_1c};
};
_9.filter=function(_21,set,_22,not){
var old=_21,_23=[],_24=set,_25,_26;
while(_21&&set.length){
for(var _27 in _15.filter){
if((_25=_15.match[_27].exec(_21))!=null){
var _28=_15.filter[_27],_29=null,_2a=0,_2b,_2c;
_26=false;
if(_24==_23){
_23=[];
}
if(_15.preFilter[_27]){
_25=_15.preFilter[_27](_25,_24,_22,_23,not);
if(!_25){
_26=_2b=true;
}else{
if(_25[0]===true){
_29=[];
var _2d=null,_2e;
for(var i=0;(_2e=_24[i])!==undefined;i++){
if(_2e&&_2d!==_2e){
_29.push(_2e);
_2d=_2e;
}
}
}
}
}
if(_25){
for(var i=0;(_2c=_24[i])!==undefined;i++){
if(_2c){
if(_29&&_2c!=_29[_2a]){
_2a++;
}
_2b=_28(_2c,_25,_2a,_29);
var _2f=not^!!_2b;
if(_22&&_2b!=null){
if(_2f){
_26=true;
}else{
_24[i]=false;
}
}else{
if(_2f){
_23.push(_2c);
_26=true;
}
}
}
}
}
if(_2b!==undefined){
if(!_22){
_24=_23;
}
_21=_21.replace(_15.match[_27],"");
if(!_26){
return [];
}
break;
}
}
}
_21=_21.replace(/\s*,\s*/,"");
if(_21==old){
if(_26==null){
throw "Syntax error, unrecognized expression: "+_21;
}else{
break;
}
}
old=_21;
}
return _24;
};
var _15=_9.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,TAG:/^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,PSEUDO:/:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},relative:{"+":function(_30,_31){
for(var i=0,l=_30.length;i<l;i++){
var _32=_30[i];
if(_32){
var cur=_32.previousSibling;
while(cur&&cur.nodeType!==1){
cur=cur.previousSibling;
}
_30[i]=typeof _31==="string"?cur||false:cur===_31;
}
}
if(typeof _31==="string"){
_9.filter(_31,_30,true);
}
},">":function(_33,_34){
if(typeof _34==="string"&&!/\W/.test(_34)){
_34=_34.toUpperCase();
for(var i=0,l=_33.length;i<l;i++){
var _35=_33[i];
if(_35){
var _36=_35.parentNode;
_33[i]=_36.nodeName===_34?_36:false;
}
}
}else{
for(var i=0,l=_33.length;i<l;i++){
var _35=_33[i];
if(_35){
_33[i]=typeof _34==="string"?_35.parentNode:_35.parentNode===_34;
}
}
if(typeof _34==="string"){
_9.filter(_34,_33,true);
}
}
},"":function(_37,_38){
var _39="done"+(_7++),_3a=_3b;
if(!_38.match(/\W/)){
var _3c=_38=_38.toUpperCase();
_3a=_3d;
}
_3a("parentNode",_38,_39,_37,_3c);
},"~":function(_3e,_3f){
var _40="done"+(_7++),_41=_3b;
if(typeof _3f==="string"&&!_3f.match(/\W/)){
var _42=_3f=_3f.toUpperCase();
_41=_3d;
}
_41("previousSibling",_3f,_40,_3e,_42);
}},find:{ID:function(_43,_44){
if(_44.getElementById){
var m=_44.getElementById(_43[1]);
return m?[m]:[];
}
},NAME:function(_45,_46){
return _46.getElementsByName?_46.getElementsByName(_45[1]):null;
},TAG:function(_47,_48){
return _48.getElementsByTagName(_47[1]);
}},preFilter:{CLASS:function(_49,_4a,_4b,_4c,not){
_49=" "+_49[1].replace(/\\/g,"")+" ";
for(var i=0;_4a[i];i++){
if(not^(" "+_4a[i].className+" ").indexOf(_49)>=0){
if(!_4b){
_4c.push(_4a[i]);
}
}else{
if(_4b){
_4a[i]=false;
}
}
}
return false;
},ID:function(_4d){
return _4d[1];
},TAG:function(_4e){
return _4e[1].toUpperCase();
},CHILD:function(_4f){
if(_4f[1]=="nth"){
var _50=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(_4f[2]=="even"&&"2n"||_4f[2]=="odd"&&"2n+1"||!/\D/.test(_4f[2])&&"0n+"+_4f[2]||_4f[2]);
_4f[2]=(_50[1]+(_50[2]||1))-0;
_4f[3]=_50[3]-0;
}
_4f[0]="done"+(_7++);
return _4f;
},ATTR:function(_51){
var _52=_51[1];
if(_15.attrMap[_52]){
_51[1]=_15.attrMap[_52];
}
if(_51[2]==="~="){
_51[4]=" "+_51[4]+" ";
}
return _51;
},PSEUDO:function(_53,_54,_55,_56,not){
if(_53[1]==="not"){
if(_53[3].match(_6).length>1){
_53[3]=_9(_53[3],null,null,_54);
}else{
var ret=_9.filter(_53[3],_54,_55,true^not);
if(!_55){
_56.push.apply(_56,ret);
}
return false;
}
}
return _53;
},POS:function(_57){
_57.unshift(true);
return _57;
}},filters:{enabled:function(_58){
return _58.disabled===false&&_58.type!=="hidden";
},disabled:function(_59){
return _59.disabled===true;
},checked:function(_5a){
return _5a.checked===true;
},selected:function(_5b){
_5b.parentNode.selectedIndex;
return _5b.selected===true;
},parent:function(_5c){
return !!_5c.firstChild;
},empty:function(_5d){
return !_5d.firstChild;
},has:function(_5e,i,_5f){
return !!_9(_5f[3],_5e).length;
},header:function(_60){
return /h\d/i.test(_60.nodeName);
},text:function(_61){
return "text"===_61.type;
},radio:function(_62){
return "radio"===_62.type;
},checkbox:function(_63){
return "checkbox"===_63.type;
},file:function(_64){
return "file"===_64.type;
},password:function(_65){
return "password"===_65.type;
},submit:function(_66){
return "submit"===_66.type;
},image:function(_67){
return "image"===_67.type;
},reset:function(_68){
return "reset"===_68.type;
},button:function(_69){
return "button"===_69.type||_69.nodeName.toUpperCase()==="BUTTON";
},input:function(_6a){
return /input|select|textarea|button/i.test(_6a.nodeName);
}},setFilters:{first:function(_6b,i){
return i===0;
},last:function(_6c,i,_6d,_6e){
return i===_6e.length-1;
},even:function(_6f,i){
return i%2===0;
},odd:function(_70,i){
return i%2===1;
},lt:function(_71,i,_72){
return i<_72[3]-0;
},gt:function(_73,i,_74){
return i>_74[3]-0;
},nth:function(_75,i,_76){
return _76[3]-0==i;
},eq:function(_77,i,_78){
return _78[3]-0==i;
}},filter:{CHILD:function(_79,_7a){
var _7b=_7a[1],_7c=_79.parentNode;
var _7d=_7a[0];
if(_7c&&!_7c[_7d]){
var _7e=1;
for(var _7f=_7c.firstChild;_7f;_7f=_7f.nextSibling){
if(_7f.nodeType==1){
_7f.nodeIndex=_7e++;
}
}
_7c[_7d]=_7e-1;
}
if(_7b=="first"){
return _79.nodeIndex==1;
}else{
if(_7b=="last"){
return _79.nodeIndex==_7c[_7d];
}else{
if(_7b=="only"){
return _7c[_7d]==1;
}else{
if(_7b=="nth"){
var add=false,_80=_7a[2],_81=_7a[3];
if(_80==1&&_81==0){
return true;
}
if(_80==0){
if(_79.nodeIndex==_81){
add=true;
}
}else{
if((_79.nodeIndex-_81)%_80==0&&(_79.nodeIndex-_81)/_80>=0){
add=true;
}
}
return add;
}
}
}
}
},PSEUDO:function(_82,_83,i,_84){
var _85=_83[1],_86=_15.filters[_85];
if(_86){
return _86(_82,i,_83,_84);
}else{
if(_85==="contains"){
return (_82.textContent||_82.innerText||"").indexOf(_83[3])>=0;
}else{
if(_85==="not"){
var not=_83[3];
for(var i=0,l=not.length;i<l;i++){
if(not[i]===_82){
return false;
}
}
return true;
}
}
}
},ID:function(_87,_88){
return _87.nodeType===1&&_87.getAttribute("id")===_88;
},TAG:function(_89,_8a){
return (_8a==="*"&&_89.nodeType===1)||_89.nodeName===_8a;
},CLASS:function(_8b,_8c){
return _8c.test(_8b.className);
},ATTR:function(_8d,_8e){
var _8f=_8d[_8e[1]]||_8d.getAttribute(_8e[1]),_90=_8f+"",_91=_8e[2],_92=_8e[4];
return _8f==null?false:_91==="="?_90===_92:_91==="*="?_90.indexOf(_92)>=0:_91==="~="?(" "+_90+" ").indexOf(_92)>=0:!_8e[4]?_8f:_91==="!="?_90!=_92:_91==="^="?_90.indexOf(_92)===0:_91==="$="?_90.substr(_90.length-_92.length)===_92:_91==="|="?_90===_92||_90.substr(0,_92.length+1)===_92+"-":false;
},POS:function(_93,_94,i,_95){
var _96=_94[2],_97=_15.setFilters[_96];
if(_97){
return _97(_93,i,_94,_95);
}
}}};
for(var _98 in _15.match){
_15.match[_98]=RegExp(_15.match[_98].source+/(?![^\[]*\])(?![^\(]*\))/.source);
}
var _19=function(_99,_9a){
_99=Array.prototype.slice.call(_99);
if(_9a){
_9a.push.apply(_9a,_99);
return _9a;
}
return _99;
};
try{
Array.prototype.slice.call(document.documentElement.childNodes);
}
catch(e){
_19=function(_9b,_9c){
var ret=_9c||[];
if(_8.call(_9b)==="[object Array]"){
Array.prototype.push.apply(ret,_9b);
}else{
if(typeof _9b.length==="number"){
for(var i=0,l=_9b.length;i<l;i++){
ret.push(_9b[i]);
}
}else{
for(var i=0;_9b[i];i++){
ret.push(_9b[i]);
}
}
}
return ret;
};
}
(function(){
var _9d=document.createElement("form"),id="script"+(new Date).getTime();
_9d.innerHTML="<input name='"+id+"'/>";
var _9e=document.documentElement;
_9e.insertBefore(_9d,_9e.firstChild);
if(!!document.getElementById(id)){
_15.find.ID=function(_9f,_a0){
if(_a0.getElementById){
var m=_a0.getElementById(_9f[1]);
return m?m.id===_9f[1]||m.getAttributeNode&&m.getAttributeNode("id").nodeValue===_9f[1]?[m]:undefined:[];
}
};
_15.filter.ID=function(_a1,_a2){
var _a3=_a1.getAttributeNode&&_a1.getAttributeNode("id");
return _a1.nodeType===1&&_a3&&_a3.nodeValue===_a2;
};
}
_9e.removeChild(_9d);
})();
(function(){
var div=document.createElement("div");
div.appendChild(document.createComment(""));
if(div.getElementsByTagName("*").length>0){
_15.find.TAG=function(_a4,_a5){
var _a6=_a5.getElementsByTagName(_a4[1]);
if(_a4[1]==="*"){
var tmp=[];
for(var i=0;_a6[i];i++){
if(_a6[i].nodeType===1){
tmp.push(_a6[i]);
}
}
_a6=tmp;
}
return _a6;
};
}
})();
if(document.querySelectorAll){
(function(){
var _a7=_9;
_9=function(_a8,_a9,_aa,_ab){
_a9=_a9||document;
if(!_ab&&_a9.nodeType===9){
try{
return _19(_a9.querySelectorAll(_a8),_aa);
}
catch(e){
}
}
return _a7(_a8,_a9,_aa,_ab);
};
_9.find=_a7.find;
_9.filter=_a7.filter;
_9.selectors=_a7.selectors;
_9.matches=_a7.matches;
})();
}
if(document.documentElement.getElementsByClassName){
_15.order.splice(1,0,"CLASS");
_15.find.CLASS=function(_ac,_ad){
return _ad.getElementsByClassName(_ac[1]);
};
}
function _3d(dir,cur,_ae,_af,_b0){
for(var i=0,l=_af.length;i<l;i++){
var _b1=_af[i];
if(_b1){
_b1=_b1[dir];
var _b2=false;
while(_b1&&_b1.nodeType){
var _b3=_b1[_ae];
if(_b3){
_b2=_af[_b3];
break;
}
if(_b1.nodeType===1){
_b1[_ae]=i;
}
if(_b1.nodeName===cur){
_b2=_b1;
break;
}
_b1=_b1[dir];
}
_af[i]=_b2;
}
}
};
function _3b(dir,cur,_b4,_b5,_b6){
for(var i=0,l=_b5.length;i<l;i++){
var _b7=_b5[i];
if(_b7){
_b7=_b7[dir];
var _b8=false;
while(_b7&&_b7.nodeType){
if(_b7[_b4]){
_b8=_b5[_b7[_b4]];
break;
}
if(_b7.nodeType===1){
_b7[_b4]=i;
if(typeof cur!=="string"){
if(_b7===cur){
_b8=true;
break;
}
}else{
if(_9.filter(cur,[_b7]).length>0){
_b8=_b7;
break;
}
}
}
_b7=_b7[dir];
}
_b5[i]=_b8;
}
}
};
var _1a=document.compareDocumentPosition?function(a,b){
return a.compareDocumentPosition(b)&16;
}:function(a,b){
return a!==b&&(a.contains?a.contains(b):true);
};
(ns||window).Sizzle=_9;
})(typeof dojo=="undefined"?null:dojo);
}
