/*
  Javascript utilities
  Mark Willis
*/

function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++)
	{
		var element = arguments[i];
		if (typeof element == 'string')
		{
			element = document.getElementById(element);
		}
		if (arguments.length == 1) return element;
		elements.push(element);
	}
	return elements;
}

var mawUtility={

    // debug functions
	//==============================
    showAllProperties:function (object)
    {
      var msg=""
      for ( var i in object )
      {
        msg=msg+i+":"+object[i]+"\t"
      }
      alert(msg)
    },

    showProperties:function (object)
    {
        if ( (typeof object)=="object" )
        {
            var msg="";
            for ( var i in object )
            {
                if ( object[i] && (i!="outerHTML") && (i!="innerHTML") && (i!="innerText") && (i!="outerText") && ((typeof object[i])!="function") )
                {
                    msg=msg+i+":"+object[i]+"\t";
                }
            }
            alert(msg);
        } else {
            alert(object);
        }
    },

    //==============================
    // Removes leading whitespaces
    LTrim:function ( value ) {
	    var re = /\s*((\S+\s*)*)/;
	    return value.replace(re, "$1");
    },

    //==============================
    // Removes ending whitespaces
    RTrim:function ( value ) {
	    var re = /((\s*\S+)*)\s*/;
	    return value.replace(re, "$1");
    },

    //==============================
    // Removes leading and ending whitespaces
    trim: function ( value ) {
	    return sashUtility.LTrim(sashUtility.RTrim(value));
    },

    //==============================
    // A general function to associate an object instance with an event handler.
    associateObjWithEvent: function(obj, methodName) {
        // Return inner function to act as an event handler for a DOM element:-
        return (function(e){
            e = e||window.event;
            return obj[methodName](e, this);
        });
    },

    //==============================
    addEvent:function (obj, evType, fn, useCapture){
        if (obj.addEventListener) {
            obj.addEventListener(evType, fn, useCapture);
            return true;
        } else if (obj.attachEvent) {
            var r = obj.attachEvent("on"+evType, fn);
            return r;
        } else {
            alert("Handler could not be attached");
        }
    },
 
    //==============================
    removeEvent:function (obj, evType, fn, useCapture) {
        if (obj.removeEventListener) {
            obj.removeEventListener(evType, fn, useCapture);
            return true;
        } else if (obj.detachEvent) {
            var r = obj.detachEvent("on"+evType, fn);
            return r;
        } else {
            alert("Handler could not be removed");
        }
    },

    //==============================
    getEventTarget:function (evt)
    {
        if (!evt) evt = window.event;

        var targ;
        if (evt.target)
        {
            targ = evt.target;
        } else {
            if ( evt.srcElement )
            {
                targ = evt.srcElement;
            }
        }
        if (targ.nodeType == 3) // defeat Safari bug
        {
            targ = targ.parentNode;
        }
        return targ;
    },
    
    //==============================
    getObjectPosition:function ( obj )
    {
	    var curleft = curtop = 0;
	    if (obj.offsetParent)
	    {
		    curleft = obj.offsetLeft
		    curtop = obj.offsetTop
		    while (obj = obj.offsetParent)
		    {
			    curleft += obj.offsetLeft
			    curtop += obj.offsetTop
		    }
	    }
	    return [curleft,curtop];
    },

    //==============================
    getParent: function( element )
    {
        var p = null;
        var obj = $(element);
		if ( ! obj ) return p;
		p = obj.parentNode;
		if ( p ) return p;
		return obj.parentElement;        
    },
    
    //==============================
    getParentByType: function (element, pTagName)
    {
	    if (element == null)
	    {
	        return null;
	    } else {
	        if (element.nodeType == 1 && element.tagName.toLowerCase() == pTagName.toLowerCase())
	        {
	        	// Gecko bug, supposed to be uppercase
		        return element;
    	    } else {
	    	    return sashUtility.getParentByType( sashUtility.getParent( element ), pTagName);
	    	}
	    }
    },

    //==============================
    getBrowserMouseCoord: function (e) {
        if( !e ) {
            if( window.event ) {
                //DOM
                e = window.event;
            } else {
                //TOTAL FAILURE, WE HAVE NO WAY OF REFERENCING THE EVENT
                return [0,0];
            }
        }
        if( typeof( e.pageX ) == 'number' )
        {
            //NS 4, NS 6+, Mozilla 0.9+
            xcoord = e.pageX;
            ycoord = e.pageY;
        } else {
            if( typeof( e.clientX ) == 'number' )
            {
                //IE, Opera, NS 6+, Mozilla 0.9+
                //except that NS 6+ and Mozilla 0.9+ did pageX ...
                xcoord = e.clientX;
                ycoord = e.clientY;
                if( !( ( window.navigator.userAgent.indexOf( 'Opera' ) + 1 ) ||
                    ( window.ScriptEngine && ScriptEngine().indexOf( 'InScript' ) + 1 ) ||
                    window.navigator.vendor == 'KDE' ) )
                {
                    if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
                    {
                        //IE 4, 5 & 6 (in non-standards compliant mode)
                        xcoord += document.body.scrollLeft;
                        ycoord += document.body.scrollTop;
                    } else if( document.documentElement &&
                      ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
                      {
                          //IE 6 (in standards compliant mode)
                          xcoord += document.documentElement.scrollLeft;
                          ycoord += document.documentElement.scrollTop;
                    }
                }
            } else {
              //TOTAL FAILURE, WE HAVE NO WAY OF OBTAINING THE
              //MOUSE COORDINATES
              return [0,0];
            }
        }
        return [xcoord,ycoord]
    }

    
}




