function show() {
    $('#load').hide();
    $('#content').show();
}

function hide() {
    $('#load').show();
    $('#content').hide();
}

function showMessage() {
    if (arguments.length > 2) (arguments[2]) ? show() : hide();
    $('#message-box').attr('class', arguments[0]).find('p').text(arguments[1]).end().fadeIn();
    var timeout = setTimeout(function() {
	$('#message-box').fadeOut('slow');
    }, 3000);
}

var FullAJAX = (function(){
    var _sCurrentHash, _oFrame, _oLinks, _intervalId, _sResponse, _oPagesSettings;
    var hashed_page = [ 'index' ];
    
    var _sModule, _sDetails, _sPage;
    var _oProvider = {
        async: true, cach: true, data: {}, url: null, dataType: 'html',
        beforeSend: function() {
	    Loader.sShow();
	    $('#console').removeClass();
            $('#small-loading-indicator').show();
        },       
        error: function(XMLHttpRequest, textStatus) {
            Loader.sHide();
	    showMessage('error', 'Шаблон отсутствует на сервере!');
	},
        success: function(HTML) {
	    Loader.sHide();
	    showMessage('success', (_sModule) ? _sModule + ' ' + _sDetails : _sDetails, true);
	    selectCurrentItemMenu();
	    try {
		_oPagesSettings[_currentPage.page].obj.loadPage(HTML, _currentPage);
	    } catch(err) {		
		_oPagesSettings.pages.obj.loadPage(HTML, _currentPage);
	    };
        },
        timeout: 10000        
    };
    var _sBlankPage = '/i.html?';
    var _currentPage = { extra: [], module: '', page: '' };

    var isIE = $.browser.msie && ($.browser.version - 0) < 7;
    
    var hash = function () {
	var sHash = '';
	if (!isIE) {
	    sHash = location.hash.substring(1);
	} else {
	    sHash = location.href.match(/.+#(.*)/);
	    sHash = sHash[1] || '';
	}	
    	return (arguments.length == 0) ? sHash : _sCurrentHash = arguments[0];
    }
    var setAllHash = function (sHash) {
    	hash(sHash);
	if (isIE) setFrameHash(sHash);
    }
    var setFrameHash = function (sHash) {
	_oFrame.src = _sBlankPage + sHash;
    }
    var createIFrame = function () {
    	var oFrame = document.createElement('IFRAME'); 
 	oFrame.name = oFrame.id = 'AHAHFrm'; 
 	oFrame.width = oFrame.height = oFrame.frameBorder = 0; 
 	document.documentElement.appendChild(oFrame);
 	return oFrame;
    }
    var getLink = function () {
	var link = '';
	clearParamsCurentPage();
	var parts = getPartsHash();
	if (parts.extra) {
	    _currentPage.extraObj = getExtraParamsObj(parts.extra);
	    _currentPage.extra = parts.extra;
	}
	var page = parts.page;
	setParamCurrentPage('page', page);
	
	if (parts.module) {
	    var module = parts.module;
            setParamCurrentPage('module', module);
            var linkByModule = getBlankLink(module);
            link = linkByModule.replace('<%page%>', page);
	} else {
	    link = (_oLinks[page]) ? _oLinks[page] : _oLinks.simple_url.replace('<%page%>', page);
	}
	return link;
    }
    
    var getBlankLink = function (name) {
	var link = '';
	if (_oLinks[name]) link = _oLinks[name]; else {
            setDefaultCurrentPage();
            link = _oLinks.link_default;
            location.hash = _oLinks.hash_default;
            hash(_oLinks.hash_default);
        }
        return link;
    }
    var getPartsHash = function () {
	var params = {
	    page: '',
	    module: '',
	    extra: ''
	};
	var partsLink = hash().split('/');
	var pageAndExtra = partsLink[partsLink.length - 1].split('?');
	params.page = pageAndExtra[0];
	if (pageAndExtra[1]) params.extra = pageAndExtra[1];
	if (partsLink.length > 2) params.module = partsLink[1];
        return params;
    }
    var getExtraParamsObj = function (sExtraParams) {
	var obj = {};
        var params = sExtraParams.split('&');
	for (var i = 0; i < params.length; i++) {
	    var param = params[i].split('=');
	    obj[param[0]] = (param[1]) ? param[1] : '';
	}
        return obj;
    }
    var replaceExtraParams = function (sLink) {
	var link = sLink;
	var aParts = getPartsHash();
	var aParams = getExtraParams(aParts);
	for (var i = 0; i<aParams.length; i++) {
            var aNameAndValue = aParams[i].split('=');
            link = link.replace('<%'+aNameAndValue[0]+'%>', aNameAndValue[1]);
  	}
  	return link;
    }
    var blankPage = function () {
	if (hash() == '') {
	    location.hash = _sCurrentHash = _oLinks.hash_default.substr(1);
	    hash(_sCurrentHash);
            if (isIE) setFrameHash(_sCurrentHash);
	} else setAllHash(hash());
    }
    var linkListner = function () {
	_intervalId = setInterval(watchHash, 300);
    }
    var sendRequest =  function (link) {
        link = clearEmptyExtraParans(link);
        _oProvider.url = link;
        _sPage = _currentPage.page;
	_sModule = _currentPage.module;
	_sDetails = 'Шаблон успешно загружен.';
	$.ajax(_oProvider);
    }
    var getPage = function () {
	var oPage = getPartsHash();
  	var isExtraParams = oPage.length > 2;
  	var sContentPath = getLink();
  	if (isExtraParams) sContentPath = replaceExtraParams(sContentPath);
	sendRequest(sContentPath);
    }
    var getContent = function() {
	$('#console').removeClass();
  	getLink();
	try {
	    _oPagesSettings[_currentPage.page].obj.loadPage('', _currentPage);
	} catch(err) {};
    }
    var clearParamsCurentPage = function () {
	_currentPage = {
            extra: [],
            module: '',
            page: ''
	};
    }
    var setDefaultCurrentPage = function () {
	_currentPage = {
            extra: [],
            module: '',
            page: 'index'
	};
    }
    var setParamCurrentPage = function (param, value) {
	_currentPage[param] = value;
    }
    var getFrameHash = function () {
	return _oFrame.src.replace('/i.html?', '');
    }
    function watchHash() {
	var newHash = hash();
 	if (_sCurrentHash != newHash) {
	    if ($.trim(location.hash) == '' || location.hash == '/index') _sCurrentHash = location.hash = '/index?banner_id=';
            setAllHash(newHash);
	    var sPage = getPartsHash().page;
	    var isHashed = false;
	    for (var i = 0; i < hashed_page.length; i++) if (hashed_page[i] == sPage) isHashed = true;
	    (_currentPage.page != sPage && !isHashed) ? getPage() : getContent();
	}
    }
	
    function clearEmptyExtraParans(link) {
        var getName = /<%\w+%>/gi;
	var aValue = link.match(getName);
	if (aValue) {
            var clearQuot = /[<%>]/g;
            var length = aValue.length;
            while (length--) {
		var sName = aValue[length].replace(clearQuot, '');
                var sNameAndValue = sName + '=' + aValue[length];
		var pNameAndValue = new RegExp('(&' + sNameAndValue + '|' + sNameAndValue + ')', 'gi');
		link = link.replace(pNameAndValue, '')
            }
	}
	return link;
    }
    
    function selectCurrentItemMenu() {
	$('#navigation').find('a[href=#/' + _currentPage.page + ']').parent().addClass('cur');
    }

return {
    init: function(oModules){
        if (isIE) _oFrame = createIFrame();
	_oPagesSettings = oModules;
        _oLinks = _oPagesSettings.links;
        blankPage();
	getLink();
	if (_currentPage.page != 'index') {
	    getPage();
	} else {
	    if (_oPagesSettings.index.firstFlag && location.hash == '#/index?banner_id=') {
	    } else getContent();
	    _oPagesSettings.index.firstFlag = false;
	}
	linkListner();
    },
    getPage: function() {
    	clearParamsCurentPage();
	getPage();
    },
    getAnswerContent: function() {
	return _sResponse;
    },
    watchFrameHash: function(oLink) {
	var newHash = decodeURIComponent(oLink.search.substr(1));
 	if (_sCurrentHash != newHash) {
            hash(newHash);
            location.hash = newHash;
            var sPage = getPartsHash().page;
	    var isHashed = false;
	    for (var i = 0; i < hashed_page.length; i++) if (hashed_page[i] == sPage) isHashed = true;
	    (_currentPage.page != sPage && !isHashed) ? getPage() : getContent();
	}	
    },
    getPartsHash: function() {
	return getPartsHash();
    },
    refreshPage: function() {
    	getPage();
    },
    addHashedPage: function(str) {
	hashed_page[hashed_page.length] = str;
    },
    changeHash: function(sHash) {
	hash(sHash);
    },
    hash: function() {
	return hash();
    }
};
})();
