/*
Scripts to create interactive buttons in SVG using ECMA script
Copyright (C) <2006>  <Andreas Neumann>
Version 1.1.3, 2006-10-30
neumann@karto.baug.ethz.ch
http://www.carto.net/
http://www.carto.net/neumann/

Credits:
* Bruce Rindahl and Virgis Globis for fixing an error with vertical positioning of the button texts
* Olaf Schnabel for suggesting a bugfix where type conversion was missing when button text was of type number

----

Documentation: http://www.carto.net/papers/svg/gui/button/

----

current version: 1.1.3

version history:
1.0 (2006-02-08)
initial version

1.0.1 (2006-03-11)
changed parameters of constructor (styling system): now an array of literals containing presentation attributes. This allows for more flexibility in Styling. Added check for number of arguments.

1.0.2 (2006-07-07)
added the option to create multiline textbuttons, changed the behaviour of the y placement of the text in the button

1.1 (2006-07-12)
added .resize(width,height) and .moveTo(x.y) methods, added new constructor parameter parentNode, fixed a bug from version 1.0.2 in the method .setTextValue()

1.1.1 (2006-10-23)
fixed an error with vertical positioning of button texts (thanks Bruce and Virgis)
changed DOM hierarchy slightly. Every button now has its own group "this.parentGroup". This is necessary to hide and show a button. This group should not be shared by other SVG elements, unless on purpose.
adopted .resize() and .moveTo() methods to make use of the corrected function this.createButtonTexts();

1.1.2 (2006-10-26)
corrected a bug where type conversion in buttonText was missing when buttonText was of type number

1.1.3 (2006-10-30)
corrected a bug where the .deactivate() method did not work properly when called after the method .setTextValue()
added support for "rx" and "ry" attribute in "this.deActivateRect"

-------


This ECMA script 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 (lesser_gpl.txt); if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

----

original document site: http://www.carto.net/papers/svg/gui/button/
Please contact the author in case you want to use code or ideas commercially.
If you use this code, please include this copyright header, the included full
LGPL 2.1 text and read the terms provided in the LGPL 2.1 license
(http://www.gnu.org/copyleft/lesser.txt)

-------------------------------

Please report bugs and send improvements to neumann@karto.baug.ethz.ch
If you use this control, please link to the original (http://www.carto.net/papers/svg/gui/button/)
somewhere in the source-code-comment or the "about" of your project and give credits, thanks!

*/

function button(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset) {	
	var nrArguments = 15;
	if (arguments.length > 0) {
		if (arguments.length == nrArguments) {
			this.init(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset);
		}
		else {
			alert("Error in Button ("+id+"): wrong nr of arguments! You have to pass over "+nrArguments+" parameters.");		
		}
	}
}

button.prototype.init = function(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset) {
	this.id = id; //the id where all new content is appended to
	this.parentNode = parentNode; //the id or node reference of the parent group where the button can be appended
	this.functionToCall = functionToCall; //function to be called if button was pressed
	this.buttonType = buttonType; //button type: currently either "rect" or "ellipse"
	this.buttonText = buttonText; //default value to be filled in when button is created
	this.buttonSymbolId = buttonSymbolId; //id to a symbol to be used as a button graphics
	this.x = x; //left of button rectangle
	this.y = y; //top of button rectangle
	this.width = width; //button rectangle width
	this.height = height; //button rectangle height
	this.textStyles = textStyles; //array of literals containing text styles
	if (!this.textStyles["font-size"]) {
		this.textStyles["font-size"] = 12;
	}	
	this.buttonStyles = buttonStyles; //the fill color of the button rectangle or ellipse
	this.shadeLightStyles = shadeLightStyles; //light fill color simulating 3d effect
	this.shadeDarkStyles = shadeDarkStyles; //dark fill color simulating 3d effect
	this.shadowOffset = shadowOffset; //shadow offset in viewBox units
	this.upperLeftLine = null; //later a reference to the upper left line simulating 3d effect
	this.buttonRect = null; //later a reference to the button area (rect)
	this.buttonTextElement = null; //later a reference to the button text
	this.buttonSymbolInstance = null; //later a reference to the button symbol
	this.deActivateRect = null; //later a reference to a rectangle that can be used to deactivate the button
	this.activated = true; //a property indicating if button is activated or not
	this.lowerRightLine = null; //later a reference to the lower right line simulating 3d effect
	this.createButton(); //method to initialize button
	this.timer = new Timer(this); //a Timer instance for calling the functionToCall
	this.timerMs = 200; //a constant of this object that is used in conjunction with the timer - functionToCall is called after 200 ms
}

//create button
button.prototype.createButton = function() {
	var result = this.testParent();
		if (result) {
			//create upper left button line or ellipse
			if (this.buttonType == "rect") {
				this.upperLeftShadow = document.createElementNS(svgNS,"rect");
				this.upperLeftShadow.setAttributeNS(null,"x",this.x - this.shadowOffset);
				this.upperLeftShadow.setAttributeNS(null,"y",this.y - this.shadowOffset);
				this.upperLeftShadow.setAttributeNS(null,"width",this.width);
				this.upperLeftShadow.setAttributeNS(null,"height",this.height);
				this.upperLeftShadow.setAttributeNS(null,"points",this.x+","+(this.y+this.height)+" "+this.x+","+this.y+" "+(this.x+this.width)+","+this.y);
			}
			else if (this.buttonType == "ellipse") {
				this.upperLeftShadow = document.createElementNS(svgNS,"ellipse");
				this.upperLeftShadow.setAttributeNS(null,"cx",this.x + this.width * 0.5 - this.shadowOffset);
				this.upperLeftShadow.setAttributeNS(null,"cy",this.y + this.height * 0.5 - this.shadowOffset);
				this.upperLeftShadow.setAttributeNS(null,"rx",this.width * 0.5);
				this.upperLeftShadow.setAttributeNS(null,"ry",this.height * 0.5);
			}
			else {
				alert("buttonType '"+this.buttonType+"' not supported. You need to specify 'rect' or 'ellipse'");
			}
			for (var attrib in this.shadeLightStyles) {
				this.upperLeftShadow.setAttributeNS(null,attrib,this.shadeLightStyles[attrib]);
			}
			this.parentGroup.appendChild(this.upperLeftShadow);
    		
			//create lower right button line or ellipse
			if (this.buttonType == "rect") {
				this.lowerRightShadow = document.createElementNS(svgNS,"rect");
				this.lowerRightShadow.setAttributeNS(null,"x",this.x + this.shadowOffset);
				this.lowerRightShadow.setAttributeNS(null,"y",this.y + this.shadowOffset);
				this.lowerRightShadow.setAttributeNS(null,"width",this.width);
				this.lowerRightShadow.setAttributeNS(null,"height",this.height);
				this.lowerRightShadow.setAttributeNS(null,"points",this.x+","+(this.y+this.height)+" "+this.x+","+this.y+" "+(this.x+this.width)+","+this.y);
			}
			else if (this.buttonType == "ellipse") {
				this.lowerRightShadow = document.createElementNS(svgNS,"ellipse");
				this.lowerRightShadow.setAttributeNS(null,"cx",this.x + this.width * 0.5 + this.shadowOffset);
				this.lowerRightShadow.setAttributeNS(null,"cy",this.y + this.height * 0.5 + this.shadowOffset);
				this.lowerRightShadow.setAttributeNS(null,"rx",this.width * 0.5);
				this.lowerRightShadow.setAttributeNS(null,"ry",this.height * 0.5);
			}
			for (var attrib in this.shadeDarkStyles) {
				this.lowerRightShadow.setAttributeNS(null,attrib,this.shadeDarkStyles[attrib]);
			}
			this.parentGroup.appendChild(this.lowerRightShadow);
    		
			//create buttonRect
			if (this.buttonType == "rect") {
				this.buttonRect = document.createElementNS(svgNS,"rect");
				this.buttonRect.setAttributeNS(null,"x",this.x);
				this.buttonRect.setAttributeNS(null,"y",this.y);
				this.buttonRect.setAttributeNS(null,"width",this.width);
				this.buttonRect.setAttributeNS(null,"height",this.height);
			}
			else if (this.buttonType == "ellipse") {
				this.buttonRect = document.createElementNS(svgNS,"ellipse");
				this.buttonRect.setAttributeNS(null,"cx",this.x + this.width * 0.5);
				this.buttonRect.setAttributeNS(null,"cy",this.y + this.height * 0.5);
				this.buttonRect.setAttributeNS(null,"rx",this.width * 0.5);
				this.buttonRect.setAttributeNS(null,"ry",this.height * 0.5);
			}
			for (var attrib in this.buttonStyles) {
				this.buttonRect.setAttributeNS(null,attrib,this.buttonStyles[attrib]);
			}	
			this.buttonRect.setAttributeNS(null,"cursor","pointer");
			this.buttonRect.addEventListener("mousedown",this,false);
			this.buttonRect.addEventListener("mouseup",this,false);
			this.buttonRect.addEventListener("click",this,false);
			this.parentGroup.appendChild(this.buttonRect);
    		
			//call a helper method to create the text elements
			this.createButtonTexts();
			    		
			if (this.buttonSymbolId != undefined) {
				this.buttonSymbolInstance = document.createElementNS(svgNS,"use");
				this.buttonSymbolInstance.setAttributeNS(null,"x",(this.x + this.width / 2));
				this.buttonSymbolInstance.setAttributeNS(null,"y",(this.y + this.height / 2));
				this.buttonSymbolInstance.setAttributeNS(xlinkNS,"href","#"+this.buttonSymbolId);
				this.buttonSymbolInstance.setAttributeNS(null,"pointer-events","none");
				this.parentGroup.appendChild(this.buttonSymbolInstance);
			}
    		
			//create rectangle to deactivate the button
			if (this.buttonType == "rect") {
				this.deActivateRect = document.createElementNS(svgNS,"rect");
				this.deActivateRect.setAttributeNS(null,"x",this.x - this.shadowOffset);
				this.deActivateRect.setAttributeNS(null,"y",this.y - this.shadowOffset);
				this.deActivateRect.setAttributeNS(null,"width",this.width + this.shadowOffset * 2);
				this.deActivateRect.setAttributeNS(null,"height",this.height + this.shadowOffset * 2);
			}
			else if (this.buttonType == "ellipse") {
				this.deActivateRect = document.createElementNS(svgNS,"ellipse");
				this.deActivateRect.setAttributeNS(null,"cx",this.x + this.width * 0.5);
				this.deActivateRect.setAttributeNS(null,"cy",this.y + this.height * 0.5);
				this.deActivateRect.setAttributeNS(null,"rx",this.width * 0.5 + this.shadowOffset);
				this.deActivateRect.setAttributeNS(null,"ry",this.height * 0.5 + this.shadowOffset);
			}
    	
			this.deActivateRect.setAttributeNS(null,"fill","white");
			this.deActivateRect.setAttributeNS(null,"fill-opacity","0.5");
			this.deActivateRect.setAttributeNS(null,"stroke","none");
			this.deActivateRect.setAttributeNS(null,"display","none");
			this.deActivateRect.setAttributeNS(null,"cursor","default");
			if (this.buttonStyles["rx"]) {
				this.deActivateRect.setAttributeNS(null,"rx",this.buttonStyles["rx"]);
			}
			if (this.buttonStyles["ry"]) {
				this.deActivateRect.setAttributeNS(null,"ry",this.buttonStyles["ry"]);
			}
			this.parentGroup.appendChild(this.deActivateRect);
		}
		else {
			alert("could not create or reference 'parentNode' of button with id '"+this.id+"'");			
		}
}

//test if parent group exists
button.prototype.testParent = function() {
    //test if of type object
    var nodeValid = false;
    this.parentGroup = document.createElementNS(svgNS,"g");
    if (typeof(this.parentNode) == "object") {
    	if (this.parentNode.nodeName == "svg" || this.parentNode.nodeName == "g" || this.parentNode.nodeName == "svg:svg" || this.parentNode.nodeName == "svg:g") {
    		this.parentNode.appendChild(this.parentGroup);
    		nodeValid = true;
    	}
    }
    else if (typeof(this.parentNode) == "string") { 
    	//first test if button group exists
    	if (!document.getElementById(this.parentNode)) {
        	this.parentGroup.setAttributeNS(null,"id",this.parentNode);
        	document.documentElement.appendChild(this.parentGroup);
        	nodeValid = true;
   		}
   		else {
       		document.getElementById(this.parentNode).appendChild(this.parentGroup);
       		nodeValid = true;
   		}
   	}
   	return nodeValid;
}

//move button to a new position
button.prototype.moveTo = function(moveX,moveY) {
	this.x = moveX;
	this.y = moveY;
	//case rect
	if (this.buttonType == "rect") {
		this.upperLeftShadow.setAttributeNS(null,"x",this.x - this.shadowOffset);
		this.upperLeftShadow.setAttributeNS(null,"y",this.y - this.shadowOffset);
		this.lowerRightShadow.setAttributeNS(null,"x",this.x + this.shadowOffset);
		this.lowerRightShadow.setAttributeNS(null,"y",this.y + this.shadowOffset);
		this.buttonRect.setAttributeNS(null,"x",this.x);
		this.buttonRect.setAttributeNS(null,"y",this.y);
	}
	else if (this.buttonType == "ellipse") {
		this.upperLeftShadow.setAttributeNS(null,"cx",this.x + this.width * 0.5 - this.shadowOffset);
		this.upperLeftShadow.setAttributeNS(null,"cy",this.y + this.height * 0.5 - this.shadowOffset);
		this.lowerRightShadow.setAttributeNS(null,"cx",this.x + this.width * 0.5 + this.shadowOffset);
		this.lowerRightShadow.setAttributeNS(null,"cy",this.y + this.height * 0.5 + this.shadowOffset);
		this.buttonRect.setAttributeNS(null,"cx",this.x + this.width * 0.5);
		this.buttonRect.setAttributeNS(null,"cy",this.y + this.height * 0.5);
	}
	//reposition button text
	if (this.buttonText != undefined) {
		this.parentGroup.removeChild(this.buttonTextElement);
		this.createButtonTexts();
	}
}

//resize button to a new width and height
button.prototype.resize = function(newWidth,newHeight) {
	this.width = newWidth;
	this.height = newHeight;
	//case rect
	if (this.buttonType == "rect") {
		this.upperLeftShadow.setAttributeNS(null,"width",this.width);
		this.upperLeftShadow.setAttributeNS(null,"height",this.height);
		this.lowerRightShadow.setAttributeNS(null,"width",this.width);
		this.lowerRightShadow.setAttributeNS(null,"height",this.height);
		this.buttonRect.setAttributeNS(null,"width",this.width);
		this.buttonRect.setAttributeNS(null,"height",this.height);
	}
	else if (this.buttonType == "ellipse") {
		this.upperLeftShadow.setAttributeNS(null,"rx",this.width * 0.5);
		this.upperLeftShadow.setAttributeNS(null,"ry",this.height * 0.5);
		this.lowerRightShadow.setAttributeNS(null,"rx",this.width * 0.5);
		this.lowerRightShadow.setAttributeNS(null,"ry",this.height * 0.5);
		this.buttonRect.setAttributeNS(null,"rx",this.width * 0.5);
		this.buttonRect.setAttributeNS(null,"ry",this.height * 0.5);
	}
	if (this.buttonText != undefined) {
		this.parentGroup.removeChild(this.buttonTextElement);
		this.createButtonTexts();
	}
}

//remove all button elements
button.prototype.removeButton = function() {
	this.parentGroup.removeChild(this.upperLeftShadow);
	this.parentGroup.removeChild(this.lowerRightShadow);
	this.parentGroup.removeChild(this.buttonRect);
	if (this.buttonTextElement) {
		this.parentGroup.removeChild(this.buttonTextElement);
	}
	if (this.buttonSymbolInstance) {
		this.parentGroup.removeChild(this.buttonSymbolInstance);
	}
	this.parentGroup.removeChild(this.deActivateRect);
}

//hide button
button.prototype.hideButton = function() {
	this.parentGroup.setAttributeNS(null,"display","none");
}

//show button
button.prototype.showButton = function() {
	this.parentGroup.setAttributeNS(null,"display","inherit");
}

//event handling
button.prototype.handleEvent = function(evt) {
	if (evt.type == "mousedown") {
		this.togglePressed("pressed");
		document.documentElement.addEventListener("mouseup",this,false);
	}
	if (evt.type == "mouseup") {
		this.togglePressed("released");
		document.documentElement.removeEventListener("mouseup",this,false);
	}
	if (evt.type == "click") {
		//for some strange reasons I could not forward the evt object here ;-(, the code below using a literal is a workaround
		//attention: only some of the evt properties are forwarded here, you can add more, if you need them
		var timerEvt = {x:evt.clientX,y:evt.clientY,type:evt.type,detail:evt.detail,timeStamp:evt.timeStamp}
		this.timer.setTimeout("fireFunction",this.timerMs,timerEvt);
	}
}

button.prototype.togglePressed = function(type) {
	if (type == "pressed") {
		for (var attrib in this.shadeDarkStyles) {
			this.upperLeftShadow.setAttributeNS(null,attrib,this.shadeDarkStyles[attrib]);
		}
		for (var attrib in this.shadeLightStyles) {
			this.lowerRightShadow.setAttributeNS(null,attrib,this.shadeLightStyles[attrib]);
		}
	}
	if (type == "released") {
		for (var attrib in this.shadeDarkStyles) {
			this.lowerRightShadow.setAttributeNS(null,attrib,this.shadeDarkStyles[attrib]);
		}
		for (var attrib in this.shadeLightStyles) {
			this.upperLeftShadow.setAttributeNS(null,attrib,this.shadeLightStyles[attrib]);
		}
	}
}

button.prototype.fireFunction = function(evt) {
	if (typeof(this.functionToCall) == "function") {
		if (this.buttonTextElement) {
			this.functionToCall(this.id,evt,this.buttonText);
		}
		if (this.buttonSymbolInstance) {
			this.functionToCall(this.id,evt);
		}
	}
	if (typeof(this.functionToCall) == "object") {
		if (this.buttonTextElement) {
			this.functionToCall.buttonPressed(this.id,evt,this.buttonText);
		}
		if (this.buttonSymbolInstance) {
			this.functionToCall.buttonPressed(this.id,evt);
		}
	}
	if (typeof(this.functionToCall) == undefined) {
		return;
	}
}

button.prototype.getTextValue = function() {
	return this.buttonText;
}

button.prototype.setTextValue = function(value) {
	this.buttonText = value;
	//remove previous buttonTextElement
	if (this.buttonTextElement) {
		this.parentGroup.removeChild(this.buttonTextElement);		
	}
	this.createButtonTexts();
}

//this is a helper function to create the text elements, it is used from two different methods, .createButton() and .setTextValue()
button.prototype.createButtonTexts = function() {
	if (this.buttonText != undefined) {
		//first see if there is a multiline button
		var buttonTexts = String(this.buttonText).split("\n");
		
		//set a start y-offset
		var dy = this.textStyles["font-size"]*1.1;
		
		//if you don't like our method for y-positioning here, you can experiment with the formula here and define your own "initY" 
		var initY = (this.height - dy * buttonTexts.length) / 2 + this.textStyles["font-size"];
		
		//create text element
		this.buttonTextElement = document.createElementNS(svgNS,"text");
		this.buttonTextElement.setAttributeNS(null,"x",(this.x + this.width / 2));
		this.buttonTextElement.setAttributeNS(null,"y",(this.y + initY));			
		for (var attrib in this.textStyles) {
			value = this.textStyles[attrib];
			this.buttonTextElement.setAttributeNS(null,attrib,value);
		}
		this.buttonTextElement.setAttributeNS(null,"pointer-events","none");
		this.buttonTextElement.setAttributeNS(null,"text-anchor","middle");
		this.buttonTextElement.setAttributeNS("http://www.w3.org/XML/1998/namespace","space","preserve");
		for (var j=0;j<buttonTexts.length;j++) {
			var tspan = document.createElementNS(svgNS,"tspan");
			tspan.setAttributeNS(null,"x",(this.x + this.width / 2));
			if (j == 0) {
				tspan.setAttributeNS(null,"dy",0);
			}
			else {
				tspan.setAttributeNS(null,"dy",dy);
			}
			var textNode = document.createTextNode(buttonTexts[j]);
			tspan.appendChild(textNode);
			this.buttonTextElement.appendChild(tspan);
		}
		this.parentGroup.appendChild(this.buttonTextElement);
	}	
}

button.prototype.activate = function(value) {
	this.deActivateRect.setAttributeNS(null,"display","none");
	this.activated = true;
}

button.prototype.deactivate = function(value) {
	this.deActivateRect.setAttributeNS(null,"display","inherit");
	this.parentGroup.appendChild(this.deActivateRect);
	this.activated = false;
}

//switchbutton
//initialize inheritance
switchbutton.prototype = new button();
switchbutton.prototype.constructor = switchbutton;
switchbutton.superclass = button.prototype;

function switchbutton(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset) {
	var nrArguments = 15;
	if (arguments.length > 0) {
		if (arguments.length == nrArguments) {
			this.init(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset);
		}
		else {
			alert("Error in Switchbutton ("+id+"): wrong nr of arguments! You have to pass over "+nrArguments+" parameters.");		
		}		
	}
}

switchbutton.prototype.init = function(id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset) {
	switchbutton.superclass.init.call(this,id,parentNode,functionToCall,buttonType,buttonText,buttonSymbolId,x,y,width,height,textStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,shadowOffset);
	this.on = false;
}

//overwriting handleEventcode
switchbutton.prototype.handleEvent = function(evt) {
	//for some strange reasons I could not forward the evt object here ;-(, the code below using a literal is a workaround
	//attention: only some of the evt properties are forwarded here, you can add more, if you need them
	var timerEvt = {x:evt.clientX,y:evt.clientY,type:evt.type,detail:evt.detail,timeStamp:evt.timeStamp}
	if (evt.type == "click") {
		if (this.on) {
			this.on = false;
			this.togglePressed("released");
			this.timer.setTimeout("fireFunction",this.timerMs,timerEvt);
		}
		else {
			this.on = true;
			this.togglePressed("pressed");
			this.timer.setTimeout("fireFunction",this.timerMs,timerEvt);
		}
	}
}

switchbutton.prototype.getSwitchValue = function() {
	return this.on;
}

switchbutton.prototype.setSwitchValue = function(onOrOff,firefunction) {
	this.on = onOrOff;
	//artificial timer event - don't use the values!
	var timerEvt = {x:0,y:0,type:"click",detail:1,timeStamp:0}
	if (this.on) {
		this.togglePressed("pressed");
		if (firefunction) {
			this.timer.setTimeout("fireFunction",this.timerMs,timerEvt);
		}
	}
	else {
		this.togglePressed("released");
		if (firefunction) {
			this.timer.setTimeout("fireFunction",this.timerMs,timerEvt);
		}
	}
}

//overwriting fireFunction code
switchbutton.prototype.fireFunction = function(evt) {
	if (typeof(this.functionToCall) == "function") {
		if (this.buttonTextElement) {
			this.functionToCall(this.id,evt,this.on,this.buttonText);
		}
		if (this.buttonSymbolInstance) {
			this.functionToCall(this.id,evt,this.on);
		}
	}
	if (typeof(this.functionToCall) == "object") {
		if (this.buttonTextElement) {
			this.functionToCall.buttonPressed(this.id,evt,this.on,this.buttonText);
		}
		if (this.buttonSymbolInstance) {
			this.functionToCall.buttonPressed(this.id,evt,this.on);
		}
	}
	if (typeof(this.functionToCall) == undefined) {
		return;
	}
}
