/**
* Copyright (c) 2010 unscriptable.com
*/
(function (global) {
"use strict";
/*
* curl link! plugin
* This plugin will load css files as elements. It does not wait for
* css file to finish loading / evaluating before executing dependent modules.
* This plugin also does not handle IE's 31-stylesheet limit.
* If you need any of the above behavior, use curl's css! plugin instead.
*
* All this plugin does is insert elements in a non-blocking manner.
*
* usage:
* // load myproj/comp.css and myproj/css2.css
* require(['link!myproj/comp,myproj/css2']);
* // load some/folder/file.css
* define(['css!some/folder/file'], {});
*
* Tested in:
* Firefox 1.5, 2.0, 3.0, 3.5, 3.6, and 4.0b6
* Safari 3.0.4, 3.2.1, 5.0
* Chrome 7+
* Opera 9.52, 10.63, and Opera 11.00
* IE 6, 7, and 8
* Netscape 7.2 (WTF? SRSLY!)
* Does not work in Safari 2.x :(
*/
var
// compressibility shortcuts
createElement = 'createElement',
// doc will be undefined during a build
doc = global.document,
// regexp to find url protocol for IE7/8 fix (see fixProtocol)
isProtocolRelativeRx = /^\/\//,
// find the head element and set it to it's standard property if nec.
head;
if (doc) {
head = doc.head || (doc.head = doc.getElementsByTagName('head')[0]);
}
function nameWithExt (name, defaultExt) {
return name.lastIndexOf('.') <= name.lastIndexOf('/') ?
name + '.' + defaultExt : name;
}
function createLink (doc, href) {
var link = doc[createElement]('link');
link.rel = "stylesheet";
link.type = "text/css";
link.href = href;
return link;
}
function fixProtocol (url, protocol) {
// IE 7 & 8 can't handle protocol-relative urls:
// http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/
return url.replace(isProtocolRelativeRx, protocol + '//');
}
define('link', {
'load': function (resourceId, require, callback, config) {
var url, link, fix;
url = require['toUrl'](nameWithExt(resourceId, 'css'));
fix = 'fixSchemalessUrls' in config ? config['fixSchemalessUrls'] : doc && doc.location.protocol;
url = fix ? fixProtocol(url, fix) : url;
if(!doc){
callback(url);
} else {
link = createLink(doc, url);
head.appendChild(link);
callback(link.sheet || link.styleSheet);
}
}
});
})(this);