// JavaScript Document

function site_url(url)
{
	url = sid(url);
	var prefix = base_url();
	if (url.indexOf(prefix)>-1)
		return url;
	else
		return prefix+url;
}

function redirect(url)
{
	window.location.href = site_url(url);
}

function request()
{
	var s = "";
    var c = document.forms[0].elements;
	for(var i=0; i<c.length; i++) 
	{
		obj = c[i];		
		if (obj.type == 'checkbox' || obj.type == 'radio') 
		{	
			if (obj.checked)
			{
				if (obj.value)
					s += obj.name+"="+obj.value+"&";
				else
					s += obj.name+"=on&";
			}
		} else {
			// urldecode in PHP
			s += obj.name+"="+escape(encodeURI(obj.value))+"&";
		}
	}
	return s;
}

function __dopostback(target, args)
{
	var f = document.forms[0];
	f.__EVENTTARGET.value = target;
	f.__EVENTARGUMENT.value = args;
	f.submit();
}

function __docallback(target, args, url, callback, func)
{
	var f = document.forms[0];
	
	f.__EVENTTARGET.value = target;
	f.__EVENTARGUMENT.value = args;
	
	if (url.length == 0)
		url = f.action;

	ajaxRun_post(url, request(), callback, func);
}

function registerEvent(o, t, f) 
{
	if (o.addEventListener)
	{
		if (t == 'mousewheel')
		{
			o.addEventListener('DOMMouseScroll', f, false);
		} 
		o.addEventListener(t, f, false);
	}
	else if (o.attachEvent) 
		o.attachEvent('on'+ t, f);
	else 
		o['on'+ t] = f;
};

function unregisterEvent(o, t, f) 
{
	if (o.removeEventListener) 
	{
		if (t == 'mousewheel')
		{
			o.removeEventListener('DOMMouseScroll', f, false);
		} 		
		o.removeEventListener(t, f, false);
	} else if (o.detachEvent) 
		o.detachEvent('on'+ t, f);
	else 
		o['on'+ t] = null;
};

function eventObject(evt) 
{
    return (evt) ? evt : window.event;
}

function senderObject(evt) 
{
    evt = eventObject(evt);
	return (evt.target) ? evt.target : evt.srcElement;
}

function elementObject(id)
{
	if (document.getElementById)
		return document.getElementById(id);
	else if (document.all)
		return document.all[id];
	else if (document.layers)
		return document.layers[id];
	return null;
}

function styleObject(name, nest)
{
	var w3c = document.getElementById ? true : false;
	var iex = document.all ? true : false;
	var ns4 = document.layers ? true : false;	
	nest = nest ? 'document.'+nest+'.' : '';
	return w3c ? document.getElementById(name).style : iex ? document.all[name].style : ns4 ? eval(nest+'document.'+name) : false;	
}

// AJAX
function ajaxObject()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  return xmlHttp;
}


function ajaxRun(url, callback, func, full_url)
{
	var xmlHttp = ajaxObject();
	
	xmlHttp.onreadystatechange = function()
	{
		// We are going to write some code here	
		if (xmlHttp.readyState == 4)
		{
			// Get the data from the server's response 
			if (callback)
				callback.call(this, xmlHttp.responseText);
			if (func)
				func.call(this, true);
		}
	}	
	
	if (func)
		func.call(this, false);
	if (full_url)
		xmlHttp.open("GET", url, true);
	else
		xmlHttp.open("GET", site_url(url), true);
	xmlHttp.send(null);			
}

function ajaxRun_post(url, query, callback, func, full_url)
{
	var xmlHttp = ajaxObject();
	
	xmlHttp.onreadystatechange = function()
	{
		// We are going to write some code here	
		if (xmlHttp.readyState == 4)
		{
			// Get the data from the server's response 
			if (callback)
				callback.call(this, xmlHttp.responseText);
			if (func)
				func.call(this, true);
		}
	}	
	
	if (func)
		func.call(this, false);
	if (full_url)
		xmlHttp.open("POST", url, true);
	else
		xmlHttp.open("POST", site_url(url), true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	//xmlHttp.setRequestHeader("Content-length", obj.length);
	//xmlHttp.setRequestHeader("Connection", "close");
	xmlHttp.send(query);
}

var clientUI =
{	
	// Validation
	addValidation : function (group, param)
	{
		if (clientUI.validations[group] == undefined)
			clientUI.validations[group] = [];
		
		var o = new ValidationItemClass(param);
		clientUI.validations[group][clientUI.validations[group].length] = o;
	},	
			
	validations : [],
	
	onEnter : function (evt)
	{
		var e = eventObject(evt);
		if ((e.which && e.which == 13) || 
			(e.keyChar && e.keyChar == 13) ||
			(e.keyCode && e.keyCode == 13))
			return true;
		else
			return false;
	},
	
	evalScript : function (data)
	{
		var head = document.getElementsByTagName("head")[0] || document.documentElement;
		var script = document.createElement("script");
		script.type = "text/javascript";
		try{
			script.appendChild(document.createTextNode(data));
		} catch(e) {}		
		try{
			script.text = data;
		} catch(e) {
			script.setAttribute('text', data);
		}			
		head.insertBefore(script, head.firstChild);
		head.removeChild(script);
	},
	
	scanScript : function (html)
	{
		var ScriptFragment = '<script([^>]*)>([\\S\\s]*?)<\/script>';
		var matchAll = new RegExp(ScriptFragment, 'img');
		var matchOne = new RegExp(ScriptFragment, 'im');
		
		var ScriptSrcFragment = 'src="([\\S\\s]*?)"';
		var matchSrcOne = new RegExp(ScriptSrcFragment, 'im');

		var ScriptSrcFragment2 = 'src=\'([\\S\\s]*?)\'';
		var matchSrcOne2 = new RegExp(ScriptSrcFragment2, 'im');
		
		var x = html.match(matchAll);
		for (var i in x)
		{
			if (isNaN(i)) continue;
			var y = x[i].match(matchOne);			
			if (y)
			{
				var z = y[1].match(matchSrcOne2)
				if (z)
				{
					clientUI.ajax({'url':z[1], 
								   'callback':clientUI.evalScript
								  });
					continue;
				}
				
				var z = y[1].match(matchSrcOne)
				if (z)
				{
					clientUI.ajax({'url':z[1], 
								   'callback':clientUI.evalScript
								  });
					continue;
				}
				
				if (y[2])
					clientUI.evalScript(y[2]);
			}
			
		}
		
		return html.replace(matchAll, '');
	},
	
	ajax : function(option)
	{
		var method = option.method?option.method:'GET';
		var full_url = option.full_url?option.full_url:true
		
		if (method == 'GET')
			ajaxRun(option.url, option.callback, option.loading, full_url);
		else
			ajaxRun_post(option.url, option.query, option.callback, option.loading, full_url);
	}
};

function validateItems(gname)
{
	if (gname == undefined)
		gname = 'default';
		
	if (clientUI.validations[gname] != undefined)
	{
		var items = clientUI.validations[gname];
		for (var i=0; i<items.length; i++)
		{			
			if (!items[i].validate())
			{
				items[i].focus();
				return false;
			}
		}		
		return true;
	}
	return true;
}

function validateAllItems(gname)
{
	if (gname == undefined)
		gname = 'default';
	var ret = true;
	if (clientUI.validations[gname] != undefined)
	{
		var items = clientUI.validations[gname];
		for (var i=0; i<items.length; i++)
		{
			if (!items[i].validate())
			{
				items[i].focus();
				ret = false;
			}
		}
	}
	return ret;
}

ValidationItemClass = function(param)
{
	this.id = param.id;
	this.validation_func = param.validation_func;
	this.error_msg = param.error_msg;
	this.error_div = param.error_div;
	this.validation_data = param.validation_data;
	
	this.validate = function()
	{
		var o = elementObject(this.id);
		var f = eval(this.validation_func);
		var ret = f.call(this, o, this.validation_data);

		if (ret == false)
		{
			if (this.error_div)
			{
				var e = elementObject(this.error_div);
				e.innerHTML = this.error_msg;
			} else
				alert(this.error_msg);
			return false;
		} else {
			if (this.error_div)
			{
				var e = elementObject(this.error_div);
				e.innerHTML = '';
			}
		}
		
		return true;
	}
	
	this.focus = function()
	{
		var o = elementObject(this.id);
		o.focus();
	}
}
