$.fn.jForms = 
function(options)
{    
    if($(this).length == 0)
        return;
    
	var lastKeypress = 0;
    var keyBuffer = '';
    var self = this;
    var defaults = {
	    imagePath : '/img/forms/',
	    listSize:15,
        zIndex: 9000,
        ie7: false
	};	

    
    
	if($.browser.safari && !/chrome/.test( navigator.userAgent.toLowerCase() ) ){return false;}
        
    if(navigator.userAgent.indexOf('MSIE 7') >= 0 )
        defaults.ie7 = true;     
    
	var opts = $.extend(defaults, options);
	var imagePath = opts.imagePath;    
        
	//preload images
	var images = [imagePath + "txtarea_bl.gif",   imagePath + "txtarea_br.gif", imagePath + "txtarea_cntr.gif", imagePath + "txtarea_l.gif", imagePath + "txtarea_tl.gif", imagePath + "txtarea_tr.gif"]
	var imgs = new Array();
	for(var i = 0; i<images.length; i++)
	{
		imgs[i] = $("<img>").attr("src", images[i]);
	}

	$(self).attr('autocomplete','off');
	
//select boxes
$('select',self).each(function()
{   
    $('#'+this.id+'_fake_list_content').remove();
    
	$('body').append('<div class="fake_list_content" id="'+this.id+'_fake_list_content"><div class="ul"><ul id = "'+this.id+'_fake_list" class="fake_list"></ul></div><div class="left"></div><div class="right"></div><div class="clear"></div></div>');
    var list = $('#'+this.id+'_fake_list');
        
	$(this).children().each(function() {
		list.append('<li>'+$(this).text()+'</li>');
	});
    
    var selectWidth = this.className.match(/width_([0-9]{1,9})/);
    selectWidth = parseInt((selectWidth!=null ? selectWidth[1]: $(this).width()+41));

    var listSize = this.className.match(/listsize_([0-9]{1,9})/);
    listSize = (listSize != null ? listSize[1] : opts.listSize );  
                                        
	list.css('height', 19 * ($('#'+this.id+'_fake_list li').size()<listSize?$('#'+this.id+'_fake_list li').size():listSize) )
        .css('width',selectWidth - ($.browser.msie ? 5 : 3) ).hide();
        
	$('#'+this.id+'_fake_list_content').css('z-index', opts.zIndex).
        css('width', selectWidth - ($.browser.msie && !opts.ie7 ? -2 : -2) ).hide().
        find('div.ul').css('width',selectWidth - ($.browser.msie && !opts.ie7 ? 0 : 0) );
    
	$('#'+this.id+'_fake_list > li').hover(function(){$(this).addClass('selected')},function(){$(this).removeClass('selected');}).each(function(i)
	{
		$(this).click(function(){
		var id = $(this).parent().attr('id'); 
		$('#'+id+', #'+id+'_content, #'+id.replace('_fake_list','')+'_fake_brick').toggle();
	    $('#'+id.replace('_list','')).attr('value',$(this).text());
		$('#'+id.replace('_fake_list','')).attr('selectedIndex',i).change();
		$('#'+id+' >  li').removeClass('selected');
		$(this).addClass('selected');	
	});
	});                 
                  
$(this).before('<div class="selectArea" style="width:'+(selectWidth+ ($.browser.msie && !opts.ie7 ? 2 : 2) )+'px;'+($(this).hasClass('float_left')? 'float: left;' : '' )+'">\
                  <div class="left"></div>\
                  <div class="right"><a class="selectButton" href="javascript:;" onclick="$(\'#'+this.id+'_fake\').focus().click();"></a></div>\
                  <input type = "text" class="center" readonly="readonly" style="width:'+(selectWidth-35)+'px;cursor:default" id="'+this.id+'_fake"  value="'+(this[this.selectedIndex]!=undefined ? this[this.selectedIndex].text : '')+'"  />\
                  <div class="brick" id="'+this.id+'_fake_brick" style="width:'+(selectWidth)+'px; display:none;"></div>\
                </div>').css('position','absolute').css('left','-6000px');

	$('#'+this.id+'_fake').css('z-index', opts.zIndex).click(function(){
        var list = $('#'+this.id+'_list');
		list.focus();
        
        if(!list.find('li').size())
            return;
        
        $('#'+this.id+'_list_content').css('left',$(this).offset().left - ($.browser.msie ? 12 : 12) ).
                                       css('top',$(this).offset().top+$(this).height() );

		$('#'+this.id+'_list > li').removeClass('selected');
		var selli = $('#'+this.id+'_list > li').get($('#'+this.id.replace('_fake','')).attr('selectedIndex'));
        if(selli==undefined) return;
        selli.className='selected';
		
		$('.fake_list:visible:not(#'+this.id+'_list)').toggle();
		list.toggle();
        
        $('.fake_list_content:visible:not(#'+this.id+'_list_content)').toggle();
        $('#'+this.id+'_list_content, #'+this.id+'_brick').toggle();
        		
		//var offSet = (($('.selected', list).length>0? $('.selected', list).offset().top:0)- list.offset().top);
		//list.animate({scrollTop: offSet});
		}).keyup(function(e)
		{
            if(!$('#'+this.id+'_list > li').size())
                return false;
            
			var pressedKey = e.charCode || e.keyCode || -1;
			var $dd = $('#'+this.id.replace('_fake',''));
			$('#'+this.id+'_list > li').removeClass('selected');
			switch(pressedKey)
			{
				//down
				case 40:						
					var curr = ($dd.attr('selectedIndex')+1>=$('option',$dd).length?0:$dd.attr('selectedIndex')+1);
				break;
				case 38:						
					var curr = ($dd.attr('selectedIndex')-1<0?$('option',$dd).length-1:$dd.attr('selectedIndex')-1);						
				break;
				case 13:
					$('#'+this.id+'_list, #'+this.id+'_list_content, #'+this.id+'_brick').toggle();
					return false;
				break;
				default:
				var t = new Date();
				if(t.getTime()-lastKeypress>1000)
				{
					lastKeypress=t.getTime();
					keyBuffer ='';
				}
					keyBuffer +=String.fromCharCode(pressedKey).toLowerCase();
					curr=-1;
					$('#'+this.id+'_list > li').each(function(i)
					{
						if($(this).text().toLowerCase().indexOf(keyBuffer)==0&&curr==-1)
						{
							curr = i;
							return;
						}
					});
					break;
			}
			if(curr==-1)
			{
				curr=0;
			}
			$($('#'+this.id+'_list > li').get(curr)).addClass('selected').focus();
            var list = $('#'+this.id+'_list');
			var offSet = (($('.selected', list).length>0? $('.selected', list).offset().top:0)- list.offset().top);
			list.attr('scrollTop',offSet);
			$dd.attr('selectedIndex',curr).change();
			$(this).attr('value', $($('#'+this.id+'_list > li').get(curr)).text());
			return false;
						
		}).focus(function()
		{
			$(document).keypress(function(e)
			{
				var pressedKey = e.charCode || e.keyCode || -1;
				if(pressedKey==13)
				{
					return false;
				}
			});
		});

});
        
//textareas
$('textarea',self).each(function()
{
    var selectWidth = parseInt(this.style.width)  + 22;
    var selectHeight = parseInt(this.style.height); 
    
	$(this).replaceWith('<div style="width: '+ selectWidth +'px; height: '+(selectHeight+20)+'px;" class="txtarea" id = "'+this.id+'_fake">\
                            <div class="tr"><img src="'+imagePath+'txtarea_tl.gif" class="txt_corner"></div>\
                            <div class="cntr"><div style="height: '+(selectHeight+10)+'px;" class="cntr_l"></div></div>\
                            <div class="br"><img src="'+imagePath+'txtarea_bl.gif" class="txt_corner" style="margin:0px;"></div>\
                         </div>');
    
	$('#'+this.id+'_fake .cntr').append($(this));
	
});
    
	return self;
};

function jFormsHideSelects(){
    $('.fake_list_content').hide();
};

function jFormsUpdateSelectOptions(id, params){

    var options = '', listHTML = '', sz = 0, first = undefined;
    for(o in params) {
    
        if(sz == 0){ first = {'val': o, 'title': params[o]}; }
        options += '<option value="'+o+'">'+params[o]+'</option>';
        listHTML    += '<li>'+params[o]+'</li>';
        sz++;
    }
    
    var list = $('#'+id+'_fake_list');
    
    $('#'+id).html(options);
    list.find('li').unbind('hover click').end().html(listHTML).css('height', 19 * (sz<10?sz:10) );
    list.find('li').hover(function(){$(this).addClass('selected')},function(){$(this).removeClass('selected');}).each(function(i)
    {
        $(this).click(function(){
            var id = $(this).parent().attr('id'); 
            $('#'+id+', #'+id+'_content, #'+id.replace('_fake_list','')+'_fake_brick').toggle();
            $('#'+id.replace('_list','')).attr('value',$(this).text());
            $('#'+id.replace('_fake_list','')).attr('selectedIndex',i).change();
            $('#'+id+' > li').removeClass('selected');
            $(this).addClass('selected');    
        });            
    }); 
    
    if(first != undefined){
        //select first one
        list.find('li:first').addClass('selected').focus();
        var offSet = (($('.selected', list).length>0? $('.selected', list).offset().top:0)- list.offset().top);
        list.attr('scrollTop',offSet);
        $('#'+id).attr('selectedIndex', 0); //real select
        $('#'+id+'_fake').attr('value', first.title);
    }  
    
}
