var syntaxErrorPos=1;

function ajaxSubmitGenarateText() {	
	toggleControllGenerateText(false);	
	$('time_generate').set('html','');
	
	JsHttpRequest.query(
    	aRouter.tools+'ajaxgeneratetext/',                       
        { text: $('source_text').value, form_settings: document.getElementById('form_settings') },
        function(result, errors) {  
        	if (!result) {
                msgErrorBox.alert('Error','Please try again later');  
                toggleControllGenerateText(true,true);              
        	}
            if (result.bStateError) {
            	msgErrorBox.alert(result.sMsgTitle,result.sMsg);  
            	if (result.syntax_error) {
            		syntaxErrorPos=result.pos;
            		$('syntax_error').setStyle('height',$('source_text').getDimensions().height-6);
            		$('syntax_error').set('html','');
            		$('syntax_error').set('html',result.syntax_text);            		
            		$('source_text').setStyle('display','none');
            		$('syntax_error').setStyle('display','block');
            	}
            	toggleControllGenerateText(true,true);
            } else {            	
            	//msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
            	$('area-result').set('html',result.sResultText);
            	$('time_generate').set('html','Время генерации: <b>'+result.iTime+' сек.</b>');
            	toggleControllGenerateText(true);
            	//копирование в буффер            	
            	clipBoard = new ZeroClipboard.Client();
            	clipBoard.setText(result.sTextForClipboard);
                clipBoard.glue( 'copy-to-clipboard' );
            }            
            stripedTable();
        },
        true
    );    
}

function toggleControllGenerateText(bActive,bHideResult) {
	if (bActive) {
		$('submit_generate_text').setProperty('disabled',false);
		$('submit_generate_text').removeClass('deactive');
		$('source_text').setProperty('readonly',false);
		$('source_text').removeClass('deactive');
		// запускаем прогресс-бар
		$('area-process').setStyle('display','none');
		if (!bHideResult) {
			$('area-result').setStyle('display','block'); 
		}
	} else {
		// деактивируем контролы генерации. Также необходимо менять классы контролов для визуальной деаквации
		$('submit_generate_text').addClass('deactive');
		$('submit_generate_text').setProperty('disabled',true);
		$('source_text').addClass('deactive');
		$('source_text').setProperty('readonly',true);		
		// запускаем прогресс-бар
		$('area-result').setStyle('display','none');
		$('area-process').setStyle('display','block');
	}
}


function toggleOptionsBar(objBar) {
	objBar=$(objBar);
	objBar.toggleClass('closed');
	if (objBar.hasClass('closed')) {
		$('options').setStyle('display','none');
		$('content').addClass('wide');
	} else {
		$('content').removeClass('wide');
		$('options').setStyle('display','block');		
	}
}

function syntaxErrorHide() {
	$('syntax_error').setStyle('display','none');
	$('source_text').setStyle('display','block'); 
	$('source_text').setCaretPosition(syntaxErrorPos);  
}

function togglePanelHelp() {	
	var obj=$('panel_help');	
	var slideObj = new Fx.Slide(obj);
	if (obj.getStyle('display')=='none') {
		slideObj.hide();
		obj.setStyle('display','block');		
	}		
	slideObj.toggle();	
}

function tooglePanelMenu(idMenu,objParent) {	
	idMenu=$(idMenu);		
	if ((objParent) && (objParent=$(objParent))) {		
		idMenu.position({relativeTo: objParent, position: 'bottomLeft'});
	}
	if (idMenu.getStyle('display')=='none') {
		hideAllMenu();
		idMenu.setStyle('display','block');
	} else {
		idMenu.setStyle('display','none');
	}
}

function tooglePanelWizard(idWizard) {	
	idWizard=$(idWizard);		
		
	idWizard.setStyle('top','50%');
	idWizard.setStyle('left','50%');
	idWizard.setStyle('margin-left','-208px');
	idWizard.setStyle('margin-top','-208px');
	
	if (idWizard.getStyle('display')=='none') {
		hideAllMenu();
		idWizard.setStyle('display','block');
		$('wizard-words').value=$('source_text').getSelectedText();
		$('wizard-words').focus();
		wizardPreview();
	} else {
		idWizard.setStyle('display','none');
	}
}

function tooglePanelSinonim() {	
	idSin=$('panel-sinonim');		
			
	idSin.setStyle('top','50px');
	idSin.setStyle('left','50%');
	idSin.setStyle('margin-left','-250px');
		
	if (idSin.getStyle('display')=='none') {		
		lsSinonim.buildSelectText('source_text');
		
		hideAllMenu();
		idSin.setStyle('display','block');
		lsSinonim.loadSinonims();
		//$('wizard-words').value=$('source_text').getSelectedText();
		//$('wizard-words').focus();
		//wizardPreview();
	} else {
		$('source_text').focus();
		idSin.setStyle('display','none');
	}
}

function hideAllMenu() {
	$('panel-menu-square-bracket').setStyle('display','none');
	$('panel-menu-round-bracket').setStyle('display','none');
	$('panel-wizard').setStyle('display','none');
	$('panel-sinonim').setStyle('display','none');
}

function wizardPreview() {
	var s=$('wizard-words').value;
	var aWords=s.split("\n");
	var result='';	
	aWords.each(function(word,index){
		if (word && word!='') {			
			result=result+word;
			if (aWords.length-1!=index) {
				result=result.replace("\r",'')+'|';
			}
		}
	});
	if (result!='') {
		if ($('wizard-type').value=='{') {
			result='{'+result+'}';
		} else {
			if ($('wizard-square-delimiter').value!='') {
				result='[+'+$('wizard-square-delimiter').value+'+'+result+']';
			} else {
				result='['+result+']';
			}			
		}
	}	
	$('wizard-preview').value=result;
}

function wizardInsert() {
	if ($('wizard-preview').value!='') {
		lsPanel.putText('source_text',$('wizard-preview').value);
		calcSymbolCount();
	}
	hideAllMenu();
}

function wizardGoSquare() {
	tooglePanelWizard('panel-wizard'); 
	$('wizard-type').selectedIndex=1;
	$('select').childNodes[0].nodeValue=$('wizard-type-1').get('text');
	$('wizard-square-delimiter').setProperty('disabled',false);
}

function wizardGoRound() {
	tooglePanelWizard('panel-wizard'); 
	$('wizard-type').selectedIndex=0;
	$('select').childNodes[0].nodeValue=$('wizard-type-0').get('text');
	$('wizard-square-delimiter').setProperty('disabled',true);
}

function subscribeEmail() {
	$('submit_subscribe').addClass('deactive');
	$('submit_subscribe').setProperty('disabled',true);
	
	JsHttpRequest.query(
    	aRouter.index+'subscribe/',                       
        { email: $('subscribe_email').value },
        function(result, errors) {
        	$('submit_subscribe').removeClass('deactive');
			$('submit_subscribe').setProperty('disabled',false);	
        	if (!result) {
                msgErrorBox.alert('Error','Please try again later');                              
        	}
            if (result.bStateError) {
            	msgErrorBox.alert(result.sMsgTitle,result.sMsg);            	
            } else {            	
            	//msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
            	$('subscribe_area').set('html','Мы получили ваш e-mail. Спасибо за ваш интерес к нам.');            	
            }           
        },
        true
    );
}


function calcSymbolCount() {
	if ($('source_text')) {
		var count=$('source_text').value.length;
		$('symbol-count').set('text',count);
		if (count>6000) {
			$('symbol-count').addClass('red');
		} else {
			$('symbol-count').removeClass('red');
		}
	}
}




var lsSinonimClass = new Class({
                                           
        Implements: Options,

        options: {
        	
        },

        hSinonim: new Hash({}),
        
        initialize: function(options){         
        	this.setOptions(options);
        	this.idCurr=null; 
        },
        
        addSinonim: function(key,value) {
        	this.hSinonim.set(key,new Hash(value));
        	var elOption=new Element('option',{'value':key}).set('text',value.word);
        	$('select-sinonim').adopt(elOption);
        },
        
        loadSinonims: function() {
        	$$('.mtmultiselect').each(function(multiselect){        		
        		multiselect.destroy();
        	});
        	$('select-sinonim').empty();
        	this.hSinonim=new Hash({});
        	
        	$('submit_insert_sinonim').addClass('deactive');
			$('submit_insert_sinonim').setProperty('disabled',true);
			$('area-process-load-sin').setStyle('display','block');
			$('sinonim-notfound').setStyle('display','none');
			
			$('text-sinonim').set('html','');
			$('list-sinonim').value='';
        	
			var text=$('source_text').value;
			if (this.aTextSelect) {
				text=this.aTextSelect.select_text;
			}
			
        	JsHttpRequest.query(
        		aRouter.tools+'ajax-sinonim-load/',
        		{ 'text': text },
        		function(result, errors) {
        			$('submit_insert_sinonim').removeClass('deactive');
        			$('submit_insert_sinonim').setProperty('disabled',false);
        			$('area-process-load-sin').setStyle('display','none');
        			
        			if (!result) {
        				msgErrorBox.alert('Error','Please try again later');
        			}
        			if (result.bStateError) {
        				msgErrorBox.alert(result.sMsgTitle,result.sMsg);
        			} else {        			

        				if (result.aSin) {
        					result.aSin.each(function(item,key){
        						this.addSinonim(key,item);
        					}.bind(this));
        				}
        				        
        				if (result.aSin.length==0) {        					
        					$('sinonim-notfound').setStyle('display','block');
        				}
        					
        				$$('.multiselect').each(function(multiselect){
       		 				new MTMultiWidget({'datasrc': multiselect,'items_per_page':1000});
    					});
        				
    					$('text-sinonim').set('html',result.sResultText);
        				      				
        			}
        		}.bind(this),
        		false
        	);
        	
        	
        	
        	
        },
        
        showSinonim: function(id) {
        	if (sin=this.hSinonim.get(id)) {
        		if (sin.sinonims_custom) {
        			$('list-sinonim').value=this.joinArray(sin.sinonims_custom,"\n").trim();
        		} else {
        			$('list-sinonim').value=this.joinArray(sin.sinonims,"\n").trim();
        		}
        		$('sin-for').set('text',' ('+sin.word+')');
        		this.idCurr=id;
        		this.hgltSinonim(id);
        	}
        },
        
        hgltSinonim: function(id) {
        	if ($('sinonim-'+id)) {
        		$('sinonim-'+id).addClass('hover-sin');
        	}
        },
        
        unhgltSinonim: function(id) {
        	if ($('sinonim-'+id)) {
        		$('sinonim-'+id).removeClass('hover-sin');
        	}
        },
        
        selectSinonim: function(id) {
        	if ($('sinonim-'+id)) {        		
        		$('sinonim-'+id).addClass('select-sin');
        	}
        },
        
        unselectSinonim: function(id) {
        	if ($('sinonim-'+id)) {        		
        		$('sinonim-'+id).removeClass('select-sin');
        	}
        },
        
        joinArray: function(arr,sep) {
        	var s='';
        	arr.each(function(value, key){
        		s=s+value+sep;
        	});
        	return s;
        },
        
        updateSinonim: function() {
        	var s=$('list-sinonim').value.trim();
        	if (this.idCurr && (sin=this.hSinonim.get(this.idCurr))) {
        		var aSin=s.split("\n");
        		sin.set('sinonims_custom',aSin);        		
        	}
        },
        
        insert: function() {        	
        	$('submit_insert_sinonim').addClass('deactive');
			$('submit_insert_sinonim').setProperty('disabled',true);
			$('text-sinonim').setStyle('display','none');
			$('area-process-sin').setStyle('display','block');
        	
			var aSin=new Hash({});
			$('select-sinonim').getChildren().each(function(item){
				if (item.selected) {
					var id=item.value;
					aSin.extend([]);
					if (sin=this.hSinonim.get(id)) {
						aSin.set(id,sin);
					}
				}
			}.bind(this));
			
        	JsHttpRequest.query(
        		aRouter.tools+'ajax-sinonim-insert/',
        		{ sinonims: aSin, text: $('text-sinonim').get('html') },
        		function(result, errors) {
        			$('submit_insert_sinonim').removeClass('deactive');
        			$('submit_insert_sinonim').setProperty('disabled',false);
        			$('text-sinonim').setStyle('display','block');
					$('area-process-sin').setStyle('display','none');
        			if (!result) {
        				msgErrorBox.alert('Error','Please try again later');
        			}
        			if (result.bStateError) {
        				msgErrorBox.alert(result.sMsgTitle,result.sMsg);
        			} else {
        				if (this.aTextSelect) {        					
        					$('source_text').value=this.aTextSelect.source_text.replace(this.aTextSelect.key,result.sResultText);
        					$('source_text').selectRange(this.aTextSelect.pos.start,this.aTextSelect.pos.start+result.sResultText.length);
        				} else {
        					$('source_text').value=result.sResultText;
        				}
        				calcSymbolCount();
        				tooglePanelSinonim();
        			}
        		}.bind(this),
        		true
        	);
        },
        
        buildSelectText: function(obj) {        	
        	obj=$(obj);
        	this.aTextSelect=null;
        	var selText=obj.getSelectedText();
        	if (!selText || selText=='') {
        		return;
        	}
        	var key='__SEOGEN_REPLACE_SYNONYM__';
        	var pos=obj.getSelectedRange();
        	
        	var text = obj.get('value');
        	var sourceText=text.substring(0, pos.start) + key + text.substring(pos.end, text.length);
        	this.aTextSelect={'source_text':sourceText,'select_text':selText,'key':key,'pos':pos};
        }
});


var lsSinonimFullClass = new Class({
                                           
        Implements: Options,

        options: {
        	
        },

        hSinonim: new Hash({}),
        
        initialize: function(options){         
        	this.setOptions(options);
        	this.lastWord=null;
        	
        	if ($('word_highlight')) {
        		$('word_highlight').addEvent('change',function(){
        			this.setHighlightWord($('word_highlight').checked);
        		}.bind(this));
        	}
        },
        
        addSinonim: function(key,value) {
        	this.hSinonim.set(key,new Hash(value));        	
        },
                        
        loadSinonims: function() {  
        	$('submit_synonim_text').addClass('deactive');
        	$('submit_synonim_text').setProperty('disabled',true);
        			      	
			$('area-process').setStyle('display','block');
			$('area-result').setStyle('display','none');
			$('time_generate').set('html','');
						        	
			var text=$('source_text').value;
						
			var sMethodReplace=this.getMethodReplace();
			var sBaseUsed=this.getBaseUsed();
			
        	JsHttpRequest.query(
        		aRouter.tools+'ajax-sinonim-full-load/',
        		{ 'text': text, method_replace: sMethodReplace, base_used: sBaseUsed, highlight: $('word_highlight').checked },
        		function(result, errors) {
        			$('submit_synonim_text').removeClass('deactive');
        			$('submit_synonim_text').setProperty('disabled',false);        			
        			
        			$('area-process').setStyle('display','none');
					        			
        			if (!result) {
        				msgErrorBox.alert('Error','Please try again later');
        			}
        			if (result.bStateError) {
        				msgErrorBox.alert(result.sMsgTitle,result.sMsg);
        			} else {  
        				$('area-result').setStyle('display','block');
        				
        				if (result.aSin) {        					
        					result.aSin.each(function(item,key){
        						this.addSinonim(key,item);
        					}.bind(this));
        				}
        				
    					$('area-result').set('html',result.sResultText);
    					$('time_generate').set('html','Время синонимизации: <b>'+result.iTime+' сек.</b>');
        				this.initEvent();
        			}
        		}.bind(this),
        		true
        	);
        	
        },
        
        initEvent: function() {
        	$$('span[rel^=syn-word]').each(function(item){
        		item.removeEvents('click');
        		item.addEvent('click', function(evn){
        			this.showSynonymList($(evn.target));
        			evn.stop();
        		}.bind(this));
        	}.bind(this));
        	
        	clipBoard = new ZeroClipboard.Client();
            //clipBoard.setText($('sinonim-result').get('text'));
            clipBoard.glue('result-syn-copy');
            
            clipBoard.addEventListener('mousedown',function() {
				clipBoard.setText($('sinonim-result').get('text'));
			});
        	
        	//$('result-syn-copy').addEvent('click',function(evn){ 
        	//	evn.stop();
        	//});
        },
        
        showSynonymList: function(word) {
        	var popup=$('popup-syn-list');
        	popup.position({relativeTo: word, position: 'bottomLeft'});

        	if (this.lastWord) {
        		this.lastWord.removeClass('sel');
        	}
        	if (this.lastWord!=word) {
        		popup.setStyle('display','none');
        	}
        	
        	if (popup.getStyle('display')=='none') {
        		
        		word.addClass('sel');
        		//$('popup-syn-list').empty();
        		$('popup-syn-list').set('html','');
        		popup.setStyle('display','block');
        		var idWord=word.id.split('-')[1];
        		var aSyn=this.hSinonim.get(idWord);
        		        		
        		
        		
        		var itemDiv=new Element('div',{'class':'popup-syn-list-item','id':'syn-word-'+idWord+'-def'}).set('text',aSyn.word).addEvent('click',this.selectSynonym.bind(this));
        		if (aSyn.select=='def') {
        			itemDiv.addClass('select');
        		}
        		$('popup-syn-list').adopt(itemDiv);
        		aSyn.sinonims.each(function(item,key){
        			var itemDiv=new Element('div',{'class':'popup-syn-list-item','id':'syn-word-'+idWord+'-'+key}).set('text',item).addEvent('click',this.selectSynonym.bind(this));
        			if (key==aSyn.select) {
        				itemDiv.addClass('select');
        			}
        			$('popup-syn-list').adopt(itemDiv);
        		}.bind(this));
        		$('popup-syn-list').scrollTo(0,0);
        		
        	} else {
        		popup.setStyle('display','none');
        	}

        	this.lastWord=word;
        },
        
        selectSynonym: function(evn) {        	
        	var idWord=evn.target.id.split('-')[2];
        	var idSyn=evn.target.id.split('-')[3];   
        	if (idSyn=='def') {
        		var s=this.hSinonim.get(idWord).word;
        	} else {
        		var s=this.hSinonim.get(idWord).sinonims[idSyn]
        	}
        	this.hSinonim.get(idWord).select=idSyn;
        	$('sinonim-'+idWord).set('text',s);
        	$('popup-syn-list').setStyle('display','none');
        	if (this.lastWord) {
        		this.lastWord.removeClass('sel');
        	}
        },
        
        getMethodReplace: function() {
        	var v='first';
        	$$('input[name^=method_replace]').each(function(item){
        		if (item.checked) {
        			v=item.value;
        		}
        	});
        	return v;
        },
        
        getBaseUsed: function() {
        	var v='big1';
        	$$('input[name^=base_used]').each(function(item){
        		if (item.checked) {
        			v=item.value;
        		}
        	});
        	return v;
        },
        
        setHighlightWord: function(bHighlight) {  
        	$$('span[rel^=syn-word]').each(function(item){
        		if (bHighlight) {
        			item.removeClass('nobg');
        		} else {
        			item.addClass('nobg');
        		}        		
        	});
        }
});


var lsSinonim;
var lsSinonimFull;
var clipBoard;

window.addEvent('domready', function (){    
     $$('.multiselect').each(function(multiselect){
        new MTMultiWidget({'datasrc': multiselect,'items_per_page':1000});
    });
    
    lsSinonim=new  lsSinonimClass();
    lsSinonimFull=new  lsSinonimFullClass();
    calcSymbolCount();
    //lsSinonim.loadSinonims();
    
    //lsSinonim.hSinonim.each(function(value, key){alert(value.sinonims[1]);});
    
    ZeroClipboard.setMoviePath(DIR_STATIC_SKIN+ '/js/zeroclipboard/ZeroClipboard.swf' );
    
});