(function(global) { if(typeof(global.RUNWAY) == 'undefined') { global.RUNWAY = {}; } global.RUNWAY.URL = URL; function each(array, f) { if(!array instanceof Array) { return; } if(typeof(f) != 'function') { return; } var i; for(i = 0; i < array.length; ++i) { f(array[i], i, array); } } function URL(url) { if(!(this instanceof URL)) { return new URL(url); } url = url || location.href; var data = {}; var query = {}; var self = this; function empty() { data.scheme = ''; data.host = ''; data.port = ''; data.path = ''; data.query = ''; data.hash = ''; query = {}; } function $(p, v) { if(typeof(v) == 'undefined') { return (data[p] || ''); } data[p] = v; return self; } function scheme(value) { return $('scheme', value); } this.scheme = scheme; function host(value) { return $('host', value); } this.host = host; function port(value) { return $('port', value); } this.port = port; function path(value) { if(typeof(value) == 'undefined') { return data.path; } value = (value || "") + ""; if(0 < value.length && value.charAt(0) != '/') { var path = data.path.split('/'); if(1 < path.length) { path[path.length - 1] = value; data.path = path.join('/'); } else { data.path = '/' + value; } return self; } data.path = value; return self; } this.path = path; function hash(value) { return $('hash', value); } this.hash = hash; function set(url) { url = url || ''; empty(); var marks = ['#', '?', '://', '/']; var result = []; each(marks, function(v, k, _) { var index = url.indexOf(v); if(-1 < index) { if(v == '#' || v == '?') { result.push(url.slice(index + v.length)); url = url.substr(0, index); } else { result.push(url.substr(0, index)); url = url.slice(index + v.length); } } else { result.push(''); } }); data.path = '/' + url; data.host = result.pop(); data.scheme = result.pop(); data.query = result.pop(); data.hash = result.pop(); var index = data.host.indexOf(':'); if(-1 < index) { data.port = data.host.slice(index + ':'.length); data.host = data.host.substr(0, index); } else { data.port = ''; } parseQuery(); return data; } this.set = set; function _query(q) { if(typeof(q) == 'object') { query = {}; var key; for(key in q) { query[key] = q[key]; } buildQuery(); } else if(typeof(q) == 'string') { data.query = q; parseQuery(); } else if(typeof(q) == 'undefined') { return data.query; } return self; } this.query = _query; function buildQuery() { var key; var q = []; for(key in query) { q.push((encodeURIComponent(key) + '=' + encodeURIComponent(query[key]))); } data.query = q.join('&'); } function parseQuery() { query = {}; if(data.query != '') { var q = data.query.split('&'); each(q, function(v, k, _) { var items = v.split('='); query[items[0]] = items[1]; }); } } function get() { return data; } this.get = get; function q(key, value) { if(typeof(value) == 'undefined') { if(typeof(key) == 'undefined') { return query; } return query[key] || ''; } else { key = key || null; if(!key) { return false; } query[key] = ("" + value); buildQuery(); } return self; } this.q = q; function toString() { var url = ""; if(data.scheme) { url += data.scheme + "://"; } if(data.host) { url += data.host; } if(data.port != '') { url += (":" + data.port); } if(data.path) { url += data.path; } if(data.query != '') { url += ("?" + data.query); } if(data.hash != '') { url += ("#" + data.hash); } return url; } this.toString = toString; function go(replace) { replace = replace || false; if(replace) { location.replace(toString()); } else { location.href = toString(); } } this.go = go; function open(target, features) { target = target || null; features = features || ""; if(!target) { go(); return; } if(target.location) { target.location.href = toString(); return; } target = ("" + target); var child = window.open(toString(), target, features) return child; } this.open = open; set(url); } })(this);