

window.undefined = window.undefined;


function JSVLFUNCDUMMY (){


}




JSVL =  {
    GETVERSION:function(){return "0.9.000";},
    APPCONF:{
        DOC:document,
        NAV:navigator,
        WIN:window
    },
    UI:{},
	
	
	
	
    CREATEDELEGATE :function(instance, method) {
        var f = function() {
            return method.apply(instance, arguments);
        }
        return f;
    },
    TYPEOF :function(v){
        var to = typeof v;
        return to;
    },
	TOSTRING : function(obj){
	
		return Object.prototype.toString.call(obj);
	
	},
	ISDEFINED :function(v){
	 return !JSVL.ISUNDEFINED(v);
	
	},
	
    ISUNDEFINED :function(v){
        return ( typeof v === 'undefined' ) ;
    },
    ISARRAY :function(v){
    	return  ( ( v ) && (JSVL.TOSTRING(v) === '[object Array]') ) ;
    },
    ISEMPTYARRAY :function(v){
    	if (!JSVL.ISARRAY(v)  ){
        	  return true;
        }
        if (v.length ){
            return  (v.length < 1);
        }
	   return false;
    },


    ISEMPTY :function(v, allowBlank){

        var ret = ( v === null )  ;
        if ( ! ret )
            ret = (v === undefined ) ;
        

        if ( ! ret )
            ret = (!allowBlank ? v === '' : false);

        return  ret;
    },
    ISNULLorUNDEF :function(v){
        return ( v === null || JSVL.ISUNDEFINED(v) ) ;
    },

    ISOBJECT :function(v){
        return ( !!v && JSVL.TOSTRING(v) === "[object Object]") ;
    },
    ISFUNCTION :function(v){
        return ( JSVL.TOSTRING(v) === "[object Function]")  ;
    },
    ISNUMBER :function(v){
        return  ( JSVL.TYPEOF(v) === 'number' && isFinite(v) ) ;
    },
    ISSTRING :function(v){
        return  (JSVL.TYPEOF(v) === 'string')  ;
    },

    ISBOOLEAN :function(v){
        return  (JSVL.TYPEOF(v) === 'boolean')  ;
    },
	ISPRIMITIVE : function(v){
            return JSVL.ISSTRING(v) || JSVL.ISNUMBER(v) || JSVL.ISBOOLEAN(v);
    },
    APPLY :function(o, c, defaults){
        if(defaults){
           JSVL.APPLY(o, defaults);
        }
        if(o && c && JSVL.ISOBJECT(c)){
            for(var p in c){
                o[p] = c[p];
            }
        }
        return o;
    },
    APPLYIF :function(o, c){
        if(o && c){
            for(var p in c){
                if( JSVL.ISUNDEFINED(o[p]) ){
                    o[p] = c[p];
                }
            }
        }
        return o;
    },
    OVERRIDE :function(origclass, overrides){
        if(overrides){
            var p = origclass.prototype;
            JSVL.APPLY( p , overrides);
            if(JSVL.SYSINFO.isIE && ( overrides.hasOwnProperty('toString') ) ){
                p.toString = overrides.toString;
            }
        }
    },
    ROUNDTO :function(number,decimalpositions)
    {
        var i = number * Math.pow(10,decimalpositions);
        i = Math.round(i);
        var res = i / Math.pow(10,decimalpositions);

        return res;
    },
    TRY:{

        these: function() {
            var returnValue;

            for (var i = 0, length = arguments.length; i < length; i++) {
                var lambda = arguments[i];
                try {
                    returnValue = lambda();
                    break;
                }
                catch (e)
                {

                }
            }
            return returnValue;
        }
    },
    TODEFVALUE :function (v, defaultValue){
        if (JSVL.ISEMPTY(v) )
        {
            return defaultValue;
        }
        return v;
    },
    TOLOWER :function(s){
        if ( s )
            return s.toLowerCase();
        else
            return "";
    },
    TOUPPER :function(s){
        if ( s )
            return s.toUpperCase();
        else
            return "";
    },
    TOARRAY :function (v){
        
        if ( JSVL.ISARRAY(v) )
        {

            return v;
        }
        else
        {
            if ( JSVL.ISEMPTY(v) )
            {
                return [];

            }
            else
            {

               return  [v];
            }
        }
        
    },
    FOREACH :function(config){


        config = config || {};
        var  array    = config.list   ;
        var  fn       = config.handler;
        var  scope    = config.scope  ;
        if(this.ISEMPTYARRAY(array, true)){
            return 0;
        }

        if(this.ISEMPTY(array, true)){
            return 0;
        }


        if( !this.ISARRAY(array)){
            array = [array];
        }

        var  len = array.length;
        for( var i = 0  ; i < len; i++){
            if(fn.call(scope || array[i], array[i], i, array) === false)
            {
                return i;
            }
        }
        return i;
    }
	
}

JSVL.SYSINFO = {

   
            
        UserAgent :null,
        checkUA : function(r){
            return r.test(JSVL.SYSINFO.UserAgent);
        },

        initialize :function(){
            var me = JSVL.SYSINFO;
            

            me.UserAgent=  JSVL.APPCONF.NAV.userAgent.toLowerCase();


            me.isStrict   = (JSVL.APPCONF.DOC.compatMode == "CSS1Compat") ;
            me.isOpera    =  me.checkUA(/opera/);
            me.isChrome   =  me.checkUA(/chrome/);
            me.isWebKit   =  me.checkUA(/webkit/);
            me.isSafari   =  !me.isChrome&&  me.checkUA(/safari/);
            me.isSafari2  =   me.isSafari&&  me.checkUA(/applewebkit\/4/); // unique to Safari 2
            me.isSafari3  =   me.isSafari&&  me.checkUA(/version\/3/);
            me.isSafari4  =   me.isSafari&&  me.checkUA(/version\/4/);
            me.isIE       =  !me.isOpera &&  me.checkUA(/msie/);
            me.isIE7      =   me.isIE    &&  me.checkUA(/msie 7/);
            me.isIE8      =   me.isIE    &&  me.checkUA(/msie 8/);
            me.isIE6      =   me.isIE    && !me.isIE7 && !me.isIE8;
            me.isGecko    =  !me.isWebKit&&  me.checkUA(/gecko/);
            me.isGecko2   =   me.isGecko &&  me.checkUA(/rv:1\.8/);
            me.isGecko3   =   me.isGecko &&  me.checkUA(/rv:1\.9/);
            me.isBorderBox=   me.isIE    && !me.isStrict;
            me.isWindows  =   me.checkUA(/windows|win32/);
            me.isMac      =   me.checkUA(/macintosh|mac os x/);
            me.isAir      =   me.checkUA(/adobeair/);
            me.isLinux    =   me.checkUA(/linux/);
            me.isSecure   = /^https/i.test(JSVL.APPCONF.WIN.location.protocol);
        }
   
};	


JSVL.STRING = {

    trim:function(s){
        s = s || "";
        var re = /^\s+|\s+$/g;
        return function(){ return s.replace(re, ""); };

    },
    rightPad : function (val, size, ch ) {
        var result = String(val);
        if(!ch) {
            ch = " ";
        }
        while (result.length < size) {
            result =  result +ch ;
        }
        return result;
    },

    leftPad : function (val, size, ch) {
        var result = String(val);
        if(!ch) {
            ch = " ";
        }
        while (result.length < size) {
            result = ch + result;
        }
        return result;
    }
};


(function (){

    JSVL.APPLY(String.prototype,{
        trim : function(){
            return JSVL.STRING.trim(this);
        },

        rightPad : function( size, ch){
            return JSVL.STRING.rightPad(this, size, ch);
        },

        leftPad : function( size, ch){
            return JSVL.STRING.leftPad(this, size, ch);
        }
    });
})();




JSVL.DATE = {

    getElapsed:function(dateStart , dateEnd){
        dateStart = (dateStart || new Date());
        dateEnd   = (dateEnd   || new Date());
        Math.abs(dateEnd.getTime()-dateStart.getTime());

    },
    getTEXTFORLOG:function( d   ){
        d = d || new Date();



        var Hh = String(d.getHours()        ).leftPad(2,"0");
        var Mm = String(d.getMinutes()      ).leftPad(2,"0");
        var Ss = String(d.getSeconds()      ).leftPad(2,"0");
        var mm = String(d.getMilliseconds() ).leftPad(4,"0");
        var yy = String(d.getYear()         ).leftPad(4,"0");
        var day= String(d.getDate()         ).leftPad(2,"0");
        var mon= String(d.getMonth()+1      ).leftPad(2,"0");


        var strDate = "["+ yy +"-"+ mon+"-"+day+" " + Hh+":"+ Mm +":"+ Ss +","+ mm+"] ";

        return  strDate ;


    }


};


(function (){
    JSVL.APPLY(Date.prototype,{
            getElapsed : function(date) {
                return JSVL.DATE.getElapsed(date,this);
            },
            getTEXTFORLOG: function() {

                return JSVL.DATE.getTEXTFORLOG(this);
            }
    });
})();

JSVL.HTML = {
    CONSTANTS:{
        getNEWLINE:function(){
            return '<br />';
        }
    }
};


JSVL.LOGGER = {

    _LOGLINES:null,
    LOGTEXT:null,

    clear:function(){

        JSVL.LOGGER._LOGLINES = null;
    },
    getMAXLINES:function(){
        return 500;
    },
    getLOGLINES:function(){
        if ( !JSVL.LOGGER._LOGLINES )
        {
            JSVL.LOGGER._LOGLINES = new Array();
        }

        return JSVL.LOGGER._LOGLINES;
    },
	addTraceText:function(msg,now){
		var lines = JSVL.LOGGER.getLOGLINES();
        if ( lines.length > JSVL.LOGGER.getMAXLINES()){
              lines.shift();
        }
		var msgTrace  = "";
		
		if ( JSVL.ISFUNCTION(msg) ){
			
			msgTrace = msg();
			
		}
		else
		{
			msgTrace  = String(msg);
		}
		
		
		now = now || new Date();
		var traceText = now.getTEXTFORLOG() + " " + msgTrace;
        lines.push(traceText);


		
            var ev ={
                     dateTime:now,
                     message:msg ,
                     traceText:traceText,
                     lines:lines
                    };
            JSVL.LOGGER.onTracedMessage(ev);

	},
    getLOGTEXT:function(lineSeparator){

        lineSeparator = lineSeparator ||JSVL.HTML.CONSTANTS.getNEWLINE();

        return JSVL.LOGGER.getLOGLINES().join(lineSeparator) ;
    },
    MINLEVELENABLED:100,
    TRACEMSG:function(msg,level){
        level = level || 100;
        if ( level < JSVL.LOGGER.MINLEVELENABLED)
        {
            return;
        }
       
		var now = new Date();
        var f = function(){
			JSVL.LOGGER.addTraceText(msg,now);
        }
        setTimeout(f,5);

    },
    onTracedMessage:function(ev){


    }

};
JSVL.GLOBALID = {
        sequenceID : -1,
        offsetID   :  0,

        createID:function( save ,sep,pref ){
            var newID = JSVL.GLOBALID.sequenceID;
            var offID = JSVL.GLOBALID.offsetID;
            if ( sep != ""){
            	sep  = sep || "-";
            }
            pref = pref || "";
            if (newID < Number.MAX_VALUE )
            {
                newID ++;
            }
            else
            {
                newID    =  0;
                offID ++;
            }

            if (save)
            {
                JSVL.GLOBALID.sequenceID =  newID;
                JSVL.GLOBALID.offsetID   =  offID;

            }
            return pref + offID + sep+ newID;
        }
    };



JSVL.getNewID = function(){
   return JSVL.GLOBALID.createID(true);
};


JSVL.DOM = {

        SEL :function (id) {
            var ele = JSVL.APPCONF.DOC.getElementById(id);
            return ele;
        },
        createSourceElement : function (typeName )    {
            var ele      = JSVL.APPCONF.DOC.createElement(  typeName );
            return ele;
        },
        appendToBody:function(element){
            JSVL.APPCONF.DOC.body.appendChild(element);
        },
        appendToDocumentHead:function( element ){
            JSVL.APPCONF.DOC.getElementsByTagName("head")[0].appendChild(element);
        },
        showElement:function(ele){
            ele.style.display = "block";


        },
        hideElement:function(ele){
            ele.style.display = "none";
        },
        toggleDisplayElement:function(ele){

            if (  ele.style.display != "none" ){
                JSVL.DOM.hideElement(ele);
            }
            else
            {
                JSVL.DOM.showElement(ele);
            }
        },


        createElementDIV: function ( )    {
            var ele      = JSVL.DOM.createSourceElement(  "DIV" );
            return ele;
        }

};





$SEL = function(id){
    return JSVL.DOM.SEL(id);
}






JSVL.XML =  {
    nodeToObject :function (node) {
        var obj = {};
        var childNodes = node.childNodes;
        var childNodesValid = 0 ;
        var attributes = node.attributes;
        obj.value = node.nodeValue;
        if ( childNodes  )
        {

            var mapNames = {};
            var childNode    = null;
            var nodeName     = null;
            var nodeValue    = null;
            var mapNamesCount = 0 ;
            var i = 0;
            for (  i = 0 ; i <  attributes.length ;i++)
            {
                childNode    = attributes[i];
                nodeName     = childNode.nodeName;
                nodeValue    = childNode.nodeValue;
                obj[nodeName]    = nodeValue;

                if (!mapNames[nodeName]   ){
                    mapNames[nodeName] = 0 ;
                }
                mapNamesCount = mapNames[nodeName] ;
                mapNamesCount   += 1;
                mapNames[nodeName]  = mapNamesCount;
                    
                        
            }
            for (  i = 0 ; i <  childNodes.length ;i++)
            {
                 childNode = childNodes[i];
                 nodeName = childNode.nodeName;
                 nodeValue = childNode.nodeValue;
                if ( nodeName != "#text"	)
                {

                    if (!mapNames[nodeName]   ){
                        mapNames[nodeName] = 0 ;
                    }
                    mapNamesCount = mapNames[nodeName] ;

                    if ( mapNamesCount < 1){
                        obj[nodeName] = JSVL.XML.nodeToObject(childNode);
                    }
                    else
                    {
                        var ar  = null;
                        if ( mapNamesCount > 1 ){
                            ar  = obj[nodeName];
                        }
                        else{
                            ar  =new Array(1);
                            ar[0] = obj[nodeName];
                            obj[nodeName] = ar;
                        }
                        var val = JSVL.XML.nodeToObject(childNode);
                        ar.push(val);
                    }
                    childNodesValid ++;
                    mapNamesCount   += 1;
                    mapNames[nodeName]  = mapNamesCount;
                }
                else
                {
                    obj.value =  childNode.nodeValue;
                }

            }
               


        }
        if ( childNodesValid < 1 ){

            return obj.value;
        }
        if ( !  obj.value){

            delete obj.value;
        }
        return obj;
    }

};

JSVL.MATRIX = {
	
	
};
	

