Ext.onReady(function() {
  function path()
  {
    var args = arguments,
    result = []
    ;

    for(var i = 0; i < args.length; i++)
    result.push(args[i].replace('@', '/js/syntaxhighlighter_3.0.83/scripts/'));

    return result
  };

  SyntaxHighlighter.autoloader.apply(null, path(
    'applescript            @shBrushAppleScript.js',
    'actionscript3 as3      @shBrushAS3.js',
    'bash shell             @shBrushBash.js',
    'coldfusion cf          @shBrushColdFusion.js',
    'cpp c                  @shBrushCpp.js',
    'c# c-sharp csharp      @shBrushCSharp.js',
    'css                    @shBrushCss.js',
    'delphi pascal          @shBrushDelphi.js',
    'diff patch pas         @shBrushDiff.js',
    'erl erlang             @shBrushErlang.js',
    'groovy                 @shBrushGroovy.js',
    'java                   @shBrushJava.js',
    'jfx javafx             @shBrushJavaFX.js',
    'js jscript javascript  @shBrushJScript.js',
    'perl pl                @shBrushPerl.js',
    'php                    @shBrushPhp.js',
    'text plain             @shBrushPlain.js',
    'py python              @shBrushPython.js',
    'ruby rails ror rb      @shBrushRuby.js',
    'sass scss              @shBrushSass.js',
    'scala                  @shBrushScala.js',
    'sql                    @shBrushSql.js',
    'vb vbnet               @shBrushVb.js',
    'xml xhtml xslt html    @shBrushXml.js',
    'clojure Clojure clj    @shBrushClojure.js'
  ));

  SyntaxHighlighter.config.stripBrs = true;
  SyntaxHighlighter.defaults['class-name'] = 'styled';
  SyntaxHighlighter.all();

  if (lf = Ext.get('loginform')) {
    lf.on('submit', function(ev) {
      ev.preventDefault();

      Ext.Ajax.request({
        //'url': '/user/login',
        'form': 'loginform',
        'success': function(r, params) {
          var response = Ext.decode(r.responseText);
          if (!response.error) {
            window.location.reload();
            //window.location.assign('/');
          } else {
            var msg = Ext.get('login_msg');
            msg.dom.innerHTML = response.msg;
            msg.addClass('error');
          }
        },
        'failure': genericFail
      });

      return false;
    });
  }

  if (rf = Ext.get('registerform')) {
    rf.on('submit', function(ev) {
      ev.preventDefault();

      Ext.Ajax.request({
        'form': 'registerform',
        'success': function(r, params) {
          var response = Ext.decode(r.responseText);
          var msg = Ext.get('register_msg');
          msg.dom.innerHTML = response.msg;

          if (response.error) {
            msg.addClass('error');
          } else {
            msg.removeClass('error');
          }
        },
        'failure': genericFail
      });

      return false;
    });
  }

  if (cf = Ext.get('commentform')) {
    cf.on('submit', function(ev) {
      ev.preventDefault();
      old_val = Ext.get('post_content').getValue();
      ev.target.post_content.value = uBase64.encode("B64_ENCODED" + Ext.get('post_content').getValue());

      Ext.Ajax.request({
        'url': '/comment/new_comment',
        'form': 'commentform',
        'success': function(r, params) {
          if (r.responseText == '\n') {
            window.location.reload();
            return;
          }
          var response = Ext.decode(r.responseText);
          var msg = Ext.get('comment_msg');
          if (!response.error) {
            window.location.reload();
            /*window.location.assign('#last');
            msg.dom.innerHTML = response.msg;
            msg.removeClass('error');*/
          } else {
            msg.dom.innerHTML = response.msg;
            msg.addClass('error');
          }
        },
        'failure': genericFail
      });
      ev.target.post_content.value = old_val;

      return false;
    });
  }

});

function genericFail(r, params) {
  alert('Could not send request to server: Error ' + r.status + 
    "\nPlease try again or contact us if this problem persists.");
}

Ext.util.base64 = {

  base64s : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",

    encode: function(decStr){
      if (typeof btoa === 'function') {
        return btoa(decStr);            
      }
      var base64s = this.base64s;
      var bits;
      var dual;
      var i = 0;
      var encOut = "";
      while(decStr.length >= i + 3){
        bits = (decStr.charCodeAt(i++) & 0xff) <<16 | (decStr.charCodeAt(i++) & 0xff) <<8 | decStr.charCodeAt(i++) & 0xff;
        encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + base64s.charAt((bits & 0x00000fc0) >> 6) + base64s.charAt((bits & 0x0000003f));
      }
      if(decStr.length -i > 0 && decStr.length -i < 3){
        dual = Boolean(decStr.length -i -1);
        bits = ((decStr.charCodeAt(i++) & 0xff) <<16) |    (dual ? (decStr.charCodeAt(i) & 0xff) <<8 : 0);
        encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + (dual ? base64s.charAt((bits & 0x00000fc0) >>6) : '=') + '=';
      }
      return(encOut);
    },

      decode: function(encStr){
        if (typeof atob === 'function') {
          return atob(encStr); 
        }
        var base64s = this.base64s;        
        var bits;
        var decOut = "";
        var i = 0;
        for(; i<encStr.length; i += 4){
          bits = (base64s.indexOf(encStr.charAt(i)) & 0xff) <<18 | (base64s.indexOf(encStr.charAt(i +1)) & 0xff) <<12 | (base64s.indexOf(encStr.charAt(i +2)) & 0xff) << 6 | base64s.indexOf(encStr.charAt(i +3)) & 0xff;
          decOut += String.fromCharCode((bits & 0xff0000) >>16, (bits & 0xff00) >>8, bits & 0xff);
        }
        if(encStr.charCodeAt(i -2) == 61){
          return(decOut.substring(0, decOut.length -2));
        }
        else if(encStr.charCodeAt(i -1) == 61){
          return(decOut.substring(0, decOut.length -1));
        }
        else {
          return(decOut);
        }
      }
}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
// supports unicode!
var uBase64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = uBase64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = uBase64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
};

