/** Event Abstractor
  *
  * Event Abstractor uzima event argument neke funkcije i vraca jedinstveni object bez obzira na
  * vrstu browsera
  * @params e - event argument
  */

/*
PRIMJER KODA

elem.onclick=function(e)
	{
	   var event=new EventAbstractor(e);
	}

*/

/** Constructor
  *
  * Prima event kao arugment te otkriva koja je vrsta browsera
  * @params e - event argument
  */

function EventAbstractor(e)
	{
		//Odredi vrstu
		this.__vrsta=(e)?'dom':'ie';

		//Privatni atribut koji ce sadrzavati event object
		this.__event=e || window.event;

		//Preuzmi coordinate na klijentu
		this.X=this.__event.clientX;
 		this.Y=this.__event.clientY;


	}


EventAbstractor.prototype=
{
	/** Method: getType
 	  *
 	  * @returns : string type of event
 	  */
	getType : function () {return this.__event.type;},

	/** Method: getKeyCode
  	  *
      * @returns the key code pressed
      * @returns integer key code
      */
    getKeyCode : function ()
    	{
    		//Pregledaj koja je vrsta browsera
    		switch(this.__vrsta)
    			{
    				case 'ie': return this.__event.keyCode; break;
    				case 'dom': return this.__event.charCode; break;
    			}



    	},

     /** Method: keyPress
  	   *
       * @params: string keyType - tip tipke koji je pristisnut 'shif','alt' ili 'ctrl'
       * @returns: bool
       */
    keyPress : function (keyType)
 	{
 		//Vrati naziv tipke smanjen
 		keyType=keyType.toLowerCase();

 		//Pregledaj koja vrsta tipke se trazi
 		switch(keyType)
 			{
 				case 'shift': return this.__event.shiftKey; break;
 				case 'alt' : return this.__event.altKey; break;
 				case 'ctrl': return this.__event.ctrlKey; break;
 				default:
 					//Baci exception
 					throw new EventAbstractorException('Metoda keyPress prima jedan od tri arugmenta: shift, ctrl ili alt. Argument '+ keyType +' nije jedan od njih.');
 					break;
 			}

 	},
	/** Method: getTarget
	  *
	  * @returns object target of the event
	  */
 	getTarget: function()
 		{
 			switch(this.__vrsta)
        		{
        			case 'dom': return this.__event.target;break;
        			case 'ie': return this.__event.srcElement;break;
        		}
 		},

 	/** Method: preventDefault
 	  *
 	  * Prevents the default action of the object
 	  */
 	preventDefault: function()
 		{
			switch(this.__vrsta)
        		{
        			case 'dom': this.__event.preventDefault();break;
        			case 'ie': this.__event.returnValue=false;break;
        		}
 		},
 	/** Method: stopBubble
 	  *
 	  * Sprecava skakanje eventa na druge elemente koji se nalaze iznad ciljanog elementa u roditeljskoj hijerarhiji
 	  */
 	 stopBubble: function()
 	 	{
 	 		switch(this.__vrsta)
        		{
        			case 'dom': this.__event.stopPropagation();break;
        			case 'ie': this.__event.cancelBubble=true;break;
        		}

 	 	},

 	/** Method: getButton
 	  *
 	  * @returns int button code - kod pritusnutog dugma
 	  */
 	 getButton: function(){ return this.__event.button; }


};


/** Greska
  *
  * Vraca execption objekt
  * @params string poruka - poruka greske
  * @returns string exception objekt
  *
  */

function EventAbstractorException(poruka)
	{
		this.poruka=poruka;
	}



