/*
 * Copyright 2004 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 

var textHeight = 10;
var padding = 10;
var namespace = "http://www.w3.org/2000/svg";

var displayAttributes = true;
var displayMethods = true;
var displayNotes = true;

function Type(name){
	this.width = 160;
	this.style = "type";
	
	this.insert = function(evt){
		y = 0;
		y = this.insertOutline(evt,y);
		y = this.insertName(evt,y);
		if(displayAttributes==true){
			y = this.insertAttributes(evt,y);
		}
		if(displayMethods==true){
			y = this.insertMethods(evt,y);
		}
		if(displayNotes==true){
			y = this.insertNotes(evt,y);
		}
	}
	
	this.height = function(){
		height = 0;
		height += this.heightName();
		if(displayAttributes==true){
			height += this.heightAttributes();
		}
		if(displayMethods==true){
			height += this.heightMethods();
		}
		return height;
	}
	
	
	
	
	
	
	this.insertOutline = function(evt,y){

		style = evt.target.getAttributeNS(null, "class");
		evt.target.setAttributeNS(null,"class",style+" "+this.style);

		e = document.createElementNS(namespace, "rect");
		e.setAttributeNS(null, "x", 0);
		e.setAttributeNS(null, "y", 0);
		e.setAttributeNS(null, "width",  this.width);
		e.setAttributeNS(null, "height", this.height());
        	e.setAttributeNS(null, "class", "outline");
        	evt.target.appendChild(e);

		return y;
	}
	
	
	
	
	
	
	
	this.name = name;
	
	this.heightName = function(){
		return padding * 2 + textHeight;
	}
	
	this.insertName = function(evt,y){
	
		y += padding;
		y += textHeight;
		
		e = document.createElementNS(namespace, "text");
		e.setAttributeNS(null, "x", this.width/2);
		e.setAttributeNS(null, "y", y);
		e.setAttributeNS(null, "class", "title");
		e.appendChild(document.createTextNode(this.name));
		evt.target.appendChild(e);
        
		y += padding;
	
		return y;
	}
	
	
	
	
	
	
	
	this.attributeList = new Array();
	this.attributeCount = 0;
	
	this.addAttribute = function(text){
		this.attributeList[this.attributeCount++]=text;
	}
	
	this.heightAttributes = function(){
		if(this.attributeCount>0){
			return padding * 2 + this.attributeCount*textHeight;
		}
		else{
			return padding;
		}
	}
	
	this.insertAttributes = function(evt,y){
	
		e = document.createElementNS(namespace, "line");
		e.setAttributeNS(null, "x1", 0);
		e.setAttributeNS(null, "y1", y);
		e.setAttributeNS(null, "x2", this.width);
		e.setAttributeNS(null, "y2", y);
		e.setAttributeNS(null, "class", "divider");
		evt.target.appendChild(e);
		
		y += padding;
		
		for(i=0;i<this.attributeCount;++i){
			y += textHeight;
			
			e = document.createElementNS(namespace, "text");
			e.setAttributeNS(null, "x", padding);
			e.setAttributeNS(null, "y", y);
			e.setAttributeNS(null, "class", "attribute");
			e.appendChild(document.createTextNode(this.attributeList[i]));
			evt.target.appendChild(e);
		}
		
		if(this.attributeCount>0){
			y += padding;
		}
	
		return y;
	}
	
	
	
	
	
	this.methodList = new Array();
	this.methodCount = 0;
	
	this.addMethod = function(text){
		this.methodList[this.methodCount++]=text;
	}
	
	this.heightMethods = function(){
		if(this.methodCount>0){
			return padding * 2 + this.methodCount*textHeight;
		}
		else{
			return padding;
		}
	}
	
	this.insertMethods = function(evt,y){
	
		e = document.createElementNS(namespace, "line");
		e.setAttributeNS(null, "x1", 0);
		e.setAttributeNS(null, "y1", y);
		e.setAttributeNS(null, "x2", this.width);
		e.setAttributeNS(null, "y2", y);
		e.setAttributeNS(null, "class", "divider");
		evt.target.appendChild(e);
		
		y += padding;
		
		for(i=0;i<this.methodCount;++i){
			y += textHeight;
			
			e = document.createElementNS(namespace, "text");
			e.setAttributeNS(null, "x", padding);
			e.setAttributeNS(null, "y", y);
			e.setAttributeNS(null, "class", "method");
			e.appendChild(document.createTextNode(this.methodList[i]));
			evt.target.appendChild(e);
		}
		
		if(this.methodCount>0){
			y += padding;
		}
	
		return y;
	}
	
	
	
	
	
	this.noteList = new Array();
	this.noteCount = 0;
	
	this.addNote = function(text){
		this.noteList[this.noteCount++]=text;
	}
	
	this.insertNotes = function(evt,y){
		if(this.noteCount>0){
			joinTop = y;
		
			y += padding;
			
			e = document.createElementNS(namespace, "line");
			e.setAttributeNS(null, "x1", this.width/2-padding*2);
			e.setAttributeNS(null, "y1", y);
			e.setAttributeNS(null, "x2", this.width/2+padding*2);
			e.setAttributeNS(null, "y2", joinTop);
			e.setAttributeNS(null, "class", "note connect");
			evt.target.appendChild(e);
			
			
			
			height = this.heightNotes();
			
			e = document.createElementNS(namespace, "polygon");
			e.setAttributeNS(null, "points", "0,"+(y+padding)+" 0,"+(y+height)+" "+this.width+","+(y+height)+" "+this.width+","+y+" "+padding+","+y);
			e.setAttributeNS(null, "class", "note");
			evt.target.appendChild(e);
			
			e = document.createElementNS(namespace, "polygon");
			e.setAttributeNS(null, "points", ""+padding+","+y+" 0,"+(y+padding)+" "+padding+","+(y+padding));
			e.setAttributeNS(null, "class", "note corner");
			evt.target.appendChild(e);
			
			y += padding;
			
		
			for(i=0;i<this.noteCount;++i){
				y += textHeight;

				e = document.createElementNS(namespace, "text");
				e.setAttributeNS(null, "x", padding);
				e.setAttributeNS(null, "y", y);
				e.setAttributeNS(null, "class", "note");
				e.appendChild(document.createTextNode(this.noteList[i]));
				evt.target.appendChild(e);
			}
		}
	}
	
	this.heightNotes = function(){
		if(this.noteCount>0){
			return padding*2 + this.noteCount*textHeight;
		}
	}
}

function Interface(name){
	this.superclass = Type;
	this.superclass(name);
	delete this.superclass; 
	this.rounded = true;
	
	this.insertOutline = function(evt,y){

		style = evt.target.getAttributeNS(null, "class");
		evt.target.setAttributeNS(null,"class",style+" "+this.style);

		e = document.createElementNS(namespace, "rect");
		e.setAttributeNS(null, "x", 0);
		e.setAttributeNS(null, "y", 0);
		e.setAttributeNS(null, "width",  this.width);
		e.setAttributeNS(null, "height", this.height());
		e.setAttributeNS(null, "rx", padding*1.5);
		e.setAttributeNS(null, "ry", padding*1.5);
        	e.setAttributeNS(null, "class", "outline");
		evt.target.appendChild(e);

		return y;
	}
	
	this.heightAttributes = function(){
		return 0;
	}
	
	this.insertAttributes = function(evt,y){
		return y;
	}
	
}
Interface.prototype = new Type;

function Class(name){
	this.superclass = Type;
	this.superclass(name);
	delete this.superclass; 
	this.rounded = false;
}
Class.prototype = new Type;




function PackageSymbol(name,width,height){
	this.name = name;
	this.nameWidth = 150;
	this.width = width;
	this.height = height;
	
	this.insert = function(evt){
		
		style = evt.target.getAttributeNS(null, "class");
		evt.target.setAttributeNS(null,"class",style+" package");
		
		first = evt.target.getFirstChild();
		
		e = document.createElementNS(namespace, "rect");
		e.setAttributeNS(null, "x", 0);
		e.setAttributeNS(null, "y", 0);
		e.setAttributeNS(null, "width", this.nameWidth);
		e.setAttributeNS(null, "height", textHeight+padding);
		e.setAttributeNS(null, "class", "outline");
		e.appendChild(document.createTextNode(this.name));
		evt.target.insertBefore(e,first);
		
		e = document.createElementNS(namespace, "text");
		e.setAttributeNS(null, "x", this.nameWidth/2);
		e.setAttributeNS(null, "y", textHeight+padding/2);
		e.setAttributeNS(null, "class", "title");
		e.appendChild(document.createTextNode(this.name));
		evt.target.insertBefore(e,first);
		
		e = document.createElementNS(namespace, "rect");
		e.setAttributeNS(null, "x", 0);
		e.setAttributeNS(null, "y", textHeight+padding);
		e.setAttributeNS(null, "width", this.width);
		e.setAttributeNS(null, "height", this.height-textHeight-padding);
		e.setAttributeNS(null, "class", "outline");
		e.appendChild(document.createTextNode(this.name));
		evt.target.insertBefore(e,first);
		
		e = document.createElementNS(namespace, "rect");
		e.setAttributeNS(null, "x", padding);
		e.setAttributeNS(null, "y", textHeight+padding*2);
		e.setAttributeNS(null, "width", this.width-padding*2);
		e.setAttributeNS(null, "height", this.height-textHeight-padding*3);
		e.setAttributeNS(null, "class", "inner");
		e.appendChild(document.createTextNode(this.name));
		evt.target.insertBefore(e,first);
		
		
	}
}

