docs: function parseURL(url, instanceOptions) {
  	    var holder = {
  	        theme: extend(App.settings.themes.gray, null),
  	        stylesheets: instanceOptions.stylesheets,
  	        instanceOptions: instanceOptions
  	    };
  
  	    var firstQuestionMark = url.indexOf('?');
  	    var parts = [url];
  
  	    if (firstQuestionMark !== -1) {
  	        parts = [url.slice(0, firstQuestionMark), url.slice(firstQuestionMark + 1)];
  	    }
  
  	    var basics = parts[0].split('/');
  
  	    holder.holderURL = url;
  
  	    var dimensions = basics[1];
  	    var dimensionData = dimensions.match(/([\d]+p?)x([\d]+p?)/);
  
  	    if (!dimensionData) return false;
  
  	    holder.fluid = dimensions.indexOf('p') !== -1;
  
  	    holder.dimensions = {
  	        width: dimensionData[1].replace('p', '%'),
  	        height: dimensionData[2].replace('p', '%')
  	    };
  
  	    if (parts.length === 2) {
  	        var options = querystring.parse(parts[1]);
  
  	        // Dimensions
  
  	        if (utils.truthy(options.ratio)) {
  	            holder.fluid = true;
  	            var ratioWidth = parseFloat(holder.dimensions.width.replace('%', ''));
  	            var ratioHeight = parseFloat(holder.dimensions.height.replace('%', ''));
  
  	            ratioHeight = Math.floor(100 * (ratioHeight / ratioWidth));
  	            ratioWidth = 100;
  
  	            holder.dimensions.width = ratioWidth + '%';
  	            holder.dimensions.height = ratioHeight + '%';
  	        }
  
  	        holder.auto = utils.truthy(options.auto);
  
  	        // Colors
  
  	        if (options.bg) {
  	            holder.theme.bg = utils.parseColor(options.bg);
  	        }
  
  	        if (options.fg) {
  	            holder.theme.fg = utils.parseColor(options.fg);
  	        }
  
  	        //todo: add automatic foreground to themes without foreground
  	        if (options.bg && !options.fg) {
  	            holder.autoFg = true;
  	        }
  
  	        if (options.theme && holder.instanceOptions.themes.hasOwnProperty(options.theme)) {
  	            holder.theme = extend(holder.instanceOptions.themes[options.theme], null);
  	        }
  
  	        // Text
  
  	        if (options.text) {
  	            holder.text = options.text;
  	        }
  
  	        if (options.textmode) {
  	            holder.textmode = options.textmode;
  	        }
  
  	        if (options.size && parseFloat(options.size)) {
  	            holder.size = parseFloat(options.size);
  	        }
  
  	        if (options.font) {
  	            holder.font = options.font;
  	        }
  
  	        if (options.align) {
  	            holder.align = options.align;
  	        }
  
  	        if (options.lineWrap) {
  	            holder.lineWrap = options.lineWrap;
  	        }
  
  	        holder.nowrap = utils.truthy(options.nowrap);
  
  	        // Miscellaneous
  
  	        holder.outline = utils.truthy(options.outline);
  
  	        if (utils.truthy(options.random)) {
  	            App.vars.cache.themeKeys = App.vars.cache.themeKeys || Object.keys(holder.instanceOptions.themes);
  	            var _theme = App.vars.cache.themeKeys[0 | Math.random() * App.vars.cache.themeKeys.length];
  	            holder.theme = extend(holder.instanceOptions.themes[_theme], null);
  	        }
  	    }
  
  	    return holder;
  	}