var controller = function(window, settings) {
    /* Private properties */
    var _messenger = window;
    var _settings  = settings;
    
    var _sp        = null;
    var _mp        = null;
    var _ep        = null;
    var _cp        = null;
    
    var _curr_view = '';


    /* Private Methods */
    function _dispatch(view, json) {
        _curr_view = view;

        $(_messenger).trigger('view::' + view, [json]);
    }


    /* Public Functions and Variables */
    return {
        /**
        * Init function
        *
        * @method init
        * @public
        */
        init: function() {
            $(_messenger).bind('sp::search::received', function(e, o) {
                _dispatch('results', o);
            });
        },
        /**
        * 
        *
        * @method dispatch
        * @param q {string} the location
        * @public
        */
        dispatch: function(q) {
            var l = window.location.href.replace(window.location.search, '');
            q = q.replace(l + '?', '');

            var args = {};
            var view = '';
            if (q) {
                q = unescape(q).split('&');

                for (var i in q) {
                    if(typeof q[i] != 'string'){
                        continue;
                    }  
                    
                    var p = q[i].split('=');
                    if (p[0]) {
                        if (p[0] == 'view') {
                            view = p[1] || '';
                        }
                        else {
                            args[p[0]] = p[1] || '';
                        }
                        
                    }
                }
            }

            if (view == '') {
                view = 'home';
            }

            $(_messenger).trigger('all::view::dispatched', [view]);
            
            _dispatch(view, args);
        },
        /**
        * 
        *
        * @method explodeQueryString
        * @param q {string} the location
        * @public
        */
        explodeQueryString: function (q) {
            var args = {};

            if (q) {
                q = unescape(q).split('&');

                for (i in q) {
                    if(typeof q[i] != 'string'){
                        continue;
                    }
                    var p = q[i].split('=');
                
                    if (p[0]) {
                        if (p[0] == 'view') {
                            view = p[1] || '';
                        }
                        else {
                            args[p[0]] = p[1] || '';
                        }
                    }
                }
            }
        
            return args;
        },
        /**
        * 
        *
        * @method implodeSearchArgs
        * @param args {object} the location
        * @public
        */
        implodeSearchArgs: function () {
            var q = '';

            for (var i = 0; i < arguments.length; i++) {
                var o = arguments[i];
                for (k in o) {
                    var p = k + '=' + o[k] + '&';
                    q += p;
                }
            }
            return q.replace(/\&$/, '');
        },
        /**
        * 
        *
        * @method implodeSearchArgs
        * @param args {object} the location
        * @public
        */
        getArgsByNamespace: function (q, ns) {
            var args = {};
            var ns   = ns + '_';

            if (q) {
                q = unescape(q).split('&');

                for (i in q) {
                    if(typeof q[i] != 'string'){
                        continue;
                    }
                    var p = q[i].split('=');
                
                    if (p[0] && p[0].indexOf(ns) == 0) {
                        //var name = p[0].substring((ns).length);
                        var name = p[0];
                        
                        if (name != '') {
                            args[name] = p[1] || '';
                        }
                    }
                }
            }
        
            return args;
        },
        /**
        * 
        *
        * @method link
        * @param args {object} the location
        * @public
        */
        link: function(args) {
            var q = '';

            for (k in args) {
                var p = k + '=' + args[k] + '&';
                q += p;
            }
            //console.log('link:'+q);           
            return q.replace(/\&$/, '');
        },
        /**
        * 
        *
        * @method setSearchPanel
        * @public
        */
        setSearchPanel: function(sp) {
            _sp = sp;
        },
        /**
        * 
        *
        * @method setMapPanel
        * @public
        */
        setMapPanel: function(mp) {
            _mp = mp;
        },
        /**
        * 
        *
        * @method setExplorePanel
        * @public
        */
        setExplorePanel: function(ep) {
            _ep = ep;
        },
        /**
        * 
        *
        * @method setCommunityPanel
        * @public
        */
        setCommunityPanel: function(cp) {
            _cp = cp;
        },
        /**
        * 
        *
        * @method getPermLink
        * @public
        */
        getPermLink: function() {
            if (_sp == null || _mp == null || _ep == null) {
                return '';
            }

            return  '?view=' + _curr_view +'&' +
                    _sp.getState() +'&' +
                    _mp.getState() +'&' +
                    _ep.getState();
        },
        /**
        * 
        *
        * @method getPermLink
        * @public
        */
        getCurrentView: function() {
            return _curr_view;
        },
        /**
        * 
        *
        * @method hasCampingSearch
        * @public
        */
	    hasCampingSearch: function() {
	        var q  = this.getPermLink();
	        var sf = this.getArgsByNamespace(q, 'sf') || {};
			
	        return sf['sf_facility_type'] == 'camping';
	    },
        /**
        * 
        *
        * @method hasCampingFilter
        * @public
        */
        hasCampingFilter: function() {
            var q  = this.getPermLink();
            var ep = this.getArgsByNamespace(q, 'ep') || {};
			
			return ep['ep_c'] == 'on';
        }
    }
}(window, settings);

$(function() {
    controller.init();
});

