// Simple AJAX With History v2.2.2
//
// The MIT License (modified)
// 
// Copyright (c) 2009 by Maximilian Speicher -- http://sawh.googlecode.com/.
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// YOU ARE OBLIGED TO PUT THE FOLLOWING INTO A PUBLICLY VISIBLE SECTION (ABOUT,
// IMPRINT OR SIMILAR) OF EVERY PROJECT WHICH HAS BEEN REALISED USING THIS
// SOFTWARE:
// This project is using Simple AJAX With History (http://sawh.googlecode.com).





/**************************************/
/********** Global Variables **********/
/**************************************/


var loadingMsg = 'Loading...';

var initPages = 'content/*/winners.php?no=1';

var titles =
{
	'About': 'content/*/about\\.html',
	'Criteria': 'content/*/criteria\\.html',
	'Judges': 'content/*/judges\\.html',
	'Nostalgia': 'content/*/nostalgia\\.html',
	'Search': 'content/*/search\\.html',
	'Submit': 'content/*/submit\\.html',
	'Winners #$1': 'content/*/winners\\.php\\?no=(\\d)',
	'Search for: $1': 'content/*/winners\\.php\\?search=(.*)'
};

var mainTitle = 'The Modern Web Design Award';

var titleSeperator = ' | ';

var approved =
{
	'content': ['about\\.html', 'criteria\\.html', 'judges\\.html', 'nostalgia\\.html', 'search\\.html', 'submit\\.html', 'winners\\.php\\?no=\\d', 'winners\\.php\\?search=.*']
};

var frequentFunctions = function()
{
	initLytebox();
};





/****************************************/
/********** SAWH Functionality **********/
/****************************************/

var active		= "";
var activeObj		= new Object;
var ie			= false;
var links		= new Array;
var token		= "";

function ajax(__div, __url)
{
	document.getElementById(__div).innerHTML = loadingMsg;

	var request = new makeRequest();

	request.onreadystatechange = function() { displayContent(request, __div, __url); };
	request.open('GET', __url, true);
	request.send(null);	
}

function displayContent(__request, __div, __url)
{
	if (__request.readyState != 4) return;

	if (__request.status == 200)
		document.getElementById(__div).innerHTML = __request.responseText;
	else
		alert('Error 404: ' + __url + ' not found!');

	getLinks();
	frequentFunctions();
}

function getLinks()
{
	links = document.getElementsByName('sawh');
}

function getToken()
{
	token = "";

	if (location.href.indexOf('#') != -1)
		token = unescape(location.href.split('#')[1]);

	var newTokenParts = new Array;
	var tokenObj = new Object;
	var tokenParts = token.split('/**/');

	var part;
	var partApproved = false;
	var regexpr;
	var result;

	for (var i=0; i<tokenParts.length; i++)
	{
		if (tokenParts[i].indexOf('/*/') != -1)
		{
			part = tokenParts[i].split('/*/');

			if (part[0] == '' || part.length != 2)
				continue;

			tokenObj[part[0]] = part[1];
		}
	}

	for (var element in tokenObj)
	{
		if (approved[element])
		{
			for (var i=0; i<approved[element].length; i++)
			{
				regexpr = new RegExp('^' + approved[element][i] + '$', '');
				result = regexpr.exec(tokenObj[element]);

				if (result)
				{
					partApproved = true;
					break;
				}
			}
		}

		if (approved[element] && !partApproved)
			continue;

		partApproved = false;

		if (!document.getElementById(element))
			continue;
		else
		{
			if (document.getElementById(element).title != 'sawh')
				continue;
		}

		newTokenParts.push(element + '/*/' + tokenObj[element]);
	}

	token = newTokenParts.join('/**/');
}

function makeRequest()
{
	try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
	try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
	try { return new XMLHttpRequest(); } catch(e) {}

	alert('XMLHttpRequest wird von Deinem Browser nicht unterstützt.');
	return false;
}

function markActiveLinks()
{
	for (var i=0; i<links.length; i++)
	{
		if (links[i].title != '')
		{
			var classPrefix = links[i].className.split('-')[0];
			var marked = true;
			var triggers = links[i].title.split('/**/');

			var regexpr;
			var result;
			var triggerContent;
			var triggerDiv;

			links[i].className = classPrefix + '-default';

			for (var j=0; j<triggers.length; j++)
			{
				triggerDiv = triggers[j].split('/*/')[0];
				triggerContent = triggers[j].split('/*/')[1];

				if (!activeObj[triggerDiv])
				{
					marked = false;
					break;
				}
				else
				{
					regexpr = new RegExp('^' + triggerContent + '$', '');
					result = regexpr.exec(activeObj[triggerDiv]);

					if (!result)
						marked = false;
				}
			}

			if (marked)
				links[i].className = classPrefix + '-selected';
		}
	}
}

function onHistoryChanged(__token)
{
	var activeModified = '/**/' + active + '/**/';
	var activeParts;
	var tokenParts = __token.split('/**/');

	var part;

	for (var i=0; i<tokenParts.length; i++)
	{
		part = tokenParts[i].split('/*/');

		if (activeModified.indexOf('/**/' + tokenParts[i] + '/**/') == -1)
		{
			if (part[1] == '')
				document.getElementById(part[0]).innerHTML = '';
			else
				ajax(part[0], part[1]);
		}
	}

	document.title = mainTitle;
	active = syncToken(__token, active);
	activeParts = active.split('/**/');

	for (var i=0; i<activeParts.length; i++)
	{
		part = activeParts[i].split('/*/');
		activeObj[part[0]] = part[1];
	}

	if (ie)
		self.IE.location.href = '__sawh.html?'+escape(active);

	markActiveLinks();
	setTitle();
}

function polling()
{
	getToken();

	if (active != token && token != '')
		onHistoryChanged(token);
}

function sawh(__token)
{
	location.href = '#' + escape(syncToken(unescape(__token), token));
}

function SAWHInit()
{
	if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion.substring(22, 23)) < 8)
		ie = true;

	getLinks();
	getToken();

	var initPagesSplit = initPages.split('/**/');
	var initPagesPart;
	var tokenModified = '/**/' + token + '/**/';

	if (initPages != '')
	{
		for (var i=0; i<initPagesSplit.length; i++)
		{
			initPagesPart = initPagesSplit[i].split('/*/');

			if (tokenModified.indexOf('/**/' + initPagesPart[0] + '/*/') == -1)
				token = (token == '') ? initPagesPart.join('/*/') : (token + '/**/' + initPagesPart.join('/*/'));
		}
	}

	if (ie)
		document.getElementsByTagName("body")[0].innerHTML += ('<iframe src="__sawh.html?'+escape(token)+'" name="IE" onload="triggerIEHistory()" style="display: none"></iframe>');

	location.replace("#" + escape(token));

	window.setInterval("polling()", 10);
}

function setTitle()
{
	var memorized;
	var elementNew;
	var elementParts;
	var part;
	var regexpr;
	var result;
	var set = true;

	for (var element in titles)
	{
		elementNew = element;
		elementParts = titles[element].split('/**/');
		memorized = ['a not really interesting array element'];

		for (var j=0; j<elementParts.length; j++)
		{
			part = elementParts[j].split('/*/');

			if (!activeObj[part[0]])
			{
				set = false;
				break;
			}
			else
			{
				regexpr = new RegExp('^' + part[1] + '$', '');
				result = regexpr.exec(activeObj[part[0]]);

				if (!result)
					set = false;
				else
				{
					if (result.length > 1)
					{
						for (var k=1; k<result.length; k++)
							memorized.push(result[k]);
					}
				}
			}
		}

		for (var j=1; j<memorized.length; j++)
		{
			elementNew = element.replace("$" + j, memorized[j]);
		}

		if (set)
		{
			document.title = elementNew + titleSeperator + mainTitle;
			break;
		}

		set = true;
	}
}

/*
 * @returns (the parts contained in the primary token) + (the parts contained in the secondary token but NOT in the primary token)
 */
function syncToken(__primaryToken, __secondaryToken)
{
	var token1 = __primaryToken.split('/**/');
	var token2 = __secondaryToken.split('/**/');

	var newToken = '';

	for (var i=0; i<token2.length; i++)
	{
		var div = token2[i].split('/*/')[0];

		if (newToken.indexOf(div) == -1)
		{
			if (__primaryToken.indexOf(div+'/*/') == -1)
				newToken = (newToken != '') ? (newToken+'/**/'+token2[i]) : (newToken+token2[i]);
			else
			{
				for (var j=0; j<token1.length; j++)
				{
					if (token1[j].split('/*/')[0] == div)
						newToken = (newToken != '') ? (newToken+'/**/'+token1[j]) : (newToken+token1[j]);
				}
			}
		}
	}

	for (var i=0; i<token1.length; i++)
	{
		var div = token1[i].split('/*/')[0];

		if (newToken.indexOf(div) == -1)
		{
			if (__secondaryToken.indexOf(div+'/*/') == -1)
				newToken = (newToken != '') ? (newToken+'/**/'+token1[i]) : (newToken+token1[i]);
			else
			{
				for (var j=0; j<token2.length; j++)
				{
					if (token2[j].split('/*/')[0] == div)
						newToken = (newToken != '') ? (newToken+'/**/'+token2[j]) : (newToken+token2[j]);
				}
			}
		}
	}

	return newToken;
}

function triggerIEHistory()
{
	var splitSrc = self.IE.location.href.split('__sawh.html?');
	location.href = "#" + splitSrc.pop();
}

SAWHInit();