﻿(function($) {
	function Storage() {
		_sessionStorage = true;
		_storeName = '';
	};
	$.extend(Storage.prototype, {
		init: function(key) {
			if (key == undefined || key == null) {
				return;
			}
			_sessionStorage = window.sessionStorage != undefined || window.sessionStorage != null
			if (!_sessionStorage) {
				_storeName = $.storage._getStoreName();
				var c = $('#_storage_' + key);
				if (c == undefined || c == null || $(c).length == 0) {
					$('#_storage').append("<div id=\"_storage_" + key + "\" type=\"text\" class=\"userData\" style=\"behavior:url(#default#userData);\" />");
				}
			}
		},
		load: function(key) {
			if (_sessionStorage) {
				var v = window.sessionStorage[key]
				if (v != undefined && v != null && typeof v == 'object')
					return v.value;
				else
					return v;
			}
			else {
				var c = document.getElementById('_storage_' + key)
				if (c != undefined && c != null && $(c).length > 0) {
					c.load(_storeName);
					return c.getAttribute('persist');
				}
			}
			return '';
		},
		save: function(key, value) {
			if (_sessionStorage) {
				window.sessionStorage[key] = value;
			}
			else {
				var c = document.getElementById('_storage_' + key)
				if (c != undefined && c != null && $(c).length > 0) {
					var dt = new Date();
					dt.setMinutes(dt.getMinutes() + 20);

					c.expires = dt.toUTCString();
					c.setAttribute("persist", value);
					c.save(_storeName);
				}
			}
		},
		_getStoreName: function() {
			var re = new RegExp("(dmwin_)", "gi");
			if (!re.test(window.name)) {
				var name = 'dmwin';
				for (var i = 0; i < 3; i++) {
					name = name + '_' + Math.floor(Math.random() * 1000);
				}
				window.name = name;
			}
			return window.name;
		}
	});
	$(document).ready(function() {
		$.storage = new Storage();
	});
})(jQuery);
(function($) {
	function History() {
		_past = [];
		_callback = '';
	};

	$.extend(History.prototype, {
		init: function(callback) {
			_callback = callback;
			$.storage.init('history');

			var url = document.location.href;
			var h = $.storage.load('history');
			if (h != undefined && h != null && h != '')
				_past = h.split(',');
			$.history.add(url);
		},
		add: function(url) {
			var l = $.history._findUrl(url, false);
			var em = false;
			if (l >= 0) {
				em = $.history._isExactMatch(url, _past[l]);
				$.history._popTo(l, !em);
			}
			if (!em)
				_past.push(url);
			$.storage.save('history', _past.join(','));
		},
		load: function(url) {
			var loadUrl = url;
			var l = $.history._findUrl(url, false);
			if (l >= 0) {
				loadUrl = _past[l];
				$.history._popTo(_past[l], $.history._isExactMatch(url, _past[l]));
				$.storage.save('history', _past.join(','));
			}

			if (_callback != '')
				_callback(loadUrl);
			else
				window.location = loadUrl;
		},
		_popTo: function(url, inclusive) {
			var n;
			if (typeof url == 'number' && isFinite(url)) {
				n = _past.length - url - 1;
			}
			else {
				var l = $.history._findUrl(url, false);
				n = _past.length - l - 1;
			}
			if (n >= 0 && inclusive) n++;
			for (var i = 0; i < n; i++) _past.pop();
		},
		_findUrl: function(url, exact) {
			var index = -1;
			for (var i = _past.length - 1; i >= 0; i--) {
				if (exact && $.history._isExactMatch(url, _past[i])) {
					index = i;
					break;
				}
				else if (!exact && $.history._isRelativeMatch(url, _past[i])) {
					index = i;
					break;
				}
			}
			return index;
		},
		_isRelativeMatch: function(url, compare) {
			var pattern = '(' + $.history._stripQueryString(url) + ')';
			var re = new RegExp(pattern, 'i');
			return re.test(compare);
		},
		_isExactMatch: function(url, compare) {
			var pattern = '^(' + url + ')$';
			var re = new RegExp(pattern, 'i');
			return re.test(compare);
		},
		_stripQueryString: function(url) {
			return url.replace(/\?.*/gi, '');
		}
	});
	$(document).ready(function() {
		$.history = new History(); // singleton instance
	});
})(jQuery);
