String.prototype.startsWith=function(str){return this.substring(0,str.length)==str;}
String.prototype.endsWith=function(str){return this.substring(this.length-str.length,this.length)==str;}
String.prototype.trimIfEndsWith=function(str){return this.endsWith(str)?this.substring(0,this.length-str.length):this;}
function appendInfoTable(jQueryObj,data)
{html='<table class="info">';for(f in data)
{var v=data[f];html+="<tr><td class='label'>"+f+"</td><td class='data'>";switch(typeof v)
{case'boolean':html+=v.toString();break;case'number':html+=v.toString();break;case'string':html+=htmlEncode(v.toString());break;case'object':if(v['_']!==null)
{var summary=v.summary?true:false;if(summary)
html+='<span class="votes">';html+=v['_'];if(summary)
html+='</span>';}
else
{html+=htmlEncode(objToString(v));}
break;default:html+=htmlEncode("[Unknown!type="+(typeof v)+";data="+v+"]");break;}
html+="</td></tr>";}
html+='</table>';jQueryObj.append(html);}
function stopLoading(id)
{var loadingSection=$('#loading-'+id);loadingSection.empty();}
function showErrorResults(id,htmlMessage)
{var section=$('#'+id);section.append('<div class="NotExist">Server Error: '+htmlMessage+'</div>');}
function showNoResults(id,htmlMessage,submitUrl)
{var section=$('#'+id);var html='<div class="NotExist">'+htmlMessage;if(submitUrl)
html+='<a class="LinkSubmit" href="'+submitUrl+'" target="_blank">[Submit]</a>';html+='</div>';section.append(html);}
function htmlExtLink(url,htmlInner)
{return'<a href='+url+' target="_blank">'+htmlInner+'</a>';}
function registerHelpIcon(guid)
{var icon=$('#helpicon-'+guid);var text=$('#helptext-'+guid);var iconPos=icon.offset();icon.mouseover(function(){text.css({visibility:'visible',position:'absolute',top:iconPos.top+10,left:iconPos.left+35});});icon.mouseout(function(){text.css({visibility:'hidden'});});}
function normalizeTag(tag)
{tag=tag.replace(/^[\s,-]*(.*?)[\s,-]*$/,'$1');tag=tag.toLowerCase();return tag;}
function formatTags(tagList)
{var tags=new Object();for(var tIdx in tagList)
{var tag=normalizeTag(tagList[tIdx]);if(tags[tag])
tags[tag]++;else
tags[tag]=1;}
return formatTagsWithCount(tags);}
function formatTagsWithCount(tags)
{var freqs=getValuesNoDups(tags).sort(function(a,b){return b-a;});var keys=getKeys(tags).sort();var htmlTag="";var needsComma=false;for(var freq in freqs)
{var f=freqs[freq];for(var kIdx in keys)
{var tag=keys[kIdx];var count=tags[tag];if(count==f)
{if(needsComma)
htmlTag+=', ';else
needsComma=true;htmlTag+='<span class="tag">'+htmlEncode(tag);if(count>1)
htmlTag+='&nbsp;<i>(x'+count+')</i>';htmlTag+='</span>';}}}
return htmlTag;}
function objToString(obj,maxlevel)
{if(maxlevel==0)
maxlevel=999;return objToStringPretty(obj,0,maxlevel);}
function objToStringPretty(obj,level,maxlevel)
{if(obj==null)
return"null";switch(typeof obj)
{case'boolean':return obj.toString();case'number':return obj.toString();case'string':return"\""+obj+"\"";case'object':if(level>=maxlevel)
{return"[[object; maxlevel reached]]";}
var padClose="\n"+getRepeatedString("    ",level);level++;var pad="\n"+getRepeatedString("    ",level);if(!isArray(obj))
{var buf='{'+pad;var needsComma=false;for(var el in obj)
{if(needsComma)
buf+=','+pad;else
needsComma=true;var text;try{text=objToStringPretty(obj[el],level,maxlevel);}catch(e){text='[['+e.message+']]';}
buf+=el+': '+text;}
return buf+padClose+"}";}
else
{var buf="ARRAY["+pad;var needsComma=false;for(var el in obj)
{if(needsComma)
buf+=','+pad;else
needsComma=true;buf+=objToStringPretty(obj[el],level,maxlevel);}
return buf+padClose+']';}
case'function':return'((func))';default:return"[Unknown!type="+(typeof obj)+";data="+obj+"]";}}
function isArray(obj)
{if(obj==null||obj.constructor.toString().indexOf("Array")==-1)
return false;else
return true;}
function getRepeatedString(str,n)
{var result="";for(var k=0;k<n;k++)
result+=str;return result;}
function getKeys(obj)
{var keys=new Array();for(var el in obj)
keys.push(el);return keys;}
function getValuesNoDups(obj)
{var vals=new Object();for(var el in obj)
vals[obj[el]]=true;return getKeys(vals);}
function trim(str){if(str==null)return null;var str=str.replace(/^\s\s*/,''),ws=/\s/,i=str.length;while(ws.test(str.charAt(--i)));return str.slice(0,i+1);}
function urlEncode(clearString){var output='';var x=0;clearString=clearString.toString();var regex=/(^[a-zA-Z0-9_.]*)/;while(x<clearString.length){var match=regex.exec(clearString.substr(x));if(match!=null&&match.length>1&&match[1]!=''){output+=match[1];x+=match[1].length;}else{if(clearString[x]==' ')
output+='+';else{var charCode=clearString.charCodeAt(x);var hexVal=charCode.toString(16);output+='%'+(hexVal.length<2?'0':'')+hexVal.toUpperCase();}
x++;}}
return output;}
function htmlEncode(str)
{return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/'/g,'&apos;');}
function htmlDecode(str)
{return str.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&apos;/g,'\'').replace(/&amp;/g,'&');};function loadReddit(url,callback)
{$.ajax({type:"GET",data:{'url':url},url:"api/reddit.php",dataType:'jsonp',success:function(data)
{if(data)
{data=data.data.children;for(var r in data)
{data[r].data.subredditUrl='http://reddit.com/r/'+data[r].data.subreddit;data[r].data.link='http://www.reddit.com/comments/'+data[r].data.id;}}
else
{data=new Array();}
callback.call(this,data,null);},failure:function(a,b,c){callback.call(this,null,c);}});}
function loadDigg(url,callback)
{$.ajax({type:"GET",data:{link:url,appkey:'http://LinksFor.Us/',type:'javascript'},url:"http://services.digg.com/stories",dataType:'jsonp',cache:true,success:function(data)
{if(!data.stories||data.stories.length==0)
{data.stories=[];}
callback.call(this,data,null);},failure:function(a,b,c){callback.call(this,null,c);}});}
function parseFeedUrl(url,callback)
{$.ajax({type:"GET",data:{'url':url},url:"api/feed2json.php",dataType:'jsonp',jsonp:'callback',success:function(data)
{callback.call(this,data);},error:function(a,b,c)
{callback.call(this,"Network error: "+b+": "+objToString(c)+"; "+objToString(a));}});}
function loadShortenedUrls(url,callback)
{$.ajax({url:"api/shortened.php",data:{'url':url},success:callback,dataType:'jsonp'});}
function loadTwitter(cssId,urlDescription,searchString)
{var maxResults=100;searchString=trim(searchString);if(!searchString||searchString.length>140)
{stopLoading(cssId);showNoResults(cssId,"Nothing on Twitter for "+urlDescription);return;}
$.ajax({type:"GET",data:{rpp:maxResults,q:searchString},url:"http://search.twitter.com/search.json",dataType:'jsonp',jsonp:'callback',success:function(data)
{stopLoading(cssId);data=data.results;if(!data||data.length==0)
{showNoResults(cssId,"Nothing on Twitter for "+urlDescription);return;}
var html="";for(var cIdx in data)
{var r=data[cIdx];html+='<div class="Twit">';html+='<img src="'+r.profile_image_url+'" width="48" height="48">'
+'@<a href="http://twitter.com/'+r.from_user+'" target="_blank">'+htmlEncode(r.from_user)+'</a>'
+'<span class="context"> on '+_formatTwitterDate(r.created_at)
+' from '+htmlDecode(r.source)
+'</span><br/>'
+r.text
+'<br clear="both"/>';html+='</div>';}
$('#'+cssId).append(html);},failure:function(a,b,c){handleAjaxError('#'+cssId,a,b,c)}});}
function _formatTwitterDate(raw)
{return raw;}
function handleAjaxError(cssId,XMLHttpRequest,textStatus,errorThrown)
{stopLoading(cssId);$('#'+cssId).text(htmlEncode(errorThrown));};var hexcase=0;var b64pad="";var chrsz=8;function hex_md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz));}
function b64_md5(s){return binl2b64(core_md5(str2binl(s),s.length*chrsz));}
function str_md5(s){return binl2str(core_md5(str2binl(s),s.length*chrsz));}
function hex_hmac_md5(key,data){return binl2hex(core_hmac_md5(key,data));}
function b64_hmac_md5(key,data){return binl2b64(core_hmac_md5(key,data));}
function str_hmac_md5(key,data){return binl2str(core_hmac_md5(key,data));}
function md5_vm_test()
{return hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72";}
function core_md5(x,len)
{x[len>>5]|=0x80<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i<x.length;i+=16)
{var olda=a;var oldb=b;var oldc=c;var oldd=d;a=md5_ff(a,b,c,d,x[i+0],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i+0],20,-373897302);a=md5_gg(a,b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i+0],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);a=md5_ii(a,b,c,d,x[i+0],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],21,-343485551);a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd);}
return Array(a,b,c,d);}
function md5_cmn(q,a,b,x,s,t)
{return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);}
function md5_ff(a,b,c,d,x,s,t)
{return md5_cmn((b&c)|((~b)&d),a,b,x,s,t);}
function md5_gg(a,b,c,d,x,s,t)
{return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t);}
function md5_hh(a,b,c,d,x,s,t)
{return md5_cmn(b^c^d,a,b,x,s,t);}
function md5_ii(a,b,c,d,x,s,t)
{return md5_cmn(c^(b|(~d)),a,b,x,s,t);}
function core_hmac_md5(key,data)
{var bkey=str2binl(key);if(bkey.length>16)bkey=core_md5(bkey,key.length*chrsz);var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++)
{ipad[i]=bkey[i]^0x36363636;opad[i]=bkey[i]^0x5C5C5C5C;}
var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);return core_md5(opad.concat(hash),512+128);}
function safe_add(x,y)
{var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);}
function bit_rol(num,cnt)
{return(num<<cnt)|(num>>>(32-cnt));}
function str2binl(str)
{var bin=Array();var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz)
bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin;}
function binl2str(bin)
{var str="";var mask=(1<<chrsz)-1;for(var i=0;i<bin.length*32;i+=chrsz)
str+=String.fromCharCode((bin[i>>5]>>>(i%32))&mask);return str;}
function binl2hex(binarray)
{var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i<binarray.length*4;i++)
{str+=hex_tab.charAt((binarray[i>>2]>>((i%4)*8+4))&0xF)+
hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF);}
return str;}
function binl2b64(binarray)
{var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";for(var i=0;i<binarray.length*4;i+=3)
{var triplet=(((binarray[i>>2]>>8*(i%4))&0xFF)<<16)|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);for(var j=0;j<4;j++)
{if(i*8+j*6>binarray.length*32)str+=b64pad;else str+=tab.charAt((triplet>>6*(3-j))&0x3F);}}
return str;}