﻿var Resources=function () {
	function init() {
		// register all in-page script.src and link.hrefs
		$$("script").each(function (tag) { if (tag.src) _rememberFiles(tag.src); });
		$$("link").each(function (tag) { if (tag.href) _rememberFiles(tag.href); });
	}

	var _registeredFiles=[];
	var _loc=location.protocol+"//"+location.host;

	function _alreadyRegistered(url) {
		url=url.toLowerCase();
		return _registeredFiles.contains(url);
	}
	
	// gets a handlerish (csshandler.ashx?files=/css/1.css,/css/2.css&r=12390) or simplish (/js/x.js / /js/x.js?r=65781) url
	// and returns an array with all paths
	function _getFilePaths(url) {
		// since ff returns urls including domain, remove this prefix of the urls to prevent 2nd registration
		if (url.indexOf("http://")==0) url=url.substr(_loc.length);
		// remove random number, and trailing ?/&
		url=url.contains("?") ? url.replace(/(\?)r=\d+&?|&r=\d+/,"$1").replace(/[\?&]$/,"") : url;
		if (url.contains("=")) url=url.substr(url.indexOf("=")+1);
		url=url.toLowerCase();
		return url.split(",");
	}

	function _rememberFiles(url) {
		var urls=_getFilePaths(url);
		_registeredFiles.extend(urls);
	}

	function _rememberFile(path) {
		_registeredFiles.push(path);
	}

	// gets a url and a method to register this file
	//    url: a url can be either with a handler such as csshandler.ashx?files=/css/1.css,/css/2.css
	//         or a simple url such as /js/x.js
	function _registerFiles(url,method,properties) {
		if (!url) return;
		//dbug.log("_registerFiles",url);

		var urls=_getFilePaths(url);

		// the url variable contains the full url to register. it can contain a handler like
		// jshandler.ashx?files=a.js,b.js
		// the purpose of this replacement is removing all files that already been registered
		// urls array contains all files from the qs of the handler or just a single url
		var removed=[];
		urls.each(function (path) {
			if (_alreadyRegistered(path)) {
				url=url.replace(new RegExp(path.escapeRegExp(),"gi"),"").replace(/,{2,}/g,"");

				removed.push(path);
			}
			_rememberFile(path);
		});

		// filter urls that already been registered to this page
		removed.each(function (remove) { urls.erase(remove); });

		//dbug.log("method",url);
		// check if there are urls left after filtering those that already registered
		if (urls.length) method(url,properties);
	}
	
	$domready(init,1);

	return {
		RegisterCssFile:function (href,properties) {
			_registerFiles(href,Asset.css,properties);
		},
		RegisterJsFile:function (src,properties) {
			_registerFiles(src,Asset.javascript,properties);
		},
		RegisteredFiles:_registeredFiles
	};
}();

if (Element.execHTML) $extend(Element.execHTML,{
	javascript:Resources.RegisterJsFile,
	css:Resources.RegisterCssFile
});

//Resources.RegisteredFiles
