(function($){

	$.widget('ui.multipicklist', {

		_create: function() {
			var self = this;
			var type = self.options.type;

			if(self.options.isPublic == true) {
				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/' : self.options.prefix+'__')+'OrchestraPublicAjax';
			}


			self._setOption('container', $(self.element[0]));
		
			if (self.options.value_options.length != 0) {
				self._initOptions(); 
			} else {
				self._loadOptions(); 
			}
		
			var selectedValues = [];
			if(self.options.value != null && self.options.value != '') {
				selectedValues = self.options.value.split(','); 
			}
			
			self._setOption('selected_values', selectedValues);
			
		},

		_initOptions: function() {
			var self = this;
			var el = self.options.container;
			var type = self.options.type;
			var value_options = self.options.value_options;
			var selectedValues = self.options.selected_values;
			var passThruId = self.options.passThruId;
			
			var input;
			var tablebody; 

			if(type == 'default' || type == 'combo') {
				input = $('<select '+(self.options.disabled ? 'disabled' : '' )+' multiple size="'+value_options.length+'"></select>');
				for(var i=0; i<value_options.length; ++i) {
					var option = $('<option value="'+value_options[i]['Value']+'" '+($.inArray(value_options[i]['Value'], selectedValues) == -1 ? '' : 'selected')+'>'+value_options[i]['Label']+'</option>'); 
					input.append(option); 
				}
				input.bind('click', function(){
					
					var value = '';					
					var selected = input.find('option:selected');
					
					for(var j=0; j <  selected.length; ++ j) {
						value += $(selected[j]).text(); 
						
						if (j + 1 < selected.length) {
							value += ';';
						}
					}

					self.update(value);
					
				});
				
				el.append(input);
				
			} else if(type == 'radio') {
				input =  $('<table style="width: auto;"></table>');
				tablebody = $('<tbody></tbody>');

				for(var i=0; i<value_options.length; ++i) {
			
					var row = $('<tr></tr>');
					row.append('<td><input '+(self.options.disabled ? 'disabled' : '' )+' type="radio" name="row'+i+passThruId+'" value="'+value_options[i]['Value']+'" '+($.inArray(value_options[i]['Value'], selectedValues) == -1  ? '': 'checked' )+' /></td>');
					row.append('<td>'+value_options[i]['Label']+'</td>');
				 	tablebody.append(row);
				}

				tablebody.find('input:radio').bind('click', function(){
					
					var value = '';					
					var selected = input.find('input:checked');
					
					for(var j=0; j <  selected.length; ++ j) {
						value += $(selected[j]).val(); 
						
						if (j + 1 < selected.length) {
							value += ',';
						}
					}
					self.update(value);
					
				});
				
				input.append(tablebody);
				el.append(input);				
				
			} else if(type == 'checkbox') {
				input = $('<table style="width: auto;"></table>');
				tablebody = $('<tbody></tbody>');
				
				for(var i=0; i<value_options.length; ++i) {
			
					var row = $('<tr></tr>');
					row.append('<td><input '+(self.options.disabled ? 'disabled' : '' )+' type="checkbox" name="row'+i+passThruId+'" value="'+value_options[i]['Value']+'" '+($.inArray(value_options[i]['Value'], selectedValues)  == -1 ? '':'checked')+' /></td>');
					row.append('<td>'+value_options[i]['Label']+'</td>');
				 	tablebody.append(row);
				}
				
				tablebody.find('input:checkbox').bind('click', function(){
					
					var value = '';					
					var selected = input.find('input:checked');
					
					for(var j=0; j <  selected.length; ++ j) {
						value += $(selected[j]).val();
						
						if (j + 1 < selected.length) {
							value += ',';
						}
					}
					self.update(value);
					
				});
				
				
				input.append(tablebody);
				el.append(input);				
			} else if (type == 'yesno') {
				
				input = $('<table style="width: auto;"></table>');
				tablebody = $('<tbody></tbody>');
		
				for(var i=0; i<value_options.length; ++i) {
			
					var row = $('<tr></tr>');
					row.append('<td>'+value_options[i]['Label']+'</td>');
					row.append('<td>Yes</td><td><input '+(self.options.disabled ? 'disabled' : '' )+' class="yes" type="radio" name="row'+i+passThruId+'" value="'+value_options[i]['Value']+'" '+($.inArray(value_options[i]['Value'], selectedValues)  == -1 ? '':'checked')+' /></td>');
					row.append('<td>No</td><td><input '+(self.options.disabled ? 'disabled' : '' )+' class="no" type="radio" name="row'+i+passThruId+'" value="'+value_options[i]['Value']+'" /></td>');
				 	tablebody.append(row);
					
				}		

				tablebody.find('input:checkbox').bind('click', function(){
					
					var value = '';					
					var selected = input.find('input.yes:checked');
					
					for(var j=0; j <  selected.length; ++ j) {
						value += $(selected[j]).val();
						
						if (j + 1 < selected.length) {
							value += ';';
						}
					}
					self.update(value);
					
				});				
		
				input.append(tablebody);
				el.append(input);
			} 
		
			self._setOption('input', input); 			
			
		},

		update: function(v) {
			var self = this;
			if (!self.options.disabled) {
				$(self.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;
			
			$.ajax({
				type: 'POST',
				url: self.ajaxUrl,
				data: data,
				dataType: 'json',
				success: function(json, textStatus) {
					self._setOption('value_options', json);
					self._initOptions();
				}		
				
			});			
			
		},
		
		options: {
			type: 'default',
			value_options: [],
			value: null,
			disabled: 'false',
			passThruId: null,
			object_name: null,
			field_name: null,
			prefix: null,
			isPublic: false
		}

	});

})(jQuery); 
