var Base64 = {
 
	// 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 = Base64._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 = Base64._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;
	}
 
}

var IDAHO = {
  exts: $w("wmv avi 3gp mp4 mpg mov flv"),
  _caches: [],

  // {{{ LightBox
  LightBox: {
      show: function(id) {

          // make it standalone, so doesn't affected by other html tags.
          var box = $(id).cloneNode(true);
          $(id).remove();
          document.body.appendChild(box);

          if (arguments[1]) {
              var offsets = $('flashRecorder').cumulativeOffset();
              var sizes = $('flashRecorder').getDimensions();
              box.setStyle({
                  left: offsets.left + 'px',
                  top: offsets.top + 'px',
                  width: (sizes.width - 50) + 'px',
                  height: (sizes.height - 50) +  'px',
                  display: 'block',
                  zIndex: 999,
                  position: 'absolute'
              });
              return;
          }

          var boxDim = box.getDimensions(),

          docDim = document.viewport.getDimensions(),
          docScrollOffsets = document.viewport.getScrollOffsets(),

          left = (docDim.width - boxDim.width) / 2 + docScrollOffsets.left,
          top = (docDim.height - boxDim.height) / 2 + docScrollOffsets.top;

          box.setStyle({
              position: 'absolute',
              left: (left - 10) + 'px',  // -10 means the size of right scrollbar
              top: top + 'px',
              zIndex: 999,
              display: 'block'
          });
      },

      hide: function(id) {
          $(id).setStyle({display: 'none'});
      }
  }, // LightBox }}}

  // {{{ Cookie
  Cookie: {
      set: function(name, value, expire) {
          var date = new Date();
          date.setTime(date.getTime() + expire);
          var expires = "; expires=" + date.toGMTString();
          document.cookie = name + "=" + value + expires+"; path=/";
      },

      get: function(key) {
          var nameEQ = key + "=";
          var ca = document.cookie.split(';');
          for(var i=0;i < ca.length;i++) {
              var c = ca[i];
              while (c.charAt(0) == ' ') c = c.substring(1, c.length);
              if (c.include(nameEQ)) return c.substring(nameEQ.length, c.length);
          }
          return null;
      },

      has: function(key) {
          return this.get(key) != null;
      },

      remove: function(key) {
          return this.set(key, "", -1);
      }
  }, // Cookie }}}


  validFile: function(file) {
      return this.exts.include(file.split('.').last());
  },

  saveUserInfo: function() {
      var c = IDAHO.Cookie, expires = 86400000;
      c.set('idaho_user_name', Base64.encode($F('idaho_user_name')), expires);
      c.set('idaho_user_location', Base64.encode($F('idaho_user_location')), expires);
      c.set('idaho_user_email', Base64.encode($F('idaho_user_email')), expires);
  },

  idahoUploader: function() {
    var file = $F('idaho_file');
    if (!this.validFile(file)) {
        alert('Selected file ' + file + ' is not a valid video file!' + "\nSupported video formats: " + this.exts.join(', '));
        return false;
    }
    var email = this.getField('idaho_user_email');
    if (email && !this.isEmail(email)) {
        $('idaho_user_email').focus();
        alert('Invalid Email');
        return false;
    }
    this.saveUserInfo();
    IDAHO.LightBox.show('HolderUploaderProgress');
    setTimeout(function(){$$('form')[0].disable()}, 500);
    return true;     
  },

  fillUserInfo: function() {
    document.observe('dom:loaded', function(){
        var c = IDAHO.Cookie;
        $('idaho_user_name').value = c.has('idaho_user_name') ? Base64.decode(c.get('idaho_user_name')) : '';
        $('idaho_user_location').value = c.has('idaho_user_location') ? Base64.decode(c.get('idaho_user_location')) : '';
        $('idaho_user_email').value = c.has('idaho_user_email') ? Base64.decode(c.get('idaho_user_email')) : '';
    });
  },

  getField: function(name) {
    if ($F(name)) {
        return $F(name);
    }
    var c = IDAHO.Cookie;
    return c.has(name) ?  Base64.decode(c.get(name)) : '';
  },

  fillVideoInfo: function(name, location, email) {
      $('idaho_user_name_r').value = name;
      $('idaho_user_location_r').value = location;
      $('idaho_user_email_r').value = email;
      if ($F('vid')) {
          recordListener.onVideoStored($F('vid'));
      }
  },

  openVideoInfo: function() {
      IDAHO.LightBox.show('HolderRecorderInfo', 'flashRecorder');
  },

  setVideoInfo: function() {
      IDAHO.LightBox.hide('HolderRecorderInfo');
  },

  updateVideoInfo: function(vid, url) {
    var self = this;
    var email = self.getField('idaho_user_email_r');
    /*
    if (email && !this.isEmail(email)) {
        $('idaho_user_email_r').focus();
        alert('Invalid Email');
        return false;
    }
    */
    new Ajax.Request(url, {
        parameters: {
            vid: vid,
            userName: self.getField('idaho_user_name_r'),
            userLocation: self.getField('idaho_user_location_r'),
            userEmail: email
        }
    });
  },

  ajax: function(url, match) {
      if (!Object.isUndefined(this._caches[url])) {
          this.updateContent(this._caches[url], match);
          return false;
      }
      new Ajax.Request(url, {
          method: 'get',
          onComplete: function(res) {
              IDAHO._caches[url] = res.responseText;
              IDAHO.updateContent(res.responseText, match);
          }
      });
      return false;
  },

  isEmail: function(email) {
      return /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(email);
  },

  updateContent: function(content, match) {
      $('content-Sub').replace(content).setStyle({height: ''});
      $('navMain').select('li').each(function(it){
          it.writeAttribute('class', it.innerHTML.include(match) ? 'ACT' : '');
      });
      if ('what' == match) {
          return;
      }
      setTimeout(function(){
          if (match == 'why') {
              $('content-Sub').setStyle({height: '590px'});
          }
          new Effect.ScrollTo('content-Sub');
      }, 100);
  }
}
