var TimerID;

function dump(arr,level) {
	var dumped_text = '';
	if( !level ) level = 0;
	//The padding given at the beginning of the line.
	var level_padding = '';
	for(var j=0;j<level+1;j++) level_padding += "    ";

	if(typeof(arr) == 'object') { //Array/Hashes/Objects
		for(var o in arr) {
			var value = arr[o];
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + o + "' ...\n";
				dumped_text += dump(value, level+1);
			} else {
				dumped_text += level_padding + "'" + o + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/** jQuery Plugins */
(function($){

$.fn.infiniteCarousel = function () {

    function repeat(str, num) {
        return new Array( num + 1 ).join( str );
    }

    return this.each(function () {
        var $wrapper = $('> div', this).css('overflow', 'hidden'),
            $slider = $wrapper.find('> ul'),
            $items = $slider.find('> li'),
            $single = $items.filter(':first'),

            singleWidth = $single.outerWidth(),
            visible = Math.ceil($wrapper.innerWidth() / singleWidth), // note: doesn't include padding or border
            currentPage = 1,
            pages = Math.ceil($items.length / visible);

        // 1. Pad so that 'visible' number will always be seen, otherwise create empty items
        if (($items.length % visible) != 0) {
            $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
            $items = $slider.find('> li');
        }

        // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
        $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));
        $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
        $items = $slider.find('> li'); // reselect

        // 3. Set the left position to the first 'real' item
        $wrapper.scrollLeft(singleWidth * visible);

        // 4. paging function
        function gotoPage(page) {

			if( !page || page >= $items.length-1 ) return;

            var dir = page < currentPage ? -1 : 1,
                n = Math.abs(currentPage - page),
                left = singleWidth * dir * visible * n;

            $wrapper.filter(':not(:animated)').animate({
                scrollLeft : '+=' + left
            }, 500, function () {
                if (page == 0) {
                    $wrapper.scrollLeft(singleWidth * visible * pages);
                    page = pages;
                } else if (page > pages) {
                    $wrapper.scrollLeft(singleWidth * visible);
                    // reset back to start position
                    page = 1;
                }

                currentPage = page;
            });

            return false;
        }

        // 5. Bind to the forward and back buttons
        $('a.back', this).click(function () {
            return gotoPage(currentPage - 1);
        });

        $('a.forward', this).click(function () {
            return gotoPage(currentPage + 1);
        });

        // create a public interface to move to a specific page
        $(this).bind('goto', function (event, page) {
            gotoPage(page);
        });
    });
};

})(jQuery);

jQuery(document).ready(function() {

	$('li.regexurl').each(function(){
		var ele=this, $ele=$(ele), data;
		eval('data='+$ele.attr('data'));
		//~ console.log("function.js:133:data:"+dump(data));
		var re = new RegExp(data.re, 'i');
		if( re.test(document.location.href) ) {
			var $img, data;
			$img = $ele.find('img');
			eval('data='+$img.attr('data'));
			$img.attr('src', data.src).addClass('selected');
		}
	});

	$('a.regexurl').each(function(){
		var ele=this, $ele=$(ele), data;
		eval('data='+$ele.attr('data'));
		var re = new RegExp(data.re, 'i');
		if( re.test(document.location.href) ) {
			$ele.addClass('selected');
		}
	});

	$('.DOMWindow').openDOMWindow({
		windowSource:'iframe',
		eventType:'click',
		windowPadding:0,
		overlayOpacity:'0',
		borderColor:'#BBBBAA',
		windowBGColor:'#FFFFCC'
	});

	$('.ulist0 li').not(':last').css('border-bottom','1px solid #DEDEDE');
	$('.ulist0 li:odd').css('background-color','#EEF0EF');

	$('a[href=#top]').click(function(){
		$('html, body').animate({scrollTop:0}, 'fast');
		return false;
	});

	$('#\\:usertabs').tabs({
		selectedClass: 'selected',
		hideClass: 'tabs-hide'
	});

});

