  var bindings= new Object;
  var  isIE=(navigator.appName.indexOf("Microsoft")!=-1)?1:0; 
  var  isOpera=(navigator.appName.indexOf("Opera")!=-1)?1:0; 

  // Explorer looks for tags without namespace
  var bindtag = (isIE?'bindtext':'bind:bindtext');
  var bindchildtag = (isIE?'bindchild':'bind:bindchild');
  
   function setDataBind() {
    var bel=document.getElementsByTagName(bindtag)
       for(var i=0;i < bel.length;i++)
       { 
             o= bel.item(i); 
 	     id = o.getAttribute('id');
	     if(o.getAttribute('iscomment')!=null)
 	     o.appendChild(document.createComment(  bindings[id])  );
	     else
	     o.appendChild(document.createTextNode(  bindings[id])  );
       }
   }

   function getData() {
     if(isOpera)
      var s=document.getElementsByTagName('plaintext').item(0).innerText;
     else
      var s=document.getElementsByTagName('plaintext').item(0).innerHTML;
     if(s!=''){
      arr = s.split('\n')
      for(var i in arr){
             if(arr[i].indexOf('|')!=-1){
      	       key=arr[i].substring(0,arr[i].indexOf('|'));
   	       bindings[key]= unescape(arr[i].substring( arr[i].indexOf('|')+1));
	     }
      }
     }
   }
   
   function  findBindedAttributes() {
       
       var bel=document.getElementsByTagName("*")
       for(var i=0;i < bel.length;i++)
       { 
             o= bel.item(i);
	     if( o.getAttribute('bindattr')!=null  ) 
	     {
	      attrs=o.getAttribute('bindattr').split('|');
	      for(var j=0;  j <  attrs.length;j++ ){
	         attr=attrs[j].substring(0,attrs[j].indexOf('='));
	         val=attrs[j].substring( attrs[j].indexOf('=')+1);
		  if(bindings[val]=='' || bindings[val]==null)
		    continue;
		//  alert(attr+" = "+val+o.tagName);
 
 		// Problem, should we block every iframe, embed request? 
		// Probably yes as it comes from an untrusted source.
		
		// test for href javascript
		 if( ((o.tagName=='A' && attr=='href') || attr=='background'|| attr=='src'|| attr=='code')){
		  
		  var p = new BindCheck.URLParser( bindings[val]);
		  proto = p.getProtocol();
		  
		  if(typeof p.isBadProto() == "boolean" &&  p.isBadProto() ) {
		    alert(bindings[val]+" has been identified as "+proto );
		    continue;
		  } else if(typeof p.isBadProto() == "string") { 
		   // if protocol is empty then the link is forced to be a relative link.
		     o[attr] =  p.isBadProto()
		     continue;
		  }
		 }else if(attr=='style'){
		    var st=new BindCheck.documentParser();
		    var isgoodStyle= st.styleParser(bindings[val])
		      if(  isgoodStyle===true ){ 
		      o[attr].cssText =  bindings[val]  ; }
		      else if(typeof isgoodStyle == "string"){  
		       o[attr].cssText = isgoodStyle;}
		     continue;
		 }
		 
		 o[attr]=bindings[val]; 
	      }
	     }

       }
   }

   function setEvents() {

      // Get the data declared inside <plaintext> tag
      getData()
      
      // bind data to every <bind:bindtext> tag
      setDataBind()
      
      // bind data to every attribute declared in bindattr attribute
      findBindedAttributes()

  } 
  
if (typeof addEventListener == "function")
      addEventListener("load", setEvents, false);
else if ( attachEvent)
     attachEvent("onload", setEvents);
