(function($){

	$.widget('ui.picklist', {

		_create: function() {
			var self = this;
		   	self.el = $(self.element[0]);
						
			if(self.options.isPublic) {
				if(self.options.site_prefix == 'null' || self.options.site_prefix == '' || self.options.site_prefix == null) 
					self.ajaxUrl = '/'+(self.options.prefix == null || self.options.prefix == '' ? '' : self.options.prefix+'__')+'OrchestraPublicAjax';
				else 
					self.ajaxUrl = self.options.site_prefix+(self.options.prefix == null || self.options.prefix == '' ? '' : self.options.prefix+'__')+'OrchestraPublicAjax';		
			} else {
				self.ajaxUrl = '/'+(self.options.prefix == null || self.options.prefix == '' ? 'apex/' : 'apex/'+self.options.prefix+'__')+'OrchestraPublicAjax';
			}
		
	 		
			var type = self.options.type;

			if(self['options']['value'] == '') {
				//check if the passthru set value to the passthrough value
				self['options']['value'] = $(this.options.passThruId).val(); 
			}
			
			if (self.options.value_options.length != 0) {
				self._initOptions(); 
			} else {
				self._loadOptions(); 
			}						
		},
		
		_initOptions: function(){
			var self = this;

			var index = -1; 
			
			for(var i = 0; i < self.options.value_options.length; ++i) {
				if(self.options.value_options[i]['Value'] == self.options.value) {
					index = i; 
				}
			}

			var input;
			var tablebody;

			if(self.options.type == 'slider') {

				var selected = $('<div class="selected" style="height: 12px; margin-bottom: 3px; ">'+(self.options.value_options[index] === undefined ? '': self.options.value_options[index]['Label'])+'</div>'); 
				input = $('<div style="margin: 7px;"></div>');

				input.slider({
					min: 0,
					max: self.options.value_options.length-1,
					range: "min",
					disabled: self.options.disabled,
					value: index,
					slide: function(event, ui){
						var value_options = self.options.value_options; 
						selected.html(self.options.value_options[ui.value]['Label']);
						self.update(self.options.value_options[ui.value]['Value']);
					}
		
				});
							
				self.el.append(selected); 
				self.el.append(input); 
			} else if(self.options.type == 'vertical_radio') {
				input = $('<table style="width: auto;"></table>');
				tablebody = $('<tbody></tbody>');


				for(var j=0; j<self.options.value_options.length; ++j) {
			
					var row = $('<tr></tr>');
					row.append('<td><input '+(self.options.disabled ? 'disabled' : '' )+' type="radio" name="row'+self.options.passThruId+'" value="'+self.options.value_options[j]['Value']+'" '+(index == j ? 'checked' : '')+' /></td>');
					row.append('<td>'+self.options.value_options[j]['Label']+'</td>');
				 	tablebody.append(row);
				}
			
				tablebody.find('input').bind('click', function(){
					self.update($(this).val());
				});
				
				input.append(tablebody);
				self.el.append(input);
				
			} else if(self.options.type == 'horizontal_radio') {
				input = $('<table style="width: auto;"></table>');
				tablebody = $('<tbody></tbody>');
				headers = $('<tr></tr>');
				buttons = $('<tr></tr>'); 
				
				for(var j=0; j<self.options.value_options.length; ++j) {			
					headers.append('<td style="text-align: center; padding: 4px;">'+self.options.value_options[j]['Label']+'</td>');
					buttons.append('<td style="text-align: center; padding: 4px;"><input '+(self.options.disabled ? 'disabled' : '' )+' type="radio" name="row'+self.options.passThruId+'" value="'+self.options.value_options[j]['Value']+'" '+(j == index ? 'checked' : '')+' /></td>');
				}				

				tablebody.append(headers);
				tablebody.append(buttons);

				tablebody.find('input').bind('click', function(){
					self.update($(this).val());
				});
				

				input.append(tablebody);
				self.el.append(input);

			} else if(self.options.type == 'horizontal_radio_label') {
				input = $('<table style="width:auto;"></table>');
				tablebody = $('<tbody></tbody>');
				buttons = $('<tr></tr>'); 
				
				for(var j=0; j<self.options.value_options.length; ++j) {			
					buttons.append('<td style="text-align: center; padding: 4px;"><input '+(self.options.disabled ? 'disabled' : '' )+' type="radio" name="row'+self.options.passThruId+'" value="'+self.options.value_options[j]['Value']+'" '+(j == index ? 'checked' : '')+' /></td><td style="text-align: center; padding: 4px;">'+self.options.value_options[j]['Label']+'</td>');
				}				

				tablebody.append(buttons);
				tablebody.find('input').bind('click', function(){
					self.update($(this).val());
				});
	
				
				input.append(tablebody);
				self.el.append(input);				
			} else if(self.options.type == 'horizontal_checkbox_label' ) {
				input = $('<table style="width:auto;"></table>');
				tablebody = $('<tbody></tbody>');
				buttons = $('<tr></tr>'); 
				
				for(var j=0; j<self.options.value_options.length; ++j) {			
					buttons.append('<td style="text-align: center; padding: 4px;"><input '+(self.options.disabled ? 'disabled' : '' )+' type="checkbox" name="row'+j+self.options.passThruId+'" value="'+self.options.value_options[j]['Value']+'" '+(j == index ? 'checked' : '')+' /></td><td style="text-align: center; padding: 4px;">'+self.options.value_options[j]['Label']+'</td>');
				}				
				tablebody.append(buttons);
				tablebody.find('input').bind('click', function(){
				
					var ischecked = $(this).attr('checked');
				
					input.find('input').attr('checked', false);
				
					if(ischecked) {
						$(this).attr('checked', true);
						self.update($(this).val());
					} else {
						self.update('');
					}
				
					
				});
	
				
				input.append(tablebody);
				self.el.append(input);
										
			}  else {

				input = $('<select '+(self.options.disabled ? 'disabled' : '' )+'><option></option></select>');
				
				for(var j=0; j<self.options.value_options.length; ++j) {
					var option;
					if(j == index) {
						option = $('<option value="'+self.options.value_options[j]['Value']+'" selected="selected">'+self.options.value_options[j]['Label']+'</option>'); 
					} else {
						option = $('<option value="'+self.options.value_options[j]['Value']+'">'+self.options.value_options[j]['Label']+'</option>');
					}
					
					input.append(option); 
				}
				
				input.bind('change', function(){
					self.update($(this).val());
				})
				
				self.el.append(input);				
					
			}
		
			self._setOption('input', input); 
			
		},

		update: function(v) {
			var self = this;
			if (!self.options.disabled) {
				$(this.options.passThruId).val(v);
			} 
		},
		
		getValue: function() {
			return this.options.value;
		},
		
		_loadOptions: function() {
			var self = this;
			var data = {}; 
			data['action'] = 'getPicklistOptionsJSON';
			data['ObjectType'] = self.options.object_name;
			data['FieldName'] = self.options.field_name;
			var self = this;
			$.ajax({
				type: 'POST',
				url: self.ajaxUrl,
				data: data,
				dataType: 'json',
				success: function(json, textStatus) {
					self.options['value_options'] = json;
					self._initOptions();
				}		
				
			});			
			
		},
		
		options: {
			version: "1.0",
			type: 'default',
			value_options: [],
			value: null,
			disabled: false,
			passThruId: null,
			object_name: null,
			field_name: null,
			prefix: null,
			site_prefix: '',
			isPublic: false
		}

	});

})(jQuery); 
