﻿/** * jQuery.query - Query String Modification and Creation for jQuery * Written in 2007 by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). * Date: 2008/02/08 * * @author Blair Mitchelmore * @version 1.2.2 * **/new function(settings) {   // Various Settings  var $separator = settings.separator || '&';  var $spaces = settings.spaces === false ? false : true;  var $suffix = settings.suffix === false ? '' : '[]';  var $hash = settings.hash === true ? true : false;  var $prefix = settings.prefix === false ? false : true;    jQuery.query = new function() {    var queryObject = function(a) {      var self = this;      self.keys = {};            if (a.queryObject) {        jQuery.each(a.keys, function(key, val) {          self.destructiveSet(key, val);        });      } else {        jQuery.each(arguments, function() {          var q = "" + this;          q = q.replace(/^[?#]/,''); // remove any leading ? || #          q = q.replace(/[;&]$/,''); // remove any trailing & || ;          if ($spaces) q = q.replace('+',' '); // replace +'s with spaces          jQuery.each(q.split(/[&;]/), function(){            var key = this.split('=')[0];            var val = this.split('=')[1];            var temp, hashKey = null, type = null;               if (!key) return;                      if (/^-?[0-9]+\.[0-9]+$/.test(val)) // simple float regex              val = parseFloat(val);            else if (/^-?[0-9]+$/.test(val)) // simple int regex              val = parseInt(val);                          if (/\[([^\] ]+)\]$/.test(key)) // hash syntax              type = Object, hashkey = key.replace(/^.+\[([^\] ]+)\]$/,"$1"), key = key.replace(/\[([^\] ]+)\]$/,"");            else if (/\[\]$/.test(key)) // array syntax              type = Array, key = key.replace(/\[\]$/,"");                      val = (!val && val !== 0) ? true : val;                      if (!type && self.has(key))               type = Array, self.destructiveSet(key, self.has(key, Array) ? self.keys[key] : [self.keys[key]]);                        if (val !== false && val !== true)              val = decodeURIComponent(val);  	              if (!type)              self.destructiveSet(key, val);            else              if (type == Object)                 temp = self.keys[key] || {}, temp[hashkey] = val, self.destructiveSet(key, temp);              else if (type == Array)                temp = self.keys[key] || [], temp.push(val), self.destructiveSet(key, temp);          });        });      }      return self;    };        queryObject.prototype = {      queryObject: true,      has: function(key, type) {        var keys = this.keys;        return !!type ? keys[key] != undefined && keys[key] !== null && keys[key].constructor == type : keys[key] != undefined && keys[key] !== null;      },      get: function(key) {        var value = (key == undefined) ? this.keys : this.keys[key];        if (!value)           return '';        else if (value.constructor == Array)          return value.slice(0);        else if (value.constructor == Object)          return jQuery.extend({}, value);        else          return value;      },      destructiveSet: function(key, val) {        if (val == undefined || val === null)          this.destructiveRemove(key);        else          this.keys[key] = val;        return this;      },      set: function(key, val) {        return this.copy().destructiveSet(key, val);      },      destructiveRemove: function(key) {        if (typeof this.keys[key] != 'undefined')           delete this.keys[key];        return this;      },      remove: function(key) {        return this.copy().destructiveRemove(key);      },      destructiveEmpty: function() {        var self = this;        jQuery.each(self.keys, function(key, value) {          delete self.keys[key];        });        return self;      },      empty: function(destructive) {        return this.copy().destructiveEmpty();      },      copy: function() {        return new queryObject(this);      },      toString: function() {        var i = 0, queryString = [], self = this, addFields = function(o, key, value) {          o.push(key);          if (value !== true) {            o.push("=");            o.push(encodeURIComponent(value));          }        };        jQuery.each(this.keys, function(key, value) {          var o = [];          if (value !== false) {            if (i++ == 0)              o.push($prefix ? $hash ? "#" : "?" : "");            if (self.has(key, Object)) {              var _o = []              jQuery.each(value, function(_key, _value) {                var __o = [];                addFields(__o, key + "[" + _key + "]", _value);                _o.push(__o.join(""));              });              o.push(_o.join($separator));            } else if (self.has(key, Array)) {              var _o = []              jQuery.each(value, function(_key, _value) {                var __o = [];                addFields(__o, key + $suffix, _value);                _o.push(__o.join(""));              });              o.push(_o.join($separator));            } else {              addFields(o,key,value);            }          }          queryString.push(o.join(""));        });        return queryString.join($separator);      }    };        return new queryObject(location.search, location.hash);  };}(jQuery.query || {}); // Pass in jQuery.query as settings object
