Yox = { // Adds a stylesheet link reference in the specified document's HEAD addStylesheet: function(_document, cssUrl) { var cssLink = _document.createElement("link"); cssLink.setAttribute("rel", "Stylesheet"); cssLink.setAttribute("type", "text/css"); cssLink.setAttribute("href", cssUrl); _document.getElementsByTagName("head")[0].appendChild(cssLink); }, compare: function(obj1, obj2) { if (typeof(obj1) != typeof(obj2)) return false; else if (typeof(obj1) == "function") return obj1 == obj2; // deep-compare objects: function size(obj) { var size = 0; for (var keyName in obj) { if (keyName != null) size++; } return size; } if (size(obj1) != size(obj2)) return false; for(var keyName in obj1) { var value1 = obj1[keyName]; var value2 = obj2[keyName]; if (typeof value1 != typeof value2) return false; if (value1 && value1.length && (value1[0] !== undefined && value1[0].tagName)) { if(!value2 || value2.length != value1.length || !value2[0].tagName || value2[0].tagName != value1[0].tagName) return false; } else if (typeof value1 == 'function' || typeof value1 == 'object') { var equal = Yox.compare(value1, value2); if (!equal) return equal; } else if (value1 != value2) return false; } return true; }, hasProperties: function(obj){ var hasProperties = false; for(pName in obj) { hasProperties = true; break; } return hasProperties; }, dataSources: [], fitImageSize: function(imageSize, targetSize, enlarge, isFill) { var resultSize = { width: imageSize.width, height: imageSize.height}; if ((imageSize.width > targetSize.width) || (enlarge && imageSize.width < targetSize.width) ) { resultSize.height = Math.round((targetSize.width / imageSize.width) * imageSize.height); resultSize.width = targetSize.width; } if (!isFill && resultSize.height > targetSize.height) { resultSize.width = Math.round((targetSize.height / resultSize.height) * resultSize.width); resultSize.height = targetSize.height; } else if (isFill && resultSize.height < targetSize.height && (targetSize.height <= imageSize.height || enlarge)) { resultSize.height = targetSize.height; resultSize.width = Math.round((targetSize.height / imageSize.height) * imageSize.width); } return resultSize; }, flashVideoPlayers: { jwplayer: function(swfUrl, videoUrl, imageUrl, title, flashVars){ var returnData = { swf: swfUrl || "/jwplayer/player.swf", flashVars: { file: videoUrl, image: imageUrl, stretching: "fill", title: title, backcolor: "000000", frontcolor: "FFFFFF" } } $.extend(returnData.flashVars, flashVars); return returnData; } }, getDataSourceName: function(url) { for(dataSourceIndex in Yox.Regex.data) { if(url.match(Yox.Regex.data[dataSourceIndex])) return dataSourceIndex; } return null; }, getPath: function(pathRegex) { var scripts = document.getElementsByTagName("script"); for(var i=0; i> 16; var g = (hex & 0x00ff00) >> 8; var b = hex & 0x0000ff; return "rgba(" + r + ", " + g + ", " + b + ", " + (typeof(alpha) != 'undefined' ? alpha : "1") + ")"; }, queryToJson: function(query) { if (!query) return null; var queryParams = query.split("&"); var json = {}; for(var i=0; i < queryParams.length; i++) { var paramData = queryParams[i].split('='); if (paramData.length == 2) json[paramData[0]] = paramData[1]; } return json; }, loadDataSource: function(options, callback) { var dataSourceName; if (options.dataUrl) { dataSourceName = Yox.getDataSourceName(options.dataUrl); if (dataSourceName) $.extend(options, { dataSource: dataSourceIndex }); } if (options.dataSource && !Yox.dataSources[dataSourceName]) { $.ajax({ url : options.dataFolder + options.dataSource + ".js", async : false, dataType : "script", success: function(data){ eval(data); eval ("Yox.dataSources['" + options.dataSource + "'] = new yox_" + options.dataSource + "();"); callback(Yox.dataSources[options.dataSource]); }, error : function(XMLHttpRequest, textStatus, errorThrown) { console.log(XMLHttpRequest, textStatus, errorThrown); } }); } else if (callback) callback(); }, Regex: { data: { picasa: /http:\/\/(?:www\.)?picasaweb\.google\..*/i, flickr: /http:\/\/(?:www\.)?flickr.com/i, smugmug: /http:\/\/.*\.smugmug.com/i, youtube: /^http:\/\/(?:www\.)?youtube.com\// }, flash: /^(.*\.(swf))(\?[^\?]+)?/i, flashvideo: /^(.*\.(flv|f4v|f4p|f4a|f4b|aac))(\?[^\?]+)?/i, image: /^[^\?#]+\.(?:jpg|jpeg|gif|png)$/i, url: /^([^#\?]*)?(?:\?([^\?#]*))?(?:#([A-Za-z]{1}[A-Za-z\d-_\:\.]+))?$/, // [0] - whole url, [1] - path, [2] - query (sans '?'), [3] - anchor video: { youtube: /.*youtube.com\/watch.*(?:v=[^&]+).*/i, vimeo: /vimeo.com\/\d+/i, hulu: /hulu.com\/watch\//i, viddler: /viddler.com\//i, flickr: /.*flickr.com\/.*/i, myspace: /.*vids.myspace.com\/.*/i, qik: /qik.com/i, revision3: /revision3.com/i, dailymotion: /dailymotion.com/i, "5min": /.*5min\.com\/Video/i } }, Sprites: function(sprites, spritesImage, srcImage) { var cacheImg = new Image(); cacheImg.src = spritesImage; this.spritesImage = spritesImage; var currentTop = 0; jQuery.each(sprites, function(i, spriteGroup){ spriteGroup.top = currentTop; currentTop += spriteGroup.height; }); this.getSprite = function(spriteGroup, spriteName, title) { return jQuery("", { src: srcImage, alt: spriteName, title: title, css: { width: sprites[spriteGroup].width, height: sprites[spriteGroup].height, "background-image": "url(" + spritesImage + ")", "background-repeat": "no-repeat", "background-position": this.getBackgroundPosition(spriteGroup, spriteName) } }); } this.getBackgroundPosition = function(spriteGroup, spriteName) { var backgroundLeft = jQuery.inArray(spriteName, sprites[spriteGroup].sprites) * (sprites[spriteGroup].width || 0); return "-" + backgroundLeft + "px -" + sprites[spriteGroup].top + "px"; } }, Support: { rgba: function() { // From http://leaverou.me/2009/03/check-whether-the-browser-supports-rgba-and-other-css3-values/ if(!('result' in arguments.callee)) { var element = document.createElement('div'); var testColor = 'rgba(0, 0, 0, 0.5)'; var result = false; try { element.style.color = testColor; result = /^rgba/.test(element.style.color); } catch(e) {} element = null; arguments.callee.result = result; } return arguments.callee.result; } }, urlDataToPath: function(urlData) { var path = urlData.path ||""; if (urlData.queryFields && this.hasProperties(urlData.queryFields)) { path += "?"; for(field in urlData.queryFields) { path += field + "=" + urlData.queryFields[field] + "&"; } path = path.substring(0, path.length-1); } if (urlData.anchor) path += "#" + urlData.anchor; return path; } }