// --- Finding elements ---
function element(id) {
  return document.getElementById(id);
}

// --- Creating content ---
function text(s) { return document.createTextNode(s); }

function node(tag,as,ds) {
    var n=document.createElement(tag);
//  for(var a in as) n.setAttribute(a,as[a]);
    if(as) for(var a in as) n[a]=as[a];
    if(ds) for(var i in ds) n.appendChild(ds[i]);
    return n;
}

// --- Quoting -------------
function sq(s) { return "'"+s+"'"; }
function dq(s) { return '"'+s+'"'; }

// --- HTTP Ajax requests ---
function GetXmlHttpObject(handler)
{ 
  var objXMLHttp=null
  if (window.XMLHttpRequest)
  {
    objXMLHttp=new XMLHttpRequest()
  }
  else if (window.ActiveXObject)
  {
    objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
  }
  return objXMLHttp
}

function http_get(url,callback) {
  var http=GetXmlHttpObject()
  if (http==null) {
    alert ("Browser does not support HTTP Request")
    return
  } 
  var statechange=function() {
      if (http.readyState==4 || http.readyState=="complete")
	  callback(http.responseText)
  }
  http.onreadystatechange=statechange
  http.open("GET",url,true)
  http.send(null)
  //dump("http get "+url+"\n")
  return http
}

function http_post(url,formdata,callback) {
  var http=GetXmlHttpObject()
  if (http==null) {
    alert ("Browser does not support HTTP Request")
    return
  } 
  var statechange=function() {
      if (http.readyState==4 || http.readyState=="complete")
	  if(callback) callback(http.responseText)
  }
  http.onreadystatechange=statechange
  http.open("POST",url,true)
  http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  http.setRequestHeader("Content-length", formdata.length);
  http.setRequestHeader("Connection", "close");
  http.send(formdata)
  //dump("http get "+url+"\n")
  return http
}

function fieldData(formElem) {
    var str="";
    switch (formElem.type) {
    case 'text':
    case 'select-one':
    case 'hidden':
    case 'password':
    case 'textarea':
        str += encodeURIComponent(formElem.name) + '=' + encodeURIComponent(formElem.value);
	break;
    case 'radio':
    case 'checkbox':
	if(formElem.checked)
	    str += encodeURIComponent(formElem.name) + '=' + encodeURIComponent(formElem.value);
	break;
    }
    return str;
}

function joinFormData(s1,s2) {
    return s1=="" ? s2 : s2=="" ? s1 : s1+"&"+s2
}

function formData(form) {
    var postStr= "";
    for (i = 0; i < form.elements.length; i++) {
	var el=form.elements[i];
	if(!el.skipMe && el.name!="")
	    postStr=joinFormData(postStr,fieldData(el));
    }
    return postStr;
}

function submit_form(form,callback) {
    switch(form.method) {
    case "GET":
    case "get":
	return http_get(form.action+"?"+formData(form),callback);
    case "POST":
    case "post":
	return http_post(form.action,formData(form),callback);
    default:
	alert("Bug! submit_form: form.method="+form.method+"?!");
    }
}

function replace_element(elem,url) {
  if(!elem.ajax) {
      var putresult=function(textresult) {
	  elem.innerHTML=textresult
	  elem.ajax=null
	  if(elem.updatecheck) elem.updatecheck()
      }
      elem.ajax=http_get(url,putresult)
  }
  //else alert('Upptagen '+pid+" "+rid+" "+url)
}

function replace(id,url)
{
  var d=element(id)
  if(d) replace_element(d,url)
}

function post_replace_element(elem,url,formdata)
{
    if(!elem.ajax) {
      var putresult=function(textresult) {
	  elem.innerHTML=textresult
	  elem.ajax=null
	  if(elem.updatecheck) elem.updatecheck()
      }
      elem.ajax=http_post(url,formdata,putresult)
    }
}

function post_replace(id,url,formdata)
{
    var d=element(id);
    if(d) post_replace_element(d,url,formdata)
}

function submit_replace_element(elem,form)
{
    if(!elem.ajax) {
      var putresult=function(textresult) {
	  elem.innerHTML=textresult
	  elem.ajax=null
	  if(elem.updatecheck) elem.updatecheck()
      }
      elem.ajax=submit_form(form,putresult)
    }
}

function cancel_ajax(elem)
{
    var http=elem.ajax;
    if(http) {
	http.abort();
	elem.ajax=null;
    }
}

function submit_replace(id,form)
{
    var d=element(id);
    if(d) submit_replace_element(d,form)
}

// -----------------------------------------------------------------------------

function visa_stor_bild(bild) { open_stor_bild_window(bild); }

function open_stor_bild_window(bild)
{
    return MM_openBrWindow(bild,'visa_bild','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=800,height=740')
}

function visa_stor_bild_ny1(id,pos)
{
    var e=element("bildspel_"+id);
    e.window=open_stor_bild_window("");
    var d=e.window.document;
    d.write('<link rel=stylesheet href="/css/stor_bild.css">');
    d.write('<title>Stora bilder</title>');
    d.write('<script type="text/JavaScript" src="/js/ajax.js"></script>');
    d.write('<body class=stor_bild>');
    var n=e.storabilder.length;
    if(n>1) {
	d.write('<span class=nobr>')
	for(var i=0;i<n;i++) {
	    var mini=e.storabilder[i].replace(/\?.*/,"")+"?s=128x128";
	    d.write('<a href="javascript:byt_stor_bild1('+i+')"><img src="'+mini+'"></a>');
	}
	d.write('</span><br>')
    }
    d.write('<img id=storbild src="'+e.storabilder[pos]+'">');
    d.close();
    d.storabilder=e.storabilder;
    e.window.onload=e.window.sizeToContent;
}

function byt_stor_bild1(pos)
{
    var b=element("storbild");
    if(b) {
	b.onload=function() { window.sizeToContent(); }
	b.src=document.storabilder[pos];
    }
}

function get_lightbox() {
    var lightbox=element("lightbox");
    if(!lightbox) {
	lightbox=node("div",{id:"lightbox",className:"lightbox"});
	lightbox.innerHTML=
	'<table class=lightbox><tr><td class=lightbox>'+
	'  <table class=onwhite><tr><td>'+
	'    <div class=right>'+
	'      <input type=button class=close onclick="close_lightbox()" value="X">'+
	'    </div>'+
	'    <table>'+
	'      <tr>'+
	'	<td><img id=std class=std src="/bilder/loading.gif" onclick="close_lightbox()" alt="[Produktbild]">'+
	'	<td class=center><div id=imgbuttons></div>'+
	'    </table>'+
	'    <span id="scale"></span>'+
	'  </table>'+
	'</table>'
	document.body.appendChild(lightbox);
    }
    return lightbox;
}

function open_lightbox(url) {
    var box=element("lightbox");
    var std=element("std");
    window.onresize=set_size;
    set_size();
    if(!std.closedsrc) std.closedsrc=std.src;
    std.src=url;
    box.style.display="block";
    set_opacity(box,0);
    setTimeout(function(){set_opacity(box,1);},100);
}

function close_lightbox() {
    var box=element("lightbox");
    var std=element("std");
    window.onresize=null;
    set_opacity(box,0);
    setTimeout(function(){
	box.style.display="none";
	std.src=std.closedsrc;
    },500);
}

function set_size() {
    var std=element("std");
  //var scale=element("scale");
    if(internet_explorer) {
	var h=document.documentElement.clientHeight-80;
	var w=document.documentElement.clientWidth-80-100;
	//alert("inner size= "+w+"x"+h);
    }
    else {
	var h=window.innerHeight-80;
	var w=window.innerWidth-80-100;
    }
    std.style.maxWidth=w+"px";
    std.style.maxHeight=h+"px";
    var btns=element("imgbuttons");
    if(btns) btns.style.maxHeight=h+"px"
    /*
    setTimeout(function() {
	if(loaded_img) {
	    var s=Math.round(100*std.width/loaded_img.width)
	    scale.innerHTML=s+"%";
	}
    },900)
    */
}

function visa_stor_bild_ny(id,pos)
{
    var e=element("bildspel_"+id);
    if(e) {
	get_lightbox();
	var b=element("imgbuttons");
	var img=element("std");
	if(b && img) {
	    function switchto(i) {
		return function() { img.src=e.storabilder[i]; }
	    }
	    function imgbutton(i) {
		//return node("button",{onclick:switchto(i)},[text(i+1)]);
		return node("img",{className:"micro",
				   src:e.bilder[i],
				   alt:"Bild "+(i+1),
				   onclick:switchto(i)});
	    }
	    b.innerHTML="";
	    b.style.display= e.bilder.length>1 ? "" : "none";
	    if(e.bilder.length>1)
		for(var i=0;i<e.bilder.length;i++) {
		    b.appendChild(imgbutton(i))
		    b.appendChild(node("br"))
	    }
	}
	open_lightbox(e.storabilder[pos]);
    }
//  else alert("Hittar inte bildspel_"+id)
}

function bildspel(id,bilder,storabilder)
{
    var e=element("bildspel_"+id);
    if(e && bilder.length>1) {
	e.innerHTML=
	    '<table class="bildpos borderless" width="100%"><tr>'+
	    '<td><a href="javascript:bildspel_go('+"'"+id+"'"+',-1)">'+
	    '&lt;&lt;</a>'+
	    '<td class="center">Bild <span id=current_'+id+">1</span> av "+bilder.length+
	    '<td class=right><a href="javascript:bildspel_go('+"'"+id+"'"+',1)">'+
	    '&gt;&gt;</a>'+
	    "</table>";
	e.current=0;
    }
    if(e) {
	e.storabilder=storabilder;
	e.bilder=bilder;
	var l=element('link_stor_'+id);
	if(l) l.bildspel=e;
    }
}

function stor_bild_url_ny(id,pos)
{
    return "javascript:visa_stor_bild_ny("+sq(id)+','+pos+")";
}

function stor_bild_url(bild)
{
    return "javascript:visa_stor_bild("+sq(bild)+")";
}

function bildspel_go(id,step)
{
    //alert("bildspel_go("+id+","+step+")");
    var e=element("bildspel_"+id);
    var i=element("bild_"+id);
    var a=element("link_stor_"+id);
    var c=element("current_"+id);
    if(e && e.bilder) {
	e.current+=step;
	if(e.current<0) e.current+=e.bilder.length;
	if(e.current>=e.bilder.length) e.current-=e.bilder.length;
	var bild=e.bilder[e.current];
	var storbild=e.storabilder[e.current];
	if(i) i.src=bild;
	else alert("Bild saknas "+id);
	//if(a) a.href=stor_bild_url(storbild);
	if(a) a.href=stor_bild_url_ny(id,e.current);
	if(c) c.innerHTML=""+(e.current+1)
    }
    else alert("Bildspel saknas "+id)
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  var w=window.open(theURL,winName,features);
  w.focus();
  //w.onload=w.sizeToContent;
  return w;
}

function gui_sizes()
{
    var w=window;
    var s=screen;
    if(!w) return "no window";
    if(!s) return "no screen";
    return "inner_size="+w.innerWidth+"x"+w.innerHeight+
	"&outer_size="+w.outerWidth+"x"+w.outerHeight+
	"&screen_size="+s.width+"x"+s.height+
	"&available_screen_size="+s.availWidth+"x"+s.availHeight+
	"&color_depth="+s.colorDepth+
	"&pixel_depth="+s.pixelDepth;
}

/*
function slideshow(options,images) {
    if(images.length>0) {
	document.write('<div class=slideshow>');
	write_img("onload","start_slideshow(this)",images[0]);
	for(var i=1;i<images.length;i++)
	    write_img("class","hidden",images[i]);
	document.write('</div>');
    }
}
*/

var internet_explorer=navigator.appName=="Microsoft Internet Explorer";

/* How to change opacity in IE:
http://joseph.randomnetworks.com/archives/2006/08/16/css-opacity-in-internet-explorer-ie/
*/

var set_opacity =
  internet_explorer
    ? function(el,o) { el.style.filter="alpha(opacity="+Math.round(o*100)+")";}
    : function(el,o) { el.style.opacity=o; };

function start_slideshow(img,options) {
    var p=img.parentNode;
    if(p.tagName=="A") p=p.parentNode;
    var is=p.getElementsByTagName("img");
    if(is.length>1) {
	var cur=0;
	var w=img.width;
	var h=img.height;
	//p.style.position="relative";
	p.style.minWidth=w+"px";
	p.style.minHeight=h+"px";
	var images=[];
	for(var i=0;i<is.length;i++) {
	    images[i]=is[i];
	    var c=images[i];
	    if(internet_explorer) c.style.zoom=1;
	    c.style.position="absolute";
	}
	var timeout=1000*(options.delay || 5);
	var ft=options.fade==null ? 1 : options.fade;
	var tick=function() {
	    var c=images[cur];
	    cur= (cur+1) % images.length;
	    var n=images[cur];
	    set_opacity(n,0);
	    //n.style.position="static";
	    n.style.zIndex=1;
	    n.className="";
	    if(n.width>w) { w=n.width; p.style.minWidth=w+"px"; }
	    if(n.height>h) { h=n.height; p.style.minHeight=h+"px"; }
	    c.style.position="absolute";
	    c.style.zIndex=0;
	    fade(n,0,1,ft,function() {
		if(c.width>n.width || c.height>n.height) fade(c,1,0,ft,null);
		else set_opacity(c,0); });
	    //debug.innerHTML=w+"x"+h;
	    //for(var i=0;i<images.length;i++)
		//debug.appendChild(text(" "+images[i].style.position));
	}
	//var debug=document.createElement("div");
	//p.parentNode.insertBefore(debug,p);
	//debug.innerHTML=w+"x"+h;
	setInterval(tick,timeout);
    }
    //else alert("No slideshow!");
}

function fade(el,start,stop,t,after) {
  // el: which element to fade
  // start: starting opacity [0..1]
  // stop: ending opacity [0..1]
  // t: duration of fade (in seconds), default 1s
  // after: function to call when done fading, optional
  var dt=40; // Animation granularity, 1/40ms = 25fps
  el.step=(stop-start)*dt/(1000*(t==null ? 1 : t));
  el.stop=stop;
  //alert("fade "+start+" "+stop+" "+el.step);
  var done=function() {
      clearInterval(el.timer);
      el.timer=null;
      if(after) after();
  }
  var f=function() {
     var next=el.current+el.step;
     if(next>=1) { next=1; done(); }
     if(next<=0) { next=0; done(); }
     set_opacity(el,next);
     el.current=next
  }
  if(!el.timer) {
      el.current=start;
      el.timer=setInterval(f,dt);
  }
}

