var SVGParser = require('./core');
var Mode = require('../../modes/current');

var urlSuffix = '', baseUrl, urlAliases = {},
    urlParts = /^((?:\w+:)?(?:\/\/[^\/?#]*)?)(\.\.?$|(?:[^?#\/]*\/)*)(.*)/,
    endSlash = /\/$/;

function resolvePath(path, base){
	var parts = String(path).match(urlParts);
	if (!parts || parts[1]) return path;

	if (!base || path.charAt(0) !== '.') base = '';
	base = String(base).match(urlParts);

	var directory = parts[2];
	if (directory.charAt(0) != '/'){
		directory = (base[2] || '') + directory;
		var result = [], paths = directory.replace(endSlash, '').split('/');
		for (var i = 0, l = paths.length; i < l; i++){
			var dir = paths[i];
			if (dir === '..' && result.length > 0 && result[result.length - 1] != '..') result.pop();
			else if (dir !== '.') result.push(dir);
		};
		directory = result.join('/') + '/';
	}
	return base[1] + directory + parts[3];
}

SVGParser.prototype.findByURL = function(document, url, callback){
	if (!url){
		callback.call(this, null);
		return;
	}
	if (url.charAt(0) == '#'){
		callback.call(this, this.findById(document, url.substr(1)));
		return;
	}
	url = this.resolveURL(url);
	var self = this, i = url.indexOf('#'), id = i > -1 ? url.substr(i + 1) : null;
	if (i > -1) url = url.substr(0, i);
	this.pendingRequests = (this.pendingRequests || 0) + 1;

	var xhr = new XMLHttpRequest();
	xhr.open('GET', url, true);
	xhr.onreadystatechange = function(){
		if (xhr.readyState == 4){
			if (xhr.status == 200){
				var resolve = self.resolveURL,
				    doc = /*xhr.responseXML ||*/ self.parseXML(xhr.responseText);
				self.resolveURL = function(newurl){
					return resolvePath(newurl, url);
				}
				callback.call(self, !doc ? null : id ? self.findById(doc, id) : doc.documentElement);
				self.resolveURL = resolve;
			} else {
				callback.call(self, null);
			}
			if (--self.pendingRequests == 0 && self.oncomplete) self.oncomplete();
		}
	};
	xhr.send(null);
};

SVGParser.prototype.load = function(url, styles, callback){
	if (typeof styles == 'function'){ callback = styles; styles = null; }
	var parser = this, result = null;
	parser.oncomplete = function(){ callback(result); };
	parser.findByURL(null, url, function(doc){ result = parser.parse(doc.ownerDocument, styles); });
};

SVGParser.load = function(url, styles, callback){
	new SVGParser(Mode).load(url, styles, callback);
};