/**
*	jquery.EDOM.js : Custom extension to jQuery-1.3.2.js
*	@author elydelacruz_112@yahoo.com
* 	@since 2008-12-25
* 	@lastupdated 2010-10-06
*/
$.edom =
{
	addLoadListener : function( handler, phase )
	{
		if( window.addEventListener ){ window.addEventListener( 'load', handler, phase ); }
		else if( document.addEventListener ){ document.addEventListener( 'load', handler, phase ); }
		else if( window.attachEvent ){ window.attachEvent( 'onload', handler ); }
	},
	/**
	* removeLoadListener( handler:Function, phase:Boolean ):Void;
	* note : parameters used must be the same as the ones passed to the
        * addLoadListener() you want to remove.
	*/
	removeLoadListener : function( handler, phase )
	{
		if( window.removeEventListener ){ window.removeEventListener( 'load', handler, phase ); }
		else if( document.removeEventListener ){ document.removeEventListener ( 'load', handler, phase ); }
		else if( window.detachEvent ){ window.detachEvent( 'onload', handler ); }
	},
	/**
         * Returns the event object regardless of browser type
	 * function resolveEvent( e:Event ):Event
	 */
	resolveEvent : function( e )
	{
		return ( e ) ? e : ( ( window.event ) ? event : null );
	},
	/**
 	* function getEventTarget( e: Event ): Element
 	* @param Event e
 	* @return Element
 	* @description :
 	* 	Returns the target element of an event
 	*/
	getEventTarget : function( e )
	{
		e = $.EDOM.resolveEvent( e );
		var o = e.target ? e.target : e.srcElement;
		if( o && ( o.nodeType == 3 || o.nodeType == 4 ) ){ o = o.parentNode; }
		return o;
	},
	/**
	* getSwf( FlashSWFObject( name || id )_string ):SWFObject;
	*   note : got the idea for this one from the Flash CS3 documentation for the ExternalInterface API.
	*/
	getSwf : function( movieName )
	{
		if ( navigator.appName.indexOf( "Microsoft" ) != -1 ){ return window[ movieName ]; }
		else { return document[ movieName ]; }
	},

        /**
	* createImage( imgSrc_string ):Image || String ?? functions like its returning an image but...
	* note : This one is weird.  It is actually returning a string but notice it creates and loads the image first before returning the string.
	* I'm a bit confused on how this one works though but have a rough idea( ported it over from dreamweaver mxs auto generated js code ).
	*/
	createImage : function( img ){ if ( document.images ) { var rslt = new Image(); rslt.src = img; rslt = img; return rslt; } },

	/**
	* function addLoadListener( handler:Function, phase:Boolean ):Void
	*/
	createWin : function( src, name, params ){ var w = window.open( src, name, params ); w.focus(); return w; },
        
 	/**
 	 * function matchColumnHeights( args: Array, boolToNum: Boolean, num: Number ): void
 	 */
	matchColumnHeights : function( args, boolToNum, num )
	{
            var highest, i;
            if( !boolToNum )
            {
                highest = 0;
                for( i = 0; i < args.length; i++ ){
                    args[i] = $( args[i] );
                }
                for( i = 0; i < args.length; i++ ){
                    if( args[i].height() > highest ){
                        highest = args[i].height();
                    }
                }
                for( i = 0; i < args.length; i++ ){
                    args[i].animate({ height: highest }, 'slow' );
                }
            }
            else
            {
                highest = num;
                for( i = 0; i < args.length; i++ ){
                    args[i] = $( args[i] );
                }
                for( i = 0; i < args.length; i++ ){
                    args[i].animate({ height: highest }, 'slow' );
                }
            }
	},

    /**
     * Takes the window.location.search results and outputs the params
     * in an object literal or array literal format
     */
    locationSearchToLiteral: function(toArray)
    {
        var s = window.location.search, i = null,
        output = null, item = null, key = null, value = null;
        if(s){
            output = toArray ? [] : {};
            s = s.slice(1, s.length);
			if( s.indexOf('&') && s.lastIndexOf('&') != (s.length - 1) ){
				s = s.split('&');
                for( i = 0; i < s.length; i += 1 ){
                    item = s[i].split('=');
                    key = item[0]; value = item[1];
                    output[key] = value;
                }
            }
            else {
                output[s.split('=')[0]] = s.split('=')[1];
            }
        }
        else {
            output = false;
        }
        return output;
    },
	
	extendObject: function(extendObj, withObj)
	{
			for ( var i in withObj )
			{
				try{
					if( extendObj.hasOwnProperty( i ) 
						&& typeof extendObj[ i ] == 'object' ) {
						
						extendObj[i] = $.edom.extendObject(
							extendObj[i], withObj[i]
						);
						
					}
					else {
						extendObj[ i ] = withObj[ i ];
					}
				}
				catch ( e ) {
					extendObj[i] = withObj[i];
				}
			}
			return extendObj;
	},

    /**
     * Returns a string that can be used for an html id attribute value
     * @param str String
     * @return String
     */
    getValidId: function (str)
    {
        str = str.replace(/[^a-z\-\_\.\:]+/gim, '_');
        return str;
    },

    /**
     * Concatenates the values of a variable into an easily readable string
     * by Matt Hackett [scriptnode.com]
     * @param {Object} x The variable to debug
     * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
     * @param {String} sep The separator to use between [default: a single space ' ']
     * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use
     */
    var_dump: function(x, max, sep, l)
    {
        l = l || 0;
        max = max || 10;
        sep = sep || ' ';

        if (l > max) {
            return "[WARNING: Too much recursion]\n";
        }

        var
        i,
        r = '',
        t = typeof x,
        tab = '';

        if (x === null) {
            r += "(null)\n";
        }
        else if (t == 'object') {
            l++;

            for (i = 0; i < l; i++) {
                tab += sep;
            }

            if (x && x.length) {
                t = 'array';
            }

            r += '(' + t + ") :\n";

            for (i in x) {
                try {
                    r += tab + '[' + i + '] : ' +
                        $.edom.var_dump(x[i], max, sep, (l + 1));
                } catch(e) {
                    return "[ERROR: " + e + "]\n";
                }
            }
        }
        else {
            if (t == 'string') {
                if (x == '') {
                        x = '(empty)';
                }
            }
            r += '(' + t + ') ' + x + "\n";
        }
        return r;
    }
}
