/**
 * Interpolis Proeftuin generic scripts
 * 
 */
var Interpolis = (function ($) {

    var Interpolis = {
        init: function () {

            // cufon
            Cufon.replace('.anja-eliane');

            // main navigation
            $('#navigation-main').simpleMenu();

            // Click on the first button if an enter occurs in a form. Fixes .NET form submit issue.
            $(document).bind('keydown', function (e) {
                var target = $(e.target);
                if (e.keyCode === 13 && target.is('[type=text], [type=password]')) {
                    e.preventDefault();
                    target.closest('.form').find('.button').eq(0).click();
                }
            });

            // generic node inserted handler
            LBi.subscribe(LBi.Event.NODE_INSERTED, this.nodeInserted.bind(this));

            // idea specific updates
            LBi.subscribe('idea-updated', Interface.updateIdea);

            // stats
            LBi.subscribe('click', Statistics.click);

            // popups
            Popups.init();

            // relations
            var relations = new LBi.LinkRelations();

            relations.subscribe(/update-actionlist/, Interface.updateActionList);
            relations.subscribe(/save-actionlist/, Interface.saveActionList);
            relations.subscribe(/print-actionlist/, Interface.printActionList);

            relations.subscribe(/page/, Interface.doPage);
            relations.subscribe(/dialog/, Interface.doPopup);

            relations.subscribe(/submit/, Interface.doAjax);
            relations.subscribe(/p(u|o)p(u|o)p/, Interface.doPopup);

            relations.subscribe(/report/, Interface.reportIdea);
            relations.subscribe(/remove/, Interface.removeIdea);
            relations.subscribe(/idee/, Interface.viewIdea);
            relations.subscribe(/neighbour/, Interface.addNeighbour);
            relations.subscribe(/map-/i, Interface.handleMapClick);

            relations.subscribe(/hide/, Interface.toggleIntro);
            relations.subscribe(/welkom/, Interface.toggleIntro);
            relations.subscribe(/close/, Interface.close);
			relations.subscribe(/legend/, Interface.toggleLegend);

            relations.subscribe(/(^|\s)login/, Credentials.login);
            relations.subscribe(/(^|\s)logout/, Credentials.logout);
            relations.subscribe(/(^|\s)join/, Credentials.join);

            relations.subscribe(/tooltip/, Ideas.showTooltip);



            relations.subscribe(/(^|\s)poll/, Interface.doPoll);

            // forms
            this.forms = new LBi.Forms({
                formSelector: '.hinted',
                replaceInputs: false,
                hintValues: true,
                hintClass: 'blurred'
            });
			
			// toggle functionality legend
			Interface.initLegend();

            // neighbourhood gauge
            Interface.initGauge();

            // uploadify
            Interface.uploadify();
			
			// check for get variables in url
			Interface.checkGetVars();
			
			Ideas.init();
			
            // fire an initialize for external objects
            LBi.Dispatcher.fire('initialize');

			// generic column splitter
			$('.colsplit-2').easyListSplitter({ colNumber: 2 });
			
			$('ul.collapsable-tips .tip').hide();
			var tipsHarmonica = new LBi.Tabs({
			   selector: 'ul.collapsable-tips',
			   relation: 'tip'
			});

			// check if we should open the questionnaire 
			var questionnaireURL = $('body').attr("LBi:questionnaire");
			if (questionnaireURL) {
				Questionnaire.init(questionnaireURL);
			}
        },

        nodeInserted: function (e) {

            // refresh cufon
            Cufon.refresh();

            // unloadify file inputs
            Interface.uploadify(e.target);

            // update an active idea (if any)
            Interface.updateIdea();

            // and set up form validation
            var forms = $('div.form', e.target);
            forms.each(function () {
                new Form(this, Validator.RULES);
            });
        },

        flashOpenPage: function (url, stat) {
            var link = $('<a href="' + url + '" rel="page" lbi:stat="' + stat + '">proxy</a>');
            link.click();
        },

        flashOpenPopup: function (url, stat) {
            var link = $('<a href="' + url + '" rel="popup" lbi:stat="' + stat + '">proxy</a>');
            link.click();
        }
    };

    /**
    * Flash external-interface hook
    */
    window.flashOpenPage = Interpolis.flashOpenPage;
    window.flashOpenPopup = Interpolis.flashOpenPopup;

    /**
    * Interface
    * 
    */
    var Interface = {
		
		checkGetVars: function () {
			var params = this.getVariables();
			if (params) {
				if (params.action) {
					if (params.action === 'report') {
						var e = $.Event('click');
						setTimeout(function() {
							Interface.reportIdea(e);
						}, 2000);
					}
				}
				if (params.dialog) {
					if (params.dialog === 'preventie') {
						var anchor = $('<a />');
						anchor.attr('href', '/Templates/Public/Pages/Appointment/PreventieService.aspx');
						anchor.click(function(e) {
							Interface.doPopup(e);
						});
						anchor.trigger('click');
					}
				}
			}
		},
		
		getVariables: function() {
			var queryStringDictionary = { };
			var querystring = decodeURI(location.search);
			if (!querystring) {
				return false;
			}
			querystring = querystring.substring(1);
			var pairs = querystring.split('&');
			for (var i = 0; i < pairs.length; i++) {
				var keyValuePair = pairs[i].split('=');
				queryStringDictionary[keyValuePair[0]] = keyValuePair[1];
			}
			queryStringDictionary.toString = function() {
				if (queryStringDictionary.length == 0) {
					return false;
				}
				var toString = '?';
				for (var key in queryStringDictionary) {
					toString += key + '=' + queryStringDictionary[key];
				}
				return toString;
			};
			return queryStringDictionary;
		},
        toggleIntro: function (e) {
            var intro = $('div.startlayer');
            if (intro.length) {
                Interface.toggleElement(intro);
                e.preventDefault();
            }
        },

		updateActionList: function(e) {
			e.preventDefault();
			var $a = $(e.target).closest("a");
			
			
			$.get($a.attr("href"), function(data) {
			    LBi.DOM.write(document.getElementById('my-actions-container'), data);
				var count = $(data).find('li').length;
				$('.login .my-actions-counter span').html("("+count+")");
			});
		},
		
		printActionList: function(e) {
			e.preventDefault();
		},
		
		saveActionList: function(e) {
			e.preventDefault();
			$('#login input[name=save-tips]').val("1");
			Credentials.login();
		},
		
		initLegend: function () {
			var legend = $('div#map-legend');
			var legendOpen = false;
			legend.mouseenter(function () {
				if (legendOpen === false) {
					legend.animate({ bottom: 0 }, function () { legendOpen = true; legend.addClass('active'); });
				}
			});
			legend.mouseleave(function () {
				if (legendOpen === true) {
					legend.animate({ bottom: -130 }, function () { legendOpen = false; legend.removeClass('active'); });
				}
			});
		},

        toggleLegend: function (e) {
            e && e.preventDefault();
        },

        close: function (e) {
            var target = e ? $(e.target) : null;

            // credential elementen
            $('#login, #join').fadeOut();

            // safety gauge
            $('#safety .popup-large').fadeOut();

            // popups
            var options = null;
            if (target) {
                var isPopup = target.closest('div.popup').length ? true : false;
                var isPage = target.closest('div.page').length ? true : false;
                options = {
                    stacking: isPopup ? false : true
                };
            }

            Popups.close(options);

            e && e.preventDefault();
        },

        initGauge: function () {
            var safety = $('#safety');
            var gauge = safety.find('.gauge');
            var details = safety.find('.popup-large');

            gauge.click(function (e) {
                Interface.toggleElement(details);
                Safety.init();

                Statistics.count('/Community/safetyindicators');
                //                var link = $(e.target).closest('a');
                //                if (!link.length) {
                //                    Statistics.click({ target: gauge.find('a')[0] });
                //                }
            });
        },

        uploadify: function (root) {
            var fileInputs = $('input.file', root || document);
            if (fileInputs.length == 0) {
                return;
            }

            fileInputs.uploadify({
                uploader: '/static/swf/uploadify.swf',
                script: '/Templates/Public/Pages/Idea/SaveImage.aspx',
                cancelImg: '/static/images/icons/close.png',
                auto: true,
				wmode: 'transparent',
                folder: '/images/uploads/ideeen/',
                onSelect: function (e, q, file) {
                    var form = $(e.target).closest('.form');
                    var input = form.find('input[name=fileName]');
                    input.val(file.name);
                },
				onComplete: function(event, ID, fileObj, response, data) {
					var o = JSON.parse(response);
					$('.message .field .thumbnail').css("background-image", "url("+o.thumb+")");
			    }
				 
            });

            var theme = $('.idea-theme select', root || document);
            var thumb = $('.idea-image .thumbnail', root || document);
            theme.bind('change', function (e) {
                var cls = this[this.selectedIndex].value.replace('water', 'waterdamage');
                thumb.attr('class', 'thumbnail');
                thumb.addClass(cls);
            });
        },

        toggleElement: function (node) {
            if (node.is(':visible')) {
                node.fadeOut();
            } else {
                node.fadeIn();
            }
        },

        reportIdea: function (e) {
            $('#add-idea').addClass('active');
            Interpolis.Maps.addIdea();
            e.preventDefault();
            $(document.documentElement).animate({ scrollTop: 109 });
        },

        removeIdea: function (e) {
            $('#add-idea').removeClass('active');
            Interpolis.Maps.removeIdea();
            e.preventDefault();
        },

        updateIdea: function (e) {
            if (!Interpolis.Maps) {
                return;
            }

            var idea = Interpolis.Maps.ideaMarker;
            if (idea) {
                var pos = idea.getPosition();
                var address = idea.getLocation();

                $('input#txt1Location').val(address);
                $('#add-idea .location span').html(address);
                $('#hid1Lat').val(pos.lat());
                $('#hid1Lng').val(pos.lng());
            }
        },

        viewIdea: function (e) {
            if (Interpolis.Maps) {
                e.preventDefault();
                var id = /#(.*)/.exec(e.target.href)[1];
                Interface.close();
                Interpolis.Maps.activateIdea(id);
            } else {
                // follow link normally
            }
        },

        doPage: function (e) {
            e.preventDefault();

            var link = $(e.target).closest('a');
            Popups.open(link, {
                overlay: false,
                stacking: true
            });
        },

        doPopup: function (e) {
            e.preventDefault();
            var link = $(e.target).closest('a');
            Popups.open(link);
        },

        doAjax: function (e) {
            e.preventDefault();
            var link = $(e.target).closest('a');
            var rel = link.attr("rel");

            var types = /submit-([^ ]+)/i.exec(rel);
            var type = types ? types[1] : null;

            var form = link.closest('.form');
            var post = form.find('input,select,textarea').serialize();
            var action = form.attr('LBi:action');

            switch (type) {
                case 'comment':
                    $.post(action, post, Ajax.handleComment, 'html');
                    form.find('input:text, textarea').val('');
                    break;
                case 'idea':
                    $.post(action, post, Ajax.handleIdea, 'html');
                    break;
                case 'login':
                    $.post(action, post, Ajax.handleLogin, 'json');
                    break;
                case 'join':
                    $.post(action, post, Ajax.handleJoin, 'html');
                    break;
                case 'poll':
                    $.post(action, post, Ajax.handlePoll, 'html');
                    break;
                case 'grade':
                    $.post(action, post, Ajax.handleResponse, 'html');
                    $('#safety p.rating strong').html(Safety.getGrade());
                    Cufon.refresh();
                    break;
                default:
                    $.post(action, post, Ajax.handleResponse, 'html');
                    break;
            }
        },

        doPoll: function (e) {
            e.preventDefault();
            var href = e.target.href;
            $.get(href, Ajax.handlePoll);
        },

        addNeighbour: function (e) {
            var link = $(e.target);
            var buttons = link.closest('fieldset');
            var field = buttons.prev('fieldset');

            e.preventDefault();

            var clone = field.clone();
            var inputs = clone.find('input');

            var reg = /[0-9]+$/;
            var index = reg.exec(inputs[0].name);
            if (index.length > 0) {
                var followup = parseInt(index, 10) + 1;
                for (var i = 0; i < inputs.length; i++) {
                    var input = inputs[i];
                    input.id = input.id.replace(reg, followup);
                    input.name = input.name.replace(reg, followup);
                }
            }

            inputs.val('');
            buttons.before(clone);
        },

        handleMapClick: function (e) {
            if (Interpolis.Maps) {
                Interpolis.Maps.handleClick(e);
            } else {
                // follow link
            }
        }

    };

    /**
    * Ajax
    * 
    */
    var Ajax = {
        handleResponse: function (response) {
            Popups.display(response, {
                overlay: true
            });
            Statistics.poll(response);
        },

        handleComment: function (response) {
            var comment = $(response);
            var target = $('div.comments');
            if (target.length) {
				var first = target.find('.comment:first');
				if (first.length) {
					$(comment[0]).insertBefore(first);
				} else {
                	LBi.DOM.append(target, comment[0]);
				}
            }
			var count = parseInt($('.mini-votes:last cufontext').text()) + 1;
			$('.mini-votes:last strong').text(count);
			$('h2 .comments').text('(' + count + ')');
			Cufon.refresh();
			var offset = target.offset().top;
			var scrollEl = /webkit/i.test(navigator.userAgent) ? document.body : document.documentElement;
			$(scrollEl).animate({ scrollTop: offset });
            Statistics.poll(response);
        },

        handleIdea: function (response) {
            Popups.display(response, {
                overlay: true
            });

            //Interpolis.Maps.refresh();
            $('#add-idea').removeClass('active');

            // poll possible login during idea flow
            Ajax.pollLoginPopup();

            Statistics.poll(response);
        },

        pollLogin: function () {
            var loginURL = $('#login .form').attr('LBi:action');
            if (loginURL) {
                $.ajax({
                    type: 'GET',
                    dataType: 'json',
                    url: loginURL,
                    success: Ajax.handleLogin
                });
            }
        },

        handleLogin: function (response) {
            var field = $('#login fieldset');
            var error = field.find('span.error');
            if (response.login) {
				location.reload();
            } else {
                if (error.length) {
                    error.html(response.message);
                } else {
                    field.prepend('<span class="error">' + response.message + '</span>');
                }
            }

            if (response.analytics) {
                Statistics.count(response.analytics);
            }
        },
		
		pollLoginPopup: function () {
            var loginURL = $('#login .form').attr('LBi:action');
            if (loginURL) {
                $.ajax({
                    type: 'GET',
                    dataType: 'json',
                    url: loginURL,
                    success: Ajax.handleLoginPopup
                });
            }
        },

        handleLoginPopup: function (response) {
            var field = $('#login fieldset');
            var error = field.find('span.error');
            if (response.login) {
                $('#head .login ul').html(response.message);
                error.remove();
                $('#login').fadeOut();
            } else {
                if (error.length) {
                    error.html(response.message);
                } else {
                    field.prepend('<span class="error">' + response.message + '</span>');
                }
            }

            if (response.analytics) {
                Statistics.count(response.analytics);
            }
        },

        handleJoin: function (response) {
            var join = $('#join div.middle');
            LBi.DOM.replace($(response), join);
            Ajax.pollLogin();
            Statistics.poll(response);
        },

        handlePoll: function (response) {
            var poll = $('div.banner.poll');
            LBi.DOM.replace($(response), poll);
            Statistics.poll(response);
        }
    };

    /**
    * Validator
    * 
    */
    var Validator = {
        run: function (type, args, value) {
            return Validator.TESTS[type](value, args);
        },

        add: function (name, test) {
            Validator.TESTS[name] = test;
        },

        TESTS: {
            'filled': function (v) { if (v) return true; },
            '!filled': function (v) { if (!v) return true; },
            'equals': function (v, a) { return v === a; },
            '!equals': function (v, a) { return v !== a; },
            'min': function (v, n) { return v.length >= n; },
            'max': function (v, n) { return v.length <= n; },
            'regexp': function (v, ex) { return new RegExp(ex).test(v); },
            '!regexp': function (v, ex) { return !new RegExp(ex).test(v); }
        },

        RULES: [{
            event: 'change',
            element: '[title=naam], [title=achternaam], [title=straat], [title=idee], [title=woonplaats], [title=tussenvoegsel]',
            test: { type: 'max', args: 64 },
            suggest: 'Dit veld mag maximaal 64 karakters bevatten'
        }, {
            event: 'change',
            element: '[title=locatie]',
            test: { type: 'filled' },
            suggest: 'Is deze locatie niet goed? Sluit dit venster en versleep het icoon in de kaart naar de juiste plaats.'
        }, {
            event: 'change',
            element: '[title=postcode]',
            test: { type: 'filled' },
            rule: {
                test: {
                    type: 'regexp',
                    args: '^[0-9]{4}[ ]?[a-zA-Z]{2}$'
                }
            },
            suggest: 'Vul een geldige postcode in. Een voorbeeld van een geldige postcode is 1234AA.'
        }, {
            event: 'change',
            element: '[title=huisnummer]',
            test: { type: 'filled' },
            suggest: 'Vul een geldig huisnummer in.'
        }, {
            event: 'change',
            element: '[title=email]',
            test: { type: 'filled' },
            rule: {
                test: {
                    type: 'regexp',
                    args: '^[a-z0-9][a-z0-9_\.-]{0,}[a-z0-9]@[a-z0-9][a-z0-9_\.-]{0,}[a-z0-9][\.][a-z0-9]{2,4}$'
                }
            },
            suggest: 'Een voorbeeld van een geldig emailadres is voornaam.achternaam@domein.nl.'
        }, {
            event: 'change',
            element: '[title=password-new]',
            test: { type: 'filled' },
            rule: {
                test: {
                    type: 'max',
                    args: 64
                }
            },
            suggest: 'Geef een nieuw wachtwoord op. Een wachtwoord is hoofdletter gevoelig en bestaat uit minimaal 5 tekens.'
        }, {
            event: 'blur',
            element: '[title=password-repeat]',
            test: { type: 'password-repeat' },
            custom: {
                type: 'password-repeat',
                test: function (_v) { return (_v === $('[title=password-new]').val()); }
            },
            suggest: 'Om fouten te voorkomen vragen wij u het wachtwoord te herhalen.'
        }, {
            event: 'change',
            element: '[title=telefoonnummer], [title=mobiel]',
            test: {
                type: 'regexp',
                args: '^[0-9]{3,3}\-?[0-9]{7,7}$|^[0-9]{2,2}\-?[0-9]{8,8}$'
            },
            suggest: 'Een voorbeeld van een geldig telefoonnummer is 020-4600000 of 06-12345678.'
        }, {
            event: 'change',
            element: '[title=bericht], [title=omschrijving]',
            test: { type: 'filled' },
            rule: {
                test: {
                    type: 'max',
                    args: 255
                }
            },
            suggest: 'Dit veld mag maximaal 255 karakters bevatten'
        }]
    };


    /**
    * Form
    * 
    */
    function Form(element, rules) {
        this._el = element;
        this._R = [];
        this.parse(rules);
    }

    Form.prototype = {
        parse: function (_R) {
            for (var i = 0; i < _R.length; i++) {
                if (_R[i].custom) {
                    Validator.add(_R[i].custom.type, _R[i].custom.test);
                }

                if (_R[i].suggest) {
                    $(_R[i].element).bind('focus', { _s: this, _r: _R[i] }, function (e) { Form.suggest($(this), e.data._r.suggest); });
                    $(_R[i].element).bind('blur', { _s: this, _r: _R[i] }, function (e) { Form.suggest($(this), false); });
                }

                this.bind(this, _R[i]);
            }
        },

        bind: function (_s, _r) {
            _s._R.push(_r);
            $(_r.element).bind(_r.event, { _s: _s, _r: _r }, function (e) { e.data._s.validate(this, e.data._r); });
        },

        validate: function (_el, _r) {
            if (Validator.run(_r.test.type, _r.test.args, _el.value)) {
                //	if (_r.pass) _r.pass($(_el)); 
                Form.error($(_el), false);
                if (_r.rule) {
                    this.validate(_el, _r.rule);
                }
            } else {
                //	if (_r.fail) _r.fail($(_el)); 
                Form.error($(_el), true);
            }
        }
    };

    Form.suggest = function ($node, text) {
        if (text) {
            var _s = '<div class=\'note suggest\'><h4>' + $node.prev('label').text() + '</h4><p>' + text + '</p></div>';
            var suggest = $(_s).hide();
            $node.after(suggest.fadeIn('fast'));
        } else {
            $('.note.suggest').remove();
        }
    };

    Form.error = function ($node, toggle) {
        if (toggle) {
            $node.closest('.field').addClass('error');
        } else {
            $node.closest('.field').removeClass('error');
        }
    };


    /**
    * User credentials
    *
    */
    var Credentials = {
        login: function (e) {
            $('#login').fadeIn();
            e && e.preventDefault();
        },

        logout: function (e) {
            $.ajax({
                type: 'GET',
                dataType: 'json',
                url: $(e.target).attr('href'),
                success: function (response) {
					if (response.logout) {
						location.reload();
                        //$('#head .login ul').html(response.message);
                    }
                }
            });
            e.preventDefault();
        },

        close: function () {
            $('#login').fadeOut();
        },

        join: function (e) {
            $.ajax({
                type: 'GET',
                dataType: 'html',
                url: $(e.target).attr('href'),

                success: function (response) {
                    $('#join').toggle();
                    var join = $('#join div.middle');
                    LBi.DOM.replace($(response), join);
                    Statistics.poll(response);
                }
            });
            e.preventDefault();
        }
    };

	Ideas = {
		init: function () {
			$('.ideas').click(this.handleClick.bind(this));
			
			this.ideas = $('.ideas .list-item');
			if (this.ideas.length == 0) {
				return;
			}
			this.ideas.find('a.tooltip').hide();
			this.ideas.hover(function() { $(this).addClass("active") }, function() { $(this).removeClass("active") });
		},
		
		showTooltip: function(e) {
			e.preventDefault();
			$(e.target).parent().find('a.tooltip').toggle();
		},
		
		handleClick: function(e) {
			var anchor = $(e.target).closest('a');
			var href = anchor.attr("href");
			if (href && href.indexOf("#map") > -1) {
				var ideaId = anchor.closest('.list-item').attr("LBi:ideaId");
				Interpolis.Maps.activateIdea(ideaId);
			}
		}
	};
	
	Questionnaire = {
		
		init: function(url) {
			var target = {
				href: url
			}
            Popups.open(target, {
				onComplete: function() {
					$('#questionnaire-container .popup.questionnaire').hide().first().show();
					$('#questionnaire-container').click(function(e) {
 			            var link = $(e.target).closest('a');
						var rel  = link.attr("rel");
						var href = link.attr("href");
						if (href && href.indexOf("qq") > -1) {
							$('#questionnaire-container .popup.questionnaire').hide();
							var target = href.split('#')[1];
							$("#" + target).show();
						} else if (rel && rel.indexOf("cancel") > -1) {
							// notify server
		                    $.post(href);
						}
						if (rel && rel.indexOf("save") > -1) {
							// submit answers to server
				            var form = $('#questionnaire-container .form');
				            var elements = form.find('input,select,textarea');
							elements.each(function() {
								this.name = this.title;
							});
							var post = elements.serialize();
				            var action = form.attr('LBi:action');
		                    $.post(action, post);
						}
					});
				}
			});
		}
		
	};

    /**
    * Statistics
    *
    */
    Statistics = {
        click: function (e) {
            var link = $(e.target).closest('a,input[type=submit]');
            if (link.length) {
                var stat = link[0].getAttribute('LBi:stat');
                Statistics.count(stat);
            }
        },

        poll: function (response) {
            try {
                var stat = $('span.analytics', response).text();
                Statistics.count(stat);
            } catch (e) { }
        },

        count: function (stat) {
            var tag = $.trim(stat);
            if (tag && window.pageTracker) {
                window.pageTracker._trackPageview(tag);
                window.console && console.log(tag);
            }
        }
    }

    /**
    * Popup
    * 
    */
    var Popups = {
        Defaults: {
            overlay: true,
            stacking: false
        },

        init: function () {
            this.overlay = $('#overlay');
            this.popup = $('#popup-container');
            this.page = $('#page-container');
        },

        open: function (target, opts) {
            Credentials.close();

            var options = $.extend({}, Popups.Defaults, opts);
            var self = this;
            $.ajax({
                type: 'GET',
                url: target.href ? target.href : target.attr('href'),
                complete: function (response) {
                    self.display($(response.responseText), options);
					if (options.onComplete) options.onComplete.call();
                }
            });
        },

        close: function (options) {
            if (!options || options.stacking) {
                this.page.empty().hide();
            }

            this.popup.empty().hide();
            this.overlay.hide();
        },

        display: function (response, options) {
            this.close(options);

            if (options.overlay) {
                this.overlay.show();
            }

            if (options.stacking) {
                this.page.show();
                LBi.DOM.write(this.page[0], response);
            } else {
                this.popup.show();
                LBi.DOM.write(this.popup[0], response);
				var scrollEl = /webkit/i.test(navigator.userAgent) ? document.body : document.documentElement;
				$(scrollEl).animate({ scrollTop: 145 });
            }
        }
    };


    /**
    * Safety sliders
    * 
    */
    var Safety = (function () {

        var _DETAILS = '.details',
			_SLIDER = '.slider',
			_FILL = '.fill',
			_KNOB = '.knob',
			_INPUT = '.details input',
			_GRADE = '.grade';

        var opened = false;

        function slide() {
            var elements = $(_SLIDER);
            var e = null;
            for (var i = 0; i < elements.length; i++) {
                e = elements.eq(i);
                w = (e.outerWidth() / 100) * (e.next(_INPUT).attr('value'));
                e.find(_FILL).animate({ width: w }, 'slow');
            }

            Grade.render();
            opened = true;
        }

        function bind() {
            $(_SLIDER).mousedown(function (e) {
                Slideable.place($(this), e);
                Slideable.start($(this));
                e.preventDefault();
            });

            $(_DETAILS).mouseup(function (e) {
                Slideable.stop($(this));
                e.preventDefault();
            });
        }

        var Slideable = {
            start: function (S) {
                var _s = this;
                $(_DETAILS).bind('mousemove', function (e) {
                    _s.place(S, e);
                });
            },

            stop: function (D) {
                D.unbind('mousemove');
            },

            place: function (S, e) {
                var w = e.pageX - S.offset().left;
                if (w < 0) {
                    S.find(_FILL).css('width', 0);
                    S.next(_INPUT).val(0);
                } else if (w < S.outerWidth()) {
                    S.find(_FILL).css('width', w);
                    S.next(_INPUT).val(Math.round((w / S.outerWidth()) * 100));
                } else {
                    S.find(_FILL).css('width', '100%');
                    S.next(_INPUT).val(100);
                }
                Grade.render();
            }
        };

        var Grade = {
            render: function () {
                this.grade = 0;
                var input = $(_INPUT);

                for (var i = 0; i < input.length; i++) {
                    this.grade += parseInt(input.eq(i).val());
                }

                this.grade = Math.round(this.grade / input.length) / 10;
                if (this.grade.toString().length < 2) this.grade += '.0';
                $(_GRADE).html(this.grade);
            }
        };

        return {
            init: function () {
                if (!opened) {
                    slide();
                }
                bind();
            },

            getGrade: function () {
                return Grade.grade;
            }
        }
    })();

    /**
    * Bind to domloaded
    */
    $(function () {
        Interpolis.init();
    });

    /**
    * Expose
    */
    return Interpolis;

})(jQuery);
