//---------------------------------------------------------------------------------------------------
// cduo.js - depends on 
//         - mootools.v1.00.js
//         - ie_png_fix.js
//         - slider.js
//         - form.validator.js
//
// Copyright © 2007 - ComplementaryDuo. All rights reserved.
//---------------------------------------------------------------------------------------------------
// layout options
var LayoutConf = { narrow: 650, medium: 790, wide: 950, defaults: 900, units: 'px', transition: Fx.Transitions.backOut, duration: 500 };
// text options
var TextConf = { small_text: 1, large: 1.4, defaults: 1, units: 'em', transition: Fx.Transitions.expoInOut, duration: 300 };
// slider options
var SliderConf = { width: 160, button_width: 13, max_x: 147, min_x: 0 };

var Cduo = {
	
	start: function() {
		new Png(); // depends on ie_png_fix_2.js
		new SmoothScroll();
		if ($('delicious')) Cduo.createDeliciousTagCloud();
		if ($('toggleExtras')) Cduo.extrasToggler();
		Toolbar.create(); // depends on slider
		Layout.readDefaults();
		if ($('s')) BlogSearch.addSearchText();
		if ($('commentform')) new FormValidator($('commentform')); // depends on form.validator.js
		if ($('contactform')) new FormValidator($('contactform')); // depends on form.validator.js
	},
	
	extrasToggler: function() {
		var extras = new Fx.Slide('extrasContainerTop', {
									mode: 'vertical',
									duration: 400,
									fps: 80,
									wait: false,
									transition: Fx.Transitions.circOut,
									onComplete: function(){
										if(this.element.getStyle('margin-top') == '0px') {
											this.wrapper.setStyle('height', 'auto');
											new Fx.Scroll(window).toElement('toggleExtras');
										}
									}
								}).hide();
		$('toggleExtras').addEvent('click', function() { extras.toggle();});
	},
	
	createDeliciousTagCloud: function() {
		if( Delicious ) {
			// create necessary elems
			var heading = $E('#delicious span.rss');
			var tag_list = new Element('ul', {'id':'tag_cloud'});
			
			// get tags from del.icio.us
			for( var k in Delicious.tags) {
				var count = Delicious.tags[k];
				var tag_item = new Element('li');
				
				if( count <= 5 ) { class_size = "tag_1"; }
				if( count > 5 && count <= 10 ) { class_size = "tag_2"; }
				if( count > 11 && count <= 20 ) { class_size = "tag_3"; }
				if( count > 20 ) { class_size = "tag_4"; }
		
				var tag_link = new Element('a', {
					'href': ('http://del.icio.us/cduo/'+k.toString()),
					'class': class_size
				});
				
				tag_link.appendText(k.toString());
				tag_item.adopt(tag_link);
				tag_list.adopt(tag_item);
			}
		}
		tag_list.injectAfter(heading);
	}
};



var BlogSearch = { // customize wordpress search textbox
	addSearchText: function() { // add text to blog search texbox
		var el = $('s');
		el.value = el.value.trim();
		if( el.value.length < 1 ) el.value = 'Search blog';
		el.addEvent( 'focus', BlogSearch.removeSearchText ).addEvent( 'blur', BlogSearch.addSearchText );
	},
	removeSearchText: function() { // not sure if necessary
		var el = $('s');
		if( el.value == 'Search blog' ) el.value = '';
	}
}



var Toolbar = {
	
	create: function() {
		// Commented section doesn't work with Safari
		// --
		//div_elems = [ 'toolbar', 'reset', 'layout_slider_container', 'slider_bar', 'slider_gone_bar', 'slider_button', 'slider_empty_bar', 'text_slider_container', 'text_slider_bar', 'text_slider_gone_bar', 'text_slider_button', 'text_slider_empty_bar' ];
		//div_elems.each( function(el) { eval( "var " + el  + " = new Element( 'div' ); " + el + ".setProperty( 'id', el.toString() );" ); });
				
		var toolbar = new Element('div', { 'id': 'toolbar' });
		var reset = new Element('div', { 'id': 'reset' });
		var layout_slider_container = new Element('div', { 'id': 'layout_slider_container' });
		var slider_bar = new Element('div', { 'id': 'slider_bar' });
		var slider_gone_bar = new Element('div', { 'id': 'slider_gone_bar' });
		var slider_button = new Element('div', { 'id': 'slider_button' });
		var slider_empty_bar = new Element('div', { 'id': 'slider_empty_bar' });
		var text_slider_container = new Element('div', { 'id': 'text_slider_container' });
		var text_slider_bar = new Element('div', { 'id': 'text_slider_bar' });
		var text_slider_gone_bar = new Element('div', { 'id': 'text_slider_gone_bar' });
		var text_slider_button = new Element('div', { 'id': 'text_slider_button' });
		var text_slider_empty_bar = new Element('div', { 'id': 'text_slider_empty_bar' });
	
		toolbar.injectBefore($('container'));
	
		var clearing = new Element('div');
		clearing.setProperty('class', 'clearing');
		
		toolbar.adopt(text_slider_container);
		toolbar.adopt(clearing);
		toolbar.adopt(layout_slider_container);
		toolbar.adopt(clearing);
		toolbar.adopt(reset);
		
		text_slider_container.adopt(text_slider_bar);
		layout_slider_container.adopt(slider_bar);
		
		slider_bar.adopt(slider_gone_bar);
		slider_bar.adopt(slider_button);
		slider_bar.adopt(slider_empty_bar);
		
		text_slider_bar.adopt(text_slider_gone_bar);
		text_slider_bar.adopt(text_slider_button);
		text_slider_bar.adopt(text_slider_empty_bar);

		$('toolbar').setStyle('display', 'block');
		$('toolbar').setStyle('display', 'block'); // Show toolbar if JavaScript enabled
		Toolbar.addEffects();
		Toolbar.addSliders();
	},
	
	addEffects: function() {
		var toolbar_slide = new Fx.Style( $('toolbar'), 'left', { wait: false, duration:500, transition: Fx.Transitions.circOut, fps: 50}).set(-180);
		var toolbar_opacity = new Fx.Style( 'toolbar', 'opacity', { duaration: 200, transition: Fx.Transitions.quartInOut } );
		$('toolbar').addEvent( 'mouseover', function(event) {
													 var e = new Event(event);
													 var reltg = e.relatedTarget;
													 if( reltg ) { 
														 while($(reltg) != this && reltg.nodeName != 'HTML') reltg = reltg.parentNode; 
														 if( $(reltg) == this ) return;
														 toolbar_slide.custom( -180, 0);
														 // don't apply opacity effect cause ie7 messes up transparency
														 if (!window.ie7) toolbar_opacity.start(1,.9);
													 }
												}).addEvent('mouseout', function(event){
													var e = new Event(event);
													var reltg = e.relatedTarget;
													if( reltg ) {
														while ($(reltg) != this && reltg.nodeName != 'HTML') reltg = reltg.parentNode;
														if ($(reltg) == this) return;
														toolbar_slide.custom(0, -180)
														// don't apply opacity effect cause ie7 messes up transparency
														if (!window.ie7) toolbar_opacity.start(.9,1);
													}
												});
		$('reset').addEvent( 'click', Layout.resetToDefault );
	},
	
	addSliders: function() {
		var layout_slider = new Slider( 'slider_bar', 'slider_button', 'slider_gone_bar', 'slider_empty_bar', {
							onComplete: function(anh) {
								var max_width = Window.getWidth()-20;
								var min_width = LayoutConf.narrow;
								var diff = max_width - min_width;
								if( diff > 0 ) {
									var ratio = parseFloat(anh[0]/SliderConf.width);
									var cur_width = min_width + Math.round(ratio*diff);
									if( cur_width >= min_width ) {
										Layout.setLayoutWidth( cur_width, null );
									}
								} else {
									Layout.setLayoutWidth( min_width, null );
								}
							}
						});
		var text_slider = new Slider( 'text_slider_bar', 'text_slider_button', 'text_slider_gone_bar', 'text_slider_empty_bar', {
							onComplete: function(anh) {
								var diff = parseFloat(TextConf.large - TextConf.small_text);
								var ratio = parseFloat(anh[0]/SliderConf.width);
								var curr_size = TextConf.small_text + ratio*diff;
								if( curr_size >= TextConf.small_text ) {
									Layout.setTextSize( curr_size, null );
								}
							}
						});
	},
	
	setLayoutSliderPosition: function() { // Calculate and set layout size slider position
		var curr_width = (Cookie.get('LAYOUT_WIDTH') || LayoutConf.defaults).toInt();
		var max_width = Window.getWidth().toInt();
		var slider_position = ( max_width <= curr_width ) ? SliderConf.max_x : Math.round((SliderConf.width*(curr_width - LayoutConf.narrow))/(max_width-LayoutConf.narrow));
		var slider_empty_width = (SliderConf.width - SliderConf.button_width) - slider_position;
		$('slider_button').setStyle('left', (slider_position).toString() + 'px');
		$('slider_gone_bar').setStyle('width', (slider_position).toString() + 'px');
		$('slider_empty_bar').setStyles({
										'left': (slider_position+SliderConf.button_width).toString() + 'px',
										'width': (slider_empty_width).toString() + 'px'
										});
	},
	
	setTextSliderPosition: function() { // Calculate and set text size slider position
		var curr_size = parseFloat(Cookie.get('TEXT_SIZE') || TextConf.small_text );
		var slider_position = Math.round((SliderConf.width*(curr_size - TextConf.small_text))/(TextConf.large-TextConf.small_text));
		var slider_width = (SliderConf.width - SliderConf.button_width) - slider_position;
		$('text_slider_button').setStyle('left', (slider_position).toString() + 'px');
		$('text_slider_gone_bar').setStyle('width', (slider_position).toString() + 'px');
		$('text_slider_empty_bar').setStyles({
											 'left': (slider_position+SliderConf.button_width).toString() + 'px',
											 'width': (slider_width).toString() + 'px'
											 });
	}
}



Layout = {
	
	readDefaults: function() {
		Layout.readTextSize();
		Layout.readLayoutWidth();
		Toolbar.setTextSliderPosition();
		Toolbar.setLayoutSliderPosition();
	},
	
	readTextSize: function() {
		var text_size = parseFloat(Cookie.get('TEXT_SIZE'));
		if( text_size > TextConf.small_text ) { $$('.variableFontSize').each(function(el){ el.setStyle('fontSize', text_size+TextConf.units ); });	}
	},
	
	readLayoutWidth: function() {
		var layout_width = ( Cookie.get('LAYOUT_WIDTH') || LayoutConf.defaults ).toInt();
		if( layout_width != LayoutConf.medium ) { $$('.resizable').each( function(el){ el.setStyle('width', layout_width+LayoutConf.units ); }); }
	},
	
	resetToDefault: function() { // reset layout and text size to defaults values
		Layout.setLayoutWidth( LayoutConf.defaults, null );
		Layout.setTextSize( TextConf.defaults, null ); 
	},
	
	setTextSize: function( size, e ) { // set text size by reading from cookie or set defaults
		if( e != null ) { var e = new Event(e);	e.preventDefault();	}
		var text_size = Cookie.get('TEXT_SIZE') || TextConf.small_text.toString();
		var new_size = size.toString();
		if(( text_size != new_size ) || !text_size ) {
			$$('.variableFontSize').each( function(el) { // iterate through affected elements and change text size
				var text_size_change = new Fx.Style(el, 'fontSize', {
														duration: TextConf.duration,
														unit: TextConf.units, 
														transition: TextConf.transition,
														onComplete: function() { // remember layout width using the cookie and set slider position
															Cookie.set( 'TEXT_SIZE', new_size, { path: "/", duration: false } );
															Toolbar.setTextSliderPosition();
														}
													});
				text_size_change.custom( parseFloat(text_size), parseFloat(new_size) );
			});
		}
	},
	
	setLayoutWidth: function( size, e ) { // set the layout width by reading from cookie or set defaults
		if( e != null ) { var e = new Event(e);	e.preventDefault();	}
		var layout_width = (Cookie.get( 'LAYOUT_WIDTH' ) || LayoutConf.defaults ).toInt();
		var new_width = size.toInt();
		if(( layout_width != new_width ) || !layout_width ) {
			$$('.resizable').each( function(el) { // iterate through affected elements and change their width
				var width_change = new Fx.Style( el, 'width', { wait: false, 
												fps: 60, 
												duration: LayoutConf.duration, 
												unit: LayoutConf.units, 
												transition: LayoutConf.transition,
												onComplete: function() { // remember layout width using the cookie and set slider position
													Cookie.set( 'LAYOUT_WIDTH', new_width, { path: "/", duration: false } );
													Toolbar.setLayoutSliderPosition();
												}
											});
				width_change.custom( layout_width, new_width );
			});
		}
	}
}

window.onDomReady( function() {	Cduo.start(); });