|
|
@ -1,6 +1,6 @@ |
|
|
|
// MooTools: the javascript framework.
|
|
|
|
// Load this file's selection again by visiting: http://mootools.net/more/452f2740e09082a2109bec9f69fbf8dc
|
|
|
|
// Or build this file again with packager using: packager build More/URI More/Element.Delegation More/Element.Shortcuts
|
|
|
|
// Load this file's selection again by visiting: http://mootools.net/more/82d3c4f6ee721f808321f6bf6818d8fb
|
|
|
|
// Or build this file again with packager using: packager build More/Element.Delegation More/Element.Shortcuts
|
|
|
|
/* |
|
|
|
--- |
|
|
|
|
|
|
@ -38,247 +38,6 @@ MooTools.More = { |
|
|
|
/* |
|
|
|
--- |
|
|
|
|
|
|
|
script: String.QueryString.js |
|
|
|
|
|
|
|
name: String.QueryString |
|
|
|
|
|
|
|
description: Methods for dealing with URI query strings. |
|
|
|
|
|
|
|
license: MIT-style license |
|
|
|
|
|
|
|
authors: |
|
|
|
- Sebastian Markbåge |
|
|
|
- Aaron Newton |
|
|
|
- Lennart Pilon |
|
|
|
- Valerio Proietti |
|
|
|
|
|
|
|
requires: |
|
|
|
- Core/Array |
|
|
|
- Core/String |
|
|
|
- /MooTools.More |
|
|
|
|
|
|
|
provides: [String.QueryString] |
|
|
|
|
|
|
|
... |
|
|
|
*/ |
|
|
|
|
|
|
|
String.implement({ |
|
|
|
|
|
|
|
parseQueryString: function(decodeKeys, decodeValues){ |
|
|
|
if (decodeKeys == null) decodeKeys = true; |
|
|
|
if (decodeValues == null) decodeValues = true; |
|
|
|
|
|
|
|
var vars = this.split(/[&;]/), |
|
|
|
object = {}; |
|
|
|
if (!vars.length) return object; |
|
|
|
|
|
|
|
vars.each(function(val){ |
|
|
|
var index = val.indexOf('='), |
|
|
|
value = val.substr(index + 1), |
|
|
|
keys = index < 0 ? [''] : val.substr(0, index).match(/([^\]\[]+|(\B)(?=\]))/g), |
|
|
|
obj = object; |
|
|
|
|
|
|
|
if (decodeValues) value = decodeURIComponent(value); |
|
|
|
keys.each(function(key, i){ |
|
|
|
if (decodeKeys) key = decodeURIComponent(key); |
|
|
|
var current = obj[key]; |
|
|
|
|
|
|
|
if (i < keys.length - 1) obj = obj[key] = current || {}; |
|
|
|
else if (typeOf(current) == 'array') current.push(value); |
|
|
|
else obj[key] = current != null ? [current, value] : value; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
return object; |
|
|
|
}, |
|
|
|
|
|
|
|
cleanQueryString: function(method){ |
|
|
|
return this.split('&').filter(function(val){ |
|
|
|
var index = val.indexOf('='), |
|
|
|
key = index < 0 ? '' : val.substr(0, index), |
|
|
|
value = val.substr(index + 1); |
|
|
|
|
|
|
|
return method ? method.call(null, key, value) : (value || value === 0); |
|
|
|
}).join('&'); |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
--- |
|
|
|
|
|
|
|
script: URI.js |
|
|
|
|
|
|
|
name: URI |
|
|
|
|
|
|
|
description: Provides methods useful in managing the window location and uris. |
|
|
|
|
|
|
|
license: MIT-style license |
|
|
|
|
|
|
|
authors: |
|
|
|
- Sebastian Markbåge |
|
|
|
- Aaron Newton |
|
|
|
|
|
|
|
requires: |
|
|
|
- Core/Object |
|
|
|
- Core/Class |
|
|
|
- Core/Class.Extras |
|
|
|
- Core/Element |
|
|
|
- /String.QueryString |
|
|
|
|
|
|
|
provides: [URI] |
|
|
|
|
|
|
|
... |
|
|
|
*/ |
|
|
|
|
|
|
|
(function(){ |
|
|
|
|
|
|
|
var toString = function(){ |
|
|
|
return this.get('value'); |
|
|
|
}; |
|
|
|
|
|
|
|
var URI = this.URI = new Class({ |
|
|
|
|
|
|
|
Implements: Options, |
|
|
|
|
|
|
|
options: { |
|
|
|
/*base: false*/ |
|
|
|
}, |
|
|
|
|
|
|
|
regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/, |
|
|
|
parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'], |
|
|
|
schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0}, |
|
|
|
|
|
|
|
initialize: function(uri, options){ |
|
|
|
this.setOptions(options); |
|
|
|
var base = this.options.base || URI.base; |
|
|
|
if (!uri) uri = base; |
|
|
|
|
|
|
|
if (uri && uri.parsed) this.parsed = Object.clone(uri.parsed); |
|
|
|
else this.set('value', uri.href || uri.toString(), base ? new URI(base) : false); |
|
|
|
}, |
|
|
|
|
|
|
|
parse: function(value, base){ |
|
|
|
var bits = value.match(this.regex); |
|
|
|
if (!bits) return false; |
|
|
|
bits.shift(); |
|
|
|
return this.merge(bits.associate(this.parts), base); |
|
|
|
}, |
|
|
|
|
|
|
|
merge: function(bits, base){ |
|
|
|
if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false; |
|
|
|
if (base){ |
|
|
|
this.parts.every(function(part){ |
|
|
|
if (bits[part]) return false; |
|
|
|
bits[part] = base[part] || ''; |
|
|
|
return true; |
|
|
|
}); |
|
|
|
} |
|
|
|
bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()]; |
|
|
|
bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/'; |
|
|
|
return bits; |
|
|
|
}, |
|
|
|
|
|
|
|
parseDirectory: function(directory, baseDirectory){ |
|
|
|
directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory; |
|
|
|
if (!directory.test(URI.regs.directoryDot)) return directory; |
|
|
|
var result = []; |
|
|
|
directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){ |
|
|
|
if (dir == '..' && result.length > 0) result.pop(); |
|
|
|
else if (dir != '.') result.push(dir); |
|
|
|
}); |
|
|
|
return result.join('/') + '/'; |
|
|
|
}, |
|
|
|
|
|
|
|
combine: function(bits){ |
|
|
|
return bits.value || bits.scheme + '://' + |
|
|
|
(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') + |
|
|
|
(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') + |
|
|
|
(bits.directory || '/') + (bits.file || '') + |
|
|
|
(bits.query ? '?' + bits.query : '') + |
|
|
|
(bits.fragment ? '#' + bits.fragment : ''); |
|
|
|
}, |
|
|
|
|
|
|
|
set: function(part, value, base){ |
|
|
|
if (part == 'value'){ |
|
|
|
var scheme = value.match(URI.regs.scheme); |
|
|
|
if (scheme) scheme = scheme[1]; |
|
|
|
if (scheme && this.schemes[scheme.toLowerCase()] == null) this.parsed = { scheme: scheme, value: value }; |
|
|
|
else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value }); |
|
|
|
} else if (part == 'data'){ |
|
|
|
this.setData(value); |
|
|
|
} else { |
|
|
|
this.parsed[part] = value; |
|
|
|
} |
|
|
|
return this; |
|
|
|
}, |
|
|
|
|
|
|
|
get: function(part, base){ |
|
|
|
switch(part){ |
|
|
|
case 'value': return this.combine(this.parsed, base ? base.parsed : false); |
|
|
|
case 'data' : return this.getData(); |
|
|
|
} |
|
|
|
return this.parsed[part] || ''; |
|
|
|
}, |
|
|
|
|
|
|
|
go: function(){ |
|
|
|
document.location.href = this.toString(); |
|
|
|
}, |
|
|
|
|
|
|
|
toURI: function(){ |
|
|
|
return this; |
|
|
|
}, |
|
|
|
|
|
|
|
getData: function(key, part){ |
|
|
|
var qs = this.get(part || 'query'); |
|
|
|
if (!(qs || qs === 0)) return key ? null : {}; |
|
|
|
var obj = qs.parseQueryString(); |
|
|
|
return key ? obj[key] : obj; |
|
|
|
}, |
|
|
|
|
|
|
|
setData: function(values, merge, part){ |
|
|
|
if (typeof values == 'string'){ |
|
|
|
var data = this.getData(); |
|
|
|
data[arguments[0]] = arguments[1]; |
|
|
|
values = data; |
|
|
|
} else if (merge){ |
|
|
|
values = Object.merge(this.getData(), values); |
|
|
|
} |
|
|
|
return this.set(part || 'query', Object.toQueryString(values)); |
|
|
|
}, |
|
|
|
|
|
|
|
clearData: function(part){ |
|
|
|
return this.set(part || 'query', ''); |
|
|
|
}, |
|
|
|
|
|
|
|
toString: toString, |
|
|
|
valueOf: toString |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
URI.regs = { |
|
|
|
endSlash: /\/$/, |
|
|
|
scheme: /^(\w+):/, |
|
|
|
directoryDot: /\.\/|\.$/ |
|
|
|
}; |
|
|
|
|
|
|
|
URI.base = new URI(Array.from(document.getElements('base[href]', true)).getLast(), {base: document.location}); |
|
|
|
|
|
|
|
String.implement({ |
|
|
|
|
|
|
|
toURI: function(options){ |
|
|
|
return new URI(this, options); |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
})(); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
--- |
|
|
|
|
|
|
|
name: Events.Pseudos |
|
|
|
|
|
|
|
description: Adds the functionallity to add pseudo events |
|
|
|