/**
* Kffboard v2.1 源代码
* /js/functions.js
* 提供给所有页面使用的一些函数/类
* 作者 卡飞菲 kafeifei@gmail.com
* 
* 2005-5-15 21:23
**/


// echo
function p(str) {
  document.write(str);
}

/**
* 移动某 select 中已选择的元素到另一个 select 中
* 对象中选中的 option 将被删除，目标尾部加入这个 option
*/
function select_move(select1, select2) {
  var s_left = findObj(select1);
  var s_right = findObj(select2);
  var l_len = s_left.options.length;
  for (var i = 0; i < l_len; i++) {
    if (s_left.options[i].selected)  {
      //insertTextarea('textv', s_left.options[i].text + '(' + s_left.options[i].value + ') 被移动\n');
      //findObj('view_v').innerHTML += s_left.options[i].text + '(' + s_left.options[i].value + ') 被移动\n<br>';
      r_len = s_right.options.length;
      s_right.options[r_len] = new Option(s_left.options[i].text, s_left.options[i].value);
	  }
  }
  _del_select_options(s_left);
}

/**
* 删除某 select 中已选择的 option
*/
function _del_select_options(obj) {
  for (var j = 0; j < obj.options.length; j++) {
    if (obj.options[j].selected) {
      obj.remove(j);
      _del_select_options(obj);
    }
  }
}

/**
* 插入字串到 Textarea 里
* 将覆盖 Textarea 中选中区域，或插入到鼠标所在位置
*/
function insertTextarea(textareaName, str) {
  var view = findObj(textareaName);
  if (!str) view.innerHTML = ''; else {
    // ie
    if (document.selection) {
      view.focus();
      var v = document.selection.createRange();
      v.text = str;
    } else if (view.selectionStart || view.selectionStart == "0") { // mozilla
      var startPos = view.selectionStart;
      var endPos = view.selectionEnd;
      var chaineStr = view.value;
      view.value = chaineStr.substring(0, startPos) + str + chaineStr.substring(endPos, chaineStr.length);
    }    else { // other
      view.value += str;
    }
  }
}

/**
* 检查合法的链接格式替换为 bbcode 格式的代码
*/
function autoUrl(str) {
  str = str.replace(/(^|\s|&nbsp|^\])([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/gi, '$1[email]$2[email]');
  str = str.replace(/(^|\s|&nbsp|^\])(http|https|ftp|mms|telnet|rtsp)(:\/\/\S+)/gi, '$1[url]$2$3[/url]');
  str = str.replace(/(^|\s|&nbsp|^\])(([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}[\/\S]*)/gi, '$1[url=http://$2]$2[/url]');
  str = str.replace(/\[url\](\S+.(gif|jpg|png|bmp))\[\/url\]/gi, '[img]$1[/img]');
  str = str.replace(/\[url\](\S+.swf)\[\/url\]/gi, '[flash]$1[/flash]');
  return str;
}

/**
* 添加一个表情符号到输入框
*/
function add_expr(exprid) {
  insertTextarea('contents', '[expr::' + exprid + ']');
}

/**
* 添加一个BBCODE的代码段
*/

function bbcode_add(codename) {
  var view = findObj('contents');
  var _begin_code = '[' + codename + ']';
  var _end_code = '[/' + codename + ']';
  if (!codename) {
    return false;
  } else {
    // ie
    if (document.selection) {
      view.focus();
      var v = document.selection.createRange();
      v.text = _begin_code + v.text + _end_code;
    } else if (view.selectionStart || view.selectionStart == "0") { // mozilla
      var startPos = view.selectionStart;
      var endPos = view.selectionEnd;
      var chaineStr = view.value;
      view.value = chaineStr.substring(0, startPos) + _begin_code + chaineStr.substring(startPos, endPos) + _end_code + chaineStr.substring(endPos, chaineStr.length);
    } else { // other
      view.value += _begin_code  + _end_code;
    }
  }
}

// 无聊
function _test() {
  alert('哎哟！');
}

/**
* 检查email格式是否合法
*/
function checkEmail(str) {
  var reg = new RegExp("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$","i");
  return str.match(reg);
}

/**
* 检查用户名格式是否合法
*/
function checkUsername(str) {
  var reg = new RegExp("^[^'\,\"%*\n\r\t?<>\\/\\\\ ]+$", "i");
  return str.match(reg);
}

/**
* 检查密码格式是否合法
*/
function checkPassword(str) {
  var reg = new RegExp("^[0-9a-z!#$%&()+\\-.\\[\\]\\/\\\\@?{}|:;]+$", "i");
  return str.match(reg);
}

/**
* 检查输入是否为一个正整数
*/
function isint(str) {
  var reg = new RegExp("^[0-9]+$", "i");
  //if (str.match(reg)) alert("ok");
  return str.match(reg);
}

/**
* 自动选择某个对象的默认值
*/
function def_radio(varname, val) {
  var tobj;
  if (tobj = findObj(varname + '_' + val)) {
    tobj.checked = true;
  }
}
function def_select(varname, val) {
  var tobj = findObj(varname);
  if (!tobj) {
    return;
  }
  for (var i=0; i< tobj.options.length; i++) {
    if (tobj.options[i].value == val) {
      tobj.options[i].selected = 'selected';
    } else if ('n' == val) {
      tobj.options[i].selected = false;
    }
  }
}
function def_checkbox(varname, val) {
  var tobj;
  if (tobj = findObj(varname)) {
    if (tobj.value == val) {
      tobj.checked = true;
    } else {
      //tobj.checked = false;
    }
  }
}

function set_checkboxes(the_form, varname) {
    var elts      = (typeof(document.forms[the_form].elements[varname]) != 'undefined')
                  ? document.forms[the_form].elements[varname]
                  : 'undefined';
    var elts_cnt  = (typeof(elts.length) != 'undefined')
                  ? elts.length
                  : 0;
    
    if (elts_cnt) {
        for (var i = 0; i < elts_cnt; i++) {
          if (elts[i].checked) {
            elts[i].checked = false;
          } else {
            elts[i].checked = true;
          }
        }
    } else {
        return false;
    }
    return true;
}

/**
* isint ,这里不带符号不为零的整数
*/

function isint(str) {
  var reg = /\d+$/;
  if ('0' == str) {
    return false;
  }
  if (null != str.match(reg)) {
    return true;
  } else {
    return false;
  }
}

///////////////// --------------------------------------------------- ////////////////
/**
* 来自Dreamweaver 的一些函数
*/

// Example:
// var b = new BrowserInfo();
// alert(b.version); 
function BrowserInfo()
{
  this.name = navigator.appName;
  this.codename = navigator.appCodeName;
  this.version = navigator.appVersion.substring(0,4);
  this.platform = navigator.platform;
  this.javaEnabled = navigator.javaEnabled();
  this.screenWidth = screen.width;
  this.screenHeight = screen.height;
}

// 屏蔽鼠标右键
function disableRightClick(e)
{
  var message = "Right click disabled";
  
  if(!document.rightClickDisabled) // initialize
  {
    if(document.layers) 
    {
      document.captureEvents(Event.MOUSEDOWN);
      document.onmousedown = disableRightClick;
    }
    else document.oncontextmenu = disableRightClick;
    return document.rightClickDisabled = true;
  }
  if(document.layers || (document.getElementById && !document.all))
  {
    if (e.which==2||e.which==3)
    {
      //alert(message);
      return false;
    }
  }
  else
  {
    //alert(message);
    return false;
  }
}
// disableRightClick();

// 查找并返回 theDoc 中的指定对象。

function findObj(theObj) {
  return getElement(theObj);
}

function getElement(oid) {
    var doc = document;
    var sobj;
	sobj = doc.getElementById(oid);
    if (!sobj) {
		var tmp = doc.getElementsByName(oid);
		if (!tmp[0]) {
			return false;
		} else {
			sobj = tmp[0];
		}
    }
    return sobj;
}

// ***************************************************************** //

// ***************************************************************** //
// JScript implementation of the Secure Hash Algorithm, SHA-1
// as defined in FIPS PUB 180-1, NIST, U.S.A.
// Implemented by Jason Li, Frontfree Technology Network, 2001

// Static variable to store the hexadecimal convertion table
// This is expected to have better performance, because
// there is no initialization needed when running multiple
// times
var sHEXChars="0123456789abcdef";

// This function converts an int32 to a hex string.
function hex(num)
{
  var str="";
  for(var j=7;j>=0;j--)
    str+=sHEXChars.charAt((num>>(j*4))&0x0F);
  return str;
}

// The standard SHA1 needs the input string to fit into a block
// This function align the input string to meet the requirement
function AlignSHA1(sIn){
  var nblk=((sIn.length+8)>>6)+1, blks=new Array(nblk*16);
  for(var i=0;i<nblk*16;i++)blks[i]=0;
  for(i=0;i<sIn.length;i++)
    blks[i>>2]|=sIn.charCodeAt(i)<<(24-(i&3)*8);
  blks[i>>2]|=0x80<<(24-(i&3)*8);
  blks[nblk*16-1]=sIn.length*8;
  return blks;
}

// The int32 add function which doesn't generate overflow
// exception. This is required by the algorithm
function add(x,y){
  var lsw=(x&0xFFFF)+(y&0xFFFF);
  var msw=(x>>16)+(y>>16)+(lsw>>16);
  return(msw<<16)|(lsw&0xFFFF);
}

// The int32 _asm rol :)
function rol(num,cnt){
  return(num<<cnt)|(num>>>(32-cnt));
}

// Perform the appropriate triplet combination function for the current round
function ft(t,b,c,d){
  if(t<20)return(b&c)|((~b)&d);
  if(t<40)return b^c^d;
  if(t<60)return(b&c)|(b&d)|(c&d);
  return b^c^d;
}

// Determine the appropriate additive constant for the current iteration
function kt(t) {
  return(t<20)?1518500249:(t<40)?1859775393:
    (t<60)?-1894007588:-899497514;
}

// Hash the string using FIPS-180 SHA-1
function SHA1(sIn)
{
  var x=AlignSHA1(sIn);
  var w=new Array(80);
  var a=1732584193;
  var b=-271733879;
  var c=-1732584194;
  var d=271733878;
  var e=-1009589776;
  for(var i=0;i<x.length;i+=16){
    var olda=a;
    var oldb=b;
    var oldc=c;
    var oldd=d;
    var olde=e;
    for(var j=0;j<160;j++){
      if(j<16)w[j]=x[i+j];
      else w[j]=rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);
      t=add(add(rol(a,5),ft(j,b,c,d)),add(add(e,w[j]),kt(j)));
      e=d;
      d=c;
      c=rol(b,30);
      b=a;
      a=t;
    }
    a=add(a,olda);
    b=add(b,oldb);
    c=add(c,oldc);
    d=add(d,oldd);
    e=add(e,olde);
  }
  return hex(a)+hex(b)+hex(c)+hex(d)+hex(e);
}
//document.write('js_sha1: '+SHA1('wer'));
//////// sha1 //////////