// getObj
//   Cross-browser element selection.
function getEl(name) {
  if (document.getElementById) {
  	return document.getElementById(name);
  } else if (document.all) {
	  return document.all[name];
  } else if (document.layers) {
    var e, i;
    e = getObjNN4(document,name);
    if (e == undefined) {
      e = getFormEl(name);
    }
    return e;
  }
}

function KeyDownHandler(btnID) {
  // process only the Enter key
    if (event.keyCode == 13)
    {
      var btn = document.getElementById(btnID);
      // cancel the default submit
      event.returnValue=false;
      event.cancel = true;
      // submit the form by programmatically clicking the specified button
      btn.click();
    }
}

//
// TODO: move this to CGTS library
//
function CGTSWeb_GrowingRepeater_AddItemClick(ctlId, rptId) {
  var itemCountInput = document.getElementById(ctlId);
  var itemCount = itemCountInput.value - 0;
  var itemBufferSize = document.getElementById(ctlId + "_buffersize").value - 0;
  
  // ItemAdding event
  var eventHandler = document.getElementById(ctlId).ItemAddingClientOnClickFunction;
  if (eventHandler) {
    if (!eventHandler(ctlId, itemCount, itemCount == itemBufferSize))
      return;
  }

  var nextItemId = rptId + "_item" + (itemCount);
  if (itemCount == itemBufferSize) {
    // Out of items, post back to set up a new repeater
    itemCountInput.value = itemCount + 1;
    document.forms[0].submit();
  } else {
    var nextItem = document.getElementById(nextItemId);
    nextItem.style.display = "block";
    itemCountInput.value = itemCount + 1;
  }
  
  // ItemAdded event
  eventHandler = document.getElementById(ctlId).ItemAddedClientOnClickFunction;
  if (eventHandler) {
    eventHandler(ctlId, nextItemId, itemCount);
  }
  
}

//
// TODO: move this to CGTS library
//
function CGTSWeb_GrowingRepeater_DeleteItemClick(ctlId, rptId, itemId, itemIndex) {
  var deletedItems = document.getElementById(ctlId + "_deleteditems");
  var item = document.getElementById(rptId + "_item" + (itemIndex));

  // ItemDeleting event
  var eventHandler = document.getElementById(ctlId).ItemDeletingClientOnClickFunction;
  if (eventHandler) {
    if (!eventHandler(ctlId, itemIndex))
      return;
  }

  item.style.display = "none";
  if (deletedItems.value != "")
    deletedItems.value += ",";
  deletedItems.value += itemId;

  // ItemDeleted event
  eventHandler = document.getElementById(ctlId).ItemDeletedClientOnClickFunction;
  if (eventHandler) {
    eventHandler(ctlId, itemIndex);
  }

}

//
// TODO: move this to CGTS library
//
function CGTSWeb_CurrencyValidator_Validate(source) {
  var el = getEl(source.controltovalidate);
  var s = el.value;

  if (s == "") {
    return true;
  } else {
    // check if the currency value can be parsed
    return !isNaN(parseFloat(s.replace(",","").replace("$","")));
  }
}

function expirationDateClientValidate(source, args) {
  var monthEl = getEl("PaymentControl_ExpMonthDropDownList");
  var yearEl = getEl("PaymentControl_ExpYearDropDownList");

  if (monthEl != null && yearEl != null) {
    var month = monthEl.options[monthEl.selectedIndex].value;
    var year = yearEl.options[yearEl.selectedIndex].value;

    if (month == "" || year == "") {
      args.IsValid = true;
      return;
    }

    month = month - 0;
    year = year - 0;

    if (month == 12) {
      month = 1;
      year++;
    } else {
      month++;
    }
    var today = new Date();
    var exp = new Date(month + "/1/" + year);
    args.IsValid = (today < exp);

  } else {
    args.IsValid = true;
  }
}

// Validate
// TODO: move this to CGTS.Web
function CGTSWeb_CreditCardNumberValidator_Validate(source) {
  var el = getEl(source.controltovalidate);
  var s = el.value;

  if (s == "") {
    return true;
  } else {
    // mod 10 check
    var v = "0123456789";
    var w = "";
    for (var i=0; i < s.length; i++) {
      x = s.charAt(i);
      if (v.indexOf(x,0) != -1)
      w += x;
    }
    var j = w.length / 2;
    if (j < 6.5 || j > 8 || j == 7) return false;
    var k = Math.floor(j);
    var m = Math.ceil(j) - k;
    var c = 0;
    for (var i=0; i<k; i++) {
      a = w.charAt(i*2+m) * 2;
      c += a > 9 ? Math.floor(a/10 + a%10) : a;
    }
    for (var i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
    return (c%10 == 0);
  }
}

//
// formatCurrency
//
function formatCurrency(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
    num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
    cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
    num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  return (((sign)?'':'-') + '$' + num + '.' + cents);
}

//
// openPopup
//
function openPopup(url, width, height, resizable, scrollbars, name) {
  var params;
  params = "width=" + width;
  params += ",height=" + height
  params += ",menubar=no,toolbar=no,status=yes"
  params += ",resizable=" + (resizable ? "yes" : "no");
  params += ",scrollbars=" + (scrollbars ? "yes" : "no");
  var w = window.open(url, name, params);
  w.focus();
  return w;
}

//
// readCookie
//
function readCookie(cookieName) {
 var theCookie=""+document.cookie;
 var ind=theCookie.indexOf(cookieName);
 if (ind==-1 || cookieName=="") return ""; 
 var ind1=theCookie.indexOf(';',ind);
 if (ind1==-1) ind1=theCookie.length; 
 return unescape(theCookie.substring(ind+cookieName.length+1,ind1));
}

//
// setCookie
//
function setCookie(cookieName,cookieValue,nDays) {
 var today = new Date();
 var expire = new Date();
 if (nDays==null || nDays==0) nDays=1;
 expire.setTime(today.getTime() + 3600000*24*nDays);
 document.cookie = cookieName+"="+escape(cookieValue)
                 + ";expires="+expire.toGMTString();
}

//
// encode64
//
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      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 + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

//
// decode64
//
function decode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = 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);
      }
   } while (i < input.length);

   return output;
}

//
// autoCompleteArray
// 
function autoCompleteArray (e, field, values, forcematch) {
	var found = false;
  
	if (field.value == "") return;

	for (var i = 0; i < values.length; i++) {
	if (values[i].toUpperCase().indexOf(field.value.toUpperCase()) == 0) {
		found=true; break;
		}
	}
	
	if (forcematch && !found) {
		field.value=field.value.substring(0,field.value.length-1); 
		return;
	}
	var cursorKeys ="8;46;37;38;39;40;33;34;35;36;45;";
	if (cursorKeys.indexOf(e.keyCode+";") == -1) {
		//var r1 = field.createTextRange();
		var oldValue = field.value; //r1.text;
		var newValue = found ? values[i] : oldValue;
		if (newValue != field.value) {
			field.value = newValue;
			if (field.createTextRange) {
				var rNew = field.createTextRange();
				rNew.moveStart('character', oldValue.length);
				rNew.select();
			} else if (field.setSelectionRange) {
				field.setSelectionRange(oldValue.length, field.value.length);
			}
		}
	}
	
}

// TODO: Move to CGTSLibrary
function ToggleRequiredValidator_Validate(source) {
  var requiredwhenchecked;
  var checked;
  var el = getEl(source.controltovalidate);
  var s = el.value;
  
  checked = getEl(source.togglecheckboxcontrol).checked;
  requiredwhenchecked = (source.requiredwhenchecked == "true");

  if (requiredwhenchecked) {
    if (checked && s == "") {
      return false;
    } else {
      return true;
    }
  } else {
    if (!checked && s == "") {
      return false;
    } else {
      return true;
    }
  }
}