// 2006 © Corvise AS and Business to Web AS, all rights reserved j(at)b2w.com 
// microCore 041006
// -----------------------------------------------------------------------------
// Common Core
// -----------------------------------------------------------------------------

var Crvs = { 
	Sys:{
		XHR:{},
		WebDav:{},
		ServTech:{},
		GUI:{},
		Dom:{}
	},
	Client:{},
	GUI:{
		defaults:{}
	},
	Lib:{
		dom:{},
		xBrowser:{},
		inputCtrl:{},
		color:{},
		regExp:{},
		ide:{}
	},
	ss:{lib:{}}
};
var b2w = {	
};

//var _clientConfig = function(){}; // client configuration
var _sys = Crvs.Sys;
var _dom = Crvs.Lib.dom; // universal dom methods
var _x = Crvs.Lib.xBrowser; // cross browser library
var _in = Crvs.Lib.inputCtrl; // input check library
var _color = Crvs.Lib.color; // color function library
var _rx = Crvs.Lib.regExp; // RegExp functions
var _ide = Crvs.Lib.ide; // development
var _def= Crvs.GUI.defaults; // default gui setup

//_dom.errata = function(msg){window.status=arguments.caller+':'+msg}
_dom.errata = function(msg){alert(arguments.caller+'\n'+msg)}

_sys.mod="client";
_sys.initialTime=(new Date()).getTime();
_sys.isFunction=function(a){ return typeof a == 'function' };
_sys.isObject=function(a){ return (a && typeof a == 'object') };
_sys.isArray=function(a){ return _sys.isObject(a) && a.constructor == Array };
_sys.isString=function(a){ return typeof a == 'string' };
_sys.isNumber=function(a){ return typeof a == 'number' };
_sys.stringIsNumber=function(a){ if(_sys.isArray(a))return false;var rx = new RegExp("^\\d+\\.?\\d*$");return rx.test(a) }
_sys.isInteger=function(a){ return (typeof a == 'number' && a % 1 == 0) };
_sys.isSet=function(a){return !(typeof(a) == "undefined" || String(a) == "undefined" || a == null || a == false || a == "")};

_sys.notPrototypeOnly = function(o){
	for(var p in o){if(p!='prototype'){return true}}
	return false;
}
_sys.isObjEmpty = function (obj) {
    if (!obj) {
        return true;
    }
    var counter = 0;
    for (var i in obj) {
        ++counter;
        break;
    }
    return counter > 0 ? false : true;
}
_sys.noOfMembers=function(a){var i=0; for(var m in a){i++}return i };
_sys.renderTags = function(o){ return String(o).replace(/</g,"&lt;").replace(/>/g,"&gt;") }

_sys.objectType =function(o){
	try{
		var c=o.constructor;
		var ot = c==Number?'Number':
			_rx.isDateString(o)?'DateString':
			c==String?'String':
			c==Boolean?'Boolean':
			c==Array?'Array':
			c==Function?'Function':
			c==RegExp?'RegExp':
			c==Date?'Date':
			c==Error?'Error':
			_sys.noOfMembers(o)?'MemberObject':
			c==Object?'Object':
			c;
		return ot;
	}catch(e){return 'TypeError'}
}

_sys.renderByObjectName=function(oName){
	try{
		eval("o="+oName);
		oName=(oName.indexOf(".")==-1)?"var "+oName:oName;
		return oName +" = "+_sys.renderObject(o);
	}catch(e){}
}

_sys.renderObject=function(o,pad){
	pad=(pad)?pad:"";
	var c=_sys.objectType(o);
	o=(c=="String")?"'"+_sys.escFnutt(o)+"'":
		(c=="Array"||c=="MemberObject")?_sys.renderMemberObject(o,pad,c):
		(c.indexOf("Date")!=-1)?_sys.renderDate(o):
		String(o);
	return o;
}

_sys.renderMemberObject = function (o, pad, typ) {
    pad = pad + "\t";
    if (typ == "MemberObject") {
        var out = "{\r";
        for (var m in o) {
            out += pad + m + ":" + _sys.renderObject(o[m], pad) + ",\r";
        }
        out = out.replace(/^\t/, "").replace(/,\r$/, "\r" + pad.replace(/\t$/, "") + "}");
    } else {
        if (typ == "Array") {
            var out = "[\r";
            for (var m = 0; m < o.length; m++) {
                out += pad + _sys.renderObject(o[m], pad) + ",\r";
            }
            out = out.replace(/^\t/, "").replace(/,\r$/, "\r" + pad.replace(/\t$/, "") + "]");
        }
    }
    return out;
}
_sys.renderArray = function(o){
	var out='[';
	for(var m=0;m< o.length;m++){
		out +=  _sys.renderObject(o[m]) +", ";
	}
	return out.replace(/, $/,"]");
}
_sys.renderDate = function(o){
	var d = _rx.CETstring2UTCdate(o);
	if(!d&&_rx.isDateString(o)){
		d = new Date(o);
	}
	if(d&&d.constructor==Date) return "new Date(\""+d.toUTCString()+"\")";
	return "invalid date";
}
_sys.escFnutt=function(t){
	return t.replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r");
}


// Norwegian social sec no
_in.SocSecNo_no=function(s){
	this.error=false;this.dNo=false;
	this.number=s=s.replace(/\s/g,'').replace(/\./g,'').replace(/-/g,'');
	this.dNo=(s.substring(0,1)>3)?true:false;
	if(!/^\d{11}$/.test(s)){this.error=this.msg[0];return this};
	this.ctrl=this.ps(s,this.wgth[0])+''+this.ps(s,this.wgth[1]);
	if(this.ctrl!=s.substring(9,11)){this.error=this.msg[1];return this};
	this.female=(s.substring(8,9)%2)?false:true;
	var bY=s.substring(4,6);if(this.dNo)bY-=3;
	this.ino=s.substring(6,9);
	this.dateObj=d=new Date((this.getHndrds()*100+bY*1),s.substring(2,4),s.substring(0,2));
	this.age=parseInt((new Date()-d)/31556925974);
	return this
}
_in.SocSecNo_no.prototype.msg=['not11digits','notValid'];
_in.SocSecNo_no.prototype.wgth=[[3,7,6,1,8,9,4,5,2],[5,4,3,2,7,6,5,4,3,2]];
_in.SocSecNo_no.prototype.ps=function(s,wght){var prdsm=0,cDig;for (var i=0;i< wght.length;i++){prdsm+=s.substring(i,i+1)*wght[i];}cDig=11-prdsm % 11;return (cDig==11)?0:cDig;};
_in.SocSecNo_no.prototype.getHndrds=function(){if(this.ino<500){return 19}else if(this.ino>499&&ino<750&&bY>54){return 18}else if(this.ino>899&&bY>39){return 19;}else{return 20}};
_in.SocSecNo_no.prototype.inspect=function(o){for (var p in this){if(/^[er|n|f|d|a|c].*/.test(p))o+=p+': '+this[p]+'\n';}return o;};
_in.isSocSecNo_no = function(s){ return !new _in.SocSecNo_no(s).error };

// LUHN credit card number checker
_in.isLuhnCC = function(cno) {
  var cclength=cno.length;
  var parity=cclength % 2;
  var sum=0;
  for (i=0; i < cclength; i++) {
    var ccdigit=cno.charAt(i);
    if (i % 2 == parity) ccdigit=ccdigit * 2;
    if (ccdigit > 9) ccdigit=ccdigit - 9;
    sum = sum + parseInt(ccdigit);
  }
  return(sum % 10 == 0);
}



_ide.displayObject=function(oName){var out= _sys.renderTags(_sys.renderByObjectName(oName)) ; if (out)out=out.replace(/\t/g, "  ");return "<pre>" + out+ "</pre>"}
_ide.compressCode=function(s){var out="";var rx = new RegExp(" ?(=|==|\\+|\\,|<|>|<>|!=|:|;|&|&&|\\}|\\{|\\(|\\)) ?", "g");s = s.replace(/\n\s*/g, "\n").split("\n");for(var i=0;i<s.length;i++){if (/["|\/][^"]* [^"]*["|\/]/.test(s[i])) {out+=s[i];}else{out+=s[i].replace(rx,"$1");}}return out;}

_color.dec2Hex=function(num) {
 if(num==null) return "00";
 num=parseInt(num);
 if(num==0||isNaN(num)) return "00";
 num=Math.max(0,num); num=Math.min(num,255); num=Math.round(num);
 var hexStr="0123456789ABCDEF".charAt((num-num%16)/16)
      + "0123456789ABCDEF".charAt(num%16)
 return hexStr.toLowerCase();
};
_color.hex2dec=function(hex){
  var num=parseInt(hex,16);
  if(isNaN(num)) throw new _sys.WrongArgumentException("_color.hex2int:1");
  return num;
};
_color.rgb2hex=function(clr){
  if(!clr.r||!clr.g||!clr.b) throw new _sys.WrongArgumentException("_color.rgb2hex:1");
  return this.dec2Hex(clr.r)+this.dec2Hex(clr.g)+this.dec2Hex(clr.b);
};
_color.hex2rgb=function(hex){
  if(!this.isStr(hex)||!(hex.length==6||(hex.length==7&&hex.charAt(0)=='#'))) throw new _sys.WrongArgumentException("_color.hex2rgb:1");
  if(hex.length==7) hex=hex.substring(1,7);
  return {r:this.hex2dec(hex.substring(0,2)),g:this.hex2dec(hex.substring(2,4)),b:this.hex2dec(hex.substring(4,7))};
};

// remove double \\ for .asp
_rx.escRX=function(ptrn){if(!arguments.callee.escRX){var spChrs = ["^","$","/",".","*","+","?","|","(",")","[","]","{","}","\\"];arguments.callee.escRX = new RegExp("(\\" + spChrs.join("|\\") + ")","g");}return ptrn.replace(arguments.callee.escRX,"\\$1");}
_rx.isDateString=function(o){
	try{
		var rx=new RegExp("^\\w{3}\\s\\w{3}\\s\\d{1,2}\\s\\S{4}\\s\\S{8}\\sGMT\\+\\d{4}","");if(rx.test(o))return true;//FireFox Safari Netscape
		rx=new RegExp("^\\w{3}\\s\\w{3}\\s\\d{1,2}\\s\\S{8}\\s[UTC|CET]","");if(rx.test(o))return true;// Explorer, asp
		rx=new RegExp("^\\w{3},?\\s\\d{1,2}\\w{3}\\s\\d{4}\\s\\S{8}\\s[UTC|CET]","");if(rx.test(o))return true;// Thu, 23 Nov 2006 12:30:42 UTC
		rx=new RexExp("^\\w{3}\\s\\w{3}\\s\\d{1,2}\\s\\S{8}\\s\\w{3}\\s\\d{4}","");if(rx.test(o))return true;// asp sql
		rx=new RexExp("^\\w{3}\\s\\w{3}\\s([1-9]|1[0-2])","");if(rx.test(o))return true;// wide
		return false
	}catch(e){return false}
}
_rx.trimEnds = function( a ) {
    var rx = new RegExp("^(\\s*)(.*)(\\b\\s*$)"); 
    if(rx.test(a)) { //remove leading and trailing whitespace characters
        a = a.replace(rx, '$2');
    }
    return a;
}
_rx.CETstring2UTCdate=function(o){//Thu Nov 23 14:33:59 CET 2006
	var rx=new RegExp("^(\\w{3}),?\\s(\\w{3})\\s(\\d{1,2})\\s(\\d{2}:\\d{2}:\\d{2})\\sCET\\s(\\d{4})$","");
	if(!rx.test(o)) return false;
	var d = new Date(RegExp.$1+' '+RegExp.$3+' '+RegExp.$2+' '+RegExp.$5+' '+RegExp.$4+" UTC");
	return new Date(d.valueOf()-(1000*60*60));
}

// end common core

// -----------------------------------------------------------------------------
// Client side Core
// -----------------------------------------------------------------------------

	
//--- xbrowser  ---------------------------------------------------------
var _ua = navigator.userAgent.toLowerCase();
_x.is_IE = ((_ua.indexOf("msie") != -1) && (_ua.indexOf("opera") == -1) && (_ua.indexOf("webtv") == -1));
_x.is_Gecko =(_ua.indexOf("gecko") != -1&&(_ua.indexOf("safari") <0));
_x.is_Safari = (_ua.indexOf("safari") != -1);
_x.is_Opera = (_ua.indexOf("opera") != -1);

_x.getWinSize=function(dim) {
	var wh,ww;
	if (self.innerHeight){ // all except Explorer
		wh=self.innerHeight;ww=self.innerWidth;
	}else if (document.documentElement && document.documentElement.clientHeight){// Explorer 6 Strict Mode
		wh = document.documentElement.clientHeight;ww=document.documentElement.clientWidth;
	}else if (document.body){// other Explorers
		 wh  = document.body.clientHeight; ww= document.body.clientWidth;
	}
	if(dim=='hw')return {h:wh,w:ww};
	return (dim=='h')?wh:ww;
}

_x.getComputedStyle=function(oEle,sProp,_int){
  var s, p = 'undefined';
  var dv = document.defaultView;
  if(dv && dv.getComputedStyle){ //getComputedStyle returns the actual value (not available in IE)
	s = dv.getComputedStyle(oEle,'');
	if (s) p = s.getPropertyValue(sProp);
  }
  else if(oEle.currentStyle) { //currentStyle returns the cascaded value (not available in W3C DOM) 
	// convert css property name to object property name for IE
	var a = sProp.split('-');
	sProp = a[0];
	for (var i=1; i<a.length; ++i) {
	  c = a[i].charAt(0);
	  sProp += a[i].replace(c, c.toUpperCase());
	}
	p = oEle.currentStyle[sProp];
  }
  else return null;
  return _int?(parseInt(p)||0):p;
};

_x.getXMLHttpReq=function(){
	if(_x.is_IE){
		return new ActiveXObject("MSXML2.XMLHTTP");
	}else if(_x.is_Gecko||_x.is_Safari||_x.is_Opera){
		return new XMLHttpRequest();
	}//else if(_x.is_Opera){
		//var _req=new OperaXMLHttpRequest();
		//return _req;
	//}
}



// === _d second pass dom methods ============================================
//--- dom methods  ---------------------------------------------------------

function _(nd) { // get node
	if (typeof nd == "string") {
		return document.getElementById(nd);
	} else {
		if (nd && nd.nodeType) {
			return nd;
		} else {
			return document;
		}
	}
}
_dom.getNode=_dom._=_;

function __(o){//node collection
// opera no Window	var pnd=(!o.pnd||o.pnd.constructor==Window)?document:(typeof o.pnd=="string")?document.getElementById(o.pnd):o.pnd;
	var pnd=(!o.pnd)?document:(typeof o.pnd=="string")?document.getElementById(o.pnd):o.pnd;
	var cn=(!o.cn)?/./:(o.cn.constructor==RegExp)?o.cn:new RegExp("^"+o.cn+"$");
	var tn=(o.tn)?o.tn:"*";
	var ch=(o.ch)?o.ch:false;	
	// main
	var a=pnd.getElementsByTagName(tn);
	var c=[],cnd;
	for(var i=0;i<a.length;i++){
		if(cn.test(a[i].className)){c[c.length]=a[i]}
		if(ch&&a[i].hasChildNodes()){
			cnd=a[i].childNodes;
			for(var child=0;child<cnd.length;child++){
				c[c.length]=cnd.item(child)
			}
		}
	}
	return c;
}
_dom.getNodeCollection=_dom.__=__;

// attach events

_dom.addEvent = function(ndColl,ev,handler){
    ev = ev.split(',');
	for (var e=0;e< ev.length;e++){
		for (var i=0;i< ndColl.length;i++){
			ndColl[i][ev[e]] = handler;
		}
	}
}

_dom.nextElement = function(nd){if(nd.nextSibling){nd=nd.nextSibling;}while(nd.nextSibling&&nd.nodeType!=1){nd=nd.nextSibling;}return nd;}

_dom.getText = function(ndColl,ws) {
	var lf=(!ws)?"\n":"";// ws false excludes whitespace adds line feed
	return extTxt(coll,ws);	
	function extTxt(nd,ws){
		var a=nd.childNodes,c='';
		for(var i=0;i<a.length;i++){
			if(a[i].nodeType==3&&(ws||/\S/.test(a[i].nodeValue))){
				c+=a[i].nodeValue;
			}
			else if(a[i].childNodes)c+=extTxt(a[i],ws)+lf;
		}
		return c;
	}
}
_dom.i = function (id) { return _(id).innerHTML }
_dom.f = function (id, f) { _(id).innerHTML = f }
_dom.fu = function (id, f) { _(id).innerHTML = unescape(f) }
_dom._f = function (id, f) { _(id).innerHTML += f }
_dom.f_ = function (id, f) { var n = _(id); n.innerHTML = f + n.innerHTML }
_dom.r = function (n, f, r, gi) { // replace
	if(!gi)gi= "gi"; //global, case
	var rx = new RegExp(f, gi);
	for (var i = 0; i < n.length; i++) {
		if(a[i].nodeType==3) n[i].innerHTML = n[i].innerHTML.replace(rx, r);
	}
}
_dom.m = function (nd, f, c) { // mark
	var rx;
	f=f.replace(/  /," ").split(" ");
	if(!c) c = "<span class=highlightSearch>";
	for (var j = 0; j < f.length; j++) {
		rx = new RegExp("(\\b"+f[j]+"\\b)","gi");
		nd.innerHTML = nd.innerHTML.replace(rx, c+"$1</span>");
	}
}
_dom.u = function (nd, c) { // unmark
	if(!c) c = "<span class=highlightSearch>";alert(nd.innerHTML);
		rx = new RegExp(c+"([^<]*)</span>","gi");
		nd.innerHTML = nd.innerHTML.replace(rx, "$1");
}
_dom.t = function (t) { return ___({tn:t})}
_dom.tav = function (id, t, att, val) { return ___({no:id,tn:t, att:att, attVal:val}) }
_dom.ti = function (t) { return ___({tn:t, io:true}) }
_dom.c = function (c) { return ___({cn:c}) }
_dom.ci = function (c) { return ___({cn:c, io:true}) }

_dom.setC = function (ndColl,cn) {
	if (ndColl) {
		var all = (_sys.isArray(ndColl)) ? ndColl : [ndColl];
		for (var i = 0; i < all.length; i++) {
			all[i].className = cn;
		}
	}
}
_dom.toglC = function (nd,altState) {
	try {
		if (!nd || nd.eventPhase) {
			nd = this;
		}
		if (!_sys.isInteger(altState) && altState != "reset") {
			altState = 1; 
		}
		var cNow, cAlt, rxd;
		var all = (nd.constructor == Array) ? nd : [nd];
		for (var i = 0; i < all.length; i++) {
			cNow = all[i].className;
			var rxd = new RegExp("^([^_]*)(_\\d|_)","");
			var rx = rxd.exec(cNow);
			if (rx) {
				if (altState == "reset") {
					cAlt = cNow.replace(rxd[2], "_0");
				} else {
					cAlt = (rx[2] == "_0") ? cNow.replace("_0", "_" + altState) : cNow.replace(rx[2], "_0");
				}
				all[i].className = cAlt;
			}
		}
	} catch (e) {
		_dom.errata(e);
	}
}
_dom.resetC=function (nd) {
	if(!nd)nd=document;
	_dom.toglC(nd, "reset");
}
_dom.moCss=function (nd,e,reset) {
		if (!e) { e = window.event };
		if (nd && nd.target) { e=nd; nd = nd.target };
		if (!nd) { nd = this };
		var cNow = nd.className;
		var rxd = new RegExp("^([^_]*)(_\\d|_)(_[^_]*)","i");
		var rx = rxd.exec(cNow);
		var rx3 = new RegExp(rx[3]+"$","");
		var cAlt = "";
		var eType = e.type;
		eType = e.type.replace("mouse", "_");
		if (eType == "_out") { eType = "_" }
		if (eType == "_up" && rx[2] == "_0") {
			cNow = cNow.replace(/_0/, "_1");
			cAlt = cNow.replace(rx3, "_over");
		} else {
			if (reset && eType == "_down" && rx[2] == "_0") {
				cAlt = cNow.replace(rx3, eType);
				var resets = __({pnd:nd.parentNode.parentNode, cn:rx[1]+"_1_"});
				if (resets.length)_dom.setC(resets, rx[1]+"_0_");
			} else if(rx){
				cAlt = cNow.replace(rx3, eType);
			} 
		}//nd.innerHTML=cAlt;
		nd.className = cAlt;
try {		} catch (e) {
		_dom.errata(e);
	}
}
_dom.mox=function (e){_dom.moCss(this,e,true)}
_dom.mo=function (e){_dom.moCss(this,e,false)}
_dom.maxZ= {index:130,id:''};
_dom.topZ = function(guiSelf,ele,_event){
	if(!ele||(ele.id && ele.id!=_dom.maxZ.id)){
		_dom.maxZ.index++;
		_dom.maxZ.id=(ele)?ele.id:'';
	}
if(_("lpad"))_dom.f("lpad",_dom.maxZ.id+":"+_dom.maxZ.index);
	return _dom.maxZ.index
};
_dom.maxIconZ= {index:1,id:''};
_dom.topIconZ = function(guiSelf,ele,_event){
	if(!ele||(ele.id && ele.id!=_dom.maxIconZ.id)){
		_dom.maxIconZ.index++;
		_dom.maxIconZ.id=(ele)?ele.id:'';
	}
// needs counter inside box? 
if(_("lpad"))_dom.f("lpad",_dom.maxIconZ.id+":"+_dom.maxIconZ.index);
	return _dom.maxIconZ.index
};

_dom.formatNode = function(rootNode,determin_function,process_function,parameterObject){
	var pChildren=rootNode.childNodes;
	for(var child=0;child<pChildren.length;child++){
	  	var node=pChildren.item(child);
    	if(node.hasChildNodes()){
    		_dom.formatNode(node,determin_function,process_function,parameterObject); 
    	}
    	if(parameterObject.thisObj){
    		if(determin_function.apply(parameterObject.thisObj,[node, parameterObject])){
    			process_function.apply(parameterObject.thisObj,[node,parameterObject]);
    		}
    	}else{
	    	if(determin_function(node, parameterObject)){// if true then process 
	    		process_function(node,parameterObject);
	    	}
  		}
  	}
}


