/* -------------------------------------------------------------------- */
/* TRADE.CH Website - common.js 08-30-2007 */
/* Version: 1.0 */
/* Created by: net4visions.com */
/* Last edited: 07-30-2008 */
/* Requirements: mootools 1.2.js
/* -------------------------------------------------------------------- */

var Site = new Class({
	Implements: [Options, Events],
	
	options: {
		smoothTabs: 		true,
		externalLinks: 		true,
		allowChart:			true,
		allowChartDrag: 	true,
		zebraTable:			true,
		srcChartUS:			'http://ichart.finance.yahoo.com/t',
		srcChartDE:			'http://de.ichart.yahoo.com/t'
	},
	
	initialize: function(options) {		
		this.setOptions(options);	
		this.lang = $('tvLang').get('value');
		
		this.loader = new Element('span', {
			'id'	 : 'loader',			
			'styles' : {
				'float'	: 'right',				
				'height'	: '20px',
				'width'	: '20px',
				'margin'	: '0 5px 0 0'				
			}
		});
		
		//this.url = (Browser.Engine.ie) ? 'assets/site/inc/retrieveData.php' : 'http://localhost/sites/trade.ch/assets/site/inc/retrieveData.php';	
		//this.url = (Browser.Engine.ie) ? 'assets/site/inc/retrieveData.php' : 'http://www.trade.ch/assets/site/inc/retrieveData.php';	
		this.url = './assets/site/inc/retrieveData.php'; 
		this.indices();
		this.quickBtns();
		this.faqSlide();
		this.extLinks();
		this.setTabs();
		this.quotes();	
		this.zebraTable();
		this.sortTable();
	},
	
	// slide quick buttons
	quickBtns: function() { // slide buttons on page 'trade, handel'
		var els =  $$('ul#quickBtn li a');
		if (els.length == 0) return false;
		
		var fx = els.map(function(el) {
			return new Fx.Tween(el, { 	duration: 'short', unit: '%', transition: Fx.Transitions.linear, wait: false });
		});
		
		els.each( function(el, idx) {			
			el.addEvent('mouseenter', function(evt) {
				evt.stop();
				fx[idx].start('background-position', '95 50', '85 50');						
			});
			
			el.addEvent('mouseleave', function(evt) {
				evt.stop();
				fx[idx].start('background-position', '85 50', '95 50');
			});	
		});	
	},
	
	// slide faqs
	faqSlide: function() { // faq - requently asked questions
		var els = $$('dl.faq-container dd.content');
		if (els.length == 0) return false;
		
		var fx = els.map(function(el) {
			return new Fx.Slide(el, { 	duration: 'normal', mode: 'vertical', transition: Fx.Transitions.Quad.easeOut, wait: false	}).hide();
		});	
		
		$$('dl.faq-container dt.title a').each( function(el, idx) {			
			el.addEvent('click', function(evt) {
				evt.stop();
				fx[idx].toggle();				
			});	
		});	
	},
	
	// indices
	indices: function() {
		if (!$defined($('accIndices'))) return false;		
		var el = $('accIndices');
		this.loader.inject(el.getPrevious(), 'top');		
		this.requestData( el, { 'type': 'dlIndices' });
	},

	// accordion - quotes
	quotes: function(togglers, elements) {
		this.qAcc = new Accordion('dl#accQuotes dt.toggler', 'dl#accQuotes dd.section', {
			alwaysHide: 	false,
			opacity:		false,
			fixedHeight: 	370,
			display: 2
		}, $(this.qAcc));
	},
	
	// set tabs
	setTabs: function() {
		var els = $$('div.tabContainer');
		if (els.length == 0) return;
		
		els.each(function(el) {
			var id = el.get('id');
			var type = false;
			new TabSwapper({
				selectedClass:		'on',
				deselectedClass:	'off',
				mouseoverClass: 	'over',
				tabs: 				el.getElements('ul.tabSet li'),
				clickers: 			el.getElements('ul.tabSet li a'),
				sections: 			el.getElements('div.panelSet div.panel'),
				cookieName: 		id,
				smooth: 			this.options.smoothTabs,
				onActive:			function(idx, section, tab) {
					switch (id) {
						case 'tabQuotesUS': 
							type = 'tblIndex';
							break;
						case 'tabQuotesWorld':
							type = 'tblIndex';
							break;
						case 'tabQuotesCurrencies':
							type = 'tblCurrency';
							break;						
						default:
							return false;
					};
					
					// request data
					var ticker = tab.getFirst().get('rel');
					if (ticker == 'ISO') return false;					
					this.loader.inject(section.getFirst(), 'top');					
					this.requestData(section.getLast(), { 'type': type, 'ticker': ticker });			
				}.bind(this)
		   })
		}.bind(this))
	},
	
	// request data from Yahoo
	requestData: function(el, args) {
		this.loader.show();
		var options = {
				lang  : this.lang,
				random: $time()			
		}		
		$extend(args, options);
		
		new Request({			
			method: 'get',
			url: this.url,
			autoCancel: true,
			data: Hash.toQueryString(args),			
			onSuccess: function(responseText) {				
				el.set('html', responseText);
				this.addChartEvent(el);				
				this.loader.hide.delay(500, this.loader);
			}.bind(this),
			onFailure: function() {
				this.loader.hide.delay(500, this.loader);
				el.set('text', 'Unable to load data...');				
			}.bind(this)
		}).send();		
	},
	
	// add events to show charts
	addChartEvent: function(el) {		
		var tbl = el.getFirst();		
		tbl.getElements('td a.chart').each(function(item, idx) {
			if (this.options.allowChart) {						   
				item.addEvent('click', function(evt) {
					evt.stop();
					var pos = [evt.client.x, evt.client.y];
					this.showChart(item.get('rel'), pos);
				}.bind(this));
			} else {
				item.hide();
			}
		}.bind(this));							 
					
		this.zebraTable();
	},
	
	// show chart
	showChart: function(ticker, pos) {		
		this.oChart = ($chk(this.oChart)) ? this.oChart : this.setChart();
		
		// position chart - move to icon that was clicked
		if (!this.oChart.moved) this.oChart.container.set('styles', { 'top' : (pos[1] - 115), 'left' : (pos[0] - 225) });
		
		// update chart url depending on selected accordion
		var url = (this.qAcc.previous == 0) ? this.options.srcChartUS : this.options.srcChartDE; 		
		this.oChart.image.set('src', url + '?s=' + ticker);
		
		// show chart if not visible		
		if (!this.oChart.visible) {			
			this.oChart.fx.start(1);
			this.oChart.visible = true;
		}
		
	},
	
	// set chart
	setChart: function() {
		var obj = {};
		obj.container = new Element('div', {
			id: 'chartContainer'
		}).inject($(document.body), 'top');
		obj.image = new Element('img', {
			id: 'chartImage',
			src: 'assets/site/images/spacer.gif', title: ''
		}).inject(obj.container);
		obj.exit = new Element('img', {
			id : 'chartExit',
			src: 'assets/site/images/exit.png',
			title: '',			
			events: {
				click : function(evt) {
					evt.stop();
					obj.fx.start(0);
					obj.visible = false;
					obj.moved = false;					
				}.bind(this)
			}
		}).inject(obj.container, 'top');	
		obj.visible =	false,
		obj.moved = 	false,
		obj.fx = new Fx.Tween(obj.container, { property: 'opacity' });
		obj.fx.set(0);

		// make chart draggable		
		if (this.options.allowChartDrag) {
			obj.container.makeDraggable({
				snap : 10,
				container : $('main'),
				onDrag : function() {
					obj.moved = true;	
				}.bind(this)
			});
		}
		
		return obj;		
	},
	
	// zebra tables
	zebraTable: function(tbl) {
		if (!this.options.zebraTable) return;
		
		var trs = ($chk(tbl)) ? tbl.getElements('tbody tr') : $$('tbody tr');		
		trs.each(function(tr, idx) {			  
			// colorize row
			tr.removeClass('alt');
			if (idx % 2) tr.addClass('alt');
			
			// hover row
			if (!tr.hasClass('section')) {						 
				tr.addEvent('mouseenter', function() {
					tr.addClass('over');								   
				});
				tr.addEvent('mouseleave', function() {
					tr.removeClass('over');								   
				});
			}			
			
		});	
	},

	// sort iso code table
	sortTable: function() {		
		var el = $('isoCode');
		if ($chk(el)) {
			new SortingTable(el, {
				zebra: this.options.zebraTable,
				paginator: false,
				forward_sort_class: 'asort',
				reverse_sort_class: 'dsort'
			});
			
		}
		return false;
	},

	// highlight external links
	extLinks: function() {
		if(!this.options.externalLinks) return false;		
		$$('div#content a[target=_blank]').each(function(el) {
			if (!el.hasClass('bttn')) {
				el.addClass('external');
			}
		});
	}
});


// domready - init site
window.addEvent('domready', function() {								 
	var site = new Site();	
});