var platformVersion = '0.4';

function uriEncode(data)
{
	// 여기서 몇가지 특수문자를 치환해야 한다.
	// 일반적일 링크로는 들어올일이 없다고 생각을 하지만.
	// 검색같은 특수한 상황에서의 문자열 처리가 필요하다.
	// 만약 검색에서만 사용된다고 하면... 사실 이럴 필요가 없고 검색함수에 넣어도 될 듯.
	//
	// IE짜증나
	if (data != "")
	{
		var encdata = '';
		var datas = data.split('/');
		for (var i = 0; i < datas.length; i++)
		{
			if (i == 0)
			{
				encdata = datas[i];
			}
			else
			{
				encdata += "/" + encodeURIComponent(datas[i]);
			}
		}
	}
	else
	{
		encdata = "";
	}
	return encdata;
}


jQuery(document).ready(function($)
{
	$.history.init(function(url, ajaxFlag)
	{
		if (ajaxFlag != true)
		{
			if (url == "" || url == "/" || (url.indexOf('://') > 2 && url.indexOf('://') < 10))
			{
				_gaq.push(['_trackPageview', '/']);
				url = '/main';
			 	window.location.hash = url;
			}
			else
			{
				_gaq.push(['_trackPageview', url]);
				
//				alert("a1="+url);
				if(url.indexOf("search")>-1)
				{
					url = uriEncode(url); // 오 IE뿐만아니라 로그인시 등에 버그가 있어서
					
//					if ($.browser.msie)
//					{
//						url = uriEncode(url);
//					}
//					else
//					{
//						url = url.split("%").join("%25");// 와 신기하다 replaceAll임
//					}
				}
//				alert("a2="+url);
				
				$('#baseLoading').css('filter', 'alpha(opacity=70)').fadeIn();
				$('#baseFrame').load(url);
			}
			
			if($('#loginFromUrl2'))
			{
				$('#loginFromUrl2').val(url); // 로그인 시에 어디서 로그인 했는지 기록해 준다.
			}
		}
	}, {unescape:"/;=&?!"});

	$('a').live('click', function(e)
	{
		var url = $(this).attr('href');
		var onclickEvent = $(this).prop('onclick'); // 없으면 null반환
		var relTarget = $(this).prop('target'); // 없으면 ''반환
		
		$('#baseLoading').css('filter', 'alpha(opacity=70)').fadeIn();
		
		// 물음표(?)로 시작하는것이 있으면 지금 주소에다가 뒤의것을 붙여준다.
		if (url.indexOf('?') == 0)
		{
			var hash = window.location.hash.replace(/^#/, '');
			
			var hashIdx = hash.indexOf('?');
			if (hashIdx > -1) {
				// 이전에 이미 다른 파라미터가 있을경우 병합 해 줘야 한다.
				var hashUrl = hash.substring(0, hashIdx);
				var hashQuery = hash.substring(hashIdx + 1);

				var urlQuery = url.substring(1);
				var queryString = (hashQuery + "&" + urlQuery).split("&");

				var queryMap = new Object();
				for (var iParam = 0; iParam < queryString.length; iParam++)
				{
					var aParam = queryString[iParam].split("=");
					queryMap[aParam[0]] = aParam[1];
				}

				var newQueryString = "";

				for (var prop in queryMap)
				{
					newQueryString = newQueryString + "&" + prop + "=" + queryMap[prop];
				}

				newQueryString = newQueryString.substring(1);
				$.history.load(hashUrl + "?" + newQueryString, false);
			}
			else
			{
				$.history.load(hash + url, false);
			}
			return false;
		}

		// 로컬 호스트와 같으면 잘라버리는건 어떨까?
		// 시작 URL이 7 이하면? 그것은!!! 내부것!!! 
		if ($.browser.msie && ($.browser.version < 8 || document.documentMode < 8))
		{
			if (url.indexOf(window.location.host) > 5)
			{
				url = url.replace('http://', '');

				var i = 0;
				if (url.indexOf('#') > -1)
				{
					i = 1;
				}

				url = url.substring((url.indexOf('/')) + i, url.length);
			}
		}

		if (url.indexOf('://') > 2 && url.indexOf('://') < 10)
		{
			window.open(url, '_brank');
			$('#baseLoading').fadeOut('slow');
			return false;
		}

		if (onclickEvent == null && relTarget == '')
		{
			// Google Analytics
			// millky, myhome등 전면 화면 이동시
			_gaq.push(['_trackPageview', url]);
			
			$.history.load(url);
			return false;
		}

		if (onclickEvent == null && relTarget != '')
		{
			if (relTarget == '_brank')
			{
				window.open(url, '_brank');
				$('#baseLoading').fadeOut('slow');
				return false;
			}

			if (relTarget == '_self' || relTarget == '_parent' || relTarget == '_top')
			{
				location.href = url;
				return false;
			}

			if (relTarget.indexOf('#') == 0)
			{
				$.post(url, {}, function(data)
				{
					// Google Analytics
					// inner 같은 페이지에서 작은 부분 변경시
					_gaq.push(['_trackPageview', url]);
					$(relTarget).html(data);
					$('html, body').animate({scrollTop:0}, 333);
					$('#baseLoading').fadeOut('slow');
				});

				$.history.load(url, true);
				
//				var html_top_offset = $('html').offset().top;
//				var target_offset = $(relTarget).offset();
//				var target_top = target_offset.top;
////				alert(html_top_offset+" "+target_top );
//
//				if(Math.abs(html_top_offset)>Math.abs(target_top))
//				{
//					target_top = target_top - 60;
//					if(target_top < 0)
//					{
//						target_top = 0;
//					}
//					
//					//goto that anchor by setting the body scroll top to anchor top
//					$('html, body').animate({scrollTop:target_top}, 150);
//				}
				
				
				return false;
			}
			else
			{
				$('#baseLoading').fadeOut('slow');
				// #이 안붙은것에 대한 처리를 고민하자.
			}
		}
		else
		{
			$('#baseLoading').fadeOut('slow');
			// rel이 없는것은 단순 자바스크립트다. 원하는걸 실행해주면 됨
		}
	});
});


// Ajax로 특정 URL을 로드합니다.
function goUrl(relTarget, url)
{
	$('#baseLoading').css('filter', 'alpha(opacity=70)').fadeIn();
	
	$.post(url, {}, function(data)
	{
		// Google Analytics
		// inner 같은 페이지에서 작은 부분 변경시
		_gaq.push(['_trackPageview', url]);
		$(relTarget).html(data);
		$('html, body').animate({scrollTop:0}, 333);
	});

	$.history.load(url, true);

	$('#baseLoading').fadeOut('slow');
}

(function($)
{
	var locationWrapper =
	{
		put : function(hash, win)
		{
			(win || window).location.hash = hash;
		},
		get : function(win)
		{
			// IE6뒤에 ? 안붇는 경우.
			// var hash = ((win || window).location.hash).replace(/^#/, '');
			var hash;
			if ($.browser.msie && ($.browser.version == 6 || document.documentMode == 6))
			{
				hash = ((win || window).location.href).substring(
						((win || window).location.href).indexOf("#") + 1,
						(win || window).location.href.length);
				
				// 만약 '?'로 시작하는것이 있다면 대응하도록 수정
				if(hash.indexOf('?') == 1)
				{
					hash = ((win || window).location.hash).replace(/^#/, '');
				}
			}
			else
			{
				hash = ((win || window).location.hash).replace(/^#/, '');
			}

			
			try
			{
				return $.browser.mozilla ? hash : decodeURIComponent(hash);
			}
			catch (error)
			{
				return hash;
			}
		}
	};

	var iframeWrapper =
	{
		id : "__jQuery_history",
		init : function()
		{
			var html = '<iframe id="' + this.id + '" style="display:none" src="javascript:false;" />';
			$("body").prepend(html);
			return this;
		},
		_document : function()
		{
			return $("#" + this.id)[0].contentWindow.document;
		},
		put : function(hash)
		{
			var doc = this._document();
			doc.open();
			doc.close();
			locationWrapper.put(hash, doc);
		},
		get : function()
		{
			return locationWrapper.get(this._document());
		}
	};

	var implementations = {};

	implementations.base =
	{
		callback : undefined,
		type : undefined,

		check : function()
		{
		},
		load : function(hash, ajaxFlag)
		{
		},
		init : function(callback)
		{
			self.callback = callback;
			self._init();
		},
		_init : function()
		{
		}
	};

	implementations.timer =
	{
		_appState : undefined,
		_init : function()
		{
			var current_hash = locationWrapper.get();
			self._appState = current_hash;
			self.callback(current_hash);
			setInterval(self.check, 100);
		},
		check : function()
		{
			var current_hash = locationWrapper.get();

			if (current_hash != self._appState)
			{
				self._appState = current_hash;
				self.callback(current_hash);
			}
		},
		load : function(hash, ajaxFlag)
		{
			if (hash != self._appState)
			{
				locationWrapper.put(hash);
				self._appState = hash;
				self.callback(hash, ajaxFlag);
			}
			else
			{
				$('#baseLoading').fadeOut('slow');
			}
		}
	};

	implementations.iframeTimer =
	{
		_appState : undefined,
		_init : function()
		{
			var current_hash = locationWrapper.get();
			self._appState = current_hash;
			iframeWrapper.init().put(current_hash);
			self.callback(current_hash);
			setInterval(self.check, 100);
		},
		check : function()
		{
			var iframe_hash = iframeWrapper.get(), location_hash = locationWrapper.get();

			if (location_hash != iframe_hash)
			{
				if (location_hash == self._appState)
				{
					// user used Back or Forward button
					self._appState = iframe_hash;
					locationWrapper.put(iframe_hash);
					self.callback(iframe_hash);
				}
				else
				{
					// user loaded new bookmark
					self._appState = location_hash;
					iframeWrapper.put(location_hash);
					self.callback(location_hash);
				}
			}
		},
		load : function(hash, ajaxFlag)
		{
			if (hash != self._appState)
			{
				locationWrapper.put(hash);
				iframeWrapper.put(hash);
				self._appState = hash;
				self.callback(hash, ajaxFlag);
			}
			else
			{
				$('#baseLoading').fadeOut('slow');
			}
		}
	};

	var self = $.extend({}, implementations.base);

	if ($.browser.msie && ($.browser.version < 8 || document.documentMode < 8))
	{
		self.type = 'iframeTimer';
	}
	else
	{
		self.type = 'timer';
	}

	$.extend(self, implementations[self.type]);
	$.history = self;

})(jQuery);

