
var clientVer = parseInt(navigator.appVersion); // Get browser version
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
var is_ie = ((clientPC.indexOf("msie") != -1) && (clientPC.indexOf("opera") == -1));
var is_win = ((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit") != -1));

function MM_findObj(n, d) { //v4.03
  if(typeof(n)=='object') return n;
  var p,i,x,a;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(n.indexOf('.')!=-1) { a=n.split('.'); x=d; for (i=0;i<a.length;++i) if (!(x=x[a[i]])) break; }
  if(!x) x=d[n];
  if(!x && d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_changeProp(objName,x,theProp,theValue) { //v6.0
  var obj = MM_findObj(objName);
  if (obj && (theProp.indexOf("style.")==-1 || obj.style)){
    if (typeof(theValue)=='boolean') {
      eval("obj."+theProp+"="+theValue);
    } else {
      eval("obj."+theProp+"='"+theValue+"'");
    }
  }
}
function MM_executeProp(objName,x,theProp) {
  var obj = MM_findObj(objName);
  if (obj && (theProp.indexOf("style.")==-1 || obj.style)){
    eval("obj."+theProp);
  }
}
// - 45 + 43 * 42 / 47 enter 13
//BindKey(13,'productid_3','focus()',45,'productid_1','focus()')
function BindKey() {
    var i,a,obj;
    var args=BindKey.arguments;
    var result = false;
    var k = window.event.keyCode;
    for (i=0; i<(args.length-1); i+=3) {
        if (k == args[i]) {
            MM_executeProp(args[i+1],'',args[i+2])
            result = true;
        }
    }
    return result;
}
function trim(s) {
  return s.replace(/^\s*/,'').replace(/\s*$/,'')
}
function triml(s) {
  return s.replace(/^([ \f\t\v]*[\r\n])*/,'').replace(/[ \f\t\v\r\n]*$/,'')
}
function chkmail(sEmail) {
    return (/^\w+([\.-]?\w+)*@[A-Za-z0-9]\w*([\.-]?\w+)*(\.[a-zA-Z]{2,3})$/.test(sEmail))
}
function chkSelectText(o,s) {
	if (typeof(o)=='undefined' || (!o.tagName) || o.tagName!='SELECT' || o.length < 2)
		return
	var x = (o.lastChkText == s && o.selectedIndex >= 0) ? o.selectedIndex+1 : 0
	for (i=0;i<o.length;++i) {
		var idx=(i+x)%o.length
		if (o[idx].text.indexOf(s) != -1) {
			o.lastChkText = s
			o.selectedIndex = idx
			break
		}
	}
}
function MM_setReturnFocusForm(oName) {
  if (window.MM_returnHashForm==null)
    window.MM_returnHashForm=oName
}

// v4.5
// MM_validateForm([sFormName.]sObjName, sItemTitle, sTestMode[, ...])
// MM_validateForm('username', '姓名', 'R', 'age', '年齡', 'NisNum')
// sTestMode :
//   R 必須輸入
//   N 可空白
//   isEmail 是電子郵件信箱
//   isDate 是日期
//   isTime 是時間
//   isNum 是數字
//   inLength20 字串 20 byte 內
//   inRange100:999 數字 100 到 999 內(含)
//   inChecked3 必須選取 3 個 (checkedbox)
//   inChecked2:4 必須選取 2~4 個之間 (checkedbox)
function MM_validateForm() {
  var c,i,p,q,nm,test,num,min,max;
  var j,len=0,errors='',args=MM_validateForm.arguments;
  window.MM_returnHashForm=null
  var items, item
  for (i=0; i<(args.length-2); i+=3) {
    var obj = eval('document.'+args[i]);
    if (!obj) obj=MM_findObj(args[i]);
    if (obj) {
      findData = false
      findChooseItem = false
      checkedCount = 0

      if (obj.length && !obj.name) {	// 物件陣列 (select 也有 length 也有 name)
        items = obj
      } else {				// 單一物件
        items = [obj]
      }

      nm = (args[i+1] ? args[i+1] : items[0].name)
      test=args[i+2];
      for (j=0;j<items.length;++j) {
        item = items[j]
        if (item.type=='radio' || item.type=='checkbox') {
          findChooseItem = true
          if (item.checked) {
            findData=true
            checkedCount++
          }
        } else {
          if (item.tagName=='SELECT') {
            findChooseItem = true
          } else if (item.type=='text') {
            item.value=trim(item.value)
            if (test.indexOf('isTime')!=-1) {
              item.value=item.value.replace(/：/g,':')
              if (/^\d{4}$/.test(item.value)) item.value=item.value.substr(0,2)+':'+item.value.substr(2,2);
              if (/^24[ :]00$/.test(item.value)) item.value='23:59'
              item.value = item.value.replace(/^24/,'00')
            }
          } else if (item.type=='textarea') {
            item.value=triml(item.value)
          }
          if (trim(item.value)!='') {
            findData=true
            e=chkValidateForm(item.value,test,nm)
            if (e) {
              MM_setReturnFocusForm(args[i])
              errors+=e
            }
          }
        }
      }

      if (test.indexOf('inChecked')!=-1 && findChooseItem && items.length>1) {
        if ((p=test.indexOf(':'))!=-1) {
          min=test.substring(10,p);
          max=test.substring(p+1);
          if (checkedCount < min || max < checkedCount) {
            MM_setReturnFocusForm(args[i])
            errors += '- '+nm+' 必需選擇 '+min+' 到 '+max+' 項之間，目前選取 '+checkedCount+' 項.\n';
          }
        } else {
          m=test.substring(10);
          if (checkedCount != m) {
            MM_setReturnFocusForm(args[i])
            errors += '- '+nm+' 必需選擇其中 '+m+' 項，目前選取 '+checkedCount+' 項.\n';
          }
        }
      } else if (test.charAt(0)=='R' && !findData) {
        MM_setReturnFocusForm(args[i])
        errors += '- '+nm+(findChooseItem ? ' 必需選擇其中一項.\n' : ' 必須有資料.\n');
      }
    }
  }
  if (errors) {
    alert('輸入錯誤:\n'+errors);
    window.location.hash=window.MM_returnHashForm
    return false
  }
  return true;
}
function chkValidateForm(v,t,n) {
  var errors = ''
  v = trim(v)
  if (t.indexOf('isEmail')!=-1) {
    if (!chkmail(v))
      errors+='- '+n+' 必須符合e-mail格式'+(t.charAt(0) == 'R' ? '' : ',沒有e-mail請留空白')+'.\n';
  } else if (t.indexOf('isDate')!=-1) {
    v=Date.parse(v);
    if (isNaN(v)) {
      var d,s;
      d = new Date();
      s = d.getYear() + "/";
      s += (d.getMonth() + 1) + "/";
      s += d.getDate();
      errors+='- '+n+' 必須是有效的日期格式.\n';
    } else if (v<Date.parse('1900/1/1') || Date.parse('2079/6/6')<v) {
      errors+='- '+n+' 必須是介於 1900/1/1 到 2079/6/6 的日期.\n';
    }
  } else if (t.indexOf('isTime')!=-1) {
    if (!/^([01]?\d|2[0-3]):[0-5]?\d$/.test(v))
      errors+='- '+n+' 必須是有效的時間格式, 如 22:30\n';
  } else if (t.indexOf('inLength')!=-1) {
    len = 0;
    for (j=0; j<v.length; ++j) {
      c=v.charCodeAt(j)
      len += (c>128 || c<0) ? 2 : 1 ;
    }
    max=t.substring(9);
    if (len > max)
      errors+='- '+n+' 不可超過 ' + max + ' 個字元(' + max/2 + '個中文字),現在 ' + len + ' 字.\n';
  } else if ((t.indexOf('isNum')!=-1) || (t.indexOf('inRange') != -1)) {
    num = parseFloat(v);
    if (isNaN(num)) {
      errors+='- '+n+' 必須為數字.\n';
    } else if (t.indexOf('inRange') != -1) {
      p=t.indexOf(':');
      min=t.substring(8,p);
      max=t.substring(p+1);
      if (num<min || max<num)
      errors+='- '+n+' 必須在 '+min+' 和 '+max+' 之間.\n';
    }
  }
  return errors;
}
function chkWrap(txtarea) {
  if (event.keyCode==13) {
    bbfontstyle(txtarea,'','<br>');
  }
}

function AddText(txtarea,text) {
	if (txtarea.createTextRange && txtarea.caretPos) {
		var caretPos = txtarea.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
		txtarea.focus();
	} else {
		txtarea.value  += text;
		txtarea.focus();
	}
}
function bbfontstyle(txtarea,bbopen, bbclose) {
    if ((clientVer >= 4) && is_ie && is_win) {
        theSelection = document.selection.createRange().text;
        if (!theSelection) {
            AddText(txtarea,bbopen + bbclose);
            return;
        }
        document.selection.createRange().text = bbopen + theSelection + bbclose;
        txtarea.focus();
        return;
    }
    else if (txtarea.selectionEnd && (txtarea.selectionEnd - txtarea.selectionStart > 0))
    {
        mozWrap(txtarea, bbopen, bbclose);
        return;
    }
    else
    {
        txtarea.value += bbopen + bbclose;
        txtarea.focus();
    }
    storeCaret(txtarea);
}
// Insert at Claret position. Code from
// http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
function storeCaret(textEl) {
    if (textEl.createTextRange) textEl.caretPos = document.selection.createRange().duplicate();
}
// From http://www.massless.org/mozedit/
function mozWrap(txtarea, open, close)
{
    var selLength = txtarea.textLength;
    var selStart = txtarea.selectionStart;
    var selEnd = txtarea.selectionEnd;
    if (selEnd == 1 || selEnd == 2)
        selEnd = selLength;

    var s1 = (txtarea.value).substring(0,selStart);
    var s2 = (txtarea.value).substring(selStart, selEnd);
    var s3 = (txtarea.value).substring(selEnd, selLength);
    txtarea.value = s1 + open + s2 + close + s3;
    return;
}