
RM_Url = function()
{
	this._config = [];
	this._host;
	this._domainRegex;
}

RM_Url.prototype.addUrl = function( urlCode, urlTemplate, subdomain, protocol )
{
	this._isHTTPS = false;
	if (protocol == 'current')
		protocol = location.protocol.replace(':', '');
	this._config[urlCode] = {
		'urlTemplate'	: urlTemplate, 
		'subdomain'		: ( subdomain && subdomain != '' ) ? subdomain : false, 
		'protocol'		: ( protocol && protocol != '' ) ? protocol : false
	}
}

RM_Url.prototype.setHost = function(host)
{
	this._host = host;
}

RM_Url.prototype.setDomainRegex = function(domainRegex)
{
	this._domainRegex = domainRegex.substring(1,domainRegex.length-1);
}

RM_Url.prototype.setHTTPS = function(isHTTPS)
{
	isHTTPS ? this._isHTTPS = true : this._isHTTPS = false;
}

RM_Url.prototype.isCurrentMainDomain = function()
{
	var host = this._host;
	var cuttedHost = host.replace( new RegExp( this._domainRegex, 'i' ), '' );
	return ( cuttedHost == 'www' || cuttedHost == '' ); 
}

RM_Url.prototype.getProtocol = function(urlCode)
{
	if ( this._config[urlCode]['protocol'] && this._config[urlCode]['protocol'] != '' )
		return this._config[urlCode]['protocol']+'://';
	return ( this._isHTTPS ? "https://" : "http://" );
}

RM_Url.prototype.needChangeProtocol = function( urlCode )
{
	return this._config[urlCode]['protocol'] || !this._isHTTPS &&  this._config[urlCode]['protocol'].toString().toLowerCase() == 'https';
}

RM_Url.prototype.getDomainUrl = function( urlCode )
{
	var domain = this._config[urlCode]['subdomain'] && this._config[urlCode]['subdomain'] != '' ? this._config[urlCode]['subdomain'] : '_current_';
	var host = this._host;
	var result;
	if (domain == '_current_')
		result = this._host;
	else
		result = host.replace(new RegExp(this._domainRegex,'i'), domain+'.$2');
	return result;
};

RM_Url.prototype.needUseDomain = function( urlCode )
{
	var w1 = this.getDomainUrl(urlCode);
	var c1 = this._host;
	var w2 = 'www.' + w1;
	var c2 = 'www.' + c1;
	return !(w1==c1 || w1==c2 || w2==c1 || w2==c2);
};

RM_Url.prototype.get = function( urlCode, data, args, fullUrl )
{
	this.setHost( urlHost );
	this.setDomainRegex( urlDomainRegex );
	
	var url = '';
	if (this._config[urlCode])
	{
		url = this._config[urlCode]['urlTemplate'];
		if (data)
			for (var param in data)
				url = url.replace('$'+param,data[param]);
		if (args)
			url = this._addQueryArgsToUrl(url, args);
		if (url.indexOf('://') == -1)
		{
			if (url == '/' || url.substring(0,1) != '/')
				url = '/' + url;
			if (this.needUseDomain(urlCode) || this.needChangeProtocol(urlCode) || fullUrl)
			{
				url = this.getDomainUrl(urlCode) + url;
				url = this.getProtocol(urlCode) + url;
			}
		}
	}
	else
		throw 'Unknown URL '+urlCode;
	return url;
};

RM_Url.prototype.getImageUrl = function(format, file)
{
	var objectfsDepth = 3;
	return this.get(format,{
		'id'		: file.id, 
		'fid'		: file.file_device_id,
		'file'		: file.file_device_path.substring(objectfsDepth*2),
		'name'		: file.name
	});
}

RM_Url.prototype.go = function ( urlCode, data, args )
{
	window.location.href = this.get( urlCode, data, args );
}


/**
 * Добавить GET параметры в URL
 * 
 * @param	object	args	GET параметры
 * @param	string	extra	Не реализован
 * @param	string	url		URL
 * @return	string
 */
RM_Url.prototype.url = function (args, extra, url)
{
	if (!url)
		url = document.location.href;
	if (args)
		url = this._addQueryArgsToUrl(url, args);
	return url;
}


/**
 * Распарсить URL
 * 
 * @param	string	url	URL
 * @return	object	{scheme, host, path, query, fragment}
 */
RM_Url.prototype._parseUrl = function (url)
{
	var parseData = {};
	var tempUrl = url;	
	if (tempUrl.indexOf('://') >= 0)
	{
		parseData.scheme = tempUrl.substring(0, tempUrl.indexOf('://'));
		tempUrl = tempUrl.substring(tempUrl.indexOf('://') + 3);
	}
	if (tempUrl.indexOf('#') >= 0)
	{
		parseData.fragment = tempUrl.substring(tempUrl.indexOf('#') + 1);
		tempUrl = tempUrl.substring(0, tempUrl.indexOf('#'));
	}
	if (tempUrl.indexOf('?') >= 0)
	{
		parseData.query = tempUrl.substring(tempUrl.indexOf('?') + 1);
		tempUrl = tempUrl.substring(0, tempUrl.indexOf('?'));
	}
	if (tempUrl.indexOf('/') >= 0)
	{
		parseData.path = tempUrl.substring(tempUrl.indexOf('/'));
		tempUrl = tempUrl.substring(0, tempUrl.indexOf('/'));
	}
	if (tempUrl)
		parseData.host = tempUrl;
	return parseData;
}


/**
 * Сформировать URL
 * 
 * @param	object	data	{scheme, host, path, query, fragment}
 * @return	string
 */
RM_Url.prototype._buildUrl = function (data)
{	
	var url = '';
	if (data.scheme)
		url += data.scheme + '://';
	if (data.host)
		url += data.host;
	if (data.path)
		url += data.path;
	if (data.query)
		url += '?'+data.query;
	if (data.fragment)
		url += '#'+data.fragment;
	return url;
}


/**
 * Добавить GET параметры в URL
 * 
 * @param	object	args	GET параметры
 * @param	string	url		URL
 * @return	string
 */
RM_Url.prototype._addQueryArgsToUrl = function (url, args)
{
	var urlData = this._parseUrl(url);
	var queryArgs = urlData.query ? this._getQueryArgsFromQueryString(urlData.query) : {};
	$.extend(queryArgs, args);
	urlData.query = this._buildQueryStringByQueryArgs(queryArgs);	
	return this._buildUrl(urlData);
}


/**
 * Получить GET параметры из Query части URL
 * 
 * @param	string	queryString		Query часть URL
 * @return	object
 */
RM_Url.prototype._getQueryArgsFromQueryString = function (queryString)
{
	var args = {};
	var queryParts = queryString.split('&');
	for (var key in queryParts)
	{
		var data = queryParts[key].split('=');
		if (data[0].substring(data.length - 2) == '[]')
		{
			var argName = data[0].substring(0, data.length - 2);
			if (!args[argName])
				args[argName] = [];
			args[argName][args[argName].length] = data[1];
		}
		else
			args[data[0]] = data[1];
	}
	return args;
}


/**
 * Сформировать Query часть URL по GET параметрам
 * 
 * @param	object	args	GET параметры
 * @return	string
 */
RM_Url.prototype._buildQueryStringByQueryArgs = function (args)
{
	var queryString = '';
	for (var argsKey in args)
	{
		if ($.isArray(args[argsKey]))
		{
			for (var key in args[argsKey])
			{
				if (new String(args[argsKey][key]) != "null")
					queryString += (queryString ? '&' : '') + encodeURIComponent(argsKey) + '[' + encodeURIComponent(key) + ']=' + encodeURIComponent(args[argsKey][key]);
			}
		}
		else
		{
			if (args[argsKey] != null)
				queryString += (queryString ? '&' : '') + encodeURIComponent(argsKey) + '=' + encodeURIComponent(args[argsKey]);
		}
	}
	return queryString;
}


var url = new RM_Url();

