/* ------------------------------------------
   SociaLink v 1.0.1 build 20
   SociaLink Library v 1.3
   Coded by Ronald Northrip
   April 2008
   
   All code here is Copyright Protected.
   Use or distribution without permission is
   strictly prohibited.
   Copyright 2008. All Rights Reserved.
   Ronald Northrip Software Incorporated
   http://www.rnsoft.com/
   ------------------------------------------ */
   

// Global Settings & Variables -----------------
sclDisplayBlockWidth=0
sclDisplayBlockHeight=0
sclLinkCount=0
sclTitleCaptureMaxLen=128
sclLinkPrefix="sclLink"
sclDisplayBlockID="sclLinksBlock"
sclLibraryName="sclSociaLinkLib"
sclPathPrefix="./"
sclDefaultWindowWidth="580"
sclDefaultWindowHeight="540"
sclDefaultWindowTop="50"
sclDefaultWindowLeft="50"
sclDefaultWindowSettings="status=1,toolbar=1,location=1,menubar=1,resizable=1,scrollbars=1"
sclWindowID="winSociaLink"
sclDefaultSites='deli,digg,facb,furl,magn,nwsv,redt,goog,nets,stmb,trnk,tcno,mslv,yamy'

// Localized Texts
sclDefaultLabelString='Share'
sclUnregisteredString='SociaLink is Unregistered'

// Global Containment Arrays for SociaLink
if (!window.sclSociaLinksSet) { sclSociaLinksSet=new Array }
if (!window.sclSociaLinkURLs) { sclSociaLinkURLs=new Array }

// Object Creation  ----------------------------
function sclSociaLink() {
   /* PARAMETERS
   name, sites, link, title, format, label, act, istag, isstyle, isimage, islink, 
	0     1      2     3      4       5      6    7      8        9        10
   bstag, bsstyle, bsimage, bslink, bsalign, bslabels, grows, gcols, ghspace, gvspace, gcpad, gcspace, 
	11     12       13       14      15       16        17     18     19       20       21     22
   gborder, gbefore, gbetween, gafter, newwin
	23       24       25        26      27
   -- END PARAMETERS */
   var args=sclSociaLink.arguments
   //special attributes (not passed)
   this.linksIndex=document.links.length
   //default attribute values
   this.name="SociaLinkItem_"+sclSociaLinksSet.length
   this.sites=sclDefaultSites
   this.link="c"
   this.title="p"
   this.format="il"
   this.label=sclDefaultLabelString
   this.act="c"
   this.istag="span"
   this.isstyle=""
   this.isimage=""
   this.islink=""
   this.bstag="div"
   this.bsstyle=""
   this.bsimage=""
   this.bslink=""
   this.bsalign=""
   this.bslabels="y"
   this.grows="4"
   this.gcols=""
   this.ghspace=""
   this.gvspace=""
   this.gcpad=""
   this.gcspace=""
   this.gborder=""
   this.gbefore=""
   this.gbetween=""
   this.gafter=""
   this.newwin="y"
   //capture passed attribute values
   if (args.length>0) { this.name=args[0] }
   if (args.length>1) { this.sites=args[1] }
   if (args.length>2) { this.link=args[2] }
   if (args.length>3) { this.title=args[3] }
   if (args.length>4) { this.format=args[4] }
   if (args.length>5) { this.label=args[5] }
   if (args.length>6) { this.act=args[6] }
   if (args.length>7) { this.istag=args[7] }
   if (args.length>8) { this.isstyle=args[8] }
   if (args.length>9) { this.isimage=args[9] }
   if (args.length>10) { this.islink=args[10] }
   if (args.length>11) { this.bstag=args[11] }
   if (args.length>12) { this.bsstyle=args[12] }
   if (args.length>13) { this.bsimage=args[13] }
   if (args.length>14) { this.bslink=args[14] }
   if (args.length>15) { this.bsalign=args[15] }
   if (args.length>16) { this.bslabels=args[16] }
   if (args.length>17) { this.grows=args[17] }
   if (args.length>18) { this.gcols=args[18] }
   if (args.length>19) { this.ghspace=args[19] }
   if (args.length>20) { this.gvspace=args[20] }
   if (args.length>21) { this.gcpad=args[21] }
   if (args.length>22) { this.gcspace=args[22] }
   if (args.length>23) { this.gborder=args[23] }
   if (args.length>24) { this.gbefore=args[24] }
   if (args.length>25) { this.gbetween=args[25] }
   if (args.length>26) { this.gafter=args[26] }
   if (args.length>27) { this.newwin=args[27] }
   
   //methods
   this.display=sclSociaLink_display
   
   //store me -- just in case I am needed before I leave the definition block
   sclSociaLinksSet[this.name]=this
   
   //calulate link paths
   sclPathPrefix=sclGetPathFromScriptTag()
   //now display
   document.write(this.display())
}

// Object Methods ------------------------------

function sclSociaLink_display() {
   var out=""
   switch (this.format.substring(0,1)) {
      case "i": //SociaLink Icon (+label[il])
         //start enclosing tag
         if (this.istag!="") {
            out+="<"+this.istag+" "
            if (this.isstyle!="") { out+='class="'+this.isstyle+'"' }
            out+=">"
         }
         //create the link and the icon
         var mo=""
         var sl=""
         var si=""
         var na='name="'+sclLinkPrefix+"_"+(sclLinkCount++)+'" '
         var al='alt="SociaLink" title="SociaLink" '
         var ls='style="text-decoration:none; color: black;" '
         if (this.act=="m") { mo='onMouseover="sclBlockDisplay(this,\''+this.name+'\')" ' }
         if (this.islink!="") { sl='class="'+this.islink+'" '; ls="" }
         if (this.isimage!="") { si='class="'+this.isimage+'" ' }
         if (this.label!="") { 
           al='alt="'+sclSimpleHTMLEntities(this.label)+'" ' 
           al+='title="'+sclSimpleHTMLEntities(this.label)+'" ' 
         }
         out+='<a href="#" '+na+mo+sl+ls+'onClick="sclBlockDisplay(this,\''+this.name+'\'); return false;">'
         out+='<img src="'+sclPathPrefix+'sclIcon18.gif" '+si+al+'border="0" align="center">'
         //check if I need the label
         if ((this.format.length>1) && (this.label!="")) {
            out+="&nbsp;"+sclSimpleHTMLEntities(this.label) }
         out+='</a>'
         //end enclosing tag
         if (this.istag!="") { out+="</"+this.istag+">" }
         break;
      case "s":  //Site Icons (+label[sl])
         if (this.format.length>1) { this.bslabels="y" } //force labels if set to icons+labels
         out+=sclBlockGenerate(this.name)
         break;
   }
   
   return out
}


// Functions  ----------------------------------

function sclGetBaseURL(curURL) {
   if (curURL.substring(0,5).toLowerCase()=="file:") { return "" }
   var lookAfter=curURL.indexOf("://")
   if (lookAfter==-1) { return curURL } else { lookAfter+=3 }
   var firstSlash=curURL.indexOf("/",lookAfter)
   if (firstSlash==-1) { firstSlash=curURL.length }
   return curURL.substring(0,firstSlash)
}

function sclGetWindowWidthOrHeight(sizeStr,wOrH) {
   if (sizeStr) {
      var xpos=sizeStr.indexOf("x")
      if (xpos>-1) {
         if (wOrH=="w") {
            return parseInt(sizeStr.substring(0,xpos))
         } else {
            return parseInt(sizeStr.substring(xpos+1,sizeStr.length))
         }
      }
   }
   return 0
}

function sclURLEncode(plaintext,useperc20)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	// rn added unicode support for %uXXXX
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
	        if (useperc20) { 
	           encoded += "%20";
	        } else {
		       encoded += "+";				// x-www-urlencoded, rather than %20
		    }
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
				encoded += ch
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
}

function sclActiveClick(cid,lid,obj) {
   if (!sclSociaLinksSet[lid]) { return; }
   if (!sclSociaLinkURLs[cid+"_url"]) { return; }
   var curscl=sclSociaLinksSet[lid]
   if (obj!=null) { curscl.linksIndex=sclCalculateLinkIndex(obj) }
   var usewin=false
   if (sclSociaLinkURLs[cid+"_url"]) {
      //default - current page and title
      var currentURL=document.location.href
      var currentTitle=document.title
      var linkMatchText=""
      //figure out based on link type what link to use
      switch (curscl.link.substring(0,1)) {
         case "p":
            var cm=""
            if (curscl.link.length>1) { //previous link with class
               cm=curscl.link.substring(2,curscl.link.length)
            }
            var match=""
            var l=0
            for (var i=curscl.linksIndex; i>=l; i--) {
               if ((document.links[i]) && (document.links[i].href)) {
                   if ((cm=="") && (match=="")) { 
                      if ((document.links[i].name==null) || (document.links[i].name=="")) {
                         match=document.links[i].href
                      } else if (document.links[i].name.substring(0,sclLinkPrefix.length)!=sclLinkPrefix) {
                         match=document.links[i].href } }
                   else if ((cm!="") && (document.links[i].getAttribute("class")==cm) && (match=="")) {
                      if ((document.links[i].name==null) || (document.links[i].name=="")) {
                         match=document.links[i].href
                      } else if (document.links[i].name.substring(0,sclLinkPrefix.length)!=sclLinkPrefix) {
                         match=document.links[i].href } }
               }
               if  (match!="") { 
                  linkMatchText=sclCleanRegionGrab(document.links[i].innerHTML)
                  i=l-1
                  currentURL=match 
               }
            }
            break;
         case "n":
            var cm=""
            if (curscl.link.length>1) { //previous link with class
               cm=curscl.link.substring(2,curscl.link.length)
            }
            var match=""
            var l=document.links.length
            for (var i=curscl.linksIndex; i<l; i++) {
               if ((document.links[i]) && (document.links[i].href)) {
                   if ((cm=="") && (match=="")) { 
                      if ((document.links[i].name==null) || (document.links[i].name=="")) {
                         match=document.links[i].href
                      } else if (document.links[i].name.substring(0,sclLinkPrefix.length)!=sclLinkPrefix) {
                         match=document.links[i].href } }
                   else if ((cm!="") && (document.links[i].getAttribute("class")==cm) && (match=="")) {
                      if ((document.links[i].name==null) || (document.links[i].name=="")) {
                         match=document.links[i].href
                      } else if (document.links[i].name.substring(0,sclLinkPrefix.length)!=sclLinkPrefix) {
                         match=document.links[i].href } }
               }
               if  (match!="") { 
                  linkMatchText=sclCleanRegionGrab(document.links[i].innerHTML)
                  i=l-1
                  currentURL=match 
               }
            }
            break;
      }
      //figure out based on title type what title to use
      if (curscl.title.substring(0,1)=="r") {
         var regname=curscl.title.substring(2,curscl.title.length)
         var regtext=""
         if (regname!="") {
            regtext=sclFindRegion(regname)
         }
         if (regtext!="") { currentTitle=regtext }
      } else if (curscl.title.substring(0,1)=="h") {
         var htmlstr=curscl.title.substring(2,curscl.title.length)
         var htmltext=""
         if (htmlstr!="") {
            htmltext=sclFindHTMLText(htmlstr)
         }
         if (htmltext!="") { currentTitle=htmltext }
      } else if ((curscl.title=="l") || (linkMatchText!="")) {
         currentTitle=linkMatchText
      }
      //about to go somewhere so close the block if it exists and is open
      var block = document.getElementById(sclDisplayBlockID)
      if (block!=null) {
		 //block.style.display = 'none'
		 block.style.visibility = 'hidden'
      }
      //replace elements in url strings
      var destinationURL=sclSociaLinkURLs[cid+"_url"]
      var currentBaseURL=sclGetBaseURL(currentURL)
      destinationURL=destinationURL.replace(/<<url>>/,sclURLEncode(currentURL))
      destinationURL=destinationURL.replace(/<<urlbase>>/,sclURLEncode(currentBaseURL))
      destinationURL=destinationURL.replace(/<<title>>/,sclURLEncode(currentTitle))
      if (curscl.newwin=="y") {
         var settings=sclDefaultWindowSettings
         if (sclSociaLinkURLs[cid+"_settings"]) {
            settings=sclSociaLinkURLs[cid+"_settings"]
         }
         //adjust width and heigth -- if its not in the settings string
         if ((settings.indexOf("width")==-1) && (settings.indexOf("height")==-1)) {
			var w=sclDefaultWindowWidth
			var h=sclDefaultWindowHeight
			if (sclSociaLinkURLs[cid+"_size"]) {
			   w=sclGetWindowWidthOrHeight(sclSociaLinkURLs[cid+"_size"],"w")
			   h=sclGetWindowWidthOrHeight(sclSociaLinkURLs[cid+"_size"],"h")
			}
			if (settings) {
			   settings="width="+w+",height="+h+","+settings
			} else {
			   settings="width="+w+",height="+h
			}
		 }
         //adjust top and left -- if its not in the settings string
         var setTopAndLeft=false
		 var t=sclDefaultWindowTop
		 var l=sclDefaultWindowLeft
         if ((settings.indexOf("top")==-1) && (settings.indexOf("left")==-1)) {
            setTopAndLeft=true
			if (settings) {
			   settings=settings+=",top="+t+",left="+l
			} else {
			   settings="top="+t+",left="+l
			}
		 }
         var win=window.open(destinationURL,sclWindowID,settings)
         try { if (setTopAndLeft) { win.moveTo(t,l) } } catch (err) { }
      } else if (curscl.newwin=="t") {
         //use the top frame
         var f=window
         while (f.parent) { f=f.parent }
         f.document.location.href=destinationURL
      } else {
         //use the current window
         document.location.href=destinationURL
      }
   }
}

function sclGetPathFromScriptTag() {
   var theScript = document.getElementById(sclLibraryName)
   if (!theScript) { return "./" }
   var out=theScript.getAttribute("src")
   var rex=new RegExp("^(.+)/[^/]+")
   out=out.replace(rex,"$1/")
   return out
}

function sclViewAreaClientWidth() {
   return sclViewAreaFilterResults (
      window.innerWidth ? window.innerWidth : 0,
      document.documentElement ? document.documentElement.clientWidth : 0,
      document.body ? document.body.clientWidth : 0
   );
}
function sclViewAreaClientHeight() {
   return sclViewAreaFilterResults (
      window.innerHeight ? window.innerHeight : 0,
      document.documentElement ? document.documentElement.clientHeight : 0,
      document.body ? document.body.clientHeight : 0
   );
}
function sclViewAreaScrollLeft() {
   return sclViewAreaFilterResults (
      window.pageXOffset ? window.pageXOffset : 0,
      document.documentElement ? document.documentElement.scrollLeft : 0,
      document.body ? document.body.scrollLeft : 0
   );
}
function sclViewAreaScrollTop() {
   return sclViewAreaFilterResults (
      window.pageYOffset ? window.pageYOffset : 0,
      document.documentElement ? document.documentElement.scrollTop : 0,
      document.body ? document.body.scrollTop : 0
   );
}
function sclViewAreaFilterResults(n_win, n_docel, n_body) {
   var n_result = n_win ? n_win : 0;
   if (n_docel && (!n_result || (n_result > n_docel)))
      n_result = n_docel;
   return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function sclBlockHideFromLink() {
   //hide the block
   var block = document.getElementById(sclDisplayBlockID)
   //block.style.display = 'none'
   block.style.visibility = 'hidden'
}

function sclBlockDoNothing() {
   //do nothing to the block
}

function sclBlockHideFromDiv(event) {
   //hide the block -- tricky as it may be triggered by many elements within the div
   var current, related;

   if (window.event) {
	 current = this;
	 related = window.event.toElement;
   }
   else {
	 current = event.currentTarget;
	 related = event.relatedTarget;
   }
 
   if (current != related && !sclNodeContains(current, related)) {
	  var block = document.getElementById(sclDisplayBlockID)
	  //block.style.display = 'none'
      block.style.visibility = 'hidden'
   }
}

function sclNodeContains(a, b) {
  while (b.parentNode)
    if ((b = b.parentNode) == a)
      return true;
  return false;
}

function sclRemoveChildrenFromNode(node) {
   if (node==null) return
   while (node.hasChildNodes()) {
      node.removeChild(node.firstChild);
   }
}

function sclCalculatePosition(obj){
   var curobj=obj
   var left=0
   var top=0
   do {
      if (curobj.offsetLeft) {
         left+=curobj.offsetLeft
      }
      if (curobj.offsetTop) {
         top+=curobj.offsetTop
      }
      curobj=curobj.offsetParent
   } while (curobj!=null)
   //now adjust the block position for position in frame
   if ((sclDisplayBlockWidth>0) || (sclDisplayBlockHeight>0)) {
      //check right of view window
      var right=left+sclDisplayBlockWidth
      var viewRight=sclViewAreaScrollLeft()+sclViewAreaClientWidth()
      if (right>viewRight) { left-= right-viewRight }
      //check bottom of page
      var bottom=top+sclDisplayBlockHeight
      var viewBottom=sclViewAreaScrollTop()+sclViewAreaClientHeight()
      if (bottom>viewBottom) { top-= bottom-viewBottom }
   }
   if (left<0) {left=0}
   if (top<0) {top=0}
   return Array(left,top)
}

function sclCalculateLinkIndex(lnk){
   var out=0
   for (var i=0; i<document.links.length; i++) {
      if (document.links[i]==lnk) {
         out=i
         i=document.links.length
      }
   }
   var name=lnk.getAttribute("name") 
   if ((name!=null) && (name!="")) {
      if (name.substring(0,sclLinkPrefix.length+1)==sclLinkPrefix+"_") {
         //back up until we have something we didn't build
         for (var i=out; i>=0; i--) {
            var name=document.links[i].getAttribute("name")
            if ((name!=null) && (name!="")) {
               if (name.substring(0,sclLinkPrefix.length+1)==sclLinkPrefix+"_") {
				  out=i
				  i=-1
               }
            }
         }
      }
   }
   return out
}

function sclBlockGenerate(lid) {
   if (!sclSociaLinksSet[lid]) { return ""; }
   var curscl=sclSociaLinksSet[lid]
   var out=""
   var stack=curscl.sites
   if (stack=="") { stack=sclDefaultSites }
   stack=stack.split(",")
   if (stack.length==0) { return ""; }
   if ( ((curscl.grows=="") && (curscl.gcols=="")) ||
      ((curscl.grows=="*") && (curscl.gcols=="*")) ||
      ((curscl.grows=="0") && (curscl.gcols=="0")) ){
      if (stack.length<=3) { curscl.grows="1" }
      else if (stack.length<=10) { curscl.grows="2" }
      else if (stack.length<=15) { curscl.grows="3" }
      else { curscl.grows="4" }
   }
   //prep work
   var usetable=false
   if ((curscl.bslabels!="n") && (curscl.format!="s")) { usetable=true }
   if ((curscl.bslabels=="y") && (curscl.bstag=="span")) { usetable=false }
   if (curscl.bstag=="table") { usetable=true }
   var aln=""
   var stl=""
   var tbo=""
   var tcp=""
   var tcs=""
   var bfo=""
   var aft=""
   var btw=""
   var hsp=""
   var vsp=""
   if (curscl.bsalign!="") { aln='align="'+curscl.bsalign+'" ' }
   if (curscl.bsstyle!="") { stl='class="'+curscl.bsstyle+'" ' }
   if (curscl.gborder!="") { tbo='border="'+curscl.gborder+'" ' }
   if (curscl.gcpad!="") { tcp='cellpadding="'+curscl.gcpad+'" ' }
   if (curscl.gcspace!="") { tcs='cellspacing="'+curscl.gcspace+'" ' }
   if (curscl.gcspace!="") { tcs='cellspacing="'+curscl.gcspace+'" ' }
   if (curscl.gbefore!="") { bfo=curscl.gbefore }
   if (curscl.gafter!="") { aft=curscl.gafter }
   if (curscl.gbetween!="") { btw=curscl.gbetween }
   if (curscl.ghspace!="") { hsp='hspace="'+curscl.ghspace+'" ' }
   if (curscl.gvspace!="") { vsp='vspace="'+curscl.gvspace+'" ' }
   
   if ((curscl.bstag!="") && (curscl.bstag!="table")) { out+="<"+curscl.bstag+" "+aln+stl+">" }
   if (curscl.format.substring(0,1)=="i") { //closebox - part 1
	  out+='<table border="0" cellspacing="0" cellpadding="0">'+"\n"
	  out+='<tr><td>'
   }
   if ((curscl.bstag!="") && (curscl.bstag!="table")) { out+=bfo }
   if (usetable) {
      if (curscl.bstag!="table") { aln=""; stl=""; bfo="" }
      out+="<table "+tbo+tcp+tcs+aln+stl+">"+bfo
   }
   
   //loop work
   var colmax=0
   var perc=""
   if (curscl.grows!="") { colmax=Math.ceil(stack.length/parseInt(curscl.grows)) }
   else if (curscl.gcols!="") { colmax=parseInt(curscl.gcols) }
   //percentage width calc -- diabled to keep things smaller/tighter on the layout
   //if (colmax>0) { perc='width="'+Math.floor(100/colmax)+'%" ' }
   stack.reverse()
   var rowcount=0
   while (stack.length>0) {
      var colcount=0
      if (usetable) { out+="<tr>" }
      do {
         //var i=stack.pop() -- not supported in IE5
         //faux array.pop
         var i=null
         if (stack.length>0) {
            i=stack[stack.length-1]
            stack.length--
         }
         if (!i) {  if (usetable) { out+="<td "+perc+"></td>" }  }
         else { 
			//create the link and the icon
			var sl=""
			var si=""
			var label=""			
			if (sclSociaLinkURLs[i+"_name"]) { label=sclSimpleHTMLEntities(sclSociaLinkURLs[i+"_name"]) }
            var na='name="'+sclLinkPrefix+"_"+(sclLinkCount++)+'" '
            if (sclLinkCount>99999) { sclLinkCount=1 }
			var al='alt="'+label+'" ' 
			    al+='title="'+label+'" ' 
			var ls='style="text-decoration:none; color: black;" '
			var exAC=''
			if (curscl.format.substring(0,1)=="s") { exAC=',this' }
			if (curscl.bslink!="") { sl='class="'+curscl.bslink+'" '; ls="" }
			if (curscl.bsimage!="") { si='class="'+curscl.bsimage+'" ' }
			if (usetable) { out+="<td "+perc+' nowrap="nowrap">' }
			if ((stl=="") && (sl=="") && (si=="")) { out+='<span style="font-family: Helvetica; font-size:smaller;">' }
			out+='<a href="#" '+na+sl+ls+'onClick="sclActiveClick(\''+i+'\',\''+curscl.name+'\''+exAC+'); return false;">'
			out+='<img src="'+sclPathPrefix+'scl_'+i+'.gif" '+si+al+hsp+vsp+'border="0" align="center">'
			//check if I need the label
			if ((curscl.bslabels!="n") && (curscl.format!="s")) {
			   out+="&nbsp;"+label }
			out+='</a>'
			if ((stl=="") && (sl=="") && (si=="")) { out+='</span>' }
			if (usetable) { out+="</td>" }
         }
         colcount++
         if (colcount<colmax) { out+=btw }
      } while (colcount<colmax)
      //end of row
      if (usetable) { out+="</tr>\n" }
      else {
         //no trailing break if 1 row
         if (curscl.grows!="1") {
            out+="<br />\n"
         }
      }
      rowcount++
   }
   //end work
   if (usetable) {
      if (curscl.bstag!="table") { out+="</table>" }
      else { out+=aft+"</table>" }
   }
   if ((curscl.bstag!="") && (curscl.bstag!="table")) { out+=aft }
   if (curscl.format.substring(0,1)=="i") { //closebox - part 2
	  var mw="WIN"
	  if ((navigator.platform) && (navigator.platform.indexOf("Mac")>-1)) { mw="MAC" }
	  out+='<td valign="top">'
	  out+='<a href="#" onClick="sclBlockHideFromLink(); return false;">'
	  out+='<img src="'+sclPathPrefix+'sclClose'+mw+'.gif" border="0" align="right"></a>'
	  out+='</td></tr></table>'
   }
   if ((curscl.bstag!="") && (curscl.bstag!="table")) { out+="</"+curscl.bstag+">" }
   return out
}

function sclBlockDisplay(obj,lid) {
   var setlen=0
   for (var a in sclSociaLinksSet) { setlen++ }
   var pos=sclCalculatePosition(obj)
   var curscl=sclSociaLinksSet[lid]
   curscl.linksIndex=sclCalculateLinkIndex(obj)
   var block = document.getElementById(sclDisplayBlockID)
   var blockIsNew=false
   if (block==null) {
      blockIsNew=true
	  block = document.createElement('div')
      block.id=sclDisplayBlockID
   }
   if (blockIsNew || (setlen>1)) {
	  //recalcuate contents each time because there might be multiple on the page
	  //block.innerHTML="" -- not doing it this way because of IE problems
	  sclRemoveChildrenFromNode(block) //empty the block before filling it
	  block.innerHTML=sclBlockGenerate(lid)
   }
   //recalculate and rebuild position every time
   if (block.isTextEdit===false) { block.style.width="1%" } //IE only to force block narrow width
   block.style.position="absolute"
   block.style.left = pos[0]+'px'
   block.style.top = pos[1]+'px'
   block.style.zIndex = "99999"
   //block.style.display = 'block'
   block.style.visibility = 'visible'
   if (curscl.act=="m") { block.onmouseout=sclBlockHideFromDiv }
   else { block.onmouseout=sclBlockDoNothing }
   //set the local style to be a white background with a grey border
   if ((!curscl) || (curscl.bsstyle=="")) {
      block.style.border="1px solid #ccc"
      block.style.backgroundColor="#fff"
	  block.style.padding="1px"
   } else if (curscl.bsstyle) {
      block.setAttribute("class",bsstyle)
   }

   if (blockIsNew) { 
      if (document.body) { document.body.appendChild(block) }
      else { document.documentElement.appendChild(block) }
      pos=sclCalculatePosition(obj)
      block.style.left = pos[0]+'px'
      block.style.top = pos[1]+'px'
   }
   //every time save current width
   sclDisplayBlockWidth=block.offsetWidth
   sclDisplayBlockHeight=block.offsetHeight
}

function sclCleanRegionGrab(str) {
   var out=str
   //script tag
   var exp="<\\/"+"script"+"\\s+(\\s+|([^\\s='\"<>]+\\s*=\\s*[^\\s'\"<>]+)|"
       exp+="([^\\s='\"<>]+\\s*=\\s*\"[^\"]*\")|([^\\s='\"<>]+\\s*=\\s*'[^']*')|"
       exp+="([^\\s='\"<>]+))*>"
   var exp="("+exp+")|(<\\/"+"script"+">)"
   var exp2="<"+"script"+"\\s+(\\s+|([^\\s='\"<>]+\\s*=\\s*[^\\s'\"<>]+)|"
       exp2+="([^\\s='\"<>]+\\s*=\\s*\"[^\"]*\")|([^\\s='\"<>]+\\s*=\\s*'[^']*')|"
       exp2+="([^\\s='\"<>]+))*>"
   var exp2="[\\s\\S]*(("+exp2+")|(<"+"script"+">))"
   var rexScriptEnd=new RegExp(exp,"i")
   var rexScriptStart=new RegExp(exp2,"i")
   var re=rexScriptEnd.exec(out)
   while (re!=null) {
      var pos2=re.index+re[0].length
      var str2=out.substring(0,pos2)
      var re2=rexScriptStart.exec(str2)
      if (re2!=null) {
         var pos1=re2[0].length-re2[1].length
         str2=out.substring(0,pos1)+out.substring(pos2,out.length)
         out=str2
         re=rexScriptEnd.exec(out)
      } else {
         re=null
      }
   }
   //style tag
   var exp="<\\/"+"style"+"\\s+(\\s+|([^\\s='\"<>]+\\s*=\\s*[^\\s'\"<>]+)|"
       exp+="([^\\s='\"<>]+\\s*=\\s*\"[^\"]*\")|([^\\s='\"<>]+\\s*=\\s*'[^']*')|"
       exp+="([^\\s='\"<>]+))*>"
   var exp="("+exp+")|(<\\/"+"style"+">)"
   var exp2="<"+"style"+"\\s+(\\s+|([^\\s='\"<>]+\\s*=\\s*[^\\s'\"<>]+)|"
       exp2+="([^\\s='\"<>]+\\s*=\\s*\"[^\"]*\")|([^\\s='\"<>]+\\s*=\\s*'[^']*')|"
       exp2+="([^\\s='\"<>]+))*>"
   var exp2="[\\s\\S]*(("+exp2+")|(<"+"style"+">))"
   var rexScriptEnd=new RegExp(exp,"i")
   var rexScriptStart=new RegExp(exp2,"i")
   var re=rexScriptEnd.exec(out)
   while (re!=null) {
      var pos2=re.index+re[0].length
      var str2=out.substring(0,pos2)
      var re2=rexScriptStart.exec(str2)
      if (re2!=null) {
         var pos1=re2[0].length-re2[1].length
         str2=out.substring(0,pos1)+out.substring(pos2,out.length)
         out=str2
         re=rexScriptEnd.exec(out)
      } else {
         re=null
      }
   }
   //long comment
   var exp="-"+"-"+">";
   var exp2="[\\s\\S]*(<"+"!"+"-"+"-)";
   var rexCommentLongEnd=new RegExp(exp)
   var rexCommentLongStart=new RegExp(exp2)
   var re=rexCommentLongEnd.exec(out)
   while (re!=null) {
      var pos2=re.index+re[0].length
      var str2=out.substring(0,pos2)
      var re2=rexCommentLongStart.exec(str2)
      if (re2!=null) {
         var pos1=re2[0].length-re2[1].length
         str2=out.substring(0,pos1)+out.substring(pos2,out.length)
         out=str2
         re=rexCommentLongEnd.exec(out)
      } else {
         re=null
      }
   }
   //short comment
   var exp="<![^>]*>";
   var rexCommentSimpleG=new RegExp(exp,"g")
   out=out.replace(rexCommentSimpleG,"")
   //strip HTML
   var exp="<"+"[\\w:_\\.\\/\\\\]+"+"\\s+(\\s+|([^\\s='\"<>]+\\s*=\\s*[^\\s'\"<>]+)|"
       exp+="([^\\s='\"<>]+\\s*=\\s*\"[^\"]*\")|([^\\s='\"<>]+\\s*=\\s*'[^']*')|"
       exp+="([^\\s='\"<>]+))*>"
   var exp="("+exp+")|(<"+"[\\w:_\\.\\/\\\\]+"+">)"
   var rexHTMLTagsG=new RegExp(exp,"g")
   out=out.replace(rexHTMLTagsG,"")
   //multiple spaces = 1 space - delete possible start and end spaces
   var exp="\\s+"
   var rexSpacesG=new RegExp(exp,"g")
   out=out.replace(rexSpacesG," ")
   out=out.replace(/^ /,'');
   out=out.replace(/ $/,'');
   //html entities
   out=out.replace(/&lt;/g,"<")
   out=out.replace(/&gt;/g,">")
   out=out.replace(/&quot;/g,'"')
   out=out.replace(/&apos;/g,"'")
   out=out.replace(/&amp;/g,"&")
   //character limit on title grab - 128
   out=sclTitleLengthLimit(out)
   return out
   
}

function sclFindRegionsInText(text) {
   exp="<"+"!"+"--"
   rexCommentO=new RegExp(exp)
   exp="--"+">"
   rexCommentC=new RegExp(exp)
   exp="\\w+"
   rexWord=new RegExp(exp)
   exp='name="([^"]+)"'
   rexName=new RegExp(exp)
   
   var re=rexCommentO.exec(text)
   if (re==null) return null
   var p0=re.index+re[0].length
   var re2=rexCommentC.exec(text,p0)
   if (re2==null) return null
   var p1=re2.index
   if (p1<p0) return null
   var innerText=text.substring(p0,p1)
   var firstWord=null
   var nameValue=null
   var re3=rexWord.exec(innerText)
   if (re3!=null) { 
      firstWord=re3[0] 
      var re4=rexName.exec(innerText,re3.index+re3[0].length)
      if (re4!=null) { nameValue=re4[1] }
   }
   
   return Array(re.index, re2.index+re2[0].length, firstWord, nameValue)
   // returns 0-start, 1-end, 2-word, 3-name
}

function sclFindRegion(regionName) {
   var out=""
   var text=document.documentElement.innerHTML
   var p=0
   var matched=false
   var matchStart=-1
   var matchEnd=-1
   
   do {
      // returns 0-start, 1-end, 2-word, 3-name
      var c=sclFindRegionsInText(text.substring(p,text.length))
      if (c!=null) {
         if (matched==false) {
            if ((c[2]=="InstanceBeginEditable") && (c[3]) && (c[3]==regionName)) {
               matchStart=p+c[1]
               matched=true
            }
         } else {
            if (c[2]=="InstanceEndEditable") {
               matchEnd=p+c[0]
               matched=false
               return sclCleanRegionGrab(text.substring(matchStart,matchEnd))
            }
         }
         p+=c[1]
      }
   } while (c!=null)
   
   return null
}

function sclFindHTMLText(htmlToMatch) {
   if (!document.getElementsByTagName) { return "" }
   var tag=htmlToMatch.toLowerCase()
   var tagu=htmlToMatch.toUpperCase()
   var stylename=""
   var l=htmlToMatch.indexOf(".")
   if (l>-1) {
      tag=htmlToMatch.substring(0,l).toLowerCase()
      tagu=htmlToMatch.substring(0,l).toUpperCase()
      stylename=htmlToMatch.substring(l+1,htmlToMatch.length)
   }
   var stack=document.getElementsByTagName(tag)
   var stacku=document.getElementsByTagName(tagu)
   if ((stack==null) && (stacku==null)) { return "" }
   if ((stack!=null) && (stacku!=null) && (stack.length>0) && (stacku.length>0) && (stack[0]==stacku[0])) { stacku=new Array() }
   if ((stack!=null) && (stacku!=null) && (stack.length>0) && (stacku.length>0)) { stack=stack.concat(stacku) }
   if (stack==null) { stack=stacku }
   if (stack.length==0) { return "" }
   var hasinnertext = (document.documentElement.innerText) ? true : false;
   var hastextcontent = (document.documentElement.textContent) ? true : false;
   if (stylename=="") {
      var elem=stack[0]
      if (hasinnertext) {
         return sclTitleLengthLimit(elem.innerText)
      } else if (hastextcontent) {
         return sclTitleLengthLimit(elem.textContent)
      } else {
         return sclCleanRegionGrab(elem.innerHTML)
      }
   }
   for (var i=0; i<stack.length; i++) {
      var elem=stack[i]
      if (elem.className) {
         if (elem.className==stylename) {
			if (hasinnertext) {
			   return sclTitleLengthLimit(elem.innerText)
			} else if (hastextcontent) {
			   return sclTitleLengthLimit(elem.textContent)
			} else {
			   return sclCleanRegionGrab(elem.innerHTML)
			}
         }
      }
      var attrs=new Array("class","Class","CLASS")
      for (var j=0; j<attrs.length; j++) {
         var attr=attrs[j]
		 if ((elem.getAttribute) && (elem.getAttribute(attr)==stylename)) {
			if (hasinnertext) {
			   return sclTitleLengthLimit(elem.innerText)
			} else if (hastextcontent) {
			   return sclTitleLengthLimit(elem.textContent)
			} else {
			   return sclCleanRegionGrab(elem.innerHTML)
			}
		 }
	  }
   }
   
   return ""
}

function sclTitleLengthLimit(text) {
   if (text==null) { return "" }
   var out=text
   out=out.substring(0,sclTitleCaptureMaxLen)
   return out
}

function sclSimpleQuoteEscape(intext,q) {
   var quote='"'
   if (q) { quote=q }
   var out=intext
   var exp="\\\\"
   var re=new RegExp(exp,"g")
   out=out.replace(re,"\\\\")
   exp=quote
   re=new RegExp(exp,"g")
   out=out.replace(re,'\\'+quote)
   return out
}

function sclSimpleHTMLEntities(text) {
   var out=text
   out=out.replace(/&/g,"&"+"amp;")
   out=out.replace(/</g,"&"+"lt;")
   out=out.replace(/>/g,"&"+"gt;")
   out=out.replace(/"/g,"&"+"quot;")
   out=out.replace(/'/g,"&"+"apos;")
   return out
}

