/*
CSS Browser Selector v0.4.0 (Nov 02, 2010)
Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Contributors: http://rafael.adm.br/css_browser_selector#contributors
*/

function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;};

var up;

$(function ()
{
    css_browser_selector(navigator.userAgent);
	
	up =
	{
		nodes: {},
        pages_cache: {},
        
        UI:
        {
            showHeader: function ()
            {
                var pos = up.nodes.$header.css('left');
                up.nodes.$header.css('left', '-5000px');
                up.nodes.$header.animate({'left': 0}, 1000);
                $('.header_before').css('left', '-9000px').animate({'left': -4000}, 1000);
            },

            showFooter: function ()
            {
                var pos = up.nodes.$footer.css('left');
                up.nodes.$footer.css('left', '5000px');
                up.nodes.$footer.animate({'left': 0}, 1000);
                $('.footer_after').css('right', '-9000px').animate({'right': -4000}, 1000);
            },

            showNavigation: function ()
            {
                $('.navigation').hide().show('pulsate', {times: 2}, 2000);
            },

            showContent: function ()
            {
                $('.content').hide().fadeIn(2000);
            },

            installFlashLogo: function ()
            {
                $('.logo').flash({
                    'swf': '/images/up/logo.swf',
                    'width': 460,
                    'height': 60,
                    'flashvars': {
                        'click_url': '/',
                        'click_target': '_self'
                    }
                });
                
                window.flashLogoClickHandler = function () {
                    up.pages.requestPageLoading('/');
                    return true;
                }
            },

            initAccordions: function ()
            {
                $('.accordion_toggler').each(function ()
                {
                    var $toggler = $(this);
                    var $target = $('#' + $toggler.attr('accordion_target'));
                    $target.hide();
                    $toggler.addClass('target_hidden');
                    $toggler.click(function () {
                        if ($toggler.hasClass('target_hidden'))
                        {
                            $toggler.removeClass('target_hidden').addClass('target_visible');
                            $target.fadeIn();
                            $.cookie($toggler.attr('accordion_target'), 'visible', { expires: 7 });
                        }
                        else {
                            $toggler.addClass('target_hidden').removeClass('target_visible');
                            $target.fadeOut();
                            $.cookie($toggler.attr('accordion_target'), 'hidden', { expires: 7 });
                        }
                        
                    });
                    if ($.cookie($toggler.attr('accordion_target')) == 'visible')
                    {
                        $toggler.click();
                    }
                });
            },
            
            hideLoadingBar: function (callback, animate, animationTimeout)
            {
                if (typeof(animate) == 'undefined') animate = 0;
                if (typeof(animationTimeout) == 'undefined') animationTimeout = 500;

                if (animate)
                {
                    up.nodes.$overlay.fadeOut(animationTimeout, callback);
                }
                else
                {
                    up.nodes.$overlay.hide();
                    if (typeof(callback) == 'function')
                    {
                        callback();
                    }
                }
            },
    
            showLoadingBar: function (callback, animate, animationTimeout)
            {
                if (typeof(animate) == 'undefined') animate = 0;
                if (typeof(animationTimeout) == 'undefined') animationTimeout = 250;

                if (animate)
                {
                    up.nodes.$overlay.fadeIn(animationTimeout, callback);
                }
                else
                {
                    up.nodes.$overlay.show();
                    if (typeof(callback) == 'function')
                    {
                        callback();
                    }
                }
            }
        },
		
        pages:
        {
            is_home: function ()
            {
                return $('.wrapper').hasClass('home');
            },
            
            is_order: function ()
            {
                return $('.wrapper').hasClass('order');
            },
            
            order_form:
            {
                OTHER_FIELD_VALUE: 10000,

                validationRules:
                {
                    'work_type': {
                        required: true,
                        min: 1
                    },
                    'custom_work_type': {
                        required: function ()
                        {
                            return up.pages.order_form.$form.find('#work_type').val() == up.pages.order_form.OTHER_FIELD_VALUE;
                        }
                    },
                    'client_name': {
                        required: true
                    },
                    'client_phone': {
                        required: true
                    },
                    'client_email': {
                        required: true,
                        email: true
                    }
                },

                validationMessages:
                {
                    'work_type': {
                        required: 'Пожалуйста, выберите тип работы',
                        min: 'Пожалуйста, выберите тип работы'
                    },
                    'custom_work_type': {
                        required: 'Пожалуйста, укажите тип работы'
                    },
                    'work_name': {
                        required: 'Пожалуйста, укажите название работы'
                    },
                    'work_subject': {
                        required: 'Пожалуйста, укажите предмет'
                    },
                    'pages_count': {
                        required: 'Пожалуйста, укажите ориентировочное количество страниц',
                        digits: 'Неверный формат. Введите положительное число.'
                    },
                    'finish_date': {
                        required: 'Пожалуйста, укажите дату',
                        date: 'Пожалуйста, укажите дату'
                    },
                    'city': {
                    },
                    'client_name': {
                        required: 'Пожалуйста, укажите ваше имя'
                    },
                    'client_phone': {
                        required: 'Пожалуйста, укажите ваш телефон'
                    },
                    'client_email': {
                        required: 'Пожалуйста, укажите ваш e-mail',
                        email: 'Пожалуйста, укажите ваш e-mail'
                    },
                    'additional_information': {
                    }
                },

                submitCallback: function (json, code, XHR, $form)
                {
                    up.UI.hideLoadingBar(null, 0);

                    var reg=/({.*})/;
					var arr=reg.exec(json);
					json = arr ? arr[0] : null;

                    var data = {'error': 'Wrong JSON'};
                    try {
                        data = $.parseJSON(json);
                    }
                    catch(e) {}
                    if (data.success)
                    {
                        alert('Ваш заказ принят! Спасибо за заполнение формы. Наши специалисты вскоре свяжутся с вами.');
                    }
                    else
                    {
                        alert('При отправке формы произошла ошибка. Пожалуйста, попробуйте повторить отправку.');
                    }
                },

                prepare: function ()
                {
                    up.pages.order_form.$form = $('form#order');
                    up.pages.order_form.initFilesUI();
                    $('#finish_date').datepicker({ dateFormat: 'yy-mm-dd' });

                    up.pages.order_form.$form.find('#work_type').change(function () {
                        var $node = $(this);
                        if (0 + $node.val() == up.pages.order_form.OTHER_FIELD_VALUE) {
                            up.pages.order_form.$form.find('.custom_work_type_dialog').show();
                        }
                        else {
                            up.pages.order_form.$form.find('.custom_work_type_dialog').hide();
                        }
                    }).change();

                    up.pages.order_form.$form.validate({
                        submitHandler: function (form) {
                            up.UI.showLoadingBar();
                            up.pages.order_form.$form.append($('<input type="hidden" name="ajax_flag" id="ajax_flag" value="1"/>)'));
                            up.pages.order_form.$form.ajaxSubmit(up.pages.order_form.submitCallback);
                            //up.pages.order_form.$form.get(0).submit();
                            return false;
                        },
                        focusInvalid: true,
                        focusCleanup: false,
                        rules: up.pages.order_form.validationRules,
                        messages: up.pages.order_form.validationMessages,
                        errorPlacement: function ($errorLabel, $errorNode)
                        {
                            $errorLabel.insertAfter($errorNode);
                        }
                    });
                },

                initFilesUI: function ()
                {
                    function handleInputValueChange ()
                    {
                        var $input = $(this);
                        var $li = $input.parent();
                        var val = $input.val();
                        $li.children('.button.change').text(val);
                        if (val)
                        {
                            if ($li.parent().find('li input').filter(function () { return ! this.value; }).size() == 0)
                            {
                                $li.children('.button.add').click();
                            }
                        }
                    }

                    $('.files .button.add').die('click').live('click', function ()
                    {
                        var $cur_li = $(this).parent('li')
                        var $ul = $cur_li.parent('ul');
                        var $new_li = $cur_li.clone();
                        $new_li.find('input').val('');
                        $new_li.find('.button.change').text('');
                        $new_li.find('.button.remove').show();
                        $new_li.appendTo($ul);
                        $cur_li.find('.button.remove').show();

                        var i = 0;
                        var $file_inputs = $ul.find('input');
                        for (i; i < $file_inputs.size(); ++i)
                        {
                            var $input = $($file_inputs[i]);
                            $input.attr('name', 'files[' + i + ']').attr('id', 'files[' + i + ']')
                        }

                        $file_inputs.unbind('change').bind('change', handleInputValueChange);

                    });
                    $('.files .button.remove').die('click').live('click', function ()
                    {
                        var $cur_li = $(this).parent('li');
                        var $ul = $cur_li.parent('ul');
                        if ($ul.children('li').size() > 1)
                        {
                            $cur_li.remove();
                        }
                        else
                        {
                            $cur_li.children('input').val('');
                            $cur_li.children('input').change();
                        }

                    });

                    $('.files input').unbind('change').bind('change', handleInputValueChange);
                }

            },

            
            loadPage: function (page)
            {
                $(document).scrollTop(0);
                
                up.nodes.$pageContents.html(page.data);
                up.nodes.$wrapper.attr('class', 'wrapper ' + page['class']);
                up.nodes.$pageName.text(page.name);

                up.UI.hideLoadingBar();
    
                if ( ! up.pages.is_home() )
                {
                    up.UI.initAccordions();
                    $('.hotnews').hide();
                }
                else {
                    $('.hotnews').show();
                }
                if ( up.pages.is_order() )
                {
                    up.pages.order_form.prepare();
                }

                $('.navigation a[href="' + page.href + '"]').parent('li').addClass('active');

                up.pages.bindPageLinksAjaxHandlers();

                location.hash = page.href;
                up.hash_changed_programmatically = true;
                // document.title = page.name + ' :: Юнивер Полярис';

            },

            bindPageLinksAjaxHandlers: function ()
            {
                up.nodes.$data.find('a').each(function ()
                {
                    var $a = $(this);
                    var href = $a.attr('href');
                    if (href.charAt(0) == '/')
                    {
                        $a.click(function ()
                        {
                            var $buttons = $('.navigation a');
                            $buttons.parents('li').removeClass('active');
                            up.nodes.$wrapper.attr('class', 'wrapper ' +
                                    (href.substr('1')
                                            ? ('inner ' + href.substr('1'))
                                            : 'home'
                                    )
                            );
                            up.pages.requestPageLoading(href);
                            return false;
                        })
                    }
                });
            },

            requestPageLoading: function (href)
            {
                original_href = href;
                href = href + '?ajax=1';
                up.UI.showLoadingBar(function ()
                {
                    if (href in up.pages_cache)
                    {
                        up.pages.loadPage(up.pages_cache[href]);
                    }
                    else
                    {
                        $.ajax({
                            url: href,
                            dataType: 'json',
                            success: function (page) {
                                up.pages_cache[page.href] = page;
                                up.pages.loadPage(page);
                            },
                            error: function (response) {
                                try {
                                    page = $.parseJSON(response.responseText);
                                    up.pages_cache[page.href] = page;
                                    up.pages.loadPage(page);
                                } catch(e) {
                                    location.href = original_href;
                                } finally {

                                }
                            }
                        });

                    }
                });
            },

            enableAjaxLoadingPages: function ()
            {
                $('.navigation a').click(function ()
                {
                    var $buttons = $('.navigation a');
                    var $button = $(this);
                    var href = $button.attr('href');
                    $buttons.parents('li').removeClass('active');
                    if (up.pages.is_home())
                    {
                        up.pages.requestPageLoading(href);
                    }
                    else
                    {
                        $button.effect("bounce", { times: 3, distance: 10, direction: 'down' }, 300);
                        $button.parents('li').addClass('active');
                        up.nodes.$wrapper.attr('class', 'wrapper inner ' + href.substr(1));
                        up.pages.requestPageLoading(href);
                    }
                    return false;
                });

                $('.logo a').click(function ()
                {
                    var $buttons = $('.navigation a');
                    $buttons.parents('li').removeClass('active');
                    up.nodes.$wrapper.attr('class', 'wrapper home');
                    up.pages.requestPageLoading('/');
                    return false;
                });
            },

            enableBrowserBackButtonInterception: function () {
                $(window).bind('hashchange', function () {
                    if (up.hash_changed_programmatically) {
                        up.hash_changed_programmatically = false;
                    }
                    else {
                        var pageToLoad = location.hash.substr(0, 1) == '#' ? location.hash.substr(1) : up.initial_page;
                        $('.navigation li').removeClass('active');
                        up.pages.requestPageLoading(pageToLoad);
                    }
                });
            }
        },
		
		init: function ()
		{
			up.nodes.$wrapper	= $('.wrapper');
            up.nodes.$overlay   = $('.overlay');
            up.nodes.$header    = $('.header');
            up.nodes.$footer    = $('.footer');
            up.nodes.$content   = $('.content');
            up.nodes.$base      = $('.base');
            up.nodes.$box       = $('.box');
			up.nodes.$bg	    = up.nodes.$box.children('.background');
			up.nodes.$data	    = up.nodes.$box.children('.data');
			up.nodes.$pageName  = up.nodes.$data.children('.page_name');
			up.nodes.$pageContents  = up.nodes.$data.children('.page_contents');

			up.data_padding = {
				'l': up.nodes.$data.css('padding-left').replace('px', ''),
				'r': up.nodes.$data.css('padding-right').replace('px', ''),
				't': up.nodes.$data.css('padding-top').replace('px', ''),
				'b': up.nodes.$data.css('padding-bottom').replace('px', '')
			};

            up.UI.installFlashLogo();
            up.pages.enableAjaxLoadingPages();
            up.pages.enableBrowserBackButtonInterception();
            up.pages.bindPageLinksAjaxHandlers();

            up.UI.hideLoadingBar(function ()
            {
                if ($('html').hasClass('ie'))
                {

                }
                else {
                    up.UI.showHeader();
                    up.UI.showFooter();
                }
                if ( ! up.pages.is_home())
                {
                    up.UI.showNavigation();
                    up.UI.showContent();
                    up.UI.initAccordions ();
                }
                if( up.pages.is_order())
                {
                    up.pages.order_form.prepare();
                }
            });

		}
	};
	
	if (typeof(location.hash) != 'undefined' && location.hash != '')
    {
        var href = '' + location.hash;
        location.href = href.substr(1);
    }

    function set_initial_page () {
        var myRe = /http:\/\/.*(\/.*)$/ig;
        var myArray = myRe.exec(location.href);
        up.initial_page = myArray.length > 1 ? myArray[1] : '';
    }
    set_initial_page();

    up.init();

});
