114 lines
3.4 KiB
JavaScript
114 lines
3.4 KiB
JavaScript
/**
|
|
* ORGINAL VERSION:
|
|
* ScaleRaphael 0.8 by Zevan Rosser 2010
|
|
* For use with Raphael library : www.raphaeljs.com
|
|
* Licensed under the MIT license.
|
|
* www.shapevent.com/scaleraphael/
|
|
*
|
|
* MODIFIED VERSION:
|
|
* @author Bertrand Chevrier <bertrand@taotesting.com> for OAT SA
|
|
* - Code refactoring to fit AMD modules
|
|
*/
|
|
define(['jquery', 'raphael'], function($, Raphael){
|
|
|
|
var scaleRaphael = function(container, width, height){
|
|
var wrapper = container.style ? container : document.getElementById(container);
|
|
|
|
if (!wrapper.style.position){
|
|
wrapper.style.position = "relative";
|
|
}
|
|
|
|
wrapper.style.width = width + "px";
|
|
wrapper.style.height = height + "px";
|
|
//wrapper.style.overflow = "hidden";
|
|
|
|
var nestedWrapper;
|
|
|
|
if (Raphael.type === "VML"){
|
|
wrapper.innerHTML = "<rvml:group style='position : absolute; width: 1000px; height: 1000px; top: 0px; left: 0px' coordsize='1000,1000' class='rvml'><\/rvml:group>";
|
|
nestedWrapper = $(".rvml", $(wrapper))[0];
|
|
}else{
|
|
wrapper.innerHTML = "<div class='svggroup'><\/div>";
|
|
nestedWrapper = $(".svggroup", $(wrapper))[0];
|
|
}
|
|
|
|
var paper = new Raphael(nestedWrapper, width, height);
|
|
var vmlDiv;
|
|
|
|
if (Raphael.type === "SVG"){
|
|
paper.canvas.setAttribute("viewBox", "0 0 "+width+" "+height);
|
|
}else{
|
|
vmlDiv = wrapper.getElementsByTagName("div")[0];
|
|
}
|
|
|
|
paper.changeSize = function(w, h, center, clipping){
|
|
clipping = !clipping;
|
|
|
|
var ratioW = w / width;
|
|
var ratioH = h / height;
|
|
var scale = ratioW < ratioH ? ratioW : ratioH;
|
|
|
|
var newHeight = parseInt(height * scale);
|
|
var newWidth = parseInt(width * scale);
|
|
|
|
if (Raphael.type === "VML"){
|
|
// scale the textpaths
|
|
var txt = document.getElementsByTagName("textpath");
|
|
for (var i in txt){
|
|
var curr = txt[i];
|
|
if (curr.style){
|
|
if(!curr._fontSize){
|
|
var mod = curr.style.font.split("px");
|
|
curr._fontSize = parseInt(mod[0]);
|
|
curr._font = mod[1];
|
|
}
|
|
curr.style.font = curr._fontSize * scale + "px" + curr._font;
|
|
}
|
|
}
|
|
var newSize;
|
|
if (newWidth < newHeight){
|
|
newSize = newWidth * 1000 / width;
|
|
}else{
|
|
newSize = newHeight * 1000 / height;
|
|
}
|
|
newSize = parseInt(newSize);
|
|
nestedWrapper.style.width = newSize + "px";
|
|
nestedWrapper.style.height = newSize + "px";
|
|
if (clipping){
|
|
nestedWrapper.style.left = parseInt((w - newWidth) / 2) + "px";
|
|
nestedWrapper.style.top = parseInt((h - newHeight) / 2) + "px";
|
|
}
|
|
vmlDiv.style.overflow = "visible";
|
|
}
|
|
|
|
if (clipping){
|
|
newWidth = w;
|
|
newHeight = h;
|
|
}
|
|
|
|
wrapper.style.width = newWidth + "px";
|
|
wrapper.style.height = newHeight + "px";
|
|
paper.setSize(newWidth, newHeight);
|
|
|
|
if (center){
|
|
wrapper.style.position = "absolute";
|
|
wrapper.style.left = parseInt((w - newWidth) / 2) + "px";
|
|
wrapper.style.top = parseInt((h - newHeight) / 2) + "px";
|
|
}
|
|
};
|
|
|
|
paper.scaleAll = function(amount){
|
|
paper.changeSize(width * amount, height * amount);
|
|
};
|
|
|
|
paper.changeSize(width, height);
|
|
|
|
paper.w = width;
|
|
paper.h = height;
|
|
|
|
return paper;
|
|
};
|
|
|
|
return scaleRaphael;
|
|
});
|