// Submenu Plugin
(function($){
    var plugin = {
        namespace: '.submenu',
        select:{
            anchor: 'a',
            submenu: 'ul',
            subitem: 'li',
            subanchor: 'li a'
        },
        event:{
            subanchor:{
                mouseenter: function(e){with(e.data){
                    $(this)
                        .stop(true,true)
                        .css({'background-color':'#f198c5'})
                        .animate({'background-color':'#cd1361'},1000);
                }}
            },
            target:{
                mouseenter: function(e){with(e.data){
                    $(this).addClass('open');
                    var timeout = $(this).data('timeout');
                    if(timeout){
                        clearTimeout(timeout);
                        $(this).data('timeout',undefined);
                    }
                    $(plugin.select.submenu,this).stop(true,true).slideDown();
                    $(plugin.select.subanchor,this).each(function(i){
                        $(this)
                            .delay(i*500)
                            .stop(true,true)
                            .css({'background-color':'#f198c5'})
                            .delay(200)
                            .animate({'background-color':'#cd1361'},1000);
                    });
                    return false;
                }},
                mouseleave: function(e){with(e.data){
                    $(this).data({
                        timeout: setTimeout($.proxy(function(){
                            $(e.data.plugin.select.submenu,this)
                                .stop(true,true)
                                .slideUp();
                                $(this).removeClass('open');
                        },this),500)
                    });
                    return false;
                }}
            }
        }
    };
    
    $.fn.submenu = function(){
        this.each(function(i){
            var submenu = $(plugin.select.submenu,this);
            if(!submenu.length)
                return true;
            for(var event in plugin.event.target)
                $(this).bind(event+plugin.namespace,{plugin:plugin,target:this,timeout:false},plugin.event.target[event]);
            for(var event in plugin.event.subanchor)
                $(plugin.select.subanchor,this).bind(event+plugin.namespace,{plugin:plugin,target:this},plugin.event.subanchor[event]);
        });
        return this
    };
})(jQuery);

// Clickable Plugin
(function($){
    var plugin = {
        select:{
            anchor: 'a'
        },
        event:{
            target:{
                click: function(e){with(e.data){
                    if(a.hasClass('popup'))
                        a.click();
                    else
                        window.location.assign(href);
                    return false;
                }}
            }
        }
    };
    
    $.fn.clickable = function(){
        this.each(function(i){
            var a = $(this).find(plugin.select.anchor+':first');
            if(!a.length)
                return true;
            $(this).bind('click',{a:a,href:a.attr('href')},plugin.event.target.click);
        });
        return this;
    };
})(jQuery);

// Paralax Plugin
(function($){
    var plugin = {
        namespace: '.depth',
        defaults:{
            depths:[
                /*
                [40,10],    // Background
                [10,2],      // Midground
                [-10,-2]     // Foreground
                */
                [20,10],    // Background
                [0,0],      // Midground
                [-60,-2]     // Foreground
                
            ],
            pageW: 0,
            pageH: 0
        },
        select:{
            layer: '.layer',
            tracker: ($.browser.msie && (parseInt($.browser.version, 10)<9))? document : window
        },
        event:{
            tracker:{
                mousemove: function(e){with(e.data){
                    var pX = ((options.pageW/2) - e.pageX) / (options.pageW/2),
                        pY = ((options.pageH/2) - e.pageY) / (options.pageH/2);
                    $(plugin.select.layer,options.container).each(function(i){
                        $(this).css({
                            left: Math.round(options.depths[i][0]*pX),
                            top: Math.round(options.depths[i][1]*pY)
                        });
                    });
                }},
                resize: function(e){with(e.data){
                    options.pageW = $(plugin.select.tracker).width();
                    options.pageH = $(plugin.select.tracker).height();
                }}
            }
        },
        fn:{
            init: function(options,plugin){
                // Get tracker size
                options.pageW = $(plugin.select.tracker).width();
                options.pageH = $(plugin.select.tracker).height();
                
                // Bind events
                for(var element in plugin.event)
                    for(var event in plugin.event[element])
                        (element in plugin.select) && $(plugin.select[element],options.config).bind(event+plugin.namespace,{options:options,plugin:plugin},plugin.event[element][event]);
            }
        }
    };
    
    $.fn.depth = function(){
        var args = arguments,
            o = (args.length>0 && $.type(args[args.length-1])=='object')?args[args.length-1]:false;
        
        
        // Render configuration
        this.each(function(){
            // Set options
            var options = o ? $.extend($(this).data(),o):$(this).data();
            for(var option in plugin.defaults)
                options[option] = option in options ? options[option] : plugin.defaults[option];
            options.container = this;
            
            // Create new depth
            plugin.fn.init.call(this,options,plugin);
                
            // Preserve state
            $(this).data(options);
        });
        
        switch(args[0]){
            default:
                return this;
        }
    };
})(jQuery);

// Hotspot Plugin
(function($){
    var plugin = {
        namespace: '.hotspot',
        select:{
            layer: '.layer',
            bubble: '.bubble',
            highlight: '.highlight',
            bubble_el: false,
            target: false
        },
        event:{
            target:{
                mouseenter: function(e){with(e.data){
                    $(plugin.select.bubble).stop(true,true).fadeOut();
                    if(!options.open){
                        options.open = true;
                        options.bubble.stop(true,true).fadeIn();
                        $(plugin.select.highlight,options.target).show().fadeOut();
                    }
                }},
                mouseleave: function(e){with(e.data){
                    options.timeout = setTimeout(function(){
                        options.open = false;
                        options.bubble.stop(true,true).fadeOut();
                    },500);
                }}
            },
            bubble_el:{
                mouseenter: function(e){with(e.data){
                    clearInterval(options.timeout);
                }},
                mouseleave: function(e){with(e.data){
                    options.open = false;
                    options.bubble.stop(true,true).fadeOut();
                }}
            }
        },
        fn:{
            initBubble: function(options,plugin){
                var left = (options.offset.left>options.middle) ?
                    options.offset.left-options.bubble.outerWidth(true)-options.margin:
                    options.offset.left+options.size[0]+options.margin;
                options.bubble
                    .hide()
                    .addClass('clickable')
                    .css({
                        left: left,
                        top: options.offset.top
                    });
            }
        }
    };
    $.fn.hotspot = function(){
        this.each(function(i){
            
            var el = $(this),
                options = {
                    open: false,
                    margin: 10,
                    target: this,
                    offset: el.position(),
                    size: [el.width(),el.height()],
                    bubble: el.siblings('.'+el.attr('rel')),
                    middle: el.parents(plugin.select.layer).width()/2
                };
            
            // Init bubble
            plugin.fn.initBubble.call(this,options,plugin);
            
            // Init highlight
            $(plugin.select.highlight,this).hide();
            setTimeout(function(){
                $(plugin.select.highlight,options.target).show().fadeOut();
            },1000+(i*500));
            
            plugin.select.target = this;
            plugin.select.bubble_el = options.bubble.get(0);
            // Bind events
            for(var element in plugin.event)
                for(var event in plugin.event[element])
                    (element in plugin.select) && $(plugin.select[element],this).bind(event+plugin.namespace,{options:options,plugin:plugin},plugin.event[element][event]);        
        })
        return this;
    };
})(jQuery);

// Address Plugin
(function($){
    var plugin = {
        namespace: '.address',
        select: {
            title: 'h2',
            target: false,
            address: '.address'
        },
        event:{
            target:{
                click: function(e){with(e.data){
                    $(this).siblings(plugin.select.address).removeClass('active');
                    $(this).addClass('active');
                    options.map.panTo(options.marker.getPosition());
                    options.map.setZoom(14);
                }}
            }
        }
    };
    
    $.fn.address = function(map){
        this.each(function(i){
            var address = $(this).attr('rel').split(','),
                title = $(plugin.select.title,this).text(),
                options = {
                    target: this,
                    map: map,
                    marker: new google.maps.Marker({
                        position: new google.maps.LatLng(parseFloat(address[0]),parseFloat(address[1])),
                        map: map,
                        title: title,
                        icon: '/wp-content/themes/precisionpoint/images/pinpoint.png'
                    })
                };
            
            // Bind events
            plugin.select.target = this;
            for(var element in plugin.event)
                for(var event in plugin.event[element])
                    (element in plugin.select) && $(plugin.select[element],this).bind(event+plugin.namespace,{options:options,plugin:plugin},plugin.event[element][event]);
        });
        return this;
    }
})(jQuery);

// Form Validation Plugin
(function($){
    var plugin = {
        namespace: '.validate',
        select:{
            invalid: '.invalid',
            label: 'label',
            input: 'input,textarea',
            target: null
        },
        regex:{
            email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,4})?$/
        },
        event:{
            target:{
                submit: function(e){with(e.data){
                    var valid = true;
                    $(plugin.select.input,this).each(function(i){
                        var field = $(this).parents(plugin.select.label);
                        
                        // Check if empty
                        if($(this).hasClass('not-empty'))
                            if($(this).val().length)
                                field.removeClass('invalid');
                            else
                                field.addClass('invalid');
                        
        
                        // Check if email
                        if($(this).hasClass('email'))
                            if(plugin.regex.email.test($(this).val()))
                                field.removeClass('invalid');
                            else
                                field.addClass('invalid');
                    });
                    
                    if($(plugin.select.invalid,this).length)
                        return false;
                        
                    // Optionally submit via AJAX
                    if(!options.ajax)
                        return true;
                    
                    var form = $(this),
                        data = {};
                    $(plugin.select.input,this).each(function(i){
                        data[$(this).attr('name')] = $(this).val();
                    });
                    $.ajax({
                        url: '/',//form.attr('action'),
                        type: 'POST',
                        context: this,
                        data: data,
                        success: options.callback
                    });
                    return false;
                }}
            }
        }
    };
    $.fn.validate = function(callback){
        var options = {
            ajax: (callback == undefined) ? false : true,
            callback: callback
        };
        
        this.each(function(i){
            plugin.select.target = this;
            // Bind events
            for(var element in plugin.event)
                for(var event in plugin.event[element])
                    (element in plugin.select) && $(plugin.select[element],this).bind(event+plugin.namespace,{options:options,plugin:plugin},plugin.event[element][event]);        
        });
        return this;
    }
})(jQuery);

// Init
$(function(){
    pp = {
        select:{
            menu_item: '.header-tier .menu>li',
            clickable: '.clickable',
            depth: '.banner-tier .depth',
            hotspot: 'a.hotspot',
            map: '.map',
            address: '.address',
            popup: 'a.popup',
            form: 'form.validate'
        },
        select_live:{
            overlay_persist: '#overlay .wrapper',
            overlay_close: '#overlay .content, #overlay .close'
        },
        fn:{
            initMap: function(pp){
                return new google.maps.Map($(pp.select.map).get(0),{
                    center: new google.maps.LatLng(51.416072,-0.746636),
                    draggable: false,
                    mapTypeId: google.maps.MapTypeId.TERRAIN,
                    mapTypeControl: false,
                    streetViewControl: false,
                    scrollwheel: false,
                    zoom: 14
                });
            },
            popup: function(html){
                $('#popup').empty().append(html);
                $('#overlay').fadeIn().css({top: $(window).scrollTop()});
                $(window).scroll(function(){$('#overlay').css({top: $(window).scrollTop()});});
                return false;
            }
        },
        event:{
            popup:{
                click: function(e){
                    e.preventDefault();
                    $.get(this.href, {}, e.data.fn.popup, 'html');
                    return false;
                }
            },
            overlay_close:{
                click: function(e){
                    $(document.body).css({overflow:'visible'});
                    $(window).unbind('scroll');
                    $('#overlay').fadeOut(function(){$('#popup').empty();});
                }
            },
            overlay_persist:{
                click: function(e){
                    e.stopPropagation();
                }
            }
        }
    };
    
    // Init
    $(pp.select.menu_item).submenu();
    $(pp.select.clickable).clickable();
    $(pp.select.depth).depth();
    $(pp.select.hotspot).hotspot();
    $(pp.select.form).validate();
    
    // Bind events
    for(var element in pp.event)
        for(var event in pp.event[element])
            (element in pp.select) && $(pp.select[element]).bind(event,pp,pp.event[element][event]);
            
    // Live events
    for(var element in pp.event)
        for(var event in pp.event[element])
            (element in pp.select_live) && $(pp.select_live[element]).live(event,pp,pp.event[element][event]);
    
    // Map
    if($(pp.select.map).length)
        $(pp.select.address).address(pp.fn.initMap(pp)).first().click();
});

jQuery(document).ready(function(){

	jQuery('a[rel="external"]').click(function(){ window.open($(this).attr('href')); return false;});
	
	jQuery('body.content-library #content-list tr').click(function(e){ 
		window.open(jQuery(this).attr('rel'));
		e.preventDefault();
	});
	
	jQuery('body.content-library #casestudy-list tr').click(function(e){ 
		window.location.href = jQuery(this).attr('rel');
		e.preventDefault();
	});
	 
});	

