/**
 *
 * Custom js (jQuery) functions of the application
 *
 */

String.prototype.ellipsis = function (limit) {
    var center = ' ... ';
    var len = this.length;
    if (len > limit) {
        var half = Math.floor( (limit - center.length)/2 );
        return this.substr(0, half) + center + this.substr(len-half, half);
    }
    return this.toString();
}

function get_dictionary(key) {
    if(typeof(dictionary) != 'undefined' && typeof(dictionary[key]) != 'undefined') {
        return dictionary[key];
    } else {
        // add this key to db
        $.get('/system/add_dictionary', {
            key : key
        });
        return key;
    }
}

jQuery.extend(jQuery.fn, {
    initCart : function () {
        var _this = $(this);
        _this.find('#pr_amount').tooltip({
            bodyHandler: function () {
                return _this.find('#cart_items').html();
            },
            showURL: false
        });
    },
    poller : function () {
        var _this = $(this);
        var voted = $.cookie('CakeCookie[voted]');
        var inputs = _this.find('input');
        var progress = _this.find('span.progressbar');
        var settings = {
            height   : 12,
            width    : 90,
            boxImage : "/img/poll/progressbar.gif",
            barImage : "/img/poll/progressbg_green.gif"
        };

        function initResults() {
            progress.each(function() {
                var val = $(this).attr('data')
                $(this).show().progressBar(val, settings);
            });
        }

        if(voted) {
            inputs.hide();
            initResults()
        } else {
            inputs.show();
            progress.hide();
            _this.ajaxForm({
                beforeSubmit : function () {
                    $.blockUI({
                        message : false
                    });
                },
                success : function (response) {
                    $.unblockUI();
                    inputs.hide();
                    response = eval('(' + response + ')');
                    for (var i=0; i < response.PollersOption.length; i++) {
                        _this
                        .find('#votes_' + response.PollersOption[i].id)
                        .attr('data', response.PollersOption[i].votes_percentage);
                    }
                    initResults();
                    $('#total_votes', _this).html(response.PollersItem.total_votes);
                }
            });
        }
    },
    bpGallery : function () {
        var gallery  = $(this);
        var main_img = gallery.find('> a');
        main_img.attr('rel', 'gal');
        var container = $('<div style="display:none"></div>').appendTo(gallery);
        var thumbs   = gallery.find('> ul > li > img');
        thumbs.each(function (index) {
            $('<a></a>')
            .attr('href', $(this).attr('alt'))
            .text(index)
            .appendTo(container);
        });
        var links  = container.find('> a');
        thumbs.click(function () {
            var src = $(this).attr('alt');
            main_img.attr('href', src);
            main_img.find('img').attr('src', src);
            return false;
        });
        main_img.click(function () {
            links.attr('rel', 'gal');
            // don't repeat the main image in the gallery
            links.filter("[href='" + main_img.attr('href')  + "']").attr('rel', '');
        });
    },
    // simple accordeon menu
    accordeonMenu : function () {
        var menu = $(this);
        $('> li > a:not(.active) ~ .sub', menu).hide();
        var items = $('> li > a', menu).click(function () {
            items.removeClass('active');
            $(this).addClass('active').siblings('.sub').slideDown('normal');
            items.not('.active').siblings('.sub').slideUp('normal');
        });
        return menu;
    },
    digitsOnly : function () {
        var $this = $(this);
        $this.keypress(function (e) {
            // allow digits only
            if (e.which!=8 && e.which!=0 && (e.which<48 || e.which>57)) {
                return false;
            }
        });
        return $this;
    },
    advForm : function (options) {
        // main settings
        var settings = $.extend({
            validate          : false,
            ajax              : false,
            sent_message      : 'please wait...',
            error_message     : 'your message was rejected',
            highlight         : false,
            highlight_message : 'please fill the fields in red',
            highlight_class   : 'required'
        }, options);

        if (!settings.validate && !settings.ajax) {
            return true;
        }

        var _form = $(this);

        // params to pass to the validation plugin
        var validation_settings = {
            errorClass   : 'error-message',
            errorElement : 'span',
            wrapper: 'div',
            errorPlacement: function (label, element) {
                label.insertAfter(element)
                label.addClass('error-message');  // add a class to the wrapper
                label.append($('<img src="/img/general/err_mess.png">'));
            },
            highlight    : false
        };

        if (settings.highlight === true) {
            delete validation_settings.highlight;
            validation_settings = $.extend(validation_settings, {
                showErrors : function (errors) {
                    for ( var i = 0; this.errorList[i]; i++ ) {
                        var error = this.errorList[i];
                        if (typeof this.settings.highlight == 'function') {
                            this.settings.highlight.call( this, error.element, settings.highlight_class );
                        }
                    }
                    for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
                        this.settings.unhighlight.call( this, elements[i], settings.highlight_class );
                    }
                    if (_form.find('.' + settings.highlight_class).length > 0) {
                        _form.find('.form_status').text(settings.highlight_message);
                    } else {
                        _form.find('.form_status').text('');
                    }
                }
            });
        }

        $.metadata.setType('attr', 'validation');

        if (settings.validate && !settings.ajax) {
            _form.validate(validation_settings);
            return true;
        }

        if (settings.ajax) {
            var createMessage = function (text) {
                return '<div class=\"wait_message\">' + text + '</div>';
            }
            _form.ajaxForm({
                beforeSubmit : function () {
                    if (settings.validate && !_form.validate(validation_settings).form()) {
                        return false;
                    }
                    $.blockUI({
                        message : get_dictionary('sending_message')
                    });
                },
                success : function (data, status) {
                    setTimeout(function () {
                        _form.resetForm();
                        $.blockUI({
                            message : createMessage(settings.sent_message)
                        });
                        $.unblockUI({
                            fadeOut : 6000
                        });
                    },2000);
                }
            });

            _form.ajaxError(function () {
                $.blockUI({
                    message : createMessage(settings.error_message)
                });
                $.unblockUI({
                    fadeOut : 4000
                });
            });

            return true;
        }
    }
});

function browserCheck(locale) {
    var teststr = /MSIE 6\.0/;
    if(teststr.test(navigator.userAgent)) {
        $.nyroModalManual({
            url       : '/' + locale + '/pages/browser',
            endRemove : function() {
                browserCheck(locale);
            }
        });
    }
}

// custom validation rules and settings
if ($.validator) {
	$.validator.prototype.findByName = function( name ) {
		var form = this.currentForm;
		return $(document.getElementsByName(name)).map(function(index, element) {
			return element.form == form && element.name == name && element  || null;
		}).filter(':not(input[type=hidden])');
	};
    $.validator.setDefaults({
        onkeyup      : false,
        highlight    : false,
        errorElement : 'span',
        errorClass   : 'error-message'
    });
    $.validator.addMethod("alphanumeric", function(value, element) {
        return this.optional(element) || /^[0-9a-z\s\,\.\-\+\&\@\#\"\!\'\(\)\*\%\:\;\?\/\\\<\>\=\|]+$/i.test(value);//'"
    });
    $.validator.addMethod("lettersonly", function(value, element) {
        return this.optional(element) || /^[a-z]+$/i.test(value);
    });
    $.validator.addMethod("alpha", function(value, element) {
        return this.optional(element) || /^[a-z\s\,\.\-\+\&\@\#\"\!\'\(\)\*\%\:\;\?\/\\\<\>\=\|]+$/i.test(value);//'"
    });
    $.validator.addMethod("numeric", function(value, element) {
        return this.optional(element) || /^\d+$/.test(value);
    });
}

$(document).ready(function () {
    var fancybox_selector = 'a.fancybox';

    if( $(fancybox_selector).length > 0 ) {
        $(fancybox_selector).fancybox({
            'transitionIn'	:	'elastic',
            'transitionOut'	:	'elastic',
            'speedIn'		:	600,
            'speedOut'		:	200,
            'easingIn'		:	'easeInExpo',
            'easingOut'		:	'easeOutExpo',
            'titleShow'		:	true,
            'titlePosition' :	'outside'
        });
    }
	
    $('.datepicker input').datepicker({
        dateFormat : 'yy-mm-dd'
    });

    $('#accordion').accordeonMenu();

    $('#captcha_image').click(function () {
        var _this = $(this);
        var src = _this.attr('src').replace(/[^\/]+$/, Math.random());
        _this.attr('src', src);
    });

    $('#search_form').submit(function () {
        var criteria = $('#search_criteria').val();

        if (!criteria) {
            return false;
        }

        // append search criteria to uri
        var search_url = $(this).attr('action') + '/' + encodeURI(criteria);

        $(this).attr('action', search_url);

        return true;
    });
  
    $('.gallery').bpGallery();

    jQuery('a.minibutton').bind({
        mousedown: function() {
            jQuery(this).addClass('mousedown');
        },
        blur: function() {
            jQuery(this).removeClass('mousedown');
        },
        mouseup: function() {
            jQuery(this).removeClass('mousedown');
        }
    });

    $('#registration_form').validate();

    $('.submitbtn').click(function() {
        $(this).parents('form').submit();
    });

    $('form').keypress(function(event){
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if(keycode == '13'){
        //this.submit();
        }
    });

    $('.ref_thumb,.ref_gallery,.modules_gallery').click(function() {
        var images = $(this).attr('data-images').split(',');
        images.pop();
        for(i in images) {
            images[i] = 'http://' + document.location.host + images[i];
        }
        $.fancybox(images, {
            'transitionIn'		: 'elastic',
            'transitionOut'		: 'elastic',
            'type'              : 'image'
        });
        return false;
    });

    if($.fn.placeholder) {
        $('form input[placeholder],form textarea[placeholder]').placeholder();
    }

    if (/msie/i.test(window.navigator.userAgent)) {
        document.createElement('figure');
        document.createElement('figcaption');
        document.createElement('header');
        document.createElement('nav');
        document.createElement('article');
        document.createElement('section');
        document.createElement('mark');
        document.createElement('footer');
        document.createElement('aside');
    }

    if($.fn.fancybox) {
        // fancybox for manual gallery
        $('.fancybox_manual').click(function(e){
            var images = $(this).attr('data-images').split(',');
            for(i in images) {
                images[i] = 'http://' + document.location.host + '/img/images/' + images[i];
            }
            $.fancybox(images, {
                'transitionIn'		: 'elastic',
                'transitionOut'		: 'elastic',
                'type'              : 'image'
            });
            return false;
        });
    }

    $('.s-month a').live('click', function(){
        $('aside.sidebar menu').load($(this).attr('href'));
        return false;
    });
    
    // slicing js hacks
    function resize_menu () {
        $('nav > ul > li').each(function(i) {
            var li_width = $(this).width();
            $(this).hover(function(){
                $('.megamenu ul').eq(i).addClass('active');
            }, function(){
                $('.megamenu ul').eq(i).removeClass('active');
            });
            if(i < $('nav > ul > li').length - 1)
                $('.megamenu ul').eq(i).width(li_width + 60);
        });
    }
    $(window).bind("load", resize_menu);  // resize when all fonts are loaded
    $(document).ready(resize_menu); // resize when document is loaded
    // concept stores (height)
    $('.map').height($(window).height()-72);
    $('.contacts-inner').jScrollPane();
    // text pages
    function resize_content(animate) {
        var content_height = $('#content-inner').height();
        //        if($(document).height() - 72 - content_height < 40) {console.log('111');
        //            content_height = $(document).height() - 72;
        //        }
        if(animate) {
            $('#content').animate({
                height : content_height
            });  
        } else {
            $('#content').height(content_height);
        }
    }
    resize_content();
    
    $('.jobs-leftcol a').click(function(){
        if(!$(this).hasClass('active')) {
            $('.jobs-leftcol a').removeClass('active');
            var id = $(this).data('id');
            $('.jobs-rightcol > div').slideUp(function(){
                $('.jobs-rightcol > div').eq(id).slideDown(function(){
                    resize_content(true);
                });
            });
            $(this).addClass('active');
        }
        return false;
    });
    // gallery overview
	var $galleryBigPreview = $('#galleryBigPreview');
	(function($gallery) {
		var $ul = $gallery.find('ul');
		var $lis = $gallery.find('li');
		var $next = $gallery.find('.next');
		var $prev = $gallery.find('.prev');
		var position = 0;
		var get_position_width_map_static = null;
		var get_position_width_map = function() {
			if ( get_position_width_map_static ) {
				return get_position_width_map_static;
			} else {
				var min_width = 100;
				var result = [];
				$lis.each(function(i,obj){
					min_width = Math.min(min_width, $(obj).width());
					result.push($(obj).width());
				})
				if ( min_width ) {
					get_position_width_map_static = result;
				}
				return result;
			}
		}
	    $next.click(function(){
			var max_left = $(window).width();
			var set_left = max_left;
			$.each(get_position_width_map(), function(i,width){
				max_left -= width;
				if ( set_left>=position ) {
					set_left -= width;
				}
			});
			position = set_left = Math.max(max_left, set_left);
			$ul.animate({
				left : Math.max(max_left, set_left)
			});
	        $prev.show();
	        if( max_left==set_left ) {
	            $next.hide();
	        }
	    });
	    $prev.click(function(){
	        if(position < 0) {
				var set_left = 0;
				var last = 0;
				$.each(get_position_width_map(), function(i,width){
					if ( set_left>=position ) {
						set_left -= width;
						last = i;
					}
				});
	            set_left += get_position_width_map()[last--] || 0;
				if ( position == set_left ) {
					set_left += get_position_width_map()[last] || 0;
				}
	            position = set_left;
	            $ul.animate({
	                left : set_left
	            });
	        }
	        $next.show();
	        if(position == 0) {
	            $prev.hide();
	        }
	    })
		$prev.click();
	})($('.gallery'));
    // gallery view big image
    $('#wrapper > .next').live('click', function(){
        var next = $(current).closest('li').next('li').find('a');
        if(next.length > 0) {
            show_image(next);
            current = next;
        }
        $('#wrapper > .prev').show();
    });
    
    $('#wrapper > .prev').live('click', function(){
        var prev = $(current).closest('li').prev('li').find('a');
        if(prev.length > 0) {
            show_image(prev);
            current = prev;
        }
        $('#wrapper > .next').show();
    });
    
    $('.close').click(function(){
		$galleryBigPreview.parent().removeClass( 'fit-to-screen-mode');
		$galleryBigPreview.removeClass( 'fit-to-screen');
        $galleryBigPreview.draggable( "destroy" );
        $galleryBigPreview.hide();
        $('#wrapper > i, #wrapper > div.like').hide();
        $('.gallery').css('visibility', 'visible');
    });

	$(document).keyup(function (event) {
		// handle cursor keys
		if (event.keyCode == 37) {
			// slide left
			if ( $galleryBigPreview.is(':hidden') ) {
				$('.gallery .prev').click();
			} else {
				$('#wrapper > .prev').click();
			}
		} else if (event.keyCode == 39) {
			// slide right
			if ( $galleryBigPreview.is(':hidden') ) {
				$('.gallery .next').click();
			} else {
				$('#wrapper > .next').click();
			}
		}
	});
    
    var current;
    
    function init_drag(image) {
        $(image).draggable( "destroy" );
		var containment_x = ($(image).width() - $(window).width());
		var containment_y = ($(image).height() - $(window).height()-72);
        $(image).draggable({
            cursor: 'move',
            containment: [-containment_x, -(containment_y+72), 0, 72]
        }).css({left:-containment_x/2, top:-(containment_y+72)/2});
    }
    var preloaded_images = [];
    
    function preload_image(image) {
        preloaded_images[image] = $('<img style="display:none"/>').attr('src', image);
    }
	var big_image_onload = function(){
		if ( !$galleryBigPreview.parent().hasClass('fit-to-screen-mode') ) {
			init_drag($galleryBigPreview);
		}
	}
	var $zoom_in_out = $('#wrapper > i.zoom-in-out b');
	$($zoom_in_out[0]).click(function(){
		$($zoom_in_out[0]).hide();
		$($zoom_in_out[1]).show();
        $galleryBigPreview
			.draggable( 'destroy')
			.css( {left:'auto', top:'auto'})
			.parent().addClass( 'fit-to-screen-mode')
		;
	});
	$($zoom_in_out[1]).click(function(){
		$($zoom_in_out[0]).show();
		$($zoom_in_out[1]).hide();
		$galleryBigPreview.parent().removeClass( 'fit-to-screen-mode');
        $('.drag').show().delay(3000).fadeOut(500);
		init_drag($galleryBigPreview);
	});

    function show_image(image) {
		$('gallery > i').hide();
        if(!preloaded_images[$(image).attr('href')]) {
            preload_image($(image).attr('href'));
        }
        $galleryBigPreview.attr('src', preloaded_images[$(image).attr('href')].attr('src')).css('top', '0px')
			.unbind('load', big_image_onload)
			.load(big_image_onload);
        // preload the next image
        var next = $(image).closest('li').next('li').find('a').attr('href');
        if(next && !preloaded_images[next]) {
            preload_image(next);
        }
        // preload the previous image
        var prev = $(image).closest('li').prev('li').find('a').attr('href');
        if(prev && !preloaded_images[prev]) {
            preload_image(prev);
        }
        // prev+next buttons show/hide
        if($(image).closest('li').next('li').find('a').length < 1) {
            $('#wrapper > .next').hide();
        } else {
            $('#wrapper > .next').show();
        }
        if($(image).closest('li').prev('li').find('a').length < 1) {
            $('#wrapper > .prev').hide();
        } else {
            $('#wrapper > .prev').show();
        }
		//facebook button
        $('#wrapper > div.like').show();
		$('#wrapper > div.like').html($(image).attr('data-fb'));
		window.FB_init && window.FB_init();
    }
    $('.gallery a').hover(function(){
		if ( !this.fb_inited ) {
			$(this).find( '.likes').html($(this).attr('data-fb'));
			window.FB_init && window.FB_init();    
			this.fb_inited = true;
		}
	})
    $('.gallery a').click(function(){
        current = this;
		$galleryBigPreview.show();
        show_image(this);
		$($zoom_in_out[0]).click();
        $('.gallery').css('visibility', 'hidden');
        $('#wrapper > i, #wrapper > div.like').filter( ':not(.drag)').show();
        return false;
    });

    $('#ref_search').validate();
    
    $('.map_loader').click(function(){
        map.setCenter(geocodes[$(this).data('map')]);
        $('.contacts-inner li').removeClass('active');
        $(this).closest('li').addClass('active');
        return false;
    });
    
    var map;
    if(typeof(google) != 'undefined')
        var geocoder = new google.maps.Geocoder();

    if($('#map').length > 0) {
        var point = new google.maps.LatLng(50.875311, 0.351563);

        var myMapOptions = {
            zoom: 17,
            center: point,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

        map = new google.maps.Map(document.getElementById("map"),myMapOptions);

        var image = new google.maps.MarkerImage(
            '/img/layout/marker_image.png',
            new google.maps.Size(200,37),
            new google.maps.Point(0,0),
            new google.maps.Point(100,37)
            );

        var shadow = new google.maps.MarkerImage(
            '/img/layout/marker_shadow.png',
            new google.maps.Size(222,37),
            new google.maps.Point(0,0),
            new google.maps.Point(100,37)
            );

        var shape = {
            coord: [148,0,148,1,147,2,146,3,145,4,143,5,142,6,182,7,185,8,186,9,187,10,188,11,188,12,189,13,189,14,189,15,189,16,189,17,189,18,189,19,189,20,189,21,188,22,187,23,186,24,185,25,183,26,38,31,39,32,39,33,39,34,39,35,38,36,16,36,15,35,15,34,15,33,15,32,16,31,15,26,15,25,15,24,15,23,15,22,15,21,15,20,15,19,15,18,15,17,15,16,15,15,15,14,15,13,15,12,15,11,15,10,15,9,15,8,15,7,140,6,140,5,141,4,142,3,143,2,144,1,145,0,148,0],
            type: 'poly'
        };
        $.each(addresses, function(i, address){
			if ( address.location ) {
				var location = address.location.split(',');
				geocodes[address.index] = new google.maps.LatLng(location[1],location[0]);
				var marker = new google.maps.Marker({
					draggable: false,
					raiseOnDrag: false,
					icon: image,
					shadow: shadow,
					shape: shape,
					map: map,
					position: geocodes[address.index]
				});
				// show markers by default
				new google.maps.InfoWindow({
					content: address.description
				}).open(map,marker);
				google.maps.event.addListener(marker, 'click', function() {
					new google.maps.InfoWindow({
						content: address.description
					}).open(map,marker);
				});
				if(geocodes[0]) {
					map.setCenter(geocodes[0]);
				}
			}
        });
    }
    if(navigator.userAgent.match(/Linux|Mac/)) {
        $('body').addClass('unix');
    }
});
var geocodes = [];
