/****************************************************************
  *                                                              *
  *  curvyCorners                                                *
  *  ------------                                                *
  *                                                              *
  *  This script generates rounded corners for your divs.        *
  *                                                              *
  *  Version 1.2.9                                               *
  *  Copyright (c) 2006 Cameron Cooke                            *
  *  By: Cameron Cooke and Tim Hutchison.                        *
  *                                                              *
  *                                                              *
  *  Website: http://www.curvycorners.net                        *
  *  Email:   i...@totalinfinity.com                             *
  *  Forum:   http://www.curvycorners.net/forum/                 *
  *                                                              *
  *                                                              *
  *  This library is free software; you can redistribute         *
  *  it and/or modify it under the terms of the GNU              *
  *  Lesser General Public License as published by the           *
  *  Free Software Foundation; either version 2.1 of the         *
  *  License, or (at your option) any later version.             *
  *                                                              *
  *  This library is distributed in the hope that it will        *
  *  be useful, but WITHOUT ANY WARRANTY; without even the       *
  *  implied warranty of MERCHANTABILITY or FITNESS FOR A        *
  *  PARTICULAR PURPOSE. See the GNU Lesser General Public       *
  *  License for more details.                                   *
  *                                                              *
  *  You should have received a copy of the GNU Lesser           *
  *  General Public License along with this library;             *
  *  Inc., 59 Temple Place, Suite 330, Boston,                   *
  *  MA 02111-1307 USA                                           *
  *                                                              *
  ****************************************************************/

  // Browser detection
  var ccIsIE     = navigator.userAgent.toLowerCase().indexOf("msie") >
-1;
  var ccIsMoz    = document.implementation &&
document.implementation.createDocument;
  var ccIsSafari =((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false;

  /*
  Usage:

  newCornersObj = new ccCurvyCorners(settingsObj, "classNameStr");
  newCornersObj = new ccCurvyCorners(settingsObj, divObj1[, divObj2[,
divObj3[, . . . [, divObjN]]]]);
  */
  function ccCurvyCorners()
  {
      // Check parameters
      if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object.");
      if(typeof(arguments[1]) != "object" && typeof(arguments[1]) !="string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name.");

      // Get object(s)
      if(typeof(arguments[1]) == "string")
      {
          // Get elements by class name
          var startIndex = 0;
          var boxCol = $$(arguments[1]);
      }
      else
      {
          // Get objects
          var startIndex = 1;
          var boxCol = arguments;
      }
      // Create return collection/object
      var curvyCornersCol = new Array();

      // Create array of html elements that can have rounded corners
      if(arguments[0].validTags)
        var validElements = arguments[0].validTags;
      else
        var validElements = ["div"]; // Default

	// Loop through each argument
      for(var i = startIndex, j = boxCol.length; i < j; i++)
      {
          // Current element tag name
	          var currentTag = boxCol[i].tagName.toLowerCase();
		  
          if(ccInArray(validElements, currentTag) !== false)
          {
              curvyCornersCol[curvyCornersCol.length] = new ccCurvyObject(arguments[0], boxCol[i]);
          }
      }

      this.objects = curvyCornersCol;

      // Applys the curvyCorners to all objects
      this.applyCornersToAll = function()
      {
          for(var x = 0, k = this.objects.length; x < k; x++)
          {
              this.objects[x].applyCorners();
          }
      }
  }

  // curvyCorners object (can be called directly)
  function ccCurvyObject()
  {
      // Setup Globals
      this.box              = arguments[1];
      this.settings         = arguments[0];
      this.topContainer     = null;
      this.bottomContainer  = null;
      this.masterCorners    = new Array();
      this.contentDIV       = null;

      // Get box formatting details
      var boxHeight       = ccGet_style(this.box, "height", "height");
      var boxWidth        = ccGet_style(this.box, "width", "width");
      var borderWidth     = ccGet_style(this.box, "borderTopWidth","border-top-width");
      var borderColour    = ccGet_style(this.box, "borderTopColor","border-top-color");
      var boxColour       = ccGet_style(this.box, "backgroundColor","background-color");
      var backgroundImage = ccGet_style(this.box, "backgroundImage","background-image");
      var boxPosition     = ccGet_style(this.box, "position","position");
      var boxPadding      = ccGet_style(this.box, "paddingTop","padding-top");

      // Set formatting propertes
      this.boxHeight       = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0,boxHeight.indexOf("px")) : this.box.scrollHeight));
      this.boxWidth        = parseInt(((boxWidth != "" && boxWidth !="auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0,boxWidth.indexOf("px")) : this.box.scrollWidth));
      this.borderWidth     = parseInt(((borderWidth != "" &&borderWidth.indexOf("px") !== -1)? borderWidth.slice(0,borderWidth.indexOf("px")) : 0));
      this.boxColour       = ccFormat_colour(boxColour);
      this.boxPadding      = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0,boxPadding.indexOf("px")) : 0));
      this.borderColour    = ccFormat_colour(borderColour);
      this.borderString    = this.borderWidth + "px" + " solid " +this.borderColour;
      this.backgroundImage = ((backgroundImage != "none")?backgroundImage : "");
      this.boxContent      = this.box.innerHTML;

      // Make box relative if not already absolute and remove any padding
      if(boxPosition != "absolute") this.box.style.position = "relative";
      this.box.style.padding = "0px";

      // If IE and height and width are not set, we need to set width so that we get positioning
      if(ccIsIE && boxWidth == "auto" && boxHeight == "auto")
			this.box.style.width = "100%";

      // Resize box so that it stays to the orignal height

      // Remove content if box is using autoPad
      if(this.settings.autoPad == true && this.boxPadding > 0)
        this.box.innerHTML = "";

      /*
      This method creates the corners and
      applies them to the div element.
      */
      this.applyCorners = function()
      {
          /*
          Create top and bottom containers.
          These will be used as a parent for the corners and bars.
          */
          for(var t = 0; t < 2; t++)
          {
              switch(t)
              {
                  // Top
                  case 0:

                      // Only build top bar if a top corner is to bedraw
                      if(this.settings.tl || this.settings.tr)
                      {
                          var newMainContainer =document.createElement("DIV");
                          newMainContainer.style.width    = "100%";
                          newMainContainer.style.fontSize = "1px";
                          newMainContainer.style.overflow = "hidden";
                          newMainContainer.style.position ="absolute";
                          newMainContainer.style.paddingLeft  =this.borderWidth + "px";
                          newMainContainer.style.paddingRight =this.borderWidth + "px";
                          var topMaxRadius =Math.max(this.settings.tl ? this.settings.tl.radius : 0,this.settings.tr ? this.settings.tr.radius : 0);
                          newMainContainer.style.height = topMaxRadius+ "px";
                          newMainContainer.style.top    = 0 -topMaxRadius + "px";
                          newMainContainer.style.left   = 0 -this.borderWidth + "px";
                          this.topContainer =this.box.appendChild(newMainContainer);
                      }
                      break;

                  // Bottom
                  case 1:

                      // Only build bottom bar if a top corner is tobe draw
                      if(this.settings.bl || this.settings.br)
                      {
                          var newMainContainer =document.createElement("DIV");
                          newMainContainer.style.width    = "100%";
                          newMainContainer.style.fontSize = "1px";
                          newMainContainer.style.overflow = "hidden";
                          newMainContainer.style.position ="absolute";
                          newMainContainer.style.paddingLeft  =this.borderWidth + "px";
                          newMainContainer.style.paddingRight =this.borderWidth + "px";
                          var botMaxRadius =Math.max(this.settings.bl ? this.settings.bl.radius : 0,this.settings.br ? this.settings.br.radius : 0);
                          newMainContainer.style.height  =botMaxRadius + "px";
                          newMainContainer.style.bottom  =  0 -botMaxRadius + "px";
                          newMainContainer.style.left    =  0 -this.borderWidth + "px";
                          this.bottomContainer =this.box.appendChild(newMainContainer);
                      }
                      break;
              }
          }

          // Turn off current borders
          if(this.topContainer) this.box.style.borderTopWidth = "0px";
          if(this.bottomContainer) this.box.style.borderBottomWidth ="0px";

          // Create array of available corners
          var corners = ["tr", "tl", "br", "bl"];

          /*
          Loop for each corner
          */
          for(var i in corners)
          {
              // FIX for prototype lib
              if(i > -1 < 4)
              {
                  // Get current corner type from array
                  var cc = corners[i];

                  // Has the user requested the currentCorner beround?
                  if(!this.settings[cc])
                  {
                      // No
                      if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
                      {
                          // We need to create a filler div to fill the space upto the next horzontal corner.
                          var newCorner = document.createElement("DIV");

                          // Setup corners properties
                          newCorner.style.position = "relative";
                          newCorner.style.fontSize = "1px";
                          newCorner.style.overflow = "hidden";

                          // Add background image?
                          if(this.backgroundImage == "")
                            newCorner.style.backgroundColor =this.boxColour;
                          else
                            newCorner.style.backgroundImage =this.backgroundImage;

                          switch(cc)
                          {
                              case "tl":
                                  newCorner.style.height      =topMaxRadius - this.borderWidth + "px";
                                  newCorner.style.marginRight =this.settings.tr.radius - (this.borderWidth*2) + "px";
                                  newCorner.style.borderLeft  =this.borderString;
                                  newCorner.style.borderTop   =this.borderString;
                                  newCorner.style.left        = -this.borderWidth + "px";
                                  break;

                              case "tr":
                                  newCorner.style.height      =topMaxRadius - this.borderWidth + "px";
                                  newCorner.style.marginLeft  =this.settings.tl.radius - (this.borderWidth*2) + "px";
                                  newCorner.style.borderRight =this.borderString;
                                  newCorner.style.borderTop   =this.borderString;
                                  newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px";
                                  newCorner.style.left        =this.borderWidth + "px";
                                  break;

                              case "bl":
                                  newCorner.style.height       =botMaxRadius - this.borderWidth + "px";
                                  newCorner.style.marginRight  =this.settings.br.radius - (this.borderWidth*2) + "px";
                                  newCorner.style.borderLeft   =this.borderString;
                                  newCorner.style.borderBottom =this.borderString;
                                  newCorner.style.left         = -this.borderWidth + "px";
                                  newCorner.style.backgroundPosition ="-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px";
                                  break;

                              case "br":
                                  newCorner.style.height       =botMaxRadius - this.borderWidth + "px";
                                  newCorner.style.marginLeft   =this.settings.bl.radius - (this.borderWidth*2) + "px";
                                  newCorner.style.borderRight  =this.borderString;
                                  newCorner.style.borderBottom =this.borderString;
                                  newCorner.style.left         =this.borderWidth + "px"
                                  newCorner.style.backgroundPosition ="-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight +(botMaxRadius + this.borderWidth)) + "px";
                                  break;
                          }
                      }
                  }
                  else
                  {
                      /*
                      PERFORMANCE NOTE:

                      If more than one corner is requested and a
corner has been already
                      created for the same radius then that corner
will be used as a master and cloned.
                      The pixel bars will then be repositioned to form
the new corner type.
                      All new corners start as a bottom right corner.
                      */
                      if(this.masterCorners[this.settings[cc].radius])
                      {
                          // Create clone of the master corner
                          var newCorner =this.masterCorners[this.settings[cc].radius].cloneNode(true);
                      }
                      else
                      {
                          // Yes, we need to create a new corner
                          var newCorner =document.createElement("DIV");
                          newCorner.style.height =this.settings[cc].radius + "px";
                          newCorner.style.width  =this.settings[cc].radius + "px";
                          newCorner.style.position = "absolute";
                          newCorner.style.fontSize = "1px";
                          newCorner.style.overflow = "hidden";

                          // THE FOLLOWING BLOCK OF CODE CREATES AROUNDED CORNER
                          //---------------------------------------------------- TOP

                          // Get border radius
                          var borderRadius =parseInt(this.settings[cc].radius - this.borderWidth);

                          // Cycle the x-axis
                          for(var intx = 0, j =this.settings[cc].radius; intx < j; intx++)
                          {
                              // Calculate the value of y1 which identifies the pixels inside the border
                              if((intx +1) >= borderRadius)
                                var y1 = -1;
                              else
                                var y1 =(Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1),2))) - 1);

                              // Only calculate y2 and y3 if there isa border defined
                              if(borderRadius != j)
                              {
                                  if((intx) >= borderRadius)
                                    var y2 = -1;
                                  else
                                    var y2 =Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2)));

                                  if((intx+1) >= j)
                                    var y3 = -1;
                                  else
                                    var y3 =(Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);
                              }

                              // Calculate y4
                              if((intx) >= j)
                                var y4 = -1;
                              else
                                var y4 =Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2)));

                              // Draw bar on inside of the border withforeground colour
                              if(y1 > -1) this.drawPixel(intx, 0,this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius);

                              // Only draw border/foregroundantialiased pixels and border if there is a border defined
                              if(borderRadius != j)
                              {
                                  // Cycle the y-axis
                                  for(var inty = (y1 + 1); inty < y2;inty++)
                                  {
                                      // Draw anti-alias pixels
                                      if(this.settings.antiAlias)
                                      {
                                          // For each of the pixelsthat need anti aliasing between the foreground and border colour drawsingle pixel divs
                                          if(this.backgroundImage !="")
                                          {
                                              var borderFract =(pixelFraction(intx, inty, borderRadius) * 100);

                                              if(borderFract < 30)
                                              {
                                                 this.drawPixel(intx,inty, this.borderColour, 100, 1, newCorner, 0,this.settings[cc].radius);
                                              }
                                              else
                                              {
                                              this.drawPixel(intx,inty, this.borderColour, 100, 1, newCorner, -1,this.settings[cc].radius);
                                              }
                                          }
                                          else
                                          {
                                              var pixelcolour =ccBlendColour(this.boxColour, this.borderColour, pixelFraction(intx,inty, borderRadius));
                                              this.drawPixel(intx,inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius,cc);
                                          }
                                      }
                                  }

                                  // Draw bar for the border
                                  if(this.settings.antiAlias)
                                  {
                                      if(y3 >= y2)
                                      {
                                         if (y2 == -1) y2 = 0;
                                         this.drawPixel(intx, y2,this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);
                                      }
                                  }
                                  else
                                  {
                                      if(y3 >= y1)
                                      {
                                          this.drawPixel(intx, (y1 +1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);
                                      }
                                  }

                                  // Set the colour for the outsidecurve
                                  var outsideColour =this.borderColour;
                              }
                              else
                              {
                                  // Set the coour for the outsidecurve
                                  var outsideColour = this.boxColour;
                                  var y3 = y1;
                              }

                              // Draw aa pixels?
                              if(this.settings.antiAlias)
                              {
                                  // Cycle the y-axis and draw theanti aliased pixels on the outside of the curve
                                  for(var inty = (y3 + 1); inty < y4;inty++)
                                  {
                                      // For each of the pixels thatneed anti aliasing between the foreground/border colour & backgrounddraw single pixel divs
                                      this.drawPixel(intx, inty,outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner,((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);
                                  }
                              }
                          }

                          // END OF CORNER CREATION
                          //---------------------------------------------------- END

                          // We now need to store the current cornerin the masterConers array
                          this.masterCorners[this.settings[cc].radius]= newCorner.cloneNode(true);
                      }

                      /*
                      Now we have a new corner we need to reposition
all the pixels unless
                      the current corner is the bottom right.
                      */
                      if(cc != "br")
                      {
                          // Loop through all children (pixel bars)
                          for(var t = 0, k =newCorner.childNodes.length; t < k; t++)
                          {
                              // Get current pixel bar
                              var pixelBar = newCorner.childNodes[t];

                              // Get current top and left properties
                              var pixelBarTop    =parseInt(pixelBar.style.top.substring(0,pixelBar.style.top.indexOf("px")));
                              var pixelBarLeft   =parseInt(pixelBar.style.left.substring(0,pixelBar.style.left.indexOf("px")));
                              var pixelBarHeight =parseInt(pixelBar.style.height.substring(0,pixelBar.style.height.indexOf("px")));

                              // Reposition pixels
                              if(cc == "tl" || cc == "bl"){
                                  pixelBar.style.left =this.settings[cc].radius -pixelBarLeft -1 + "px"; // Left
                              }
                              if(cc == "tr" || cc == "tl"){
                                  pixelBar.style.top =this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px"; // Top
                              }

                              switch(cc)
                              {
                                  case "tr":

pixelBar.style.backgroundPosition  = "-" + Math.abs((this.boxWidth -this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -"+ Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop -this.borderWidth) + "px";
                                      break;

                                  case "tl":

pixelBar.style.backgroundPosition = "-" +Math.abs((this.settings[cc].radius -pixelBarLeft -1)  -this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px";
                                      break;

                                  case "bl":

pixelBar.style.backgroundPosition = "-" +Math.abs((this.settings[cc].radius -pixelBarLeft -1) -this.borderWidth) + "px -" + Math.abs((this.boxHeight +this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px";
                                      break;
                              }
                          }
                      }
                  }

                  if(newCorner)
                  {
                      // Position the container
                      switch(cc)
                      {
                          case "tl":
                            if(newCorner.style.position == "absolute") newCorner.style.top  = "0px";
                            if(newCorner.style.position == "absolute") newCorner.style.left = "0px";
                            if(this.topContainer)
this.topContainer.appendChild(newCorner);
                            break;

                          case "tr":
                            if(newCorner.style.position == "absolute") newCorner.style.top  = "0px";
                            if(newCorner.style.position == "absolute") newCorner.style.right = "0px";
                            if(this.topContainer) this.topContainer.appendChild(newCorner);
                            break;

                          case "bl":
                            if(newCorner.style.position == "absolute") newCorner.style.bottom  = "0px";
                            if(newCorner.style.position == "absolute") newCorner.style.left = "0px";
                            if(this.bottomContainer) this.bottomContainer.appendChild(newCorner);
                            break;

                          case "br":
                            if(newCorner.style.position == "absolute") newCorner.style.bottom   = "0px";
                            if(newCorner.style.position == "absolute") newCorner.style.right = "0px";
                            if(this.bottomContainer) this.bottomContainer.appendChild(newCorner);
                            break;
                      }
                  }
              }
          }


          /*
          The last thing to do is draw the rest of the filler DIVs.
          We only need to create a filler DIVs when two corners have
          diffrent radiuses in either the top or bottom container.
          */

          // Find out which corner has the biiger radius and get thedifference amount
          var radiusDiff = new Array();
          radiusDiff["t"] = Math.abs(this.settings.tl.radius -this.settings.tr.radius)
          radiusDiff["b"] = Math.abs(this.settings.bl.radius -this.settings.br.radius);

          for(z in radiusDiff)
          {
              // FIX for prototype lib
              if(z == "t" || z == "b")
              {
                  if(radiusDiff[z])
                  {
                      // Get the type of corner that is the smallerone
                      var smallerCornerType = ((this.settings[z +"l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r");

                      // First we need to create a DIV for the spaceunder the smaller corner
                      var newFiller = document.createElement("DIV");
                      newFiller.style.height = radiusDiff[z] + "px";
                      newFiller.style.width  =this.settings[smallerCornerType].radius+ "px"
                      newFiller.style.position = "absolute";
                      newFiller.style.fontSize = "1px";
                      newFiller.style.overflow = "hidden";
                      newFiller.style.backgroundColor =this.boxColour;
                      //newFiller.style.backgroundColor =get_random_color();

                      // Position filler
                      switch(smallerCornerType)
                      {
                          case "tl":
                              newFiller.style.bottom = "0px";
                              newFiller.style.left   = "0px";
                              newFiller.style.borderLeft =this.borderString;

this.topContainer.appendChild(newFiller);
                              break;

                          case "tr":
                              newFiller.style.bottom = "0px";
                              newFiller.style.right  = "0px";
                              newFiller.style.borderRight =this.borderString;

this.topContainer.appendChild(newFiller);
                              break;

                          case "bl":
                              newFiller.style.top    = "0px";
                              newFiller.style.left   = "0px";
                              newFiller.style.borderLeft =this.borderString;

this.bottomContainer.appendChild(newFiller);
                              break;

                          case "br":
                              newFiller.style.top    = "0px";
                              newFiller.style.right  = "0px";
                              newFiller.style.borderRight =this.borderString;

this.bottomContainer.appendChild(newFiller);
                              break;
                      }
                  }

                  // Create the bar to fill the gap between eachcorner horizontally
                  var newFillerBar = document.createElement("DIV");
                  newFillerBar.style.position = "relative";
                  newFillerBar.style.fontSize = "1px";
                  newFillerBar.style.overflow = "hidden";
                  newFillerBar.style.backgroundColor = this.boxColour;
                  newFillerBar.style.backgroundImage =this.backgroundImage;

                  switch(z)
                  {
                      case "t":
                          // Top Bar
                          if(this.topContainer)
                          {
                              // Edit by Asger Hallas: Check ifsettings.xx.radius is not false
                              if(this.settings.tl.radius && this.settings.tr.radius)
                              {
                                  newFillerBar.style.height      =topMaxRadius - this.borderWidth + "px";
                                  newFillerBar.style.marginLeft  =this.settings.tl.radius - this.borderWidth + "px";
                                  newFillerBar.style.marginRight =this.settings.tr.radius - this.borderWidth + "px";
                                  newFillerBar.style.borderTop   =this.borderString;

                                  if(this.backgroundImage != "")

newFillerBar.style.backgroundPosition  = "-" + (topMaxRadius + this.borderWidth) + "px 0px";

this.topContainer.appendChild(newFillerBar);
                              }

                              // Repos the boxes background image
                              this.box.style.backgroundPosition      ="0px -" + (topMaxRadius - this.borderWidth) + "px";
                          }
                          break;

                      case "b":
                          if(this.bottomContainer)
                          {
                              // Edit by Asger Hallas: Check ifsettings.xx.radius is not false
                              if(this.settings.bl.radius && this.settings.br.radius)
                              {
                                  // Bottom Bar
                                  newFillerBar.style.height       =botMaxRadius - this.borderWidth + "px";
                                  newFillerBar.style.marginLeft   =this.settings.bl.radius - this.borderWidth + "px";
                                  newFillerBar.style.marginRight  =this.settings.br.radius - this.borderWidth + "px";
                                  newFillerBar.style.borderBottom =this.borderString;

                                  if(this.backgroundImage != "")

newFillerBar.style.backgroundPosition  = "-" + (botMaxRadius +this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius +this.borderWidth)) + "px";

this.bottomContainer.appendChild(newFillerBar);
                              }
                          }
                          break;
                  }
              }
          }

          /*
          AutoPad! apply padding if set.
          */
          if(this.settings.autoPad == true && this.boxPadding > 0)
          {
              // Create content container
              var contentContainer = document.createElement("DIV");

              // Set contentContainer's properties
              contentContainer.style.position = "relative";
              contentContainer.innerHTML      = this.boxContent;
              contentContainer.className      = "autoPadDiv";

              // Get padding amounts
              var topPadding = Math.abs(topMaxRadius -this.boxPadding);
              var botPadding = Math.abs(botMaxRadius -this.boxPadding);

              // Apply top padding
              if(topMaxRadius < this.boxPadding)
                contentContainer.style.paddingTop = topPadding + "px";

              // Apply Bottom padding
              if(botMaxRadius < this.boxPadding)
                contentContainer.style.paddingBottom = botMaxRadius +"px";

              // Apply left and right padding
              contentContainer.style.paddingLeft = this.boxPadding +"px";
              contentContainer.style.paddingRight = this.boxPadding +"px";

              // Append contentContainer
              this.contentDIV =this.box.appendChild(contentContainer);
          }
      }

      /*
      This function draws the pixles
      */
      this.drawPixel = function(intx, inty, colour, transAmount,height, newCorner, image, cornerRadius)
      {
          // Create pixel
          var pixel = document.createElement("DIV");
          pixel.style.height   = height + "px";
          pixel.style.width    = "1px";
          pixel.style.position = "absolute";
          pixel.style.fontSize = "1px";
          pixel.style.overflow = "hidden";

          // Max Top Radius
          var topMaxRadius = Math.max(this.settings["tr"].radius,this.settings["tl"].radius);

          // Dont apply background image to border pixels
          if(image == -1 && this.backgroundImage != "")
          {
              pixel.style.backgroundImage = this.backgroundImage;
                                   pixel.style.backgroundPosition  = "-" + (this.boxWidth -(cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight+ topMaxRadius + inty) -this.borderWidth) + "px";
                        }
          else
          {
              pixel.style.backgroundColor = colour;
          }

          // Set opacity if the transparency is anything other than100
          if (transAmount != 100) $(pixel).setStyle('opacity', transAmount);



// Set the pixels position
          pixel.style.top = inty + "px";
          pixel.style.left = intx + "px";

          newCorner.appendChild(pixel);
      }
  }

  // ------------- UTILITY FUNCTIONS

  // Inserts a element after another
  function ccInsertAfter(parent, node, referenceNode)
  {
             parent.insertBefore(node, referenceNode.nextSibling);
  }

  /*
  Blends the two colours by the fraction
  returns the resulting colour as a string in the format "#FFFFFF"
  */
  function ccBlendColour(Col1, Col2, Col1Fraction)
  {
      var red1 = parseInt(Col1.substr(1,2),16);
      var green1 = parseInt(Col1.substr(3,2),16);
      var blue1 = parseInt(Col1.substr(5,2),16);
      var red2 = parseInt(Col2.substr(1,2),16);
      var green2 = parseInt(Col2.substr(3,2),16);
      var blue2 = parseInt(Col2.substr(5,2),16);

      if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1;

      var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 -Col1Fraction)));
      if(endRed > 255) endRed = 255;
      if(endRed < 0) endRed = 0;

      var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1- Col1Fraction)));
      if(endGreen > 255) endGreen = 255;
      if(endGreen < 0) endGreen = 0;

      var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 -Col1Fraction)));
      if(endBlue > 255) endBlue = 255;
      if(endBlue < 0) endBlue = 0;

      return "#" + ccIntToHex(endRed)+ ccIntToHex(endGreen)+ccIntToHex(endBlue);
  }

  /*
  Converts a number to hexadecimal format
  */
  function ccIntToHex(strNum)
  {
      base = strNum / 16;
      rem = strNum % 16;
      base = base - (rem / 16);
      baseS = ccMakeHex(base);
      remS = ccMakeHex(rem);

      return baseS + '' + remS;
  }

  /*
  gets the hex bits of a number
  */
  function ccMakeHex(x)
  {
      if((x >= 0) && (x <= 9))
      {
          return x;
      }
      else
      {
          switch(x)
          {
              case 10: return "A";
              case 11: return "B";
              case 12: return "C";
              case 13: return "D";
              case 14: return "E";
              case 15: return "F";
          }
      }
  }

  /*
  For a pixel cut by the line determines the fraction of the pixel on
the 'inside' of the
  line.  Returns a number between 0 and 1
  */
  function pixelFraction(x, y, r)
  {
      var pixelfraction = 0;

      /*
      determine the co-ordinates of the two points on the perimeter of
the pixel that the
      circle crosses
      */
      var xvalues = new Array(1);
      var yvalues = new Array(1);
      var point = 0;
      var whatsides = "";

      // x + 0 = Left
      var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2)));

      if ((intersect >= y) && (intersect < (y+1)))
      {
          whatsides = "Left";
          xvalues[point] = 0;
          yvalues[point] = intersect - y;
          point =  point + 1;
      }
      // y + 1 = Top
      var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2)));

      if ((intersect >= x) && (intersect < (x+1)))
      {
          whatsides = whatsides + "Top";
          xvalues[point] = intersect - x;
          yvalues[point] = 1;
          point = point + 1;
      }
      // x + 1 = Right
      var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2)));

      if ((intersect >= y) && (intersect < (y+1)))
      {
          whatsides = whatsides + "Right";
          xvalues[point] = 1;
          yvalues[point] = intersect - y;
          point =  point + 1;
      }
      // y + 0 = Bottom
      var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2)));

      if ((intersect >= x) && (intersect < (x+1)))
      {
          whatsides = whatsides + "Bottom";
          xvalues[point] = intersect - x;
          yvalues[point] = 0;
      }

      /*
      depending on which sides of the perimeter of the pixel the
circle crosses calculate the
      fraction of the pixel inside the circle
      */
      switch (whatsides)
      {
              case "LeftRight":
              pixelfraction = Math.min(yvalues[0],yvalues[1]) +((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2);
              break;

              case "TopRight":
              pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2);
              break;

              case "TopBottom":
              pixelfraction = Math.min(xvalues[0],xvalues[1]) +((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2);
              break;

              case "LeftBottom":
              pixelfraction = (yvalues[0]*xvalues[1])/2;
              break;

              default:
              pixelfraction = 1;
      }

      return pixelfraction;
  }

  // This function converts CSS rgb(x, x, x) to hexadecimal
  function ccRgb2Hex(rgbColour)
  {
      try{

          // Get array of RGB values
          var rgbArray = ccRgb2Array(rgbColour);

          // Get RGB values
          var red   = parseInt(rgbArray[0]);
          var green = parseInt(rgbArray[1]);
          var blue  = parseInt(rgbArray[2]);

          // Build hex colour code
          var hexColour = "#" + ccIntToHex(red) + ccIntToHex(green) +ccIntToHex(blue);
      }
      catch(e){

          alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");
      }

      return hexColour;
  }

  // Returns an array of rbg values
  function ccRgb2Array(rgbColour)
  {
      // Remove rgb()
      var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")"));

      // Split RGB into array
      var rgbArray = rgbValues.split(", ");

      return rgbArray;
  }

  /*
  Function by Simon Willison from sitepoint.com
  Modified by Cameron Cooke adding Safari's rgba support
  */
  function ccSetOpacity(obj, opacity)
  {
      opacity = (opacity == 100)?99.999:opacity;

      if(ccIsSafari && obj.tagName != "IFRAME")
      {
          // Get array of RGB values
          var rgbArray = rgb2Array(obj.style.backgroundColor);

          // Get RGB values
          var red   = parseInt(rgbArray[0]);
          var green = parseInt(rgbArray[1]);
          var blue  = parseInt(rgbArray[2]);

          // Safari using RGBA support
          obj.style.backgroundColor = "rgba(" + red + ", " + green +", " + blue + ", " + opacity/100 + ")";
      }
      else if(typeof(obj.style.opacity) != "undefined")
      {
          // W3C
          obj.style.opacity = opacity/100;
      }
      else if(typeof(obj.style.MozOpacity) != "undefined")
      {
          // Older Mozilla
          obj.style.MozOpacity = opacity/100;
      }
      else if(typeof(obj.style.filter) != "undefined")
      {
          // IE
          obj.style.filter = "alpha(opacity:" + opacity + ")";
      }
      else if(typeof(obj.style.KHTMLOpacity) != "undefined")
      {
          // Older KHTML Based Browsers
          obj.style.KHTMLOpacity = opacity/100;
      }
  }

  /*
  Returns index if the passed value is found in the
  array otherwise returns false.
  */
  function ccInArray(array, value)
  {
      for(var i = 0; i < array.length; i++){

          // Matches identical (===), not just similar (==).
          if (array[i] === value) return i;
      }

      return false;
  }

  /*
  Returns true if the passed value is found as a key
  in the array otherwise returns false.
  */
  function ccInArrayKey(array, value)
  {
      for(key in array){

          // Matches identical (===), not just similar (==).
          if(key === value) return true;
      }

      return false;
  }

  // Cross browser add event wrapper
  function ccAddEvent(elm, evType, fn, useCapture) {
          if (elm.addEventListener) {
                  elm.addEventListener(evType, fn, useCapture);
                  return true;
          }
          else if (elm.attachEvent) {
                  var r = elm.attachEvent('on' + evType, fn);
                  return r;
          }
          else {
                  elm['on' + evType] = fn;
          }
  }

  // Cross browser remove event wrapper
  function ccRemoveEvent(obj, evType, fn, useCapture){
    if (obj.removeEventListener){
      obj.removeEventListener(evType, fn, useCapture);
      return true;
    } else if (obj.detachEvent){
      var r = obj.detachEvent("on"+evType, fn);
      return r;
    } else {
      alert("Handler could not be removed");
    }
  }

  // Formats colours
  function ccFormat_colour(colour)
  {
      var returnColour = "#ffffff";

      // Make sure colour is set and not transparent
      if(colour != "" && colour != "transparent")
      {
          // RGB Value?
          if(colour.substr(0, 3) == "rgb")
          {
              // Get HEX aquiv.
              returnColour = ccRgb2Hex(colour);
          }
          else if(colour.length == 4)
          {
              // 3 chr colour code add remainder
              returnColour = "#" + colour.substring(1, 2) +colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2,3) + colour.substring(3, 4) + colour.substring(3, 4);
          }
          else
          {
              // Normal valid hex colour
              returnColour = colour;
          }
      }

      return returnColour;
  }

  // Returns the style value for the property specfied
  function ccGet_style(obj, property, propertyNS)
  {
      try
      {
          if(obj.currentStyle)
          {
              var returnVal = eval("obj.currentStyle." + property);
          }
          else
          {
              /*
              Safari does not expose any information for the object if
display is
              set to none is set so we temporally enable it.
              */
              if(ccIsSafari && obj.style.display == "none")
              {
                obj.style.display = "";
                var wasHidden = true;
              }

              var returnVal =document.defaultView.getComputedStyle(obj,'').getPropertyValue(propertyNS);

              // Rehide the object
              if(ccIsSafari && wasHidden)
              {
                  obj.style.display = "none";
              }
          }
      }
      catch(e)
      {
          // Do nothing
      }

      return returnVal;
  }

  // Get elements by class by Dustin Diaz.
  function ccGetElementsByClass(searchClass, node, tag)
  {
             var classElements = new Array();

      if(node == null)
                      node = document;
             if(tag == null)
                      tag = '*';

             var els = node.getElementsByTagName(tag);
             var elsLen = els.length;
             var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)");

             for (i = 0, j = 0; i < elsLen; i++)
      {
                        if(pattern.test(els[i].className))
          {
                                   classElements[j] = els[i];
                                   j++;
                        }
             }

             return classElements;
  }

  // Displays error message
  function newCurvyError(errorMessage)
  {
      return new Error("curvyCorners Error:\n" + errorMessage)
  } 