// Copyright (c) 1996-2009 Golden Telecom. All Rights Reserved.
// Author: Igor Lidin

// control elements
var fT		// deny-if-not-match-type
var fR		// deny-if-not-match-regexp
var fE		// allow-if-all-empty
var fe		// deny-if-empty

var fc		// submit-on-change fields
var fu		// submit-on-update fields
var fm		// move-through fields
var fa		// no-autocomplete fields
var ft		// error triggers
var fp		// pass through even if there are errors

// control storage
var cR=[]	// deny-if-not-match-regexp
var cE=[]	// allow-if-all-empty
var ce=[]	// deny-if-empty
var ct=[]	// error triggers

// objects
var de,di,da,ds,dc,dh,db,df

// form objects
var xn,xs

// flags
var cmp,cmn,cmc,cms,cmk,cme

// document load event
function doLoad()
{
 attach()
}

function attach()
{
 if(window.focus)	window.focus()
 attachObjects()
 attachLinks()
 attachButtons()
 attachControls()
}

function attachObjects()
{
 if(window.navigator && window.navigator.userAgent)
  if(window.navigator.userAgent.indexOf('Maxthon') > -1)
   window.maxthon = 1

 if(document.getElementsByName)	de=1
 if(document.getElementById)	di=1
 if(document.all)		da=document.all
 if(document.selection)		ds=document.selection
 if(window.clipboardData)	dc=window.clipboardData
 if(document.body)		db=document.body
 if(document.forms)		df=document.forms['f']
}

function attachLinks()
{
 var e,i

 if(e=findLink('popuplink'))
  if(e.length>0)	for(i=0;i<e.length;i++) e[i].onclick=winPopup
  else			e.onclick=winPopup
 if(e=findLink('link_submit'))
  if(e.length>0)	for(i=0;i<e.length;i++) e[i].onclick=formLink
  else			e.onclick=formLink
}

function attachButtons()
{
 var e
 if(e = findControl('bclose'))	e.onclick=winClose
 if(e = findControl('bprint'))
  if(window.print)		e.onclick=winPrint
  else				btnDisable(e)
}

function attachControls()
{
 if(!df) return

 var i,j,p,e

 xn = findControl('bnext')
 xb = findControl('bprev')
 xs = findControl('bsave')
 xm = findControl('bmode')
 xf = findControl('bfile')
 xp = findControl('bprint')

 df.onsubmit	= formSubmit
 df.onkeypress	= formCheckKeys
 df.onclick	= formUpdate
 df.onkeyup	= formUpdate
 df.onmousedown	= formUpdate

 if(xm && xs) xs.onclick = function() { xm.value = xs.name }
 if(xm && xn) xn.onclick = function() { xm.value = xn.name }
 if(xm && xb) xb.onclick = function() { xm.value = xb.name }
 if(xm && xf) xf.onclick = function() { xm.value = xf.name }

 if(fa && df.setAttribute)
  for(i=0;i<fa.length;i++)
   if(df[fa[i]])
    df[fa[i]].setAttribute('autocomplete', 'off', 0)
 if(fc)
  for(i=0;i<fc.length;i++)
   if(df[fc[i]])
    df[fc[i]].onclick	= formSave
 if(fu)
  for(i=0;i<fu.length;i++)
   if(df[fu[i]])
    df[fu[i]].onchange	= formSave
 if(fm)
  for(i=0;i<fm.length;i++)
   {
    e=df[fm[i]]
    if(p) { p.moveNext=e; e.movePrev=p }
    e.onpaste		= formCheckPaste
    // workaround maxthon bug: repeating keydown/keyup events twice
    if(window.maxthon)
     {
      e.onkeydown	= function(g) { if(e.xTr = !e.xTr) return; formCheckMove1(g) }
      e.onkeyup		= function(g) { if(e.xTr = !e.xTr) return; formCheckMove2(g) }
     }
    else
     {
      e.onkeydown	= formCheckMove1
      e.onkeyup		= formCheckMove2
     }
    // workaround opera bug: not-repeating keydown event on keyboard repeat
    if(window.opera && e.addEventListener) e.addEventListener('keypress',formCheckMove3,false)
    p=e
   }

 if(ft)
  for(i=0;i<ft.length;i++)
   if((e=findControl(ft[i][0])) && ft[i][1])
   {
    ft[i][0]=e
    ct[ct.length]=ft[i]
   }
 if(fT)
  for(i=0;i<fT.length;i++)
   if((e=df[fT[i][0]]) && fT[i][1] && (e.xType=fT[i][1]))
   {
    // opera IS sux and mustdie, totally, absolutely, definitely
    //  it produces keypress event on Del, Backspace, etc
    //  so we have to catch keydown to store real key code
    if(window.opera && e.addEventListener)
     e.addEventListener('keydown',formCheckTypeOpera,false)

    e.onkeypress=formCheckType
   }
 if(fR)
  for(i=0;i<fR.length;i++)
   if((e=df[fR[i][0]]) && fR[i][1] && (e.xRegexp=new RegExp(fR[i][1])))
    cR[cR.length]=e
 if(fE)
  for(i=0;i<fE.length;i++)
  {
   cE[i]=[]
   for(j=0;j<fE[i].length;j++)
    if(e=df[fE[i][j]])
     cE[i][cE[i].length]=e
  }
 if(fe)
  for(i=0;i<fe.length;i++)
   if(e=df[fe[i]])
    ce[ce.length]=e

 fT = fR = fE = fe = ft = null

 // Should call formUpdate after onload due to bug in IE
 if(ds) db.onload = function () { return formUpdate() }

 formFocus()
 formUpdate()
}

function formFocus()
{
 var c,e
 if(!(c=df.elements)) return
 for(i=0;i<c.length;i++)
  {
   e=c[i]
   if(e.length || !e.type || e.type=='hidden' || e.type=='submit' || e.type=='button' || e.type=='radio' || e.disabled || !e.focus) continue
   e.focus()
   break
  }
}

function formSubmit(e)
{
 if(window.event) e=window.event

 if(xf && xm && (xm.value == xf.name)) { xm.value = null; return (e.returnValue=true) }

 df.onkeypress=df.onclick=df.onkeyup=df.onmousedown=null

 if(xs) btnDisable(xs)
 if(xn) btnDisable(xn)
 if(xb) btnDisable(xb)

 return (e.returnValue=true)
}

function formCheckPaste(e)
{
 if(!dc) return true
 var s,t,r,p
 if(window.event)	{ e=window.event; s=e.srcElement }
 else if(e)		{ s=e.target }
 e.returnValue=false
 r=/[^a-z0-9-]/g
 t=dc.getData('Text').toLowerCase().replace(r,'')
 while(s && t.length)
 {
  p=t.indexOf('-')
  if(p==0) { t=t.substr(1); p=t.indexOf('-') }
  if(p<0 || p>s.maxLength) p=s.maxLength
  s.value=t.substr(0,p)
  t=t.substr(p)
  s=s.moveNext
 }
 return false
}

function formCheckMove1(e)
{
 var k,s,l,m,p
 if(window.event)	{ e=window.event; k=e.keyCode; s=e.srcElement }
 else if(e)		{ k=e.keyCode; s=e.target }
 if(!k || !s) return true

 cmk=1
 if(cmp)		{ cmp=0; cme=s=s.movePrev; elemPosEnd(s) }
 if(cmn)		{ cmn=0; cme=s=s.moveNext; elemPosBeg(s) }
 if(cms)		{ cms=0; elemSelect(s) }

 if(e.ctrlKey || e.altKey || e.metaKey) return true

 l=s.value.length;	 if(l && elemSelected(s)) return true
 p=elemPosAt(s)

 if     ( p==0 && (k==8 || k==37 || k==57387) && s.movePrev )
  { cmc=1; cmp=1; return (e.returnValue=false) }
 else if( p==l && k==39 && s.moveNext)
  { cmc=1; cmn=1; return (e.returnValue=false) }
 else if( k>=48 && k<=122 )
  {
   m=s.maxLength
   if(p==m || (p<0 && l==m))
    if(s.moveNext)			{ s=s.moveNext; elemPosBeg(s); elemSelect(s) }
    else				{ cmc=1; return (e.returnValue=false) }
   else if(l==m)			{ cmc=1; cms=1; return (e.returnValue=false) }
   else if(p==m-1 && s.moveNext)	{ cmn=1; cms=1 }
  }

 return true
}

function formCheckMove2(e)
{
 var s
 if(window.event)	{ e=window.event; s=e.srcElement }
 else if(e)		{ s=e.target }
 if(!s) return true

 if(cmk)		{ cmk=0 }
 if(cme)		{ cme=null }
 if(cmp)		{ cmp=0; s=s.movePrev; elemPosEnd(s) }
 if(cmn)		{ cmn=0; s=s.moveNext; elemPosBeg(s) }
 if(cms)		{ cms=0; elemSelect(s) }
 if(cmc)		{ cmc=0; return (e.returnValue=false) }

 return true
}

function formCheckMove3(e)
{
 if(cmk)		{ cmk=0; return cmc ? (e.returnValue=false) : true }
 formCheckMove1(e);	{ cmk=0 }
 if(cme)		{ e.xTarget=cme; cme=null }

 return cmc ? (e.returnValue=false) : true
}

function formCheckKeys(e)
{
 var k
 if(window.event)	{ e=window.event; k=e.keyCode }
 else if(e)		{ k=e.keyCode }

 if(k != 13 || !xn )	return true
 if(!xn.disabled)	xn.click()

 return (e.returnValue=false)
}

// Opera sux, see:
// http://unixpapa.com/js/key.html
// http://qooxdoo.org/documentation/0.6/user_manual/keyboard_events
// https://lists.webkit.org/pipermail/webkit-dev/2007-December/002992.html
// google://opera keypress
function formCheckTypeOpera(e)
{
 var s,c,k
 if(window.event)	{ e=window.event; s=e.srcElement; k=e.keyCode }
 else if(e)		{ s=e.target; k=e.charCode }
 if(e.xTarget)		{ s=e.xTarget }

 s.xSkip =0;

  if(e.ctrlKey || e.altKey || e.metaKey)
  { s.xSkip = 1;	return true }

  if(k==32)		return true	// Space
  if(k==42)		return true	// Gray *
  if(k==43)		return true	// Gray +
//if(k==45)		return true	// Gray -, Ins
  if(k==47)		return true	// Gray /
  if(48<=k&&k<=57)	return true	// 0-9
  if(k==59)		return true	// :|;
  if(k==61)		return true	// +|=
  if(65<=k&&k<=90)	return true	// a-z
//if(k==78)		return true	// n, Gray .
  if(k==109)		return true	// _|-
  if(k==188)		return true	// <|,
  if(k==190)		return true	// >|.
  if(k==191)		return true	// ?|/
  if(k==192)		return true	// ~|`
  if(219<=k&&k<=222)	return true	// {|[ ||\ }|] "|'

 s.xSkip = 1;		return true	// other
}

function formCheckType(e)
{
 var s,c,k,o,f
 if(window.event)	{ e=window.event; s=e.srcElement; k=e.keyCode }
 else if(e)		{ s=e.target; k=e.charCode }
 if(e.xTarget)		{ s=e.xTarget }
 c=s.xType

 if(!k || !s || !c || s.xSkip) return true

 if((c=='a' || c=='l' || c=='s' || c=='r') && k>=65 && k<=90)	{ k+=32;  f=1 }
 if((c=='A' || c=='L' || c=='S' || c=='R') && k>=97 && k<=122)	{ k-=32;  f=1 }

 if((c=='r') && k>=1040 && k<=1071)				{ k+=32;  f=1 }
 if((c=='r') && k==1025)					{ k=1105; f=1 }

 if((c=='R') && k>=1072 && k<=1103)				{ k-=32;  f=1 }
 if((c=='R') && k==1105)					{ k=1025; f=1 }

 if     (c=='d') o=(k>=48 && k<=57)						// 0-9
 else if(c=='a') o=(k>=97 && k<=122)						// a-z
 else if(c=='A') o=(k>=65 && k<=90)						// A-Z
 else if(c=='l') o=(k>=48 && k<=57 || k>=97 && k<=122)				// 0-9 a-z	lowercase
 else if(c=='L') o=(k>=48 && k<=57 || k>=65 && k<=90)				// 0-9 A-Z	uppercase
 else if(c=='p') o=(k>=48 && k<=57 || k>=97 && k<=122 || k>=65 && k<=90)	// 0-9 a-z A-Z
 else if(c=='q') o=(k>=32 && k<=126)						// 7bit ascii
 else if(c=='s') o=(k>=32 && k<=126)						// 7bit ascii	lowercase
 else if(c=='S') o=(k>=32 && k<=126)						// 7bit ascii	uppercase
 else if(c=='r') o=(k>=32)							// 8bit ascii	lowercase
 else if(c=='R') o=(k>=32)							// 8bit ascii	uppercase
 else		 o=true

 if(o && f)
  if(s.setSelectionRange)
   {
    o=false
    var ss=s.selectionStart
    var se=s.selectionEnd
    var st=s.value.substring(0,ss)+String.fromCharCode(k)+s.value.substring(se)
    if(st.length <= s.maxLength) { s.value=st; s.setSelectionRange(ss+1,ss+1) }
   }
  else if(window.event && !window.opera)
   e.keyCode=k
  else if(e.initKeyEvent)
   {
    var ne = document.createEvent("KeyEvents")
    ne.initKeyEvent
	(
	 e.type,true,true,document.defaultView,
	 e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,
	 0,k
        )
    e.preventDefault()
    e.target.dispatchEvent(ne)
   }
  else
   o=false

 return o ? true : (e.returnValue=false)
}

function formUpdate()
{
 if(!xn) return true

 var i,j; var o; var e,n,t; var ee=new Object()

 // deny-if-empty
 for(i=0;i<ce.length;i++)
 {
  e=ce[i]
  n=e.length ? e[0].name : e.name
  if(ee[n])				continue
  if(elemEmpty(e))			ee[n]=true
 }

 // deny-if-not-match-regexp
 for(i=0;i<cR.length;i++)
 {
  e=cR[i]
  if(!ee[e.name] && !e.disabled && !e.xRegexp.test(e.value))
					ee[e.name]=true
 }

 // allow-if-all-empty
 for(i=0;i<cE.length;i++)
 {
  t=cE[i]
  if(elemEmpty(t)) for(j=0;j<t.length;j++) ee[t[j].name]=false
 }

 // global error state
 o=true; for(i in ee) if(ee[i]) { o=false; break }

 // enable/disable 'next' button
 if     ( o && xn.disabled)		btnEnable (xn)
 else if(!o && !xn.disabled && !fp)	btnDisable(xn)

 // error triggers
 if(ct)
  for(i=0;i<ct.length;i++)
  {
   t=ct[i]; e=t[0]
   o=false; for(j=1;j<t.length;j++) if(ee[t[j]]) { o=true; break }
   if     (!o && e.xErrOff) { e.xErrOff=o; elemEnable (e) }
   else if(o && !e.xErrOff) { e.xErrOff=o; elemDisable(e) }
  }

 return true
}

function btnEnable(e)
{
 e.disabled=false
 if(e.className) e.className=e.className.replace(' d',' a')
}
function btnDisable(e)
{
 e.disabled=true
 if(e.className) e.className=e.className.replace(' a',' d')
}

function elemEnable(e)
{
 if(!e) return
 e.className=e.className=='err'?'':e.className.replace(' err','')
}
function elemDisable(e)
{
 if(!e) return
 e.className+=' err'
}

function elemEmpty(e)
{
 var i,r

 if(e.length)
 {
  for(i=0;i<e.length;i++) if(!elemEmpty(e[i])) return false
  return true
 }

 r =
 ( (e.type=='checkbox' || e.type=='radio') && !e.checked )
  ||
 ( (e.type=='text' || e.type=='password' || e.type=='hidden') && (!e.value.length) )
  ||
 ( (e.type=='button' || e.type=='submit' || e.type=='reset') && e.disabled )

 return r
}

function elemSelect(e)
{
 var l=e.value.length;		if(!l) return
 if(e.setSelectionRange)	// works (Mozilla, Opera)
  e.setSelectionRange(0,l)
 else if(e.select)		// works (IE)
  e.select()
}

function elemSelected(e)
{
 if(e.setSelectionRange)	return e.selectionStart!=e.selectionEnd
 else if(ds)			return ds.createRange().text.length!=0
 else				return false
}

function elemPosAt(e)
{
 var r; if(!e.value.length)	return 0
 if(e.setSelectionRange)	return e.selectionStart
 else if(ds)			{ r=ds.createRange(); return r.moveStart('character',-r.moveStart('character',-32)) }
 else				return -1
}

function elemPosBeg(e)
{
 if(window.opera)		// Opera SUXX on
  df.onclick = df.onmousedown = null

 var r,v
 if(e.setSelectionRange)	// works (Mozilla, Opera)
  {
   e.focus()
   e.setSelectionRange(0,0)
  }
 else if(e.createTextRange)	// works (IE, Opera)
  {
   r=e.createTextRange()
   r.collapse(true)
   r.select()
  }
 else if(da)			// works (Old Opera)
  {
   v=e.value; e.value=''
   e.focus(); e.value=v
  }
 else				// moves to end (NS, Old Mozilla)
  {
   v=e.value; e.value=''
   if(e.focus) e.focus()
   e.value=v
  }

 if(window.opera)				// Opera SUXX off
  df.onclick = df.onmousedown = formUpdate
}

function elemPosEnd(e)
{
 if(window.opera)				// Opera SUXX on
  df.onclick = df.onmousedown = null

 var r,v
 var l=e.value.length

 if(e.setSelectionRange)			// works (Mozilla, Opera)
  {
   e.focus()
   e.setSelectionRange(l,l)
  }
 else if(e.createTextRange)			// works (IE, Opera)
  {
   r=e.createTextRange()
   r.collapse(false)
   r.select()
  }
 else if(da)					// works (Old Opera)
  {
   e.select()
   e.value=e.value
   e.focus()
  }
 else						// works
  {
   v=e.value; e.value=''
   if(e.focus) e.focus()
   e.value=v
  }

 if(window.opera)				// Opera SUXX off
  df.onclick = df.onmousedown = formUpdate
}

function formSave(e)
{
 if(xs)			xs.value='1'

 df.submit();		return true
}

function formLink(e)
{
 var s,i
 if(window.event)	{ e=window.event; s=e.srcElement  }
 else if(e)		{ s=e.target }
 if(s.nodeName == 'IMG') s = s.parentNode;
 if(!s.id)		return (e.returnValue=false)
 i = s.id.substr(12);	// strip link_submit
 if(xs)			xs.value = i
 df.submit();		return (e.returnValue=false)
}

function winPopup(e)
{
 var u
 if(window.event)	{ e=window.event; u=e.srcElement.href }
 else if(e)		{ u=e.target.href }
 if(!u)			return true
 var l=(screen.availWidth-600)/2
 var t=(screen.availHeight-400)/2
 var w=window.open(u,'_blank','width=600,height=400,left='+l+',top='+t+',location=no,menubar=no,status=yes,toolbar=no,scrollbars=yes')
 if(w) w.xPopup=1
 return (e.returnValue=false)
}

function winClose()
{
 if(window.opener && window.opener.focus) window.opener.focus()
 if(window.close) window.close()
 return true
}

function winPrint()
{
 if(window.print) window.print()
 if(window.event) event.returnValue=false
 return false
}

function findControl(i)
{
 var e
 if(di)		e=document.getElementById(i)
 else if(da)	e=da.item(i,0)
 else if(df)	e=df[i]
 return e
}

function findLink(i)
{
 var e
 if(de)				e=document.getElementsByName(i)
 else if(da)			e=da.item(i)
 else if(document.links)	e=document.links[i]
 else if(document.anchors)	e=document.anchors[i]
 return e
}
