var letterComb = {
	curr_pos: 0,
	arr_str: [],
	Fill: function(str, lines){
		if(!lines || lines < 1)lines = 1;	
		var i = 0;
		var arr = str.split('^');
		var res = [];
		while(i < arr.length){
			res[res.length] = ' '+js.trim(arr.slice(i,i+lines).join('^'));			
            i+=lines;
		}
		this.curr_pos = 0;
		this.arr_str  = res.slice(0, res.length-1);
	},
	NextLine: function(){
		return this.curr_pos < this.arr_str.length?this.arr_str[this.curr_pos++]:false;
		
	},
	FirstLine: function(){
		return this.arr_str[0];
	},
	RemainedLine: function(){
		return this.arr_str.length - this.curr_pos; 
	}

};
function makeErrorWordsWithoutSort(err_list, mrkErrLtr, errLtrList){
	
	var i    = 0,
		arr  = [],
		s    = [],
		str = " ",
		_arr = {},		
		reg  = /<.*?>/gi,
		tmp_arr = [],
		tmp_str = '';
	
	for(var l=err_list.length; i<l; i++){		
		s = getWord(err_list[i]);
		if(s[0]){// && !_arr[s[0].replace(reg, '')]){
			
			if(!_arr[s[0]])_arr[s[0]] = [];			
			_arr[s[0]][_arr[s[0]].length] = [s[1],errLtrList[i]];
		}
	}
	i=0;

	var ss = '';
	var ltrs = '';
	var g = '';
	for(s in _arr){	
		ss = s;
		ltrs = [];
		for(var i=0,l=_arr[s].length; i<l; i++){
			
			ltrs.push(_arr[s][i][1]);
			
			var t = _arr[s][i][0];
			ss = ss.substr(0,t-1)+'^'+ss.substr(t,s.length);
		}	
		while(g = ltrs.pop()){
			ss = ss.replace(/(\^)/,'<b class="err_ltr">'+g+'</b>');
		}
		
		str +=  ss+' ';
	}
	
	
	return str.substr(0,str.length-1);	
	
}

function makeErrorWords(err_list){
	
	var i = err_list.length,arr = [],s,a,str=" ",count=0,_arr = [];
	
	while(i--){
		s = getWord(err_list[i],false)[0];
		if(s){_arr[s] = i;}
	} 
	for(s in _arr){			
		if(typeof _arr[s] == 'number' && s.indexOf('&nbsp;') == -1)			
			arr[arr.length] = s;
	} 
	
	arr.sort(cmp);	
	
	for(var i=arr.length-1; i>=0; i--){
		/*count += arr[i].length+1;		
		if(count >= 44){			
			str += arr[i]+'^ '; 
			count = 0;
		}else*/
		str += arr[i]+' ';
	} 
	
	return str.substr(0,str.length-1);	
	
}
function makeErrorLines(err_list){
	var len = err_list.length,arr = [],s,a,str=" ",count=0,_arr = [];
	
	for(var i=0; i<len; i++){
		s = getLine(err_list[i]);
		if(s){_arr[s] = i;}
	} 
	for(s in _arr){		
		if(typeof _arr[s] == 'number')	
		arr[arr.length] = s;
	} 	
	str = arr.join('^');
	str = str.replace(/&nbsp;/g,' ');	
	return str;
	
}
function nodeListToString(nodeList){
	var str = '';
	for(var i=0,l=nodeList.length; i<l; i++){
		str += nodeList[i].innerHTML;
	}
	return str;
}
function getWord(node){
	var _nd  = node;
	var pos  = 0;	
	var str  = node.innerHTML;//mrkErrLtr?'<b class="err_ltr">'+(errLtr?errLtr:node.innerHTML)+'</b>':node.innerHTML;
	//if(str == '&nbsp;')return false;
	
	while((node = node.nextSibling) && node.innerHTML != '&nbsp;'){
		str += node.innerHTML;	
		++pos;
	}		
	
	while((_nd = _nd.previousSibling) && _nd.innerHTML != '&nbsp;'){
		str =  _nd.innerHTML + str;		
	}
	return [str,str.length - pos];
}

function getLine(node){
	var _nd  = node,
		str  = node.innerHTML;
	if(str == '&nbsp;')return false;
	
	while((node = node.nextSibling) && node.tagName != 'BR'){
		str += node.innerHTML;	
	}		
	while((_nd = _nd.previousSibling) && _nd.tagName != 'BR'){
		str =  _nd.innerHTML + str;		
	}
	return str;
}


function cmp(a,b) { 
	if (a.length<b.length)  return -1;
	if (a.length>b.length)  return 1;
	if (a.length==b.length) return 0;	
}

function cmp_int(a,b) { 
	if (a<b)  return -1;
	if (a>b)  return 1;
	if (a==b) return 0;	
}
