function FileFormatPickerModel() {
	//this.applications = null;
	this.formats = null;
	TSWIDGET.EVENTS.createEvent("evtFileFormatLoaded");
	TSWIDGET.EVENTS.createEvent("evtFilterFileFormatResult");
}

FileFormatPickerModel.prototype.init = function(){
	
}

FileFormatPickerModel.prototype.feachFileFormat = function(){
	if(this.formats==null){
		TSWIDGET.XMGR.useCustomParseFunction = true;
		TSWIDGET.XMGR.sendRequestAsync("format=xmlcomplex&afc=null&package=searchr2&op=getApplicationFormatList",
										this.successFeachFileFormat,
										this.failureHandler,
										null,
										this);
	}
	else{
		TSWIDGET.EVENTS.fireEvent('evtFileFormatLoaded',this.formats);
	}									
}

FileFormatPickerModel.prototype.successFeachFileFormat = function(response,ref){
	if (response.TSCoreAPI_SEARCHR2_GETAPPLICATIONFORMATLIST_REPLY.ERROR["#text"] == 0) {
		var res = response.TSCoreAPI_SEARCHR2_GETAPPLICATIONFORMATLIST_REPLY.APPLICATION;
		ref.formats = [];
		if(res){
			if(res.constructor!=Array){
				res = [res];
			}
			var idList = "";
			var len = res.length;
			for(var i=0;i<len;i++){				
				var format = res[i]["FORMAT"] ? res[i]["FORMAT"] : [];
				var objFormat;
				if(format.constructor==Array){
					for(var j=0;j<format.length;j++){
						var formatId = format[j]["@ID"];
						if(idList.indexOf(formatId + ",")==-1){
							var name = ref.splitFormatName(format[j]["@NAME"]);
							objFormat = new Object();
							//objFormat.appID = obj.appID;
							objFormat.appName = name[0];
							objFormat.formatID = formatId
							objFormat.formatName = name[1];
							ref.formats.push(objFormat);
							idList += formatId + ",";
						}						
					}
				}
				else{
					objFormat = new Object();
					var name = ref.splitFormatName(format["@NAME"]);
					//objFormat.appID = obj.appID;
					objFormat.appName = name[0];
					objFormat.formatID = format["@ID"];
					objFormat.formatName = name[1];
					ref.formats.push(objFormat);
				}
			}
		}
		TSWIDGET.EVENTS.fireEvent('evtFileFormatLoaded', ref.formats);
	}
	else{
		alert("error");
	}
}
FileFormatPickerModel.prototype.failureHandler = function(response,ref){
	alert("error");
}

FileFormatPickerModel.prototype.filterFileFormat = function(key){
	var filterFormats = []; 
	key = key.trim();
	var len = this.formats.length;
	if(key==""){
		for(var i=0;i<len;i++){
			filterFormats.push(this.formats[i]);
		}
	}
	else{	
		var reg = /,+/g;
		var splitChar = " ";
		key = key.replace(reg," ");
		reg = /\s+/g;
		key = key.replace(reg," ").trim();
		arrKey = key.split(splitChar);
		var lenKey = arrKey.length;
		var itemName = "";
		var arrApp = [];
		var arrFormat = [];
		var hasFound = false;
		var reg;
		for(var i=0;i<len;i++){
			hasFound = false;
			itemName = this.formats[i].formatName;
			for(var j=0;j<lenKey;j++){		// filter by format name
				var arrFormatItem = itemName.split(", ");
				var lenFormatItem = arrFormatItem.length;
				reg = new RegExp("^."+arrKey[j],"gi");
				for (var k = 0; k < lenFormatItem; k++) {
					if (reg.test((arrFormatItem[k]+"").trim())==true) {
						arrFormat.push(this.formats[i]);
						hasFound = true;
						break;
					}
				}
				if(hasFound==true){
					break;
				}
			}
			if (hasFound == false) {
				itemName = this.formats[i].appName;
				for (var j = 0; j < lenKey; j++) { // filter by application name
					reg = new RegExp("^"+arrKey[j],"gi");
					if (reg.test(itemName)==true) {
						arrApp.push(this.formats[i]);
						break;
					}
				}
			}
		}
		if(arrFormat.length>1){
			this.bubbleSort(arrFormat,"formatName");
		}
		filterFormats = arrFormat.concat(arrApp);
	}
	TSWIDGET.EVENTS.fireEvent('evtFilterFileFormatResult', filterFormats);
}

/***** Private, helper *******/

/**
 * @param {String} itemName
 * @return {Array} [application name, format name]
 */
FileFormatPickerModel.prototype.splitFormatName = function(itemName){
	itemName = itemName.trim();
	var result = ["",""];
	if(itemName!=""){
		var reg = /\([\w|\W]*\)/;
		var result1 = itemName.replace(reg,"");
		var result2 = "";
		if(result1!=itemName){
			result2 = itemName.replace(result1,"");
			result2 = result2.substr(1);
			result2 = result2.substr(0,result2.length-1);
		}
		result = [result1.trim(),result2.trim()];
	}
	return result;
}
FileFormatPickerModel.prototype.bubbleSort = function(arrFormat,columnname){
	var done=false;
	var isNeedExchange = false; 
	var sourceArr = arrFormat;
	var len = sourceArr.length;
	var temp;
	var type = "string";
	/*if(columnname=="Count"){
		type = "number";
	}*/
	for(var i=1;i<len&&!done;i++){
		done=true;
		for(var j=0;j<len-i;j++){
			isNeedExchange=(sourceArr[j][columnname].toString().toLowerCase() >sourceArr[j+1][columnname].toString().toLowerCase());
			/*switch(type){
				case "string":
					try{
						isNeedExchange=(sourceArr[j][columnname].toString().toLowerCase() >sourceArr[j+1][columnname].toString().toLowerCase());
					}
					catch(e){
						isNeedExchange = true;
					}
				break;
				case "number":
					try{
						isNeedExchange=Number(sourceArr[j][columnname])>Number(sourceArr[j+1][columnname]);	
					}
					catch(e){
						isNeedExchange = true;
					}
				break;				
			}*/
			if(isNeedExchange){
				done = false;
				temp = sourceArr[j];
				sourceArr[j] = sourceArr[j+1];
				sourceArr[j+1] = temp;
			}
		}
	}
}

