/**
 * shared functions to facilitate paypal
 * 08.30.10 MDC
 * 
 * create hidden inputs for a single paypal item (name, number, amount, quantity)
 *	<input type="hidden" name="item_name_5" value="Mailing List? Unknown" />
 *	<input type="hidden" name="item_number_5" value="005" />
 *	<input type="hidden" name="amount_5" value="0.00" />
 *	<input type="hidden" name="quantity_5" value="1" />
 */

function mdcCreatePaypalHidden(f, num, nam, qty, amount) {
  var o;

  o = document.createElement('input');
  o.type = 'hidden';
  o.name = 'item_name_' + ppCount;
  o.id = 'ppnam' + ppCount;
  if (ge(o.id)) Dom.remove(o.id);
  o.value = nam;
  f.appendChild(o);

  o = document.createElement('input');
  o.type = 'hidden';
  o.name = 'item_number_' + ppCount;
  o.id = 'ppnum' + ppCount;
  if (ge(o.id)) Dom.remove(o.id);
  o.value = num;
  f.appendChild(o);

  o = document.createElement('input');
  o.type = 'hidden';
  o.name = 'amount_' + ppCount;
  o.id = 'ppamt' + ppCount;
  if (ge(o.id)) Dom.remove(o.id);
  o.value = amount;
  f.appendChild(o);

  o = document.createElement('input');
  o.type = 'hidden';
  o.name = 'quantity_' + ppCount;
  o.id = 'ppqty' + ppCount;
  if (ge(o.id)) Dom.remove(o.id);
  o.value = qty;
  f.appendChild(o);

  ppCount++; //paypal item counter; must be sequential without breaks
}

function ge(id) { //wrapper from iBEV
  return document.getElementById(id);
}

function ges(tag, optEl) { //wrapper - getElementsByTagName - from iBEV
  if (optEl) return optEl.getElementsByTagName(tag);
  else return document.getElementsByTagName(tag);
}
var Dom = {
  remove: function (el) {
    el = ge(el);
    el.parentNode.removeChild(el);
  }
};







/* SAVE FORM FIELD SELECTIONS 
------------------------------------------------
This version will concatentate all the fields in        
in the form into one string, delimited by a PIPE
symbol, into one cookie. The cookie name is the 
same name as the form name. ALL fields are saved. */

function saveSelections(frm) {
  var setvalue, fieldType, index, fieldName, fieldValue, oSave;
  var formname = frm.name || frm.id;
  var today = new Date();
  var exp = new Date(today.getTime() + 999 * 24 * 60 * 60 * 1000); // Expire cookie in 999 days
  var cookieName = formname;
  oSave = [];
  //console.debug(oSave);
  frm = frm.elements;
  var n = frm.length;
  for (i = 0; i < n; i++) {
    fieldName = frm[i].name;
    fieldType = frm[i].type || '';
    if (fieldType == 'submit' || (fieldType == 'hidden' && fieldName !='subject') || frm[i].skip == 'true') continue;
    fieldValue = getInputValue(frm[i]);
    oSave.push({
      'name': fieldName,
      'value': fieldValue
    });
  }
  //console.debug(oSave,JSON.stringify(oSave));
  setCookie(cookieName, JSON.stringify(oSave), exp);
  return JSON.stringify(oSave);
}


function debugForm(f) { //loop through all elements in a form and return them and their value in a string
  if (!f) return alert('Form not found to debug');
  var y = f.name + '\n';
  //alert(f.elements.length);
  for (i = 0; i < f.elements.length; i++) {
    if (f.elements[i].type == 'radio' || f.elements[i].type == 'checkbox') {
      if (f.elements[i].checked == true) //only show checked
      y += ('[' + f.elements[i].type + '] ' + f.elements[i].name + ' = ' + f.elements[i].value + '\n')
    }
    else y += ('[' + f.elements[i].type + '] ' + f.elements[i].name + ' = ' + f.elements[i].value + '\n')
  }
  return y + '---------------------------------->length = ' + y.length;
}



function getSingleInputValue(obj, use_default, delimiter) {
  switch (obj.type) {
  case 'radio':
  case 'checkbox':
    return (((use_default) ? obj.defaultChecked : obj.checked) ? obj.value : null);
  case 'text':
  case 'hidden':
  case 'textarea':
    return (use_default) ? obj.defaultValue : obj.value;
  case 'password':
    return ((use_default) ? null : obj.value);
  case 'select-one':
    if (obj.options == null) {
      return null;
    }
    if (use_default) {
      var o = obj.options;
      for (var i = 0; i < o.length; i++) {
        if (o[i].defaultSelected) {
          return o[i].value;
        }
      }
      return o[0].value;
    }
    if (obj.selectedIndex < 0) {
      return null;
    }
    return (obj.options.length > 0) ? obj.options[obj.selectedIndex].value : null;
  case 'select-multiple':
    if (obj.options == null) {
      return null;
    }
    var values = new Array();
    for (var i = 0; i < obj.options.length; i++) {
      if ((use_default && obj.options[i].defaultSelected) || (!use_default && obj.options[i].selected)) {
        values[values.length] = obj.options[i].value;
      }
    }
    return (values.length == 0) ? null : commifyArray(values, delimiter);
  }
  alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
  return null;
}

function getSingleInputText(obj, use_default, delimiter) {
  switch (obj.type) {
  case 'radio':
  case 'checkbox':
    return "";
  case 'text':
  case 'hidden':
  case 'textarea':
    return (use_default) ? obj.defaultValue : obj.value;
  case 'password':
    return ((use_default) ? null : obj.value);
  case 'select-one':
    if (obj.options == null) {
      return null;
    }
    if (use_default) {
      var o = obj.options;
      for (var i = 0; i < o.length; i++) {
        if (o[i].defaultSelected) {
          return o[i].text;
        }
      }
      return o[0].text;
    }
    if (obj.selectedIndex < 0) {
      return null;
    }
    return (obj.options.length > 0) ? obj.options[obj.selectedIndex].text : null;
  case 'select-multiple':
    if (obj.options == null) {
      return null;
    }
    var values = new Array();
    for (var i = 0; i < obj.options.length; i++) {
      if ((use_default && obj.options[i].defaultSelected) || (!use_default && obj.options[i].selected)) {
        values[values.length] = obj.options[i].text;
      }
    }
    return (values.length == 0) ? null : commifyArray(values, delimiter);
  }
  alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
  return null;
}

function setSingleInputValue(obj, value) {
  switch (obj.type) {
  case 'radio':
  case 'checkbox':
    if (obj.value == value) {
      obj.checked = true;
      return true;
    }
    else {
      obj.checked = false;
      return false;
    }
  case 'text':
  case 'hidden':
  case 'textarea':
  case 'password':
    obj.value = value;
    return true;
  case 'select-one':
  case 'select-multiple':
    var o = obj.options;
    for (var i = 0; i < o.length; i++) {
      if (o[i].value == value) {
        o[i].selected = true;
      }
      else {
        o[i].selected = false;
      }
    }
    return true;
  }
  alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
  return false;
}

function getInputValue(obj, delimiter) {
  var use_default = (arguments.length > 2) ? arguments[2] : false;
  if (isArray(obj) && (typeof(obj.type) == "undefined")) {
    var values = new Array();
    for (var i = 0; i < obj.length; i++) {
      var v = getSingleInputValue(obj[i], use_default, delimiter);
      if (v != null) {
        values[values.length] = v;
      }
    }
    return commifyArray(values, delimiter);
  }
  return getSingleInputValue(obj, use_default, delimiter);
}

function getInputText(obj, delimiter) {
  var use_default = (arguments.length > 2) ? arguments[2] : false;
  if (isArray(obj) && (typeof(obj.type) == "undefined")) {
    var values = new Array();
    for (var i = 0; i < obj.length; i++) {
      var v = getSingleInputText(obj[i], use_default, delimiter);
      if (v != null) {
        values[values.length] = v;
      }
    }
    return commifyArray(values, delimiter);
  }
  return getSingleInputText(obj, use_default, delimiter);
}

function getInputDefaultValue(obj, delimiter) {
  return getInputValue(obj, delimiter, true);
}

function isChanged(obj) {
  return (getInputValue(obj) != getInputDefaultValue(obj));
}

function setInputValue(obj, value) {
  var use_default = (arguments.length > 1) ? arguments[1] : false;
  if (isArray(obj) && (typeof(obj.type) == "undefined")) {
    for (var i = 0; i < obj.length; i++) {
      setSingleInputValue(obj[i], value);
    }
  }
  else {
    setSingleInputValue(obj, value);
  }
}

function isArray(obj) {
  return (typeof(obj.length) == "undefined") ? false : true;
}

var getElementsByClassName = function (b, a, c) {
  if (document.getElementsByClassName) {
    getElementsByClassName = function (j, m, h) {
      h = h || document;
      var d = h.getElementsByClassName(j),
          l = (m) ? new RegExp("\\b" + m + "\\b", "i") : null,
          e = [],
          g;
      for (var f = 0, k = d.length; f < k; f += 1) {
        g = d[f];
        if (!l || l.test(g.nodeName)) {
          e.push(g)
        }
      }
      return e
    }
  }
  else {
    if (document.evaluate) {
      getElementsByClassName = function (o, r, n) {
        r = r || "*";
        n = n || document;
        var g = o.split(" "),
            p = "",
            l = "http://www.w3.org/1999/xhtml",
            q = (document.documentElement.namespaceURI === l) ? l : null,
            h = [],
            d, f;
        for (var i = 0, k = g.length; i < k; i += 1) {
          p += "[contains(concat(' ', @class, ' '), ' " + g[i] + " ')]"
        }
        try {
          d = document.evaluate(".//" + r + p, n, q, 0, null)
        }
        catch (m) {
          d = document.evaluate(".//" + r + p, n, null, 0, null)
        }
        while ((f = d.iterateNext())) {
          h.push(f)
        }
        return h
      }
    }
    else {
      getElementsByClassName = function (r, u, q) {
        u = u || "*";
        q = q || document;
        var h = r.split(" "),
            t = [],
            d = (u === "*" && q.all) ? q.all : q.getElementsByTagName(u),
            p, j = [],
            o;
        for (var i = 0, e = h.length; i < e; i += 1) {
          t.push(new RegExp("(^|\\s)" + h[i] + "(\\s|$)"))
        }
        for (var g = 0, s = d.length; g < s; g += 1) {
          p = d[g];
          o = false;
          for (var f = 0, n = t.length; f < n; f += 1) {
            o = t[f].test(p.className);
            if (!o) {
              break
            }
          }
          if (o) {
            j.push(p)
          }
        }
        return j
      }
    }
  }
  return getElementsByClassName(b, a, c)
};




if (!this.JSON) {
  this.JSON = {}
}(function () {
  function f(n) {
    return n < 10 ? "0" + n : n
  }
  if (typeof Date.prototype.toJSON !== "function") {
    Date.prototype.toJSON = function (key) {
      return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null
    };
    String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) {
      return this.valueOf()
    }
  }
  var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      gap, indent, meta = {
      "\b": "\\b",
      "\t": "\\t",
      "\n": "\\n",
      "\f": "\\f",
      "\r": "\\r",
      '"': '\\"',
      "\\": "\\\\"
      },
      rep;

  function quote(string) {
    escapable.lastIndex = 0;
    return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
      var c = meta[a];
      return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
    }) + '"' : '"' + string + '"'
  }

  function str(key, holder) {
    var i, k, v, length, mind = gap,
        partial, value = holder[key];
    if (value && typeof value === "object" && typeof value.toJSON === "function") {
      value = value.toJSON(key)
    }
    if (typeof rep === "function") {
      value = rep.call(holder, key, value)
    }
    switch (typeof value) {
    case "string":
      return quote(value);
    case "number":
      return isFinite(value) ? String(value) : "null";
    case "boolean":
    case "null":
      return String(value);
    case "object":
      if (!value) {
        return "null"
      }
      gap += indent;
      partial = [];
      if (Object.prototype.toString.apply(value) === "[object Array]") {
        length = value.length;
        for (i = 0; i < length; i += 1) {
          partial[i] = str(i, value) || "null"
        }
        v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]";
        gap = mind;
        return v
      }
      if (rep && typeof rep === "object") {
        length = rep.length;
        for (i = 0; i < length; i += 1) {
          k = rep[i];
          if (typeof k === "string") {
            v = str(k, value);
            if (v) {
              partial.push(quote(k) + (gap ? ": " : ":") + v)
            }
          }
        }
      }
      else {
        for (k in value) {
          if (Object.hasOwnProperty.call(value, k)) {
            v = str(k, value);
            if (v) {
              partial.push(quote(k) + (gap ? ": " : ":") + v)
            }
          }
        }
      }
      v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}";
      gap = mind;
      return v
    }
  }
  if (typeof JSON.stringify !== "function") {
    JSON.stringify = function (value, replacer, space) {
      var i;
      gap = "";
      indent = "";
      if (typeof space === "number") {
        for (i = 0; i < space; i += 1) {
          indent += " "
        }
      }
      else {
        if (typeof space === "string") {
          indent = space
        }
      }
      rep = replacer;
      if (replacer && typeof replacer !== "function" && (typeof replacer !== "object" || typeof replacer.length !== "number")) {
        throw new Error("JSON.stringify")
      }
      return str("", {
        "": value
      })
    }
  }
  if (typeof JSON.parse !== "function") {
    JSON.parse = function (text, reviver) {
      var j;

      function walk(holder, key) {
        var k, v, value = holder[key];
        if (value && typeof value === "object") {
          for (k in value) {
            if (Object.hasOwnProperty.call(value, k)) {
              v = walk(value, k);
              if (v !== undefined) {
                value[k] = v
              }
              else {
                delete value[k]
              }
            }
          }
        }
        return reviver.call(holder, key, value)
      }
      text = String(text);
      cx.lastIndex = 0;
      if (cx.test(text)) {
        text = text.replace(cx, function (a) {
          return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
        })
      }
      if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
        j = eval("(" + text + ")");
        return typeof reviver === "function" ? walk({
          "": j
        }, "") : j
      }
      throw new SyntaxError("JSON.parse")
    }
  }
}());






			/*
			 * LOAD FORM FIELD SELECTIONS FROM SAVED COOKIES
			 * Retrieve form elements from cookie and split into array.
			 */
			function loadSelections(frm) {
			  var e,z,x,cookieName,fieldArray,fieldValues,fieldValue,field,formname = frm.id;
			  cookieName  = formname;
			  fieldValues = getCookie(cookieName);
			  if (!fieldValues) return;
			  oSaved = JSON.parse(fieldValues);
			  if (!oSaved) return;
			  //console.debug('cookie loading... ',fieldValues,oSaved);
			  var n = oSaved.length;
			  for (i = 0; i < n; i++) {
				field = frm[oSaved[i].name];
				if (!field || field.skip == 'true') continue;
				setInputValue(field,oSaved[i].value);
				//console.debug('loaded ',field,oSaved[i].value);
			  }
			}



			function addSelectOption(selectObj, text, value, isSelected){
			    if (selectObj != null && selectObj.options != null) {
			        //console.debug(selectObj.options.length);
					selectObj.options[selectObj.options.length] = new Option(text, value, false, isSelected);
					//console.debug(selectObj.options[(selectObj.length-1)]);
					return selectObj.length-1;
			    }
			}


			
			function setCookie(name, value, expires, path, domain, secure) {
			  var curCookie = name + "=" + escape(value) +((expires) ? "; expires=" + expires.toGMTString() : "") +((path) ? "; path=" + path : "") +((domain) ? "; domain=" + domain : "") +((secure) ? "; secure" : "");
			  document.cookie = curCookie;
			}
			// name - name of the desired cookie
			// * return string containing value of specified cookie or null if cookie does not exist
			function getCookie(name) {
			  var dc = document.cookie;
			  var prefix = name + "=";
			  var begin = dc.indexOf("; " + prefix);
			  if (begin == -1) {
			    begin = dc.indexOf(prefix);
			    if (begin != 0) return null;
			  } else begin += 2;
			  var end = document.cookie.indexOf(";", begin);
			  if (end == -1) end = dc.length;
			  return unescape(dc.substring(begin + prefix.length, end));
			}
			// name - name of the cookie
			// [path] - path of the cookie (must be same as path used to create cookie)
			// [domain] - domain of the cookie (must be same as domain used to create cookie)
			// * path and domain default if assigned null or omitted if no explicit argument proceeds
			function deleteCookie(name, path, domain) {
			  if (getCookie(name)) {
			    document.cookie = name + "=" + ((path) ? "; path=" + path : "") +((domain) ? "; domain=" + domain : "") +"; expires=Thu, 01-Jan-70 00:00:01 GMT";
			  }
			}
			function vipObjectToString(o) {		//convert object containing name:value pairs into a string of name:value pairs
				var str = '';
				var name, val;
				for (name in o) {
					val = o[name];
					str += ', "'+ name +'": "'+ val +'"';
				}
				if (str.length > 0)
					str = str.substr(2);		//strip leading comma
				return str;
			}
			if(!this.JSON){this.JSON={}}(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}());




/**
 * old XMLHTTP script used for syncronous requests (Ext doesn't support this)
 * source: http://www.javascriptkit.com/jsref/ajax.shtml
 * example:	var myrequest = new mdcAjaxRequest();
 *			myrequest.open("GET", "result.php?id=george&age=30", true);		//true=async, false=sync
 */

function mdcAjaxRequest() {
  var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE
  if (window.ActiveXObject) { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
    for (var i = 0; i < activexmodes.length; i++) {
      try {
        return new ActiveXObject(activexmodes[i]);
      }
      catch (e) {
        //suppress error
      }
    }
  }
  else if (window.XMLHttpRequest) // if Mozilla, Safari etc
  return new XMLHttpRequest();
  else return false;
}
