﻿(function (route) {

    var _url,
        _prevUrl,
        
        _controller,
        _prevController,
        
        _action,
        _prevAction,
        
        _item,
        _prevItem;

    route.defaultUrl = '/home/index/';

    // Call the appropriate function on the appropriate object
    var onHashChange = function (e) {
        var newUrl,
            handled = false;

        if (e) {
            newUrl = e.fragment;
        } else {
            newUrl = $.param.fragment();
        }
        newUrl = newUrl.toLowerCase();

        if (_url !== newUrl) {
            _prevUrl = _url;
            _prevController = _controller;
            _prevAction = _action;
            
            _url = newUrl ? newUrl : route.defaultUrl;
            
            var params = _url.split('/');
            params.shift(); // remove empty string
            
            _controller = params.shift();
            _action = params.shift();

            // Get the appropriate object
            var controller = idw[_controller];
            if (controller) {
                if (_controller !== _prevController) {
                  // broadcast nav event
                  idw.navigation.update(0, _controller);
                }

                // Get the appropriate function
                var action = controller[_action];
                if (action) {
                    if (idw.transition.isReady) {
                        //  call the function on the object immediately
                        action.apply(controller, params);
                    } else {
                        //  If anything is animating, stop transitions and call action on callback
                        idw.transition.reset(function () {
                            action.apply(controller, params);
                        });
                    }
                    idw.navigation.update(1, _controller + '-' +  _action);
                    //  either way, it matched a successful route
                    handled = true;
                }
            }
        }
        if (!handled) {
            //todo - replace
            alert('error');
            //idw.msgPanel.show();
        }
    };

    // Return the current URL
    route.getUrl = function (aspect) {
    	switch(aspect) {
			case 'controller':
				return _controller;
				break;
			case 'action':
				return _action;
				break;
			case 'url':
			default:
				return _url;
		}
    };

    // Return the previous URL
    route.getPrevious = function (aspect) {
    	switch(aspect) {
    		case 'controller':
				return _prevController;
				break;
    		case 'action':
    			return _prevAction;
    			break;
    		case 'url':
			default:
				return _prevUrl;
    	}
    };

    // Wire the hashchange function and call on document ready
    $(document).ready(function () {
        $(window).bind('hashchange', onHashChange);
        onHashChange();
    });

})(idw.route = idw.route || {});

