/**
 * This file is to be used for testing the JSDoc parser
 * It is not intended to be an example of good JavaScript OO-programming,
 * nor is it intended to fulfill any specific purpose apart from
 * demonstrating the functionality of the
 * <a href='http://sourceforge.net/projects/jsdoc'>JSDoc</a> parser
 *
 * @author Gabriel Reid gab_reid@users.sourceforge.net
 * @version 0.1
 */


/**
 * Construct a new Shape object.
 * @classDescription This is the basic Shape class.
 * It can be considered an abstract class, even though no such thing
 * really existing in JavaScript
 * @constructor
 * @exception {MemoryException} if there is no more memory
 * @exception {GeneralShapeException} rarely (if ever)
 * @return {Shape, Coordinate} A new shape.
 */
function Shape(){

   /**
    * This is an example of a function that is not given as a property
    * of a prototype, but instead it is assigned within a constructor.
    * For inner functions like this to be picked up by the parser, the
    * function that acts as a constructor <b>must</b> be denoted with
    * the <b>&#64;constructor</b> tag in its comment.
    * @type {String}
    */
   this.getClassName = function(){
      return "Shape";
   }

   /**
    * This is an inner method, just used here as an example
    * @since version 0.5
    * @author Sue Smart
    */
   function addReference(){
       // Do nothing...
   }

}

/**
 * Create a new Hexagon instance.
 * @inherits Shape
 * @classDescription Hexagon is a class that is a <i>logical</i> sublcass of
 * Shape (thanks to the <code>&#64;extends</code> tag), but in
 * reality it is completely unrelated to Shape.
 * @param {int} sideLength The length of one side for the new Hexagon
 * @example
 * var h = new Hexagon(2);
 * @example
 * if (hasHex) {
 *     hex   = new Hexagon(5);
 *     color = hex.getColor();
 * }
 */
function Hexagon(sideLength) {
}


/**
 * This is an unattached (static) function that adds two integers together.
 * @param {int} One The first number to add
 * @param {int} Two The second number to add
 * @author Gabriel Reid
 * @deprecated
 */
function Add(One, Two){
    return One + Two;
}


/**
 * The color of this shape
 * @type {Color}
 */
Shape.prototype.color = null;

/**
 * The border of this shape.
 * @property {int}
 */
Shape.prototype.border = function(){return border;};

/*
 * These are all the instance method implementations for Shape
 */

/**
 * Get the coordinates of this shape. It is assumed that we're always talking
 * about shapes in a 2D location here.
 * @return A Coordinate object representing the location of this Shape
 * @type {Coordinate[]}
 */
Shape.prototype.getCoords = function(){
   return this.coords;
}

/**
 * Get the color of this shape.
 * @see #setColor
 * @see The <a href="http://example.com">Color</a> library.
 * @type {Color}
 */
Shape.prototype.getColor = function(){
   return this.color;
}

/**
 * Set the coordinates for this Shape
 * @param {Coordinate} coordinates The coordinates to set for this Shape
 */
Shape.prototype.setCoords = function(coordinates){
   this.coords = coordinates;
}

/**
 * Set the color for this Shape
 * @param {Color} color The color to set for this Shape
 * @param other There is no other param, but it can still be documented if
 *              optional parameters are used
 * @exception {NonExistantColorException} (no, not really!)
 * @see #getColor
 */
Shape.prototype.setColor = function(color){
   this.color = color;
}

/**
 * Clone this shape
 * @return {Shape} A copy of this shape
 * @author Gabriel Reid
 */
Shape.prototype.clone = function(){
   return new Shape();
}

/**
 * Clone this shape
 * @return {Shape} A copy of this shape
 * @author Gabriel Reid
 */
Shape.prototype.clone2 = function(){
   return new Shape();
}

/**
 * Here should be returned null since no type or return tag is available.
 */
Shape.prototype.clone3 = function(){
   return new Shape();
}

/**
 * Create a new Rectangle instance.
 * @classDescription A basic rectangle class, inherits from Shape.
 * This class could be considered a concrete implementation class
 * @constructor
 * @param {int} width The optional width for this Rectangle
 * @param {int} height Thie optional height for this Rectangle
 * @author Gabriel Reid
 * @see Shape is the base class for this
 */
function Rectangle(width, // This is the width
                  height // This is the height
                  ){
   if (width){
      this.width = width;
      if (height){
	 this.height = height;
      }
   }
}


/* Inherit from Shape */
Rectangle.prototype = new Shape();

/**
 * Value to represent the width of the Rectangle.
 * <br>Text in <b>bold</b> and <i>italic</i> and a
 * link to <a href="http://sf.net">SourceForge</a>
 * @private
 * @type {int}
 */
Rectangle.prototype.width = 0;

/**
 * Value to represent the height of the Rectangle
 * @private
 * @type {int}
 */
Rectangle.prototype.height = 0;

/**
 * Get the type of this object.
 * @type {String}
 */
Rectangle.prototype.getClassName= function(){
    return "Rectangle";
}

/**
 * Get the value of the width for the Rectangle
 * @type {int}
 * @see Rectangle#setWidth
 */
Rectangle.prototype.getWidth = function(){
   return this.width;
}

/**
 * Get the value of the height for the Rectangle.
 * Another getter is the Shape#getColor method in the
 * Shape base class.
 * @return The height of this Rectangle
 * @type {int}
 * @see Rectangle#setHeight
 */
Rectangle.prototype.getHeight = function(){
    return this.height;
}

/**
 * Set the width value for this Rectangle.
 * @param {int} width The width value to be set
 * @see #setWidth
 */
Rectangle.prototype.setWidth = function(width){
   this.width = width;
}

/**
 * Set the height value for this Rectangle.
 * @param {int} height The height value to be set
 * @see #getHeight
 */
Rectangle.prototype.setHeight = function(height){
   this.height = height;
}

/**
 * Get the value for the total area of this Rectangle
 * @return total area of this Rectangle
 * @type {int}
 */
Rectangle.prototype.getArea = function(){
   return width * height;
}


/**
 * Create a new Square instance.
 * @classDescription A Square is a subclass of Rectangle
 * @param {int} width The optional width for this Rectangle
 * @param {int} height The optional height for this Rectangle
 */
function Square(width, height){
   if (width){
      this.width = width;
      if (height){
	 this.height = height;
      }
   }

}

/* Square is a subclass of Rectangle */
Square.prototype = new Rectangle();

/**
 * Set the width value for this Shape.
 * @param {int} width The width value to be set
 * @see #getWidth
 */
Square.prototype.setWidth = function(width){
   this.width = this.height = width;
}

/**
 * Set the height value for this Shape
 * Sets the Rectangle#height attribute in the Rectangle.
 * @param {int} height The height value to be set
 */
Square.prototype.setHeight = function(height){
   this.height = this.width = height;
}


/**
 * Create a new Circle instance based on a radius.
 * @classDescription Circle class is another subclass of Shape
 * @inherits Shape
 * @param {int} radius The optional radius of this Circle 
 * @mixin Square.prototype.setWidth as this.setDiameter
 */
function Circle(radius){
   if (radius) {
      /** The radius of the this Circle. */
      this.radius = radius;
   }
}

/* Circle inherits from Shape */
Circle.prototype = new Shape();

/**
 * The radius value for this Circle
 * @private
 * @type {int}
 */
Circle.prototype.radius = 0;

/**
 * A very simple class (static) field that is also a constant
 * @deprecated
 * @type {float}
 */
Circle.PI = 3.14;

/**
 * Get the radius value for this Circle
 * @type {int}
 * @see #setRadius
 */
Circle.prototype.getRadius = function(){
   return this.radius;
}

/**
 * Set the radius value for this Circle
 * @param {int} radius The Circle#radius value to set
 * @see #getRadius
 */
Circle.prototype.setRadius = function(radius){
   this.radius = radius;
}

/**
 * An example of a  class (static) method that acts as a factory for Circle
 * objects. Given a radius value, this method creates a new Circle.
 * @param {int} radius The radius value to use for the new Circle.
 * @type {Circle}
 */
Circle.createCircle = function(radius){
    return new Circle(radius);
}


/**
 * Create a new Coordinate instance based on x and y grid data.
 * @classDescription Coordinate is a class that can encapsulate location information.
 * @param {int} [x=0] The optional x portion of the Coordinate
 * @param {int} [y=0] The optinal y portion of the Coordinate
 */
function Coordinate(x, y){
   if (x){
      this.x = x;
      if (y){
	 this.y = y;
      }
   }
}

/**
 * The x portion of the Coordinate
 * @type int
 * @see #getX
 * @see #setX
 */
Coordinate.prototype.x = 0;

/**
 * The y portion of the Coordinate
 * @type int
 * @see #getY
 * @see #setY
 */
Coordinate.prototype.y = 0;

/**
 * Gets the x portion of the Coordinate.
 * @type int
 * @see #setX
 */
Coordinate.prototype.getX = function(){
   return this.x;
}

/**
 * Get the y portion of the Coordinate.
 * @type int
 * @see #setY
 */
Coordinate.prototype.getY = function(){
   return this.y;
}

/**
 * Sets the x portion of the Coordinate.
 * @param {int} x The x value to set
 * @see #getX
 */
Coordinate.prototype.setX = function(x){
   this.x = x;
}

/**
 * Sets the y portion of the Coordinate.
 * @param {int} y The y value to set
 * @see #getY
 */
Coordinate.prototype.setY = function(y){
   this.y = y;
}

/**
 * @classDescription This class exists to demonstrate the assignment of a class prototype
 * as an anonymous block.
 */
function ShapeFactory(){
}

ShapeFactory.prototype = {
   /**
    * Creates a new Shape instance.
    * @return A new Shape
    * @type Shape
    */
   createShape: function(){
      return new Shape();
   }
}

/**
 * An example of a singleton class
 * @param ... Arguments represent coordinates in the shape.
 * @constructor
 */
MySingletonShapeFactory = function(){

   /**
    * Get the next Shape
    * @type Shape
    * @return A new Shape
    */
   this.getShape = function(){
      return null;
   }

}


/**
 * Create a new Foo instance.
 * @classDescription This is the Foo class. It exists to demonstrate 'nested' classes.
 * @constructor
 * @see Foo.Bar
 */
function Foo(){}

/**
 * Creates a new instance of Bar.
 * @classDescription This class exists to demonstrate 'nested' classes.
 * @constructor
 * @see Foo.Bar
 */
function Bar(){}

/**
 * Nested class
 * @constructor
 */
Foo.Bar = function(){
	/** The x. */ this.x = 2;
}

Foo.Bar.prototype = new Bar();
/** The y. */
Foo.Bar.prototype.y = '3';

/**
 * @return {Number}
 */
function martion () {
    return MyObj.getVersion;
}

var MyObj = {
    version: 10,
    factory: function () {
        return this;
    },

    create: function () {
        return new MyObj();
    },

    getInfo: function() {
       return "text";
    },

    /**
    * @return {Number}
    */
    getVersion: function() {
        return version;
    }
}

Shape.prototype.clone4 = function(){
   return new Shape();
}

/**
 * Create a new Rectangle instance.
 */
function Rectangle2(width, height) {
    if (width) {
        this.width = width;
        if (height){
            this.height = height;
        }
    }
}

/**
 * @me
 */
function methodCCTest() {
}
