function verticalRotator(name,parentid,listHeight,detailHeight,timercount,pausecount,currentClass,rotateClass,slideSpeed)
{
	this.name = name;
	this.initialized = false;
	this.currentIndex = 0;
	this.slideSpeed = slideSpeed;
	this.listItems = new Array();
	this.detailItems = new Array();
	this.currentClass = currentClass;
	this.rotateClass=rotateClass;
	this.timer = false;
	this.timercount = timercount;
	this.pausecount = pausecount;
	this.parent = $jq('#'+parentid);
	this.listHeight=listHeight;
	this.detailHeight=detailHeight;
	this.load = function(startIndex,listName,divName)
	{
		var i = startIndex;
		var x = document.getElementById(listName+i);
		var y = document.getElementById(divName+i);
		while (typeof x!='undefined'&&x!=null && typeof y!='undefined' && y!=null)
		{
			this.listItems.push($jq(x));
			this.detailItems.push($jq(y));
			i++;
			x = document.getElementById(listName+i);
			y = document.getElementById(divName+i);
		}
		
		this.init();
	}
	this.init = function()
	{
		if (this.count()>0)
		{
			this.parent.css('height',this.count()*this.listHeight+this.detailHeight);
			this.detail(0);
		}
		else
		{
			this.parent.css('height',0);			
		}
		this.initialized=true;
		this.start();
	}
	this.start = function()
	{
		this.play(this.timercount);
	}
	this.play = function(duration)
	{
		this.pause();
		this.timer=setTimeout(this.name+'.rotate();',duration);
	}
	this.delay = function()
	{
		this.play(this.pausecount);
	}
	this.pause = function()
	{
		if (this.timer)
			clearTimeout(this.timer);
	}
	this.rotate = function()
	{
		if (this.currentIndex+1<this.count())
			this.detail(this.currentIndex+1);
		else
			this.detail(0);
		this.start();
	}
	this.detail = function(index)
	{
		if (index<this.count()&&index>=0)
		{
			if (index!=0)
			{
				this.listItems[index].addClass(this.rotateClass);
			}
			if (this.initialized)
			{
				this.listItems[this.currentIndex].removeClass(this.currentClass);
				this.listItems[this.currentIndex].removeClass(this.rotateClass);
			}
			for (var i=0;i<this.count();i++)
			{
				if (i!=index)
					this.detailItems[i].slideUp(this.slideSpeed);
			}
			if (index==0)
			{
				this.listItems[index].addClass(this.rotateClass);
			}
			if (this.initialized)
				this.detailItems[index].slideDown(this.slideSpeed,eval('function callback() {'+this.name+'.listItems[index].addClass('+this.name+'.currentClass)}'));
			this.currentIndex=index;
		}
		return false;
	}
	this.count = function()
	{
		return this.listItems.length;
	}
}

/* ROTATOR RANDOM */
function tabBlock(name,startTab,count)
{
	/*
		name:	the defined name of the variable within javascript, eg: var x = new tabBlock('x'...)
		startTab: the tab to show by default, -1 = random or zero, if random count is required to be the total count. Cannot use random when the total count is unknown
		count: see startTab.
	*/
	this.name = name;
	this.tabs = new Array();
	this.pages = new Array();
	this.startTab = startTab;
	if (typeof this.startTab != 'undefined')
	{
		if (this.startTab < 0 && typeof count != 'undefined' && count != null && count > 0)
		{	
			this.startTab = ( Math.floor( Math.random() * count ) + 1 ) ;
		}
	}
	else
		this.startTab = 1;
	this.add=function(id,tabobjectid)
	{
		this.pages.push($jq('#'+id));
		this.tabs['T'+this.pages.length]=$jq('#'+tabobjectid);
		if (this.pages.length==this.startTab)
			this.show(this.startTab);
		else		
			this.hide(this.pages.length-1);
	}
	this.hide=function(index)
	{
		this.pages[index].css('display','none');
	}
	this.show=function(index)
	{
		for(var i=0;i<this.pages.length;i++)
		{
			if (i==index-1)
			{
				this.pages[i].css('display','block');
				if (typeof this.tabs['T'+(i+1)]!='undefined' && this.tabs['T'+(i+1)]!=null)
					this.tabs['T'+(i+1)].addClass('current');
			}
			else
			{
				this.hide(i);
				if (typeof this.tabs['T'+(i+1)]!='undefined' && this.tabs['T'+(i+1)]!=null)
					this.tabs['T'+(i+1)].removeClass('current');
			}
		}
	}
}

// PRINTING FUNCTIONALITY FOR ARTICLES
var srcvalue = '';
var counter = 0;
var timer;
function printcontent(panename) {
	if (panename==null||panename=='')
	panename = 'ContentPane'
	myRef = window.open('/print.aspx','mywin','left=20,top=20,width=700,height=700,toolbar=1,resizable=1,scrollbars=yes');
	srcvalue = document.getElementById('dnn_' + panename).innerHTML;
	counter = 10;
	waitfortarget();
}

function waitfortarget() {
	counter--;
	if (!myRef.document.getElementById('dnn_ContentPane'))
	{
	//DO NOTHING
		if (counter > 0) {
			timer=setTimeout("waitfortarget()", 1500);
		}
		else {
			alert('Unable to load article. Please try again later.');
		}
	}
	else {
	donetarget();
	}
}
function donetarget() {
	myRef.document.getElementById('dnn_ContentPane').innerHTML = srcvalue;
	myRef.print();
}

// Design Center Functionality
function designCenterChangeStory(linkID, storyID, divID) {
	var dtObj = document.getElementById(divID).getElementsByTagName('dt');
	var ddObj = document.getElementById(divID).getElementsByTagName('dd');

	for(var i = 0; i< dtObj.length; i++){
                if(ddObj[i].id==storyID){
                        document.getElementById(storyID).style.display='block';
                }
                else{
                        document.getElementById(ddObj[i].id).style.display='none';
                }
	        var aObj =  dtObj[i].getElementsByTagName('a');
                for(var k = 0; k < aObj.length; k++){
                         if(aObj[k].id == linkID){
                            $jq('#'+linkID).addClass('current');
                         }
                         else{
                            $jq('#'+aObj[k].id).removeClass('current');
                         }
                }
        }

}

// SHOW HIDE FULL ARTICLE
/*$jq().ready( function() {
  showShortArticle();
});

function showShortArticle() {
  $jq("div.article p:gt(2)").each( function(i, item) { 

	var strCollapsed = "<div id='expandCollapseArea'><div class='expandCollapse'><div class='option'>Turn OFF Collapse / Expand Article</div>";
	strCollapsed += "<a href='#' class='button' onclick='showFullArticle(); return false;'>Read Full Article</a><div class='clear'></div></div></div>";

	$jq(item).slideUp();
	$jq("div#expandCollapseArea").replaceWith(strCollapsed);
  });
}

function showFullArticle() {
  $jq("div.article p").each( function(i, item) { 

	var strExpanded = "<div id='expandCollapseArea'><div class='pagination'><a href='#' class='disabled'>&laquo; Prev</a> Page <a href='#' class='active'>1</a>";
	strExpanded += " | <a href='#'>2</a> | <a href='#'>3</a> <a href='#' class='enabled'>Next &raquo;</a></div><div class='expandCollapse'><div class='option'>Turn OFF Collapse / Expand Article</div>";
	strExpanded += "<a href='#' class='buttonUp' onclick='showShortArticle(); return false;'>Collapse Article</a><div class='clear'></div></div></div>";


	$jq(item).slideDown();
	$jq("div#expandCollapseArea").replaceWith(strExpanded);
  });
}*/

// CROSS SITE SEARCH FUNCTIONALITY
function ProductSearch( input, url ) {	
	if ( input != "" ) { 
		window.open( url, '', 'width=700,height=600,resizable=yes,scrollbars=yes,toolbar=yes,location=yes,status=yes,menubar=yes' ); 
    } 
    else {
		alert ( "Please enter a text string to search for." );
	} 
} 

function ratings(rateing_id,rating_class){
 document.getElementById('rate').className="rating "+rating_class+"star";
 var value = '';
 switch (rating_class){
 case "one":
 value=1;
 break;
 case "two":
 value=2;
 break;
 case "three":
 value=3;
 break;
 case "four":
 value=4;
 break;
 case "five":
  value=5;
 break;
 }
 document.getElementById('rateIt').value=value;
}
// FORUMS ADMIN CONTROLS
function ShowForumAdmin() {
	$jq('#reelAdminToolbar').show();
	$jq('#reelAdminToolbarTopic').show();
}
var tid;
// VIDEO CONTROLS
function replaceVideoInfo(linkId, moduleId, clickTime) {
	var divFromField = document.getElementById('videoContent' + linkId );
	var divToField = document.getElementById('VideoContentTarget' + moduleId);
	var imageFromField = document.getElementById('videoImage' + linkId);
	var imageToField = document.getElementById('VideoImageTarget' + moduleId);
	var newLinkId = (linkId<moduleId+'5')?linkId+1:moduleId+'1';
//	alert(newLinkId + clickTime);

	divToField.innerHTML = divFromField.innerHTML;
	imageToField.innerHTML = imageFromField.innerHTML;

	document.getElementById('thumbLink' + moduleId + '1').className=" ";
	document.getElementById('thumbLink' + moduleId + '2').className=" ";
	document.getElementById('thumbLink' + moduleId + '3').className=" ";
	document.getElementById('thumbLink' + moduleId + '4').className=" ";
	document.getElementById('thumbLink' + moduleId + '5').className=" ";
	document.getElementById('thumbLink' + linkId).className="active";

        if(clickTime=="25000"){
                clearTimeout(tid);
        	tid=setTimeout("replaceVideoInfo(" + newLinkId + ", " + moduleId + ", 5000)", clickTime);
        }
        else{
              tid=setTimeout("replaceVideoInfo(" + newLinkId + ", " + moduleId + ","+clickTime+")", 5000);
        }
}
// SCROLL PANES
jQuery.jScrollPane = {
	active : []
};
jQuery.fn.jScrollPane = function(settings)
{
	settings = jQuery.extend({}, jQuery.fn.jScrollPane.defaults, settings);
	var rf = function() { return false; };
	return this.each(
		function()
		{
			var $this = jQuery(this);
			$this.css('overflow', 'hidden');
			var paneEle = this;
			
			if (jQuery(this).parent().is('.jScrollPaneContainer')) {
				var currentScrollPosition = settings.maintainPosition ? $this.offset({relativeTo:jQuery(this).parent()[0]}).top : 0;
				var $c = jQuery(this).parent();
				var paneWidth = $c.innerWidth();
				var paneHeight = $c.outerHeight();
				var trackHeight = paneHeight;
				jQuery('>.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown', $c).remove();
				$this.css({'top':0});
			} else {
				var currentScrollPosition = 0;
				this.originalPadding = $this.css('paddingTop') + ' ' + $this.css('paddingRight') + ' ' + $this.css('paddingBottom') + ' ' + $this.css('paddingLeft');
				this.originalSidePaddingTotal = (parseInt($this.css('paddingLeft')) || 0) + (parseInt($this.css('paddingRight')) || 0);
				var paneWidth = $this.innerWidth();
				var paneHeight = $this.innerHeight();
				var trackHeight = paneHeight;
				$this.wrap(
					jQuery('<div></div>').attr(
						{'className':'jScrollPaneContainer'}
					).css(
						{
							'height':paneHeight+'px', 
							'width':paneWidth+'px'
						}
					)
				);
				jQuery(document).bind(
					'emchange', 
					function(e, cur, prev)
					{
						$this.jScrollPane(settings);
					}
				);
			}
			if (settings.reinitialiseOnImageLoad) {
				var $imagesToLoad = $.data(paneEle, 'jScrollPaneImagesToLoad') || $('img', $this);
				var loadedImages = [];
				if ($imagesToLoad.length) {
					$imagesToLoad.each(function(i, val)	{
						$(this).bind('load', function() {
							if(jQuery.inArray(i, loadedImages) == -1){ //don't double count images
								loadedImages.push(val); //keep a record of images we've seen
								$imagesToLoad = $.grep($imagesToLoad, function(n, i) {
									return n != val;
								});
								$.data(paneEle, 'jScrollPaneImagesToLoad', $imagesToLoad);
								settings.reinitialiseOnImageLoad = false;
								$this.jScrollPane(settings); // re-initialise
							}
						}).each(function(i, val) {
							if(this.complete || this.complete===undefined) { 
								this.src = this.src; 
							} 
						});
					});
				};
			}
			var p = this.originalSidePaddingTotal;
			var cssToApply = {
				'height':'auto',
				'width':paneWidth - settings.scrollbarWidth - settings.scrollbarMargin - p + 'px'
			}
			if(settings.scrollbarOnLeft) {
				cssToApply.paddingLeft = settings.scrollbarMargin + settings.scrollbarWidth + 'px';
			} else {
				cssToApply.paddingRight = settings.scrollbarMargin + 'px';
			}
			$this.css(cssToApply);
			var contentHeight = $this.outerHeight();
			var percentInView = paneHeight / contentHeight;

			if (percentInView < .99) {
				var $container = $this.parent();
				$container.append(
					jQuery('<div></div>').attr({'className':'jScrollPaneTrack'}).css({'width':settings.scrollbarWidth+'px'}).append(
						jQuery('<div></div>').attr({'className':'jScrollPaneDrag'}).css({'width':settings.scrollbarWidth+'px'}).append(
							jQuery('<div></div>').attr({'className':'jScrollPaneDragTop'}).css({'width':settings.scrollbarWidth+'px'}),
							jQuery('<div></div>').attr({'className':'jScrollPaneDragBottom'}).css({'width':settings.scrollbarWidth+'px'})
						)
					)
				);
				var $track = jQuery('>.jScrollPaneTrack', $container);
				var $drag = jQuery('>.jScrollPaneTrack .jScrollPaneDrag', $container);
				
				if (settings.showArrows) {
					
					var currentArrowButton;
					var currentArrowDirection;
					var currentArrowInterval;
					var currentArrowInc;
					var whileArrowButtonDown = function()
					{
						if (currentArrowInc > 4 || currentArrowInc%4==0) {
							positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);
						}
						currentArrowInc ++;
					};
					var onArrowMouseUp = function(event)
					{
						jQuery('html').unbind('mouseup', onArrowMouseUp);
						currentArrowButton.removeClass('jScrollActiveArrowButton');
						clearInterval(currentArrowInterval);
					};
					var onArrowMouseDown = function() {
						//console.log(direction);
						//currentArrowButton = $(this);
						jQuery('html').bind('mouseup', onArrowMouseUp);
						currentArrowButton.addClass('jScrollActiveArrowButton');
						currentArrowInc = 0;
						whileArrowButtonDown();
						currentArrowInterval = setInterval(whileArrowButtonDown, 100);
					};
					$container
						.append(
							jQuery('<a></a>')
								.attr({'href':'javascript:;', 'className':'jScrollArrowUp'})
								.css({'width':settings.scrollbarWidth+'px'})
								.html('Scroll up')
								.bind('mousedown', function()
								{
									currentArrowButton = jQuery(this);
									currentArrowDirection = -1;
									onArrowMouseDown();
									this.blur();
									return false;
								})
								.bind('click', rf),
							jQuery('<a></a>')
								.attr({'href':'javascript:;', 'className':'jScrollArrowDown'})
								.css({'width':settings.scrollbarWidth+'px'})
								.html('Scroll down')
								.bind('mousedown', function()
								{
									currentArrowButton = jQuery(this);
									currentArrowDirection = 1;
									onArrowMouseDown();
									this.blur();
									return false;
								})
								.bind('click', rf)
						);
					var $upArrow = jQuery('>.jScrollArrowUp', $container);
					var $downArrow = jQuery('>.jScrollArrowDown', $container);
					if (settings.arrowSize) {
						trackHeight = paneHeight - settings.arrowSize - settings.arrowSize;
						$track
							.css({'height': trackHeight+'px', top:settings.arrowSize+'px'})
					} else {
						var topArrowHeight = $upArrow.height();
						settings.arrowSize = topArrowHeight;
						trackHeight = paneHeight - topArrowHeight - $downArrow.height();
						$track
							.css({'height': trackHeight+'px', top:topArrowHeight+'px'})
					}
				}
				var $pane = jQuery(this).css({'position':'absolute', 'overflow':'visible'});
				var currentOffset;
				var maxY;
				var mouseWheelMultiplier;
				var dragPosition = 0;
				var dragMiddle = percentInView*paneHeight/2;
				var getPos = function (event, c) {
					var p = c == 'X' ? 'Left' : 'Top';
					return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;
				};
				
				var ignoreNativeDrag = function() {	return false; };
				
				var initDrag = function()
				{
					ceaseAnimation();
					currentOffset = $drag.offset(false);
					currentOffset.top -= dragPosition;
					maxY = trackHeight - $drag[0].offsetHeight;
					mouseWheelMultiplier = 2 * settings.wheelSpeed * maxY / contentHeight;
				};
				
				var onStartDrag = function(event)
				{
					initDrag();
					dragMiddle = getPos(event, 'Y') - dragPosition - currentOffset.top;
					jQuery('html').bind('mouseup', onStopDrag).bind('mousemove', updateScroll);
					if (jQuery.browser.msie) {
						jQuery('html').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
					}
					return false;
				};
				var onStopDrag = function()
				{
					jQuery('html').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
					dragMiddle = percentInView*paneHeight/2;
					if (jQuery.browser.msie) {
						jQuery('html').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
					}
				};
				var positionDrag = function(destY)
				{
					destY = destY < 0 ? 0 : (destY > maxY ? maxY : destY);
					dragPosition = destY;
					$drag.css({'top':destY+'px'});
					var p = destY / maxY;
					$pane.css({'top':((paneHeight-contentHeight)*p) + 'px'});
					$this.trigger('scroll');
					if (settings.showArrows) {
						$upArrow[destY == 0 ? 'addClass' : 'removeClass']('disabled');
						$downArrow[destY == maxY ? 'addClass' : 'removeClass']('disabled');
					}
				};
				var updateScroll = function(e)
				{
					positionDrag(getPos(e, 'Y') - currentOffset.top - dragMiddle);
				};
				var dragH = Math.max(Math.min(percentInView*(paneHeight-settings.arrowSize*2), settings.dragMaxHeight), settings.dragMinHeight);
				$drag.css(
					{'height':dragH+'px'}
				).bind('mousedown', onStartDrag);
				var trackScrollInterval;
				var trackScrollInc;
				var trackScrollMousePos;
				var doTrackScroll = function()
				{
					if (trackScrollInc > 8 || trackScrollInc%4==0) {
						positionDrag((dragPosition - ((dragPosition - trackScrollMousePos) / 2)));
					}
					trackScrollInc ++;
				};
				var onStopTrackClick = function()
				{
					clearInterval(trackScrollInterval);
					jQuery('html').unbind('mouseup', onStopTrackClick).unbind('mousemove', onTrackMouseMove);
				};
				var onTrackMouseMove = function(event)
				{
					trackScrollMousePos = getPos(event, 'Y') - currentOffset.top - dragMiddle;
				};
				var onTrackClick = function(event)
				{
					initDrag();
					onTrackMouseMove(event);
					trackScrollInc = 0;
					jQuery('html').bind('mouseup', onStopTrackClick).bind('mousemove', onTrackMouseMove);
					trackScrollInterval = setInterval(doTrackScroll, 100);
					doTrackScroll();
				};
				$track.bind('mousedown', onTrackClick);
				$container.bind(
					'mousewheel',
					function (event, delta) {
						initDrag();
						ceaseAnimation();
						var d = dragPosition;
						positionDrag(dragPosition - delta * mouseWheelMultiplier);
						var dragOccured = d != dragPosition;
						return !dragOccured;
					}
				);

				var _animateToPosition;
				var _animateToInterval;
				function animateToPosition()
				{
					var diff = (_animateToPosition - dragPosition) / settings.animateStep;
					if (diff > 1 || diff < -1) {
						positionDrag(dragPosition + diff);
					} else {
						positionDrag(_animateToPosition);
						ceaseAnimation();
					}
				}
				var ceaseAnimation = function()
				{
					if (_animateToInterval) {
						clearInterval(_animateToInterval);
						delete _animateToPosition;
					}
				};
				var scrollTo = function(pos, preventAni)
				{
					if (typeof pos == "string") {
						$e = jQuery(pos, this);
						if (!$e.length) return;
						pos = $e.offset().top - $this.offset().top;
					}
					ceaseAnimation();
					var destDragPosition = -pos/(paneHeight-contentHeight) * maxY;
					if (preventAni || !settings.animateTo) {
						positionDrag(destDragPosition);
					} else {
						_animateToPosition = destDragPosition;
						_animateToInterval = setInterval(animateToPosition, settings.animateInterval);
					}
				};
				$this[0].scrollTo = scrollTo;
				$this[0].scrollBy = function(delta)
				{
					var currentPos = -parseInt($pane.css('top')) || 0;
					scrollTo(currentPos + delta);
				};
				initDrag();
				scrollTo(-currentScrollPosition, true);
				$('*', this).bind(
					'focus',
					function(event)
					{
						var eleTop = $(this).position().top;
						var viewportTop = -parseInt($pane.css('top')) || 0;
						var maxVisibleEleTop = viewportTop + paneHeight;
						var eleInView = eleTop > viewportTop && eleTop < maxVisibleEleTop;
						if (!eleInView) {
							$container.scrollTop(0);
							var destPos = eleTop - settings.scrollbarMargin;
							if (eleTop > viewportTop) { // element is below viewport - scroll so it is at bottom.
								destPos += $(this).height() + 15+ settings.scrollbarMargin - paneHeight;
							}
							scrollTo(destPos);
						}
					}
				)		
				if (location.hash) {
					setTimeout(function() {
						$(location.hash, $this).trigger('focus');
					}, $.browser.msie ? 100 : 0);
				}
				$(document).bind(
					'click',
					function(e)
					{
						$target = $(e.target);
						if ($target.is('a')) {
							var h = $target.attr('href');
							console.log(h);
							if (h.substr(0, 1) == '#') {
								$linkedEle = $(h, $this);
								console.log($linkedEle);
								if ($linkedEle.length) {
									$linkedEle.trigger('focus');
									return false;
								}
							}
						}
					}
				);
				
				jQuery.jScrollPane.active.push($this[0]);
				
			} else {
				$this.css(
					{
						'height':paneHeight+'px',
						'width':paneWidth-this.originalSidePaddingTotal+'px',
						'padding':this.originalPadding
					}
				);
			}
			
		}
	)
};

jQuery.fn.jScrollPane.defaults = {
	scrollbarWidth : 10,
	scrollbarMargin : 5,
	wheelSpeed : 18,
	showArrows : false,
	arrowSize : 0,
	animateTo : false,
	dragMinHeight : 1,
	dragMaxHeight : 99999,
	animateInterval : 100,
	animateStep: 3,
	maintainPosition: true,
	scrollbarOnLeft: false,
	reinitialiseOnImageLoad: false
};

// clean up the scrollTo expandos
jQuery(window)
	.bind('unload', function() {
		var els = jQuery.jScrollPane.active; 
		for (var i=0; i<els.length; i++) {
			els[i].scrollTo = els[i].scrollBy = null;
		}
	}
);
// FACEBOX
(function($) {
  $.facebox = function(data, klass, x, y) {
    $.facebox.loading(x, y)
    if (data.ajax) fillFaceboxFromAjax(data.ajax)
    else if (data.image) fillFaceboxFromImage(data.image)
    else if (data.div) fillFaceboxFromHref(data.div)
    else if (data.span) fillFaceboxFromHref(data.span)	
    else if ($.isFunction(data)) data.call($)
    else $.facebox.reveal(data, klass)
  }

  /*
   * Public, $.facebox methods
   */

  $.extend($.facebox, {
    settings: {
      opacity      : 0,
      overlay      : true,
      loadingImage : '/Portals/_default/Skins/MillimeterSkin/_images/loading.gif',
      closeImage   : '/Portals/_default/Skins/MillimeterSkin/_images/closelabel.gif',
      imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
      faceboxHtml  : '\
    <div id="facebox" style="display:none;"> \
      <div class="popup"> \
        <table> \
          <tbody> \
            <tr> \
              <td class="tl"/><td class="b"/><td class="tr"/> \
            </tr> \
            <tr> \
              <td class="b"/> \
              <td class="body"> \
                <div class="content"> \
                </div> \
              </td> \
              <td class="b"/> \
            </tr> \
            <tr> \
              <td class="bl"/><td class="b"/><td class="br"/> \
            </tr> \
          </tbody> \
        </table> \
      </div> \
    </div>'
    },

    loading: function(x, y) {
      init()
      if ($('#facebox .loading').length == 1) return true
      showOverlay()

      $('#facebox .content').empty()
      $('#facebox .body').children().hide().end().
        append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>')

      $('#facebox').css({
        top:	y,
        left:	x
      }).show()

      $(document).bind('keydown.facebox', function(e) {
        if (e.keyCode == 27) $.facebox.close()
        return true
      })
      $(document).trigger('loading.facebox')
    },

    reveal: function(data, klass, X, Y) {
      $(document).trigger('beforeReveal.facebox')
      if (klass) $('#facebox .content').addClass(klass)
      $('#facebox .content').append(data)
      $('#facebox .loading').remove()
      $('#facebox .body').children().fadeIn('normal')
      $('#facebox').css('left', $(window).width() / 2 - ($('#facebox table').width() / 2))

      if(X) $('#facebox').css('left', X)
      if(Y) $('#facebox').css('top', Y) 
				
      $(document).trigger('reveal.facebox').trigger('afterReveal.facebox')
    },

    close: function() {
      $(document).trigger('close.facebox')
      return false
    }
  })

  /*
   * Public, $.fn methods
   */
	
  $.fn.facebox = function(settings) {
    init(settings)

    function clickHandler() {
      $.facebox.loading(true)

      // support for rel="facebox.inline_popup" syntax, to add a class
      // also supports deprecated "facebox[.inline_popup]" syntax
      var klass = this.rel.match(/facebox\[?\.(\w+)\]?/)		
      if (klass) klass = klass[1]
	if(klass == "relative"){		
		var xCord = find_X_Pos(this)
		var yCord = find_Y_Pos(this)
		fillFaceboxFromHref(this.href, klass, xCord, yCord)
	}
	else{
	      fillFaceboxFromHref(this.href, klass)
	}
      return false
    }

    return this.click(clickHandler)
  }

  /*
   * Private methods
   */
  function find_X_Pos(obj){
     var curleft = 0
     if (obj.offsetParent) {
	 do{
		curleft += obj.offsetLeft
	 }while (obj = obj.offsetParent)
     }
     return curleft
  }

  function find_Y_Pos(obj){
     var curtop = obj.offsetHeight 
     if (obj.offsetParent) {
	 do{
		curtop += obj.offsetTop
	 }while (obj = obj.offsetParent)
     }
	
     return curtop
  }

  // called one time to setup facebox on this page
  function init(settings) {
    if ($.facebox.settings.inited) return true
    else $.facebox.settings.inited = true

    $(document).trigger('init.facebox')
    makeCompatible()

    var imageTypes = $.facebox.settings.imageTypes.join('|')
    $.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i')

    if (settings) $.extend($.facebox.settings, settings)
    $('body').append($.facebox.settings.faceboxHtml)

    var preload = [ new Image(), new Image() ]
    preload[0].src = $.facebox.settings.closeImage
    preload[1].src = $.facebox.settings.loadingImage

    $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() {
      preload.push(new Image())
      preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
    })

    $('#facebox .close').click($.facebox.close)
    $('#facebox .close_image').attr('src', $.facebox.settings.closeImage)
  }
  
  // getPageScroll() by quirksmode.com
  function getPageScroll() {
    var xScroll, yScroll;
    if (self.pageYOffset) {
      yScroll = self.pageYOffset;
      xScroll = self.pageXOffset;
    } else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
      yScroll = document.documentElement.scrollTop;
      xScroll = document.documentElement.scrollLeft;
    } else if (document.body) {// all other Explorers
      yScroll = document.body.scrollTop;
      xScroll = document.body.scrollLeft;	
    }
    return new Array(xScroll,yScroll) 
  }

  // Adapted from getPageSize() by quirksmode.com
  function getPageHeight() {
    var windowHeight
    if (self.innerHeight) {	// all except Explorer
      windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
      windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
      windowHeight = document.body.clientHeight;
    }	
    return windowHeight
  }

  // Backwards compatibility
  function makeCompatible() {
    var $s = $.facebox.settings

    $s.loadingImage = $s.loading_image || $s.loadingImage
    $s.closeImage = $s.close_image || $s.closeImage
    $s.imageTypes = $s.image_types || $s.imageTypes
    $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml
  }

  // Figures out what you want to display and displays it
  // formats are:
  //     div: #id
  //   image: blah.extension
  //    ajax: anything else
  function fillFaceboxFromHref(href, klass, X, Y) {
    // div
    if (href.match(/#/)) {
      var url    = window.location.href.split('#')[0]
      var target = href.replace(url,'')
      $.facebox.reveal($(target).clone().show(), klass, X, Y)

    // image
    } else if (href.match($.facebox.settings.imageTypesRegexp)) {
      fillFaceboxFromImage(href, klass)
    // ajax
    } else {
      fillFaceboxFromAjax(href, klass)
    }
  }

  function fillFaceboxFromImage(href, klass) {
    var image = new Image()
    image.onload = function() {
      $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
    }
    image.src = href
  }

  function fillFaceboxFromAjax(href, klass) {
    $.get(href, function(data) { $.facebox.reveal(data, klass) })
  }

  function skipOverlay() {
    return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null 
  }

  function showOverlay() {
    if (skipOverlay()) return

    if ($('facebox_overlay').length == 0) 
      $("body").append('<div id="facebox_overlay" class="facebox_hide"></div>')

    $('#facebox_overlay').hide().addClass("facebox_overlayBG")
      .css('opacity', $.facebox.settings.opacity)
      .click(function() { $(document).trigger('close.facebox') })
      .fadeIn(200)
    return false
  }

  function hideOverlay() {
    if (skipOverlay()) return

    $('#facebox_overlay').fadeOut(200, function(){
      $("#facebox_overlay").removeClass("facebox_overlayBG")
      $("#facebox_overlay").addClass("facebox_hide") 
      $("#facebox_overlay").remove()
    })
    
    return false
  }

  /*
   * Bindings
   */

  $(document).bind('close.facebox', function() {
    $(document).unbind('keydown.facebox')
    $('#facebox').fadeOut(function() {
      $('#facebox .content').removeClass().addClass('content')
      hideOverlay()
      $('#facebox .loading').remove()
    })
  })

})(jQuery);
