/**
 * @author Admin
 */
(function () {
    var u = navigator.userAgent.toLowerCase(),

    is = function(t){return (u.indexOf(t)!=-1)};

    document.getElementsByTagName("html")[0].className += ([
   (!(/opera|webtv/i.test(u))&&/msie (\d)/.test(u))?('ie ie'+RegExp.$1)
	 :is('firefox/2')?'gecko ff2'
	 :is('firefox/3.6')?'gecko ff36'
	 :is('firefox/3')?'gecko ff3'
	 :is('gecko/')?'gecko'
	 :is('opera/9')?'opera opera9':/opera (\d)/.test(u)?'opera opera'+RegExp.$1
	 :is('konqueror')?'konqueror'
	 :is('chrome/')?'webkit chrome'
	 :is('applewebkit/')?'webkit safari'
	 :is('mozilla/')?'gecko':'',
	   (is('x11')||is('linux'))?' linux'
	 :is('mac')?' mac'
	 :is('win')?' win':''
	].join(''));
})();

Object.extend(App, {
	log : function () {
		if (window.console && window.console.firebug) {
			console.log.apply(console, arguments);
		}
	},
	components : {},
	init : function () {
		this.printStyles = $$("link[media='print']");
		if ($('print')) $('print').observe('click', this.print.bind(this));
		if ($('close-print')) $('close-print').observe('click', this.closePrint.bind(this));
	},
	print : function () {		
		this.printStyles.each(function(link){
			link.media = "";
		});
		Util.Dom.getBody().addClassName("print-version");
		window.print();
	},
	closePrint : function () {
		this.printStyles.each(function(link){
			link.media = "print";
		});
		Util.Dom.getBody().removeClassName("print-version");
	}
});

App.components.Accordion = Class.create(Abstract, {
	initialize : function (opts) {
		Object.extend(this, opts);
		this.ctEl = $(this.ct);
		this.items = $(this.ctEl).getElementsBySelector(this.itemSel);
		this.items.each(function(item, idx){
			item.observe("mouseover", this.select.bind(this, idx));
			/*item.observe("mouseout", function () {				
				if (Object.isNumber(this.selected))
					this.select(this.selected);
				else
					this.clear();
			}.bind(this));*/
		}.bind(this));
		if (Object.isNumber(this.selected)) {
			//this.selection = this.selected;
			this.select(this.selected);
		}
	},
	select : function (idx) {        
	    if (idx === this.selection) return;
		this.items.each(function (item, idx1) {
		   if (idx1 === this.selection) 
            item.removeClassName('big').addClassName('small');
           else if (idx == idx1)
            item.removeClassName('small').removeClassName('medium').addClassName('big'); 
           /*else
            item.removeClassName('medium').addClassName('small');   */         
		}.bind(this));		
        this.selection = idx;
	},
	clear : function () {	    
        /*this.items.each(function (item, idx) {
		   if (idx === this.selection) 
            item.removeClassName('big').addClassName('medium');
           else
            item.removeClassName('small').addClassName('medium');            
		}.bind(this));*/
        delete this.selection;
	}
});

App.components.forms = {};

App.components.forms.Search = Class.create(Abstract, {
	initialize : function (opts) {
		Object.extend(this, opts);
		if (!this.errorMsg) this.errorMsg = __('Зразок для пошуку повинен містити хоча б 3 символи');
		if (!this.emptyText) this.emptyText = __('Поиск по сайту');
		if (!App.components.forms.Search.searchValidationInited) {
			Validation.add("search_field", this.errorMsg, {
    			minLength : 3,
    			notOneOf : [this.emptyText]
        	});
			App.components.forms.Search.searchValidationInited = true;
		}
		var s = $('top_search').getElementsBySelector('.search_field')[0],
			sHideFn = function () {
				['advice-search_field-s','advice-search_field-s-arrow'].each(function (el) {
					var e = $(el);
					if (e && e.visible()) e.hide();
				});
			};			 
		['click'].each(function (evt) {
			s.observe(evt, sHideFn);
		});
 		
		var v = new Validation("top_search", {
			useEffect : false,
			onFormValidate  : function (valid) {
				if (valid) return;
				var advice = $('advice-search_field-s'),
					arrow = $('advice-search_field-s-arrow');
					form = $('top_search');
				advice.show();	
				advice.alignTo(form, 'tr-br');
				advice.setStyle({ 
					top : (parseInt(advice.getStyle('top')) + 10) + 'px'
				});					
				if (!arrow) {
					 var hideFn = function () {
					 	for (var i=0,len=arguments.length;i<len;i++) { 
					 		if (arguments[i] instanceof Element) arguments[i].hide(); 
					 	}; 
					 };
					 arrow =  Builder.node('div', { id: 'advice-search_field-s-arrow' });
					 arrow.observe("click", hideFn.bind(this, arrow, advice));
					 advice.observe("click", hideFn.bind(this, arrow, advice));
					 advice.insert({'after' : arrow });
				}
				arrow.show();
				arrow.alignTo(advice, 'br-tr');
				arrow.setStyle({ 
					top : (parseInt(arrow.getStyle('top')) + 1) + 'px'
				});				
			}
    	});
	}
});

App.components.forms.Feedback = Class.create(Abstract, {
	initialize : function (opts) {
		Object.extend(this, opts);
		var form = $('feedback_form'), 
			responseText = this.successText,
			captcha = $('recaptcha_response_field'); 
		
		if (captcha)
			captcha.addClassName('required');		
			
		var v = new Validation("feedback_form", {
			useEffect : true,
			showAdvice : true,
			stopOnFirst : false,
			onSubmit : false
		});
		
		form.observe('submit', function(e){
			Event.stop(e);
			
			if (!v.validate()) return;

			this.request({
				onCreate: function() {
					var errLines = form.getElementsBySelector('.error-line');
					errLines.each(function (line) { line.remove(); });
					form.mask(null, __('Processing..'));
				},
				onSuccess: function(transport) {
					var response = transport.responseJSON;
					if (response.success) {
						var firstLine = form.getElementsBySelector('.line')[0].parentNode;
						firstLine.update(responseText);
					} else {
						var errorsHtml = [], lines = form.getElementsBySelector('.line'),
							lastLine = lines[lines.length-1], text;

						response.errors.each(function(error){
							errorsHtml.push(error.text);
						});						
							
						text = '<div class="line error-line">' + 
                                '	<div class="line_left">' + 
                                '		&nbsp;' + 
                                '   </div>' + 
                                '    <div class="line_right">' + 
                                '    	<div style="" class="validation-advice">'+errorsHtml.join('<br />')+'</div>' + 
                                '    </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                        lastLine.insert({after:text});       							
					}
					form.unmask();
				},
				onFailure: function(transport) {
					var lines = form.getElementsBySelector('.line'),
						lastLine = lines[lines.length-1], text;
					
					text = '<div class="line error-line">' + 
                                '	<div class="line_left">' + 
                                '		&nbsp;' + 
                                '   </div>' + 
                                '    <div class="line_right">' + 
                                '    	<div style="" class="validation-advice">'+__('Error sending request')+'</div>' + 
                                '    </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                    
                    lastLine.insert({after:text}); 	
						
					form.unmask();
				}
			});
		});
	}
});


App.components.forms.ProgramFeedback = Class.create(Abstract, {
	initialize : function (opts) {
		Object.extend(this, opts);
		var form = $('feedback_form'), 
			successText = this.successText,
			captcha = $('recaptcha_response_field'),
			fileinputs = form.getElementsBySelector('input[type=file]'); 
		
		if (captcha)
			captcha.addClassName('required');
		
		
		
		fileinputs.each(function (fileinput) {			
			fileinput.msgCt = fileinput.up(".file_upload").next('span');							
			fileinput.onchange = function (e) {
				if (this.className.indexOf(/\.(\w+)$/.exec(this.value)[1].toLowerCase()) == -1) {
					$(this.msgCt).addClassName('error');
					this.msgCt.innerHTML = __('Формат не підтримується.');
					this.value = '';
				} else {
					$(this.msgCt).removeClassName('error');
					this.msgCt.innerHTML = this.value;
				}
			};
		});	
		
		var v = new Validation("feedback_form", {
			useEffect : true,
			showAdvice : true,
			stopOnFirst : false,
			onSubmit : false
		});
		
		form.observe('submit', function(e){

			Event.stop(e);
			
			var submitCallback = function () {
				var lines = form.getElementsBySelector('.block_inputs'),
					lastLine = form.getElementsBySelector('.down_block')[0], text;
				var doc = form.iframeToSubmit.contentDocument || form.iframeToSubmit.contentWindow;
				if (doc.document) doc = doc.document;
				var responseText = doc.getElementsByTagName('body')[0].innerHTML, response;
				try  {
					response = responseText.evalJSON();
				}
				catch (e) {}
				if (response) {
					if (response.success) {
						var firstLine = lines[0];
						firstLine.update(successText);
						lines.each(function (line, idx) {
							if (idx > 0) line.remove();
						});						
						lastLine.remove();						
					} else {
						var errorsHtml = [], text;

						response.errors.each(function(error){
							errorsHtml.push(error.text);
						});						
							
						text = '<div class="block_inputs error-line">' + 
                                '	<div class="line">' + 
								'       <div class="left">' +
                                '		    &nbsp;' + 
								'       </div>' +
                                '       <div class="right">' + 
                                '    	    <div style="" class="validation-advice">'+errorsHtml.join('<br />')+'</div>' + 
                                '       </div>' + 
                                '   </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                        lastLine.insert({before:text});       							
					}
				} else {
					text = '<div class="block_inputs error-line">' + 
                                '	<div class="line">' + 
								'       <div class="left">' +
                                '		    &nbsp;' + 
								'       </div>' +
                                '       <div class="right">' + 
                                '    	    <div style="" class="validation-advice">'+__('Error sending request')+'</div>' + 
                                '       </div>' + 
                                '   </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                    
                    lastLine.insert({before:text}); 
				}
				form.unmask();
			}
			
			if (!v.validate()) return;
			
			if (!form.iframeToSubmit) {
				form.iframeToSubmit = Builder.node('iframe', { id: form.id + '_iframe', name: form.id + '_iframe', frameborder: 0, style: 'width:1px;height:1px;display:none;' });
				form.insert({after:form.iframeToSubmit});
				form.target = form.id + '_iframe';
			}
			
			var errLines = form.getElementsBySelector('.error-line'),
				iframeWindow = form.iframeToSubmit.contentWindow || form.iframeToSubmit.contentDocument.parentWindow;
			errLines.each(function (line) { line.remove(); });
		    form.mask(null, __('Processing..'));					
			form.iframeToSubmit.onload = submitCallback;
			form.submit();

			/*this.request({
				onCreate: function() {
					var errLines = form.getElementsBySelector('.error-line');
					errLines.each(function (line) { line.remove(); });
					form.mask(null, __('Processing..'));
				},
				onSuccess: function(transport) {
					var response = transport.responseJSON;
					if (response.success) {
						var firstLine = form.getElementsBySelector('.line')[0].parentNode;
						firstLine.update(responseText);
					} else {
						var errorsHtml = [], lines = form.getElementsBySelector('.line'),
							lastLine = lines[lines.length-1], text;

						response.errors.each(function(error){
							errorsHtml.push(error.text);
						});						
							
						text = '<div class="line error-line">' + 
                                '	<div class="line_left">' + 
                                '		&nbsp;' + 
                                '   </div>' + 
                                '    <div class="line_right">' + 
                                '    	<div style="" class="validation-advice">'+errorsHtml.join('<br />')+'</div>' + 
                                '    </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                        lastLine.insert({before:text});       							
					}
					form.unmask();
				},
				onFailure: function(transport) {
					var lines = form.getElementsBySelector('.line'),
						lastLine = lines[lines.length-1], text;
					
					text = '<div class="line error-line">' + 
                                '	<div class="line_left">' + 
                                '		&nbsp;' + 
                                '   </div>' + 
                                '    <div class="line_right">' + 
                                '    	<div style="" class="validation-advice">'+__('Error sending request')+'</div>' + 
                                '    </div>' + 
                                '    <div style="clear: both;"></div>' + 
                                '</div>';
                    
                    lastLine.insert({before:text}); 	
						
					form.unmask();
				}
			});*/
		});
	}
});

App.components.forms.SubscribtionFeedback = Class.create(Abstract, {
	initialize : function (opts) {
		Object.extend(this, opts);
		var form = $('feedback_form'), 
			successText = this.successText,
			captcha = $('recaptcha_response_field');
		
		if (captcha)
			captcha.addClassName('required');
		
		var currentSource;

			$$('ul.subscribtion-sources li input').each(function(input){
				input.observe('click', function () {
					if (this.value != currentSource) {
						$$('textarea[name="source_another"]').invoke('remove');
						currentSource = this.value;
						if (['key9','key4'].indexOf(this.value) >= 0) {
							this.up('label').insert({
								after : '<textarea rows="" style="margin-left:5px;" cols="" name="source_another"></textarea>'
							});							
						}
					}									
				});			
			});		
		
		var v = new Validation("feedback_form", {
			useEffect : true,
			showAdvice : true,
			stopOnFirst : false,
			onSubmit : false
		});
		
		form.observe('submit', function(e){

			Event.stop(e);
			
			if (!v.validate()) return;
			
			this.request({
				onCreate: function() {
					var errLines = form.getElementsBySelector('.error-line');
					errLines.each(function (line) { line.remove(); });
				    form.mask(null, __('Processing..'));				    
				},
				onSuccess: function(transport) {
					var response = transport.responseJSON;
					var lines = form.getElementsBySelector('.block_inputs'),
						lastLine = form.getElementsBySelector('.down_block')[0], text, 
						firstLine = lines[0];
					
					firstLine.update(successText);
					lines.each(function (line, idx) {
						if (idx > 0) line.remove();
					});						
					lastLine.remove();		
					form.unmask();					
				},
				onFailure: function(transport) {
					var lines = form.getElementsBySelector('.block_inputs'),
					lastLine = form.getElementsBySelector('.down_block')[0], text;
					
					text = '<div class="block_inputs error-line">' + 
	                    '	<div class="line">' + 
						'       <div class="left">' +
	                    '		    &nbsp;' + 
						'       </div>' +
	                    '       <div class="right">' + 
	                    '    	    <div style="" class="validation-advice">'+__('Error sending request')+'</div>' + 
	                    '       </div>' + 
	                    '   </div>' + 
	                    '    <div style="clear: both;"></div>' + 
	                    '</div>';
        
					lastLine.insert({before:text}); 
					form.unmask();
				}
			});						
		});
	}
});

Object.extend(LightboxOptions, {
	fileLoadingImage:        '/libs/lightbox/images/loading.gif',     
    fileBottomNavCloseImage: '/libs/lightbox/images/closelabel.gif',
    labelImage: __("Image"),
	labelOf: __("of")
});

(function () {
	for (m in Validation.methods) {
		switch (m) {
			case 'required':
				Validation.methods[m].error = __('This is a required field.');
				break;
			case 'validate-email':
				Validation.methods[m].error = __('Please enter a valid email address. For example fred@domain.com .');
				break;
			case 'validate-date-au':
				Validation.methods[m].error = __('Будь ласка, використовуйте наступний формат дати: дд/мм/рррр. Наприклад, 17/06/1984 для 17го червня 1986р');
				break;	
		}
	}
})();

Event.observe(document, "dom:loaded", App.init.bind(App));
