(function() {
    var Dom = YAHOO.util.Dom,
        Event = YAHOO.util.Event,
        Lang = YAHOO.lang,
        isOpen = false;
var temp=0;
    var _handleWindowClose = function() {
    };
	var _handleWindow = function() {
       
		this.nodeChange();
        var el = this.currentElement[0],
        win = new YAHOO.widget.EditorWindow('spellcheck', {
            width: '170px'
        });

        var body = document.getElementById('spell_suggest');

        body.innerHTML = '';
        var ul = document.createElement('ul');
        ul.className = 'yui-spellcheck-list';
        body.appendChild(ul);

        var list = '';
        //Change this code to suit your backend checker
        for (var i = 0; i < this._spellData.length; i++) {
       			
            	var word = this._spellData[i].split(',')[0];
				var suggestions = this._spellData[i].split(',')[1].split('#');
					
					if (el.innerHTML == word) {
					
            		    for (var s = 0; s < suggestions.length; s++) {
            		    	if(!list.match(suggestions[s]))
            		        list = list + '<li title="Replace (' + word + ') with (' + suggestions[s] + ')">' + suggestions[s] + '</li>';	
            		    }
            		}
           		
        }
		
        ul.innerHTML = list;
       
        Event.on(ul, 'click', function(ev) {
            var tar = Event.getTarget(ev);
            Event.stopEvent(ev);
            if (this._isElement(tar, 'li')) {
                el.innerHTML = tar.innerHTML;
                Dom.removeClass(el, 'yui-spellcheck');
                Dom.addClass(el, 'yui-non');

                var next = Dom.getElementsByClassName('yui-spellcheck', 'span', this._getDoc().body)[0];
                if (next) {
                    this.STOP_NODE_CHANGE = true;
                    this.currentElement = [next];
                    _handleWindow.call(this);
                } else {
                    this.checking = false;
                    this.toolbar.set('disabled', false);
                    this.closeWindow();
                }
                this.nodeChange();
            }
        }, this, true);

        this.on('afterOpenWindow', function() {            
            this.get('panel').syncIframe();
            var l = parseInt(this.currentWindow._knob.style.left, 10);
            if (l === 40) {
               this.currentWindow._knob.style.left = '3px';
            }
        }, this, true);

        win.setHeader('பரிந்துரைகள்');
        isOpen = true;
        //win.setBody(body);
        this.openWindow(win);

        
    };

    var myEditor = new YAHOO.widget.Editor('editor', {
		height: '300px',
        width: '530px',
        dompath: true,
        animate: true,
        plainText: true,
		focusAtStart: true,
        //extracss: '.yui-spellcheck { background-color: yellow; }',
        
        extracss: '.yui-spellcheck { background-color: #ffffff;border-bottom:1px dotted #ff0000; padding-bottom:0px; }',
		toolbar: {
			collapse:true,
			titlebar: 'Tamil SpellChecker',
			buttons: [
				{ type: 'push', label: 'Check Spelling', value: 'spellcheck' },
				{type: 'push' ,label: 'insert' ,value: 'print'}
			]
		}
    });
    /* {{{ Override _handleClick method to keep the window open on click */
    myEditor._handleClick = function(ev) {
        if (this._isNonEditable(ev)) {
            return false;
        }
        this._setCurrentEvent(ev);
        var tar =Event.getTarget(ev);
        if (this.currentWindow) {
            if (!Dom.hasClass(tar, 'yui-spellcheck')) {
                this.closeWindow();
            }
        }
        if (!Dom.hasClass(tar, 'yui-spellcheck')) {
            if (YAHOO.widget.EditorInfo.window.win && YAHOO.widget.EditorInfo.window.scope) {
                YAHOO.widget.EditorInfo.window.scope.closeWindow.call(YAHOO.widget.EditorInfo.window.scope);
            }
        }
        if (this.browser.webkit) {
            var tar =Event.getTarget(ev);
            if (this._isElement(tar, 'a') || this._isElement(tar.parentNode, 'a')) {
                Event.stopEvent(ev);
                this.nodeChange();
            }
        } else {
            this.nodeChange();
        }
    };
   	myEditor.checking = false;
   
    
    myEditor._checkSpelling = function(o) {
		var res = o.responseText;
       	res = res.replace(/\s+/, '');
		res = res.replace(/\r\n/, '');
		res = res.replace(/\r/, '');
		res = res.replace(/\n/, '');
		var data = res.split('$');
		var html = this._getDoc().body.innerHTML;
		html = " "+html+" ";
        if(res) {
        	if (data.length > 0) {
				for (var i = 0; i < data.length; i++) {
        			var word = data[i].split(',')[0];
					if(word){
						//html = html.replace(word, '<span class="yui-spellcheck">' + word + '</span> ');
						html = html.replace(word + ' ', '<span class="yui-spellcheck">' + word +'</span> ');
						html = html.replace(' ' + word + ' ', ' <span class="yui-spellcheck">' + word +'</span> ');
						html = html.replace(' ' + word, '<span class="yui-spellcheck">'+word+'</span>');
					}
 				}
				html = html.replace(/^\s+/, '');
				html = html.replace(/\s+$/, '');
        		this.setEditorHTML(html);
			}
		}	
		else {
			unloaded();
			alert('நீங்கள் தட்டச்சு செய்த வார்த்தை அல்லது வார்த்தைகளும் சரியானவை..' );
				
		}
		unloaded();
        this._spellData = data;//data.data;
        this.checking = false;
        
    };

    myEditor.on('windowspellcheckClose', function() {
        _handleWindowClose.call(this);
        isOpen = false;
    }, myEditor, true);
	
	myEditor.on('editorMouseDown', function(args) {
        var el = this._getSelectedElement();
        var el = Event.getTarget(args.ev);
        if (Dom.hasClass(el, 'yui-spellcheck')) {
			this.currentElement = [el];
            if (isOpen) {
				myEditor.closeWindow();
                _handleWindow.call(this);
            } else {
                _handleWindow.call(this);
            }
            return false;
        }
    }, myEditor, true);
    
    myEditor.on('editorKeyDown', function(ev) {
        if (this.checking) {
            //We are spell checking, stop the event
            Event.stopEvent(ev.ev);
        }
    }, myEditor, true);
    
    myEditor.on('afterNodeChange', function() {
        this.toolbar.enableButton('spellcheck');
        if (this.checking) {
            this.toolbar.set('disabled', true);
            this.toolbar.getButtonByValue('spellcheck').set('disabled', false);
            this.toolbar.selectButton('spellcheck');
        }
    }, myEditor, true);
    myEditor.on('editorContentLoaded', function() {
        this._getDoc().body.spellcheck = false; //Turn off native spell check
    }, myEditor, true);
    
    myEditor.on('windowRender', function() {
        var body = document.createElement('div');
        
        body.id = 'spell_suggest';
        myEditor.get('panel').body.getElementsByTagName('fieldset')[0].appendChild(body);

        myEditor._windows.spellcheck = {
            body: body
        };
    }, myEditor, true);
	
	
	myEditor.on('editorKeyUp', function(ev) {
			if (ev.ev.keyCode == 32 || ev.ev.keyCode == 9 || ev.ev.keyCode == 8) {
				ev.ev.handled = true;
				return;
			}
			if (ev.ev.keyCode >= 15 && ev.ev.keyCode <= 47) {
				ev.ev.handled = true;
				return;
			}
					
			
			//var html = this._getDoc().body.innerHTML;
			//var html = myEditor.getEditorHTML();
			var html = myEditor.saveHTML();
			
			
			html = html.replace (/<span>/g,'');
			
			html = html.replace (/<\/span>/g,'');
			
			//html = html.replace(/\<span class=\>/ig, '');
			var modified = startText(html);
			modified = modified.replace(/<\/ச்பன்>/,'</span>');
			modified = modified.replace(/<ச்பன்>/g,'<span>');
			modified = modified.replace(/<ப்ர்>/g,'<br/>');
			modified = modified.replace(/&ன்ப்ச்ப்;/g,'&nbsp;' );
			modified = modified.replace(/<!-ஸ்பன்--> /g,'');
			var range1;
			
			
			if (YAHOO.env.ua.gecko > 0 || YAHOO.env.ua.opera) 
				 range1 = this.get('iframe').get('element').contentWindow.getSelection().getRangeAt(0).startOffset;
			else if ( this.browser.ie >  0) {
				var ran = this._getRange().duplicate();
				ran.moveStart('sentence', -1000000);
				range1 = ran.text.length;
			}
			
			if (ev.ev.keyCode == 13 ) {
				
				//alert("HTMl value  :" +html+"   "+range1);
				ev.ev.handled = true;
				return;
			}
			
			//alert("rang" +range1);
			this._focusWindow();
			if (YAHOO.env.ua.opera)
				this.clearEditorDoc();
			else 
				this.setEditorHTML("");
				
			this.execCommand('inserthtml', modified);
			if (this.browser.opera)   
				sel = this._getWindow().getSelection();
			else if(YAHOO.env.ua.gecko > 0) 
			 		sel = this._getSelection();
			if (YAHOO.env.ua.gecko > 0 || YAHOO.env.ua.opera) {
				//var range = this._getDoc().createRange();
				var range = this._getDoc().createRange();
				
			}
			//alert(this._getDoc().nodeType);
			//alert(this.get('iframe').get('element').contentWindow.getSelection().anchorOffset)
			var tot = modified.length + parseInt('2');
		
			if ( this.browser.ie >  0) {
			
				var newRange = this.get('iframe').get('element').contentWindow.document.selection.createRange();
				newRange.move('sentence', -1000000);
				
				if(html.length<modified.length)  {
					newRange.moveStart('character', range1+1);
					newRange.select();
				
				}
				else if (html.length == modified.length) {
					newRange.moveStart('character', range1);
					newRange.select();
			
				}
				else if (html.length>modified.length && html.length != tot ) {
					newRange.moveStart('character', range1-1);
					newRange.select();
					
				}
					
				else if (html.length == tot ) {
					newRange.moveStart('character', range1-2);
					newRange.select();
				
				}
				
				
				 
				else {
					
				}
			}
				
				
			else if (YAHOO.env.ua.gecko || YAHOO.env.ua.opera) {
				if(html.length<modified.length)  {
					range.setStart(sel.anchorNode,range1+1);
               		range.setEnd(sel.focusNode,range1+1);
            		
				}
				
				else if (html.length == modified.length) {
					range.setStart(sel.anchorNode,range1);
               		range.setEnd(sel.focusNode,range1);
            	
				
				}
				
				else if (html.length>modified.length && html.length != tot ) {
					range.setStart(sel.anchorNode,range1-1);
               		range.setEnd(sel.focusNode,range1-1);
            	}
				
				else if (html.length == tot ) {
					range.setStart(sel.anchorNode,range1-2);
               		range.setEnd(sel.focusNode,range1-2);
            	}
			
				else {
					
				}
				sel.removeAllRanges();
				sel.addRange(range);
		}
		this.myEditor.focus();
	}, myEditor, true);
	
	myEditor.on('toolbarLoaded', function() {
		this.toolbar.on('printClick' , function() {
			var html = myEditor.getEditorHTML();
			document.location.href ="print.jsp?h=" +encodeURI(html);
    	},this,true);
    },myEditor,true);
    
    
   /* myEditor.on('toolbarLoaded', function() {
		
		this.toolbar.on('printClick' , function() {
			
			var ran = this.get('iframe').get('element').contentWindow.getSelection().getRangeAt(0).startOffset;
			document.getElementById('bg').style.display = 'block';
			document.getElementById('GB_window').style.display = 'block';	
			document.getElementById('GB_window').focus();
			document.getElementById('_text').focus();
			var self = this;
		
			insert  = function() {
				var val = document.getElementById('_text').value ;
				self.execCommand('inserthtml',val);
				document.getElementById('bg').style.display = 'none';
				document.getElementById('GB_window').style.display = 'none';
				document.getElementById('_text').value = "";
					
				self._focusWindow();
			}
		
		},this,true);
    },myEditor,true);
    
    */
    myEditor.on('toolbarLoaded', function() {
    	
        this.toolbar.on('spellcheckClick', function() {

			if (!this.checking) {
                this.checking = true;
				var html = myEditor.cleanHTML(myEditor.saveHTML());
				
				html = html.replace(/\<br\>/ig, ' ');
				html = html.replace(/\<.*?\>/ig, '');
				html = html.replace(/\s+/, ' ');
				html = html.replace(/&nbsp;/g,' ');
			
				//alert("given input word is " +html);
				 doload();
				//alert(" "+html);
				var url = 'check.jsp?text=' +encodeURI(html);//myEditor.getEditorHTML();
				this._conn = YAHOO.util.Connect.asyncRequest('GET', url, {
                 success: this._checkSpelling,
                    failure: function() { 	alert('உங்களின் தேவையை நிறைவேற்ற தற்சமயம் முடியவில்லை');unloaded(); },
                    scope: this
                }, null); 
                //alert("connection"+this._conn)
            } else {
                this.checking = false;
                var el = Dom.getElementsByClassName('yui-spellcheck', 'span', this._getDoc().body);
                //More work needed here for cleanup..
                Dom.removeClass(el, 'yui-spellcheck');
                Dom.addClass(el, 'yui-none');
                this.toolbar.set('disabled', false);
                this.nodeChange();
            }
            return false;
        }, this, true);
    }, myEditor, true);
    myEditor.render();

})();

