var userAgent = navigator.userAgent.toLowerCase();
var is_opera  = ((userAgent.indexOf('opera') != -1) || (typeof(window.opera) != 'undefined'));
var is_saf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == 'Apple Computer, Inc.'));
var is_webtv  = (userAgent.indexOf('webtv') != -1);
var is_ie     = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv));
var is_ie4    = ((is_ie) && (userAgent.indexOf('msie 4.') != -1));
var is_ie7    = ((is_ie) && (userAgent.indexOf('msie 7.') != -1));
var is_moz    = ((navigator.product == 'Gecko') && (!is_saf));
var is_kon    = (userAgent.indexOf('konqueror') != -1);
var is_ns     = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!is_opera) && (!is_webtv) && (!is_saf));
var is_ns4    = ((is_ns) && (parseInt(navigator.appVersion) == 4));
var is_mac    = (userAgent.indexOf('mac') != -1);

var is_regexp = (window.RegExp) ? true : false;

var AJAX_Compatible = false;

var pointer_cursor = (is_ie ? 'hand' : 'pointer');

//Ie、Opera視斷行為CR LF 算二個字數。Unix-CR、Mac-LF、M$-CRLF
String.prototype.jIAnlength = function()
{
	return ((is_ie || is_ie7 || is_opera) && this.indexOf('\n') != -1) ? this.replace(/\r?\n/g, '_').length : this.length;
}

//String.substr 某些browser會出錯
if ('1234'.substr(-2, 2) == '12') // (which would be incorrect)
{
	String.prototype.substr_orig = String.prototype.substr;
	String.prototype.substr = function(start, length)
	{
		return this.substr_orig( (start < 0 ? this.length + start : start), length);
	};
}

//將陣列中頭一個元素移出陣列後回傳
if (typeof Array.prototype.shift === 'undefined')
{
	Array.prototype.shift = function()
	{
		for(var i = 0, b = this[0], l = this.length-1; i < l; i++)
		{
			this[i] = this[i + 1];
		}
		this.length--;
		return b;
	};
}

function fetch_object(idname)
{
	if (document.getElementById)
	{
		return document.getElementById(idname);
	}
	else if (document.all)
	{
		return document.all[idname];
	}
	else if (document.layers)
	{
		return document.layers[idname];
	}
	else
	{
		return null;
	}
}

function fetch_tags(parentobj, tag)
{
	if (typeof parentobj.getElementsByTagName != 'undefined')
	{
		return parentobj.getElementsByTagName(tag);
	}
	else if (parentobj.all && parentobj.all.tags)
	{
		return parentobj.all.tags(tag);
	}
	else
	{
		return null;
	}
}

function fetch_tag_count(parentobj, tag)
{
	return fetch_tags(parentobj, tag).length;
}

function openWindow(url, width, height, windowid)
{
	return window.open(
		url,
		(typeof windowid == 'undefined' ? 'Popup' : windowid),
		'statusbar=no,menubar=no,toolbar=no,scrollbars=yes,resizable=no'
		+ (typeof width != 'undefined' ? (',width=' + width) : '') + (typeof height != 'undefined' ? (',height=' + height) : '')
	);
}


// #############################################################################
// jIAn_PHP_Emulator
// #############################################################################

function jIAn_PHP_Emulator()
{
	this.strClassName = 'jIAn_PHP_Emulator';
}

jIAn_PHP_Emulator.prototype = 
{
	getClassName : function()
	{
		return this.strClassName;
	},

	ltrim : function(str)
	{
		return str.replace(/^\s+/g, '');
	},

	rtrim : function(str)
	{
		return str.replace(/(\s+)$/g, '');
	},
	
	trim : function(str)
	{
		return this.ltrim(this.rtrim(str));
	},

	urlencode : function(text)
	{		
		text = escape(text.toString()).replace(/\+/g, "%2B");
		var matches = text.match(/(%([0-9A-F]{2}))/gi);
		if (matches)
		{
			for (var matchid = 0; matchid < matches.length; matchid++)
			{
				var code = matches[matchid].substring(1,3);
				if (parseInt(code, 16) >= 128)
				{
					text = text.replace(matches[matchid], '%u00' + code);
				}
			}
		}
		text = text.replace('%25', '%u0025');
		return text;	
	},
	
	in_array : function(ineedle, haystack, caseinsensitive)
	{
		var needle = new String(ineedle);

		if (caseinsensitive)
		{
			needle = needle.toLowerCase();
			for (var i in haystack)
			{
				if (haystack[i].toLowerCase() == needle)
				{
					return i;
				}
			}
		}
		else
		{
			for (var i in haystack)
			{
				if (haystack[i] == needle)
				{
					return i;
				}
			}
		}
		return -1;
	},
	
	htmlspecialchars : function(str)
	{
		//var f = new Array(/&(?!#[0-9]+;)/g, /</g, />/g, /"/g);
		var f = new Array(
			(is_mac && is_ie ? new RegExp('&', 'g') : new RegExp('&(?!#[0-9]+;)', 'g')),
			new RegExp('<', 'g'),
			new RegExp('>', 'g'),
			new RegExp('"', 'g')
		);
		var r = new Array(
			'&amp;',
			'&lt;',
			'&gt;',
			'&quot;'
		);

		for (var i = 0; i < f.length; i++)
		{
			str = str.replace(f[i], r[i]);
		}
		return str;
	},

	unhtmlspecialchars : function(str) 
	{
		f = new Array(/&lt;/g, /&gt;/g, /&quot;/g, /&amp;/g);
		r = new Array('<', '>', '"', '&');

		for (var i in f)
		{
			str = str.replace(f[i], r[i]);
		}

		return str;
	},
	
	unescape_cdata : function(str)
	{
		var r1 = /<\=\!\=\[\=C\=D\=A\=T\=A\=\[/g;
		var r2 = /\]\=\]\=>/g;

		return str.replace(r1, '<![CDATA[').replace(r2, ']]>');
	}
}


//object of PHP init
var PHP = new jIAn_PHP_Emulator();

// #############################################################################
// jIAn_AJAX_Handler
// #############################################################################

function jIAn_AJAX_Handler(arg_blnAsync)
{
	this.blnAsync = arg_blnAsync ? true : false;
	this.strClassName = 'jIAn_AJAX_Handler';

}

jIAn_AJAX_Handler.prototype = 
{
	getClassName : function()
	{
		return this.strClassName;
	},

	init : function()
	{
		if (!window.XMLHttpRequest)
		{
			window.XMLHttpRequest = function()
			{
				return eval("new A" + "ctiveX" + "Object" + "('Micro"+"soft."+"XMLHTTP')");						
			};
		}
		try
		{
			this.handler = new XMLHttpRequest();
			return true;
		}
		catch(e)
		{
			return false;
		}
	}, 

	is_compatible : function()
	{
		if (is_ie && !is_ie4) { return true; }
		else if (typeof XMLHttpRequest != 'undefined')
		{
			try 
			{
				return XMLHttpRequest.prototype.setRequestHeader ? true : false; 
			}
			catch(e)
			{
				try { var tester = new XMLHttpRequest(); return tester.setRequestHeader ? true : false; }
				catch(e) { return false; }
			}
		}
		else { return false; }
	},

	not_ready : function()
	{
		return (this.handler.readyState && (this.handler.readyState < 4));
	},

	onreadystatechange : function(arg_objEvent)
	{		
		if (!this.handler)
		{			
			if  (!this.init())
			{
				return false;
			}
		}
		if (typeof arg_objEvent == 'function')
		{
			this.handler.onreadystatechange = arg_objEvent;
		}
		else
		{
			alert('XML Sender OnReadyState event is not a function');
		}

		return false;
	},

	send : function(arg_strDestUrl, arg_strDataStream)
	{
		if (!this.handler)
		{
			if (!this.init())
			{
				return false;
			}
		}		
		if (!this.not_ready())
		{		
			this.handler.open('POST', arg_strDestUrl, this.blnAsync);
			
			this.handler.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			this.handler.send(arg_strDataStream);
			if (!this.blnAsync && this.handler.readyState == 4 && this.handler.status == 200)
			{
				return true;
			}
		}
		return false;
	},

	fetch_data : function(xml_node)
	{
		if (xml_node && xml_node.firstChild && xml_node.firstChild.nodeValue)
		{
			return PHP.unescape_cdata(xml_node.firstChild.nodeValue);
		}
		else
		{
			return '';
		}
	}
}


//var AJAX_Compatible = jIAn_AJAX_Handler.prototype.is_compatible();


// #############################################################################
// jIAn_Hidden_Form
// #############################################################################

function jIAn_Hidden_Form()
{	
	this.aryVariables = new Array();
	this.strClassName = 'jIAn_Hidden_Form';
}

jIAn_Hidden_Form.prototype = 
{
	getClassName : function()
	{
		return this.strClassName;
	},

	add_variable : function(arg_strIdentityName, arg_strValue)
	{
		this.aryVariables[this.aryVariables.length] = new Array(arg_strIdentityName, arg_strValue);
	},

	add_variables_from_object : function(arg_objForm)
	{
		var objInputs = fetch_tags(arg_objForm, 'input');

		for (var i = 0; i < objInputs.length; i++)
		{
			switch (objInputs[i].type)
			{
				case 'checkbox':
				case 'radio':
					if (objInputs[i].checked)
					{
						this.add_variable(objInputs[i].name, objInputs[i].value);
					}
					break;
				case 'text':
				case 'hidden':
				case 'password':
					this.add_variable(objInputs[i].name, objInputs[i].value);
					break;
				default:
					continue;
			}
		}

		var objTextareas = fetch_tags(arg_objForm, 'textarea');
		for (var i = 0; i < objTextareas.length; i++)
		{
			this.add_variable(objTextareas[i].name, objTextareas[i].value);
		}

		var objSelects = fetch_tags(arg_objForm, 'select');
		for (var i = 0; i < objSelects.length; i++)
		{
			if (objSelects[i].multiple)
			{
				for (var j = 0; j < objSelects[i].options.length; j++)
				{
					if (objSelects[i].options[j].selected)
					{
						this.add_variable(objSelects[i].name, objSelects[i].options[j].value);
					}
				}
			}
			else
			{
				this.add_variable(objSelects[i].name, objSelects[i].options[objSelects[i].selectedIndex].value);
			}
		}
	},

	fetch_variable : function(arg_strVariable)
	{
		for (var i = 0; i < this.aryVariables.length; i++)
		{
			if (this.aryVariables[i][0] == arg_strVariable)
			{
				return this.aryVariables[i][1];
			}
		}
		return null;
	},
	
	submit_form : function(arg_strSubmitMethod,arg_strTargetScript)
	{
		this.objForm = document.createElement('form');
		this.objForm.method = arg_strSubmitMethod;
		this.objForm.action = arg_strTargetScript;

		for (var i = 0; i < this.aryVariables.length; i++)
		{
			var objInput = document.createElement('input');

			objInput.type  = 'hidden';
			objInput.name  = this.aryVariables[i][0];
			objInput.value = this.aryVariables[i][1];

			this.objForm.appendChild(objInput);
		}

		document.body.appendChild(this.objForm).submit();
	},
	
	build_query_string : function()
	{
		var query_string = '';
		for (var i = 0; i < this.aryVariables.length; i++)
		{
			query_string += this.aryVariables[i][0] + '=' + PHP.urlencode(this.aryVariables[i][1]) + '&';
		}
		return query_string;
	}
}
