Rounded.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:19k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.widget.Rounded");
  9. dojo.widget.tags.addParseTreeHandler("dojo:rounded");
  10. dojo.require("dojo.widget.*");
  11. dojo.require("dojo.widget.ContentPane");
  12. dojo.require("dojo.html.style");
  13. dojo.require("dojo.html.display");
  14. dojo.require("dojo.gfx.color");
  15. dojo.deprecated("dojo.widget.Rounded will be removed in version 0.5; you can now apply rounded corners to any block element using dojo.lfx.rounded.", "0.5");
  16. dojo.widget.defineWidget("dojo.widget.Rounded", dojo.widget.ContentPane, {isSafari:dojo.render.html.safari, boxMargin:"50px", radius:14, domNode:"", corners:"TR,TL,BR,BL", antiAlias:true, fillInTemplate:function (args, frag) {
  17. dojo.widget.Rounded.superclass.fillInTemplate.call(this, args, frag);
  18. dojo.html.insertCssFile(this.templateCssPath);
  19. if (this.domNode.style.height <= 0) {
  20. var minHeight = (this.radius * 1) + this.domNode.clientHeight;
  21. this.domNode.style.height = minHeight + "px";
  22. }
  23. if (this.domNode.style.width <= 0) {
  24. var minWidth = (this.radius * 1) + this.domNode.clientWidth;
  25. this.domNode.style.width = minWidth + "px";
  26. }
  27. var cornersAvailable = ["TR", "TL", "BR", "BL"];
  28. var cornersPassed = this.corners.split(",");
  29. this.settings = {antiAlias:this.antiAlias};
  30. var setCorner = function (currentCorner) {
  31. var val = currentCorner.toLowerCase();
  32. if (dojo.lang.inArray(cornersPassed, currentCorner)) {
  33. this.settings[val] = {radius:this.radius, enabled:true};
  34. } else {
  35. this.settings[val] = {radius:0};
  36. }
  37. };
  38. dojo.lang.forEach(cornersAvailable, setCorner, this);
  39. this.domNode.style.margin = this.boxMargin;
  40. this.curvyCorners(this.settings);
  41. this.applyCorners();
  42. }, curvyCorners:function (settings) {
  43. this.box = this.domNode;
  44. this.topContainer = null;
  45. this.bottomContainer = null;
  46. this.masterCorners = [];
  47. var boxHeight = dojo.html.getStyle(this.box, "height");
  48. if (boxHeight == "") {
  49. boxHeight = "0px";
  50. }
  51. var boxWidth = dojo.html.getStyle(this.box, "width");
  52. var borderWidth = dojo.html.getStyle(this.box, "borderTopWidth");
  53. if (borderWidth == "") {
  54. borderWidth = "0px";
  55. }
  56. var borderColour = dojo.html.getStyle(this.box, "borderTopColor");
  57. if (borderWidth > 0) {
  58. this.antiAlias = true;
  59. }
  60. var boxColour = dojo.html.getStyle(this.box, "backgroundColor");
  61. var backgroundImage = dojo.html.getStyle(this.box, "backgroundImage");
  62. var boxPosition = dojo.html.getStyle(this.box, "position");
  63. this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1) ? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight));
  64. this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1) ? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth));
  65. this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1) ? borderWidth.slice(0, borderWidth.indexOf("px")) : 0));
  66. var test = new dojo.gfx.color.Color(boxColour);
  67. this.boxColour = ((boxColour != "" && boxColour != "transparent") ? ((boxColour.substr(0, 3) == "rgb") ? this.rgb2Hex(boxColour) : boxColour) : "#ffffff");
  68. this.borderColour = ((borderColour != "" && borderColour != "transparent" && this.borderWidth > 0) ? ((borderColour.substr(0, 3) == "rgb") ? this.rgb2Hex(borderColour) : borderColour) : this.boxColour);
  69. this.borderString = this.borderWidth + "px" + " solid " + this.borderColour;
  70. this.backgroundImage = ((backgroundImage != "none") ? backgroundImage : "");
  71. if (boxPosition != "absolute") {
  72. this.box.style.position = "relative";
  73. }
  74. this.applyCorners = function () {
  75. for (var t = 0; t < 2; t++) {
  76. switch (t) {
  77.   case 0:
  78. if (this.settings.tl.enabled || this.settings.tr.enabled) {
  79. var newMainContainer = document.createElement("DIV");
  80. with (newMainContainer.style) {
  81. width = "100%";
  82. fontSize = "1px";
  83. overflow = "hidden";
  84. position = "absolute";
  85. paddingLeft = this.borderWidth + "px";
  86. paddingRight = this.borderWidth + "px";
  87. var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0);
  88. height = topMaxRadius + "px";
  89. top = 0 - topMaxRadius + "px";
  90. left = 0 - this.borderWidth + "px";
  91. }
  92. this.topContainer = this.box.appendChild(newMainContainer);
  93. }
  94. break;
  95.   case 1:
  96. if (this.settings.bl.enabled || this.settings.br.enabled) {
  97. var newMainContainer = document.createElement("DIV");
  98. with (newMainContainer.style) {
  99. width = "100%";
  100. fontSize = "1px";
  101. overflow = "hidden";
  102. position = "absolute";
  103. paddingLeft = this.borderWidth + "px";
  104. paddingRight = this.borderWidth + "px";
  105. var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0);
  106. height = botMaxRadius + "px";
  107. bottom = 0 - botMaxRadius + "px";
  108. left = 0 - this.borderWidth + "px";
  109. }
  110. this.bottomContainer = this.box.appendChild(newMainContainer);
  111. }
  112. break;
  113. }
  114. }
  115. if (this.topContainer) {
  116. this.box.style.borderTopWidth = "0px";
  117. }
  118. if (this.bottomContainer) {
  119. this.box.style.borderBottomWidth = "0px";
  120. }
  121. var corners = ["tr", "tl", "br", "bl"];
  122. for (var i in corners) {
  123. var cc = corners[i];
  124. if (!this.settings[cc]) {
  125. if (((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null)) {
  126. var newCorner = document.createElement("DIV");
  127. newCorner.style.position = "relative";
  128. newCorner.style.fontSize = "1px";
  129. newCorner.style.overflow = "hidden";
  130. if (this.backgroundImage == "") {
  131. newCorner.style.backgroundColor = this.boxColour;
  132. } else {
  133. newCorner.style.backgroundImage = this.backgroundImage;
  134. }
  135. switch (cc) {
  136.   case "tl":
  137. with (newCorner.style) {
  138. height = topMaxRadius - this.borderWidth + "px";
  139. marginRight = this.settings.tr.radius - (this.borderWidth * 2) + "px";
  140. borderLeft = this.borderString;
  141. borderTop = this.borderString;
  142. left = -this.borderWidth + "px";
  143. }
  144. break;
  145.   case "tr":
  146. with (newCorner.style) {
  147. height = topMaxRadius - this.borderWidth + "px";
  148. marginLeft = this.settings.tl.radius - (this.borderWidth * 2) + "px";
  149. borderRight = this.borderString;
  150. borderTop = this.borderString;
  151. backgroundPosition = "-" + this.boxWidth + "px 0px";
  152. left = this.borderWidth + "px";
  153. }
  154. break;
  155.   case "bl":
  156. with (newCorner.style) {
  157. height = botMaxRadius - this.borderWidth + "px";
  158. marginRight = this.settings.br.radius - (this.borderWidth * 2) + "px";
  159. borderLeft = this.borderString;
  160. borderBottom = this.borderString;
  161. left = -this.borderWidth + "px";
  162. }
  163. break;
  164.   case "br":
  165. with (newCorner.style) {
  166. height = botMaxRadius - this.borderWidth + "px";
  167. marginLeft = this.settings.bl.radius - (this.borderWidth * 2) + "px";
  168. borderRight = this.borderString;
  169. borderBottom = this.borderString;
  170. left = this.borderWidth + "px";
  171. }
  172. break;
  173. }
  174. }
  175. } else {
  176. if (this.masterCorners[this.settings[cc].radius]) {
  177. var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);
  178. } else {
  179. var newCorner = document.createElement("DIV");
  180. with (newCorner.style) {
  181. height = this.settings[cc].radius + "px";
  182. width = this.settings[cc].radius + "px";
  183. position = "absolute";
  184. fontSize = "1px";
  185. overflow = "hidden";
  186. }
  187. var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth);
  188. for (var intx = 0, j = this.settings[cc].radius; intx < j; intx++) {
  189. if ((intx + 1) >= borderRadius) {
  190. var y1 = -1;
  191. } else {
  192. var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx + 1), 2))) - 1);
  193. }
  194. if (borderRadius != j) {
  195. if ((intx) >= borderRadius) {
  196. var y2 = -1;
  197. } else {
  198. var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow(intx, 2)));
  199. }
  200. if ((intx + 1) >= j) {
  201. var y3 = -1;
  202. } else {
  203. var y3 = (Math.floor(Math.sqrt(Math.pow(j, 2) - Math.pow((intx + 1), 2))) - 1);
  204. }
  205. }
  206. if ((intx) >= j) {
  207. var y4 = -1;
  208. } else {
  209. var y4 = Math.ceil(Math.sqrt(Math.pow(j, 2) - Math.pow(intx, 2)));
  210. }
  211. if (y1 > -1) {
  212. this.drawPixel(intx, 0, this.boxColour, 100, (y1 + 1), newCorner, -1, this.settings[cc].radius);
  213. }
  214. if (borderRadius != j) {
  215. if (this.antiAlias) {
  216. for (var inty = (y1 + 1); inty < y2; inty++) {
  217. if (this.backgroundImage != "") {
  218. var borderFract = (this.pixelFraction(intx, inty, borderRadius) * 100);
  219. if (borderFract < 30) {
  220. this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);
  221. } else {
  222. this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);
  223. }
  224. } else {
  225. var pixelcolour = dojo.gfx.color.blend(this.boxColour, this.borderColour, this.pixelFraction(intx, inty, borderRadius));
  226. this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius);
  227. }
  228. }
  229. }
  230. if (y3 >= y2) {
  231. if (y1 == -1) {
  232. y1 = 0;
  233. }
  234. this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, this.settings[cc].radius);
  235. }
  236. var outsideColour = this.borderColour;
  237. } else {
  238. var outsideColour = this.boxColour;
  239. var y3 = y1;
  240. }
  241. if (this.antiAlias) {
  242. for (var inty = (y3 + 1); inty < y4; inty++) {
  243. this.drawPixel(intx, inty, outsideColour, (this.pixelFraction(intx, inty, j) * 100), 1, newCorner, ((this.borderWidth > 0) ? 0 : -1), this.settings[cc].radius);
  244. }
  245. }
  246. }
  247. this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);
  248. }
  249. if (cc != "br") {
  250. for (var t = 0, k = newCorner.childNodes.length; t < k; t++) {
  251. var pixelBar = newCorner.childNodes[t];
  252. var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px")));
  253. var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px")));
  254. var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px")));
  255. if (cc == "tl" || cc == "bl") {
  256. pixelBar.style.left = this.settings[cc].radius - pixelBarLeft - 1 + "px";
  257. }
  258. if (cc == "tr" || cc == "tl") {
  259. pixelBar.style.top = this.settings[cc].radius - pixelBarHeight - pixelBarTop + "px";
  260. }
  261. var value;
  262. switch (cc) {
  263.   case "tr":
  264. value = (-1 * (Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) - (Math.abs(this.settings[cc].radius - pixelBarHeight - pixelBarTop - this.borderWidth))));
  265. pixelBar.style.backgroundPosition = value + "px";
  266. break;
  267.   case "tl":
  268. value = (-1 * (Math.abs((this.settings[cc].radius - pixelBarLeft - 1) - this.borderWidth) - (Math.abs(this.settings[cc].radius - pixelBarHeight - pixelBarTop - this.borderWidth))));
  269. pixelBar.style.backgroundPosition = value + "px";
  270. break;
  271.   case "bl":
  272. value = (-1 * (Math.abs((this.settings[cc].radius - pixelBarLeft - 1) - this.borderWidth) - (Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) - this.borderWidth))));
  273. pixelBar.style.backgroundPosition = value + "px";
  274. break;
  275. }
  276. }
  277. }
  278. }
  279. if (newCorner) {
  280. switch (cc) {
  281.   case "tl":
  282. if (newCorner.style.position == "absolute") {
  283. newCorner.style.top = "0px";
  284. }
  285. if (newCorner.style.position == "absolute") {
  286. newCorner.style.left = "0px";
  287. }
  288. if (this.topContainer) {
  289. this.topContainer.appendChild(newCorner);
  290. }
  291. break;
  292.   case "tr":
  293. if (newCorner.style.position == "absolute") {
  294. newCorner.style.top = "0px";
  295. }
  296. if (newCorner.style.position == "absolute") {
  297. newCorner.style.right = "0px";
  298. }
  299. if (this.topContainer) {
  300. this.topContainer.appendChild(newCorner);
  301. }
  302. break;
  303.   case "bl":
  304. if (newCorner.style.position == "absolute") {
  305. newCorner.style.bottom = "0px";
  306. }
  307. if (newCorner.style.position == "absolute") {
  308. newCorner.style.left = "0px";
  309. }
  310. if (this.bottomContainer) {
  311. this.bottomContainer.appendChild(newCorner);
  312. }
  313. break;
  314.   case "br":
  315. if (newCorner.style.position == "absolute") {
  316. newCorner.style.bottom = "0px";
  317. }
  318. if (newCorner.style.position == "absolute") {
  319. newCorner.style.right = "0px";
  320. }
  321. if (this.bottomContainer) {
  322. this.bottomContainer.appendChild(newCorner);
  323. }
  324. break;
  325. }
  326. }
  327. }
  328. var radiusDiff = [];
  329. radiusDiff["t"] = this.settings.tl.enabled && this.settings.tr.enabled ? Math.abs(this.settings.tl.radius - this.settings.tr.radius) : 0;
  330. radiusDiff["b"] = this.settings.bl.enabled && this.settings.br.enabled ? Math.abs(this.settings.bl.radius - this.settings.br.radius) : 0;
  331. for (var z in radiusDiff) {
  332. if (radiusDiff[z]) {
  333. var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius) ? z + "l" : z + "r");
  334. var newFiller = document.createElement("DIV");
  335. with (newFiller.style) {
  336. height = radiusDiff[z] + "px";
  337. width = this.settings[smallerCornerType].radius + "px";
  338. position = "absolute";
  339. fontSize = "1px";
  340. overflow = "hidden";
  341. backgroundColor = this.boxColour;
  342. }
  343. switch (smallerCornerType) {
  344.   case "tl":
  345. with (newFiller.style) {
  346. bottom = "0px";
  347. left = "0px";
  348. borderLeft = this.borderString;
  349. }
  350. this.topContainer.appendChild(newFiller);
  351. break;
  352.   case "tr":
  353. with (newFiller.style) {
  354. bottom = "0px";
  355. right = "0px";
  356. borderRight = this.borderString;
  357. }
  358. this.topContainer.appendChild(newFiller);
  359. break;
  360.   case "bl":
  361. with (newFiller.style) {
  362. top = "0px";
  363. left = "0px";
  364. borderLeft = this.borderString;
  365. }
  366. this.bottomContainer.appendChild(newFiller);
  367. break;
  368.   case "br":
  369. with (newFiller.style) {
  370. top = "0px";
  371. right = "0px";
  372. borderRight = this.borderString;
  373. }
  374. this.bottomContainer.appendChild(newFiller);
  375. break;
  376. }
  377. }
  378. var newFillerBar = document.createElement("DIV");
  379. with (newFillerBar.style) {
  380. position = "relative";
  381. fontSize = "1px";
  382. overflow = "hidden";
  383. backgroundColor = this.boxColour;
  384. }
  385. switch (z) {
  386.   case "t":
  387. if (this.topContainer) {
  388. with (newFillerBar.style) {
  389. height = topMaxRadius - this.borderWidth + "px";
  390. marginLeft = this.settings.tl.radius - this.borderWidth + "px";
  391. marginRight = this.settings.tr.radius - this.borderWidth + "px";
  392. borderTop = this.borderString;
  393. }
  394. this.topContainer.appendChild(newFillerBar);
  395. }
  396. break;
  397.   case "b":
  398. if (this.bottomContainer) {
  399. with (newFillerBar.style) {
  400. height = botMaxRadius - this.borderWidth + "px";
  401. marginLeft = this.settings.bl.radius - this.borderWidth + "px";
  402. marginRight = this.settings.br.radius - this.borderWidth + "px";
  403. borderBottom = this.borderString;
  404. }
  405. this.bottomContainer.appendChild(newFillerBar);
  406. }
  407. break;
  408. }
  409. }
  410. };
  411. this.drawPixel = function (intx, inty, colour, transAmount, height, newCorner, image, cornerRadius) {
  412. var pixel = document.createElement("DIV");
  413. pixel.style.height = height + "px";
  414. pixel.style.width = "1px";
  415. pixel.style.position = "absolute";
  416. pixel.style.fontSize = "1px";
  417. pixel.style.overflow = "hidden";
  418. if (image == -1 && this.backgroundImage != "") {
  419. pixel.style.backgroundImage = this.backgroundImage;
  420. pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + cornerRadius + inty) - this.borderWidth) + "px";
  421. } else {
  422. pixel.style.backgroundColor = colour;
  423. }
  424. if (transAmount != 100) {
  425. dojo.html.setOpacity(pixel, transAmount);
  426. }
  427. pixel.style.top = inty + "px";
  428. pixel.style.left = intx + "px";
  429. newCorner.appendChild(pixel);
  430. };
  431. }, pixelFraction:function (x, y, r) {
  432. var pixelfraction = 0;
  433. var xvalues = [];
  434. var yvalues = [];
  435. var point = 0;
  436. var whatsides = "";
  437. var intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(x, 2)));
  438. if ((intersect >= y) && (intersect < (y + 1))) {
  439. whatsides = "Left";
  440. xvalues[point] = 0;
  441. yvalues[point] = intersect - y;
  442. point = point + 1;
  443. }
  444. var intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(y + 1, 2)));
  445. if ((intersect >= x) && (intersect < (x + 1))) {
  446. whatsides = whatsides + "Top";
  447. xvalues[point] = intersect - x;
  448. yvalues[point] = 1;
  449. point = point + 1;
  450. }
  451. var intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(x + 1, 2)));
  452. if ((intersect >= y) && (intersect < (y + 1))) {
  453. whatsides = whatsides + "Right";
  454. xvalues[point] = 1;
  455. yvalues[point] = intersect - y;
  456. point = point + 1;
  457. }
  458. var intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(y, 2)));
  459. if ((intersect >= x) && (intersect < (x + 1))) {
  460. whatsides = whatsides + "Bottom";
  461. xvalues[point] = intersect - x;
  462. yvalues[point] = 0;
  463. }
  464. switch (whatsides) {
  465.   case "LeftRight":
  466. pixelfraction = Math.min(yvalues[0], yvalues[1]) + ((Math.max(yvalues[0], yvalues[1]) - Math.min(yvalues[0], yvalues[1])) / 2);
  467. break;
  468.   case "TopRight":
  469. pixelfraction = 1 - (((1 - xvalues[0]) * (1 - yvalues[1])) / 2);
  470. break;
  471.   case "TopBottom":
  472. pixelfraction = Math.min(xvalues[0], xvalues[1]) + ((Math.max(xvalues[0], xvalues[1]) - Math.min(xvalues[0], xvalues[1])) / 2);
  473. break;
  474.   case "LeftBottom":
  475. pixelfraction = (yvalues[0] * xvalues[1]) / 2;
  476. break;
  477.   default:
  478. pixelfraction = 1;
  479. }
  480. return pixelfraction;
  481. }, rgb2Hex:function (rgbColour) {
  482. try {
  483. var rgbArray = this.rgb2Array(rgbColour);
  484. var red = parseInt(rgbArray[0]);
  485. var green = parseInt(rgbArray[1]);
  486. var blue = parseInt(rgbArray[2]);
  487. var hexColour = "#" + this.intToHex(red) + this.intToHex(green) + this.intToHex(blue);
  488. }
  489. catch (e) {
  490. alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");
  491. }
  492. return hexColour;
  493. }, intToHex:function (strNum) {
  494. var base = strNum / 16;
  495. var rem = strNum % 16;
  496. var base = base - (rem / 16);
  497. var baseS = this.makeHex(base);
  498. var remS = this.makeHex(rem);
  499. return baseS + "" + remS;
  500. }, makeHex:function (x) {
  501. if ((x >= 0) && (x <= 9)) {
  502. return x;
  503. } else {
  504. switch (x) {
  505.   case 10:
  506. return "A";
  507.   case 11:
  508. return "B";
  509.   case 12:
  510. return "C";
  511.   case 13:
  512. return "D";
  513.   case 14:
  514. return "E";
  515.   case 15:
  516. return "F";
  517. }
  518. }
  519. }, rgb2Array:function (rgbColour) {
  520. var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")"));
  521. var rgbArray = rgbValues.split(", ");
  522. return rgbArray;
  523. }});