/**
 * app.js @ emp.lt
 */

if (typeof($app) == 'undefined'){ var $app = {}; };

jQuery.extend($app, {
	debug: 				true,
	initialized:		false,
	i18n:{},
	ajax:	{
		timeout:		10000
	},	
	opts: {
		formValidation:	{
			'formWasteDisposal':{
				autoValidate: true,
				rules: {
					'data[wasteDisposal][district]':	{ required:true },
					'data[wasteDisposal][address]':		{ required:true },
					'data[wasteDisposal][name]':		{ required:true },
					'data[wasteDisposal][phone]':		{ required:true }
				},
				messages:{}
			}
		}
	},
	initialize: function() {		
		var args = arguments;
		if (typeof($app.base) != 'string')
			return false;
		
		if (!$app.initialized){		
			jQuery.ajaxSetup({timeout: $app.ajax.timeout});
			if(typeof($app.language) == 'string'){
				//$app.loadScript($app.base + 'js/app.i18n/i18n-' + $app.language + '.js');
				jQuery.ajax({url:$app.base + 'js/app.i18n/i18n-' + $app.language + '.js',type:'GET',dataType:'script',async:false,cache:true});
			}
			if(args.length){
				jQuery(document).ready(function(){
					jQuery.each(args,function(i,v){$app.setup(v);});
					jQuery.extend($app,{initialized:true});
				});
			}
		}
		return true;
	},
	loadScript: function(filename){
        $app.log('loadScript: filename=' + filename);
		if(jQuery.browser.safari) {
			jQuery.ajax({url:filename,type:'GET',dataType:'script',async:false,cache:true});
		} else {
			if (jQuery.browser.msie) {
				document.write('<script charset="utf-8" type="text/javascript" src="'+filename+'"></'+'script>');
			} else {
				var h = document.getElementsByTagName('head')[0], s = document.createElement('script');
				s.setAttribute('type', 'text/javascript');
				s.setAttribute('language', 'javascript');
				s.setAttribute('src', filename);				
				h.appendChild(s);
			}
		}
    },
	setup: function() {		
		var $appSetupCallbacks = {
			
			formValidationSetup: function(){				
				var formId = (arguments[0]||false);
				if($app.initialized == false){				
					var _i18nMsgs = false;					
					if(!jQuery.isEmptyObject($app.i18n) && (_i18nMsgs = jQuery.isPlainObject($app.i18n.formValidationDefaultMessages)))
							jQuery.extend(jQuery.validator.messages,$app.i18n.formValidationDefaultMessages);
					
					jQuery.validator.setDefaults({
						submitHandler: function(f) { f.submit(); }
					});
				}
				
				jQuery.each($app.opts.formValidation,function(f,opts){
					if((!formId && opts.autoValidate!==true) || (formId && formId != f))
						return;
					var f = jQuery('#'+f);
					if(f.length && opts.rules){
						f.validate(opts);
					}
				});				
			},
			
			formSetup: function(){
				var opts = arguments[0], elF = $('#'+opts.id);
				if(!opts.id)
					return;
				
				switch(opts.id){
					case 'formProductChart':						
						var oS = {'date':new Date(),'YMD':[]},
							oE = {'date':new Date(),'YMD':[]};						
						
						opts = jQuery.extend({},opts,{
							'startTime':oS.date.getTime(),
							'endTime':oE.date.getTime()
						});
						
						var	arrElIn = [ 
								$('#'+opts.start).hide().data('date',(new Date()))[0], 
								$('#'+opts.end).hide().data('date',(new Date()))[0] 
							],
							setTimeRange = function(){ 								
								if(arguments[1]){
									oS.date.setTime(arguments[1]); 
									oS.YMD = [parseInt(oS.date.getFullYear()),parseInt(oS.date.getMonth()),parseInt(oS.date.getDate())];
									if($(arrElIn[0]).data('defaultYMD')){
										var arrYMD = $(arrElIn[0]).data('defaultYMD');											
										$(arrElIn[0]).data('YMD',[arrYMD[0],arrYMD[1],arrYMD[2]]).data('date').setTime((new Date(arrYMD)).getTime());
									}else{
										$(arrElIn[0]).data('YMD',[oS.YMD[0],oS.YMD[1],oS.YMD[2]]).data('date').setTime(oS.date.getTime());
									}
								}
								if(arguments[2]){
									oE.date.setTime(arguments[2]);  
									oE.YMD = [parseInt(oE.date.getFullYear()),parseInt(oE.date.getMonth()),parseInt(oE.date.getDate())];
									if($(arrElIn[1]).data('defaultYMD')){
										var arrYMD = $(arrElIn[1]).data('defaultYMD');											
										$(arrElIn[1]).data('YMD',[arrYMD[0],arrYMD[1],arrYMD[2]]).data('date').setTime((new Date(arrYMD)).getTime());
									}else{
										$(arrElIn[1]).data('YMD',[oE.YMD[0],oE.YMD[1],oE.YMD[2]]).data('date').setTime(oE.date.getTime());
									}									
								}								
								updateAll();
							},
							dateUpdateHandler = function(ev){								
								var evT = $(ev.target), 								
									isElE = (ev.target==arrElIn[1]),
									arrYMD = evT.data('YMD'), arrRangeYMD = [],
									eqS = [ (arrYMD[0]==oS.YMD[0]), (arrYMD[1]==oS.YMD[1]), (arrYMD[2]==oS.YMD[2]) ],
									eqE = [ (arrYMD[0]==oE.YMD[0]), (arrYMD[1]==oE.YMD[1]), (arrYMD[2]==oE.YMD[2]) ];
								
								if(!isElE){									
									arrRangeYMD[0] = jQuery.range(oS.YMD[0],oE.YMD[0]);
									arrRangeYMD[1] = jQuery.range((eqS[0]?oS.YMD[1]+1:1),(!eqE[0]?12:oE.YMD[1]+1));									
									arrRangeYMD[2] = jQuery.range((eqS[0]&&eqS[1]?oS.YMD[2]:1),!(eqE[0]&&eqE[1])?(32-(new Date(arrYMD[0],arrYMD[1],32)).getDate()):oE.YMD[2]);
								}else{
									var arrSYMD = $(arrElIn[0]).data('YMD');
									arrRangeYMD[0] = jQuery.range(arrSYMD[0],oE.YMD[0]);
									arrRangeYMD[1] = jQuery.range((arrSYMD[0]==arrYMD[0]?arrSYMD[1]+1:1),(!eqE[0]?12:oE.YMD[1]+1));
									arrRangeYMD[2] = jQuery.range(((arrSYMD[0]==arrYMD[0]&&arrSYMD[1]==arrYMD[1])?arrSYMD[2]:1),!(eqE[0]&&eqE[1])?(32-(new Date(arrYMD[0],arrYMD[1],32)).getDate()):oE.YMD[2]);
								}
								
								$('#'+ev.target.id+'_Y,#'+ev.target.id+'_M,#'+ev.target.id+'_D').each(function(k,el){
									var el = $(el);
									el.removeOption(/./);
									if(el[0].name!='_M'){
										for(var i in arrRangeYMD[k])
											el.addOption(arrRangeYMD[k][i],arrRangeYMD[k][i],arrRangeYMD[k][i]==arrYMD[k]);
									}
									else{											
										for(var i in arrRangeYMD[k])											
											el.addOption(arrRangeYMD[k][i],$app.i18n.date.monthNames[(arrRangeYMD[k][i]-1)],(arrRangeYMD[k][i]-1)==arrYMD[k]);
									}
								});
								
								evT.val(([
									arrYMD[0],
									((String(arrYMD[1]+1).length==1)?'0'+String(arrYMD[1]+1):arrYMD[1]+1),
									((String(arrYMD[2]).length==1)?'0'+String(arrYMD[2]):arrYMD[2])
								]).join('-'));
								
								if(isElE && arguments[1] && jQuery.isFunction(arguments[1]))
									evT.trigger('after');																
							},
							dateChangeHandler = function(ev){
								var evT = $(ev.target), 						
									isElE = (ev.data==arrElIn[1]),
									arrYMD = $(ev.data).data('YMD'),
									arrEYMD = $(arrElIn[1]).data('YMD');
								switch(ev.target.name){
									case '_Y':
										arrYMD[0] = parseInt(evT.selectedValues()[0]);
										break;
									case '_M':
										arrYMD[1] = parseInt(evT.selectedValues()[0])-1;
										break;
									case '_D':
										arrYMD[2] = parseInt(evT.selectedValues()[0]);
										break;
								}
								
								if(!isElE && arrEYMD[0]<arrYMD[0]){
									arrEYMD[1] = arrYMD[1];
									arrEYMD[2] = arrYMD[2];
									$(arrElIn[1]).data('YMD',arrEYMD);
								}
								
								$(ev.data)
									.data('YMD',arrYMD)
									.trigger('dateUpdate');								
								$(arrElIn[1])
									.trigger('dateUpdate')
									.trigger('after');								
							},
							afterChangeHandler = function(){								
								if(opts.after && jQuery.isFunction(opts.after)){
									opts.after({
										form:$('#'+opts.id)[0],
										start:arrElIn[0],
										end:arrElIn[1]
									});	
								}
							},
							updateAll = function(){
								jQuery.each(arrElIn,function(){
									var el = arguments[1];
									if(!elF.find('select[rel='+el.id+']').length){									
										if(el.value){
											var arrYMD = arrElIn[0].value.split('-');
												arrYMD = [parseInt(arrYMD[0]),(parseInt(arrYMD[1])-1),parseInt(arrYMD[2])];
											$(el).data('defaultYMD',arrYMD);
										}
										
										$(el).after(
												'<select name="_Y" id="'+el.id+'_Y" rel="'+el.id+'"></select>'+
												'<select name="_M" id="'+el.id+'_M" rel="'+el.id+'"></select>'+
												'<select name="_D" id="'+el.id+'_D" rel="'+el.id+'" style="display:none;"></select>')
											.bind('dateUpdate',dateUpdateHandler);	
										
										$('#'+el.id+'_Y,#'+el.id+'_M,#'+el.id+'_D')
											.bind('change',el,dateChangeHandler);
										$(el)											
											.bind('after',afterChangeHandler)
											.trigger('dateUpdate',function(){$(this).trigger('after')});
									}else{
										$(el).trigger('dateUpdate');										
									}
								});								
							};
							
							elF.bind('timeRange',setTimeRange);
							elF.trigger('timeRange',[opts.startTime,opts.endTime]);
						
						break;
				}		
			},
			chartSetup: function(){
				var opts = arguments[0];				
				if(!opts.id || !opts.form)
					return;
				var f = $(opts.form);
				
				jQuery.ajax({
					url:f.attr('action'),					
					type:'POST',
					dataType:'json',
					cache:false,
					data: f.serialize(),
					success: function(data){						
						if(!f.data('setTimeRange')){							
							$('#formProductChart').trigger('timeRange',[data.startTime,data.endTime]);							
							f.data('setTimeRange',true);							
						}						
						if(!data.datasets)
							return;											
						jQuery.plot($('#'+opts.id), data.datasets,{ 
							 xaxis: { mode: 'time', timeformat: '%m/%y' },
							 yaxis: { min: -1.0, tickFormatter: function (v, axis) { return v.toFixed(axis.tickDecimals) +'Lt' }},						
							 legend: { position: 'sw', backgroundOpacity:.6, margin:[10,10] } 
						});							 
					},
					error: function(){}
				});
			},
			
			listingProductsSetup: function(){
				var t = $('.listing-products table'), tTrs;
				if(!t.length)
					return;
				tTrs = t.find('tr')
					.filter(function(){ $(this).data('children',$(this).find('td'));  return ($(this).data('children').length); /*console.log(arguments[1].firstChild);  return (this.firstChild && this.firstChild.nodeName=='TD')*/ })
					.css({'cursor':'pointer'})
					.bind({
						'click': function(){ window.location.href = $(this).find('td a[href]').attr('href'); return false;	},
						'mouseover': function(){ $(this).find('td').css({'background-color':'#EFFFDF'}); },
						'mouseout': function(){ $(this).find('td').css({'background-color':'#FFFFFF'}); }
					});
				
			},
			
			printSetup: function(){
				var handler, contents, title;
				if((handler = $('.ctrl-content-toolbar a.ctrl-print')) && handler.length && $('div#contents').length){					
					handler.click(function(){
						contents = $('div#contents').clone().html();
						contents = contents.replace(/<!(?:--[\s\S]*?--\s*)?>\s*/g,'').replace(/<(iframe|script|noscript|object|embed)\b[^>]*>[\s\S]*?<\/\1>/ig,'')
						contents = $('<div>').append(contents);					
						contents.find('.ctrl-content-toolbar,.jump-nav-bar').remove();						
						var w=window.open('about:blank','dummyPrintWindow','menubar=yes,location=no,resizable=yes,scrollbars=yes,status=no');						
						w.document.open();
						w.document.write(([
							'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
							'<html>',
							'<head><title>'+document.title+'</title>'+$('<div>').append($('style,link[type="text/css"]').clone()).html()+'</head>',
							'<body onload="window.focus();window.print();" class="page-print">',
							'<div id="contents">'+contents.html()+'</div>',
							'</body>',
							'</html>'
						]).join("\r\n"));
						w.document.close();
						return false;
					});
				}
			},			
			portletMetalStockPricesSetup: function(){
				var container = $('#'+arguments[0]);
				if(container.length){					
					container.data('hasSelected',false)
					.find('.price-container').filter(function(){
						var el = $(this).find('.price-toggleable-info').hide();
						if(el.length)
							$(this).addClass('has-toggleable-info').data('priceToggleableInfo',el);
						return (el.length>0);
					})					
					.bind({
						'click': function(ev){
							var el = $(this);
							if($(ev.target).is('a'))
								return;							
							el.toggleClass(function(){
								var elT = el.data('priceToggleableInfo'), 
									elClass = '';
									if($(elT).is('.single'))
										return $(elT).attr('class');
								if(container.data('hasSelected')){
									container.find('.price-container.selected').removeClass('selected').each(function(){ 
										if(el[0] != $(this)[0]){
											$(this).data('priceToggleableInfo').hide();
											container.data('hasSelected',false);
										}
									});
								}								
								if(elT[0].style.display=='none'){
									elClass = 'selected';
									el.data('priceToggleableInfo').show();
									container.data('hasSelected',true);
								}
								else
									el.data('priceToggleableInfo').hide();								
								return elClass;
							});
							
						},
						'mouseover': function(){ $(this).css({'background-color':'#EFFFDF'}); },
						'mouseout': function(){ $(this).css({'background-color':'#FFFFFF'}); }
					});
				}
			},
			applyCatalystsCurrencyRatesSetup: function(){
				var opts = arguments[0], 
					t = $('.listing-products table');
				
				if(!t.length || typeof($app.currencies) == 'undefined' || typeof($app.currencies[opts.currency]) == 'undefined')				
					return;
				$app.log('$app.currencies loaded=true');
				
				t.find('td').each(function(){
					var el = $(arguments[1]), iC = el.parent('tr').find('td').length;				
					if((iC == 4 && el.index() != 2) || (iC == 5 && el.index() != 3))
						return;
					if(!(/[0-9]/.test(el.text())) || el.find('a').length)
						return;
					
					var arrPrice = el.text().replace(/\-/g,' - ').replace(/\s+/g,' ').split(' '), i;
					for(i=0;i<arrPrice.length;i++){						
						if(!arrPrice[i].length || isNaN(arrPrice[i]))
							continue;
						arrPrice[i] = Math.round((parseFloat(arrPrice[i])/parseFloat($app.currencies[opts.currency]))*100)/100;
					}
					el.text(arrPrice.join(' '));					
				});
			}
		};
		
		var callback = arguments[0]+'Setup';
		if (jQuery.isFunction($appSetupCallbacks[callback]))
			$app.log('setup: call=$app.'+callback+': ret='+$appSetupCallbacks[callback](arguments[1]||null));			
	},
	log: function() {		
		if (window['loadFirebugConsole'] && $app.debug && window.console && window.console.log && arguments.length) window.console.log.apply($app, arguments);			
	}
	
});

$app.initialize('formValidation','listingProducts','print');