function BaseJS(pWin)
{
	Array.prototype.unique=function(){
    var r=new Array();
    o:for(var i=0,n=this.length;i<n;i++)
    {
        for(var x=0,y=r.length;x<y;x++)if(r[x]==this[i])continue o;
        r[r.length]=this[i];
    }
    return r;
}
	var t = this;
	t.isUnReg=false;
	t.evtLsnr=[];
	var toString = Object.prototype.toString;
	t.win = ((pWin == null) ? window : pWin);
	//		0		     1		2		3		4		   5		    6		   7		  8
	sa = ["position", "top", "left", "width", "height", "zIndex", "visibility", "display", "outline"];
	//       0      1		2	   3		  4		  5			6		 7			8		   9			10		11			12
	ea = ['type', 'name', 'id', 'class', 'value', 'style', 'readonly', 'onClick', 'onKeyUp', 'onchange', 'size', 'selected', 'tabindex'];
	/**
	 Browser type
	 **/
	var browserType = {
		IE: (t.win.document.all && t.win.document.getElementById && !t.win.opera),
		FF: (!t.win.document.all && t.win.document.getElementById && !t.win.opera),
		OP: (t.win.document.all && t.win.document.getElementById && t.win.opera)
	};
	t.isIE = (function()
	{
		return browserType['IE'];
	})();
	t.isFF = (function()
	{
		return browserType['FF'];
	})();
	t.isOP = (function()
	{
		return browserType['OP'];
	})();
	/** Creates the Element html
	 param1 type of element eg input,select...
	 param2 attributes to be given eg class,value id
	 param3 generate end tag value true or false
	 param4 element innerText
	 **/
	t.createElHt = function(pTyp, pAtr, pEnd, pVal)
	{
		var em = "<" + pTyp;
		for (var i in pAtr) 
			em += " " + (ea[i] ? ea[i] : i) + "='" + pAtr[i] + "'";
		em += ">";
		if (pVal != null) em += pVal;
		if (pEnd) em += "</" + pTyp + ">";
		return em;
	};
	/** Creates the Element 
	 param1 type of element eg input,select...
	 param2 attributes to be given eg class,value id
	 **/
	t.createEl = function(pEm, pAtt)
	{
		var elm = t.win.document.createElement(pEm);
		for (var i in pAtt) 
			elm[i] = pAtt[i];
		return elm;
	};
	/** Sets style for element
	 param1 Element
	 param2 attributes
	 **/
	t.setStyle = function(pEl, pVal)
	{
		for (var i in pVal) {
			pEl.style[(sa[i] ? sa[i] : i)] = pVal[i];
		}
	};
	/** finds the position respective to element
	 param1 element
	 **/
	t.findPos = function(oel)
	{
		if (oel.offsetParent != null) {
			var el = oel;
			for (var px = 0, py = 0; oel; oel = oel.offsetParent) {
				px += oel.offsetLeft;
				py += oel.offsetTop;
				if (t.win != null && oel != el && oel != t.win.document.body && oel != t.win.document.documentElement) {
					px -= oel.scrollLeft;
					py -= oel.scrollTop;
				}
			}
			return [px, py];
		}
		else {
			return [oel.x, oel.y];
		}
	};
	/**
	 * finds the position of mouse cursor
	 * @param {Object} event
	 */
	t.findMPos=function(e){
    var px = 0;
    var py = 0;
    if (!e) var e = t.win.event;
    if (e.pageX || e.pageY){
        px = e.pageX;
        py = e.pageY;
    }
    else if (e.clientX || e.clientY){
        px = e.clientX + t.win.document.body.scrollLeft
            + t.win.document.documentElement.scrollLeft;
        py = e.clientY + t.win.document.body.scrollTop
            + t.win.document.documentElement.scrollTop;
    }
    // px and py contain the mouse position relative to the document
  return[px,py];
}

t.getDocHeight=function(pWin) {
        if(pWin==null)pWin=t.win;
		/*var body = pWin.document.body;
        var innerHeight = ((pWin.self.innerHeight!=null)&&!isNaN(pWin.self.innerHeight))?pWin.self.innerHeight:0;
        if (pWin.document.documentElement && (!pWin.document.compatMode || pWin.document.compatMode=="CSS1Compat")) {
            var topMargin = parseInt(body.style['marginTop'],10) || 0;
            var bottomMargin = parseInt(body.style['marginBottom'], 10) || 0;
            return Math.max(body.offsetHeight + topMargin + bottomMargin, pWin.document.documentElement.clientHeight, pWin.document.documentElement.scrollHeight, t.zero(pWin.self.innerHeight));
        }*/
		return (pWin.document.all?pWin.document.body.offsetHeight:pWin.innerHeight)
        //return Math.max(body.scrollHeight, body.clientHeight, t.zero(pWin.self.innerHeight));
    };
t.getDocWidth=function(pWin) {
        if(pWin==null)pWin=t.win;
        return (pWin.document.all?pWin.document.body.offsetWidth:pWin.innerWidth)
    };
	/** get Elemet function
	 param1 ElementId
	 **/
	t.getEl = function(pElId, pWin)
	{
		if (!pWin) pWin = t.win;
		return pWin.document.getElementById(pElId);
	};
	/** get Type
	 param1 argument
	 **/
	t.getType = function(pEl)
	{
		return (typeof pEl);
	}
	/** Function To Write HTML
	 param1 window to be written
	 param2 data to be written
	 **/
	t.writeWin = function(pWin, pHTML)
	{
		var doc = pWin.document;
		doc.open();
		doc.writeln(pHTML);
		doc.close();
	};
	t.unRegListener=function()	
	{
		//alert("Hello World");
		var lEvUl=[];
		while(t.evtLsnr.length > 0)
		{
			try {
				var lOb = t.evtLsnr.pop();
				if (lOb.ev == 'unload') 
					lEvUl.push(lOb);
				else {
					if (lOb != null) lOb.unReg();
				}
			}catch(e){}
		}
		while (lEvUl.length > 0) {
			try {
				(lEvUl.pop()).unReg();
			}catch(e){}
		}
		//t.win.alert(lEvUl.length)
	}
	//Event Listener code starts here
	t.regListeners = function(cnf)
	{
		if (cnf == null) 			
			return;
		for (var i = 0; i < cnf.length; i++) {
	       var arr=cnf[i];
		   try
		   {
		   	 t.regListener(arr[0],arr[1],arr[2]);
		   }catch(e){}
		}
	}
	t.regCommon=function()
	{
		
        if (!t.isUnReg) {
            t.isUnReg=true;
        try {
	           if(!t.isIE)
			    t.regListener(t.win, 'unload', t.unRegListener);
	            t.regListener(t.win, 'help', function(ev){ev.stop();return false;});
	            t.regListener(t.win.document, 'help', function(ev){ev.stop();return false;});
            }catch(e){}
        }
	}
	t.regListener = function(pEl, pEv, pHr)
	{
		pEl = (t.getType(pEl) == 'string' ? t.getEl(pEl) : pEl);
		var evs=new regEvListener(pEl, pEv, pHr, t, arguments);
		evs.reg();
		t.evtLsnr.push(evs);
	};
	t.stop = function(pEv)
	{
		t.stDef(pEv);
		t.stBub(pEv);
	};
	t.stBub = function(pEv)
	{
		pEv.stopPropagation ? pEv.stopPropagation() : pEv.cancelBubble = true;
	};
	t.stDef = function(pEv)
	{
		pEv.preventDefault ? pEv.preventDefault() : pEv.returnValue = false;
	};
	t.scEm = function(pEv)
	{
		var em = pEv.target ? pEv.target : pEv.srcElement;
		if (em.nodeType == 3) em = em.parentNode;
		return em;
	};
	/** private class to handle the event
	 param1 Element to be registered listener with
	 param2 event type
	 param3 callback function
	 param4 base class instance
	 param5 arguments
	 **/
	function regEvListener(pElement, pEvent, pHandler, pBase, pArgs)
	{
		var t = this;
		t.event;
		t.eventHandler = pHandler;
		t.elm = pElement;
		t.ev = pEvent;
		t.prnt = pBase;
		t.args = pArgs;
		t.evId=null;
		t.reg = function()
		{
			if (t.elm.addEventListener) 
				t.elm.addEventListener(t.ev, t.handleEvent, true);
			else 
				t.elm.attachEvent("on" + t.ev, t.handleEvent);
		};
		t.unReg = function()
		{
			if (t.elm.removeEventListener) 
                t.elm.removeEventListener(t.ev, t.handleEvent, true);
            else 
                t.elm.detachEvent("on" + t.ev, t.handleEvent);
		};
		t.handleEvent = function(pEv)
		{
			var lRet = true;
			if (pEv == null) pEv = t.prnt.win.event;
			pEv['stop'] = function()
			{
				return t.prnt.stop(pEv);
			};
			pEv['stopBubble'] = function()
			{
				return t.prnt.stBub(pEv);
			};
			pEv['stopDefault'] = function()
			{
				return t.prnt.stDef(pEv);
			};
			pEv['srcEm'] = function()
			{
				return t.prnt.scEm(pEv);
			};
			if (t.eventHandler) {
				//t.eventHandler(pEv);
				var lRv;
				if(t.prnt.isIE){
					var lAr = t.prnt.argStr(t.args, "t.args", 3);
					var lEv = "t.eventHandler(pEv" + (lAr ? "," + lAr : "") + ")";
					lRv = eval(lEv);
				}
				else
				{
					var lArg=[];
					if(t.args.length>3)lArg=t.args.slice(3);
					lArg.splice(0,0,pEv);
					lRv = t.eventHandler.apply(t,lArg);
				}
					lRet = (lRv != nv) ? lRv : lRet;
			}
			//return lRet;
		};
		function argStr()
		{
			var lRet = null;
			if (t.args) {
				for (var i = 3; i < t.args.length; i++) 
					if (lRet == null) 
						lRet = "t.args[" + i + "]";
					else 
						lRet += ",t.args[" + i + "]";
			}
			return lRet;
		}
	}
	t.argStr = function(pArgs, pArrName, pOff)
	{
		var offset = 0;
		offset = ((pOff == null) ? 0 : parseInt(pOff, 10));
		offset = ((isNaN(offset)) ? 0 : offset);
		var lRet = null;
		if (pArgs) {
			for (var i = offset; i < pArgs.length; i++) 
				if (lRet == null) 
					lRet = pArrName + "[" + i + "]";
				else 
					lRet += "," + pArrName + "[" + i + "]";
		}
		return lRet;
	}
	t.argValStr = function(pArgs, pOff)
	{
		var offset = 0;
		offset = ((pOff == null) ? 0 : parseInt(pOff, 10));
		offset = ((isNaN(offset)) ? 0 : offset);
		var lRet = null;
		if (pArgs) {
			for (var i = offset; i < pArgs.length; i++) 
				if (lRet == null) 
					lRet = "'" + pArgs[i] + "'";
				else 
					lRet += ",'" + pArgs[i] + "'";
		}
		return lRet;
	}
	//Event Listener code ends
	//Utility Functions 
	
	t.hasValue=function(pVal)
	{
		var lRet=true;
		if(typeof pVal == 'string')lRet=(pVal!=null&&t.trim(pVal)!="");
		else if(t.isArray(pVal))lRet=(pVal.length>0);
		//else if(t.isFunction(pVal));
		//else if(typeof pVal == 'object');
		else lRet=(pVal!=null);
		return lRet;
	}
	t.compare=function(pStr1,pStr2,pFlg)
    {
    	if (pStr1 == null || pStr2 == null) 		
    		return false;
		if (pFlg) {
			pStr1 = pStr1.toLowerCase();
			pStr2 = pStr2.toLowerCase();
		}
    	return (pStr1 == pStr2);
    }
	/** Function to remove leading and tailing spaces
     param1 String to be trimmed
     **/
	t.trim = function(pInp)
	{
		return pInp.replace(/^\s+|\s+$/g, "");
	};
	t.preFxZ = function(pInp)
	{
		return (parseInt(pInp, 10) > 9 ? pInp : "0" + pInp);
	};
	t.zero=function (n) {
        return (n==null || isNaN(n))?0:n;
        };
	t.isFunction= function( obj ) {
		return toString.call(obj) === "[object Function]";
	};

	t.isArray= function( obj ) {
		return toString.call(obj) === "[object Array]";
	};
	t.getParams = function(pWin)
	{
		if (pWin == null) pWin = t.win;
		var url = pWin.location.toString();
		url.match(/\?(.+)$/);
		var params = RegExp.$1;
		var params = params.split("&");
		var pms = {};		
		for(var i=0;i<params.length;i++)
		{
		    var tmp = params[i].split("=");
		    pms[tmp[0]] = unescape(tmp[1]);
	    }
		return pms;
	}
	t.getUnique=function(pArr)
	{
		return pArr.unique();
	}
	t.regCommon();
	//base class end
}

