var FRMerrors = {
   "ssn": "Vänligen fyll i ditt personnummer korrekt (ÅÅMMDD-XXXX).",
   "zip": "Vänligen fyll i ditt postnummer korrekt (5 siffror ex. 12356).",
   "email": "Vänligen fyll i din E-postadress korrekt.",
   "nonempty": "Vänligen fyll i detta fält.",
   "checked": "Detta fält måste vara ikryssat."
}

// Register JS Properties.
function registerJS() {
   var prop_bearers = document.getElements("properties","");
   for(element in prop_bearers) {
      var em = prop_bearers[element];
      if(em.attributes && em.attributes["properties"]) {
		var attrib = em.attributes["properties"].value;
      
		var itemprop = attrib.split(",");

		for(var i = 0; i<itemprop.length; ++i) {
		   var _prop = itemprop[i];
		   var prop = _prop.indexOf("[")==-1?_prop:_prop.substring(0,_prop.indexOf("["));
		   var subitems = (_prop.indexOf("[")>-1?_prop.substring(_prop.indexOf("[")+1,_prop.length-1):"").split("|");
		   switch(prop) {
		      case "fade":
		         attachFade(em, subitems);
		         break;
		      case "valid":
		         attachFormValidity(em, subitems);
		         break;
		      case "requirevalidity":
		         registerValiditySettings(em);
		         break;
		      case "store":
				attachSessionStoring(em);
		   }
		}
	}
   }
}
addEvent(window, "load", registerJS);





// Save variable when changed

function attachSessionStoring(em) {
	var losefocus = function() {
		var nam = em.name;
		var val = em.value;
		if(em.type=="checkbox" && (!em.value || em.value=="on"))
			val = em.checked?"1":"";
		var url = "/_session.asp?var="+nam+"&val="+val;
		new Ajax.Request(url);
	}	
	addEvent(em, "blur", losefocus);
}


// Fade on "defaultValue"

function attachFade(em, tostr) {
   tostr = tostr[0];
   addClass(em, "dim");
   var fadeblur = function() {
      if(em.value=="") em.value=tostr;
      if(em.value!=tostr) {
         removeClass(em, "dim");
      } else addClass(em, "dim");
   }
   var fadefocus = function() {
      if(em.value==tostr) em.value = "";
   }
   
   addEvent(em, "blur", fadeblur);
   addEvent(em, "focus", fadefocus);
   if(em.value=="") em.value = tostr;
   fadeblur();
}



// Forms
function determineWarning(em, type) {
   var err = false;
   var val = "";
   var warning = "";
   
   if(type) {
   if(type.indexOf("(")>-1) {
	warning = type.substring(type.indexOf("(")+1,type.length-1);
	type = type.substring(0,type.indexOf("("));
   }
   }
   switch(type) {
      case "nonempty":
        if(em.value=="") {
           err = true;
        }
        break;
      case "zip":
        val = em.value.replace(/[^\d]/ig,"");
        if(val.length!=5)
           err = true;
        break;
      case "ssn":
        val = em.value.replace(/[^\d]/ig,"");
        if(val=="") { err = true; break; }
        if(calculateCheckDigit(val)!=val.substr(val.length-1))
          err = true;
        break;
      case "email":
        if(!verifyEmail(em.value))
          err = true;
        break;
      case "checked":
		if(!em.checked)
		  err = true;
		break;
   }
   
   if(!err && val!="") em.value=val;
   if(err) {
    return warning!=""?warning:FRMerrors[type];
   }
   return "";
}

function getWarning(em) {
   if(em.attributes) {
      var p = em.getAttribute("properties");
      if(p.indexOf("valid[")!=-1) {
         var vprop = p.substring(p.indexOf("valid[")+6,p.indexOf("]",p.indexOf("[valid"))).split("|");
         for(var i = 0; i < vprop.length; ++i) {	
            var err = determineWarning(em, vprop[i]);
            if(err!="") return err;
         }
      }
   }
   return "";
}

function attachFormValidity(em, variables) {
   em.__fv__title = em.title;
   var formblur = function() {
      if(variables.join(" ").indexOf("nonempty")==-1 && em.value=="") {
         valid_warning = "";
      } else {
      for(var i=0; i<variables.length; ++i) {
         valid = variables[i];
         valid_warning = determineWarning(em,valid);
         if(valid_warning!="") break;
      }
      }
      if(valid_warning!="") {
         addClass(em, "error");
         em.title = valid_warning;
      }  else {
         em.title = em.__fv__title;
         removeClass(em, "error");
      }
   }
   var formfocus = function() {
      //removeClass(em, "error");
   }
   
   addEvent(em, "blur", formblur);
   addEvent(em, "focus", formfocus);
}
function verifyEmail(e)
{
	return e.replace(/^.+@.+\..+$/,"")=="";
}

function calculateCheckDigit(num)
{
    var i, n, sum = 0, l;
    
    num = num.toString();
    l = num.length;
    if(l==12) {num=num.substring(2); l-=2; }
    if(l==10) l--;
    for(i = l - 1; i >= 0; i--)
    {
        n = parseInt(num.charAt(i)) * (2 - ((l + 3 - i) % 2));
        sum += parseInt(Math.floor(n / 10) + (n % 10));
	}
	return (10 - (sum % 10)) % 10;
}

function registerValiditySettings(em) {
   var formsubmit = function() {
      for(var i=0; i<em.elements.length; ++i) {
         var formem = em.elements[i];
         if(formem.attributes["properties"]) {
			var err = getWarning(formem);
			if(err!="") {
				addClass(formem, "error");
	            alert(err);
				formem.focus();
				return false;
			}
		}
      }
      return true;
   }
   addEvent(em, "submit", formsubmit);
}



	function getXCoord(element) {
		var left = 0;
		if(!element.offsetParent) return element.x;
		else while(element.offsetParent) {
			left += element.offsetLeft;
			element = element.offsetParent;
		}
		return left;
	}
	function getYCoord(element) {
		var top = 0;
		if(!element.offsetParent) return element.y;
		else while(element.offsetParent) {
			top += element.offsetTop;
			element = element.offsetParent;
		}
		return top;
	}
	function ElementAt(element) {
		var coord = new Object();
		coord.x0 = getXCoord(element);
		coord.y0 = getYCoord(element);
		coord.x1 = coord.x0+element.offsetWidth;
		coord.y1 = coord.y0+element.offsetHeight;
		coord.width = element.offsetWidth;
		coord.height = element.offsetHeight;
		coord.em = element;
		return coord;
	}
	function moveEm(element,posobj) {
		element.style.position = "absolute";
		element.style.left = String(posobj.x0 + "px");
		element.style.top = String(posobj.y0 + "px");
	}













function getElementsColl(collection, sattrib, svalue) {
   var cem;
   var coll = new Array();
   var seek = new RegExp("(^|\\s)" + svalue + "(\\s|$)"); // borrowed from Robert Nyman.
   for(var i=0; i<collection.length; ++i) {
      cem = collection[i];
      if(cem.attributes && cem.attributes[sattrib]) {
         if(svalue=="") {
            coll.push(cem);
         } else
         if(seek.test(cem.getAttribute(sattrib))) {
            coll.push(cem); 
         }
      }
   }
   return coll;
}
function getElements(parent, sattrib, svalue) {
   return getElementsColl(parent.getElementsByTagName("*"),sattrib,svalue);
}
document.getElements = function(sattrib, svalue) {
   return getElements(this,sattrib,svalue);
}
function addEvent(obj, evType, fn){
	if(obj.addEventListener){
		obj.addEventListener(evType, fn, false); 
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent('on'+evType, fn);
		return r;
	} else {
		return false;
	}
}
function removeClass(em, clsname) {
   while(em.className.indexOf(clsname)>-1) em.className = em.className.replace(clsname,"");
}
function addClass(em, clsname) {
   if(em.className.indexOf(clsname)==-1) em.className += " "+clsname;
}
