/*---------------------------------------------------------------------
# ISDE
#
# Internet System Devloper's Environment
#
# Copyright (C) 2009 Takamura Techno Office All Rights Reserved.
#
# @Package : isde ajax script liblary
# @Author  : mao-kapo
# @Date    : 2009/07/03
# @Rewite  :
# @Date    :
---------------------------------------------------------------------*/
/**
 * Ajax 向けの XMLhttpIObject を生成します。
 * @param callbackFunction コールバック関数
 * @return XMLhttpIObject
 */
function createXMLHttpRequest( callbackFunction )
{
	var XMLhttpObject = null;
	try
	{
		XMLhttpObject = new XMLHttpRequest();
	}
	catch( e1 )
	{
		try
		{
			XMLhttpObject = new ActiveXObject( "Msxml2.XMLHTTP" );
		}
		catch( e2 )
		{
			try
			{
				XMLhttpObject = new ActiveXObject( "Microsoft.XMLHTTP" );
			}
			catch( e3 )
			{
				return null;
			}
		}
	}

	if( XMLhttpObject ) XMLhttpObject.onreadystatechange = callbackFunction;

	return XMLhttpObject;
}

/**
 * フォームデータを send するデータを構築します。
 * @param formObj フォームオブジェクト
 * @return フォームデータを send するデータ
 */
function buildPostData( formObj )
{
	var length = formObj.elements.length;
	var sendData = "";
	for( i = 0; i < length; i++ )
	{
		var elem = formObj.elements[ i ];
		var elementType = elem.type;
		var elementName = elem.name;

		if( elementType == "text" || elementType == "password" || elementType == "textarea" || elementType == "hidden" )
		{
			var elementValue = encodeURIComponent( elem.value );
			sendData += "&" + elementName + "=" + elementValue;
		}
		else if( elementType == "radio" || elementType == "checkbox" )
		{
			if( elem.checked )
			{
				elementValue = encodeURIComponent( elem.value );
				sendData += "&" + elementName + "=" + elementValue;
			}
		}
		else if( elementType == "select-one" || elementType == "select-multiple" )
		{
			var opt = elem.options;
			for( j = 0; j < elem.options.length; j++ )
			{
				if( opt[ j ].selected )
				{
					elementValue = encodeURIComponent( opt[ j ].value );
					sendData += "&" + elementName + "=" + elementValue;
				}
			}
		}
	}

	if( sendData.length > 0 )
	{
		sendData = sendData.substring( 1 );
	}

	return sendData;
}

/**
 * HTTP リクエストを発行します。
 * @param callbackFunction コールバック関数
 * @param url リクエストを発行するURL
 * @param formObj フォームデータを送信する場合はフォームオブジェクトを設定します。null の場合は URL に対し GET リクエストします。
 * @param asyncFlag 非同期フラグで省略可能です。true を設定すると非同期にアクセスします。デフォルトは true です。
 * @return XMLhttpIObject
 */
function httpRequest( callbackFunction, url, formObj, asyncFlag )
{
	if( asyncFlag == true )
	{
	}
	else if( asyncFlag == false )
	{
	}
	else
	{
		asyncFlag = true;
	}

	var XMLhttpObject = createXMLHttpRequest( callbackFunction );
	if( XMLhttpObject )
	{
		if( formObj == null )
		{
			var today = new Date();
			if( url.indexOf( "?" ) == -1 )
			{
				url += "?dumy_param=" + today.getTime();
			}
			else
			{
				url += "&dumy_param=" + today.getTime();
			}

			XMLhttpObject.open( "GET", url, asyncFlag );
			XMLhttpObject.send( null );
		}
		else
		{
			var data = buildPostData( formObj );
			XMLhttpObject.open( "POST", url, asyncFlag );
			XMLhttpObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			XMLhttpObject.send( data );
		}
	}
	else
	{
		alert( "XMLhttpObject is null" );
	}

	return XMLhttpObject;
}

