/* ============================================================= *//*
 * File     : utils.js
 * Created  : 2008/07/08 [Y/M/D]
 * Author   : Michael Kerr (mkerr@aa.co.nz) 
 * Purpose  : To create a better way to manage events
 * History 
 * 		Date         	Version        	Description 
 * 		2008-07-08		1.0				First version
*//* ============================================================= */

var Utils = 
{
	isIE: false,

	$: function(A, C)
	{
		A = (typeof A != 'string') ? A : document.getElementById(A);
		if (C)
		{
			var node = A.parentNode;
			while (node.nodeName != C && node.nodeName != 'BODY') { node = node.parentNode; }
			return node;
		}
		else
			return A;
	},

	// Get the child element of C based on an id that matches A
	$c: function(A, C) 
	{
		if (typeof A != 'string') return A;
		if (C)
		{
			var node = C;
			while (node.id != A && node)
			{
				for (n in node.childNodes)
					if (node.childNodes[n].id == A) return node.childNodes[n];
				node = node.childNode || false;
			}
		}
		return document.getElementById(A);
	},

	$v: function(A)
	{
		return Utils.$(A).value;
	},

	$s: function(A)
	{
		return Utils.$(A).style;
	},

	$p: function(P, A)
	{
		P = (typeof P != 'string') ? P : Utils.$(P);
		return P.getElementsByTagName(A);
	},

	$$: function(A, B)
	{
		d = document;
		if (B)
		{
			d = Utils.$(B);
		}
		var elementArray = [];
		if (document.all)
			elementArray = d.all;
		else
			elementArray = d.getElementsByTagName("*");

		var matchedArray = [];
		var pattern = new RegExp("(^| )" + A + "( |$)");

		for (var i = 0; i < elementArray.length; i++)
		{
			if (pattern.test(elementArray[i].className))
				{ matchedArray[matchedArray.length] = elementArray[i]; }
		}
		return matchedArray;
	},
	
	$pc: function(A, B) // Get the parentNode with a matching class. (A - starting element, B - class)
	{
		A = Utils.$(A); // Just in case A is an id rather then the element itself

		var node = A.parentNode;
		while (!Utils.hasClass(node, B) && node.nodeName != 'BODY') { node = node.parentNode; }
		return node;
	},
	
	/*$$a: function(A, B)
	{
		B = typeof B == undefined ? null : '';

		tmp = A.split('.');
		for (i = 0; i < tmp.length; i++)
		{
			console.log(tmp[i]);
			//tmp_a = Utils.$$(tmp[i], B);
			
		}
		//Utils.$$()
	},*/

	addClass: function(E, A)
	{
		if (!Utils.hasClass(E, A))
		{
			E.className += ' ' + A;
		}
	},
  
	hasClass: function(E, A)
	{
		var pattern = new RegExp("(?:^|\\s)" + A + "(?:\\s|$)");
		if (pattern.test(E.className)) 
			{ return true; }
		return false;
	},
	
	hasPartialClass: function(E, A)
	{
		var pattern = new RegExp("(.*)" + A + "(.*)");
		if (pattern.test(E.className))
			{ return true; }
		return false;	
	},

	removeClass: function(E, A)
	{
		if (Utils.hasClass(E, A))
		{
			E.className = E.className.replace(new RegExp("(^|\\s)" + A + "(?:\\s|$)"), "$1");
			E.className = E.className.replace(new RegExp("(\\s$)"), "");
		}
		return E;
	},
	
	appendClass: function(E, A)
	{
		if (!Utils.hasPartialClass(E, A)) E.className += A;
		return E;
	},
	
	removePartialClass: function(E, A)
	{
		E.className = E.className.replace(new RegExp("(.*)" + A + "(.*)"), "$1$2");
		return E;
	},

	popup: function(A, B, C)
	{
		var X = (screen.width / 2) - (B / 2);
		var Y = (screen.height / 2) - (C / 2);
		
		var popupWindow = open(A, "newPopUp", "resizable=yes, status=1, scrollbars=yes, width=" + B + ", height=" + C + ", left=" + X + ", top=" + Y);	
	},

	inArray: function(A, B)
	{
		var len = A.length || 0;
		for (var x = 0; x <= len; x++)
			if (typeof A[x] != 'undefined' && A[x] != null && A[x] == B) return true;
		return false;
	},

	floatElementLeft: function(E, margin)
	{
		//var margin = margin;

		var pn = E.parentNode;
		var _w = pn.offsetWidth;
		var _y = pn._floating_y || 0;

		var i = pn._rowIndex || 0;
		var _row = pn._row || new Array();
		if (!_row[i]) _row[i] = new Array();

		var _mH = pn._mH || new Array();
		if (!_mH[i]) _mH[i] = new Array();

		_x = 0;
		for (var j = 0; j < _row[i].length; j++)
		{
			_x += _row[i][j].offsetWidth;
			_mH[i] = (_mH[i] < _row[i][j].offsetHeight) ? _row[i][j].offsetHeight : _mH[i];
		}
		_x += (margin * _row[i].length);
		_mH[i] = (_mH[i] < E.offsetHeight) ? E.offsetHeight : _mH[i];

	    if ((_x + E.offsetWidth) > _w)
	    {
			_y += _mH[i]; _x = 0; i += 1;
			if (!_row[i]) _row[i] = new Array();
			if (!_mH[i]) _mH[i] = new Array();
			_y += margin;
	    }

	    E.style.left = _x + 'px';
	    E.style.top = _y + 'px';

	    E.pos = {'x': 0, 'y': 0};
	    E.pos.x = _x;
	    E.pos.y = _y;

	    _row[i][_row[i].length] = E;
	    _mH[i] = _mH[i] || E.offsetHeight;

	    pn._rowIndex = i;
	    pn._floating_y = _y;
	    
	    pn.style.height = (_y + E.offsetHeight) + 'px';

	    if (!pn._fElements) pn._fElements = 0;
	    pn._fElements += 1;

	    pn._mH = _mH;
	    pn._row = _row;  
	},

	updateTXT: function(U, A, B)
	{
		return Utils.$(U).value.replace(new RegExp("(.*)("+A+")(.*)"), "$1" + B + "$3");
	},

	appendTXT: function(U, A)
	{
		if (!Utils.containsTXT(U, A)) Utils.$(U).value += A;
		return Utils.$(U).value;
	},

	containsTXT: function(U, A)
	{
		var pattern = new RegExp("(?:^|.*)" + A + "(.*|$)");
		return pattern.test(Utils.$(U).value);
	},

	removeTXT: function(U, A)
	{
		Utils.$(U).value = Utils.$(U).value.replace(new RegExp("(^|.*)("+A+")(.*|$)"), "$1" + '' + "$3");
		return Utils.$(U).value;
	},
	
	MAX: function(A, B)
	{
		A = parseFloat(A); B = parseFloat(B);
		return (A > B) ? A : B;
	}/*,
	
	trim: function(A)
	{
		while (/^\s/.test(A) === true)
			
	}*/
};

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

Utils.isIE = (navigator.appName == "Microsoft Internet Explorer");

function urlencode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
                                     
    var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}

function urldecode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    var histogram = {}, histogram_r = {}, code = 0, str_tmp = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urlencode.
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing   
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);
 
    return ret;
}

/* 

SOURCED FROM: http://bytes.com/forum/thread149165.html 

kaeli July 23rd, 2005 04:27 PM
#7: Re: import/include a .js file into a .js file

*/
function include_js_file(filename)
{
	var body = document.getElementsByTagName('body').item(0);
	script = document.createElement('script');
	script.src = filename;
	script.type = 'text/javascript';
	body.appendChild(script);
}

/*inc("jsValidation.js");
inc("jsEvents.js");*/

function in_array(needle, haystack, strict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
 
    var found = false, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}

/*
SOURCED FROM: http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
*/
function getScrollXY() 
{
	var scrOfX = 0, scrOfY = 0;
	if ( typeof( window.pageYOffset ) == 'number' ) 
	{
	    //Netscape compliant
	    scrOfY = window.pageYOffset;
	    scrOfX = window.pageXOffset;
	} else if ( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if ( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [ scrOfX, scrOfY ];
}