/**
 *  [styleswitcher.js]
 */
function getAvailableStyleSheets()
{
	var i, j, a, availableStyles;
	availableStyles = new Array();
	j = 0;
	for( i = 0; ( a = document.getElementsByTagName( "link" )[i]); i++ )
	{
		if( a.getAttribute( "rel" ).indexOf( "style" ) != -1
			&& a.getAttribute( "title" ) )
		{
			availableStyles[j] = a.getAttribute( "title" );
			j++;
		}
	}
	
	return availableStyles;
}

function setActiveStyleSheet(title) {
  var i, a, main;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
      a.disabled = true;
      if(a.getAttribute("title") == title) a.disabled = false;
    }
  }
}

function getActiveStyleSheet() {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
  }
  return null;
}

function getPreferredStyleSheet() {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1
       && a.getAttribute("rel").indexOf("alt") == -1
       && a.getAttribute("title")
       ) return a.getAttribute("title");
  }
  return null;
}

function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

/*window.onload = function(e) {
  var cookie = readCookie("style");
  var title = cookie ? cookie : getPreferredStyleSheet();
  setActiveStyleSheet(title);
}

window.onunload = function(e) {
  var title = getActiveStyleSheet();
  createCookie("style", title, 365);
}

var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);*/
/**
 *  [/styleswitcher.js]
 */

/**
 *  [chui.js]
 *    interactivity layer for chui
 *    @author stephen karl lang
 */
Element.extend({
	draggableTag: function(handle) {
		handle = handle || this;
		this.makeDraggable({
			'handle': handle,
			
			'onStart': function() {
				Chui.removeTips();
				this.original = this.element;
				
				var now = {'x': this.element.getLeft() - 5, 'y': this.element.getTop() - 65};
				this.element = this.element.clone().setStyles({
					'position': 'absolute',
					'left': ( now.x ) + 'px',
					'top':  ( now.y ) + 'px',
					'opacity': '0.3'
				}).injectInside($('module_wrapper'));
				this.original.setStyle('border', '5px solid #6f6');
				this.value.now = now;
			},
			
			'onDrag': function() {
				// snap to grid, constrain to left and top of module sub wrapper
				var snap = 6;
				var constraints = {
					'x': ( this.value.now.x = (
						( this.value.now.x < -5 )
						? -5
						: ( this.value.now.x - ( this.value.now.x % snap ) ) ) ),

					'y': ( this.value.now.y = (
						( this.value.now.y < -5 )
						? -5
						: ( this.value.now.y - ( this.value.now.y % snap ) ) ) )
				};
				
				this.element.setStyles({
					'top': constraints.y + 'px',
					'left': constraints.x + 'px'
				});
			},

			'onComplete': function() {
				oldPos = this.original.getPosition();
				newPos = this.element.getPosition();
				
				this.original.setStyles({
					'top': newPos.y,
					'left': newPos.x
				});
				
				this.element.setStyle('opacity','1');
				
				Chui.storePosition(
					this.element.id.replace( "mod_", "" ),
					oldPos,
					newPos,
					true );
				
				this.element = this.original;
				this.original.remove();
				this.element.setStyle('border', '5px solid #333');
				Chui.addTips();
				Chui.setupFx();
				Chui.setupDrag();
				Chui.setupModuleOptions( this.element.id );
				$$('.module_icon').addEvent('click',function(){
					Chui.changeTitleToInputBox( this.parentNode.parentNode.id + '_dragHandle' );
				});
			}
		});

		this.setStyle( 'position', '' );
		return this;
	}
});

var Chui = {
	
	init: function()
	{
		$$('#footer a','#footer abbr','#footer acronym').addClass('toolTip');
		$$('.module_icon').addEvent('click',function(){
			Chui.changeTitleToInputBox( this.parentNode.parentNode.id + '_dragHandle' );
			return false;
		});
		this.setupModules();
		this.addTips();
	},
	
	setupDrag: function()
	{
		$$('.module_sub_wrapper').each( function( module_sub_wrapper )
		{
			if( $type( module_sub_wrapper.draggableTag ) != 'object' &&
				$type( module_sub_wrapper.fx ) != 'object' )
			{
				module_sub_wrapper.draggableTag( module_sub_wrapper.id + '_dragHandle' );
				
				new Drag.Base( module_sub_wrapper.id+'_content', {
					handle: module_sub_wrapper.id + "_resize",
					modifiers: { y: 'height' },
					
					onStart: function(){
						Chui.removeTips();
						this.oldHeight = $(module_sub_wrapper.id + '_content').getStyle('height').toInt();
						$(module_sub_wrapper.id + '_content').setStyle('max-height','');
					},
					
					onComplete: function(){
						Chui.addTips();
						var h = $(module_sub_wrapper.id + '_content').getStyle('height').toInt();
						var hOld = this.oldHeight;
						
						var heightChanged = ( h == hOld ) ? false : true;
						
						if( heightChanged )
						{
							module_sub_wrapper.getElementsBySelector('.module_option').each( function( module_option ){
								if( module_option.value == "-" || module_option.value == "+" )
								{
									if( h <= 1 )
									{
										module_option.value = "+";
										module_option.src = "images/maximise_16x16.gif";
										module_option.title = "Maximise module";
										Chui.storeMinimised( module_sub_wrapper.id.replace('mod_',''), 1 );
										$(module_sub_wrapper.id + '_content').setStyle('max-height',hOld+'px');
										$(module_sub_wrapper.id + '_content').fx.expandedHeight = hOld;
									}
									else
									{
										module_option.value = "-";
										module_option.src = "images/minimise_16x16.gif";
										module_option.title = "Minimise module";
										Chui.storeExpandedHeight( module_sub_wrapper.id.replace('mod_',''), h );
										$(module_sub_wrapper.id + '_content').setStyle('max-height',h+'px');
										$(module_sub_wrapper.id + '_content').fx.expandedHeight = h;
										if( hOld <= 1 )
											Chui.storeMinimised( module_sub_wrapper.id.replace('mod_',''), 0 );
									}
								}
							});
						}
					}
					
				} );
				
				module_sub_wrapper.fx = new Fx.Style( module_sub_wrapper, 'opacity', {
					duration: 500,
					transition: Fx.Transitions.quartInOut
				});
			}
		});
	},
	
	setupFx: function()
	{
		$$('.module_content').each( function( module ){
			if( $type( module.fx ) != 'object' )
			{
				module.fx = new Fx.Style( module, 'height', {
					duration: 1000,
					transition: Fx.Transitions.bounceOut,
					
					onStart: function(){
						var h = this.getStyle('height').toInt();
						
						module.parentNode.getElementsBySelector('.module_option').each( function( module_option ){
							if( module_option.value == "-" || module_option.value == "+" )
							{
								if( h )
								{
									module_option.value = "+";
									module_option.src = "images/maximise_16x16.gif";
									module_option.title = "Maximise module";
								}
								else
								{
									module_option.value = "-";
									module_option.src = "images/minimise_16x16.gif";
									module_option.title = "Minimise module";
								}
							}
						});
					}.bind( $(module.id) )
				});
				
				Object.extend( module.fx, {
					expandedHeight: module.getStyle('max-height').toInt() ?
					module.getStyle('max-height').toInt() : module.getStyle('height').toInt()
				});
			}
		});
	},
	
	setupModuleOptions: function( el ){
		el = $chk(el) ? $$('#'+el+' input') : $$('.module_options input','.module_sub_options input');
		
		el.each( function( module_option )
		{
			module_option.addEvent( 'mouseover', function(){
				this.setStyle( 'background-color', '#666' );
			});
			
			module_option.addEvent( 'mouseout', function(){
				this.setStyle( 'background-color', '' );
			});
			
			module_option.addEvent( 'click', function(){
				this.blur();
			});
			
			switch( module_option.value )
			{
				case '+':
				case '-':
					module_option.addEvent( 'click', function(){
						Chui.toggleMinimise( this.parentNode.parentNode.id );
					});
					break;
				
				case 'refresh':
					module_option.addEvent( 'click', function(){
						Chui.getContent( this.parentNode.parentNode.id.replace( 'mod_', '' ) );
					});
					break;
				
				case 'x':
					module_option.addEvent( 'click', function(){
						Chui.closeModule( this.parentNode.parentNode.id );
					});
					break;
				
				case '?':
					module_option.setStyle( 'cursor', 'help' );
					break;
			}
		});
	},
	
	closeModule: function(id)
	{
		var title = $(id+'_dragHandle').innerHTML;
		
		if( confirm( "Do you really want to close '" + title + "'?" ) )
		{
			$(id).setStyle( 'visibility', 'hidden' );
			this.deleteModule( id.replace( 'mod_', '' ) );
		}
	},
	
	changeTitleToInputBox: function(id)
	{
		var el = $(id);
		var oldTitle = el.innerHTML;
		$(el.parentNode.parentNode.id).draggableTag = null;
		
		el.innerHTML = "<input type=\"text\" id=\"" + id + "_titleInput" + "\" value=\"" + oldTitle +
			"\" style=\"width: " + el.getStyle('width') + "; height: " + el.getStyle('height') + "; font-size: x-small;\" />";
		
		var inputBox = $(id+'_titleInput');
		
		inputBox.focus();
		inputBox.select();
		
		inputBox.addEvent('keyup',function(event){
			var event = new Event(event);
			if( event.key == 'enter' )
			{
				if( this.getValue() )
					Chui.changeInputBoxToTitle( this );
				else
				{
					alert( "Please enter a title for this module" );
					this.focus();
					this.select();
				}
			}
		});
		
		inputBox.addEvent('blur',function(event){
			if( this.getValue() )
				Chui.changeInputBoxToTitle( this );
			else
			{
				alert( "Please enter a title for this module" );
				this.focus();
				this.select();
			}
		});
	},
	
	changeInputBoxToTitle: function(id)
	{
		var el = $(id);
		el.parentNode.innerHTML = el.getValue();
		this.setupDrag();
	},
	
	removeTips: function()
	{
		$$('div.tool-tip').each( function( el ){
			el.remove();
		});
		
		$$('.toolTip').each( function( el ){
			if( el.myText ) el.title = el.myText;
		});
	},
	
	addTips: function()
	{
		var myTips = new Tips( $$('.toolTip'), {
			maxTitleChars: 50
		});
	},
	
	refreshTips: function()
	{
		this.removeTips();
		this.addTips();
	},
	
	toggleStyle: function()
	{
		var i, j, x, active, available;
		
		active = getActiveStyleSheet();
		available = getAvailableStyleSheets();
		
		for( i = 0; i < available.length; ++i )
		{
			if( available[i] == active )
			{
				x = i;
				break;
			}
		}
		
		if( x != null )
		{
			j = ( x == ( available.length - 1 ) ) ? 0 : ++x;
			setActiveStyleSheet( available[j] );
			this.saveTheme( available[j] );
		}
		else
		{
			alert('Sorry, failed to change theme. Please try again later.');
		}
	},
	
	showHide: function( e )
	{
		var el = $(e);
		el.setStyle( 'visibility', ( ( el.getStyle( 'visibility' ) == 'hidden' ) ? 'visible' : 'hidden' ) );
	},
	
	getHiddenModules: function()
	{
		var mod_hidden = document.getElementById( "mod_hidden" );
		
		if( mod_hidden.style.display != "none" )
		{
			//lists = mod_hidden.getElementsByTagName( "UL" );
			//document.removeChild( lists );
			/*for( i = 0; i < lists.length; ++i )
				lists[i].removeChild( this );
			for( i = 0; i < mod_hidden.childNodes; ++i )
			{
				if( mod_hidden[i].nodeName == "UL" )
				{
					ul = mod_hidden[i];
					for( j = 0; j < ul.childNodes; ++j )
					{
						if( ul[j].nodeName == "LI" )
						{
							il[i].removeChild;
						}
					}
				}
			}*/
		}
		else
		{
			var hiddenModules = new Array();
			var modules = document.getElementById( "module_wrapper" ).getElementsByTagName( "DIV" );
			for( i = 0; i < modules.length; ++i )
			{
				if( modules[i].className == "module" && modules[i].style.display == "none" && modules[i].id != "mod_hidden" )
				{
					hiddenModules[ hiddenModules.length ] = new Array( modules[i].id, modules[i].getElementsByTagName( "H1" ) );
				}
			}
			
			for( j = 0; j < hiddenModules.length; ++j )
			{
				newUL = document.createElement( "UL" );
				newE = document.createElement( "LI" );
				newEText = document.createTextNode( hiddenModules[j][0] );
				newE.appendChild( newEText );
				
				newE.onclick = function()
				{
					//alert( eval( hiddenModules[j][0] ) );
					return false;
				}
				
				newUL.appendChild( newE );
				mod_hidden.appendChild( newUL );
			}	
		}
		this.showHide( "mod_hidden" );
	},
	
	setupModules: function()
	{
		this.setupDrag();
		this.setupFx();
		this.setupModuleOptions();
	},
	
	toggleMinimise: function( me )
	{
		this.removeTips();
		var m = $(me+'_content');
		var h = ( m.getStyle( 'height' ).toInt() ? 1 : 0 );
		m.fx.start( h ? 0 : m.fx.expandedHeight );
		this.addTips();
		this.storeMinimised( me.replace( 'mod_', '' ), h );
	},
	
	cascadeModules: function()
	{
		var i = 0;
		$$('.module_sub_wrapper').each( function( el ){
			var newPos = {
				'x': i,
				'y': i
			};
			Chui.storePosition( el.id.replace( 'mod_', '' ), el.getPosition(), newPos );
			el.setStyles({
				'top': newPos.y + 'px',
				'left': newPos.x + 'px'
			});
			i += 16;
		});
	},
	
	scatterModules: function()
	{
		$$('.module_sub_wrapper').each( function( el ){
			var newPos = {
				'x': $random( 0, ( window.getWidth() - 280 ) ),
				'y': $random( 60, ( window.getHeight() - 280 ) )
			};
			Chui.storePosition( el.id.replace( 'mod_', '' ), el.getPosition(), newPos );
			el.setStyles({
				'top': newPos.y + 'px',
				'left': newPos.x + 'px'
			});
		});
	},
	
	refreshAllModules: function(){
		if( confirm('Please be patient, this may take a few minutes.') )
		{
			$$('.module_sub_wrapper').each( function( el ){
				Chui.getContent( el.id.replace( 'mod_', '' ) );
			});
		}
	},
	
	loading: function( id )
	{
		$('mod_'+id).fx.start(0.5);
	},
	
	complete: function( id )
	{
		this.refreshTips();
		$('mod_'+id).fx.start(1);
	},
	
	getContent: function( id )
	{
		var obj = {
			'id': id
		};
		
		new Ajax( document.location.href + 'getContent.php', {
			method: 'post',
			postBody: obj,
			onStart: this.loading( id ),
			update: $( 'mod_' + id + '_content' ),
			evalScripts: true
		} ).request();
	},
	
	storePosition: function( id, oldPos, newPos, offset )
	{
		// check to see if module has moved
		if( newPos.x != oldPos.x || newPos.y != oldPos.y )
		{
			var obj = {
				'id': id,
				'x': offset ? newPos.x - 5 : newPos.x,
				'y': offset ? newPos.y - 65 : newPos.y
			};
			new Ajax( document.location.href + 'setPosition.php', {
				method: 'post',
				postBody: obj
			} ).request();
		}
	},
	
	getExpandedHeight: function( id )
	{
		var obj = {
			id: id
		};
		
		new Ajax( document.location.href + 'setHeight.php', {
			method: 'post',
			postBody: obj,
			evalScripts: true
		} ).request();
	},
	
	storeExpandedHeight: function( id, h )
	{
		var obj = {
			id: id,
			h: h
		};
		
		new Ajax( document.location.href + 'setHeight.php', {
			method: 'post',
			postBody: obj
		} ).request();
	},
	
	storeMinimised: function( id, m )
	{
		var obj = {
			id: id,
			m: m
		};
		
		new Ajax( document.location.href + 'setMinimised.php', {
			method: 'post',
			postBody: obj
		} ).request();
	},
	
	saveTheme: function( theme )
	{
		var obj = {
			theme: theme
		};
		
		new Ajax( document.location.href + 'saveTheme.php', {
			method: 'post',
			postBody: obj
		} ).request();
	},
	
	deleteModule: function(id)
	{
		var obj = {
			id: id
		};
		
		new Ajax( document.location.href + 'deleteModule.php', {
			method: 'post',
			postBody: obj
		} ).request();
	}
};

window.addEvent('domready', Chui.init.bind(Chui));
/**
 *  [/chui.js]
 */