
var CW_ie4 = (document.all)? 1: 0;
var CW_opa = ((CW_ie4)&&(navigator.userAgent.indexOf('Opera') != -1))? 1: 0;
var CW_ffx = (document.getElementById)? 1: 0;
var CW_ns4 = (document.layers)? 1: 0;
var CW_ns6 = ((CW_ffx)&&(!document.all))? 1: 0;

var CW_timer_id;
var CW_timer_on = 0;
var CW_AJAX_url;
var CW_AJAX_params = '';
var CW_AJAX_params2 = '';
var CW_div_w = '';
var CW_div_h = '';
var CW_div_visible = 0;
var CW_div_initialized = 0;
var CW_div_id;
var CW_show_delay = 1000;
var CW_div_onload = 0;

function CW_DivShow (p_event, p_div, p_xoff, p_yoff)
{
    CW_DivPosition (p_event, p_div, p_xoff, p_yoff);
    CW_DivMakeVisible (p_div);
}

function CW_DivHide (p_div)
{
    var obj;

    if (CW_ffx)
    {
        obj = document.getElementById(p_div);
        if  (obj != null)
            obj.style.display = "none";
        return;
    }
    if (CW_ie4)
    {
        obj = document.all[p_div];
        if  (obj != null)
            obj.style.visibility = "hidden";
        return;
    }
    if (CW_ns4)
    {
        obj = document.layers[p_div];
        if  (obj != null)
            obj.visibility = "hide";
    }
}

function CW_DivPosition(p_event, p_div, p_xoff, p_yoff)
{
    var posx;
    var posy;

    if  ((!CW_ie4)&&((p_event.pageX)||(p_event.pageY)))
    {
        posx = p_event.pageX;
        posy = p_event.pageY;
    }
    else
    {
        if (CW_ns4 || CW_ns6)
        {
            posx = p_event.clientX + window.scrollX;
            posy = p_event.clientY + window.scrollY;
        }
        else if (CW_opa)
        {
            posx = window.event.clientX + document.documentElement.scrollLeft;
            posy = window.event.clientY + document.documentElement.scrollTop;
        }
        else
        {
            posx = window.event.clientX + document.documentElement.scrollLeft +
                document.body.scrollLeft;
            posy = window.event.clientY + document.documentElement.scrollTop +
                document.body.scrollTop;
        }
    }
    if  (p_xoff != null) posx += p_xoff;
    if  (p_yoff != null) posy += p_yoff;

    var obj;
    if (CW_ns4)
    {
        obj = document.layers[p_div];
        obj.top = posy;
        obj.left = posx;
    }
    else
    {
        // Do something with this information
        if ((CW_ffx)||(!CW_ie4))
        {
            obj = document.getElementById(p_div);
        }
        else
        {
            obj = document.all[p_div];
        }
        var obj_parent = obj.offsetParent;
        while (obj_parent != null)
        {
            posx -= obj_parent.offsetLeft;
            posy -= obj_parent.offsetTop;
            obj_parent = obj_parent.offsetParent;
        }
        obj.style.top = posy + 'px';
        obj.style.left = posx + 'px';
    }
}

function CW_DivMakeVisible(p_div)
{

    var obj;
    if (CW_ns4)
    {
        obj = document.layers[p_div];
        obj.visibility = "show";
    }
    else
    {
        // Do something with this information
        if ((CW_ffx)||(!CW_ie4))
        {
            obj = document.getElementById(p_div);
            obj.style.display = "block";
        }
        else
        {
            obj = document.all[p_div];
            obj.style.visibility = "visible";
        }
    }
}

function CW_DivInitialize(p_div, p_url, p_params, p_delay)
{
    CW_div_id = p_div;
    CW_AJAX_url = p_url;
    CW_AJAX_params = p_params;
    if  (p_delay != null)
        CW_show_delay = p_delay;
    if  (CW_div_id)
    {
        CW_div_initialized = 1;
        document.onmousemove = CW__DivMoveCursor;
    }
    if  (CW_div_onload)
        CW__DivUp();
}

function CW__DivUp ()
{
    if  (CW_div_id == null)
        return;

    // Make p_div a child of the main document
    var obj = document.getElementById(CW_div_id);
    if  ((obj != null)&&(obj.parentNode != null)&&(document.body))
    {
        var obj_parent = obj.parentNode;
        if  (obj_parent != document.body)
        {
            obj_parent.removeChild(obj);
            document.body.appendChild(obj);
        }
    }
}

function CW_DivOnload ()
{
    CW_div_onload = 1;
    if  (CW_div_id != null)
        CW__DivUp();

    if  (window.onload_CW_div_saved)
        window.onload_CW_div_saved();
}

function CW_TimerOn (p_event, p_params, p_w, p_h)
{
    if  (CW_div_initialized == 0)    return;
    if  (CW_timer_on)
        clearTimeout(CW_timer_id);
    CW_AJAX_params2 = (p_params == null)? '': p_params;
    CW_div_w = (p_w == null)? 0: p_w;
    CW_div_h = (p_h == null)? 0: p_h;
    CW_timer_id = setTimeout('CW_DivTimer()', CW_show_delay);
    CW_DivPosition(p_event, CW_div_id, 10, 10);
    CW_timer_on = 1;
}

function CW__DivMoveCursor (p_event)
{
    if  (!CW_timer_on)  return;
    CW_DivPosition(p_event, CW_div_id, 10, 10);
}

function CW_TimerOff ()
{
    if  (CW_timer_on)
        clearTimeout(CW_timer_id);
    if  (CW_div_visible)
    {
        CW_DivHide (CW_div_id);
        CW_div_visible = 0;
    }
    CW_timer_on = 0;
}

function CW_DivTimer ()
{
    var pw_div = document.getElementById(CW_div_id);
    if  (pw_div == null)
    {
        CW_timer_on = 0;
        return;
    }

    if  (CW_AJAX_url != '')
    {
        var params = CW_AJAX_params;
        if  (CW_AJAX_params2 != '')
        {
            if  (params != '')  params += '&';
            params += CW_AJAX_params2;
        }
        new Ajax.Request(CW_AJAX_url,
        {
            method: 'get',
            parameters: params,
            onSuccess: function(transport)
            {
                var text = transport.responseText || '';
                if (text != '')
                {
                    var pw_div = document.getElementById(CW_div_id);
                    pw_div.innerHTML = text;
                    CW_DivMakeVisible(CW_div_id);
                    CW_div_visible = 1;
                }
            }
        });
    }
    else
    {
        if  (CW_div_w)
            pw_div.style.width = CW_div_w;
        if  (CW_div_h)
            pw_div.style.height = CW_div_h;
        pw_div.innerHTML = CW_AJAX_params + CW_AJAX_params2;
        CW_DivMakeVisible(CW_div_id);
        CW_div_visible = 1;
    }

    CW_timer_on = 0;
}

function	CW_CallAJAX (p_url)
{

	var params = '';
	if	(p_url.match(/.\?./))
	{
		params = p_url.replace(/^.+\?(.+)$/, "$1");
		p_url = p_url.replace (/^(.+)\?.+$/, "$1");
	}

	new Ajax.Request(p_url,
	{
		method: 'get',
		parameters: params,
		onSuccess: function(transport)
		{
			var text = transport.responseText || '';
			if (text != '')
			{
				var i, j, s, obj;
				var html_arr = text.split(/\~\~\~/);
				for (i = 0; i < html_arr.length; i += 2)
				{
					s = html_arr[i];
					s = s.replace(/\s+$/, '');
					if	(s.match(/^DIV\s+\w+$/))
					{
						s = s.replace(/^DIV\s+/, '');
						obj = document.getElementById(s);
						if	(obj != null)
							obj.innerHTML = (html_arr[i + 1] == null)? '': ' ' + html_arr[i + 1];
					}
					// Set values for blank form fields if necessary
					else if (s == 'SET')
					{
						var kv;
						var js_arr = html_arr[i + 1].split(/\s*\n\s*/);
						for (j = 0; j < js_arr.length; j++)
						{
							if	(!js_arr[j].match(/=/))  continue;
							kv = js_arr[j].split(/\s*=\s*/);
							if	(kv[1] == '')	continue;
							if	(kv[1] == undefined)	continue;
							obj = document.getElementById(kv[0]);
							if	((obj != null)&&(obj.value == ''))
							{
								obj.value = kv[1];
								if	(obj.onchange)
								{
					            	try { obj.onchange() } catch(err) { };
						        }
							}
						}
					}
					else
					{
						alert("Unrecognized command '" + s + "'");
					}
				}
			}
		}
	});

	return false;
}

if  (window.onload)
    window.onload_CW_div_saved = window.onload;
window.onload = CW_DivOnload;

/*  Prototype JavaScript framework, version 1.4.0_pre10_ajax
 *  (c) 2005 Sam Stephenson <sam@conio.net>
 *
 *  This is a downcut version for AJAX by Alexander Kirk http://alexander.kirk.at/
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
	Version: '1.4.0_pre10_ajax',
	
	emptyFunction: function() {},
	K: function(x) {return x}
}

var Class = {
	create: function() {
		return function() { 
			this.initialize.apply(this, arguments);
		}
	}
}

var Abstract = new Object();

Object.extend = function(destination, source) {
	for (property in source) {
		destination[property] = source[property];
	}
	return destination;
}

Object.inspect = function(object) {
	try {
		if (object == undefined) return 'undefined';
		if (object == null) return 'null';
		return object.inspect ? object.inspect() : object.toString();
	} catch (e) {
		if (e instanceof RangeError) return '...';
		throw e;
	}
}

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

Function.prototype.bindAsEventListener = function(object) {
	var __method = this;
	return function(event) {
		return __method.call(object, event || window.event);
	}
}

Object.extend(Number.prototype, {
	toColorPart: function() {
		var digits = this.toString(16);
		if (this < 16) return '0' + digits;
		return digits;
	},

	succ: function() {
		return this + 1;
	},
	
	times: function(iterator) {
		$R(0, this, true).each(iterator);
		return this;
	}
});

var Try = {
	these: function() {
		var returnValue;

		for (var i = 0; i < arguments.length; i++) {
			var lambda = arguments[i];
			try {
				returnValue = lambda();
				break;
			} catch (e) {}
		}

		return returnValue;
	}
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
	initialize: function(callback, frequency) {
		this.callback = callback;
		this.frequency = frequency;
		this.currentlyExecuting = false;

		this.registerCallback();
	},

	registerCallback: function() {
		setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
	},

	onTimerEvent: function() {
		if (!this.currentlyExecuting) {
			try { 
				this.currentlyExecuting = true;
				this.callback(); 
			} finally { 
				this.currentlyExecuting = false;
			}
		}
	}
}

/*--------------------------------------------------------------------------*/

function $() {
	var elements = new Array();

	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);

		if (arguments.length == 1) 
			return element;

		elements.push(element);
	}

	return elements;
}



var Ajax = {
	getTransport: function() {
		return Try.these(
			function() {return new ActiveXObject('Msxml2.XMLHTTP')},
			function() {return new ActiveXObject('Microsoft.XMLHTTP')},
			function() {return new XMLHttpRequest()}
		) || false;
	}
}

Ajax.Base = function() {};
Ajax.Base.prototype = {
	setOptions: function(options) {
		this.options = {
			method:			 'post',
			asynchronous: true,
			parameters:	 ''
		}
		Object.extend(this.options, options || {});
	},

	responseIsSuccess: function() {
		return this.transport.status == undefined
				|| this.transport.status == 0 
				|| (this.transport.status >= 200 && this.transport.status < 300);
	},

	responseIsFailure: function() {
		return !this.responseIsSuccess();
	}
}

Ajax.Request = Class.create();
Ajax.Request.Events = 
	['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
	initialize: function(url, options) {
		this.transport = Ajax.getTransport();
		this.setOptions(options);
		this.request(url);
	},

	request: function(url) {
		var parameters = this.options.parameters || '';
		if (parameters.length > 0) parameters += '&_=';

		try {
			if (this.options.method == 'get')
				url += '?' + parameters;

			this.transport.open(this.options.method, url,
				this.options.asynchronous);

			if (this.options.asynchronous) {
				this.transport.onreadystatechange = this.onStateChange.bind(this);
				setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
			}

			this.setRequestHeaders();

			var body = this.options.postBody ? this.options.postBody : parameters;
			this.transport.send(this.options.method == 'post' ? body : null);

		} catch (e) {
		}
	},

	setRequestHeaders: function() {
		var requestHeaders = 
			['X-Requested-With', 'XMLHttpRequest',
			 'X-Prototype-Version', Prototype.Version];

		if (this.options.method == 'post') {
			requestHeaders.push('Content-type', 
				'application/x-www-form-urlencoded');

			/* Force "Connection: close" for Mozilla browsers to work around
			 * a bug where XMLHttpReqeuest sends an incorrect Content-length
			 * header. See Mozilla Bugzilla #246651. 
			 */
			if (this.transport.overrideMimeType)
				requestHeaders.push('Connection', 'close');
		}

		if (this.options.requestHeaders)
			requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);

		for (var i = 0; i < requestHeaders.length; i += 2)
			this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
	},

	onStateChange: function() {
		var readyState = this.transport.readyState;
		if (readyState != 1)
			this.respondToReadyState(this.transport.readyState);
	},
	
	evalJSON: function() {
		try {
			var json = this.transport.getResponseHeader('X-JSON'), object;
			object = eval(json);
			return object;
		} catch (e) {
		}
	},

	respondToReadyState: function(readyState) {
		var event = Ajax.Request.Events[readyState];
		var transport = this.transport, json = this.evalJSON();

		if (event == 'Complete')
			(this.options['on' + this.transport.status]
			 || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
			 || Prototype.emptyFunction)(transport, json);

		(this.options['on' + event] || Prototype.emptyFunction)(transport, json);

		/* Avoid memory leak in MSIE: clean up the oncomplete event handler */
		if (event == 'Complete')
			this.transport.onreadystatechange = Prototype.emptyFunction;
	}
});

Ajax.Updater = Class.create();
Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
	initialize: function(container, url, options) {
		this.containers = {
			success: container.success ? $(container.success) : $(container),
			failure: container.failure ? $(container.failure) :
				(container.success ? null : $(container))
		}

		this.transport = Ajax.getTransport();
		this.setOptions(options);

		var onComplete = this.options.onComplete || Prototype.emptyFunction;
		this.options.onComplete = (function(transport, object) {
			this.updateContent();
			onComplete(transport, object);
		}).bind(this);

		this.request(url);
	},

	updateContent: function() {
		var receiver = this.responseIsSuccess() ?
			this.containers.success : this.containers.failure;

		var match		= new RegExp(Ajax.Updater.ScriptFragment, 'img');
		var response = this.transport.responseText.replace(match, '');
		var scripts	= this.transport.responseText.match(match);

		if (receiver) {
			if (this.options.insertion) {
				new this.options.insertion(receiver, response);
			} else {
				receiver.innerHTML = response;
			}
		}

		if (this.responseIsSuccess()) {
			if (this.onComplete)
				setTimeout(this.onComplete.bind(this), 10);
		}

		if (this.options.evalScripts && scripts) {
			match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
			setTimeout((function() {
				for (var i = 0; i < scripts.length; i++)
					eval(scripts[i].match(match)[1]);
			}).bind(this), 10);
		}
	}
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
	initialize: function(container, url, options) {
		this.setOptions(options);
		this.onComplete = this.options.onComplete;

		this.frequency = (this.options.frequency || 2);
		this.decay = 1;

		this.updater = {};
		this.container = container;
		this.url = url;

		this.start();
	},

	start: function() {
		this.options.onComplete = this.updateComplete.bind(this);
		this.onTimerEvent();
	},

	stop: function() {
		this.updater.onComplete = undefined;
		clearTimeout(this.timer);
		(this.onComplete || Ajax.emptyFunction).apply(this, arguments);
	},

	updateComplete: function(request) {
		if (this.options.decay) {
			this.decay = (request.responseText == this.lastText ? 
				this.decay * this.options.decay : 1);

			this.lastText = request.responseText;
		}
		this.timer = setTimeout(this.onTimerEvent.bind(this), 
			this.decay * this.frequency * 1000);
	},

	onTimerEvent: function() {
		this.updater = new Ajax.Updater(this.container, this.url, this.options);
	}
});
