// --- Event Handler Functions --- //
// from: http://www.scottandrew.com/weblog/articles/cbs-events
function addEvent(obj, evType, fn, useCapture)
{
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	else
		alert("Handler could not be attached");
}

function removeEvent(obj, evType, fn, useCapture)
{
	if (obj.removeEventListener){
		obj.removeEventListener(evType, fn, useCapture);
		return true;
	}
	else if (obj.detachEvent){
		var r = obj.detachEvent("on"+evType, fn);
		return r;
	} 
	else
		alert("Handler could not be removed");
}


// --- Ajax function --- //
var ajaxOb = false;
if (window.XMLHttpRequest)
	ajaxOb = new XMLHttpRequest();

function ajaxGetFile(uri, id, errorMsg, callback)
{
	if (ajaxOb && ajaxOb.readyState < 4)
		ajaxOb.abort();

	if (window.ActiveXObject)
		ajaxOb = new ActiveXObject('Microsoft.XMLHTTP');

	ajaxOb.onreadystatechange = function ()
	{
		if (ajaxOb.readyState == 4)
		{
			if (callback)
				callback(ajaxOb.responseText, ajaxOb.status);
			
			else if (ajaxOb.responseText && ajaxOb.status != 404)
				document.getElementById(id).innerHTML = ajaxOb.responseText;
			
			else
				document.getElementById(id).innerHTML = errorMsg;
		}
	}
	ajaxOb.open('GET', uri, true);
	ajaxOb.send(null);
	return;
}


// --- JSON --- //
function buildDocumentNode(node) {
	node['element'];
	node['element']['attr'];
	node['element']['content'];
	node['element']['child'];
}

function createDocumentElement(element, attr, content) {
	documentElement = document.createElement(element);
	for (var i=0; i<attr.length; i++) {
		documentElement.setAttribute(attr[i].name, attr[i])
	}
	elementContent = document.creatTextNode(content);
	documentElement.appendChild(elementContent);
	return documentElement;
}


// --- output functions --- //
function include(uri)
{
	// the HTML way
	document.write('<script src="'+ uri +'" type="text/javascript"></script>');
	
	// the XHTML way
// 	var script = document.createElement('script');
// 	script.setAttribute('type', 'text/javascript');
// 	script.setAttribute('src', uri);
// 	document.getElementsByTagName('head')[0].appendChild(script);
	
}

function HTMLSpecialChars(str)
{
	if (typeof str == 'string') {
		str = str.replace(/\</g,'&#060;');
		str = str.replace(/\>/g,'&#062;');
	}
	return str;
}

function print_r(array)
{
	if (typeof array == 'object' && array[0])
	{
		var str = '';
		for (var i=0; i<array.length; i++)
		{
			array[i] = print_r(array[i]);
			str += array[i];
			if (array[i+1]) str += ', ';
		}
		str = 'Array( '+ str +')';
		return HTMLSpecialChars(str);
	}
	return HTMLSpecialChars(array);
}


// --- Header Module functions --- //
function loadModule(uri)
{
	createModule('header');
	
	var loadModuleError = '<p><strong>エラー</strong></p><p>トラブルが発生したようです。再操作してください。</p><form><p class="buttons"><input type="button" Value="Close" onclick="removeModule()" /></p></form>';
	
	ajaxGetFile(uri, 'module', loadModuleError);
}

function createModule(id)
{
	if (document.getElementById('moduleWrap'))
		removeModule(id);
	
	module = document.createElement('div');
	module.setAttribute("id","moduleWrap");
	module.innerHTML = '<div id="module"><p style="padding-top:2em;"><img src="'+ baseURI +'img/loading.gif" style="padding:0 .5em;margin:0 0 -4px;border:none;" /><strong>Loading ...</strong></p></div>';
	// see other.css for styles
	document.getElementById(id).appendChild(module);
}

function removeModule(id)
{
	if (!id) id = 'header';
	if ( document.getElementById('moduleWrap') )
		document.getElementById(id).removeChild(document.getElementById('moduleWrap'));
}

function submitModuleForm(uri)
{
	var formInputs = document.getElementById('moduleForm').getElementsByTagName('input');
	var formTextAreas = document.getElementById('moduleForm').getElementsByTagName('textarea');
	var query = "?moduleForm";
	
	for (var i=0; i<formInputs.length; i++)
	{
		// TODO: check for radio/check boxes
		if (formInputs[i].getAttribute("name"))
			query += "&"+ formInputs[i].getAttribute("name") +"="+ formInputs[i].value;
	}
	for (var i=0; i<formTextAreas.length; i++)
	{
		if (formTextAreas[i].getAttribute("name"))
			query += "&"+ formTextAreas[i].getAttribute("name") +"="+ formTextAreas[i].value;
	}
	
	loadModule(uri+query);
}


// --- Get positon of element --- //
// from: http://www.quirksmode.org/js/findpos.html
function findPosX(obj)
{
        var curleft = 0;
        if (obj.offsetParent)
        {
                while (obj.offsetParent)
                {
                        curleft += obj.offsetLeft
                        obj = obj.offsetParent;
                }
        }
        else if (obj.x)
                curleft += obj.x;
        return curleft;
}

function findPosY(obj)
{
        var curtop = 0;
        if (obj.offsetParent)
        {
                while (obj.offsetParent)
                {
                        curtop += obj.offsetTop
                        obj = obj.offsetParent;
                }
        }
        else if (obj.y)
                curtop += obj.y;
        return curtop;
}


// --- include other functions --- //
include(baseURI +"js/cookies.js");
include(baseURI+"js/nifty-corners.js");
include(baseURI+"js/xparse.js");
include(baseURI+"js/fat.js");

