/*
 * CodePress - Real Time Syntax Highlighting Editor written in JavaScript - http://codepress.org/
 *
 * Copyright (C) 2006 Fernando M.A.d.S. <fermads@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the
 * GNU Lesser General Public License as published by the Free Software Foundation.
 *
 * Read the full licence: http://www.opensource.org/licenses/lgpl-license.php
 */

function trim (zeichenkette) {
  // Erst führende, dann Abschließende Whitespaces entfernen
  // und das Ergebnis dieser Operationen zurückliefern
  var rtrim = new RegExp(String.fromCharCode(160), "g");
  zeichenkette = zeichenkette.replace(rtrim, " ");
  return zeichenkette.replace (/^\s+/, '').replace (/\s+$/, '');
}

CodePress = function(obj) {
        var self = document.createElement('iframe');
        self.textarea = obj;
        self.textarea.disabled = true;
        self.textarea.style.overflow = 'hidden';
        self.textarea.style.visibility = 'hidden';
        self.style.height = (self.textarea.rows*16) +'px';
        self.style.width = '100%';
        self.textarea.style.overflow = 'auto';
        self.style.border = '1px solid #DDDDDD';
	 self.frameBorder = 0; // remove IE internal iframe border
	 self.scrolling = "no";
	 self.overflowX = "auto";
        self.overflowY = 'hidden';
        self.style.visibility = 'hidden';
        self.style.position = 'absolute';
        self.options = self.textarea.className;

        self.initialize = function() {
                self.editor = self.contentWindow.CodePress;
                self.toggleAutoComplete();
                self.editor.body = self.contentWindow.document.getElementsByTagName('body')[0];
                self.editor.setCode(trim (self.textarea.value));
                //self.editor.body.style.overflowX = "auto";
                //self.editor.body.style.overflowY = 'hidden';

 		  self.FrameResize();
                self.setOptions();
                self.editor.syntaxHighlight('init');
                self.textarea.style.display = 'none';
                self.style.position = 'static';
                self.style.visibility = 'visible';
                self.style.display = 'inline';
                if(self.textarea.className.match('eval')) {
			self.editor.body.style.backgroundImage = 'url(images/line-numbers_g.png)';
		  }
                if(self.textarea.className.match('ResultArea')) {
			self.editor.body.style.backgroundImage = 'url(images/line-numbers_out.png)';
			self.style.marginBottom = '5pt';
		  }
                if(self.contentWindow.document.attachEvent) 
                 self.contentWindow.document.attachEvent('onkeyup',self.FrameResize); else 
                 self.contentWindow.document.addEventListener('keyup',self.FrameResize,false);
                if(self.contentWindow.document.attachEvent) 
                 self.contentWindow.document.attachEvent('onkeyup',self.revertBtnRefresh); else 
                 self.contentWindow.document.addEventListener('keyup',self.revertBtnRefresh,false);
		  self.revertBtnRefresh();
        }
	 self.revertBtnRefresh = function () {
          var btn = document.getElementById('revertBtn_'+self.textarea.id);
          var org = "";
	   eval('if (typeof(window["code_box_'+self.textarea.id+'"]) != "undefined") org = code_box_'+self.textarea.id+';');
	   org = html_entity_decode(org);
	   org = trim(org.replace(/&#10;/g,"\n"));  
          org = org.replace(/&nbsp;/g, " ");

          var txt = self.getCode();
	   txt = html_entity_decode(txt);
	   txt = trim(txt.replace(/&#10;/g,"\n"));  
          txt = txt.replace(/&nbsp;/g, " ");
	   txt = txt.replace(new RegExp(String.fromCharCode(13), "g"),"");

	   if(btn)
            if(txt==org){ btn.style.color = '#AAAAAA'; } else
                        { btn.style.color = 'red'; } //alert(txt.length + " - "+ org.length); 
          
	   //for(var i=0; i < txt.length; i++){
          //  if(txt.charAt(i) != org.charAt(i)){
          //      alert(i + " (" +txt.length+") " + txt.charCodeAt(i) + " - " + org.charCodeAt(i));
          //     break;
          //    }
          //}
        }
        self.FrameResize = function() {
          var h = self.contentWindow.document.getElementsByTagName('body')[0].scrollHeight;
	   var a = self.contentWindow.document.getElementsByTagName('pre');
	   var scroll = 0;
	   for(i = 0; i < a.length; i++) scroll += a[i].scrollHeight;
          if (scroll != 0) h = scroll;
	   //if(self.textarea.className.match('ResultArea')) 
	    if(navigator.userAgent.indexOf("MSIE") == -1){
            if(h == 0) h = h + 16; 
           }
          self.style.height = (h+16)+'px';
        }

        // obj can by a textarea id or a string (code)
        self.edit = function(obj,language) {
                if(obj) self.textarea.value = document.getElementById(obj) ? document.getElementById(obj).value : obj;
                if(!self.textarea.disabled) return;
                self.language = language ? language : self.getLanguage();
                self.src = CodePress.path+'codepress.html?language='+self.language+'&ts='+(new Date).getTime();
                if(self.attachEvent) self.attachEvent('onload',self.initialize);
                else self.addEventListener('load',self.initialize,false);
        }

        self.getLanguage = function() {
                for (language in CodePress.languages)
                        if(self.options.match('\\b'+language+'\\b'))
                                return CodePress.languages[language] ? language : 'generic';
        }

        self.setOptions = function() {
                if(self.options.match('autocomplete-off')) self.toggleAutoComplete();
                if(self.options.match('readonly-on')) self.toggleReadOnly();
                if(self.options.match('linenumbers-off')) self.toggleLineNumbers();
                if(self.options.match('definition')) self.editor.body.style.backgroundColor = '#FFC9C1';
        }

        self.value = function() {
                return self.textarea.disabled ? self.editor.getCode() : self.textarea.value;
        }
        self.getCode = function() {
                return self.textarea.disabled ? self.editor.getCode() : self.textarea.value;
        }

        self.setCode = function(code) {
                code = code + ""; 
                code = trim(code.replace(/&#10;/g, "\n"));
		  code = html_entity_decode(code);
                self.textarea.disabled ? self.editor.setCode(code) : self.textarea.value = code;
		  self.FrameResize();
		  self.revertBtnRefresh();
                self.editor.syntaxHighlight('init');
        }

        self.toggleAutoComplete = function() {
                self.editor.autocomplete = (self.editor.autocomplete) ? false : true;
        }

        self.toggleReadOnly = function() {
                self.textarea.readOnly = (self.textarea.readOnly) ? false : true;
                if(self.style.display != 'none') // prevent exception on FF + iframe with display:none
                        self.editor.readOnly(self.textarea.readOnly ? true : false);
        }

        self.toggleLineNumbers = function() {
                var cn = self.editor.body.className;
                self.editor.body.className = (cn==''||cn=='show-line-numbers') ? 'hide-line-numbers' : 'show-line-numbers';
        }

        self.toggleEditor = function() {
                if(self.textarea.disabled) {
                        self.textarea.value = self.getCode();
                        self.textarea.disabled = false;
                        self.style.display = 'none';
                        self.textarea.style.display = 'inline';
                }
                else {
                        self.textarea.disabled = true;
                        self.setCode(self.textarea.value);
                        self.editor.syntaxHighlight('init');
                        self.style.display = 'inline';
                        self.textarea.style.display = 'none';
                }
        }

	self.codeToTextArea = function(){
		var textarea = self.nextSibling;
		textarea.value=self.getCode();
	}

       self.edit();
       return self;
}

CodePress.languages = {
        csharp : 'C#',
        css : 'CSS',
        generic : 'Generic',
        html : 'HTML',
        java : 'Java',
        javascript : 'JavaScript',
        perl : 'Perl',
        ruby : 'Ruby',
        scheme : 'Scheme',
        php : 'PHP',
        text : 'Text',
        sql : 'SQL',
        vbscript : 'VBScript',
    	scheme : 'Scheme',
        pascal : 'Pascal',
        xsl    : 'Xsl'
}

CodePressLoadingDone = false;

CodePress.run = function() {
        s = document.getElementsByTagName('script');
        for(var i=0,n=s.length;i<n;i++) {
                if(s[i].src.match('codepress.js')) {
                        CodePress.path = s[i].src.replace('codepress.js','');
                }
        }
        t = document.getElementsByTagName('textarea');
        for(var i=0,n=t.length;i<n;i++) {
                if(t[i].className.match('codepress')) {
			id = t[i].id;
			newid = id+'_cp';
                         t[i].id = newid;
			eval(id+' = new CodePress(t[i])');
			t[i].parentNode.insertBefore( eval(id),t[i]);
			
                }
        }
	CodePressLoadingDone = true; 
}

//if(window.attachEvent) window.attachEvent('onload',CodePress.run);
//else window.addEventListener('DOMContentLoaded',CodePress.run,false);
