/************************************************
    common.js

    제작자 : 최영규(hooriza.com)

	연락처 : http://hooriza.com/
	         hooriza.nospam at gmail.com

	제작일 : 2006년 1월 29일
	수정일 : 2006년 5월 8일

    제작자 동의없는 재배포를 금지합니다
************************************************/

function parseQueryString(query)
{
	var ret = [];

	if (!query) query = location.search;
	if (query.charAt(0) == "?") query = query.substr(1);

	var tokens = query.split("&");
	var token;

	for (var i = 0; token = tokens[i]; i++)
	{
		var keyval = token.split("=", 2);
		ret[keyval[0]] = keyval[1];
	}

	return ret;
}

function mergeQueryString(query)
{
	var ret = "";

	for (var key in query)
	{
		if (typeof(query[key]) == "string" || typeof(query[key]) == "number")
			ret += "&" + key + "=" + query[key];
	}

	return ret.substr(1);
}

function urlEncode(str)
{
	if (typeof str != "string") return str;

	var ret = "";
	var code, hexcode;

	for (i = 0; i < str.length; i++)
	{
		code = str.charCodeAt(i);

		// 숫자, 영문자, 한글 빼고 싹다
		if ((code >= 97 && code <= 122) || (code >= 65 && code <= 90) || (code >= 48 && code <= 57) || code >= 256)
		{
			ret += str.charAt(i);
		}
		else
		{
			hexcode = code.toString(16);
			if (hexcode.length == 1) hexcode = "0" + hexcode;

			ret += "%" + hexcode;
		}
	}

	return ret;
}

function urlDecode(str)
{
	if (typeof str != "string") return str;
	return unescape(str);
}

function getOffsetPos(element)
{
	var valueT = 0, valueL = 0;
	do
	{
		valueT += element.offsetTop  || 0;
		valueL += element.offsetLeft || 0;
		element = element.offsetParent;

	} while (element);

	return [valueL, valueT];
}

function isNumber(v)
{
	if (typeof v == "number") return true;
	return !isNaN(parseInt(v));
}

function dom2Array(dom)
{
	var ary = new Array();
	// var isnumber = new RegExp("^[0-9]+$");
	var text;

	var nodes = selectNodes(dom, "*");

	for (var i = 0; i < nodes.length; i++)
	{
		text = nodes[i].textContent ? nodes[i].textContent : nodes[i].text;

		/*if (isnumber.test(text))	ary[nodes[i].tagName] = parseInt(text);
		else						*/ary[nodes[i].tagName] = text;
	}

	return ary;
}

function selectNodes(node, str)
{
	if (typeof node.selectNodes != "undefined")
		return node.selectNodes(str);

	var tokens = str.split("/");
	var dummy;

	for (var i = 0; i < tokens.length; i++)
	{
		if (!tokens[i]) continue;

		if (node.length) node = node[0];
		node = node.getElementsByTagName(tokens[i]);
	}

	return node;
}

function selectSingleNode(node, str)
{
	if (typeof node.selectSingleNode != "undefined")
		return node.selectSingleNode(str);

	return selectNodes(node, str)[0];
}

function randomKey(prefix)
{
	return (prefix ? prefix : "") + parseInt(Math.random(1) * 10000000);
}

var EVENT =
{
	addEvent : function(obj, evnt, func)
	{
		if (typeof addEventListener == "function")
		{
			if (evnt == "mousewheel")	evnt = "DOMMouseScroll";

			obj.addEventListener(evnt, function(e)
			{
				switch (e.type.toUpperCase())
				{
				case "DOMMOUSESCROLL":
					e.wheelDelta = -e.detail * 40;
					break;
				}

				e.srcElement = e.target;

				func(e); 
			}, false);
		}
		else
		{
			obj.attachEvent("on" + evnt, function(e) { func(e); });
		}
	},

	stopEvent : function(evt)
	{
		try
		{
			evt.returnValue = false;
			evt.preventDefault();
		}
		catch(e)
		{
		}
		
		return false;
	}
};

function AJAX(_method)
{
	var self = this;

	var method;
	var xmlhttp = null;

	var oncomplete;
	var onerror;

	self.getHttpRequest = function()
	{
		if (xmlhttp)
		{
			xmlhttp.abort();

			delete xmlhttp;
			xmlhttp = null;
		}

		try { xmlhttp = new XMLHttpRequest(); }
		catch(e)
		{
			try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
			catch(e)
			{
				try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
				catch(e) { }
			}
		}

		return xmlhttp;
	}

	self.setMethod = function(_method)
	{
		method = (_method && _method.toUpperCase() == "POST" ? "POST" : "GET");
	}

	self.requestURL = function(_url, _query, _oncomplete, _onerror)
	{
		xmlhttp = self.getHttpRequest();

		oncomplete = _oncomplete;
		onerror = _onerror;

		if (typeof _query == "object")
		{
			var query = "";

			for (var i in _query)
				if (i != "extend")
					query += urlEncode(i) + "=" + urlEncode(_query[i]) + "&";

			_query = query;
		}

		if (method == "GET")
		{
			_url += "?" + _query;
			_query = "";
		}

		// alert(_url);

		xmlhttp.open(method, _url, _oncomplete || _onerror ? true : false);

		if (_oncomplete || _onerror)
			xmlhttp.onreadystatechange = function() { self.onComplete(xmlhttp); }

		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		try
		{
			xmlhttp.send(_query);
		}
		catch(e)
		{
		}

		return xmlhttp;
	}

	self.onComplete = function(xmlhttp)
	{
		if (xmlhttp.readyState == 4)
		{
			// alert(xmlhttp.responseText);

			try
			{
				var error = (xmlhttp.status && xmlhttp.status != 200);

				if (error) error = { "code" : xmlhttp.status, "status" : xmlhttp.statusText };

				if (error && onerror)	onerror(error);
				else					oncomplete(error ? error : xmlhttp);
			}
			catch(e)
			{

			}

			xmlhttp = null;
		}
	}

	self.setMethod(_method);
}

var xslcache = new Array();

function XSLT(xsl)
{
	var self = this;

	var xslkey;

	var xmlhttp = new AJAX();
	var xslobj = null;
	var processor = null;
	
	if (typeof XSLTProcessor != "undefined")
		processor = new XSLTProcessor();

	var pos = xsl.lastIndexOf("?");

	if (pos > -1)	xslkey = xsl.substr(0, pos);
	else			xslkey = xsl;

	if (!xslcache[xslkey])
		xslcache[xslkey] = xmlhttp.requestURL(xsl, "");

	xslobj = xslcache[xslkey];

	if (processor && xslobj)
		processor.importStylesheet(xslobj);

	self.transformHTML = function(xml)
	{
		var html;

		if (processor)
		{
			var serializer;
			var resultdoc;

			serializer = new XMLSerializer();
			resultdoc = processor.transformToDocument(xml);
			html = serializer.serializeToString(resultdoc);
		}
		else
			html = xml.transformNode(xslobj);

		return html;
	}
}

function getCookieVal(offset)
{
	var endstr = document.cookie.indexOf(";", offset);

	if (endstr == -1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

function getCookie(name)
{
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;

	while (i < clen)
	{
		var j = i + alen;

		if (document.cookie.substring(i, j) == arg)
			return getCookieVal (j);

		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break; 
	}
	return null;
}

function setCookie(name, value)
{
	var argv = setCookie.arguments;
	var argc = setCookie.arguments.length;

	var expires = (2 < argc) ? argv[2] : null;
	var path = (3 < argc) ? argv[3] : null;
	var domain = (4 < argc) ? argv[4] : null;
	var secure = (5 < argc) ? argv[5] : false;

	document.cookie = name + "=" + escape (value) +
		((expires == null) ? "" : 
		("; expires=" + expires.toGMTString())) +
		((path == null) ? "" : ("; path=" + path)) +
		((domain == null) ? "" : ("; domain=" + domain)) +
		((secure == true) ? "; secure" : "");
}

function returnValue(value)
{
	return value;
}

// 출처 : http://www.krikkit.net/howto_javascript_copy_clipboard.html
function copy_clip(meintext)
{
	if (window.clipboardData) 
	{
		// the IE-manier
		window.clipboardData.setData("Text", meintext);

		// waarschijnlijk niet de beste manier om Moz/NS te detecteren;
		// het is mij echter onbekend vanaf welke versie dit precies werkt:
	}
	else if (window.netscape) 
	{ 
		// dit is belangrijk maar staat nergens duidelijk vermeld:
		// you have to sign the code to enable this, or see notes below 
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

		// maak een interface naar het clipboard
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) return;

		// maak een transferable
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) return;

		// specificeer wat voor soort data we op willen halen; text in dit geval
		trans.addDataFlavor('text/unicode');

		// om de data uit de transferable te halen hebben we 2 nieuwe objecten 
		// nodig om het in op te slaan
		var str = new Object();
		var len = new Object();

		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);

		var copytext=meintext;

		str.data=copytext;

		trans.setTransferData("text/unicode",str,copytext.length*2);

		var clipid=Components.interfaces.nsIClipboard;

		if (!clip) return false;

		clip.setData(trans,null,clipid.kGlobalClipboard);
	}

	// alert("Following info was copied to your clipboard:\n\n" + meintext);
	return false;
}

