if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
        value: function(search, rawPos) {
            var pos = rawPos > 0 ? rawPos|0 : 0;
            return this.substring(pos, pos + search.length) === search;
        }
    });
}
function v_select2_starts_with(search,rawPos){
	var pos = rawPos > 0 ? rawPos|0 : 0;
	return search.substring(pos, pos + search.length) === search;
}
function v_select2_init(selector,options,options2){
	if($(selector).length>0){
		$(selector).each(function(){
			var langStr   = "tr";
			var urlToGet  = $(this).data("dataurl");
			var opt  = $.extend({language: langStr}, options);
			var vopt = $.extend({}, options2);
			if(urlToGet && urlToGet.length>0){
				opt.ajax = {
						   url: function (params) {				   				   
							   var qStr     = params.term;
							   var extraSelectors = $(this).data("constraints")
							   var extra    = "";
							   if(typeof qStr == 'undefined'){ qStr = "";}
							   if(qStr=="-"){
								   $(this).val(null).trigger('change'); 
							   }
							   if(extraSelectors && extraSelectors.length>0){
								   $(extraSelectors).each(function(){						   
									   extra = extra + "&"+$(this).attr("name")+"="+encodeURI($(this).val());
								   });
							   }
							   return urlToGet+extra+'&q='+ encodeURI(qStr);
						   }
					   };			
			}
			var templatestring  = $(this).data("templatestring");						
			if(templatestring && templatestring!='undefined' && templatestring.length>0){											
				opt.templateResult = function(state){									    				    
					if(state && state!="undefined" && typeof state === 'object' && state.hasOwnProperty('id')){												
						var s =  templatestring;
						if(templatestring=="smart"){
							s = '<span class="select2_code">{text}</span><span class="select2_desc">{desc}</span>';							
						}
						s = s.replace("&lt;","<");
						s = s.replace("&gt;",">");
						s = s.replace("&quot;","\"");
						$.each( state, function( key, value ) {
							if(state.hasOwnProperty(key)){
								s = s.replace("{"+key+"}",vulcanGetAsString(state[key]));
							}
						});												
						if(v_select2_starts_with(s,"<")){
							return $(s);
						}else{
							return $('<div>'+s+'</div>');
						}									
					}
					return '';
				}
			}
    
			var selectObject = $(this).select2(opt).on("change", function () { 
				var sel = $(this).data('changetonull');
				if(sel && sel.length>0){
					$(sel).val(null).trigger('change'); 
				}
			}); 
			if(vopt.hasOwnProperty("onselect") ){
				selectObject.on("select2:select",vopt.onselect);
			}		
			if(vopt.hasOwnProperty("onchange") ){
				selectObject.on("change",vopt.onchange);
			}		
			var editBtn = $("#"+$(this).attr("id")+"_edit");
			if(editBtn && editBtn.length>0){
				editBtn.click(function(e){
					var urlToGoForClick = editBtn.data("url");
					urlToGoForClick = urlToGoForClick.replace("{id}",selectObject.val());					
					e.preventDefault();
					window.open(urlToGoForClick,"_blank");
				});
			}
			var selectedValue = $(this).data("selectedvalue");
			if(vulcanIsEmpty(selectedValue)){ selectedValue = $(this).data("selected_value"); }			
			if(!vulcanIsEmpty(selectedValue)){
				selectObject.val(selectedValue).trigger('change');	
				//selectObject.trigger("select2:select");								
			}			
			var initDefVal = $(this).data("initdefaultvalue");			
			if(!vulcanIsEmpty(initDefVal) && selectObject.val()>0){
				$.ajax({type: 'GET',url: urlToGet + "&initialvalue="+selectObject.val()}).then(function (data) {
					if(data && data.total_count && data.total_count==1){
						selectObject.append(new Option(data.results[0].text, data.results[0].id, true, true)).trigger('change');
					}
				});
				// 
			}
		});
	}	
}
function v_select2_initclearbutton(selector){
	$(selector).on("click",function(){
		var targetStr = $(this).data("target");
		if(targetStr && targetStr.length>0){
			$(targetStr).each(function(){
				$(this).val(null).trigger('change');
			});
			
		}		
	});
}