var loginURL = "/Callbacks/login.php";
if(!Object.prototype.toJSONString){Array.prototype.toJSONString=function(){var a=['['],b,i,l=this.length,v;function p(s){if(b){a.push(',');}
a.push(s);b=true;}
for(i=0;i<l;i+=1){v=this[i];switch(typeof v){case'object':if(v){if(typeof v.toJSONString==='function'){p(v.toJSONString());}}else{p("null");}
break;case'string':case'number':case'boolean':p(v.toJSONString());}}
a.push(']');return a.join('');};Boolean.prototype.toJSONString=function(){return String(this);};Date.prototype.toJSONString=function(){function f(n){return n<10?'0'+n:n;}
return'"'+this.getFullYear()+'-'+
f(this.getMonth()+1)+'-'+
f(this.getDate())+'T'+
f(this.getHours())+':'+
f(this.getMinutes())+':'+
f(this.getSeconds())+'"';};Number.prototype.toJSONString=function(){return isFinite(this)?String(this):"null";};Object.prototype.toJSONString=function(){var a=['{'],b,k,v;function p(s){if(b){a.push(',');}
a.push(k.toJSONString(),':',s);b=true;}
for(k in this){if(this.hasOwnProperty(k)){v=this[k];switch(typeof v){case'object':if(v){if(typeof v.toJSONString==='function'){p(v.toJSONString());}}else{p("null");}
break;case'string':case'number':case'boolean':p(v.toJSONString());}}}
a.push('}');return a.join('');};(function(s){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};s.parseJSON=function(filter){var j;function walk(k,v){var i;if(v&&typeof v==='object'){for(i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
return filter(k,v);}
if(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(this)){try{j=eval('('+this+')');}catch(e){throw new SyntaxError("parseJSON");}}else{throw new SyntaxError("parseJSON");}
if(typeof filter==='function'){j=walk('',j);}
return j;};s.toJSONString=function(){if(/["\\\x00-\x1f]/.test(this)){return'"'+this.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
c=b.charCodeAt();return'\\u00'+
Math.floor(c/16).toString(16)+
(c%16).toString(16);})+'"';}
return'"'+this+'"';};})(String.prototype);}
function getTar(e){if(browser.isIE){return window.event.srcElement;}return e.target;}
function gID(e){return document.getElementById(e);}
function createXMLObject(){var x=null;if(window.XMLHttpRequest){x=new XMLHttpRequest();}else if(window.ActiveXObject){x=new ActiveXObject("Microsoft.XMLHTTP");}return x;}
function genericKeyPress(e,f){if(e.keyCode==13||e.keyCode==3){f();if(e.stopPropagation != null){e.stopPropagation();}e.cancelBubble=true;if(e.preventDefault != null){e.preventDefault();}e.returnValue=false;e.cancel=true;}}
function addElement(e,p){if(browser.isIE){p.insertAdjacentElement("beforeEnd",e);}else{p.appendChild(e);}}
function cancelEvent(e){if(e.stopPropagation != null){e.stopPropagation();}e.cancelBubble=true;if(e.preventDefault != null){e.preventDefault();}e.returnValue=false;e.cancel=true;}
function Browser()
{
    var ua, s, i;this.isIE=false;this.isFF=false;this.isNS=false;this.isOP=false;this.version=null;ua=navigator.userAgent;s="MSIE";
    if ((i=ua.indexOf(s))>=0){this.isIE=true;this.version=parseFloat(ua.substr(i+s.length));return;}
    s="Firefox/";if((i=ua.indexOf(s))>=0){this.isFF=true;this.isNS=true;this.version=parseFloat(ua.substr(i+s.length));return;}
    s="Opera/";if((i=ua.indexOf(s))>=0){this.isOP=true;this.version=parseFloat(ua.substr(i+s.length));return;}
    s="Gecko";if((i=ua.indexOf(s))>=0){this.isNS=true;this.version=6.1;return;}
}
function sha1Hash(msg)
{
    var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
    msg += String.fromCharCode(0x80);
    var l = Math.ceil(msg.length/4) + 2;
    var N = Math.ceil(l/16);
    var M = new Array(N);
    for (var i=0; i<N; i++) {
        M[i] = new Array(16);
        for (var j=0; j<16; j++) { 
            M[i][j] = (msg.charCodeAt(i*64+j*4)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16) | 
                      (msg.charCodeAt(i*64+j*4+2)<<8) | (msg.charCodeAt(i*64+j*4+3));
        }
    }
    M[N-1][14] = ((msg.length-1) >>> 30) * 8;
    M[N-1][15] = ((msg.length-1)*8) & 0xffffffff;
    var H0 = 0x67452301;
    var H1 = 0xefcdab89;
    var H2 = 0x98badcfe;
    var H3 = 0x10325476;
    var H4 = 0xc3d2e1f0;
    var W = new Array(80); var a, b, c, d, e;
    for (var i=0; i<N; i++) {
        for (var t=0;  t<16; t++) W[t] = M[i][t];
        for (var t=16; t<80; t++) W[t] = ROTL(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
        a = H0; b = H1; c = H2; d = H3; e = H4;
        for (var t=0; t<80; t++) {
            var s = Math.floor(t/20);
            var T = (ROTL(a,5) + f(s,b,c,d) + e + K[s] + W[t]) & 0xffffffff;
            e = d;
            d = c;
            c = ROTL(b, 30);
            b = a;
            a = T;
        }
        H0 = (H0+a) & 0xffffffff;
        H1 = (H1+b) & 0xffffffff; 
        H2 = (H2+c) & 0xffffffff; 
        H3 = (H3+d) & 0xffffffff; 
        H4 = (H4+e) & 0xffffffff;
    }
    return H0.toHexStr() + H1.toHexStr() + H2.toHexStr() + H3.toHexStr() + H4.toHexStr();
}
function f(s, x, y, z) 
{
    switch (s) {
    case 0: return (x & y) ^ (~x & z);
    case 1: return x ^ y ^ z;
    case 2: return (x & y) ^ (x & z) ^ (y & z);
    case 3: return x ^ y ^ z;
    }
}
function ROTL(x, n)
{
    return (x<<n) | (x>>>(32-n));
}
Number.prototype.toHexStr = function()
{
    var s="", v;
    for (var i=7; i>=0; i--) { v = (this>>>(i*4)) & 0xf; s += v.toString(16); }
    return s;
}
function tabInfo(n, u, i, b){this.url = u; this.name = n; this.intervalTime = i; this.selected = b;};

var defaultTemplates = new Object();
defaultTemplates['News'] = new Array();
defaultTemplates['News'].push(new tabInfo('BBC', 'http://bbc.co.uk', 0, true));
defaultTemplates['News'].push(new tabInfo('WSJ', 'http://wsj.com', 0, false));
defaultTemplates['News'].push(new tabInfo('Washington Post', 'http://washingtonpost.com', 0, false));
defaultTemplates['News'].push(new tabInfo('MSNBC', 'http://msnbc.com', 0, false));
defaultTemplates['Social'] = new Array();
defaultTemplates['Social'].push(new tabInfo('Digg', 'http://digg.com', 0, true));
defaultTemplates['Social'].push(new tabInfo('Fark', 'http://fark.com', 0, false));
defaultTemplates['Social'].push(new tabInfo('Reddit', 'http://reddit.com', 0, false));
defaultTemplates['Social'].push(new tabInfo('Slashdot', 'http://slashdot.org', 0, false));
defaultTemplates['Tech'] = new Array();
defaultTemplates['Tech'].push(new tabInfo('TechCrunch', 'http://techcrunch.com', 0, true));
defaultTemplates['Tech'].push(new tabInfo('Engadget', 'http://engadget.com', 0, false));
defaultTemplates['Tech'].push(new tabInfo('Ars Technica', 'http://arstechnica.com', 0, false));
defaultTemplates['Tech'].push(new tabInfo('The Register', 'http://theregister.co.uk', 0, false));
defaultTemplates['Search'] = new Array();
defaultTemplates['Search'].push(new tabInfo('Google', 'http://www.google.com', 0, true));
defaultTemplates['Search'].push(new tabInfo('Yahoo', 'http://search.yahoo.com', 0, false));
defaultTemplates['Search'].push(new tabInfo('Live', 'http://live.com', 0, false));
defaultTemplates['Search'].push(new tabInfo('Ask', 'http://ask.com', 0, false));
defaultTemplates['Custom'] = new Array();
defaultTemplates['Custom'].push(new tabInfo('Google', 'http://www.google.com', 0, true));
defaultTemplates.currentTemplate = 'Social';

var templates = defaultTemplates.toJSONString().parseJSON();

function autoEllipseText(element, text, width)
{
    element.innerHTML = '<SPAN style="white-space:nowrap;text-align:left;">' + text + '</SPAN>';
    inSpan = element.childNodes[0];
    
    if(inSpan.offsetWidth <= width)
    {
        element.innerHTML = '';
        return text;
    }
    
    var i = 1;
    inSpan.innerHTML = '';
    while(inSpan.offsetWidth <(width) && i <text.length)
    {
        inSpan.innerHTML = text.substr(0,i) + '...';
        i++;
    }
    text = inSpan.innerHTML;
    element.innerHTML = '';
    return text;
}

var browser=new Browser();

function TabbedPanel(name)
{ 
  this.Name = name;
  this.tabContainer = null;
  this.panelContainer = null; 
  this.tabNumber = 0;
  this.numberOfTabs = 0;
  this.tabWidth = 104;
  this.currentHighPanel = null;
  this.currentHighTab = null;
  this.lowTabStyle = 'lowTab';
  this.highTabStyle = 'highTab';
  
  this.ClearTabs = function()
  {
    if(this.panelContainer == null)
        this.panelContainer = gID(this.Name + 'PanelHolder');
    
    if(this.tabContainer == null)
        this.tabContainer = gID(this.Name + 'TabHolder');
        
    this.currentHighPanel = null;
    this.currentHighTab = null;
    
    while(this.tabContainer.cells.length > 1)
        this.tabContainer.deleteCell(0);
        
    this.panelContainer.innerHTML = "";
    
    gID('BrowserTableTabHolderCell').style.display = 'none';
  
    this.numberOfTabs = 0;
    this.tabNumber = 0;
  }

  this.CreateTab = function(ti)
  {
    if(this.panelContainer == null)
        this.panelContainer = gID(this.Name + 'PanelHolder');
    
    if(this.tabContainer == null)
        this.tabContainer = gID(this.Name + 'TabHolder');
        
    var tabID = this.Name + 'Tab' + this.tabNumber;
    var panelID = this.Name + 'Panel' + this.tabNumber;
    
    var panel = document.createElement('div');
    panel.style.left = '0px';
    panel.style.top = '0px';
    panel.style.width = '100%';
    panel.style.display = 'none';
    panel.tabNum = this.tabNumber;
    panel.id = panelID;
    panel.tabInfo = ti;
    panel.style.height = '100%';
    addElement(panel, this.panelContainer);
    
    var iframe = document.createElement('iframe');
    iframe.src = ti.url;
    iframe.setAttribute("FRAMEBORDER", 0);
    iframe.frameBorder = 0;
    iframe.style.width="100%";
    iframe.style.height="100%";
    addElement(iframe, panel);
    panel.iframe = iframe;
    
    setAutoRefresh(panel);
    
    var cell = this.tabContainer.insertCell(this.tabContainer.cells.length-1);
    
    gID('BrowserTableTabHolderCell').style.display = '';
        
    cell.id = tabID;
    cell.className = this.lowTabStyle;
    cell.tabNum = this.tabNumber;
    cell.onclick = this.OnTabClicked;
    cell.style.verticalAlign = 'middle';
    cell.panelObj = this;
    this.createCellContents(cell, ti.name);
    
    if(ti.selected)
        this.TabClickEl(cell, false);  

    this.tabNumber++;
    this.numberOfTabs++;
    
    return panel;
  }
  
  this.createCellContents = function(cell, name)
  {
    var holderDiv = document.createElement('div');
    holderDiv.style.width = this.tabWidth + 'px';
    holderDiv.style.position = 'relative';
    holderDiv.style.overflow = 'hidden';
    addElement(holderDiv, cell);
  
    var nameDiv = document.createElement('div');
    nameDiv.style.left = '5px';
    nameDiv.style.width = (this.tabWidth-31) + 'px';
    nameDiv.style.position = 'absolute';
    addElement(nameDiv, holderDiv);
    
    holderDiv.innerHTML = '<span style="font-size:4px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>' + autoEllipseText(nameDiv, name, this.tabWidth-31);
   
    
    var closeButton = document.createElement('div');
    closeButton.onclick = this.OnCloseClicked;
    closeButton.panelObj = this;
    closeButton.style.backgroundImage = "url('images/close_gray.gif')";
    closeButton.style.backgroundRepeat = 'no-repeat';
    closeButton.style.width = '11px';
    closeButton.style.height = '11px';
    closeButton.style.left = (this.tabWidth-18) + 'px';
    closeButton.style.top = '3px';
    closeButton.style.position = 'absolute';
    closeButton.style.cursor = 'pointer';
    closeButton.onmouseover = this.OnCloseMouseOver;
    closeButton.onmouseout = this.OnCloseMouseOut;
    addElement(closeButton, holderDiv);
  }
  
  this.OnTabClicked = function(event)
  { 
    var el = getTar(event);
    if(el.tagName == "SPAN")
        el = el.parentNode;
    if(el.tagName == "DIV")
        el = el.parentNode;
    if(el.tagName == "DIV")
        el = el.parentNode;
        
    el.panelObj.TabClickEl(el, true);
  }

  this.TabClickEl = function (element, setTemps)
  {
    if(this.currentHighTab == element)
        return;

    if(this.currentHighTab != null)
    {
        this.currentHighTab.className = this.lowTabStyle;
        this.currentHighTab.childNodes[0].lastChild.style.backgroundImage = "url('images/close_gray.gif')";
    }

    if(this.currentHighPanel != null)
    {
      this.currentHighPanel.style.display = 'none';
      this.currentHighPanel.tabInfo.selected = false;
    }
  
    this.currentHighPanel = null;
    this.currentHighTab = null;

    if(element == null)
    {
      setTemplates();
      return;
    }

    this.currentHighTab = element;
    this.currentHighPanel = document.getElementById(this.Name + 'Panel' + this.currentHighTab.tabNum);
    if(this.currentHighPanel == null)
    {
      this.currentHighTab = null
      return;
    }
  
    this.currentHighTab.className = this.highTabStyle;
    this.currentHighTab.childNodes[0].lastChild.style.backgroundImage = "url('images/close_red.gif')";
    this.BringCellIntoView(this.currentHighTab);
    this.currentHighPanel.style.display = '';
    this.currentHighPanel.tabInfo.selected = true;
    
    if(this.currentHighPanel.tabInfo.intervalTime)
      gID('intervalInput').value = this.currentHighPanel.tabInfo.intervalTime / 60000;
    else
      gID('intervalInput').value = '0';
    
    if(setTemps)
      setTemplates();
  }
  
  this.OnCloseMouseOver = function(event)
  {
    var el = getTar(event);
    if(el.parentNode.parentNode == el.panelObj.currentHighTab)
        return;
    
    el.style.backgroundImage = "url('images/close_red.gif')";
  }
  
  this.OnCloseMouseOut = function(event)
  {
    var el = getTar(event);
    if(el.parentNode.parentNode == el.panelObj.currentHighTab)
        return;
    
    el.style.backgroundImage = "url('images/close_gray.gif')";
  }
  
  this.OnCloseClicked = function(event)
  { 
    var el = getTar(event);
    el.panelObj.TabCloseEl(el.parentNode.parentNode);
  }
  
  this.TabCloseEl = function(element)
  {        
    if(element == this.currentHighTab)
    {
        var i = -1;
        if(this.tabContainer.cells.length > 2)
        {
            i = element.cellIndex;
            if(i == this.tabContainer.cells.length-2)
                i = this.tabContainer.cells.length-3;
            else
                i++;
        }
            
        if(i >= 0)
            this.TabClickEl(this.tabContainer.cells[i], true);
        else
        {
            this.TabClickEl(null, true);
            gID('BrowserTableTabHolderCell').style.display = 'none';
        }
        
    }

    var panel = gID(this.Name + 'Panel' + element.tabNum);
    if(panel != null)
    {
      templateRemoveUrl(panel.tabInfo);
      this.panelContainer.removeChild(panel);
    }
    
    this.tabContainer.deleteCell(element.cellIndex);
        
    this.numberOfTabs--;
  }
  
  this.TabScroll = function(dir, doIt)
  {
    if(this.panelContainer == null)
        this.panelContainer = gID(this.Name + 'PanelHolder');
    
    if(this.tabContainer == null)
        this.tabContainer = gID(this.Name + 'TabHolder');
        
    var tabToSel = null;
    if(this.currentHighTab == null)
    {
        if(this.numberOfTabs == 0)
            return false;
        if(dir == 'l')
            tabToSel = this.tabContainer.cells[this.tabContainer.cells.length-2];
        else
            tabToSel = this.tabContainer.cells[0];
    }
    else
    {
        var i = this.currentHighTab.cellIndex;        
        i += (dir == 'l') ? -1 : 1;
        if(i < 0 || i > this.tabContainer.cells.length-2)
            return false;
        tabToSel = this.tabContainer.cells[i];   
    }
    
    if(doIt)
        this.TabClickEl(tabToSel, true);
        
    return true;
  }
  
  this.BringCellIntoView = function(cell)
  {
    
    var availSpace = this.tabContainer.parentNode.parentNode.parentNode.clientWidth;
    var neededSpace = this.tabContainer.parentNode.clientWidth;
    if(neededSpace <= availSpace)
        return;
        
    var leftPos = cell.cellIndex * this.tabWidth;
    var rightPos = leftPos + this.tabWidth;
    
    var left = parseInt(this.tabContainer.parentNode.parentNode.style.left)
    
    if(leftPos + left < 0)
        left -= (leftPos + left)
        
    if(rightPos > availSpace-left)
        left -= (rightPos - (availSpace-left))
      
    this.tabContainer.parentNode.parentNode.style.left = left + "px";
  }
}

var browserPanel = new TabbedPanel("BrowserTable");

function tabScrollMI(event, dir)
{
    if(!browserPanel.TabScroll(dir, false))
        return;
        
    var el = getTar(event);
    el.style.cursor = 'pointer';
    if(dir == 'l')
        el.style.backgroundPosition = '-35px 0px';
    else
        el.style.backgroundPosition = '-88px 0px';
}

function tabScrollMO(event, dir)
{   
    var el = getTar(event);
    el.style.cursor = 'default';
    if(dir == 'l')
        el.style.backgroundPosition = '0px 0px';
    else
        el.style.backgroundPosition = '-18px 0px';
}

function tabScroll(dir)
{ 
    browserPanel.TabScroll(dir, true);
    if(browserPanel.TabScroll(dir, false))
        return;
    var el = gID((dir == 'l') ? "tabScrollLeftCell" : "tabScrollRightCell");
    el.style.cursor = 'default';
    if(dir == 'l')
        el.style.backgroundPosition = '0px 0px';
    else
        el.style.backgroundPosition = '-18px 0px'; 
}

function WPZonload()
{ restoreTemplates(); 
   if(curUser != null)
   {
      switchToLoggedInView(curUser);
   }
}

function addTab()
{
    var name = gID('nameBoxRight').value;
    if(name == null || name == '')
        return;
        
    var url = gID('urlBoxRight').value;
    if(url == null || url == '')
        return;
        
    if(url.indexOf('http://') < 0 && url.indexOf('https://') < 0)
        url = 'http://' + url;
    
    var ti = new tabInfo(name, url, 0, true)
    
    templateAddUrl(ti);
    
    browserPanel.CreateTab(ti);
}

function boxEnterPress(event)
{ genericKeyPress(event, addTab); }

function toggleSideBar()
{
    var column = gID('sideBarContentCell');
    var contents = gID('sideBarContentTable');
    var frameSpacer = gID('frameSideBarSpacer');
    var expandContractImage = gID('expandContractImage');
    if(contents.style.display == 'none')
    {
        column.style.width = '180px';
        contents.style.display = '';
        frameSpacer.style.width = '10px';
        expandContractImage.src = 'images/expand_arrows_4x23.gif';
        
    }
    else
    {
        contents.style.display = 'none';
        column.style.width = '1px';
        frameSpacer.style.width = '1px';
        expandContractImage.src = 'images/collapse_arrows_4x23.gif';
    }
}

function templateClick(templateName)
{    
    templates.currentTemplate = templateName;
    
    openCurrentTemplate();
    
    setTemplates();
}

function openCurrentTemplate()
{
  browserPanel.ClearTabs();
  var cTemplate = templates[templates.currentTemplate];
  for(var i=0; i<cTemplate.length; i++)
    if(cTemplate[i] != null)
      browserPanel.CreateTab(cTemplate[i]);
      
  gID('RadioNews').checked = false;
  gID('RadioSocial').checked = false
  gID('RadioTech').checked = false;
  gID('RadioSearch').checked = false;
  gID('RadioCustom').checked = false;
  gID('Radio' + templates.currentTemplate).checked = true;
}

function templateRemoveUrl(ti)
{
  if(templates.currentTemplate == null)
    return;
    
  var cTemplate = templates[templates.currentTemplate];
  for(var i=0; i<cTemplate.length; i++)
  {
    if(cTemplate[i] == null)
      continue;
    if(cTemplate[i].url == ti.url)
    {
      cTemplate[i] = null;
      setTemplates();
      return;
    }
  }
}

function templateAddUrl(tabInfo)
{
  if(templates.currentTemplate == null)
    return;
  
  templates[templates.currentTemplate].push(tabInfo);
  
  setTemplatesInterval();
}

function getCookieVal(offset){
  var endstr=document.cookie.indexOf(";", offset);
  if(-1==endstr){endstr=document.cookie.length;}
  return unescape(document.cookie.substring(offset,endstr));
}

function setTemplatesInterval()
{
  setTimeout('setTemplates()', 7500);
}

function setTemplates()
{
  var value = templates.toJSONString();
  if(curUser == null)
  {
    setCookie("WPZTemplates", value);
  }
  else
  {
    var url = loginURL + "?Templates="+value;
	  var xmlObj = createXMLObject();
    if(xmlObj != null)
    {
      xmlObj.open ('GET', url, true);
      xmlObj.send ('');
    }
  }
}

function restoreTemplates()
{
  var value = null;
  if(curUser == null)
  {
    var json = getCookie("WPZTemplates");
    if(json != null)
      value = json.parseJSON();
  } 
  else
    value = curUser.Templates;


  if(value == null)
    templates = defaultTemplates.toJSONString().parseJSON();
  else
    templates = value;
  
  openCurrentTemplate();
}

function setCookie(name,value) {
    document.cookie=name+"="+value+"; expires=Tue, 31 Dec 2099 23:59:59 UTC; path=/";
}

function getCookie(name){
  var arg=name+"=";
  var alen=arg.length;
  var clen=document.cookie.length;
  var i=0;
  while(i<clen){
    var j=i+alen;
    if (document.cookie.substring(i,j)==arg)
      return getCookieVal(j);
    i=document.cookie.indexOf(" ",i)+1;
    if(i==0){break;}
  }
  return null;
}

function setAutoRefreshClick()
{
   var panel = browserPanel.currentHighPanel;
   
   var interval = parseInt(gID('intervalInput').value);
   if(isNaN(interval))
      interval = 0;
      
   interval *= 60000;
      
   panel.tabInfo.intervalTime = interval;
   setTemplates();
      
   setAutoRefresh(panel);
}

function setAutoRefresh(panel)
{  
   var p = panel;
   if(panel.intervalId)
   {
      clearInterval(panel.intervalId);
      panel.intervalId = null;
   }
     
   if(panel.tabInfo.intervalTime > 0)
      panel.intervalId = setInterval(refreshIFrame, panel.tabInfo.intervalTime);
      
   function refreshIFrame()
   {
      p.iframe.src = p.iframe.src;
   }
}

function refreshButtonClicked()
{
   if(browserPanel.currentHighPanel)
      browserPanel.currentHighPanel.iframe.src = browserPanel.currentHighPanel.iframe.src;
}

function restoreTemplate(templateName)
{
  templates[templateName] = defaultTemplates[templateName].toJSONString().parseJSON();
  setTemplates();
  if(templateName == templates.currentTemplate)
    openCurrentTemplate();
}

var registering;
function registerClick()
{
   registering = true;
   if(gID('LoginButton').style.display == 'none')
   {
      if(gID('LoginUser').value.length < 6 || gID('LoginPass').value.length < 6)
      {
         displayRegisterLoginError('Usernames and Password must be greater than 6 characters.');
         return;
      }
      registerUser(gID('LoginUser').value, gID('LoginPass').value);
      return;
   }
   gID('RegisterInstructions').style.display = '';
   gID('LoginRegisterError').style.display = 'none';
   gID('LoginButton').style.display = 'none';
   gID('CancelButton').style.display = '';
}

function cancelClick()
{
   gID('RegisterInstructions').style.display = 'none';
   gID('LoginButton').style.display = '';
   gID('CancelButton').style.display = 'none';
   gID('LoginRegisterError').style.display = 'none';
   registering = false;
}

function loginClick()
{
   registering = false;
   var username = gID('LoginUser').value;
   var password = gID('LoginPass').value;
   gID('LoginRegisterError').style.display = 'none';
   if(username.length < 6 || password.length < 6)
   {
      displayRegisterLoginError('Login Failed: Invalid Username/Password.');
      return;
   }
   else
   {
      loginUser(username, password);
   }
}

function loginKeyPress(event)
{
   if(registering)
      genericKeyPress(event, registerClick);
   else
      genericKeyPress(event, loginClick);
}

function logoutClick()
{
  var url = loginURL + "?Logout";
	var xmlObj = createXMLObject();
  if(xmlObj != null)
  {
    xmlObj.onreadystatechange = function(){
      if(xmlObj.readyState == 4){
        switchToLoggedOutView();
      }
    }
    xmlObj.open ('GET', url, true);
    xmlObj.send ('');
  }
}

function switchToLoggedInView(user)
{
   gID('urlBoxRight').focus();
   gID('LoginWorking').style.display = 'none';
   gID('LoginRegisterArea').style.display = 'none';
   gID('LoggedInUser').innerHTML = user.Username;
   gID('LoggedInArea').style.display = '';
   gID('LoginRegisterError').style.display = 'none';
   curUser = user;
   restoreTemplates();
}

function switchToLoggedOutView()
{
   gID('LoginWorking').style.display = 'none';
   gID('LoginRegisterArea').style.display = '';
   gID('LoggedInArea').style.display = 'none';
   gID('RegisterInstructions').style.display = 'none';
   gID('LoginButton').style.display = '';
   gID('CancelButton').style.display = 'none';
   gID('LoginRegisterError').style.display = 'none';
  curUser = null;
  restoreTemplates();
}

function registerUser(user, pass)
{
   gID('LoginWorking').style.display = '';
   gID('LoginRegisterArea').style.display = 'none';
   gID('LoggedInArea').style.display = 'none';
  var url = loginURL + "?username=" + user + "&pass=" + sha1Hash(pass) + "&Register"; 
    	
	var xmlObj = createXMLObject();
    if(xmlObj != null){
        xmlObj.onreadystatechange = function(){
            if(xmlObj.readyState == 4){
                loginUserCallback(xmlObj.responseText);
            }
        }
        xmlObj.open ('GET', url, true);
        xmlObj.send ('');
    }
}



function loginUser(user, pass)
{
   gID('LoginWorking').style.display = '';
   gID('LoginRegisterArea').style.display = 'none';
   gID('LoggedInArea').style.display = 'none';
  var url = loginURL + "?username=" + user + "&pass=" + sha1Hash(sha1Hash(pass)+challenge);
	var xmlObj = createXMLObject();
  if(xmlObj != null)
  {
    xmlObj.onreadystatechange = function(){
      if(xmlObj.readyState == 4){
        loginUserCallback(xmlObj.responseText);
      }
    }
    xmlObj.open ('GET', url, true);
    xmlObj.send ('');
  }
}

function loginUserCallback(response)
{
  var user = eval('(' + response + ')');
	
	if(typeof(user) == "string")
  {
    displayRegisterLoginError("<font color=red>" +  user + "</font>");  
    return;
  }
  
  switchToLoggedInView(user);
}

function displayRegisterLoginError(error)
{
   gID('LoginWorking').style.display = 'none';
   gID('LoginRegisterArea').style.display = '';
   gID('LoggedInArea').style.display = 'none';
   gID('RegisterInstructions').style.display = 'none';
   gID('LoginButton').style.display = '';
   gID('CancelButton').style.display = 'none';
   gID('LoginRegisterError').style.display = 'none';
   
   if(registering)
   {
      gID('RegisterInstructions').style.display = '';
      gID('LoginButton').style.display = 'none';
      gID('CancelButton').style.display = '';
   }
      
   gID('LoginRegisterError').innerHTML = '*' + error;
   gID('LoginRegisterError').style.display = '';
}

