// init page
window.addEvent('domready', function() {
	initLightboxPopups();
	initBrowserDetect();
	initOpenClose();
	initTableSorter();
});

// detect browser
function initBrowserDetect() {
	var cssFix = function(){
		var u = navigator.userAgent.toLowerCase(),
		addClass = function(el,val){
			if(!el.className) {
				el.className = val;
			} else {
				var newCl = el.className;
				newCl+=(" "+val);
				el.className = newCl;
			}
		},
		is = function(t){return (u.indexOf(t)!=-1)};
		addClass(document.getElementsByTagName('html')[0],[
			(!(/opera|webtv/i.test(u))&&/msie (\d)/.test(u))?('ie ie'+RegExp.$1)
			:is('firefox/2')?'gecko ff2'
			:is('firefox/3')?'gecko ff3'
			:is('gecko/')?'gecko'
			:is('chrome/')?'chrome'
			:is('opera/9')?'opera opera9':/opera (\d)/.test(u)?'opera opera'+RegExp.$1
			:is('konqueror')?'konqueror'
			:is('applewebkit/')?'webkit safari'
			:is('mozilla/')?'gecko':'',
			(is('x11')||is('linux'))?' linux'
			:is('mac')?' mac'
			:is('win')?' win':''
		].join(" "));
	}();
}

// table sorter init
function initTableSorter() {
	$$('table.sort-table').each(function(table){	
		if(table.style.display == "none") {
			table.style.display = "";			
		}		
		
		new SortingTable(table, {
			zebra: false,
			details: false,
			paginator: false,
			onSorted: function(){}, // Callback to run after sort
			dont_sort_class: 'nosort',
			forward_sort_class: 'sortAsc',
			reverse_sort_class: 'sortDesc'
		});

		// first column sort by default
		if(!table.getElements('th')[0].hasClass('check-cell')) table.getElements('th')[0].fireEvent('mousedown');
		else table.getElements('th')[1].fireEvent('mousedown');

		// table open-close
		var _diff = 25;
		var _duration = 400;
		var _activeClass = 'extra-row-wrap';
		var _collapseRows = table.getElements('div.extra-row');
		if(_collapseRows.length) {
			_collapseRows.each(function(obj){
				var _slider = obj;
				var _sliderHeight = _slider.getSize().y;
				var _holder = _slider.getParent('div');
				var _opener = _holder.getElement('a.open-link');
				
				// init slide
				var _row = _holder.getParent('tr');
				_row.getElements('td').setStyles({'verticalAlign':'top'});
				_holder.setStyles({position:'relative'});
				if(_row.hasClass(_activeClass)) {
					//_slider.setStyles({'display':'block'});
					//_holder.setStyles({'paddingBottom':_sliderHeight+_diff})
				} else {
					_slider.setStyles({'display':'none'});
					_holder.setStyles({'paddingBottom':0})
				}
				
				// open-close animation
				var myFxSlide = new Fx.Morph(_slider, {duration: _duration});
				var myFxHeight = new Fx.Morph(_holder, {duration: _duration});
				
				_row.removeClass(_activeClass);
				myFxSlide.start({'height':0});
				myFxHeight.start({'paddingBottom':0});				
				
				_opener.addEvent('click', function(){
					myFxSlide.cancel();
					myFxHeight.cancel();
					if(_row.hasClass(_activeClass)) {
						_row.removeClass(_activeClass);
						myFxSlide.start({'height':0});
						myFxHeight.start({'paddingBottom':0});
					} else {
						_row.addClass(_activeClass);

						myFxSlide.start({'height':_sliderHeight});
						myFxHeight.start({'paddingBottom':_sliderHeight+_diff});
					}
					return false;
				});
				
				_second = _row.getElements('a.open-link-second');
				
				if(_second) {
				
				  _second.addEvent('click', function(){
					  myFxSlide.cancel();
					  myFxHeight.cancel();
					  if(_row.hasClass(_activeClass)) {
						  _row.removeClass(_activeClass);
						  myFxSlide.start({'height':0});
						  myFxHeight.start({'paddingBottom':0});
					  } else {
						  _row.addClass(_activeClass);

						  myFxSlide.start({'height':_sliderHeight});
						  myFxHeight.start({'paddingBottom':_sliderHeight+_diff});
					  }
					  return false;
				  });				
				
				}
				
			})
		}

		// table check/uncheck rows
		var _checkHeader = table.getElements('th.check-cell');
		if(_checkHeader.length) {
			var _rows = table.getElements('td.check-cell');
			var _check = _checkHeader.getElement('input[type="checkbox"]')[0];
			_check.addEvent('click', function(){
				if(_check.checked) {
					_rows.each(function(obj){obj.getElement('input[type="checkbox"]').checked = 'checked';});
				} else {
					_rows.each(function(obj){obj.getElement('input[type="checkbox"]').checked = '';});
				}
			});
		}
	})
}

// open close function
function initOpenClose() {
	var _duration = 400;
	var _activeClass = 'expanded';
	var _slideBlocks = $$("div.expandable");

	_slideBlocks.each(function(_el, i){
		var _item = _el;
		var _opener = _item.getElement("a.open");
		var _slider = _item.getElement("div.slide");
		var _sliderHeight = _slider.getSize().y;
		_slider.setStyles({'display':'block'});
		
		var myFxSlide = new Fx.Morph(_slider, {duration: _duration});

		_opener.addEvent('click', function(){
			myFxSlide.cancel();
			if(_item.hasClass(_activeClass)) {
				_item.removeClass(_activeClass);
				myFxSlide.start({'height':0});
			} else {
				_item.addClass(_activeClass);
				_slider.setStyles({'display':'block'});
				myFxSlide.start({'height':_sliderHeight});
			}
			return false;
		});

		if(_item.hasClass(_activeClass)) _slider.setStyles({'display':'block'});
		else _slider.setStyles({'display':'none','height':0});
	});
}

// popups function
function initLightboxPopups() {
	var _zIndex = 1000;
	var _fadeSpeed = 350;
	var _faderOpacity = 0.65;
	var _faderBackground = '#000';
	var _faderId = 'lightbox-overlay';
	var _closeLink = 'a.close, a.cancel, a.btn-close';
	var _fader;
	var _lightbox = null;
	var _openers = $$('a.open-popup');
	var _page = $$('div')[0];
	var _minWidth = $('main').getSize().x;

	// init popup fader
	var _body = $$('body')[0];
	_fader = document.createElement("DIV");
	_fader.id = _faderId;
	_body.grab(_fader);
	_fader = $(_faderId);
	_fader.setStyles({
		'backgroundColor':_faderBackground,
		'position':'absolute',
		'overflow':'hidden',
		'display':'none',
		'top':0,
		'left':0,
		'zIndex':_zIndex
	});
	_fader.setOpacity(_faderOpacity);

	// IE6 iframe fix
	if(document.uniqueID && document.compatMode && !window.XMLHttpRequest) {
		var _frame = document.createElement('IFRAME');
		_frame.src = 'javascript:false';
		_frame.frameborder = '0';
		_frame.scrolling = 'no';
		_frame.width = '100%';
		_frame.height = '100%';
		_frame.style.filter = "alpha(opacity=0)";
		_frame.style.zIndex = -1;
		_fader.grab(_frame);
	}

	// window height/width
	function getClientWidth(){return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;}
	function getClientHeight(){return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;}

	// lightbox positioning function
	function positionLightbox() {
		if(_lightbox) {
			var _windowHeight = getClientHeight();
			var _windowWidth = getClientWidth();
			var _lightboxWidth = _lightbox.getSize().x;
			var _lightboxHeight = _lightbox.getSize().y;
			var _pageHeight = _page.getSize().y;

			if (_windowWidth < _minWidth) _fader.setStyle('width',_minWidth);
				else _fader.setStyle('width','100%');
			if (_windowHeight < _pageHeight) _fader.setStyle('height',_pageHeight);
				else _fader.setStyle('height',_windowHeight);

			_lightbox.setStyles({
				'position':'absolute',
				'zIndex':(_zIndex+1),
				'top': 0,
				'left':0
			});

			// vertical position
			if (_windowHeight > _lightboxHeight) {
				if(document.uniqueID && document.compatMode && !window.XMLHttpRequest) {
					_lightbox.setStyles({
						'position':'absolute',
						'top': document.documentElement.scrollTop + (_windowHeight - _lightboxHeight) / 2
					});
				} else {
					_lightbox.setStyles({
						'position':'fixed',
						'top': (_windowHeight - _lightboxHeight) / 2
					});
				}
			} else {
				_lightbox.setStyles({
					'position':'absolute',
					'top': 0
				});
				if(_fader.getSize().y < _lightboxHeight) _fader.setStyle('height',_lightboxHeight);
			}

			// horizontal position
			if (_fader.getSize().x > _lightbox.getSize().x) _lightbox.setStyles({'left':(_fader.getSize().x - _lightbox.getSize().x) / 2});
			else _lightbox.setStyles({'left': 0});
		}
	}

	// show/hide lightbox
	function toggleState(_state) {
		if(!_lightbox) return;
		if(_state) {
			var _faderFx = new Fx.Morph(_fader, {duration: _fadeSpeed, onComplete:function(){
				var _popupFx = new Fx.Morph(_lightbox, {duration: _fadeSpeed});
				_lightbox.setStyles({'display':'block','opacity':0});
				positionLightbox();
				_popupFx.start({'opacity':1});
			}});
			_fader.setStyles({'display':'block','opacity':0});
			_faderFx.start({'opacity':_faderOpacity});
		} else {
			var _popupFx = new Fx.Morph(_lightbox, {duration: _fadeSpeed, onComplete:function(){
				var _faderFx = new Fx.Morph(_fader, {duration: _fadeSpeed});
				_faderFx.start({'opacity':0});
			}});
			_popupFx.start({'opacity':0});
		}
	}

	// popup actions
	function initPopupActions(_obj) {
		if(!_obj.jsInit) {
			_obj.jsInit = true;
			// close link
			var _closeLinks = _obj.getElements(_closeLink);
			if(_closeLinks && _closeLinks.length) {
				_closeLinks.each(function(_el, i){
					_el.addEvent('click', function(){
						_lightbox = _obj;
						toggleState(false);
						return false;
					});
				});
			}
		}
	}

	// lightbox openers
	_openers.each(function(_el, i){
		var _opener = _el
		var _target = _opener.href.substring(_opener.href.indexOf('#')+1);
		var _popup = $(_target);
		if(_popup) {
			// init actions for popup
			initPopupActions(_popup);

			// open popup
			_opener.addEvent('click', function(){
				_lightbox = _popup.setStyle('display','none');
				toggleState(true);
				return false;
			});
		}
	});

	// event handlers
	window.addEvent('resize', function() {
		positionLightbox();
	});
	window.addEvent('scroll', function() {
		positionLightbox();
	});
	document.addEvent('keydown', function(e) {
		if (!e) evt = window.event;
		if (e.keyCode == 27) {
			toggleState(false);
		}
	});
	_fader.addEvent('click', function(){
		toggleState(false);
		return false;
	});
}

//
// new SortingTable( 'my_table', {
//   zebra: true,                        // Stripe the table, also on initialize
//   details: false,                     // Has details every other row
//   paginator: false,                   // Pass a paginator object
//   onSorted: function(){},             // Callback to run after sort
//   dont_sort_class: 'nosort',          // Class name on th's that don't sort
//   forward_sort_class: 'forward_sort', // Class applied to forward sort th's
//   reverse_sort_class: 'reverse_sort'  // Class applied to reverse sort th's
// });
//
// The above were the defaults.  The regexes in load_conversions test a cell
// begin sorted for a match, then use that conversion for all elements on that
// column.
//
// Requires mootools Class, Array, Function, Element, Element.Selectors,
// Element.Event, and you should probably get Window.DomReady if you're smart.
//

var SortingTable = new Class({
	Implements: [Options, Events],

	options: {
		zebra: true,
		details: false,
		paginator: false,
		onSorted: $empty,
		dont_sort_class: 'nosort',
		forward_sort_class: 'forward_sort',
		reverse_sort_class: 'reverse_sort'
	},

	initialize: function( table, options ) {

		if(typeof table === 'string') this.table = $(table);
		else this.table = table;

		this.setOptions(options);

		this.tbody = this.table.getElement('tbody');
		if (this.options.zebra) {
			SortingTable.stripe_table(this.tbody.getChildren());
		}

		this.headers = this.table.getElement('thead').getElements('th');
		this.headers.each(function( header, index ) {
			if (header.hasClass( this.options.dont_sort_class )) { return }
			header.store( 'column', index )
			header.addEvent('mousedown', function(evt){
				this.sort_by_header(header);
				if (this.options.paginator) this.options.paginator.to_page( 1 );
			}.bind(this));
		}, this);

		this.load_conversions();
	},

	sort_by_header: function( header ){
		var rows = [];

		var before = this.tbody.getPrevious();
		this.tbody.dispose();

		var trs = this.tbody.getChildren();
		while ( row = trs.shift() ) {
			row = { row: row.dispose() };
			if ( this.options.details ) {
				row.detail = trs.shift().dispose();
			}
			rows.unshift( row );
		}

		if ( this.sort_column >= 0 && this.sort_column == header.retrieve('column') ) {
			// They were pulled off in reverse
			if ( header.hasClass( this.options.reverse_sort_class ) ) {
				header.removeClass( this.options.reverse_sort_class );
				header.addClass( this.options.forward_sort_class );
			} else {
				header.removeClass( this.options.forward_sort_class );
				header.addClass( this.options.reverse_sort_class );
			}
		} else {
			this.headers.each(function(h){
				h.removeClass( this.options.forward_sort_class );
				h.removeClass( this.options.reverse_sort_class );
			}, this);
			this.sort_column = header.retrieve('column');
			if (header.retrieve('conversion_function')) {
				this.conversion_matcher = header.retrieve('conversion_matcher');
				this.conversion_function = header.retrieve('conversion_function');
			} else {
				this.conversion_function = false;
				rows.some(function(row){
					var to_match = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					if (to_match == '') return false;
					this.conversions.some(function(conversion){
						if (conversion.matcher.test( to_match )){
							this.conversion_matcher = conversion.matcher;
							this.conversion_function = conversion.conversion_function;
							return true;
						}
						return false;
					}, this);
					return !!(this.conversion_function);
				}, this);
				header.store('conversion_function', this.conversion_function );
				header.store('conversion_matcher', this.conversion_matcher );
			}
			header.addClass( this.options.forward_sort_class );
			rows.each(function(row){
				var compare_value = this.conversion_function( row );
				row.toString = function(){
					return compare_value;
				};
			}, this);
			rows.sort();
		}

		var index = 0;
		while ( row = rows.shift() ) {
			this.tbody.appendChild(row.row);
			if (row.detail) this.tbody.appendChild(row.detail);
			if ( this.options.zebra ) {
				row.row.className = row.row.className.replace( this.removeAltClassRe, '$1').clean();
				if (row.detail)
					row.detail.className = row.detail.className.replace( this.removeAltClassRe, '$1').clean();
				if (index % 2) {
					row.row.addClass( 'alt' );
					if (row.detail) row.detail.addClass( 'alt' );
				}
			}
			index++;
		}
		this.tbody.inject(before, 'after');
		this.fireEvent('sorted', this);
	},

	load_conversions: function() {
		this.conversions = $A([
			// 1.75 MB, 301 GB, 34 KB, 8 TB
			{ matcher: /([0-9.]{1,8}).*([KMGT]{1})B/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					cell = this.conversion_matcher.exec( cell );
					if (!cell) { return '0' }
					if (cell[2] == 'M') {
						sort_val = '1';
					} else if (cell[2] == 'G') {
						sort_val = '2';
					} else if (cell[2] == 'T') {
						sort_val = '3';
					} else {
						sort_val = '0';
					}
					var i = cell[1].indexOf('.')
					if (i == -1) {
						post = '00'
					} else {
						var dec = cell[1].split('.');
						cell[1] = dec[0];
						post = dec[1].concat('00'.substr(0,2-dec[1].length));
					}
					return sort_val.concat('00000000'.substr(0,2-cell[1].length).concat(cell[1])).concat(post);
				}
			},
			// 1 day ago, 4 days ago, 38 years ago, 1 month ago
			{ matcher: /(\d{1,2}) (.{3,6}) ago/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					cell = this.conversion_matcher.exec( cell );
					if (!cell) { return '0' }
					var sort_val;
					if (cell[2].indexOf('month') != -1) {
						sort_val = '1';
					} else if (cell[2].indexOf('year') != -1) {
						sort_val = '2';
					} else {
						sort_val = '0';
					}
					return sort_val.concat('00'.substr(0,2-cell[1].length).concat(cell[1]));
				}
			},
			// Currency, or floating point with precision up to .00
			{ matcher:	/^[^\d]?((\d+|,\d{3})*(\.\d{1,2})?)$/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					cell = parseFloat(cell.replace(/^[^\d]/, "").replace(/,/g, ""));
					if (isNaN(cell)) { cell = 0; }
					cell = Math.round((cell * 100)).toString();
					return '00000000000000000000000000000000'.substr(0,32-cell.length).concat(cell);
				}
			},
			// YYYY-MM-DD, YYYY-m-d
			{ matcher: /(\d{4})-(\d{1,2})-(\d{1,2})/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					cell = this.conversion_matcher.exec( cell );
					return cell[1]+
								 '00'.substr(0,2-cell[2].length).concat(cell[2])+
								 '00'.substr(0,2-cell[3].length).concat(cell[3]);
				}
			},
			// Month day, YYYY
			{ matcher: /[A-Z][a-z]{2}\ [1-3]?[0-9]\,\ \d{4}/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					var _cData = cell.split(',');
					var _month = _cData[0].substring(0,3).toLowerCase();
					var _day = _cData[0].substring(4);
					var _year = _cData[1].substring(1);
					var _monthNum=0;

					var m = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];
					for (var i=0; i<m.length; i++) if(m[i]==_month) {_monthNum=i; break;}

					var _date = _year + (_monthNum<10 ? '0' : '') + _monthNum + (_day<10 ? '0' : '') + _day;
					return _date;
				}
			},
			// Numbers
			{ matcher: /^\d+$/,
				conversion_function: function( row ) {
					var cell = $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
					return '00000000000000000000000000000000'.substr(0,32-cell.length).concat(cell);
				}
			},
			// Fallback
			{ matcher: /.*/,
				conversion_function: function( row ) {
					return $(row.row.getElementsByTagName('td')[this.sort_column]).get('text');
				}
			}
		]);
	}

});

SortingTable.removeAltClassRe = new RegExp('(^|\\s)alt(?:\\s|$)');
SortingTable.implement({ removeAltClassRe: SortingTable.removeAltClassRe });

SortingTable.stripe_table = function ( tr_elements	) {
	var counter = 0;
	tr_elements.each( function( tr ) {
		if ( !tr.hasClass('collapsed') ) counter++;
		tr.className = tr.className.replace( this.removeAltClassRe, '$1').clean();
		if (counter % 2) tr.addClass( 'alt' );
	});
}

function close_message_box() {
  var myHorizontalSlide = new Fx.Slide('message-box');
  myHorizontalSlide.toggle();
}


