function ff() {
  var y = 0, o = rspage.w;
  do { y += o.offsetTop; o = o.offsetParent; } while (o != document.body);
  if (document.body.scrollTop < y)
    with (rspage.w.createTextRange()) { collapse(false); select(); }
}
function st(t) { window.status=t.getAttribute('title'); return true; }
function nost() { window.status=""; }
function sfocus(){if(document.rstop){ try{document.rstop.w.focus()}catch(e){} };}

var isDHTML = 0;
var isID = 0;
var isAll = 0;
var isLayers = 0;

if (document.getElementById) {isID = 1; isDHTML = 1;}
else {
if (document.all) {isAll = 1; isDHTML = 1;}
else {
browserVersion = parseInt(navigator.appVersion);
if ((navigator.appName.indexOf('Netscape') != -1) && (browserVersion == 4)) {isLayers = 1; isDHTML = 1;}
}}

function findDOM(objectID,withStyle)
{
	var result=false;
	if (withStyle == 1) {
		if (isID && ( e = document.getElementById(objectID) ) ) { result = e.style ; }
		else 
		if (isAll && ( e = document.all[objectID] ) ) { result = e.style; }
		else
		if (isLayers && ( e = document.layers[objectID] ) ) { result = e; }
	}
	else {
		if (isID && ( e = document.getElementById(objectID) )) { result = e; }
		else 
		if (isAll && ( e = document.all[objectID] )) { result = e; }
		else
		if (isLayers && ( e = document.layers[objectID] )) { result = e; }
	}
	return result;
}
	
function setVisibility(objectID,state) {
	var dom = findDOM(objectID,1);
	dom.visibility = state;
}

function setDisplay(objectID,state) {
	var dom = findDOM(objectID,1);
	dom.display = state;
}

function toggleVisibility(objectID) {
	var dom = findDOM(objectID,1);
	state = dom.display;
	if (state == 'none' )
		dom.display = 'inline';
	else {
		if (state == 'inline')
			dom.display = 'none';
	else dom.display = 'inline';
	}
}
function popupwindow(url,windowname,properties) {
  var popupwindow = null;
  // set name of parent window so we can popback to it
  window.name = 'swickimain';
  if (!properties) { properties = 'width=688,height=527,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=no,directories=no,status=no,screenx=0,screenY=0,top=0,left=0'; }
  if (!windowname) { windowname = 'swickiPopup'; }
    popupwindow = window.open(url,windowname,properties);
    if (popupwindow.opener == null) {popupwindow.opener = self; }
    popupwindow.focus();
}
function popback(url,target) {
  if (target != '') {
    window.opener.location.href = url;
  } else {
    window.location.href = url;
  }
  window.opener.focus();
}

/*
        ADDED BY AMADEUS
*/
function toggleDisplay(toAct){
                var theBlock = document.getElementById(toAct);
                if (theBlock.style.display=='block') theBlock.style.display='none';
                else theBlock.style.display='block';
        }
/*
        END OF ADDITION BY AMADEUS
*/

/*  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);
	}
});
function Metrics(){
     
   this.reponse = "";
   
   Metrics.prototype.send=function(startTime, endTime, url, ip, gid){
        
        try{
        	var g = (gid == null) ? "" : gid;
			var deltaTime = endTime - startTime;
			var p='d='+encodeURIComponent(document.location) 
			p+='&m=1';
			p+='&t='+deltaTime; 
			p+='&g='+g;
			p+='&r='+encodeURIComponent(document.referrer);
			p+='&a='+encodeURIComponent(navigator.userAgent);
			p+='&i='+ip;
			p+='&c='+this.readCookie('swcid');
//			if(document.getElementById('gid')){p+='&g='+document.getElementById('gid').value;}
			
           var myAjax = new Ajax.Request(url, {
				method: 'post',
				parameters: p,
				onComplete: function (request, obj) {
					//res = request.responseText;
					//idx = res.indexOf("here is the original");
					//if (idx > 0)
					//	res = res.substring(idx);
				//	alert(res);
				},
				onFailure: function(request, obj) {
				//	alert("failed");
				}
				});
           
        }catch(e){
        	
        }
       
	}

	Metrics.prototype.readCookie=function(name){   
	    var nameEQ = name + "=";
	    var ca = document.cookie.split(';');
	    for(var i=0;i < ca.length;i++){
		    var c = ca[i];
		    while (c.charAt(0)==' ') c = c.substring(1,c.length);
		    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
	    return '';
	}
}
/* $Revision: 1.26 $ */
var crlf				  = '<br />',
    swicki_ui_uid		  = 0,		// signup user id?
	_CURLEFT			  = 0,
	_CURTOP				  = 1,
	_WIDTH                = 0,
    _HEIGHT               = 1,
    _SCROLL_X             = 0,
    _SCROLL_Y             = 1,
    _NODE_TYPE_1_ELEMENT  = 1,
    _RETURN_STYLE         = 1,
    _AUTO_UP_DELAY        = 500,	// ms
	_POST_SUMMARY_MAXLENGTH = 150,
	_WAITING_ANIMATION_DELAY = 500,
	_CAPTCHA_TIMEOUT_DELAY = 1000 * 60 * 3,
	_PASSWORD_MIN_LENGTH  = 6,
	_AsYouType_DELAY	  = 500,	// ms
	_MESSAGE_NAMES		  = [ '_error', '_help', '_format_error', '_available', '_not_unique', '_ok', '_none', '_taken', '_blank', '_warning' ],
	
	_FORM_ERRORS_SIGNUP	  = [ 'username', 'email', 'password', 'password_confirm' /*, 'captcha'*/ ],
	_FORM_ERRORS_LOGIN	  = [ 'email', 'password'],
	_FORM_ERROR_HANDLERS  = { 'login' : _FORM_ERRORS_LOGIN, 'signup' : _FORM_ERRORS_SIGNUP },
	
	_CAPTCHA_LENGTH		  = 6,
	_ASSETS_PATH		  = swicki_ui_image_path,
	_ERROR_CONTAINERS	  = [ 'swicki_ui_error_msg_forgot','swicki_ui_error_msg_signup', 'swicki_ui_info_msg_wait', 'swicki_ui_error_msg_missing',
							  'swicki_ui_error_msg_login'],
	_TOOLTIPS			  = {'swicki_ui_username_help' : 'Type in your preferred username and we\'ll let you know if it\'s available.' },
	_TOOLTIP_AUTOHIDE_DELAY = 500,	/* ms */
	_ROADBLOCK_MSG_ENC		= function() {
									$('swicki_ui_roadblock_message_default').className='swicki_ui_hide';
									$('swicki_ui_roadblock_message_encourage').className='swicki_ui_show';
								},
	_ROADBLOCK_MSG_DEF		= function() {
									$('swicki_ui_roadblock_message_default').className='swicki_ui_show';
									$('swicki_ui_roadblock_message_encourage').className='swicki_ui_hide';
								},
	_ASK_MESSAGE_PRE		= function() {
									$('swicki_ui_banner_title').innerHTML = ui.message_title;
									$('swicki_ui_message_body').innerHTML = ui.message_text;
								},
	_MESSAGE_CLEAR			= function() {
									$('swicki_ui_banner_title').innerHTML = 'Message';
									$('swicki_ui_message_body').innerHTML = '';
									ui.message_title='';
									ui.message_text='';
								},
	_ENCOURAGE_PRE			= function() {
									$('encourage_user_action').innerHTML = ui.user_action;
									if( !readCookie( _ENC_COOKIE ) ) { $('encourage_next_time').checked = true; }
								},
	_ENCOURAGE_POST			= function() {
									//nothing as yet?
								},
	_SAVE_LOGIN				=1,
	_RETRIEVE_LOGIN			=2,
	_PERS_COOKIE_DAYS		=30,
	_ENC_COOKIE				='enc',
	_COOKIE_DOMAIN			= document.domain.match(/\..*\.*$/)[0],
	// alias some long windedness...
	eU						= encodeURIComponent
;

// this list allows application of handlers on a form-by-form basis...
var form_handlers = {

	'roadblock' : 	[ 'roadblock_login',	'roadblock_signup' ],

	'login' : 		[ 'login_submit', 'login_email', 'login_password', 'login_buttons'  ],

	'container' : 	[ 'close' ],

	'post': 		[ 'post_submit', 'fullscreen_edit', 'post_buttons','post_summary_count' ],

	'signup' : 		[ 'signup_submit', 'signup_username', 'password_feedback', 'signup_email', 'signup_human_regenerate', 'signup_captcha_check', 'signup_buttons', 'signup_tooltips', 'captcha_init' ],

	'message' : 	[ 'message_button', 'message_ok' ],
	
	'encourage' :	[ 'encourage_button_skip', 'encourage_login', 'encourage_signup', 'encourage_feedback' ],
    
    'comment' :     [ 'comment_buttons', 'comment_submit' ],
    
    'viewcomments': []
}
// actions performed before form display, init or housekeeping
var form_predisplay = {

	'swicki_ui_form_post_container'	:		function(){ createCharCounterLimitedTextArea( 'swicki_ui_post_comments', 'swicki_ui_post_chars', 150, _INIT ); },

	'swicki_ui_form_login_container':		function(){ remember_login( _RETRIEVE_LOGIN ); },

	'swicki_ui_form_message_container':		function(){ _ASK_MESSAGE_PRE(); },

	'swicki_ui_form_encourage_container':		function(){ _ENCOURAGE_PRE(); },

    'swicki_ui_form_comment_container':     function()
                                            {
                                                $('swicki_ui_form_comment_resultTitle').innerHTML = ui.swicki_ui_form_comment_resultTitle;
                                                $('swicki_ui_form_comment_resultsummary').innerHTML = ui.swicki_ui_form_comment_resultsummary;
                                                createCharCounterLimitedTextArea( 'swicki_ui_comment_text', 'swicki_ui_comment_chars', 150, _INIT );
                                            }
}
var form_postdisplay = {
	
	'swicki_ui_form_message_container':		function(){ _MESSAGE_CLEAR(); }
}

var swicki_ui_signup_waiting = true;

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function swicki_ui_setDisplay( elementRef, state )
{
    //if(elementRef!=null && elementRef!=false && elementRef!=undefined)
	if(elementRef)
	{
	    var dom = findDOM(elementRef.id,_RETURN_STYLE);
	    try
		{
		    dom.display=state;    
		}
	    catch(e)
		{
		}
	}
    else
	{
	    return false;
	}
}
//*******************************************************************************************

function swicki_ui_setVisibility( elementRef, state )
{
    if(elementRef!=null)
	{
	    var dom = findDOM(elementRef.id,_RETURN_STYLE);
	    try
		{
		    dom.visibility=state;    
		}
	    catch(e)
		{
		}
	}
    else
	{
	    return false;
	}
}
//*******************************************************************************************
function swicki_ui_setClassName( par_element, par_className )
{
		var element=null;
		switch(typeof(par_element))
		{
				case 'string':
					element = $( par_element );
					break;
				case 'object':
					element = par_element;
					break;
				default:
					break;
		}
		if(element)
		{
			element.className = par_className;
		}
		return (element ? true : false);
}

//*******************************************************************************************

// this is in moderatortools.js but Sarafi doesn't like the function call for some reason...
function swicki_ui_walk(node, comp){ // walk the children of this node until comp returns true, then return that child.
    var queue = new Array();
    queue.push(node);
    do{
	var v = queue.shift();
	switch( typeof( comp ) )
	    {
	    case "function" :
		if (comp(v)) return v;
		break;
	    case "string" :
		if (v.id==comp) return v;
		break;
	    }
	for (var i =0; i < v.childNodes.length; i++) queue.push(v.childNodes[i]);
    } while  (queue.length!=0);
    return false;
}
//*******************************************************************************************

function swicki_ui_drillBySelector( selector )
{
    var mT = 'drill :: ';
    var targetRef = false;
    var selectors = selector.replace(/\s+/,' ').split(' '); // I'm sensitive to the needs of nicely formatted code... ;-)
    var parentSelector='', parentRef;
  
    parentSelector = selectors.shift();
    if( ui && ui.forms[ parentSelector] ){
	var parentRef = ui.forms[ parentSelector ].node;
    } else if( $( parentSelector ) ){
	var parentRef = $( parentSelector ); 
    } else{
    }
    if (selectors.length >= 1 && parentRef){
	do {
	    var targetSelector = selectors.shift();
	    var targetRef = swicki_ui_walk( parentRef, targetSelector );
	    if(targetRef){ 
		var parentRef = targetRef; 
	    } else {
	    }
	}
	while (selectors.length);
    } else {
	var targetRef = parentRef;
    }
    return targetRef ? targetRef : false;
}

//*******************************************************************************************

function BrowserHacks()
{

    this.window_overallwidth = ( this.isIE ? function(){ return getOverallWidth()-17; } : function() { return getOverallWidth() } );
    this.windowHW = function()
	{
	    var myWidth = 0, myHeight = 0;
	    if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	    }
	    return [ myHeight, myWidth ];

	}; // windowHW

    this.scrollXY = function()
	{
	    var scrOfX = 0, scrOfY = 0;
	    if( typeof( window.pageYOffset ) == 'number' )
	    {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	    }
	    else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
	    {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	    }
	    else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
	    {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	    }
	    return [ scrOfX, scrOfY ];

	} // scrollW

    //
    // BrowserDetect taken from
    // http://www.quirksmode.org/js/detect.html 
    //
    this.BrowserDetect = {
	init: function () {
	    this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
	    this.version = this.searchVersion(navigator.userAgent)
	    || this.searchVersion(navigator.appVersion)
	    || "an unknown version";
	    this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
	    for (var i=0;i<data.length;i++) {
		var dataString = data[i].string;
		var dataProp = data[i].prop;
		this.versionSearchString = data[i].versionSearch || data[i].identity;
		if (dataString) {
		    if (dataString.indexOf(data[i].subString) != -1)
			return data[i].identity;
		}
		else if (dataProp)
		return data[i].identity;
	    }
	},
	searchVersion: function (dataString) {
	    var index = dataString.indexOf(this.versionSearchString);
	    if (index == -1) return;
	    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
	    {   string: navigator.userAgent,
		subString: "OmniWeb",
		versionSearch: "OmniWeb/",
		identity: "OmniWeb"
	    },
	    {
		string: navigator.vendor,
		subString: "Apple",
		identity: "Safari"
	    },
	    {
		prop: window.opera,
		identity: "Opera"
	    },
	    {
		string: navigator.vendor,
		subString: "iCab",
		identity: "iCab"
	    },
	    {
		string: navigator.vendor,
		subString: "KDE",
		identity: "Konqueror"
	    },
	    {
		string: navigator.userAgent,
		subString: "Firefox",
		identity: "Firefox"
	    },
	    {
		string: navigator.vendor,
		subString: "Camino",
		identity: "Camino"
	    },
	    {   // for newer Netscapes (6+)
		string: navigator.userAgent,
		subString: "Netscape",
		identity: "Netscape"
	    },
	    {
		string: navigator.userAgent,
		subString: "MSIE",
		identity: "Explorer",
		versionSearch: "MSIE"
	    },
	    {
		string: navigator.userAgent,
		subString: "Gecko",
		identity: "Mozilla",
		versionSearch: "rv"
	    },
	    {     // for older Netscapes (4-)
		string: navigator.userAgent,
		subString: "Mozilla",
		identity: "Netscape",
		versionSearch: "Mozilla"
	    }
	],
	dataOS : [
	    {
		string: navigator.platform,
		subString: "Win",
		identity: "Windows"
	    },
	    {
		string: navigator.platform,
		subString: "Mac",
		identity: "Mac"
	    },
	    {
		string: navigator.platform,
		subString: "Linux",
		identity: "Linux"
	    }
	]

    };
    this.BrowserDetect.init();

    this.isIE     = (this.BrowserDetect.browser=='Explorer');
    this.isSafari = (this.BrowserDetect.browser=='Safari'); 
    this.isOpera  = (this.BrowserDetect.browser=='Opera');
    this.isIE6 = (this.isIE && this.BrowserDetect.version==6);
    this.isIE7 = (this.isIE && this.BrowserDetect.version==7);
    this.isFF = (this.BrowserDetect.browser=='Firefox');

    this.no_fixed_position = ( this.isIE  || this.isSafari || this.isOpera );

}

//var brow = new BrowserHacks();

//*******************************************************************************************

function getOverallHeight()
{
    var overallHeight = 0;
    if (document.body.clientHeight)
	overallHeight = document.body.clientHeight;
    if (document.body.scrollHeight && 
	document.body.scrollHeight > overallHeight)
	overallHeight = document.body.scrollHeight;
    if (document.body.offsetHeight && document.body.offsetHeight > overallHeight)
	overallHeight = document.body.offsetHeight;
    if (document.documentElement.clientHeight && document.documentElement.clientHeight > overallHeight )
	overallHeight = document.documentElement.clientHeight;
    if (document.documentElement.scrollHeight && document.documentElement.scrollHeight > overallHeight )
	overallHeight = document.documentElement.scrollHeight;
    if (document.documentElement.offsetHeight && document.documentElement.offsetHeight > overallHeight )
	overallHeight = document.documentElement.offsetHeight;
    
    return overallHeight;
}

//*******************************************************************************************

function getOverallWidth()
{
    var overallWidth = 0;
    if (document.body.clientWidth)
	overallWidth = document.body.clientWidth;
    if (document.body.scrollWidth && 
	document.body.scrollWidth > overallWidth)
	overallWidth = document.body.scrollWidth;
    if (document.body.offsetWidth && document.body.offsetWidth > overallWidth)
	overallWidth = document.body.offsetWidth;
    if (document.documentElement.clientWidth && document.documentElement.clientWidth > overallWidth )
	overallWidth = document.documentElement.clientWidth;
    if (document.documentElement.scrollWidth && document.documentElement.scrollWidth > overallWidth )
	overallWidth = document.documentElement.scrollWidth;
    if (document.documentElement.offsetWidth && document.documentElement.offsetWidth > overallWidth )
	overallWidth = document.documentElement.offsetWidth;
    
    return overallWidth;
}

//*******************************************************************************************
function swickiUI()
{ 
    this.containerLoaded = false;
    this.loader = 'swicki_ui_loader';
	this.pending_action = '';
	this.predisplay_action = false;
    this.loading = {};

	this.current_form = false;
	
// error flag for each form, prevent form submission

	var form_error_idx;

	this.form_errors = new Object();
	
	//intitialise form errors to false
	for(current_form in _FORM_ERROR_HANDLERS )
	{
		this.form_errors[current_form] = new Object();
		var array_of_fields = _FORM_ERROR_HANDLERS[ current_form ];
		
		for( idx = 0; idx < array_of_fields.length; idx++)
		{
			var field = array_of_fields[ idx ];
			this.form_errors[ current_form ][ field ] = false;
		}
	}

	// error message stuff...

    this.forms = new Object(); // pointer to each form...

    // set up the modal curtain...
	if ( $('swicki_ui_curtain') )
    	this.curtain = $('swicki_ui_curtain');
	else
	{
		this.curtain = document.createElement('div');
		this.curtain.id='swicki_ui_curtain';
		document.body.appendChild( this.curtain );
	}
    //
    // within the loader container...
    //
    var loader = $( this.loader );

    var this_body = $('swicki_ui_body');
}

swickiUI.prototype.displayForm  = function( formId )
{
    // hide the container regardless of current display setting...
	
    //this.hideForm();
	
	//hide any error banner from previous forms
	this.hideError();
    
    if( !this.containerLoaded )  { getContainer(); this.containerLoaded = true; }

    if ( this.current_form )
    {
	//hide the current form body...
        swicki_ui_setDisplay( this.current_form, 'none' );
        this.current_form = false;
    }
    if (!this.forms[ formId ] )
    {
		var formname = formId.replace(/swicki_ui_form_(.+)_container/,'$1')
		this.pendingFormName = formId;
		dload( formname, cacheAndDisplayForm );
		return; /* kicked off Ajax call...*/
    }
    else
    {
		this.current_form = this.forms[ formId ].node;
		//swicki_ui_setDisplay(this.current_form, 'none' );
		this.current_form.style.display='none';


		// title...
		//
		this.title.innerHTML = this.forms[ formId ].title;
	
		// display the form...
	
		//swicki_ui_setDisplay( this.current_form, 'block');
		this.current_form.style.display='block';
	
		var page_h = getOverallHeight();
		var page_w = brow.window_overallwidth();  
	
		var window_h = brow.windowHW()[ _HEIGHT ];
		var window_w = brow.windowHW()[_WIDTH ];
		// give the form it's size (display: block), but don't display (hidden)...
	
		swicki_ui_setVisibility( this.form, 'hidden' );
		swicki_ui_setDisplay( this.form, 'block' );
		
		// so we can measure it...
		var offset = brow.scrollXY()[_SCROLL_Y];
		var dialogue_w = this.form.clientWidth;
		var dialogue_h = this.form.clientHeight;
		var dialogue_top, curtain_h;
	
		// if the screen/viewport is smaller than the dialogue, push out the bottom of the curtain...
		//this.curtain.style.height = (page_h < dialogue_h ? dialogue_h : page_h)  + 'px';
		curtain_h = (page_h < dialogue_h ? dialogue_h : page_h);
		this.curtain.style.height = curtain_h + 'px';
		//this.curtain.style.height = '100%';
	
		this.form.style.left = '50%'; // centered horizontally...
		this.form.style.marginLeft = parseInt( -1 * dialogue_w / 2 )+'px';
	//this.form.style.marginLeft = ( dialogue_w > parseInt( -1 * dialogue_w / 2 )+'px';
	
		if (brow.no_fixed_position)
		{
			dialogue_top = parseInt(offset + 100);
			if ( ( dialogue_top + dialogue_h ) >  curtain_h  )
			{
				curtain_h = (dialogue_top + dialogue_h + 10 );
				this.curtain.style.height = curtain_h + 'px';
			}
			
			// keep it within the existing page height...
			//if ((dialogue_top + dialogue_h) > page_h) { dialogue_top = (page_h - dialogue_h) }
			dialogue_top += 'px';
			this.form.style.top =  dialogue_top;
		}
		else
		{
			// position: fixed;
			// NB: don't fix curtain
			this.curtain.style.width = '100%';
		
			this.form.style.position = 'fixed';
			this.form.style.top = '50%';
			var shift = (brow.isSafari || brow.isOpera ? '' : '-');
			this.form.style.marginTop = shift+parseInt( dialogue_h / 2 )+'px';
		};
		this.curtain.style.visibility='visible';
		swicki_ui_setDisplay( this.curtain, 'block' );
		this.form.style.zindex=this.curtain.style.zindex+1;
		
		// find out if the form has ended up above the top of the screen...
		
		if (findPos(this.form)[ _CURTOP ] < 0)
		{
			this.form.style.marginTop= parseInt( this.form.style.marginTop.toString().replace('px', '') ) - findPos(this.form)[1] + 'px';
		}
		
		if ( typeof( this.predisplay_action ) == 'function'){ this.predisplay_action(); this.predisplay_action = false; };
		var shortname = formId.match(/swicki_ui_form_(.+)_container/)[1];
		if ( pre_display_actions[ name ] ) { pre_display_actions[ name ](); }

		if( form_predisplay[ formId ] ) form_predisplay[ formId ]();
		
		swicki_ui_setVisibility( this.form, 'visible');
		// focus
		if ( this.focus[ formId ] ) { this.focus[ formId ](); }
		
		log_formname = formId.match(/swicki_ui_form_(.+)_container/)[1];
		this.logger = new logUIActivity();
		this.logger.logaction('fopen', { 'formname': log_formname });
    } //else


} //displayForm()...

swickiUI.prototype.hideForm = function()
{
	var mT = 'hideForm :: '; var do_pending = true;

	swicki_ui_setDisplay( this.form, 'none' );
	
	if( form_postdisplay[ this.form ] ) form_postdisplay[ this.form ]();
	
	if (this.current_form)
	{
	//swicki_ui_setDisplay( this.current_form, 'none' );
		this.current_form.style.display='none';
		this.current_form = false;
	}
	this.curtain.style.display='none';
	this.hideError();
	
	do_pending = ( this.current_form.id!='swicki_ui_roadblock_container');
	if ( typeof( this.postdisplay_action ) == 'function' && do_pending ){ this.postdisplay_action(); this.postdisplay_action = false; };
	
	if(ui.pending_action!='' & do_pending )
	{
		ui.do_pending_action();
	};
	
}

swickiUI.prototype.registerHandlers = function( list )
{ 
    var mT = 'registerHandlers :: ';

    var name='', selectors='';
    for ( name in list )
    {
	// selectors
		selectors = list[name]['recipients'];
		for(var selector_idx=0;selector_idx<selectors.length;selector_idx++)
			{
				list[name]['handler']( swicki_ui_drillBySelector( selectors[ selector_idx ] ) );
			}
	}
}

//*******************************************************************************************

swickiUI.prototype.hideError = function()
{
    // turn 'em all off...
    for(erroridx in this.error_containers )
    {
	swicki_ui_setDisplay( this.errors[ this.error_containers[erroridx] ], 'none' );
    }
    //swicki_ui_setVisibility( this.error, 'hidden' );
    swicki_ui_setDisplay( this.error, 'none' );
}

//*******************************************************************************************

swickiUI.prototype.displayError = function ( errorId )
{
	
    this.hideError();	

    if ( errorId && this.errors[ errorId ] )
    {
		var error = this.errors[ errorId ];
		$('swicki_ui_error_container').style.display = 'block';		
			swicki_ui_setVisibility( error, 'visible' );
			swicki_ui_setDisplay( error, 'block' );
		
		$('frog').style.width='528px';
		
	}
}

//*******************************************************************************************
var swicki_ui_onload_handlers = {

    'flag_action' : {
	'recipients' : [ 'swicki_ui_link_ask_top' ],
	'handler' : function (element) {
	    element.onclick = function (event) {
	/*
		if (!loggedin){
		    //display the login/signup screen.
		    ui.displayForm('swicki_ui_form_roadblock_container');
		    return false;
		} else {
	*/
		    ui.displayForm('swicki_ui_form_ask_container');
		    return false;
	/*
		}
	*/
	    }	
	}
    },
	
    'post_sidebar'
            :
            {
                'recipients'
                :
                                    [ 'swicki_ui_link_post_top' ],
                'handler'
                :
		function(element) {
		    element.onclick = function()
		    {
		/*
			if (!loggedin){
			    //display the login/signup screen.
			    ui.displayForm('swicki_ui_form_roadblock_container');
			} else {
		 */
			    ui.displayForm('swicki_ui_form_post_container');
			    return false;
		/*
			}
		*/
		    }
		
		}
            },

	'login_links'
	:
	{
			'recipients'
			:		['swicki_ui_link_login_main',
					 'swicki_ui_comments_login'],
			'handler'
			:
					function(element) 
					{
					 element.onclick = function()
					    {
					        if( isInternalDomain ) {
					            ui.displayForm('swicki_ui_form_login_container');
					        }
					        else {
					            window.location = conSearchHome+"/login.php?p="+encodeURIComponent(window.location);
					        }
						return false;
					    }
					}
	},
    
    'signup_links'
    :
    {
            'recipients'
            :       [ 'swicki_ui_comments_signup'],
            'handler'
            :
                function(element)
                {
                    element.onclick = function()
                        {
                            ui.displayForm('swicki_ui_form_signup_container');
                            return false;
                        }
                }
    }
    
/*
	,
	''
	:
	{
			'recipients'
			:		[],
			'handler'
			:
					function(element) {
					}
	},
*/

		 

}; //swicki_ui_onload_handlers

var swicki_ui_form_handlers = {
	
	'encourage_button_skip'
	:
	{
		'recipients'
		:
		[ 'swicki_encourage_button_skip' ],
		'handler'
		:
		function(element)
		{
			element.onmouseup 	= function(){ button_up( this ); }
			element.onmousedown = function(){ button_down( this ); }
			element.onclick 	= function(){ ui.hideForm(); if( !$('encourage_next_time').checked ){ ;writePersistentCookie( _ENC_COOKIE,'no', _COOKIE_DOMAIN )} else {deletePersistentCookie( _ENC_COOKIE, _COOKIE_DOMAIN ) }   } //"skip" processing....
		}
	},
	
	'encourage_login'
    :
    {
	'recipients'
	:
  
	[ 'encourage_login' ],
	'handler'
	:
	function(element) {
	    element.onclick = function()
	    {
		ui.logger.logaction('fclose', {'closetype':'encourage-login'});ui.logger=false;
		ui.displayForm('swicki_ui_form_login_container');
		return false;
	    }
	}
    },
	
	'encourage_signup'
    :
    {
	'recipients'
	:
  
	[ 'encourage_signup' ],
	'handler'
	:
	function(element) {
	    element.onclick = function()
	    {
		ui.logger.logaction('fclose', {'closetype':'encourage-signup'});ui.logger=false;
		ui.displayForm('swicki_ui_form_signup_container');
		return false;
	    }
		element.onmousedown = function()
	    {
			button_down( this );
	    }
	    element.onmouseup = function()
	    {
			button_up( this );
	    }
	}
    },
	
	'encourage_feedback'
    :
    {
	'recipients'
	:
  
	[ 'encourage_feedback' ],
	'handler'
	:
	function(element) {
	    element.onclick = function()
	    {
		ui.logger.logaction('fclose', {'closetype':'encourage-feedback'});ui.logger=false;
		ui.displayForm('swicki_ui_form_feedback_container');
		return false;
	    }
	}
    },

    'roadblock_login'
    :
    {
	'recipients'
	:
  
	[ 'swicki_ui_form_roadblock_container swicki_ui_link_login' ],
	'handler'
	:
	function(element) {
	    element.onclick = function()
	    {
		ui.logger.logaction('fclose', {'closetype':'roadblock-login'});ui.logger=false;
		ui.displayForm('swicki_ui_form_login_container');
		return false;
	    }
	}
    },

    'roadblock_signup'
    :
    {
	'recipients'
	:
	[ 'swicki_ui_form_roadblock_container swicki_ui_link_signup',
	  'swicki_ui_signup_answers'],
	'handler'
	:
	function(element) {
	    element.onclick = function()
	    {
		ui.logger.logaction('fclose', {'closetype':'roadblock-signup'});ui.logger=false;
		ui.displayForm('swicki_ui_form_signup_container');
		captcha_regenerate(true);
		return false;
	    }
	}
    },

    'close'
    :
    {
	'recipients'
	:
	[ 'swicki_ui_container swicki_ui_close_img',
	  'swicki_ui_container swicki_ui_close'
	  ],
	'handler'
	: 
	function(element) {
	    element.onclick = function()
	    {
			ui.logger.logaction('fclose', {'closetype':'close'}); ui.logger = false;
			if (ui.pending_action!='') ui.pending_action='';
			ui.hideForm();
			return false;
	    }
	}
    },


	     'password_feedback'
	     :
	     {
		  'recipients'
		  :
					[ 'swicki_ui_signup_password', 
					  'swicki_ui_signup_password_confirm' ],
		  'handler'
		  :
					function(element) {
						element.onkeyup = function()
						{
							
							clearTimeout( ui.signup_password_check );
							ui.signup_password_check = setTimeout( password_Check, _AsYouType_DELAY );
						}
					}
	     }
		 
		 ,

	     'signup_email'
	     :
	     {
			'recipients'
			:
					[ 'swicki_ui_signup_email' ],
			'handler'
			:
					function(element) {
						//element.onkeypress = function()
						element.onblur = function()
						{
							clearTimeout( ui.signup_email_check );
							ui.signup_email_check = setTimeout("email_Check('"+ this.value+"' )", _AsYouType_DELAY );
						}
					}
	     },
    'post_submit': {
	'recipients'
	:
	['swicki_ui_form_post_container swicki_ui_post_button_submit'],
	'loadtype':'dynamic',
	'handler':function(element) {

	    element.onclick = function (event) {
			button_up( this );
			post_submit();
		}
	}
    },
    'post_summary_count': {
	'recipients'
	:
	['swicki_ui_form_post_container swicki_ui_post_comments'],
	'loadtype':'dynamic',
	'handler':function(element) {

	    element.onkeyup = function (event) {
			// this event handler displays the character counter for the summary field. The max is 80 so we will display max-count in the box.
			var cnt_field = $('swicki_ui_post_char_count');
			if (this.value.length > _POST_SUMMARY_MAXLENGTH) { this.value = this.value.substring(0,_POST_SUMMARY_MAXLENGTH);}
			cnt_field.value = _POST_SUMMARY_MAXLENGTH - this.value.length;
		}
	}
    },


	'login_submit' :{
	'recipients':['swicki_ui_form_login_container swicki_ui_login_button_submit'],
	'handler':
	function(element) {
		element.onclick = login_submit
	}
    },

    //
    'fullscreen_edit'
    :
    {
	'recipients':[ 'fullscreen_edit' ],
	'handler':function(element) {
	    element.onclick = function(event){
		var title = $('swicki_ui_post_title').value;
		var summary = $('swicki_ui_post_comments').value;
		var tags = $('swicki_ui_post_orig_term').value;
		var urls = $('swicki_ui_post_url').value;
		var url = swicki_ui_search_path+'/blogpost.php?gid='+encodeURIComponent(gid)+'&title='+encodeURIComponent(title)+'&cat='+encodeURIComponent(gid)+'&tags='+encodeURIComponent(tags)+'&summary='+encodeURIComponent(summary)+'&p='+encodeURIComponent(window.location)+'&url='+encodeURIComponent(urls);
		window.location=url;
		return false;	
	    }
	}
    },
		
    'signup_submit' :{
	'recipients':['swicki_ui_signup_button_submit'],
	'handler':
		function(element) {
		
	    element.onclick = function(){
			signup_submit();
	    }
	}
	},
	
	'signup_username'
	:
	{
			'recipients'
			:		[ 'swicki_ui_signup_username' ],
			'handler'
			:
					function(element) {
						element.onkeyup = 	function()
											{
													clearTimeout( ui.signup_username_check );
													if (this.value!='' )
													{
														if ( /^[a-zA-Z0-9_-]+$/.test( this.value ) )
														{
															ui.signup_username_check = setTimeout( "username_Check('"+ this.value+"', username_updateDisplay_onkeyup )",
																											   _AsYouType_DELAY );
														}
														else
														{
															ui.flagFieldWarning('swicki_ui_feedback_signup_username');
															ui.displayMessage('swicki_ui_msg_signup_username', '_format_error');
														}
													}
													else	// username field is blank
													{
														ui.resetFieldError('swicki_ui_error_signup_username');
														ui.resetFieldWarning('swicki_ui_feedback_signup_username');
														ui.displayMessage('swicki_ui_msg_signup_username', '_help');
													}
											}
					}
	}
	,
	'message_ok'
	:
	{
			'recipients'
			:		['swicki_ui_message_button_ok'],
			'handler'
			:
					function(element) 
					{
							element.onclick = function()
							{
								ui.logger.logaction('fclose', {'closetype':'Ok'}); ui.logger = false;
								ui.hideForm();
								return false;
							}
					}
	},
	'login_password'
	:
	{
			'recipients'
			:		['swicki_ui_login_password'],
			'handler'
			:
					function(element) 
					{
							element.onblur = function()
							{
									login_passwordCheck(this.value);
							}
					}
	},
	'login_email'
	:
	{
			'recipients'
			:		['swicki_ui_login_email'],
			'handler'
			:
					function(element) 
					{
							element.onchange = function()
								{
										clearTimeout(ui.login_email_check);
										
										if (this.value != '')
										{
												ui.login_email_check = setTimeout("login_emailCheck('" + this.value + "')", 
																									 		_AsYouType_DELAY);
										}
										else
										{
												ui.form_errors.login['email'] = false;
												ui.resetFieldWarning('swicki_ui_feedback_login_email');
												ui.displayMessage('swicki_ui_msg_login_email', '_ok');
										}
								}
					}
	},
	'signup_captcha_check'
	:
	{
			'recipients'
			:		['swicki_ui_input_signup_human'],
			'handler'
			:
					function(element) 
					{
							element.onkeyup = 	function()
											{
													
													//clearTimeout( ui.signup_captcha_check );
													//if (this.value!='' )
													if(this.value.length>=_CAPTCHA_LENGTH)
													{
														captcha_Check( this.value );
														//ui.signup_captcha_check = setTimeout( "captcha_Check('"+ this.value + "')",
														//													   _AsYouType_CAPTCHA_DELAY );
													}
													else
													{
														ui.resetFieldWarning('swicki_ui_feedback_signup_captcha');
														ui.displayMessage('swicki_ui_msg_signup_human', '_none');
													}
											}
					}
	} 
	,
	'signup_human_regenerate'
	:
	{
			'recipients'
			:		[ 'swicki_ui_link_signup_regenerate' ],
			'handler'
			:
					function(element)
					{
						element.onclick = function()
						{
							captcha_regenerate(false);
							return false;
						}
					}
	},
    
    'comment_submit'
    :
    {
        'recipients'
        :   [ 'swicki_ui_comment_button_submit' ],
        'handler'
        :
            function(element)
            {
                element.onclick = function()
                {
                    comment_submit();
                }
            }
    },

	'login_buttons'
	:
	{
		'recipients' : [ 'swicki_ui_login_button_submit' ], 
		'handler'	: function(notused){ swicki_ui_form_buttons(['swicki_ui_login_button_submit', 'swicki_ui_login_button_cancel']) }
	},
	'post_buttons'
	:
	{
		'recipients' : [ 'swicki_ui_post_button_submit' ], 
		'handler'	: function(notused){ swicki_ui_form_buttons(['swicki_ui_post_button_submit', 'swicki_ui_post_button_cancel']) }
	},
	'signup_buttons'
	:
	{
		'recipients' : [ 'swicki_ui_signup_button_submit' ], 
		'handler'	: function(notused){ swicki_ui_form_buttons(['swicki_ui_signup_button_submit', 'swicki_ui_signup_button_cancel']) }
	},
	'signup_tooltips'
	:
	{
		'recipients' : [ 'swicki_ui_username_help' ], 
		'handler'	: function(notused){ add_tooltip( ['swicki_ui_username_help'] ) }
	},
	'message_button'
	:
	{
		'recipients' : [ 'swicki_ui_message_button_ok' ], 
		'handler'	: function(notused){ swicki_ui_form_buttons([ 'swicki_ui_message_button_ok' ]) }
	},
	'captcha_init'
	:
	{
		'recipients' : [ 'swicki_ui_signup_captcha' ], /* as long as it exists, it isn't used */
		'handler'	: function(notused){ captcha_regenerate( true ); }
	},
    'comment_buttons'
    :
    {
        'recipients' : [ 'swicki_ui_comment_button_submit' ],
        'handler'   : function(notused){ swicki_ui_form_buttons([ 'swicki_ui_comment_button_submit', 'swicki_ui_comment_button_cancel' ]) }
    }

} //swicki_ui_form_handlers...

//********************************************************************************************************
swickiUI.prototype.clearAllMessages = function( Name )
{
	var ref;

	
	for( var msg_idx = 0; msg_idx < _MESSAGE_NAMES.length; msg_idx++ )
	{
		if ( ref = $( Name + _MESSAGE_NAMES[ msg_idx ] ) )
		{	
			ui.hideMessage( ref );
		}
	}
}

swickiUI.prototype.hideMessage = function( ref )
{
	swicki_ui_setVisibility( ref, 'hidden');
	swicki_ui_setDisplay( ref, 'none');
}


//********************************************************************************************************
// hide the bang left of field label
swickiUI.prototype.resetFieldError = function( Name )
{

	swicki_ui_setClassName( Name, 'swicki_ui_error_none' );
}
//********************************************************************************************************
// display red cross right of field, hide green tick just in case
swickiUI.prototype.flagFieldWarning = function( Name )
{

	swicki_ui_setClassName( Name, 'swicki_ui_feedback_error' );
}
//********************************************************************************************************
// hide cross, display tick
swickiUI.prototype.flagFieldOk = function( Name )
{
	swicki_ui_setClassName( Name, 'swicki_ui_feedback_ok' );

}
//********************************************************************************************************
// hide cross - do I need this? probably not
swickiUI.prototype.resetFieldWarning = function( Name )
{
	swicki_ui_setClassName( Name, 'swicki_ui_feedback_none' );

}
// hide cross and tick
swickiUI.prototype.resetFieldFeedback = function( Name )
{
	swicki_ui_setClassName( Name, 'swicki_ui_feedback_none' );
}
//********************************************************************************************************

swickiUI.prototype.displayMessage = function( Name, MessageSuffix )
{
	
	var ref = $( Name + MessageSuffix );
	this.clearAllMessages( Name );
	swicki_ui_setVisibility( ref, 'Visible');
	swicki_ui_setDisplay( ref, 'block' );
}

swickiUI.prototype.checkFormErrors = function( formName )
{
	
	var idx, result = true;
	for (idx in this.form_errors[ formName ])
	{
		if ( this.form_errors[ formName ][ idx] == false )
		{
			result = false;
			break;
		}
	}
	
	return result;
}
//********************************************************************************************************

swickiUI.prototype.checkEmail = function( email )
{
	var result = true;
	
	if (email.length > 0)
	{
		if ( !/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test( email ) )
		{
			result = false;
		}
	}
	
	return result;
}

//*******************************************************************************************
//ui.registerHandlers( swicki_ui_onload_handlers ); // others are attached as each form is loaded

function get_handlers( form_name, handler_list )
{
	var thelist = {};
	var handlers = form_handlers[ form_name ]; //this will return an array
	for (var index = 0, len = handlers.length; index<len; ++index)
	{
		thelist[handlers[index]] = handler_list[handlers[index]];
	}
	return thelist;
}

function createModerator(op){
    //op is either tpp,dp,ts,ds
    //grab the title,
    return function(){
	var myid = this.id.replace(/[a-zA-Z]*/,'');
	var title = $('swickiResultTitleText'+myid).innerHTML; //parse the url out of there. it is in the tit param.
	var url = $('voteurl'+myid).value;
	var summary = $('votesummary'+myid).innerHTML;
	var euid = readCookie('swcid');
	var pars = 'op='+encodeURIComponent(op)+'&type=json&version=1'+'&desc='+encodeURIComponent(summary)+'&euid='+encodeURIComponent(euid)+'&gid='+encodeURIComponent(gid)+'&u='+encodeURIComponent(url)+'&title='+encodeURIComponent(title)+'&keyword='+encodeURIComponent(kwd);
    var serverurl = '/resultaction.php';

    var myAjax = new Ajax.Request(
				  serverurl, 
	{
	    method: 'get', 
	    parameters: pars, 
	    //	    asynchronous: false,
			
	    onComplete: function (request, obj){     
		switch(obj[0]){
		    case "200": 
		    // cookie about the user
		    // other cookie about the user
		    // set those cookies for the browser
		    // update interface?
		    //set the cookies, do the action, reload the page.
			ui.reload();
		    break;
		    case 1: 
		    break;
		}
	    }
        //,onFailure: function (request, obj){ debug_alert('fail');}
	});
    //	myAjax.updateContent();
    /// BEGIN: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
    //    if (!myAjax.options.asynchronous) {
    //	myAjax.respondToReadyState(myAjax.transport.readyState);
    //    }
    /// END: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
    //	clear();    
    return false;
    
    }
}


function createVoter (dir){ 
    var letter = 'U', enable, e;


    return function (event){
        if(this.voteActive)
            {
                //console.log('vote click: ' + dir );
		//alert('vote click: ' + dir );
            var myid = this.id.replace(/[a-zA-Z]*/,'');
         
            /* disable voting for BOTH buttons - temporarily, locking */
            $('likeSiteU'+myid).voteActive = false;
            $('dislikeSiteU'+myid).voteActive = false;
            
            /* update the classes to reflect the vote */
            if( this.className.match(/voteUp/) )
            {
                e = $('likeSiteU'+myid);
                e.className = e.className.replace(/voteUp/,'votedUp');
                //$('dislikeSiteU'+myid).className = $('dislikeSiteU'+myid).className.replace(/voteDown/,'noVoteDown');
                e.title = langTab.votedUp;
                //e.onclickTemp = e.onclick;
                //e.onclick = function(){ return false; }
                enable = $('dislikeSiteU'+myid);
            }
            else
            if( this.className.match(/voteDown/) )
            {
                e = $('dislikeSiteU'+myid);
                //$('likeSiteU'+myid).className = $('likeSiteU'+myid).className.replace(/voteUp/,'noVoteUp');
                e.className = e.className.replace(/voteDown/,'votedDown');
                
                e.title = langTab.votedDown;
                //e.onclickTemp = e.onclick;
                //e.onclick = function(){ return false; }
                enable = $('likeSiteU'+myid);
            }
            
            //var crg = $('crg'+myid);
            var counter = $('label'+myid);

            if (dir < 0) var pre = 'dis'; else var pre = '';
            var factor = 1;
            var tool = $(pre+'likeSite'+letter+myid);
        
            //in that case the count increase is 2x vote. 
            //this will make the otherone look not stuck
            if (pre == 'dis') var pre2=''; else var pre2 ='dis';
            
            var tool2 = $(pre2+'likeSite'+letter+myid);
            //if (tool2.className.charAt(tool2.className.length-1)=='S')  {
            if(tool2.className.match(/voted/))
            {
                factor = 2;/* this allows cancelling the original vote and adding the opposite vote */
            }
        

           // if (counter.vote != dir){ //this result is already stuck.
                //get the url and the title out of the result.
                var title = $('swickiResultTitleText'+myid).innerHTML; //parse the url out of there. it is in the tit param.

	  var url = $('voteurl'+myid).value;
                vote(url,title,dir);
                //adjust the vote counter by +/- 1
                counter.vote = dir;
                counter.innerHTML = parseInt(counter.innerHTML) + factor * dir;
                //text.innerHTML = text.innerHTML.replace(/(\-*[0-9]+)/gi,counter.innerHTML);
                //tool.className = tool.className.replace(letter,letter+'S');
                //tool2.className = tool2.className.replace(letter+'S',letter);
          //  }
            /* enable is 'the other one' */
            enable.voteActive = true;
            
            if(enable.onclickTemp)
                {
                    enable.onclick = enable.onclickTemp;
                }
            
            if(enable.className.match(/voted/))
                {
                    enable.className = enable.className.replace(/voted/, 'vote');
                }
            enable.title = ( enable.className.match(/Up/) ? langTab.voteUp : langTab.voteDown ); 
            }
        return false; //kill the A click...
    }
}

function vote(url,title,vote) {
    //gid is global var.
    //uid is read from cookie.

    //ajax to the webservice
    //ajax the username and password through to the server
    var word = kwd;
    var euid = readCookie('swcid');
    var op = 'vote';
    var serverurl = '/resultaction.php';
    var pars = 'op='
	+encodeURIComponent(op)
	+'&type=json&version=2'
	+'&word='
	+encodeURIComponent(kwd)
	+'&euid='+encodeURIComponent(euid)
	+'&egid='+encodeURIComponent(gid)
	+'&url='+encodeURIComponent(url)
	+'&title='
	+encodeURIComponent(title)
	+'&vote='
	+encodeURIComponent(vote);
 
    var userdat = 'unme='+encodeURIComponent(loggedin_name);
  
	
	var voter = new logUIActivity(); voter.logaction('vote', {'vote':vote}); voter = null;
	
    var myAjax = new Ajax.Request(
				  serverurl, 
	{
	    method: 'get', 
	    parameters: pars, 
	    //	    asynchronous: false,
			
	    onComplete: function (request, obj)
	    {     

	                // Call Update vote
                var myAjax2 = new Ajax.Request(
                '/includes/vote_refresh.php'   ,
                {
                        method: 'get',
			parameters: userdat,
                        onComplete: function (request2, obj){

			document.getElementById('social_about_topright').innerHTML = request2.responseText;
                }//,onFailure: function (request2, obj){ debug_alert('fail');}
                });
	

	
	
	    }//,onFailure: function (request, obj){ debug_alert('fail');}
	});
    //	myAjax.updateContent();
    /// BEGIN: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
    //    if (!myAjax.options.asynchronous) {
    //	myAjax.respondToReadyState(myAjax.transport.readyState);
    //    }
    /// END: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
    //	clear();


		// Call Update vote
   		//var myAjax2 = new Ajax.Request(
         	//'/includes/vote_refresh.php'   ,
        	//{
            	//	method: 'get',
            	//	onComplete: function (request2, obj){
	          //      document.getElementById('ScoreVote').innerHTML = request2.responseText;
        //        }//,onFailure: function (request2, obj){ debug_alert('fail');}
        //	});    
    return false;

}

function containsDOM (container, containee) {
    var isParent = false;
    do {
	if ((isParent = container == containee))
	    break;
	containee = containee.parentNode;
    }
    while (containee != null);
    return isParent;
}

function checkMouseEnter (element, evt) {
    if (element.contains && evt.fromElement) {
	return !element.contains(evt.fromElement);
    }
    else if (evt.relatedTarget) {
	return !containsDOM(element, evt.relatedTarget);
    }
}

function checkMouseLeave (element, evt) {
	if(!evt) evt=window.event;
    if (element.contains && evt.toElement) {
	return !element.contains(evt.toElement);
    }
    else if (evt.relatedTarget) {
	return !containsDOM(element, evt.relatedTarget);
    }
}

//*******************************************************************************************

//return submit or cancel button to up-state if onmousedown isn't followed by onmouseup (and hence onclick)...
// ie if the user "slides off"
function autoUp( imgSelector )
{
	img = swicki_ui_drillBySelector( imgSelector );
	if (img.className) // ie7
	{
		img.className = img.className.replace(/_down/,'_up');
	}
}

//*********************************************************************************************
function username_updateDisplay_onkeyup(req)
{
	username_updateDisplay(req, 'onkeyup');
}
function username_updateDisplay_onblur(req)
{
	username_updateDisplay(req, 'onblur');
}
function username_updateDisplay(req, mode)
{
	var username_ok = username_CheckResult(req);
	switch(mode)
	{
			case 'onkeyup':
			
					ui.form_errors.signup['username'] = ( username_ok == 'ok' ? true : false );

			
					if( username_ok=='ok' )
					{
						ui.resetFieldError('swicki_ui_error_signup_username');
						ui.flagFieldOk('swicki_ui_feedback_signup_username');
						//ui.displaySignupUserNameAvailable();
						ui.displayMessage( 'swicki_ui_msg_signup_username', '_available');
						
					}
					else
					if (username_ok =='not_unique')
					{
						ui.flagFieldWarning('swicki_ui_feedback_signup_username');
						ui.displayMessage('swicki_ui_msg_signup_username', '_not_unique');
					}
					else
					if (username_ok=='format_error')
					{
						ui.flagFieldWarning('swicki_ui_feedback_signup_username');
						ui.displayMessage('swicki_ui_msg_signup_username', '_format_error');
					}
					else
					if (username_ok=='blank')
					{
						ui.resetFieldError('swicki_ui_error_signup_username');
						ui.resetFieldWarning('swicki_ui_feedback_signup_username');
						ui.displayMessage('swicki_ui_msg_signup_username', '_help');

					}
					break;
	}
}

function username_CheckResult(req)
{
	var result = '';
	try{
		var tall = req.responseText.split('|');
		var response_code = tall[0].toLowerCase();
		var response_msg = tall[1];
		var response_value = tall[2];
		
		
		// check that the field value NOW is the same as the returned tested value, if not, return result of another test...somehow?

		
		switch( response_code ){
			case 'ok'   :
			{
				result = 'ok';
				break;
			}
			case 'nok'  :
			{
				result = ( response_msg=='error checking' ? 'format_error' : 'not_unique');
				break;
			}
			default    :
			{
				break;
			}
		}
		//$(msgId).innerHTML = '<span class="' + tall[0] + '">'+  tall[1] +'</span>';   
	} catch (e) { }
	return result;
}
function username_Check(signup_uname, callback)
{
	if(signup_uname.length>0)
	{
		var p = 'username=' + encodeURIComponent(signup_uname) + '&userid=0';
		
		var req = new Ajax.Request( '/username_api.php', { method:'get', parameters:p, onComplete: callback } );
	}
}

function email_Check( email )
{
							
	var email_ok = ui.checkEmail( email );
	
	ui.form_errors.signup['email'] = email_ok;

	
	if (email.length > 0)
	{
		//ui.resetFieldError(	'swicki_ui_error_signup_email');
		//ui.resetErrorText(	'swicki_ui_msg_signup_email');
	
		if( !email_ok )
		{
			ui.flagFieldWarning('swicki_ui_feedback_signup_email');	// red cross on right
			ui.displayMessage('swicki_ui_msg_signup_email', '_error');
		}
		else if ( email_ok )
		{
				
			var server_url = "/username_api.php";
			var pars = "email=" + encodeURIComponent(email);
			var req = new Ajax.Request(server_url, { method:'get', parameters:pars, onComplete:email_updateDisplay_onkeyup} );
			
		}
	}
	else // empty field...
	{
		ui.resetFieldError	(	'swicki_ui_error_signup_email');
		ui.displayMessage	(	'swicki_ui_msg_signup_email', '_help');
		ui.resetFieldFeedback(	'swicki_ui_feedback_signup_email');
	}
}

function email_updateDisplay_onkeyup(req)
{
	try
	{
		var tall = req.responseText.split('|');
		var response_code = tall[0].toLowerCase();
		var response_msg = tall[1];
		var response_value = tall[2];

		switch( response_code ){
			case 'ok'   :
			{
				ui.resetFieldError(	'swicki_ui_error_signup_email');
				ui.flagFieldOk	('swicki_ui_feedback_signup_email');
				ui.displayMessage('swicki_ui_msg_signup_email', '_ok');
				// ui.form_errors.signup['email']  is already true at this point
				break;
			}
			case 'nok'  :
			{
				ui.flagFieldWarning('swicki_ui_feedback_signup_email');
				ui.displayMessage('swicki_ui_msg_signup_email', '_taken');
				ui.form_errors.signup['email'] = false;
				break;
			}
			default    :
			{
				break;
			}
		}
		//$(msgId).innerHTML = '<span class="' + tall[0] + '">'+  tall[1] +'</span>';   
	} 
	catch (e) 
	{ 
	}
	
}

function readCookie(name,cookie)
{
   
    if (cookie==null) cookie = document.cookie;
    var ca = cookie.split(';');
    for (var i=0; i<ca.length; i++)
	{
		var tmp = ca[i].split('=');
		if (trim(tmp[0])==name) return(unescape(tmp[1]));
    }
    
    return null;
}

function trim(value) {
    var temp = value;
    var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
    if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
    var obj = /  /g;
    while (temp.match(obj)) { temp = temp.replace(obj, " "); }
    return temp;
}

/* writes a cookie that expires with the session. ( page domain - full URL ) */
function writeCookie(name,value){
    document.cookie = name + '=' + escape(value);
}
function writePersistentCookie(name, value)
{
	var argv = arguments;
	var argc = arguments.length;
	PersistentCookie( { 'name': name, 'value': value, 'domain': ( argc > 2 ? argv[2] : false ), 'expires': _PERS_COOKIE_DAYS } );
}
function deletePersistentCookie( name  )
{
	var argv = arguments;
	var argc = arguments.length;
	var pars = { 'delete': true, 'name':name, 'cookie_domain': ( argc > 1 ? argv[1] : false ) };
	PersistentCookie( { 'delete': true, 'name':name, 'cookie_domain': ( argc > 1 ? argv[1] : false ) } );
}
// domain, delete, expires ( n days ), value, 
function PersistentCookie( pars )
{
	var domain 			= ( pars['domain'] 	? pars['domain'] : false ),
		deleteCookie 	= ( pars['delete'] ? true : false ),
		expires			= ( pars['expires'] ? pars['expires'] : ( deleteCookie ? -1 : 1 ) ), // days
		value			= ( pars['value'] ? pars['value'] : null ),
		name			= ( pars['name'] ? pars['name'] : false );
	if( name!=false )
	{
		var date = new Date(); date.setTime(date.getTime() + ( expires *24*60*60*1000));
		var expires = '; Expires='+date.toGMTString();
		cookie_text = name + '=' + ( value != null ? encodeURIComponent( value ) : '' ) + expires+"; Path=/" + (domain!=false ? '; Domain='+domain : '');
		document.cookie = cookie_text;
	}
}

/* get the params out of a url*/
var QS = {
    values : new Array(),
    parse: function (query) {
	var pairs = query.split("&");
	for (var i=0;i<pairs.length;i++)
	{
	    var pos = pairs[i].indexOf('=');
	    if (pos >= 0)
		{
		    var argname = pairs[i].substring(0,pos);
		    var value = pairs[i].substring(pos+1);
		    this.values[argname] = value;
		}
	}
    }
}

function password_Check()
{
	var pword = $('swicki_ui_signup_password');
	var conf  = $('swicki_ui_signup_password_confirm');
	var password_ok = ( pword.value.length >= _PASSWORD_MIN_LENGTH );
	var confirm_ok =  ( password_ok && conf.value == pword.value );
	
	ui.form_errors.signup['password'] = password_ok;
	ui.form_errors.signup['password_confirm'] = confirm_ok;
    
		if ( pword.value.length == 0 )
		{	
			$('swicki_ui_signup_password_confirm').value = '';
			
			ui.resetFieldError('swicki_ui_msg_signup_password');
			ui.resetFieldError('swicki_ui_msg_signup_password_confirm');
			
			ui.resetFieldError('swicki_ui_error_signup_password');
			ui.resetFieldError('swicki_ui_error_signup_password_confirm');
			
			ui.displayMessage('swicki_ui_msg_signup_password'		 , '_help');
			ui.displayMessage('swicki_ui_msg_signup_password_confirm', '_help');
			
			ui.resetFieldWarning('swicki_ui_feedback_signup_password');
			ui.resetFieldWarning('swicki_ui_feedback_signup_password_confirm');

		}
		else
		if ( password_ok )
		{
			ui.displayMessage('swicki_ui_msg_signup_password', '_ok');			// red text
			ui.flagFieldOk('swicki_ui_feedback_signup_password');	// red cross on right
			ui.resetFieldError('swicki_ui_error_signup_password');
			
			if ( confirm_ok )
			{
					ui.resetFieldError('swicki_ui_error_signup_password');
					ui.displayMessage('swicki_ui_msg_signup_password_confirm', '_ok');
					ui.flagFieldOk('swicki_ui_feedback_signup_password');
					ui.flagFieldOk('swicki_ui_feedback_signup_password_confirm');
			}
			else // confirm NOT ok...
			{
				ui.displayMessage('swicki_ui_msg_signup_password_confirm', '_error');
				ui.flagFieldWarning('swicki_ui_feedback_signup_password_confirm');
			}
		}
		else
		if ( !password_ok )
		{
			ui.flagFieldWarning('swicki_ui_feedback_signup_password');
			ui.displayMessage('swicki_ui_msg_signup_password','_error');
		}
		
}

/*
	Retrieve a new captcha image. 
*/
function captcha_regenerate(initial)
{
	
	var img = $('swicki_ui_signup_captcha');
	if (!img) return false;
	img.src = "/images/captcha/captcha1.php?" + parseInt( Math.random() * 99999999 );
	
	//clear text box and error warnings
	$("swicki_ui_input_signup_human").value = "";
	ui.resetFieldError(	'swicki_ui_feedback_signup_captcha');
	ui.displayMessage('swicki_ui_msg_signup_human', '_none');
	
	//set image to expire 
	//setTimeout(captcha_regenerate, _CAPTCHA_TIMEOUT_DELAY);
	
	if(ui.current_form.id=='swicki_ui_form_signup_container' && !initial)
	{
		$('swicki_ui_input_signup_human').focus();
	}

}

/*
	Check whether the user's text matches the captcha code. The md5 of the captcha code is
	stored in a cookie. This is compared to the md5 of the user's text.
*/
function captcha_Check(txt)
{
	
	
	if (txt.length >= _CAPTCHA_LENGTH) 
	{
		var user_input = encodeURIComponent(txt);
		var cookie_md5 = readCookie('md5code');
		var server_url =  "/images/captcha/captcha_check.php";
		var pars = "user_input=" + user_input + "&cookie_md5=" + cookie_md5;
		var req = new Ajax.Request(server_url, { method:'get', parameters:pars, onComplete:captcha_updateDisplay} );
	}
	else
	{	//clear messages
		ui.resetFieldWarning('swicki_ui_feedback_signup_captcha');
		ui.displayMessage('swicki_ui_msg_signup_human', '_none');
	}
	
}

function captcha_updateDisplay(req)
{
//	if (req.responseText == "correct") 
//	{
		clearTimeout( ui.signup_captcha_check );
//		ui.flagFieldOk	('swicki_ui_feedback_signup_captcha');
//		ui.displayMessage('swicki_ui_msg_signup_human', '_ok');
		ui.form_errors.signup['captcha'] = true;
//	}
//	else 
//	{
//		ui.flagFieldWarning('swicki_ui_feedback_signup_captcha');	// red cross on right
//		ui.displayMessage('swicki_ui_msg_signup_human', '_error');
//		ui.form_errors.signup['captcha'] = false;
//	}
}

/*
	Display an animated ... to denote form processing
*/
function animated_waiting(count)
{
    var span = $('swicki_ui_info_animation');
    if (count > 3)
	{
	    span.innerHTML = "&nbsp;";
	    count = 0;
	}
    else
	{
	    span.innerHTML += ".&nbsp;";
	    count++;
	}
    setTimeout('animated_waiting(' + count + ')', _WAITING_ANIMATION_DELAY);
}

/*
	Display the message banner at the top of the signup page
*/
function display_message_banner(icon_class, message_id)
{
	//set the icon
	var icon = $('swicki_ui_icon_error');
	swicki_ui_setClassName(icon, icon_class);
	
	//display the banner
	ui.displayError(message_id);
	
	if (message_id == 'swicki_ui_info_msg_wait')
		animated_waiting(0);
	
}

function display_message_container(title, msg)
{
	ui.message_title 	= title;
	ui.message_text		= msg;
	ui.predisplay_action = _ASK_MESSAGE_PRE;
	ui.postdisplay_action = _MESSAGE_CLEAR;
	ui.displayForm('swicki_ui_form_message_container');
}

function login_emailCheck(email)
{
	var email_ok = ui.checkEmail( email );
	ui.form_errors.login['email'] = email_ok;
	
	if (email.length > 0)
	{
		if (!email_ok)
		{
			ui.flagFieldWarning('swicki_ui_feedback_login_email');	// red cross on right
			ui.displayMessage('swicki_ui_msg_login_email', '_error');
		}
		else
		{
			//don't show a green tick as the email may still be wrong	
			ui.resetFieldWarning('swicki_ui_feedback_login_email');
			ui.displayMessage('swicki_ui_msg_login_email', '_ok');
		}
	}

}

function login_passwordCheck(pass)
{
	if( $('swicki_ui_login_email').value != '' )
	{
		if (pass.length > 0)
			ui.form_errors.login['password'] = true;
		else
		{
			ui.form_errors.login['password'] = false;
			ui.flagFieldWarning('swicki_ui_feedback_login_password')
			ui.displayMessage('swicki_ui_msg_login_password', '_error')
		}
	}
}

swickiUI.prototype.do_pending_action = function()
{
	var pending_action = this.pending_action; this.pending_action = '';
		switch( pending_action )
		{
				case 'ask':
					ui.page_reload = true;
				//	ui.displayForm('swicki_ui_form_ask_container');
					ask_submit();
					break;
				case 'post':
					ui.page_reload = true;
					ui.displayForm('swicki_ui_form_post_container');
					post_submit();
					break;
				case 'reload':
					ui.reload();
					break;
				default:
					break;
		}
		//ui.reload();
}



/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* http://www.ismaelj.com/articulos/addevent-recoding-contest/ */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function addEvent(obj,evType,fn){
 var r = false;
 if (obj.addEventListener){
    obj.addEventListener(evType, fn, true);
    r = true;
  }
  else if (obj.attachEvent) {
    var id = obj.sourceIndex || -1;

    if (!fn[evType + id]) {
      var f = fn[evType + id] = function(e) {
        var o = document.all[id] || document;
        o._f = fn;
        var s = o._f(e);
        o._f = null;
        return s;
      };

      r = obj.attachEvent("on" + evType, f);
      obj = null;
    }
  }
  return r;
};

function removeEvent(obj, evType, fn){
  var r = false
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, true);
    r = true;
  } else if (obj.detachEvent) {
    r = obj.detachEvent("on" + evType, fn[evType + (obj.sourceIndex || -1)]);
  }
  return r;
};

function checkBlogpostEntry(thisForm)
{
		with (thisForm)
		{
                                //if (($('cancel').value) == "- Cancel -")
                                //{
                                //        document.location = $('p').value;
                                //} 
				
				if (entryTitle.value.length == 0)
				{
					$('blogpost_title_error').innerHTML = "Please enter a title";
					entryTitle.focus();
					return false;
				}
				else
				{
					$('blogpost_title_error').innerHTML = "";
					return true;
				}
			
				
		}
	
}

function isOnlyWhiteSpace(val)
{
		return !/\S/.test(val);
}

function enter_submits_form( event, call_form_processor )
{
	var ie4 = (document.all)? true:false;
	var evt = (event) ? event : ((window.event)?window.event:new Object);
	var keyCode = document.layers ? evt.which : document.all ?  evt.keyCode : evt.keyCode;
			
	// IE5 on Mac sends an enter as KeyCode 0, instead of 13.  But, a lot of other codes show up as 0.
	if (ie4 && keyCode==0) keyCode = 13;
	
	if (keyCode == 13 )
	{
		call_form_processor();
		if (event.cancelBubble) event.cancelBubble = true;
		return false;
	}
		
//		swicki_ui_drillBySelector(frm.id  + ' swicki_ui_button_submit').onclick();	
}


//add 'submit form on enter' events
	var e;
var pre_display_actions =
{
	'login':
	function()
	{
		if(e = $('swicki_ui_form_login'))
		{
				e.onsubmit = function() { return false };
				e = $('swicki_ui_login_password');
		addEvent(	e,
					'keyup',
					function(event)
					{
						enter_submits_form( event, login_submit );
						return false;
					}
				);
		}
	}
}
var form_button_selectors =
[
	'swicki_ui_signup_button_submit',
	'swicki_ui_signup_button_cancel',
	'swicki_ui_login_button_submit',
	'swicki_ui_login_button_cancel',
	'swicki_ui_post_button_submit',
	'swicki_ui_post_button_cancel',
	'swicki_ui_message_button_ok'
];
function swicki_ui_form_buttons( form_button_selectors )
{
	var target=null;
	for( form_button_selector=0;form_button_selector<form_button_selectors.length;form_button_selector++ )
	{
		var selector = form_button_selectors[form_button_selector];
		if( target = $( selector ) )
		{
				
			addEvent( 	target,
						'mousedown',
						function()
						{
							button_down( this );
						}
					);
			
			addEvent( 	target,
						'mouseup',
						function()
						{
							button_up( this );
						}
					);
			
			if( selector.match(/cancel$/) != null )
			{
					addEvent(	target,
								'click',
								function()
								{
									cancel_click( this );
								}
							);
			}
			else
			if( selector.match(/submit$/) != null )
			{
					addEvent(	target,
								'click',
								function()
								{
									submit_click( this );
								}
							);
			}
		}
	}
}

function button_down( element )
{
	element.className = element.className.replace(/_up/, '_down');
	element.autoUp = setTimeout("autoUp('"+ui.current_form.id + " "+element.id+"')", _AUTO_UP_DELAY);
}
function button_up( element )
{
	clearTimeout(element.autoUp);
	element.className = element.className.replace(/_down/, '_up');
}
function cancel_click( element )
{
	button_up( element ); // just in case?
	ui.logger.logaction('fclose', {'closetype':'cancel'}); ui.logger = false;
	ui.hideError();
	ui.hideForm();
}
function submit_click( element )
{
	button_up( element ); // just in case?
}

function signup_submit()
{
	$('swicki_ui_signup_button_submit').disabled = true;
	
	if (!ui.checkFormErrors('signup') )
		{
			$('swicki_ui_signup_button_submit').disabled = false;		
			display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_signup');
			//username, email, password, confirm, captcha...
			if(!ui.form_errors.signup['username'])
				$('swicki_ui_signup_username').select()
			else
			if(!ui.form_errors.signup['email'])
				$('swicki_ui_signup_email').select()
			else
			if(!ui.form_errors.signup['password'])
				$('swicki_ui_signup_password').select()
			else
			if(!ui.form_errors.signup['confirm'])
				$('swicki_ui_signup_password_confirm').select()
			else
			if(!ui.form_errors.signup['captcha'])
				$('swicki_ui_input_signup_human').select();
		}
		else
		{
			//show 'please wait' banner
			display_message_banner('swicki_ui_icon_info', 'swicki_ui_info_msg_wait');
			
		//get the input nodes
		var em = swicki_ui_drillBySelector('').value;
		var pass = swicki_ui_drillBySelector('swicki_ui_signup_password').value;
		//ajax the username and password through to the server
		var le = $('swicki_ui_signup_email').value;
		var lu = $('swicki_ui_signup_username').value;
		var lp = $('swicki_ui_signup_password').value;
		var lp2 = $('swicki_ui_signup_password_confirm').value;
		//			var lr = $('swicki_ui_signup_remember').checked;
		var op = 'signup';
		var serverurl = '/resultaction.php';
		var pars = 'op='+encodeURIComponent(op)+'&type=json&version=2'+'&le='+encodeURIComponent(le)+'&lp='+encodeURIComponent(lp)+'&lp2='+encodeURIComponent(lp2)+'&lu='+encodeURIComponent(lu)+'&gid='+encodeURIComponent(gid);
		var myAjax = new Ajax.Request(
					      serverurl, 
		    {
			method: 'get', 
			parameters: pars, 
			//			asynchronous: false,
			
			onComplete: function (request, obj){     
			    if (obj != null) {
				switch(obj[0]){
				    case 0: 
                        // cookie about the user
                        // other cookie about the user
                        // set those cookies for the browser
                        // update interface?
                        //set the cookies, do the action, reload the page.
                        if(ui.pending_action!='')
                        {
                            loggedin = true;
                            ui.do_pending_action();
                        }
                        else
                        {
                            ui.reload();
                        }
                        break;
				    case 1: 
                        display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_signup');
                        break;
				    default: 
                        break;
				}
			    }
			}
            //,onFailure: function (request, obj){ debug_alert('fail');}
		    });
		//	myAjax.updateContent();
		/// BEGIN: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
			//		if (!myAjax.options.asynchronous) {
			//		    myAjax.respondToReadyState(myAjax.transport.readyState);
			//			}
			/// END: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
			//	clear();
		}
}

function login_submit()
{

	var errors = ui.form_errors.login;
	errors.email = false; errors.password = false;
	var _focus = false;
		
	$('swicki_ui_login_button_submit').disabled = true;	// disable submit, prevent double-submission
	ui.hideError();
			
	var le = $('swicki_ui_login_email').value;
	var lp = $('swicki_ui_login_password').value;
	
	if(le=='')
	{
		$('swicki_ui_login_button_submit').disabled = false;	// disable submit, prevent double-submission
		return false;
	}
	
	//reset message banner(s)...
		
	// error checking...
	login_emailCheck(le);
	if ( !errors.email ) { $('swicki_ui_login_email').select(); _focus = true; }
	
	// since they've submitted we'll also check for blank email...
	if( le.length == 0 )
	{
		ui.form_errors[ 'login' ][ 'email' ] = false;
		ui.flagFieldWarning('swicki_ui_feedback_login_email');	// red cross on right
		ui.displayMessage('swicki_ui_msg_login_email', '_blank');
		if (!_focus) { $('swicki_ui_login_email').select(); _focus = true; }
	}
	else
	{
		ui.resetFieldWarning('swicki_ui_feedback_login_email');
		ui.clearAllMessages('swicki_ui_msg_login_email');
	}
	login_passwordCheck(lp);
	// since they've submitted we'll also check for blank password...
	if( !errors.password )
	{
		ui.flagFieldWarning('swicki_ui_feedback_login_password');	// red cross on right
		ui.displayMessage('swicki_ui_msg_login_password', '_error');
		if (!_focus) { $('swicki_ui_login_password').focus(); _focus = true; }
	}
	else
	{
		ui.resetFieldWarning('swicki_ui_feedback_login_password');
		ui.clearAllMessages('swicki_ui_msg_login_password');
	}

	if (!ui.checkFormErrors('login') )
	{
		//show error banner
//			display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_signup');
		display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_wait');
		$('swicki_ui_login_button_submit').disabled = false;
	}
	else
	{
		//show 'please wait' banner
		display_message_banner('swicki_ui_icon_info', 'swicki_ui_info_msg_wait');
		
		//ajax the username and password through to the server
		
		var lr = $('swicki_ui_login_remember').checked;
		var op = 'login';
		var serverurl = '/resultaction.php';
		var pars = 'op='+encodeURIComponent(op)+'&type=json&version=2'+'&le='+encodeURIComponent(le)+'&lp='+encodeURIComponent(lp)+'&lr='+lr;
			
		var myAjax = new Ajax.Request(
						  serverurl, 
			{
			method: 'get', 
			parameters: pars, 
			//				asynchronous: false,
			
			onComplete: function (request, obj){     
				switch(obj[0]){
				case 0: 
				if ( ui.logger ) ui.logger.logaction('fclose', {'closetype':'login-submit'});ui.logger=false;
				//update the display.
					if(ui.pending_action!='')
					{
						loggedin = true;
						ui.hideForm();
						ui.do_pending_action();
					}
					else
					{
						setTimeout( function() { remember_login( _SAVE_LOGIN, $('swicki_ui_login_remember').checked ); ui.reload() }, 1000 );
					}
				break;
				case 1:
					setTimeout( function() {
											display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_forgot');
											$('swicki_ui_login_button_submit').disabled = false;
											$('swicki_ui_login_password').select();
										 }, 1000 );
				break;
				}
			}
            //,onFailure: function (request, obj){ debug_alert('fail');}
			});
		//	myAjax.updateContent();
		/// BEGIN: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
		//			if (!myAjax.options.asynchronous) {
		//				myAjax.respondToReadyState(myAjax.transport.readyState);
		//			}
		/// END: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
		//	clear();  
	}
	  
	return false;

}

function post_submit()
{
//	if(!loggedin)
//	{		
//		ui.pending_action = 'post';
//		ui.predisplay_action = _ROADBLOCK_MSG_ENC;
//		ui.postdisplay_action = _ROADBLOCK_MSG_DEF;
//		if ( ui.logger ) ui.logger.logaction('fclose', {'closetype':'post-submit-not-logged-in'});ui.logger=false;
//		ui.displayForm('swicki_ui_form_roadblock_container');
//		return false;
//	}
//	else
//	{
		if ( ui.logger ) ui.logger.logaction('fclose', {'closetype':'post-submit'});ui.logger=false;
//	}
	//check for empty fields
	if (isOnlyWhiteSpace($('swicki_ui_post_title').value))
		display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_missing');
	else if (isOnlyWhiteSpace($('swicki_ui_post_comments').value))
		display_message_banner('swicki_ui_icon_error', 'swicki_ui_error_msg_missing');
	else
	{
		//display 'please wait' message
		display_message_banner('swicki_ui_icon_info', 'swicki_ui_info_msg_wait');
		//disable the close, cancel and submit...
		$('swicki_ui_post_button_submit').disabled=true;
		$('swicki_ui_post_button_cancel').disabled=true;
		$('swicki_ui_close').disabled=true;
		$('swicki_ui_close_img').disabled=true;
				
		//ajax the username and password through to the server
		//swicki_ui_post_title
		var title = $('swicki_ui_post_title').value;
		var comments = $('swicki_ui_post_comments').value;
		var url = $('swicki_ui_post_url').value;
		// hidden field containing original search term...
		var orig_term = $('swicki_ui_post_orig_term').value;

		var op = 'post';

		var serverurl = '/resultaction.php';
		var pars = 'op='+encodeURIComponent(op)+'&type=json&version=2'+'&title='+encodeURIComponent(title)+'&comments='+encodeURIComponent(comments)+'&egid='+encodeURIComponent(gid)+'&tags='+encodeURIComponent(orig_term)+'&url='+encodeURIComponent(url)
						+'&orig_term='+encodeURIComponent(orig_term);
			
		var myAjax = new Ajax.Request(
						  serverurl, 
			{
			method: 'post', 
			parameters: pars, 
			//			asynchronous: false,
			
			onComplete: function (request, obj){     
				if (obj != null) {
				switch(obj[0]){
					case 0: 
					//update the display.
					//ui.hideForm();
					if(!loggedin && !readCookie( _ENC_COOKIE ) )
					{
						ui.user_action = "Contribution";
						ui.displayForm('swicki_ui_form_encourage_container');
					//else
					}
					else
					{
						ui.hideForm();
					}
						//remove parameter to prevent forms from redisplaying
						if ( window.location.href.match(/\?post=1/) )
						{
							ui.reload_url = window.location.href.replace('?post=1', '');
						}
						
						$('swicki_ui_post_button_submit').disabled=false;
						$('swicki_ui_post_button_cancel').disabled=false;
						$('swicki_ui_close').disabled=false;
						$('swicki_ui_close_img').disabled=false;
                        
                        ui.reload();
                        
						return false;
					//}
					break;
					default: 
					break;
				}
				} else {
				}
			}
            //,onFailure: function (request, obj){ debug_alert('fail');}
			});
		//	myAjax.updateContent();
		/// BEGIN: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
		//		if (!myAjax.options.asynchronous) {
		//		    myAjax.respondToReadyState(myAjax.transport.readyState);
		//		}
		/// END: FIX TO MAKE SYNCHRONOUS CALLS TO WORK
		//	clear(); 
	}
}

function cacheAndDisplayForm( name, markup )
{
	cacheForm( name, markup );
	if ( typeof( ui.predisplay_action ) == 'function'){ ui.predisplay_action(); ui.predisplay_action = false; };
	if ( pre_display_actions[ name ] ) { pre_display_actions[ name ](); }
	ui.displayForm( ui.pendingFormName );
	ui.pendingFormName = '';
}

function cacheForm( name, markup )
{
	var tmpmarkup = macro_replace( snr, markup);
	//if (!this.forms[ formId ] )
	var nodeRef;
	var newElement = document.createElement('DIV');
	newElement.innerHTML = tmpmarkup;
	//ui.formcache[ name ] = { 'markup': markup }; //object?
	
    nodeRef = ui.body.appendChild( newElement.firstChild );
	ui.forms[ nodeRef.id ]      = new Object();
	ui.forms[ nodeRef.id ].node = nodeRef;
	
	var title = swicki_ui_walk( nodeRef, function(v){ if(v.className=='swicki_ui_form_title')return true;});
	ui.forms[ nodeRef.id ].title = title.innerHTML;
	title.parentNode.removeChild(title);
	
	ui.registerHandlers( get_handlers( name, swicki_ui_form_handlers ) );
}

function getContainer()
{
	this.dload('container', ContainerLoader )
}

function ContainerLoader( name, markup )
{
	var tmpmarkup = macro_replace( snr, markup );
	// runs following reciept of container markup...
	var newElement = document.createElement('DIV');
	newElement.innerHTML = tmpmarkup;
    
    ui.containerLoaded = true;
	ui.form = newElement.firstChild;
	document.body.appendChild( newElement.firstChild );
    ui.form =	$('swicki_ui_container');
	ui.body =	$('swicki_ui_body');
	ui.title =	$('swicki_ui_banner_title');
	ui.close =	$('swicki_ui_close');
	ui.registerHandlers( get_handlers( name, swicki_ui_form_handlers ) );
	ui.error			= $('swicki_ui_error_container');
	
    ui.errors = new Object();

    // add any new one's here...
	ui.error_containers = _ERROR_CONTAINERS;
    for(var erroridx in ui.error_containers )
	{
	    ui.errors[ ui.error_containers[erroridx] ] = $( ui.error_containers[erroridx] );
	}
}

function dload  ( dname, do_process )
{
	var op = 'load';
	var serverurl = '/resultaction.php';
	var pars = 'op='+encodeURIComponent(op)+'&type=json&version=2'+'&dn='+encodeURIComponent( dname ) + '&egid=' + gid;
		
	var myAjax = new Ajax.Request(
					  serverurl, 
		{
		method: 'get', 
		parameters: pars, 
		//			asynchronous: false,
		
		onComplete: function (request, obj){
			if (obj != null) {
			switch(obj[0]){
				case 0: 
				do_process( obj[1], request.responseText ); // name, markup
				break;
				default: 
				break;
			}
			}
		}
        //,onFailure: function (request, obj){ debug_alert('dload :: fail :: '+ name );}
		});
}
function macro_replace( list, txt )
{ // global s&r on the innerHTML forms as they come in...
	var tmptxt = txt, rep;
	for( var src in list )
	{
		rep = new RegExp( src, 'g' );
		tmptxt = tmptxt.replace( rep, list[ src ] );
	}
	return tmptxt;
}

/* tooltips */
/* class="swicki_ui_tooltip"  */
var tooltip_no = 1, tipactive = false, ttfunc = function(event){ trackmouse(event); };
function add_tooltip( toptips )
{
//	for( var tooltip_recipient in _TOOLTIPS )
	for( var tooltipidx in toptips )
	{
		tooltip_no++;
		if ( e = $( toptips[ tooltipidx ] ) )
		{
			var tooltipnode = document.createElement('DIV');
			tooltipnode.id = 'tooltip_' + tooltip_no.toString();
			tooltipnode.innerHTML = '<DIV class="swicki_ui_tooltip">' + _TOOLTIPS[ toptips[ tooltipidx ] ] + '</div>';
			tooltipnode.className = 'swicki_ui_tooltip_container';
			document.body.appendChild( tooltipnode );
			e.tooltipnode = tooltipnode;
			e.onmouseover=
				function( event )
				{
					this.tipactive = true;
					doTooltip( this, event );
					//addEvent( document, 'mousemove', ttfunc );
					document.onmousemove = ttfunc;
				}
			e.onmouseout=
				function( event )
				{
					//hideTip( this.tooltipnode.id );
					if (checkMouseLeave( this , event ) )
					{
						this.tipactive = false;
						this.autoHide = setTimeout('hideTip(\''+ this.tooltipnode.id+'\');', _TOOLTIP_AUTOHIDE_DELAY);
					}
				}
		}
	}
}
function doTooltip( element, event )
{
	var coords = findPos( element );
	clearTimeout( element.autoHide )
	element.autoHide = setTimeout('function(){ hideTip(\''+ element.tooltipnode.id+'\'); }', _TOOLTIP_AUTOHIDE_DELAY);
	trackmouse( event );
	element.tooltipnode.style.visibility = 'visible';
}
function trackmouse(e)
{
	var targ;
	if (!e) e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3){ // defeat Safari bug
		targ = targ.parentNode;
	}
	if(targ.tipactive)
	{
		var posx = 0;
		var posy = 0;
		if (e.pageX && e.pageY) 	{
			posx = e.pageX;
			posy = e.pageY;
		}
		else if (e.clientX && e.clientY) 	{
			posx = e.clientX + document.body.scrollLeft
				+ document.documentElement.scrollLeft;
			posy = e.clientY + document.body.scrollTop
				+ document.documentElement.scrollTop;
		}
		targ.tooltipnode.style.left = (posx+1).toString() + 'px'; // add 1 pixel to ensure the tooltip doesn't appear under the mouse hence
		targ.tooltipnode.style.top  = (posy+1).toString() + 'px'; // tiggering the mouseout!
	}
}

function hideTip( id )
{
	var e;
	if ( e = $( id )  )
	{
		tipactive = false;
		e.style.visibility = 'hidden';
		//removeEvent( e, 'mousemove', ttfunc )	
		document.onmousemove=null;
	}
}
function logUIActivity()
{
/*
	* op=swicki_ui_log
	* a=fopen & fn={roadblock, login, ask, post, signup, subscribe, share} & p=[current search url]
	* a=fclose & fn={roadblock, login, ask, post, signup, subscribe, share} & p=[current search url] & d=[duration in s] c={close, cancel}
	* for all actions: cookie id, timestamp
	* open dialog: dialog name, url
	* close dialog: dialog name, duration dialog was open, url
	* cancel dialog: dialog name, duration dialog was open, url
	* vote,post,ask, signup, login clicks: url
*/
	this.time_start 	= 0;
	this.time_finish 	= 0;
	this.URL 			= url;
	this.action 		= ''; // fopen, fclose, vote, ask, post, share, subscribe, login, signup
	this.formname		= ''; //
	this.closetype 	= '';
}
logUIActivity.prototype.logaction = function( action, xpars )
{
	var op = 'swicki_ui_log';
	var dologaction = true;
	var formname = false, p=false, duration=false, closetype=false, url = false, vote=false;
	
	if ( action.match(/(fopen|fclose|vote|post|login|signup|comment)/) )
	{
		switch( action )
		{
			case 'fopen':
				this.time_start = new Date(); // start the timer...
				this.formname = xpars.formname; formname = true;
				
			break;

			
			case 'post':
				url = true;
				
			case 'signup':
			case 'login':
				//implies a close-type of 'submit'
				this.closetype = 'submit'; closetype = true;
				this.time_finish = new Date();
				duration = true;
			break;
			
			case 'fclose':
				//close or cancel
				formname = true;
				this.closetype = xpars.closetype; closetype = true;
				this.time_finish = new Date();
				duration = true;
			break;
			
			case 'vote':
				url = true;
				vote = true;
			break;
			
			default:
				dologaction = false;
			break;
		}
		if( dologaction )
		{
			var serverurl = '/resultaction.php';
			var pars =	 						'op=' + encodeURIComponent( op )+'&type=json&version=2'+
						 						'&a=' + encodeURIComponent( action ) +
						( formname ? 			'&fn=' + encodeURIComponent( this.formname )	: '' ) +
						( duration  ?	 		'&d=' + encodeURIComponent( this.duration() ) 	: '' ) +
						( closetype  ? 			'&c=' + encodeURIComponent( this.closetype ) 	: '' ) +
						( url ?					'&p=' + encodeURIComponent( this.URL )			: '' ) +
						( vote ?				'&vote=' + encodeURIComponent( xpars[ 'vote' ] ): '' );
				
			var myAjax = new Ajax.Request(
							  serverurl, 
				{
				method: 'post', 
				parameters: pars//, 
				//			asynchronous: false,
				//onFailure: function (request, obj){ debug_alert('fail'); }
				});
		}
		
	}
}
logUIActivity.prototype.duration = function(){ return ((this.time_finish - this.time_start) / 1000); };

// character count, limited textarea, limited textbox...

var _KEY_ENTER=13, _a = new Array(8,9,13,16,18,19,20,27,33,34,35,36,37,38,39,40,45,46,144), _b = new Array(),
	_DEFER_INIT=true,_INIT=false;
for(_c=0;_c<_a.length;_c++) _b[_a[_c]]=true;

function createCharCounterLimitedTextArea( Id, displayId, maxchars, deferInit )
{
	var srcObj, dispObj;
	if( (srcObj = $( Id )) && (dispObj = $( displayId )) )
	{
		srcObj.checknewlineoffset=(navigator.userAgent.match('MSIE') ? true:false);
		srcObj.maxchars = maxchars;
		srcObj.dispObj = dispObj;
		dispObj.markup = dispObj.innerHTML;
		srcObj.counter_update = function(){ this.dispObj.innerHTML=this.dispObj.markup.replace('_%%_',this.maxchars-this.value.length); }
		srcObj.onkeydown=
		function(e)
		{
			if(!e)e=window.event;
			this.len_pre = this.value.length;
			if(!e.ctrlKey && !e.altKey)//allow the user to use their keyboard!
			{
				if( this.value.length>=this.maxchars) if(!_b[e.keyCode]) return false;
				if( e.keyCode==_KEY_ENTER && this.value.length>=this.maxchars ) return false; //is there a potential problem inserting a newline?
			}
		}
		
		srcObj.onkeyup=
		function(e)
		{
			if(!e)e=window.event;
			this.len_post = this.value.length;
			if(this.checknewlineoffset)this.maxchars+=parseInt(( this.len_post - this.len_pre ) / 2 );
			if(this.maxchars-this.value.length < 0)
			{
				this.value=this.value.substring(0,this.maxchars);
			}
			this.counter_update();
		}
		srcObj.onchange = srcObj.onkeyup;
		// init...
		srcObj.init = function() { this.counter_update(); }
		if (!deferInit) srcObj.counter_update();
	}
}

function createCharCounterLimitedTextBox( Id, displayId, deferInit )
{
	if( (srcObj = $( Id )) && (dispObj = $( displayId )) )
	{
		srcObj.dispObj = dispObj;
		dispObj.markup = dispObj.innerHTML;
		srcObj.counter_update = function(){ this.dispObj.innerHTML=this.dispObj.markup.replace('_%%_',this.maxLength-this.value.length); }
		
		srcObj.onkeyup=
		function(e)
		{
			this.counter_update();
		}
		srcObj.onchange = srcObj.onkeyup;
		// init...
		srcObj.init = function() { this.counter_update(); }
		if (!deferInit) srcObj.counter_update();
	}
}

function remember_login( op )
{
	var argv = arguments;
	var argc = arguments.length;
	var _SAVE_COOKIE_NAME = 'login', login_cookie='',
		_COOKIE_DOMAIN = document.domain.match(/\..*\.*$/)[0];
	
	switch( op )
	{
		case _RETRIEVE_LOGIN:
			
			if ( login_cookie=readCookie( _SAVE_COOKIE_NAME ) )
				if ( login_cookie == 'no' )
					$('swicki_ui_login_remember').checked=false;
				else
				if ($('swicki_ui_login_email').value=='' ) $('swicki_ui_login_email').value = login_cookie;
			break;
	
		case _SAVE_LOGIN:
			// following a successful login...
			if (argc > 1 && !argv[1] ) // 2nd par is true/false save/don't save
			{
				writePersistentCookie( _SAVE_COOKIE_NAME, 'no', _COOKIE_DOMAIN );
				// effectively also deletes the login email...
			}
			else
				writePersistentCookie( _SAVE_COOKIE_NAME, $('swicki_ui_login_email').value, _COOKIE_DOMAIN );
			break;
		default:;
	}
}

swickiUI.prototype.reload = function()
{
	if ( arguments.length==1 && argument[0]!='' )
		window.location.assign( argument[0] );
	else
	if (this.reload_url && this.reload_url != '')
		window.location.assign( this.reload_url );
	else
		window.location.reload();
}

var brow, ui;
function swickiUI_init() //onload...
{
	
	if( $('sr') ) //are there results? if not, no vote- or moderator- tools
        {
	
            var pos_li, pos_a, elems = new Array()
                //pos_li = pos_li.concat( $('sr').getElementsByTagName("li"), $('sr').getElementsByTagName("a") );
                pos_li = $('sr').getElementsByTagName("li");
                pos_a  = $('sr').getElementsByTagName("a");
                
                for(i=0;i<pos_li.length;i++){ elems.push( pos_li[i] ); }
                for(i=0;i<pos_a.length;i++){ elems.push( pos_a[i] ); }
                
            var collectTemp = []; //for like/dislike

            for (var i =0; i < elems.length; i++)
            {
                if( elems[i].className.match(/(([vV]ote[d]{0,1})|likeSite|viewcomments_links)/) )
                { 
                    collectTemp[collectTemp.length]=elems[i];
                }
            }
            for (i=0; i<collectTemp.length; i++){
                switch (collectTemp[i].className)
                {
                    /* user vote tools */
                    case 'votedDown':
                        collectTemp[i].voteActive = false;
                        collectTemp[i].onclick = createVoter(-1);
                        break;
                    case 'voteDown':
                        collectTemp[i].voteActive = true;
                        collectTemp[i].onclick = createVoter(-1);
                        break;
                    case 'votedUp':
                        collectTemp[i].voteActive = false;
                        collectTemp[i].onclick = createVoter(1);
                        break;
                    case 'voteUp':
                        collectTemp[i].voteActive = true;
                        collectTemp[i].onclick = createVoter(1);
                        break;
                        
                    /* moderator options... */
                    case 'dislikeSiteDP':  
                        collectTemp[i].onclick = createModerator('dp');
                        break;
                    case 'dislikeSiteDS':  
                        collectTemp[i].onclick = createModerator('ds');
                        break;
                    case 'likeSitePP': 
                        //we now use listSitePP instead of listSiteTPP. The operation passed through to the resultaction call is still tpp, so don't change that! 
                        collectTemp[i].onclick = createModerator('tpp');
                        break;
                    case 'likeSitePS':  
                        collectTemp[i].onclick = createModerator('ps');
                        break;
                    /* comment on results */
                    case 'viewcomments_links':
                        viewcomments( collectTemp[i].id );
                        break;
                        
                    default:
                        //collectTemp[i].onclick = function(){ return false; }
                        break;
                    }
            }
            elems=null; pos_li=null; pos_a=null;
        }


	// default alt to title or visa versa for images with one but not both...
	var i = document.images;
	for ( i_idx=0;i_idx<i.length; i_idx++){ i_img=i[i_idx];((i_img.title && !i_img.alt) || ( i_img.alt && !i_img.title)) ? ( !i_img.alt ? i_img.alt=!i_img.title : i_img.title=i_img.alt ) : {};}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	if(typeof(rowc)!='undefined' && rowc>=1 )
        {
            attach = function( target, subt )
                {
                    target.subt = subt;
                    addEvent( target, 'mouseover',
                              function(e)
                    {
                        if ( this.subt.className!='swickiModeratorTools_hover')
                            {
                                this.subt.className='swickiModeratorTools_hover';
                                //					this.auto_out = setTimeout("$('"+this.subt.id+"').className='swickiModeratorTools'", 700);
				
                            }
                    }
                              );
                    /*
                      addEvent( subt, 'mouseover',
                      function(e)
                      {
                      clearTimeout( this.auto_out );
                      }
                      );
                    */
                    addEvent( subt, 'mouseout',
                              function(e)
                    {
						if( checkMouseLeave( subt , e) )
                            {
                                //						clearTimeout( this.auto_out );
                                if ( this.className=='swickiModeratorTools_hover')
                                    {
                                        this.className='swickiModeratorTools';
                                    }
                            }
                    }
                              );
                }
	
            var target=null;
            for(var i=1;i<=rowc;i++)
                {
                    target=$('row'+i.toString());
                    if(!target)
                        {
                            break;
                        }
			
                    addEvent( target, 'mouseover',
                              function()
                    {
                        if( !this.className.match(/activeRow_hover/) )
                            {
                                this.className=this.className.replace(/activeRow/,'activeRow_hover');
                            }
                    }
                              );
			
                    addEvent( target, 'mouseout',
                              function(e)
                    {
                        if( this.className.toString().match(/activeRow_hover/) )
                        {
                            this.className=this.className.toString().replace(/activeRow_hover/,'activeRow');
                        }
							
                    }
                              );
                    if ( tool = $('voteButtons'+ i.toString()) )
                    {
                        tool.className = tool.className.replace(/votehidden/, '');
                    }
			
                }
        }
    brow = new BrowserHacks();
    ui = new swickiUI();
    //	getContainer();
    ui.registerHandlers( swicki_ui_onload_handlers ); // others are attached as each form is loaded
	/* check if coming from questions page to write an answer */
	if(window.location.search.match(/post=1/)) {   
        ui.displayForm('swicki_ui_form_post_container');
	}
	
	// specify initial focus if any for each form...
	ui.focus =
        {
			'swicki_ui_form_signup_container' 	: function(){ $('swicki_ui_signup_username').focus();	},
			'swicki_ui_form_login_container' 	: function(){ $('swicki_ui_login_email').focus();		},
			'swicki_ui_form_post_container' 	: function(){ $('swicki_ui_post_title').focus();		},
			'swicki_ui_form_message_container'	: function(){ $('swicki_ui_message_button_ok').focus(); },
            'swicki_ui_form_comment_container'	: function(){ $('swicki_ui_comment_text').focus(); }
        }
} // swickiUI_init();
_init.push( swickiUI_init );

function togglePlayButton(buttonId,i)
{
	if ((buttonId.className=='videoThumb') || (buttonId.className=='toPlay')) {
		if (buttonId.className=='videoThumb') {
			document.getElementById('toPlayButton'+i).innerHTML='Hide Video';
			buttonId.className='videoThumbHide';
			document.getElementById('toPlayButton'+i).className='toHide';
		} else 	{
			buttonId.innerHTML='Hide Video';
			document.getElementById('toPlayButton'+i).className='videoThumbHide';
			buttonId.className='toHide';
		}
	} else 	{
		if (buttonId.className=='videoThumbHide') {
			document.getElementById('toPlayButton'+i).innerHTML='Play Video';
			buttonId.className='videoThumb';
			document.getElementById('toPlayButton'+i).className='toPlay';
		} else 	{
			buttonId.innerHTML='Play Video';
			document.getElementById('toPlayButton'+i).className='videoThumb';
			buttonId.className='toPlay';
		}
	}
}

var isIE6 = navigator.userAgent.match(/MSIE (5|6)/) ? 1 : 0;
var isHovered = 0, isFocused = 0;

/* modify the URL */
function viewcomments( linkId )
{
    var resultIdx = linkId.match(/[0-9]*$/)[0];
    
    $( linkId ).href
                +=  '&clickurl=' + eU( $('swickiResultTitleText'+resultIdx).href )
                +   '&title='    + eU( $('swickiResultTitleText'+resultIdx).innerHTML )
                +   '&summary='  + eU( $('votesummary'+resultIdx).innerHTML )
                +   '&url='      + eU( $('voteurl' +resultIdx) ? $('voteurl' +resultIdx).value : '' );
    if( $(linkId ).href.match(/source=video/) )
    {
        $( linkId ).href
                += '&thumb=' + eU( $('videoThumb'+resultIdx).src );
    }
}

function favCreate() {
  /* global
    {swicki Object}.favTitle, {swicki Object}.favURL
  */
  /*local */
  //var newT = document.createTextNode('Add to Favourites');
  //var s = document.getElementById('fav');
    var e;
    if( e = document.getElementById('sidebar_addfav_link') )
    {
        if (window.sidebar /* FF */ ) {
        e.onclick = function() {window.sidebar.addPanel(document.title,window.location.href,''); return false; };
        } else if (window.external /* ie6, 7 */ ) {
        e.onclick = function() {window.external.AddFavorite(window.location.href, document.title); return false; };
        } else if (window.opera) {
            this.fav_onclick =
            function() {
                 e = document.createElement('a');
                 e.setAttribute('href',window.location.href);
                 e.setAttribute('title',document.title);
                 e.setAttribute('rel','sidebar');
                 e.click();
            }
        }
        else
        {
            /* browser can't be supported - link to instructions page??? */
            e.title = 'Unfortunately, this isn\'t supported in this browser.';
            e.onclick = function(){ alert( this.title); return false; };
        }
        //return returnMarkup;
    }
}
_init.push( favCreate );
function addSearchBoxCreate()
{
    var supported = false, onClickFunction='';
    if( e = document.getElementById( 'sidebar_addsearchbox_link' ) )
    {
        if( window.external /* FF2, ie6, 7 */ )
        {
            //if( brow.isIE7 || brow.isIE8 || brow.isFF )
           // {
                supported = true;
		var cookie_date = new Date ( 2093, 01, 15 );
                onClickFunction = function(){ window.external.AddSearchProvider( openSearchProvider ); document.cookie = "socialsearch=set;expires="+cookie_date.toGMTString();

 };
            //}
        }
        if(supported)
        {
            e.onclick = onClickFunction;
        }
        else
        {
            e.title = 'Unfortunately, this isn\'t supported in this browser.';
            e.onclick = function(){ alert( this.title); return false; };
        }
    }
}
_init.push( addSearchBoxCreate );
