
new function(settings){
var $separator=settings.separator||'&';
var $spaces=settings.spaces===false?false:true;
var $suffix=settings.suffix===false?'':'[]';
var $prefix=settings.prefix===false?false:true;
var $hash=$prefix?settings.hash===true?"#":"?":"";
jQuery.query=new function(){
var is=function(o,t){
return o!=undefined&&o!==null&&(!!t?o.constructor==t:true);
};
var parse=function(path){
var m,rx=/\[([^[]*)\]/g,match=/^(\S+?)(\[\S*\])?$/.exec(path),base=match[1],tokens=[];
while(m=rx.exec(match[2]))tokens.push(m[1]);
return[base,tokens];
};
var set=function(target,tokens,value){
var o,token=tokens.shift();
if(typeof target!='object')target=null;
if(token===""){
if(!target)target=[];
if(is(target,Array)){
target.push(tokens.length==0?value:set(null,tokens.slice(0),value));
}else if(is(target,Object)){
var i=0;
while(target[i++]!=null);
target[--i]=tokens.length==0?value:set(target[i],tokens.slice(0),value);
}else{
target=[];
target.push(tokens.length==0?value:set(null,tokens.slice(0),value));
}
}else if(token&&token.match(/^\s*[0-9]+\s*$/)){
var index=parseInt(token,10);
if(!target)target=[];
target[index]=tokens.length==0?value:set(target[index],tokens.slice(0),value);
}else if(token){
var index=token.replace(/^\s*|\s*$/g,"");
if(!target)target={};
if(is(target,Array)){
var temp={};
for(var i=0;i<target.length;++i){
temp[i]=target[i];
}
target=temp;
}
target[index]=tokens.length==0?value:set(target[index],tokens.slice(0),value);
}else{
return value;
}
return target;
};
var queryObject=function(a){
var self=this;
self.keys={};
if(a.queryObject){
jQuery.each(a.get(),function(key,val){
self.SET(key,val);
});
}else{
jQuery.each(arguments,function(){
var q=""+this;
q=q.replace(/^[?#]/,'');
q=q.replace(/[;&]$/,'');
if($spaces)q=q.replace(/[+]/g,' ');
jQuery.each(q.split(/[&;]/),function(){
var key=this.split('=')[0];
var val=this.split('=')[1];
if(!key)return;
if(/^[+-]?[0-9]+\.[0-9]*$/.test(val))
val=parseFloat(val);
else if(/^[+-]?[0-9]+$/.test(val))
val=parseInt(val,10);
val=(!val&&val!==0)?true:val;
if(val!==false&&val!==true&&typeof val!='number')
val=decodeURIComponent(val);
self.SET(key,val);
});
});
}
return self;
};
queryObject.prototype={
queryObject:true,
has:function(key,type){
var value=this.get(key);
return is(value,type);
},
GET:function(key){
if(!is(key))return this.keys;
var parsed=parse(key),base=parsed[0],tokens=parsed[1];
var target=this.keys[base];
while(target!=null&&tokens.length!=0){
target=target[tokens.shift()];
}
return typeof target=='number'?target:target||"";
},
get:function(key){
var target=this.GET(key);
if(is(target,Object))
return jQuery.extend(true,{},target);
else if(is(target,Array))
return target.slice(0);
return target;
},
SET:function(key,val){
var value=!is(val)?null:val;
var parsed=parse(key),base=parsed[0],tokens=parsed[1];
var target=this.keys[base];
this.keys[base]=set(target,tokens.slice(0),value);
return this;
},
set:function(key,val){
return this.copy().SET(key,val);
},
REMOVE:function(key){
return this.SET(key,null).COMPACT();
},
remove:function(key){
return this.copy().REMOVE(key);
},
EMPTY:function(){
var self=this;
jQuery.each(self.keys,function(key,value){
delete self.keys[key];
});
return self;
},
empty:function(){
return this.copy().EMPTY();
},
copy:function(){
return new queryObject(this);
},
COMPACT:function(){
function build(orig){
var obj=typeof orig=="object"?is(orig,Array)?[]:{}:orig;
if(typeof orig=='object'){
function add(o,key,value){
if(is(o,Array))
o.push(value);
else
o[key]=value;
}
jQuery.each(orig,function(key,value){
if(!is(value))return true;
add(obj,key,build(value));
});
}
return obj;
}
this.keys=build(this.keys);
return this;
},
compact:function(){
return this.copy().COMPACT();
},
toString:function(){
var i=0,queryString=[],chunks=[],self=this;
var addFields=function(arr,key,value){
if(!is(value)||value===false)return;
var o=[key];
if(value!==true){
o.push("=");
o.push(encodeURIComponent(value));
}
arr.push(o.join(""));
};
var build=function(obj,base){
var newKey=function(key){
return!base||base==""?[key].join(""):[base,"[",key,"]"].join("");
};
jQuery.each(obj,function(key,value){
if(typeof value=='object')
build(value,newKey(key));
else
addFields(chunks,newKey(key),value);
});
};
build(this.keys);
if(chunks.length>0)queryString.push($hash);
queryString.push(chunks.join($separator));
return queryString.join("");
}
};
return new queryObject(location.search,location.hash);
};
}(jQuery.query||{});

